123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- #include "stdafx.h"
- #include "PacketDispatcher.h"
- #include "IExamHandler.h"
- #include "DIOSBoardProtocolParser.h"
- #include "PacketDefine.h"
- #include "IWorkFlowManager.h"
- #include "CanDeviceMessageCenter.h"
- #include "DeviceDataDef.h"
- using namespace DIOS::Dev::Detail::MachineryECOM;
- PacketDispatcher::PacketDispatcher() :m_workflowManager(nullptr)
- {
- }
- PacketDispatcher::~PacketDispatcher()
- {
- }
- void PacketDispatcher::Initialize(IWorkflowManager *workflowmanager)
- {
- m_workflowManager = workflowmanager;
- }
- void PacketDispatcher::DispatchPacket(SCFPacket *packet)
- {
- //if(gcommLog) gcommLog->Info("[PacketDispatcher][DispatchPacket]->[%s]", FormatPacketString(packet).c_str());
- { if (gcommLog) { gcommLog->Info("[PacketDispatcher][DispatchPacket]->[{$}]", FormatPacketString(packet).c_str()); } }
- PacketNotifyType pnt = PNT_NAN;
- PacketClass pc = DIOSBoardProtocolParser::IdentifyPacketClass(packet);
- if (pc == PC_NOTIFY)
- {
- pnt = DIOSBoardProtocolParser::IdentifyPacketNotifyType(packet);
- }
- if (m_workflowManager == nullptr)
- {
- return;
- }
- if (pnt == PNT_SYSTEM_RESET_START || pnt == PNT_SYSTEM_RESET_SWING_START || pnt == PNT_SYSTEM_RESET_CIRCULAR_START)
- {
- m_workflowManager->ChangeToResetMode();
- }
- IExamHandler *handler = m_workflowManager->GetCurrentWorkFlowHandler();
- if (handler != nullptr)
- {
- if(gbusinessLog) gbusinessLog->Info("[DispatchPacket]->[Dispatch Packet To {$}]", handler->Name().c_str());
- switch (pnt)
- {
- case PNT_SYSTEM_RESET_START:
- {
- m_workflowManager->EnterSystemReset();
- }
- break;
- case PNT_SYSTEM_RESET_STOP:
- {
- m_workflowManager->ExitSystemReset();
- break;
- }
- case PNT_SYSTEM_RESET_SWING_START:
- m_workflowManager->EnterSystemResetSwing();
- break;
- case PNT_SYSTEM_RESET_SWING_STOP:
- m_workflowManager->ExitSystemResetSwing();
- break;
- case PNT_SYSTEM_RESET_CIRCULAR_START:
- m_workflowManager->EnterSystemResetCircular();
- break;
- case PNT_SYSTEM_RESET_CIRCULAR_STOP:
- m_workflowManager->ExitSystemResetCircular();
- break;
- case PNT_HANDSWITCH_FIRST_PRESSED:
- handler->OnHandSwitchGearFirstPressed();
- break;
- case PNT_HANDSWITCH_FIRST_RELEASE:
- handler->OnHandSwitchGearFirstReleased();
- break;
- case PNT_HANDSWITCH_SECOND_PRESSED:
- handler->OnHandSwitchGearSecondPressed();
- break;
- case PNT_HANDSWITCH_SECOND_RELEASE:
- handler->OnHandSwitchGearSecondReleased();
- break;
- case PNT_PWM_OFFSET:
- {
-
- PWMOffsetPacket opacket;
- if (DIOSBoardProtocolParser::ParsePWMOffsetPacket(packet, &opacket))
- {
- handler->OnPWMOffset(&opacket);
- }
- }
- break;
- case PNT_CAN:
- {
- CanDeviceData data;
- if (DIOSBoardProtocolParser::ParseCanPacket(packet, &data))
- {
- CanDeviceMessageCenter::Instance()->OnMessageArrived(m_workflowManager, &data);
- }
- }
- break;
- case PNT_XRAY_ON:
- handler->OnXrayOn();
- break;
- case PNT_XRAY_OFF:
- handler->OnXrayOff();
- break;
- case PNT_TUBE_HEIGHT_AD:
- {
- TubeLineADPacket opacket;
- if (DIOSBoardProtocolParser::ParseTubeHeightADPacket(packet, &opacket))
- {
- handler->OnTubeHeightAD(&opacket);
- }
- }
- break;
- case PNT_TUBE_ANGLE_LOW_LIMIT:
- handler->OnTubeAngleLowLimitPos();
- break;
- case PNT_TUBE_ANGLE_HIGH_LIMIT:
- handler->OnTubeAngleHighLimitPos();
- break;
- case PNT_TUBE_ANGLE_LEAVE_LOW_LIMIT:
- handler->OnTubeAngleLeaveLowLimitPos();
- break;
- case PNT_TUBE_ANGLE_LEAVE_HIGH_LIMIT:
- handler->OnTubeAngleLeaveHighLimitPos();
- break;
- case PNT_TUBE_ANGLE_ENCODER:
- {
- EncoderPacket opacket;
- if (DIOSBoardProtocolParser::ParseEncoderPacket(packet, &opacket))
- {
- handler->OnTubeAngleEncoder(&opacket);
- }
- }
- break;
- case PNT_TUBE_HEIGHT_ENCODER:
- {
- EncoderPacket opacket;
- if (DIOSBoardProtocolParser::ParseEncoderPacket(packet, &opacket))
- {
- handler->OnTubeHeightEncoder(&opacket);
- }
- }
- break;
- case PNT_TUBE_ANGLE_ENCODER_Z_CLEAR:
- handler->OnTubeAngleEncoderZPos();
- break;
- case PNT_TUBE_HEIGHT_HIGH_LIMIT:
- {
- handler->OnTubeHeightHighLimitPos();
- }
- break;
- case PNT_TUBE_HEIGHT_LEAVE_HIGH_LIMIT:
- {
- handler->OnTubeHeightLeaveHighLimitPos();
- }
- break;
- case PNT_TUBE_HEIGHT_LOW_LIMIT:
- {
- handler->OnTubeHeightLowLimitPos();
- }
- break;
- case PNT_TUBE_HEIGHT_LEAVE_LOW_LIMIT:
- {
- handler->OnTubeHeightLeaveLowLimitPos();
- }
- break;
- case PNT_TUBE_HEIGHT_ENCODER_Z_CLEAR:
- handler->OnTubeHeightEncoderZPos();
- break;
- case PNT_TUBE_HEIGHT_CONTROLLER_DIRECTION_1_START:
- handler->OnStartMove(TOMO_TUBE_HEIGHT, 0);
- break;
- case PNT_TUBE_HEIGHT_CONTROLLER_DIRECTION_1_STOP:
- handler->OnStopMove(TOMO_TUBE_HEIGHT);
- break;
- case PNT_TUBE_HEIGHT_CONTROLLER_DIRECTION_2_START:
- handler->OnStartMove(TOMO_TUBE_HEIGHT, 1);
- break;
- case PNT_TUBE_HEIGHT_CONTROLLER_DIRECTION_2_STOP:
- handler->OnStopMove(TOMO_TUBE_HEIGHT);
- break;
- case PNT_TUBE_ANGLE_CONTROLLER_DIRECTION_1_START:
- handler->OnStartMove(TOMO_TUBE_ANGLE, 0);
- break;
- case PNT_TUBE_ANGLE_CONTROLLER_DIRECTION_1_STOP:
- handler->OnStopMove(TOMO_TUBE_ANGLE);
- break;
- case PNT_TUBE_ANGLE_CONTROLLER_DIRECTION_2_START:
- handler->OnStartMove(TOMO_TUBE_ANGLE, 1);
- break;
- case PNT_TUBE_ANGLE_CONTROLLER_DIRECTION_2_STOP:
- handler->OnStopMove(TOMO_TUBE_ANGLE);
- break;
- case PNT_CARM_SCANNING_SWITCH_SWING:
- m_workflowManager->SwitchScanning(TOMO_TUBE_ANGLE);
- break;
- case PNT_CARM_SCANNING_SWITCH_CIRCULAR:
- m_workflowManager->SwitchScanning(TOMO_TUBE_HEIGHT);
- break;
- case PNT_TUBE_HORIZONTAL_CONTROLLER_DIRECTION_1_START:
- handler->OnStartMove(TOMO_TUBE_HORIZONTAL, 0);
- break;
- case PNT_TUBE_HORIZONTAL_CONTROLLER_DIRECTION_1_STOP:
- handler->OnStopMove(TOMO_TUBE_HORIZONTAL);
- break;
- case PNT_TUBE_HORIZONTAL_CONTROLLER_DIRECTION_2_START:
- handler->OnStartMove(TOMO_TUBE_HORIZONTAL, 1);
- break;
- case PNT_TUBE_HORIZONTAL_CONTROLLER_DIRECTION_2_STOP:
- handler->OnStopMove(TOMO_TUBE_HORIZONTAL);
- break;
- case PNT_TUBE_HORIZONTAL_ENCODER_Z_CLEAR:
- handler->OnTubeHorizontalEncoderZPos();
- break;
- case PNT_TUBE_HORIZONTAL_LEFT_LIMIT:
- handler->OnTubeHorizontalLeftLimitPos();
- break;
- case PNT_TUBE_HORIZONTAL_LEAVE_LEFT_LIMIT:
- handler->OnTubeHorizontalLeaveLeftLimitPos();
- break;
- case PNT_TUBE_HORIZONTAL_RIGHT_LIMIT:
- handler->OnTubeHorizontalRightLimitPos();
- break;
- case PNT_TUBE_HORIZONTAL_LEAVE_RIGHT_LIMIT:
- handler->OnTubeHorizontalLeaveRightLimitPos();
- break;
- default:
- break;
- }
- }
- }
- std::string PacketDispatcher::FormatPacketString(SCFPacket *packet)
- {
- std::string formated = "";
- if (!packet || packet->GetPacketLen() <= 0)
- {
- return formated;
- }
- auto packetLength = packet->GetPacketLen();
- char *chpacket = (char *)(*packet);
- char tmp[16] = { 0 };
- for (DWORD i = 0; i < packetLength; ++i)
- {
- if ((i >= 2 && i <= 6) || (i == packetLength - 3))
- {
- formated = formated + "#";
- }
- memset(tmp, 0, sizeof(tmp));
- sprintf_s(tmp, "%02X", (unsigned char)chpacket[i]);
- formated = formated + std::string(tmp);
- }
- return formated;
- }
|