Jelajahi Sumber

优化修改大华相机拍照代码逻辑

niujiuru 4 minggu lalu
induk
melakukan
fe223b6904
1 mengubah file dengan 15 tambahan dan 6 penghapusan
  1. 15 6
      dh_takephoto/takephoto.c

+ 15 - 6
dh_takephoto/takephoto.c

@@ -34,6 +34,7 @@ typedef struct
   int         expStableCnt;   // 连续曝光稳定帧计数
   HANDLE      hESig;          // 任务结束的通知
   int         rCode;          // 任务结束返回值
+  void       *pUser;          // 附加的用户数据
 } PthotoProcCtx;
 
 // 非标准的"Huaray Technology"制造商名称, 但也是华睿的相机, 如: "Machine Vision"
@@ -86,13 +87,21 @@ end_p:
   ctx->rCode = ret; sw_signal_give(ctx->hESig);
 }
 
-static int FrameSoftTrigger(unsigned long wParam, unsigned long lParam) // 线程回调函数, 触发一次拍照执行
+static int FrameSoftTrigger(unsigned long wParam, unsigned long lParam) // 线程回调函数, 触发相机拍照
 {
   PthotoProcCtx *ctx = (PthotoProcCtx *)wParam;
-  int ret = IMV_ExecuteCommandFeature(ctx->hCam, "TriggerSoftware");
-  if(IMV_OK != ret) ret = 1; // 软触发失败后, 马上再次触发
-  else ret = 1000; // 软触发成功后-延时一秒, 等待下次的触发
-  return ret;
+  void *hThrd = ctx->pUser; int slot_ms = 100, tick_ms, ret;
+
+  while(sw_thrd_isAlive(hThrd))
+  {
+    sw_log_debug("[%s] 触发一次拍照", MODULE_NAME);
+    ret = IMV_ExecuteCommandFeature(ctx->hCam, "TriggerSoftware");
+    if(IMV_OK != ret) { sw_log_error("[%s] 触发拍照失败, errCode=%d!!", MODULE_NAME,  ret); break; }
+    else tick_ms = 0;
+    while(sw_thrd_isAlive(hThrd) && tick_ms < 1000) { sw_thrd_delay(slot_ms); tick_ms += slot_ms; }
+  }
+
+  return -1;
 }
 
 // 单次执行相机拍照, 并保存到文件, 成功返回: 0值, 失败返回:非0值
@@ -229,7 +238,7 @@ findp:
     sw_log_error("[%s] 触发线程-创建失败!!", MODULE_NAME);
     goto end_p;
   }
-  sw_thrd_resume(hThrd);
+  ctx.pUser = (void *)hThrd; sw_thrd_resume(hThrd);
 
 waitp:
   ret = sw_signal_wait(ctx.hESig, timeout*1000); // 阻塞等待拍照任务结束或超时