DIOSBoardController.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. #include "stdafx.h"
  2. #include "DIOSBoardController.h"
  3. #include "LogicDriverThreadLocker.h"
  4. #include "SCFLoader.h"
  5. #include "NotifyPacket.h"
  6. using namespace DIOS::Dev::Detail::MachineryECOM;
  7. using namespace DIOS::Dev::Communication;
  8. DIOSBoardController::DIOSBoardController()
  9. :m_SCFInstance(nullptr),
  10. m_connectStatus(FALSE)
  11. {
  12. }
  13. DIOSBoardController::~DIOSBoardController()
  14. {
  15. }
  16. bool DIOSBoardController::Initialize(SCF* pSCF)
  17. {
  18. bool ret = true;
  19. SCFLoader::Instance()->Initialize(pSCF);
  20. m_SCFInstance = SCFLoader::Instance()->GetSCFInstance();
  21. if (!m_SCFInstance)
  22. {
  23. if(gdriverLog) gdriverLog->Error("DIOSBoardController Initialize failed to get SCFInstance.");
  24. ret = false;
  25. }
  26. return ret;
  27. }
  28. bool DIOSBoardController::SetPassiveDisconnectEventHandle(HANDLE handle)
  29. {
  30. if (m_SCFInstance)
  31. {
  32. //m_SCFInstance->SetPassiveDisconnectEvt(handle);
  33. }
  34. return m_SCFInstance != nullptr;
  35. }
  36. bool DIOSBoardController::Connect(ResDataObject& Connection)
  37. {
  38. if (m_SCFInstance)
  39. {
  40. if(gdriverLog) gdriverLog->Info("{$}{$}", " DIOSBoardController Connecting", Connection.encode());
  41. int nResult = m_SCFInstance->Connect(Connection.encode(), &DIOSBoardController::EventCallback, SCF_PACKET_TRANSFER, 5000);
  42. if (SCF_SUCCEED == nResult)
  43. {
  44. if(gdriverLog) gdriverLog->Info("DIOSBoardController SCF Connected");
  45. m_connectStatus = TRUE;
  46. }
  47. else
  48. {
  49. return false;
  50. }
  51. }
  52. else
  53. {
  54. }
  55. return m_connectStatus;
  56. }
  57. bool DIOSBoardController::Disonnect()
  58. {
  59. if (m_SCFInstance)
  60. {
  61. m_SCFInstance->Disconnect();
  62. }
  63. m_connectStatus = FALSE;
  64. return true;
  65. }
  66. DWORD DIOSBoardController::Lock()
  67. {
  68. LogicDriverThreadLocker::Instance()->Lock();
  69. return 0;
  70. }
  71. void DIOSBoardController::UnLock()
  72. {
  73. LogicDriverThreadLocker::Instance()->UnLock();
  74. }
  75. bool DIOSBoardController::Send(SCFPacket *sendPacket, SCFPacket *recvPacket)
  76. {
  77. if (!m_connectStatus)
  78. {
  79. return false;
  80. }
  81. if (sendPacket && m_SCFInstance)
  82. {
  83. SCF::IO oIO = m_SCFInstance->Lock(DIOSCTRLCPU_COM_TIMEOUT);
  84. return DoSendSync(oIO, sendPacket, recvPacket);
  85. }
  86. return false;
  87. }
  88. int DIOSBoardController::Receive(SCF::IO& oIO, char *pPacket, DWORD length, DWORD timeout)
  89. {
  90. if (!m_connectStatus)
  91. {
  92. return -1;
  93. }
  94. if (!m_SCFInstance)
  95. {
  96. return -2;
  97. }
  98. int nResLen = 0;
  99. oIO.ReceivePacket(pPacket, length, timeout, nResLen);
  100. if (nResLen > 0)
  101. {
  102. //if(gcommLog) gcommLog->Info("[Recv]->[%02d][%s]", nResLen, FormatPacketString(pPacket, length).c_str());
  103. { if (gcommLog) { gcommLog->Info("[Recv]->[{$}][{$}]", nResLen, FormatPacketString(pPacket, length).c_str()); } }
  104. }
  105. else
  106. {
  107. //if(gcommLog) gcommLog->Info("[Recv][Ivalid]->[%02d]", nResLen);
  108. { if (gcommLog) { gcommLog->Info("[Recv][Ivalid]->[{$:d02}]", nResLen); } }
  109. }
  110. return nResLen;
  111. }
  112. int DIOSBoardController::Receive(SCF::IO& oIO, SCFPacket *pPacket, DWORD timeout)
  113. {
  114. if (!m_connectStatus)
  115. {
  116. return -1;
  117. }
  118. if (!m_SCFInstance)
  119. {
  120. return -2;
  121. }
  122. int nResLen = 0;
  123. char rev[100];
  124. memset(rev, 0, 100);
  125. oIO.ReceivePacket(rev, pPacket->GetBuffLen(), timeout, nResLen);
  126. if (nResLen > 0)
  127. {
  128. pPacket->SetPacket(rev, nResLen);
  129. //if(gcommLog) gcommLog->Info("[Recv]->[%02d][%s]", nResLen, FormatPacketString(pPacket).c_str());
  130. { if (gcommLog) { gcommLog->Info("[Recv]->[{$:d02}][{$}]", nResLen, FormatPacketString(pPacket).c_str()); } }
  131. }
  132. else
  133. {
  134. if(gcommLog) gcommLog->Info("[Recv][Ivalid]->[{$:d02}]", nResLen);
  135. { if (gcommLog) { gcommLog->Info("[Recv][Ivalid]->[{$:d02}]", nResLen); } }
  136. }
  137. return nResLen;
  138. }
  139. void DIOSBoardController::QueNotifyPacket(SCFPacket *pPacket)
  140. {
  141. if (pPacket && m_SCFInstance)
  142. {
  143. m_SCFInstance->Queue.Enqueue((char*)(pPacket), pPacket->GetPacketLen());
  144. }
  145. }
  146. std::string GetTime()
  147. {
  148. SYSTEMTIME st;
  149. GetLocalTime(&st);
  150. char tmp[64] = { 0 };
  151. sprintf_s(tmp, "[%04d %02d %02d] [%02d:%02d:%02d.%3d]", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
  152. return std::string(tmp);
  153. }
  154. //Implement details
  155. bool DIOSBoardController::DoSendSync(SCF::IO& oIO, SCFPacket *sendPacket, SCFPacket *recvPacket, DWORD Timeout)
  156. {
  157. //SCF::IO oIO = m_SCFInstance->Lock(Timeout);
  158. int nResLen = 0;
  159. oIO.SendPacket((char*)(*sendPacket), sendPacket->GetPacketLen(), Timeout, nResLen);
  160. if(nResLen == sendPacket->GetPacketLen())
  161. {
  162. CTRLPACKETHEAD *pSendHead = (CTRLPACKETHEAD *)((char *)(*sendPacket));
  163. if (!pSendHead)
  164. {
  165. if(gdriverLog) gdriverLog->Error("SendPacket is NULL");
  166. }
  167. //if(gcommLog) gcommLog->Info("[Send]->[%s]", FormatPacketString(sendPacket).c_str());
  168. { if (gcommLog) { gcommLog->Info("[Send]->[{$}]", FormatPacketString(sendPacket).c_str()); } }
  169. ULONGLONG StartTick = GetTickCount64();
  170. DWORD TimePeriod = Timeout;
  171. while (TimePeriod > 0)
  172. {
  173. char rev[MAX_PATH];
  174. memset(rev, 0, MAX_PATH);
  175. oIO.ReceivePacket(rev, recvPacket->GetBuffLen(), TimePeriod, nResLen);
  176. if (nResLen > 0)
  177. {
  178. recvPacket->SetPacket(rev, nResLen);
  179. //if(gcommLog) gcommLog->Info("[Recv]->[%s]", FormatPacketString(recvPacket).c_str());
  180. { if (gcommLog) { gcommLog->Info("[Recv]->[{$}]", FormatPacketString(recvPacket).c_str()); } }
  181. CTRLPACKETHEAD *pReceiveHead = (CTRLPACKETHEAD *)((char *)(*recvPacket));
  182. if (
  183. (pReceiveHead->FrameCmd != pSendHead->FrameCmd) ||
  184. (pReceiveHead->FrameId != pSendHead->FrameId) ||
  185. (pReceiveHead->FuncId != pSendHead->FuncId) ||
  186. (pReceiveHead->FrameSize != 5)
  187. )
  188. {
  189. if(gdriverLog) gdriverLog->Warn("ReceivePacket: Got Other Packet");
  190. //m_SCFInstance->QueNotifyPacket(recvPacket);
  191. m_SCFInstance->Queue.Enqueue((char*)(*recvPacket), recvPacket->GetPacketLen());
  192. ULONGLONG CurTick = GetTickCount64();
  193. if (TimePeriod > CurTick - StartTick)
  194. {
  195. TimePeriod -= CurTick - StartTick;
  196. }
  197. else
  198. {
  199. TimePeriod = 0;
  200. }
  201. continue;
  202. }
  203. TimePeriod = 0;
  204. if(gdriverLog) gdriverLog->Info("DoSendSync SUCCEED");
  205. return true;
  206. }
  207. else
  208. {
  209. TimePeriod = 0;
  210. }
  211. }
  212. }
  213. return false;
  214. }
  215. PACKET_RET DIOSBoardController::EventCallback(const char * pRecData, DWORD nLength, DWORD & PacketLength)
  216. {
  217. DWORD i = 0;
  218. for (; i < nLength - 1; i++)
  219. {
  220. if ((pRecData[i] == (char)PACKET_HEAD1) && (pRecData[i + 1] == (char)PACKET_HEAD2))
  221. {
  222. break;
  223. }
  224. }
  225. if (i > 0)
  226. {
  227. PacketLength = i;
  228. if(gdriverLog) gdriverLog->Warn("EventCallback: PACKET_USELESS i>0");
  229. return PACKET_USELESS;
  230. }
  231. //最小9字节长
  232. if (nLength < 9)
  233. {
  234. if(gdriverLog) gdriverLog->Warn("EventCallback: PACKET_NOPACKET");
  235. return PACKET_NOPACKET;
  236. }
  237. //got right title
  238. unsigned char NumLen = (unsigned char)pRecData[2];
  239. unsigned char TotalLen = NumLen + 4;
  240. if (nLength < TotalLen)
  241. {
  242. //not enough
  243. if(gdriverLog) gdriverLog->Warn("EventCallback: PACKET_NOPACKET");
  244. return PACKET_NOPACKET;
  245. }
  246. char chksum, chsend, chend;
  247. chksum = (char)0xFF;
  248. chsend = (0x0d);
  249. chend = (0x0a);
  250. //check tail
  251. if ((pRecData[TotalLen - 3] == chksum) && (pRecData[TotalLen - 2] == chsend) && (pRecData[TotalLen - 1] == chend))
  252. {
  253. PacketLength = TotalLen;
  254. if(gdriverLog) gdriverLog->Warn("EventCallback: PACKET_ISPACKET");
  255. return PACKET_ISPACKET;
  256. }
  257. //packet corrupted
  258. PacketLength = 2;
  259. if(gdriverLog) gdriverLog->Warn("EventCallback: PACKET_USELESS PacketLength=2");
  260. return PACKET_USELESS;
  261. }
  262. std::string DIOSBoardController::FormatPacketString(SCFPacket *packet)
  263. {
  264. std::string formated = "";
  265. int nlen = packet->GetPacketLen();
  266. if (packet == nullptr || packet->GetPacketLen() <= 0)
  267. {
  268. return formated;
  269. }
  270. auto packetLength = packet->GetPacketLen();
  271. char *chpacket = (char *)(*packet);
  272. char tmp[16] = { 0 };
  273. for (DWORD i = 0; i < packetLength; ++i)
  274. {
  275. if ((i >= 2 && i <= 6) || (i == packetLength - 3))
  276. {
  277. formated = formated + "#";
  278. }
  279. memset(tmp, 0, sizeof(tmp));
  280. sprintf_s(tmp, "%02X", (unsigned char)chpacket[i]);
  281. formated = formated + std::string(tmp);
  282. }
  283. return formated;
  284. }
  285. std::string DIOSBoardController::FormatPacketString(const char *packet, int len)
  286. {
  287. std::string formated = "";
  288. if (!packet || len <= 0)
  289. {
  290. return formated;
  291. }
  292. char tmp[16] = { 0 };
  293. for (int i = 0; i < len; ++i)
  294. {
  295. if ((i >= 2 && i <= 6) || (i == len - 3))
  296. {
  297. formated = formated + "#";
  298. }
  299. memset(tmp, 0, sizeof(tmp));
  300. sprintf_s(tmp, "%02X", (unsigned char)packet[i]);
  301. formated = formated + std::string(tmp);
  302. }
  303. return formated;
  304. }
  305. bool DIOSBoardController::ReceiveACK(SCFPacket* sendPacket, SCFPacket* recvPacket, char* pszContext, unsigned int &PacketLen)
  306. {
  307. if (!m_connectStatus)
  308. {
  309. return false;
  310. }
  311. if (sendPacket && m_SCFInstance)
  312. {
  313. SCF::IO oIO = m_SCFInstance->Lock(DIOSCTRLCPU_COM_TIMEOUT);
  314. DoSendSync(oIO, sendPacket, recvPacket);
  315. CTRLPACKETHEAD* pSendHead = (CTRLPACKETHEAD*)((char*)(*sendPacket));
  316. ULONGLONG StartTick = GetTickCount64();
  317. DWORD timeout = DIOSCTRLCPU_COM_TIMEOUT;
  318. DWORD TimePeriod = DIOSCTRLCPU_COM_TIMEOUT / 10;
  319. while ((GetTickCount64() - StartTick) < timeout)
  320. {
  321. if (Receive(oIO, recvPacket, TimePeriod) > 0)
  322. {
  323. CTRLPACKETHEAD* pReceiveHead = (CTRLPACKETHEAD*)((char*)(*recvPacket));
  324. if (
  325. (pReceiveHead->FrameCmd != pSendHead->FrameCmd) ||
  326. (pReceiveHead->FrameId != pSendHead->FrameId) ||
  327. (pReceiveHead->FuncId != pSendHead->FuncId)
  328. )
  329. {
  330. QueNotifyPacket(recvPacket);
  331. continue;
  332. }
  333. int dataLen = pReceiveHead->FrameSize - 5;
  334. if (dataLen > 0)
  335. {
  336. dataLen = min((int)PacketLen, dataLen);
  337. unsigned char* pData = &(pReceiveHead->Data1);
  338. memcpy(pszContext, pData, dataLen);
  339. }
  340. PacketLen = dataLen;
  341. break;
  342. }
  343. else
  344. {
  345. TPRINTA_DEBUG("ReceiveAck Failed");
  346. }
  347. }
  348. }
  349. return true;
  350. }
  351. bool DIOSBoardController::ReceiveFrame(SCFPacket* sendPacket, SCFPacket* recvPacket, FUNCTIONID Id, unsigned char FrameCmd, char* pszContext, unsigned int PacketLen, unsigned int& nDataLen)
  352. {
  353. if (!m_connectStatus)
  354. {
  355. return false;
  356. }
  357. if (sendPacket && m_SCFInstance)
  358. {
  359. SCF::IO oIO = m_SCFInstance->Lock(DIOSCTRLCPU_COM_TIMEOUT);
  360. DoSendSync(oIO, sendPacket, recvPacket);
  361. DWORD StartTick = GetTickCount();
  362. DWORD Timeout = DIOSCTRLCPU_COM_TIMEOUT;
  363. DWORD TimePeriod = DIOSCTRLCPU_COM_TIMEOUT / 10;
  364. int nPacketLen = 0;
  365. char pPacket[MAX_PATH] = { 0 };
  366. while ((GetTickCount() - StartTick) < Timeout)
  367. {
  368. memset(pPacket, 0, MAX_PATH);
  369. if ((nPacketLen = Receive(oIO, pPacket, MAX_PATH, TimePeriod)) > 0)
  370. {
  371. CTRLPACKETHEAD *pReceiveHead = (CTRLPACKETHEAD *)((char *)(pPacket));
  372. if (pReceiveHead->FrameCmd == FrameCmd && pReceiveHead->FuncId == Id.CharPart)
  373. {
  374. nDataLen = pReceiveHead->FrameSize - 5;
  375. if (nDataLen <= PacketLen)
  376. {
  377. unsigned char *pData = &(pReceiveHead->Data1);
  378. memcpy(pszContext, pData, nDataLen);
  379. }
  380. TPRINTA_DEBUG("Leave ReceiveResult, WaitIO NOTIFY:SUCCEED");
  381. return true;
  382. }
  383. else
  384. {
  385. TPRINTA_DEBUG("Got Other Packet");
  386. recvPacket->SetPacket(pPacket, nPacketLen);
  387. //NotifyPacket notifyPacket(recvPacket);
  388. //Notify(notifyPacket);
  389. QueNotifyPacket(recvPacket);
  390. }
  391. }
  392. else
  393. {
  394. TPRINTA_DEBUG("WaitIO NOTIFY:FAILED");
  395. }
  396. }
  397. }
  398. return true;
  399. }
  400. //bool DIOSBoardController::ReceiveCANFrame(SCFPacket* sendPacket, SCFPacket* recvPacket, CAN_ID Id, unsigned short stdid, CAN_PARAM& params)
  401. //{
  402. // return true;
  403. //}