diff --git a/Makefile b/Makefile index 7dd9222..7889989 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ REQUIRED+=sinqMotor motorBase_VERSION=7.2.2 # Specify the version of sinqMotor we want to build against -sinqMotor_VERSION=mathis_s +sinqMotor_VERSION=0.14.0 # These headers allow to depend on this library for derived drivers. HEADERS += src/masterMacsAxis.h diff --git a/src/masterMacsController.cpp b/src/masterMacsController.cpp index ba49126..904f38e 100644 --- a/src/masterMacsController.cpp +++ b/src/masterMacsController.cpp @@ -305,12 +305,21 @@ asynStatus masterMacsController::parseResponse( bool responseValid = false; int responseStart = 0; + asynStatus status = asynSuccess; + int prevConnected = 0; char printableCommand[MAXBUF_] = {0}; char printableResponse[MAXBUF_] = {0}; msgPrintControlKey parseKey = msgPrintControlKey(portName, axisNo, __PRETTY_FUNCTION__, __LINE__); + // Was the motor previously connected? + status = getIntegerParam(axisNo, motorConnected(), &prevConnected); + if (status != asynSuccess) { + return paramLibAccessFailed(status, "motorConnected", axisNo, + __PRETTY_FUNCTION__, __LINE__); + } + // We don't use strlen here since the C string terminator 0x00 // occurs in the middle of the char array. for (uint32_t i = 0; i < MAXBUF_; i++) { @@ -319,20 +328,75 @@ asynStatus masterMacsController::parseResponse( } else if (fullResponse[i] == '=') { *valueStart = i + 1; } else if (fullResponse[i] == '\x06') { + // ACK *valueStop = i; responseValid = true; - break; - } else if (fullResponse[i] == '\x15') { - // NAK - snprintf(drvMessageText, MAXBUF_, "Communication failed."); - if (msgPrintControl_.shouldBePrinted(parseKey, true, - pasynUserSelf)) { + // Motor wasn't connected before -> Update the paramLib entry and PV + // to show it is now connected. + if (prevConnected == 0) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "Controller \"%s\", axis %d => %s, line " - "%d:\nCommunication failed.%s\n", - portName, axisNo, __PRETTY_FUNCTION__, __LINE__, - msgPrintControl_.getSuffix()); + "%d:\nAxis connection status has changed to " + "connected.\n", + portName, axisNo, __PRETTY_FUNCTION__, __LINE__); + + masterMacsAxis *axis = getMasterMacsAxis(axisNo); + if (axis == nullptr) { + return asynError; + } + status = axis->setIntegerParam(motorConnected(), 1); + if (status != asynSuccess) { + return paramLibAccessFailed(status, "motorConnected", + axisNo, __PRETTY_FUNCTION__, + __LINE__); + } + status = callParamCallbacks(); + if (status != asynSuccess) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "Controller \"%s\", axis %d => %s, line " + "%d:\nCould not update parameter library\n", + portName, axisNo, __PRETTY_FUNCTION__, __LINE__); + return status; + } + } + + break; + } else if (fullResponse[i] == '\x15') { + /* + NAK + This indicates that the axis is not connected. This is not an error! + */ + snprintf(drvMessageText, MAXBUF_, "Axis not connected."); + + // Motor was connected before -> Update the paramLib entry and PV + // to show it is now disconnected. + if (prevConnected == 1) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "Controller \"%s\", axis %d => %s, line " + "%d:\nAxis connection status has changed to " + "disconnected.\n", + portName, axisNo, __PRETTY_FUNCTION__, __LINE__); + + masterMacsAxis *axis = getMasterMacsAxis(axisNo); + if (axis == nullptr) { + return asynError; + } + status = axis->setIntegerParam(motorConnected(), 0); + if (status != asynSuccess) { + return paramLibAccessFailed(status, "motorConnected", + axisNo, __PRETTY_FUNCTION__, + __LINE__); + } + status = callParamCallbacks(); + if (status != asynSuccess) { + asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, + "Controller \"%s\", axis %d => %s, line " + "%d:\nCould not update parameter library\n", + portName, axisNo, __PRETTY_FUNCTION__, __LINE__); + return status; + } } break; } else if (fullResponse[i] == '\x18') {