#ifndef pmacV3AXIS_H #define pmacV3AXIS_H #include "sinqAxis.h" // Forward declaration of the controller class to resolve the cyclic dependency // between C804Controller.h and C804Axis.h. See // https://en.cppreference.com/w/cpp/language/class. class pmacV3Controller; class pmacV3Axis : public sinqAxis { public: /** * @brief Construct a new pmacV3Axis * * @param pController Pointer to the associated controller * @param axisNo Index of the axis * @param offsetLimit The high and low limits of the axis are read * out directly from the MCU. However, since the axis might slightly "overshoot" when moving to a position next to the limits, the MCU might go into the "limits hit" error state. To prevent this, this value allows adding a small offset, which is subtracted from the high limit and added to the low limit. */ pmacV3Axis(pmacV3Controller *pController, int axisNo, double offsetLimit); /** * @brief Destroy the pmacV3Axis * */ virtual ~pmacV3Axis(); /** * @brief Implementation of the `stop` function from asynMotorAxis * * @param acceleration Acceleration ACCEL from the motor record. This * value is currently not used. * @return asynStatus */ asynStatus stop(double acceleration); /** * @brief Implementation of the `doHome` function from sinqAxis. The * parameters are described in the documentation of `sinqAxis::doHome`. * * @param minVelocity * @param maxVelocity * @param acceleration * @param forwards * @return asynStatus */ asynStatus doHome(double minVelocity, double maxVelocity, double acceleration, int forwards); /** * @brief Implementation of the `doPoll` function from sinqAxis. The * parameters are described in the documentation of `sinqAxis::doPoll`. * * @param moving * @return asynStatus */ asynStatus doPoll(bool *moving); /** * @brief Implementation of the `doMove` function from sinqAxis. The * parameters are described in the documentation of `sinqAxis::doMove`. * * @param position * @param relative * @param min_velocity * @param max_velocity * @param acceleration * @return asynStatus */ asynStatus doMove(double position, int relative, double min_velocity, double max_velocity, double acceleration); /** * @brief Implementation of the `atFirstPoll` function from sinqAxis. * * The following steps are performed: * - Read out the motor status, motor position, velocity and acceleration * from the MCU and store this information in the parameter library. * - Set the enable PV accordint to the initial status of the axis. * * @return asynStatus */ asynStatus atFirstPoll(); /** * @brief Enable / disable the axis. * * @param on * @return asynStatus */ asynStatus enable(bool on); /** * @brief Read the encoder type (incremental or absolute) for this axis from * the MCU and store the information in the PV ENCODER_TYPE. * * @return asynStatus */ asynStatus readEncoderType(); /** * @brief Trigger a rereading of the encoder position. * * @return asynStatus */ asynStatus rereadEncoder(); protected: pmacV3Controller *pC_; asynStatus readConfig(); bool initial_poll_; bool waitForHandshake_; time_t timeAtHandshake_; // The axis status is used when enabling / disabling the motor int axisStatus_; /* Stores the constructor input offsetLimits */ double offsetLimits_; private: friend class pmacV3Controller; }; #endif