From d87363f79497c7b6a8c666e4a0cb86ec7ed3a48c Mon Sep 17 00:00:00 2001 From: MarkRivers Date: Wed, 16 Dec 2009 06:13:29 +0000 Subject: [PATCH] New C++ base class for asyn motor drivers --- motorApp/MotorSrc/asynMotorDriver.cpp | 137 ++++++++++++++++++++++++++ motorApp/MotorSrc/asynMotorDriver.h | 122 +++++++++++++++++++++++ 2 files changed, 259 insertions(+) create mode 100644 motorApp/MotorSrc/asynMotorDriver.cpp create mode 100644 motorApp/MotorSrc/asynMotorDriver.h diff --git a/motorApp/MotorSrc/asynMotorDriver.cpp b/motorApp/MotorSrc/asynMotorDriver.cpp new file mode 100644 index 00000000..c8536576 --- /dev/null +++ b/motorApp/MotorSrc/asynMotorDriver.cpp @@ -0,0 +1,137 @@ +#include "asynMotorDriver.h" + +/** All of the arguments are simply passed to + * the constructor for the asynPortDriver base class. After calling the base class + * constructor this method sets reasonable default values for all of the parameters + * defined in asynMotorDriver.h. + */ + +static const char *driverName = "asynMotorDriver"; + +asynMotorDriver::asynMotorDriver(const char *portName, int maxAddr, int numParams, + int interfaceMask, int interruptMask, + int asynFlags, int autoConnect, int priority, int stackSize) + + : asynPortDriver(portName, maxAddr, NUM_MOTOR_DRIVER_PARAMS+numParams, + interfaceMask | asynInt32Mask | asynFloat64Mask, + interruptMask | asynInt32Mask | asynFloat64Mask, + asynFlags, autoConnect, priority, stackSize) + +{ + static const char *functionName = "asynMotorDriver"; + + /* Create the base set of motor parameters */ + addParam(motorMoveRelString, &motorMoveRel); + addParam(motorMoveAbsString, &motorMoveAbs); + addParam(motorMoveVelString, &motorMoveVel); + addParam(motorHomeString, &motorHome); + addParam(motorStopString, &motorStop); + addParam(motorVelocityString, &motorVelocity); + addParam(motorVelBaseString, &motorVelBase); + addParam(motorAccelString, &motorAccel); + addParam(motorPositionString, &motorPosition); + addParam(motorEncoderPositionString, &motorEncoderPosition); + addParam(motorDeferMovesString, &motorDeferMoves); + addParam(motorResolutionString, &motorResolution); + addParam(motorEncRatioString, &motorEncRatio); + addParam(motorPgainString, &motorPgain); + addParam(motorIgainString, &motorIgain); + addParam(motorDgainString, &motorDgain); + addParam(motorHighLimString, &motorHighLim); + addParam(motorLowLimString, &motorLowLim); + addParam(motorSetClosedLoopString, &motorSetClosedLoop); + addParam(motorStatusString, &motorStatus); + addParam(motorUpdateStatusString, &motorUpdateStatus); + addParam(motorStatusDirectionString, &motorStatusDirection); + addParam(motorStatusDoneString, &motorStatusDone); + addParam(motorStatusHighLimitString, &motorStatusHighLimit); + addParam(motorStatusAtHomeString, &motorStatusAtHome); + addParam(motorStatusSlipString, &motorStatusSlip); + addParam(motorStatusPowerOnString, &motorStatusPowerOn); + addParam(motorStatusFollowingErrorString, &motorStatusFollowingError); + addParam(motorStatusHomeString, &motorStatusHome); + addParam(motorStatusHasEncoderString, &motorStatusHasEncoder); + addParam(motorStatusProblemString, &motorStatusProblem); + addParam(motorStatusMovingString, &motorStatusMoving); + addParam(motorStatusGainSupportString, &motorStatusGainSupport); + addParam(motorStatusCommsErrorString, &motorStatusCommsError); + addParam(motorStatusLowLimitString, &motorStatusLowLimit); + addParam(motorStatusHomedString, &motorStatusHomed); + + asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: constructor complete\n", + driverName, functionName); + +} + +asynStatus asynMotorDriver::readGenericPointer(asynUser *pasynUser, void *pointer) +{ + static const char *functionName = "readGenericPointer"; + + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s: not implemented in this driver\n", + driverName, functionName); + return(asynError); +} + +asynStatus asynMotorDriver::moveAxis(asynUser *pasynUser, double position, int relative, double min_velocity, double max_velocity, double acceleration) +{ + static const char *functionName = "moveAxis"; + + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s: not implemented in this driver\n", + driverName, functionName); + return(asynError); +} + +asynStatus asynMotorDriver::moveVelocityAxis(asynUser *pasynUser, double min_velocity, double max_velocity, double acceleration) +{ + static const char *functionName = "moveVelocityAxis"; + + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s: not implemented in this driver\n", + driverName, functionName); + return(asynError); +} + +asynStatus asynMotorDriver::homeAxis(asynUser *pasynUser, double min_velocity, double max_velocity, double acceleration, int forwards) +{ + static const char *functionName = "homeAxis"; + + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s: not implemented in this driver\n", + driverName, functionName); + return(asynError); +} + + +asynStatus asynMotorDriver::stopAxis(asynUser *pasynUser, double acceleration) +{ + static const char *functionName = "stopAxis"; + + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s: not implemented in this driver\n", + driverName, functionName); + return(asynError); +} + +asynStatus asynMotorDriver::profileMove(asynUser *pasynUser, int npoints, double positions[], double times[], int relative, int trigger) +{ + static const char *functionName = "profileMove"; + + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s: not implemented in this driver\n", + driverName, functionName); + return(asynError); +} + +asynStatus asynMotorDriver::triggerProfile(asynUser *pasynUser) +{ + static const char *functionName = "triggerProfile"; + + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s: not implemented in this driver\n", + driverName, functionName); + return(asynError); +} + diff --git a/motorApp/MotorSrc/asynMotorDriver.h b/motorApp/MotorSrc/asynMotorDriver.h new file mode 100644 index 00000000..dd936e85 --- /dev/null +++ b/motorApp/MotorSrc/asynMotorDriver.h @@ -0,0 +1,122 @@ +/* asynMotorDriver.h + * + * Mark Rivers + * + * This file defines the base class for an asynMotorDriver. It is the class + * from which real motor drivers are derived. It derives from asynPortDriver. + */ +#ifndef asynMotorDriver_H +#define asynMotorDriver_H + +#include + +#define motorMoveRelString "MOTOR_MOVE_REL" +#define motorMoveAbsString "MOTOR_MOVE_ABS" +#define motorMoveVelString "MOTOR_MOVE_VEL" +#define motorHomeString "MOTOR_HOME" +#define motorStopString "MOTOR_STOP_AXIS" +#define motorVelocityString "MOTOR_VELOCITY" +#define motorVelBaseString "MOTOR_VEL_BASE" +#define motorAccelString "MOTOR_ACCEL" +#define motorPositionString "MOTOR_POSITION" +#define motorEncoderPositionString "MOTOR_ENCODER_POSITION" +#define motorDeferMovesString "MOTOR_DEFER_MOVES" +#define motorResolutionString "MOTOR_RESOLUTION" +#define motorEncRatioString "MOTOR_ENC_RATIO" +#define motorPgainString "MOTOR_PGAIN" +#define motorIgainString "MOTOR_IGAIN" +#define motorDgainString "MOTOR_DGAIN" +#define motorHighLimString "MOTOR_HIGH_LIMIT" +#define motorLowLimString "MOTOR_LOW_LIMIT" +#define motorSetClosedLoopString "MOTOR_SET_CLOSED_LOOP" +#define motorStatusString "MOTOR_STATUS" +#define motorUpdateStatusString "MOTOR_UPDATE_STATUS" +#define motorStatusDirectionString "MOTOR_STATUS_DIRECTION" +#define motorStatusDoneString "MOTOR_STATUS_DONE" +#define motorStatusHighLimitString "MOTOR_STATUS_HIGHLIMIT" +#define motorStatusAtHomeString "MOTOR_STATUS_ATHOME" +#define motorStatusSlipString "MOTOR_STATUS_SLIP" +#define motorStatusPowerOnString "MOTOR_STATUS_POWERED" +#define motorStatusFollowingErrorString "MOTOR_STATUS_FOLLOWINGERROR" +#define motorStatusHomeString "MOTOR_STATUS_HOME" +#define motorStatusHasEncoderString "MOTOR_STATUS_HASENCODER" +#define motorStatusProblemString "MOTOR_STATUS_PROBLEM" +#define motorStatusMovingString "MOTOR_STATUS_MOVING" +#define motorStatusGainSupportString "MOTOR_STATUS_GAINSUPPORT" +#define motorStatusCommsErrorString "MOTOR_STATUS_COMMSERROR" +#define motorStatusLowLimitString "MOTOR_STATUS_LOWLIMIT" +#define motorStatusHomedString "MOTOR_STATUS_HOMED" + +typedef struct MotorStatus { + double position; + double encoder_posn; + double velocity; + epicsUInt32 status; +} MotorStatus; + +#ifdef __cplusplus +#include +/** Class from which motor drivers are directly derived. */ +class asynMotorDriver : public asynPortDriver { +public: + /* This is the constructor for the class. */ + asynMotorDriver(const char *portName, int maxAxes, int numParams, + int interfaceMask, int interruptMask, + int asynFlags, int autoConnect, int priority, int stackSize); + + /* These are the methods that we override from asynPortDriver */ + virtual asynStatus readGenericPointer(asynUser *pasynUser, void *pointer); + + /* These are the methods that are new to this class */ + virtual asynStatus moveAxis(asynUser *pasynUser, double position, int relative, double min_velocity, double max_velocity, double acceleration); + virtual asynStatus moveVelocityAxis(asynUser *pasynUser, double min_velocity, double max_velocity, double acceleration); + virtual asynStatus homeAxis(asynUser *pasynUser, double min_velocity, double max_velocity, double acceleration, int forwards); + virtual asynStatus stopAxis(asynUser *pasynUser, double acceleration); + virtual asynStatus profileMove(asynUser *pasynUser, int npoints, double positions[], double times[], int relative, int trigger); + virtual asynStatus triggerProfile(asynUser *pasynUser); + +protected: + int motorMoveRel; + #define FIRST_MOTOR_PARAM motorMoveRel + int motorMoveAbs; + int motorMoveVel; + int motorHome; + int motorStop; + int motorVelocity; + int motorVelBase; + int motorAccel; + int motorPosition; + int motorEncoderPosition; + int motorDeferMoves; + int motorResolution; + int motorEncRatio; + int motorPgain; + int motorIgain; + int motorDgain; + int motorHighLim; + int motorLowLim; + int motorSetClosedLoop; + int motorStatus; + int motorUpdateStatus; + int motorStatusDirection; + int motorStatusDone; + int motorStatusHighLimit; + int motorStatusAtHome; + int motorStatusSlip; + int motorStatusPowerOn; + int motorStatusFollowingError; + int motorStatusHome; + int motorStatusHasEncoder; + int motorStatusProblem; + int motorStatusMoving; + int motorStatusGainSupport; + int motorStatusCommsError; + int motorStatusLowLimit; + int motorStatusHomed; + #define LAST_MOTOR_PARAM motorStatusHomed + +}; +#define NUM_MOTOR_DRIVER_PARAMS (&LAST_MOTOR_PARAM - &FIRST_MOTOR_PARAM + 1) + +#endif /* _cplusplus */ +#endif /* asynMotorDriver_H */