|
|
@@ -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); // 阻塞等待拍照任务结束或超时
|