From c725c419534d6db0baf1e1c7988e13f8a28390c4 Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Thu, 20 Feb 2025 11:14:06 +0100
Subject: [PATCH 01/11] refactor: use Tango 8 attr memorization (removed
 workaround)

---
 src/SingleShotAO.cpp | 14 ++-------
 src/SingleShotAO.h   | 70 --------------------------------------------
 2 files changed, 3 insertions(+), 81 deletions(-)

diff --git a/src/SingleShotAO.cpp b/src/SingleShotAO.cpp
index 8091197..21f3c40 100755
--- a/src/SingleShotAO.cpp
+++ b/src/SingleShotAO.cpp
@@ -505,9 +505,7 @@ void SingleShotAO::init_device()
 			std::string attr_name = kINITIAL + oss.str();
 			std::string name = "__" + attr_name;
 
-			// To be activated with Tango 8
-			//double l_val = yat4tango::PropertyHelper::get_memorized_attribute<double>(this,name);
-			double l_val = get_memorized_attribute<double>(name);
+			double l_val = yat4tango::PropertyHelper::get_memorized_attribute<double>(this,name);
 			m_manager->set_initial(l_cpt, l_val);
         }
 	    catch (...)
@@ -896,10 +894,7 @@ void SingleShotAO::write_speed(yat4tango::DynamicAttributeWriteCallbackData & cb
 			"could not write initial [unknown error]",
 			"SingleShotAO::write_initial");
 	}
-	// To be activated with Tango 8 
-	//yat4tango::PropertyHelper::set_memorized_attribute(this, l_attr_name, l_val);
-	std::string name = "__" + l_attr_name;
-	store_value_as_property(l_val, name);
+	yat4tango::PropertyHelper::set_memorized_attribute(this, l_attr_name, l_val);
 }
 
 
@@ -969,10 +964,7 @@ void SingleShotAO::write_initial(yat4tango::DynamicAttributeWriteCallbackData &
 			"could not write initial [unknown error]",
 			"SingleShotAO::write_initial");
 	}
-  // To be activated with Tango 8
-  //yat4tango::PropertyHelper::set_memorized_attribute(this, l_attr_name, l_val);
-  std::string name = "__" + l_attr_name;
-	store_value_as_property(l_val, name);
+	yat4tango::PropertyHelper::set_memorized_attribute(this, l_attr_name, l_val);
 }
 
 
diff --git a/src/SingleShotAO.h b/src/SingleShotAO.h
index 61f5f60..41ed361 100755
--- a/src/SingleShotAO.h
+++ b/src/SingleShotAO.h
@@ -279,76 +279,6 @@ protected :
 	//- channel number
 	unsigned short m_nb_chan;
 
-  // To be deleted with Tango 8
-  //- Template class to store a current value in a Device property.
-  //- \param value Value to store.
-  //- \param property_name Name to use.
-  template <class T>
-  void store_value_as_property(T value, std::string property_name)
-  {
-    Tango::DbDatum current_value(property_name);
-    current_value << value;
-    Tango::DbData db_data;
-    db_data.push_back(current_value);
-
-    try
-    {
-      get_db_device()->put_property(db_data);
-    }
-    catch(Tango::DevFailed &df)
-    {     
-      ERROR_STREAM << df << endl;
-      RETHROW_DEVFAILED(df,
-						"SOFTWARE_FAILURE",
-						"Error while storing properties in database",
-						"SingleShotAO::store_value_as_property");
-	  }
-  }
-
-  // To be deleted with Tango 8
-  //- Template class to get a memorized attribute stored as a Device property.
-  //- \param property_name Name od the property to read.
-  template <class T>
-  T get_memorized_attribute(const std::string& property_name)
-  {
-    T value;
-    if (!Tango::Util::instance()->_UseDb)
-    {
-      //- throw exception
-	    THROW_DEVFAILED("DEVICE_ERROR",
-	                  "No DATA BASE!",
-	                  "SingleShotAO::get_memorized_attribute");    
-    }
-
-    Tango::DbData	dev_prop;
-    dev_prop.push_back(Tango::DbDatum(property_name));
-	
-    try
-    {
-      get_db_device()->get_property(dev_prop);
-    }
-    catch (Tango::DevFailed &df)
-    {
-      //- rethrow exception
-      RETHROW_DEVFAILED(df,
-	                    "DEVICE_ERROR",
-	                    "could not get Device properties! [caught Tango::DevFailed]",
-	                    "SingleShotAO::get_memorized_attribute");
-    }
-
-    if (dev_prop[0].is_empty()==false)
-    {
-      dev_prop[0] >> value;
-    }
-    else
-    {
-      //- throw exception
-	    THROW_DEVFAILED("DATA_ERROR",
-	                  "No property stored in database!",
-	                  "SingleShotAO::get_memorized_attribute");
-    }
-    return value;
-  }
 };
 
 }	// namespace_ns
-- 
GitLab


From 2973a71d7efc461e125db40db5e6b36e3579d2cc Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Thu, 20 Feb 2025 16:07:13 +0100
Subject: [PATCH 02/11] refactor: rename get_device_property to
 get_device_properties and extract channel number logic

---
 src/SingleShotAO.cpp        | 72 +++++++++++++++++--------------------
 src/SingleShotAO.h          |  2 +-
 src/SingleShotAOManager.cpp |  2 --
 3 files changed, 34 insertions(+), 42 deletions(-)

diff --git a/src/SingleShotAO.cpp b/src/SingleShotAO.cpp
index 21f3c40..c312cc2 100755
--- a/src/SingleShotAO.cpp
+++ b/src/SingleShotAO.cpp
@@ -219,7 +219,7 @@ void SingleShotAO::init_device()
 	//--------------------------------------------
 	try 
 	{
-		get_device_property();
+		get_device_properties();
 	}
 	catch (const Tango::DevFailed& df)
 	{
@@ -543,12 +543,12 @@ void SingleShotAO::init_device()
 
 //+----------------------------------------------------------------------------
 //
-// method : 		SingleShotAO::get_device_property()
+// method : 		SingleShotAO::get_device_properties()
 // 
 // description : 	Read the device properties from database.
 //
 //-----------------------------------------------------------------------------
-void SingleShotAO::get_device_property()
+void SingleShotAO::get_device_properties()
 {
 	//	Initialize your default values here (if not done with  POGO).
 	//------------------------------------------------------------------
@@ -664,8 +664,7 @@ void SingleShotAO::always_executed_hook()
 //-----------------------------------------------------------------------------
 void SingleShotAO::read_attr_hardware(vector<long> &attr_list)
 {
-	//DEBUG_STREAM << "SingleShotAO::read_attr_hardware(vector<long> &attr_list) entering... "<< endl;
-	//	Add your own code here
+	// nothing to do
 }
 
 
@@ -678,7 +677,6 @@ void SingleShotAO::read_attr_hardware(vector<long> &attr_list)
 //-----------------------------------------------------------------------------
 void SingleShotAO::read_frequency(Tango::Attribute &attr)
 {
-	//DEBUG_STREAM << "SingleShotAO::read_frequency(Tango::Attribute &attr) entering... "<< endl;
 	attr.set_value(&m_frequency);
 }
 
@@ -757,6 +755,26 @@ 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.
+ * 
+ * @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
+ */
+int extractNumber(const std::string &str)
+{
+	size_t pos = str.find_first_of("0123456789");
+	if (pos == std::string::npos)
+		raise_error("No number found in string", "extractNumber");
+
+	std::string numberStr = str.substr(pos);
+	return std::stoi(numberStr);
+}
+
 //+------------------------------------------------------------------
 /**
 *  method:  SingleShotAO::read_channel
@@ -768,15 +786,10 @@ Tango::ConstDevString SingleShotAO::dev_status()
 void SingleShotAO::read_channel(yat4tango::DynamicAttributeReadCallbackData & cbd)
 {
 	yat::AutoMutex<> guard(m_lock);
-
 	std::string l_attr_name = cbd.dya->get_name();
-
-	// name will be channelX
-	std::string l_str = l_attr_name.substr(7, 2);
-	yat::uint16 l_idx = atoi(l_str.c_str());
+	yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb
 
     CHECK_MANAGER();
-	// choose tab depending on l_idx
 	double l_val = m_manager->get_channel(l_idx);
 	cbd.tga->set_value(&l_val);
 }
@@ -796,10 +809,7 @@ void SingleShotAO::write_channel(yat4tango::DynamicAttributeWriteCallbackData &
 	cbd.tga->get_write_value(l_val);
 
 	std::string l_attr_name = cbd.dya->get_name();
-
-	// name will be channelX
-	std::string l_str = l_attr_name.substr(7, 2);
-	yat::uint16 l_idx = atoi(l_str.c_str());
+	yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb
 
     CHECK_MANAGER();
 	try
@@ -835,15 +845,10 @@ void SingleShotAO::write_channel(yat4tango::DynamicAttributeWriteCallbackData &
 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
 
-	// name will be speedX
-	std::string l_str = l_attr_name.substr(5, 2);
-	yat::uint16 l_idx = atoi(l_str.c_str());
-
-         CHECK_MANAGER();
-	// choose tab depending on l_idx
+    CHECK_MANAGER();
 	double l_val = m_manager->get_speed(l_idx);
 	cbd.tga->set_value(&l_val);
 }
@@ -859,16 +864,13 @@ void SingleShotAO::read_speed(yat4tango::DynamicAttributeReadCallbackData & cbd)
 //+------------------------------------------------------------------
 void SingleShotAO::write_speed(yat4tango::DynamicAttributeWriteCallbackData & cbd)
 {
-  DEBUG_STREAM << "SingleShotAO::write_speed(): entering... !" << endl;
+	DEBUG_STREAM << "SingleShotAO::write_speed(): entering... !" << endl;
 
 	double l_val;
 	cbd.tga->get_write_value(l_val);
 
 	std::string l_attr_name = cbd.dya->get_name();
-
-	// name will be speedX
-	std::string l_str = l_attr_name.substr(5, 2);
-	yat::uint16 l_idx = atoi(l_str.c_str());
+	yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb
 	if (l_val < 0)
 	{
 		l_val = -l_val;
@@ -909,15 +911,10 @@ void SingleShotAO::write_speed(yat4tango::DynamicAttributeWriteCallbackData & cb
 void SingleShotAO::read_initial(yat4tango::DynamicAttributeReadCallbackData & cbd)
 {
 	yat::AutoMutex<> guard(m_lock);
-
 	std::string l_attr_name = cbd.dya->get_name();
-
-	// name will be initialX
-	std::string l_str = l_attr_name.substr(7, 2);
-	yat::uint16 l_idx = atoi(l_str.c_str());
+	yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb
 
 	CHECK_MANAGER();
-	// choose tab depending on l_idx
 	double l_val = m_manager->get_initial(l_idx);
 	cbd.tga->set_value(&l_val);
 }
@@ -933,16 +930,13 @@ void SingleShotAO::read_initial(yat4tango::DynamicAttributeReadCallbackData & cb
 //+------------------------------------------------------------------
 void SingleShotAO::write_initial(yat4tango::DynamicAttributeWriteCallbackData & cbd)
 {
-  DEBUG_STREAM << "SingleShotAO::write_initial(): entering... !" << endl;
+	DEBUG_STREAM << "SingleShotAO::write_initial(): entering... !" << endl;
 
 	double l_val;
 	cbd.tga->get_write_value(l_val);
 
 	std::string l_attr_name = cbd.dya->get_name();
-
-	// name will be initialX
-	std::string l_str = l_attr_name.substr(7, 2);
-	yat::uint16 l_idx = atoi(l_str.c_str());
+	yat::uint16 l_idx = extractNumber(l_attr_name); // extract channel nb
 
 	CHECK_MANAGER();
 	try
diff --git a/src/SingleShotAO.h b/src/SingleShotAO.h
index 41ed361..d6d477f 100755
--- a/src/SingleShotAO.h
+++ b/src/SingleShotAO.h
@@ -219,7 +219,7 @@ public :
 /**
  *	Read the device properties from database
  */
-	 void get_device_property();
+	 void get_device_properties();
 //@}
 
 	//	Here is the end of the automatic code generation part
diff --git a/src/SingleShotAOManager.cpp b/src/SingleShotAOManager.cpp
index 1a71223..6e6c2e7 100755
--- a/src/SingleShotAOManager.cpp
+++ b/src/SingleShotAOManager.cpp
@@ -180,7 +180,6 @@ void SingleShotAOManager::process_message (yat::Message& msg)
 		//- THREAD_PERIODIC ------------------
 	case yat::TASK_PERIODIC:
 		{
-			//DEBUG_STREAM << "SingleShotAOManager::handle_message::THREAD_PERIODIC" << std::endl;
 			periodic_job_i();
 		}
 		break;
@@ -209,7 +208,6 @@ void SingleShotAOManager::periodic_job_i()
 		//test if a ramp step must occur
 		if (m_currentIndex[l_cpt] != -1)
 		{
-			//DEBUG_STREAM << "Current index for channel" << l_cpt << ": " << m_currentIndex[l_cpt] << endl;
 			m_isRunning[l_cpt] = true;
 			double l_val = 0;
 			l_val = m_ramps[l_cpt][m_currentIndex[l_cpt]];
-- 
GitLab


From d4c1f2526d1ff57ef2d8f6c587350a5b3cd68ad0 Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Thu, 20 Feb 2025 16:37:36 +0100
Subject: [PATCH 03/11] refactor: enhance extractNumber function to validate
 prefixes and improve error handling

---
 src/SingleShotAO.cpp | 49 +++++++++++++++++++++++++++++---------------
 1 file changed, 33 insertions(+), 16 deletions(-)

diff --git a/src/SingleShotAO.cpp b/src/SingleShotAO.cpp
index c312cc2..2c26d31 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
-- 
GitLab


From a6daeef3f0f14b53fc87feb99c51ca25cd624a3c Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Thu, 20 Feb 2025 17:39:46 +0100
Subject: [PATCH 04/11] refactor: improve code readability and structure in
 SingleShotAOManager

---
 src/SingleShotAOManager.cpp | 247 ++++++++++++++++++------------------
 1 file changed, 123 insertions(+), 124 deletions(-)

diff --git a/src/SingleShotAOManager.cpp b/src/SingleShotAOManager.cpp
index 6e6c2e7..7e70818 100755
--- a/src/SingleShotAOManager.cpp
+++ b/src/SingleShotAOManager.cpp
@@ -145,12 +145,12 @@ void SingleShotAOManager::init(asl::SingleShotAO * p_ssao, unsigned short p_nb_c
 		enable_periodic_msg(true);
 	}
 
-  // initialize channel indexes (-1 means no ramp in progress)
-  // and ramp states
-	for (unsigned int l_cpt = 0;l_cpt < m_nb_chan;l_cpt++)
+	// initialize channel indexes (-1 means no ramp in progress)
+	// and ramp states
+	for (unsigned int l_cpt = 0; l_cpt < m_nb_chan; l_cpt++)
 	{
 		m_currentIndex[l_cpt] = -1;
-    m_isRunning[l_cpt] = false;
+    	m_isRunning[l_cpt] = false;
 	}
 }
 
@@ -164,36 +164,39 @@ void SingleShotAOManager::process_message (yat::Message& msg)
 	switch (msg.type())
 	{
 		//- THREAD_INIT ----------------------
-	case yat::TASK_INIT:
+		case yat::TASK_INIT:
 		{
 			DEBUG_STREAM << "SingleShotAOManager::handle_message::THREAD_INIT::thread is starting up" << std::endl;
 		} 
 		break;
 
 		//- THREAD_EXIT ----------------------
-	case yat::TASK_EXIT:
+		case yat::TASK_EXIT:
 		{
 			DEBUG_STREAM << "SingleShotAOManager::handle_message::THREAD_EXIT::thread is quitting" << std::endl;
 		}
 		break;
 
 		//- THREAD_PERIODIC ------------------
-	case yat::TASK_PERIODIC:
+		case yat::TASK_PERIODIC:
 		{
 			periodic_job_i();
 		}
 		break;
 
 		//- THREAD_TIMEOUT -------------------
-	case yat::TASK_TIMEOUT:
+		case yat::TASK_TIMEOUT:
 		{
 			//- not used in this example
 		}
 		break;
+
 		//- UNHANDLED MSG --------------------
-	default:
-		DEBUG_STREAM << "SingleShotAOManager::handle_message::unhandled msg type received" << std::endl;
-		break;
+		default:
+		{
+			DEBUG_STREAM << "SingleShotAOManager::handle_message::unhandled msg type received" << std::endl;
+			break;
+		}
 	}
 }
 
@@ -202,53 +205,52 @@ void SingleShotAOManager::process_message (yat::Message& msg)
 // ============================================================================ 
 void SingleShotAOManager::periodic_job_i()
 {
-	//test all channels
+	// test all channels
 	for (unsigned int l_cpt = 0;l_cpt < m_nb_chan;l_cpt++)
 	{
-		//test if a ramp step must occur
-		if (m_currentIndex[l_cpt] != -1)
+		// test if a ramp step must occur
+		if (m_currentIndex[l_cpt] == -1)
 		{
-			m_isRunning[l_cpt] = true;
-			double l_val = 0;
-			l_val = m_ramps[l_cpt][m_currentIndex[l_cpt]];
-			DEBUG_STREAM << "Current value for channel" << l_cpt << ": " << l_val << endl;
-			try 
-			{
-				CHECK_SSAO();
-				m_ssao->write_scaled_channel((adl::ChanId)l_cpt, l_val);
-				m_channels[l_cpt] = l_val;
-			}
-			catch(const asl::DAQException& de)
-			{
-				Tango::DevFailed df = daq_to_tango_exception(de);
-				ERROR_STREAM << df<< endl;
-				m_state = Tango::FAULT;
-				RETHROW_DEVFAILED(df,
-					"DRIVER_FAILURE",
-					"could not write channel [caught asl::DAQException]",
-					"SingleShotAOManager::write_channel");
-			}
-			catch(...)
-			{
-				ERROR_STREAM << "SingleShotAOManager::write_channel::unknown exception caught"<<std::endl;
-				m_state = Tango::FAULT;
-				THROW_DEVFAILED("DRIVER_FAILURE",
-					"could not write channel [unknown error]",
-					"SingleShotAOManager::write_channel");
-			}
-			
-			//check if there is another value
-			m_currentIndex[l_cpt] +=1;
-			if (m_currentIndex[l_cpt] == m_ramps[l_cpt].capacity())
-			{
-				m_currentIndex[l_cpt] = -1;
-				m_initials[l_cpt] = m_channels[l_cpt];
-				m_ramps[l_cpt].clear();
-			}
+			m_isRunning[l_cpt] = false;
+			continue;
 		}
-		else
+
+		m_isRunning[l_cpt] = true;
+		double l_val = 0;
+		l_val = m_ramps[l_cpt][m_currentIndex[l_cpt]];
+		DEBUG_STREAM << "Current value for channel" << l_cpt << ": " << l_val << endl;
+		try 
 		{
-			m_isRunning[l_cpt] = false;
+			CHECK_SSAO();
+			m_ssao->write_scaled_channel((adl::ChanId)l_cpt, l_val);
+			m_channels[l_cpt] = l_val;
+		}
+		catch(const asl::DAQException& de)
+		{
+			Tango::DevFailed df = daq_to_tango_exception(de);
+			ERROR_STREAM << df << endl;
+			m_state = Tango::FAULT;
+			RETHROW_DEVFAILED(df,
+				"DRIVER_FAILURE",
+				"could not write channel [caught asl::DAQException]",
+				"SingleShotAOManager::write_channel");
+		}
+		catch(...)
+		{
+			ERROR_STREAM << "SingleShotAOManager::write_channel::unknown exception caught" << std::endl;
+			m_state = Tango::FAULT;
+			THROW_DEVFAILED("DRIVER_FAILURE",
+				"could not write channel [unknown error]",
+				"SingleShotAOManager::write_channel");
+		}
+		
+		// check if there is another value
+		m_currentIndex[l_cpt] += 1;
+		if (m_currentIndex[l_cpt] == m_ramps[l_cpt].capacity())
+		{
+			m_currentIndex[l_cpt] = -1;
+			m_initials[l_cpt] = m_channels[l_cpt];
+			m_ramps[l_cpt].clear();
 		}
 	}
 }
@@ -266,8 +268,9 @@ double SingleShotAOManager::get_channel(ChannelId_t p_chIdx)
 // ============================================================================ 
 void SingleShotAOManager::write_channel(ChannelId_t p_chIdx, double p_val)
 {
-	DEBUG_STREAM << "write_channel : " << p_chIdx << " : " << p_val << " : " << endl;
+	DEBUG_STREAM << "write_channel " << p_chIdx << " : " << p_val << endl;
 
+	// if the speed is 0, write the value directly
 	if (m_speeds[p_chIdx] == 0.0)
 	{
 		try 
@@ -276,11 +279,12 @@ void SingleShotAOManager::write_channel(ChannelId_t p_chIdx, double p_val)
 			m_ssao->write_scaled_channel((adl::ChanId)p_chIdx, p_val);
 			m_channels[p_chIdx] = p_val;
 			m_initials[p_chIdx] = p_val;
+			DEBUG_STREAM << "Speed is 0, writing directly the value" << endl;
 		}
 		catch(const asl::DAQException& de)
 		{
 			Tango::DevFailed df = daq_to_tango_exception(de);
-			ERROR_STREAM << df<< endl;
+			ERROR_STREAM << df << endl;
 			m_state = Tango::FAULT;
 			RETHROW_DEVFAILED(df,
 				"DRIVER_FAILURE",
@@ -295,83 +299,78 @@ void SingleShotAOManager::write_channel(ChannelId_t p_chIdx, double p_val)
 				"could not write channel [unknown error]",
 				"SingleShotAOManager::write_channel");
 		}
+		return;
 	}
-	else
+
+	// if a ramp is not running, error
+	if (m_isRunning[p_chIdx])
+	{
+		THROW_DEVFAILED("DEVICE_FAILURE",
+			"could not write channel : a ramp is still in progress on this channel",
+			"SingleShotAOManager::write_channel");
+	}
+
+	// if frequency = 0, error
+	if (m_frequency == 0)
+	{
+		THROW_DEVFAILED("DRIVER_FAILURE",
+			"could not set a ramp on this channel. The frequency is 0",
+			"SingleShotAOManager::write_channel");
+	}
+
+	// if initial = channel, skip
+	if (m_initials[p_chIdx] == p_val)
+	{
+		DEBUG_STREAM << "Initial value is the same as the given value, skipping" << endl;
+		return;
+	}
+
+	// ramp determination
+	double l_delta = p_val - m_initials[p_chIdx];
+	bool isDown = false;
+	l_delta  = ((l_delta * m_frequency) / m_speeds[p_chIdx]) + 1;
+	if (l_delta < 0)
+	{
+		l_delta = -l_delta + 2;
+		isDown = true;
+	}
+	DEBUG_STREAM << "Computed ramp steps number : " << l_delta << endl;
+
+	yat::Buffer<double> l_buffer;
+	size_t ramp_size = (size_t)(ceil(l_delta));
+	l_buffer.capacity(ramp_size);
+	l_buffer.force_length(ramp_size);
+	
+	// check if ramp step is integer or not
+	bool isDeltaNotInt = (ramp_size != ((size_t)(floor(l_delta))));
+	DEBUG_STREAM << "Real ramp steps number : " << ramp_size << endl;
+
+	for (unsigned int l_cpt = 0; l_cpt < ramp_size; l_cpt++)
 	{
-		// check if a ramp is not running
-		if (!m_isRunning[p_chIdx])
+		if ((l_cpt == (ramp_size - 1)) && (isDeltaNotInt))
 		{
-			// check if initial = channel
-			if (m_initials[p_chIdx] != p_val)
-			{
-				if (m_frequency == 0)
-				{
-					THROW_DEVFAILED("DRIVER_FAILURE",
-						"could not set a ramp on this channel. The frequency is 0",
-						"SingleShotAOManager::write_channel");
-				}
-				
-				//ramp determination
-				double l_delta = p_val - m_initials[p_chIdx];
-				bool isDown = false;
-				l_delta  = ((l_delta * m_frequency) / m_speeds[p_chIdx])+1;
-				if (l_delta < 0)
-				{
-					l_delta = -l_delta + 2;
-					isDown = true;
-				}
-				DEBUG_STREAM << "Computed ramp steps number : " << l_delta << endl;
-								
-				yat::Buffer<double> l_buffer;
-        size_t ramp_size = (size_t)(ceil(l_delta));
-				l_buffer.capacity(ramp_size);
-				l_buffer.force_length(ramp_size);
-				
-				// check if ramp step is integer or not
-				bool isDeltaNotInt = false;
-				if (ramp_size != ((size_t)(floor(l_delta))))
-				{
-				  isDeltaNotInt = true;
-				}
-
-        DEBUG_STREAM << "Real ramp steps number : " << ramp_size << endl;
-
-				for (unsigned int l_cpt = 0; l_cpt < ramp_size; l_cpt++)
-				{
-				  if ((l_cpt == (ramp_size - 1)) && 
-              (isDeltaNotInt))
-				  {
-					  // add the setpoint value at the end of table
-					  l_buffer[l_cpt] = p_val;
-				  }
-				  else
-				  {
-					  if (isDown)
-					  {
-						  l_buffer[l_cpt] = m_initials[p_chIdx] - l_cpt*(m_speeds[p_chIdx]/m_frequency);
-					  }
-					  else
-					  {
-						  l_buffer[l_cpt] = m_initials[p_chIdx] + l_cpt*(m_speeds[p_chIdx]/m_frequency);
-					  }
-				  }
-          //DEBUG_STREAM << "Ramp buffer[" << l_cpt << "] = " << l_buffer[l_cpt] << endl;
-				}
-				m_ramps[p_chIdx].clear();
-				m_ramps[p_chIdx].capacity(0);
-				m_ramps[p_chIdx].force_length(0);
-				m_currentIndex[p_chIdx] = 0;
-				m_ramps[p_chIdx] = l_buffer;
-				//m_channels[p_chIdx] = m_ramps[p_chIdx][0]; -- soso on ne met rien ici => à l'application
-			}
+			// add the setpoint value at the end of table
+			l_buffer[l_cpt] = p_val;
 		}
 		else
 		{
-			THROW_DEVFAILED("DEVICE_FAILURE",
-				"could not write channel : a ramp is still in progress on this channel",
-				"SingleShotAOManager::write_channel");
+			if (isDown)
+			{
+				l_buffer[l_cpt] = m_initials[p_chIdx] - l_cpt * (m_speeds[p_chIdx] / m_frequency);
+			}
+			else
+			{
+				l_buffer[l_cpt] = m_initials[p_chIdx] + l_cpt * (m_speeds[p_chIdx] / m_frequency);
+			}
 		}
+		//DEBUG_STREAM << "Ramp buffer[" << l_cpt << "] = " << l_buffer[l_cpt] << endl;
 	}
+	m_ramps[p_chIdx].clear();
+	m_ramps[p_chIdx].capacity(0);
+	m_ramps[p_chIdx].force_length(0);
+	m_currentIndex[p_chIdx] = 0;
+	m_ramps[p_chIdx] = l_buffer;
+	//m_channels[p_chIdx] = m_ramps[p_chIdx][0]; -- soso on ne met rien ici => à l'application
 }
 
 // ============================================================================
-- 
GitLab


From 1e77157f3e973921d7bb72459c344de18248f346 Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Fri, 21 Feb 2025 11:07:01 +0100
Subject: [PATCH 05/11] cleanup: fix typos, formatting and improve comments in
 SingleShotAO and SingleShotAOManager

---
 src/SingleShotAO.cpp        | 23 ++++++++++++-----------
 src/SingleShotAOManager.cpp | 20 ++++++++++----------
 src/SingleShotAOManager.h   |  4 ++--
 3 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/src/SingleShotAO.cpp b/src/SingleShotAO.cpp
index 2c26d31..65643b0 100755
--- a/src/SingleShotAO.cpp
+++ b/src/SingleShotAO.cpp
@@ -326,7 +326,6 @@ void SingleShotAO::init_device()
 		DEBUG_STREAM << "Failed to get frequency value. Maybe there is no value yet." << std::endl;
 	}
 	
-
 	// initialize the AO manager
 	//--------------------------------------------
 	try
@@ -348,6 +347,10 @@ void SingleShotAO::init_device()
 		return;
 	}
 
+
+	// Create dynamic attributes
+	//--------------------------------------------
+
   	// create dynamic attribute manager
 	try
 	{
@@ -495,8 +498,7 @@ void SingleShotAO::init_device()
 			double l_val = yat4tango::PropertyHelper::get_memorized_attribute<double>(this, name);
 			m_manager->set_speed(l_cpt, l_val);
 	  	}
-		catch (...)
-		{
+			catch (...) {
 			// nothing to do
 		}
 
@@ -903,16 +905,17 @@ void SingleShotAO::write_speed(yat4tango::DynamicAttributeWriteCallbackData & cb
 		ERROR_STREAM << df<< endl;
 		RETHROW_DEVFAILED(df,
 			"DRIVER_FAILURE",
-			"could not write initial [caught Tango::DevFailed]",
-			"SingleShotAO::write_initial");
+			"could not write speed [caught Tango::DevFailed]",
+			"SingleShotAO::write_speed");
 	}
 	catch(...)
 	{
-		ERROR_STREAM << "SingleShotAO::write_initial::unknown exception caught"<<std::endl;
+		ERROR_STREAM << "SingleShotAO::write_speed::unknown exception caught" << std::endl;
 		THROW_DEVFAILED("DRIVER_FAILURE",
-			"could not write initial [unknown error]",
-			"SingleShotAO::write_initial");
+			"could not write speed [unknown error]",
+			"SingleShotAO::write_speed");
 	}
+
 	yat4tango::PropertyHelper::set_memorized_attribute(this, l_attr_name, l_val);
 }
 
@@ -975,6 +978,7 @@ void SingleShotAO::write_initial(yat4tango::DynamicAttributeWriteCallbackData &
 			"could not write initial [unknown error]",
 			"SingleShotAO::write_initial");
 	}
+
 	yat4tango::PropertyHelper::set_memorized_attribute(this, l_attr_name, l_val);
 }
 
@@ -986,14 +990,12 @@ void SingleShotAO::write_initial(yat4tango::DynamicAttributeWriteCallbackData &
  *	description:	method to execute "Abort"
  *	Aborts ramps in progress.
  *
- *
  */
 //+------------------------------------------------------------------
 void SingleShotAO::abort()
 {
 	DEBUG_STREAM << "SingleShotAO::abort(): entering... !" << endl;
 
-	//	Add your own code to control device here
 	CHECK_MANAGER();
 	try
 	{
@@ -1014,7 +1016,6 @@ void SingleShotAO::abort()
 			"could not abort [unknown error]",
 			"SingleShotAO::abort");
 	}
-
 }
 
 }	//	namespace
diff --git a/src/SingleShotAOManager.cpp b/src/SingleShotAOManager.cpp
index 7e70818..e78806d 100755
--- a/src/SingleShotAOManager.cpp
+++ b/src/SingleShotAOManager.cpp
@@ -270,7 +270,7 @@ void SingleShotAOManager::write_channel(ChannelId_t p_chIdx, double p_val)
 {
 	DEBUG_STREAM << "write_channel " << p_chIdx << " : " << p_val << endl;
 
-	// if the speed is 0, write the value directly
+	// if the speed is 0, write the value directly and skip ramp
 	if (m_speeds[p_chIdx] == 0.0)
 	{
 		try 
@@ -279,21 +279,21 @@ void SingleShotAOManager::write_channel(ChannelId_t p_chIdx, double p_val)
 			m_ssao->write_scaled_channel((adl::ChanId)p_chIdx, p_val);
 			m_channels[p_chIdx] = p_val;
 			m_initials[p_chIdx] = p_val;
-			DEBUG_STREAM << "Speed is 0, writing directly the value" << endl;
+			DEBUG_STREAM << "Speed is 0, writing directly the value" << std::endl;
 		}
-		catch(const asl::DAQException& de)
+		catch (const asl::DAQException &de)
 		{
 			Tango::DevFailed df = daq_to_tango_exception(de);
-			ERROR_STREAM << df << endl;
+			ERROR_STREAM << df << std::endl;
 			m_state = Tango::FAULT;
 			RETHROW_DEVFAILED(df,
 				"DRIVER_FAILURE",
 				"could not write channel [caught asl::DAQException]",
 				"SingleShotAOManager::write_channel");
 		}
-		catch(...)
+		catch (...)
 		{
-			ERROR_STREAM << "SingleShotAOManager::write_channel::unknown exception caught"<<std::endl;
+			ERROR_STREAM << "SingleShotAOManager::write_channel::unknown exception caught" << std::endl;
 			m_state = Tango::FAULT;
 			THROW_DEVFAILED("DRIVER_FAILURE",
 				"could not write channel [unknown error]",
@@ -302,7 +302,7 @@ void SingleShotAOManager::write_channel(ChannelId_t p_chIdx, double p_val)
 		return;
 	}
 
-	// if a ramp is not running, error
+	// if a ramp is running, error
 	if (m_isRunning[p_chIdx])
 	{
 		THROW_DEVFAILED("DEVICE_FAILURE",
@@ -428,8 +428,8 @@ void SingleShotAOManager::set_speed(ChannelId_t p_chIdx, Intial_t p_speed)
 // ============================================================================
 void SingleShotAOManager::abort()
 {
-	//test all channels and abort current ramps
-	for (unsigned int l_cpt = 0;l_cpt < m_nb_chan;l_cpt++)
+	// test all channels and abort current ramps
+	for (unsigned int l_cpt = 0; l_cpt < m_nb_chan; l_cpt++)
 	{
 		if (m_isRunning[l_cpt])
 		{
@@ -441,5 +441,5 @@ void SingleShotAOManager::abort()
 		}
 	}
 }
-} // namespace SingleShotAO_ns
 
+} // namespace SingleShotAO_ns
diff --git a/src/SingleShotAOManager.h b/src/SingleShotAOManager.h
index 27e73ce..05be89d 100755
--- a/src/SingleShotAOManager.h
+++ b/src/SingleShotAOManager.h
@@ -59,10 +59,10 @@ public:
   //- change period
   void write_frequency(double p_frequency);
 
-  //- get inital
+  //- get initial
   Intial_t get_initial(ChannelId_t p_chIdx);
 
-  //- set inital
+  //- set initial
   void set_initial(ChannelId_t p_chIdx, Intial_t p_initial);
 
   //- get speed
-- 
GitLab


From 29aa9c832bc5ef0d6921f5b2737097bf8d0c0a5d Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Fri, 21 Feb 2025 11:16:49 +0100
Subject: [PATCH 06/11] fix/feature: memorize values and apply memorized values
 at init

---
 src/SingleShotAO.cpp        | 45 +++++++++++++++++--------------------
 src/SingleShotAOManager.cpp | 17 ++++++++++++++
 src/SingleShotAOManager.h   |  5 ++++-
 3 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/src/SingleShotAO.cpp b/src/SingleShotAO.cpp
index 65643b0..8b886ad 100755
--- a/src/SingleShotAO.cpp
+++ b/src/SingleShotAO.cpp
@@ -489,32 +489,25 @@ void SingleShotAO::init_device()
 		yat::OSStream oss;
 		oss << l_cpt;
 
-		// speed value
-		try
-	  	{
-		  	std::string attr_name = kSPEED + oss.str();
-      		std::string name = "__" + attr_name;
-
-			double l_val = yat4tango::PropertyHelper::get_memorized_attribute<double>(this, name);
-			m_manager->set_speed(l_cpt, l_val);
-	  	}
-			catch (...) {
-			// nothing to do
-		}
-
-		// initial value
-		try
+		// Helper function to get and set memorized attributes
+		auto applyMemorizedAttr = [&](const std::string& attrPrefix, 
+			void (SingleShotAOManager::*setter)(yat::uint16, double))
 		{
-			std::string attr_name = kINITIAL + oss.str();
-			std::string name = "__" + attr_name;
-
-			double l_val = yat4tango::PropertyHelper::get_memorized_attribute<double>(this,name);
-			m_manager->set_initial(l_cpt, l_val);
-        }
-	    catch (...)
-		{
-			//nothing to do
-		}
+			try {
+				std::string attrName = attrPrefix + oss.str();
+				double val = yat4tango::PropertyHelper::get_memorized_attribute<double>(this, attrName);
+				(m_manager->*setter)(l_cpt, val);
+			}
+			catch (...) {
+				// nothing to do
+			}
+		};
+
+		// Get and set memorized values for speed, initial and channel
+		applyMemorizedAttr(kSPEED, &SingleShotAOManager::set_speed);
+		applyMemorizedAttr(kINITIAL, &SingleShotAOManager::set_initial); 
+		applyMemorizedAttr(kCHANNEL, &SingleShotAOManager::set_channel);
+		// TODO: add a property to call write_channel instead of set_channel (false by default)
     }
 
 	//- GO for task
@@ -850,6 +843,8 @@ void SingleShotAO::write_channel(yat4tango::DynamicAttributeWriteCallbackData &
 			"could not write channel [unknown error]",
 			"SingleShotAO::write_channel");
 	}
+
+	yat4tango::PropertyHelper::set_memorized_attribute(this, l_attr_name, l_val);
 }
 
 
diff --git a/src/SingleShotAOManager.cpp b/src/SingleShotAOManager.cpp
index e78806d..5d7b57a 100755
--- a/src/SingleShotAOManager.cpp
+++ b/src/SingleShotAOManager.cpp
@@ -263,6 +263,23 @@ double SingleShotAOManager::get_channel(ChannelId_t p_chIdx)
 	return m_channels[p_chIdx];
 }
 
+// ============================================================================
+// SingleShotAOManager::set_channel ()
+// ============================================================================ 
+void SingleShotAOManager::set_channel(ChannelId_t p_chIdx, double p_val)
+{
+	if (m_isRunning[p_chIdx])
+	{
+		THROW_DEVFAILED("DEVICE_FAILURE",
+						"could not write channel : a ramp is still in progress on this channel",
+						"SingleShotAOManager::set_channel");
+	}
+	else
+	{
+		m_channels[p_chIdx] = p_val;
+	}
+}
+
 // ============================================================================
 // SingleShotAOManager::write_channel ()
 // ============================================================================ 
diff --git a/src/SingleShotAOManager.h b/src/SingleShotAOManager.h
index 05be89d..ccabfce 100755
--- a/src/SingleShotAOManager.h
+++ b/src/SingleShotAOManager.h
@@ -52,7 +52,10 @@ public:
 
   //- get current channel value
   double get_channel(ChannelId_t p_chIdx);
-	  
+
+  //- set channel
+  void set_channel(ChannelId_t p_chIdx, double p_val);
+
   //- write channel
   void write_channel(ChannelId_t p_chIdx, double p_val);
 
-- 
GitLab


From bcce86f18b6007a4810b3a8f142f6d1ff5d890b6 Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Fri, 21 Feb 2025 13:46:00 +0100
Subject: [PATCH 07/11] cleanup(doc): format HTML documentation files

---
 doc/doc_html/Attributes.html       | 165 ++++++++------------
 doc/doc_html/Description.html      | 147 +++---------------
 doc/doc_html/DevCommands.html      | 232 ++++++++++-------------------
 doc/doc_html/DevCommandsFrame.html |  33 ++--
 doc/doc_html/DevCommandsList.html  |  31 ++--
 doc/doc_html/DevCommandsTable.html | 183 ++++++++---------------
 doc/doc_html/Properties.html       | 204 ++++++++++---------------
 doc/doc_html/TangoDevStates.html   | 177 +++++++---------------
 doc/doc_html/index.html            | 178 ++++++----------------
 9 files changed, 435 insertions(+), 915 deletions(-)

diff --git a/doc/doc_html/Attributes.html b/doc/doc_html/Attributes.html
index 1c88911..9a6dff5 100755
--- a/doc/doc_html/Attributes.html
+++ b/doc/doc_html/Attributes.html
@@ -1,114 +1,69 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-<HEAD>
-<Title> Tango Device Server User's Guide </Title>
-</HEAD>
-<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#7F00FF" ALINK="#FF0000">
+<html>
+<head>
 
-<P><!-------TITLE------></P>
+	<title> Tango Device Server User's Guide </title>
+</head>
 
-<TABLE BORDER="0" WIDTH="100%">
-    <TR>
-        <TD ALIGN="left">
-			<A HREF="http://www.esrf.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/gifs/logo/80.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.elettra.trieste.it/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/elettra_logo.gif" BORDER=0 Height="60"></A>
+<body>
+	<center>
+		<h1>
+			SingleShotAO Generic Device <br>
+			Device Attributes Description <br><Br>
+			SingleShotAO Class <br>
+		</h1>
+		<b>
+			Revision: - Author: buteau
+		</b>
+	</center>
 
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.synchrotron-soleil.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/soleil_logo.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.cells.es/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/alba.jpg" BORDER=0 Height="54"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.desy.de/html/home/index_eng.html" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/desy.gif" BORDER=0 Height="60"></A>
-		</Td>
-    	 <Td>
-			<H2><FONT COLOR="#7F00FF">
-			<Center><A HREF="http://www.tango-controls.org/" TARGET="_top">
-					 TANGO </a> <Br> Device Server
-			</Center></FONT>
-		</Td>
-    </TR>
-</TABLE>
+	<table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%">
+		<tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+			<td COLSPAN=4>
+				<font Size=+2><center><b>Scalar Attributes</b></center></font>
+			</td>
+		</tr>
+		<tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+			<td>
+				<center><b>Attribute name</b>
+			</td>
+			</center>
+			<td>
+				<center><b>Data Type</b>
+			</td>
+			</center>
+			<td>
+				<center><b>R/W Type</b>
+			</td>
+			</center>
+			<td>
+				<center><b>Expert</b>
+			</td>
+			</center>
+		<tr>
+			<td><b>frequency</b>: <font Size=-1>Sampling frequency for
+					ramp generation on the board output channels, in
+					Hz.</font>
+			</td>
+			<td>
+				<center>
+					<font Size=-1>DEV_DOUBLE</font>
+				</center>
+			</td>
+			<td>
+				<center>
+					<font Size=-1>READ_WRITE</font>
+				</center>
+			</td>
+			<td>
+				<center>
+					<font Size=-1>Yes</font>
+				</center>
+			</td>
+		</tr>
 
-<HR WIDTH="100%"></H5>
-<Br>
-<center>
-<h1>
-SingleShotAO Generic Device		<Br>
-Device Attributes Description 		<Br> <Br>
-SingleShotAO Class	<Br>
-</h1>
-<b>
-Revision:  - Author: buteau
-</b>
+	</table>
 </center>
 
-
-<Br>
-<Table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<Td COLSPAN=4> <Font Size=+2><Center><b>Scalar Attributes</b></td></Font></Center>
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<Td><Center><b>Attribute name</b></td></Center>
-<Td><Center><b>Data Type</b></td></Center>
-<Td><Center><b>R/W Type</b></td></Center>
-<Td><Center><b>Expert</b></td></Center>
-<Tr><Td><b>frequency</b>: <Font Size=-1>Sampling frequency for ramp generation on the board output channels, in Hz.</Font></Td>
-<Td><Center><Font Size=-1>DEV_DOUBLE</Font></Center></Td><Td><Center><Font Size=-1>READ_WRITE</Font></Center></Td><Td><Center><Font Size=-1>Yes</Font></Center></Td></Tr>
-
-</Table>
-</Center>
-<Br><Br><Br><Br><Br>
-
-<!--- html Footer --->
-
-<Center>
-<Font size=-1>
-<br>
-<br>
-<TABLE BORDER="1" WIDTH="100%">
-    <Tr>
-		<!--- Hosted by Sourceforge --->
-        <Td Align="Center">
-			<Font size=-1>
-			<b>TANGO</b> is an open source project hosted by :<br>
-			<A href="http://sourceforge.net" Target="new">
-					<IMG title="Sourceforge logo"
-						alt="Sourceforge logo small"
-						src="http://www.esrf.fr/computing/cs/tango/sourceforge.gif"
-						border=0> </a>
-			</Font>
-		</Td>
-		<!--- 2 Sourceforge Repositories --->
-		<Td Align="Center">
-			<Font size=-1>
-			Core and Tools :
-			<a href="http://tango-cs.cvs.sourceforge.net/tango-cs/" Target="new">
-			CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-cs" Target=new>
-			tango-cs project</a>
-
-			<br>
-
-			Device Servers :
-			<a href="http://tango-ds.cvs.sourceforge.net/tango-ds/" Target="new">
-					CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-ds" Target=new>
-					tango-ds project</a>
-			</Font>
-		</Td>
-    </Tr>
-</Table>
-</Font>
-</Center>
 </body>
 </html>
diff --git a/doc/doc_html/Description.html b/doc/doc_html/Description.html
index e9447e2..b63c5d3 100755
--- a/doc/doc_html/Description.html
+++ b/doc/doc_html/Description.html
@@ -1,129 +1,26 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-<HEAD>
-<Title> Tango Device Server User s Guide </Title>
-</HEAD>
-<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#7F00FF" ALINK="#FF0000">
+<html>
+
+<head>
+    <title> Tango Device Server User s Guide </title>
+</head>
+
+<body>
+    <center>
+        <h1>
+            SingleShotAO Generic Device <br>
+            Device Description <br> <br>
+            SingleShotAO Class <br>
+        </h1>
+        <b>
+            Revision: - Author: buteau
+        </b>
+    </center>
+
+    <center>
+        ADLink boards support for single shot AO operations [PCI-6208 and
+        compatible boards]
+    </center>
 
-<P><!-------TITLE------></P>
-<TABLE BORDER="0" WIDTH="100%">
-    <TR>
-        <TD ALIGN="left">
-            <A HREF="http://www.esrf.fr/" TARGET=new>
-            <IMG SRC="http://www.esrf.fr/gifs/logo/80.gif" BORDER=0 Height="60"></A>
-
-        </TD>
-        <TD ALIGN="center">
-            <A HREF="http://www.elettra.trieste.it/" TARGET=new>
-            <IMG SRC="http://www.esrf.fr/computing/cs/tango/elettra_logo.gif" BORDER=0 Height="60"></A>
-        </TD>
-        <TD ALIGN="center">
-            <A HREF="http://www.synchrotron-soleil.fr/" TARGET=new>
-            <IMG SRC="http://www.esrf.fr/computing/cs/tango/soleil_logo.gif" BORDER=0 Height="60"></A>
-        </TD>
-
-        <TD ALIGN="center">
-            <A HREF="http://www.cells.es/" TARGET=new>
-            <IMG SRC="http://www.esrf.fr/computing/cs/tango/alba.jpg" BORDER=0 Height="45"></A>
-        </TD>
-        <TD ALIGN="Right">
-            <H2><FONT COLOR="#7F00FF">
-            <Br><Center><A HREF="http://www.tango-controls.org/" TARGET="_top"> TANGO </a> 
-            </Center></FONT>
-
-       </TD>
-    </TR>
-    <TR>
-        <TD ALIGN="left">
-            <A HREF="http://www.desy.de/html/home/index_eng.html" TARGET=new>
-            <IMG SRC="http://www.esrf.fr/computing/cs/tango/desy.gif" BORDER=0 Height="44"></A>
-        </TD>
-        <TD ALIGN="center">
-            <A HREF="http://www.maxlab.lu.se/maxlab/max4/index.html" TARGET=new>
-
-            <IMG SRC="http://www.esrf.fr/computing/cs/tango/maxlab.gif" BORDER=0 Height="40"></A>
-        </TD>
-        <TD ALIGN="center">
-            <A HREF="http://www.frm2.tum.de/en/index.html" TARGET=new>
-            <IMG SRC="http://www.esrf.fr/computing/cs/tango/frm-2.jpg" BORDER=0 Height="45"></A>
-        </TD>
-            <TD>
-            <!-- Empty -->
-        </TD>
-
-        <TD ALIGN="Right">
-            <H2><FONT COLOR="#7F00FF">
-            <Center> Device Servers
-            </Center></FONT>
-        </TD>
-    </TR>
-</TABLE>
-
-<HR WIDTH="100%"></H5>
-
-
-
-
-<HR WIDTH="100%"></H5>
-<Br>
-<center>
-<h1>
-SingleShotAO Generic Device		<Br>
-Device Description 		<Br> <Br>
-SingleShotAO Class	<Br>
-</h1>
-<b>
-Revision:  - Author: buteau
-</b>
-</center>
-
-
-<Center>
-ADLink boards support for single shot AO operations [PCI-6208 and compatible boards]
-<Br>
-<Br>
-</Center>
-
-<!--- html Footer --->
-
-<Center>
-<Font size=-1>
-<br>
-<br>
-<TABLE BORDER="1" WIDTH="100%">
-    <Tr>
-		<!--- Hosted by Sourceforge --->
-        <Td Align="Center">
-			<Font size=-1>
-			<b>TANGO</b> is an open source project hosted by :<br>
-			<A href="http://sourceforge.net" Target="new">
-					<IMG title="Sourceforge logo"
-						alt="Sourceforge logo small"
-						src="http://www.esrf.fr/computing/cs/tango/sourceforge.gif"
-						border=0> </a>
-			</Font>
-		</Td>
-		<!--- 2 Sourceforge Repositories --->
-		<Td Align="Center">
-			<Font size=-1>
-			Core and Tools :
-			<a href="http://tango-cs.cvs.sourceforge.net/tango-cs/" Target="new">
-			CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-cs" Target=new>
-			tango-cs project</a>
-
-			<br>
-
-			Device Servers :
-			<a href="http://tango-ds.cvs.sourceforge.net/tango-ds/" Target="new">
-					CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-ds" Target=new>
-					tango-ds project</a>
-			</Font>
-		</Td>
-    </Tr>
-</Table>
-</Font>
-</Center>
 </body>
 </html>
diff --git a/doc/doc_html/DevCommands.html b/doc/doc_html/DevCommands.html
index 306b671..9dbd3bf 100755
--- a/doc/doc_html/DevCommands.html
+++ b/doc/doc_html/DevCommands.html
@@ -1,162 +1,90 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
 <HTML>
+
 <HEAD>
-<Title> Tango Device Server User's Guide </Title>
+    <Title> Tango Device Server User's Guide </Title>
 </HEAD>
-<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#7F00FF" ALINK="#FF0000">
-
-<P><!-------TITLE------></P>
-
-<TABLE BORDER="0" WIDTH="100%">
-    <TR>
-        <TD ALIGN="left">
-			<A HREF="http://www.esrf.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/gifs/logo/80.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.elettra.trieste.it/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/elettra_logo.gif" BORDER=0 Height="60"></A>
-
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.synchrotron-soleil.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/soleil_logo.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.cells.es/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/alba.jpg" BORDER=0 Height="54"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.desy.de/html/home/index_eng.html" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/desy.gif" BORDER=0 Height="60"></A>
-		</Td>
-    	 <Td>
-			<H2><FONT COLOR="#7F00FF">
-			<Center><A HREF="http://www.tango-controls.org/" TARGET="_top">
-					 TANGO </a> <Br> Device Server
-			</Center></FONT>
-		</Td>
-    </TR>
-</TABLE>
 
-<HR WIDTH="100%"></H5>
-<Br>
-<center>
-<h1>
-SingleShotAO Generic Device		<Br>
-Device Commands Description 		<Br> <Br>
-SingleShotAO Class	<Br>
-</h1>
-<b>
-Revision:  - Author: buteau
-</b>
-</center>
+<BODY>
+    <center>
+        <h1>
+            SingleShotAO Generic Device <br>
+            Device Commands Description <br> <br>
+            SingleShotAO Class <br>
+        </h1>
+        <b>
+            Revision: - Author: buteau
+        </b>
+    </center>
 
+    <h2>1 - Init</h2>
+    <ul>
+        <Li><Strong>Description: </Strong><br>
+            This command re-initialises a device keeping the same network connection. <br>
+            After an Init command executed on a device, it is not necessary for the client to re-connect to the device. <br>
+            This command first calls the device <i>delete_device()</i> method and then executes its <i>init_device()</i> method. <br>
+            For C++ device server, all the memory allocated in the <i>init_device()</i> method must be freed in the <i>delete_device()</i> method.<br>
+            The language device destructor automatically calls the <i>delete_device()</i> method.<br>
+        </Li>
+        <Li><Strong>Argin: DEV_VOID</Strong></Li>
+        <Li><Strong>Argout: DEV_VOID</Strong></Li>
+        <Li><Strong>Command allowed for: </Strong>
+            <Ul>
+                <Li>Tango::FAULT</Li>
+                <Li>Tango::ON</Li>
+                <Li>Tango::INIT</Li>
+                <Li>Tango::MOVING</Li>
+            </Ul>
+        </Li>
+    </ul> 
+     
 
-<Br>
-<Br>
-<Br>
-<A NAME="Init"><!-- --></A>
-<A NAME="Init"><!-- --></A>
-<h2>1 - Init</h2>
-<ul>
-<Li><Strong>Description: </Strong> This commands re-initialise a device keeping the same network connection.<Br>
-After an Init command executed on a device, it is not necessary for client to re-connect to the device.<Br>
-This command first calls the device <i> delete_device() </i>method and then execute its <i> init_device()</i> method.<Br>
-For C++ device server, all the memory allocated in the <i> nit_device() </i> method must be freed in the <i> delete_device() </i> method.<Br>
-The language device desctructor automatically calls the <i> delete_device() </i> method.<Br>&nbsp
-<Li><Strong>Argin:<Br>DEV_VOID</Strong>
- : none.<Br>&nbsp
-<Li><Strong>Argout:<Br>DEV_VOID</Strong>
- : none.<Br>&nbsp
-<Li><Strong>Command allowed for: </Strong><Ul>
-<Li>Tango::FAULT<Li>Tango::ON<Li>Tango::INIT<Li>Tango::MOVING</Ul>
-<Br>&nbsp
-</ul><Br>
-<Br>
-<A NAME="State"><!-- --></A>
-<A NAME="State"><!-- --></A>
-<h2>2 - State</h2>
-<ul>
-<Li><Strong>Description: </Strong> This command gets the device state (stored in its <i>device_state</i> data member) and returns it to the caller.<Br>&nbsp
-<Li><Strong>Argin:<Br>DEV_VOID</Strong>
- : none.<Br>&nbsp
-<Li><Strong>Argout:<Br>DEV_STATE</Strong>
- : State Code<Br>&nbsp
-<Li><Strong>Command allowed for: </Strong><Ul>
-<Li>Tango::FAULT<Li>Tango::ON<Li>Tango::INIT<Li>Tango::MOVING</Ul>
-<Br>&nbsp
-</ul><Br>
-<Br>
-<A NAME="Status"><!-- --></A>
-<A NAME="Status"><!-- --></A>
-<h2>3 - Status</h2>
-<ul>
-<Li><Strong>Description: </Strong> This command gets the device status (stored in its <i>device_status</i> data member) and returns it to the caller.<Br>&nbsp
-<Li><Strong>Argin:<Br>DEV_VOID</Strong>
- : none.<Br>&nbsp
-<Li><Strong>Argout:<Br>CONST_DEV_STRING</Strong>
- : Status description<Br>&nbsp
-<Li><Strong>Command allowed for: </Strong><Ul>
-<Li>Tango::FAULT<Li>Tango::ON<Li>Tango::INIT<Li>Tango::MOVING</Ul>
-<Br>&nbsp
-</ul><Br>
-<Br>
-<A NAME="Abort"><!-- --></A>
-<A NAME="Abort"><!-- --></A>
-<h2>4 - Abort</h2>
-<ul>
-<Li><Strong>Description: </Strong> Aborts ramps in progress.<Br>&nbsp
-<Li><Strong>Argin:<Br>DEV_VOID</Strong>
- : <Br>&nbsp
-<Li><Strong>Argout:<Br>DEV_VOID</Strong>
- : <Br>&nbsp
-<Li><Strong>Command allowed for: </Strong><Ul>
-<Li>Tango::FAULT<Li>Tango::ON<Li>Tango::INIT<Li>Tango::MOVING</Ul>
-<Br>&nbsp
-</ul><Br>
-<Br>
+    <h2>2 - State</h2>
+    <ul>
+        <Li><Strong>Description: </Strong> This command gets the device state (stored in its <i>device_state</i> data member) and returns it to the caller.
+        <Li><Strong>Argin: DEV_VOID</Strong></Li>
+        <Li><Strong>Argout: DEV_STATE</Strong></Li>
+        <Li><Strong>Command allowed for: </Strong>
+            <Ul>
+                <Li>Tango::FAULT</Li>
+                <Li>Tango::ON</Li>
+                <Li>Tango::INIT</Li>
+                <Li>Tango::MOVING</Li>
+            </Ul>
+        </Li>
+    </ul> 
+     
 
-<!--- html Footer --->
+    <h2>3 - Status</h2>
+    <ul>
+        <Li><Strong>Description: </Strong> This command gets the device status (stored in its <i>device_status</i> data member) and returns it to the caller.</Li>
+        <Li><Strong>Argin: DEV_VOID</Strong></Li>
+        <Li><Strong>Argout: CONST_DEV_STRING</Strong></Li>
+        <Li><Strong>Command allowed for: </Strong>
+            <Ul>
+                <Li>Tango::FAULT</Li>
+                <Li>Tango::ON</Li>
+                <Li>Tango::INIT</Li>
+                <Li>Tango::MOVING</Li>
+            </Ul>
+        </Li>
+    </ul> 
+     
 
-<Center>
-<Font size=-1>
-<br>
-<br>
-<TABLE BORDER="1" WIDTH="100%">
-    <Tr>
-		<!--- Hosted by Sourceforge --->
-        <Td Align="Center">
-			<Font size=-1>
-			<b>TANGO</b> is an open source project hosted by :<br>
-			<A href="http://sourceforge.net" Target="new">
-					<IMG title="Sourceforge logo"
-						alt="Sourceforge logo small"
-						src="http://www.esrf.fr/computing/cs/tango/sourceforge.gif"
-						border=0> </a>
-			</Font>
-		</Td>
-		<!--- 2 Sourceforge Repositories --->
-		<Td Align="Center">
-			<Font size=-1>
-			Core and Tools :
-			<a href="http://tango-cs.cvs.sourceforge.net/tango-cs/" Target="new">
-			CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-cs" Target=new>
-			tango-cs project</a>
-
-			<br>
-
-			Device Servers :
-			<a href="http://tango-ds.cvs.sourceforge.net/tango-ds/" Target="new">
-					CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-ds" Target=new>
-					tango-ds project</a>
-			</Font>
-		</Td>
-    </Tr>
-</Table>
-</Font>
-</Center>
+    <h2>4 - Abort</h2>
+    <ul>
+        <Li><Strong>Description: </Strong> Aborts ramps in progress.</Li>
+        <Li><Strong>Argin: DEV_VOID</Strong></Li>
+        <Li><Strong>Argout: DEV_VOID</Strong></Li>
+        <Li><Strong>Command allowed for: </Strong>
+            <Ul>
+                <Li>Tango::FAULT</Li>
+                <Li>Tango::ON</Li>
+                <Li>Tango::INIT</Li>
+                <Li>Tango::MOVING</Li>
+            </Ul>
+        </Li>
+    </ul> 
 </body>
-</html>
+
+</html>
\ No newline at end of file
diff --git a/doc/doc_html/DevCommandsFrame.html b/doc/doc_html/DevCommandsFrame.html
index a696d50..8938ab2 100755
--- a/doc/doc_html/DevCommandsFrame.html
+++ b/doc/doc_html/DevCommandsFrame.html
@@ -1,19 +1,20 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-<HEAD>
-<Title> Tango Device Server User's Guide </Title>
-</HEAD>
+<html>
+    <head>
+        <title> Tango Device Server User's Guide </title>
+    </head>
 
-<FRAMESET cols="20%,80%">
-<FRAME src="DevCommandsList.html" name="DevCommandsList">
-<FRAME src="DevCommands.html" name="DevCommands">
-</FRAMESET>
-<NOFRAMES>
-<H2>
-Frame Alert</H2>
+    <frameset cols="20%,80%">
+        <frame src="DevCommandsList.html" name="DevCommandsList">
+        <frame src="DevCommands.html" name="DevCommands">
+    </frameset>
+    <noframes>
+        <h2>
+            Frame Alert</h2>
 
-<P>
-This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
-<BR>
-Link to <A HREF="DevCommands.html">Non-frame version.</A></NOFRAMES>
-</HTML>
+        <p>
+            This document is designed to be viewed using the frames feature. If
+            you see this message, you are using a non-frame-capable web client.
+            <br>
+            Link to <a HREF="DevCommands.html">Non-frame version.</a></noframes>
+    </html>
diff --git a/doc/doc_html/DevCommandsList.html b/doc/doc_html/DevCommandsList.html
index dff7f08..c69789b 100755
--- a/doc/doc_html/DevCommandsList.html
+++ b/doc/doc_html/DevCommandsList.html
@@ -1,18 +1,17 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML><HEAD>
-<TITLE>Commands
-</TITLE></HEAD>
-<BODY BGCOLOR="white">
-<FONT size="+1" ID="FrameHeadingFont">
-<B>Commands:</B></FONT>
-<Br>
-<Br>
-<Br>
-<A Href="DevCommands.html#Init" TARGET="DevCommands"> Init</a><Br>
-<A Href="DevCommands.html#State" TARGET="DevCommands"> State</a><Br>
-<A Href="DevCommands.html#Status" TARGET="DevCommands"> Status</a><Br>
-<A Href="DevCommands.html#Abort" TARGET="DevCommands"> Abort</a><Br>
+<html><head>
+        <title>Commands
+        </title></head>
+    <body BGCOLOR="white">
+        <font size="+1" ID="FrameHeadingFont">
+            <b>Commands:</b></font>
+        <br>
+        <br>
+        <br>
+        <a Href="DevCommands.html#Init" TARGET="DevCommands"> Init</a><br>
+        <a Href="DevCommands.html#State" TARGET="DevCommands"> State</a><br>
+        <a Href="DevCommands.html#Status" TARGET="DevCommands"> Status</a><br>
+        <a Href="DevCommands.html#Abort" TARGET="DevCommands"> Abort</a><br>
 
-
-</BODY>
-</HTML>
+    </body>
+</html>
diff --git a/doc/doc_html/DevCommandsTable.html b/doc/doc_html/DevCommandsTable.html
index 7c2194a..4cd1eb4 100755
--- a/doc/doc_html/DevCommandsTable.html
+++ b/doc/doc_html/DevCommandsTable.html
@@ -1,126 +1,63 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-<HEAD>
-<Title> Tango Device Server User's Guide </Title>
-</HEAD>
-<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#7F00FF" ALINK="#FF0000">
+<html>
+
+<head>
+    <title> Tango Device Server User's Guide </title>
+</head>
+
+<body>
+    <center>
+        <h1>
+            SingleShotAO Generic Device <br>
+            Device Commands Description <br><br>
+            SingleShotAO Class <br>
+        </h1>
+        <b>
+            Revision: - Author: buteau
+        </b>
+    </center>
+
+    <center>
+        <br><a Href="DevCommandsFrame.html"> More Details on commands.... </a><br><br>
+
+        <table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%">
+            <tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+                <td COLSPAN=3>
+                    <font Size=+2><center>
+                        <b>Device Commands for Operator Level</b>
+                    </center></font>
+                </td>
+            </tr>
+
+            <tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+                <td><b>Command name</b></td>
+                <td><b>Argument In</b></td>
+                <td><b>Argument Out</b></td>
+            </tr>
+            <tr>
+                <td><b>Init</b></td>
+                <td>DEV_VOID</td>
+                <td>DEV_VOID</td>
+            </tr>
+            <tr>
+                <td><b>State</b></td>
+                <td>DEV_VOID</td>
+                <td>DEV_STATE</td>
+            </tr>
+            <tr>
+                <td><b>Status</b></td>
+                <td>DEV_VOID</td>
+                <td>CONST_DEV_STRING</td>
+            </tr>
+            <tr>
+                <td><b>Abort</b></td>
+                <td>DEV_VOID</td>
+                <td>DEV_VOID</td>
+            </tr>
+
+        </table>
+    </center>
 
-<P><!-------TITLE------></P>
-
-<TABLE BORDER="0" WIDTH="100%">
-    <TR>
-        <TD ALIGN="left">
-			<A HREF="http://www.esrf.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/gifs/logo/80.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.elettra.trieste.it/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/elettra_logo.gif" BORDER=0 Height="60"></A>
-
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.synchrotron-soleil.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/soleil_logo.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.cells.es/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/alba.jpg" BORDER=0 Height="54"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.desy.de/html/home/index_eng.html" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/desy.gif" BORDER=0 Height="60"></A>
-		</Td>
-    	 <Td>
-			<H2><FONT COLOR="#7F00FF">
-			<Center><A HREF="http://www.tango-controls.org/" TARGET="_top">
-					 TANGO </a> <Br> Device Server
-			</Center></FONT>
-		</Td>
-    </TR>
-</TABLE>
-
-<HR WIDTH="100%"></H5>
-<Br>
-<center>
-<h1>
-SingleShotAO Generic Device		<Br>
-Device Commands Description 		<Br> <Br>
-SingleShotAO Class	<Br>
-</h1>
-<b>
-Revision:  - Author: buteau
-</b>
-</center>
-
-
-<Center>
-<Br><Br>
-<A Href="DevCommandsFrame.html"> More Details on commands.... </a><Br>
-<Br> <Br>
-<Table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<Td COLSPAN=3> <Font Size=+2><Center><b>Device Commands for Operator Level</b></td></Font></Center>
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<Td><Center><b>Command name</b></td></Center>
-<Td><Center><b>Argument In</b></td></Center>
-<Td><Center><b>Argument Out</b></td></Center>
-<Tr><Td><b>Init</b></Td>
-<Td><Font Size=-1>DEV_VOID</Font></Td>
-<Td><Font Size=-1>DEV_VOID</Font></Td>
-<Tr><Td><b>State</b></Td>
-<Td><Font Size=-1>DEV_VOID</Font></Td>
-<Td><Font Size=-1>DEV_STATE</Font></Td>
-<Tr><Td><b>Status</b></Td>
-<Td><Font Size=-1>DEV_VOID</Font></Td>
-<Td><Font Size=-1>CONST_DEV_STRING</Font></Td>
-<Tr><Td><b>Abort</b></Td>
-<Td><Font Size=-1>DEV_VOID</Font></Td>
-<Td><Font Size=-1>DEV_VOID</Font></Td>
-
-
-
-</Table></Center>
-
-<!--- html Footer --->
-
-<Center>
-<Font size=-1>
-<br>
-<br>
-<TABLE BORDER="1" WIDTH="100%">
-    <Tr>
-		<!--- Hosted by Sourceforge --->
-        <Td Align="Center">
-			<Font size=-1>
-			<b>TANGO</b> is an open source project hosted by :<br>
-			<A href="http://sourceforge.net" Target="new">
-					<IMG title="Sourceforge logo"
-						alt="Sourceforge logo small"
-						src="http://www.esrf.fr/computing/cs/tango/sourceforge.gif"
-						border=0> </a>
-			</Font>
-		</Td>
-		<!--- 2 Sourceforge Repositories --->
-		<Td Align="Center">
-			<Font size=-1>
-			Core and Tools :
-			<a href="http://tango-cs.cvs.sourceforge.net/tango-cs/" Target="new">
-			CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-cs" Target=new>
-			tango-cs project</a>
-
-			<br>
-
-			Device Servers :
-			<a href="http://tango-ds.cvs.sourceforge.net/tango-ds/" Target="new">
-					CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-ds" Target=new>
-					tango-ds project</a>
-			</Font>
-		</Td>
-    </Tr>
-</Table>
-</Font>
-</Center>
 </body>
-</html>
+
+</html>
\ No newline at end of file
diff --git a/doc/doc_html/Properties.html b/doc/doc_html/Properties.html
index 3f676a0..388a562 100755
--- a/doc/doc_html/Properties.html
+++ b/doc/doc_html/Properties.html
@@ -1,144 +1,94 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
 <HTML>
+
 <HEAD>
-<Title> Tango Device Server User's Guide </Title>
+    <Title> Tango Device Server User's Guide </Title>
 </HEAD>
-<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#7F00FF" ALINK="#FF0000">
-
-<P><!-------TITLE------></P>
-
-<TABLE BORDER="0" WIDTH="100%">
-    <TR>
-        <TD ALIGN="left">
-			<A HREF="http://www.esrf.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/gifs/logo/80.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.elettra.trieste.it/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/elettra_logo.gif" BORDER=0 Height="60"></A>
-
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.synchrotron-soleil.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/soleil_logo.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.cells.es/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/alba.jpg" BORDER=0 Height="54"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.desy.de/html/home/index_eng.html" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/desy.gif" BORDER=0 Height="60"></A>
-		</Td>
-    	 <Td>
-			<H2><FONT COLOR="#7F00FF">
-			<Center><A HREF="http://www.tango-controls.org/" TARGET="_top">
-					 TANGO </a> <Br> Device Server
-			</Center></FONT>
-		</Td>
-    </TR>
-</TABLE>
-
-<HR WIDTH="100%"></H5>
-<Br>
-<center>
-<h1>
-SingleShotAO Generic Device		<Br>
-Properties Description 		<Br> <Br>
-SingleShotAO Class	<Br>
-</h1>
-<b>
-Revision:  - Author: buteau
-</b>
-</center>
-
-
-<Center>
-<Br> <Br> <Br> 
-<Table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<Td COLSPAN=3> <Font Size=+2><Center><b>Device Properties</b></td></Font></Center>
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<Td><Center><b>Property name</b></td></Center>
-<Td><Center><b>Property type</b></td></Center>
-<Td><Center><b>Description</b></td></Center>
-<Tr><Td><b><a href=#Dev_DefaultValues>BoardNum </a></b></Td>
-<Td><Font Size=-1>Tango::DEV_SHORT</Font></Td>
-<Td><Font Size=-1>The the board identifier in the cPCI crate [valid range is 0...7 - no default value] .</Font></Td></Tr>
 
-<Tr><Td><b><a href=#Dev_DefaultValues>BoardType </a></b></Td>
-<Td><Font Size=-1>Tango::DEV_STRING</Font></Td>
-<Td><Font Size=-1>The board type [MAO_xxxx - where <xxxx> is the ADlink board identifier - e.g. MAO_6208 - no default value]</Font></Td></Tr>
+<BODY>
+    <center>
+        <h1>
+            SingleShotAO Generic Device <Br>
+            Properties Description <Br><Br>
+            SingleShotAO Class <Br>
+        </h1>
+        <b>
+            Revision: - Author: buteau
+        </b>
+    </center>
 
-</Table>
 
-</Center>
-<Br><Br><Br>
-<Br><Br><Br>
-
-<A name=Dev_DefaultValues><!---  ---></a>
-<Font Size=+1>Device Properties Default Values:</Font><Br>
-<Table Border=2 Cellpadding=2 CELLSPACING=2>
-    <tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-        <Td><b>Property Name</b></td>
-        <td><b>Default Values</b></td>
-    </Tr>
+    <Center>
+        <Table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%">
+            <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+                <Td COLSPAN=3>
+                    <Font Size=+2>
+                        <Center><b>Device Properties</b>
+                </td>
+                </Font>
+    </Center>
+    <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+        <Td>
+            <Center><b>Property name</b>
+        </td>
+        </Center>
+        <Td>
+            <Center><b>Property type</b>
+        </td>
+        </Center>
+        <Td>
+            <Center><b>Description</b>
+        </td>
+        </Center>
     <Tr>
-        <Td>BoardNum</Td>
-        <td>No default value</td>
+        <Td><b><a href=#Dev_DefaultValues>BoardNum </a></b></Td>
+        <Td>
+            <Font Size=-1>Tango::DEV_SHORT</Font>
+        </Td>
+        <Td>
+            <Font Size=-1>The the board identifier in the cPCI crate [valid range is 0...7 - no default value] .</Font>
+        </Td>
     </Tr>
+
     <Tr>
-        <Td>BoardType</Td>
-        <td>No default value</td>
+        <Td><b><a href=#Dev_DefaultValues>BoardType </a></b></Td>
+        <Td>
+            <Font Size=-1>Tango::DEV_STRING</Font>
+        </Td>
+        <Td>
+            <Font Size=-1>The board type [MAO_xxxx - where <xxxx> is the ADlink board identifier - e.g. MAO_6208 - no
+                    default value]</Font>
+        </Td>
     </Tr>
-</Table>
 
-<Br><Br><Br>
-<Center><b>
-There is no Class properties.<Br><Br>
-</Center></b>
-<Br> <Br> <Br> 
+    </Table>
 
-<!--- html Footer --->
+    </Center>
 
-<Center>
-<Font size=-1>
-<br>
-<br>
-<TABLE BORDER="1" WIDTH="100%">
-    <Tr>
-		<!--- Hosted by Sourceforge --->
-        <Td Align="Center">
-			<Font size=-1>
-			<b>TANGO</b> is an open source project hosted by :<br>
-			<A href="http://sourceforge.net" Target="new">
-					<IMG title="Sourceforge logo"
-						alt="Sourceforge logo small"
-						src="http://www.esrf.fr/computing/cs/tango/sourceforge.gif"
-						border=0> </a>
-			</Font>
-		</Td>
-		<!--- 2 Sourceforge Repositories --->
-		<Td Align="Center">
-			<Font size=-1>
-			Core and Tools :
-			<a href="http://tango-cs.cvs.sourceforge.net/tango-cs/" Target="new">
-			CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-cs" Target=new>
-			tango-cs project</a>
+    <A name=Dev_DefaultValues><!---  ---></a>
+    <Font Size=+1>Device Properties Default Values:</Font><Br>
+    <Table Border=2 Cellpadding=2 CELLSPACING=2>
+        <tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+            <Td><b>Property Name</b></td>
+            <td><b>Default Values</b></td>
+        </Tr>
+        <Tr>
+            <Td>BoardNum</Td>
+            <td>No default value</td>
+        </Tr>
+        <Tr>
+            <Td>BoardType</Td>
+            <td>No default value</td>
+        </Tr>
+    </Table>
+
+    <Br><Br><Br>
+    <Center><b>
+            There is no Class properties.<Br><Br>
+    </Center></b>
+    <Br> <Br> <Br>
 
-			<br>
 
-			Device Servers :
-			<a href="http://tango-ds.cvs.sourceforge.net/tango-ds/" Target="new">
-					CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-ds" Target=new>
-					tango-ds project</a>
-			</Font>
-		</Td>
-    </Tr>
-</Table>
-</Font>
-</Center>
 </body>
-</html>
+
+</html>
\ No newline at end of file
diff --git a/doc/doc_html/TangoDevStates.html b/doc/doc_html/TangoDevStates.html
index 7d7aef3..57cc435 100755
--- a/doc/doc_html/TangoDevStates.html
+++ b/doc/doc_html/TangoDevStates.html
@@ -1,124 +1,59 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-<HEAD>
-<Title> Tango Device Server User's Guide </Title>
-</HEAD>
-<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#7F00FF" ALINK="#FF0000">
+<html>
+
+<head>
+    <title> Tango Device Server User's Guide </title>
+</head>
+
+<body>
+    <center>
+        <h1>
+            SingleShotAO Generic Device <br>
+            Device States Description <br> <br>
+            SingleShotAO Class <br>
+        </h1>
+        <b>
+            Revision: - Author: buteau
+        </b>
+    </center>
+
+    <center>
+        <table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%">
+            <tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+                <td COLSPAN=2>
+                    <font Size=+2><center>
+                        <b>States</b>
+                    </center></font>
+                </td>
+            </tr>
+
+            <tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+                <td><center><b>Names</b></center></td>
+                <td><center><b>Descriptions</b></center></td>
+            </tr>
+
+            <tr>
+                <td><b>FAULT</b></td>
+                <td><font Size=-1>Hardware / driver failure or fatal error occurred</font></td>
+            </tr>
+
+            <tr>
+                <td><b>ON</b></td>
+                <td><font Size=-1>Device ready to execute AO request</font></td>
+            </tr>
+
+            <tr>
+                <td><b>INIT</b></td>
+                <td><font Size=-1>Device initialization in progress</font></td>
+            </tr>
+
+            <tr>
+                <td><b>MOVING</b></td>
+                <td><font Size=-1>Ramp generation in progress</font></td>
+            </tr>
+        </table>
+    </center>
 
-<P><!-------TITLE------></P>
-
-<TABLE BORDER="0" WIDTH="100%">
-    <TR>
-        <TD ALIGN="left">
-			<A HREF="http://www.esrf.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/gifs/logo/80.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.elettra.trieste.it/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/elettra_logo.gif" BORDER=0 Height="60"></A>
-
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.synchrotron-soleil.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/soleil_logo.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.cells.es/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/alba.jpg" BORDER=0 Height="54"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.desy.de/html/home/index_eng.html" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/desy.gif" BORDER=0 Height="60"></A>
-		</Td>
-    	 <Td>
-			<H2><FONT COLOR="#7F00FF">
-			<Center><A HREF="http://www.tango-controls.org/" TARGET="_top">
-					 TANGO </a> <Br> Device Server
-			</Center></FONT>
-		</Td>
-    </TR>
-</TABLE>
-
-<HR WIDTH="100%"></H5>
-<Br>
-<center>
-<h1>
-SingleShotAO Generic Device		<Br>
-Device States Description 		<Br> <Br>
-SingleShotAO Class	<Br>
-</h1>
-<b>
-Revision:  - Author: buteau
-</b>
-</center>
-
-
-<Center>
-<Br> <Br> <Br> 
-<Table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<Td COLSPAN=2> <Font Size=+2><Center><b>States</b></td></Font></Center>
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<Td><Center><b>Names</b></td></Center>
-<Td><Center><b>Descriptions</b></td></Center>
-<Tr><Td><b>FAULT</b></Td>
-<Td><Font Size=-1>Hardware / driver failure or fatal error occurred</Font></Td></Tr>
-
-<Tr><Td><b>ON</b></Td>
-<Td><Font Size=-1>Device ready to execute AO request</Font></Td></Tr>
-
-<Tr><Td><b>INIT</b></Td>
-<Td><Font Size=-1>Device initialization in progress</Font></Td></Tr>
-
-<Tr><Td><b>MOVING</b></Td>
-<Td><Font Size=-1>Ramp generation in progress</Font></Td></Tr>
-
-
-
-
-</Table>
-</Center>
-
-<!--- html Footer --->
-
-<Center>
-<Font size=-1>
-<br>
-<br>
-<TABLE BORDER="1" WIDTH="100%">
-    <Tr>
-		<!--- Hosted by Sourceforge --->
-        <Td Align="Center">
-			<Font size=-1>
-			<b>TANGO</b> is an open source project hosted by :<br>
-			<A href="http://sourceforge.net" Target="new">
-					<IMG title="Sourceforge logo"
-						alt="Sourceforge logo small"
-						src="http://www.esrf.fr/computing/cs/tango/sourceforge.gif"
-						border=0> </a>
-			</Font>
-		</Td>
-		<!--- 2 Sourceforge Repositories --->
-		<Td Align="Center">
-			<Font size=-1>
-			Core and Tools :
-			<a href="http://tango-cs.cvs.sourceforge.net/tango-cs/" Target="new">
-			CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-cs" Target=new>
-			tango-cs project</a>
-
-			<br>
-
-			Device Servers :
-			<a href="http://tango-ds.cvs.sourceforge.net/tango-ds/" Target="new">
-					CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-ds" Target=new>
-					tango-ds project</a>
-			</Font>
-		</Td>
-    </Tr>
-</Table>
-</Font>
-</Center>
 </body>
-</html>
+
+</html>
\ No newline at end of file
diff --git a/doc/doc_html/index.html b/doc/doc_html/index.html
index abd508c..43e3bc5 100755
--- a/doc/doc_html/index.html
+++ b/doc/doc_html/index.html
@@ -1,142 +1,60 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-<HEAD>
-<Title> Tango Device Server User's Guide </Title>
-</HEAD>
-<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#7F00FF" ALINK="#FF0000">
-
-<P><!-------TITLE------></P>
-<TABLE BORDER="0" WIDTH="100%">
-    <TR>
-        <TD ALIGN="left">
-			<A HREF="http://www.esrf.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/gifs/logo/80.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.elettra.trieste.it/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/elettra_logo.gif" BORDER=0 Height="60"></A>
-
-		</Td>
-        <TD ALIGN="center">
-			<A HREF="http://www.synchrotron-soleil.fr/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/soleil_logo.gif" BORDER=0 Height="60"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.cells.es/" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/alba.jpg" BORDER=0 Height="54"></A>
-		</Td>
-        <TD ALIGN="right">
-			<A HREF="http://www.desy.de/html/home/index_eng.html" TARGET=new>
-			<IMG SRC="http://www.esrf.fr/computing/cs/tango/desy.gif" BORDER=0 Height="60"></A>
-		</Td>
-    	 <Td>
-			<H2><FONT COLOR="#7F00FF">
-			<Center><A HREF="http://www.tango-controls.org/" TARGET="_top">
-					 TANGO </a> <Br> Device Server
-			</Center></FONT>
-		</Td>
-    </TR>
-</TABLE>
+<html>
+
+<head>
+	<title> Tango Device Server User's Guide </title>
+</head>
+	
+<body>
+	<center>
+		<h1>
+			SingleShotAO Generic Device <br>
+			User's Guide <br><Br>
+			SingleShotAO Class <br>
+		</h1>
+		<b>
+			Revision: - Author: buteau <br>
+			Implemented in C++
+		</b>
+	</center>
+
+	<h2>Introduction:</h2>
+	<ul>
+		<li>ADLink boards support for single shot AO operations [PCI-6208 and compatible boards]</li>
+	</ul>
 
-<HR WIDTH="100%"></H5>
-<center>
-<h1>
-SingleShotAO Generic Device <Br>
-User's Guide <Br><Br>
-SingleShotAO Class<Br>
+	<h2>Class Identification:</h2>
+	<ul>
+		<li><b>Contact :</b> at synchrotron-soleil.fr - buteau</li>
+		<li><b>Class Family :</b> InputOutput</li>
+		<li><b>Platform :</b> All Platforms</li>
+		<li><b>Bus :</b> Compact PCI</li>
+	</ul>
 
-</h1>
-<b>
-Revision:  - Author: buteau <Br>
- Implemented in C++
-</b>
-</center>
-<Br>
-<Br>
-<Br>
-<Br>
-<h2>Introduction:</h2>
-<ul>
-	ADLink boards support for single shot AO operations [PCI-6208 and compatible boards]<Br>
-</ul>
-<Br><h2>Class Identification:</h2>
-<ul>
-	<li><b>Contact      :</b>	 at synchrotron-soleil.fr - buteau
-	<li><b>Class Family :</b>	InputOutput
-	<li><b>Platform     :</b>	All Platforms
-	<li><b>Bus          :</b>	Compact PCI
-</ul><Br>
-<h2>Class Inheritance:</h2>
+	<h2>Class Inheritance:</h2>
 	<ul>
-		<li> <a href="http://www.esrf.fr/computing/cs/tango/tango_doc/kernel_doc/cpp_doc/"> TANGO_BASE_CLASS</a></li>
+		<li> <a
+				href="http://www.esrf.fr/computing/cs/tango/tango_doc/kernel_doc/cpp_doc/">
+				TANGO_BASE_CLASS</a></li>
 		<ul>
 			<li> SingleShotAO</li>
-			</ul>
 		</ul>
 	</ul>
-</ul>
-<Br>
-<Br>
-<h2>Class Description:</h2>
-<ul>
-	<li> <a href=Description.html>      Device description.</a>
-	<li> <a href=Properties.html>       Properties description</a>
-	<li> <a href=TangoDevStates.html>   States description</a>
-	<li> <a href=DevCommandsTable.html> Commands description</a>
-	<li> <a href=Attributes.html>       Attributes description</a>
-</ul>
-<Br>
-<Br>
-<Br>
-<h2>Conclusion:</h2>
-<ul>
-	The device server is ready for distribution application programmers.<Br>
-	The author will be interested in any feedback which arise from their
-	usage of this device server.
-</ul>
-<Br>
-
 
-<!--- html Footer --->
-
-<Center>
-<Font size=-1>
-<br>
-<br>
-<TABLE BORDER="1" WIDTH="100%">
-    <Tr>
-		<!--- Hosted by Sourceforge --->
-        <Td Align="Center">
-			<Font size=-1>
-			<b>TANGO</b> is an open source project hosted by :<br>
-			<A href="http://sourceforge.net" Target="new">
-					<IMG title="Sourceforge logo"
-						alt="Sourceforge logo small"
-						src="http://www.esrf.fr/computing/cs/tango/sourceforge.gif"
-						border=0> </a>
-			</Font>
-		</Td>
-		<!--- 2 Sourceforge Repositories --->
-		<Td Align="Center">
-			<Font size=-1>
-			Core and Tools :
-			<a href="http://tango-cs.cvs.sourceforge.net/tango-cs/" Target="new">
-			CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-cs" Target=new>
-			tango-cs project</a>
-
-			<br>
+	<h2>Class Description:</h2>
+	<ul>
+		<li> <a href=Description.html> Device description.</a> </li>
+		<li> <a href=Properties.html> Properties description</a> </li>
+		<li> <a href=TangoDevStates.html> States description</a> </li>
+		<li> <a href=DevCommandsTable.html> Commands description</a> </li>
+		<li> <a href=Attributes.html> Attributes description</a> </li>
+	</ul>
+	
+	<h2>Conclusion:</h2>
+	<ul>
+		<li>The device server is ready for distribution application programmers.</li>
+		<li>The author will be interested in any feedback which arise from their usage of this device server.</li>
+	</ul>
 
-			Device Servers :
-			<a href="http://tango-ds.cvs.sourceforge.net/tango-ds/" Target="new">
-					CVS repository</a> on
-			<a href="https://sourceforge.net/projects/tango-ds" Target=new>
-					tango-ds project</a>
-			</Font>
-		</Td>
-    </Tr>
-</Table>
-</Font>
-</Center>
 </body>
 </html>
-- 
GitLab


From 854209fd040c83f0f911d4a68979b89fc65d6b8e Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Fri, 21 Feb 2025 13:53:27 +0100
Subject: [PATCH 08/11] chore(doc): add dynamic attributes to HTML
 documentation

---
 doc/doc_html/Attributes.html | 87 ++++++++++++++++++++++++++++++++----
 1 file changed, 79 insertions(+), 8 deletions(-)

diff --git a/doc/doc_html/Attributes.html b/doc/doc_html/Attributes.html
index 9a6dff5..63ac70c 100755
--- a/doc/doc_html/Attributes.html
+++ b/doc/doc_html/Attributes.html
@@ -25,21 +25,18 @@
 		</tr>
 		<tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
 			<td>
-				<center><b>Attribute name</b>
+				<center><b>Attribute name</b></center>
 			</td>
-			</center>
 			<td>
-				<center><b>Data Type</b>
+				<center><b>Data Type</b></center>
 			</td>
-			</center>
 			<td>
-				<center><b>R/W Type</b>
+				<center><b>R/W Type</b></center>
 			</td>
-			</center>
 			<td>
-				<center><b>Expert</b>
+				<center><b>Expert</b></center>
 			</td>
-			</center>
+		</tr>
 		<tr>
 			<td><b>frequency</b>: <font Size=-1>Sampling frequency for
 					ramp generation on the board output channels, in
@@ -61,7 +58,81 @@
 				</center>
 			</td>
 		</tr>
+	</table>
 
+	<br>
+
+	<table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%">
+		<tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+			<td COLSPAN=4>
+				<center>
+					<font Size=+2><b>Dynamic Scalar Attributes</b></font><br>
+					X is the channel number ranging from 0 to N-1 (<b>MAO_6208</b>: 8 channels, <b>MAO_6216</b>: 10 channels)
+				</center>
+			</td>
+		</tr>
+		<tr BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+			<td>
+				<center><b>Attribute name</b></center>
+			</td>
+			<td>
+				<center><b>Data Type</b></center>
+			</td>
+			<td>
+				<center><b>R/W Type</b></center>
+			</td>
+			<td>
+				<center><b>Description</b></center>
+			</td>
+		</tr>
+		<tr>
+			<td><b>channelX</b></td>
+			<td>
+				<center>
+					<font Size=-1>DEV_DOUBLE</font>
+				</center>
+			</td>
+			<td>
+				<center>
+					<font Size=-1>READ_WRITE</font>
+				</center>
+			</td>
+			<td>
+				<font Size=-1>Output value for channel X (in V). Valid range: [-10V, +10V]</font>
+			</td>
+		</tr>
+		<tr>
+			<td><b>speedX</b></td>
+			<td>
+				<center>
+					<font Size=-1>DEV_DOUBLE</font>
+				</center>
+			</td>
+			<td>
+				<center>
+					<font Size=-1>READ_WRITE</font>
+				</center>
+			</td>
+			<td>
+				<font Size=-1>Speed for ramp generation on channel X (in V/s). If speed is 0, no ramp is generated but direct write on channel output.</font>
+			</td>
+		</tr>
+		<tr>
+			<td><b>initialX</b></td>
+			<td>
+				<center>
+					<font Size=-1>DEV_DOUBLE</font>
+				</center>
+			</td>
+			<td>
+				<center>
+					<font Size=-1>READ_WRITE</font>
+				</center>
+			</td>
+			<td>
+				<font Size=-1>Initial value for ramp function on channel X (in V). Defaults to last written value in channel attribute.</font>
+			</td>
+		</tr>
 	</table>
 </center>
 
-- 
GitLab


From 4a82daf289fa54ec4f6c4b8205e9d0799f8fa96e Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Fri, 21 Feb 2025 13:57:58 +0100
Subject: [PATCH 09/11] feature/fix: memorize channel values on abort and abort
 on init

---
 src/SingleShotAO.cpp        | 50 ++++++++++++++++++++++++++++++++++---
 src/SingleShotAO.h          |  3 +++
 src/SingleShotAOManager.cpp |  8 ++++++
 src/SingleShotAOManager.h   |  3 +++
 4 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/src/SingleShotAO.cpp b/src/SingleShotAO.cpp
index 8b886ad..cc7f5b6 100755
--- a/src/SingleShotAO.cpp
+++ b/src/SingleShotAO.cpp
@@ -348,6 +348,28 @@ void SingleShotAO::init_device()
 	}
 
 
+	// Make sure running processes are aborted properly
+	//--------------------------------------------
+	try
+	{
+		_abort();
+	}
+	catch (Tango::DevFailed &df)
+	{
+		ERROR_STREAM << df << endl;
+		RETHROW_DEVFAILED(df,
+						  "DRIVER_FAILURE",
+						  "could not abort [caught Tango::DevFailed]",
+						  "SingleShotAO::init");
+	}
+	catch (...)
+	{
+		ERROR_STREAM << "SingleShotAO::init::unknown exception caught" << std::endl;
+		THROW_DEVFAILED("DRIVER_FAILURE",
+						"could not abort [unknown error]",
+						"SingleShotAO::init");
+	}
+
 	// Create dynamic attributes
 	//--------------------------------------------
 
@@ -990,11 +1012,9 @@ void SingleShotAO::write_initial(yat4tango::DynamicAttributeWriteCallbackData &
 void SingleShotAO::abort()
 {
 	DEBUG_STREAM << "SingleShotAO::abort(): entering... !" << endl;
-
-	CHECK_MANAGER();
 	try
 	{
-		m_manager->abort();
+		_abort();
 	}
 	catch(Tango::DevFailed& df)
 	{
@@ -1006,11 +1026,33 @@ void SingleShotAO::abort()
 	}
 	catch(...)
 	{
-		ERROR_STREAM << "SingleShotAOManager::abort::unknown exception caught"<<std::endl;
+		ERROR_STREAM << "SingleShotAO::abort::unknown exception caught"<< std::endl;
 		THROW_DEVFAILED("DRIVER_FAILURE",
 			"could not abort [unknown error]",
 			"SingleShotAO::abort");
 	}
 }
 
+void SingleShotAO::_abort()
+{
+	CHECK_MANAGER();
+
+	// 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)) {
+			DEBUG_STREAM << "Channel " << l_cpt << " is running. Memorizing values..." << std::endl;
+
+			double l_val_channel = m_manager->get_channel(l_cpt);
+			yat4tango::PropertyHelper::set_memorized_attribute(this, kCHANNEL + std::to_string(l_cpt), l_val_channel);
+			DEBUG_STREAM << "Memorizing channel " << l_cpt << " to " << l_val_channel << std::endl;
+
+			double l_val_initial = m_manager->get_initial(l_cpt);
+			yat4tango::PropertyHelper::set_memorized_attribute(this, kINITIAL + std::to_string(l_cpt), l_val_initial);
+			DEBUG_STREAM << "Memorizing initial " << l_cpt << " to " << l_val_initial << std::endl;
+		}
+	}
+	m_manager->abort();
+}
+
 }	//	namespace
diff --git a/src/SingleShotAO.h b/src/SingleShotAO.h
index d6d477f..8e259d0 100755
--- a/src/SingleShotAO.h
+++ b/src/SingleShotAO.h
@@ -279,6 +279,9 @@ protected :
 	//- channel number
 	unsigned short m_nb_chan;
 
+	
+	void	_abort();
+
 };
 
 }	// namespace_ns
diff --git a/src/SingleShotAOManager.cpp b/src/SingleShotAOManager.cpp
index 5d7b57a..e0519ec 100755
--- a/src/SingleShotAOManager.cpp
+++ b/src/SingleShotAOManager.cpp
@@ -440,6 +440,14 @@ void SingleShotAOManager::set_speed(ChannelId_t p_chIdx, Intial_t p_speed)
 	}
 }
 
+// ============================================================================
+// SingleShotAOManager::is_running ()
+// ============================================================================
+bool SingleShotAOManager::is_running(ChannelId_t p_chIdx)
+{
+	return m_isRunning[p_chIdx];
+}
+
 // ============================================================================
 // SingleShotAOManager::abort ()
 // ============================================================================
diff --git a/src/SingleShotAOManager.h b/src/SingleShotAOManager.h
index ccabfce..a021036 100755
--- a/src/SingleShotAOManager.h
+++ b/src/SingleShotAOManager.h
@@ -74,6 +74,9 @@ public:
   //- set speed
   void set_speed(ChannelId_t p_chIdx, Intial_t p_speed);
 
+  //- is running
+  bool is_running(ChannelId_t p_chIdx);
+
   //- abort
   void abort();
 
-- 
GitLab


From a9fd52415c2455043f4e7da54a5a8b0e3d5f221e Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Fri, 21 Feb 2025 14:34:48 +0100
Subject: [PATCH 10/11] fix: abort in delete_device (and inherently in init and
 exit)

---
 src/SingleShotAO.cpp | 70 ++++++++++++++++++++++++--------------------
 1 file changed, 39 insertions(+), 31 deletions(-)

diff --git a/src/SingleShotAO.cpp b/src/SingleShotAO.cpp
index cc7f5b6..699767f 100755
--- a/src/SingleShotAO.cpp
+++ b/src/SingleShotAO.cpp
@@ -129,7 +129,32 @@ SingleShotAO::SingleShotAO(Tango::DeviceClass *cl,const char *s,const char *d)
 //-----------------------------------------------------------------------------
 void SingleShotAO::delete_device()
 {
-	//	Delete device allocated objects
+	DEBUG_STREAM << "SingleShotAO::delete_device(): entering... !" << endl;
+
+	// Make sure running processes are aborted properly if channels are running
+	//--------------------------------------------
+	try
+	{
+		_abort();
+	}
+	catch (Tango::DevFailed &df)
+	{
+		ERROR_STREAM << df << endl;
+		RETHROW_DEVFAILED(df,
+						  "DRIVER_FAILURE",
+						  "could not abort [caught Tango::DevFailed]",
+						  "SingleShotAO::delete_device");
+	}
+	catch (...)
+	{
+		ERROR_STREAM << "SingleShotAO::init::unknown exception caught" << std::endl;
+		THROW_DEVFAILED("DRIVER_FAILURE",
+						"could not abort [unknown error]",
+						"SingleShotAO::delete_device");
+	}
+
+	// Delete device allocated objects
+	//--------------------------------------------
 	yat4tango::TraceHelper t("SingleShotAO::delete_device", this);
 
 	if (m_manager)
@@ -138,14 +163,16 @@ void SingleShotAO::delete_device()
 		m_manager = NULL;
 	}
 
-	//- release the asl::SingleShotAO object
+	// Release the asl::SingleShotAO object
+	//--------------------------------------------
 	if (m_ssao) 
 	{
 		delete m_ssao;
 		m_ssao = NULL;
 	}
 
-	// remove dynamic attributes 
+	// Remove dynamic attributes
+	//--------------------------------------------
 	if (m_dyn_attr_manager)
 	{
 		try
@@ -165,7 +192,8 @@ void SingleShotAO::delete_device()
 		m_dyn_attr_manager = NULL;
 	}
 
-	//- remove the inner appender
+	// Remove the inner appender
+	//--------------------------------------------
 	yat4tango::Logging::release(this);
 	yat4tango::DeviceInfo::release(this);
 }
@@ -315,17 +343,20 @@ void SingleShotAO::init_device()
 		return;
 	}
 
+
 	// get frequency value in database
+	//--------------------------------------------
 	try
 	{
-		m_frequency = yat4tango::PropertyHelper::get_memorized_attribute<double>(this,"frequency");
+		m_frequency = yat4tango::PropertyHelper::get_memorized_attribute<double>(this, "frequency");
 		DEBUG_STREAM << "Frequency : " << m_frequency << endl;
 	}
 	catch (...)
 	{
 		DEBUG_STREAM << "Failed to get frequency value. Maybe there is no value yet." << std::endl;
 	}
-	
+
+
 	// initialize the AO manager
 	//--------------------------------------------
 	try
@@ -348,28 +379,6 @@ void SingleShotAO::init_device()
 	}
 
 
-	// Make sure running processes are aborted properly
-	//--------------------------------------------
-	try
-	{
-		_abort();
-	}
-	catch (Tango::DevFailed &df)
-	{
-		ERROR_STREAM << df << endl;
-		RETHROW_DEVFAILED(df,
-						  "DRIVER_FAILURE",
-						  "could not abort [caught Tango::DevFailed]",
-						  "SingleShotAO::init");
-	}
-	catch (...)
-	{
-		ERROR_STREAM << "SingleShotAO::init::unknown exception caught" << std::endl;
-		THROW_DEVFAILED("DRIVER_FAILURE",
-						"could not abort [unknown error]",
-						"SingleShotAO::init");
-	}
-
 	// Create dynamic attributes
 	//--------------------------------------------
 
@@ -1047,9 +1056,8 @@ void SingleShotAO::_abort()
 			yat4tango::PropertyHelper::set_memorized_attribute(this, kCHANNEL + std::to_string(l_cpt), l_val_channel);
 			DEBUG_STREAM << "Memorizing channel " << l_cpt << " to " << l_val_channel << std::endl;
 
-			double l_val_initial = m_manager->get_initial(l_cpt);
-			yat4tango::PropertyHelper::set_memorized_attribute(this, kINITIAL + std::to_string(l_cpt), l_val_initial);
-			DEBUG_STREAM << "Memorizing initial " << l_cpt << " to " << l_val_initial << std::endl;
+			yat4tango::PropertyHelper::set_memorized_attribute(this, kINITIAL + std::to_string(l_cpt), l_val_channel);
+			DEBUG_STREAM << "Memorizing initial " << l_cpt << " to " << l_val_channel << std::endl;
 		}
 	}
 	m_manager->abort();
-- 
GitLab


From 4fe5634255053686359f6da63ceddf23db5951fd Mon Sep 17 00:00:00 2001
From: MALFREYT <alexandre.malfreyt@synchrotron-soleil.fr>
Date: Fri, 21 Feb 2025 14:48:05 +0100
Subject: [PATCH 11/11] bump: update version to 2.1.0

---
 conanfile.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/conanfile.py b/conanfile.py
index 479a146..24ed606 100644
--- a/conanfile.py
+++ b/conanfile.py
@@ -3,7 +3,7 @@ from conan import ConanFile
 class SingleShotAORecipe(ConanFile):
     name = "singleshotao"
     executable = "ds_SingleShotAO"
-    version = "2.0.4"
+    version = "2.1.0"
     package_type = "application"
     user = "soleil"
     python_requires = "base/[>=1.0]@soleil/stable"
-- 
GitLab