#pragma once #include "IMotionModel.h" namespace DIOS::Dev::Detail::MachineryECOM { const int TOMO_HEIGHT_SLICE_MAX = 256; enum { DET_HIGHT_NORMAL, DET_HIGHT_TOOHIGH, DET_HIGHT_TOOLOW, }; class TomoMotionStageArgs; class ITubeAngleController; class ITubeHeightController; class ISensorADController; class ISensorEncoderController; class IExposureController; class IOutputController; class TomoMotionModel : public IMotionModel { public: TomoMotionModel(); ~TomoMotionModel(); public: virtual void ChangeStage(const std::string &stageName) override; virtual std::string GetStageName() override; virtual IMotionStageArgs *GetStageArgs() override; public: virtual void Initialize(IMachineryManager *machineryManager, IPositionManager *coordinates) override; virtual void LoadMachineryParams(ResDataObject ¶ms) override; virtual void LoadModelParams(ResDataObject ¶ms) override; virtual void SetTechnicalParams(ResDataObject ¶ms) override; virtual void OnFeedbackMotionParams(ResDataObject ¶ms) override; virtual BOOL GetMotionParams(ResDataObject ¶ms) override; virtual void SwitchScanningComponents(int nSwitch) override; virtual void SwitchWorkstation(string ws) override; private: void OnMotionStage(const std::string &stageName); void MotionStageClearParams(); void MotionStageCalculateParams(); void MotionStageSetTomoMotionSlice(); void MotionStageMovetoEndPos(); void MotionStageMovetoStartPos(); void MotionStageErrorStop(); void MotionStageErrorRecover(); void MotionStageCenterAdjust(); void AlignTubeHeightToDetector(); void RotateTubeToHorizontal(); void StopMotion(); void MoveTubeHeightToTomoStartPosiotn(); void RotateTubeAngleToTomoStartPostion(); BOOL GetTomoRotateDirection(); int JudgeDirectionInTubeHeightAxis(float current,float target); int JudgeDirectionInTubeAngleAxis(float current,float target); void MoveTubeHeight(int direction,float offset,float spd = 0.0f); void RotateTubeAngle(int direction, float offset); void UpdateDigitalTwinTomoSliceParams(); void FixHeightStartPosition(float speed); void OnMotionStageMove2SID(string ws); int JudgeDirectionInTubeHorizontalAxis(float current, float target); void MoveTubeHorizontal(int direction, float offset, float spd = 0.0f); void DoMotionStageSetTomoMotionSlice(ISensorEncoderController* pEncoder, string encoderControllerName); void DoMotionStageMovetoEndPosHeight(); void DoMotionStageMovetoEndPosHorizontal(); void DoMotionStageMovetoStartPosHeight(); void DoMotionStageMovetoStartPosHorizontal(); void MoveTubeHorizontalToTomoStartPosiotn(); int IsTomoMotionDetectorPosCorrect(float fDetectorCurPos, string scanangle); private: std::string m_StageName; TomoMotionStageArgs *m_stageArgs; IPositionManager *m_coordinates; IMachineryManager *m_machineryManager; ITubeAngleController *m_motorTubeAngle; ITubeHeightController *m_motorTubeHeight; ISensorADController *m_adDetectorHeight; ISensorEncoderController *m_encoderTubeAngle; ISensorEncoderController *m_encoderTubeHeight; IExposureController *m_exposure; ITubeHeightController* m_motorTubeHorizontal; ISensorADController* m_adTubeHorizontal; ISensorEncoderController* m_encoderTubeHorizontal; IOutputController* m_tubeLineMotionSwitch; float *m_heightSlices; int *m_anglePeriods; int *m_angleSteps; float m_warmAngle; float m_anglePerSlice; int m_angleSliceCount; int m_heightSliceCount; float m_heightStartPosition; float m_angleStartPosition; float m_fps; ResDataObject m_MachineryParams; ResDataObject m_ModelParams; ResDataObject m_TechnicalParams; std::vector m_FeedbackTubeHeightEncoders; std::vector m_FeedbackTubeAngleEncoders; }; }