diff --git a/slsDetectorSoftware/src/Receiver.cpp b/slsDetectorSoftware/src/Receiver.cpp index 7cdc0cfbc..38505d3d4 100755 --- a/slsDetectorSoftware/src/Receiver.cpp +++ b/slsDetectorSoftware/src/Receiver.cpp @@ -1,8 +1,98 @@ #include "Receiver.h" +#include "ClientSocket.h" #include "string_utils.h" +#include "versionAPI.h" namespace sls { +void Receiver::sendToReceiver(int fnum, const void *args, size_t args_size, + void *retval, size_t retval_size) { + static_cast(*this).sendToReceiver( + fnum, args, args_size, retval, retval_size); +} + +void Receiver::sendToReceiver(int fnum, const void *args, size_t args_size, + void *retval, size_t retval_size) const { + auto receiver = ReceiverSocket(shm()->hostname, shm()->tcpPort); + receiver.sendCommandThenRead(fnum, args, args_size, retval, retval_size); + receiver.close(); +} + +template +void Receiver::sendToReceiver(int fnum, const Arg &args, Ret &retval) { + sendToReceiver(fnum, &args, sizeof(args), &retval, sizeof(retval)); +} + +template +void Receiver::sendToReceiver(int fnum, const Arg &args, Ret &retval) const { + sendToReceiver(fnum, &args, sizeof(args), &retval, sizeof(retval)); +} + +template +void Receiver::sendToReceiver(int fnum, const Arg &args, std::nullptr_t) { + sendToReceiver(fnum, &args, sizeof(args), nullptr, 0); +} + +template +void Receiver::sendToReceiver(int fnum, const Arg &args, + std::nullptr_t) const { + sendToReceiver(fnum, &args, sizeof(args), nullptr, 0); +} + +template +void Receiver::sendToReceiver(int fnum, std::nullptr_t, Ret &retval) { + sendToReceiver(fnum, nullptr, 0, &retval, sizeof(retval)); +} + +template +void Receiver::sendToReceiver(int fnum, std::nullptr_t, Ret &retval) const { + sendToReceiver(fnum, nullptr, 0, &retval, sizeof(retval)); +} + +template +Ret Receiver::sendToReceiver(int fnum){ + LOG(logDEBUG1) << "Sending: [" + << getFunctionNameFromEnum(static_cast(fnum)) + << ", nullptr, 0, " << typeid(Ret).name() << ", " << sizeof(Ret) << "]"; + Ret retval{}; + sendToReceiver(fnum, nullptr, 0, &retval, sizeof(retval)); + LOG(logDEBUG1) << "Got back: " << retval; + return retval; +} + +template +Ret Receiver::sendToReceiver(int fnum) const{ + LOG(logDEBUG1) << "Sending: [" + << getFunctionNameFromEnum(static_cast(fnum)) + << ", nullptr, 0, " << typeid(Ret).name() << ", " << sizeof(Ret) << "]"; + Ret retval{}; + sendToReceiver(fnum, nullptr, 0, &retval, sizeof(retval)); + LOG(logDEBUG1) << "Got back: " << retval; + return retval; +} + +template +Ret Receiver::sendToReceiver(int fnum, const Arg &args){ + LOG(logDEBUG1) << "Sending: [" + << getFunctionNameFromEnum(static_cast(fnum)) + << ", " << args << ", " << sizeof(args) << ", " << typeid(Ret).name() << ", " << sizeof(Ret) << "]"; + Ret retval{}; + sendToReceiver(fnum, &args, sizeof(args), &retval, sizeof(retval)); + LOG(logDEBUG1) << "Got back: " << retval; + return retval; +} + +template +Ret Receiver::sendToReceiver(int fnum, const Arg &args) const{ + LOG(logDEBUG1) << "Sending: [" + << getFunctionNameFromEnum(static_cast(fnum)) + << ", " << args << ", " << sizeof(args) << ", " << typeid(Ret).name() << ", " << sizeof(Ret) << "]"; + Ret retval{}; + sendToReceiver(fnum, &args, sizeof(args), &retval, sizeof(retval)); + LOG(logDEBUG1) << "Got back: " << retval; + return retval; +} + // create shm Receiver::Receiver(int detector_id, int module_id, int receiver_id, @@ -78,13 +168,6 @@ void Receiver::setHostname(const std::string &hostname) { configure(); } -void Receiver::configure() { - shm()->valid = false; - LOG(logINFOBLUE) << receiverId << " configured!"; - //checkReceiverVersionCompatibility(); - shm()->valid = true; -} - int Receiver::getTCPPort() const { return shm()->tcpPort; } @@ -100,4 +183,19 @@ void Receiver::setTCPPort(const int port) { } } +void Receiver::configure() { + shm()->valid = false; + LOG(logINFOBLUE) << receiverId << " configured!"; + checkVersionCompatibility(); + shm()->valid = true; +} + +void Receiver::checkVersionCompatibility() { + int64_t arg = APIRECEIVER; + LOG(logDEBUG1) + << "Checking version compatibility with receiver with value " + << std::hex << arg << std::dec; + sendToReceiver(F_RECEIVER_CHECK_VERSION, arg, nullptr); +} + } // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/src/Receiver.h b/slsDetectorSoftware/src/Receiver.h index 17ff9d404..b98617bc4 100755 --- a/slsDetectorSoftware/src/Receiver.h +++ b/slsDetectorSoftware/src/Receiver.h @@ -47,11 +47,57 @@ namespace sls { void freeSharedMemory(); std::string getHostname() const; void setHostname(const std::string &hostname); - void configure(); int getTCPPort() const; void setTCPPort(const int port); + void configure(); + void checkVersionCompatibility(); private: + /** + * Send function parameters to receiver + * @param fnum function enum + * @param args argument pointer + * @param args_size size of argument + * @param retval return pointers + * @param retval_size size of return value + */ + void sendToReceiver(int fnum, const void *args, size_t args_size, + void *retval, size_t retval_size); + + void sendToReceiver(int fnum, const void *args, size_t args_size, + void *retval, size_t retval_size) const; + + template + void sendToReceiver(int fnum, const Arg &args, Ret &retval); + + template + void sendToReceiver(int fnum, const Arg &args, Ret &retval) const; + + template + void sendToReceiver(int fnum, const Arg &args, std::nullptr_t); + + template + void sendToReceiver(int fnum, const Arg &args, std::nullptr_t) const; + + template + void sendToReceiver(int fnum, std::nullptr_t, Ret &retval); + + template + void sendToReceiver(int fnum, std::nullptr_t, Ret &retval) const; + + template + Ret sendToReceiver(int fnum); + + template + Ret sendToReceiver(int fnum) const; + + template + Ret sendToReceiver(int fnum, const Arg &args); + + template + Ret sendToReceiver(int fnum, const Arg &args) const; + + const int receiverId{0}; const int moduleId{0}; mutable sls::SharedMemory shm{0, 0, 0, true};