#include "StdAfx.h" #include #include "common_api.h" #include "PacketAnalizer.h" #include "WheelUnitLogic.h" #define CRTDBG_MAP_ALLOC #include #include #define WHEELUNITLOGICID "{1830DD9F-88B3-442A-9DDA-82D0F0B647F7}" //------------------unit device---------------------------- WheelUnitLogic::WheelUnitLogic(void) { m_Status = new BaseJsonDataObject(); m_Status->SetKey("WHELLSTATUS"); (*m_Status) = false; } WheelUnitLogic::~WheelUnitLogic(void) { delete m_Status; } //get device type bool WheelUnitLogic::GetDeviceType(GUID &DevType) { return string_2_guid(WHEELUNITLOGICID, DevType); } //resource // DeviceType:GUID // attribute:{WHELLSTATUS:0} // action:StartRoll // action:StopRoll //get device resource RET_STATUS WheelUnitLogic::GetDeviceResource(ResDataObject *pDeviceResource) { bool ret = true; //make device type ret &= pDeviceResource->add("ClientType", DPC_UnitClient); ret &= pDeviceResource->add("DeviceType", WHEELUNITLOGICID); //make attributes ResDataObject val; ResDataObject Actions; val.add(m_Status->GetKey(), m_Status->GetVal()); ret &= pDeviceResource->add("Attribute", val); if (Support_GetStatus()) { //make resource ret &= Actions.add("GetStatus", ""); } if (Support_SetStatus()) { //make resource ret &= Actions.add("SetStatus", ""); } if (Support_StartRoll()) { //make resource ret &= Actions.add("StartRoll", ""); } if (Support_StopRoll()) { //make resource ret &= Actions.add("StopRoll", ""); } if (ret) { pDeviceResource->add("Action", Actions); return RET_SUCCEED; } return RET_FAILED; } //ResourceCommand Request In and Response Out RET_STATUS WheelUnitLogic::Request(ResDataObject *pRequest, ResDataObject *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); ACTION_SYNC_MODE syncmode = PacketAnalizer::GetPacketSyncMode(pRequest); switch (cmd){ case PACKET_CMD_EXE: { if (keystr == "GetStatus") { //1. 获取参数 //2. call api bool status = false; ret = (RET_STATUS)GetStatus(status); if (syncmode == ACTION_SYNC) { res.add("P0", status); //3. 打包 pResponse->update("CONTEXT", res); } else { //Async //make notify //问题:Notify会发往很多地方,所以这种情况下要考虑清楚怎么发!!! //点对点情况,Notify要有个返回的地点,不广播 ResDataObject NotifyData; PacketAnalizer::MakeNotifyP2P(NotifyData, PACKET_CMD_UPDATE, pRequest, m_Status->GetKey(), m_Status->GetVal()); CmdFromLogicDev(&NotifyData); } } else if (keystr == "SetStatus") { //1. 获取参数 ResDataObject obj; if (PacketAnalizer::GetParam(pRequest, 0, obj)) { //2. call api ret = (RET_STATUS)SetStatus((bool)obj); //3. 打包 } } else if (keystr == "StartRoll") { //1. 获取参数 //2. call api ret = (RET_STATUS)StartRoll(); //3. 打包 //无参数 } else if (keystr == "StopRoll") { //1. 获取参数 //2. call api ret = (RET_STATUS)StopRoll(); //3. 打包 //无参数 } else if (keystr == "ChangeStatus") { //1. 获取参数 ResDataObject obj; if (PacketAnalizer::GetParam(pRequest, 0, obj)) { //2. call api ret = (RET_STATUS)ChangeStatus((bool)obj); //ret = (RET_STATUS)ChangeStatus(true); //3. 打包 bool status; GetStatus(status); res.add("P0", status); //3. 打包 //printf("call in ChangeStatus\n"); pResponse->update("CONTEXT", res); } } } break; default: //对当前设备来讲,其他都是浮云 break; } //return status PacketAnalizer::MakeRetCode(ret, pResponse); return ret; } //notify to lower layer RET_STATUS WheelUnitLogic::CmdToLogicDev(ResDataObject *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; } //errors,warnings void WheelUnitLogic::SetErrorInfo(int errCode, char *pErrInfo) { //errors //调用点要进行检讨 assert(0);//NOT FINISHED YET } void WheelUnitLogic::SetWarningInfo(int warningCode, char *pWarningInfo) { //warnings //调用点要进行检讨 assert(0);//NOT FINISHED YET } //Data Access int WheelUnitLogic::GetStatus(bool &status) { status = (*m_Status); return RET_SUCCEED; } int WheelUnitLogic::SetStatus(bool status) { RET_STATUS ret = RET_SUCCEED; if ((*m_Status) != status) { //make notify ResDataObject NotifyData; PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_UPDATE, m_Status->GetKey(), m_Status->GetVal()); ret = CmdFromLogicDev(&NotifyData); } (*m_Status) = status; return ret; } //Actions int WheelUnitLogic::StartRoll() { return RET_NOSUPPORT; } int WheelUnitLogic::StopRoll() { return RET_NOSUPPORT; } bool WheelUnitLogic::Support_GetStatus() { return false; } bool WheelUnitLogic::Support_SetStatus() { return false; } bool WheelUnitLogic::Support_StartRoll() { return false; } bool WheelUnitLogic::Support_StopRoll() { return false; } int DEVICE_ACTION WheelUnitLogic::ChangeStatus(bool PARAM_IN st) { return RET_NOSUPPORT; } bool DEVICE_SUPPORT WheelUnitLogic::Support_ChangeStatus() { return false; }