#pragma once #include "stdafx.h" #include #include #include #include #include #include "DeliverModule.h" using namespace std::placeholders; namespace nsSerialGPM = DIOS::Dev::MODLE::SerialGPM; #define FullUCB_Com_NormalLen 64 #define FullUCB_Com_HeadLen 7 #define TIMEOUTVALUE 100 #define msTimeOut_Lock 500 #define FullUCB_Com_STX 0x3A #define FullUCB_Com_ETX 0x0D #define FullUCB_Com_EOT 0x0A #define CONFIG "DeviceConfig" //同步模式 #define CONF_SyncMode "SupportSyncMode" //工作位 #define CONF_TABLE "Table" #define CONF_WALL "Wall" #define CONF_FREE "Free" #define CONF_DIRE "Direct" //曝光模式 #define CONF_DR "SingleRad" #define CONF_SR "SerialRad" #define CONF_CF "CoutineSerial" #define CONF_PF "PulseSerial" #define CONF_TOMO "TOMO" #define CONF_Stitch "Stitch" //配置标准字段 #define CONF_AREAID "AREAID" #define CONF_EXOCOUNTS "EXOCOUNTS" #define CONF_INPUT "INPUT" #define CONF_OUTPUT "OUTPUT" #define CONF_CHANNEL "CHANNEL" #define CONF_ENABLE "ENABLE" #define CONF_DISABLE "DISABLE" #define CONF_ALLOWANCE "ALLOWANCE" #define CONF_RELAY "RELAY" #define CONF_SETENABLE "SETENABLE" #define CONF_SETDISABLE "SETDISABLE" //信号名称 #define CONF_HANDSWITCHPREP "HANDSWITCHPREP" #define CONF_HANDSWITCHREADY "HANDSWITCHREADY" #define CONF_FOOTSWITCHREADY "FOOTSWITCHREADY" #define CONF_GENPREP "GENPREP" #define CONF_GENREADY "GENREADY" #define CONF_XWINDOWSTATUS "XWINDOWSTATUS" #define CONF_GENEXPSTATUS "GENEXPSTATUS" #define CONF_DETREACQREQUEST "DETREACQREQUEST" #define CONF_GENEXPREQUEST "GENEXPREQUEST" #define CONF_HANDSWITCHPREPREQUEST "HANDSWITCHPREPREQUEST" #define CONF_HANDSWITCHREADYREQUEST "HANDSWITCHREADYREQUEST" #define CONF_FOOTSWITCHREADYREQUEST "FOOTSWITCHREADYREQUEST" #define CONF_FRAMERATE "FRAMERATE" #define CONF_FOOTSWITCHSTATUS "FOOTSWITCHSATUS" namespace DIOS::Dev::Detail::SYNBOX { /* 指令编码格式: +命令头(0x3A) +命令对象(S表示同步盒,P表示电脑,其他的的再定) +命令字节(由2个字节组合形成) +数据格式(‘A’表示ASIIC码,‘B’表示二进制码,‘C’表示混合或其他模式) +数据长度(由2个字节组合,数据区可以(0~255)) +数据区(根据数据长度发送的结果或数据) +校验和(由2个字节组成,详见注1) +结束位1(0x0D)+结束位2(0x0A) */ //校验和计算 //校验和:等于其前面的几个字节的总和%256,例如算出的校验和等于0X1A,我们发送的校验和为0x31和0X41 int CalChecksum(const char* cCmd, int nCmdSize); //指令格式化 bool FormatCmd(char* cCmd, int& nSize); //把指令转成字符串用以日志输出 bool CmdtoString(const char* cCmd, int nCmdSize, std::string& strCmd); //目标字符串按指定分隔符截取第一个目标字段 std::string GetContentFromString(std::string& strContent, char ch); //尝试按16进制解读字符串,并将解读成功的部分转换为10进制返回 //例如str="169acegh12547",则会解读出"169ace",返回 1481422 int String2Hex(std::string str); //Hex字符转化到Int int ChartoInt(char uc); //Hex字符转化到Int int HexUCtoInt(UCHAR uc); //Int转化成Hex字符 char InttoHexUC(int ni); //串口指令映射表 using cmdFun = std::function ; struct tFrameMapping { enum CMDOverType { OverType_directly = 1, OverType_WaitTime = 2, OverType_WaitACK = 3 }; CMDOverType m_eOverType; //指令结束方式:1.直接退;2.等待一些时间;3.等待ACK bool m_bLogFlag; //设置日志打印 cmdFun m_fFun; //处理函数 int m_nWaitTime; //设置等待时间 HANDLE m_hAckEvent; //设置ACK事件 tFrameMapping(); tFrameMapping(cmdFun fun, CMDOverType type, bool logFlag, int waitTime = 100); ~tFrameMapping(); tFrameMapping& operator =(const tFrameMapping& value); void tSetWaitState(const char* CMD = NULL); void tCheckWaitState(const char* CMD = NULL); }; extern std::map arFrame; //----------------------------------------------------------------------------- // DecodeFrame //----------------------------------------------------------------------------- bool DecodeFrame(const char* strFrame, int length); bool SetWaitAction(const char* strFrame); bool CheckWaitState(const char* strFrame); //串口处理层 void __stdcall ProcessClientData(const char* pData, unsigned long DataLength, void* lparam); void __stdcall WriteLog(const char* pData, nsSerialGPM::LOG_V2_LEVEL level); RET_STATUS HWSendNormal(char* strCommand, int lengh, int headLengh = 1); RET_STATUS HWSendDirectly(char* strCommand, int lengh, int headLengh = 1); RET_STATUS HWSendWaittimeCMD(char* strCommand, int lengh, int headLengh = 1); RET_STATUS HWSendWaitSelfCMD(char* strCommand, int lengh, int headLengh = 1); }