123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011 |
- #include "stdafx.h"
- #include <Windows.h>
- #include <assert.h>
- #include <iostream>
- #include <functional>
- #include "CanModelDPC.h"
- #include "common_api.h"
- #include "PacketAnalizer.h"
- #include "CanModelDevice.h"
- #include "ImagePool.h"
- //#include "logger.h"
- using namespace std::placeholders;
- CanModelDevice::CanModelDevice()
- {
- m_ImagePool = new ImagePoolEx();
- m_DisconnectEvt = 0;
- //m_pMqttClient = NULL;
- m_bSendIndependently = true;
- m_funcRoate = nullptr;
- m_funcFlip = nullptr;
- m_nRotateAngle = 0;
- m_nFlipDirection = 0xFFFF;
- }
- CanModelDevice::~CanModelDevice()
- {
- CompleteUnInit();
- delete m_ImagePool;
- }
- bool ConverCmdType_IoLevel2Ccos(ATTRACTION iocmd, PACKET_CMD &ccoscmd)
- {
- if (iocmd == ATTRACTION_GET)
- {
- ccoscmd = PACKET_CMD_GET;
- }
- else if (iocmd == ATTRACTION_SET)
- {
- ccoscmd = PACKET_CMD_UPDATE;
- }
- else if (iocmd == ATTRACTION_ADD)
- {
- ccoscmd = PACKET_CMD_ADD;
- }
- else if (iocmd == ATTRACTION_DEL)
- {
- ccoscmd = PACKET_CMD_DEL;
- }
- else if (iocmd == ATTRACTION_UPDATE)
- {
- ccoscmd = PACKET_CMD_UPDATE;
- }
- else if (iocmd == ATTRACTION_DATA)
- {
- ccoscmd = PACKET_CMD_DATA;
- }
- else if (iocmd == ATTRACTION_MSG)
- {
- ccoscmd = PACKET_CMD_MSG;
- }
- else
- {
- //wtf??
- //mLog::FERROR("unknown iocmd:{$},packetcmd:{$}", (int)iocmd, (int)ccoscmd);
- return false;
- }
- return true;
- }
- bool ConverCmdType_Ccos2IoLevel(PACKET_CMD ccoscmd, ATTRACTION &iocmd)
- {
- if (ccoscmd == PACKET_CMD_GET)
- {
- iocmd = ATTRACTION_GET;
- }
- else if (ccoscmd == PACKET_CMD_UPDATE)
- {
- iocmd = ATTRACTION_SET;
- }
- else if (ccoscmd == PACKET_CMD_ADD)
- {
- iocmd = ATTRACTION_ADD;
- }
- else if (ccoscmd == PACKET_CMD_DEL)
- {
- iocmd = ATTRACTION_DEL;
- }
- else if (ccoscmd == PACKET_CMD_PART_UPDATE)
- {
- iocmd = ATTRACTION_UPDATE;
- }
- else if (ccoscmd == PACKET_CMD_DATA)
- {
- iocmd = ATTRACTION_DATA;
- }
- else if (ccoscmd == PACKET_CMD_MSG)
- {
- iocmd = ATTRACTION_MSG;
- }
- else
- {
- //wtf??
- //mLog::FERROR("unknown iocmd:{$},packetcmd:{$}", (int)iocmd, (int)ccoscmd);
- return false;
- }
- return true;
- }
- void CanModelDevice::SubscribeSelf()
- {
- LogicDevice::SubscribeSelf();
- //委托IODevice订阅
- m_pMidObject->SubscribeSelf();
- }
- void CanModelDevice::Init(std::unique_ptr <nsDEV::IODevice>&& pMid, HANDLE DisconnectEvt)
- {
- //mLog::FINFO("CanModelDevice::Init...");
-
- m_pMidObject = std::move(pMid);
- //g_pDPCDeviceObject = this;
- //auto a = std::bind(&CanModelDevice::NotifyCallBackEntry, this, _1, _2, _3);
- m_pMidObject->EventCenter->OnNotify.Push(this,&CanModelDevice::NotifyCallBackEntry);
- //auto b = std::bind(&CanModelDevice::RawDataNotifyCallBackEntry, this, _1, _2, _3, _4, _5, _6);
- m_pMidObject->EventCenter->OnDataNotify.Push(this, &CanModelDevice::RawDataNotifyCallBackEntry);
- //auto c = std::bind(&CanModelDevice::NotifyCallBackSetBlockSize, this, _1, _2, _3, _4, _5);
- m_pMidObject->EventCenter->OnMaxBlockSize.Push(this, &CanModelDevice::NotifyCallBackSetBlockSize);
- m_pMidObject->EventCenter->OnSystemLog.Push(this, &CanModelDevice::OnSystemLog);
- m_pMidObject->EventCenter->OnLog.Push(this, &CanModelDevice::OnLog);
- //mLog::FINFO("CanModelDevice:: ...m_pMidObject->Prepare");
- m_pMidObject->Prepare();
- CompleteInit();
- m_pMidObject->SetClientRootID((m_strClientID + "_IODevice").c_str(), "");
- m_pMidObject->CompleteInit();
- //regist notify call back
- //typedef RET_STATUS(DEVICE_ACTION CanModelDevice::*callbackentry) (ATTRACTION cmdType, string &keyType, string &Context);
- //callbackentry func = (callbackentry)&CanModelDevice::CallBackEntry;
- //typedef union _funcContext {
- // callbackentry func_entry;
- // NotifyCALLBACK func_callback;
- //}FUNCCONTEXT;
- //FUNCCONTEXT fc;
- //memset(&fc, 0, sizeof(fc));
- //fc.func_entry = func;
- //NotifyCALLBACK callback = fc.func_callback;
- //std::function<void(const Foo&, int)> fun = std::mem_fn(&Foo::bar);
- m_DisconnectEvt = DisconnectEvt;
- }
- #define CcosImageFul ("ImageFull")
- #define CcosImagePrev ("ImagePrev")
- #define CcosImageId ("Sharememid")
- void DEVICE_ACTION CanModelDevice::NotifyCallBackSetBlockSize(string QueName, DWORD BlockSize, DWORD FulBlockCount, DWORD PrevBlockSize, DWORD PrevBlockCount)
- {
- //Logger *pDevLog = GetLogHandle ();
- //mLog::FINFO ("SetBlockSize. Que:{$},BlockSize:{$},BlockCount:{$},PrevBlockSize:{$},PrevBlockCount:{$}", QueName.c_str(),BlockSize,FulBlockCount,PrevBlockSize,PrevBlockCount);
- //mLog::FINFO("Need Check and Set Rotate and Flip configItem");
- //if (strItem == "RotateAngle")
- //{
- // resResponse = to_string(m_nRotateAngle).c_str();
- // return RET_SUCCEED;
- //}
- //else if (strItem == "FlipDirection")
- ResDataObject resRotate, resFlip;
- resRotate.add("Level", "Public");
- resFlip.add("Level", "Public");
- resRotate.add("Value", "0");
- resFlip.add("Value", "");
- ResDataObject resVs;
- resVs.add("", "0"); resVs.add("", "90"); resVs.add("", "180"); resVs.add("", "270");
- resRotate.add("List", resVs);
- resVs.clear();
- resVs.add("", ""); resVs.add("", "X"); resVs.add("", "Y");
- resFlip.add("List", resVs);
- bool changed = false;
- if (m_resProperties.GetKeyCount("RotateAngle") <= 0)
- {
- changed = true;
- m_resProperties.add("RotateAngle", resRotate);
- m_resProperties.add("FlipDirection", resFlip);
- //mLog::FINFO("No Rotate and Flip configItem Add default");
- }
- else
- {
- m_nRotateAngle = m_resProperties["RotateAngle"]["Value"];
- string dir = m_resProperties["FlipDirection"]["Value"];
- if (dir.length() <= 0)
- m_nFlipDirection = 0xFFFF;
- else if (dir[0] == 'X' || dir[0] == 'x')
- m_nFlipDirection = 0;
- else if (dir[0] == 'Y' || dir[0] == 'y')
- m_nFlipDirection = 1;
- else
- m_nFlipDirection = 0xFFFF;
- }
- if (m_resGets.GetKeyCount("RotateAngle") <= 0)
- {
- changed = true;
- m_resGets.update("RotateAngle", resRotate);
- m_resGets.add("FlipDirection", resFlip);
- }
- if (m_resSets.GetKeyCount("RotateAngle") <= 0)
- {
- changed = true;
- m_resSets.add("RotateAngle", resRotate);
- m_resSets.add("FlipDirection", resFlip);
- }
- if (m_resUpdates.GetKeyCount("RotateAngle") <= 0)
- {
- changed = true;
- m_resUpdates.add("RotateAngle", resRotate);
- m_resUpdates.add("FlipDirection", resFlip);
- }
- m_resModuleConfig["Update"].update("RotateAngle", resRotate);
- m_resModuleConfig["Update"].update("FlipDirection", resFlip);
- if(changed)
- {
- SaveToConfigFile();
- }
- {
- auto hDll = LoadLibrary("ImageRotate.dll");
- if (hDll != INVALID_HANDLE_VALUE)
- {
- m_funcRoate = (ImageRotate) GetProcAddress(hDll, "rotateImage");
- m_funcFlip = (ImageFlip)GetProcAddress(hDll, "flipImage");
- }
- //mLog::FINFO("Try Get ImageFunction Roate = {$} and Flip = {$} from ImageRotate.dll", m_funcRoate, m_funcFlip);
- }
- if (((ImagePoolEx*) m_ImagePool)->SetMaxBlockSize (QueName.c_str (), BlockSize, FulBlockCount, PrevBlockSize, PrevBlockCount) == false)
- {
- //mLog::FERROR( "SetMaxBlockSize Callback Failed");
- }
- else
- {
- //mLog::FINFO( "SetMaxBlockSize Callback Succeed");
- }
- }
- void DEVICE_ACTION CanModelDevice::RawDataNotifyCallBackEntry(int cmdType, string keyType, string Context,string Head,char *pRawData,int DataLength)
- {
- PACKET_CMD ccoscmd = PACKET_CMD_DATA;
- //Logger *pDevLog = GetLogHandle();
- //if (ConverCmdType_IoLevel2Ccos((ATTRACTION)cmdType, ccoscmd))
- {
- BLOCK_IMAGE_TYPE imgType;
- if (cmdType == 0)
- {
- imgType = FULL_BLOCK_IMG;
- }
- else if (cmdType == 1 || cmdType == 2)
- {
- imgType = PREV_BLOCK_IMG;
- }
- else
- {
- //mLog::FERROR( "wrong callback for data notify. cmdtype:{$}", cmdType);
- return;
- }
- CanModelDPC* pDPC = (CanModelDPC*)m_pDrvDPC;
-
- char* pNewData = nullptr;
- int nNewWidth, nNewHeigt, nOldWidth, nOldHeigt, nBits = 0;
- ResDataObject resImageHead;
- bool bNewData = false;
- if (m_nRotateAngle % 360 != 0 && m_nRotateAngle % 90 == 0 && imgType == FULL_BLOCK_IMG)
- {
- if (m_funcRoate != nullptr)
- {
- resImageHead.decode(Head.c_str());
- nOldWidth = (int)resImageHead["ImageHead"]["ImageWidth"];
- nOldHeigt = (int)resImageHead["ImageHead"]["ImageHeight"];
- nBits = (int)resImageHead["ImageHead"]["ImageBit"];
- if (nBits == 16)
- {
- if (pNewData == nullptr)
- pNewData = new char[DataLength];
- memset(pNewData, 0, DataLength);
- bNewData = true;
- nNewWidth = nNewHeigt = 0;
- //mLog::FINFO("Rotate image [{$}] degree Start with Width={$} Heigth={$}", m_nRotateAngle, nOldWidth, nOldHeigt);
- m_funcRoate((WORD*)pRawData, nOldWidth, nOldHeigt, m_nRotateAngle, (WORD*)pNewData, nNewWidth, nNewHeigt);
- resImageHead["ImageHead"]["ImageWidth"] = nOldWidth = nNewWidth;
- resImageHead["ImageHead"]["ImageHeight"] = nOldHeigt = nNewHeigt;
- Head = resImageHead.encode();
- //mLog::FINFO("Rotate image [{$}] degree Over with New Width={$} Heigth={$}", m_nRotateAngle, nNewWidth, nNewHeigt);
- }
- else
- {
- //mLog::FWARN("Only 16bits Image is supported.");
- }
- }
- else
- {
- //mLog::FWARN("Configured Rotate Image but Algorithm is not Ready");
- }
- }
- if (m_nFlipDirection != 0xFFFF && imgType == FULL_BLOCK_IMG)
- {
- if (nBits == 0)
- {
- //说明没有旋转过
- resImageHead.decode(Head.c_str());
- nOldWidth = (int)resImageHead["ImageHead"]["ImageWidth"];
- nOldHeigt = (int)resImageHead["ImageHead"]["ImageHeight"];
- nBits = (int)resImageHead["ImageHead"]["ImageBit"];
- }
- if (nBits == 16)
- {
- if (pNewData == nullptr)
- {
- pNewData = new char[DataLength];
- memset(pNewData, 0, DataLength);
- }
- nNewWidth = nNewHeigt = 0;
- //mLog::FINFO("Flip image {$} Start with Width={$} Heigth={$}", m_nFlipDirection==0?"X":"Y", nOldWidth, nOldHeigt);
- if (bNewData)
- {
- bNewData = false;
- m_funcFlip((WORD*)pNewData, nOldWidth, nOldHeigt, m_nFlipDirection, (WORD*)pRawData, nNewWidth, nNewHeigt);
- }
- else
- {
- bNewData = true;
- m_funcFlip((WORD*)pRawData, nOldWidth, nOldHeigt, m_nFlipDirection, (WORD*)pNewData, nNewWidth, nNewHeigt);
- //memcpy(pRawData, pNewData, DataLength);
- }
- resImageHead["ImageHead"]["ImageWidth"] = nNewWidth;
- resImageHead["ImageHead"]["ImageHeight"] = nNewHeigt;
- //mLog::FINFO("Flip image {$} Over with New Width={$} Heigth={$}", m_nFlipDirection == 0 ? "X" : "Y", nNewWidth, nNewHeigt);
- }
- else
- {
- //mLog::FWARN("Only 16bits Image is supported.");
- }
- }
- //UnvalidSMBid
- ShareMemoryBlockID Id = ((ImagePoolEx*)m_ImagePool)->AddFrameWithHead(imgType, Head, bNewData ? pNewData : pRawData, DataLength);
- if (Id != UnvalidSMBid)
- {
- ResDataObject NotifyData;
- ResDataObject NotifyContext;
- //mLog::FINFO("Data Notify. key:{$},Context:{$},Head:{$} Length {$} with smid {$}", keyType.c_str(), Context.c_str(), Head.c_str(), DataLength, Id);
- NotifyContext.decode(Context.c_str());
- NotifyContext [CcosImageId] = Id;
- NotifyContext.add("ImageFrom", m_strCCOSDevicePath.c_str());
- if (pDPC != nullptr)
- pDPC->ImageRrocess(imgType, Head, NotifyContext, bNewData ? pNewData : pRawData, DataLength, this);
- PacketAnalizer::MakeNotify(NotifyData, ccoscmd, keyType.c_str(), NotifyContext);
- //CmdFromLogicDev(&NotifyData);
- SendNotify(&NotifyData);
- //PublishAction(&NotifyData, (m_strEBusRoot + "/Notify").c_str(), m_pMqttConntion);
- //PublishAction(&NotifyData, (m_strCCOSRoot + "/Notify").c_str(), m_pMqttConntion);
-
- //mLog::FINFO("Data Notify res packet done");
- }
- else
- {
- //mLog::FERROR("can't save frame 2 sharememory.keyType:{$}.Head:{$}.Context:{$}.DataLen:{$}", keyType.c_str(), Head.c_str(), Context.c_str(), DataLength);
- }
- }
- //else
- //{
- // //mLog::FERROR("wrong notify type:%d", cmdType);
- //}
- }
- void DEVICE_ACTION CanModelDevice::NotifyCallBackEntry(int cmdType, string keyType, string Context)
- {
- std::cout << "--------------NotifyCallBackEntry " << std::endl;
- //3. Notify
- PACKET_CMD ccoscmd;
- //Logger* pDevLog = GetLogHandle();
- if (ConverCmdType_IoLevel2Ccos((ATTRACTION)cmdType, ccoscmd))
- {
- /*
- try
- {
- if (keyType == "SubscribeTopic") {
- // 去MQTT Broker 订阅
- std::cout << "--------------SubscribeTopic " << keyType << std::endl;
- //mLog::FINFO(pDevLog, "SubscribeTopic.cmd:{$} key:{$},Context:{$}", cmdType, keyType.c_str(), Context.c_str());
- ResDataObject topics;
- topics.decode(Context.c_str());
-
- for (size_t i = 0; i < topics.size(); i++)
- {
- SubscribeOne((const char*)topics[i]);
- }
-
-
- }
- else if (keyType == "Unsubscribe") {
- // 取消订阅
- //mLog::FINFO(pDevLog, "Unsubscribe.cmd:{$} key:{$},Context:{$}", cmdType, keyType.c_str(), Context.c_str());
- ResDataObject topics;
- topics.decode(Context.c_str());
- for (size_t i = 0; i < topics.size(); i++)
- {
- SubscribeOne((const char*)topics[i], true);
- }
- }
- else {
- // 那就是事件通知,往主题上publish 内容
- //mLog::FINFO(pDevLog, "Notify to MQTT .cmd:{$} key:{$},Context:{$}", cmdType, keyType.c_str(), Context.c_str());
- ostringstream ostopic;
- ostopic << TOPIC_PREFIX << "Notify/" << keyType;
- //mLog::FINFO(pDevLog, "PUBLISH TO MQTT TOPIC :{$},Context:{$}", ostopic.str().c_str(), Context.c_str());
- if (m_pMqttClient->is_connected()) {
- m_pMqttClient->publish(ostopic.str(), Context);
- }
- else {
- //mLog::FERROR( "MQTT Server Still not Connected ", cmdType);
- std::cout << "MQTT Server Still not Connected, Try Publish" << cmdType << " keytype: " << keyType << "Context : " << Context << std::endl;
- }
-
- }
- }
- catch (const mqtt::exception& exc)
- {
- //mLog::FERROR( "MQTT Server Still not Connected %s", exc.what());
- }*/
- if (ccoscmd != PACKET_CMD_DATA)
- {
- //raw data
- ResDataObject NotifyData;
- ResDataObject NotifyContext;
- //mLog::FINFO( "Notify.cmd:{$} key:{$},Context:{$}", cmdType, keyType.c_str(), Context.c_str());
- try
- {
- NotifyContext.decode(Context.c_str());
- }
- catch (...)
- {
- NotifyContext = Context.c_str();
- }
- if (keyType == "ErrorList" && NotifyContext.size() > 0)
- {
- ResDataObject errorObj = NotifyContext[0];
- if (ccoscmd == PACKET_CMD_ADD)
- {
- //if (errorObj.size() > 0 && errorObj[0].GetFirstOf("Type") >= 0)
- //{
- // // Type是0表示Error
- // if (atoi((const char*)errorObj[0]["Type"]) == 0)
- // {
- // string strGUID = NotifyContext.GetKey(0);
- // if (m_pResErrorList->GetFirstOf(strGUID.c_str()) < 0)
- // m_pResErrorList->add(strGUID.c_str(), errorObj);
- // else
- // (*m_pResErrorList)[strGUID.c_str()].add(errorObj.GetKey(0), errorObj[0]);
- // PRINTA_INFO(pDevLog, "Add ErrorList %s", m_pResErrorList->encode());
- // }
- //}
- string strSenderId = "";
- int nSenderIdNum = errorObj.GetKeyCount("SenderId");
- if (nSenderIdNum > 0)
- {
- strSenderId = (string)errorObj["SenderId"];
- }
- string strCodeID = (string)errorObj["CodeID"];
- int nLevel = (int)errorObj["Level"];
- string strInfo = (string)errorObj["Resouceinfo"];
- int nType = (int)errorObj["Type"];
- LogicDevice::AddErrorMessage(strCodeID.c_str(), nLevel, strInfo.c_str(), nType, strSenderId.c_str());
- ////mLog::FINFO(pDevLog, "AddErrorMessage:{$} over", errorObj.encode());
- return;
- }
- else if (ccoscmd == PACKET_CMD_DEL)
- {
- //if (errorObj.size() > 0 && errorObj[0].GetFirstOf("CodeID") >= 0)
- //{
- // string CodeParam = errorObj[0]["CodeID"];
- // if (CodeParam.size() == 0 || CodeParam == "0" || CodeParam == "")
- // {
- // m_pResErrorList->clear();
- // PRINTA_INFO(pDevLog, "Clear all ErrorList");
- // }
- // else
- // {
- // for (size_t n = 0; n < m_pResErrorList->size(); n++)
- // {
- // for (size_t i = 0; i < (*m_pResErrorList)[n].size(); i++)
- // {
- // string strCodekey = (*m_pResErrorList)[n].GetKey(i);
- // if ((*m_pResErrorList)[n][strCodekey.c_str()].GetFirstOf("Type") >= 0)
- // {
- // string strtype = (*m_pResErrorList)[n][strCodekey.c_str()]["Type"];
- // if (strCodekey == CodeParam && atoi(strtype.c_str()) == 0)
- // {
- // (*m_pResErrorList)[n].eraseOneOf(CodeParam.c_str());
- // PRINTA_INFO(pDevLog, "Clear ErrorList %s", m_pResErrorList->encode());
- // break;
- // }
- // }
- // }
- // }
- // }
- //}
- string strCodeID = (string)errorObj["CodeID"];
- int nLevel = (int)errorObj["Level"];
- string strInfo = (string)errorObj["Resouceinfo"];
- int nType = (int)errorObj["Type"];
- LogicDevice::DelErrorMessage(strCodeID.c_str(), nLevel, strInfo.c_str(), nType);
- ////mLog::FINFO(pDevLog, "DelErrorMessage:{$} over", errorObj.encode());
- return;
- }
- }
- PacketAnalizer::MakeNotify(NotifyData, ccoscmd, keyType.c_str(), NotifyContext);
- if (ccoscmd == PACKET_CMD_UPDATE)
- {
- if (m_resUpdates.GetKeyCount(keyType.c_str()) > 0)
- {
- //允许Update的属性,有变动
- //mLog::FINFO("Update property {$} = {$} to Config", keyType, Context);
- ResDataObject resRe;
- DevUpdate(m_strCCOSDevicePath.c_str(),keyType.c_str(), Context.c_str(), resRe);
- }
- }
- CanModelDPC* pDPC = (CanModelDPC*)m_pDrvDPC;
- if(pDPC != nullptr)
- pDPC->NotifyMessageProcess(NotifyData, this);
- //CmdFromLogicDev(&NotifyData);
- SendNotify(&NotifyData);
- //PublishAction(&NotifyData, (m_strEBusRoot + "/Notify").c_str(), m_pMqttConntion);
- /*PublishAction(&NotifyData, (m_strCCOSRoot + "/Notify").c_str(), m_pMqttConntion);*/
- //mLog::FINFO( "Notify res packet done");
- }
- else
- {
- //mLog::FWARN("wrong callback for raw data notify");
- }
- }
- else
- {
- std::cout << "--------------wrong notify type " << cmdType << std::endl;
- //mLog::FERROR("wrong notify type:{$}", cmdType);
- }
- }
- void DEVICE_ACTION CanModelDevice::OnSystemLog(int LogLevel, string Code, string Context, string SenderId)
- {
- IoSystemLog(LogLevel, Code.c_str(), Context.c_str(),Context.size(),SenderId.c_str());
- }
- void DEVICE_ACTION CanModelDevice::OnLog(int LogLevel, string Context)
- {
- //mLog::FINFO( "OnLog : Level{$} Context{$} Size{$}", LogLevel, Context.c_str(), Context.size());
- }
- void DEVICE_ACTION CanModelDevice::OnPassiveDisconnected()
- {
- if (m_DisconnectEvt)
- {
- SetEvent(m_DisconnectEvt);
- }
- }
- bool SYSTEM_CALL CanModelDevice::GetDeviceType(GUID &DevType)
- {
- string lDevType = m_pMidObject->GetGUID();
- //if (m_pMidObject->GetDeviceType(lDevType))
- {
- return string_2_guid(lDevType.c_str(), DevType);
- }
- return false;
- }
- //get device resource
- RET_STATUS SYSTEM_CALL CanModelDevice::GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResource)
- {
- if (m_resGets.size() > 0)
- {
- return ModuleDevice::GetDeviceResource(pDeviceResource);
- }
- bool ret = true;
- string DevRes = m_pMidObject->GetResource();
- //if (m_pMidObject->GetDeviceResource(DevRes))
- //mLog::FINFO("GET IODevice Resouce: {$}", DevRes);
- {
- GUID DrvType;
- string guidstr;
- GetDeviceType(DrvType);
- guid_2_string(DrvType, guidstr);
- ret &= pDeviceResource->add("DeviceType", guidstr.c_str());
- //make device type
- ret &= pDeviceResource->add("ClientType", DPC_UnitClient);
- ResDataObject LowLayerRes;
- //mLog::FINFO("GetDeviceResource: result: {$}", DevRes);
- if (LowLayerRes.decode(DevRes.c_str()))
- {
- //attr
- int Idx = LowLayerRes.GetFirstOf("Attribute");
- if (Idx >= 0)
- {
- pDeviceResource->add("Attribute", LowLayerRes[Idx]);
- int erroridx = (*pDeviceResource)["Attribute"].GetFirstOf("ErrorList");
- if (erroridx < 0)
- {
- (*pDeviceResource)["Attribute"].add("ErrorList", *m_pResErrorList);
- }
- else
- {
- (*pDeviceResource)["Attribute"]["ErrorList"] = *m_pResErrorList;
- }
- }
- else
- {
- ResDataObject Attribute;
- Attribute.add("ErrorList", *m_pResErrorList);
- pDeviceResource->add("Attribute", Attribute);
- }
- //action
- Idx = LowLayerRes.GetFirstOf("Action");
- if (Idx >= 0)
- {
- pDeviceResource->add("Action", LowLayerRes[Idx]);
- }
- else
- {
- pDeviceResource->add("Action", "");
- }
- return RET_SUCCEED;
- }
-
- }
- return RET_FAILED;
- }
- //normal sync routine,Request to device and response from device
- RET_STATUS SYSTEM_CALL CanModelDevice::Request(ResDataObject PARAM_IN *pRequest, ResDataObject PARAM_OUT *pResponse)
- {
- INT ret = RET_NOSUPPORT;
- //1. analize request
- PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(pRequest);
- string keystr = PacketAnalizer::GetPacketKey(pRequest);
- ResDataObject Context;
- if (PacketAnalizer::GetPacketContext(pRequest, Context) == false)
- {
- return RET_FAILED;
- }
- ResDataObject resReponse;
- //Logger *pDevLog = GetLogHandle();
- if (cmd == PACKET_CMD_EXE)
- {
- string req, res;
- req = (const char *)Context.encode();
- //mLog::FINFO("Action[{$}].req:{$}",keystr.c_str(), req.c_str());
- ret = (INT)m_pMidObject->Action(keystr, req, res);
- if (ret >= RET_SUCCEED)
- {
- Context.clear();
- //mLog::FINFO("Action[{$}].res:{$}", keystr.c_str(), res.c_str());
- bool bObject = false;
- for (size_t i = 0; i < res.size(); i++)
- {
- char cValue = res[i];
- if (cValue != ' ' && cValue != '\t' &&
- cValue != '\r' && cValue != '\n')
- {
- if (cValue == '{' && res.find(':') != std::string::npos)
- {
- bObject = true;
- }
- break;
- }
- }
- if (bObject)
- {
- ResDataObject resp;
- resp.decode(res.c_str());
- Context.add("P0", resp);
- }
- else
- {
- Context.add("P0", res.c_str());
- }
- pResponse->update("CONTEXT", Context);
- //mLog::FINFO("Action res packet done");
- }
- }
- else if (cmd == PACKET_CMD_GET)
- {
- string res;
- //ret = m_pMidObject->AttributeAction(ATTRACTION_GET, keystr, res);
- //mLog::FINFO("get CMD_GET req:{$}", keystr.c_str());
- ret = DevGet(m_strCCOSDevicePath.c_str(), keystr.c_str(), resReponse);
- pResponse->update("CONTEXT", resReponse);
- }
- else if (cmd == PACKET_CMD_UPDATE)
- {
- //mLog::FINFO("get CMD_UPDATE req:{$}", keystr.c_str());
- ret = DevUpdate(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
- pResponse->update("CONTEXT", resReponse);
- }
- else if (cmd == PACKET_CMD_ADD)
- {
- //mLog::FINFO("get CMD_ADD req:{$}", keystr.c_str());
- ret = DevAdd(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
- pResponse->update("CONTEXT", resReponse);
- }
- else if (cmd == PACKET_CMD_DEL)
- {
- //mLog::FINFO("get CMD_DEL req:{$}", keystr.c_str());
- ret = DevDel(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
- pResponse->update("CONTEXT", resReponse);
- }
- else
- {
- //wtf??
- }
- PacketAnalizer::MakeRetCode((RET_STATUS)ret, pResponse);
- return (RET_STATUS)ret;
- }
- //notify to lower layer
- RET_STATUS SYSTEM_CALL CanModelDevice::CmdToLogicDev(ResDataObject PARAM_IN *pCmd)
- {
- assert(0);//not happening
- return RET_FAILED;
- }
- RET_STATUS CanModelDevice::OnUpdate(const char* pszProperty, const char* pszValueUpdate, ResDataObject& resRespons)
- {
- string out;
- string strItem = pszProperty;
- if (strItem == "RotateAngle" && pszValueUpdate != nullptr)
- {
- m_nRotateAngle = atoi(pszValueUpdate) / 90 * 90;
- resRespons = to_string(m_nRotateAngle).c_str();
- return RET_SUCCEED;
- }
- else if (strItem == "FlipDirection" && pszValueUpdate != nullptr )
- {
- if (strlen(pszValueUpdate) <= 0)
- {
- m_nFlipDirection = 0xFFFF;
- resRespons = "";
- return RET_SUCCEED;
- }
- m_nFlipDirection = (pszValueUpdate[0] == 'X' ? 0 : (pszValueUpdate[0] == 'Y' ? 1 : 0xFFFF));
- if (m_nFlipDirection != 0xFFFF)
- {
- resRespons = (m_nFlipDirection == 0 ? 'X' : 'Y');
- return RET_SUCCEED;
- }
- return RET_FAILED;
- }
- RET_STATUS ret = m_pMidObject->Update(pszProperty, pszValueUpdate, out);
- if (ret == RET_SUCCEED)
- {
- m_pMidObject->Get(pszProperty, out);
- try {
- resRespons.decode(out.c_str());
- }
- catch (...)
- {
- resRespons = out.c_str();
- }
- return ret;
- }
- return ret;
- }
- RET_STATUS CanModelDevice::OnDel(const char* pszPropery, ResDataObject& resDelValue, ResDataObject& resResponse)
- {
- string out;
- RET_STATUS ret = m_pMidObject->Delete(pszPropery, resDelValue.encode(), out);
- if (ret == RET_SUCCEED)
- resResponse.decode(out.c_str());
- return ret;
- }
- RET_STATUS CanModelDevice::OnAdd(const char* pszPropery, ResDataObject& reAddValue, ResDataObject& resResponse)
- {
- string out;
- RET_STATUS ret = m_pMidObject->Add(pszPropery, reAddValue.encode(), out);
- if (ret == RET_SUCCEED)
- resResponse.decode(out.c_str());
- return ret;
- }
- RET_STATUS CanModelDevice::SetItem(const char* pszPropery, ResDataObject& resSetValue, ResDataObject& resResponse)
- {
- string out, setv;
- if (resSetValue.size() > 0)
- setv = resSetValue.encode();
- else
- setv = (const char*)resSetValue;
- string strItem = pszPropery;
- if (strItem == "RotateAngle" && setv.length() > 0)
- {
- m_nRotateAngle = atoi(setv.c_str()) / 90 * 90;
- resResponse = to_string(m_nRotateAngle).c_str();
- return RET_SUCCEED;
- }
- else if (strItem == "FlipDirection" )
- {
- if (setv.length() <= 0)
- {
- m_nFlipDirection = 0xFFFF;
- resResponse = "";
- return RET_SUCCEED;
- }
- m_nFlipDirection = (setv[0] == 'X' ? 0 : (setv[0] == 'Y' ? 1 : 0xFFFF));
- if (m_nFlipDirection != 0xFFFF)
- {
- resResponse = (m_nFlipDirection == 0 ? 'X' : 'Y');
- return RET_SUCCEED;
- }
- return RET_FAILED;
- }
- RET_STATUS ret = m_pMidObject->Set(pszPropery, setv);
- if (ret == RET_SUCCEED)
- {
- m_pMidObject->Get(pszPropery, out);
- resResponse.decode(out.c_str());
- }
- return ret;
- }
- RET_STATUS CanModelDevice::GetItem(const char* pszPropery, ResDataObject& resResponse)
- {
- string out;
- RET_STATUS ret = m_pMidObject->Get(pszPropery, out);
- if (ret == RET_SUCCEED)
- {
- //mLog::FINFO(" Get {$} from Module result {$}", pszPropery, out);
- try
- {
- if (!resResponse.decode(out.c_str()))
- resResponse = out.c_str();
- }
- catch (...)
- {
- resResponse = out.c_str();
- }
- return ret;
- }
- string strItem = pszPropery;
- if (strItem == "RotateAngle")
- {
- resResponse = to_string(m_nRotateAngle).c_str();
- return RET_SUCCEED;
- }
- else if (strItem == "FlipDirection")
- {
- resResponse = (m_nFlipDirection == 0 ? "X" : (m_nFlipDirection == 1? "Y" :""));
- return RET_SUCCEED;
- }
- return RET_NOSUPPORT;
- }
- RET_STATUS CanModelDevice::OnAction(const char* pszActionName, const char* pszParams, ResDataObject& resResponse)
- {
- //先调用模型的Action
- string out;
- RET_STATUS ret = ModuleDevice::OnAction(pszActionName, pszParams, resResponse);
- //mLog::FINFO(" ModuleDevice::OnAction {$} Module result {$}", pszActionName, (int)ret);
- if (ret == RET_SUCCEED)
- return ret;
- //NewModuleDevice层的Action
- ret = m_pMidObject->Action(pszActionName, pszParams, out);
- //mLog::FINFO(" MidObject->Action {$} Module result {$} with out{$}", pszActionName, (int)ret, out);
- if (ret == RET_SUCCEED)
- resResponse.decode(out.c_str());
- return ret;
- }
|