From 221e827c8c5195504663d6dc325150e8a958d4b1 Mon Sep 17 00:00:00 2001 From: Xavier Elattaoui <xavier.elattaoui@synchrotron-soleil.fr> Date: Mon, 11 Jan 2016 09:27:17 +0000 Subject: [PATCH] Crash at startup fixed. --- pom.xml | 20 ++++---- src/MCCE2Electrometers.cpp | 95 +++++++++++++++++++++++++++++++++----- 2 files changed, 96 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index f2eb922..26c296e 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ </parent> <groupId>fr.soleil.device</groupId> <artifactId>MCCE2Electrometers-${aol}-${mode}</artifactId> - <version>2.2.5-SNAPSHOT</version> + <version>2.2.5</version> <packaging>nar</packaging> <name>MCCE2Electrometers</name> <!-- use for the name of executable --> @@ -21,13 +21,17 @@ </plugin> </plugins> </build> - <dependencies> - <dependency> - <groupId>fr.soleil.lib</groupId> - <artifactId>Electrometers-${aol}-${library}-${mode}</artifactId> - <!-- <version>2.5.15</version> --> - </dependency> - </dependencies> + <dependencies> + <dependency> + <groupId>fr.soleil.lib</groupId> + <artifactId>Electrometers-${aol}-${library}-${mode}</artifactId> + <!-- <version>2.5.15</version> --> + </dependency> + <dependency> + <groupId>fr.soleil.lib</groupId> + <artifactId>YAT4Tango-${aol}-${library}-${mode}</artifactId> + </dependency> +</dependencies> <scm> <connection>${scm.connection.svn.tango-ds}/DeviceClasses/MeasureInstruments/MCCE/NovelecElectrometer/trunk</connection> <developerConnection>${scm.connection.svn.tango-ds}/DeviceClasses/MeasureInstruments/MCCE/NovelecElectrometer/trunk</developerConnection> diff --git a/src/MCCE2Electrometers.cpp b/src/MCCE2Electrometers.cpp index 798da60..3fc2ef9 100644 --- a/src/MCCE2Electrometers.cpp +++ b/src/MCCE2Electrometers.cpp @@ -75,6 +75,8 @@ static const char *RcsId = "$Header: /users/chaize/newsvn/cvsroot/Instrumentatio #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" @@ -140,6 +142,13 @@ void MCCE2Electrometers::delete_device() 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(); } //+---------------------------------------------------------------------------- @@ -153,6 +162,11 @@ 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; @@ -180,7 +194,18 @@ void MCCE2Electrometers::init_device() if( !this->_init_done && !this->_missing_property ) { INFO_STREAM << "init_device -> create_electrometers_obj : ... " << std::endl; - create_electrometers_obj(); + 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; @@ -328,8 +353,8 @@ void MCCE2Electrometers::read_range1(Tango::Attribute &attr) { if ( this->_updateRange1FromHW && *attr_electrometerChannel_read == ELETRO_CHANNEL_ONE ) { - *attr_range1_read = this->get_range(); - this->_updateRange1FromHW = false; + *attr_range1_read = this->get_range(); + this->_updateRange1FromHW = false; } } @@ -355,8 +380,8 @@ void MCCE2Electrometers::read_range2(Tango::Attribute &attr) { if ( this->_updateRange2FromHW && *attr_electrometerChannel_read == ELETRO_CHANNEL_TWO ) { - *attr_range2_read = this->get_range(); - this->_updateRange2FromHW = false; + *attr_range2_read = this->get_range(); + this->_updateRange2FromHW = false; } } @@ -1434,8 +1459,8 @@ Tango::ConstDevString MCCE2Electrometers::dev_status() { DEBUG_STREAM << "MCCE2Electrometers::dev_status(): entering... !" << endl; - //- clear previous status - this->_statusStr.clear(); + //- clear previous status + this->_statusStr.clear(); // Add your own code to control device here try @@ -1465,8 +1490,8 @@ Tango::ConstDevString MCCE2Electrometers::dev_status() } else { - //- add electrometer status info - _statusStr += this->_electrometer->electrometer_status(); + //- add electrometer status info + _statusStr += this->_electrometer->electrometer_status(); } } catch(const electrometer::ElectrometerException& ke) @@ -2240,8 +2265,56 @@ void MCCE2Electrometers::create_electrometers_obj() Novelec_MCCE2* nMCCE1 = dynamic_cast<Novelec_MCCE2*>(mcce1); short type1 = 0; - if(nMCCE1) - type1 = nMCCE1->get_electrometer_type(); + //- 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) { -- GitLab