From d77c4643378126b3d588ba492a619170dae27130 Mon Sep 17 00:00:00 2001 From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr> Date: Wed, 26 Mar 2025 11:30:58 +0100 Subject: [PATCH] fix: applied requested changes (by @langlois in !3) --- src/SingleShotAO.cpp | 75 +++++++++++++++++++++++---------------- src/SingleShotAOClass.cpp | 3 +- src/SingleShotAOManager.h | 2 ++ 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/SingleShotAO.cpp b/src/SingleShotAO.cpp index 76ce807..0c95671 100755 --- a/src/SingleShotAO.cpp +++ b/src/SingleShotAO.cpp @@ -380,14 +380,17 @@ void SingleShotAO::init_device() // Remove existing dynamic attributes to avoid duplicates or other issues // -------------------------------------------- - if (m_dyn_attr_manager) { - try { + if (m_dyn_attr_manager) + { + try + { m_dyn_attr_manager->remove_attributes(); delete m_dyn_attr_manager; m_dyn_attr_manager = NULL; DEBUG_STREAM << "Existing dynamic attributes manager cleaned up" << endl; } - catch (...) { + catch (...) + { ERROR_STREAM << "Error cleaning up existing dynamic attributes manager, continuing..." << endl; // Continue anyway - we'll create a new one } @@ -424,12 +427,6 @@ void SingleShotAO::init_device() INFO_STREAM << "Creating dynamic attributes for " << m_nb_chan << " channels."; INFO_STREAM << "Total attributes: " << m_nb_chan * (enableRamps ? 3 : 1) << endl; - // if enableRamps if false, skip speed and initial attributes - if (!enableRamps) - { - INFO_STREAM << "Ramps are disabled. Skipping speed and initial attributes" << std::endl; - } - for (unsigned int l_cpt = 0; l_cpt < m_nb_chan; l_cpt++) { yat::OSStream oss; @@ -454,7 +451,7 @@ void SingleShotAO::init_device() dai_channel.tai.max_value = "10.0"; dai_channel.tai.min_value = "-10.0"; dai_channel.tai.description = "Output value for channel " + oss.str() + " (in measurementUnit)."; - dai_channel.tai.format = "%1.2f"; + dai_channel.tai.format = "%2.1f"; dai_channel.cdb = false; //- read callback @@ -468,7 +465,8 @@ void SingleShotAO::init_device() l_dynAttrList.push_back(dai_channel); // if enableRamps if false, skip speed and initial attributes - if (!enableRamps) { + if (!enableRamps) + { DEBUG_STREAM << "Ramps are disabled. Skipping speed and initial attributes for channel " << l_cpt << std::endl; continue; } @@ -490,7 +488,7 @@ void SingleShotAO::init_device() dai_speed.tai.standard_unit = "V/s"; dai_speed.tai.display_unit = "V/s"; dai_speed.tai.description = "Speed for ramp generation, in V/s. If speed is NULL, no ramp generated but direct write on channel output " + oss.str() + " (in measurementUnit)."; - dai_speed.tai.format = "%1.2f"; + dai_speed.tai.format = "%2.1f"; //- cleanup tango db option: cleanup tango db when removing this dyn. attr. (i.e. erase its properties from db) dai_speed.cdb = false; @@ -523,7 +521,7 @@ void SingleShotAO::init_device() dai_initial.tai.standard_unit = "V"; dai_initial.tai.display_unit = "V"; dai_initial.tai.description = "Initial value for ramp function, in V. Defaults to last written value in channel attribute " + oss.str() + "."; - dai_initial.tai.format = "%1.2f"; + dai_initial.tai.format = "%2.1f"; //- cleanup tango db option: cleanup tango db when removing this dyn. attr. (i.e. erase its properties from db) dai_initial.cdb = false; @@ -543,17 +541,20 @@ void SingleShotAO::init_device() INFO_STREAM << "Prepared " << l_dynAttrList.size() << " dynamic attributes for creation" << endl; // Add all attributes - try { + try + { m_dyn_attr_manager->add_attributes(l_dynAttrList); INFO_STREAM << "Successfully added all dynamic attributes" << endl; } - catch (Tango::DevFailed &df) { + catch (Tango::DevFailed &df) + { ERROR_STREAM << "Failed to add dynamic attributes: " << df << endl; m_currStatus = "Failed to add dynamic attributes. See log for details"; m_state = Tango::FAULT; return; } - catch (...) { + catch (...) + { ERROR_STREAM << "Unknown exception when adding dynamic attributes" << endl; m_currStatus = "Failed to add dynamic attributes. Unknown error"; m_state = Tango::FAULT; @@ -561,17 +562,21 @@ void SingleShotAO::init_device() } // Initialize maps in manager class for all channels - try { - for (unsigned int l_cpt = 0; l_cpt < m_nb_chan; l_cpt++) { + try + { + for (unsigned int l_cpt = 0; l_cpt < m_nb_chan; l_cpt++) + { // Initialize with default values m_manager->set_channel(l_cpt, 0.0); - if (enableRamps) { + if (enableRamps) + { m_manager->set_speed(l_cpt, 0.0); m_manager->set_initial(l_cpt, 0.0); } } } - catch (Tango::DevFailed &df) { + catch (Tango::DevFailed &df) + { ERROR_STREAM << "Failed to initialize channel maps: " << df << endl; m_currStatus = "Failed to initialize channel maps. See log for details"; m_state = Tango::FAULT; @@ -588,7 +593,8 @@ void SingleShotAO::init_device() auto applyMemorizedAttr = [&](const std::string& attrPrefix, void (SingleShotAOManager::*setter)(yat::uint16, double)) { - try { + try + { std::string attrName = attrPrefix + oss.str(); double val = yat4tango::PropertyHelper::get_memorized_attribute<double>(this, attrName); DEBUG_STREAM << "Found memorized value for " << attrName << ": " << val << endl; @@ -599,18 +605,21 @@ void SingleShotAO::init_device() // Write the value to the "write" attributes using helper function setDynamicAttributeWriteValue(attrName, val); } - catch (...) { + catch (...) + { // nothing to do } }; // Get and set memorized values for speed, initial and channel - if (enableRamps) { + if (enableRamps) + { applyMemorizedAttr(kSPEED, &SingleShotAOManager::set_speed); applyMemorizedAttr(kINITIAL, &SingleShotAOManager::set_initial); } - if (outputMemorizedChannelsAtInit) { + if (outputMemorizedChannelsAtInit) + { applyMemorizedAttr(kCHANNEL, &SingleShotAOManager::write_channel_direct); // write memorized value to board output (directly, without ramp) } else { applyMemorizedAttr(kCHANNEL, &SingleShotAOManager::set_channel); // only apply memorized value to the device @@ -663,7 +672,8 @@ void SingleShotAO::get_device_property() // Call database and extract values //-------------------------------------------- - if (Tango::Util::instance()->_UseDb==true) { + if (Tango::Util::instance()->_UseDb==true) + { get_db_device()->get_property(dev_prop); } @@ -736,7 +746,8 @@ void SingleShotAO::get_device_property() ERROR_STREAM << "Required device property <BoardType> is missing" << endl; critical_properties_missing = true; } - if (critical_properties_missing) { + if (critical_properties_missing) + { return; } @@ -1131,7 +1142,8 @@ void SingleShotAO::write_initial(yat4tango::DynamicAttributeWriteCallbackData & */ bool SingleShotAO::setDynamicAttributeWriteValue(const std::string& attrName, double value) { - try { + try + { Tango::DeviceImpl* dev = static_cast<Tango::DeviceImpl*>(this); Tango::DevDouble val_to_write = value; @@ -1142,12 +1154,14 @@ bool SingleShotAO::setDynamicAttributeWriteValue(const std::string& attrName, do DEBUG_STREAM << "Set write value for " << attrName << " to " << value << endl; return true; } - catch (Tango::DevFailed &df) { + catch (Tango::DevFailed &df) + { ERROR_STREAM << "Failed to set write value for " << attrName << ": " << df << endl; return false; } - catch (...) { + catch (...) + { ERROR_STREAM << "Unknown exception setting write value for " << attrName << endl; return false; @@ -1195,7 +1209,8 @@ void SingleShotAO::_abort() // memorize the current initial_values and value of channels for (unsigned int l_cpt = 0; l_cpt < m_nb_chan; l_cpt++) { - if (m_manager->is_running(l_cpt)) { + if (m_manager->is_running(l_cpt)) + { DEBUG_STREAM << "Channel " << l_cpt << " is running. Memorizing values..." << std::endl; double l_val_channel = m_manager->get_channel(l_cpt); diff --git a/src/SingleShotAOClass.cpp b/src/SingleShotAOClass.cpp index 29a1ef5..d5b5ee1 100755 --- a/src/SingleShotAOClass.cpp +++ b/src/SingleShotAOClass.cpp @@ -87,7 +87,8 @@ __declspec(dllexport) #endif - Tango::DeviceClass *_create_SingleShotAO_class(const char *name) { + Tango::DeviceClass *_create_SingleShotAO_class(const char *name) + { return SingleShotAO_ns::SingleShotAOClass::init(name); } } diff --git a/src/SingleShotAOManager.h b/src/SingleShotAOManager.h index 25c002e..325e00f 100755 --- a/src/SingleShotAOManager.h +++ b/src/SingleShotAOManager.h @@ -54,9 +54,11 @@ public: double get_channel(ChannelId_t p_chIdx); //- set channel + // Updates the value for the channel in the device without sending it to hardware void set_channel(ChannelId_t p_chIdx, double p_val); //- write channel + // Writes value to the channel to the device and the hardware, with a ramp if speed is not null and EnableRamps property is true void write_channel(ChannelId_t p_chIdx, double p_val); //- write a channel directly (without ramp) -- GitLab