Index: /trunk/ReleaseNotes
===================================================================
--- /trunk/ReleaseNotes	(revision 185)
+++ /trunk/ReleaseNotes	(revision 186)
@@ -15,5 +15,5 @@
 - Uav class is now a singleton
 - VrpnClient class is now a singleton
-- VrpnObject no longer outputs Euler (ony Quaternion): warning, output matrix has changed!
+- VrpnObject no longer outputs Euler (only Quaternion): warning, output matrix has changed!
 
 -----------------------------------------------------------
Index: /trunk/demos/Gps/uav/build_x86_64/bin/x8.sh
===================================================================
--- /trunk/demos/Gps/uav/build_x86_64/bin/x8.sh	(revision 185)
+++ /trunk/demos/Gps/uav/build_x86_64/bin/x8.sh	(revision 186)
@@ -4,7 +4,7 @@
 
 if [ -f /proc/xenomai/version ];then
-	EXEC=./CircleFollower_rt
+	EXEC=./DemoGps_rt
 else
-	EXEC=./CircleFollower_nrt
+	EXEC=./DemoGps_nrt
 fi
 
Index: /trunk/demos/Gps/uav/src/DemoGps.cpp
===================================================================
--- /trunk/demos/Gps/uav/src/DemoGps.cpp	(revision 185)
+++ /trunk/demos/Gps/uav/src/DemoGps.cpp	(revision 186)
@@ -29,6 +29,6 @@
 #include <AhrsData.h>
 #include <RTDM_SerialPort.h>
-#include <Mb800.h>
-#include <SimuGps.h>
+#include <Imu.h>
+#include <NmeaGps.h>
 
 using namespace std;
Index: /trunk/lib/FlairCore/src/FrameworkManager.cpp
===================================================================
--- /trunk/lib/FlairCore/src/FrameworkManager.cpp	(revision 185)
+++ /trunk/lib/FlairCore/src/FrameworkManager.cpp	(revision 186)
@@ -81,6 +81,5 @@
   for (vector<const Object *>::iterator it = Childs()->begin();
        it < Childs()->end(); it++) {
-    // Printf("child %i %s
-    // %s\n",Childs()->size(),(*it)->ObjectName().c_str(),(*it)->ObjectType().c_str());
+     //Printf("child %i %s %s\n",Childs()->size(),(*it)->ObjectName().c_str(),(*it)->ObjectType().c_str());
     if ((*it)->ObjectType() == "Thread") {
       if (*it != pimpl_) {
@@ -102,6 +101,5 @@
   for (vector<const Object *>::iterator it = Childs()->begin();
        it < Childs()->end(); it++) {
-    // Printf("child %i %s
-    // %s\n",Childs()->size(),(*it)->ObjectName().c_str(),(*it)->ObjectType().c_str());
+     //Printf("child %i %s %s\n",Childs()->size(),(*it)->ObjectName().c_str(),(*it)->ObjectType().c_str());
     if ((*it)->ObjectType() == "IODevice") {
       // Printf("del\n");
@@ -122,6 +120,5 @@
   // permet de garder l'uicom pour notifer des destructions
   while (Childs()->size() != 0) {
-    // Printf("child %i %s
-    // %s\n",Childs()->size(),Childs()->back()->ObjectName().c_str(),Childs()->back()->ObjectType().c_str());
+     //Printf("child %i %s %s\n",Childs()->size(),Childs()->back()->ObjectName().c_str(),Childs()->back()->ObjectType().c_str());
     if (Childs()->back() != NULL)
       delete Childs()->back();
@@ -135,5 +132,5 @@
 void FrameworkManager::SetupConnection(string address, uint16_t port,Time watchdogTimeout,
                                        size_t rcv_buf_size) {
-  pimpl_->SetupConnection(address, port, rcv_buf_size);
+  pimpl_->SetupConnection(address, port, watchdogTimeout,rcv_buf_size);
 }
 
Index: /trunk/lib/FlairCore/src/FrameworkManager_impl.cpp
===================================================================
--- /trunk/lib/FlairCore/src/FrameworkManager_impl.cpp	(revision 185)
+++ /trunk/lib/FlairCore/src/FrameworkManager_impl.cpp	(revision 186)
@@ -239,5 +239,5 @@
   gcs_watchdog = new Watchdog(
       this, std::bind(&FrameworkManager_impl::ConnectionLost, this),
-      (Time)1000000000);
+      watchdogTimeout);
   gcs_watchdog->Start();
 }
Index: /trunk/lib/FlairCore/src/OneAxisRotation_impl.cpp
===================================================================
--- /trunk/lib/FlairCore/src/OneAxisRotation_impl.cpp	(revision 185)
+++ /trunk/lib/FlairCore/src/OneAxisRotation_impl.cpp	(revision 186)
@@ -22,4 +22,5 @@
 #include <Euler.h>
 #include <Quaternion.h>
+#include <math.h>
 
 using std::string;
@@ -41,11 +42,18 @@
 OneAxisRotation_impl::~OneAxisRotation_impl() {}
 
-// compute rotation of each axis through ComputeRotation(Vector3D& vector)
 void OneAxisRotation_impl::ComputeRotation(Quaternion &quat) const {
-  Vector3Df rot = Vector3Df(quat.q1, quat.q2, quat.q3);
-  ComputeRotation(rot);
-  quat.q1 = rot.x;
-  quat.q2 = rot.y;
-  quat.q3 = rot.z;
+  Quaternion rot;
+  switch (rot_axe->CurrentIndex()) {
+    case 0:
+      rot=Quaternion(cosf(Euler::ToRadian(rot_value->Value()/2)),sinf(Euler::ToRadian(rot_value->Value()/2)), 0,0);
+      break;
+    case 1:
+      rot=Quaternion(cosf(Euler::ToRadian(rot_value->Value()/2)),0,sinf(Euler::ToRadian(rot_value->Value()/2)),0);
+      break;
+    case 2:
+      rot=Quaternion(cosf(Euler::ToRadian(rot_value->Value()/2)),0,0,sinf(Euler::ToRadian(rot_value->Value()/2)));
+      break;
+  }
+  quat=quat*rot;
 }
 
Index: /trunk/lib/FlairCore/src/Thread_impl.cpp
===================================================================
--- /trunk/lib/FlairCore/src/Thread_impl.cpp	(revision 185)
+++ /trunk/lib/FlairCore/src/Thread_impl.cpp	(revision 186)
@@ -57,7 +57,7 @@
   this->priority = priority;
   period = 100 * 1000 * 1000; // 100ms par defaut
-  min_jitter = 1000 * 1000 * 1000;
-  max_jitter = 0;
-  mean_jitter = 0;
+  min_latency = 1000 * 1000 * 1000;
+  max_latency = 0;
+  mean_latency = 0;
   last = 0;
   cpt = 0;
@@ -234,5 +234,5 @@
   next_time += period;
 #endif
-  ComputeJitter(GetTime());
+  ComputeLatency(GetTime());
 }
 
@@ -324,5 +324,5 @@
   {
 #ifndef __XENO__
-// if(last!=0)
+  if(last!=0)
 #endif
     { Printf("Thread::%s :\n", self->ObjectName().c_str()); }
@@ -346,7 +346,7 @@
 #endif
     if (last != 0) {
-      Printf("    min jitter (ns): %lld\n", min_jitter);
-      Printf("    max jitter (ns): %lld\n", max_jitter);
-      Printf("    jitter moy (ns): %lld\n", mean_jitter / cpt);
+      Printf("    min latency (ns): %lld\n", min_latency);
+      Printf("    max latency (ns): %lld\n", max_latency);
+      Printf("    latency moy (ns): %lld\n", mean_latency / cpt);
       Printf("    itertions: %lld\n", cpt);
     }
@@ -370,5 +370,5 @@
 }
 
-void Thread_impl::ComputeJitter(Time time) {
+void Thread_impl::ComputeLatency(Time time) {
   Time diff, delta;
   diff = time - last;
@@ -384,13 +384,13 @@
     return;
 
-  if (delta > max_jitter)
-    max_jitter = delta;
-  if (delta < min_jitter)
-    min_jitter = delta;
-  mean_jitter += delta;
+  if (delta > max_latency)
+    max_latency = delta;
+  if (delta < min_latency)
+    min_latency = delta;
+  mean_latency += delta;
   cpt++;
 
-  // Printf("Thread::%s jitter moy (ns):
-  // %lld\n",self->ObjectName().c_str(),mean_jitter/cpt);
+  // Printf("Thread::%s latency moy (ns):
+  // %lld\n",self->ObjectName().c_str(),mean_latency/cpt);
 }
 
Index: /trunk/lib/FlairCore/src/unexported/FrameworkManager_impl.h
===================================================================
--- /trunk/lib/FlairCore/src/unexported/FrameworkManager_impl.h	(revision 185)
+++ /trunk/lib/FlairCore/src/unexported/FrameworkManager_impl.h	(revision 186)
@@ -44,5 +44,5 @@
   ~FrameworkManager_impl();
   void SetupConnection(std::string address, uint16_t port,flair::core::Time watchdogTimeout,
-                       size_t rcv_buf_size = 10000);
+                       size_t rcv_buf_size);
   void SetupUserInterface(std::string xml_file);
   void SetupLogger(std::string log_path);
Index: /trunk/lib/FlairCore/src/unexported/Thread_impl.h
===================================================================
--- /trunk/lib/FlairCore/src/unexported/Thread_impl.h	(revision 185)
+++ /trunk/lib/FlairCore/src/unexported/Thread_impl.h	(revision 186)
@@ -55,5 +55,5 @@
   flair::core::ConditionVariable *cond;
   uint8_t priority;
-  flair::core::Time max_jitter, min_jitter, mean_jitter;
+  flair::core::Time max_latency, min_latency, mean_latency;
   flair::core::Time last;
   uint64_t cpt;
@@ -62,5 +62,5 @@
   bool is_suspended;
   void PrintStats(void);
-  void ComputeJitter(flair::core::Time time);
+  void ComputeLatency(flair::core::Time time);
 #ifdef __XENO__
   RT_TASK task_rt;
Index: /trunk/lib/FlairFilter/src/Gx3_25_ahrs.cpp
===================================================================
--- /trunk/lib/FlairFilter/src/Gx3_25_ahrs.cpp	(revision 185)
+++ /trunk/lib/FlairFilter/src/Gx3_25_ahrs.cpp	(revision 186)
@@ -30,5 +30,5 @@
                          SerialPort *serialport, Gx3_25_imu::Command_t command,
                          uint8_t priority)
-    : Ahrs(new Gx3_25_imu( name, serialport, command, priority), name) {
+    : Ahrs(new Gx3_25_imu( "imu", serialport, command, priority), name) {
 
   SetIsReady(true);
Index: /trunk/lib/FlairFilter/src/SimuAhrs.cpp
===================================================================
--- /trunk/lib/FlairFilter/src/SimuAhrs.cpp	(revision 185)
+++ /trunk/lib/FlairFilter/src/SimuAhrs.cpp	(revision 186)
@@ -29,5 +29,5 @@
 SimuAhrs::SimuAhrs(string name, uint32_t modelId,uint32_t deviceId,
                    uint8_t priority)
-    : Ahrs(new SimuImu(name, modelId,deviceId, priority), name) {
+    : Ahrs(new SimuImu("imu", modelId,deviceId, priority), name) {
   SetIsReady(true);
 }
Index: /trunk/lib/FlairMeta/src/HdsX8.cpp
===================================================================
--- /trunk/lib/FlairMeta/src/HdsX8.cpp	(revision 185)
+++ /trunk/lib/FlairMeta/src/HdsX8.cpp	(revision 186)
@@ -49,5 +49,5 @@
                        "motors", GetUavMultiplex()->MotorsCount(), i2cport));
   SetUsRangeFinder(new Srf08("SRF08", i2cport, 0x70, 60));
-  SetAhrs(new Gx3_25_ahrs("imu", imu_port,
+  SetAhrs(new Gx3_25_ahrs("ahrs", imu_port,
                           Gx3_25_imu::AccelerationAngularRateAndOrientationMatrix, 70));
   SetBatteryMonitor(((BlCtrlV2 *)GetBldc())->GetBatteryMonitor());
@@ -57,5 +57,5 @@
   if(useGps=="true") {
     RTDM_SerialPort *gps_port = new RTDM_SerialPort(getFrameworkManager(), "gps_port", "rtser2");
-    SetGps(new Mb800("gps",gps_port,(NmeaGps::NMEAFlags_t)(NmeaGps::GGA|NmeaGps::VTG),40));
+    SetGps(new Mb800("gps",gps_port,(NmeaGps::NMEAFlags_t)(NmeaGps::GGA|NmeaGps::VTG|NmeaGps::GSA),40));
   } 
 }
@@ -67,5 +67,5 @@
   ((Srf08 *)GetUsRangeFinder())->Start();
   ((Ps3Eye *)GetVerticalCamera())->Start();
-  ((Mb800 *)GetGps())->Start();
+  if(GetGps()) ((Mb800 *)GetGps())->Start();
 }
 
Index: /trunk/lib/FlairMeta/src/SimuX4.cpp
===================================================================
--- /trunk/lib/FlairMeta/src/SimuX4.cpp	(revision 185)
+++ /trunk/lib/FlairMeta/src/SimuX4.cpp	(revision 186)
@@ -49,5 +49,5 @@
                        "motors", GetUavMultiplex()->MotorsCount(), simu_id,0));
   SetUsRangeFinder(new SimuUs("us", simu_id,0, 60));
-  SetAhrs(new SimuAhrs("imu", simu_id, 0,70));
+  SetAhrs(new SimuAhrs("ahrs", simu_id, 0,70));
   Tab *bat_tab = new Tab(getFrameworkManager()->GetTabWidget(), "battery");
   SetBatteryMonitor(new BatteryMonitor(bat_tab->NewRow(), "battery"));
@@ -77,5 +77,5 @@
   ((SimuCamera *)GetVerticalCamera())->Start();
   ((SimuCamera *)GetHorizontalCamera())->Start();
-  ((SimuGps *)GetGps())->Start();
+  if(GetGps()) ((SimuGps *)GetGps())->Start();
 }
 
Index: /trunk/lib/FlairMeta/src/SimuX8.cpp
===================================================================
--- /trunk/lib/FlairMeta/src/SimuX8.cpp	(revision 185)
+++ /trunk/lib/FlairMeta/src/SimuX8.cpp	(revision 186)
@@ -49,5 +49,5 @@
                        "motors", GetUavMultiplex()->MotorsCount(), simu_id,0));
   SetUsRangeFinder(new SimuUs("us", simu_id,0, 60));
-  SetAhrs(new SimuAhrs("imu", simu_id, 0,70));
+  SetAhrs(new SimuAhrs("ahrs", simu_id, 0,70));
   Tab *bat_tab = new Tab(getFrameworkManager()->GetTabWidget(), "battery");
   SetBatteryMonitor(new BatteryMonitor(bat_tab->NewRow(), "battery"));
@@ -77,5 +77,5 @@
   ((SimuCamera *)GetVerticalCamera())->Start();
   ((SimuCamera *)GetHorizontalCamera())->Start();
-  ((SimuGps *)GetGps())->Start();
+  if(GetGps()) ((SimuGps *)GetGps())->Start();
 }
 
Index: /trunk/lib/FlairMeta/src/Uav.cpp
===================================================================
--- /trunk/lib/FlairMeta/src/Uav.cpp	(revision 185)
+++ /trunk/lib/FlairMeta/src/Uav.cpp	(revision 186)
@@ -73,4 +73,5 @@
   ahrs = (Ahrs *)inAhrs;
   imu = (Imu *)ahrs->GetImu();
+  //only add imu; as ahrs is son of imu, it will be logged together
   getFrameworkManager()->AddDeviceToLog(imu);
 }
Index: /trunk/lib/FlairMeta/src/UavStateMachine.cpp
===================================================================
--- /trunk/lib/FlairMeta/src/UavStateMachine.cpp	(revision 185)
+++ /trunk/lib/FlairMeta/src/UavStateMachine.cpp	(revision 186)
@@ -460,5 +460,5 @@
   flagZTrajectoryFinished = false;
 
-  if((altitudeState==AltitudeState_t::Stopped) && safeToFly && uav->isReadyToFly()  && uav->GetBatteryMonitor()->IsBatteryLow()==false) {
+  if((altitudeState==AltitudeState_t::Stopped) && safeToFly && uav->isReadyToFly()  && uav->GetBatteryMonitor()->IsBatteryLow()==false && !flagConnectionLost) {
     //The uav always takes off in fail safe mode
     flagBatteryLow=false;
@@ -573,9 +573,11 @@
   if (getFrameworkManager()->ConnectionLost() && !flagConnectionLost) {
     flagConnectionLost = true;
-    Thread::Err("Connection lost\n");
+    
     EnterFailSafeMode();
     if (altitudeState == AltitudeState_t::Stopped) {
-      SafeStop();
+      Thread::Warn("Connection lost\n");
+      Thread::Warn("UAV won't take off\n");
     } else {
+      Thread::Err("Connection lost\n");
       Land();
     }
Index: /trunk/lib/FlairSensorActuator/src/Gx3_25_imu_impl.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Gx3_25_imu_impl.cpp	(revision 185)
+++ /trunk/lib/FlairSensorActuator/src/Gx3_25_imu_impl.cpp	(revision 186)
@@ -80,4 +80,5 @@
   Time imuTime;
   ImuData *imuData;
+  Quaternion prevQuat;prevQuat.q0=-2;//for init
   self->GetDatas(&imuData);
 
@@ -115,7 +116,4 @@
   }
 
-  // periode a passer en argument (reglable)
-  // ou plutot laisser la periode geree par le centrale (polling)
-  // self->SetPeriodMS(2);
   SetContinuousMode(command);
 
@@ -169,4 +167,28 @@
 
       Quaternion quaternion=matrix.ToQuaternion();
+      
+      //try to keep quaternion continuous (select between quaternion or -quaternion)
+      if(prevQuat.q0!=-2) {//skip first iteration
+        //search the greatest absolute value to avoid problems near 0 (quaternion's norm=1)
+        if(fabs(prevQuat.q0)>=fabs(prevQuat.q1) && fabs(prevQuat.q0)>=fabs(prevQuat.q2) && fabs(prevQuat.q0)>=fabs(prevQuat.q3)) {
+          if(prevQuat.q0*quaternion.q0<0) {//if signs are different
+            quaternion=-quaternion;
+          }
+        } else if(fabs(prevQuat.q1)>=fabs(prevQuat.q0) && fabs(prevQuat.q1)>=fabs(prevQuat.q2) && fabs(prevQuat.q1)>=fabs(prevQuat.q3)) {
+          if(prevQuat.q1*quaternion.q1<0) {//if signs are different
+            quaternion=-quaternion;
+          }
+        } else if(fabs(prevQuat.q2)>=fabs(prevQuat.q0) && fabs(prevQuat.q2)>=fabs(prevQuat.q1) && fabs(prevQuat.q2)>=fabs(prevQuat.q3)) {
+          if(prevQuat.q2*quaternion.q2<0) {//if signs are different
+            quaternion=-quaternion;
+          }
+        } else if(fabs(prevQuat.q3)>=fabs(prevQuat.q0) && fabs(prevQuat.q3)>=fabs(prevQuat.q1) && fabs(prevQuat.q3)>=fabs(prevQuat.q2)) {
+          if(prevQuat.q3*quaternion.q3<0) {//if signs are different
+            quaternion=-quaternion;
+          }
+        }
+      }
+      prevQuat=quaternion;
+      
       self->ApplyRotation(filteredAngRates);
       self->ApplyRotation(quaternion);
Index: /trunk/lib/FlairSensorActuator/src/Imu.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Imu.cpp	(revision 185)
+++ /trunk/lib/FlairSensorActuator/src/Imu.cpp	(revision 186)
@@ -42,4 +42,5 @@
   setupGroupbox = new GroupBox(sensorTab->NewRow(), name);
   rotation = new OneAxisRotation(sensorTab->NewRow(), "post rotation");
+  AddDataToLog(imuData);
 }
 
Index: /trunk/lib/FlairSensorActuator/src/Mb800.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/Mb800.cpp	(revision 185)
+++ /trunk/lib/FlairSensorActuator/src/Mb800.cpp	(revision 186)
@@ -108,5 +108,5 @@
 
   while (!ToBeStopped()) {
-    SleepMS(10);
+    //SleepMS(10);??
     size = 0;
     while (!ToBeStopped()) {
Index: /trunk/lib/FlairSensorActuator/src/SimuImu.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/SimuImu.cpp	(revision 185)
+++ /trunk/lib/FlairSensorActuator/src/SimuImu.cpp	(revision 186)
@@ -79,4 +79,10 @@
     state.wy = input->ValueNoMutex(8, 0);
     state.wz = input->ValueNoMutex(9, 0);
+    state.ax = input->ValueNoMutex(13, 0);
+    state.ay = input->ValueNoMutex(14, 0);
+    state.az = input->ValueNoMutex(15, 0);
+    state.mx = input->ValueNoMutex(16, 0);
+    state.my = input->ValueNoMutex(17, 0);
+    state.mz = input->ValueNoMutex(18, 0);
     input->ReleaseMutex();
 
@@ -108,8 +114,14 @@
     Quaternion  quaternion(state.q0, state.q1, state.q2, state.q3);
     Vector3Df angRate(state.wx, state.wy, state.wz);
+    Vector3Df rawAcc(state.ax, state.ay, state.az);
+    Vector3Df rawMag(state.mx, state.my, state.mz);
+    Vector3Df rawGyr(state.wx, state.wy, state.wz);
     ApplyRotation(angRate);
     ApplyRotation(quaternion);
+    ApplyRotation(rawAcc);
+    ApplyRotation(rawMag);
+    ApplyRotation(rawGyr);
     ahrsData->SetQuaternionAndAngularRates(quaternion,angRate);
-
+    imuData->SetRawAccMagAndGyr(rawAcc,rawMag,rawGyr);
     imuData->SetDataTime(GetTime());
     ahrsData->SetDataTime(GetTime());
Index: /trunk/lib/FlairSensorActuator/src/SimuImu.h
===================================================================
--- /trunk/lib/FlairSensorActuator/src/SimuImu.h	(revision 185)
+++ /trunk/lib/FlairSensorActuator/src/SimuImu.h	(revision 186)
@@ -94,4 +94,10 @@
     float wy;
     float wz;
+    float ax;
+    float ay;
+    float az;
+    float mx;
+    float my;
+    float mz;
   } imu_states_t;
   
Index: /trunk/lib/FlairSensorActuator/src/TargetController.cpp
===================================================================
--- /trunk/lib/FlairSensorActuator/src/TargetController.cpp	(revision 185)
+++ /trunk/lib/FlairSensorActuator/src/TargetController.cpp	(revision 186)
@@ -118,5 +118,6 @@
   Message *message;
 
-  if (getFrameworkManager()->ErrorOccured() || !ControllerInitialization()) {
+  //if (getFrameworkManager()->ErrorOccured() || !ControllerInitialization()) {
+  if (!ControllerInitialization()) {
     SafeStop();
     Thread::Err("An error occured, we don't proceed with the loop.\n");
Index: /trunk/lib/FlairSimulator/src/Model_impl.cpp
===================================================================
--- /trunk/lib/FlairSimulator/src/Model_impl.cpp	(revision 185)
+++ /trunk/lib/FlairSimulator/src/Model_impl.cpp	(revision 186)
@@ -114,5 +114,5 @@
   self->state[-2] = self->state[0];
 
-  cvmatrix_descriptor *desc = new cvmatrix_descriptor(13, 1);
+  cvmatrix_descriptor *desc = new cvmatrix_descriptor(19, 1);
   desc->SetElementName(0, 0, "q0");
   desc->SetElementName(1, 0, "q1");
@@ -128,4 +128,10 @@
   desc->SetElementName(11, 0, "vy");
   desc->SetElementName(12, 0, "vz");
+  desc->SetElementName(13, 0, "ax");
+  desc->SetElementName(14, 0, "ay");
+  desc->SetElementName(15, 0, "az");
+  desc->SetElementName(16, 0, "mx");
+  desc->SetElementName(17, 0, "my");
+  desc->SetElementName(18, 0, "mz");
   output = new cvmatrix(this, desc, floatType, "state");
   delete desc;
@@ -318,4 +324,11 @@
     output->SetValueNoMutex(11, 0, self->state[0].Vel.y);
     output->SetValueNoMutex(12, 0, self->state[0].Vel.z);
+    //todo: put acc and mag
+    output->SetValueNoMutex(13, 0, 0);
+    output->SetValueNoMutex(14, 0, 0);
+    output->SetValueNoMutex(15, 0, 0);
+    output->SetValueNoMutex(16, 0, 0);
+    output->SetValueNoMutex(17, 0, 0);
+    output->SetValueNoMutex(18, 0, 0);
     output->ReleaseMutex();
     output->SetDataTime(GetTime());
