diff --git a/slsDetectorServers/matterhornServer/include/BaseMatterhornServer.h b/slsDetectorServers/matterhornServer/include/BaseMatterhornServer.h index 9667e388d..3e038a7f4 100644 --- a/slsDetectorServers/matterhornServer/include/BaseMatterhornServer.h +++ b/slsDetectorServers/matterhornServer/include/BaseMatterhornServer.h @@ -104,6 +104,9 @@ class BaseMatterhornServer void setupDetector(); private: + const DerivedServer *getDerived() const { + return static_cast(this); + } static std::string getMatterhornServerVersion(); static constexpr uint8_t numUDPInterfaces = @@ -171,7 +174,7 @@ template ProcessedResult BaseMatterhornServer::initial_checks(ServerInterface &socket) { - return static_cast(this)->initial_checks(socket); + return getDerived()->initial_checks(socket); } template @@ -396,15 +399,14 @@ ProcessedResult BaseMatterhornServer::get_counter_mask( template ProcessedResult BaseMatterhornServer::set_source_udp_mac( ServerInterface &socket) { - return static_cast(this)->set_source_udp_mac(socket); + return getDerived()->set_source_udp_mac(socket); } template ProcessedResult BaseMatterhornServer::set_module_position_and_update_srcudpmac( ServerInterface &socket) { - return static_cast(this) - ->set_module_position_and_update_srcudpmac(socket); + return getDerived()->set_module_position_and_update_srcudpmac(socket); } } // namespace sls \ No newline at end of file diff --git a/slsDetectorServers/matterhornServer/include/SPICommunication.h b/slsDetectorServers/matterhornServer/include/SPICommunication.h index 0f68a63e1..b52db7b06 100644 --- a/slsDetectorServers/matterhornServer/include/SPICommunication.h +++ b/slsDetectorServers/matterhornServer/include/SPICommunication.h @@ -25,11 +25,16 @@ template class SPICommunication { const std::vector &data); void open_spi(); + + private: + const DerivedSPIModel *getDerived() const { + return static_cast(this); + } }; template void SPICommunication::open_spi() { - static_cast(this)->open_spi(); + getDerived()->open_spi(); } template @@ -64,14 +69,13 @@ void SPICommunication::SPIwrite( spi_reg.spi_register_id)); } - static_cast(this)->spi_write( - chip_id, spi_reg.spi_register_id, data); + getDerived()->spi_write(chip_id, spi_reg.spi_register_id, data); - static_cast(this)->spi_write( - chip_id, SPIRegisters::SPI_REG_ExtraClocks.spi_register_id, - std::vector{ - std::byte{0x00}}); // extra clock trigger to actually load the - // new value into the register + getDerived()->spi_write(chip_id, + SPIRegisters::SPI_REG_ExtraClocks.spi_register_id, + std::vector{std::byte{ + 0x00}}); // extra clock trigger to actually load + // the new value into the register } /** diff --git a/slsDetectorServers/slsDetectorServer_cpp/include/DetectorServer.h b/slsDetectorServers/slsDetectorServer_cpp/include/DetectorServer.h index 3a73dc01b..faeaa9a5e 100644 --- a/slsDetectorServers/slsDetectorServer_cpp/include/DetectorServer.h +++ b/slsDetectorServers/slsDetectorServer_cpp/include/DetectorServer.h @@ -83,6 +83,11 @@ template class DetectorServer { /// @brief creates and maps shared memory void createSharedMemory(); + /// @brief get derived class + const DerivedDetectorServer *getDerived() const { + return static_cast(this); + } + ProcessedResult processFunction(const detFuncs function_id, ServerInterface &socket); @@ -145,21 +150,17 @@ ProcessedResult DetectorServer::processFunction( switch (function_id) { case detFuncs::F_GET_SERVER_VERSION: - return static_cast(this)->get_version(socket); + return getDerived()->get_version(socket); case detFuncs::F_GET_DETECTOR_TYPE: - return static_cast(this)->get_detector_type( - socket); + return getDerived()->get_detector_type(socket); case detFuncs::F_INITIAL_CHECKS: - return static_cast(this)->initial_checks( - socket); + return getDerived()->initial_checks(socket); case detFuncs::F_GET_NUM_INTERFACES: - return static_cast(this) - ->get_num_udp_interfaces(socket); + return getDerived()->get_num_udp_interfaces(socket); case detFuncs::F_GET_UPDATE_MODE: return get_update_mode(socket); case detFuncs::F_SET_SOURCE_UDP_MAC: - return static_cast(this)->set_source_udp_mac( - socket); + return getDerived()->set_source_udp_mac(socket); case detFuncs::F_GET_SOURCE_UDP_MAC: return get_source_udp_mac(socket); case detFuncs::F_SET_SOURCE_UDP_IP: @@ -179,8 +180,7 @@ ProcessedResult DetectorServer::processFunction( case detFuncs::F_GET_DEST_UDP_PORT: return get_destination_udp_port(socket); case detFuncs::F_GET_RUN_STATUS: - return static_cast(this)->get_run_status( - socket); + return getDerived()->get_run_status(socket); case detFuncs::F_GET_NUM_FRAMES: return get_num_frames(socket); case detFuncs::F_SET_NUM_FRAMES: @@ -190,17 +190,14 @@ ProcessedResult DetectorServer::processFunction( case detFuncs::F_SET_NUM_TRIGGERS: return set_num_triggers(socket); case detFuncs::F_GET_RECEIVER_PARAMETERS: - return static_cast(this) - ->get_receiver_parameters(socket); + return getDerived()->get_receiver_parameters(socket); case detFuncs::F_SET_POSITION: - return static_cast(this) - ->set_module_position_and_update_srcudpmac(socket); + return getDerived()->set_module_position_and_update_srcudpmac(socket); default: LOG(logDEBUG) << "Checking specific server functions for function ID: " << function_id; // process detector specific functions - return static_cast(this)->processFunction( - function_id, socket); + return getDerived()->processFunction(function_id, socket); } return ProcessedResult{ReturnCode::FAIL, "Function not implemented"}; @@ -398,7 +395,7 @@ DetectorServer::set_num_frames(ServerInterface &socket) { std::string(e.what())}; } try { - static_cast(this)->setNumFrames(num_frames); + getDerived()->setNumFrames(num_frames); } catch (const std::exception &e) { LOG(logERROR) << "Failed to set number of frames: " << e.what(); return ProcessedResult{ReturnCode::FAIL, @@ -439,8 +436,7 @@ ProcessedResult DetectorServer::set_num_triggers( std::string(e.what())}; } try { - static_cast(this)->setNumTriggers( - num_triggers); + getDerived()->setNumTriggers(num_triggers); } catch (const std::exception &e) { LOG(logERROR) << "Failed to set number of triggers: " << e.what(); return ProcessedResult{ReturnCode::FAIL,