ThermalPrintDriverGWI.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  1. #include "ThermalPrintDriverGWI.h"
  2. #include "ThermalPrintSP.h"
  3. #include "GwiLogFile.h"
  4. #include "ErrorDefine.h"
  5. #include <time.h>
  6. #include <pthread.h>
  7. #include <vector>
  8. #include <iostream>
  9. #include <string>
  10. using namespace std;
  11. char textBuff[4096]={0};
  12. static int textLen=0;
  13. static int lpszPathAllNum=0;
  14. static long waitTime0;
  15. int devColseFlag=false;
  16. static char gDllModuleHelper = 0;
  17. CLogFile *m_plogFile = NULL;
  18. CThermalPrintSP *m_pThermalPrintSP = NULL;
  19. pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
  20. LPSTR lpszPath="/tmp/tmp.bmp";
  21. LPSTR lpszFields="GraphicFiled=/tmp/tmp.bmp\0\0";
  22. static const std::string base64_chars =
  23. "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  24. "abcdefghijklmnopqrstuvwxyz"
  25. "0123456789+/";
  26. static inline bool is_base64(BYTE c) {
  27. return (isalnum(c) || (c == '+') || (c == '/'));
  28. }
  29. std::vector<BYTE> base64_decode(std::string const& encoded_string) {
  30. int in_len = encoded_string.size();
  31. int i = 0;
  32. int j = 0;
  33. int in_ = 0;
  34. BYTE char_array_4[4], char_array_3[3];
  35. std::vector<BYTE> ret;
  36. while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
  37. char_array_4[i++] = encoded_string[in_]; in_++;
  38. if (i ==4) {
  39. for (i = 0; i <4; i++)
  40. char_array_4[i] = base64_chars.find(char_array_4[i]);
  41. char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
  42. char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
  43. char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
  44. for (i = 0; (i < 3); i++)
  45. ret.push_back(char_array_3[i]);
  46. i = 0;
  47. }
  48. }
  49. if (i) {
  50. for (j = i; j <4; j++)
  51. char_array_4[j] = 0;
  52. for (j = 0; j <4; j++)
  53. char_array_4[j] = base64_chars.find(char_array_4[j]);
  54. char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
  55. char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
  56. char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
  57. for (j = 0; (j < i - 1); j++) ret.push_back(char_array_3[j]);
  58. }
  59. return ret;
  60. }
  61. void stdBytes2File(char *allPath,std::vector<BYTE> allBytes)
  62. {
  63. FILE *fp;
  64. BYTE b;
  65. fp=fopen(allPath,"wb");
  66. for(std::vector<BYTE>::iterator iter=allBytes.begin();iter!=allBytes.end();iter++)
  67. {
  68. b=*iter;
  69. fwrite(&b,sizeof(BYTE),1,fp);
  70. }
  71. fclose(fp);
  72. }
  73. CThermalPrint::CThermalPrint()
  74. {
  75. m_gwiErrorCode = -1;
  76. memset(&m_DevErrorInfo,0,sizeof(m_DevErrorInfo));
  77. ResetParam();
  78. if(NULL == m_plogFile)
  79. {
  80. m_plogFile = new CLogFile(LAYER);
  81. m_plogFile->init();
  82. LogARG(m_plogFile, Log_Infor, "CThermalPrint", "Init ThermalPrint LOG success!");
  83. }
  84. if(NULL == m_pThermalPrintSP)
  85. {
  86. m_pThermalPrintSP = new CThermalPrintSP(m_plogFile);
  87. }
  88. }
  89. CThermalPrint::~CThermalPrint()
  90. {
  91. pthread_mutex_destroy(&mtx);
  92. if(NULL != m_pThermalPrintSP)
  93. {
  94. delete m_pThermalPrintSP;
  95. m_pThermalPrintSP = NULL;
  96. }
  97. }
  98. void CThermalPrint::ResetParam(void)
  99. {
  100. m_RowSpace=0;//行间距 单位mm
  101. m_Align=0;//字符对齐模式 单位是"AlignStyle"的值
  102. m_Reverse=0;//颠倒打印(注意需要设置退出或者切纸才行,并在行首) 取值(0:正常打印 1:颠倒打印)
  103. m_LeftMargin=0;//左边距 单位mm
  104. m_PrintArea=80;//可打印区域 单位mm
  105. m_Font_UnderLine=0;//下划线 取值(0:否 1:是)
  106. m_Font_Bold=0;//粗体 取值(0:否 1:是)
  107. m_Font_Inverse=0;//反白 取值(0:否 1:是)
  108. m_Font_DoubleHeight=0;//纵翻倍放大 取值(0:否 1:是)FONT_UNDERLINE = 0,//下划线 取值(0:否 1:是)
  109. m_Font_DoubleWide=0;//横翻倍向放大 取值(0:否 1:是)
  110. m_Font_SizeH=0;//字体宽高自定义,取值(宽 {1..6} ,长 {1..6})
  111. m_Font_SizeW=0;//字体宽高自定义,取值(宽 {1..6} ,长 {1..6})
  112. m_Font_Rotate=0;//字体旋转 取值(0,90,180,270)
  113. m_Font_SpaceL=0;//字符左右边距设置 单位mm 取值(左边距 {0..36},右边距 {0..36})
  114. m_Font_SpaceR=0;//字符左右边距设置 单位mm 取值(左边距 {0..36},右边距 {0..36})
  115. }
  116. ErrorCodeEnum CThermalPrint::GetDevCategory(DevCategoryInfo &devCategory)
  117. {
  118. LogARG(m_plogFile, Log_Infor, "GetDevCategory", "Enter...");
  119. m_gwiErrorCode = GWI_Error_Succeed;
  120. long lResult = 0;
  121. int nstatus = 0;
  122. char DevFirmware[1024]={0};
  123. memset(DevFirmware,0x00,sizeof(DevFirmware));
  124. lResult = m_pThermalPrintSP->ThermalPrint_GetStatus(nstatus,DevFirmware);
  125. if(RET_SUCCESS != lResult)
  126. {
  127. LogARG(m_plogFile, Log_Error, "GetDevCategory", "ThermalPrint_GetStatus failed,nResult = <%d>",lResult);
  128. devCategory.eState = DEVICE_STATUS_FAULT;
  129. }
  130. else
  131. {
  132. devCategory.eState = DEVICE_STATUS_NORMAL;
  133. }
  134. sprintf(devCategory.szModel,"FWID=%s",DevFirmware);
  135. strcpy(devCategory.szType,"PVER=GWI#MID=JUST E6020-K");
  136. strcpy(devCategory.szVendor,"GWI");
  137. devCategory.version.wMajor = 1;
  138. devCategory.version.wBuild = 1;
  139. devCategory.version.wMinor = 1;
  140. devCategory.version.wRevision = 1;
  141. if(nstatus == WFS_PTR_DEVBUSY)
  142. {
  143. m_gwiErrorCode = GWI_Error_Dev_Busy;
  144. }
  145. else if(nstatus == WFS_PTR_DEVOFFLINE)
  146. {
  147. m_gwiErrorCode = GWI_Error_Dev_Offline;
  148. }
  149. else if(nstatus != WFS_PTR_DEVONLINE)
  150. {
  151. m_gwiErrorCode = GWI_Error_Dev_Error;
  152. }
  153. LogARG(m_plogFile, Log_Infor, "GetDevCategory", "Exit, lResult = <%d>",lResult);
  154. return ErrParse(m_gwiErrorCode);
  155. }
  156. ErrorCodeEnum CThermalPrint::Reset()
  157. {
  158. LogARG(m_plogFile, Log_Infor, "Reset", "Enter...");
  159. long lResult = 0;
  160. m_gwiErrorCode = GWI_Error_Succeed;
  161. lResult = m_pThermalPrintSP->ThermalPrint_Reset();
  162. if(RET_SUCCESS != lResult)
  163. {
  164. LogARG(m_plogFile, Log_Error, "Reset", "Reset failed,nResult = <%d>",lResult);
  165. m_gwiErrorCode = GWI_Error_Dev_Reset;
  166. }
  167. LogARG(m_plogFile, Log_Infor, "Reset", "Exit,lResult = <%d>",lResult);
  168. return ErrParse(m_gwiErrorCode);
  169. }
  170. unsigned long GetTickCount()
  171. {
  172. struct timespec ts;
  173. clock_gettime(CLOCK_MONOTONIC, &ts);
  174. return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
  175. }
  176. void * printProc( void *param )
  177. {
  178. char threadTemp[4666] = {0} ;
  179. int threadStrLen = 0 ;
  180. LogARG(m_plogFile, Log_Infor, "printProc", "Enter...");
  181. while(1)
  182. {
  183. if(devColseFlag)break;//关闭设备退出线程
  184. if( (GetTickCount() - waitTime0) < 1000)
  185. {
  186. usleep(100*1000);
  187. continue;//等待时间未到,上次数据发送之后,未空闲1秒
  188. }
  189. int err = pthread_mutex_trylock(&mtx);
  190. if(0 == err)//抢到锁
  191. {
  192. if( textLen>0 && textBuff[textLen-1] == 0x0a)
  193. {
  194. threadStrLen = textLen ;
  195. memcpy(threadTemp , textBuff , textLen );
  196. textLen = 0;
  197. memset(textBuff,0,sizeof(textBuff));
  198. LogARG(m_plogFile, Log_Infor, "printProc", "PrintRawData =[%d]%s" , threadStrLen , threadTemp);
  199. int ret = m_pThermalPrintSP->ThermalPrint_PrintRawData((LPBYTE)threadTemp, threadStrLen);
  200. if(ret == -14)
  201. {
  202. usleep(1000*1000);
  203. LogARG(m_plogFile,Log_Infor,"printProc","reprint!!!");
  204. ret = m_pThermalPrintSP->ThermalPrint_PrintRawData((LPBYTE)textBuff,textLen);
  205. }
  206. }
  207. else
  208. {
  209. //LogARG(m_plogFile,Log_Infor,"printProc","textBuff have not 0x0a or len = <%d>", textLen);
  210. }
  211. pthread_mutex_unlock(&mtx);
  212. waitTime0 = GetTickCount();
  213. //LogARG(m_plogFile, Log_Infor, "GetTickCount", "waitTime0 = <%d>", waitTime0);
  214. }
  215. else//抢不到锁,说明数据正在被处理,等待对方打印完成
  216. {
  217. LogARG(m_plogFile,Log_Infor,"printProc","waiting!!!");
  218. usleep(5000*1000);
  219. }
  220. }
  221. LogARG(m_plogFile, Log_Infor, "printProc", "Exit...");
  222. return 0;
  223. }
  224. ErrorCodeEnum CThermalPrint::DevClose()
  225. {
  226. LogARG(m_plogFile, Log_Infor, "DevClose", "Enter...");
  227. long lResult = 0;
  228. devColseFlag=true;
  229. m_gwiErrorCode = GWI_Error_Succeed;
  230. lResult = m_pThermalPrintSP->ThermalPrint_CloseDevice();
  231. if(RET_SUCCESS != lResult)
  232. {
  233. LogARG(m_plogFile, Log_Error, "DevClose", "Close failed,nResult = <%d>",lResult);
  234. m_gwiErrorCode = GWI_Error_Dev_Close;
  235. }
  236. LogARG(m_plogFile, Log_Infor, "DevClose", "Exitl,Result = <%d>",lResult);
  237. return ErrParse(m_gwiErrorCode);
  238. }
  239. // ErrorCodeEnum CThermalPrint::GetLastErr(DevErrorInfo &devErrInfo)
  240. // {
  241. // LogARG(m_plogFile, Log_Infor, "GetLastErr", "Enter...");
  242. // memset(&devErrInfo,0,sizeof(DevErrorInfo));
  243. // memcpy(&devErrInfo,&m_DevErrorInfo,sizeof(DevErrorInfo));
  244. // LogARG(m_plogFile, Log_Infor, "GetLastErr", "Exit...");
  245. // return Error_Succeed;
  246. // }
  247. #if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
  248. ErrorCodeEnum CThermalPrint::DevOpen(int argNum, char* argArray)
  249. #else
  250. ErrorCodeEnum CThermalPrint::DevOpen(BYTE btPort,DWORD dwBaudRate)
  251. {
  252. LogARG(m_plogFile, Log_Infor, "DevOpen", "Enter,dwPort = <%d> dwBaudRate = <%d>",btPort,dwBaudRate);
  253. long lResult = 0;
  254. m_gwiErrorCode = GWI_Error_Succeed;
  255. lResult = m_pThermalPrintSP->ThermalPrint_OpenDevice();
  256. if(RET_SUCCESS != lResult)
  257. {
  258. LogARG(m_plogFile, Log_Error, "DevOpen", "open failed,nResult = <%d>",lResult);
  259. if(Error_DevConnFailed == lResult)
  260. {
  261. m_gwiErrorCode = GWI_Error_Dev_Connect;
  262. }
  263. else
  264. {
  265. m_gwiErrorCode = GWI_Error_Dev_Open;
  266. }
  267. }
  268. textLen = 0;
  269. lpszPathAllNum = 0;
  270. devColseFlag = false;
  271. pthread_t Thread;
  272. pthread_create(&Thread, NULL, printProc, (void *)this);
  273. LogARG(m_plogFile, Log_Infor, "DevOpen", "Exitl,Result = <%d>",lResult);
  274. return ErrParse(m_gwiErrorCode);
  275. }
  276. #endif
  277. // 获取打印机实时状态
  278. ErrorCodeEnum CThermalPrint::GetDevState(ThermalState &devState)
  279. {
  280. int iStatus;
  281. int iPaperStatus;
  282. m_gwiErrorCode = GWI_Error_Succeed;
  283. LogARG(m_plogFile, Log_Infor, "GetDevState", "Enter...");
  284. long lResult = 0;
  285. char DevFirmware[1024]={0};
  286. memset(DevFirmware,0x00,sizeof(DevFirmware));
  287. lResult = m_pThermalPrintSP->ThermalPrint_GetStatus(iStatus,DevFirmware);
  288. if(RET_SUCCESS != lResult)
  289. {
  290. LogARG(m_plogFile, Log_Error, "GetDevState", "ThermalPrint_GetStatus failed,nResult = <%d>",lResult);
  291. devState.hardwareState = STATE_OTHER_ERROR;
  292. m_gwiErrorCode = GWI_Error_Dev_State;
  293. }
  294. else
  295. {
  296. if(iStatus==WFS_PTR_DEVONLINE ||iStatus==WFS_PTR_DEVBUSY)
  297. devState.hardwareState = STATE_OK;
  298. else
  299. devState.hardwareState = STATE_OTHER_ERROR;
  300. LogARG(m_plogFile,Log_Infor, "GetDevState","OutVaule: devState.hardwareState= %d",devState.hardwareState);
  301. usleep(100*1000);
  302. lResult = m_pThermalPrintSP->ThermalPrint_GetPaperStatus(iPaperStatus);
  303. LogARG(m_plogFile,Log_Infor, "GetDevState","ThermalPrint_GetPaperStatus failed lResult = %d",lResult);
  304. if(RET_SUCCESS != lResult)
  305. {
  306. LogARG(m_plogFile, Log_Error, "GetDevState", "ThermalPrint_GetStatus failed,nResult = <%d>",lResult);
  307. devState.hardwareState = STATE_OTHER_ERROR;
  308. }
  309. else
  310. {
  311. if(iPaperStatus==WFS_PTR_PAPERFULL)
  312. devState.paperState = PAPER_FULL;
  313. else if(iPaperStatus==WFS_PTR_PAPERLOW)
  314. devState.paperState = PAPER_LOW;
  315. else if(iPaperStatus==WFS_PTR_PAPERLOW)
  316. devState.paperState = PAPER_EMPTY;
  317. else if(iPaperStatus==WFS_PTR_PAPERLOW)
  318. devState.paperState = PAPER_JAMMED;
  319. else
  320. devState.paperState = PAPER_EMPTY;
  321. }
  322. }
  323. LogARG(m_plogFile,Log_Infor, "GetDevState","Exit: lResult = %d",lResult);
  324. return ErrParse(m_gwiErrorCode);
  325. }
  326. //开始打印初始设置:paperWidth一般为80mm和57mm
  327. ErrorCodeEnum CThermalPrint::BeginPrint(ThermalPaperType eType,int paperWidth)
  328. {
  329. LogARG(m_plogFile,Log_Infor, "BeginPrint","Enter eType = %d, paperWidth = %d",eType,paperWidth);
  330. m_gwiErrorCode = WFS_SUCCESS;
  331. m_deviceStatus = DEVICE_STATUS_NORMAL;
  332. m_gwiErrorCode = GWI_Error_Succeed;
  333. ResetParam();
  334. m_PaperType = eType;
  335. m_PaperWidth = paperWidth;
  336. LogARG(m_plogFile,Log_Infor,"BeginPrint","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
  337. return ErrParse(m_gwiErrorCode);
  338. }
  339. //打印控制指令函数:主要是打印,切纸和控制打印光标指令函数
  340. //第三个参数是预留参数 暂时无用到
  341. ErrorCodeEnum CThermalPrint::ControlAction(PrintAction eAction,DWORD dwValue1,DWORD dwValue2)
  342. {
  343. LogARG(m_plogFile,Log_Infor,"ControlAction","Enter eAction = %d, dwValue1 = %d, dwValue2 = %d",eAction,dwValue1,dwValue2);
  344. long ret=0;
  345. int iAction;
  346. int iRightMove = 0;
  347. char newLine[32]={0};
  348. char moveInLine[32]={0};
  349. m_gwiErrorCode = GWI_Error_Succeed;
  350. m_deviceStatus = DEVICE_STATUS_NORMAL;
  351. /*chr20180503修改 解决右移问题*/
  352. if(eAction == ACTION_MOVE_TO_POSITION_RELATIVE)
  353. {
  354. iRightMove = dwValue1;
  355. }
  356. /*end*/
  357. sprintf(newLine,"0|0|%d|%d|%d|%d|%d|111000000|\x0a",m_LeftMargin,m_PrintArea,m_RowSpace,m_Font_SpaceL,m_Font_SpaceR);
  358. //sprintf(moveInLine,"0|0|%d|%d|%d|%d|%d|111000000| ",m_LeftMargin,m_PrintArea,m_RowSpace,0,0);/*chr20180503�޸� �����������*/
  359. sprintf(moveInLine,"%d|0|%d|%d|%d|%d|%d|111000000|\x0a",iRightMove,m_LeftMargin,m_PrintArea,m_RowSpace,0,0);
  360. switch(eAction)
  361. {
  362. case ACTION_PRINT_ONE_LINE://打印走纸一行
  363. case ACTION_PRINT_MOVEFORWRAD_LINES://打印并走纸n行(单位:字符行)//TODO
  364. iAction = 0x0010;
  365. break;
  366. case ACTION_PRINT_MOVEBACKWRAD_LINES://回纸n行(单位:字符行)
  367. iAction = 0x0001;
  368. break;
  369. case ACTION_CUT_ALL://全切纸
  370. pthread_mutex_lock(&mtx);
  371. if(textLen>0)
  372. {
  373. //if(logFile) logFile->Log_Infor(myName, __FILE__, __LINE__, __FUNCDNAME__,"PrintRawData =[%d]%s",textLen,textBuff);
  374. printf("=======textBuff=[%s],textLen=[%d]===========\n",textBuff,textLen);
  375. ret = m_pThermalPrintSP->ThermalPrint_PrintRawData((LPBYTE)textBuff,textLen);
  376. if(ret == -14)
  377. {
  378. usleep(1000*1000);
  379. LogARG(m_plogFile,Log_Infor,"ControlAction","reprint!!!");
  380. ret = m_pThermalPrintSP->ThermalPrint_PrintRawData((LPBYTE)textBuff,textLen);
  381. }
  382. textLen = 0;
  383. //lpszPathAllNum=0; //切纸不值0, 避免文件重复
  384. memset(textBuff,0,sizeof(textBuff));
  385. }
  386. pthread_mutex_unlock(&mtx);
  387. if(ret != 0)
  388. {
  389. LogARG(m_plogFile,Log_Infor,"ControlAction","XFS_PrintRawData ret=%d",ret);
  390. goto exit;
  391. }
  392. iAction = 0x0004;
  393. break;
  394. case ACTION_CUT_HALF://半切纸
  395. pthread_mutex_lock(&mtx);
  396. if(textLen>0)
  397. {
  398. ret = m_pThermalPrintSP->ThermalPrint_PrintRawData((LPBYTE)textBuff,textLen);
  399. textLen = 0;
  400. //lpszPathAllNum=0; //切纸不值0
  401. memset(textBuff,0,sizeof(textBuff));
  402. }
  403. pthread_mutex_unlock(&mtx);
  404. iAction = 0x0080;
  405. break;
  406. //case ACTION_MOVE_TO_POSITION_RELATIVE://把打印光标移动相对当前位置一段距离(横向),单位mm
  407. //case ACTION_MOVE_TO_FORWRAD_LENGTH://移动向前走纸一段距离(距离包括本行高度在内) 单位:mm
  408. case ACTION_MOVE_TO_BLACKMARK://移动到黑标位置,把打印位置设置在行首(标记纸有效)
  409. iAction = 0x0008;
  410. break;
  411. //case ACTION_PRINT_MOVEBACK_TO_LINE://设置起始位置在行首,取值(0:打印内容返回行首,1:清空要打印的内容返回行首)
  412. default :
  413. iAction = 0x0010;
  414. break;
  415. }
  416. LogARG(m_plogFile,Log_Infor,"ControlAction","eAction = %d, iAction = %d",eAction,iAction);
  417. //���ƽ��ʶ���
  418. if(eAction == ACTION_PRINT_ONE_LINE)
  419. {
  420. if(textLen>0)
  421. {
  422. textBuff[textLen]= '&';
  423. textLen++;
  424. }
  425. memcpy(&textBuff[textLen],newLine,strlen(newLine));
  426. textLen += strlen(newLine);
  427. waitTime0 = GetTickCount();
  428. //LogARG(m_plogFile, Log_Infor, "GetTickCount", "waitTime0 = <%d>", waitTime0);
  429. }
  430. else if(eAction == ACTION_PRINT_MOVEFORWRAD_LINES)
  431. {
  432. for(int i=0;i<dwValue1;i++)
  433. {
  434. if(textLen>0)
  435. {
  436. textBuff[textLen]= '&';
  437. textLen++;
  438. }
  439. memcpy(&textBuff[textLen],newLine,strlen(newLine));
  440. textLen += strlen(newLine);
  441. }
  442. waitTime0 = GetTickCount();
  443. //LogARG(m_plogFile, Log_Infor, "GetTickCount", "waitTime0 = <%d>", waitTime0);
  444. }
  445. else if(eAction == ACTION_MOVE_TO_POSITION_RELATIVE)
  446. {
  447. /*chr20180503修改 解决右移问题
  448. for(int i=0;i<dwValue1/2;i++)
  449. {
  450. strcat(moveInLine," ");
  451. if(i>=80)break;
  452. }
  453. */
  454. LogARG(m_plogFile, Log_Infor, "ControlAction", "moveInLine = <%s>", moveInLine);
  455. if(textLen>0)
  456. {
  457. textBuff[textLen]= '&';
  458. textLen++;
  459. }
  460. memcpy(&textBuff[textLen],moveInLine,strlen(moveInLine));
  461. textLen += strlen(moveInLine);
  462. waitTime0 = GetTickCount();
  463. //LogARG(m_plogFile, Log_Infor, "GetTickCount", "waitTime0 = <%d>", waitTime0);
  464. }
  465. else
  466. {
  467. ret = m_pThermalPrintSP->ThermalPrint_ControlMedia(iAction);
  468. }
  469. exit:
  470. LogARG(m_plogFile,Log_Infor,"ControlAction","ret = %d",ret);
  471. if(ret !=0)
  472. {
  473. m_deviceStatus = DEVICE_STATUS_FAULT;
  474. m_gwiErrorCode = GWI_Error_Dev_State;
  475. }
  476. LogARG(m_plogFile,Log_Infor,"ControlAction","textBuff=[%s]textLen = %d",textBuff, textLen);
  477. LogARG(m_plogFile,Log_Infor,"ControlAction","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
  478. return ErrParse(m_gwiErrorCode);
  479. }
  480. //打印参数指令函数:
  481. //第三个参数是预留参数 暂时无用到
  482. ErrorCodeEnum CThermalPrint::SetParam(CommandType eType,DWORD dwValue1,DWORD dwValue2)
  483. {
  484. LogARG(m_plogFile,Log_Infor,"SetParam","Enter eType = %d, dwValue1 = %d, dwValue2 = %d",eType,dwValue1,dwValue2);
  485. m_gwiErrorCode = GWI_Error_Succeed;
  486. switch(eType)
  487. {
  488. case COMMON_ROW_SPACE://行间距 单位mm
  489. m_RowSpace = dwValue1;
  490. break;
  491. case COMMON_ALIGN: //字符对齐模式 单位是"AlignStyle"的值
  492. m_Align = dwValue1;
  493. break;
  494. case COMMON_REVERSE://颠倒打印(注意需要设置退出或者切纸才行,并在行首) 取值(0:正常打印 1:颠倒打印)
  495. m_Reverse = dwValue1;
  496. break;
  497. case COMMON_LEFT_MARGIN://左边距 单位mm
  498. m_LeftMargin = dwValue1;
  499. break;
  500. case COMMON_PRINTABLE_AREA://可打印区域 单位mm
  501. m_PrintArea = dwValue1;
  502. break;
  503. default:
  504. break;
  505. }
  506. LogARG(m_plogFile,Log_Infor,"SetParam","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
  507. return ErrParse(m_gwiErrorCode);
  508. }
  509. //打印字体指令函数:主要是字体相关饿指令函数
  510. //第三个参数是预留参数 设置FONT_CUSTOM_SIZE用到,dwValue1表示宽,dwValue2表示长
  511. // 设置FONT_LEFT_RIGHT_SPACE用到 dwValue1表示左边距 dwValue2表示右边距
  512. ErrorCodeEnum CThermalPrint::SetFont(FontStyle eType,DWORD dwValue1,DWORD dwValue2)
  513. {
  514. LogARG(m_plogFile,Log_Infor,"SetFont","Enter");
  515. LogARG(m_plogFile,Log_Infor,"SetFont","eType=%d,dwValue1=%d,dwValue2=%d",eType,dwValue1,dwValue2);
  516. m_gwiErrorCode = GWI_Error_Succeed;
  517. switch(eType)
  518. {
  519. case FONT_UNDERLINE://粗体 取值(0:否 1:是)
  520. m_Font_UnderLine = dwValue1;
  521. break;
  522. case FONT_BOLD://粗体 取值(0:否 1:是)
  523. m_Font_Bold = dwValue1;
  524. break;
  525. case FONT_INVERSE: //反白 取值(0:否 1:是)
  526. m_Font_Inverse = dwValue1;
  527. break;
  528. case FONT_DOUBLEHEIGHT://纵翻倍放大 取值(0:否 1:是)
  529. m_Font_DoubleHeight = dwValue1;
  530. m_Font_SizeH=0;
  531. break;
  532. case FONT_DOUBLEWIDE://横翻倍向放大 取值(0:否 1:是)
  533. m_Font_DoubleWide = dwValue1;
  534. m_Font_SizeW=0;
  535. break;
  536. case FONT_CUSTOM_SIZE://字体宽高自定义,取值(宽 {1..6} ,长 {1..6})
  537. m_Font_SizeH = dwValue2;
  538. m_Font_SizeW = dwValue1;
  539. break;
  540. case FONT_ROTATE://字体旋转 取值(0,90,180,270)
  541. m_Font_Rotate = dwValue1;
  542. break;
  543. case FONT_LEFT_RIGHT_SPACE://字符左右边距设置 单位mm 取值(左边距 {0..36},右边距 {0..36})
  544. m_Font_SpaceL = dwValue1;
  545. m_Font_SpaceR = dwValue2;
  546. break;
  547. default:
  548. break;
  549. }
  550. LogARG(m_plogFile,Log_Infor,"SetFont","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
  551. return Error_Succeed;
  552. }
  553. //打印文本数据函数
  554. ErrorCodeEnum CThermalPrint::PrintText(BYTE *pData,DWORD dwDataLen)
  555. {
  556. int ret=0;
  557. char formatBuff1[32]={0};
  558. char formatBuff2[32]={0};
  559. BYTE *buffer,*byData;
  560. int len,iDataLen;
  561. LogARG(m_plogFile,Log_Infor,"PrintText","Enter");
  562. LogARG(m_plogFile,Log_Infor,"PrintText","pData=[%s]dwDataLen=%d",pData,dwDataLen);
  563. byData=new BYTE[dwDataLen+256];
  564. buffer=new BYTE[dwDataLen+512];
  565. memset(buffer,0,dwDataLen+512);
  566. memset(byData,0,dwDataLen+256);
  567. memset(formatBuff1,0,sizeof(formatBuff1));
  568. memset(formatBuff2,0,sizeof(formatBuff2));
  569. sprintf(formatBuff1,"0|0|%d|%d|%d|%d|%d|",m_LeftMargin,m_PrintArea,m_RowSpace,m_Font_SpaceL,m_Font_SpaceR);
  570. if( m_Font_SizeH ==0 || m_Font_SizeH>6)
  571. sprintf(formatBuff2,"%d%d%d%d%d0%d%d%d|",m_Align+1,m_Font_DoubleWide+1,m_Font_DoubleHeight+1,m_Font_Bold,0,
  572. m_Font_UnderLine,m_Font_Inverse,m_Font_Rotate/90);
  573. else
  574. sprintf(formatBuff2,"%d%d%d%d%d0%d%d%d|",m_Align+1,m_Font_SizeW,m_Font_SizeH,m_Font_Bold,0,
  575. m_Font_UnderLine,m_Font_Inverse,m_Font_Rotate/90);
  576. strcat((char *)buffer,formatBuff1);
  577. strcat((char *)buffer,formatBuff2);
  578. len=strlen((char *)buffer);
  579. /*chr20180329修改,增加对特殊字符判断*/
  580. int i=0;
  581. iDataLen = 0;
  582. for (i=0; i<dwDataLen;i++)
  583. {
  584. if(pData[i]=='&' || pData[i]=='/'||pData[i]=='|')
  585. {
  586. byData[iDataLen++]='/';
  587. }
  588. byData[iDataLen++]=pData[i];
  589. }
  590. memcpy(&buffer[len],byData,iDataLen);
  591. len +=iDataLen;
  592. //memcpy(&buffer[len],pData,dwDataLen);
  593. //len +=dwDataLen;
  594. m_gwiErrorCode = GWI_Error_Succeed;
  595. m_deviceStatus = DEVICE_STATUS_NORMAL;
  596. //��ӡ����
  597. LogARG(m_plogFile,Log_Infor,"PrintText","buffer=[%s],len=[%d]",buffer,len);
  598. //ret =XFS_PrintRawData(buffer,len);
  599. if(textLen==0)
  600. {
  601. memcpy(textBuff,buffer,len);
  602. textLen += len;
  603. }
  604. else
  605. {
  606. textBuff[textLen]='&';
  607. textLen +=1;
  608. memcpy(&textBuff[textLen],buffer,len);
  609. textLen +=len;
  610. }
  611. waitTime0 = GetTickCount();
  612. //LogARG(m_plogFile, Log_Infor, "GetTickCount", "waitTime0 = <%d>", waitTime0);
  613. delete buffer;
  614. /*if(logFile) logFile->Log_Infor(myName, __FILE__, __LINE__, __FUNCDNAME__,"pData=[%s] dwDataLen=[%d]",pData,dwDataLen);
  615. ret =XFS_PrintRawData(pData,dwDataLen);*/
  616. LogARG(m_plogFile,Log_Infor,"PrintText","PrintRawData ret = %d",ret);
  617. if(ret !=0)
  618. {
  619. m_deviceStatus = DEVICE_STATUS_FAULT;
  620. m_gwiErrorCode = GWI_Error_Dev_State;
  621. }
  622. printf("=======textBuff=[%s],m_gwiErrorCode=[%d]===========\n",textBuff,m_gwiErrorCode);
  623. LogARG(m_plogFile,Log_Infor,"PrintText","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
  624. return ErrParse(m_gwiErrorCode);
  625. }
  626. //打印条形码函数
  627. //dwUnitWidth 条形码基本模块宽度 取值{2..6} 默认2
  628. //dwHeight 条形码高度 单位mm
  629. //iHRIPosition hri字符打印位置 见枚举类型HriPosition
  630. ErrorCodeEnum CThermalPrint::PrintBarCode(BarCodeType eType, BYTE *pData,DWORD dwDataLen,DWORD dwUnitWidth,DWORD dwHeight,HriPosition eHRIPosition)
  631. {
  632. LogARG(m_plogFile,Log_Infor,"PrintBarCode","Enter");
  633. long lResult = 0;
  634. char szBarCode[512]={0};
  635. memset(szBarCode,0x00,sizeof(szBarCode));
  636. sprintf(szBarCode,"BarCode=%s\0",pData);
  637. lResult = m_pThermalPrintSP->ThermalPrint_Printform(0x0000,"TestReceiptForm","TestReceiptMedia",(LPSTR)szBarCode);
  638. m_gwiErrorCode = GWI_Error_Succeed;
  639. LogARG(m_plogFile,Log_Infor,"PrintBarCode","Exit: lResult = %d",lResult);
  640. return ErrParse(m_gwiErrorCode);
  641. }
  642. //打印二维码QRCode函数
  643. //dwUnitWidth 二维码基本元素宽度 取值{1..255} 默认3
  644. ErrorCodeEnum CThermalPrint::PrintQRCode(BYTE *pData,DWORD dwDataLen,DWORD dwUnitWidth)
  645. {
  646. LogARG(m_plogFile,Log_Infor,"PrintQRCode","Enter");
  647. m_gwiErrorCode = GWI_Error_Succeed;
  648. long lResult = 0;
  649. char szQRCode[512]={0};
  650. memset(szQRCode,0x00,sizeof(szQRCode));
  651. sprintf(szQRCode,"BarCode=%s\0",pData);
  652. lResult = m_pThermalPrintSP->ThermalPrint_Printform(0x0000,"TestReceiptForm","TestReceiptMedia",(LPSTR)szQRCode);
  653. LogARG(m_plogFile,Log_Infor,"PrintQRCode","Exit: lResult = %d",lResult);
  654. return ErrParse(m_gwiErrorCode);
  655. }
  656. //打印二维码QRCode函数
  657. //dwWidth 二维码长度 ,单位mm
  658. ErrorCodeEnum CThermalPrint::PrintQRCodeByArea(BYTE *pData,DWORD dwDataLen,DWORD dwUnitWidth,DWORD dwWidth)
  659. {
  660. LogARG(m_plogFile,Log_Infor,"PrintQRCodeByArea","Enter");
  661. m_gwiErrorCode = GWI_Error_Succeed;
  662. long lResult = 0;
  663. char szQRCode[512]={0};
  664. memset(szQRCode,0x00,sizeof(szQRCode));
  665. sprintf(szQRCode,"BarCode=%s\0",pData);
  666. lResult = m_pThermalPrintSP->ThermalPrint_Printform(0x0000,"TestReceiptForm","TestReceiptMedia",(LPSTR)szQRCode);
  667. LogARG(m_plogFile,Log_Infor,"PrintQRCodeByArea","Exit: lResult = %d",lResult);
  668. return ErrParse(m_gwiErrorCode);
  669. }
  670. //打印二维码PDF417函数
  671. //errorLevel pdf417纠错级别 取值{0..8}
  672. //dwUnitWidth 基本元素宽度 取值{3..90}
  673. //dwUnitHeight 基本元素长度 取值{1..30}
  674. //row pdf417 行数 取值{1..7}
  675. //lines pdf417 列数 取值{2..25}
  676. ErrorCodeEnum CThermalPrint::PrintPDF417code(BYTE *pData,DWORD dwDataLen,int errorLevel,DWORD dwUnitWidth,DWORD dwUnitHeight,int rows,int lines)
  677. {
  678. LogARG(m_plogFile,Log_Infor,"PrintPDF417code","Enter");
  679. m_gwiErrorCode = GWI_Error_Succeed;
  680. long lResult = 0;
  681. char szPDF417code[512]={0};
  682. memset(szPDF417code,0x00,sizeof(szPDF417code));
  683. sprintf(szPDF417code,"PDF417code=%s\0",szPDF417code);
  684. lResult = m_pThermalPrintSP->ThermalPrint_Printform(0x0000,"TestReceiptForm","TestReceiptMedia",(LPSTR)szPDF417code);
  685. LogARG(m_plogFile,Log_Infor,"PrintPDF417code","Exit: lResult = %d",lResult);
  686. return ErrParse(m_gwiErrorCode);
  687. }
  688. //打印二维码PDF417函数
  689. //errorLevel pdf417纠错级别 取值{0..8}
  690. //dwWidth pdf417宽度 单位mm
  691. //dwHeight pdf417长度 单位mm
  692. ErrorCodeEnum CThermalPrint::PrintPDF417codeByArea(BYTE *pData,DWORD dwDataLen,int errorLevel,DWORD dwWidth,DWORD dwHeight)
  693. {
  694. LogARG(m_plogFile,Log_Infor,"PrintPDF417codeByArea","Enter");
  695. m_gwiErrorCode = GWI_Error_Succeed;
  696. long lResult = 0;
  697. char szPDF417code[512]={0};
  698. memset(szPDF417code,0x00,sizeof(szPDF417code));
  699. sprintf(szPDF417code,"PDF417code=%s\0",szPDF417code);
  700. lResult = m_pThermalPrintSP->ThermalPrint_Printform(0x0000,"TestReceiptForm","TestReceiptMedia",(LPSTR)szPDF417code);
  701. LogARG(m_plogFile,Log_Infor,"PrintPDF417codeByArea","Exit: lResult = %d",lResult);
  702. return ErrParse(m_gwiErrorCode);
  703. }
  704. LPSTR lpszPathAll[26]={ "/tmp/tmp1.bmp","/tmp/tmp2.bmp","/tmp/tmp3.bmp","/tmp/tmp4.bmp","/tmp/tmp5.bmp",\
  705. "/tmp/tmp6.bmp","/tmp/tmp7.bmp","/tmp/tmp8.bmp","/tmp/tmp9.bmp","/tmp/tmp10.bmp",\
  706. "/tmp/tmp11.bmp","/tmp/tmp12.bmp","/tmp/tmp13.bmp","/tmp/tmp14.bmp","/tmp/tmp15.bmp",\
  707. "/tmp/tmp16.bmp","/tmp/tmp17.bmp","/tmp/tmp18.bmp","/tmp/tmp19.bmp","/tmp/tmp20.bmp",\
  708. "/tmp/tmp21.bmp","/tmp/tmp22.bmp","/tmp/tmp23.bmp","/tmp/tmp24.bmp","/tmp/tmp25.bmp",\
  709. };
  710. //获取打印失败后错误信息和错误状态
  711. ErrorCodeEnum CThermalPrint::PrintImage(BYTE *pData,DWORD dwDataLen)
  712. {
  713. LogARG(m_plogFile,Log_Infor,"PrintImage","Enter");
  714. m_gwiErrorCode = GWI_Error_Succeed;
  715. long lResult = 0;
  716. std::string base64_str;
  717. std::vector<BYTE> decode_byte;
  718. base64_str.assign(pData,pData+dwDataLen);
  719. decode_byte = base64_decode(base64_str);
  720. //stdBytes2File(lpszPath,decode_byte);
  721. //XFS_Printform (0x0000,"TestReceiptForm","TestReceiptMedia",lpszFields);
  722. stdBytes2File(lpszPathAll[lpszPathAllNum],decode_byte);
  723. char imageLine[512]={0};
  724. memset(imageLine,0,sizeof(imageLine));
  725. sprintf(imageLine,"0|0|%d|%d|%d|%d|%d|111001000|",m_LeftMargin,m_PrintArea,0,0,0);
  726. strcat(imageLine,lpszPathAll[lpszPathAllNum++]);
  727. if(lpszPathAllNum>=24)lpszPathAllNum=0;
  728. int len=strlen(imageLine);
  729. if(textLen==0)
  730. {
  731. memcpy(textBuff,imageLine,len);
  732. textLen += len;
  733. }
  734. else
  735. {
  736. textBuff[textLen]='&';
  737. textLen +=1;
  738. memcpy(&textBuff[textLen],imageLine,len);
  739. textLen +=len;
  740. }
  741. waitTime0 = GetTickCount();
  742. LogARG(m_plogFile,Log_Infor,"PrintImage","Exit: lResult = %d",lResult);
  743. return ErrParse(m_gwiErrorCode);
  744. }
  745. //获取打印失败后错误信息和错误状态
  746. ErrorCodeEnum CThermalPrint::GetLastErrState(ThermalState &devState , DevErrorInfo &devErrInfo)
  747. {
  748. LogARG(m_plogFile,Log_Infor,"GetLastErrState","Enter");
  749. m_gwiErrorCode = Error_Succeed;
  750. LogARG(m_plogFile,Log_Infor,"GetLastErrState","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
  751. return Error_Succeed;
  752. }
  753. // ErrorCodeEnum CThermalPrint::ErrParse(long lResult)
  754. // {
  755. // bool bFind = false;
  756. // for(int n = 0; n < sizeof(m_DevErrArray)/sizeof(DevErrCode); n++)
  757. // {
  758. // if(lResult == m_DevErrArray[n].lErr)
  759. // {
  760. // bFind = true;
  761. // ErrorCodeEnum ErrTmp = (ErrorCodeEnum)m_DevErrArray[n].lReturn;
  762. // memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
  763. // strcpy(m_DevErrorInfo.szErrMsg,m_DevErrArray[n].szErrDes);
  764. // m_DevErrorInfo.dwErrMsgLen = (m_DevErrArray[n].lDevErr << 16) +strlen(m_DevErrArray[n].szErrDes);
  765. // return ErrTmp;
  766. // }
  767. // }
  768. // if(!bFind)
  769. // {
  770. // memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
  771. // strcpy(m_DevErrorInfo.szErrMsg,"未定义错误");
  772. // m_DevErrorInfo.dwErrMsgLen =strlen(m_DevErrorInfo.szErrMsg);
  773. // return Error_Hardware;
  774. // }
  775. // return Error_Succeed;
  776. // }
  777. ErrorCodeEnum CThermalPrint::ErrParse(long gwiErrorCode)
  778. {
  779. int i = 0;
  780. for(; gstErrorInfo[i].errorcode != Error_Succeed; ++i)
  781. {
  782. if(gwiErrorCode==gstErrorInfo[i].gwiErrorCode)
  783. {
  784. return gstErrorInfo[i].errorcode;
  785. }
  786. }
  787. return Error_Succeed;
  788. }
  789. // Get last error the device issued.
  790. // Error message must include explanatory memorandum ,the original error
  791. // code and anything in favour of location problem.
  792. ErrorCodeEnum CThermalPrint::GetLastErr(DevErrorInfo &devErrInfo)
  793. {
  794. int i = 0;
  795. memset(&devErrInfo, 0x00, sizeof(DevErrorInfo));
  796. //陈祖国 20190416 未初始化会越界,写法不规范
  797. for(; gstErrorInfo[i].errorcode != Error_Succeed && i < sizeof(gstErrorInfo)/sizeof(StErrorInfo); ++i)
  798. {
  799. if(m_gwiErrorCode==gstErrorInfo[i].gwiErrorCode)
  800. {
  801. devErrInfo.dwErrMsgLen = strlen(gstErrorInfo[i].description);
  802. memcpy(devErrInfo.szErrMsg, gstErrorInfo[i].description, devErrInfo.dwErrMsgLen);
  803. break;
  804. }
  805. }
  806. LogARG(m_plogFile,Log_Infor,"GetLastErr","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
  807. return Error_Succeed;
  808. }