// MultiDPC.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" #include "CDI.h" #include "MultiDPC.h" #include "common_api.h" #include "PacketAnalizer.h" #define MultiDPC_DeviceID "{399B143C-80F1-4D90-81D1-7C5CECC63EE8}" MultiDPC::MultiDPC(void) { } MultiDPC::~MultiDPC(void) { } //基本接口 bool SYSTEM_CALL MultiDPC::GetDeviceType(GUID &DevType) { return string_2_guid(MultiDPC_DeviceID, DevType); } DPCDRIVERTYPE SYSTEM_CALL MultiDPC::GetDPCType() { return DPCDRIVER_MDPC; } void OEM_IF MultiDPC::AddDPCGUID(const char *pGUID) { m_DPCTypes.add(pGUID, ""); } void OEM_IF MultiDPC::GetDPCGUIDs(ResDataObject &GUIDList) { GUIDList = m_DPCTypes; } //get device resource RET_STATUS SYSTEM_CALL MultiDPC::GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResource) { bool ret = true; PRINTA_INFO(m_pLogger, "GetDeviceResource"); RET_STATUS rs = LogicDriver::GetDeviceResource(pDeviceResource); if (rs != RET_SUCCEED) { return rs; } //make device type ret &= pDeviceResource->update("DeviceType", MultiDPC_DeviceID); //make attributes ResDataObject val = (*pDeviceResource)["Attribute"]; ResDataObject Actions = (*pDeviceResource)["Action"]; //添加设备属性在此 val.add("DPCTYPES", m_DPCTypes); ret &= pDeviceResource->update("Attribute", val); //添加设备行为在此 //APPMODE的添加,更新,删除 ret &= Actions.add("AddDPC", ""); ret &= Actions.add("DelDPC", ""); if (Support_FramePrep()) { ret &= Actions.add("FramePrep", INFINITE); } if (Support_FrameReady()) { ret &= Actions.add("FrameReady", INFINITE); } if (Support_FrameStart()) { ret &= Actions.add("FrameStart", INFINITE); } if (Support_FrameIn()) { ret &= Actions.add("FrameIn", INFINITE); } if (Support_FrameOut()) { ret &= Actions.add("FrameOut", INFINITE); } if (Support_FrameEnd()) { ret &= Actions.add("FrameEnd", INFINITE); } if (Support_SeqError()) { ret &= Actions.add("SeqError", INFINITE); } if (Support_SeqEnd()) { ret &= Actions.add("SeqEnd", INFINITE); } if (Support_FrameError()) { ret &= Actions.add("FrameError", INFINITE); } if (Support_FrameRecover()) { ret &= Actions.add("FrameRecover", INFINITE); } if (Support_SeqRecover()) { ret &= Actions.add("SeqRecover", INFINITE); } if (ret) { pDeviceResource->update("Action", Actions); return RET_SUCCEED; } return RET_FAILED; } void DATA_ACTION MultiDPC::DisConnect() { if ((*m_pConnectionStatus) == true) { //发通知 ResDataObject NotifyData; (*m_pConnectionStatus) = false; SetEvent(m_DisConnectionStatusEvt); PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_UPDATE, m_pConnectionStatus->GetKey(), m_pConnectionStatus->GetVal()); CmdFromLogicDev(&NotifyData); } //设置时间 SetLastDisconnectTime(GetTickCount()); } RET_STATUS SYSTEM_CALL MultiDPC::GetSEQResource(ResDataObject PARAM_OUT *pDeviceResource) { RET_STATUS retS = LogicDriver::GetSEQResource(pDeviceResource); if (retS >= RET_SUCCEED) { ResDataObject Actions; INT Idx = (*pDeviceResource).GetFirstOf("Action"); if (Idx >= 0) { Actions = (*pDeviceResource)[Idx]; } bool ret = true; if (Support_FramePrep()) { ret &= Actions.add("FramePrep", INFINITE); } if (Support_FrameReady()) { ret &= Actions.add("FrameReady", INFINITE); } if (Support_FrameStart()) { ret &= Actions.add("FrameStart", INFINITE); } if (Support_FrameIn()) { ret &= Actions.add("FrameIn", INFINITE); } if (Support_FrameOut()) { ret &= Actions.add("FrameOut", INFINITE); } if (Support_FrameEnd()) { ret &= Actions.add("FrameEnd", INFINITE); } if (Support_SeqError()) { ret &= Actions.add("SeqError", INFINITE); } if (Support_SeqEnd()) { ret &= Actions.add("SeqEnd", INFINITE); } if (Support_FrameError()) { ret &= Actions.add("FrameError", INFINITE); } if (Support_FrameRecover()) { ret &= Actions.add("FrameRecover", INFINITE); } if (Support_SeqRecover()) { ret &= Actions.add("SeqRecover", INFINITE); } pDeviceResource->update("Action", Actions); } return retS; } //ResourceCommand Request In and Response Out RET_STATUS SYSTEM_CALL MultiDPC::Request(ResDataObject PARAM_IN *pRequest, ResDataObject PARAM_OUT *pResponse) { ResDataObject res; RET_STATUS ret = RET_NOSUPPORT; //1. analize request PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(pRequest); //cmd:get,set,add,del,exe, //ignore open/close //Action和Attr应该做成一个MAP,经过MAP访问这些资源,不应该是switch case //为了快速做一版,先保留switch case!!! string keystr = PacketAnalizer::GetPacketKey(pRequest); PRINTA_INFO(m_pLogger, "Request is %s", keystr.c_str()); ACTION_SYNC_MODE syncmode = PacketAnalizer::GetPacketSyncMode(pRequest); switch (cmd){ case PACKET_CMD_GET: { if (keystr.size() == 0) { //get resource ret = GetDeviceResource(&res); pResponse->update("CONTEXT", res); } else { //it must be attribute get //Action和Attr应该做成一个MAP,经过MAP访问这些资源 //重新考虑了一遍,这个GET意义不大.因为值的变化总是以Data Notify形式进行同步. assert(0);//NOT FINISHED YET //这点需要应用层的确认,如果应用层没有获取,就没人调用进来 //if(keystr == m_Status.GetKey()) //{ // //yes they want it // //CMD的关键字是否要改成SET??? // pResponse->update("CONTEXT",m_Status.GetVal()); // ret = RET_SUCCEED; // PacketAnalizer::MakeRetCode(ret,pResponse); //} } } break; case PACKET_CMD_EXE: { if (keystr == "AddDPC") { bool result = true; ResDataObject obj1,obj2; result &= PacketAnalizer::GetParam(pRequest, 0, obj1); result &= PacketAnalizer::GetParam(pRequest, 1, obj2); if (result) { if (m_DPCTypes.GetFirstOf((const char *)obj1) >= 0) { ret = (RET_STATUS)AddDPC((const char *)obj1, (const char *)obj2); } } } else if (keystr == "DelDPC") { bool result = true; ResDataObject obj1, obj2; result &= PacketAnalizer::GetParam(pRequest, 0, obj1); result &= PacketAnalizer::GetParam(pRequest, 1, obj2); if (result) { if (m_DPCTypes.GetFirstOf((const char *)obj1) >= 0) { ret = (RET_STATUS)DelDPC((const char *)obj1, (const char *)obj2); } } } else if (keystr == "DisConnect") { DisConnect(); ret = RET_SUCCEED; } else if (keystr == "FramePrep") { ret = (RET_STATUS)FramePrep(); } else if (keystr == "FrameReady") { ret = (RET_STATUS)FrameReady(); } else if (keystr == "FrameStart") { ret = (RET_STATUS)FrameStart(); } else if (keystr == "FrameIn") { ret = (RET_STATUS)FrameIn(); } else if (keystr == "FrameOut") { ret = (RET_STATUS)FrameOut(); } else if (keystr == "FrameEnd") { ret = (RET_STATUS)FrameEnd(); } else if (keystr == "SeqError") { ret = (RET_STATUS)SeqError(); } else if (keystr == "SeqEnd") { ret = (RET_STATUS)SeqEnd(); } else if (keystr == "FrameError") { ret = (RET_STATUS)FrameError(); } else if (keystr == "FrameRecover") { ret = (RET_STATUS)FrameRecover(); } else if (keystr == "SeqRecover") { ret = (RET_STATUS)SeqRecover(); } else if (keystr == "GetSEQResource") { //1. 获取参数 ResDataObject res; ret = (RET_STATUS)GetSEQResource(&res); //3. 打包 if (ret == RET_SUCCEED) { pResponse->update("CONTEXT", res); } } else { ret = RET_NOSUPPORT; } } break; default: //对当前设备来讲,其他都是浮云 break; } //return status if (ret == RET_NOSUPPORT) { ret = LogicDriver::Request(pRequest, pResponse); } PacketAnalizer::MakeRetCode(ret, pResponse); return ret; } //notify to lower layer RET_STATUS SYSTEM_CALL MultiDPC::CmdToLogicDev(ResDataObject PARAM_IN *pCmd) { //这个命令只有一种情况下发生(作为客户端存在的时候) //1.设备的Notify消息 //发往当前客户端的Notify //Data&Action notify!!! //Data Notify分两种 //一种是本数据对象的更新,直接更新 //一种是数据传递给上层,比如图像数据,探测器的剂量需求数据 //Action Notify是发给Owner的 //通知事件,让Owner知道,另外ActionNotify先保留下来 //保留到哪里??? //2.Response //命令Request发出后的反馈 //1. analize request //2. call api //3. check results //put error log here assert(0);//not happening return RET_FAILED; } //对象接口 bool SYSTEM_CALL MultiDPC::DriverEntry(ResDataObject& PARAM_IN Configuration) { return LogicDriver::DriverEntry(Configuration); } //状态机相关 RET_STATUS DATA_ACTION MultiDPC::FramePrep() { return RET_FAILED; } RET_STATUS DATA_ACTION MultiDPC::FrameReady() { return RET_FAILED; } RET_STATUS DATA_ACTION MultiDPC::FrameStart() { return RET_FAILED; } RET_STATUS DATA_ACTION MultiDPC::FrameIn() { return RET_FAILED; } RET_STATUS DATA_ACTION MultiDPC::FrameOut() { return RET_FAILED; } RET_STATUS DATA_ACTION MultiDPC::FrameEnd() { return RET_FAILED; } //3个全局退出&错误Action RET_STATUS DATA_ACTION MultiDPC::SeqError() { return RET_FAILED; } RET_STATUS DATA_ACTION MultiDPC::SeqEnd() { return RET_FAILED; } RET_STATUS DATA_ACTION MultiDPC::FrameError() { return RET_FAILED; } //1个Recover RET_STATUS DATA_ACTION MultiDPC::FrameRecover() { return RET_FAILED; } RET_STATUS DATA_ACTION MultiDPC::SeqRecover() { return RET_FAILED; } bool DATA_ACTION MultiDPC::Support_FramePrep() { return false; } bool DATA_ACTION MultiDPC::Support_FrameReady() { return false; } bool DATA_ACTION MultiDPC::Support_FrameStart() { return false; } bool DATA_ACTION MultiDPC::Support_FrameIn() { return false; } bool DATA_ACTION MultiDPC::Support_FrameOut() { return false; } bool DATA_ACTION MultiDPC::Support_FrameEnd() { return false; } bool DATA_ACTION MultiDPC::Support_SeqError() { return false; } bool DATA_ACTION MultiDPC::Support_SeqEnd() { return false; } bool DATA_ACTION MultiDPC::Support_FrameError() { return false; } bool DATA_ACTION MultiDPC::Support_FrameRecover() { return false; } bool DATA_ACTION MultiDPC::Support_SeqRecover() { return false; } //#define _COMPILE_ONLY bool DATA_ACTION MultiDPC::AddDPC_Platform(LogicDriver *pDPC, ResDataObject &DrvConfig, const char *pszIdentifystr) { pDPC->SetDpcsIdentifyKey(pszIdentifystr); #ifdef _COMPILE_ONLY return false; #else return GetCommandDispathIF()->AddDPC((PVOID)this, (PVOID)pDPC, DrvConfig); #endif } bool DATA_ACTION MultiDPC::DelDPC_Platform(LogicDriver *pDPC) { #ifdef _COMPILE_ONLY return false; #else return GetCommandDispathIF()->DelDPC((PVOID)this, (PVOID)pDPC); #endif } RET_STATUS DATA_ACTION MultiDPC::AddDPC(const char *pGUID, const char *pszIdentifystr) { return RET_FAILED; } RET_STATUS DATA_ACTION MultiDPC::DelDPC(const char *pGUID, const char *pszIdentifystr) { return RET_FAILED; }