static const char *RcsId = "$Header: /users/chaize/newsvn/cvsroot/Instrumentation/NovelecElectro/src/MCCE2Electrometers.cpp,v 1.31 2012-11-14 13:24:22 xavela Exp $"; //+============================================================================= // // file : MCCE2Electrometers.cpp // // description : C++ source for the MCCE2Electrometers and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // MCCE2Electrometers are implemented in this file. // // project : TANGO Device Server // // $Author: xavela $ // // $Revision: 1.31 $ // // $Log: not supported by cvs2svn $ // Revision 1.26 2012/07/03 06:17:54 xavela // bug at init fixed. // // Revision 1.25 2012/04/10 08:42:33 xavela // std::cout commented ! // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // RangeUP | range_up() // RangeDOWN | range_down() // SetZeroVFFunction | set_zero_vffunction() // SetOffsetZeroV1Function | set_offset_zero_v1_function() // SetLeakageZeroV2Function | set_leakage_zero_v2_function() // SetTestFunction | set_test_function() // SetMeasureFunction | set_measure_function() // MCCE2_ON | mcce2__on() // MCCE2_OFF | mcce2__off() // Local | local() // Remote | remote() // Reset | reset() // ClearRegisters | clear_registers() // GetRange | get_range() // SetRange | set_range() // GetMode | get_mode() // GetPolarity | get_polarity() // SetPolarity | set_polarity() // GetHzFilter | get_hz_filter() // SetHzFilter | set_hz_filter() // GetGain | get_gain() // SetGain | set_gain() // //=================================================================== #include <tango.h> #include <PogoHelper.h> #include <Xstring.h> #include <yat4tango/InnerAppender.h> #include <yat4tango/YatLogAdapter.h> #include <MCCE2Electrometers.h> #include <MCCE2ElectrometersClass.h> #include "N_PhotoVoltaique.h" #include "N_PhotoConducteur.h" const size_t MAX_STRING_LENGTH = 64; const unsigned short ELETRO_CHANNEL_ONE = 1; const unsigned short ELETRO_CHANNEL_TWO = 2; namespace MCCE2Electrometers_ns { //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::MCCE2Electrometers(string &s) // // description : constructor for simulated MCCE2Electrometers // /home/experiences/diffabs/com-diffabs/DeviceServers/ds_MCCE2Electrometers // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- MCCE2Electrometers::MCCE2Electrometers(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } MCCE2Electrometers::MCCE2Electrometers(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } MCCE2Electrometers::MCCE2Electrometers(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void MCCE2Electrometers::delete_device() { // Delete device's allocated object if(this->_electrometerCH1) { delete this->_electrometerCH1; this->_electrometerCH1 = 0; } if(this->_electrometerCH2) { delete this->_electrometerCH2; this->_electrometerCH2 = 0; } DELETE_DEVSTRING_ATTRIBUTE(attr_range1_read); DELETE_DEVSTRING_ATTRIBUTE(attr_range2_read); DELETE_SCALAR_ATTRIBUTE(attr_electrometerChannel_read); //- release the inner-appender INFO_STREAM << "Remove the inner-appender." << endl; yat4tango::InnerAppender::release(this); INFO_STREAM << "Remove the log-adapter." << endl; yat4tango::YatLogAdapter::release(); } //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void MCCE2Electrometers::init_device() { INFO_STREAM << "MCCE2Electrometers::MCCE2Electrometers() create device " << device_name << endl; yat4tango::YatLogAdapter::initialize(this); // Initialize the inner appender. yat4tango::InnerAppender::initialize(this); // Initialise variables to default values //-------------------------------------------- this->_electrometer = 0; this->_electrometerCH1 = 0; this->_electrometerCH2 = 0; this->_missing_property = false; attr_electrometerChannel_write = ELETRO_CHANNEL_ONE; this->_updateRange1FromHW = true; //- force update after init. this->_updateRange2FromHW = true; //- force update after init. get_device_property(); if ( this->communicationLinkName.empty() ) this->_missing_property = true; if ( !electrometer1Address && !electrometer2Address ) this->_missing_property = true; INFO_STREAM << "electrometerTypeChx -> _missing_property = " << _missing_property << std::endl; CREATE_SCALAR_ATTRIBUTE(attr_electrometerChannel_read); CREATE_DEVSTRING_ATTRIBUTE(attr_range1_read, MAX_STRING_LENGTH, "Not updated yet."); CREATE_DEVSTRING_ATTRIBUTE(attr_range2_read, MAX_STRING_LENGTH, "Not updated yet."); this->_init_done = false; if( !this->_init_done && !this->_missing_property ) { INFO_STREAM << "init_device -> create_electrometers_obj : ... " << std::endl; try { create_electrometers_obj(); } catch(...) { FATAL_STREAM << "Device initialization Failed : check logs for more informations."; set_state(Tango::FAULT); set_status("Failed to find which Novelec type is connected : communication caught[...]"); return; } }//- end if INFO_STREAM << "Device up but not completly initialised!" << std::endl; INFO_STREAM << "this->communicationLinkName = " << this->communicationLinkName << std::endl; INFO_STREAM << "electrometer1Address = " << electrometer1Address << std::endl; INFO_STREAM << "electrometer2Address = " << electrometer2Address << std::endl; } //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void MCCE2Electrometers::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ communicationLinkName = ""; electrometer1Address = 0; electrometer2Address = 0; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("CommunicationLinkName")); dev_prop.push_back(Tango::DbDatum("Electrometer1Address")); dev_prop.push_back(Tango::DbDatum("Electrometer2Address")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; MCCE2ElectrometersClass *ds_class = (static_cast<MCCE2ElectrometersClass *>(get_device_class())); int i = -1; // Try to initialize CommunicationLinkName from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> communicationLinkName; else { // Try to initialize CommunicationLinkName from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> communicationLinkName; } // And try to extract CommunicationLinkName value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> communicationLinkName; // Try to initialize Electrometer1Address from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> electrometer1Address; else { // Try to initialize Electrometer1Address from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> electrometer1Address; } // And try to extract Electrometer1Address value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> electrometer1Address; // Try to initialize Electrometer2Address from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> electrometer2Address; else { // Try to initialize Electrometer2Address from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> electrometer2Address; } // And try to extract Electrometer2Address value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> electrometer2Address; // End of Automatic code generation //------------------------------------------------------------------ //- Creates default property Tango::DbData data_put; if ( dev_prop[0].is_empty() ) { Tango::DbDatum prop("CommunicationLinkName"); prop << communicationLinkName; data_put.push_back(prop); } if ( dev_prop[1].is_empty() ) { Tango::DbDatum prop("Electrometer1Address"); prop << electrometer1Address; data_put.push_back(prop); } if ( dev_prop[2].is_empty() ) { Tango::DbDatum prop("Electrometer2Address"); prop << electrometer2Address; data_put.push_back(prop); } //- write default property if created if( !data_put.empty() ) get_db_device()->put_property(data_put); } //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void MCCE2Electrometers::always_executed_hook() { //- noop } //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void MCCE2Electrometers::read_attr_hardware(vector<long> &attr_list) { DEBUG_STREAM << "MCCE2Electrometers::read_attr_hardware(vector<long> &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::read_range1 // // description : Extract real attribute values for range1 acquisition result. // //----------------------------------------------------------------------------- void MCCE2Electrometers::read_range1(Tango::Attribute &attr) { DEBUG_STREAM << "MCCE2Electrometers::read_range1(Tango::Attribute &attr) entering... "<< endl; if ( !this->_electrometerCH1 ) { *attr_range1_read = CORBA::string_dup("Not connected"); } else { if ( this->_updateRange1FromHW && *attr_electrometerChannel_read == ELETRO_CHANNEL_ONE ) { *attr_range1_read = this->get_range(); this->_updateRange1FromHW = false; } } attr.set_value(attr_range1_read); } //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::read_range2 // // description : Extract real attribute values for range2 acquisition result. // //----------------------------------------------------------------------------- void MCCE2Electrometers::read_range2(Tango::Attribute &attr) { DEBUG_STREAM << "MCCE2Electrometers::read_range2(Tango::Attribute &attr) entering... "<< endl; if ( !this->_electrometerCH2 ) { *attr_range2_read = CORBA::string_dup("Not connected"); } else { if ( this->_updateRange2FromHW && *attr_electrometerChannel_read == ELETRO_CHANNEL_TWO ) { *attr_range2_read = this->get_range(); this->_updateRange2FromHW = false; } } attr.set_value(attr_range2_read); } //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::read_electrometerChannel // // description : Extract real attribute values for electrometerChannel acquisition result. // //----------------------------------------------------------------------------- void MCCE2Electrometers::read_electrometerChannel(Tango::Attribute &attr) { DEBUG_STREAM << "MCCE2Electrometers::read_electrometerChannel(Tango::Attribute &attr) entering... "<< endl; Tango::DevUShort channelNumber = 0; if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::read_electrometerChannel()" ); } try { *attr_electrometerChannel_read = this->_electrometer->get_ElectroChannel(); attr.set_value(attr_electrometerChannel_read); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to set the active channel value!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to get the active channel value : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to get the active channel value.", "MCCE2Electrometers::read_electrometerChannel()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to set the active channel value!"); ERROR_STREAM << "Failed to get the active channel value : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to get the new active channel value!", "MCCE2Electrometers::read_electrometerChannel()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to get the active channel value : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to set the active channel value!"); throw; } } //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::write_electrometerChannel // // description : Write electrometerChannel attribute values to hardware. // //----------------------------------------------------------------------------- void MCCE2Electrometers::write_electrometerChannel(Tango::WAttribute &attr) { DEBUG_STREAM << "MCCE2Electrometers::write_electrometerChannel(Tango::WAttribute &attr) entering... "<< endl; // if ( !this->_electrometer ) // { // std::string err("There is no electrometer connected or the property\"electrometerTypeCh\" is not set"); // ERROR_STREAM << err << std::endl; // Tango::Except::throw_exception( // "MEMORY_ERROR", // err.c_str(), // "MCCE2Electrometers::write_electrometerChannel()" // ); // } attr.get_write_value(attr_electrometerChannel_write); if ( attr_electrometerChannel_write == ELETRO_CHANNEL_ONE ) { this->_electrometer = this->_electrometerCH1; if ( this->_electrometerCH1 ) { //- now force update from HW this->_updateRange1FromHW = true; } else { WARN_STREAM << "Cannot control electrometer on this channel : seems that nothing is connected on!" << std::endl; //- warn nothing is connected on this channel *attr_range1_read = CORBA::string_dup("Not connected"); } } else if ( attr_electrometerChannel_write == ELETRO_CHANNEL_TWO ) { this->_electrometer = this->_electrometerCH2; if ( this->_electrometerCH2 ) { //- now force update from HW this->_updateRange2FromHW = true; } else { WARN_STREAM << "Cannot control electrometer on this channel : seems that nothing is connected on!" << std::endl; //- warn nothing is connected on this channel *attr_range2_read = CORBA::string_dup("Not connected"); } } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::range_up * * description: method to execute "RangeUP" * Up the range of the electrometer. * Throw : * - electrometer::ElectrometerException if the range limit is reached * - Tango::DevFailed if the command cannot be performed * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::range_up() { DEBUG_STREAM << "MCCE2Electrometers::range_up(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::range_up()" ); } try { this->_electrometer->range_up(); //- update range attr from hardware if ( *attr_electrometerChannel_read == ELETRO_CHANNEL_ONE) this->_updateRange1FromHW = true; else if ( *attr_electrometerChannel_read == ELETRO_CHANNEL_TWO) this->_updateRange2FromHW = true; } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to up the range!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to up the range : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to up the range.", "MCCE2Electrometers::range_up()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to up the range!"); ERROR_STREAM << "Failed to up the range : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to up the range!", "MCCE2Electrometers::range_up()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to up the range : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to up the range!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::range_down * * description: method to execute "RangeDOWN" * Down the range of the electrometer. * Throw : * - electrometer::ElectrometerException if the range is negative * - Tango::DevFailed if the command cannot be performed * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::range_down() { DEBUG_STREAM << "MCCE2Electrometers::range_down(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::range_down()" ); } try { this->_electrometer->range_down(); //- update range attr from hardware if ( *attr_electrometerChannel_read == ELETRO_CHANNEL_ONE ) this->_updateRange1FromHW = true; else if ( *attr_electrometerChannel_read == ELETRO_CHANNEL_TWO ) this->_updateRange2FromHW = true; } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to down the range!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to down the range : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to down the range.", "MCCE2Electrometers::range_down()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to down the range!"); ERROR_STREAM << "Failed to down the range : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to down the range!", "MCCE2Electrometers::range_down()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to down the range : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to down the range!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::set_zero_vffunction * * description: method to execute "SetZeroVFFunction" * Enable the Zero V/F MCCE2 mode. * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::set_zero_vffunction() { DEBUG_STREAM << "MCCE2Electrometers::set_zero_vffunction(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::set_zero_vffunction()" ); } try { this->_electrometer->set_Zero_VonF_function(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to enable ZERO V/F function!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to enable ZERO V/F function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to enable ZERO V/F function.", "MCCE2Electrometers::set_zero_vffunction()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to enable ZERO V/F function!"); ERROR_STREAM << "Failed to enable ZERO V/F function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable ZERO V/F function!", "MCCE2Electrometers::set_zero_vffunction()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable ZERO V/F function : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to enable ZERO V/F function!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::set_offset_zero_v1_function * * description: method to execute "SetOffsetZeroV1Function" * Enable the Offset or Zero V1 MCCE2 mode. * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::set_offset_zero_v1_function() { DEBUG_STREAM << "MCCE2Electrometers::set_offset_zero_v1_function(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::set_offset_zero_v1_function()" ); } try { this->_electrometer->set_Offset_ZeroV1_function(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to enable OFFSET or ZERO V1 function!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to enable OFFSET or ZERO V1 function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to enable OFFSET or ZERO V1 function.", "MCCE2Electrometers::set_offset_zero_v1_function()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to enable OFFSET or ZERO V1 function!"); ERROR_STREAM << "Failed to enable OFFSET or ZERO V1 function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable OFFSET or ZERO V1 function!", "MCCE2Electrometers::set_offset_zero_v1_function()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable OFFSET or ZERO V1 function : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to enable OFFSET or ZERO V1 function!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::set_leakage_zero_v2_function * * description: method to execute "SetLeakageZeroV2Function" * Enable the Leakage or Zero V2 MCCE2 mode. * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::set_leakage_zero_v2_function() { DEBUG_STREAM << "MCCE2Electrometers::set_leakage_zero_v2_function(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::set_leakage_zero_v2_function()" ); } try { this->_electrometer->set_Leakage_ZeroV2_function(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to enable LEAKAGE or ZERO V2 function!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to enable LEAKAGE or ZERO V2 function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to enable LEAKAGE or ZERO V2 function.", "MCCE2Electrometers::set_leakage_zero_v2_function()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to enable LEAKAGE or ZERO V2 function!"); ERROR_STREAM << "Failed to enable LEAKAGE or ZERO V2 function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable LEAKAGE or ZERO V2 function!", "MCCE2Electrometers::set_leakage_zero_v2_function()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable LEAKAGE or ZERO V2 function : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to enable LEAKAGE or ZERO V2 function!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::set_test_function * * description: method to execute "SetTestFunction" * Enable theTest MCCE2 mode. * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::set_test_function() { DEBUG_STREAM << "MCCE2Electrometers::set_test_function(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::set_test_function()" ); } try { this->_electrometer->set_Test_function(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to enable TEST function!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to enable TEST function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to enable TEST function.", "MCCE2Electrometers::set_test_function()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to enable TEST function!"); ERROR_STREAM << "Failed to enable TEST function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable TEST function!", "MCCE2Electrometers::set_test_function()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable TEST function : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to enable TEST function!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::mcce2__on * * description: method to execute "MCCE2_ON" * Enables the function set. Parameters cannot be set (read only mode). * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::mcce2__on() { DEBUG_STREAM << "MCCE2Electrometers::mcce2__on(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::mcce2__on()" ); } try { this->_electrometer->mcce_on(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to enable MCCE ON function!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to enable MCCE ON function : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to enable MCCE ON function.", "MCCE2Electrometers::mcce2__on()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to enable MCCE ON function!"); ERROR_STREAM << "Failed to enable MCCE ON function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable MCCE ON function!", "MCCE2Electrometers::mcce2__on()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable MCCE2_ON function : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to enable MCCE ON function!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::mcce2__off * * description: method to execute "MCCE2_OFF" * Disables the function set. Parameters can be changed. * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::mcce2__off() { DEBUG_STREAM << "MCCE2Electrometers::mcce2__off(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::mcce2__off()" ); } try { this->_electrometer->mcce_off(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to enable MCCE OFF function!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to enable MCCE OFF function : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to enable MCCE OFF function.", "MCCE2Electrometers::mcce2__off()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to enable MCCE OFF function!"); ERROR_STREAM << "Failed to enable MCCE OFF function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable MCCE OFF function!", "MCCE2Electrometers::mcce2__off()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable MCCE2_OFF function : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to enable MCCE OFF function!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::local * * description: method to execute "Local" * Enable local keyboard and Key * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::local() { DEBUG_STREAM << "MCCE2Electrometers::local(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::local()" ); } try { this->_electrometer->local(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to enable local mode!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to enable local mode : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to enable local mode.", "MCCE2Electrometers::local()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to enable local mode!"); ERROR_STREAM << "Failed to enable local function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable local mode!", "MCCE2Electrometers::local()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable local mode : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to enable local mode!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::remote * * description: method to execute "Remote" * Disable \"MODIFY\" and the \"ON-OFF\" keys * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::remote() { DEBUG_STREAM << "MCCE2Electrometers::remote(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::remote()" ); } try { this->_electrometer->remote(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to enable remote mode!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to enable remote mode : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to enable remote mode.", "MCCE2Electrometers::remote()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to enable remote mode!"); ERROR_STREAM << "Failed to enable remote mode : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable remote mode!", "MCCE2Electrometers::remote()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable remote mode : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to enable remote mode!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::reset * * description: method to execute "Reset" * Restart the MCCE-2 * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::reset() { DEBUG_STREAM << "MCCE2Electrometers::reset(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::reset()" ); } try { this->_electrometer->reset(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to enable reset mode!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to enable reset mode : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to enable reset mode.", "MCCE2Electrometers::reset()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to enable reset mode!"); ERROR_STREAM << "Failed to enable reset mode : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable reset mode!", "MCCE2Electrometers::reset()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable reset mode : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to enable reset mode!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::clear_registers * * description: method to execute "ClearRegisters" * Clear error(s) * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::clear_registers() { DEBUG_STREAM << "MCCE2Electrometers::clear_registers(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::clear_registers()" ); } try { this->_electrometer->clear_registers(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to clear all errors!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to clear all errors : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to clear all errors.", "MCCE2Electrometers::clear_registers()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to clear all errors!"); ERROR_STREAM << "Failed to clear all errors : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to clear all errors!", "MCCE2Electrometers::clear_registers()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to clear errors : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to clear all errors!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::dev_state * * description: method to execute "State" * This command gets the device state (stored in its <i>device_state</i> data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState MCCE2Electrometers::dev_state() { Tango::DevState argout = Tango::UNKNOWN; DEBUG_STREAM << "MCCE2Electrometers::dev_state(): entering... !" << endl; // Add your own code to control device here try { //- check properties if ( this->_missing_property ) { argout = Tango::FAULT; } //- check device initialization else if ( !this->_electrometerCH1 && !this->_electrometerCH2 ) { argout = Tango::FAULT; } //- check if an electro is conencted on a channel else if( attr_electrometerChannel_write == ELETRO_CHANNEL_ONE && !this->_electrometerCH1) { argout = Tango::DISABLE; } else if( attr_electrometerChannel_write == ELETRO_CHANNEL_TWO && !this->_electrometerCH2) { argout = Tango::DISABLE; } //- check channel number else if ( attr_electrometerChannel_write != ELETRO_CHANNEL_ONE && attr_electrometerChannel_write != ELETRO_CHANNEL_TWO ) { argout = Tango::ALARM; } else { //- update state this->_electrometer->electrometer_status(); //- get electrometer state short tmpState = _electrometer->electrometer_state(); switch(tmpState) { case Tango::ON : argout = Tango::ON; break; case Tango::FAULT : argout = Tango::FAULT; break; case Tango::ALARM : argout = Tango::ALARM; break; /*case Tango::UNKNOWN: default : argout = Tango::UNKNOWN; break;*/ } } } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to get electrometer state!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Cannot perform get electrometer state : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to get electrometer state.", "MCCE2Electrometers::dev_state()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to get electrometer state!"); ERROR_STREAM << "Failed to get electrometer state : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to get electrometer state!", "MCCE2Electrometers::dev_state()", Tango::ERR ); } catch(...) { set_state(Tango::ALARM); set_status("Failed to get electrometer state!"); ERROR_STREAM << "Failed to get electrometer state : [...] EXCEPTION " << std::endl; throw; } set_state(argout); return argout; } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its <i>device_status</i> data member) and returns it to the caller. * * @return Status descrition * */ //+------------------------------------------------------------------ Tango::ConstDevString MCCE2Electrometers::dev_status() { DEBUG_STREAM << "MCCE2Electrometers::dev_status(): entering... !" << endl; //- clear previous status this->_statusStr.clear(); // Add your own code to control device here try { if ( this->_missing_property ) { _statusStr = "Device cannot be up while its properties are not set!"; } //- check device initialization else if ( !this->_electrometerCH1 && !_electrometerCH2 ) { _statusStr = "No electrometer connected!"; } //- check if an electro is connected on a channel if( attr_electrometerChannel_write == ELETRO_CHANNEL_ONE && !this->_electrometerCH1) { _statusStr += "No electrometer on channel ONE!"; } else if( attr_electrometerChannel_write == ELETRO_CHANNEL_TWO && !this->_electrometerCH2) { _statusStr += "No electrometer on channel TWO!"; } else if ( attr_electrometerChannel_write != ELETRO_CHANNEL_ONE && attr_electrometerChannel_write != ELETRO_CHANNEL_TWO ) { _statusStr += "Invalid electrometer channel set!"; } else { //- add electrometer status info _statusStr += this->_electrometer->electrometer_status(); } } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Cannot perform electrometer_status() command."); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Cannot perform electrometer_status() command : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to get electrometer status.", "MCCE2Electrometers::dev_status()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Cannot perform electrometer_status() command!"); ERROR_STREAM << "Cannot perform electrometer_status() command : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Cannot perform electrometer_status() command!", "MCCE2Electrometers::dev_status()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable remote mode : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Cannot perform electrometer_status() command : caugth [...] exception."); throw; } set_status( _statusStr.c_str() ); return _statusStr.c_str(); } //+---------------------------------------------------------------------------- // // method : MCCE2Electrometers::electrometer_to_tango_exception() // // description : Extract real attribute values from // hardware acquisition result. // //----------------------------------------------------------------------------- Tango::DevFailed MCCE2Electrometers::electrometer_to_tango_exception(const electrometer::ElectrometerException& de) { Tango::DevErrorList error_list(de.errors.size()); error_list.length(de.errors.size()); for(unsigned int i = 0; i < de.errors.size(); i++) { error_list[i].reason = CORBA::string_dup(de.errors[i].reason.c_str()); error_list[i].desc = CORBA::string_dup(de.errors[i].desc.c_str()); error_list[i].origin = CORBA::string_dup(de.errors[i].origin.c_str()); switch(de.errors[i].severity) { case electrometer::WARN: error_list[i].severity = Tango::WARN; break; case electrometer::PANIC: error_list[i].severity = Tango::PANIC; break; case electrometer::ERR: default: error_list[i].severity = Tango::ERR; break; } } return Tango::DevFailed(error_list); } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::set_measure_function * * description: method to execute "SetMeasureFunction" * Enable the Measure MCCE2 mode. * * */ //+------------------------------------------------------------------ void MCCE2Electrometers::set_measure_function() { DEBUG_STREAM << "MCCE2Electrometers::set_measure_function(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::set_measure_function()" ); } try { this->_electrometer->set_Measure_function(); } catch(const electrometer::ElectrometerException& ke) { Tango::DevFailed df = electrometer_to_tango_exception(ke); set_state(Tango::ALARM); set_status("Failed to enable MEASURE function!"); ERROR_STREAM << "Failed to enable MEASURE function : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable MEASURE function.", "MCCE2Electrometers::set_measure_function()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to enable MEASURE function!"); ERROR_STREAM << "Failed to enable MEASURE function : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to enable MEASURE function!", "MCCE2Electrometers::set_measure_function()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to enable MEASURE function : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to enable MEASURE function!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::set_range * * description: method to execute "SetRange" * Apply the specified argin range, on the electrometer, if well formatted. * Else an exception is thrown. * * @param argin The range to apply on the electrometer * */ //+------------------------------------------------------------------ void MCCE2Electrometers::set_range(Tango::DevString argin) { DEBUG_STREAM << "MCCE2Electrometers::set_range(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::set_range()" ); } try { this->_electrometer->set_ElectroMeterRange(std::string(argin)); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::ALARM); set_status("Failed to write the range!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to write the range : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to write the range.", "MCCE2Electrometers::set_range()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::ALARM); set_status("Failed to write the range!"); ERROR_STREAM << "Failed to write the range : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to write the range!", "MCCE2Electrometers::set_range()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to set the new range value : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to write the range!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::set_hz_filter * * description: method to execute "SetHzFilter" * The Cut-off frequency in Hz * * @param argin The MCCE2 cut-off frequency in Hz * */ //+------------------------------------------------------------------ void MCCE2Electrometers::set_hz_filter(Tango::DevShort argin) { DEBUG_STREAM << "MCCE2Electrometers::set_hz_filter(): entering... !" << endl; std::string dataStr("") ; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::set_hz_filter()" ); } try { dataStr = XString<short>::convertToString(argin); this->_electrometer->set_ElectroMeterFrequency(dataStr); } catch(const electrometer::ElectrometerException& ke) { Tango::DevFailed df = electrometer_to_tango_exception(ke); set_state(Tango::ALARM); set_status("Failed to set the Hz Filter!"); ERROR_STREAM << "Failed to set the Hz Filter : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to set the Hz Filter.", "MCCE2Electrometers::set_hz_filter()", Tango::ERR ); } catch(Tango::DevFailed& df) { ERROR_STREAM << "Failed to set the Hz Filter : DevFailed EXCEPTION -> " << df << std::endl; set_state(Tango::ALARM); set_status("Failed to set the Hz Filter!"); Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to set the Hz Filter!", "MCCE2Electrometers::set_hz_filter()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to set the Hz Filter : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to set the Hz Filter!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::get_hz_filter * * description: method to execute "GetHzFilter" * Returns the Cut-off frequency in Hz * * @return The MCCE2 cut-off frequency in Hz * */ //+------------------------------------------------------------------ Tango::DevShort MCCE2Electrometers::get_hz_filter() { Tango::DevShort argout = 0; DEBUG_STREAM << "MCCE2Electrometers::get_hz_filter(): entering... !" << endl; // Add your own code to control device here std::string dataStr(""); if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::get_hz_filter()" ); } try { dataStr = this->_electrometer->get_ElectroMeterFrequency(); argout = XString<short>::convertFromString(dataStr); } catch(const electrometer::ElectrometerException& ke) { Tango::DevFailed df = electrometer_to_tango_exception(ke); set_state(Tango::ALARM); set_status("Failed to set the Hz Filter!"); ERROR_STREAM << "Failed to read the gain : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to read hzFilter.", "hzFilterAttrib::get_hz_filter()", Tango::ERR ); } catch(Tango::DevFailed& df) { ERROR_STREAM << "Failed to read the Hz Filter : DevFailed EXCEPTION -> " << df << std::endl; set_state(Tango::ALARM); set_status("Failed to set the Hz Filter!"); Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to read the Hz Filter!", "MCCE2Electrometers::get_hz_filter()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to read the Hz Filter : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to read the Hz Filter!"); throw; } return argout; } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::get_gain * * description: method to execute "GetGain" * Returns the MCCE-2 gain * * @return The MCCE2 gain * */ //+------------------------------------------------------------------ Tango::DevShort MCCE2Electrometers::get_gain() { Tango::DevShort argout = 0; DEBUG_STREAM << "MCCE2Electrometers::get_gain(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::get_gain()" ); } try { std::string dataStr(""); dataStr = this->_electrometer->get_ElectroMeterGain(); argout = XString<short>::convertFromString(dataStr); } catch(const electrometer::ElectrometerException& ke) { Tango::DevFailed df = electrometer_to_tango_exception(ke); set_state(Tango::ALARM); set_status("Failed to read the gain!"); ERROR_STREAM << "Failed to read the gain : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to read the gain .", "hzFilterAttrib::get_gain()", Tango::ERR ); } catch(Tango::DevFailed& df) { ERROR_STREAM << "Failed to read the gain : DevFailed EXCEPTION -> " << df << std::endl; set_state(Tango::ALARM); set_status("Failed to read the gain!"); Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to read the gain!", "MCCE2Electrometers::get_gain()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to read the gain : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to read the gain!"); throw; } return argout; } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::set_gain * * description: method to execute "SetGain" * Sets the new MCCE-2 gain value. * * @param argin The new MCCE-2 gain * */ //+------------------------------------------------------------------ void MCCE2Electrometers::set_gain(Tango::DevUShort argin) { DEBUG_STREAM << "MCCE2Electrometers::set_gain(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::set_gain()" ); } try { std::string dataStr(""); dataStr = XString<short>::convertToString(argin); this->_electrometer->set_ElectroMeterGain(dataStr); } catch(const electrometer::ElectrometerException& ke) { Tango::DevFailed df = electrometer_to_tango_exception(ke); set_state(Tango::ALARM); set_status("Failed to set the gain!"); ERROR_STREAM << "Failed to set the gain : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to set the gain.", "hzFilterAttrib::set_gain()", Tango::ERR ); } catch(Tango::DevFailed& df) { ERROR_STREAM << "Failed to set the gain : DevFailed EXCEPTION -> " << df << std::endl; set_state(Tango::ALARM); set_status("Failed to set the gain!"); Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to set the the gain!", "MCCE2Electrometers::set_gain()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to set the gain : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to set the gain!"); throw; } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::get_range * * description: method to execute "GetRange" * Returns the electrometer range. * * @return The actual electrometer range * */ //+------------------------------------------------------------------ Tango::DevString MCCE2Electrometers::get_range() { // POGO has generated a method core with argout allocation. // If you would like to use a static reference without copying, // See "TANGO Device Server Programmer's Manual" // (chapter : Writing a TANGO DS / Exchanging data) //------------------------------------------------------------ // Add your own code to control device here DEBUG_STREAM << "MCCE2Electrometers::get_range(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::get_range()" ); } Tango::DevString argout = 0; try { std::string rangeStr(""); rangeStr = this->_electrometer->get_ElectroMeterRange(); argout = new char [rangeStr.size() + 1]; strcpy(argout, rangeStr.c_str()); } catch(const electrometer::ElectrometerException& ke) { if ( argout ) delete [] argout; Tango::DevFailed df = electrometer_to_tango_exception(ke); set_state(Tango::ALARM); set_status("Failed to read the range!"); ERROR_STREAM << "Failed to set read the range : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to read the range.", "MCCE2Electrometers::get_range()", Tango::ERR ); } catch(Tango::DevFailed& df) { if ( argout ) delete [] argout; set_state(Tango::ALARM); set_status("Failed to read the range!"); ERROR_STREAM << "Failed to read the range : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to read the range!", "MCCE2Electrometers::get_range()", Tango::ERR ); } catch(...) { if ( argout ) delete [] argout; ERROR_STREAM << "Failed to read the range : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to read the range!"); throw; } return argout; } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::get_mode * * description: method to execute "GetMode" * Returns the electrometer mode which can be one of the following values : * MEASURE, V/F Zero, OFFSET, LEAKAGE or TEST. * * @return The electrometer mode (MEASURE, LEAKAGE ...) * */ //+------------------------------------------------------------------ Tango::DevString MCCE2Electrometers::get_mode() { // POGO has generated a method core with argout allocation. // If you would like to use a static reference without copying, // See "TANGO Device Server Programmer's Manual" // (chapter : Writing a TANGO DS / Exchanging data) //------------------------------------------------------------ DEBUG_STREAM << "MCCE2Electrometers::get_mode(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::get_mode()" ); } Tango::DevString argout = 0; try { std::string modeStr = this->_electrometer->get_ElectroMeterMode(); argout = new char [modeStr.size() + 1]; strcpy(argout, modeStr.c_str()); } catch(const electrometer::ElectrometerException& ke) { if ( argout ) delete [] argout; set_state(Tango::ALARM); set_status("Failed to read the mode!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to set read the mode : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to read the mode.", "MCCE2Electrometers::get_mode()", Tango::ERR ); } catch(Tango::DevFailed& df) { if ( argout ) delete [] argout; set_state(Tango::ALARM); set_status("Failed to read the mode!"); ERROR_STREAM << "Failed to read the mode : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to read the mode!", "MCCE2Electrometers::get_mode()", Tango::ERR ); } catch(...) { if ( argout ) delete [] argout; ERROR_STREAM << "Failed to read the mode : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to read the mode!"); throw; } return argout; } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::get_polarity * * description: method to execute "GetPolarity" * Returns the electrometer polarity, which can be POSITIVE or NEGATIVE. * * @return The electrometer polarity * */ //+------------------------------------------------------------------ Tango::DevString MCCE2Electrometers::get_polarity() { // POGO has generated a method core with argout allocation. // If you would like to use a static reference without copying, // See "TANGO Device Server Programmer's Manual" // (chapter : Writing a TANGO DS / Exchanging data) //------------------------------------------------------------ DEBUG_STREAM << "MCCE2Electrometers::get_polarity(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::get_polarity()" ); } Tango::DevString argout = 0; try { std::string polarStr = this->_electrometer->get_ElectroMeterPolarity(); argout = new char [polarStr.size() + 1]; strcpy(argout, polarStr.c_str()); } catch(const electrometer::ElectrometerException& ke) { if ( argout ) delete [] argout; set_state(Tango::ALARM); set_status("Failed to read the polarity!"); Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to set read the polarity : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to read the polarity.", "MCCE2Electrometers::get_polarity()", Tango::ERR ); } catch(Tango::DevFailed& df) { if ( argout ) delete [] argout; set_state(Tango::ALARM); set_status("Failed to read the polarity!"); ERROR_STREAM << "Failed to read the polarity : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to read the polarity!", "MCCE2Electrometers::get_polarity()", Tango::ERR ); } catch(...) { if ( argout ) delete [] argout; ERROR_STREAM << "Failed to read the polarity : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to read the polarity!"); throw; } return argout; } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::create_electrometers_obj * * description: internal method to instanciate electrometer(s) obj */ //+------------------------------------------------------------------ void MCCE2Electrometers::create_electrometers_obj() { //- instanciate channel 1 if ( !_electrometerCH1 && electrometer1Address ) { AbstractElectrometerClass* mcce1; mcce1 = new Novelec_MCCE2(communicationLinkName, electrometer1Address); mcce1->init_protocol(); Novelec_MCCE2* nMCCE1 = dynamic_cast<Novelec_MCCE2*>(mcce1); short type1 = 0; //- find connected Novelec model try { if(nMCCE1) type1 = nMCCE1->get_electrometer_type(); } catch(const electrometer::ElectrometerException& ke) { set_state(Tango::FAULT); set_status("Failed to find which Novelec type is connected : communication caught[...]"); Tango::DevFailed df = electrometer_to_tango_exception(ke); FATAL_STREAM << "Failed to find which Novelec type is connected : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to find which Novelec type is connected!", "MCCE2Electrometers::create_electrometers_obj()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::FAULT); set_status("Failed to find which Novelec type is connected!"); FATAL_STREAM << "Failed to find which Novelec type is connected : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to find which Novelec type is connected!", "MCCE2Electrometers::create_electrometers_obj()", Tango::ERR ); } catch(...) { set_state(Tango::FAULT); set_status("Failed to find which Novelec type is connected : communication caught[...]"); FATAL_STREAM << "Failed to find which Novelec type is connected : [...] EXCEPTION " << std::endl; Tango::Except::throw_exception( "UNKNOWN_ERROR", "find which Novelec type is connected! [(...) exception]", "MCCE2Electrometers::create_electrometers_obj()", Tango::ERR ); } switch(type1) { case 0 : this->_electrometerCH1 = 0; break; case 1 : case 2 : case 3 : // this->_electrometerCH1 = new N_PhotoVoltaique (communicationLinkName, channelNumber, electrometerTypeCh1); this->_electrometerCH1 = new N_PhotoVoltaique (communicationLinkName, electrometer1Address); break; case 4 : case 5 : this->_electrometerCH1 = new N_PhotoConducteur(communicationLinkName, electrometer1Address); break; default : FATAL_STREAM << "\nERROR : Electrometers::create_electrometers_obj() -> this " << electrometer1Address << " Novelec type is not supported now!" << endl; return; } if ( mcce1 ) { delete mcce1; mcce1 = 0; } } //- instanciate channel 2 if ( !this->_electrometerCH2 && electrometer2Address ) { AbstractElectrometerClass* mcce2; mcce2 = new Novelec_MCCE2(communicationLinkName, electrometer2Address); mcce2->init_protocol(); Novelec_MCCE2* nMCCE2 = dynamic_cast<Novelec_MCCE2*>(mcce2); short type2 = 0; if(nMCCE2) type2 = nMCCE2->get_electrometer_type(); switch(type2) { case 0 : this->_electrometerCH2 = 0; break; case 1 : case 2 : case 3 : this->_electrometerCH2 = new N_PhotoVoltaique (communicationLinkName, electrometer2Address); break; case 4 : case 5 : this->_electrometerCH2 = new N_PhotoConducteur(communicationLinkName, electrometer2Address); break; default : FATAL_STREAM << "\nERROR : Electrometers::create_electrometers_obj() -> this " << electrometer2Address << " Novelec type is not supported now!" << endl; return; } if ( mcce2 ) { delete mcce2; mcce2 = 0; } } //- check if (!this->_electrometerCH1 && !this->_electrometerCH2) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Cannot build device comm obj!", "MCCE2Electrometers::create_electrometers_obj()"); } //- configure MCCE-2 : clear error(s), explicit response, mode MEASURE OFF bool initCH1 = false; bool initCH2 = false; try { if ( this->_electrometerCH1 ) { initCH1 = this->_electrometerCH1->init_protocol(); if ( initCH1 ) this->_electrometerCH1->mcce_init(); INFO_STREAM << "this->_electrometer = this->_electrometerCH1!" << std::endl; } else WARN_STREAM << "WARN : !this->_electrometerCH1" << std::endl; if ( this->_electrometerCH2 ) { initCH2 = this->_electrometerCH2->init_protocol(); if ( initCH2 ) this->_electrometerCH2->mcce_init(); INFO_STREAM << "this->_electrometer = this->_electrometerCH2!" << std::endl; } //- start with channel one if ( this->_electrometerCH1 ) { this->_electrometer = this->_electrometerCH1; this->_init_done = true; } //- if nothing connected on channel one, try with the second one else if ( this->_electrometerCH2 ) { this->_electrometer = this->_electrometerCH2; this->_init_done = true; } else this->_init_done = false; } catch(const electrometer::ElectrometerException& ke) { Tango::DevFailed df = electrometer_to_tango_exception(ke); ERROR_STREAM << "Failed to set up the MCCE-2 module for a serial communication : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to set up the MCCE-2 module for a serial communication!", "MCCE2Electrometers::create_electrometers_obj()", Tango::ERR ); } catch(Tango::DevFailed& df) { set_state(Tango::FAULT); set_status("Failed to set up the MCCE-2 module for a serial communication!"); ERROR_STREAM << "Failed to set up the MCCE-2 module for a serial communication : DevFailed EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to set up the MCCE-2 module for a serial communication!", "MCCE2Electrometers::create_electrometers_obj()", Tango::ERR ); } catch(...) { set_state(Tango::FAULT); set_status("Failed to set up the MCCE-2 module for a serial communication caught[...]"); ERROR_STREAM << "Failed to set up the MCCE-2 module for a serial communication : [...] EXCEPTION " << std::endl; Tango::Except::throw_exception( "UNKNOWN_ERROR", "Failed to set up the MCCE-2 module for a serial communication! [(...) exception]", "MCCE2Electrometers::create_electrometers_obj()", Tango::ERR ); } } //+------------------------------------------------------------------ /** * method: MCCE2Electrometers::set_polarity * * description: method to execute "SetPolarity" * Sets the new electrometer polarity. <Br> * NOTE : <Br> * Value must be set in UPPER case !!! * * @param argin POSITIVE or NEGATIVE * */ //+------------------------------------------------------------------ void MCCE2Electrometers::set_polarity(Tango::DevString argin) { DEBUG_STREAM << "MCCE2Electrometers::set_polarity(): entering... !" << endl; // Add your own code to control device here if ( !this->_electrometer ) { ERROR_STREAM << "Not enough memory to create the electrometer obj!" << std::endl; Tango::Except::throw_exception( "MEMORY_ERROR", "Failed to build the electrometer obj : not enough memory!?", "MCCE2Electrometers::set_polarity()" ); } try { this->_electrometer->set_ElectroMeterPolarity(argin); } catch(const electrometer::ElectrometerException& ke) { Tango::DevFailed df = electrometer_to_tango_exception(ke); set_state(Tango::ALARM); set_status("Failed to change electrometer polarity!"); ERROR_STREAM << "Failed to change electrometer polarity : ElectrometerException EXCEPTION -> " << df << std::endl; Tango::Except::re_throw_exception(df, "UNKNOWN_ERROR", "Failed to change electrometer polarity.", "hzFilterAttrib::set_polarity()", Tango::ERR ); } catch(Tango::DevFailed& df) { ERROR_STREAM << "Failed to change electrometer polarity : DevFailed EXCEPTION -> " << df << std::endl; set_state(Tango::ALARM); set_status("Failed to change electrometer polarity!"); Tango::Except::re_throw_exception(df, "COMMUNICATION_ERROR", "Failed to change electrometer polarity!", "MCCE2Electrometers::set_polarity()", Tango::ERR ); } catch(...) { ERROR_STREAM << "Failed to change electrometer polarity : [...] EXCEPTION " << std::endl; set_state(Tango::ALARM); set_status("Failed to change electrometer polarity!"); throw; } } } // namespace