Added reading of coordinate-system definitions to Newport HXP support.

This commit is contained in:
kmpeters
2013-06-18 19:16:57 +00:00
parent 85511023e9
commit fbe9fdea42
3 changed files with 280 additions and 7 deletions
+157
View File
@@ -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")
}
+82 -6
View File
@@ -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.
+41 -1
View File
@@ -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))