فهرست منبع

优化海康、大华相机拍照代码,去掉不必要的拍照互斥保护,相机自身SDK会处理,上层重复保护,一是没必要,二是会降低代码的容错率

niujiuru 4 روز پیش
والد
کامیت
9632c54719
2فایلهای تغییر یافته به همراه25 افزوده شده و 59 حذف شده
  1. 12 29
      dh_takephoto/takephoto.c
  2. 13 30
      hk_takephoto/takephoto.c

+ 12 - 29
dh_takephoto/takephoto.c

@@ -127,23 +127,10 @@ int DH_SetWaitAEDoneForTakePhoto(int waitAE)
 // "pImgMark"    - 输出本次拍照图像的水印信息, 可以设置NULL
 int DH_TakePhoto(DHImgType imgType, const char *saveImgPath, int timeout, DHImgMark *pImgMark)
 {
-  int fd; char runDir[MAX_PATH_CHARS] = { 0 }, lockFile[MAX_PATH_CHARS+32] = { 0 };
   int ret, index = 0; DHImgMark imgMark = { 0 }; HANDLE hCam = NULL; PthotoProcCtx ctx = { 0 };
   IMV_DeviceList devList = { 0 }; IMV_DeviceInfo *pDevInfo = NULL; IMV_String exposureMode =  { 0 };
 
-  // 1, 占用锁定, 避免同时间拍照
-  xGetSelfRunningInfo(runDir, NULL);
-  if(runDir[strlen(runDir)-1] == '/') sprintf(lockFile, "%s%s", runDir, "status/");
-  else sprintf(lockFile, "%s/%s", runDir, "status/");
-  if(!sw_dir_exists(lockFile)) sw_dir_create(lockFile);
-  strcat(lockFile, "dh_takephoto.lock");
-
-  fd = open(lockFile, O_CREAT | O_RDWR | __O_CLOEXEC, 0666);
-  if(-1 == fd) { return -1; }
-
-  if(-1 == flock(fd, LOCK_EX | LOCK_NB)) { close(fd); return -2; }
-
-  // 2, 查找相机, 获取其设备信息
+  // 1, 查找相机, 获取其设备信息
   ret = IMV_EnumDevices(&devList, device_type);
   if(IMV_OK != ret)
   {
@@ -152,7 +139,7 @@ int DH_TakePhoto(DHImgType imgType, const char *saveImgPath, int timeout, DHImgM
   }
   if(devList.nDevNum < 1)
   {
-    ret = -3;
+    ret = -1;
     sw_log_error("[%s] 没有相机,数量=%u!!", MODULE_NAME, devList.nDevNum);
     goto end_p;
   }
@@ -161,7 +148,7 @@ findp:
   pDevInfo = &devList.pDevInfo[index++];
   if(!pDevInfo)
   {
-    ret = -4;
+    ret = -2;
     sw_log_error("[%s] unexpected internal error, failed to obtain camera information!!", MODULE_NAME);
     goto end_p;
   }
@@ -169,7 +156,7 @@ findp:
   if(pDevInfo->nCameraType == typeU3vCamera) ctx.camType = interfaceTypeUsb3;
   else if(pDevInfo->nCameraType == typeGigeCamera) ctx.camType = interfaceTypeGige;
   else { // SDK出错, 我只枚举了U口和G口相机, 不可能出现其他类型
-    ret = -5;
+    ret = -3;
     sw_log_error("[%s] unexpected internal error, unknown camera type(%u)!!", MODULE_NAME, pDevInfo->nCameraType);
     goto end_p;
   }
@@ -180,12 +167,12 @@ findp:
   if(xstrcasecmp(ctx.manuName, manufacturer) != 0 && !is_huaray_manu_alias(ctx.manuName))
   {
     if(index < devList.nDevNum) goto findp;
-    ret = -6;
+    ret = -4;
     sw_log_error("[%s] 没有找到 \"%s\" 的相机!!", MODULE_NAME, manufacturer);
     goto end_p;
   }
 
-  // 3, 打开相机, 设置其触发模式
+  // 2, 打开相机, 设置其触发模式
   unsigned int cameraIndex = (index - 1);
   ret = IMV_CreateHandle(&hCam, modeByIndex, (void*)&cameraIndex);
   if(IMV_OK == ret) ret = IMV_Open(hCam);
@@ -204,7 +191,7 @@ findp:
     goto end_p;
   }
 
-  // 4, 开始拍照, 等待完成后输出
+  // 3, 开始拍照, 等待完成后输出
   ret = IMV_GetEnumFeatureSymbol(hCam, "ExposureAuto", &exposureMode);
   if(IMV_OK != ret)
   {
@@ -220,7 +207,7 @@ findp:
   ctx.hESig = sw_signal_create();
   if(!ctx.hESig)
   {
-    ret = -7;
+    ret = -5;
     sw_log_error("[%s] SIG信号量创建失败!!", MODULE_NAME);
     goto end_p;
   }
@@ -246,7 +233,7 @@ findp:
   hThrd = sw_thrd_create("PhotoProc", THREAD_DEFAULT_PRIORITY, THREAD_DEFAULT_STACK_SIZE, FrameSoftTrigger, (unsigned long)&ctx, 0);
   if(!hThrd)
   {
-    ret = -8;
+    ret = -6;
     sw_signal_destroy(ctx.hESig);
     sw_log_error("[%s] 触发线程-创建失败!!", MODULE_NAME);
     goto end_p;
@@ -258,14 +245,14 @@ waitp:
   if(0 == ret) ret = ctx.rCode;
   else
   {
-    ret = -9;
+    ret = -7;
     sw_log_error("[%s] 拍照过程-等待超时!!", MODULE_NAME);
   }
 
   if(ctx.pUser) sw_thrd_destroy(ctx.pUser, WAITTHRD_SAFEEXIT_TIMEOUT);
   sw_signal_destroy(ctx.hESig);
 
-  // 5, 成功拍照, 输出相机的信息
+  // 4, 成功拍照, 输出相机的信息
   if(IMV_OK == ret)
   {
     double curExpTime = 0.0;
@@ -275,7 +262,7 @@ waitp:
     if(pImgMark) memcpy(pImgMark, &imgMark, sizeof(DHImgMark));
   }
 
-  // 6, 任务结束, 释放相关的资源
+  // 5, 任务结束, 释放相关的资源
 end_p:
   if(hCam)
   {
@@ -284,10 +271,6 @@ end_p:
     IMV_DestroyHandle(hCam);
   }
 
-  flock(fd, LOCK_UN);
-  close(fd);
-  sw_file_delete(lockFile);
-
   return ret;
 }
 

+ 13 - 30
hk_takephoto/takephoto.c

@@ -130,23 +130,10 @@ int HK_SetWaitAEDoneForTakePhoto(int waitAE)
 // "pImgMark"    - 输出本次拍照图像的水印信息, 可以设置NULL
 int HK_TakePhoto(HKImgType imgType, const char *saveImgPath, int timeout, HKImgMark *pImgMark)
 {
-  int fd; char runDir[MAX_PATH_CHARS] = { 0 }, lockFile[MAX_PATH_CHARS+32] = { 0 };
   int ret, index = 0; HKImgMark imgMark = { 0 }; HANDLE hCam = NULL; PthotoProcCtx ctx = { 0 };
   MV_CC_DEVICE_INFO_LIST devList = { 0 }; MV_CC_DEVICE_INFO *pDevInfo; MVCC_ENUMVALUE exposureMode =  { 0 };
 
-  // 1, 占用锁定, 避免同时间拍照
-  xGetSelfRunningInfo(runDir, NULL);
-  if(runDir[strlen(runDir)-1] == '/') sprintf(lockFile, "%s%s", runDir, "status/");
-  else sprintf(lockFile, "%s/%s", runDir, "status/");
-  if(!sw_dir_exists(lockFile)) sw_dir_create(lockFile);
-  strcat(lockFile, "hk_takephoto.lock");
-
-  fd = open(lockFile, O_CREAT | O_RDWR | __O_CLOEXEC, 0666);
-  if(-1 == fd) { return -1; }
-
-  if(-1 == flock(fd, LOCK_EX | LOCK_NB)) { close(fd); return -2; }
-
-  // 2, 查找相机, 获取其设备信息
+  // 1, 查找相机, 获取其设备信息
   ret = MV_CC_Initialize();
   if(MV_OK != ret)
   {
@@ -162,7 +149,7 @@ int HK_TakePhoto(HKImgType imgType, const char *saveImgPath, int timeout, HKImgM
   }
   if(devList.nDeviceNum < 1)
   {
-    ret = -3;
+    ret = -1;
     sw_log_error("[%s] 没有相机,数量=%u!!", MODULE_NAME, devList.nDeviceNum);
     goto end_p;
   }
@@ -171,7 +158,7 @@ findp:
   pDevInfo = devList.pDeviceInfo[index++];
   if(!pDevInfo)
   {
-    ret = -4;
+    ret = -2;
     sw_log_error("[%s] unexpected internal error, failed to obtain camera information!!", MODULE_NAME);
     goto end_p;
   }
@@ -192,7 +179,7 @@ findp:
     strcpy(imgMark.camSerialNum, (const char *)pDevInfo->SpecialInfo.stGigEInfo.chSerialNumber);
   }
   else { // SDK出错, 我只枚举了U口和G口相机, 不可能出现其他类型
-    ret = -5;
+    ret = -3;
     sw_log_error("[%s] unexpected internal error, unknown camera type(%u)!!", MODULE_NAME, pDevInfo->nTLayerType);
     goto end_p;
   }
@@ -200,12 +187,12 @@ findp:
   if(xstrcasecmp(ctx.manuName, manufacturer) != 0 && !is_hikrobot_manu_alias(ctx.manuName))
   {
     if(index < devList.nDeviceNum) goto findp;
-    ret = -6;
+    ret = -4;
     sw_log_error("[%s] 没有找到 \"%s\" 的相机!!", MODULE_NAME, manufacturer);
     goto end_p;
   }
 
-  // 3, 打开相机, 设置其触发模式
+  // 2, 打开相机, 设置其触发模式
   ret = MV_CC_CreateHandleWithoutLog(&hCam, pDevInfo);
   if(MV_OK == ret) ret = MV_CC_OpenDevice(hCam, MV_ACCESS_Exclusive, 0);
   if(MV_OK == ret && pDevInfo->nTLayerType == MV_USB_DEVICE /*U口相机*/)
@@ -216,7 +203,7 @@ findp:
   { // 探测网络最佳包大小(只对GigE相机有效)
     int size = MV_CC_GetOptimalPacketSize(hCam);
     if(size > 0) ret = MV_CC_SetIntValueEx(hCam, "GevSCPSPacketSize", size);
-    else ret = -7;
+    else ret = -5;
   }
   if(MV_OK != ret)
   {
@@ -232,7 +219,7 @@ findp:
     goto end_p;
   }
 
-  // 4, 开始拍照, 等待完成后输出
+  // 3, 开始拍照, 等待完成后输出
   ret = MV_CC_GetExposureAutoMode(hCam, &exposureMode);
   if(MV_OK != ret)
   {
@@ -255,7 +242,7 @@ findp:
   ctx.hESig = sw_signal_create();
   if(!ctx.hESig)
   {
-    ret = -8;
+    ret = -6;
     sw_log_error("[%s] SIG信号量创建失败!!", MODULE_NAME);
     goto end_p;
   }
@@ -264,7 +251,7 @@ findp:
   HANDLE hThrd = sw_thrd_create("PhotoProc", THREAD_DEFAULT_PRIORITY, THREAD_DEFAULT_STACK_SIZE, PhotoProc, (unsigned long)&ctx, 0);
   if(!hThrd)
   {
-    ret = -9;
+    ret = -7;
     sw_signal_destroy(ctx.hESig);
     sw_log_error("[%s] 拍照线程-创建失败!!", MODULE_NAME);
     goto end_p;
@@ -275,14 +262,14 @@ findp:
   if(0 == ret) ret = ctx.rCode;
   else
   {
-    ret = 10;
+    ret = -8;
     sw_log_error("[%s] 拍照过程-等待超时!!", MODULE_NAME);
   }
 
   sw_thrd_destroy(hThrd, WAITTHRD_SAFEEXIT_TIMEOUT);
   sw_signal_destroy(ctx.hESig);
 
-  // 5, 成功拍照, 输出相机的信息
+  // 4, 成功拍照, 输出相机的信息
   if(MV_OK == ret)
   {
     MVCC_FLOATVALUE fv = { 0 };
@@ -292,7 +279,7 @@ findp:
     if(pImgMark) memcpy(pImgMark, &imgMark, sizeof(HKImgMark));
   }
 
-  // 6, 任务结束, 释放相关的资源
+  // 5, 任务结束, 释放相关的资源
 end_p:
   if(hCam)
   {
@@ -302,10 +289,6 @@ end_p:
   }
   MV_CC_Finalize();
 
-  flock(fd, LOCK_UN);
-  close(fd);
-  sw_file_delete(lockFile);
-
   return ret;
 }