hspscannerimpl.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #include "hspscannerimpl.h"
  2. #include "cmb.h"
  3. HSPSThread::HSPSThread()
  4. :QThread (0)
  5. {
  6. start();
  7. }
  8. void HSPSThread::run()
  9. {
  10. exec();
  11. }
  12. /////////////////////////////////////////////////////////////////////
  13. HSPSClassImpl::HSPSClassImpl()
  14. {
  15. m_sLibPath[0] = 0;
  16. m_CamDevice.moveToThread(&m_HSPSThread);
  17. }
  18. HSPSClassImpl::~HSPSClassImpl()
  19. {
  20. m_HSPSThread.exit();
  21. }
  22. ErrorCodeEnum HSPSClassImpl::DevOpen()
  23. {
  24. LOG4VTM_FUNCTION();
  25. SIni ini;
  26. char sA4[32], sID[32], sAll[32], sUsb[64];
  27. //拍照裁剪范围设置
  28. if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "SizeA4", sA4, 30) &&
  29. ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "SizeID", sID, 30) &&
  30. ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "SizeAll", sAll, 30))
  31. {
  32. float dA4[4], dID[4];
  33. int iSize[2];
  34. int i1 = sscanf(sA4, "%f,%f,%f,%f", &dA4[0], &dA4[1], &dA4[2], &dA4[3]);
  35. int i2 = sscanf(sID, "%f,%f,%f,%f", &dID[0], &dID[1], &dID[2], &dID[3]);
  36. int i3 = sscanf(sAll, "%dx%d", &iSize[0], &iSize[1]);
  37. if (i1 > 3 && i2 > 3 && i3 > 1) m_CamDevice.SetSize(dA4, dID, iSize);
  38. }
  39. //摄像头的pid vid
  40. if (!ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "Camera", sUsb, 30))
  41. {
  42. strcpy(sUsb, "usb:v04F2pB61E");
  43. }
  44. GetCurLibsPath(m_sLibPath, NULL);
  45. int iRet = m_CamDevice.Open(sUsb);
  46. return GetErrorInfo(iRet, "DevOpen");
  47. }
  48. int getFileVer(char* sFile, short& ch1, short& ch2)
  49. {
  50. ch1 = 0;
  51. ch2 = 0;
  52. char* pFind = strstr(sFile, ".so");
  53. char* pTemp = pFind;
  54. while (pTemp)
  55. {
  56. pFind = pTemp;
  57. pTemp = strstr(pFind + 3, ".so");
  58. }
  59. if (pFind == NULL) return 0;
  60. pTemp = pFind - 1;
  61. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  62. if (*pTemp == '.')
  63. ch2 = atoi(pTemp+1);
  64. pTemp--;
  65. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  66. if (*pTemp == '.')
  67. ch1 = atoi(pTemp+1);
  68. return 1;
  69. }
  70. ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  71. {
  72. LOG4VTM_FUNCTION();
  73. if (!m_CamDevice.m_bIsOpen)
  74. return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
  75. memset(&devCategory, 0, sizeof(devCategory));
  76. strcpy(devCategory.szModel , "FWID=Cam00001");
  77. strcpy(devCategory.szVendor , "cw");
  78. strcpy(devCategory.szType ,"00000000");
  79. char sPath[256], sFile[128] = {0};
  80. GetCurLibsPath(sPath, sFile);
  81. short v1,v2;
  82. getFileVer(sFile, v1, v2);
  83. devCategory.version.wMajor = v1;
  84. devCategory.version.wMinor = v2;
  85. devCategory.version.wRevision = 0xffff;
  86. devCategory.version.wBuild = FILE_VERSION;
  87. if (m_CamDevice.State())
  88. devCategory.eState = DEVICE_STATUS_NORMAL;
  89. else
  90. devCategory.eState = DEVICE_STATUS_NOT_READY;
  91. return Error_Succeed;
  92. }
  93. ErrorCodeEnum HSPSClassImpl::Reset()
  94. {
  95. LOG4VTM_FUNCTION();
  96. if (!m_CamDevice.m_bIsOpen)
  97. return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
  98. int iRet = 0;
  99. return GetErrorInfo(iRet, "Reset");
  100. }
  101. ErrorCodeEnum HSPSClassImpl::DevClose()
  102. {
  103. LOG4VTM_FUNCTION();
  104. m_CamDevice.Close();
  105. Sleep(50);
  106. return Error_Succeed;
  107. }
  108. ErrorCodeEnum HSPSClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  109. {
  110. memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
  111. return Error_Succeed;
  112. }
  113. ErrorCodeEnum HSPSClassImpl::SetParam(ParamType type, ParamTypeValue value)
  114. {
  115. LOG4VTM_FUNCTION();
  116. switch(type){
  117. case HSPS_MODEL_COLOR:
  118. m_CamDevice.m_bIsGrey = (value == HSPS_COLOR_GREY);
  119. break;
  120. case HSPS_MODEL_ROTATE:
  121. m_CamDevice.m_iRotate = (value - HSPS_ROTATE_NOANGLE);
  122. break;
  123. case HSPS_MODEL_SCANSIZE:
  124. m_CamDevice.m_iScanSz = (value - HSPS_SCAN_FULL);
  125. break;
  126. case HSPS_MODEL_VIEW:
  127. m_CamDevice.Show(value == HSPS_VIEW_SHOW);
  128. }
  129. return Error_Succeed;
  130. }
  131. // 更新20161117: nValue值为 1 时打开预览,确保当前打开预览过程执行结束且窗口处于显示状态才返回Error_Succeed,
  132. // nValue值为 0 时关闭预览并隐藏窗口
  133. ErrorCodeEnum HSPSClassImpl::SetPreview(short nValue)
  134. {
  135. LOG4VTM_FUNCTION();
  136. int iRet = 0;
  137. if (nValue == 1)
  138. {
  139. iRet = m_CamDevice.Preview(nValue == 1);
  140. if (iRet == 0)
  141. m_CamDevice.Show(true);
  142. }
  143. else {
  144. iRet = m_CamDevice.Preview(nValue == 1);
  145. }
  146. return GetErrorInfo(iRet, "SetPreview");
  147. }
  148. // specifies that where the image will be located and what it would be named.
  149. // 拍摄照片,传入的文件名已带绝对路径,无需再进行拼接处理
  150. //
  151. ErrorCodeEnum HSPSClassImpl::ScanImage(const char* pszFileName)
  152. {
  153. LOG4VTM_FUNCTION();
  154. if (!m_CamDevice.m_bIsView)
  155. return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
  156. int iRet = m_CamDevice.GetPic(pszFileName);
  157. return GetErrorInfo(iRet, "ScanImage");
  158. }
  159. // Scan Image from device and return the image data in byte format.
  160. // -pBtImg[out] The buffer used to store the scanned image data.
  161. // 存储图片字节流的缓冲区,大小为 nBtLen 字节
  162. // -nBtLen[in,out] Indicate the max byte-type size of pBtImg could be stored
  163. // and Store the real byte-type size of pBtImg had used when returned.
  164. // when detect value of nBtLen is 0 or smaller that necessary size, please
  165. // set nBtlen with real byte-type size and return Error_TooSmallBuffer.
  166. // 如果nBtLen指定的字节数过小,那么对nBtLen赋值实际所需的大小并返回 Error_TooSmallBuffer,此操作仅允许一次
  167. // -pszFileName[in] Store the path and name where the image file should be located
  168. // while "" indicates that the image file shouldn't be stored at locate.
  169. // 文件名长度为零表示不在本地生成图片文件
  170. ErrorCodeEnum HSPSClassImpl::ScanImageEx(BYTE* pBtImg, int& nBtLen, const char* pszFileName)
  171. {
  172. LOG4VTM_FUNCTION();
  173. if (!m_CamDevice.m_bIsView)
  174. return GetErrorInfo(ERR_NOT_OPENED, "ScanImageEx");
  175. char sFile[300];
  176. bool bFile = false;
  177. if (strlen(pszFileName))
  178. {
  179. strcpy(sFile, pszFileName);
  180. bFile = true;
  181. }
  182. else
  183. sprintf(sFile, "%s/hsps-temp.jpg", m_sLibPath);
  184. ErrorCodeEnum eRet = Error_Succeed;
  185. int iRet = m_CamDevice.GetPic(sFile);
  186. if (iRet != 0) return GetErrorInfo(iRet, "ScanImageEx");
  187. FILE* fp = fopen(sFile, "rb");
  188. fseek(fp, 0, SEEK_END);
  189. int iLen = ftell(fp);
  190. if (iLen < nBtLen)
  191. {
  192. fseek(fp, 0, SEEK_SET);
  193. fread(pBtImg, 1, iLen, fp);
  194. }
  195. else
  196. eRet = Error_TooSmallBuffer;
  197. fclose(fp);
  198. if (!bFile) remove(sFile);
  199. return eRet;
  200. }
  201. // 传入预览窗口显示的坐标,左上角的横坐标nX,左上角的纵坐标nY,以及预览窗口的宽,宽与高的比例为 16:9
  202. ErrorCodeEnum HSPSClassImpl::SetViewPos(int nX, int nY, int nWidth)
  203. {
  204. LOG4VTM_FUNCTION();
  205. m_CamDevice.SetPos(nX, nY, nWidth, nWidth*9/16);
  206. return Error_Succeed;
  207. }
  208. ErrorCodeEnum HSPSClassImpl::GetDevStatus(HspsDevStatus& status)
  209. {
  210. LOG4VTM_FUNCTION();
  211. status.isConnected = m_CamDevice.m_bIsOpen;
  212. status.inPreview = m_CamDevice.m_bIsView;
  213. status.inShow = !m_CamDevice.m_bIsHide;
  214. return Error_Succeed;
  215. }
  216. /////////////////////////////////////////////////////////////////////////////
  217. // DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY
  218. const static CmbErrorDef HSPSErrInfo[] = {
  219. {0, "命令执行成功", Error_Succeed, DEC_SUCCESS},
  220. {ERR_NO_DEVICE, "未发现设备", Error_Hardware, DEC_DEV_NOT_FOUND},
  221. {ERR_NOT_OPENED, "设备尚未打开", Error_Param, DEC_DEV_NOT_OPENED},
  222. {ERR_OPEN_FAIL, "设备打开失败", Error_Hardware, DEC_HARDWARE},
  223. {ERR_VIEW_FAIL, "启动预览失败", Error_Hardware, DEC_HARDWARE},
  224. };
  225. ErrorCodeEnum HSPSClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
  226. {
  227. size_t iLenOne = sizeof(CmbErrorDef);
  228. size_t iLenAll = sizeof(HSPSErrInfo);
  229. int iCount = iLenAll / iLenOne;
  230. char sErrInfo[256]="";
  231. DWORD dSta = 0;
  232. int iErr = -1;
  233. for (int ia = 0; ia < iCount; ia++)
  234. {
  235. if (HSPSErrInfo[ia].iCode == iCode)
  236. {
  237. dSta = HSPSErrInfo[ia].iInf;
  238. strcpy(sErrInfo, HSPSErrInfo[ia].sInf);
  239. iErr = HSPSErrInfo[ia].iRet;
  240. break;
  241. }
  242. }
  243. char sErrAll[300];
  244. va_list arglist;
  245. va_start(arglist, sErr);
  246. _vsnprintf(sErrAll, 128, sErr, arglist);
  247. va_end(arglist);
  248. if (sErrInfo[0])
  249. {
  250. strcat(sErrAll, " ");
  251. strcat(sErrAll, sErrInfo);
  252. }
  253. sErrAll[200] = 0;
  254. iLenOne = strlen(sErrAll);
  255. sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", iErr, sErrAll);
  256. // strcpy(m_DevErrInfo.szErrMsg, sErrAll);
  257. m_DevErrInfo.dwErrMsgLen = ((dSta << 16) & 0xffff0000) + iLenOne;
  258. if (iErr != Error_Succeed)
  259. LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
  260. else
  261. LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
  262. return (ErrorCodeEnum)iErr;
  263. }