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