#pragma once #include "IMotionModel.h" namespace DiosCtrlBox { const int TOMO_HEIGHT_SLICE_MAX = 256; class TomoMotionStageArgs; class ITubeAngleController; class ITubeHeightController; class ISensorADController; class ISensorEncoderController; class IExposureController; 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; 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 speed = 0.0f); void RotateTubeAngle(int direction, float offset); void UpdateDigitalTwinTomoSliceParams(); void FixHeightStartPosition(float speed); 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; 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; //["UseHeightTriggerSyncBox"] //["UseHeightTriggerAngleRotation"] //"TubeAnglePeriodP0" //"TubeAnglePeriodP1" ResDataObject m_MachineryParams; //["TomoSID"] //["TomoAcceleratingDistance "] //["TomoAlignmentDistance"] //["TomoResetDistance"] //["TomoDeceleratingDistance"] //["TomoRotateDirection"] ResDataObject m_ModelParams; //["PositionNumber"]->int //["TomoScanAngle"]->float //["TomoScanMinDistance"]->float //["TomoMotionSpeed"]->float //["TomoProjectionNumber"]->int //["TomoProjectionDirection"]->int ResDataObject m_TechnicalParams; std::vector m_FeedbackTubeHeightEncoders; std::vector m_FeedbackTubeAngleEncoders; }; }