diff --git a/RELEASE.txt b/RELEASE.txt index b886cd246..f2e6ffb0e 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -20,7 +20,7 @@ This document describes the differences between v7.0.1 and v7.0.0 ================= - Receiver: + Receiver -------- @@ -35,6 +35,22 @@ This document describes the differences between v7.0.1 and v7.0.0 + Client + ------ + + + * Detector Server Version from previous Releases + Hostname command would hang with 7.0.0 client if the detector server + was from a previous release (eg. 6.1.2). In this case, the user cannot + get the detector server version. + + Fixed that the hostname command will throw an exception about + incompatible server with its version in the message. Now, the user can + get the version number without having to telnet or ssh to the detector. + With this info, one can then update to matching client for that server + and start the detector updation process. + + 2 On-board Detector Server Compatibility ========================================== diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 1efd3a9fc..c2b27c613 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -73,8 +73,8 @@ void Module::setHostname(const std::string &hostname, auto client = DetectorSocket(shm()->hostname, shm()->controlPort); client.close(); try { - initialDetectorServerChecks(); checkDetectorVersionCompatibility(); + initialDetectorServerChecks(); LOG(logINFO) << "Module Version Compatibility - Success"; } catch (const RuntimeError &e) { if (!initialChecks) { @@ -93,9 +93,28 @@ int64_t Module::getFirmwareVersion() const { } std::string Module::getControlServerLongVersion() const { - char retval[MAX_STR_LENGTH]{}; - sendToDetector(F_GET_SERVER_VERSION, nullptr, retval); - return retval; + try { + char retval[MAX_STR_LENGTH]{}; + sendToDetector(F_GET_SERVER_VERSION, nullptr, retval); + return retval; + } + // throw with old server version (sends 8 bytes) + catch (RuntimeError &e) { + std::string emsg = std::string(e.what()); + if (emsg.find(F_GET_SERVER_VERSION) && emsg.find("8 bytes")) { + throwDeprecatedServerVersion(); + } + throw; + } +} + +void Module::throwDeprecatedServerVersion() const { + uint64_t res = sendToDetectorStop(F_GET_SERVER_VERSION); + std::cout << std::endl; + std::ostringstream os; + os << "Detector Server (Control) version (0x" << std::hex << res + << ") is incompatible with this client. Please update detector server!"; + throw RuntimeError(os.str()); } std::string Module::getStopServerLongVersion() const { diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index 58c6de954..37cd00a08 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -92,6 +92,7 @@ class Module : public virtual slsDetectorDefs { int64_t getFirmwareVersion() const; std::string getControlServerLongVersion() const; std::string getStopServerLongVersion() const; + void throwDeprecatedServerVersion() const; std::string getDetectorServerVersion() const; std::string getHardwareVersion() const; std::string getKernelVersion() const;