#include "hspscannerimpl.h" #include "cmb.h" HSPSThread::HSPSThread() :QThread (0) { start(); } void HSPSThread::run() { exec(); } ///////////////////////////////////////////////////////////////////// HSPSClassImpl::HSPSClassImpl() { m_sLibPath[0] = 0; m_CamDevice.moveToThread(&m_HSPSThread); } HSPSClassImpl::~HSPSClassImpl() { m_HSPSThread.exit(); } ErrorCodeEnum HSPSClassImpl::DevOpen() { LOG4VTM_FUNCTION(); SIni ini; char sA4[32], sID[32], sAll[32], sUsb[64]; //拍照裁剪范围设置 if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "SizeA4", sA4, 30) && ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "SizeID", sID, 30) && ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "SizeAll", sAll, 30)) { float dA4[4], dID[4]; int iSize[2]; int i1 = sscanf(sA4, "%f,%f,%f,%f", &dA4[0], &dA4[1], &dA4[2], &dA4[3]); int i2 = sscanf(sID, "%f,%f,%f,%f", &dID[0], &dID[1], &dID[2], &dID[3]); int i3 = sscanf(sAll, "%dx%d", &iSize[0], &iSize[1]); if (i1 > 3 && i2 > 3 && i3 > 1) m_CamDevice.SetSize(dA4, dID, iSize); } //摄像头的pid vid if (!ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "Camera", sUsb, 30)) { strcpy(sUsb, "usb:v04F2pB61E"); } GetCurLibsPath(m_sLibPath, NULL); int iRet = m_CamDevice.Open(sUsb); return GetErrorInfo(iRet, "DevOpen"); } int getFileVer(char* sFile, short& ch1, short& ch2) { ch1 = 0; ch2 = 0; char* pFind = strstr(sFile, ".so"); char* pTemp = pFind; while (pTemp) { pFind = pTemp; pTemp = strstr(pFind + 3, ".so"); } if (pFind == NULL) return 0; pTemp = pFind - 1; while(isdigit(*pTemp) && pTemp > sFile) pTemp--; if (*pTemp == '.') ch2 = atoi(pTemp+1); pTemp--; while(isdigit(*pTemp) && pTemp > sFile) pTemp--; if (*pTemp == '.') ch1 = atoi(pTemp+1); return 1; } ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory) { LOG4VTM_FUNCTION(); if (!m_CamDevice.m_bIsOpen) return GetErrorInfo(ERR_NOT_OPENED, "ScanImage"); memset(&devCategory, 0, sizeof(devCategory)); strcpy(devCategory.szModel , "FWID=Cam00001"); strcpy(devCategory.szVendor , "cw"); strcpy(devCategory.szType ,"00000000"); char sPath[256], sFile[128] = {0}; GetCurLibsPath(sPath, sFile); short v1,v2; getFileVer(sFile, v1, v2); devCategory.version.wMajor = v1; devCategory.version.wMinor = v2; devCategory.version.wRevision = 0xffff; devCategory.version.wBuild = FILE_VERSION; if (m_CamDevice.State()) devCategory.eState = DEVICE_STATUS_NORMAL; else devCategory.eState = DEVICE_STATUS_NOT_READY; return Error_Succeed; } ErrorCodeEnum HSPSClassImpl::Reset() { LOG4VTM_FUNCTION(); if (!m_CamDevice.m_bIsOpen) return GetErrorInfo(ERR_NOT_OPENED, "ScanImage"); int iRet = 0; return GetErrorInfo(iRet, "Reset"); } ErrorCodeEnum HSPSClassImpl::DevClose() { LOG4VTM_FUNCTION(); m_CamDevice.Close(); Sleep(50); return Error_Succeed; } ErrorCodeEnum HSPSClassImpl::GetLastErr(DevErrorInfo &devErrInfo) { memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo)); return Error_Succeed; } ErrorCodeEnum HSPSClassImpl::SetParam(ParamType type, ParamTypeValue value) { LOG4VTM_FUNCTION(); switch(type){ case HSPS_MODEL_COLOR: m_CamDevice.m_bIsGrey = (value == HSPS_COLOR_GREY); break; case HSPS_MODEL_ROTATE: m_CamDevice.m_iRotate = (value - HSPS_ROTATE_NOANGLE); break; case HSPS_MODEL_SCANSIZE: m_CamDevice.m_iScanSz = (value - HSPS_SCAN_FULL); break; case HSPS_MODEL_VIEW: m_CamDevice.Show(value == HSPS_VIEW_SHOW); } return Error_Succeed; } // 更新20161117: nValue值为 1 时打开预览,确保当前打开预览过程执行结束且窗口处于显示状态才返回Error_Succeed, // nValue值为 0 时关闭预览并隐藏窗口 ErrorCodeEnum HSPSClassImpl::SetPreview(short nValue) { LOG4VTM_FUNCTION(); int iRet = 0; if (nValue == 1) { iRet = m_CamDevice.Preview(nValue == 1); if (iRet == 0) m_CamDevice.Show(true); } else { iRet = m_CamDevice.Preview(nValue == 1); } return GetErrorInfo(iRet, "SetPreview"); } // specifies that where the image will be located and what it would be named. // 拍摄照片,传入的文件名已带绝对路径,无需再进行拼接处理 // ErrorCodeEnum HSPSClassImpl::ScanImage(const char* pszFileName) { LOG4VTM_FUNCTION(); if (!m_CamDevice.m_bIsView) return GetErrorInfo(ERR_NOT_OPENED, "ScanImage"); int iRet = m_CamDevice.GetPic(pszFileName); return GetErrorInfo(iRet, "ScanImage"); } // Scan Image from device and return the image data in byte format. // -pBtImg[out] The buffer used to store the scanned image data. // 存储图片字节流的缓冲区,大小为 nBtLen 字节 // -nBtLen[in,out] Indicate the max byte-type size of pBtImg could be stored // and Store the real byte-type size of pBtImg had used when returned. // when detect value of nBtLen is 0 or smaller that necessary size, please // set nBtlen with real byte-type size and return Error_TooSmallBuffer. // 如果nBtLen指定的字节数过小,那么对nBtLen赋值实际所需的大小并返回 Error_TooSmallBuffer,此操作仅允许一次 // -pszFileName[in] Store the path and name where the image file should be located // while "" indicates that the image file shouldn't be stored at locate. // 文件名长度为零表示不在本地生成图片文件 ErrorCodeEnum HSPSClassImpl::ScanImageEx(BYTE* pBtImg, int& nBtLen, const char* pszFileName) { LOG4VTM_FUNCTION(); if (!m_CamDevice.m_bIsView) return GetErrorInfo(ERR_NOT_OPENED, "ScanImageEx"); char sFile[300]; bool bFile = false; if (strlen(pszFileName)) { strcpy(sFile, pszFileName); bFile = true; } else sprintf(sFile, "%s/hsps-temp.jpg", m_sLibPath); ErrorCodeEnum eRet = Error_Succeed; int iRet = m_CamDevice.GetPic(sFile); if (iRet != 0) return GetErrorInfo(iRet, "ScanImageEx"); FILE* fp = fopen(sFile, "rb"); fseek(fp, 0, SEEK_END); int iLen = ftell(fp); if (iLen < nBtLen) { fseek(fp, 0, SEEK_SET); fread(pBtImg, 1, iLen, fp); } else eRet = Error_TooSmallBuffer; fclose(fp); if (!bFile) remove(sFile); return eRet; } // 传入预览窗口显示的坐标,左上角的横坐标nX,左上角的纵坐标nY,以及预览窗口的宽,宽与高的比例为 16:9 ErrorCodeEnum HSPSClassImpl::SetViewPos(int nX, int nY, int nWidth) { LOG4VTM_FUNCTION(); m_CamDevice.SetPos(nX, nY, nWidth, nWidth*9/16); return Error_Succeed; } ErrorCodeEnum HSPSClassImpl::GetDevStatus(HspsDevStatus& status) { LOG4VTM_FUNCTION(); status.isConnected = m_CamDevice.m_bIsOpen; status.inPreview = m_CamDevice.m_bIsView; status.inShow = !m_CamDevice.m_bIsHide; return Error_Succeed; } ///////////////////////////////////////////////////////////////////////////// // DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY const static CmbErrorDef HSPSErrInfo[] = { {0, "命令执行成功", Error_Succeed, DEC_SUCCESS}, {ERR_NO_DEVICE, "未发现设备", Error_Hardware, DEC_DEV_NOT_FOUND}, {ERR_NOT_OPENED, "设备尚未打开", Error_Param, DEC_DEV_NOT_OPENED}, {ERR_OPEN_FAIL, "设备打开失败", Error_Hardware, DEC_HARDWARE}, {ERR_VIEW_FAIL, "启动预览失败", Error_Hardware, DEC_HARDWARE}, }; ErrorCodeEnum HSPSClassImpl::GetErrorInfo(int iCode, char* sErr, ...) { size_t iLenOne = sizeof(CmbErrorDef); size_t iLenAll = sizeof(HSPSErrInfo); int iCount = iLenAll / iLenOne; char sErrInfo[256]=""; DWORD dSta = 0; int iErr = -1; for (int ia = 0; ia < iCount; ia++) { if (HSPSErrInfo[ia].iCode == iCode) { dSta = HSPSErrInfo[ia].iInf; strcpy(sErrInfo, HSPSErrInfo[ia].sInf); iErr = HSPSErrInfo[ia].iRet; break; } } char sErrAll[300]; va_list arglist; va_start(arglist, sErr); _vsnprintf(sErrAll, 128, sErr, arglist); va_end(arglist); if (sErrInfo[0]) { strcat(sErrAll, " "); strcat(sErrAll, sErrInfo); } sErrAll[200] = 0; iLenOne = strlen(sErrAll); sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", iErr, sErrAll); // strcpy(m_DevErrInfo.szErrMsg, sErrAll); m_DevErrInfo.dwErrMsgLen = ((dSta << 16) & 0xffff0000) + iLenOne; if (iErr != Error_Succeed) LOG4VTM(WARN, m_DevErrInfo.szErrMsg); else LOG4VTM(INFO, m_DevErrInfo.szErrMsg); return (ErrorCodeEnum)iErr; }