Removed exit(-1) from init

When the initialization fails, the motor will now try again during each
poll.
This commit is contained in:
2025-05-23 11:51:33 +02:00
parent 738780f897
commit 18bc3dfc5f
4 changed files with 200 additions and 73 deletions

View File

@@ -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 */