Added doReset wrapper around reset and added two functions to set and
retrieve the motor position which handle the conversion via motorRecResolution.
This commit is contained in:
@@ -19,15 +19,12 @@ class epicsShareClass sinqAxis : public asynMotorAxis {
|
||||
sinqAxis(class sinqController *pC_, int axisNo);
|
||||
|
||||
/**
|
||||
* @brief Perform some standardized operation before and after the concrete
|
||||
* @brief Perform some standardized operations before and after the concrete
|
||||
`doPoll` implementation.
|
||||
*
|
||||
* Wrapper around doPoll which performs the following operations:
|
||||
Before calling doPoll:
|
||||
* Wrapper around `doPoll` which performs the following operations:
|
||||
|
||||
- Try to execute atFirstPoll once (and retry, if that failed)
|
||||
|
||||
After calling doPoll:
|
||||
- Call the `doPoll` method
|
||||
|
||||
- Reset motorStatusProblem_, motorStatusCommsError_ and motorMessageText_ if
|
||||
doPoll returned asynSuccess
|
||||
@@ -45,8 +42,8 @@ class epicsShareClass sinqAxis : public asynMotorAxis {
|
||||
*
|
||||
* @param moving Forwarded to `doPoll`.
|
||||
* @return asynStatus Forward the status of `doPoll`, unless one of
|
||||
the parameter library operation fails (in that case, returns the failed
|
||||
operation status).
|
||||
the parameter library operation fails (in that case, returns the status of
|
||||
the failed operation.
|
||||
*/
|
||||
asynStatus poll(bool *moving);
|
||||
|
||||
@@ -61,11 +58,12 @@ class epicsShareClass sinqAxis : public asynMotorAxis {
|
||||
virtual asynStatus doPoll(bool *moving);
|
||||
|
||||
/**
|
||||
* @brief Perform some standardized operation before and after the concrete
|
||||
* @brief Perform some standardized operations before and after the concrete
|
||||
`doMove` implementation.
|
||||
|
||||
* Wrapper around `doMove` which calculates the (absolute) target position
|
||||
and stores it in the parameter library. After that, it calls and returns
|
||||
and stores it in the member variable `targetPosition_`. This member variable
|
||||
is e.g. used for the movement watchdog. Afterwards, it calls and returns
|
||||
`doMove`.
|
||||
*
|
||||
* @param position Forwarded to `doMove`.
|
||||
@@ -162,20 +160,30 @@ class epicsShareClass sinqAxis : public asynMotorAxis {
|
||||
|
||||
/**
|
||||
* @brief This function is called when the PV "$(INSTR)$(M):Reset" is set to
|
||||
* any value. This method should be implemented by a child class of
|
||||
* sinqAxis.
|
||||
* any value. It calls `doReset` (which ought to be implemented by a child
|
||||
* class) and then performs da defined number of consecutive fast polls. If
|
||||
* one of the polls returns asynSuccess, it returns immediately.
|
||||
*
|
||||
* @return asynStatus
|
||||
*/
|
||||
virtual asynStatus reset();
|
||||
asynStatus reset();
|
||||
|
||||
/**
|
||||
* @brief Implementation of the "proper", device-specific `reset` method.
|
||||
This method should be implemented by a child class of sinqAxis. If the
|
||||
motor cannot be reset, this function should return asynError.
|
||||
*
|
||||
* @return asynStatus
|
||||
*/
|
||||
virtual asynStatus doReset();
|
||||
|
||||
/**
|
||||
* @brief This function enables / disables an axis. It should be implemented
|
||||
* by a child class of sinqAxis.
|
||||
*
|
||||
* The concrete implementation should (but doesn't need to) follow the
|
||||
* convetion that a value of 0 disables the axis and any other value enables
|
||||
* it.
|
||||
* convention that a value of 0 disables the axis and any other value
|
||||
* enables it.
|
||||
*
|
||||
* @param on
|
||||
* @return asynStatus
|
||||
@@ -188,7 +196,7 @@ class epicsShareClass sinqAxis : public asynMotorAxis {
|
||||
* Populates the speed fields of the motor record. If the param lib
|
||||
* entry motorCanSetSpeed_ (connected to the PV x:VariableSpeed) is set to
|
||||
* 1, VBAS and VMAX are set to min and max respectively. Otherwise, they are
|
||||
* set to val. Additionally, the speed itself is set to velo.
|
||||
* set to val. Additionally, the speed itself is set to VELO.
|
||||
*
|
||||
* The units of the inputs are engineering units (EGU) per second (e.g. mm/s
|
||||
* if the EGU is mm).
|
||||
@@ -243,15 +251,15 @@ class epicsShareClass sinqAxis : public asynMotorAxis {
|
||||
|
||||
with
|
||||
|
||||
timeContSpeed = abs(motorTargetPosition - motorPosition) / motorVelBase
|
||||
timeContSpeed = abs(targetPosition - motorPosition) / motorVelBase
|
||||
timeAcc = motorVelBase / motorAccel
|
||||
|
||||
The values motorTargetPosition, motorVelBase, motorAccel and
|
||||
positionAtMovementStart are taken from the parameter library. Therefore it
|
||||
is necessary to populate them before using this function. If they are not
|
||||
given, both speed and velocity are assumed to be infinite. This means that
|
||||
timeContSpeed and/or timeAcc are set to zero. motorTargetPosition is
|
||||
populated automatically when using the doMove function.
|
||||
The values motorVelBase, motorAccel and positionAtMovementStart are taken
|
||||
from the parameter library. Therefore it is necessary to populate them
|
||||
before using this function. If they are not given, both speed and velocity
|
||||
are assumed to be infinite. This means that timeContSpeed and/or timeAcc are
|
||||
set to zero. targetPosition is populated automatically when using the doMove
|
||||
function.
|
||||
|
||||
The values offsetMovTimeout_ and scaleMovTimeout_ can be set directly from
|
||||
the IOC shell with the functions setScaleMovTimeout and setOffsetMovTimeout,
|
||||
@@ -280,7 +288,7 @@ class epicsShareClass sinqAxis : public asynMotorAxis {
|
||||
* @brief Set the offsetMovTimeout. Also available in the IOC shell
|
||||
* (see "extern C" section in sinqController.cpp).
|
||||
*
|
||||
See documentation of `checkMovTimeoutWatchdog` for details.
|
||||
* See documentation of `checkMovTimeoutWatchdog` for details.
|
||||
*
|
||||
* @param offsetMovTimeout Offset (in seconds)
|
||||
* @return asynStatus
|
||||
@@ -311,6 +319,34 @@ class epicsShareClass sinqAxis : public asynMotorAxis {
|
||||
*/
|
||||
int axisNo() { return axisNo_; }
|
||||
|
||||
/**
|
||||
* @brief Read the motor position from the paramLib, adjusted for the
|
||||
* motorRecResolution
|
||||
*
|
||||
* The motorPosition value in the paramLib is the encoder position
|
||||
* divided by the motorRecResolution (see README.md). This function
|
||||
* fetches the paramLib value and multiplies it with motorRecResolution
|
||||
* (also fetched from the paramLib).
|
||||
*
|
||||
* @param motorPositon
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus motorPosition(double *motorPositon);
|
||||
|
||||
/**
|
||||
* @brief Write the motor position in the paramLib, adjusted for the
|
||||
* motorRecResolution
|
||||
*
|
||||
* The motorPosition value in the paramLib is the encoder position
|
||||
* divided by the motorRecResolution (see README.md). This function takes
|
||||
* the input value and divides it with motorRecResolution (fetched from
|
||||
* the paramLib).
|
||||
*
|
||||
* @param motorPosition
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus setMotorPosition(double motorPosition);
|
||||
|
||||
protected:
|
||||
// Internal variables used in the movement timeout watchdog
|
||||
time_t expectedArrivalTime_;
|
||||
|
||||
Reference in New Issue
Block a user