diff --git a/motorApp/NewportSrc/XPSController.cpp b/motorApp/NewportSrc/XPSController.cpp index fcab23e2..5a980e7c 100644 --- a/motorApp/NewportSrc/XPSController.cpp +++ b/motorApp/NewportSrc/XPSController.cpp @@ -161,22 +161,22 @@ XPSController::XPSController(const char *portName, const char *IPAddress, int IP // Create controller-specific parameters createParam(XPSMinJerkString, asynParamFloat64, &XPSMinJerk_); createParam(XPSMaxJerkString, asynParamFloat64, &XPSMaxJerk_); - createParam(XPSPositionCompareEnableString, asynParamInt32, &XPSPositionCompareEnable_); + createParam(XPSPositionCompareEnableString, asynParamInt32, &XPSPositionCompareEnable_); createParam(XPSPositionCompareMinPositionString, asynParamFloat64, &XPSPositionCompareMinPosition_); createParam(XPSPositionCompareMaxPositionString, asynParamFloat64, &XPSPositionCompareMaxPosition_); createParam(XPSPositionCompareStepSizeString, asynParamFloat64, &XPSPositionCompareStepSize_); - createParam(XPSPositionComparePulseWidthString, asynParamFloat64, &XPSPositionComparePulseWidth_); - createParam(XPSPositionCompareSettlingTimeString, asynParamFloat64, &XPSPositionCompareSettlingTime_); + createParam(XPSPositionComparePulseWidthString, asynParamInt32, &XPSPositionComparePulseWidth_); + createParam(XPSPositionCompareSettlingTimeString, asynParamInt32, &XPSPositionCompareSettlingTime_); createParam(XPSProfileMaxVelocityString, asynParamFloat64, &XPSProfileMaxVelocity_); createParam(XPSProfileMaxAccelerationString, asynParamFloat64, &XPSProfileMaxAcceleration_); createParam(XPSProfileMinPositionString, asynParamFloat64, &XPSProfileMinPosition_); createParam(XPSProfileMaxPositionString, asynParamFloat64, &XPSProfileMaxPosition_); - createParam(XPSProfileGroupNameString, asynParamOctet, &XPSProfileGroupName_); - createParam(XPSTrajectoryFileString, asynParamOctet, &XPSTrajectoryFile_); - createParam(XPSStatusString, asynParamInt32, &XPSStatus_); - createParam(XPSStatusStringString, asynParamOctet, &XPSStatusString_); - createParam(XPSTclScriptString, asynParamOctet, &XPSTclScript_); - createParam(XPSTclScriptExecuteString, asynParamInt32, &XPSTclScriptExecute_); + createParam(XPSProfileGroupNameString, asynParamOctet, &XPSProfileGroupName_); + createParam(XPSTrajectoryFileString, asynParamOctet, &XPSTrajectoryFile_); + createParam(XPSStatusString, asynParamInt32, &XPSStatus_); + createParam(XPSStatusStringString, asynParamOctet, &XPSStatusString_); + createParam(XPSTclScriptString, asynParamOctet, &XPSTclScript_); + createParam(XPSTclScriptExecuteString, asynParamInt32, &XPSTclScriptExecute_); // This socket is used for polling by the controller and all axes pollSocket_ = TCP_ConnectToServer((char *)IPAddress, IPPort, XPS_POLL_TIMEOUT); @@ -283,33 +283,59 @@ asynStatus XPSController::writeInt32(asynUser *pasynUser, epicsInt32 value) this->portName); status = asynError; } - } else if (function == XPSPositionCompareEnable_) { - bool enable = value; - double minPosition, maxPosition, stepSize, pulseWidth, settlingTime; - getDoubleParam(XPSPositionCompareMinPosition_, &minPosition); - getDoubleParam(XPSPositionCompareMaxPosition_, &maxPosition); - getDoubleParam(XPSPositionCompareStepSize_, &stepSize); - getDoubleParam(XPSPositionComparePulseWidth_, &pulseWidth); - getDoubleParam(XPSPositionCompareSettlingTime_, &settlingTime); - status = pAxis->setPositionCompare(enable, minPosition, maxPosition, stepSize, pulseWidth, settlingTime); - status = pAxis->getPositionCompare(&enable, &minPosition, &maxPosition, &stepSize, &pulseWidth, &settlingTime); - if (status == asynSuccess) { - setIntegerParam(XPSPositionCompareEnable_, enable); - setDoubleParam(XPSPositionCompareMinPosition_, minPosition); - setDoubleParam(XPSPositionCompareMaxPosition_, maxPosition); - setDoubleParam(XPSPositionCompareStepSize_, stepSize); - setDoubleParam(XPSPositionComparePulseWidth_, pulseWidth); - setDoubleParam(XPSPositionCompareSettlingTime_, settlingTime); - } + + } else if ((function == XPSPositionCompareEnable_) || + (function == XPSPositionComparePulseWidth_) || + (function == XPSPositionCompareStepSize_)) { + status = pAxis->setPositionCompare(); + status = pAxis->getPositionCompare(); + } else { /* Call base class method */ status = asynMotorController::writeInt32(pasynUser, value); } + /* Do callbacks so higher layers see any changes */ + pAxis->callParamCallbacks(); + return (asynStatus)status; } +/** Called when asyn clients call pasynFloat64->write(). + * \param[in] pasynUser asynUser structure that encodes the reason and address. + * \param[in] value Value to write. */ +asynStatus XPSController::writeFloat64(asynUser *pasynUser, epicsFloat64 value) +{ + int function = pasynUser->reason; + XPSAxis *pAxis; + asynStatus status = asynError; + //static const char *functionName = "writeFloat64"; + + pAxis = getAxis(pasynUser); + if (!pAxis) return asynError; + + /* Set the parameter and readback in the parameter library. */ + status = pAxis->setDoubleParam(function, value); + + if ((function == XPSPositionCompareMinPosition_) || + (function == XPSPositionCompareMaxPosition_) || + (function == XPSPositionCompareStepSize_)) { + status = pAxis->setPositionCompare(); + status = pAxis->getPositionCompare(); + + } else { + /* Call base class method */ + status = asynMotorController::writeFloat64(pasynUser, value); + + } + /* Do callbacks so higher layers see any changes */ + pAxis->callParamCallbacks(); + + return status; + +} + /** * Perform a deferred move (a coordinated group move) on all the axes in a group. * @param groupName Pointer to string naming the group on which to perform the group move. diff --git a/motorApp/NewportSrc/XPSController.h b/motorApp/NewportSrc/XPSController.h index abd122b5..f4e4dbee 100644 --- a/motorApp/NewportSrc/XPSController.h +++ b/motorApp/NewportSrc/XPSController.h @@ -21,6 +21,11 @@ USAGE... Newport XPS EPICS asyn motor device driver #define MAX_MESSAGE_LEN 256 #define MAX_GROUPNAME_LEN 64 +#define MAX_PULSE_WIDTHS 4 +#define MAX_SETTLING_TIMES 4 +static const double positionComparePulseWidths[MAX_PULSE_WIDTHS] = {0.2, 1.0, 2.5, 10.0}; +static const double positionCompareSettlingTimes[MAX_SETTLING_TIMES] = {0.075, 1.0, 4.0, 12.0}; + // drvInfo strings for extra parameters that the XPS controller supports #define XPSMinJerkString "XPS_MIN_JERK" #define XPSMaxJerkString "XPS_MAX_JERK" @@ -50,6 +55,7 @@ class epicsShareClass XPSController : public asynMotorController { /* These are the methods that we override from asynMotorDriver */ asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value); + asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value); void report(FILE *fp, int level); XPSAxis* getAxis(asynUser *pasynUser); XPSAxis* getAxis(int axisNo);