From eb9fa3e3961a36881b16c55c2ca0b6b5690ece53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Nogueira?= Date: Mon, 25 Mar 2024 15:24:50 -0300 Subject: [PATCH] udriver: add generic writeFloat64 function. And add the specific implementation of the function to the relevant modules. --- utcaApp/src/acq.cpp | 6 ++---- utcaApp/src/afc_timing.cpp | 7 +------ utcaApp/src/fofb_processing.cpp | 11 ++-------- utcaApp/src/udriver.h | 37 +++++++++++++++++++++++++++++---- 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/utcaApp/src/acq.cpp b/utcaApp/src/acq.cpp index fa7c497..aa8d598 100644 --- a/utcaApp/src/acq.cpp +++ b/utcaApp/src/acq.cpp @@ -281,16 +281,14 @@ class Acq: public UDriver { return asynSuccess; } - asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value) + asynStatus writeFloat64Impl(asynUser *, const int function, const int, epicsFloat64 value) { - const int function = pasynUser->reason; - if (parameters_to_store.count(function)) { setDoubleParam(function, value); return asynSuccess; } - return asynPortDriver::writeFloat64(pasynUser, value); + return asynError; } }; diff --git a/utcaApp/src/afc_timing.cpp b/utcaApp/src/afc_timing.cpp index b047813..1bcc841 100644 --- a/utcaApp/src/afc_timing.cpp +++ b/utcaApp/src/afc_timing.cpp @@ -136,11 +136,8 @@ class AFCTiming: public UDriver { return write_params(pasynUser, ctl); } - asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value) + asynStatus writeFloat64Impl(asynUser *pasynUser, const int function, const int addr, epicsFloat64 value) { - int function = pasynUser->reason, addr; - getAddress(pasynUser, &addr); - if (function == p_freq) { bool rv; if (addr == 0) rv = ctl.set_rtm_freq(value); @@ -150,8 +147,6 @@ class AFCTiming: public UDriver { setDoubleParam(addr, function, value); callParamCallbacks(addr); - } else { - return asynPortDriver::writeFloat64(pasynUser, value); } return write_params(pasynUser, ctl); diff --git a/utcaApp/src/fofb_processing.cpp b/utcaApp/src/fofb_processing.cpp index 7f0ab15..8074482 100644 --- a/utcaApp/src/fofb_processing.cpp +++ b/utcaApp/src/fofb_processing.cpp @@ -79,18 +79,11 @@ class FofbProcessing: public UDriver { return write_params(pasynUser, ctl); } - asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value) + asynStatus writeFloat64Impl(asynUser *pasynUser, const int function, const int addr, epicsFloat64 value) { - int function = pasynUser->reason, addr; - getAddress(pasynUser, &addr); - - if (function == p_acc_gain) { + if (function == p_acc_gain) ctl.parameters[addr].acc_gain = value; - } else { - return asynPortDriver::writeFloat64(pasynUser, value); - } - return write_params(pasynUser, ctl); } diff --git a/utcaApp/src/udriver.h b/utcaApp/src/udriver.h index cad1f46..b005270 100644 --- a/utcaApp/src/udriver.h +++ b/utcaApp/src/udriver.h @@ -253,7 +253,17 @@ class UDriver: public asynPortDriver { throw std::logic_error("this default implementation shouldn't be called"); } - asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value) override final + virtual asynStatus writeFloat64Impl( + [[maybe_unused]] asynUser *pasynUser, + [[maybe_unused]] const int function, + [[maybe_unused]] const int addr, + [[maybe_unused]] epicsFloat64 value) + { + throw std::logic_error("this default implementation shouldn't be called"); + } + + template + asynStatus writeGeneral(asynUser *pasynUser, T value) { const int function = pasynUser->reason; int addr; @@ -262,13 +272,22 @@ class UDriver: public asynPortDriver { getAddress(pasynUser, &addr); getParamName(function, ¶m_name); + auto call_write_impl = [this, pasynUser, function, addr, value]() -> asynStatus { + if constexpr (std::is_same_v) + return writeInt32Impl(pasynUser, function, addr, value); + else if constexpr (std::is_same_v) + return writeFloat64Impl(pasynUser, function, addr, value); + else + static_assert(!sizeof(T)); + }; + /* parameter we don't know about */ if ((unsigned)function >= parameter_props.size()) - return writeInt32Impl(pasynUser, function, addr, value); + return call_write_impl(); if (parameter_props.at(function).is_general && addr != 0) { epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, - "writeInt32: %s: general parameter with addr=%d (should be 0)", param_name, addr); + "writeGeneral: %s: general parameter with addr=%d (should be 0)", param_name, addr); return asynError; } @@ -284,8 +303,18 @@ class UDriver: public asynPortDriver { fprintf(stderr, "bad decoder_controller write. param: %s. exception: %s\n", param_name, e.what()); } - return writeInt32Impl(pasynUser, function, addr, value); /* parameters which aren't using generic_decoder_controller */ + return call_write_impl(); + } + + asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value) override final + { + return writeGeneral(pasynUser, value); + } + + asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value) override final + { + return writeGeneral(pasynUser, value); } };