diff --git a/motorApp/Db/HXP_coords.db b/motorApp/Db/HXP_coords.db new file mode 100644 index 00000000..74ea088e --- /dev/null +++ b/motorApp/Db/HXP_coords.db @@ -0,0 +1,157 @@ +record(bo,"$(P)$(R)READ_CS") { + field(DESC,"Read Coord Systems") + field(DTYP,"asynInt32") + field(ZNAM,"Done") + field(ONAM,"Read") + field(OUT, "@asyn($(PORT),0)HXP_COORD_SYS_READ_ALL") + field(VAL, "1") + field(PINI,"YES") +} + +# TOOL CS readbacks +record(ai,"$(P)$(R)TOOL:X") { + field(DESC,"TOOL coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_TOOL_X") + field(PREC,"5") +} + +record(ai,"$(P)$(R)TOOL:Y") { + field(DESC,"TOOL coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_TOOL_Y") + field(PREC,"5") +} + +record(ai,"$(P)$(R)TOOL:Z") { + field(DESC,"TOOL coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_TOOL_Z") + field(PREC,"5") +} + +record(ai,"$(P)$(R)TOOL:U") { + field(DESC,"TOOL coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_TOOL_U") + field(PREC,"5") +} + +record(ai,"$(P)$(R)TOOL:V") { + field(DESC,"TOOL coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_TOOL_V") + field(PREC,"5") +} + +record(ai,"$(P)$(R)TOOL:W") { + field(DESC,"TOOL coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_TOOL_W") + field(PREC,"5") +} + +# WORK CS readbacks +record(ai,"$(P)$(R)WORK:X") { + field(DESC,"WORK coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_WORK_X") + field(PREC,"5") +} + +record(ai,"$(P)$(R)WORK:Y") { + field(DESC,"WORK coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_WORK_Y") + field(PREC,"5") +} + +record(ai,"$(P)$(R)WORK:Z") { + field(DESC,"WORK coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_WORK_Z") + field(PREC,"5") +} + +record(ai,"$(P)$(R)WORK:U") { + field(DESC,"WORK coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_WORK_U") + field(PREC,"5") +} + +record(ai,"$(P)$(R)WORK:V") { + field(DESC,"WORK coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_WORK_V") + field(PREC,"5") +} + +record(ai,"$(P)$(R)WORK:W") { + field(DESC,"WORK coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_WORK_W") + field(PREC,"5") +} + +# BASE CS readbacks +record(ai,"$(P)$(R)BASE:X") { + field(DESC,"BASE coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_BASE_X") + field(PREC,"5") +} + +record(ai,"$(P)$(R)BASE:Y") { + field(DESC,"BASE coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_BASE_Y") + field(PREC,"5") +} + +record(ai,"$(P)$(R)BASE:Z") { + field(DESC,"BASE coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_BASE_Z") + field(PREC,"5") +} + +record(ai,"$(P)$(R)BASE:U") { + field(DESC,"BASE coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_BASE_U") + field(PREC,"5") +} + +record(ai,"$(P)$(R)BASE:V") { + field(DESC,"BASE coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_BASE_V") + field(PREC,"5") +} + +record(ai,"$(P)$(R)BASE:W") { + field(DESC,"BASE coordSys def") + field(DTYP,"asynFloat64") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_COORD_SYS_BASE_W") + field(PREC,"5") +} + diff --git a/motorApp/NewportSrc/HXPDriver.cpp b/motorApp/NewportSrc/HXPDriver.cpp index 845919cd..ac5a0be1 100644 --- a/motorApp/NewportSrc/HXPDriver.cpp +++ b/motorApp/NewportSrc/HXPDriver.cpp @@ -65,6 +65,25 @@ HXPController::HXPController(const char *portName, const char *IPAddress, int IP createParam(HXPMoveAllTargetUString, asynParamFloat64, &HXPMoveAllTargetU_); createParam(HXPMoveAllTargetVString, asynParamFloat64, &HXPMoveAllTargetV_); createParam(HXPMoveAllTargetWString, asynParamFloat64, &HXPMoveAllTargetW_); + createParam(HXPCoordSysReadAllString, asynParamInt32, &HXPCoordSysReadAll_); + createParam(HXPCoordSysToolXString, asynParamFloat64, &HXPCoordSysToolX_); + createParam(HXPCoordSysToolYString, asynParamFloat64, &HXPCoordSysToolY_); + createParam(HXPCoordSysToolZString, asynParamFloat64, &HXPCoordSysToolZ_); + createParam(HXPCoordSysToolUString, asynParamFloat64, &HXPCoordSysToolU_); + createParam(HXPCoordSysToolVString, asynParamFloat64, &HXPCoordSysToolV_); + createParam(HXPCoordSysToolWString, asynParamFloat64, &HXPCoordSysToolW_); + createParam(HXPCoordSysWorkXString, asynParamFloat64, &HXPCoordSysWorkX_); + createParam(HXPCoordSysWorkYString, asynParamFloat64, &HXPCoordSysWorkY_); + createParam(HXPCoordSysWorkZString, asynParamFloat64, &HXPCoordSysWorkZ_); + createParam(HXPCoordSysWorkUString, asynParamFloat64, &HXPCoordSysWorkU_); + createParam(HXPCoordSysWorkVString, asynParamFloat64, &HXPCoordSysWorkV_); + createParam(HXPCoordSysWorkWString, asynParamFloat64, &HXPCoordSysWorkW_); + createParam(HXPCoordSysBaseXString, asynParamFloat64, &HXPCoordSysBaseX_); + createParam(HXPCoordSysBaseYString, asynParamFloat64, &HXPCoordSysBaseY_); + createParam(HXPCoordSysBaseZString, asynParamFloat64, &HXPCoordSysBaseZ_); + createParam(HXPCoordSysBaseUString, asynParamFloat64, &HXPCoordSysBaseU_); + createParam(HXPCoordSysBaseVString, asynParamFloat64, &HXPCoordSysBaseV_); + createParam(HXPCoordSysBaseWString, asynParamFloat64, &HXPCoordSysBaseW_); // This socket is used for polling by the controller and all axes pollSocket_ = HXPTCP_ConnectToServer((char *)IPAddress, IPPort, HXP_POLL_TIMEOUT); @@ -166,6 +185,13 @@ asynStatus HXPController::writeInt32(asynUser *pasynUser, epicsInt32 value) moveAll(pAxis); } } + else if (function == HXPCoordSysReadAll_) + { + if (value == 1) + { + readAllCS(pAxis); + } + } else { /* Call base class method */ @@ -203,6 +229,61 @@ int HXPController::moveAll(HXPAxis *pAxis) status = HXPHexapodMoveAbsolute(pAxis->moveSocket_, GROUP, "Work", x, y, z, u, v, w); + postError(pAxis, status); + + /* callParamCallback() is called from postError, so it isn't needed here */ + + return status; +} + +/** + * Reads the Tool, Work, and Base coordinate-system definitions + */ +int HXPController::readAllCS(HXPAxis *pAxis) +{ + int status; + double x, y, z, u, v, w; + + status = HXPHexapodCoordinateSystemGet(pAxis->moveSocket_, GROUP, "Tool", &x, &y , &z, &u, &v, &w); + + setDoubleParam(0, HXPCoordSysToolX_, x); + setDoubleParam(0, HXPCoordSysToolY_, y); + setDoubleParam(0, HXPCoordSysToolZ_, z); + setDoubleParam(0, HXPCoordSysToolU_, u); + setDoubleParam(0, HXPCoordSysToolV_, v); + setDoubleParam(0, HXPCoordSysToolW_, w); + + postError(pAxis, status); + + status = HXPHexapodCoordinateSystemGet(pAxis->moveSocket_, GROUP, "Work", &x, &y , &z, &u, &v, &w); + + setDoubleParam(0, HXPCoordSysWorkX_, x); + setDoubleParam(0, HXPCoordSysWorkY_, y); + setDoubleParam(0, HXPCoordSysWorkZ_, z); + setDoubleParam(0, HXPCoordSysWorkU_, u); + setDoubleParam(0, HXPCoordSysWorkV_, v); + setDoubleParam(0, HXPCoordSysWorkW_, w); + + postError(pAxis, status); + + status = HXPHexapodCoordinateSystemGet(pAxis->moveSocket_, GROUP, "Base", &x, &y , &z, &u, &v, &w); + + setDoubleParam(0, HXPCoordSysBaseX_, x); + setDoubleParam(0, HXPCoordSysBaseY_, y); + setDoubleParam(0, HXPCoordSysBaseZ_, z); + setDoubleParam(0, HXPCoordSysBaseU_, u); + setDoubleParam(0, HXPCoordSysBaseV_, v); + setDoubleParam(0, HXPCoordSysBaseW_, w); + + postError(pAxis, status); + + /* callParamCallback() is called from postError, so it isn't needed here */ + + return status; +} + +void HXPController::postError(HXPAxis *pAxis, int status) +{ /* This is similar to what is done in HXPAxis::move() */ if (status < 0) { @@ -224,17 +305,12 @@ int HXPController::moveAll(HXPAxis *pAxis) /* Clear the error */ setIntegerParam(HXPError_, 0); setStringParam(HXPErrorDesc_, ""); - - /* If there was a way to force the motor record to switch to the move poll rate, - this would be the place to do it. */ } callParamCallbacks(); - - return status; + return; } - // These are the HXPAxis methods /** Creates a new HXPAxis object. diff --git a/motorApp/NewportSrc/HXPDriver.h b/motorApp/NewportSrc/HXPDriver.h index 934d1ad4..1fadecc2 100644 --- a/motorApp/NewportSrc/HXPDriver.h +++ b/motorApp/NewportSrc/HXPDriver.h @@ -23,6 +23,25 @@ USAGE... Motor driver support for the Newport Hexapod controller. #define HXPMoveAllTargetUString "HXP_MOVE_ALL_TARGET_U" #define HXPMoveAllTargetVString "HXP_MOVE_ALL_TARGET_V" #define HXPMoveAllTargetWString "HXP_MOVE_ALL_TARGET_W" +#define HXPCoordSysReadAllString "HXP_COORD_SYS_READ_ALL" +#define HXPCoordSysToolXString "HXP_COORD_SYS_TOOL_X" +#define HXPCoordSysToolYString "HXP_COORD_SYS_TOOL_Y" +#define HXPCoordSysToolZString "HXP_COORD_SYS_TOOL_Z" +#define HXPCoordSysToolUString "HXP_COORD_SYS_TOOL_U" +#define HXPCoordSysToolVString "HXP_COORD_SYS_TOOL_V" +#define HXPCoordSysToolWString "HXP_COORD_SYS_TOOL_W" +#define HXPCoordSysWorkXString "HXP_COORD_SYS_WORK_X" +#define HXPCoordSysWorkYString "HXP_COORD_SYS_WORK_Y" +#define HXPCoordSysWorkZString "HXP_COORD_SYS_WORK_Z" +#define HXPCoordSysWorkUString "HXP_COORD_SYS_WORK_U" +#define HXPCoordSysWorkVString "HXP_COORD_SYS_WORK_V" +#define HXPCoordSysWorkWString "HXP_COORD_SYS_WORK_W" +#define HXPCoordSysBaseXString "HXP_COORD_SYS_BASE_X" +#define HXPCoordSysBaseYString "HXP_COORD_SYS_BASE_Y" +#define HXPCoordSysBaseZString "HXP_COORD_SYS_BASE_Z" +#define HXPCoordSysBaseUString "HXP_COORD_SYS_BASE_U" +#define HXPCoordSysBaseVString "HXP_COORD_SYS_BASE_V" +#define HXPCoordSysBaseWString "HXP_COORD_SYS_BASE_W" class HXPAxis : public asynMotorAxis { @@ -66,6 +85,8 @@ public: /* These are the methods that are new to this class */ int moveAll(HXPAxis* pAxis); + int readAllCS(HXPAxis* pAxis); + void postError(HXPAxis* pAxis, int status); protected: #define FIRST_HXP_PARAM HXPMoveCoordSys_ @@ -80,7 +101,26 @@ protected: int HXPMoveAllTargetU_; int HXPMoveAllTargetV_; int HXPMoveAllTargetW_; - #define LAST_HXP_PARAM HXPMoveAllTargetW_ + int HXPCoordSysReadAll_; + int HXPCoordSysToolX_; + int HXPCoordSysToolY_; + int HXPCoordSysToolZ_; + int HXPCoordSysToolU_; + int HXPCoordSysToolV_; + int HXPCoordSysToolW_; + int HXPCoordSysWorkX_; + int HXPCoordSysWorkY_; + int HXPCoordSysWorkZ_; + int HXPCoordSysWorkU_; + int HXPCoordSysWorkV_; + int HXPCoordSysWorkW_; + int HXPCoordSysBaseX_; + int HXPCoordSysBaseY_; + int HXPCoordSysBaseZ_; + int HXPCoordSysBaseU_; + int HXPCoordSysBaseV_; + int HXPCoordSysBaseW_; + #define LAST_HXP_PARAM HXPCoordSysBaseW_ #define NUM_HXP_PARAMS ((int) (&LAST_HXP_PARAM - &FIRST_HXP_PARAM + 1))