#pragma once #include "IMotionModel.h" namespace DIOS::Dev::Detail::MachineryECOM { class ParkingMotionStageArgs; class ITubeAngleController; class ITubeHeightController; class ISensorADController; class ISensorEncoderController; class ParkingModel : public IMotionModel { public: ParkingModel(); ~ParkingModel(); 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 &name); void OnMotionStageParkingHorizontal(); void OnMotionStageParkingVertical(); void OnMotionStageParkingTubeAngleLowLimit(); void OnMotionStageParkingTubeHeightLowLimit(); void AlignTubeHeightToDetector(); void RotateTubeToExposure(); void RotateTubeToVertical(); void RotateTubeToLowLimit(); void MoveTubeHeightToLowLimit(); float GetExposureAngle(); float GetVerticalAngle(); int JudgeDirectionInTubeHeightAxis(float current, float target); int JudgeDirectionInTubeAngleAxis(float current, float target); void MoveTubeHeight(int direction, float offset); void RotateTubeAngle(int direction, float offset); void OnMotionStageStopMove(); private: std::string m_stageName; ParkingMotionStageArgs *m_stageArgs; IPositionManager *m_coordinates; ITubeAngleController *m_motorTubeAngle; ITubeHeightController *m_motorTubeHeight; ResDataObject m_MachineryParams; }; }