123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582 |
- // 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;
- }
|