takephoto.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package hk_takephoto
  2. import (
  3. "os"
  4. "syscall"
  5. "time"
  6. "github.com/vishvananda/netlink"
  7. "hnyfkj.com.cn/rtu/linux/baseapp"
  8. )
  9. // 相机模块的名称
  10. const MODULE_NAME = "HikrobotTakePhoto"
  11. func setupIface(iface, cidr string) error {
  12. link, err := netlink.LinkByName(iface)
  13. if err != nil {
  14. return err
  15. }
  16. if err = netlink.LinkSetUp(link); err != nil {
  17. return err
  18. }
  19. addr, err := netlink.ParseAddr(cidr)
  20. if err != nil {
  21. return err
  22. }
  23. if err = netlink.AddrAdd(link, addr); err != nil && err != syscall.EEXIST {
  24. return err
  25. }
  26. return nil
  27. }
  28. func powerOnGigeCamera() error {
  29. _ = os.WriteFile("/sys/class/gpio/unexport", []byte("22"), 0644)
  30. if err := os.WriteFile("/sys/class/gpio/export", []byte("22"), 0644); err != nil {
  31. return err
  32. }
  33. time.Sleep(50 * time.Millisecond)
  34. if err := os.WriteFile("/sys/class/gpio/gpio22/direction", []byte("out"), 0644); err != nil {
  35. return err
  36. }
  37. if err := os.WriteFile("/sys/class/gpio/gpio22/value", []byte("1"), 0644); err != nil {
  38. return err
  39. }
  40. return nil
  41. }
  42. // 相机模块初始化, 设置必要的运行环境参数, 只有成功才能进行后续的拍照操作
  43. func ModuleInit() bool {
  44. myUsbfsMemSize := 200 // 单位: 兆字节
  45. bSetOK := false
  46. for range 5 {
  47. if baseapp.IsExit1() {
  48. return false
  49. }
  50. if getSysUsbfsMemCurrentSize() >= myUsbfsMemSize {
  51. bSetOK = true
  52. break // 已满足启动拍照程序的条件, 退出循环
  53. }
  54. ret := setSysUsbfsMemSize(myUsbfsMemSize)
  55. if ret == -1 {
  56. time.Sleep(1 * time.Second)
  57. }
  58. }
  59. if !bSetOK {
  60. baseapp.Logger.Errorf("[%s] 无法将系统\"usbfs\"的内存大小设置为: %dMB, 相机模块初始化失败!!", MODULE_NAME, myUsbfsMemSize)
  61. return false
  62. }
  63. if err := powerOnGigeCamera(); err != nil { // RTU板子上连接的网口相机电源由GPIO22控制, 默认是关闭的, 若相机由RTU板供电,需打开
  64. baseapp.Logger.Errorf(
  65. "[%s] 打开网口相机的电源失败: %v",
  66. MODULE_NAME, err,
  67. )
  68. return false
  69. }
  70. if err := setupIface("eth1", "192.168.100.123/24"); err != nil { // 通过"eth1"连接网口相机, 相机IP地址必须与"eth1"在同一网段
  71. baseapp.Logger.Errorf(
  72. "[%s] 设置网口%s的IP地址失败: %v",
  73. MODULE_NAME, "eth1", err,
  74. )
  75. return false
  76. }
  77. return true
  78. }