From 35d59683654e11f37fa9d6f326e1d8d078c0e799 Mon Sep 17 00:00:00 2001
From: Xavier Elattaoui <xavier.elattaoui@synchrotron-soleil.fr>
Date: Mon, 19 Jan 2009 12:00:25 +0000
Subject: [PATCH] xavier : - MCCE2 (Novelec part) : methods to change the
 active channel to communicate with.

---
 include/AbstractElectrometerClass.h | 89 ++++++++++++++++-------------
 include/ElectrometerProtocol.h      |  9 ++-
 include/NovelecProtocol.h           |  2 +
 src/AbstractElectrometerClass.cpp   | 29 ++++++++--
 src/ElectrometerProtocol.cpp        | 21 +++++++
 src/NovelecProtocol.cpp             | 17 +++---
 6 files changed, 112 insertions(+), 55 deletions(-)

diff --git a/include/AbstractElectrometerClass.h b/include/AbstractElectrometerClass.h
index 0d82073..0f34ce8 100644
--- a/include/AbstractElectrometerClass.h
+++ b/include/AbstractElectrometerClass.h
@@ -9,9 +9,14 @@
 //
 // $Author: xavela $
 //
-// $Revision: 1.13 $
+// $Revision: 1.14 $
 //
 // $Log: not supported by cvs2svn $
+// Revision 1.13  2008/06/20 14:36:24  xavela
+// xavier :
+// - DDC status show only errors if any
+// - added command to get DDC model configuration
+//
 // Revision 1.12  2008/05/14 09:42:37  xavela
 // xavier :
 // - attributes management :
@@ -108,11 +113,11 @@ public:
 	/**
 	*  \brief Electrometer common functions.
 	*/
-	virtual void range_up			(void) = 0;
-	virtual void range_down		(void) = 0;
-	virtual void reset				(void); 
-	virtual void local				(void);
-	virtual void remote				(void);
+	virtual void range_up	(void) = 0;
+	virtual void range_down	(void) = 0;
+	virtual void reset		(void); 
+	virtual void local		(void);
+	virtual void remote		(void);
 
 	/**
 	*  \brief Electrometer : cmd to get electrometer data.
@@ -124,62 +129,62 @@ public:
 	/**
 	*  \brief Keithley Electrometer methods
 	*/
-	void autoRange_on		  (void);
+	void autoRange_on		(void);
 	void zero_check_on		(void);
 	void zero_check_off		(void);
 	void zero_correct_on	(void);
 	void zero_correct_off	(void);
-	void auto_zero_on		  (void);
+	void auto_zero_on		(void);
 	void auto_zero_off		(void);
-	virtual void autoRange_off		  (void);
+	virtual void autoRange_off		(void);
 	virtual void setAmperMeterMode  (void);
-	virtual void setVoltMeterMode	  (void);
-	virtual void setOhmMeterMode	  (void);
+	virtual void setVoltMeterMode	(void);
+	virtual void setOhmMeterMode	(void);
 	virtual void setCoulombMeterMode(void);
 
 	/**
 	*  \brief  Following functions are only supported for SCPI protocol
 	*
 	*/
-	void abort (void); 
+	void abort						(void); 
 	virtual void init_keithley		(void); 
-	void clear_registers	(void); 
-	void averageStateON		(void); 
-	void averageStateOFF	(void); 
-	virtual void set_knplc			  (float nPLC);
+	void clear_registers			(void); 
+	void averageStateON				(void); 
+	void averageStateOFF			(void); 
+	virtual void set_knplc			(float nPLC);
 	virtual void set_triggercount	(short trigcounts);
-	void set_triggerdelay	(std::string trigdelay);
-	void set_triggerdelayAuto	(std::string trigdelAuto);
-	virtual void set_averagecount	    (std::string avercounts);
-	virtual void set_averagecontrol	  (std::string averctrl);
-	std::string get_knplc			    (void);
+	void set_triggerdelay			(std::string trigdelay);
+	void set_triggerdelayAuto		(std::string trigdelAuto);
+	virtual void set_averagecount	(std::string avercounts);
+	virtual void set_averagecontrol	(std::string averctrl);
+	std::string get_knplc			(void);
 	std::string get_triggercount	(void);
 	std::string get_triggerdelay	(void);
 	std::string get_triggerdelayAuto(void);
 	virtual std::string get_averagecount	(void);
-	virtual std::string get_averagecontrol(void);
-	virtual void clear_buffer				      (void);
-	virtual void store_raw_input			    (void);
-	virtual void start_storing				    (void);
-	void enable_SRQBufferFull		  (void);
-	void disable_SRQBufferFull		(void);
-	virtual bool SRQLineState         (void); //- used to know if the integration cycle is done! 
-	virtual short readStatusByteRegister         (void); //- device status byte register value on SRQ! 
-	bool get_overloadRangeState		(void);		//- used to know if the device range is overloaded (DDC Keithley ONLY)! 
-	virtual void set_buffer_size			    (short);
-	virtual void set_triggerMode			    (short);
-	virtual void set_integrationTime			(double);
-	virtual short get_buffer_size			    (void);
-	virtual short get_triggerMode			    (void) { return _trigMod;};
+	virtual std::string get_averagecontrol	(void);
+	virtual void clear_buffer				(void);
+	virtual void store_raw_input			(void);
+	virtual void start_storing				(void);
+	void enable_SRQBufferFull				(void);
+	void disable_SRQBufferFull				(void);
+	virtual bool SRQLineState				(void); //- used to know if the integration cycle is done! 
+	virtual short readStatusByteRegister    (void); //- device status byte register value on SRQ! 
+	bool get_overloadRangeState				(void);		//- used to know if the device range is overloaded (DDC Keithley ONLY)! 
+	virtual void set_buffer_size			(short);
+	virtual void set_triggerMode			(short);
+	virtual void set_integrationTime		(double);
+	virtual short get_buffer_size			(void);
+	virtual short get_triggerMode			(void) { return _trigMod;};
 
 	/**
 	*  \brief Novelec Electrometer methods
 	*
 	* Following functions are only supported for Novelec Protocol
 	*/
-	virtual void set_Zero_VonF_function		  (void);
-	virtual void set_Offset_ZeroV1_function	(void);
-	virtual void set_Leakage_ZeroV2_function(void);
+	virtual void set_Zero_VonF_function			(void);
+	virtual void set_Offset_ZeroV1_function		(void);
+	virtual void set_Leakage_ZeroV2_function	(void);
 	virtual void set_Test_function			    (void);
 	virtual void set_Measure_function		    (void);
 	virtual void mcce_on    (void);
@@ -191,9 +196,11 @@ public:
 	virtual std::string get_ElectroMeterPolarity  (void);
 	virtual std::string get_ElectroMeterFrequency (void);
 	virtual std::string get_ElectroMeterGain      (void);
-	virtual void set_ElectroMeterPolarity	  (std::string pola);
-	virtual void set_ElectroMeterFrequency	(std::string freq);
-	virtual void set_ElectroMeterGain       (std::string gain);
+	virtual unsigned short get_ElectroChannel	  (void);
+	virtual void set_ElectroMeterPolarity		  (std::string pola);
+	virtual void set_ElectroMeterFrequency		  (std::string freq);
+	virtual void set_ElectroMeterGain			  (std::string gain);
+	virtual void set_ElectroChannel				  (unsigned short address);
 
 	/**
 	*  \brief Electrometer Status and State.
diff --git a/include/ElectrometerProtocol.h b/include/ElectrometerProtocol.h
index 7a005f6..b539a9b 100644
--- a/include/ElectrometerProtocol.h
+++ b/include/ElectrometerProtocol.h
@@ -12,9 +12,14 @@
 //
 // $Author: xavela $
 //
-// $Revision: 1.10 $
+// $Revision: 1.11 $
 //
 // $Log: not supported by cvs2svn $
+// Revision 1.10  2008/06/20 14:36:24  xavela
+// xavier :
+// - DDC status show only errors if any
+// - added command to get DDC model configuration
+//
 // Revision 1.9  2008/04/15 12:52:00  xavela
 // xavier :
 // - SRQ management changed :
@@ -204,6 +209,8 @@ public:
 	virtual void set_polarity		(std::string pola);
 	virtual void set_frequency		(std::string freq);
 	virtual void set_gain			(std::string gain);
+	virtual unsigned short get_electrometer_active_channel(void);
+	virtual void set_electrometer_active_channel		  (unsigned short address);
 
 
 
diff --git a/include/NovelecProtocol.h b/include/NovelecProtocol.h
index 26a2f09..7ebd93f 100644
--- a/include/NovelecProtocol.h
+++ b/include/NovelecProtocol.h
@@ -86,6 +86,8 @@ public:
 	void set_polarity	(std::string pola);
 	void set_frequency	(std::string freq);
 	void set_gain		(std::string gain);
+	void set_electrometer_active_channel(unsigned short channel_add) { this->_devAdd = channel_add;};
+	unsigned short get_electrometer_active_channel(void) { return this->_devAdd;};
 
 	/**
 	*   \brief init the MCCE-2 device :
diff --git a/src/AbstractElectrometerClass.cpp b/src/AbstractElectrometerClass.cpp
index 34723b8..906567b 100644
--- a/src/AbstractElectrometerClass.cpp
+++ b/src/AbstractElectrometerClass.cpp
@@ -11,9 +11,14 @@
 //
 // $Author: xavela $
 //
-// $Revision: 1.14 $
+// $Revision: 1.15 $
 //
 // $Log: not supported by cvs2svn $
+// Revision 1.14  2008/06/20 14:36:23  xavela
+// xavier :
+// - DDC status show only errors if any
+// - added command to get DDC model configuration
+//
 // Revision 1.13  2008/05/14 09:42:37  xavela
 // xavier :
 // - attributes management :
@@ -103,9 +108,9 @@ AbstractElectrometerClass::AbstractElectrometerClass (std::string comLink_device
 :	_device_proxy_name(comLink_device_name),
 	_range(0),
 	_rangeStr("NOT INITIALISED"),
-  _mode("NOT INITIALISED"),
-  _size(-1),
-  _trigMod(-1),
+	_mode("NOT INITIALISED"),
+	_size(-1),
+	_trigMod(-1),
 	electrometerState(UNKNOWN)
 {
 //	std::cout << "AbstractElectrometerClass::AbstractElectrometerClass <-" << std::endl;
@@ -714,3 +719,19 @@ void AbstractElectrometerClass::mcce_init (void)
 	_electrometerProtocol->init_MCCE2_for_communication( );
 }
 
+// ============================================================================
+// AbstractElectrometerClass::set_ElectroChannel
+// ============================================================================
+void AbstractElectrometerClass::set_ElectroChannel (unsigned short address) 
+{
+	_electrometerProtocol->set_electrometer_active_channel(address);
+}
+
+// ============================================================================
+// AbstractElectrometerClass::get_ElectroChannel
+// ============================================================================
+unsigned short AbstractElectrometerClass::get_ElectroChannel (void) 
+{
+	return _electrometerProtocol->get_electrometer_active_channel();
+}
+
diff --git a/src/ElectrometerProtocol.cpp b/src/ElectrometerProtocol.cpp
index 8609e4d..63e9ac3 100644
--- a/src/ElectrometerProtocol.cpp
+++ b/src/ElectrometerProtocol.cpp
@@ -719,3 +719,24 @@ std::string ElectrometerProtocol::get_DDC_configuration (void)
 											"This Electrometer does not support this command.",
 											"ElectrometerProtocol::get_configuration( ).");
 }
+
+// ============================================================================
+// ElectrometerProtocol::set_electrometer_active_channel
+// ============================================================================
+void ElectrometerProtocol::set_electrometer_active_channel (unsigned short ) 
+{
+	throw electrometer::ElectrometerException("COMMAND_NOT_SUPPORTED", 
+											"This Electrometer does not support this command.",
+											"ElectrometerProtocol::set_electrometer_active_channel( ).");
+}
+
+// ============================================================================
+// ElectrometerProtocol::get_electrometer_active_channel
+// ============================================================================
+unsigned short ElectrometerProtocol::get_electrometer_active_channel (void) 
+{
+	throw electrometer::ElectrometerException("COMMAND_NOT_SUPPORTED", 
+											"This Electrometer does not support this command.",
+											"ElectrometerProtocol::get_electrometer_active_channel( ).");
+}
+
diff --git a/src/NovelecProtocol.cpp b/src/NovelecProtocol.cpp
index ba1b9c7..2bb8de6 100644
--- a/src/NovelecProtocol.cpp
+++ b/src/NovelecProtocol.cpp
@@ -568,17 +568,16 @@ std::string data;
 	//			-> "address ACK " : if command well understood
 	//- An invalid response is: "address NAK ..."
 
+	if(_is_measure_mode_on)
+		throw electrometer::ElectrometerException("COMMAND_NOT_ALLOWED", 
+											"Cannot change parameter(s) when MEASURE mode enabled.",
+											"NovelecProtocol::check_command( ).");
+
 	if(response.find("NAK") != std::string::npos)
 	{
-		if(_is_measure_mode_on)
-			throw electrometer::ElectrometerException("COMMAND_NOT_ALLOWED", 
-												"Cannot change parameter(s) when MEASURE mode enabled.",
-												"NovelecProtocol::check_command( ).");
-
-		else
-			throw electrometer::ElectrometerException("COMMAND_NOT_UNDERSTOOD", 
-												"Bad formatted string command sent -> NAK received !",
-												"NovelecProtocol::check_command( ).");
+		throw electrometer::ElectrometerException("COMMAND_NOT_UNDERSTOOD", 
+											"Bad formatted string command sent -> NAK received !",
+											"NovelecProtocol::check_command( ).");
 	}
 	else
 		if(response.find("ACK") != std::string::npos)
-- 
GitLab