123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 |
- #include "stdafx.h"
- #include "NormalExamHandler.h"
- #include "IMotionModel.h"
- #include "MotionStages.h"
- #include "IMotionModelManager.h"
- #include "ConfigurerMotion.h"
- #include "ConfigurerPositionCode.h"
- #include "LogicDeviceHandSwitch.h"
- #include "LogicDeviceManager.h"
- #include "IPositionManager.h"
- #include "MechnicalMonitor.h"
- #include "IMotionStageArgs.h"
- #include "RADMotionStageArgs.h"
- #include "ConfigurerWS.h"
- using namespace DIOS::Dev::Detail::MachineryECOM;
- NormalExamHandler::NormalExamHandler()
- :m_handSwitchState(HS_NONE),
- m_modelLoaded(FALSE),
- m_postionManager(nullptr),
- m_modelManager(nullptr),
- m_bSendHandswitchStatusAfterCenterAdjust(TRUE)
- {
- }
- NormalExamHandler::~NormalExamHandler()
- {
- }
- void NormalExamHandler::OnModelLoaded(IMotionModelManager *modelManager)
- {
- m_modelManager = modelManager;
- }
- void NormalExamHandler::OnCoordinatesLoaded(IPositionManager *coordinates)
- {
- m_postionManager = coordinates;
- }
- void NormalExamHandler::OnMotionEvent(const std::string &motionEventName)
- {
- auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
- auto args = model->GetStageArgs();
- auto stageName = model->GetStageName();
- if (motionEventName == MONITOR_EVENT_TUBEANGLE_MOVE_STOP)
- {
- if (gmotionLog) gmotionLog->Info("[NormalExamHandler][OnMotionEvent]->[Tube Angle Motion Stop]");
- args->SetTubeAngleMotionStatus(FALSE);
- }
- else if (motionEventName == MONITOR_EVENT_TUBEHEIGHT_MOVE_STOP)
- {
- if (gmotionLog) gmotionLog->Info("[NormalExamHandler][OnMotionEvent]->[Tube Height Motion Stop]");
- args->SetTubeHeightMotionStatus(FALSE);
- if (stageName == RAD_STAGE_ADJUST_SID_MOVE)
- {
- ChangeMotionModelStage(RAD_STAGE_CENTER_ADJUST);
- }
- }
- else if (motionEventName == MONITOR_EVENT_TUBEHORIZONTAL_MOVE_STOP)
- {
- if (gmotionLog) gmotionLog->Info("[NormalExamHandler][OnMotionEvent]->[Tube Horizontal Motion Stop]");
- args->SetTubeHorizontalMotionStatus(FALSE);
- if (stageName == RAD_STAGE_ADJUST_SID_MOVE)
- {
- ChangeMotionModelStage(RAD_STAGE_CENTER_ADJUST);
- }
- }
- if (stageName == RAD_STAGE_CENTER_ADJUST)
- {
- if (args->IsMotionStoped())
- {
- m_postionManager->NotifyAlignStatus(TRUE);
- printf("[NormalExamHandler][OnMotionEvent]->[SendHandswitchStatusAfterCenterAdjust = %d]\n", m_bSendHandswitchStatusAfterCenterAdjust);
- if (m_bSendHandswitchStatusAfterCenterAdjust)
- {
- TransferHandSwitchState(HSW_FIRST_DOWN);
- if (m_handSwitchState == HS_GEAR_SECOND_PRESSED)
- {
- TransferHandSwitchState(HSW_SECOND_DOWN);
- }
- }
- m_bSendHandswitchStatusAfterCenterAdjust = TRUE;
- printf("[NormalExamHandler][OnMotionEvent]->[SendHandswitchStatusAfterCenterAdjust %s]\n", "TRUE");
- }
- }
- }
- RET_STATUS NormalExamHandler::OnStopMech()
- {
- ChangeMotionModelStage(RAD_STAGE_STOP_MOVE);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS NormalExamHandler::OnSelectExamMode(const char *pExamKey)
- {
- ChangeMotionModelStage(RAD_STAGE_CLEAR_PARAMS);
- if (!m_modelLoaded)
- {
- auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
- if (model)
- {
- ResDataObject radparms;
- if (ConfigurerMotion::GetSingleRADConfigs(radparms))
- {
- model->LoadModelParams(radparms);
- }
- ResDataObject mechparms;
- if (ConfigurerMotion::GetMachineryConfigs(mechparms))
- {
- model->LoadMachineryParams(mechparms);
- }
- m_modelLoaded = TRUE;
- }
- }
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS NormalExamHandler::OnSetTechParamsInfo(ResDataObject &pParam)
- {
- ResDataObject technicals;
- if (ParseTechnicalParams(pParam, technicals))
- {
- auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
- if (model)
- {
- model->SetTechnicalParams(technicals);
- }
- }
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS NormalExamHandler::OnFrameError()
- {
- IExamHandler::OnFrameError();
- ChangeMotionModelStage(RAD_STAGE_STOP_MOVE);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS NormalExamHandler::OnFrameRecover()
- {
- IExamHandler::OnFrameRecover();
- ChangeMotionModelStage(RAD_STAGE_STOP_MOVE);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS NormalExamHandler::OnSeqError()
- {
- IExamHandler::OnSeqError();
- ChangeMotionModelStage(RAD_STAGE_STOP_MOVE);
- return RET_STATUS::RET_SUCCEED;
- }
- void NormalExamHandler::OnHandSwitchGearFirstPressed()
- {
- m_handSwitchState = HS_GEAR_FIRST_PRESSED;
- printf("[NormalExamHandler][OnHandSwitchGearFirstPressed]\n");
- if (ConfigurerWS::IsDoubleWorkstation())
- {
- ChangeMotionModelStage(RAD_STAGE_ADJUST_SID_MOVE);
- }
- else
- {
- ChangeMotionModelStage(RAD_STAGE_CENTER_ADJUST);
- }
- }
- void NormalExamHandler::OnHandSwitchGearFirstReleased()
- {
- m_handSwitchState = HS_GEAR_FIRST_RELEASED;
- printf("[NormalExamHandler][OnHandSwitchGearFirstReleased]\n");
- ChangeMotionModelStage(RAD_STAGE_STOP_MOVE);
- TransferHandSwitchState(HSW_FIRST_UP);
- }
- void NormalExamHandler::OnHandSwitchGearSecondPressed()
- {
- if(gbusinessLog) gbusinessLog->Info("[NormalExamHandler][OnHandSwitchGearSecondPressed]->[Enter][{$:d}]", m_handSwitchState);
- if (m_handSwitchState != HS_GEAR_FIRST_PRESSED)
- {
- return;
- }
- m_handSwitchState = HS_GEAR_SECOND_PRESSED;
- auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
- auto args = model->GetStageArgs();
- printf("[NormalExamHandler][OnHandSwitchGearSecondPressed]\n");
- if (args->IsMotionStoped())
- {
- printf("[NormalExamHandler][OnHandSwitchGearSecondPressed][MotionStoped]\n");
- TransferHandSwitchState(HSW_SECOND_DOWN);
- }
- if(gbusinessLog) gbusinessLog->Info("[NormalExamHandler][OnHandSwitchGearSecondPressed]->[Exit][{$:d}]", (int)args->IsMotionStoped());
- }
- void NormalExamHandler::OnHandSwitchGearSecondReleased()
- {
- printf("[NormalExamHandler][OnHandSwitchGearSecondReleased]\n");
- m_handSwitchState = HS_GEAR_SECOND_RELEASED;
- TransferHandSwitchState(HSW_SECOND_UP);
- }
- void NormalExamHandler::ChangeMotionModelStage(const std::string &stageName)
- {
- auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
- if (model)
- {
- model->ChangeStage(stageName);
- if (stageName == RAD_STAGE_ADJUST_SID_MOVE)
- {
- if (m_CurWS == WS_WALL)
- {
- auto stageArgs = model->GetStageArgs();
- stageArgs->SetTubeHorizontalMotionStatus(TRUE);
- MechnicalMonitor::Instance()->BeginMonitor(this, MO_TUBE_HORIZONTAL);
- }
- else if (m_CurWS == WS_TABLE)
- {
- auto stageArgs = model->GetStageArgs();
- stageArgs->SetTubeHeightMotionStatus(TRUE);
- MechnicalMonitor::Instance()->BeginMonitor(this, MO_TUBE_HEIGHT);
- }
- }
- else if (stageName == RAD_STAGE_CENTER_ADJUST)
- {
- auto stageArgs = model->GetStageArgs();
- if (!ConfigurerWS::IsDoubleWorkstation())
- {
- stageArgs->SetTubeHorizontalMotionStatus(FALSE);
- stageArgs->SetTubeAngleMotionStatus(TRUE);
- stageArgs->SetTubeHeightMotionStatus(TRUE);
- MechnicalMonitor::Instance()->BeginMonitor(this, MO_TUBE_HEIGHT);
- MechnicalMonitor::Instance()->BeginMonitor(this, MO_TUBE_ANGLE);
- }
- else
- {
- stageArgs->SetTubeAngleMotionStatus(TRUE);
- stageArgs->SetTubeHeightMotionStatus(TRUE);
- MechnicalMonitor::Instance()->BeginMonitor(this);
- }
- }
- }
- }
- BOOL NormalExamHandler::ParseTechnicalParams(ResDataObject ¶mIn, ResDataObject ¶mOut)
- {
- if(gbusinessLog) gbusinessLog->Info("[ParseTechnicalParams]->[{$}]", paramIn.encode());
- try
- {
- if (paramIn.GetFirstOf("SID") < 0)
- {
- if(gbusinessLog) gbusinessLog->Error("[ParseTechnicalParams][SID is not exist]");
- return FALSE;
- }
- if (paramIn.GetFirstOf("PositionNumber") < 0)
- {
- if(gbusinessLog) gbusinessLog->Error("[ParseTechnicalParams]->[PositionNumber is not exist][{$}]", paramIn.encode());
- return FALSE;
- }
- std::string strCode = (const char *)paramIn["PositionNumber"];
- int nCode = atoi(strCode.c_str());
- ResDataObject PositionCodeParam;
- if (!ConfigurerPositionCode::GetPositionCodeConfigs(PositionCodeParam))
- {
- if(gbusinessLog) gbusinessLog->Error("[ParseTechnicalParams]->[PositionCode is not exist]");
- return FALSE;
- }
- paramOut.clear();
- std::string strKey = "PC" + strCode;
- if (PositionCodeParam.GetFirstOf(strKey.c_str()) >= 0)
- {
- //0到20000之间是单张点片的position code范围
- if (nCode > 0 && nCode < 20000)
- {
- ResDataObject pcset;
- pcset = PositionCodeParam[strKey.c_str()];
- paramOut.add("TubeDesAngle",pcset["TubeDesAngle"]);
- paramOut.add("TubeDesHeight",pcset["TubeDesHeight"]);
- paramOut.add("IsTubeSameHeightWithDetector",(bool)atoi((const char *)pcset["IsTubeSameHeightWithDetector"]));
- }
- }
- else
- {
- paramOut.add("TubeDesAngle",0.0f);
- paramOut.add("TubeDesHeight", 1.1f);
- paramOut.add("IsTubeSameHeightWithDetector", true);
- }
- return TRUE;
- }
- catch (ResDataObjectExption &exp)
- {
- if(gbusinessLog) gbusinessLog->Error("[ParseTechnicalParams][Exception]->[{$}]",exp.what());
- }
- catch (...)
- {
- if(gbusinessLog) gbusinessLog->Error("[ParseTechnicalParams][Exception]->[Unknown]");
- }
- return FALSE;
- }
- void NormalExamHandler::TransferHandSwitchState(int status)
- {
- auto hswDevice = (LogicDeviceHandSwitch *)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_HSW);
- if (hswDevice)
- {
- string signalname[4] = {"HSW_FIRST_DOWN", "HSW_FIRST_UP", "HSW_SECOND_DOWN", "HSW_SECOND_UP"};
- if (status > -1 & status < 4)
- {
- if (gbusinessLog) gbusinessLog->Info("[NormalExamHandler][TransferHandSwitchState]->[{$:d}, {$}]", status, signalname[status]);
- printf("[NormalExamHandler][TransferHandSwitchState]->[%d, %s]\n", status, signalname[status]);
- }
- hswDevice->SwitchState((HANDSWITCH_STATUS)status);
- }
- }
- BOOL NormalExamHandler::IsMovingEnable()
- {
- BOOL bRes = TRUE;
- if (m_bMachineMoving)
- {
- if (gbusinessLog) gbusinessLog->Warn("[NormalExamHandler][IsMovingEnable]->[Machine is moving, single motion is not allowed]");
- bRes = FALSE;
- }
- return bRes;
- }
- RET_STATUS NormalExamHandler::OnStartMove(DOF_MECH mech, int nOrientation)
- {
- auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
- if (!model)
- {
- return RET_STATUS::RET_FAILED;
- }
- if (!IsMovingEnable())
- {
- return RET_STATUS::RET_FAILED;
- }
- auto modelArgs = (RADMotionStageArgs*) model->GetStageArgs();
- if (mech == TOMO_TUBE_HEIGHT)
- {
- modelArgs->TubeHeightDirection = nOrientation;
- modelArgs->TubeHeightStep = -1;
- if (gbusinessLog) gbusinessLog->Info("[NormalExamHandler][OnStartMove]->[Enter][TOMO_TUBE_HEIGHT][Org: {$:d}]", modelArgs->TubeHeightDirection);
- model->ChangeStage(RAD_STAGE_MOVE_TUBE_HEIGHT);
- }
- else if (mech == TOMO_TUBE_HORIZONTAL)
- {
- modelArgs->TubeHorizontalMoveDirection = nOrientation;
- modelArgs->TubeHorizontalMoveStep = -1;
- if (gbusinessLog) gbusinessLog->Info("[NormalExamHandler][OnStartMove]->[Enter][TOMO_TUBE_HORIZONTAL][Org: {$:d}]", modelArgs->TubeHeightDirection);
- model->ChangeStage(RAD_STAGE_MOVE_TUBE_HORIZONTAL);
- }
- else if (mech == TOMO_TUBE_ANGLE)
- {
- modelArgs->TubeAngleDirection = nOrientation;
- modelArgs->TubeAngleStep = -1;
- if (gbusinessLog) gbusinessLog->Info("[NormalExamHandler][OnStartMove]->[Enter][TOMO_TUBE_ANGLE][Org: {$:d}]", modelArgs->TubeAngleDirection);
- model->ChangeStage(RAD_STAGE_MOVE_TUBE_ROTATION);
- }
- m_bMachineMoving = TRUE;
- if (gbusinessLog) gbusinessLog->Info("[NormalExamHandler][OnStartMove]->[Leave]");
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS NormalExamHandler::OnStopMove(DOF_MECH mech)
- {
- if (gbusinessLog) gbusinessLog->Info("[NormalExamHandler][OnStopMove]->[Enter]");
- auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
- if (!model)
- {
- return RET_STATUS::RET_FAILED;
- }
- model->ChangeStage(RAD_STAGE_STOP_MOVE);
- m_bMachineMoving = FALSE;
- if (gbusinessLog) gbusinessLog->Info("[NormalExamHandler][OnStopMove]->[Leave]");
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS NormalExamHandler::OnWorkstationSwitch(const char* pWorkstation)
- {
- if (gbusinessLog) gbusinessLog->Info("[NormalExamHandler][OnWorkstationSwitch]->[{$}]", pWorkstation);
- if (!ConfigurerWS::IsDoubleWorkstation())
- {
- m_CurWS = ConfigurerWS::GetDefaultWS();
- if (gbusinessLog) gbusinessLog->Info("[NormalExamHandler][OnWorkstationSwitch]->[It is single WS, change to default {$}]", m_CurWS);
- }
- else
- {
- m_CurWS = pWorkstation;
- }
- auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
- if (!model)
- {
- return RET_STATUS::RET_FAILED;
- }
- model->SwitchWorkstation(m_CurWS);
- return DIOS::Dev::RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS NormalExamHandler::OnCenterAdjust(DOF_MECH mech)
- {
- m_bSendHandswitchStatusAfterCenterAdjust = FALSE;
- printf("[NormalExamHandler][OnCenterAdjust]->[SendHandswitchStatusAfterCenterAdjust %s]\n", "FALSE");
- ChangeMotionModelStage(RAD_STAGE_CENTER_ADJUST);
- return RET_STATUS::RET_SUCCEED;
- }
|