123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- #ifndef PRINTSEALFSM_H
- #define PRINTSEALFSM_H
- #pragma once
- #include "SpFSM.h"
- #include "ThermalPrint_server_g.h"
- #include "ThermalPrint_msg_g.h"
- #include "ThermalPrintClass.h"
- #include "DevFSMCommBase.hpp"
- #include <list>
- #include "scew.h"
- #include "EventCode.h"
- enum EvtType
- {
- USER_EVT_QUIT = EVT_USER+1,
- USER_EVT_PRINT,
- USER_EVT_PRECHECK_FINISHED,
- USER_EVT_PRINT_FINISHED
- };
- using namespace ThermalPrint;
- using namespace std;
- //typedef int (WINAPI *lpAa)();
- typedef ErrorCodeEnum (*lpCreateDevCom)(DeviceBaseClass *&baseObj);
- typedef ErrorCodeEnum ( *lpReleaseDevCom)(DeviceBaseClass *&pBaseObj);
- //打印指令
- enum ThermalPrintCommand
- {
- //CommandType
- CMD_COMMON_ROW_SPACE=0, //行间距 单位mm
- CMD_COMMON_ALIGN, //字符对齐模式 单位是"AlignStyle"的值
- CMD_COMMON_REVERSE, //颠倒打印(注意需要设置退出或者切纸才行,并在行首) 取值(0:正常打印 1:颠倒打印)
- CMD_COMMON_LEFT_MARGIN, //左边距 单位mm
- CMD_COMMON_PRINTABLE_AREA, //可打印区域 单位mm
- //FontStyle
- CMD_FONT_UNDERLINE = 10, //下划线 取值(0:否 1:是)
- CMD_FONT_BOLD, //粗体 取值(0:否 1:是)
- CMD_FONT_INVERSE, //反白 取值(0:否 1:是)
- CMD_FONT_DOUBLEHEIGHT, //纵翻倍放大 取值(0:否 1:是)
- CMD_FONT_DOUBLEWIDE, //横翻倍向放大 取值(0:否 1:是)
- CMD_FONT_CUSTOM_SIZE, //字体宽高自定义,取值(宽 {1..6} ,长 {1..6})
- CMD_FONT_ROTATE, //字体旋转 取值(0,90,180,270)
- CMD_FONT_LEFT_RIGHT_SPACE, //字符左右边距设置 单位mm 取值(左边距 {0..36},右边距 {0..36})
- //PrintAction
- CMD_ACTION_PRINT_ONE_LINE=100, //打印走纸一行
- CMD_ACTION_PRINT_MOVEFORWRAD_LINES, //打印并走纸n行(单位:字符行)
- CMD_ACTION_PRINT_MOVEBACKWRAD_LINES,//回纸n行(单位:字符行)
- CMD_ACTION_CUT_ALL, //全切纸
- CMD_ACTION_CUT_HALF, //半切纸
- CMD_ACTION_MOVE_TO_POSITION_RELATIVE,//把打印光标移动相对当前位置一段距离(横向),单位mm
- CMD_ACTION_MOVE_TO_FORWRAD_LENGTH, //移动向前走纸一段距离(距离包括本行高度在内) 单位:mm
- CMD_ACTION_MOVE_TO_BLACKMARK, //移动到黑标位置,把打印位置设置在行首(标记纸有效)
- CMD_ACTION_PRINT_MOVEBACK_TO_LINE, //设置起始位置在行首,取值(0:打印内容返回行首,1:清空要打印的内容返回行首)
-
- //printImage
- CMD_PRINT_IMAGE=200, //打印图片
- //printText
- CMD_PRINT_TEXT, //打印文本
- //printBarCode
- CMD_PRINT_BARCODE, //打印条形码
- //printQR
- CMD_PRINT_QR, //打印二维码
- };
- struct PrintCommand
- {
- ThermalPrintCommand eCommandType;
- CSimpleStringA strCommandType; //指令类型中文名称
- CSimpleStringA strCommand; //参数以|做分隔,参数会有明文显示或者base64编码的内容
- BarCodeType eBarcodeType; //条形码子类型
- QRCodeType eQRcodeType; //二维码子类型
- CSimpleStringA strParam; //条形码和二维码子参数
- };
- class PrintEvent : public FSMEvent
- {
- public:
- PrintEvent() : FSMEvent(USER_EVT_PRINT){}
- virtual ~PrintEvent(){}
- virtual void OnUnhandled()
- {
- LOG_TRACE("do print not handled");
- }
- };
- class CThermalPrintFSM: public CCommDevFSM<CThermalPrintFSM, ThermalPrintClass>
- {
- public:
- enum {s0, s1, s2};
- BEGIN_FSM_STATE(CThermalPrintFSM)
- FSM_STATE_ENTRY(s0, "Ready", s0_on_entry, s0_on_exit, s0_on_event)
- FSM_STATE_ENTRY(s1, "PreCheck", s1_on_entry, s1_on_exit, s1_on_event)
- FSM_STATE_ENTRY(s2, "Printing", s2_on_entry, s2_on_exit, s2_on_event)
- END_FSM_STATE()
- BEGIN_FSM_RULE(CThermalPrintFSM, s0)
- FSM_RULE_ENTRY(s0, s0, EVT_TIMER, 0)//定时
- FSM_RULE_ENTRY(s0, s1, USER_EVT_PRINT, 0)//进入打印
- FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
- FSM_RULE_ENTRY(s1, s2, USER_EVT_PRECHECK_FINISHED, 0) // 预检查打印机成功
- FSM_RULE_ENTRY(s1, s0, USER_EVT_PRECHECK_FINISHED, 1) // 预检查打印机失败
- FSM_RULE_ENTRY(s2, s0, USER_EVT_PRINT_FINISHED, 0) // 打印成功
- FSM_RULE_ENTRY(s2, s0, USER_EVT_PRINT_FINISHED, 1) // 打印失败
- END_FSM_RULE()
- public:
- CThermalPrintFSM()
- :m_bSupportPrint(false),m_bDevOpen(false),m_bHasPrintTask(false),m_pCommandList(NULL)
- {
- m_version=0;
- m_batch=0;
- m_port=0;
- m_baudrate=0;
- m_PrintTaskUUID="";
- m_paperWidth=80;
- }
- virtual ~CThermalPrintFSM() {}
- virtual ErrorCodeEnum OnInit();
- virtual ErrorCodeEnum OnExit();
- virtual void OnStateTrans(int iSrcState, int iDstState);
- virtual void s0_on_entry();
- virtual void s0_on_exit();
- virtual unsigned int s0_on_event(FSMEvent* e);
- virtual void s1_on_entry();
- virtual void s1_on_exit();
- virtual unsigned int s1_on_event(FSMEvent* e);
- virtual void s2_on_entry();
- virtual void s2_on_exit();
- virtual unsigned int s2_on_event(FSMEvent* e);
- ErrorCodeEnum SafeFreeLibrary();
- ErrorCodeEnum FetchOtherParam();
- void ClearPrintCMD();
- ErrorCodeEnum GetPrintState(int& state , CSimpleStringA& err_msg);
- ErrorCodeEnum ParsePrintXml(CSimpleStringA xml);//解析xml
- PrintCommand* ParseCommand(scew_element *elem);
- int PreCheckPrinter();
- int Print();
- int ExecutePrintCMD(PrintCommand* cmd);
- CSimpleStringA decodeBase64Content( const char* str );
- CSimpleStringA decodeXmlContent(const char* str);
- CSimpleStringA replaceXmlContent(CSimpleStringA& str,const char* regex,const char* replacement);
- // 获取当前是否有打印任务
- bool GetHasPrintTask() const {return m_bHasPrintTask;}
- bool IsSupportPrint() { return m_bSupportPrint;}
- bool isPrinting() {
- //判断是否在状态S0
- if(strcmp(GetCurrStateName(),"Ready")==0){
- return false;
- }else{
- return true;
- }
- }
- bool isDevOpen(){
- return m_bDevOpen;
- }
- void setPaperType(int paperType){
- m_paperType = (ThermalPaperType)paperType;
- }
- void setPaperWidth(int paperWidth){
- m_paperWidth= paperWidth;
- }
- void setPrintTaskUUID(CSimpleStringA uuid){
- m_PrintTaskUUID=uuid;
- }
-
- int ExecuteParamCMD(PrintCommand* cmd);
- int ExecuteFontCMD(PrintCommand* cmd);
- int ExecuteActionCMD(PrintCommand* cmd);
- int ExecuteImageCMD(PrintCommand* cmd);
- void OnPrintFailed();
- void OnPrintSucc();
- void OnPreCheckFailed();
- char* ConvertUtf8ToGBK(char* strUtf8);
- private:
- list<PrintCommand*>* m_pCommandList;//打印指令集合
- bool m_bSupportPrint;//是否支持打印服务
- bool m_bHasPrintTask;//是否有任务
- bool m_bDevOpen;//dev是否打开成功
-
-
- ThermalPaperType m_paperType;
- int m_paperWidth;
- int m_version, m_batch,m_port, m_baudrate;
- CSimpleStringA m_PrintTaskUUID;
- CSimpleStringA m_errCode;
- CSimpleStringA m_errMsg;
- };
- struct PreCheckPrinterTask : public ITaskSp
- {
- CThermalPrintFSM *m_pFSM;
- PreCheckPrinterTask(CThermalPrintFSM *f) : m_pFSM(f) {}
- void Process()
- {
- FSMEvent *e = new FSMEvent(USER_EVT_PRECHECK_FINISHED);
- e->param1 = m_pFSM->PreCheckPrinter();
- m_pFSM->PostEventFIFO(e);
- }
- };
- struct PrintTask : public ITaskSp
- {
- CThermalPrintFSM *m_pFsm;
- PrintTask(CThermalPrintFSM* f) : m_pFsm(f) {}
- void Process()
- {
- FSMEvent *e = new FSMEvent(USER_EVT_PRINT_FINISHED);
- e->param1 = m_pFsm->Print();
- m_pFsm->PostEventFIFO(e);
- }
- };
- #endif //PRINTFSM_H
|