Removed exit(-1) from init
When the initialization fails, the motor will now try again during each poll.
This commit is contained in:
@@ -31,6 +31,23 @@ void adjustResponseForPrint(char *dst, const char *src, size_t buf_length) {
|
||||
}
|
||||
}
|
||||
|
||||
struct turboPmacControllerImpl {
|
||||
|
||||
// Timeout for the communication process in seconds
|
||||
double comTimeout;
|
||||
|
||||
char lastResponse[sinqController::MAXBUF_];
|
||||
|
||||
// User for writing int32 values to the port driver.
|
||||
asynUser *pasynInt32SyncIOipPort;
|
||||
|
||||
// Indices of additional PVs
|
||||
int rereadEncoderPosition;
|
||||
int readConfig;
|
||||
int flushHardware;
|
||||
};
|
||||
#define NUM_turboPmac_DRIVER_PARAMS 3
|
||||
|
||||
turboPmacController::turboPmacController(const char *portName,
|
||||
const char *ipPortConfigName,
|
||||
int numAxes, double movingPollPeriod,
|
||||
@@ -47,12 +64,16 @@ turboPmacController::turboPmacController(const char *portName,
|
||||
|
||||
{
|
||||
|
||||
// The paramLib indices are populated with the calls to createParam
|
||||
pTurboPmacC_ =
|
||||
std::make_unique<turboPmacControllerImpl>((turboPmacControllerImpl){
|
||||
.comTimeout = comTimeout,
|
||||
.lastResponse = {0},
|
||||
});
|
||||
|
||||
// Initialization of local variables
|
||||
asynStatus status = asynSuccess;
|
||||
|
||||
// Initialization of all member variables
|
||||
comTimeout_ = comTimeout;
|
||||
|
||||
// Maximum allowed number of subsequent timeouts before the user is
|
||||
// informed.
|
||||
setMaxSubsequentTimeouts(10);
|
||||
@@ -61,7 +82,7 @@ turboPmacController::turboPmacController(const char *portName,
|
||||
// Create additional parameter library entries
|
||||
|
||||
status = createParam("REREAD_ENCODER_POSITION", asynParamInt32,
|
||||
&rereadEncoderPosition_);
|
||||
&pTurboPmacC_->rereadEncoderPosition);
|
||||
if (status != asynSuccess) {
|
||||
asynPrint(this->pasynUser(), ASYN_TRACE_ERROR,
|
||||
"Controller \"%s\" => %s, line %d\nFATAL ERROR (creating a "
|
||||
@@ -71,7 +92,8 @@ turboPmacController::turboPmacController(const char *portName,
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
status = createParam("READ_CONFIG", asynParamInt32, &readConfig_);
|
||||
status =
|
||||
createParam("READ_CONFIG", asynParamInt32, &pTurboPmacC_->readConfig);
|
||||
if (status != asynSuccess) {
|
||||
asynPrint(this->pasynUser(), ASYN_TRACE_ERROR,
|
||||
"Controller \"%s\" => %s, line %d\nFATAL ERROR (creating a "
|
||||
@@ -81,7 +103,8 @@ turboPmacController::turboPmacController(const char *portName,
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
status = createParam("FLUSH_HARDWARE", asynParamInt32, &flushHardware_);
|
||||
status = createParam("FLUSH_HARDWARE", asynParamInt32,
|
||||
&pTurboPmacC_->flushHardware);
|
||||
if (status != asynSuccess) {
|
||||
asynPrint(this->pasynUser(), ASYN_TRACE_ERROR,
|
||||
"Controller \"%s\" => %s, line %d\nFATAL ERROR (creating a "
|
||||
@@ -131,13 +154,15 @@ turboPmacController::turboPmacController(const char *portName,
|
||||
We try to connect to the port via the port name provided by the constructor.
|
||||
If this fails, the function is terminated via exit.
|
||||
*/
|
||||
pasynInt32SyncIO->connect(ipPortConfigName, 0, &pasynInt32SyncIOipPort_,
|
||||
NULL);
|
||||
if (status != asynSuccess || pasynInt32SyncIOipPort_ == nullptr) {
|
||||
pasynInt32SyncIO->connect(ipPortConfigName, 0,
|
||||
&pTurboPmacC_->pasynInt32SyncIOipPort, NULL);
|
||||
if (status != asynSuccess ||
|
||||
pTurboPmacC_->pasynInt32SyncIOipPort == nullptr) {
|
||||
errlogPrintf("Controller \"%s\" => %s, line %d:\nFATAL ERROR (cannot "
|
||||
"connect to MCU controller).\n"
|
||||
"Terminating IOC",
|
||||
portName, __PRETTY_FUNCTION__, __LINE__);
|
||||
pasynOctetSyncIO->disconnect(pasynOctetSyncIOipPort());
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
@@ -215,7 +240,7 @@ asynStatus turboPmacController::writeRead(int axisNo, const char *command,
|
||||
*/
|
||||
status = pasynOctetSyncIO->writeRead(
|
||||
pasynOctetSyncIOipPort(), command, commandLength, response, MAXBUF_,
|
||||
comTimeout_, &nbytesOut, &nbytesIn, &eomReason);
|
||||
pTurboPmacC_->comTimeout, &nbytesOut, &nbytesIn, &eomReason);
|
||||
|
||||
msgPrintControlKey comKey =
|
||||
msgPrintControlKey(portName, axisNo, __PRETTY_FUNCTION__, __LINE__);
|
||||
@@ -245,7 +270,8 @@ asynStatus turboPmacController::writeRead(int axisNo, const char *command,
|
||||
|
||||
status = pasynOctetSyncIO->writeRead(
|
||||
pasynOctetSyncIOipPort(), command, commandLength, response,
|
||||
MAXBUF_, comTimeout_, &nbytesOut, &nbytesIn, &eomReason);
|
||||
MAXBUF_, pTurboPmacC_->comTimeout, &nbytesOut, &nbytesIn,
|
||||
&eomReason);
|
||||
if (status != asynTimeout) {
|
||||
asynPrint(this->pasynUser(), ASYN_TRACE_ERROR,
|
||||
"Controller \"%s\", axis %d => %s, line "
|
||||
@@ -267,6 +293,18 @@ asynStatus turboPmacController::writeRead(int axisNo, const char *command,
|
||||
getMsgPrintControl().resetCount(comKey, pasynUser());
|
||||
}
|
||||
|
||||
if (status != asynSuccess) {
|
||||
/*
|
||||
Since the communication failed, there is the possibility that the
|
||||
controller is not connected at all to the network. In that case, we
|
||||
cannot be sure that the information read out in the init method of the
|
||||
axis is still up-to-date the next time we get a connection. Therefore,
|
||||
an info flag is set which the axis object can use at the start of its
|
||||
poll method to try to initialize itself.
|
||||
*/
|
||||
axis->setNeedInit(true);
|
||||
}
|
||||
|
||||
if (timeoutStatus == asynError) {
|
||||
status = asynError;
|
||||
}
|
||||
@@ -422,13 +460,13 @@ asynStatus turboPmacController::doFlushHardware() {
|
||||
constant defined in pmacAsynIPPort.c. This reason is then used within
|
||||
the write method of pasynInt32SyncIO to select the flush function.
|
||||
*/
|
||||
int temp = pasynInt32SyncIOipPort_->reason;
|
||||
pasynInt32SyncIOipPort_->reason = FLUSH_HARDWARE;
|
||||
int temp = pTurboPmacC_->pasynInt32SyncIOipPort->reason;
|
||||
pTurboPmacC_->pasynInt32SyncIOipPort->reason = FLUSH_HARDWARE;
|
||||
asynStatus status = (asynStatus)pasynInt32SyncIO->write(
|
||||
pasynInt32SyncIOipPort_, 1, comTimeout_);
|
||||
pTurboPmacC_->pasynInt32SyncIOipPort, 1, pTurboPmacC_->comTimeout);
|
||||
|
||||
// Reset the status afterwards
|
||||
pasynInt32SyncIOipPort_->reason = temp;
|
||||
pTurboPmacC_->pasynInt32SyncIOipPort->reason = temp;
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -441,11 +479,11 @@ asynStatus turboPmacController::writeInt32(asynUser *pasynUser,
|
||||
turboPmacAxis *axis = getTurboPmacAxis(pasynUser);
|
||||
|
||||
// Handle custom PVs
|
||||
if (function == rereadEncoderPosition_) {
|
||||
if (function == rereadEncoderPosition()) {
|
||||
return axis->rereadEncoder();
|
||||
} else if (function == readConfig_) {
|
||||
} else if (function == readConfig()) {
|
||||
return axis->init();
|
||||
} else if (function == flushHardware_) {
|
||||
} else if (function == flushHardware()) {
|
||||
return doFlushHardware();
|
||||
} else {
|
||||
return sinqController::writeInt32(pasynUser, value);
|
||||
@@ -463,6 +501,16 @@ asynStatus turboPmacController::couldNotParseResponse(const char *command,
|
||||
command, modifiedResponse, axisNo, functionName, lineNumber);
|
||||
}
|
||||
|
||||
int turboPmacController::rereadEncoderPosition() {
|
||||
return pTurboPmacC_->rereadEncoderPosition;
|
||||
}
|
||||
int turboPmacController::readConfig() { return pTurboPmacC_->readConfig; }
|
||||
int turboPmacController::flushHardware() { return pTurboPmacC_->flushHardware; }
|
||||
|
||||
asynUser *turboPmacController::pasynInt32SyncIOipPort() {
|
||||
return pTurboPmacC_->pasynInt32SyncIOipPort;
|
||||
}
|
||||
|
||||
/*************************************************************************************/
|
||||
/** The following functions are C-wrappers, and can be called directly from
|
||||
* iocsh */
|
||||
|
||||
Reference in New Issue
Block a user