package hk_takephoto import ( "os" "syscall" "time" "github.com/vishvananda/netlink" "hnyfkj.com.cn/rtu/linux/baseapp" ) // 相机模块的名称 const MODULE_NAME = "HikrobotTakePhoto" func setupIface(iface, cidr string) error { link, err := netlink.LinkByName(iface) if err != nil { return err } if err = netlink.LinkSetUp(link); err != nil { return err } addr, err := netlink.ParseAddr(cidr) if err != nil { return err } if err = netlink.AddrAdd(link, addr); err != nil && err != syscall.EEXIST { return err } return nil } func powerOnGigeCamera() error { _ = os.WriteFile("/sys/class/gpio/unexport", []byte("22"), 0644) if err := os.WriteFile("/sys/class/gpio/export", []byte("22"), 0644); err != nil { return err } time.Sleep(50 * time.Millisecond) if err := os.WriteFile("/sys/class/gpio/gpio22/direction", []byte("out"), 0644); err != nil { return err } if err := os.WriteFile("/sys/class/gpio/gpio22/value", []byte("1"), 0644); err != nil { return err } return nil } // 相机模块初始化, 设置必要的运行环境参数, 只有成功才能进行后续的拍照操作 func ModuleInit() bool { myUsbfsMemSize := 200 // 单位: 兆字节 bSetOK := false for range 5 { if baseapp.IsExit1() { return false } if getSysUsbfsMemCurrentSize() >= myUsbfsMemSize { bSetOK = true break // 已满足启动拍照程序的条件, 退出循环 } ret := setSysUsbfsMemSize(myUsbfsMemSize) if ret == -1 { time.Sleep(1 * time.Second) } } if !bSetOK { baseapp.Logger.Errorf("[%s] 无法将系统\"usbfs\"的内存大小设置为: %dMB, 相机模块初始化失败!!", MODULE_NAME, myUsbfsMemSize) return false } if err := powerOnGigeCamera(); err != nil { // RTU板子上连接的网口相机电源由GPIO22控制, 默认是关闭的, 若相机由RTU板供电,需打开 baseapp.Logger.Errorf( "[%s] 打开网口相机的电源失败: %v", MODULE_NAME, err, ) return false } if err := setupIface("eth1", "192.168.100.123/24"); err != nil { // 通过"eth1"连接网口相机, 相机IP地址必须与"eth1"在同一网段 baseapp.Logger.Errorf( "[%s] 设置网口%s的IP地址失败: %v", MODULE_NAME, "eth1", err, ) return false } return true }