ThermalPrintFSM.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #ifndef PRINTSEALFSM_H
  2. #define PRINTSEALFSM_H
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "ThermalPrint_server_g.h"
  6. #include "ThermalPrint_msg_g.h"
  7. #include "ThermalPrintClass.h"
  8. #include "DevFSMCommBase.hpp"
  9. #include <list>
  10. #include "scew.h"
  11. #include "EventCode.h"
  12. enum EvtType
  13. {
  14. USER_EVT_QUIT = EVT_USER+1,
  15. USER_EVT_PRINT,
  16. USER_EVT_PRECHECK_FINISHED,
  17. USER_EVT_PRINT_FINISHED
  18. };
  19. using namespace ThermalPrint;
  20. using namespace std;
  21. //typedef int (WINAPI *lpAa)();
  22. typedef ErrorCodeEnum (*lpCreateDevCom)(DeviceBaseClass *&baseObj);
  23. typedef ErrorCodeEnum ( *lpReleaseDevCom)(DeviceBaseClass *&pBaseObj);
  24. //打印指令
  25. enum ThermalPrintCommand
  26. {
  27. //CommandType
  28. CMD_COMMON_ROW_SPACE=0, //行间距 单位mm
  29. CMD_COMMON_ALIGN, //字符对齐模式 单位是"AlignStyle"的值
  30. CMD_COMMON_REVERSE, //颠倒打印(注意需要设置退出或者切纸才行,并在行首) 取值(0:正常打印 1:颠倒打印)
  31. CMD_COMMON_LEFT_MARGIN, //左边距 单位mm
  32. CMD_COMMON_PRINTABLE_AREA, //可打印区域 单位mm
  33. //FontStyle
  34. CMD_FONT_UNDERLINE = 10, //下划线 取值(0:否 1:是)
  35. CMD_FONT_BOLD, //粗体 取值(0:否 1:是)
  36. CMD_FONT_INVERSE, //反白 取值(0:否 1:是)
  37. CMD_FONT_DOUBLEHEIGHT, //纵翻倍放大 取值(0:否 1:是)
  38. CMD_FONT_DOUBLEWIDE, //横翻倍向放大 取值(0:否 1:是)
  39. CMD_FONT_CUSTOM_SIZE, //字体宽高自定义,取值(宽 {1..6} ,长 {1..6})
  40. CMD_FONT_ROTATE, //字体旋转 取值(0,90,180,270)
  41. CMD_FONT_LEFT_RIGHT_SPACE, //字符左右边距设置 单位mm 取值(左边距 {0..36},右边距 {0..36})
  42. //PrintAction
  43. CMD_ACTION_PRINT_ONE_LINE=100, //打印走纸一行
  44. CMD_ACTION_PRINT_MOVEFORWRAD_LINES, //打印并走纸n行(单位:字符行)
  45. CMD_ACTION_PRINT_MOVEBACKWRAD_LINES,//回纸n行(单位:字符行)
  46. CMD_ACTION_CUT_ALL, //全切纸
  47. CMD_ACTION_CUT_HALF, //半切纸
  48. CMD_ACTION_MOVE_TO_POSITION_RELATIVE,//把打印光标移动相对当前位置一段距离(横向),单位mm
  49. CMD_ACTION_MOVE_TO_FORWRAD_LENGTH, //移动向前走纸一段距离(距离包括本行高度在内) 单位:mm
  50. CMD_ACTION_MOVE_TO_BLACKMARK, //移动到黑标位置,把打印位置设置在行首(标记纸有效)
  51. CMD_ACTION_PRINT_MOVEBACK_TO_LINE, //设置起始位置在行首,取值(0:打印内容返回行首,1:清空要打印的内容返回行首)
  52. //printImage
  53. CMD_PRINT_IMAGE=200, //打印图片
  54. //printText
  55. CMD_PRINT_TEXT, //打印文本
  56. //printBarCode
  57. CMD_PRINT_BARCODE, //打印条形码
  58. //printQR
  59. CMD_PRINT_QR, //打印二维码
  60. };
  61. struct PrintCommand
  62. {
  63. ThermalPrintCommand eCommandType;
  64. CSimpleStringA strCommandType; //指令类型中文名称
  65. CSimpleStringA strCommand; //参数以|做分隔,参数会有明文显示或者base64编码的内容
  66. BarCodeType eBarcodeType; //条形码子类型
  67. QRCodeType eQRcodeType; //二维码子类型
  68. CSimpleStringA strParam; //条形码和二维码子参数
  69. };
  70. class PrintEvent : public FSMEvent
  71. {
  72. public:
  73. PrintEvent() : FSMEvent(USER_EVT_PRINT){}
  74. virtual ~PrintEvent(){}
  75. virtual void OnUnhandled()
  76. {
  77. LOG_TRACE("do print not handled");
  78. }
  79. };
  80. class CThermalPrintFSM: public CCommDevFSM<CThermalPrintFSM, ThermalPrintClass>
  81. {
  82. public:
  83. enum {s0, s1, s2};
  84. BEGIN_FSM_STATE(CThermalPrintFSM)
  85. FSM_STATE_ENTRY(s0, "Ready", s0_on_entry, s0_on_exit, s0_on_event)
  86. FSM_STATE_ENTRY(s1, "PreCheck", s1_on_entry, s1_on_exit, s1_on_event)
  87. FSM_STATE_ENTRY(s2, "Printing", s2_on_entry, s2_on_exit, s2_on_event)
  88. END_FSM_STATE()
  89. BEGIN_FSM_RULE(CThermalPrintFSM, s0)
  90. FSM_RULE_ENTRY(s0, s0, EVT_TIMER, 0)//定时
  91. FSM_RULE_ENTRY(s0, s1, USER_EVT_PRINT, 0)//进入打印
  92. FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  93. FSM_RULE_ENTRY(s1, s2, USER_EVT_PRECHECK_FINISHED, 0) // 预检查打印机成功
  94. FSM_RULE_ENTRY(s1, s0, USER_EVT_PRECHECK_FINISHED, 1) // 预检查打印机失败
  95. FSM_RULE_ENTRY(s2, s0, USER_EVT_PRINT_FINISHED, 0) // 打印成功
  96. FSM_RULE_ENTRY(s2, s0, USER_EVT_PRINT_FINISHED, 1) // 打印失败
  97. END_FSM_RULE()
  98. public:
  99. CThermalPrintFSM()
  100. :m_bSupportPrint(false),m_bDevOpen(false),m_bHasPrintTask(false),m_pCommandList(NULL)
  101. {
  102. m_version=0;
  103. m_batch=0;
  104. m_port=0;
  105. m_baudrate=0;
  106. m_PrintTaskUUID="";
  107. m_paperWidth=80;
  108. }
  109. virtual ~CThermalPrintFSM() {}
  110. virtual ErrorCodeEnum OnInit();
  111. virtual ErrorCodeEnum OnExit();
  112. virtual void OnStateTrans(int iSrcState, int iDstState);
  113. virtual void s0_on_entry();
  114. virtual void s0_on_exit();
  115. virtual unsigned int s0_on_event(FSMEvent* e);
  116. virtual void s1_on_entry();
  117. virtual void s1_on_exit();
  118. virtual unsigned int s1_on_event(FSMEvent* e);
  119. virtual void s2_on_entry();
  120. virtual void s2_on_exit();
  121. virtual unsigned int s2_on_event(FSMEvent* e);
  122. ErrorCodeEnum SafeFreeLibrary();
  123. ErrorCodeEnum FetchOtherParam();
  124. void ClearPrintCMD();
  125. ErrorCodeEnum GetPrintState(int& state , CSimpleStringA& err_msg);
  126. ErrorCodeEnum ParsePrintXml(CSimpleStringA xml);//解析xml
  127. PrintCommand* ParseCommand(scew_element *elem);
  128. int PreCheckPrinter();
  129. int Print();
  130. int ExecutePrintCMD(PrintCommand* cmd);
  131. CSimpleStringA decodeBase64Content( const char* str );
  132. CSimpleStringA decodeXmlContent(const char* str);
  133. CSimpleStringA replaceXmlContent(CSimpleStringA& str,const char* regex,const char* replacement);
  134. // 获取当前是否有打印任务
  135. bool GetHasPrintTask() const {return m_bHasPrintTask;}
  136. bool IsSupportPrint() { return m_bSupportPrint;}
  137. bool isPrinting() {
  138. //判断是否在状态S0
  139. if(strcmp(GetCurrStateName(),"Ready")==0){
  140. return false;
  141. }else{
  142. return true;
  143. }
  144. }
  145. bool isDevOpen(){
  146. return m_bDevOpen;
  147. }
  148. void setPaperType(int paperType){
  149. m_paperType = (ThermalPaperType)paperType;
  150. }
  151. void setPaperWidth(int paperWidth){
  152. m_paperWidth= paperWidth;
  153. }
  154. void setPrintTaskUUID(CSimpleStringA uuid){
  155. m_PrintTaskUUID=uuid;
  156. }
  157. int ExecuteParamCMD(PrintCommand* cmd);
  158. int ExecuteFontCMD(PrintCommand* cmd);
  159. int ExecuteActionCMD(PrintCommand* cmd);
  160. int ExecuteImageCMD(PrintCommand* cmd);
  161. void OnPrintFailed();
  162. void OnPrintSucc();
  163. void OnPreCheckFailed();
  164. char* ConvertUtf8ToGBK(char* strUtf8);
  165. private:
  166. list<PrintCommand*>* m_pCommandList;//打印指令集合
  167. bool m_bSupportPrint;//是否支持打印服务
  168. bool m_bHasPrintTask;//是否有任务
  169. bool m_bDevOpen;//dev是否打开成功
  170. ThermalPaperType m_paperType;
  171. int m_paperWidth;
  172. int m_version, m_batch,m_port, m_baudrate;
  173. CSimpleStringA m_PrintTaskUUID;
  174. CSimpleStringA m_errCode;
  175. CSimpleStringA m_errMsg;
  176. };
  177. struct PreCheckPrinterTask : public ITaskSp
  178. {
  179. CThermalPrintFSM *m_pFSM;
  180. PreCheckPrinterTask(CThermalPrintFSM *f) : m_pFSM(f) {}
  181. void Process()
  182. {
  183. FSMEvent *e = new FSMEvent(USER_EVT_PRECHECK_FINISHED);
  184. e->param1 = m_pFSM->PreCheckPrinter();
  185. m_pFSM->PostEventFIFO(e);
  186. }
  187. };
  188. struct PrintTask : public ITaskSp
  189. {
  190. CThermalPrintFSM *m_pFsm;
  191. PrintTask(CThermalPrintFSM* f) : m_pFsm(f) {}
  192. void Process()
  193. {
  194. FSMEvent *e = new FSMEvent(USER_EVT_PRINT_FINISHED);
  195. e->param1 = m_pFsm->Print();
  196. m_pFsm->PostEventFIFO(e);
  197. }
  198. };
  199. #endif //PRINTFSM_H