diff --git a/src/SingleShotAO.cpp b/src/SingleShotAO.cpp index c312cc24fd8e743d2bb9538e3c06016ae62d3dd4..2c26d31c3fa9e5281e22473b6689de8e4f6f1dd5 100755 --- a/src/SingleShotAO.cpp +++ b/src/SingleShotAO.cpp @@ -368,6 +368,7 @@ void SingleShotAO::init_device() return; } + // add dynamic attributes: channel, speed & initial for each channel std::vector<yat4tango::DynamicAttributeInfo> l_dynAttrList; for (unsigned int l_cpt = 0; l_cpt < m_nb_chan; l_cpt++) @@ -476,9 +477,9 @@ void SingleShotAO::init_device() l_dynAttrList.push_back(dai_initial); } - m_dyn_attr_manager->add_attributes(l_dynAttrList); + // Get memorized values from database for (unsigned int l_cpt = 0; l_cpt < m_nb_chan; l_cpt++) { @@ -757,21 +758,37 @@ Tango::ConstDevString SingleShotAO::dev_status() //+------------------------------------------------------------------ /** - * Extract the first number found in a string. - * Used for extracting the channel number from dynamic attribute names - * like "channelX", "speedX", "initialX" where X is the channel number. + * Extract the number from a dynamic attribute name with a specific prefix. + * Used for parsing dynamic attribute names like "channelX", "speedX", "initialX" + * where X is the channel number. * * @param str The input string to search for numbers - * @return The first number found in the string - * @throws DevFailed if no number is found in the string + * @param prefix The expected prefix (e.g., "channel", "speed", "initial") + * @return The number found after the prefix + * @throws DevFailed if string doesn't start with prefix or no number is found */ -int extractNumber(const std::string &str) +int extractNumber(const std::string &str, const char* prefix) { - size_t pos = str.find_first_of("0123456789"); - if (pos == std::string::npos) - raise_error("No number found in string", "extractNumber"); + // Validate string starts with the given prefix + if (str.find(prefix) != 0) + { + THROW_DEVFAILED("DEVICE_ERROR", + "String must start with the expected prefix", + "SingleShotAO::extractNumber"); + } + // Find first digit after the prefix + size_t pos = strlen(prefix); + + // Extract and convert the number std::string numberStr = str.substr(pos); + if (numberStr.empty() || !isdigit(numberStr[0])) + { + THROW_DEVFAILED("DEVICE_ERROR", + "No number found after prefix", + "SingleShotAO::extractNumber"); + } + return std::stoi(numberStr); } @@ -787,7 +804,7 @@ void SingleShotAO::read_channel(yat4tango::DynamicAttributeReadCallbackData & cb { yat::AutoMutex<> guard(m_lock); std::string l_attr_name = cbd.dya->get_name(); - yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb + yat::uint16 l_idx = extractNumber(l_attr_name, kCHANNEL); // extract channel nb CHECK_MANAGER(); double l_val = m_manager->get_channel(l_idx); @@ -809,7 +826,7 @@ void SingleShotAO::write_channel(yat4tango::DynamicAttributeWriteCallbackData & cbd.tga->get_write_value(l_val); std::string l_attr_name = cbd.dya->get_name(); - yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb + yat::uint16 l_idx = extractNumber(l_attr_name, kCHANNEL); // extract channel nb CHECK_MANAGER(); try @@ -846,7 +863,7 @@ void SingleShotAO::read_speed(yat4tango::DynamicAttributeReadCallbackData & cbd) { yat::AutoMutex<> guard(m_lock); std::string l_attr_name = cbd.dya->get_name(); - yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb + yat::uint16 l_idx = extractNumber(l_attr_name, kSPEED); // extract channel nb CHECK_MANAGER(); double l_val = m_manager->get_speed(l_idx); @@ -870,7 +887,7 @@ void SingleShotAO::write_speed(yat4tango::DynamicAttributeWriteCallbackData & cb cbd.tga->get_write_value(l_val); std::string l_attr_name = cbd.dya->get_name(); - yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb + yat::uint16 l_idx = extractNumber(l_attr_name, kSPEED); // extract channel nb if (l_val < 0) { l_val = -l_val; @@ -912,7 +929,7 @@ void SingleShotAO::read_initial(yat4tango::DynamicAttributeReadCallbackData & cb { yat::AutoMutex<> guard(m_lock); std::string l_attr_name = cbd.dya->get_name(); - yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb + yat::uint16 l_idx = extractNumber(l_attr_name, kINITIAL); // extract channel nb CHECK_MANAGER(); double l_val = m_manager->get_initial(l_idx); @@ -936,7 +953,7 @@ void SingleShotAO::write_initial(yat4tango::DynamicAttributeWriteCallbackData & cbd.tga->get_write_value(l_val); std::string l_attr_name = cbd.dya->get_name(); - yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb + yat::uint16 l_idx = extractNumber(l_attr_name, kINITIAL); // extract channel nb CHECK_MANAGER(); try