DIOSBoardCommunicateEntity.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. #include "stdafx.h"
  2. #include "DIOSBoardCommunicateEntity.h"
  3. #include "DIOSBoardProtocolHelper.h"
  4. #include "IDIOSBoardController.h"
  5. #include "DIOSBoardFactory.h"
  6. #include "IDIOSBoardPacketRecevier.h"
  7. #include "IOInterfaceMapper.h"
  8. #include "NotifyPacket.h"
  9. using namespace DIOS::Dev::Communication::Detail;
  10. using namespace DIOS::Dev::Detail::MachineryECOM;
  11. DIOSBoardCommunicateEntity::DIOSBoardCommunicateEntity()
  12. :m_DiosBoard(nullptr),
  13. m_SendPacket(nullptr),
  14. m_ReceivePacket(nullptr)
  15. {
  16. }
  17. DIOSBoardCommunicateEntity::~DIOSBoardCommunicateEntity()
  18. {
  19. if (m_SendPacket)
  20. {
  21. ReleaseSCFPacket(m_SendPacket);
  22. }
  23. if (m_ReceivePacket)
  24. {
  25. ReleaseSCFPacket(m_ReceivePacket);
  26. }
  27. }
  28. bool DIOSBoardCommunicateEntity::Initialize(IDIOSBoardPacketRecevier *packetReceiver)
  29. {
  30. if (packetReceiver)
  31. {
  32. AddReceiver(packetReceiver);
  33. }
  34. m_SendPacket = (SCFPacket *)MallocSCFPacket();
  35. m_ReceivePacket = (SCFPacket *)MallocSCFPacket();
  36. return true;
  37. }
  38. bool DIOSBoardCommunicateEntity::Connect(SCF* pSCF, ResDataObject& Connection,HANDLE disconnectListenerhandle, const std::string &ioboardName)
  39. {
  40. bool connected = false;
  41. if (!m_DiosBoard)
  42. {
  43. auto boardname = ioboardName;
  44. if (boardname == "")
  45. {
  46. boardname = ECOM_DIOSBOARD;
  47. }
  48. //if(gcommLog) gcommLog->Info("[DIOSBoardCommunicateEntity][Connect]->[Create Diosboard controller %s]", boardname.c_str());
  49. { if (gcommLog) { gcommLog->Info("[DIOSBoardCommunicateEntity][Connect]->[Create Diosboard controller {$}]", boardname.c_str()); } }
  50. m_DiosBoard = DIOSBoardFactory::Instance()->CreateSingleton(boardname/*ECOM_DIOSBOARD*/);
  51. if (m_DiosBoard)
  52. {
  53. m_DiosBoard->Initialize(pSCF);
  54. m_DiosBoard->SetPassiveDisconnectEventHandle(disconnectListenerhandle);
  55. }
  56. }
  57. if (m_DiosBoard)
  58. {
  59. if(gcommLog) gcommLog->Info("[DIOSBoardCommunicateEntity][Connect]->[Start to connect diosboard]");
  60. connected = m_DiosBoard->Connect(Connection);
  61. if (connected)
  62. {
  63. connected = SendInitDiosBoardCommands();
  64. if(gcommLog) gcommLog->Info("[DIOSBoardCommunicateEntity][Connect]->[Connected]");
  65. }
  66. }
  67. return connected;
  68. }
  69. bool DIOSBoardCommunicateEntity::Disonnect()
  70. {
  71. if (m_DiosBoard)
  72. {
  73. return m_DiosBoard->Disonnect();
  74. }
  75. return m_DiosBoard != nullptr;
  76. }
  77. int DIOSBoardCommunicateEntity::GPIO_DO_Ctrl(DIOSBOARD_OP op, GPIO_DO_ID id, GPIO_DO_ATTRIBUTE attr, GPIO_DO_PARAM &params)
  78. {
  79. m_DiosBoard->Lock();
  80. if (op == OP_SET)
  81. {
  82. if (DIOSBoardProtocolHelper::Instance()->MakeGpioDOSetPacket(id, attr, params, m_SendPacket))
  83. {
  84. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  85. }
  86. }
  87. else if (op == OP_WRITE)
  88. {
  89. if (DIOSBoardProtocolHelper::Instance()->MakeGpioDOWritePacket(id, attr, params, m_SendPacket))
  90. {
  91. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  92. }
  93. }
  94. m_DiosBoard->UnLock();
  95. return 0;
  96. }
  97. int DIOSBoardCommunicateEntity::GPIO_DI_Ctrl(DIOSBOARD_OP op, GPIO_DI_ID id, GPIO_DI_ATTRIBUTE attr, GPIO_DI_PARAM &params)
  98. {
  99. if (op == OP_SET)
  100. {
  101. m_DiosBoard->Lock();
  102. if (DIOSBoardProtocolHelper::Instance()->MakeGpioDISetPacket(id, attr, params, m_SendPacket))
  103. {
  104. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  105. }
  106. m_DiosBoard->UnLock();
  107. }
  108. else if (op == OP_READ)
  109. {
  110. FUNCTIONID functionid;
  111. functionid.CharPart = id;
  112. char context[4] = { 0 };
  113. int readLen = Read(functionid, context, 4);
  114. if (readLen > 0)
  115. {
  116. if (params.input_mode == GIM_DIGITAL)
  117. {
  118. params.active_level = context[0];
  119. }
  120. else if (params.input_mode == GIM_PULSE_COUNT && readLen >= 2)
  121. {
  122. params.pulse_count.pulse_count_byte.pulse_count_lowbyte = context[0];
  123. params.pulse_count.pulse_count_byte.pulse_count_highbyte = context[1];
  124. }
  125. }
  126. }
  127. return 0;
  128. }
  129. int DIOSBoardCommunicateEntity::AD_Ctrl(DIOSBOARD_OP op, AD_ID id, AD_ATTRIBUTE attr, AD_PARAM &params)
  130. {
  131. m_DiosBoard->Lock();
  132. if (op == OP_SET)
  133. {
  134. if (DIOSBoardProtocolHelper::Instance()->MakeADSetPacket(id, attr, params, m_SendPacket))
  135. {
  136. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  137. }
  138. }
  139. else if (op == OP_READ)
  140. {
  141. FUNCTIONID functionid;
  142. functionid.CharPart = id;
  143. char context[4] = { 0 };
  144. int readLen = Read(functionid, context, 4);
  145. if (readLen > 0)
  146. {
  147. params.ad_value.ad_value_btye.ad_lowbyte = context[0];
  148. params.ad_value.ad_value_btye.ad_highbyte = context[1];
  149. }
  150. }
  151. m_DiosBoard->UnLock();
  152. return 0;
  153. }
  154. int DIOSBoardCommunicateEntity::RS232_Ctrl(DIOSBOARD_OP op, RS232_ID id, RS232_ATTRIBUTE attr, RS232_PARAM &params)
  155. {
  156. m_DiosBoard->Lock();
  157. if (op == OP_SET)
  158. {
  159. if (DIOSBoardProtocolHelper::Instance()->MakeRS232SetPacket(id, attr, params, m_SendPacket))
  160. {
  161. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  162. }
  163. }
  164. else if (op == OP_WRITE)
  165. {
  166. if (DIOSBoardProtocolHelper::Instance()->MakeData485WritePacket(
  167. (const char *)params.rs485.data(), (unsigned int)params.rs485.length(), m_SendPacket))
  168. {
  169. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  170. }
  171. }
  172. m_DiosBoard->UnLock();
  173. return 0;
  174. }
  175. int DIOSBoardCommunicateEntity::CAN_Ctrl(DIOSBOARD_OP op, CAN_ID id, CAN_ATTRIBUTE attr, CAN_PARAM &params)
  176. {
  177. m_DiosBoard->Lock();
  178. if (op == OP_SET)
  179. {
  180. if (DIOSBoardProtocolHelper::Instance()->MakeCanSetPacket(id, attr, params, m_SendPacket))
  181. {
  182. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  183. }
  184. }
  185. else if (op == OP_READ)
  186. {
  187. ReadCanData(id, params.can_stdid, m_SendPacket, m_ReceivePacket, params);
  188. }
  189. else if (op == OP_WRITE)
  190. {
  191. if (DIOSBoardProtocolHelper::Instance()->MakeCanWritePacket(id,params, m_SendPacket))
  192. {
  193. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  194. }
  195. }
  196. m_DiosBoard->UnLock();
  197. return 0;
  198. }
  199. int DIOSBoardCommunicateEntity::SEC_Ctrl(DIOSBOARD_OP op, SEC_ID id, SEC_ATTRIBUTE attr, SEC_PARAM &params)
  200. {
  201. m_DiosBoard->Lock();
  202. if (op == OP_SET)
  203. {
  204. if (DIOSBoardProtocolHelper::Instance()->MakeSECSetPacket(id, attr, params, m_SendPacket))
  205. {
  206. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  207. }
  208. }
  209. else if (op == OP_READ)
  210. {
  211. FUNCTIONID functionid;
  212. functionid.CharPart = id;
  213. char context[8] = { 0 };
  214. int readLen = Read(functionid, context, 8);
  215. if (readLen > 0)
  216. {
  217. params.encoder_value.encoder_value_byte.encoder_lowbyte_0 = context[0];
  218. params.encoder_value.encoder_value_byte.encoder_lowbyte_1 = context[1];
  219. params.encoder_value.encoder_value_byte.encoder_highbyte_0 = context[2];
  220. params.encoder_value.encoder_value_byte.encoder_highbyte_1 = context[3];
  221. }
  222. }
  223. m_DiosBoard->UnLock();
  224. return 0;
  225. }
  226. int DIOSBoardCommunicateEntity::SCL_Ctrl(DIOSBOARD_OP op, SCL_ID id, SCL_ATTRIBUTE attr, SCL_PARAM &params)
  227. {
  228. m_DiosBoard->Lock();
  229. if (op == OP_SET)
  230. {
  231. if (DIOSBoardProtocolHelper::Instance()->MakeSCLSetPacket(id, attr, params, m_SendPacket))
  232. {
  233. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  234. }
  235. }
  236. m_DiosBoard->UnLock();
  237. return 0;
  238. }
  239. int DIOSBoardCommunicateEntity::ExposureCtrl(DIOSBOARD_OP op, EXPOSURE_ID id, EXPOSURE_PARAM &params)
  240. {
  241. m_DiosBoard->Lock();
  242. if (op == OP_WRITE)
  243. {
  244. if (DIOSBoardProtocolHelper::Instance()->MakeExposureWritePacket(id, params.active_level, m_SendPacket))
  245. {
  246. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  247. }
  248. }
  249. m_DiosBoard->UnLock();
  250. return 0;
  251. }
  252. int DIOSBoardCommunicateEntity::MCU_Ctrl(DIOSBOARD_OP op, MCU_ID id, MCU_ATTRIBUTE attr, MCU_PARAM &params)
  253. {
  254. if (op == OP_READ)
  255. {
  256. if (attr == MCU_ATTR_VERSION)
  257. {
  258. FUNCTIONID functionid;
  259. functionid.CharPart = (unsigned char)id;
  260. char context[1] = { (char)attr };
  261. char rescontext[20] = {0};
  262. if (ReadEx(functionid, context, 1, rescontext, 20) > 0)
  263. {
  264. params.mcu_version.version_byte.version_lowbyte = rescontext[0];
  265. params.mcu_version.version_byte.version_highbyte = rescontext[1];
  266. }
  267. }
  268. }
  269. return 0;
  270. }
  271. bool DIOSBoardCommunicateEntity::SendInitDiosBoardCommands()
  272. {
  273. bool bRes = true;
  274. if (!m_DiosBoard)
  275. {
  276. return false;
  277. }
  278. return bRes;
  279. }
  280. int DIOSBoardCommunicateEntity::Read(FUNCTIONID Id, char *pszContext, unsigned int PacketLen)
  281. {
  282. if (!m_DiosBoard)
  283. {
  284. return -1;
  285. }
  286. m_DiosBoard->Lock();
  287. DIOSBoardProtocolHelper::Instance()->MakeReadDataPacket(Id, m_SendPacket);
  288. m_DiosBoard->ReceiveACK(m_SendPacket, m_ReceivePacket, pszContext, PacketLen);
  289. m_DiosBoard->UnLock();
  290. return PacketLen;
  291. }
  292. int DIOSBoardCommunicateEntity::ReadEx(FUNCTIONID Id, char *pszRes, unsigned int ResLen, char *pszContext, unsigned int PacketLen)
  293. {
  294. if (!m_DiosBoard)
  295. {
  296. return -1;
  297. }
  298. m_DiosBoard->Lock();
  299. DIOSBoardProtocolHelper::Instance()->MakeReadDataExPacket(Id, pszRes, ResLen, m_SendPacket);
  300. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  301. int retLen = -1;
  302. if (ReceiveACK(m_SendPacket, m_ReceivePacket, DIOSCTRLCPU_COM_TIMEOUT))
  303. {
  304. CTRLPACKETHEAD *pReceiveHead = (CTRLPACKETHEAD *)((char *)(*m_ReceivePacket));
  305. int dataLen = pReceiveHead->FrameSize - 5;
  306. dataLen = min((int)PacketLen, dataLen);
  307. if (dataLen > 0)
  308. {
  309. unsigned char *pData = &(pReceiveHead->Data1);
  310. memcpy(pszContext, pData, dataLen);
  311. }
  312. retLen = dataLen;
  313. }
  314. m_DiosBoard->UnLock();
  315. return retLen;
  316. }
  317. int DIOSBoardCommunicateEntity::ReadFrame(FUNCTIONID Id, char *pszContext, unsigned int PacketLen, unsigned char FrameCmd)
  318. {
  319. unsigned int readLen = 0;
  320. if (!m_DiosBoard)
  321. {
  322. return readLen;
  323. }
  324. m_DiosBoard->Lock();
  325. DIOSBoardProtocolHelper::Instance()->MakeReadDataPacket(Id, m_SendPacket);
  326. m_DiosBoard->ReceiveFrame(m_SendPacket, m_ReceivePacket, Id, FrameCmd, pszContext, PacketLen, readLen);
  327. m_DiosBoard->UnLock();
  328. return readLen;
  329. }
  330. int DIOSBoardCommunicateEntity::ReadCanData(CAN_ID Id, unsigned short stdid, SCFPacket *sendPacket, SCFPacket *RecvPacket, CAN_PARAM &params)
  331. {
  332. if (!m_DiosBoard)
  333. {
  334. return -1;
  335. }
  336. if (!DIOSBoardProtocolHelper::Instance()->MakeCanWritePacket(Id, params, m_SendPacket))
  337. {
  338. return -1;
  339. }
  340. m_DiosBoard->Lock();
  341. m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
  342. auto ret = ReceiveCanFream(Id,stdid,params);
  343. m_DiosBoard->UnLock();
  344. return ret?0:-1;
  345. }
  346. void DIOSBoardCommunicateEntity::OnReceivedPacketNotMatched(SCFPacket *RecvPacket)
  347. {
  348. if (m_DiosBoard)
  349. {
  350. m_DiosBoard->QueNotifyPacket(RecvPacket);
  351. }
  352. }
  353. void DIOSBoardCommunicateEntity::OnReceiveFrameNotMatched(char *packet, int length)
  354. {
  355. m_ReceivePacket->SetPacket(packet, length);
  356. NotifyPacket notifyPacket(m_ReceivePacket);
  357. Notify(notifyPacket);
  358. }
  359. bool DIOSBoardCommunicateEntity::ReceiveACK(SCFPacket *sendPacket, SCFPacket *RecvPacket,DWORD timeout)
  360. {
  361. return false;
  362. }
  363. bool DIOSBoardCommunicateEntity::ReceiveFrame(FUNCTIONID Id, unsigned char FrameCmd, char *pszContext,unsigned int PacketLen, unsigned int& nDataLen, DWORD Timeout)
  364. {
  365. return false;
  366. }
  367. union _canStdid
  368. {
  369. unsigned short stdid_short;
  370. struct _ststdid
  371. {
  372. unsigned char low_byte;
  373. unsigned char high_byte;
  374. } stdid_byte;
  375. };
  376. bool DIOSBoardCommunicateEntity::ReceiveCanFream(CAN_ID Id, unsigned short stdid, CAN_PARAM &params, DWORD Timeout)
  377. {
  378. //TPRINTA_DEBUG("Enter ReceiveCanFream");
  379. //DWORD StartTick = GetTickCount();
  380. //DWORD TimePeriod = Timeout;
  381. //int nPacketLen = 0;
  382. //char pPacket[MAX_PATH] = { 0 };
  383. //while ((GetTickCount() - StartTick) < Timeout)
  384. //{
  385. // memset(pPacket, 0, MAX_PATH);
  386. // if ((nPacketLen = m_DiosBoard->Receive(pPacket, MAX_PATH, 500)) > 0)
  387. // {
  388. // CTRLPACKETHEAD *pReceiveHead = (CTRLPACKETHEAD *)((char *)(pPacket));
  389. // if (pReceiveHead->FrameCmd == 0xFE
  390. // && pReceiveHead->FuncId == (unsigned char)Id
  391. // )
  392. // {
  393. // _canStdid canstdid;
  394. // canstdid.stdid_byte.low_byte = pReceiveHead->Data2;
  395. // canstdid.stdid_byte.high_byte = pReceiveHead->Data3;
  396. // if (canstdid.stdid_short == params.can_stdid)
  397. // {
  398. // int canDataLen = pReceiveHead->Data4;
  399. // if (canDataLen > 8 || canDataLen < 0)
  400. // {
  401. // canDataLen = 8;
  402. // }
  403. // params.candata.clear();
  404. // for (int i = 0; i < canDataLen;++i)
  405. // {
  406. // params.candata.push_back(((unsigned char*)&pReceiveHead->Data5)[i]);
  407. // }
  408. // }
  409. // TPRINTA_DEBUG("Leave ReceiveResult, WaitIO NOTIFY:SUCCEED");
  410. // return true;
  411. // }
  412. // else
  413. // {
  414. // TPRINTA_DEBUG("Got Other Packet");
  415. // OnReceiveFrameNotMatched(pPacket, nPacketLen);
  416. // }
  417. // }
  418. // else
  419. // {
  420. // TPRINTA_DEBUG("WaitIO NOTIFY:FAILED");
  421. // }
  422. //}
  423. //TPRINTA_DEBUG("Leave ReceiveResult, WaitIO NOTIFY:FAILED");
  424. //TPRINTA_ERROR("Leave ReceiveResult, WaitIO NOTIFY:FAILED");
  425. return false;
  426. }