diff --git a/include/AbstractElectrometerClass.h b/include/AbstractElectrometerClass.h index 0f34ce8d7bd24b96896be3adffedd1f831769798..18650bb7850a9ce04ff7d99bba8c3dff09a3f70c 100644 --- a/include/AbstractElectrometerClass.h +++ b/include/AbstractElectrometerClass.h @@ -9,9 +9,13 @@ // // $Author: xavela $ // -// $Revision: 1.14 $ +// $Revision: 1.15 $ // // $Log: not supported by cvs2svn $ +// Revision 1.14 2009/01/19 12:00:25 xavela +// xavier : +// - MCCE2 (Novelec part) : methods to change the active channel to communicate with. +// // Revision 1.13 2008/06/20 14:36:24 xavela // xavier : // - DDC status show only errors if any @@ -197,6 +201,7 @@ public: virtual std::string get_ElectroMeterFrequency (void); virtual std::string get_ElectroMeterGain (void); virtual unsigned short get_ElectroChannel (void); + virtual void set_ElectroMeterRange (std::string rang); virtual void set_ElectroMeterPolarity (std::string pola); virtual void set_ElectroMeterFrequency (std::string freq); virtual void set_ElectroMeterGain (std::string gain); @@ -238,7 +243,7 @@ protected : void set_electroState(ElectroState newState) { electrometerState = newState; }; - short _range; + short _range; std::string _rangeStr; std::string _mode; std::string _device_proxy_name; diff --git a/include/N_PhotoConducteur.h b/include/N_PhotoConducteur.h index 0871b40beab698b8bb9b2bb567689036580ce01c..80d8e2cebb30438f84707009286bd35b78a46c0a 100644 --- a/include/N_PhotoConducteur.h +++ b/include/N_PhotoConducteur.h @@ -48,6 +48,11 @@ public: void range_up (void); void range_down (void); + /** + * \brief Checks and Sets the new range value. + */ + void set_range(std::string range_str); + /** * \brief getters and setters. */ diff --git a/include/N_PhotoVoltaique.h b/include/N_PhotoVoltaique.h index d98d1528c9ff0a49e6c0e2aca3d39be1dce55ec2..746fbc1effb28018bcaea9f5171f711e01ab4e44 100644 --- a/include/N_PhotoVoltaique.h +++ b/include/N_PhotoVoltaique.h @@ -47,7 +47,12 @@ public: */ void range_up (void); void range_down (void); - + + /** + * \brief Checks and Sets the new range value. + */ + void set_range(std::string range_str); + /** * \brief getters and setters. */ diff --git a/include/Novelec_MCCE2.h b/include/Novelec_MCCE2.h index 6cecc1226e1b3a8977610f76cdf1152a081738c6..16c01dda0b25ea49f99c068410c058022d74333c 100644 --- a/include/Novelec_MCCE2.h +++ b/include/Novelec_MCCE2.h @@ -54,6 +54,11 @@ public: void set_Test_function (void); void set_Measure_function (void); + /** + * \brief Sets the new range value + */ + virtual void set_range(std::string range_str) = 0; + /** * \brief Commands to start/stop the data acquisition * @@ -70,8 +75,14 @@ public: std::string electrometer_status (void); protected : - short _rangeLimit; //- define the range limit for each novelec type + unsigned short _rangeLimit; //- define the range limit for each novelec type + unsigned short _MCCE2electroTypeNumber; //- the mcce2 electrometer type number (to check rang value) + /** + * \brief Checks the new range value + */ + short check_range_value(const std::string& rgToCheck, const std::string* electroRangeList); + }; /** @} */ //- end addtogroup diff --git a/src/AbstractElectrometerClass.cpp b/src/AbstractElectrometerClass.cpp index 906567be5c7ecfc517bd9cf96fa3c6283dee5b17..960ed64b54408c8d4b186f4e8da86287fe0562cd 100644 --- a/src/AbstractElectrometerClass.cpp +++ b/src/AbstractElectrometerClass.cpp @@ -11,9 +11,13 @@ // // $Author: xavela $ // -// $Revision: 1.15 $ +// $Revision: 1.16 $ // // $Log: not supported by cvs2svn $ +// Revision 1.15 2009/01/19 12:00:25 xavela +// xavier : +// - MCCE2 (Novelec part) : methods to change the active channel to communicate with. +// // Revision 1.14 2008/06/20 14:36:23 xavela // xavier : // - DDC status show only errors if any @@ -631,6 +635,14 @@ std::string AbstractElectrometerClass::get_ElectroMeterGain (void) return _electrometerProtocol->get_gain( ); } +// ============================================================================ +// AbstractElectrometerClass::set_ElectroMeterRange +// ============================================================================ +void AbstractElectrometerClass::set_ElectroMeterRange (std::string rang) +{ + _electrometerProtocol->set_range(rang); +} + // ============================================================================ // AbstractElectrometerClass::set_ElectroMeterPolarity // ============================================================================ diff --git a/src/N_PhotoConducteur.cpp b/src/N_PhotoConducteur.cpp index bb4203d41eafb1097966a9fa562fc9d5918aea79..f843917bcf505e60915c5a28fc4fd90dbe0bd50f 100644 --- a/src/N_PhotoConducteur.cpp +++ b/src/N_PhotoConducteur.cpp @@ -24,8 +24,8 @@ /* * Valid Range values for a N_PhotoConducteur */ -static const std::string NType_4_rangeValue[] = {"100 MOhms","30 MOhms","10 MOhms","3 MOhms"}; -static const std::string NType_5_rangeValue[] = {"1000 KOhms","300 KOhms","100 KOhms","30 KOhms"}; +static const std::string NType4_rangeValue[] = {"3","10","30","100"}; //- MOhms +static const std::string NType5_rangeValue[] = {"30","100","300","1000"}; //- KOhms // ============================================================================ @@ -123,3 +123,29 @@ void N_PhotoConducteur::set_ElectroMeterGain (std::string gain) "N_PhotoConducteur::set_ElectroMeterGain( )."); _nproto->set_gain(gain); } + +// ============================================================================ +// N_PhotoConducteur::set_range +// ============================================================================ +void N_PhotoConducteur::set_range (std::string rgStr) +{ +short range_idx = -1; +std::stringstream range_cmd_to_send; + + //- switch the novelec type : + switch(_MCCE2electroTypeNumber) + { + case 4 : range_idx = Novelec_MCCE2::check_range_value(rgStr, NType4_rangeValue); + break; + case 5 : range_idx = Novelec_MCCE2::check_range_value(rgStr, NType5_rangeValue); + break; + } + + if (range_idx < 0) + throw electrometer::ElectrometerException("INVALID_PARAMETER", + "This electrometer does not support this range value.", + "N_PhotoConducteur::set_range( )."); + //- it is OK + range_cmd_to_send << range_idx << std::endl; + _electrometerProtocol->set_range(range_cmd_to_send.str()); +} diff --git a/src/N_PhotoVoltaique.cpp b/src/N_PhotoVoltaique.cpp index 457a6d70616b1c5abcd12eed495293e213bf7642..7c6582059044169e83890815e361ade7f4b56138 100644 --- a/src/N_PhotoVoltaique.cpp +++ b/src/N_PhotoVoltaique.cpp @@ -24,9 +24,9 @@ /* * Valid Range values for a N_PhotoVoltaique */ -static const std::string NType1_rangeValue[] = {"1e-11 A","3e-11 A","1e-10 A","3e-10 A"}; -static const std::string NType2_rangeValue[] = {"1e-10 A","3e-10 A","1e-9 A","3e-9 A","1e-8 A","3e-8 A","1e-7 A","3e-7 A"}; -static const std::string NType3_rangeValue[] = {"1e-8 A","3e-8 A","1e-7 A","3e-7 A","1e-6 A","3e-6 A","1e-5 A","3e-5 A"}; +static const std::string NType1_rangeValue[] = {"3e-11","1e-11","3e-10","1e-10"}; +static const std::string NType2_rangeValue[] = {"3e-10","1e-10","3e-9","1e-9","3e-8","1e-8","3e-7","1e-7"}; +static const std::string NType3_rangeValue[] = {"3e-8","1e-8","3e-7","1e-7","3e-6","1e-6","3e-5","1e-5"}; // ============================================================================ @@ -134,3 +134,31 @@ void N_PhotoVoltaique::set_ElectroMeterFrequency (std::string freqFilter) _nproto->set_frequency(freqFilter); } +// ============================================================================ +// N_PhotoVoltaique::set_range +// ============================================================================ +void N_PhotoVoltaique::set_range (std::string rgStr) +{ +short range_idx = -1; +std::stringstream range_cmd_to_send; + + //- switch the novelec type : + switch(_MCCE2electroTypeNumber) + { + case 1 : range_idx = Novelec_MCCE2::check_range_value(rgStr, NType1_rangeValue); + break; + case 2 : range_idx = Novelec_MCCE2::check_range_value(rgStr, NType2_rangeValue); + break; + case 3 : range_idx = Novelec_MCCE2::check_range_value(rgStr, NType3_rangeValue); + break; + } + + if (range_idx < 0) + throw electrometer::ElectrometerException("INVALID_PARAMETER", + "This electrometer does not support this range value.", + "N_PhotoVoltaique::set_range( )."); + //- it is OK + range_cmd_to_send << range_idx << std::endl; + _electrometerProtocol->set_range(range_cmd_to_send.str()); +} + diff --git a/src/Novelec_MCCE2.cpp b/src/Novelec_MCCE2.cpp index 17d661bcb31dfcf81fac6b708d0fd4c44dd7ae7f..482a575fd253d5d47f8346861086ccc13ead9c13 100644 --- a/src/Novelec_MCCE2.cpp +++ b/src/Novelec_MCCE2.cpp @@ -27,6 +27,7 @@ // ============================================================================ Novelec_MCCE2::Novelec_MCCE2 (std::string& comLink_device_name, short address, short novTypeNumber) : AbstractElectrometerClass(comLink_device_name), + _MCCE2electroTypeNumber(novTypeNumber), _rangeLimit(0) { //std::cout << "Novelec_MCCE2::Novelec_MCCE2 <-" << std::endl; @@ -266,3 +267,19 @@ std::string Novelec_MCCE2::electrometer_status (void) return argout; } + +// ============================================================================ +// Novelec_MCCE2::check_range_value +// ============================================================================ +short Novelec_MCCE2::check_range_value (const std::string& rgToCheck, const std::string* electroRangeList) +{ + for (unsigned int idx = 0; idx < _rangeLimit; idx++) + { + if(electroRangeList[idx].find(rgToCheck) != std::string::npos) + //- value is in the list + return idx; + } + + //- new range value not found in the electrometer range list ! + return -1; +}