#pragma once #include "IODeviceWithSCF.tlh" #include "IODeviceWithSCF.tli" #include "CCOS.Dev.Generator.Mould.hpp" #include "CCOS.Dev.MSGMould.hpp" #include "Define_Simens_RF80.h" #include "DeliverModule.h" #define Ccos_V3 1 #if Ccos_V3 #include "LogicClient.h" #endif // Ccos_V3 #ifdef CCOSDEVGENSDC_EXPORTS #define _CCOSDEVGENSDC_API __declspec(dllexport) #else #define _CCOSDEVGENSDC_API __declspec(dllimport) #endif namespace nsSerialGPM = CCOS::Dev::MODLE::SerialGPM; //----------------------------------------------------------------------------- // GenDevice //----------------------------------------------------------------------------- namespace CCOS::Dev::Detail::Generator { //指令函数对照表 typedef map WSMap; using cbFun = std::function & paramList)>; struct tFrameMapItem { cbFun m_fFun; //处理函数 tFrameMapItem(); tFrameMapItem(cbFun f); tFrameMapItem& operator =(const tFrameMapItem& value); }; //最后一次设置模式 enum RF80_TechMode { RF80Tech_RAD,//点片 RF80Tech_FLU,//透视 RF80Tech_FLU_MAX }; //最后一次设置参数 struct tLastParamItem { string strCMDID; char strParamCMD[GEN_CF80_SEND_LEN_max]{ 0 }; //最后一次参数 tLastParamItem(){} tLastParamItem(const string CMDid, const char* data) { strCMDID = CMDid; strncpy(strParamCMD, data, GEN_CF80_SEND_LEN_max-1); } void SetData(string CMDid, const char* data) { strCMDID = CMDid; strncpy(strParamCMD, data, GEN_CF80_SEND_LEN_max - 1); } }; namespace nDev = CCOS::Dev; class _CCOSDEVGENSDC_API RF80Device : public IODeviceWithSCF ,public GeneratorMould { using super = IODeviceWithSCF ; using superGen = GeneratorMould; public: RF80Device(std::shared_ptr center, nsSCF::SCF SCF,std::string configPath); ~RF80Device (); //设备方法 virtual std::string GetGUID() const override;//提供GUID virtual RET_STATUS SetGenState(int value) override;//设置发生器设备状态 virtual RET_STATUS SetGenSynState(int value) override;//设置发生器曝光状态 virtual RET_STATUS Reset()override; //重置发生器错误 virtual RET_STATUS SetWS(const std::string value) override;//设置工作位 virtual RET_STATUS SetExpEnable() override;//曝光使能 virtual RET_STATUS SetExpDisable()override; virtual RET_STATUS ActiveSyncMode(_tSyncModeArgs value) override; RET_STATUS Clear_DAP(); RET_STATUS GetValue_DAP(float& value); //点片 virtual RET_STATUS IncKV() override;//点片KV调节 virtual RET_STATUS DecKV() override; virtual RET_STATUS SetKV(float value) override; virtual RET_STATUS IncMA() override;//点片MA调节 virtual RET_STATUS DecMA() override; virtual RET_STATUS SetMA(float value) override; virtual RET_STATUS IncMS() override;//点片MS调节 virtual RET_STATUS DecMS() override; virtual RET_STATUS SetMS(float value) override; virtual RET_STATUS IncMAS() override;//点片MAS调节 virtual RET_STATUS DecMAS() override; virtual RET_STATUS SetMAS(float value) override; virtual RET_STATUS SetFocus(int value) override;//设置焦点 virtual RET_STATUS SetTechmode(int value) override;//设置技术模式:1point,2point,3point virtual RET_STATUS SetAECDensity(int value) override;//设置AEC浓度 virtual RET_STATUS SetAECField(int value) override;//设置AEC取样区域 virtual RET_STATUS SetAECFilm(int value) override;//设置AEC胶片 virtual RET_STATUS SetAPR(const _tAPRArgs& t) override;//设置点片参数 virtual RET_STATUS SetAPRArray(vector<_tAPRArgs>& APRarray) override;//一次性设置序列点片参数 virtual RET_STATUS SetFrameRate(FLOAT frameRate) override;//设置序列点片帧率 virtual RET_STATUS QueryHE(int& value) override;//查询设备温度 virtual RET_STATUS QueryPostKV(float& value) override;//查询曝光后的真实参数 virtual RET_STATUS QueryPostMA(float& value) override; virtual RET_STATUS QueryPostMS(float& value) override; virtual RET_STATUS QueryPostMAS(float& value) override; virtual RET_STATUS SetExpMode(std::string value) override;//设置曝光模式:单帧、序列、双能 virtual RET_STATUS SetEXAMMode(std::string value) override;//设置检测模式:手动、自动 //透视 virtual RET_STATUS IncFluKV() override; //透视KV调节 virtual RET_STATUS DecFluKV() override; virtual RET_STATUS SetFluKV(float value) override; virtual RET_STATUS IncFluMA() override; //透视MA调节 virtual RET_STATUS DecFluMA() override; virtual RET_STATUS SetFluMA(float value) override; virtual RET_STATUS IncFluMS() override; //透视MS调节 virtual RET_STATUS DecFluMS() override; virtual RET_STATUS SetFluMS(float value) override; virtual RET_STATUS SetPPS(float frameRate) override; //脉冲透视帧率调节 virtual RET_STATUS INCPPS() override; virtual RET_STATUS DECPPS() override; virtual RET_STATUS SetPluseWidth(float fplusewidth) override; //设置脉宽 virtual RET_STATUS SetABSMode(int nMode) override; //设置自动亮度调节(ABS)模式 virtual RET_STATUS SetABSCurve(int curveNum) override; //ABS曲线调节 virtual RET_STATUS IncABSCurve() override; virtual RET_STATUS DecABSCurve() override; virtual RET_STATUS SetABSValue(float fABSValue) override; virtual RET_STATUS SetABSTargetEXI(float fEXIValue) override; virtual RET_STATUS SetAPF(const _tAPFArgs& t) override; //一次性设置透视参数 virtual float GetFluIntTimer() override; //获取透视周期时间 virtual float GetFluAccTimer() override; //获取透视曝光累计时间 virtual RET_STATUS ResetFluTimer(int ntype) override; //清空透视曝光累计时间 virtual RET_STATUS SetFluPre(int bPrepare) override; //设置透视预备阶段使能 virtual RET_STATUS SetFluEXP(int bPrepare) override; //设置透视曝光阶段使能 virtual RET_STATUS SetFLFMode(std::string value) override; //设置透视模式 virtual RET_STATUS SetFluMAG(int nsize) override; //设置MG:0 to 3 - sets Mag size, ASCII character for 255 - Mag selection disabled virtual RET_STATUS DisableMAG() override; virtual RET_STATUS SetFluDoseLever(int nlever) override; //设置透视剂量等级( 0,1,2 ) virtual RET_STATUS SetHalfDose(int nlever) override; //设置透视半价剂量 virtual RET_STATUS TransferRadCurve(int ncurve) override; //点片KV跟随透视,0-3 Set curve 0:disable //指令消息收发 void FireNotify(std::string key, const int context); //向上层上报整型消息 void FireNotify(std::string key, const float context); //向上层上报浮点型消息 void FireNotify(std::string key, const std::string context); //向上层上报字符串型消息 void FireErrorMessage(const bool Act, const int Code, const char* ResInfo = ""); //上报错误消息 void FireWarnMessage(const bool Act, const int Code, const char* ResInfo = ""); //上报告警消息 //循环线程 HANDLE m_pHardwareStatusThread{ NULL }; bool StartHardwareStatusThread(); static DWORD HardwareStatusThread(LPVOID pParam); //串口处理层 static nsSerialGPM::CDeliverModule m_tDelivermodule; int m_nCMDType_FirstSend{ 0 }; int m_nCMDType_WaitTime{ 0 }; int m_nCMDType_WaitSelf{ 0 }; static void __stdcall ProcessClientData(const char* pData, unsigned long DataLength, void* lparam); static void __stdcall WriteLog(const char* pData, nsSerialGPM::LOG_V2_LEVEL level); RET_STATUS HWSendFirst(char* strCommand, int lengh, stru_EDS_Status& state, int headLengh = 4); RET_STATUS HWSendWaittimeCMD(char* strCommand, int lengh, stru_EDS_Status& state, int headLengh = 4); RET_STATUS HWSendWaitSelfCMD(char* strCommand, int lengh, stru_EDS_Status& state, int headLengh = 4); //V3新方法 virtual void SubscribeSelf(ccos_mqtt_connection* conn) override; protected: void Register(); int GetConfData(); bool OnCallBack(); //RF80特有 void GetState(); //获取当前设备状态 void SetVersion(int ver); //获取设备固件版本 bool FormatCMD(char* pCmd, int& nSize); //指令格式化 void DetectorReady(); //just for Edx, can be sent before EXP but after SXP10 void SetLastParambeforeEXP(RF80_TechMode lastTech, string CMDid, const char* CMDdata); //手闸、脚闸踩下后,X19信号到达前操作 void SetRadStatus(int PreContact, int MainContact); //设置点片曝光状态 void SetFluStatus(int PreContact, int MainContact); //设置透视曝光状态 void SetSynBoxSwitchStatus(bool flag); //设置同步盒手闸、脚闸状态 //参数发送逻辑 bool SetAPRLocal(int nWS, int nET, int nFO, int nKV, float fMA, float fMS, float fMAS, int nAECFieldSel, int nAECFilmSel, int nAECDensity); //点片参数统一发送接口 bool SetAPFLocal(int nWS, int nFluType, int nABSMode, int nDoseLevel, int nFKVP, float fFMA, float fPPS); //透视参数统一发送接口 bool SetPlusFlouroParameter(int curve, int abs, float kv, float ma, float fps); //PF参数处理 bool SetContinulFlourParameter(int curve, int abs); //CF参数处理 bool SetManualFlourParameter(int kv, float ma); //手动透视参数处理 RET_STATUS ProcessMsg(char* strCMD, int nCMDLengh, stru_EDS_Status& state); //统一发送接口 RET_STATUS HWSend(char* strCMD, int nCMDLengh); //串口处理层回调发送接口 //参数处理 void Search3PointRange(float kv, float mas, int focus); //查询3点参数范围 void Search2PointRange(float kv, int focus); //查询2点参数范围 bool CheckRadLimitValue(int techMode, int focus, float kv, float& mas, float& ma); //根据mode不同,查询参数的极限值 bool CheckFluFPSMaxKW(float kv, float ma); //检查当前帧率下功率 int TurnAECFieldSel(bool isToGen, const int value); //AECField参数转化 int TurnAECFilmSel(bool isToGen, int value); //AECFilm参数转化 private: std::unique_ptr m_MSGUnit; //错误消息处理对象 //控制、状态指示 int m_nVersion{ 1 }; //当前硬件版本 cfgWorkStationKey m_strCurrentWSName; //当前工作位名称 _tAPRArgs m_APRParam; //记录APR参数用于SetExpMode时使用 _tAPFArgs m_APFParam; //记录APF参数用于SetFLFMode时使用 stru_EDS_Status m_GenStatus; //当前发生器状态 string m_XrayReady{ "00" }; //是否允许出线: 00 不允许, 10 二档按下, 01 出线ready, 11 二档按下且出线ready string m_ExpReady{ "00" }; //是否允许曝光: 00 不允许曝光, 10 允许点片曝光, 01 允许透视曝光, 11 允许点片透视曝光 int m_RadLimitFlag{ false }; //修改完KV、Focus后需查询MA、MAS上下限 HANDLE m_hRadLimitMASEvent{ NULL }; //查询当前KV、Focus下MAS上限 HANDLE m_hRadLimitMAEvent{ NULL }; //查询当前KV、Focus下MA上限 HANDLE m_hExitEvent{ NULL }; //退出事件 HANDLE m_hLoopEvent{ NULL }; //轮询使能事件 HANDLE m_hArrayEvent[2]; //轮询线程等待事件数组 vector<_tAPRArgs> m_APRarray; //多组APR参数 int m_RadMode{ 0 }; //点片模式:1序列,0单帧 //设备间通信 LogicClient* m_pGenClient; //订阅调用端 string m_SignalArray; //SynBox信号数组 bool m_bNeedSendToSynBox{ false }; //是否向同步盒调用方法 //配制文件 string m_strConfigPath; //generator confile. ResDataObject m_GenConfig; //driver's config file. ResDataObject m_ResParametersList; //参数取值集合 WSMap m_arrWSMap; //工作位标记码查找表 int m_nSYNMode{ 2 }; //同步模式:1.硬同步,2软同步 std::map m_mapFPSMaxKW; //透视最大功率表 string m_bIsSendSXPByRxpFlag{ "10" }; //是否由RXP发送SXP string m_bIsSendSFLByRxpFlag{ "0" }; //是否由RXP发送SFL bool m_bIsSendSCUFPDReady{ false }; //是否发送RDR RF80_TechMode m_LastTechMode{ RF80Tech_FLU_MAX }; //记录最后一次发生器所处Tech模式 tLastParamItem m_LastParamArry[RF80Tech_FLU_MAX]; //最后一组参数 int m_iLoopTime{ 0 }; //循环间隔时间(毫秒) //从配置读取指令参数 int m_nCfgTubeLoad{ 80 }; int m_nCfdCurrentRed{ 100 }; int m_nCfdSwitch{ 0 }; int m_nCfdDose{ 2500 }; int m_nCfdMaxTime{ 2300 }; int m_nCfdDoseRate{ 5000 }; int m_nCfdPFMS{ 30 }; int m_nCfdPFMSMax{ 30 }; //RED下参数上下限 float m_fCurMinMA{ 0 }; float m_fCurMaxMA{ 0 }; float m_fCurMinMS{ 0 }; float m_fCurMaxMS{ 0 }; float m_fCurMinMAS{ 0 }; float m_fCurMaxMAS{ 0 }; }; } //----------------------------------------------------------------------------- // GenDriver //----------------------------------------------------------------------------- namespace CCOS::Dev::Detail::Generator { class _CCOSDEVGENSDC_API RF80Driver : public IODriverWithSCF { using super = IODriverWithSCF ; public: RF80Driver (); virtual ~RF80Driver (); public: virtual void Prepare () override; virtual bool DATA_ACTION Connect () override; virtual void Disconnect() override; virtual bool isConnected() const override; virtual void Dequeue (const char * Packet, DWORD Length) override; virtual void FireNotify (int code, std::string key, std::string content) override; virtual auto CreateDevice (int index)->std::unique_ptr override; virtual std::string DriverProbe () override; virtual std::string GetResource () override; virtual std::string DeviceProbe () override; virtual bool GetDeviceConfig(std::string& Cfg) override; virtual bool SetDeviceConfig(std::string Cfg) override; private: static PACKET_RET callbackPackageProcess (const char* RecData, DWORD nLength, DWORD& PacketLength); ResDataObject m_DeviceConfigSend; ResDataObject m_DeviceConfig; string g_strAppPath; ResDataObject m_ConfigAll; //存储当前的配置,用于修改配置时写回文件 ResDataObject m_Configurations; //存储当前配置中“CONFIGURATION”节点的内容 std::unique_ptr m_pAttribute; std::unique_ptr m_pDescription; bool SaveConfigFile(bool bSendNotify); bool GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue); bool SetDeviceConfigValue(ResDataObject& config, const char* pInnerKey, int nPathID, const char* szValue); }; }