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:
2025-03-28 14:51:09 +01:00
parent 828e9bc59c
commit 7729eceb28
6 changed files with 198 additions and 94 deletions

View File

@@ -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_;