Index: /trunk/lib/FlairCore/src/FrameworkManager_impl.cpp
===================================================================
--- /trunk/lib/FlairCore/src/FrameworkManager_impl.cpp	(revision 50)
+++ /trunk/lib/FlairCore/src/FrameworkManager_impl.cpp	(revision 51)
@@ -618,5 +618,5 @@
 void FrameworkManager_impl::AddDeviceToLog(IODevice *device) {
   if (logger_defined == false) {
-    Err("SetupLogger() was not called, not starting log\n");
+    Warn("SetupLogger() was not called, not adding to log\n");
     return;
   }
Index: /trunk/lib/FlairCore/src/GpsData.cpp
===================================================================
--- /trunk/lib/FlairCore/src/GpsData.cpp	(revision 50)
+++ /trunk/lib/FlairCore/src/GpsData.cpp	(revision 51)
@@ -18,4 +18,5 @@
 #include "GpsData.h"
 #include "Euler.h"
+#include "IODataElement.h"
 #include <math.h>
 #include <string.h>
@@ -37,5 +38,22 @@
     plotableData = inPlotableData;
 
-    size = 0;
+    switch (plotableData) {
+    case GpsData::Latitude:
+    case GpsData::Longitude:
+      size = 8;
+      break;
+    case GpsData::Altitude:
+    case GpsData::East:
+    case GpsData::North:
+    case GpsData::Up:
+    case GpsData::EastVelocity:
+    case GpsData::NorthVelocity:
+      size=4;
+      break;
+    case GpsData::NumberOfSatellites:
+    case GpsData::FixQuality:
+      size=1;
+      break;
+    }
   }
 
@@ -43,14 +61,76 @@
 
   void CopyData(char *dst) const {
-
-
-  }
-
-  FloatType const &GetDataType(void) const { return dataType; }
+    double latitude,longitude;
+    float altitude,east,north,up,eastVelocity,northVelocity;
+
+    gpsdata->GetLla(latitude,longitude,altitude);
+    uint8_t numberOfSatellites=gpsdata->GetNumberOfSatellites();
+    GpsData::FixQuality_t fixQuality=gpsdata->GetFixQuality();
+    gpsdata->GetEnu(east,north,up);
+    gpsdata->GetVelocity(eastVelocity,northVelocity);
+
+    switch (plotableData) {
+    case GpsData::Latitude:
+      memcpy(dst, &latitude, sizeof(latitude));
+      break;
+    case GpsData::Longitude:
+      memcpy(dst, &longitude, sizeof(longitude));
+      break;
+    case GpsData::Altitude:
+      memcpy(dst, &altitude, sizeof(altitude));
+      break;
+    case GpsData::NumberOfSatellites:
+      memcpy(dst, &numberOfSatellites, sizeof(numberOfSatellites));
+      break;
+    case GpsData::FixQuality:
+      memcpy(dst, &fixQuality, sizeof(fixQuality));
+      break;
+    case GpsData::East:
+      memcpy(dst, &east, sizeof(east));
+      break;
+    case GpsData::North:
+      memcpy(dst, &north, sizeof(north));
+      break;
+    case GpsData::Up:
+      memcpy(dst, &up, sizeof(up));
+      break;
+     case GpsData::EastVelocity:
+      memcpy(dst, &eastVelocity, sizeof(eastVelocity));
+      break;
+    case GpsData::NorthVelocity:
+      memcpy(dst, &northVelocity, sizeof(northVelocity));
+      break;
+    default:
+      gpsdata->Err("data type unavailable.\n");
+      break;
+    }
+  }
+
+  DataType const &GetDataType(void) const {
+    switch (plotableData) {
+    case GpsData::Latitude:
+    case GpsData::Longitude:
+      return doubleType;
+      break;
+    case GpsData::Altitude:
+    case GpsData::East:
+    case GpsData::North:
+    case GpsData::Up:
+    case GpsData::EastVelocity:
+    case GpsData::NorthVelocity:
+      return floatType;
+      break;
+    case GpsData::NumberOfSatellites:
+    case GpsData::FixQuality:
+      return UInt8Type;
+      break;
+    default:
+      return dummyType;
+    }
+  }
 
 private:
   const GpsData *gpsdata;
   GpsData::PlotableData_t plotableData;
-  FloatType dataType;
 };
 
@@ -60,17 +140,120 @@
     Warn("n>1 not supported\n");
 
-  AppendLogDescription("latitude", floatType);
-  AppendLogDescription("longitude", floatType);
+  AppendLogDescription("latitude", doubleType);
+  AppendLogDescription("longitude", doubleType);
   AppendLogDescription("altitude", floatType);
-
-
+  AppendLogDescription("nb_sat",UInt8Type);
+  AppendLogDescription("fix quality",UInt8Type);
+  AppendLogDescription("east", floatType);
+  AppendLogDescription("north", floatType);
+  AppendLogDescription("up", floatType);
+  AppendLogDescription("east velocity", floatType);
+  AppendLogDescription("north velocity", floatType);
+
+  numberOfSatellites=0;
+  fixQuality=FixQuality_t::Invalid;
 }
 
 GpsData::~GpsData() {}
 
+void GpsData::GetLla(double &outLatitude, double &outLongitude, float &outAltitude) const {
+  GetMutex();
+  outLatitude=latitude;
+  outLongitude=longitude;
+  outAltitude=altitude;
+  ReleaseMutex();
+}
+
+void GpsData::SetLla(double inLatitude,double inLongitude,float inAltitude) {
+  GetMutex();
+  latitude=inLatitude;
+  longitude=inLongitude;
+  altitude=inAltitude;
+  ReleaseMutex();
+}
+
+void GpsData::GetEnu(float &outEast, float &outNorth,float &outUp) const {
+  GetMutex();
+  outEast=east;
+  outNorth=north;
+  outUp=up;
+  ReleaseMutex();
+}
+
+void GpsData::SetEnu(float inEast, float inNorth,float inUp) {
+  GetMutex();
+  east=inEast;
+  north=inNorth;
+  up=inUp;
+  ReleaseMutex();
+}
+
+
+void GpsData::GetVelocity(float &outEastVelocity, float &outNorthVelocity) const {
+  GetMutex();
+  outEastVelocity=eastVelocity;
+  outNorthVelocity=northVelocity;
+  ReleaseMutex();
+}
+
+void GpsData::SetVelocity(float inEastVelocity, float inNorthVelocity) {
+  GetMutex();
+  eastVelocity=inEastVelocity;
+  northVelocity=inNorthVelocity;
+  ReleaseMutex();
+}
+
+uint8_t GpsData::GetNumberOfSatellites(void) const {
+  return numberOfSatellites;
+}
+
+void GpsData::SetNumberOfSatellites(uint8_t inNumberOfSatellites) {
+  numberOfSatellites=inNumberOfSatellites;
+}
+
+GpsData::FixQuality_t GpsData::GetFixQuality(void) const {
+  return fixQuality;
+}
+
+void GpsData::SetFixQuality(FixQuality_t inFixQuality) {
+  fixQuality=inFixQuality;
+}
 
 IODataElement *GpsData::Element(PlotableData_t data_type) const {
-
-  //return new GpsDataElement(this, name, data_type);
+  string name;
+  switch (data_type) {
+  case GpsData::Latitude:
+    name = "Latitude";
+    break;
+  case GpsData::Longitude:
+    name = "Longitude";
+    break;
+  case GpsData::Altitude:
+    name = "Altitude";
+    break;
+  case GpsData::NumberOfSatellites:
+    name = "NumberOfSatellites";
+    break;
+  case GpsData::FixQuality:
+    name = "FixQuality";
+    break;
+  case GpsData::East:
+    name = "East";
+    break;
+  case GpsData::North:
+    name = "North";
+    break;
+  case GpsData::Up:
+    name = "Up";
+    break;
+  case GpsData::EastVelocity:
+    name = "EastVelocity";
+    break;
+  case GpsData::NorthVelocity:
+    name = "NorthVelocity";
+    break;
+  }
+
+  return new GpsDataElement(this, name, data_type);
 }
 
@@ -78,5 +261,14 @@
   GetMutex();
 
-  //Queue(&dst, &rawAcc.x, sizeof(rawAcc.x));
+  Queue(&dst, &latitude, sizeof(latitude));
+  Queue(&dst, &longitude, sizeof(longitude));
+  Queue(&dst, &altitude, sizeof(altitude));
+  Queue(&dst, &numberOfSatellites, sizeof(numberOfSatellites));
+  Queue(&dst, &fixQuality, sizeof(FixQuality_t));
+  Queue(&dst, &east, sizeof(east));
+  Queue(&dst, &north, sizeof(north));
+  Queue(&dst, &up, sizeof(up));
+  Queue(&dst, &eastVelocity, sizeof(eastVelocity));
+  Queue(&dst, &northVelocity, sizeof(northVelocity));
 
   ReleaseMutex();
Index: /trunk/lib/FlairCore/src/GpsData.h
===================================================================
--- /trunk/lib/FlairCore/src/GpsData.h	(revision 50)
+++ /trunk/lib/FlairCore/src/GpsData.h	(revision 51)
@@ -14,9 +14,10 @@
 
 #include <io_data.h>
-#include <IODataElement.h>
-#include <Vector3D.h>
 
 namespace flair {
 namespace core {
+
+  class IODataElement;
+  class Vector3D;
 
 /*! \class GpsData
@@ -35,5 +36,11 @@
     std::string GetDescription() const { return "gps data"; }
     size_t GetSize() const {
-      return 0;
+      size_t size = 0;
+      size += 2*doubleType.GetSize(); // Latitude, Longitude
+      size += floatType.GetSize(); // Altitude
+      size += UInt8Type.GetSize(); // NumberOfSatellites
+      size += UInt8Type.GetSize(); // FixQuality_t
+      size += 5*floatType.GetSize();//e,n,u,ve,vn
+      return size;
     }
 
@@ -46,6 +53,31 @@
   */
   typedef enum {
-
+    Latitude /*! latitude in degrees */,
+    Longitude /*! longitude in degrees */,
+    Altitude /*! altitude */,
+    NumberOfSatellites /*! number of satellites */,
+    FixQuality /*! fix quality */,
+    East /*! east */,
+    North /*! north */,
+    Up /*! up */,
+    EastVelocity /*! east velocity*/,
+    NorthVelocity /*! north velocity*/,
   } PlotableData_t;
+
+  /*!
+  \enum FixQuality_t
+  \brief Fix qualty indicators
+  */
+  enum class FixQuality_t : uint8_t {
+    Invalid = 0,    /*!< invalid */
+    Gps = 1,        /*!< Gps */
+    DGps = 2,       /*!< Differential Gps */
+    Pps = 3,        /*!< Pps */
+    Rtk = 4,        /*!< RTK */
+    RtkFloat = 5,   /*!< RTK float */
+    Estimated = 6,  /*!< Estimated */
+    Manual = 7,     /*!< Manual */
+    Simulation = 8, /*!< Simulation */
+  };
 
   /*!
@@ -77,4 +109,110 @@
   IODataElement *Element(PlotableData_t data_type) const;
 
+  /*!
+  * \brief Get latitude, longitude and altitude
+  *
+  * This method is mutex protected.
+  *
+  * \param latitude latitude
+  * \param longitude longitude
+  * \param altitude altitude
+  *
+  */
+  void GetLla(double &latitude, double &longitude,
+                          float &altitude) const;
+
+  /*!
+  * \brief Set latitude, longitude and altitude
+  *
+  * This method is mutex protected.
+  *
+  * \param latitude latitude
+  * \param longitude longitude
+  * \param altitude altitude
+  *
+  */
+  void SetLla(double latitude,double longitude,
+                          float altitude);
+
+
+  /*!
+  * \brief Get east, north and up
+  *
+  * This method is mutex protected.
+  *
+  * \param east east
+  * \param north north
+  * \param up up
+  *
+  */
+  void GetEnu(float &east, float &north,
+                          float &up) const;
+
+  /*!
+  * \brief Set east, north and up
+  *
+  * This method is mutex protected.
+  *
+  * \param east east
+  * \param north north
+  * \param up up
+  *
+  */
+  void SetEnu(float east, float north,
+                          float up);
+
+  /*!
+  * \brief Get east and north velocities
+  *
+  * This method is mutex protected.
+  *
+  * \param eastVelocity east velocity
+  * \param northVelocity north velocity
+  *
+  */
+  void GetVelocity(float &eastVelocity, float &northVelocity) const;
+
+  /*!
+  * \brief Set east and north velocities
+  *
+  * This method is mutex protected.
+  *
+  * \param eastVelocity east velocity
+  * \param northVelocity north velocity
+  *
+  */
+  void SetVelocity(float eastVelocity, float northVelocity);
+
+  /*!
+  * \brief Get number of satellites
+  *
+  * \return number of satellites
+  *
+  */
+  uint8_t GetNumberOfSatellites(void) const;
+
+  /*!
+  * \brief Set number of satellites
+  *
+  * \param numberOfSatellites number of satellites
+  *
+  */
+  void SetNumberOfSatellites(uint8_t numberOfSatellites);
+
+  /*!
+  * \brief Get fix quality
+  *
+  * \return fix quality
+  *
+  */
+  FixQuality_t GetFixQuality(void) const;
+
+  /*!
+  * \brief Set fix quality
+  *
+  * \param fixQuality fix quality
+  *
+  */
+  void SetFixQuality(FixQuality_t fixQuality);
 
   Type const &GetDataType() const { return dataType; }
@@ -91,8 +229,11 @@
   void CopyDatas(char *dst) const;
 
-
-
   void Queue(char **dst, const void *src, size_t size) const;
   Type dataType;
+  double latitude,longitude;
+  float altitude;
+  uint8_t numberOfSatellites;
+  FixQuality_t fixQuality;
+  float east,north,up,eastVelocity,northVelocity;
 };
 
Index: /trunk/lib/FlairCore/src/io_data.cpp
===================================================================
--- /trunk/lib/FlairCore/src/io_data.cpp	(revision 50)
+++ /trunk/lib/FlairCore/src/io_data.cpp	(revision 51)
@@ -26,6 +26,9 @@
 DummyType dummyType;
 FloatType floatType;
+DoubleType doubleType;
 SignedIntegerType Int8Type(8);
 SignedIntegerType Int16Type(16);
+UnsignedIntegerType UInt8Type(8);
+UnsignedIntegerType UInt16Type(16);
 
 io_data::io_data(const Object *parent, string name, int n)
Index: /trunk/lib/FlairCore/src/io_data.h
===================================================================
--- /trunk/lib/FlairCore/src/io_data.h	(revision 50)
+++ /trunk/lib/FlairCore/src/io_data.h	(revision 51)
@@ -58,4 +58,14 @@
 extern SignedIntegerType Int16Type;
 
+class UnsignedIntegerType : public ScalarType {
+public:
+  UnsignedIntegerType(size_t sizeInBits) : ScalarType(sizeInBits / 8) {}
+  std::string GetDescription() const {
+    return "uint" + std::to_string(GetSize() * 8) + "_t";
+  };
+};
+extern UnsignedIntegerType UInt8Type;
+extern UnsignedIntegerType UInt16Type;
+
 class FloatType : public ScalarType {
 public:
@@ -64,4 +74,11 @@
 };
 extern FloatType floatType;
+
+class DoubleType : public ScalarType {
+public:
+  DoubleType() : ScalarType(8) {}
+  std::string GetDescription() const { return "double"; };
+};
+extern DoubleType doubleType;
 
 /*! \class io_data
Index: /trunk/lib/FlairFilter/src/Ahrs.h
===================================================================
--- /trunk/lib/FlairFilter/src/Ahrs.h	(revision 50)
+++ /trunk/lib/FlairFilter/src/Ahrs.h	(revision 51)
@@ -18,18 +18,18 @@
 
 namespace flair {
-namespace core {
-class Euler;
-class Vector3D;
-class ImuData;
-class Quaternion;
-class AhrsData;
-}
-namespace gui {
-class Tab;
-class DataPlot1D;
-}
-namespace sensor {
-class Imu;
-}
+  namespace core {
+    class Euler;
+    class Vector3D;
+    class ImuData;
+    class Quaternion;
+    class AhrsData;
+  }
+  namespace gui {
+    class Tab;
+    class DataPlot1D;
+  }
+  namespace sensor {
+    class Imu;
+  }
 }
 
Index: unk/lib/FlairSensorActuator/src/Gps.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Gps.cpp	(revision 50)
+++ 	(revision )
@@ -1,292 +1,0 @@
-// %flair:license{
-// This file is part of the Flair framework distributed under the
-// CECILL-C License, Version 1.0.
-// %flair:license}
-//  created:    2013/08/23
-//  filename:   Gps.cpp
-//
-//  author:     Guillaume Sanahuja
-//              Copyright Heudiasyc UMR UTC/CNRS 7253
-//
-//  version:    $Id: $
-//
-//  purpose:    objet integrant le recepteur gps mb800
-//
-//
-/*********************************************************************/
-
-#include "Gps.h"
-#include "geodesie.h"
-#include <Euler.h>
-#include <cvmatrix.h>
-#include <DataPlot1D.h>
-#include <Tab.h>
-#include <TabWidget.h>
-#include <GridLayout.h>
-#include <GroupBox.h>
-#include <PushButton.h>
-#include <FrameworkManager.h>
-#include <Map.h>
-#include <GeoCoordinate.h>
-#include <Vector3D.h>
-#include <Label.h>
-#include <string.h>
-
-using std::string;
-using namespace Geodesie;
-using namespace flair::core;
-using namespace flair::gui;
-
-namespace flair {
-namespace sensor {
-
-Gps::Gps(const FrameworkManager *parent, string name, NMEAFlags_t NMEAFlags)
-    : IODevice(parent, name) {
-  this->NMEAFlags = NMEAFlags;
-
-  nmea_zero_INFO(&info);
-  nmea_parser_init(&parser);
-  alt_ref = 0;
-
-  if ((NMEAFlags & GGA) == 0) {
-    Err("Enable at least GGA sentence\n");
-  }
-
-  int index = 0;
-  if ((NMEAFlags & GGA) != 0) {
-    index += 3;
-  }
-  if ((NMEAFlags & VTG) != 0) {
-    index += 2;
-  }
-  if ((NMEAFlags & GST) != 0) {
-    index += 3;
-  }
-
-  cvmatrix_descriptor *desc = new cvmatrix_descriptor(index, 1);
-  index = 0;
-  if ((NMEAFlags & GGA) != 0) {
-    desc->SetElementName(0, 0, "e");
-    desc->SetElementName(1, 0, "n");
-    desc->SetElementName(2, 0, "u");
-    index += 3;
-  }
-  if ((NMEAFlags & VTG) != 0) {
-    desc->SetElementName(index, 0, "ve");
-    desc->SetElementName(index + 1, 0, "vn");
-    index += 2;
-  }
-  if ((NMEAFlags & GST) != 0) {
-    desc->SetElementName(index, 0, "dev_lat");
-    desc->SetElementName(index + 1, 0, "dev_lon");
-    desc->SetElementName(index + 2, 0, "dev_elv");
-    index += 3;
-  }
-  output = new cvmatrix((IODevice *)this, desc, floatType);
-  AddDataToLog(output);
-
-  // station sol
-  main_tab = new Tab(parent->GetTabWidget(), name);
-  tab = new TabWidget(main_tab->NewRow(), name);
-  sensor_tab = new Tab(tab, "Reglages");
-  GroupBox *reglages_groupbox = new GroupBox(sensor_tab->NewRow(), name);
-  button_ref = new PushButton(reglages_groupbox->NewRow(), "set ref");
-  nb_sat_label = new Label(reglages_groupbox->NewRow(), "nb_sat");
-  fix_label = new Label(reglages_groupbox->LastRowLastCol(), "fix");
-
-  position = new GeoCoordinate((IODevice *)this, "position", 0, 0, 0);
-
-  fix = FixQuality_t::Invalid;
-  nb_sat = 0;
-  take_ref = false;
-  nb_sat_label->SetText("nb_sat: %i", nb_sat);
-  fix_label->SetText("fix: %i", fix);
-}
-
-Gps::~Gps() {
-  nmea_parser_destroy(&parser);
-  delete main_tab;
-}
-
-void Gps::UseDefaultPlot(void) {
-  int index = 0;
-  plot_tab = new Tab(tab, "Mesures");
-
-  if ((NMEAFlags & GGA) != 0) {
-    e_plot = new DataPlot1D(plot_tab->NewRow(), "e", -10, 10);
-    e_plot->AddCurve(output->Element(index));
-    n_plot = new DataPlot1D(plot_tab->LastRowLastCol(), "n", -10, 10);
-    n_plot->AddCurve(output->Element(index + 1));
-    u_plot = new DataPlot1D(plot_tab->LastRowLastCol(), "u", -10, 10);
-    u_plot->AddCurve(output->Element(index + 2));
-    index += 3;
-  }
-  if ((NMEAFlags & VTG) != 0) {
-    ve_plot = new DataPlot1D(plot_tab->NewRow(), "ve", -10, 10);
-    ve_plot->AddCurve(output->Element(index));
-    vn_plot = new DataPlot1D(plot_tab->LastRowLastCol(), "vn", -10, 10);
-    vn_plot->AddCurve(output->Element(index + 1));
-    index += 2;
-  }
-
-  Tab *map_tab = new Tab(tab, "carte");
-  map = new Map(map_tab->NewRow(), "map");
-  map->AddPoint(position, "drone");
-}
-
-DataPlot1D *Gps::EPlot(void) const {
-  if ((NMEAFlags & GGA) != 0) {
-    return e_plot;
-  } else {
-    Err("GGA sentence not requested\n");
-    return NULL;
-  }
-}
-
-DataPlot1D *Gps::NPlot(void) const {
-  if ((NMEAFlags & GGA) != 0) {
-    return n_plot;
-  } else {
-    Err("GGA sentence not requested\n");
-    return NULL;
-  }
-}
-
-DataPlot1D *Gps::UPlot(void) const {
-  if ((NMEAFlags & GGA) != 0) {
-    return u_plot;
-  } else {
-    Err("GGA sentence not requested\n");
-    return NULL;
-  }
-}
-
-DataPlot1D *Gps::VEPlot(void) const {
-  if ((NMEAFlags & VTG) != 0) {
-    return ve_plot;
-  } else {
-    Err("GGA sentence not requested\n");
-    return NULL;
-  }
-}
-
-DataPlot1D *Gps::VNPlot(void) const {
-  if ((NMEAFlags & VTG) != 0) {
-    return vn_plot;
-  } else {
-    Err("GGA sentence not requested\n");
-    return NULL;
-  }
-}
-
-Layout *Gps::GetLayout(void) const { return sensor_tab; }
-
-Tab *Gps::GetPlotTab(void) const { return plot_tab; }
-
-TabWidget *Gps::GetTab(void) const { return tab; }
-
-uint16_t Gps::NbSat(void) const {
-  output->GetMutex();
-  uint16_t result = nb_sat;
-  output->ReleaseMutex();
-  return result;
-}
-
-Gps::FixQuality_t Gps::FixQuality(void) const {
-  output->GetMutex();
-  FixQuality_t result = fix;
-  output->ReleaseMutex();
-  return result;
-}
-
-void Gps::SetRef(void) { take_ref = true; }
-
-void Gps::GetENUPosition(Vector3D *point) {
-  output->GetMutex();
-  point->x = output->ValueNoMutex(0, 0);
-  point->y = output->ValueNoMutex(1, 0);
-  point->z = output->ValueNoMutex(2, 0);
-  output->ReleaseMutex();
-}
-
-void Gps::parseFrame(const char *frame, int frame_size) {
-
-  int result;
-
-  result = nmea_parse(&parser, frame, frame_size, &info);
-  if (result != 1) {
-    Warn("unrecognized nmea sentence: %s\n",frame);
-  }
-
-  result = nmea_parse_GPGGA(frame, frame_size, &pack);
-
-  if (result == 1) {
-    // Printf("%s\n",frame);
-    // Printf("nb:%i fix:%i lat:%f long:%f alt:%f vel:%f
-    // angle:%f\n",pack.satinuse,pack.sig,info.lat,info.lon,info.elv,info.speed*1000./3600.,info.direction);
-    // Printf("lat:%f long:%f\n",pos.lat,pos.lon);
-    output->GetMutex(); // on utilise le mutex de l'output pour fix et nb_sat
-    if ((int)fix != pack.sig) {
-      fix = (FixQuality_t)pack.sig;
-      fix_label->SetText("fix: %i", fix);
-    }
-    if (nb_sat != pack.satinuse) {
-      nb_sat = pack.satinuse;
-      nb_sat_label->SetText("nb_sat: %i", nb_sat);
-    }
-    output->ReleaseMutex();
-
-    nmea_info2pos(&info, &pos);
-    position->SetCoordinates(Euler::ToDegree(pos.lat), Euler::ToDegree(pos.lon),
-                             info.elv);
-
-    if ((info.sig == 2 && alt_ref == 0) || button_ref->Clicked() == true ||
-        take_ref == true) {
-      Printf("prise pos ref\n");
-      lat_ref = pos.lat;
-      long_ref = pos.lon;
-      alt_ref = info.elv;
-      take_ref = false;
-    }
-    // if(alt_ref!=0)
-    {
-      double x, y, z;
-      double e, n, u;
-      Geographique_2_ECEF(pos.lon, pos.lat, info.elv, x, y, z);
-      ECEF_2_ENU(x, y, z, e, n, u, long_ref, lat_ref, alt_ref);
-      // Printf("lon:%f lat:%f elv:%f\n",pos.lon,pos.lat,info.elv);
-
-      // on prend une fois pour toute le mutex et on fait des accès directs
-      output->GetMutex();
-      output->SetValueNoMutex(0, 0, e);
-      output->SetValueNoMutex(1, 0, n);
-      output->SetValueNoMutex(2, 0, u);
-
-      int index = 3;
-      if ((NMEAFlags & VTG) != 0) {
-        output->SetValueNoMutex(index, 0,
-                                info.speed * 1000. / 3600. *
-                                    sin(Euler::ToRadian(info.direction)));
-        output->SetValueNoMutex(index + 1, 0,
-                                info.speed * 1000. / 3600. *
-                                    cos(Euler::ToRadian(info.direction)));
-        index += 2;
-      }
-      if ((NMEAFlags & GST) != 0) {
-        // Thread::Printf("dev_lon:%f dev_lat:%f
-        // dev_elv:%f\n",info.dev_lat,info.dev_lon,info.dev_elv);
-        output->SetValueNoMutex(index, 0, info.dev_lat);
-        output->SetValueNoMutex(index + 1, 0, info.dev_lon);
-        output->SetValueNoMutex(index + 2, 0, info.dev_elv);
-        index += 3;
-      }
-      output->ReleaseMutex();
-
-      output->SetDataTime(GetTime());
-      ProcessUpdate(output);
-    }
-  }
-}
-
-} // end namespace sensor
-} // end namespace framewor
Index: unk/lib/FlairSensorActuator/src/Gps.h
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Gps.h	(revision 50)
+++ 	(revision )
@@ -1,235 +1,0 @@
-// %flair:license{
-// This file is part of the Flair framework distributed under the
-// CECILL-C License, Version 1.0.
-// %flair:license}
-/*!
- * \file Gps.h
- * \brief Base class for GPS
- * \author Guillaume Sanahuja, Copyright Heudiasyc UMR UTC/CNRS 7253
- * \date 2013/08/23
- * \version 4.0
- */
-
-#ifndef GPS_H
-#define GPS_H
-
-#include <IODevice.h>
-#include <nmea/nmea.h>
-
-namespace flair {
-namespace core {
-class cvmatrix;
-class FrameworkManager;
-class GeoCoordinate;
-class Vector3D;
-}
-namespace gui {
-class Layout;
-class DataPlot1D;
-class Tab;
-class TabWidget;
-class PushButton;
-class Map;
-class Label;
-}
-}
-
-namespace flair {
-namespace sensor {
-/*! \class Gps
-*
-* \brief Base class for GPS
-*/
-class Gps : public core::IODevice {
-public:
-  /*!
-  \enum FixQuality_t
-  \brief Fix qualty indicators
-  */
-  enum class FixQuality_t {
-    Invalid = 0,    /*!< invalid */
-    Gps = 1,        /*!< Gps */
-    DGps = 2,       /*!< Differential Gps */
-    Pps = 3,        /*!< Pps */
-    Rtk = 4,        /*!< RTK */
-    RtkFloat = 5,   /*!< RTK float */
-    Estimated = 6,  /*!< Estimated */
-    Manual = 7,     /*!< Manual */
-    Simulation = 8, /*!< Simulation */
-  };
-
-  /*!
-  \enum NMEAFlags_t
-  \brief NMEA flags
-  */
-  enum NMEAFlags_t {
-    GGA = 0x01, /*!< GGA */
-    VTG = 0x02, /*!< VTG */
-    GST = 0x04, /*!< GST */
-  };
-
-  /*!
-  * \brief Constructor
-  *
-  * Construct a Gps.
-  *
-  * \param parent parent
-  * \param name name
-  * \param NMEAFlags NMEA sentances to enable
-  */
-  Gps(const core::FrameworkManager *parent, std::string name,
-      NMEAFlags_t NMEAFlags);
-
-  /*!
-  * \brief Destructor
-  *
-  */
-  ~Gps();
-
-  /*!
-  * \brief Use default plot
-  *
-  */
-  void UseDefaultPlot(void);
-
-  /*!
-  * \brief East plot
-  *
-  * \return east plot
-  */
-  gui::DataPlot1D *EPlot(void) const;
-
-  /*!
-  * \brief North plot
-  *
-  * \return north plot
-  */
-  gui::DataPlot1D *NPlot(void) const;
-
-  /*!
-  * \brief Up plot
-  *
-  * \return up plot
-  */
-  gui::DataPlot1D *UPlot(void) const;
-
-  /*!
-  * \brief East velocity plot
-  *
-  * \return east velocity plot
-  */
-  gui::DataPlot1D *VEPlot(void) const;
-
-  /*!
-  * \brief North velocity plot
-  *
-  * \return north velocity plot
-  */
-  gui::DataPlot1D *VNPlot(void) const;
-
-  /*!
-  * \brief Main tab
-  *
-  * \return main tab
-  */
-  gui::TabWidget *GetTab(void) const;
-
-  /*!
-  * \brief Setup Layout
-  *
-  * \return setup Layout
-  */
-  gui::Layout *GetLayout(void) const;
-
-  /*!
-  * \brief Plot tab
-  *
-  * \return plot Tab
-  */
-  gui::Tab *GetPlotTab(void) const;
-
-  /*!
-  * \brief Number of used satellites
-  *
-  * \return number of used satellites
-  */
-  uint16_t NbSat(void) const;
-
-  /*!
-  * \brief Fix Quality
-  *
-  * \return fix quality
-  */
-  FixQuality_t FixQuality(void) const;
-
-  /*!
-  * \brief Set reference for ENU coordinates
-  *
-  * The actual position is used as reference to calculate
-  * ENU coordinates.
-  *
-  * \return fix quality
-  */
-  void SetRef(void);
-
-  /*!
-  * \brief Get ENU position
-  *
-  * \param point to store position
-  */
-  void GetENUPosition(core::Vector3D *point);
-
-protected:
-  /*!
-  * \brief Parse a NMEA frame
-  *
-  * This function must be called by the reimplemented class. \n
-  * When a frame is parsed, GPS datas are filled.
-  *
-  * \param frame NMEA frame
-  * \param frame_size frame size
-  *
-  */
-  void parseFrame(const char *frame, int frame_size);
-
-  NMEAFlags_t NMEAFlags;
-
-protected:
-  core::GeoCoordinate *position;
-
-private:
-  /*!
-  * \brief Update using provided datas
-  *
-  * Reimplemented from IODevice.
-  *
-  * \param data data from the parent to process
-  */
-  void UpdateFrom(const core::io_data *data){};
-
-  gui::Tab *main_tab, *sensor_tab;
-  gui::TabWidget *tab;
-  gui::PushButton *button_ref;
-  gui::DataPlot1D *e_plot;
-  gui::DataPlot1D *n_plot;
-  gui::DataPlot1D *u_plot;
-  gui::DataPlot1D *ve_plot;
-  gui::DataPlot1D *vn_plot;
-  gui::Tab *plot_tab;
-  gui::Map *map;
-  gui::Label *nb_sat_label, *fix_label;
-  uint16_t nb_sat;
-  FixQuality_t fix;
-  bool take_ref;
-  nmeaINFO info;
-  nmeaPARSER parser;
-  nmeaGPGGA pack;
-  nmeaPOS pos;
-  double lat_ref, long_ref, alt_ref;
-
-  // matrix
-  core::cvmatrix *output;
-};
-} // end namespace sensor
-} // end namespace framewor
-#endif // GPS_H
Index: /trunk/lib/FlairSensorActuator/src/Imu.h
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Imu.h	(revision 50)
+++ /trunk/lib/FlairSensorActuator/src/Imu.h	(revision 51)
@@ -17,15 +17,15 @@
 
 namespace flair {
-namespace core {
-class ImuData;
-class OneAxisRotation;
-}
-namespace gui {
-class Tab;
-class TabWidget;
-class GroupBox;
-class Layout;
-class DataPlot1D;
-}
+  namespace core {
+    class ImuData;
+    class OneAxisRotation;
+  }
+  namespace gui {
+    class Tab;
+    class TabWidget;
+    class GroupBox;
+    class Layout;
+    class DataPlot1D;
+  }
 }
 
Index: /trunk/lib/FlairSensorActuator/src/Mb800.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Mb800.cpp	(revision 50)
+++ /trunk/lib/FlairSensorActuator/src/Mb800.cpp	(revision 51)
@@ -28,7 +28,7 @@
 
 Mb800::Mb800(const FrameworkManager *parent, string name,
-             SerialPort *serialport, Gps::NMEAFlags_t NMEAFlags,
+             SerialPort *serialport, NmeaGps::NMEAFlags_t NMEAFlags,
              uint8_t priority)
-    : Gps(parent, name, NMEAFlags), Thread(parent, name, priority) {
+    : NmeaGps(parent, name, NMEAFlags), Thread(parent, name, priority) {
   this->serialport = serialport;
   serialport->SetRxTimeout(100000000);
Index: /trunk/lib/FlairSensorActuator/src/Mb800.h
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Mb800.h	(revision 50)
+++ /trunk/lib/FlairSensorActuator/src/Mb800.h	(revision 51)
@@ -15,5 +15,5 @@
 
 #include <Thread.h>
-#include <Gps.h>
+#include <NmeaGps.h>
 
 namespace flair {
@@ -30,5 +30,5 @@
 * \brief Class for mb800 gps receiver
 */
-class Mb800 : public core::Thread, public Gps {
+class Mb800 : public core::Thread, public NmeaGps {
 public:
   /*!
@@ -44,5 +44,5 @@
   */
   Mb800(const core::FrameworkManager *parent, std::string name,
-        core::SerialPort *serialport, Gps::NMEAFlags_t NMEAFlags,
+        core::SerialPort *serialport, NmeaGps::NMEAFlags_t NMEAFlags,
         uint8_t priority);
 
Index: /trunk/lib/FlairSensorActuator/src/NmeaGps.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/NmeaGps.cpp	(revision 51)
+++ /trunk/lib/FlairSensorActuator/src/NmeaGps.cpp	(revision 51)
@@ -0,0 +1,250 @@
+// %flair:license{
+// This file is part of the Flair framework distributed under the
+// CECILL-C License, Version 1.0.
+// %flair:license}
+//  created:    2013/08/23
+//  filename:   NmeaGps.cpp
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    Base class for GPS using NMEA sentances
+//
+//
+/*********************************************************************/
+
+#include "NmeaGps.h"
+#include "geodesie.h"
+#include <Euler.h>
+#include <DataPlot1D.h>
+#include <Tab.h>
+#include <TabWidget.h>
+#include <GridLayout.h>
+#include <GroupBox.h>
+#include <PushButton.h>
+#include <FrameworkManager.h>
+#include <Map.h>
+#include <GeoCoordinate.h>
+#include <Vector3D.h>
+#include <Label.h>
+#include <GpsData.h>
+#include <string.h>
+
+using std::string;
+using namespace Geodesie;
+using namespace flair::core;
+using namespace flair::gui;
+
+namespace flair {
+namespace sensor {
+
+NmeaGps::NmeaGps(const FrameworkManager *parent, string name, NMEAFlags_t NMEAFlags)
+    : IODevice(parent, name) {
+  this->NMEAFlags = NMEAFlags;
+
+  nmea_zero_INFO(&info);
+  nmea_parser_init(&parser);
+  alt_ref = 0;
+
+  if ((NMEAFlags & GGA) == 0) {
+    Err("Enable at least the GGA sentence\n");
+  }
+
+ /*
+  if ((NMEAFlags & GST) != 0) {
+    desc->SetElementName(index, 0, "dev_lat");
+    desc->SetElementName(index + 1, 0, "dev_lon");
+    desc->SetElementName(index + 2, 0, "dev_elv");
+    index += 3;
+  }
+  */
+
+  // station sol
+  main_tab = new Tab(parent->GetTabWidget(), name);
+  tab = new TabWidget(main_tab->NewRow(), name);
+  sensor_tab = new Tab(tab, "Reglages");
+  GroupBox *reglages_groupbox = new GroupBox(sensor_tab->NewRow(), name);
+  button_ref = new PushButton(reglages_groupbox->NewRow(), "set ref");
+  nb_sat_label = new Label(reglages_groupbox->NewRow(), "nb_sat");
+  fix_label = new Label(reglages_groupbox->LastRowLastCol(), "fix");
+
+  position = new GeoCoordinate((IODevice *)this, "position", 0, 0, 0);
+
+  take_ref = false;
+
+  gpsData = new GpsData(this);
+  AddDataToLog(gpsData);
+
+  nb_sat_label->SetText("nb_sat: %i", gpsData->GetNumberOfSatellites());
+  fix_label->SetText("fix: %i", gpsData->GetFixQuality());
+}
+
+NmeaGps::~NmeaGps() {
+  nmea_parser_destroy(&parser);
+  delete main_tab;
+}
+
+const GpsData *NmeaGps::GetDatas(void) const {
+   return gpsData;
+}
+
+void NmeaGps::GetDatas(core::GpsData **outGpsData) const {
+  *outGpsData = gpsData;
+}
+
+void NmeaGps::UseDefaultPlot(void) {
+  plot_tab = new Tab(tab, "Mesures");
+
+  if ((NMEAFlags & GGA) != 0) {
+    e_plot = new DataPlot1D(plot_tab->NewRow(), "e", -10, 10);
+    e_plot->AddCurve(gpsData->Element(GpsData::East));
+    n_plot = new DataPlot1D(plot_tab->LastRowLastCol(), "n", -10, 10);
+    n_plot->AddCurve(gpsData->Element(GpsData::North));
+    u_plot = new DataPlot1D(plot_tab->LastRowLastCol(), "u", -10, 10);
+    u_plot->AddCurve(gpsData->Element(GpsData::Up));
+  }
+  if ((NMEAFlags & VTG) != 0) {
+    ve_plot = new DataPlot1D(plot_tab->NewRow(), "ve", -10, 10);
+    ve_plot->AddCurve(gpsData->Element(GpsData::EastVelocity));
+    vn_plot = new DataPlot1D(plot_tab->LastRowLastCol(), "vn", -10, 10);
+    vn_plot->AddCurve(gpsData->Element(GpsData::NorthVelocity));
+  }
+
+  Tab *map_tab = new Tab(tab, "carte");
+  map = new Map(map_tab->NewRow(), "map");
+  map->AddPoint(position, "drone");
+}
+
+DataPlot1D *NmeaGps::EPlot(void) const {
+  if ((NMEAFlags & GGA) != 0) {
+    return e_plot;
+  } else {
+    Err("GGA sentence not requested\n");
+    return NULL;
+  }
+}
+
+DataPlot1D *NmeaGps::NPlot(void) const {
+  if ((NMEAFlags & GGA) != 0) {
+    return n_plot;
+  } else {
+    Err("GGA sentence not requested\n");
+    return NULL;
+  }
+}
+
+DataPlot1D *NmeaGps::UPlot(void) const {
+  if ((NMEAFlags & GGA) != 0) {
+    return u_plot;
+  } else {
+    Err("GGA sentence not requested\n");
+    return NULL;
+  }
+}
+
+DataPlot1D *NmeaGps::VEPlot(void) const {
+  if ((NMEAFlags & VTG) != 0) {
+    return ve_plot;
+  } else {
+    Err("GGA sentence not requested\n");
+    return NULL;
+  }
+}
+
+DataPlot1D *NmeaGps::VNPlot(void) const {
+  if ((NMEAFlags & VTG) != 0) {
+    return vn_plot;
+  } else {
+    Err("GGA sentence not requested\n");
+    return NULL;
+  }
+}
+
+Layout *NmeaGps::GetLayout(void) const { return sensor_tab; }
+
+Tab *NmeaGps::GetPlotTab(void) const { return plot_tab; }
+
+TabWidget *NmeaGps::GetTab(void) const { return tab; }
+
+void NmeaGps::SetRef(void) { take_ref = true; }
+
+void NmeaGps::GetEnu(Vector3D *point) {
+  gpsData->GetMutex();
+  gpsData->GetEnu(point->x,point->y,point->z);
+  gpsData->ReleaseMutex();
+}
+
+void NmeaGps::parseFrame(const char *frame, int frame_size) {
+
+  int result;
+
+  result = nmea_parse(&parser, frame, frame_size, &info);
+  if (result != 1) {
+    Warn("unrecognized nmea sentence: %s\n",frame);
+  }
+
+  result = nmea_parse_GPGGA(frame, frame_size, &pack);
+
+  if (result == 1) {
+    nmea_info2pos(&info, &pos);
+    // Printf("%s\n",frame);
+   //  Printf("nb:%i fix:%i lat:%f long:%f alt:%f vel:%f angle:%f\n",pack.satinuse,pack.sig,info.lat,info.lon,info.elv,info.speed*1000./3600.,info.direction);
+//Printf("lat:%f long:%f\n",pos.lat,pos.lon);
+
+    gpsData->GetMutex(); // on utilise le mutex de gpsData pour fix et nb_sat
+    if (gpsData->GetFixQuality() != (GpsData::FixQuality_t)pack.sig) {
+      gpsData->SetFixQuality((GpsData::FixQuality_t)pack.sig);
+      fix_label->SetText("fix: %i", pack.sig);
+    }
+    if (gpsData->GetNumberOfSatellites() != pack.satinuse) {
+      gpsData->SetNumberOfSatellites(pack.satinuse) ;
+      nb_sat_label->SetText("nb_sat: %i", pack.satinuse);
+    }
+    gpsData->ReleaseMutex();
+
+    gpsData->SetLla(Euler::ToDegree(pos.lat), Euler::ToDegree(pos.lon),info.elv);
+    position->SetCoordinates(Euler::ToDegree(pos.lat), Euler::ToDegree(pos.lon),
+                             info.elv);
+
+    if ((info.sig == 2 && alt_ref == 0) || button_ref->Clicked() == true ||
+        take_ref == true) {
+      Printf("prise pos ref\n");
+      lat_ref = pos.lat;
+      long_ref = pos.lon;
+      alt_ref = info.elv;
+      take_ref = false;
+    }
+    // if(alt_ref!=0)
+    {
+      double x, y, z;
+      double e, n, u;
+      Geographique_2_ECEF(pos.lon, pos.lat, info.elv, x, y, z);
+      ECEF_2_ENU(x, y, z, e, n, u, long_ref, lat_ref, alt_ref);
+      // Printf("lon:%f lat:%f elv:%f\n",pos.lon,pos.lat,info.elv);
+
+      gpsData->SetEnu(e,n,u);
+
+      if ((NMEAFlags & VTG) != 0) {
+        gpsData->SetVelocity(info.speed * 1000. / 3600. * sin(Euler::ToRadian(info.direction)),
+                                  info.speed * 1000. / 3600. * cos(Euler::ToRadian(info.direction)));
+      }/*
+      if ((NMEAFlags & GST) != 0) {
+        // Thread::Printf("dev_lon:%f dev_lat:%f
+        // dev_elv:%f\n",info.dev_lat,info.dev_lon,info.dev_elv);
+        output->SetValueNoMutex(index, 0, info.dev_lat);
+        output->SetValueNoMutex(index + 1, 0, info.dev_lon);
+        output->SetValueNoMutex(index + 2, 0, info.dev_elv);
+        index += 3;
+      }*/
+
+
+      gpsData->SetDataTime(GetTime());
+      ProcessUpdate(gpsData);
+    }
+  }
+}
+
+} // end namespace sensor
+} // end namespace framewor
Index: /trunk/lib/FlairSensorActuator/src/NmeaGps.h
===================================================================
--- /trunk/lib/FlairSensorActuator/src/NmeaGps.h	(revision 51)
+++ /trunk/lib/FlairSensorActuator/src/NmeaGps.h	(revision 51)
@@ -0,0 +1,216 @@
+// %flair:license{
+// This file is part of the Flair framework distributed under the
+// CECILL-C License, Version 1.0.
+// %flair:license}
+/*!
+ * \file NmeaGps.h
+ * \brief Base class for GPS using NMEA sentances
+ * \author Guillaume Sanahuja, Copyright Heudiasyc UMR UTC/CNRS 7253
+ * \date 2013/08/23
+ * \version 4.0
+ */
+
+#ifndef NMEAGPS_H
+#define NMEAGPS_H
+
+#include <IODevice.h>
+#include <nmea/nmea.h>
+
+namespace flair {
+  namespace core {
+    class FrameworkManager;
+    class GeoCoordinate;
+    class Vector3D;
+    class GpsData;
+  }
+  namespace gui {
+    class Layout;
+    class DataPlot1D;
+    class Tab;
+    class TabWidget;
+    class PushButton;
+    class Map;
+    class Label;
+  }
+}
+
+namespace flair {
+namespace sensor {
+
+/*! \class NmeaGps
+*
+* \brief Base class for GPS using NMEA sentances
+*/
+class NmeaGps : public core::IODevice {
+public:
+  /*!
+  \enum NMEAFlags_t
+  \brief NMEA flags
+  */
+  enum NMEAFlags_t {
+    GGA = 0x01, /*!< GGA */
+    VTG = 0x02, /*!< VTG */
+    GST = 0x04, /*!< GST */
+  };
+
+  /*!
+  * \brief Constructor
+  *
+  * Construct a NmeaGps.
+  *
+  * \param parent parent
+  * \param name name
+  * \param NMEAFlags NMEA sentances to enable
+  */
+  NmeaGps(const core::FrameworkManager *parent, std::string name,
+      NMEAFlags_t NMEAFlags);
+
+  /*!
+  * \brief Destructor
+  *
+  */
+  ~NmeaGps();
+
+  /*!
+  * \brief Get GPS datas
+  *
+  * \return GpsData
+  */
+  const core::GpsData *GetDatas(void) const;
+
+  /*!
+  * \brief Use default plot
+  *
+  */
+  void UseDefaultPlot(void);
+
+  /*!
+  * \brief East plot
+  *
+  * \return east plot
+  */
+  gui::DataPlot1D *EPlot(void) const;
+
+  /*!
+  * \brief North plot
+  *
+  * \return north plot
+  */
+  gui::DataPlot1D *NPlot(void) const;
+
+  /*!
+  * \brief Up plot
+  *
+  * \return up plot
+  */
+  gui::DataPlot1D *UPlot(void) const;
+
+  /*!
+  * \brief East velocity plot
+  *
+  * \return east velocity plot
+  */
+  gui::DataPlot1D *VEPlot(void) const;
+
+  /*!
+  * \brief North velocity plot
+  *
+  * \return north velocity plot
+  */
+  gui::DataPlot1D *VNPlot(void) const;
+
+  /*!
+  * \brief Main tab
+  *
+  * \return main tab
+  */
+  gui::TabWidget *GetTab(void) const;
+
+  /*!
+  * \brief Setup Layout
+  *
+  * \return setup Layout
+  */
+  gui::Layout *GetLayout(void) const;
+
+  /*!
+  * \brief Plot tab
+  *
+  * \return plot Tab
+  */
+  gui::Tab *GetPlotTab(void) const;
+
+  /*!
+  * \brief Set reference for ENU coordinates
+  *
+  * The actual position is used as reference to calculate
+  * ENU coordinates.
+  *
+  * \return fix quality
+  */
+  void SetRef(void);
+
+  /*!
+  * \brief Get ENU position
+  *
+  * \param point to store position
+  */
+  void GetEnu(core::Vector3D *point);
+
+protected:
+  /*!
+  * \brief Parse a NMEA frame
+  *
+  * This function must be called by the reimplemented class. \n
+  * When a frame is parsed, GPS datas are filled.
+  *
+  * \param frame NMEA frame
+  * \param frame_size frame size
+  *
+  */
+  void parseFrame(const char *frame, int frame_size);
+
+  NMEAFlags_t NMEAFlags;
+
+protected:
+  core::GeoCoordinate *position;
+
+  /*!
+  * \brief Get GPS datas
+  *
+  * \param gpsData GPS datas
+  */
+  void GetDatas(core::GpsData **gpsData) 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){};
+
+  gui::Tab *main_tab, *sensor_tab;
+  gui::TabWidget *tab;
+  gui::PushButton *button_ref;
+  gui::DataPlot1D *e_plot;
+  gui::DataPlot1D *n_plot;
+  gui::DataPlot1D *u_plot;
+  gui::DataPlot1D *ve_plot;
+  gui::DataPlot1D *vn_plot;
+  gui::Tab *plot_tab;
+  gui::Map *map;
+  gui::Label *nb_sat_label, *fix_label;
+  bool take_ref;
+  nmeaINFO info;
+  nmeaPARSER parser;
+  nmeaGPGGA pack;
+  nmeaPOS pos;
+  double lat_ref, long_ref, alt_ref;
+  core::GpsData* gpsData;
+};
+} // end namespace sensor
+} // end namespace framewor
+#endif // NMEAGPS_H
Index: /trunk/lib/FlairSensorActuator/src/Novatel.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Novatel.cpp	(revision 50)
+++ /trunk/lib/FlairSensorActuator/src/Novatel.cpp	(revision 51)
@@ -28,7 +28,7 @@
 
 Novatel::Novatel(const FrameworkManager *parent, string name,
-                 SerialPort *serialport, Gps::NMEAFlags_t NMEAFlags,
+                 SerialPort *serialport, NmeaGps::NMEAFlags_t NMEAFlags,
                  uint8_t priority)
-    : Gps(parent, name, NMEAFlags), Thread(parent, name, priority) {
+    : NmeaGps(parent, name, NMEAFlags), Thread(parent, name, priority) {
   this->serialport = serialport;
 }
Index: /trunk/lib/FlairSensorActuator/src/Novatel.h
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Novatel.h	(revision 50)
+++ /trunk/lib/FlairSensorActuator/src/Novatel.h	(revision 51)
@@ -15,5 +15,5 @@
 
 #include <Thread.h>
-#include <Gps.h>
+#include <NmeaGps.h>
 
 namespace flair {
@@ -30,5 +30,5 @@
 * \brief Class for Novatel gps receiver
 */
-class Novatel : public core::Thread, public Gps {
+class Novatel : public core::Thread, public NmeaGps {
 public:
   /*!
@@ -44,5 +44,5 @@
   */
   Novatel(const core::FrameworkManager *parent, std::string name,
-          core::SerialPort *serialport, Gps::NMEAFlags_t NMEAFlags,
+          core::SerialPort *serialport, NmeaGps::NMEAFlags_t NMEAFlags,
           uint8_t priority);
 
Index: /trunk/lib/FlairSensorActuator/src/SimuGps.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/SimuGps.cpp	(revision 50)
+++ /trunk/lib/FlairSensorActuator/src/SimuGps.cpp	(revision 51)
@@ -20,4 +20,5 @@
 #include <string.h>
 #include <GeoCoordinate.h>
+#include <GpsData.h>
 
 using std::string;
@@ -28,6 +29,6 @@
 
 SimuGps::SimuGps(const FrameworkManager *parent, string name,
-                 Gps::NMEAFlags_t NMEAFlags, uint8_t priority)
-    : Thread(parent, name, priority), Gps(parent, name, NMEAFlags) {}
+                 NmeaGps::NMEAFlags_t NMEAFlags, uint8_t priority)
+    : Thread(parent, name, priority), NmeaGps(parent, name, NMEAFlags) {}
 
 SimuGps::~SimuGps() {
@@ -37,12 +38,24 @@
 
 void SimuGps::Run(void) {
-  char response[200] = {0};
-  int size, result;
   // double lat=0;
+  char buf[500];
+  nmeaGPGGA gga;
+  nmeaGPVTG vtg;
   SetPeriodMS(500);
   WarnUponSwitches(true);
 
+  gga.sig=1;
+  gga.satinuse=2;
+  gga.lat=49.402313;
+  gga.lon=2.795463;
+
+  vtg.spn=1;
+  vtg.dir=0;
+
   while (!ToBeStopped()) {
     WaitPeriod();
+
+    nmea_gen_GPGGA(buf,sizeof(buf),&gga);
+    parseFrame(buf,sizeof(buf));
     position->SetCoordinates(49.402313, 2.795463, 0);
     //      lat+=.5;
Index: /trunk/lib/FlairSensorActuator/src/SimuGps.h
===================================================================
--- /trunk/lib/FlairSensorActuator/src/SimuGps.h	(revision 50)
+++ /trunk/lib/FlairSensorActuator/src/SimuGps.h	(revision 51)
@@ -15,5 +15,5 @@
 
 #include <Thread.h>
-#include <Gps.h>
+#include <NmeaGps.h>
 
 namespace flair {
@@ -29,5 +29,5 @@
 * \brief Class for a simulation GPS
 */
-class SimuGps : public core::Thread, public Gps {
+class SimuGps : public core::Thread, public NmeaGps {
 public:
   /*!
@@ -42,5 +42,5 @@
   */
   SimuGps(const core::FrameworkManager *parent, std::string name,
-          Gps::NMEAFlags_t NMEAFlags, uint8_t priority);
+          NmeaGps::NMEAFlags_t NMEAFlags, uint8_t priority);
 
   /*!
Index: /trunk/lib/FlairSensorActuator/src/Srf08.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Srf08.cpp	(revision 50)
+++ /trunk/lib/FlairSensorActuator/src/Srf08.cpp	(revision 51)
@@ -99,7 +99,7 @@
 
   if (written < 0) {
-    Thread::Err("erreur rt_dev_write (%s)\n", strerror(-written));
+    Thread::Err("error write i2c (%s)\n", strerror(-written));
   } else if (written != 2) {
-    Thread::Err("erreur rt_dev_write %i/2\n", written);
+    Thread::Err("error write i2c %i/2\n", written);
   }
 }
@@ -120,8 +120,8 @@
     if (written < 0) {
       i2cport->ReleaseMutex();
-      Thread::Err("erreur rt_dev_write (%s)\n", strerror(-written));
+      Thread::Err("error write i2c (%s)\n", strerror(-written));
       nb_err++;
       if (nb_err == 20) {
-        Thread::Err("erreur rt_dev_write (%s), too many errors\n",
+        Thread::Err("error write i2c (%s), too many errors\n",
                     strerror(-written));
         return;
@@ -134,8 +134,8 @@
       if (read < 0) {
         if (read != -ETIMEDOUT)
-          Thread::Err("erreur rt_dev_read (%s) %i\n", strerror(-written), read);
+          Thread::Err("error read i2c (%s) %i\n", strerror(-read), read);
         nb_err++;
         if (nb_err == 20) {
-          Thread::Err("erreur rt_dev_read (%s), too many errors\n",
+          Thread::Err("error read i2c (%s), too many errors\n",
                       strerror(-written));
           return;
@@ -143,5 +143,5 @@
         SleepMS(1);
       } else if (read != 2) {
-        Thread::Err("erreur rt_dev_read %i/2\n", read);
+        Thread::Err("error read i2c %i/2\n", read);
         return;
       } else if (read == 2) {
@@ -187,7 +187,7 @@
 
   if (written < 0) {
-    Thread::Err("erreur rt_dev_write (%s)\n", strerror(-written));
+    Thread::Err("error write i2c (%s)\n", strerror(-written));
   } else if (written != 2) {
-    Thread::Err("erreur rt_dev_write %i/2\n", written);
+    Thread::Err("error write i2c %i/2\n", written);
   }
 }
@@ -211,7 +211,7 @@
 
   if (written < 0) {
-    Thread::Err("erreur write (%s)\n", strerror(-written));
+    Thread::Err("error write i2c (%s)\n", strerror(-written));
   } else if (written != 2) {
-    Thread::Err("erreur write %i/2\n", written);
+    Thread::Err("error write i2c %i/2\n", written);
   }
 }
Index: /trunk/lib/FlairSensorActuator/src/Srf08.h
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Srf08.h	(revision 50)
+++ /trunk/lib/FlairSensorActuator/src/Srf08.h	(revision 51)
@@ -40,5 +40,5 @@
   * \brief Constructor
   *
-  * Construct a SimuUs. Control part.
+  * Construct a SRF08 sensor
   *
   * \param parent parent
Index: /trunk/tools/FlairGCS/src/file_ui.cpp
===================================================================
--- /trunk/tools/FlairGCS/src/file_ui.cpp	(revision 50)
+++ /trunk/tools/FlairGCS/src/file_ui.cpp	(revision 51)
@@ -178,5 +178,9 @@
     out << time << "," << tr;
     for (int i = 0; i < data_type.size(); i++) {
-      if (data_type.at(i) == "float)") {
+      if (data_type.at(i) == "double)") {
+        double *value = (double *)(data + offset);
+        offset += sizeof(double);
+        out << "," << *value;
+      } else if (data_type.at(i) == "float)") {
         float *value = (float *)(data + offset);
         offset += sizeof(float);
@@ -185,5 +189,8 @@
         int8_t *value = (int8_t *)(data + offset);
         offset += sizeof(int8_t);
-        float fl = (float)*value;
+        out << "," << *value;
+      } else if (data_type.at(i) == "uint8_t)") {
+        uint8_t *value = (uint8_t *)(data + offset);
+        offset += sizeof(uint8_t);
         out << "," << *value;
       } else {
