PacketDispatcher.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. #include "stdafx.h"
  2. #include "PacketDispatcher.h"
  3. #include "IExamHandler.h"
  4. #include "DIOSBoardProtocolParser.h"
  5. #include "PacketDefine.h"
  6. #include "IWorkFlowManager.h"
  7. #include "CanDeviceMessageCenter.h"
  8. #include "DeviceDataDef.h"
  9. using namespace DIOS::Dev::Detail::MachineryECOM;
  10. PacketDispatcher::PacketDispatcher() :m_workflowManager(nullptr)
  11. {
  12. }
  13. PacketDispatcher::~PacketDispatcher()
  14. {
  15. }
  16. void PacketDispatcher::Initialize(IWorkflowManager *workflowmanager)
  17. {
  18. m_workflowManager = workflowmanager;
  19. }
  20. void PacketDispatcher::DispatchPacket(SCFPacket *packet)
  21. {
  22. //if(gcommLog) gcommLog->Info("[PacketDispatcher][DispatchPacket]->[%s]", FormatPacketString(packet).c_str());
  23. { if (gcommLog) { gcommLog->Info("[PacketDispatcher][DispatchPacket]->[{$}]", FormatPacketString(packet).c_str()); } }
  24. PacketNotifyType pnt = PNT_NAN;
  25. PacketClass pc = DIOSBoardProtocolParser::IdentifyPacketClass(packet);
  26. if (pc == PC_NOTIFY)
  27. {
  28. pnt = DIOSBoardProtocolParser::IdentifyPacketNotifyType(packet);
  29. }
  30. if (m_workflowManager == nullptr)
  31. {
  32. return;
  33. }
  34. if (pnt == PNT_SYSTEM_RESET_START || pnt == PNT_SYSTEM_RESET_SWING_START || pnt == PNT_SYSTEM_RESET_CIRCULAR_START)
  35. {
  36. m_workflowManager->ChangeToResetMode();
  37. }
  38. IExamHandler *handler = m_workflowManager->GetCurrentWorkFlowHandler();
  39. if (handler != nullptr)
  40. {
  41. if(gbusinessLog) gbusinessLog->Info("[DispatchPacket]->[Dispatch Packet To {$}]", handler->Name().c_str());
  42. switch (pnt)
  43. {
  44. case PNT_SYSTEM_RESET_START:
  45. {
  46. m_workflowManager->EnterSystemReset();
  47. }
  48. break;
  49. case PNT_SYSTEM_RESET_STOP:
  50. {
  51. m_workflowManager->ExitSystemReset();
  52. break;
  53. }
  54. case PNT_SYSTEM_RESET_SWING_START:
  55. m_workflowManager->EnterSystemResetSwing();
  56. break;
  57. case PNT_SYSTEM_RESET_SWING_STOP:
  58. m_workflowManager->ExitSystemResetSwing();
  59. break;
  60. case PNT_SYSTEM_RESET_CIRCULAR_START:
  61. m_workflowManager->EnterSystemResetCircular();
  62. break;
  63. case PNT_SYSTEM_RESET_CIRCULAR_STOP:
  64. m_workflowManager->ExitSystemResetCircular();
  65. break;
  66. case PNT_HANDSWITCH_FIRST_PRESSED:
  67. handler->OnHandSwitchGearFirstPressed();
  68. break;
  69. case PNT_HANDSWITCH_FIRST_RELEASE:
  70. handler->OnHandSwitchGearFirstReleased();
  71. break;
  72. case PNT_HANDSWITCH_SECOND_PRESSED:
  73. handler->OnHandSwitchGearSecondPressed();
  74. break;
  75. case PNT_HANDSWITCH_SECOND_RELEASE:
  76. handler->OnHandSwitchGearSecondReleased();
  77. break;
  78. case PNT_PWM_OFFSET:
  79. {
  80. PWMOffsetPacket opacket;
  81. if (DIOSBoardProtocolParser::ParsePWMOffsetPacket(packet, &opacket))
  82. {
  83. handler->OnPWMOffset(&opacket);
  84. }
  85. }
  86. break;
  87. case PNT_CAN:
  88. {
  89. CanDeviceData data;
  90. if (DIOSBoardProtocolParser::ParseCanPacket(packet, &data))
  91. {
  92. CanDeviceMessageCenter::Instance()->OnMessageArrived(m_workflowManager, &data);
  93. }
  94. }
  95. break;
  96. case PNT_XRAY_ON:
  97. handler->OnXrayOn();
  98. break;
  99. case PNT_XRAY_OFF:
  100. handler->OnXrayOff();
  101. break;
  102. case PNT_TUBE_HEIGHT_AD:
  103. {
  104. TubeLineADPacket opacket;
  105. if (DIOSBoardProtocolParser::ParseTubeHeightADPacket(packet, &opacket))
  106. {
  107. handler->OnTubeHeightAD(&opacket);
  108. }
  109. }
  110. break;
  111. case PNT_TUBE_ANGLE_LOW_LIMIT:
  112. handler->OnTubeAngleLowLimitPos();
  113. break;
  114. case PNT_TUBE_ANGLE_HIGH_LIMIT:
  115. handler->OnTubeAngleHighLimitPos();
  116. break;
  117. case PNT_TUBE_ANGLE_LEAVE_LOW_LIMIT:
  118. handler->OnTubeAngleLeaveLowLimitPos();
  119. break;
  120. case PNT_TUBE_ANGLE_LEAVE_HIGH_LIMIT:
  121. handler->OnTubeAngleLeaveHighLimitPos();
  122. break;
  123. case PNT_TUBE_ANGLE_ENCODER:
  124. {
  125. EncoderPacket opacket;
  126. if (DIOSBoardProtocolParser::ParseEncoderPacket(packet, &opacket))
  127. {
  128. handler->OnTubeAngleEncoder(&opacket);
  129. }
  130. }
  131. break;
  132. case PNT_TUBE_HEIGHT_ENCODER:
  133. {
  134. EncoderPacket opacket;
  135. if (DIOSBoardProtocolParser::ParseEncoderPacket(packet, &opacket))
  136. {
  137. handler->OnTubeHeightEncoder(&opacket);
  138. }
  139. }
  140. break;
  141. case PNT_TUBE_ANGLE_ENCODER_Z_CLEAR:
  142. handler->OnTubeAngleEncoderZPos();
  143. break;
  144. case PNT_TUBE_HEIGHT_HIGH_LIMIT:
  145. {
  146. handler->OnTubeHeightHighLimitPos();
  147. }
  148. break;
  149. case PNT_TUBE_HEIGHT_LEAVE_HIGH_LIMIT:
  150. {
  151. handler->OnTubeHeightLeaveHighLimitPos();
  152. }
  153. break;
  154. case PNT_TUBE_HEIGHT_LOW_LIMIT:
  155. {
  156. handler->OnTubeHeightLowLimitPos();
  157. }
  158. break;
  159. case PNT_TUBE_HEIGHT_LEAVE_LOW_LIMIT:
  160. {
  161. handler->OnTubeHeightLeaveLowLimitPos();
  162. }
  163. break;
  164. case PNT_TUBE_HEIGHT_ENCODER_Z_CLEAR:
  165. handler->OnTubeHeightEncoderZPos();
  166. break;
  167. case PNT_TUBE_HEIGHT_CONTROLLER_DIRECTION_1_START:
  168. handler->OnStartMove(TOMO_TUBE_HEIGHT, 0);
  169. break;
  170. case PNT_TUBE_HEIGHT_CONTROLLER_DIRECTION_1_STOP:
  171. handler->OnStopMove(TOMO_TUBE_HEIGHT);
  172. break;
  173. case PNT_TUBE_HEIGHT_CONTROLLER_DIRECTION_2_START:
  174. handler->OnStartMove(TOMO_TUBE_HEIGHT, 1);
  175. break;
  176. case PNT_TUBE_HEIGHT_CONTROLLER_DIRECTION_2_STOP:
  177. handler->OnStopMove(TOMO_TUBE_HEIGHT);
  178. break;
  179. case PNT_TUBE_ANGLE_CONTROLLER_DIRECTION_1_START:
  180. handler->OnStartMove(TOMO_TUBE_ANGLE, 0);
  181. break;
  182. case PNT_TUBE_ANGLE_CONTROLLER_DIRECTION_1_STOP:
  183. handler->OnStopMove(TOMO_TUBE_ANGLE);
  184. break;
  185. case PNT_TUBE_ANGLE_CONTROLLER_DIRECTION_2_START:
  186. handler->OnStartMove(TOMO_TUBE_ANGLE, 1);
  187. break;
  188. case PNT_TUBE_ANGLE_CONTROLLER_DIRECTION_2_STOP:
  189. handler->OnStopMove(TOMO_TUBE_ANGLE);
  190. break;
  191. case PNT_CARM_SCANNING_SWITCH_SWING:
  192. m_workflowManager->SwitchScanning(TOMO_TUBE_ANGLE);
  193. break;
  194. case PNT_CARM_SCANNING_SWITCH_CIRCULAR:
  195. m_workflowManager->SwitchScanning(TOMO_TUBE_HEIGHT);
  196. break;
  197. case PNT_TUBE_HORIZONTAL_CONTROLLER_DIRECTION_1_START:
  198. handler->OnStartMove(TOMO_TUBE_HORIZONTAL, 0);
  199. break;
  200. case PNT_TUBE_HORIZONTAL_CONTROLLER_DIRECTION_1_STOP:
  201. handler->OnStopMove(TOMO_TUBE_HORIZONTAL);
  202. break;
  203. case PNT_TUBE_HORIZONTAL_CONTROLLER_DIRECTION_2_START:
  204. handler->OnStartMove(TOMO_TUBE_HORIZONTAL, 1);
  205. break;
  206. case PNT_TUBE_HORIZONTAL_CONTROLLER_DIRECTION_2_STOP:
  207. handler->OnStopMove(TOMO_TUBE_HORIZONTAL);
  208. break;
  209. case PNT_TUBE_HORIZONTAL_ENCODER_Z_CLEAR:
  210. handler->OnTubeHorizontalEncoderZPos();
  211. break;
  212. case PNT_TUBE_HORIZONTAL_LEFT_LIMIT:
  213. handler->OnTubeHorizontalLeftLimitPos();
  214. break;
  215. case PNT_TUBE_HORIZONTAL_LEAVE_LEFT_LIMIT:
  216. handler->OnTubeHorizontalLeaveLeftLimitPos();
  217. break;
  218. case PNT_TUBE_HORIZONTAL_RIGHT_LIMIT:
  219. handler->OnTubeHorizontalRightLimitPos();
  220. break;
  221. case PNT_TUBE_HORIZONTAL_LEAVE_RIGHT_LIMIT:
  222. handler->OnTubeHorizontalLeaveRightLimitPos();
  223. break;
  224. default:
  225. break;
  226. }
  227. }
  228. }
  229. std::string PacketDispatcher::FormatPacketString(SCFPacket *packet)
  230. {
  231. std::string formated = "";
  232. if (!packet || packet->GetPacketLen() <= 0)
  233. {
  234. return formated;
  235. }
  236. auto packetLength = packet->GetPacketLen();
  237. char *chpacket = (char *)(*packet);
  238. char tmp[16] = { 0 };
  239. for (DWORD i = 0; i < packetLength; ++i)
  240. {
  241. if ((i >= 2 && i <= 6) || (i == packetLength - 3))
  242. {
  243. formated = formated + "#";
  244. }
  245. memset(tmp, 0, sizeof(tmp));
  246. sprintf_s(tmp, "%02X", (unsigned char)chpacket[i]);
  247. formated = formated + std::string(tmp);
  248. }
  249. return formated;
  250. }