takephoto.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package reporter
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "time"
  8. "hnyfkj.com.cn/rtu/bxs-sy/baseapp"
  9. mcu "hnyfkj.com.cn/rtu/bxs-sy/mcu_ctrl_board"
  10. takephoto "hnyfkj.com.cn/rtu/bxs-sy/mvs_takephoto"
  11. )
  12. func LoopTakePhoto(ctx context.Context) {
  13. for {
  14. select {
  15. case <-mcu.Board.ReqTakePhoCh:
  16. TakePhotoAndUpToFtp(ctx)
  17. case <-ctx.Done():
  18. return
  19. }
  20. }
  21. }
  22. func TakePhotoAndUpToFtp(ctx context.Context) (string, error) {
  23. // 1, 开始执行拍照任务
  24. mcu.MCBSetCamStateBit(mcu.TakingPhoto)
  25. defer mcu.MCBSetCamStateBit(mcu.Idle)
  26. baseapp.Logger.Infof("[%s] 拍照中, 稍后...", MODULE_NAME)
  27. now := time.Now()
  28. imgFile := filepath.Join(baseapp.IMG_DIR, fmt.Sprintf("%s.jpg", now.Format("2006-01-02_15-04-05.000")))
  29. _, err := takephoto.TakePhoto(takephoto.IMG_TYPE_JPG, imgFile, 300 /*秒*/)
  30. if err != nil {
  31. baseapp.Logger.Errorf("[%s] 拍照失败: %v!!", MODULE_NAME, err)
  32. return "", err
  33. }
  34. elapsed := time.Since(now).Milliseconds()
  35. baseapp.Logger.Infof("[%s] 拍照完成, 输出到本地文件: %q, 用时: %d毫秒", MODULE_NAME, imgFile, elapsed)
  36. // 2, 上传照片到服务器
  37. fileUploader.uploadLock.Lock() // 上传锁定(多个上传任务并发时, 保证串行执行) 2025-10-17
  38. defer fileUploader.uploadLock.Unlock()
  39. mcu.MCBSetCamStateBit(mcu.PhotoUploading)
  40. now = time.Now()
  41. baseapp.Logger.Infof("[%s] 正在上传照片文件%q到服务器...", MODULE_NAME, imgFile)
  42. remoteFile, err := uploadFileToFtp(ctx, imgFile, CfgServers.Img2Ftp.Address, CfgServers.Img2Ftp.Username, CfgServers.Img2Ftp.Password, defaultUploadTimeout)
  43. if err != nil {
  44. baseapp.Logger.Errorf("[%s] 照片文件%q上传失败: %v!!", MODULE_NAME, imgFile, err)
  45. } else {
  46. os.Remove(imgFile)
  47. elapsed = time.Since(now).Milliseconds()
  48. baseapp.Logger.Infof("[%s] 照片文件上传成功, 用时: %d毫秒, 本地文件: %q已删除", MODULE_NAME, elapsed, imgFile)
  49. }
  50. return remoteFile, err
  51. }