|
|
|
|
@@ -48,7 +48,7 @@ January 2019
|
|
|
|
|
#include "PhytronDriver.h"
|
|
|
|
|
#include <epicsExport.h>
|
|
|
|
|
|
|
|
|
|
#define IDLEPOLL 60
|
|
|
|
|
#define IDLEPOLL 5
|
|
|
|
|
|
|
|
|
|
/** Creates a new PhytronController object.
|
|
|
|
|
* \param[in] portName The name of the asyn port that will be created for this driver
|
|
|
|
|
@@ -56,7 +56,7 @@ January 2019
|
|
|
|
|
* \param[in] numAxes The number of axes that this controller supports
|
|
|
|
|
*/
|
|
|
|
|
PhytronController::PhytronController(const char *portName, const char *PhytronPortName, const char *sel ,
|
|
|
|
|
int encX, int encY)
|
|
|
|
|
int encX, int encY, int ignoreLimitsX, int ignoreLimitsY)
|
|
|
|
|
: SINQController(portName, PhytronPortName,2)
|
|
|
|
|
{
|
|
|
|
|
asynStatus status;
|
|
|
|
|
@@ -82,8 +82,8 @@ PhytronController::PhytronController(const char *portName, const char *PhytronPo
|
|
|
|
|
new PhytronDoseAxis(this, 1, encX);
|
|
|
|
|
new PhytronDoseAxis(this, 2, encY);
|
|
|
|
|
} else {
|
|
|
|
|
new PhytronAxis(this, 1, encX);
|
|
|
|
|
new PhytronAxis(this, 2, encY);
|
|
|
|
|
new PhytronAxis(this, 1, encX, ignoreLimitsX);
|
|
|
|
|
new PhytronAxis(this, 2, encY, ignoreLimitsY);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -92,7 +92,7 @@ PhytronController::PhytronController(const char *portName, const char *PhytronPo
|
|
|
|
|
|
|
|
|
|
PhytronDoseController::PhytronDoseController(const char *portName, const char *PhytronPortName, const char *sel ,
|
|
|
|
|
int encX, int encY)
|
|
|
|
|
: PhytronController(portName, PhytronPortName, sel, encX, encY)
|
|
|
|
|
: PhytronController(portName, PhytronPortName, sel, encX, encY, 0, 0)
|
|
|
|
|
{
|
|
|
|
|
new PhytronDoseAxis(this, 1, encX);
|
|
|
|
|
new PhytronDoseAxis(this, 2, encY);
|
|
|
|
|
@@ -106,9 +106,9 @@ PhytronDoseController::PhytronDoseController(const char *portName, const char *P
|
|
|
|
|
* \param[in] numAxes The number of axes that this controller supports
|
|
|
|
|
*/
|
|
|
|
|
extern "C" int PhytronCreateController(const char *portName, const char *PhytronPortName, const char *selector,
|
|
|
|
|
int encX, int encY)
|
|
|
|
|
int encX, int encY, int ignoreLimitsX, int ignoreLimitsY)
|
|
|
|
|
{
|
|
|
|
|
new PhytronController(portName, PhytronPortName,selector, encX, encY);
|
|
|
|
|
new PhytronController(portName, PhytronPortName,selector, encX, encY, ignoreLimitsX, ignoreLimitsY);
|
|
|
|
|
return(asynSuccess);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -178,10 +178,10 @@ PhytronDoseAxis* PhytronDoseController::getAxis(int axisNo)
|
|
|
|
|
|
|
|
|
|
asynStatus PhytronController::transactController(int axisNo,char command[COMLEN], char reply[COMLEN])
|
|
|
|
|
{
|
|
|
|
|
asynStatus status;
|
|
|
|
|
size_t in, out;
|
|
|
|
|
int reason;
|
|
|
|
|
char myReply[COMLEN+10], myCommand[COMLEN+10], *pPtr;
|
|
|
|
|
asynStatus status = asynSuccess;
|
|
|
|
|
size_t in = 0, out = 0;
|
|
|
|
|
int reason = 0;
|
|
|
|
|
char myReply[COMLEN+10] = {0}, myCommand[COMLEN+10] = {0}, *pPtr = {0};
|
|
|
|
|
SINQAxis *axis = getAxis(axisNo);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -237,11 +237,12 @@ asynStatus PhytronController::transactController(int axisNo,char command[COMLEN]
|
|
|
|
|
*
|
|
|
|
|
* Initializes register numbers, etc.
|
|
|
|
|
*/
|
|
|
|
|
PhytronAxis::PhytronAxis(PhytronController *pC, int axisNo, int enc)
|
|
|
|
|
PhytronAxis::PhytronAxis(PhytronController *pC, int axisNo, int enc, int ignoreLimits)
|
|
|
|
|
: SINQAxis(pC, axisNo),
|
|
|
|
|
pC_(pC)
|
|
|
|
|
{
|
|
|
|
|
encoder = enc;
|
|
|
|
|
ignore_limits = ignoreLimits;
|
|
|
|
|
if(axisNo == 1){
|
|
|
|
|
phytronChar = 'X';
|
|
|
|
|
} else {
|
|
|
|
|
@@ -436,8 +437,9 @@ asynStatus PhytronAxis::setPosition(double position)
|
|
|
|
|
|
|
|
|
|
errlogPrintf("PhytronAxis::setPosition called with %lf\n", position);
|
|
|
|
|
|
|
|
|
|
sprintf(command, "%s%cP22S%f", pC_->selector,phytronChar, position/1000.);
|
|
|
|
|
status = pC_->transactController(axisNo_,command,reply);
|
|
|
|
|
// writing encoder register is wrong
|
|
|
|
|
//sprintf(command, "%s%cP22S%f", pC_->selector,phytronChar, position/1000.);
|
|
|
|
|
//status = pC_->transactController(axisNo_,command,reply);
|
|
|
|
|
sprintf(command, "%s%cP20S%f", pC_->selector,phytronChar, position/1000.);
|
|
|
|
|
status = pC_->transactController(axisNo_,command,reply);
|
|
|
|
|
next_poll = -1;
|
|
|
|
|
@@ -467,8 +469,6 @@ asynStatus PhytronAxis::poll(bool *moving)
|
|
|
|
|
{
|
|
|
|
|
asynStatus comStatus = asynSuccess;
|
|
|
|
|
char command[COMLEN], reply[COMLEN];
|
|
|
|
|
double lowlim;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// protect against excessive polling
|
|
|
|
|
if(time(NULL) < next_poll){
|
|
|
|
|
@@ -538,13 +538,7 @@ asynStatus PhytronAxis::poll(bool *moving)
|
|
|
|
|
|
|
|
|
|
if(!*moving) {
|
|
|
|
|
if(homing){
|
|
|
|
|
if(homing_direction) {
|
|
|
|
|
pC_->getDoubleParam(axisNo_,pC_->motorHighLimit_,&lowlim);
|
|
|
|
|
} else {
|
|
|
|
|
pC_->getDoubleParam(axisNo_,pC_->motorLowLimit_,&lowlim);
|
|
|
|
|
}
|
|
|
|
|
setPosition(lowlim);
|
|
|
|
|
setIntegerParam(pC_->motorStatusAtHome_, true);
|
|
|
|
|
setIntegerParam(pC_->motorStatusAtHome_, true);
|
|
|
|
|
} else {
|
|
|
|
|
/*
|
|
|
|
|
check limits and errors, upper
|
|
|
|
|
@@ -556,7 +550,7 @@ asynStatus PhytronAxis::poll(bool *moving)
|
|
|
|
|
updateMsgTxtFromDriver("No connection to phytron controller");
|
|
|
|
|
goto skip;
|
|
|
|
|
}
|
|
|
|
|
if(strstr(reply,"ACKE") != NULL){
|
|
|
|
|
if(strstr(reply,"ACKE") != NULL && ignore_limits == 0){
|
|
|
|
|
setIntegerParam(pC_->motorStatusHighLimit_, true);
|
|
|
|
|
updateMsgTxtFromDriver("Hit High Limit");
|
|
|
|
|
comStatus = asynError;
|
|
|
|
|
@@ -575,7 +569,7 @@ asynStatus PhytronAxis::poll(bool *moving)
|
|
|
|
|
updateMsgTxtFromDriver("No connection to phytron controller");
|
|
|
|
|
goto skip;
|
|
|
|
|
}
|
|
|
|
|
if(strstr(reply,"ACKE") != NULL){
|
|
|
|
|
if(strstr(reply,"ACKE") != NULL && ignore_limits == 0){
|
|
|
|
|
setIntegerParam(pC_->motorStatusLowLimit_, true);
|
|
|
|
|
updateMsgTxtFromDriver("Low Limit Hit");
|
|
|
|
|
comStatus = asynError;
|
|
|
|
|
@@ -616,7 +610,7 @@ asynStatus PhytronAxis::poll(bool *moving)
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
PhytronDoseAxis::PhytronDoseAxis(PhytronController *pC, int axisNo, int enc)
|
|
|
|
|
: PhytronAxis(pC, axisNo, enc)
|
|
|
|
|
: PhytronAxis(pC, axisNo, enc, 0)
|
|
|
|
|
{
|
|
|
|
|
if(axisNo == 1){
|
|
|
|
|
doseChar = '3';
|
|
|
|
|
@@ -720,15 +714,19 @@ static const iocshArg PhytronCreateControllerArg1 = {"Phytron port name", iocshA
|
|
|
|
|
static const iocshArg PhytronCreateControllerArg2 = {"Phytron Selector", iocshArgString};
|
|
|
|
|
static const iocshArg PhytronCreateControllerArg3 = {"EncoderX", iocshArgInt};
|
|
|
|
|
static const iocshArg PhytronCreateControllerArg4 = {"EncoderY", iocshArgInt};
|
|
|
|
|
static const iocshArg PhytronCreateControllerArg5 = {"IgnoreLimitsX", iocshArgInt};
|
|
|
|
|
static const iocshArg PhytronCreateControllerArg6 = {"IgnoreLimitsY", iocshArgInt};
|
|
|
|
|
static const iocshArg * const PhytronCreateControllerArgs[] = {&PhytronCreateControllerArg0,
|
|
|
|
|
&PhytronCreateControllerArg1,
|
|
|
|
|
&PhytronCreateControllerArg2,
|
|
|
|
|
&PhytronCreateControllerArg3,
|
|
|
|
|
&PhytronCreateControllerArg4};
|
|
|
|
|
static const iocshFuncDef PhytronCreateControllerDef = {"PhytronCreateController", 5, PhytronCreateControllerArgs};
|
|
|
|
|
&PhytronCreateControllerArg2,
|
|
|
|
|
&PhytronCreateControllerArg3,
|
|
|
|
|
&PhytronCreateControllerArg4,
|
|
|
|
|
&PhytronCreateControllerArg5,
|
|
|
|
|
&PhytronCreateControllerArg6};
|
|
|
|
|
static const iocshFuncDef PhytronCreateControllerDef = {"PhytronCreateController", 7, PhytronCreateControllerArgs};
|
|
|
|
|
static void PhytronCreateContollerCallFunc(const iocshArgBuf *args)
|
|
|
|
|
{
|
|
|
|
|
PhytronCreateController(args[0].sval, args[1].sval, args[2].sval, args[3].ival,args[4].ival);
|
|
|
|
|
PhytronCreateController(args[0].sval, args[1].sval, args[2].sval, args[3].ival,args[4].ival, args[5].ival, args[6].ival);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const iocshArg PhytronDoseCreateControllerArg0 = {"Port name", iocshArgString};
|
|
|
|
|
|