Index: trunk/lib/FlairCore/src/Buffer.cpp
===================================================================
--- trunk/lib/FlairCore/src/Buffer.cpp	(revision 121)
+++ 	(revision )
@@ -1,36 +1,0 @@
-// %flair:license{
-// This file is part of the Flair framework distributed under the
-// CECILL-C License, Version 1.0.
-// %flair:license}
-//  created:    2016/12/22
-//  filename:   Buffer.cpp
-//
-//  author:     Guillaume Sanahuja
-//              Copyright Heudiasyc UMR UTC/CNRS 7253
-//
-//  version:    $Id: $
-//
-//  purpose:    Class defining a buffer, not for real time use
-//
-/*********************************************************************/
-
-#include "Buffer.h"
-
-using std::string;
-
-namespace flair {
-namespace core {
-
-Buffer::Buffer(const Object *parent, string name)
-    : io_data(parent, name, 1), dataType() {
- 
-}
-
-Buffer::~Buffer() {
- 
-}
-
-void Buffer::CopyDatas(char *dst) const { Warn("non implementé\n"); }
-
-} // end namespace core
-} // end namespace flair
Index: trunk/lib/FlairCore/src/Buffer.h
===================================================================
--- trunk/lib/FlairCore/src/Buffer.h	(revision 121)
+++ 	(revision )
@@ -1,79 +1,0 @@
-// %flair:license{
-// This file is part of the Flair framework distributed under the
-// CECILL-C License, Version 1.0.
-// %flair:license}
-/*!
- * \file Buffer.h
- * \brief Class defining a buffer, not for real time use
- * \author Guillaume Sanahuja, Copyright Heudiasyc UMR UTC/CNRS 7253
- * \date 2016/12/22
- * \version 4.0
- */
-
-#ifndef BUFFER_H
-#define BUFFER_H
-
-#include <io_data.h>
-#include <stdint.h>
-
-namespace flair {
-namespace core {
-/*! \class Buffer
-*
-* \brief Class defining a buffer, not for real time use
-*
-*
-*/
-class Buffer : public io_data {
-public:
-  class Type : public DataType {
-  public:
-    Type() {}
-
-    size_t GetSize() const {
-    }
-		
-    std::string GetDescription() const { return "buffer"; };
-
-  private:
-  };
-
-  /*!
-  * \brief Constructor
-  *
-  * Construct a buffer.
-  *
-  * \param parent parent
-  * \param name name
-	* 
-  */
-  Buffer(const Object *parent, std::string name = "");
-
-  /*!
-  * \brief Destructor
-  *
-  */
-  ~Buffer();
-
- 
-
-  Type const &GetDataType() const { return dataType; };
-
-private:
-  /*!
-  * \brief Copy datas
-  *
-  * Reimplemented from io_data. \n
-  * See io_data::CopyDatas.
-  *
-  * \param dst destination buffer
-  */
-  void CopyDatas(char *dst) const;
-
-  Type dataType;
-};
-
-} // end namespace core
-} // end namespace flair
-
-#endif // BUFFER_H
Index: trunk/lib/FlairCore/src/FrameworkManager.cpp
===================================================================
--- trunk/lib/FlairCore/src/FrameworkManager.cpp	(revision 121)
+++ trunk/lib/FlairCore/src/FrameworkManager.cpp	(revision 122)
@@ -178,4 +178,8 @@
 }
 
+bool FrameworkManager::IsDeviceLogged(const IODevice *device) const {
+	return pimpl_->IsDeviceLogged(device);
+}
+
 void FrameworkManager::StartLog(void) { pimpl_->StartLog(); }
 
Index: trunk/lib/FlairCore/src/FrameworkManager.h
===================================================================
--- trunk/lib/FlairCore/src/FrameworkManager.h	(revision 121)
+++ trunk/lib/FlairCore/src/FrameworkManager.h	(revision 122)
@@ -121,4 +121,14 @@
   */
   void AddDeviceToLog(IODevice *device);
+	
+	/*!
+  * \brief Is device logged
+  *
+  * Check if AddDeviceToLog was called for an IODevice
+  *
+  * \param device IODevice to check
+  * \return true if AddDeviceToLog was called for this IODevice
+  */
+  bool IsDeviceLogged(const IODevice *device) const;
 
   /*!
Index: trunk/lib/FlairCore/src/FrameworkManager_impl.cpp
===================================================================
--- trunk/lib/FlairCore/src/FrameworkManager_impl.cpp	(revision 121)
+++ trunk/lib/FlairCore/src/FrameworkManager_impl.cpp	(revision 122)
@@ -630,5 +630,6 @@
 
   if (is_logging == false) {
-    if (device->pimpl_->SetToBeLogged()) {
+    if (!device->pimpl_->IsSetToBeLogged()) {
+			device->pimpl_->SetToBeLogged();
       log_desc_t tmp;
       tmp.device = device;
@@ -640,4 +641,8 @@
     Err("impossible while logging\n");
   }
+}
+
+bool FrameworkManager_impl::IsDeviceLogged(const IODevice *device) const {
+	return device->pimpl_->IsSetToBeLogged();
 }
 
Index: trunk/lib/FlairCore/src/IODevice_impl.cpp
===================================================================
--- trunk/lib/FlairCore/src/IODevice_impl.cpp	(revision 121)
+++ trunk/lib/FlairCore/src/IODevice_impl.cpp	(revision 122)
@@ -106,16 +106,19 @@
 }
 
-bool IODevice_impl::SetToBeLogged(void) {
+bool IODevice_impl::IsSetToBeLogged(void) const{
+	return tobelogged;
+}
+
+void IODevice_impl::SetToBeLogged(void) {
   if (!tobelogged) {
     tobelogged = true;
-    return true;
   } else {
     self->Warn("already added to log\n");
-    return false;
   }
 }
 
 void IODevice_impl::WriteLogsDescriptors(fstream &desc_file, int *index) {
-  // own descriptor
+  //Printf("WriteLogsDescriptors %s\n",self->ObjectName().c_str());
+	// own descriptor
   for (size_t i = 0; i < datasToLog.size(); i++)
     datasToLog.at(i)->pimpl_->WriteLogDescriptor(desc_file, index);
@@ -127,4 +130,5 @@
   for (size_t i = 0; i < devicesToLog.size(); i++)
     devicesToLog.at(i)->pimpl_->WriteLogsDescriptors(desc_file, index);
+	//Printf("WriteLogsDescriptors %s ok\n",self->ObjectName().c_str());
 }
 
@@ -194,9 +198,9 @@
 
 void IODevice_impl::AppendLog(char **ptr) {
-  // Printf("AppendLog %s %x\n",self->ObjectName().c_str(),*ptr);
+   //Printf("AppendLog %s %x\n",self->ObjectName().c_str(),*ptr);
 
   // copy state to buf
   for (size_t i = 0; i < datasToLog.size(); i++) {
-    // printf("copy\n");
+    // printf("copy %s\n",datasToLog.at(i)->ObjectName().c_str());
     datasToLog.at(i)->CopyDatas(*ptr);
     (*ptr) += datasToLog.at(i)->GetDataType().GetSize();
Index: trunk/lib/FlairCore/src/io_data_impl.cpp
===================================================================
--- trunk/lib/FlairCore/src/io_data_impl.cpp	(revision 121)
+++ trunk/lib/FlairCore/src/io_data_impl.cpp	(revision 122)
@@ -42,4 +42,5 @@
 
 void io_data_impl::WriteLogDescriptor(std::fstream &desc_file, int *index) {
+	if(descriptors.size()==0) self->Warn("AppendLogDescription was not called for this object.\n");
   for (size_t i = 0; i < descriptors.size(); i++) {
     desc_file << (*index)++ << ": " << self->ObjectName() << " - "
Index: trunk/lib/FlairCore/src/unexported/FrameworkManager_impl.h
===================================================================
--- trunk/lib/FlairCore/src/unexported/FrameworkManager_impl.h	(revision 121)
+++ trunk/lib/FlairCore/src/unexported/FrameworkManager_impl.h	(revision 122)
@@ -48,4 +48,5 @@
   void SetupLogger(std::string log_path);
   void AddDeviceToLog(flair::core::IODevice *device);
+	bool IsDeviceLogged(const flair::core::IODevice *device) const;
   void StartLog();
   void StopLog();
Index: trunk/lib/FlairCore/src/unexported/IODevice_impl.h
===================================================================
--- trunk/lib/FlairCore/src/unexported/IODevice_impl.h	(revision 121)
+++ trunk/lib/FlairCore/src/unexported/IODevice_impl.h	(revision 122)
@@ -42,5 +42,6 @@
   void WriteLog(flair::core::Time time);
   void AddDeviceToLog(const flair::core::IODevice *device);
-  bool SetToBeLogged(void); // return true if possible
+  void SetToBeLogged(void); 
+	bool IsSetToBeLogged(void) const;
   void OutputToShMem(bool enabled);
   void WriteToShMem(void);
Index: trunk/lib/FlairMeta/src/HdsX8.cpp
===================================================================
--- trunk/lib/FlairMeta/src/HdsX8.cpp	(revision 121)
+++ trunk/lib/FlairMeta/src/HdsX8.cpp	(revision 122)
@@ -35,32 +35,20 @@
 namespace meta {
 
-HdsX8::HdsX8(FrameworkManager *parent, string uav_name,
+HdsX8::HdsX8(string name,
              filter::UavMultiplex *multiplex)
-    : Uav(parent, uav_name, multiplex) {
-  RTDM_I2cPort *i2cport = new RTDM_I2cPort(parent, "rtdm_i2c", "rti2c3");
-  RTDM_SerialPort *imu_port = new RTDM_SerialPort(parent, "imu_port", "rtser1");
+    : Uav(name, multiplex) {
+  RTDM_I2cPort *i2cport = new RTDM_I2cPort(getFrameworkManager(), "rtdm_i2c", "rti2c3");
+  RTDM_SerialPort *imu_port = new RTDM_SerialPort(getFrameworkManager(), "imu_port", "rtser1");
 
   if (multiplex == NULL)
-    SetMultiplex(new X4X8Multiplex(parent, "motors", X4X8Multiplex::X8));
+    SetMultiplex(new X4X8Multiplex(getFrameworkManager(), "motors", X4X8Multiplex::X8));
 
   SetBldc(new BlCtrlV2(GetUavMultiplex(), GetUavMultiplex()->GetLayout(),
                        "motors", GetUavMultiplex()->MotorsCount(), i2cport));
-  SetUsRangeFinder(new Srf08(parent, "SRF08", i2cport, 0x70, 60));
-  SetAhrs(new Gx3_25_ahrs(parent, "imu", imu_port,
+  SetUsRangeFinder(new Srf08(getFrameworkManager(), "SRF08", i2cport, 0x70, 60));
+  SetAhrs(new Gx3_25_ahrs(getFrameworkManager(), "imu", imu_port,
                           Gx3_25_imu::AccelerationAngularRateAndOrientationMatrix, 70));
   SetBatteryMonitor(((BlCtrlV2 *)GetBldc())->GetBatteryMonitor());
-
-  /*
-          if(VRPNType==Auto || VRPNType==AutoSerialPort)
-          {
-              RTDM_SerialPort* vrpn_port=new
-     RTDM_SerialPort(parent,"vrpn_port","rtser3");
-
-              vrpnclient=new VrpnClient(parent,"vrpn",vrpn_port,10000,80);
-              uav_vrpn=new
-     MetaVrpnObject(vrpnclient,uav_name,VRPNSerialObjectId);
-          }
-  */
-  SetVerticalCamera(new Ps3Eye(parent, "camv", 0, 50));
+  SetVerticalCamera(new Ps3Eye(getFrameworkManager(), "camv", 0, 50));
 }
 
@@ -71,5 +59,4 @@
   ((Srf08 *)GetUsRangeFinder())->Start();
   ((Ps3Eye *)GetVerticalCamera())->Start();
-  Uav::StartSensors();
 }
 
Index: trunk/lib/FlairMeta/src/HdsX8.h
===================================================================
--- trunk/lib/FlairMeta/src/HdsX8.h	(revision 121)
+++ trunk/lib/FlairMeta/src/HdsX8.h	(revision 122)
@@ -24,8 +24,9 @@
 class HdsX8 : public Uav {
 public:
-  HdsX8(core::FrameworkManager *parent, std::string uav_name,
+  HdsX8(std::string name,
         filter::UavMultiplex *multiplex = NULL);
   ~HdsX8();
   void StartSensors(void);
+	std::string GetDefaultVrpnAddress(void) const{return "192.168.147.197:3883";}
 
 private:
Index: trunk/lib/FlairMeta/src/MetaVrpnObject.cpp
===================================================================
--- trunk/lib/FlairMeta/src/MetaVrpnObject.cpp	(revision 121)
+++ trunk/lib/FlairMeta/src/MetaVrpnObject.cpp	(revision 122)
@@ -39,16 +39,16 @@
 namespace meta {
 
-MetaVrpnObject::MetaVrpnObject(const VrpnClient *parent, string name)
-    : VrpnObject(parent, name, parent->GetTabWidget()) {
-  ConstructorCommon(parent, name);
+MetaVrpnObject::MetaVrpnObject(string name)
+    : VrpnObject( name, GetVrpnClient()->GetTabWidget()) {
+  ConstructorCommon(name);
 }
 
-MetaVrpnObject::MetaVrpnObject(const VrpnClient *parent, std::string name,
+MetaVrpnObject::MetaVrpnObject(std::string name,
                                uint8_t id)
-    : VrpnObject(parent, name, id, parent->GetTabWidget()) {
-  ConstructorCommon(parent, name);
+    : VrpnObject(name, id, GetVrpnClient()->GetTabWidget()) {
+  ConstructorCommon( name);
 }
 
-void MetaVrpnObject::ConstructorCommon(const VrpnClient *parent, string name) {
+void MetaVrpnObject::ConstructorCommon(string name) {
   cvmatrix_descriptor *desc = new cvmatrix_descriptor(6, 1);
   for (int i = 0; i < 6; i++) {
@@ -60,5 +60,5 @@
   }
 
-  pbas = new LowPassFilter(this, parent->GetLayout()->NewRow(),
+  pbas = new LowPassFilter(this, GetVrpnClient()->GetLayout()->NewRow(),
                            name + " Passe bas", prev_value);
 
@@ -72,5 +72,5 @@
   }
 
-  euler = new EulerDerivative(pbas, parent->GetLayout()->NewRow(),
+  euler = new EulerDerivative(pbas, GetVrpnClient()->GetLayout()->NewRow(),
                               name + "_euler", prev_value);
 
@@ -82,5 +82,5 @@
   vz_opti_plot->AddCurve(euler->Matrix()->Element(5));
 
-  plot_tab = new Tab(parent->GetTabWidget(), "Mesures (xy) " + name);
+  plot_tab = new Tab(GetVrpnClient()->GetTabWidget(), "Mesures (xy) " + name);
   xy_plot = new DataPlot2D(plot_tab->NewRow(), "xy", "y", -5, 5, "x", -5, 5);
   xy_plot->AddCurve(Output()->Element(4, 0), Output()->Element(3, 0));
Index: trunk/lib/FlairMeta/src/MetaVrpnObject.h
===================================================================
--- trunk/lib/FlairMeta/src/MetaVrpnObject.h	(revision 121)
+++ trunk/lib/FlairMeta/src/MetaVrpnObject.h	(revision 122)
@@ -18,20 +18,17 @@
 
 namespace flair {
-namespace core {
-class Vector3D;
-class FloatType;
-}
-namespace gui {
-class DataPlot1D;
-class DataPlot2D;
-class Tab;
-}
-namespace filter {
-class EulerDerivative;
-class LowPassFilter;
-}
-namespace sensor {
-class VrpnClient;
-}
+	namespace core {
+		class Vector3D;
+		class FloatType;
+	}
+	namespace gui {
+		class DataPlot1D;
+		class DataPlot2D;
+		class Tab;
+	}
+	namespace filter {
+		class EulerDerivative;
+		class LowPassFilter;
+	}
 }
 
@@ -47,7 +44,6 @@
 class MetaVrpnObject : public sensor::VrpnObject {
 public:
-  MetaVrpnObject(const sensor::VrpnClient *parent, std::string name);
-  MetaVrpnObject(const sensor::VrpnClient *parent, std::string name,
-                 uint8_t id);
+  MetaVrpnObject(std::string name);
+  MetaVrpnObject(std::string name,uint8_t id);
   ~MetaVrpnObject();
   gui::DataPlot1D *VxPlot(void) const; // 1,0
@@ -58,5 +54,5 @@
 
 private:
-  void ConstructorCommon(const sensor::VrpnClient *parent, std::string name);
+  void ConstructorCommon(std::string name);
   filter::LowPassFilter *pbas;
   filter::EulerDerivative *euler;
Index: trunk/lib/FlairMeta/src/SimuX4.cpp
===================================================================
--- trunk/lib/FlairMeta/src/SimuX4.cpp	(revision 121)
+++ trunk/lib/FlairMeta/src/SimuX4.cpp	(revision 122)
@@ -37,20 +37,20 @@
 namespace meta {
 
-SimuX4::SimuX4(FrameworkManager *parent, string uav_name, int simu_id,
+SimuX4::SimuX4(string name, int simu_id,
                filter::UavMultiplex *multiplex)
-    : Uav(parent, uav_name, multiplex) {
+    : Uav(name, multiplex) {
 
   if (multiplex == NULL)
-    SetMultiplex(new X4X8Multiplex(parent, "motors", X4X8Multiplex::X4));
+    SetMultiplex(new X4X8Multiplex(getFrameworkManager(), "motors", X4X8Multiplex::X4));
 
   SetBldc(new SimuBldc(GetUavMultiplex(), GetUavMultiplex()->GetLayout(),
                        "motors", GetUavMultiplex()->MotorsCount(), simu_id));
-  SetUsRangeFinder(new SimuUs(parent, "us", simu_id, 60));
-  SetAhrs(new SimuAhrs(parent, "imu", simu_id, 70));
-  Tab *bat_tab = new Tab(parent->GetTabWidget(), "battery");
+  SetUsRangeFinder(new SimuUs(getFrameworkManager(), "us", simu_id, 60));
+  SetAhrs(new SimuAhrs(getFrameworkManager(), "imu", simu_id, 70));
+  Tab *bat_tab = new Tab(getFrameworkManager()->GetTabWidget(), "battery");
   SetBatteryMonitor(new BatteryMonitor(bat_tab->NewRow(), "battery"));
   GetBatteryMonitor()->SetBatteryValue(12);
   SetVerticalCamera(
-      new SimuCamera(parent, "simu_cam_v", 320, 240, 3, simu_id, 10));
+      new SimuCamera(getFrameworkManager(), "simu_cam_v", 320, 240, 3, simu_id, 10));
 }
 
@@ -61,8 +61,5 @@
   ((SimuUs *)GetUsRangeFinder())->Start();
   ((SimuCamera *)GetVerticalCamera())->Start();
-  Uav::StartSensors();
 }
-
-void SimuX4::SetupVRPNAutoIP(string name) { SetupVRPN("127.0.0.1:3883", name); }
 
 } // end namespace meta
Index: trunk/lib/FlairMeta/src/SimuX4.h
===================================================================
--- trunk/lib/FlairMeta/src/SimuX4.h	(revision 121)
+++ trunk/lib/FlairMeta/src/SimuX4.h	(revision 122)
@@ -26,9 +26,8 @@
   // simu_id: 0 if simulating only one UAV
   //>0 otherwise
-  SimuX4(core::FrameworkManager *parent, std::string uav_name, int simu_id = 0,
+  SimuX4(std::string name, int simu_id = 0,
          filter::UavMultiplex *multiplex = NULL);
   ~SimuX4();
   void StartSensors(void);
-  void SetupVRPNAutoIP(std::string name);
 };
 } // end namespace meta
Index: trunk/lib/FlairMeta/src/SimuX8.cpp
===================================================================
--- trunk/lib/FlairMeta/src/SimuX8.cpp	(revision 121)
+++ trunk/lib/FlairMeta/src/SimuX8.cpp	(revision 122)
@@ -37,20 +37,20 @@
 namespace meta {
 
-SimuX8::SimuX8(FrameworkManager *parent, string uav_name, int simu_id,
+SimuX8::SimuX8(string name, int simu_id,
                filter::UavMultiplex *multiplex)
-    : Uav(parent, uav_name, multiplex) {
+    : Uav(name, multiplex) {
 
   if (multiplex == NULL)
-    SetMultiplex(new X4X8Multiplex(parent, "motors", X4X8Multiplex::X8));
+    SetMultiplex(new X4X8Multiplex(getFrameworkManager(), "motors", X4X8Multiplex::X8));
 
   SetBldc(new SimuBldc(GetUavMultiplex(), GetUavMultiplex()->GetLayout(),
                        "motors", GetUavMultiplex()->MotorsCount(), simu_id));
-  SetUsRangeFinder(new SimuUs(parent, "us", simu_id, 60));
-  SetAhrs(new SimuAhrs(parent, "imu", simu_id, 70));
-  Tab *bat_tab = new Tab(parent->GetTabWidget(), "battery");
+  SetUsRangeFinder(new SimuUs(getFrameworkManager(), "us", simu_id, 60));
+  SetAhrs(new SimuAhrs(getFrameworkManager(), "imu", simu_id, 70));
+  Tab *bat_tab = new Tab(getFrameworkManager()->GetTabWidget(), "battery");
   SetBatteryMonitor(new BatteryMonitor(bat_tab->NewRow(), "battery"));
   GetBatteryMonitor()->SetBatteryValue(12);
   SetVerticalCamera(
-      new SimuCamera(parent, "simu_cam_v", 320, 240, 3, simu_id, 10));
+      new SimuCamera(getFrameworkManager(), "simu_cam_v", 320, 240, 3, simu_id, 10));
 }
 
@@ -61,8 +61,5 @@
   ((SimuUs *)GetUsRangeFinder())->Start();
   ((SimuCamera *)GetVerticalCamera())->Start();
-  Uav::StartSensors();
 }
-
-void SimuX8::SetupVRPNAutoIP(string name) { SetupVRPN("127.0.0.1:3883", name); }
 
 } // end namespace meta
Index: trunk/lib/FlairMeta/src/SimuX8.h
===================================================================
--- trunk/lib/FlairMeta/src/SimuX8.h	(revision 121)
+++ trunk/lib/FlairMeta/src/SimuX8.h	(revision 122)
@@ -26,9 +26,8 @@
   // simu_id: 0 if simulating only one UAV
   //>0 otherwise
-  SimuX8(core::FrameworkManager *parent, std::string uav_name, int simu_id = 0,
+  SimuX8(std::string name, int simu_id = 0,
          filter::UavMultiplex *multiplex = NULL);
   ~SimuX8();
   void StartSensors(void);
-  void SetupVRPNAutoIP(std::string name);
 };
 } // end namespace meta
Index: trunk/lib/FlairMeta/src/Uav.cpp
===================================================================
--- trunk/lib/FlairMeta/src/Uav.cpp	(revision 121)
+++ trunk/lib/FlairMeta/src/Uav.cpp	(revision 122)
@@ -38,11 +38,21 @@
 using namespace flair::actuator;
 
+namespace {
+  flair::meta::Uav *uavSingleton = NULL;
+}
+
 namespace flair {
 namespace meta {
 
-Uav::Uav(FrameworkManager *parent, string name, UavMultiplex *multiplex)
-    : Object(parent, name) {
-  vrpnclient = NULL;
-  uav_vrpn = NULL;
+Uav *GetUav(void) { return uavSingleton; }
+	
+Uav::Uav(string name, UavMultiplex *multiplex)
+    : Object(getFrameworkManager(), name) {
+	if (uavSingleton != NULL) {
+    Err("Uav must be instanced only one time\n");
+    return;
+  }
+
+  uavSingleton = this;
   verticalCamera = NULL;
   horizontalCamera = NULL;
@@ -82,35 +92,5 @@
   horizontalCamera = (Camera *)inHorizontalCamera;
 }
-/*
-void Uav::SetupVRPNSerial(SerialPort *vrpn_port,string name,int
-VRPNSerialObjectId) {
-    vrpnclient=new VrpnClient(getFrameworkManager(),"vrpn",vrpn_port,10000,80);
-    uav_vrpn=new MetaVrpnObject(vrpnclient,name,VRPNSerialObjectId);
 
-    getFrameworkManager()->AddDeviceToLog(uav_vrpn);
-}
-*/
-void Uav::SetupVRPNAutoIP(string name) {
-  SetupVRPN("192.168.147.197:3883", name);
-}
-
-void Uav::SetupVRPN(string optitrack_address, string name) {
-  vrpnclient = new VrpnClient(getFrameworkManager(), "vrpn", optitrack_address,
-                              10000, 80);
-  uav_vrpn = new MetaVrpnObject(vrpnclient, name);
-
-  getFrameworkManager()->AddDeviceToLog(uav_vrpn);
-
-  GetAhrs()->YawPlot()->AddCurve(uav_vrpn->State()->Element(2),
-                                 DataPlot::Green);
-  // GetAhrs()->RollPlot()->AddCurve(uav_vrpn->State()->Element(0),DataPlot::Green);
-  // GetAhrs()->PitchPlot()->AddCurve(uav_vrpn->State()->Element(1),DataPlot::Green);
-}
-
-void Uav::StartSensors(void) {
-  if (vrpnclient != NULL) {
-    vrpnclient->Start();
-  }
-}
 void Uav::UseDefaultPlot(void) {
   multiplex->UseDefaultPlot();
@@ -184,12 +164,4 @@
 BatteryMonitor *Uav::GetBatteryMonitor(void) const { return battery; }
 
-VrpnClient *Uav::GetVrpnClient(void) const {
-  if (vrpnclient == NULL)
-    Err("vrpn is not setup, call SetupVRPN before\n");
-  return vrpnclient;
-}
-
-MetaVrpnObject *Uav::GetVrpnObject(void) const { return uav_vrpn; }
-
 Camera *Uav::GetVerticalCamera(void) const { return verticalCamera; }
 
Index: trunk/lib/FlairMeta/src/Uav.h
===================================================================
--- trunk/lib/FlairMeta/src/Uav.h	(revision 121)
+++ trunk/lib/FlairMeta/src/Uav.h	(revision 122)
@@ -17,21 +17,17 @@
 
 namespace flair {
-namespace core {
-class FrameworkManager;
-}
-namespace filter {
-class Ahrs;
-class UavMultiplex;
-}
-namespace actuator {
-class Bldc;
-}
-namespace sensor {
-class UsRangeFinder;
-class BatteryMonitor;
-class VrpnClient;
-class Imu;
-class Camera;
-}
+	namespace filter {
+		class Ahrs;
+		class UavMultiplex;
+	}
+	namespace actuator {
+		class Bldc;
+	}
+	namespace sensor {
+		class UsRangeFinder;
+		class BatteryMonitor;
+		class Imu;
+		class Camera;
+	}
 }
 
@@ -39,32 +35,20 @@
 namespace meta {
 class MetaUsRangeFinder;
-class MetaVrpnObject;
 
 /*! \class Uav
 *
-* \brief Base class to construct sensors/actuators depending on uav type
+* \brief Base class to construct sensors/actuators depending on uav type.
+* The Object is created with 
+*  the FrameworkManager as parent. FrameworkManager must be created before.
+* Only one instance of this class is allowed by program.
 */
 class Uav : public core::Object {
 public:
-  /*
-      typedef enum {
-          None,
-          Auto,//rt serial if hds x4 ou x8, auto ip sinon
-          AutoIP,
-          UserDefinedIP,
-          AutoSerialPort,
-          } VRPNType_t;
-*/
-  // uav_name: for optitrack
-  Uav(core::FrameworkManager *parent, std::string name,
+
+  Uav(std::string name,
       filter::UavMultiplex *multiplex = NULL);
   ~Uav();
-  void SetupVRPN(std::string optitrack_address, std::string name);
-  // vrpn serial: broken, need to add serial port in uav specific code
-  // void SetupVRPNSerial(core::SerialPort *vrpn_port,std::string name,int
-  // VRPNSerialObjectId);
-  virtual void SetupVRPNAutoIP(std::string name);
 
-  virtual void StartSensors(void);
+  virtual void StartSensors(void)=0;
   void UseDefaultPlot(void);
   actuator::Bldc *GetBldc(void) const;
@@ -75,8 +59,7 @@
   sensor::UsRangeFinder *GetUsRangeFinder(void) const;
   sensor::BatteryMonitor *GetBatteryMonitor(void) const;
-  sensor::VrpnClient *GetVrpnClient(void) const;
-  meta::MetaVrpnObject *GetVrpnObject(void) const;
   sensor::Camera *GetVerticalCamera(void) const;
   sensor::Camera *GetHorizontalCamera(void) const;
+	virtual std::string GetDefaultVrpnAddress(void) const{return "127.0.0.1:3883";}
 
 protected:
@@ -96,9 +79,15 @@
   sensor::UsRangeFinder *us;
   MetaUsRangeFinder *meta_us;
-  sensor::VrpnClient *vrpnclient;
-  MetaVrpnObject *uav_vrpn;
   sensor::BatteryMonitor *battery;
   sensor::Camera *verticalCamera,*horizontalCamera;
 };
+
+/*!
+* \brief get Uav
+*
+* \return the Uav
+*/
+Uav *GetUav(void);
+
 } // end namespace meta
 } // end namespace flair
Index: trunk/lib/FlairMeta/src/UavFactory.cpp
===================================================================
--- trunk/lib/FlairMeta/src/UavFactory.cpp	(revision 121)
+++ trunk/lib/FlairMeta/src/UavFactory.cpp	(revision 122)
@@ -30,5 +30,5 @@
 
 namespace { // anonymous
-     vector<flair::meta::Uav* (*)(FrameworkManager*,string,string,UavMultiplex*)> *vectoroffunctions=NULL;
+     vector<flair::meta::Uav* (*)(string,string,UavMultiplex*)> *vectoroffunctions=NULL;
 }
 
@@ -41,5 +41,5 @@
 
 
-Uav *CreateUav(FrameworkManager *parent, string uav_name, string uav_type,
+Uav *CreateUav(string name, string uav_type,
                UavMultiplex *multiplex) {
 
@@ -48,5 +48,5 @@
   if(vectoroffunctions!=NULL) {
     for(int i=0;i<vectoroffunctions->size();i++) {
-      uav=vectoroffunctions->at(i)(parent, uav_name, uav_type,multiplex);
+      uav=vectoroffunctions->at(i)(name,uav_type,multiplex);
       if(uav!=NULL) {
         free(vectoroffunctions);
@@ -58,12 +58,12 @@
 
   if (uav_type == "hds_x4") {
-    parent->Err("UAV type %s not yet implemented\n", uav_type.c_str());
+    getFrameworkManager()->Err("UAV type %s not yet implemented\n", uav_type.c_str());
     return NULL;
   } else if (uav_type == "hds_x8") {
-    return new HdsX8(parent, uav_name, multiplex);
+    return new HdsX8(name, multiplex);
   } else if (uav_type == "xair") {
-    return new XAir(parent, uav_name, multiplex);
+    return new XAir(name, multiplex);
   } else if (uav_type == "hds_xufo") {
-    parent->Err("UAV type %s not yet implemented\n", uav_type.c_str());
+    getFrameworkManager()->Err("UAV type %s not yet implemented\n", uav_type.c_str());
     return NULL;
   } else if (uav_type.compare(0, 7, "x4_simu") == 0) {
@@ -72,5 +72,5 @@
       simu_id = atoi(uav_type.substr(7, uav_type.size() - 7).c_str());
     }
-    return new SimuX4(parent, uav_name, simu_id, multiplex);
+    return new SimuX4(name, simu_id, multiplex);
   } else if (uav_type.compare(0, 7, "x8_simu") == 0) {
     int simu_id = 0;
@@ -78,14 +78,14 @@
       simu_id = atoi(uav_type.substr(7, uav_type.size() - 7).c_str());
     }
-    return new SimuX8(parent, uav_name, simu_id, multiplex);
+    return new SimuX8(name, simu_id, multiplex);
   } else {
-    parent->Err("UAV type %s unknown\n", uav_type.c_str());
+    getFrameworkManager()->Err("UAV type %s unknown\n", uav_type.c_str());
     return NULL;
   }
 }
 
-void RegisterUavCreator(flair::meta::Uav*(*func)(FrameworkManager *parent, string uav_name, string uav_type,
+void RegisterUavCreator(flair::meta::Uav*(*func)(string name, string type,
                UavMultiplex *multiplex)) {
-  if(vectoroffunctions==NULL) vectoroffunctions=(vector<flair::meta::Uav* (*)(FrameworkManager*,string,string,UavMultiplex*)>*)malloc(sizeof(vector<flair::meta::Uav* (*)(FrameworkManager*,string,string,UavMultiplex*)>));
+  if(vectoroffunctions==NULL) vectoroffunctions=(vector<flair::meta::Uav* (*)(string,string,UavMultiplex*)>*)malloc(sizeof(vector<flair::meta::Uav* (*)(string,string,UavMultiplex*)>));
 
   vectoroffunctions->push_back(func);
Index: trunk/lib/FlairMeta/src/UavFactory.h
===================================================================
--- trunk/lib/FlairMeta/src/UavFactory.h	(revision 121)
+++ trunk/lib/FlairMeta/src/UavFactory.h	(revision 122)
@@ -21,10 +21,8 @@
 #include <Uav.h>
 
-flair::meta::Uav *CreateUav(flair::core::FrameworkManager *parent,
-                            std::string uav_name, std::string uav_type,
+flair::meta::Uav *CreateUav(std::string name, std::string type,
                             flair::filter::UavMultiplex *multiplex = NULL);
 
-void RegisterUavCreator(flair::meta::Uav*(*func)(flair::core::FrameworkManager *parent,
-                                   std::string uav_name, std::string uav_type,
+void RegisterUavCreator(flair::meta::Uav*(*func)(std::string name, std::string type,
                                    flair::filter::UavMultiplex *multiplex));
 #endif // UAVFACTORY
Index: trunk/lib/FlairMeta/src/UavStateMachine.cpp
===================================================================
--- trunk/lib/FlairMeta/src/UavStateMachine.cpp	(revision 121)
+++ trunk/lib/FlairMeta/src/UavStateMachine.cpp	(revision 122)
@@ -52,7 +52,7 @@
 using namespace flair::meta;
 
-UavStateMachine::UavStateMachine(Uav* inUav,TargetController *controller):
+UavStateMachine::UavStateMachine(TargetController *controller):
         Thread(getFrameworkManager(),"UavStateMachine",50),
-        uav(inUav),controller(controller),failSafeMode(true),flagConnectionLost(false),flagBatteryLow(false),flagCriticalSensorLost(false),flagZTrajectoryFinished(false),safeToFly(true){
+        uav(GetUav()),controller(controller),failSafeMode(true),flagConnectionLost(false),flagBatteryLow(false),flagCriticalSensorLost(false),flagZTrajectoryFinished(false),safeToFly(true){
     altitudeState=AltitudeState_t::Stopped;
     uav->UseDefaultPlot();
@@ -135,6 +135,4 @@
   return currentAngularSpeed;
 }
-
-const Uav *UavStateMachine::GetUav(void) const { return uav; }
 
 void UavStateMachine::AltitudeValues(float &altitude,
Index: trunk/lib/FlairMeta/src/UavStateMachine.h
===================================================================
--- trunk/lib/FlairMeta/src/UavStateMachine.h	(revision 121)
+++ trunk/lib/FlairMeta/src/UavStateMachine.h	(revision 122)
@@ -59,7 +59,8 @@
 *
 * \brief State machine for UAV
-*
-* thread synchronized with ahrs, unless a period is set with SetPeriodUS or
-*SetPeriodMS
+*  The Thread is created with 
+*  the FrameworkManager as parent. FrameworkManager must be created before.
+* The Thread is synchronized with Ahrs, unless a period is set with SetPeriodUS or
+* SetPeriodMS
 */
 
@@ -101,5 +102,5 @@
   };
 
-        UavStateMachine(meta::Uav* uav, sensor::TargetController* controller);
+        UavStateMachine(sensor::TargetController* controller);
         ~UavStateMachine();
 
@@ -107,6 +108,4 @@
 
   const core::Vector3D &GetCurrentAngularSpeed(void) const;
-
-  const meta::Uav *GetUav(void) const;
 
         void Land(void);
Index: trunk/lib/FlairMeta/src/XAir.cpp
===================================================================
--- trunk/lib/FlairMeta/src/XAir.cpp	(revision 121)
+++ trunk/lib/FlairMeta/src/XAir.cpp	(revision 122)
@@ -38,34 +38,22 @@
 namespace meta {
 
-XAir::XAir(FrameworkManager *parent, string uav_name,
+XAir::XAir(string name,
            filter::UavMultiplex *multiplex)
-    : Uav(parent, uav_name, multiplex) {
-  RTDM_I2cPort *i2cport = new RTDM_I2cPort(parent, "rtdm_i2c", "rti2c3");
-  RTDM_SerialPort *imu_port = new RTDM_SerialPort(parent, "imu_port", "rtser1");
+    : Uav(name, multiplex) {
+  RTDM_I2cPort *i2cport = new RTDM_I2cPort(getFrameworkManager(), "rtdm_i2c", "rti2c3");
+  RTDM_SerialPort *imu_port = new RTDM_SerialPort(getFrameworkManager(), "imu_port", "rtser1");
 
   if (multiplex == NULL)
-    SetMultiplex(new X4X8Multiplex(parent, "motors", X4X8Multiplex::X8));
+    SetMultiplex(new X4X8Multiplex(getFrameworkManager(), "motors", X4X8Multiplex::X8));
 
   SetBldc(new AfroBldc(GetUavMultiplex(), GetUavMultiplex()->GetLayout(),
                        "motors", GetUavMultiplex()->MotorsCount(), i2cport));
-  SetUsRangeFinder(new Srf08(parent, "SRF08", i2cport, 0x70, 60));
-  SetAhrs(new Gx3_25_ahrs(parent, "imu", imu_port,
+  SetUsRangeFinder(new Srf08(getFrameworkManager(), "SRF08", i2cport, 0x70, 60));
+  SetAhrs(new Gx3_25_ahrs(getFrameworkManager(), "imu", imu_port,
                           Gx3_25_imu::AccelerationAngularRateAndOrientationMatrix, 70));
-  Tab *bat_tab = new Tab(parent->GetTabWidget(), "battery");
+  Tab *bat_tab = new Tab(getFrameworkManager()->GetTabWidget(), "battery");
   SetBatteryMonitor(new BatteryMonitor(bat_tab->NewRow(), "battery"));
   GetBatteryMonitor()->SetBatteryValue(12);
-
-  /*
-          if(VRPNType==Auto || VRPNType==AutoSerialPort)
-          {
-              RTDM_SerialPort* vrpn_port=new
-     RTDM_SerialPort(parent,"vrpn_port","rtser3");
-
-              vrpnclient=new VrpnClient(parent,"vrpn",vrpn_port,10000,80);
-              uav_vrpn=new
-     MetaVrpnObject(vrpnclient,uav_name,VRPNSerialObjectId);
-          }
-  */
-  SetVerticalCamera(new Ps3Eye(parent, "camv", 0, 50));
+  SetVerticalCamera(new Ps3Eye(getFrameworkManager(), "camv", 0, 50));
 }
 
@@ -76,5 +64,4 @@
   ((Srf08 *)GetUsRangeFinder())->Start();
   ((Ps3Eye *)GetVerticalCamera())->Start();
-  Uav::StartSensors();
 }
 
Index: trunk/lib/FlairMeta/src/XAir.h
===================================================================
--- trunk/lib/FlairMeta/src/XAir.h	(revision 121)
+++ trunk/lib/FlairMeta/src/XAir.h	(revision 122)
@@ -24,8 +24,9 @@
 class XAir : public Uav {
 public:
-  XAir(core::FrameworkManager *parent, std::string uav_name,
+  XAir(std::string name,
        filter::UavMultiplex *multiplex = NULL);
   ~XAir();
   void StartSensors(void);
+	std::string GetDefaultVrpnAddress(void) const{return "192.168.147.197:3883";}
 
 private:
Index: trunk/lib/FlairSensorActuator/src/Camera.cpp
===================================================================
--- trunk/lib/FlairSensorActuator/src/Camera.cpp	(revision 121)
+++ trunk/lib/FlairSensorActuator/src/Camera.cpp	(revision 122)
@@ -24,5 +24,4 @@
 #include <DataPlot1D.h>
 #include <Picture.h>
-#include <Buffer.h>
 #include <highgui.h>
 #include <fstream>
@@ -39,5 +38,4 @@
     : IODevice(parent, name) {
   plot_tab = NULL;
-	jpgBuffer=NULL;
 	logFormat=LogFormat::NONE;
 
@@ -63,5 +61,4 @@
 
   output = NULL;
-	jpgBuffer=NULL;
 	logFormat=LogFormat::NONE;
 }
@@ -80,11 +77,9 @@
 			break;
 		case LogFormat::JPG:
-			if(jpgBuffer==NULL) {
-				jpgBuffer=new Buffer(this,"jpg_bufer");
-				AddDataToLog(jpgBuffer);
-			}else{
-				Warn("log format already defined\n");
-			}
+				Warn("logging cvimage to jpeg\n");
+				Warn("jpeg are not included in classical dbt file, as dbt does not handle variable length\n");
 			break;
+		default:
+			Warn("LogFormat unknown\n");
 	}
 }
@@ -119,8 +114,11 @@
 
 void Camera::ProcessUpdate(core::io_data* data) {
-	switch(logFormat) {
-		case LogFormat::JPG:
-				ajouter compression jpg
-			break;
+	if(getFrameworkManager()->IsLogging() && getFrameworkManager()->IsDeviceLogged(this)) {
+		switch(logFormat) {
+			case LogFormat::JPG:
+					IplImage *img=((cvimage*)data)->img;
+					//dspSaveToJpeg(img,"toto");
+				break;
+		}
 	}
 	IODevice::ProcessUpdate(data);
Index: trunk/lib/FlairSensorActuator/src/Camera.h
===================================================================
--- trunk/lib/FlairSensorActuator/src/Camera.h	(revision 121)
+++ trunk/lib/FlairSensorActuator/src/Camera.h	(revision 122)
@@ -25,7 +25,4 @@
 		class Picture;
 		class GridLayout;
-	}
-	namespace core {
-		class Buffer;
 	}
 }
@@ -163,5 +160,4 @@
   gui::GridLayout *setup_layout;
 	LogFormat logFormat;
-	core::Buffer *jpgBuffer;
 };
 } // end namespace sensor
Index: trunk/lib/FlairSensorActuator/src/VrpnClient.cpp
===================================================================
--- trunk/lib/FlairSensorActuator/src/VrpnClient.cpp	(revision 121)
+++ trunk/lib/FlairSensorActuator/src/VrpnClient.cpp	(revision 122)
@@ -26,17 +26,36 @@
 using namespace flair::gui;
 
+namespace {
+  flair::sensor::VrpnClient *singleton = NULL;
+}
+
+
 namespace flair {
 namespace sensor {
 
-VrpnClient::VrpnClient(const FrameworkManager *parent, string name,
+VrpnClient *GetVrpnClient(void) { return singleton; }
+	
+VrpnClient::VrpnClient(string name,
                        string address, uint16_t us_period, uint8_t priority)
-    : Thread(parent, name, priority) {
+    : Thread(getFrameworkManager(), name, priority) {
+	if (singleton != NULL) {
+    Err("VrpnClient must be instanced only one time\n");
+    return;
+  }
+
+  singleton = this;
   pimpl_ = new VrpnClient_impl(this, name, address, us_period);
 }
 
-VrpnClient::VrpnClient(const FrameworkManager *parent, string name,
+VrpnClient::VrpnClient(string name,
                        SerialPort *serialport, uint16_t us_period,
                        uint8_t priority)
-    : Thread(parent, name, priority) {
+    : Thread(getFrameworkManager(), name, priority) {
+	if (singleton != NULL) {
+    Err("VrpnClient must be instanced only one time\n");
+    return;
+  }
+
+  singleton = this;
   pimpl_ = new VrpnClient_impl(this, name, serialport, us_period);
 }
Index: trunk/lib/FlairSensorActuator/src/VrpnClient.h
===================================================================
--- trunk/lib/FlairSensorActuator/src/VrpnClient.h	(revision 121)
+++ trunk/lib/FlairSensorActuator/src/VrpnClient.h	(revision 122)
@@ -18,12 +18,11 @@
 
 namespace flair {
-namespace core {
-class FrameworkManager;
-class SerialPort;
-}
-namespace gui {
-class TabWidget;
-class Layout;
-}
+	namespace core {
+		class SerialPort;
+	}
+	namespace gui {
+		class TabWidget;
+		class Layout;
+	}
 }
 
@@ -35,5 +34,7 @@
 /*! \class VrpnClient
 *
-* \brief Class to connect to a Vrpn server
+* \brief Class to connect to a Vrpn server. The Thread is created with 
+*  the FrameworkManager as parent. FrameworkManager must be created before.
+* Only one instance of this class is allowed by program.
 */
 class VrpnClient : public core::Thread {
@@ -46,5 +47,4 @@
   * Construct a VrpnClient. Connection is done by IP.
   *
-  * \param parent parent
   * \param name name
   * \param address server address
@@ -52,5 +52,5 @@
   * \param priority priority of the Thread
   */
-  VrpnClient(const core::FrameworkManager *parent, std::string name,
+  VrpnClient(std::string name,
              std::string address, uint16_t us_period, uint8_t priority);
 
@@ -60,5 +60,4 @@
   * Construct a VrpnClient. Connection is done by XBee modem.
   *
-  * \param parent parent
   * \param name name
   * \param serialport SerialPort for XBee modem
@@ -66,5 +65,5 @@
   * \param priority priority of the Thread
   */
-  VrpnClient(const core::FrameworkManager *parent, std::string name,
+  VrpnClient(std::string name,
              core::SerialPort *serialport, uint16_t us_period,
              uint8_t priority);
@@ -108,4 +107,12 @@
   class VrpnClient_impl *pimpl_;
 };
+
+/*!
+* \brief get VrpnClient
+*
+* \return the VrpnClient
+*/
+VrpnClient *GetVrpnClient(void);
+
 } // end namespace sensor
 } // end namespace flair
Index: trunk/lib/FlairSensorActuator/src/VrpnObject.cpp
===================================================================
--- trunk/lib/FlairSensorActuator/src/VrpnObject.cpp	(revision 121)
+++ trunk/lib/FlairSensorActuator/src/VrpnObject.cpp	(revision 122)
@@ -30,16 +30,16 @@
 namespace sensor {
 
-VrpnObject::VrpnObject(const VrpnClient *parent, string name,
+VrpnObject::VrpnObject(string name,
                        const TabWidget *tab)
-    : IODevice(parent, name) {
-  pimpl_ = new VrpnObject_impl(this, parent, name, -1, tab);
+    : IODevice(GetVrpnClient(), name) {
+  pimpl_ = new VrpnObject_impl(this, name, -1, tab);
   AddDataToLog(pimpl_->output);
 }
 
-VrpnObject::VrpnObject(const VrpnClient *parent, string name, uint8_t id,
+VrpnObject::VrpnObject(string name, uint8_t id,
                        const TabWidget *tab)
-    : IODevice(parent, name) {
+    : IODevice(GetVrpnClient(), name) {
   Warn("Creation of object %s with id %i\n", name.c_str(), id);
-  pimpl_ = new VrpnObject_impl(this, parent, name, id, tab);
+  pimpl_ = new VrpnObject_impl(this, name, id, tab);
   AddDataToLog(pimpl_->output);
 }
Index: trunk/lib/FlairSensorActuator/src/VrpnObject.h
===================================================================
--- trunk/lib/FlairSensorActuator/src/VrpnObject.h	(revision 121)
+++ trunk/lib/FlairSensorActuator/src/VrpnObject.h	(revision 122)
@@ -19,15 +19,15 @@
 
 namespace flair {
-namespace core {
-class cvmatrix;
-class Vector3D;
-class Euler;
-class Quaternion;
-}
-namespace gui {
-class TabWidget;
-class Tab;
-class DataPlot1D;
-}
+	namespace core {
+		class cvmatrix;
+		class Vector3D;
+		class Euler;
+		class Quaternion;
+	}
+	namespace gui {
+		class TabWidget;
+		class Tab;
+		class DataPlot1D;
+	}
 }
 
@@ -41,5 +41,6 @@
 /*! \class VrpnObject
 *
-* \brief Class for VRPN object
+* \brief Class for VRPN object. The IODevice is created with 
+*  the VrpnClient as parent. VrpnClient must be created before.
 */
 class VrpnObject : public core::IODevice {
@@ -53,9 +54,8 @@
   * Construct a VrpnObject. Connection is done by IP.
   *
-  * \param parent parent
   * \param name VRPN object name, should be the same as defined in the server
   * \param tab Tab for the user interface
   */
-  VrpnObject(const VrpnClient *parent, std::string name,
+  VrpnObject(std::string name,
              const gui::TabWidget *tab);
 
@@ -65,10 +65,9 @@
   * Construct a VrpnObject. Connection is done by IP.
   *
-  * \param parent parent
   * \param name name
   * \param id VRPN object id, should be the same as defined in the server
   * \param tab Tab for the user interface
   */
-  VrpnObject(const VrpnClient *parent, std::string name, uint8_t id,
+  VrpnObject(std::string name, uint8_t id,
              const gui::TabWidget *tab);
 
Index: trunk/lib/FlairSensorActuator/src/VrpnObject_impl.cpp
===================================================================
--- trunk/lib/FlairSensorActuator/src/VrpnObject_impl.cpp	(revision 121)
+++ trunk/lib/FlairSensorActuator/src/VrpnObject_impl.cpp	(revision 122)
@@ -39,9 +39,13 @@
 using namespace flair::sensor;
 
-VrpnObject_impl::VrpnObject_impl(VrpnObject *self, const VrpnClient *parent,
+VrpnObject_impl::VrpnObject_impl(VrpnObject *self,
                                  string name, int id, const TabWidget *tab) {
-  this->parent = parent;
+  parent = GetVrpnClient();
   this->self = self;
 
+	if(parent==NULL) {
+		self->Err("VrpnClient must be instanced before creating VrpnObject\n");
+		return;
+	}
   if (id == -1 && parent->UseXbee()) {
     self->Err("erreur aucun identifiant specifie pour la connexion Xbee\n");
Index: trunk/lib/FlairSensorActuator/src/unexported/VrpnObject_impl.h
===================================================================
--- trunk/lib/FlairSensorActuator/src/unexported/VrpnObject_impl.h	(revision 121)
+++ trunk/lib/FlairSensorActuator/src/unexported/VrpnObject_impl.h	(revision 122)
@@ -26,18 +26,18 @@
 
 namespace flair {
-namespace core {
-class cvmatrix;
-class Vector3D;
-class Euler;
-}
-namespace gui {
-class TabWidget;
-class Tab;
-class DataPlot1D;
-}
-namespace sensor {
-class VrpnClient;
-class VrpnObject;
-}
+	namespace core {
+		class cvmatrix;
+		class Vector3D;
+		class Euler;
+	}
+	namespace gui {
+		class TabWidget;
+		class Tab;
+		class DataPlot1D;
+	}
+	namespace sensor {
+		class VrpnClient;
+		class VrpnObject;
+	}
 }
 
@@ -47,5 +47,5 @@
 public:
   VrpnObject_impl(flair::sensor::VrpnObject *self,
-                  const flair::sensor::VrpnClient *parent, std::string name,
+                  std::string name,
                   int id, const flair::gui::TabWidget *tab);
   ~VrpnObject_impl(void);
Index: trunk/lib/FlairVisionFilter/CMakeLists.txt
===================================================================
--- trunk/lib/FlairVisionFilter/CMakeLists.txt	(revision 122)
+++ trunk/lib/FlairVisionFilter/CMakeLists.txt	(revision 122)
@@ -0,0 +1,48 @@
+PROJECT(FlairVisionFilter)
+cmake_minimum_required(VERSION 2.8)
+include($ENV{FLAIR_ROOT}/flair-dev/cmake-modules/GlobalCmakeFlair.cmake)
+
+find_package(LibXml2 REQUIRED)
+
+execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
+                OUTPUT_VARIABLE GCC_VERSION)
+
+if (GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3)
+	if (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7)
+		ADD_DEFINITIONS("-std=c++11")
+	else()
+		ADD_DEFINITIONS("-std=c++0x")
+	endif()
+else()
+	message(STATUS "GCC version < 4.3, c+11 is not supported!")
+endif()
+
+INCLUDE_DIRECTORIES(
+	${LIBXML2_INCLUDE_DIR}
+	${CMAKE_CURRENT_SOURCE_DIR}/src
+	$ENV{FLAIR_ROOT}/flair-src/lib/FlairCore/src
+	${CMAKE_SYSROOT}/usr/include/opencv
+)
+
+FILE(GLOB SRC_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
+
+SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+
+ADD_LIBRARY(${PROJECT_NAME}
+	${SRC_SRC}
+)
+
+INSTALL(TARGETS ${PROJECT_NAME}
+	LIBRARY DESTINATION $ENV{FLAIR_ROOT}/flair-bin/lib/${ARCH_DIR}
+	ARCHIVE DESTINATION $ENV{FLAIR_ROOT}/flair-bin/lib/${ARCH_DIR}
+)
+
+FILE(GLOB HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h")
+INSTALL(FILES ${HEADER_FILES} DESTINATION $ENV{FLAIR_ROOT}/flair-dev/include/${PROJECT_NAME})
+
+add_custom_target(
+	compile_info
+	COMMAND $ENV{FLAIR_ROOT}/flair-dev/scripts/compile_info.sh ${CMAKE_C_COMPILER} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src/unexported/compile_info.h
+)
+
+add_dependencies(${PROJECT_NAME} compile_info)
Index: trunk/lib/FlairVisionFilter/src/CvtColor.cpp
===================================================================
--- trunk/lib/FlairVisionFilter/src/CvtColor.cpp	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/CvtColor.cpp	(revision 122)
@@ -0,0 +1,90 @@
+//  created:    2014/07/17
+//  filename:   CvtColor.cpp
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    Image color conversion
+//
+//
+/*********************************************************************/
+
+#include "CvtColor.h"
+#include <cvimage.h>
+#include <typeinfo>
+
+using std::string;
+using namespace flair::core;
+
+namespace flair { namespace filter {
+
+CvtColor::CvtColor(const core::IODevice* parent,std::string name,Conversion_t conversion) : IODevice(parent,name),output(0) {
+    this->conversion=conversion;
+
+    switch(conversion) {
+    case Conversion_t::GRAY:
+        try{
+            cvimage::Type const &imageType=dynamic_cast<cvimage::Type const &>(parent->GetOutputDataType());
+            output=new cvimage(this,imageType.GetWidth(),imageType.GetHeight(),cvimage::Type::Format::GRAY,"conversion",true,2);
+
+        } catch(std::bad_cast& bc) {
+            Err("io type mismatch\n");
+        }
+        break;
+    default:
+        Err("conversion not supported\n");
+    }
+}
+
+CvtColor::~CvtColor(void) {}
+
+cvimage* CvtColor::Output(void) {
+    return output;
+
+}
+
+DataType const &CvtColor::GetOutputDataType() const {
+    if(output!=NULL) {
+        return output->GetDataType();
+    } else {
+        return dummyType;
+    }
+}
+
+void CvtColor::UpdateFrom(const io_data *data) {
+    IplImage *img=((cvimage*)data)->img;
+
+    data->GetMutex();
+    output->GetMutex();
+
+    switch(conversion) {
+    case Conversion_t::GRAY:
+        switch(((cvimage*)data)->GetDataType().GetFormat()) {
+        case cvimage::Type::Format::YUYV:
+            //dspCvtColor(img,output->img,DSP_YUYV2GRAY);
+            break;
+        case cvimage::Type::Format::UYVY:
+            //dspCvtColor(img,output->img,DSP_UYVY2GRAY);
+            break;
+        case cvimage::Type::Format::BGR:
+            //dspCvtColor(img,output->img,DSP_BGR2GRAY);
+            break;
+        default:
+            Err("input format not supported\n");
+        }
+        break;
+    default:
+        Err("conversion not supported\n");
+    }
+
+    output->ReleaseMutex();
+    data->ReleaseMutex();
+
+    output->SetDataTime(data->DataTime());
+    ProcessUpdate(output);
+}
+
+} // end namespace filter
+} // end namespace flair
Index: trunk/lib/FlairVisionFilter/src/CvtColor.h
===================================================================
--- trunk/lib/FlairVisionFilter/src/CvtColor.h	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/CvtColor.h	(revision 122)
@@ -0,0 +1,89 @@
+/*!
+ * \file CvtColor.h
+ * \brief Image color conversion
+ * \author Guillaume Sanahuja, Copyright Heudiasyc UMR UTC/CNRS 7253
+ * \date 2014/07/17
+ * \version 4.0
+ */
+
+
+#ifndef CVTCOLOR_H
+#define CVTCOLOR_H
+
+#include <IODevice.h>
+
+namespace flair
+{
+    namespace core
+    {
+        class cvimage;
+    }
+}
+
+namespace flair
+{
+namespace filter
+{
+    /*! \class CvtColor
+    *
+    * \brief Image color conversion
+    *
+    * The conversion is done using the DSP of the DM3730.
+    */
+    class CvtColor : public core::IODevice
+    {
+        public:
+            /*!
+            \enum Conversion_t
+            \brief Conversion formats
+            */
+            enum class Conversion_t {
+                BGR,/*!< BGR 24 bits */
+                GRAY,/*!< gray 8 bits */
+                } ;
+
+            /*!
+            * \brief Constructor
+            *
+            * Construct an Ahrs.
+            *
+            * \param parent parent
+            * \param name name
+            * \param conversion conversion format
+            */
+            CvtColor(const core::IODevice* parent,std::string name,Conversion_t conversion);
+
+            /*!
+            * \brief Destructor
+            *
+            */
+            ~CvtColor();
+
+            /*!
+            * \brief Output image
+            *
+            * Output matrix is of the same size as declared in constructor. \n
+            * Its type depends of the conversion type.
+            *
+            * \return the output image
+            */
+            core::cvimage* Output(void);
+
+            core::DataType const &GetOutputDataType() const;
+
+        private:
+            /*!
+            * \brief Update using provided datas
+            *
+            * Reimplemented from IODevice.
+            *
+            * \param data data from the parent to process
+            */
+            void UpdateFrom(const core::io_data *data);
+
+            core::cvimage *output;
+            Conversion_t conversion;
+    };
+} // end namespace filter
+} // end namespace flair
+#endif // CVTCOLOR_H
Index: trunk/lib/FlairVisionFilter/src/HoughLines.cpp
===================================================================
--- trunk/lib/FlairVisionFilter/src/HoughLines.cpp	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/HoughLines.cpp	(revision 122)
@@ -0,0 +1,92 @@
+//  created:    2015/10/07
+//  filename:   HoughLines.cpp
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    HoughLines
+//
+//
+/*********************************************************************/
+
+#include "HoughLines.h"
+#include <cvimage.h>
+#include <cvmatrix.h>
+#include <Layout.h>
+#include <GroupBox.h>
+#include <SpinBox.h>
+#include <DoubleSpinBox.h>
+#include <typeinfo>
+
+#define MAX_LINES 100
+
+using std::string;
+using namespace flair::core;
+using namespace flair::gui;
+
+namespace flair { namespace filter {
+
+HoughLines::HoughLines(const IODevice* parent,const LayoutPosition* position,string name) : IODevice(parent,name) {
+    GroupBox* reglages_groupbox=new GroupBox(position,name);
+    fullRhoStep=new SpinBox(reglages_groupbox->NewRow(),"full rho step:","pixels",0,255,1,1);
+    fullThetaStep=new DoubleSpinBox(reglages_groupbox->LastRowLastCol(),"full theta step:","degrees",0,90,1,1);
+    trackingRhoStep=new SpinBox(reglages_groupbox->NewRow(),"tracking rho step:","pixels",0,255,1,1);
+    trackingThetaStep=new DoubleSpinBox(reglages_groupbox->LastRowLastCol(),"tracking theta step:","degrees",0,90,1,1);
+    trackingDeltaTheta=new DoubleSpinBox(reglages_groupbox->LastRowLastCol(),"tracking delta theta:","degrees",0,90,1,1);
+    nbPoints=new SpinBox(reglages_groupbox->NewRow(),"nb points:",0,10000,10,100);
+
+    isTracking=false;
+    lostLine=false;
+    initLine=false;
+    linesStorage = cvCreateMat(MAX_LINES, 1, CV_32FC2);
+
+    //init output matrix of same size as init
+    cvmatrix_descriptor* desc=new cvmatrix_descriptor(4,1);
+    desc->SetElementName(0,0,"distance");
+    desc->SetElementName(1,0,"orientation rad");
+    desc->SetElementName(2,0,"orientation deg");
+    desc->SetElementName(3,0,"line_detected");
+    output=new cvmatrix(this,desc,floatType,name);
+
+    try{
+        cvimage::Type const &imageType=dynamic_cast<cvimage::Type const &>(parent->GetOutputDataType());
+        if(imageType.GetFormat()!=cvimage::Type::Format::GRAY) {
+            Err("input image is not grey\n");
+        }
+    } catch(std::bad_cast& bc) {
+        Err("io type mismatch\n");
+    }
+}
+
+HoughLines::~HoughLines(void) {
+    cvReleaseMat(&linesStorage);
+}
+
+void HoughLines::UpdateFrom(const io_data *data) {
+ 
+}
+
+bool HoughLines::isLineDetected() const {
+    if(output->Value(3,0)==1) {
+        return true;
+    } else {
+        return false;
+    }
+}
+
+float HoughLines::GetOrientation(void) const {
+    return output->Value(1,0);
+}
+
+float HoughLines::GetDistance(void) const {
+    return output->Value(0,0);
+}
+
+cvmatrix *HoughLines::Output(void) const {
+    return output;
+}
+
+} // end namespace filter
+} // end namespace flair
Index: trunk/lib/FlairVisionFilter/src/HoughLines.h
===================================================================
--- trunk/lib/FlairVisionFilter/src/HoughLines.h	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/HoughLines.h	(revision 122)
@@ -0,0 +1,75 @@
+/*!
+ * \file HoughLines.h
+ * \brief HoughLines algorithm
+ * \author Guillaume Sanahuja, Copyright Heudiasyc UMR UTC/CNRS 7253
+ * \date 2015/10/07
+ * \version 4.0
+ */
+
+
+#ifndef HOUGHLINES_H
+#define HOUGHLINES_H
+
+#include <IODevice.h>
+#include <cv.h>
+
+namespace flair {
+    namespace core {
+        class cvimage;
+        class cvmatrix;
+    }
+    namespace gui {
+        class LayoutPosition;
+        class SpinBox;
+        class DoubleSpinBox;
+    }
+}
+
+namespace flair { namespace filter {
+    /*! \class HoughLines
+    *
+    * \brief HoughLines algorithm
+    *
+    * HoughLines is done using the DSP of the DM3730.
+    */
+    class HoughLines : public core::IODevice {
+        public:
+            /*!
+            * \brief Constructor
+            *
+            * Construct an OpticalFlow filter at given position. \n
+            * After calling this function, position will be deleted as it is no longer usefull. \n
+            *
+            * \param parent parent
+            * \param position position
+            * \param name name
+            */
+            HoughLines(const core::IODevice* parent,const gui::LayoutPosition* position,std::string name);
+
+            /*!
+            * \brief Destructor
+            *
+            */
+            ~HoughLines();
+
+            bool isLineDetected(void) const;
+            float GetOrientation(void) const;
+            float GetDistance(void) const;
+            core::cvmatrix *Output(void) const;
+
+        private:
+            void UpdateFrom(const core::io_data *data);
+            gui::SpinBox *fullRhoStep,*trackingRhoStep,*nbPoints;
+            gui::DoubleSpinBox *fullThetaStep,*trackingThetaStep,*trackingDeltaTheta;
+            bool isTracking,lostLine,initLine,noLine;
+            int nbLines;
+            float yawMean,prevYawMean;
+            float prevRhoMean,rhoMean;
+            float prevThetaMean,thetaMean;
+            float distance,orientation;
+            CvMat* linesStorage;
+            core::cvmatrix *output;
+    };
+} // end namespace filter
+} // end namespace flair
+#endif // HOUGHLINES_H
Index: trunk/lib/FlairVisionFilter/src/ImgThreshold.cpp
===================================================================
--- trunk/lib/FlairVisionFilter/src/ImgThreshold.cpp	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/ImgThreshold.cpp	(revision 122)
@@ -0,0 +1,74 @@
+//  created:    2015/10/07
+//  filename:   ImgThreshold.cpp
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    ImgThreshold
+//
+//
+/*********************************************************************/
+
+#include "ImgThreshold.h"
+#include <cvimage.h>
+#include <Layout.h>
+#include <GroupBox.h>
+#include <SpinBox.h>
+#include <typeinfo>
+
+using std::string;
+using namespace flair::core;
+using namespace flair::gui;
+
+namespace flair { namespace filter {
+
+ImgThreshold::ImgThreshold(const IODevice* parent,const LayoutPosition* position,string name) : IODevice(parent,name),output(0) {
+    GroupBox* reglages_groupbox=new GroupBox(position,name);
+    threshold=new SpinBox(reglages_groupbox->NewRow(),"threshold:",0,255,1,127);
+
+    Printf("todo: pouvoir reutiliser la meme image en sortie\n");
+    try{
+        cvimage::Type const &imageType=dynamic_cast<cvimage::Type const &>(parent->GetOutputDataType());
+        if(imageType.GetFormat()==cvimage::Type::Format::GRAY) {
+            output=new cvimage(this,imageType.GetWidth(),imageType.GetHeight(),imageType.GetFormat(),"threshold");
+        } else {
+            Err("input image is not grey\n");
+        }
+    } catch(std::bad_cast& bc) {
+        Err("io type mismatch\n");
+    }
+}
+
+ImgThreshold::~ImgThreshold(void) {
+}
+
+cvimage* ImgThreshold::Output(void) {
+    return output;
+}
+
+void ImgThreshold::UpdateFrom(const io_data *data) {
+    cvimage *cvImage=(cvimage*)data;
+    IplImage *gimg=cvImage->img;
+/*
+    data->GetMutex();
+    output->GetMutex();
+    dspThreshold(gimg, output->img, threshold->Value(), 255, CV_THRESH_BINARY);
+    output->ReleaseMutex();
+    data->ReleaseMutex();
+*/
+    output->SetDataTime(data->DataTime());
+    ProcessUpdate(output);
+}
+
+DataType const &ImgThreshold::GetOutputDataType() const {
+    if(output!=NULL) {
+        return output->GetDataType();
+    } else {
+        return dummyType;
+    }
+}
+
+} // end namespace filter
+} // end namespace flair
Index: trunk/lib/FlairVisionFilter/src/ImgThreshold.h
===================================================================
--- trunk/lib/FlairVisionFilter/src/ImgThreshold.h	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/ImgThreshold.h	(revision 122)
@@ -0,0 +1,71 @@
+/*!
+ * \file ImgThreshold.h
+ * \brief ImgThreshold algorithm
+ * \author Guillaume Sanahuja, Copyright Heudiasyc UMR UTC/CNRS 7253
+ * \date 2015/10/07
+ * \version 4.0
+ */
+
+
+#ifndef IMGTHRESHOLD_H
+#define IMGTHRESHOLD_H
+
+#include <IODevice.h>
+#include <cv.h>
+
+namespace flair {
+    namespace core {
+        class cvimage;
+    }
+    namespace gui {
+        class LayoutPosition;
+        class SpinBox;
+    }
+}
+
+namespace flair { namespace filter {
+    /*! \class ImgThreshold
+    *
+    * \brief ImgThreshold algorithm
+    *
+    * ImgThreshold is done using the DSP of the DM3730.
+    */
+    class ImgThreshold : public core::IODevice {
+        public:
+            /*!
+            * \brief Constructor
+            *
+            * Construct an OpticalFlow filter at given position. \n
+            * After calling this function, position will be deleted as it is no longer usefull. \n
+            *
+            * \param parent parent
+            * \param position position
+            * \param name name
+            */
+            ImgThreshold(const core::IODevice* parent,const gui::LayoutPosition* position,std::string name);
+
+            /*!
+            * \brief Destructor
+            *
+            */
+            ~ImgThreshold();
+
+            /*!
+            * \brief Output image
+            *
+            * Output matrix is of the same size as the input image. \n
+            *
+            * \return the output image
+            */
+            core::cvimage* Output(void);
+
+            core::DataType const &GetOutputDataType() const;
+
+        private:
+            void UpdateFrom(const core::io_data *data);
+            core::cvimage *output;
+            gui::SpinBox *threshold;
+    };
+} // end namespace filter
+} // end namespace flair
+#endif // IMGTHRESHOLD_H
Index: trunk/lib/FlairVisionFilter/src/OpticalFlow.cpp
===================================================================
--- trunk/lib/FlairVisionFilter/src/OpticalFlow.cpp	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/OpticalFlow.cpp	(revision 122)
@@ -0,0 +1,167 @@
+//  created:    2012/04/12
+//  filename:   OpticalFlow.cpp
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    calcul flux optique lk
+//
+//
+/*********************************************************************/
+
+#include "OpticalFlow.h"
+#include "OpticalFlowData.h"
+#include <cvimage.h>
+#include <Layout.h>
+#include <GroupBox.h>
+#include <SpinBox.h>
+//#include <algorithm>
+#include <OneAxisRotation.h>
+#include <Vector3D.h>
+#include <typeinfo>
+
+#define LEVEL_PYR 2
+
+using std::string;
+using std::swap;
+using namespace flair::core;
+using namespace flair::gui;
+
+namespace flair
+{
+namespace filter
+{
+
+OpticalFlow::OpticalFlow(const IODevice* parent,const LayoutPosition* position,string name) : IODevice(parent,name)
+{
+    Printf("optical flow: voir pour faire du multiple output\n");//pour pts A et B, found et error
+
+    try{
+        cvimage::Type const &imageType=dynamic_cast<cvimage::Type const &>(parent->GetOutputDataType());
+        pyr=cvCreateImage(cvSize(imageType.GetWidth(),imageType.GetHeight()),IPL_DEPTH_8U,1);
+        pyr_old=cvCreateImage(cvSize(imageType.GetWidth(),imageType.GetHeight()),IPL_DEPTH_8U,1);
+
+    } catch(std::bad_cast& bc) {
+        Err("io type mismatch\n");
+        pyr=NULL;
+        pyr_old=NULL;
+    }
+
+    is_init=false;
+
+    GroupBox* reglages_groupbox=new GroupBox(position,name);
+        rotation=new OneAxisRotation(reglages_groupbox->NewRow(),"post rotation");
+        max_features=new SpinBox(reglages_groupbox->NewRow(),"max features:",1,65535,1,1);
+
+    output=new OpticalFlowData(parent,max_features->Value());
+
+    pointsA=(CvPoint *)cvAlloc(max_features->Value()*sizeof(CvPoint));
+    pointsB=(CvPoint *)cvAlloc(max_features->Value()*sizeof(CvPoint));
+
+    found_feature=(char *)cvAlloc(max_features->Value()*sizeof(char));
+    feature_error=(unsigned int *)cvAlloc(max_features->Value()*sizeof(unsigned int));
+}
+
+OpticalFlow::~OpticalFlow(void)
+{
+    cvReleaseImage(&pyr);
+    cvReleaseImage(&pyr_old);
+    cvFree(&pointsA);
+    cvFree(&pointsB);
+    cvFree(&found_feature);
+    cvFree(&feature_error);
+}
+
+void OpticalFlow::UpdateFrom(const io_data *data)
+{
+    IplImage *gimg=((cvimage*)data)->img;
+    IplImage *gimg_old=((cvimage*)data->Prev(1))->img;
+
+    unsigned int count;
+    CvSize window = cvSize(3,3);
+    CvTermCriteria termination_criteria = cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3 );
+    unsigned int i;
+
+    if(max_features->ValueChanged()==true)
+    {
+        cvFree(&pointsA);
+        cvFree(&pointsB);
+        cvFree(&found_feature);
+        cvFree(&feature_error);
+        pointsA=(CvPoint *)cvAlloc(max_features->Value()*sizeof(CvPoint));
+        pointsB=(CvPoint *)cvAlloc(max_features->Value()*sizeof(CvPoint));
+        found_feature=(char *)cvAlloc(max_features->Value()*sizeof(char));
+        feature_error=(unsigned int *)cvAlloc(max_features->Value()*sizeof(unsigned int));
+
+        output->Resize(max_features->Value());
+    }
+/*
+    if(is_init==false)
+    {
+        data->GetMutex();
+        //init image old
+        dspPyrDown(gimg,pyr_old,LEVEL_PYR);
+        data->ReleaseMutex();
+        is_init=true;
+        printf("ajouter mise a 0 des points\n");
+        return;
+    }
+
+    data->GetMutex();
+    data->Prev(1)->GetMutex();
+
+    //select good features
+    count=max_features->Value();
+    dspGoodFeaturesToTrack(gimg_old,pointsA,&count,0.08,5);
+    //pyramide
+    dspPyrDown(gimg,pyr,LEVEL_PYR);
+    //lk
+    dspCalcOpticalFlowPyrLK(gimg_old,gimg,pyr_old,pyr,pointsA,pointsB,count,window,LEVEL_PYR,found_feature,feature_error,termination_criteria,0) ;
+
+    data->Prev(1)->ReleaseMutex();
+    data->ReleaseMutex();
+*/
+    //apply rotation
+    for(i=0;i<count;i++)
+    {
+        Vector3D tmp;
+        tmp.x=pointsA[i].x;
+        tmp.y=pointsA[i].y;
+        tmp.z=0;
+        rotation->ComputeRotation(tmp);
+        pointsA[i].x=tmp.x;
+        pointsA[i].y=tmp.y;
+
+        tmp.x=pointsB[i].x;
+        tmp.y=pointsB[i].y;
+        tmp.z=0;
+        rotation->ComputeRotation(tmp);
+        pointsB[i].x=tmp.x;
+        pointsB[i].y=tmp.y;
+    }
+
+    output->GetMutex();
+    CvPoint2D32f* pointsBf= output->PointsB();
+    for(i=0;i<count;i++)
+    {
+        pointsBf[i].x=pointsA[i].x+((float)pointsB[i].x)/256;
+        pointsBf[i].y=pointsA[i].y+((float)pointsB[i].y)/256;
+    }
+    output->ReleaseMutex();
+
+    output->SetPointsA(pointsA);
+    output->SetFoundFeature(found_feature);
+    output->SetFeatureError(feature_error);
+    output->SetNbFeatures(count);
+
+    //rotation
+    swap(pyr,pyr_old);
+
+    output->SetDataTime(data->DataTime());
+    ProcessUpdate(output);
+}
+
+} // end namespace filter
+} // end namespace flair
Index: trunk/lib/FlairVisionFilter/src/OpticalFlow.h
===================================================================
--- trunk/lib/FlairVisionFilter/src/OpticalFlow.h	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/OpticalFlow.h	(revision 122)
@@ -0,0 +1,82 @@
+/*!
+ * \file OpticalFlow.h
+ * \brief Lucas and Kanade optical flow algorithm
+ * \author Guillaume Sanahuja, Copyright Heudiasyc UMR UTC/CNRS 7253
+ * \date 2012/04/12
+ * \version 4.0
+ */
+
+
+#ifndef OPTICALFLOW_H
+#define OPTICALFLOW_H
+
+#include <IODevice.h>
+#include <cv.h>
+
+namespace flair
+{
+    namespace core
+    {
+        class cvimage;
+        class OneAxisRotation;
+    }
+    namespace gui
+    {
+        class LayoutPosition;
+        class SpinBox;
+    }
+    namespace filter
+    {
+        class OpticalFlowData;
+    }
+}
+
+namespace flair
+{
+namespace filter
+{
+    /*! \class OpticalFlow
+    *
+    * \brief Lucas and Kanade optical flow algorithm
+    *
+    * Optical flow is done using the DSP of the DM3730.
+    */
+    class OpticalFlow : public core::IODevice
+    {
+
+        public:
+            /*!
+            * \brief Constructor
+            *
+            * Construct an OpticalFlow filter at given position. \n
+            * After calling this function, position will be deleted as it is no longer usefull. \n
+            *
+            * \param parent parent
+            * \param position position
+            * \param name name
+            */
+            OpticalFlow(const core::IODevice* parent,const gui::LayoutPosition* position,std::string name);
+
+            /*!
+            * \brief Destructor
+            *
+            */
+            ~OpticalFlow();
+
+        private:
+            void UpdateFrom(const core::io_data *data);
+            OpticalFlowData *output;
+            gui::SpinBox *max_features;
+            core::OneAxisRotation* rotation;
+
+            CvPoint* pointsA;
+            CvPoint* pointsB;
+            char *found_feature;
+            unsigned int *feature_error;
+            IplImage *pyr,*pyr_old;
+
+            bool is_init;
+    };
+} // end namespace filter
+} // end namespace flair
+#endif // OPTICALFLOW_H
Index: trunk/lib/FlairVisionFilter/src/OpticalFlowData.cpp
===================================================================
--- trunk/lib/FlairVisionFilter/src/OpticalFlowData.cpp	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/OpticalFlowData.cpp	(revision 122)
@@ -0,0 +1,156 @@
+//  created:    2012/04/12
+//  filename:   OpticalFlowData.cpp
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    classe pour les données du flux optique
+//
+/*********************************************************************/
+
+#include "OpticalFlowData.h"
+
+using std::string;
+
+namespace flair
+{
+namespace filter
+{
+
+OpticalFlowData::OpticalFlowData(const Object* parent,uint32_t max_features,string name,uint32_t n): io_data(parent,name,n)
+{
+    this->max_features=max_features;
+    nb_features=0;
+
+    pointsA=(CvPoint *)cvAlloc(max_features*sizeof(CvPoint));
+    pointsB=(CvPoint2D32f *)cvAlloc(max_features*sizeof(CvPoint2D32f));
+
+    found_features=(char *)cvAlloc(max_features*sizeof(char));
+    features_error=(uint32_t*)cvAlloc(max_features*sizeof(uint32_t));
+}
+
+OpticalFlowData::~OpticalFlowData()
+{
+    cvFree(&pointsA);
+    cvFree(&pointsB);
+
+    cvFree(&found_features);
+    cvFree(&features_error);
+}
+
+CvPoint* OpticalFlowData::PointsA(void) const
+{
+    return pointsA;
+}
+
+CvPoint2D32f* OpticalFlowData::PointsB(void) const
+{
+    return pointsB;
+}
+
+char *OpticalFlowData::FoundFeature(void) const
+{
+    return found_features;
+}
+
+uint32_t *OpticalFlowData::FeatureError(void) const
+{
+    return features_error;
+}
+
+// value is new max_features value
+void OpticalFlowData::Resize(uint32_t value) {
+    CvPoint *new_pointsA;
+    CvPoint2D32f *new_pointsB;
+    char *new_found_features;
+    uint32_t *new_features_error;
+
+    new_pointsA=(CvPoint *)cvAlloc(value*sizeof(CvPoint));
+    new_pointsB=(CvPoint2D32f *)cvAlloc(value*sizeof(CvPoint2D32f));
+    new_found_features=(char *)cvAlloc(value*sizeof(char));
+    new_features_error=(uint32_t *)cvAlloc(value*sizeof(uint32_t));
+
+    GetMutex();
+    if(value>max_features)
+    {
+        memcpy(new_pointsA,pointsA,max_features*sizeof(CvPoint));
+        memcpy(new_pointsB,pointsB,max_features*sizeof(CvPoint2D32f));
+        memcpy(new_found_features,found_features,max_features*sizeof(char));
+        memcpy(new_features_error,features_error,max_features*sizeof(uint32_t));
+    }
+    else
+    {
+        memcpy(new_pointsA,pointsA,value*sizeof(CvPoint));
+        memcpy(new_pointsB,pointsB,value*sizeof(CvPoint2D32f));
+        memcpy(new_found_features,found_features,value*sizeof(char));
+        memcpy(new_features_error,features_error,value*sizeof(uint32_t));
+        if(nb_features>value) nb_features=value; //si nb_features est le nombre de point qui ont effectivement une correspondande, ça me parait louche. Sauf si les points sont classés et que ceux qui ont une correpondance sont toujours au début
+    }
+    max_features=value;
+    ReleaseMutex();
+
+    cvFree(&pointsA);
+    cvFree(&pointsB);
+    cvFree(&found_features);
+    cvFree(&features_error);
+
+    pointsA=new_pointsA;
+    pointsB=new_pointsB;
+    found_features=new_found_features;
+    features_error=new_features_error;
+}
+
+void OpticalFlowData::CopyDatas(char* dst) const
+{
+    Warn("non implementé\n");
+}
+
+void OpticalFlowData::SetPointsA(const CvPoint* points)
+{
+    GetMutex();
+    memcpy(pointsA,points,max_features*sizeof(CvPoint));
+    ReleaseMutex();
+}
+
+void OpticalFlowData::SetPointsB(const CvPoint2D32f* points)
+{
+    GetMutex();
+    memcpy(pointsB,points,max_features*sizeof(CvPoint2D32f));
+    ReleaseMutex();
+}
+
+void OpticalFlowData::SetFoundFeature(const char *found_features)
+{
+    GetMutex();
+    memcpy(this->found_features,found_features,max_features*sizeof(char));
+    ReleaseMutex();
+}
+
+void OpticalFlowData::SetFeatureError(const uint32_t *features_error)
+{
+    GetMutex();
+    memcpy(this->features_error,features_error,max_features*sizeof(uint32_t));
+    ReleaseMutex();
+}
+
+uint32_t OpticalFlowData::MaxFeatures(void) const
+{
+    return max_features;
+}
+
+uint32_t OpticalFlowData::NbFeatures(void) const
+{
+    return nb_features;
+}
+
+void OpticalFlowData::SetNbFeatures(uint32_t value)
+{
+    GetMutex();
+    nb_features=value;
+    ReleaseMutex();
+}
+
+} // end namespace filter
+} // end namespace flair
Index: trunk/lib/FlairVisionFilter/src/OpticalFlowData.h
===================================================================
--- trunk/lib/FlairVisionFilter/src/OpticalFlowData.h	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/OpticalFlowData.h	(revision 122)
@@ -0,0 +1,144 @@
+/*!
+ * \file OpticalFlowData.h
+ * \brief Class defining pptical flow datas
+ * \author Guillaume Sanahuja, Copyright Heudiasyc UMR UTC/CNRS 7253
+ * \date 2012/04/12
+ * \version 4.0
+ */
+
+#ifndef OPTICALFLOWDATA_H
+#define OPTICALFLOWDATA_H
+
+#include <cxcore.h>
+#include <io_data.h>
+
+namespace flair { namespace filter {
+    /*! \class OpticalFlowData
+    *
+    * \brief Class defining optical flow datas
+    *
+    * Optical flow datas are composed of the following: \n
+    * PointsA: tracked points on first image
+    * PointsB: tracked points on second image
+    * FoundFeature: array representing if a point on first image is found on second image
+    * FeatureError: array representing correlation error for each point (confidence)
+    */
+    class OpticalFlowData: public core::io_data {
+    public:
+        class Type: public core::DataType {
+            size_t GetSize() const {return 0;} //TODO
+            std::string GetDescription() const {return "optical flow";}
+        };
+
+        /*!
+        * \brief Constructor
+        *
+        * Construct OpticalFlowData.
+        *
+        * \param parent parent
+        * \param max_features maximum number of features to track
+        * \param name name
+        * \param n number of samples for the io_data
+        */
+        OpticalFlowData(const core::Object* parent,uint32_t max_features,std::string name="",uint32_t n=1);
+
+        /*!
+        * \brief Destructor
+        *
+        */
+        ~OpticalFlowData();
+
+        /*!
+        * \brief Points on first image
+        *
+    */
+        CvPoint* PointsA(void) const;
+
+        /*!
+        * \brief Points on second image
+        *
+        */
+        CvPoint2D32f* PointsB(void) const;
+
+        /*!
+        * \brief Features found
+        *
+        * value of the array is one if feature is found
+        */
+        char *FoundFeature(void) const;
+
+        /*!
+        * \brief Correlation error
+        *
+        */
+        uint32_t *FeatureError(void) const;
+
+        /*!
+        * \brief Set points of interest of frst image
+        *
+        * \param points points
+        */
+        void SetPointsA(const CvPoint *points);
+
+        /*!
+        * \brief Set points of interest of second image
+        *
+        * \param points points
+        */
+        void SetPointsB(const CvPoint2D32f *points);
+
+        /*!
+        * \brief Set found features
+        *
+        * \param found_features found features
+        */
+        void SetFoundFeature(const char *found_features);
+
+        /*!
+        * \brief Set features error
+        *
+        * \param features_error features error
+        */
+        void SetFeatureError(const unsigned int *features_error);
+
+        /*!
+        * \brief Number of maximum features
+        *
+        */
+        uint32_t MaxFeatures(void) const;
+
+        /*!
+        * \brief Number of tracked features
+        *
+        */
+        uint32_t NbFeatures(void) const;
+
+        /*!
+        * \brief Set number of tracked features
+        *
+        * \param value number of tracked features
+        */
+        void SetNbFeatures(uint32_t value);
+
+        /*!
+        * \brief Change number of maximum features
+        *
+        * \param value new number of maximum tracked features
+        */
+        void Resize(uint32_t value);
+
+        OpticalFlowData::Type const &GetDataType() const {return dataType;}
+
+    private:
+        uint32_t max_features;
+        uint32_t nb_features;
+        CvPoint* pointsA;
+        CvPoint2D32f* pointsB;
+        char *found_features;
+        uint32_t *features_error;
+        void CopyDatas(char* dst) const;
+        Type dataType;
+    };
+} // end namespace filter
+} // end namespace flair
+#endif // OPTICALFLOWDATA_H
Index: trunk/lib/FlairVisionFilter/src/OpticalFlowSpeed.cpp
===================================================================
--- trunk/lib/FlairVisionFilter/src/OpticalFlowSpeed.cpp	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/OpticalFlowSpeed.cpp	(revision 122)
@@ -0,0 +1,87 @@
+//  created:    2012/04/12
+//  filename:   OpticalFlowSpeed.cpp
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    calcul de la vitesse à partir du flux optique
+//
+//
+/*********************************************************************/
+
+#include "OpticalFlowSpeed.h"
+#include "OpticalFlowData.h"
+#include <cvmatrix.h>
+#include <Object.h>
+
+using std::string;
+using namespace flair::core;
+
+namespace flair
+{
+namespace filter
+{
+
+OpticalFlowSpeed::OpticalFlowSpeed(const IODevice* parent,string name) : IODevice(parent,name)
+{
+    cvmatrix_descriptor* desc=new cvmatrix_descriptor(2,1);
+    desc->SetElementName(0,0,"vx");
+	desc->SetElementName(1,0,"vy");
+    output=new cvmatrix(this,desc,floatType,name);
+
+	AddDataToLog(output);
+}
+
+OpticalFlowSpeed::~OpticalFlowSpeed(void)
+{
+}
+
+void OpticalFlowSpeed::UpdateFrom(const io_data *data)
+{
+    OpticalFlowData *input=(OpticalFlowData*)data;
+    float deplx,deply;
+    int nb_depl=0;
+
+    deplx=0;
+    deply=0;
+
+    input->GetMutex();
+    for(int i=0;i<input->NbFeatures();i++)
+    {
+        if(input->FoundFeature()[i]!=0)
+        {
+            deplx+=input->PointsB()[i].x-input->PointsA()[i].x;
+            deply+=input->PointsB()[i].y-input->PointsA()[i].y;
+            nb_depl++;
+        }
+    }
+    input->ReleaseMutex();
+
+    if(nb_depl!=0)
+    {
+        output->SetValue(0,0,deplx/nb_depl);
+        output->SetValue(1,0,deply/nb_depl);
+    }
+
+    output->SetDataTime(data->DataTime());
+    ProcessUpdate(output);
+}
+
+float OpticalFlowSpeed::Vx(void) const
+{
+    return output->Value(0,0);
+}
+
+float OpticalFlowSpeed::Vy(void) const
+{
+    return output->Value(1,0);
+}
+
+core::cvmatrix *OpticalFlowSpeed::Output() const
+{
+    return output;
+}
+} // end namespace filter
+} // end namespace flair
Index: trunk/lib/FlairVisionFilter/src/OpticalFlowSpeed.h
===================================================================
--- trunk/lib/FlairVisionFilter/src/OpticalFlowSpeed.h	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/OpticalFlowSpeed.h	(revision 122)
@@ -0,0 +1,89 @@
+/*!
+ * \file OpticalFlowSpeed.h
+ * \brief Optical flow speed calculation
+ * \author Guillaume Sanahuja, Copyright Heudiasyc UMR UTC/CNRS 7253
+ * \date 2012/04/12
+ * \version 4.0
+ */
+
+
+#ifndef OPTICALFLOWSPEED_H
+#define OPTICALFLOWSPEED_H
+
+#include <IODevice.h>
+
+namespace flair
+{
+    namespace core
+    {
+        class cvmatrix;
+    }
+}
+
+namespace flair
+{
+namespace filter
+{
+    class OpticalFlow;
+
+    /*! \class OpticalFlowSpeed
+    *
+    * \brief Optical flow speed calculation
+    *
+    * Speed is the mean of all optical flow values.
+    */
+    class OpticalFlowSpeed : public core::IODevice
+    {
+        public:
+            /*!
+            * \brief Constructor
+            *
+            * Construct OpticalFlowSpeed.
+            *
+            * \param parent parent
+            * \param name name
+            */
+            OpticalFlowSpeed(const core::IODevice* parent,std::string name);
+
+            /*!
+            * \brief Destructor
+            *
+            */
+            ~OpticalFlowSpeed();
+
+            /*!
+            * \brief Speed along x axis
+            *
+            */
+            float Vx(void) const;
+
+            /*!
+            * \brief Speed along y axis
+            *
+            */
+            float Vy(void) const;
+
+            /*!
+            * \brief Output matrix
+            *
+            * Matrix is of sze (2,1). \n
+            * First line is speed along x axis. \n
+            * Second line is speed along y axis. \n
+            */
+            core::cvmatrix *Output() const;
+
+        private:
+            /*!
+            * \brief Update using provided datas
+            *
+            * Reimplemented from IODevice.
+            *
+            * \param data data from the parent to process
+            */
+            void UpdateFrom(const core::io_data *data);
+
+            core::cvmatrix *output;
+    };
+} // end namespace filter
+} // end namespace flair
+#endif // OPTICALFLOWSPEED_H
Index: trunk/lib/FlairVisionFilter/src/Sobel.cpp
===================================================================
--- trunk/lib/FlairVisionFilter/src/Sobel.cpp	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/Sobel.cpp	(revision 122)
@@ -0,0 +1,77 @@
+//  created:    2015/10/07
+//  filename:   Sobel.cpp
+//
+//  author:     Gildas Bayard
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    Sobel
+//
+//
+/*********************************************************************/
+
+#include "Sobel.h"
+#include <cvimage.h>
+#include <Layout.h>
+#include <GroupBox.h>
+#include <SpinBox.h>
+#include <typeinfo>
+
+using std::string;
+using namespace flair::core;
+using namespace flair::gui;
+
+namespace flair { namespace filter {
+
+Sobel::Sobel(const IODevice* parent,const LayoutPosition* position,string name) : IODevice(parent,name),output(0) {
+    GroupBox* reglages_groupbox=new GroupBox(position,name);
+    dx=new SpinBox(reglages_groupbox->NewRow(),"dx:",0,1,1,1);
+    dy=new SpinBox(reglages_groupbox->NewRow(),"dy:",0,1,1,1);
+
+    Printf("TODO: IODevice doit faire un check de GetInputDataType et GetOutputDataType\n");
+    //cvimage devrait accepter un type dans son constructeur pour construire un type identique
+    try{
+        cvimage::Type const &imageType=dynamic_cast<cvimage::Type const &>(parent->GetOutputDataType());
+        if(imageType.GetFormat()==cvimage::Type::Format::GRAY) {
+            output=new cvimage(this,imageType.GetWidth(),imageType.GetHeight(),imageType.GetFormat(),"sobel");
+        } else {
+            Err("input image is not grey\n");
+        }
+
+    } catch(std::bad_cast& bc) {
+        Err("io type mismatch\n");
+    }
+}
+
+Sobel::~Sobel(void) {
+}
+
+cvimage* Sobel::Output(void) {
+    return output;
+}
+
+void Sobel::UpdateFrom(const io_data *data) {
+    cvimage *cvImage=(cvimage*)data;
+    IplImage *gimg=cvImage->img;
+/*
+    data->GetMutex();
+    output->GetMutex();
+    dspSobel(gimg,output->img,dx->Value(),dy->Value());
+    output->ReleaseMutex();
+    data->ReleaseMutex();
+*/
+    output->SetDataTime(data->DataTime());
+    ProcessUpdate(output);
+}
+
+DataType const &Sobel::GetOutputDataType() const {
+    if(output!=NULL) {
+        return output->GetDataType();
+    } else {
+        return dummyType;
+    }
+}
+
+} // end namespace filter
+} // end namespace flair
Index: trunk/lib/FlairVisionFilter/src/Sobel.h
===================================================================
--- trunk/lib/FlairVisionFilter/src/Sobel.h	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/Sobel.h	(revision 122)
@@ -0,0 +1,72 @@
+/*!
+ * \file Sobel.h
+ * \brief Sobel algorithm
+ * \author Gildas Bayard, Copyright Heudiasyc UMR UTC/CNRS 7253
+ * \date 2015/10/07
+ * \version 4.0
+ */
+
+
+#ifndef SOBEL_H
+#define SOBEL_H
+
+#include <IODevice.h>
+#include <cv.h>
+
+namespace flair {
+    namespace core {
+        class cvimage;
+    }
+    namespace gui {
+        class LayoutPosition;
+        class SpinBox;
+    }
+}
+
+namespace flair { namespace filter {
+    /*! \class Sobel
+    *
+    * \brief Sobel algorithm
+    *
+    * Sobel is done using the DSP of the DM3730.
+    */
+    class Sobel : public core::IODevice {
+        public:
+            /*!
+            * \brief Constructor
+            *
+            * Construct an OpticalFlow filter at given position. \n
+            * After calling this function, position will be deleted as it is no longer usefull. \n
+            *
+            * \param parent parent
+            * \param position position
+            * \param name name
+            */
+            Sobel(const core::IODevice* parent,const gui::LayoutPosition* position,std::string name);
+
+            /*!
+            * \brief Destructor
+            *
+            */
+            ~Sobel();
+
+            /*!
+            * \brief Output image
+            *
+            * Output matrix is of the same size as the input image. \n
+            *
+            * \return the output image
+            */
+            core::cvimage* Output(void);
+
+            core::DataType const &GetOutputDataType() const;
+
+        private:
+            void UpdateFrom(const core::io_data *data);
+            core::cvimage *output;
+            gui::SpinBox *dx;
+            gui::SpinBox *dy;
+    };
+} // end namespace filter
+} // end namespace flair
+#endif // SOBEL_H
Index: trunk/lib/FlairVisionFilter/src/init.cpp
===================================================================
--- trunk/lib/FlairVisionFilter/src/init.cpp	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/init.cpp	(revision 122)
@@ -0,0 +1,10 @@
+#include "init.h"
+
+
+void SetupDSP(std::string file,int globalTimeoutMs) {
+    
+}
+
+void CloseDSP(void) {
+  
+}
Index: trunk/lib/FlairVisionFilter/src/init.h
===================================================================
--- trunk/lib/FlairVisionFilter/src/init.h	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/init.h	(revision 122)
@@ -0,0 +1,16 @@
+#include <string>
+
+/*!
+* \brief DSP setup
+*
+* Setup DSP executable file. \n
+* If this method is not called, no DSP processing will be available. \n
+*
+* \param file DSP executable file
+* \param globalTimeoutMs timeout for all DSP functions, in ms (timeout is only
+* used to display a warning. -1 to disable timeout
+*/
+void SetupDSP(std::string file,int globalTimeoutMs=-1);
+
+
+void CloseDSP(void);
Index: trunk/lib/FlairVisionFilter/src/unexported/compile_info.h
===================================================================
--- trunk/lib/FlairVisionFilter/src/unexported/compile_info.h	(revision 122)
+++ trunk/lib/FlairVisionFilter/src/unexported/compile_info.h	(revision 122)
@@ -0,0 +1,18 @@
+//file generated automatically by compile_info.sh script
+//do not edit it manually
+
+#include <string>
+
+#define USER "gsanahuj@gsanahuj-Latitude-E6420"
+#define DATE "vendredi 6 janvier 2017, 12:43:09 (UTC+0100)"
+#define GCC_REV "4.9.1"
+#define GCC_PATH "/opt/robomap3/1.7.3/armv7a-neon/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc"
+#define SVN_PATH "/home/gsanahuj/HDS/igep/flair-src_svn/trunk/lib/FlairVisionFilter"
+#define SVN_REV "Ajout, copie ou déplacement local non propagé"
+
+inline void compile_info(std::string name) { 
+	fprintf(stderr,"Using %s library:\n",name.c_str());
+	fprintf(stderr,"  -built by " USER " on " DATE "\n");
+	fprintf(stderr,"  -with GCC " GCC_REV " from " GCC_PATH "\n");
+	fprintf(stderr,"  -svnversion of " SVN_PATH " is " SVN_REV "\n\n");
+}
