From 0be53e33eedb32dcca45afd021f4de1a8d09a888 Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Mon, 18 Jan 2021 10:09:21 +0100
Subject: [PATCH] union variables local to thread

---
 include/model_car_driver_base.h             |  5 +---
 src/examples/model_car_egomotion_test.cpp   | 26 ++++++++++-----------
 src/examples/model_car_ultrasounds_test.cpp | 10 ++++----
 src/model_car_driver_base.cpp               | 11 ++++++---
 4 files changed, 27 insertions(+), 25 deletions(-)

diff --git a/include/model_car_driver_base.h b/include/model_car_driver_base.h
index d207d92..b2cd771 100644
--- a/include/model_car_driver_base.h
+++ b/include/model_car_driver_base.h
@@ -44,9 +44,6 @@ class CModelCarDriverBase
     
     uint id;
     uint sw_version;
-    tCRCUnion       crc_union;
-    TDataUnion      data_union;
-    THeader         header;
 
     /* event attributes */
     CEventServer *event_server;
@@ -62,7 +59,7 @@ class CModelCarDriverBase
     CMutex data_mutex;
     
     static void *data_thread(void *param);
-    bool process_byte(unsigned char byte);
+    bool process_byte(THeader &header, TDataUnion &data_union, tCRCUnion &crc_union, unsigned char byte);
     bool get_id(uint8_t & id);
     void send_request(uint8_t id, uint8_t data_length, uint8_t *data);
     sm_state process_data(THeader & header, TDataUnion & data_union, tCRCUnion & crc_union);
diff --git a/src/examples/model_car_egomotion_test.cpp b/src/examples/model_car_egomotion_test.cpp
index d75268e..dafd7a8 100644
--- a/src/examples/model_car_egomotion_test.cpp
+++ b/src/examples/model_car_egomotion_test.cpp
@@ -24,38 +24,38 @@ int main(int argc, char *argv[])
       bool lwheel_dir=false;
       if(egomotion_driver->get_left_wheel(lwheel_tach, lwheel_dir))
       {
-        std::cout << "Left wheel tachometer:  " << lwheel_tach << std::endl;
-        std::cout << "Left wheel direction:   " << lwheel_dir  << std::endl;
+        std::cout << "  Left wheel tachometer:  " << lwheel_tach << std::endl;
+        std::cout << "  Left wheel direction:   " << lwheel_dir  << std::endl;
       }
 
       int  rwheel_tach=0;
       bool rwheel_dir=false;
       if(egomotion_driver->get_right_wheel(rwheel_tach,rwheel_dir))
       {
-        std::cout << "Right wheel tachometer: " << rwheel_tach << std::endl;
-        std::cout << "Right wheel direction:  " << rwheel_dir << std::endl;
+        std::cout << "  Right wheel tachometer: " << rwheel_tach << std::endl;
+        std::cout << "  Right wheel direction:  " << rwheel_dir << std::endl;
       }
 
       float ax=0.0 ,ay=.0 ,az=0.0 ,gx=0.0 ,gy=0.0 ,gz=0.0 ,mx=0.0 ,my=0.0 ,mz=0.0;
       if(egomotion_driver->get_imu_accel(ax,ay,az))
       {
-        std::cout << "Imu ax: " << ax << std::endl;
-        std::cout << "Imu ay: " << ay << std::endl;
-        std::cout << "Imu az: " << az << std::endl;
+        std::cout << "  Imu ax: " << ax << std::endl;
+        std::cout << "  Imu ay: " << ay << std::endl;
+        std::cout << "  Imu az: " << az << std::endl;
       }
 
       if(egomotion_driver->get_imu_gyro(gx,gy,gz))
       {
-        std::cout << "Imu gx: " << gx << std::endl;
-        std::cout << "Imu gy: " << gy << std::endl;
-        std::cout << "Imu gz: " << gz << std::endl;
+        std::cout << "  Imu gx: " << gx << std::endl;
+        std::cout << "  Imu gy: " << gy << std::endl;
+        std::cout << "  Imu gz: " << gz << std::endl;
       }
 
       if(egomotion_driver->get_imu_magn(mx,my,mz))
       {
-        std::cout << "Imu mx: " << mx << std::endl;
-        std::cout << "Imu my: " << my << std::endl;
-        std::cout << "Imu mz: " << mz << std::endl;
+        std::cout << "  Imu mx: " << mx << std::endl;
+        std::cout << "  Imu my: " << my << std::endl;
+        std::cout << "  Imu mz: " << mz << std::endl;
       }
 
       std::cout <<"  ---" <<std::endl;
diff --git a/src/examples/model_car_ultrasounds_test.cpp b/src/examples/model_car_ultrasounds_test.cpp
index 3458bfe..cfb9cf7 100644
--- a/src/examples/model_car_ultrasounds_test.cpp
+++ b/src/examples/model_car_ultrasounds_test.cpp
@@ -22,15 +22,15 @@ int main(int argc, char *argv[])
       event_server->wait_all(events,1000);
       float us_value;
       if(uss_driver->get_uss(ID_ARD_SENS_US_SIDE_RIGHT, us_value))
-        std::cout << "  ID_ARD_SENS_US_SIDE_RIGHT value:        " << us_value << std::endl;
+        std::cout << "  ID_ARD_SENS_US_SIDE_RIGHT:        " << us_value << std::endl;
       if(uss_driver->get_uss(ID_ARD_SENS_US_REAR_CENTER_RIGHT, us_value))
-        std::cout << "  ID_ARD_SENS_US_REAR_CENTER_RIGHT value: " << us_value << std::endl;
+        std::cout << "  ID_ARD_SENS_US_REAR_CENTER_RIGHT: " << us_value << std::endl;
       if(uss_driver->get_uss(ID_ARD_SENS_US_REAR_CENTER, us_value))
-        std::cout << "  ID_ARD_SENS_US_REAR_CENTER value:       " << us_value << std::endl;
+        std::cout << "  ID_ARD_SENS_US_REAR_CENTER:       " << us_value << std::endl;
       if(uss_driver->get_uss(ID_ARD_SENS_US_REAR_CENTER_LEFT, us_value))
-        std::cout << "  ID_ARD_SENS_US_REAR_CENTER_LEFT value:  " << us_value << std::endl;
+        std::cout << "  ID_ARD_SENS_US_REAR_CENTER_LEFT:  " << us_value << std::endl;
       if(uss_driver->get_uss(ID_ARD_SENS_US_SIDE_LEFT, us_value))
-        std::cout << "  ID_ARD_SENS_US_SIDE_LEFT value:         " << us_value << std::endl;
+        std::cout << "  ID_ARD_SENS_US_SIDE_LEFT:         " << us_value << std::endl;
       std::cout <<"  ---" <<std::endl;
     }
 
diff --git a/src/model_car_driver_base.cpp b/src/model_car_driver_base.cpp
index b25c970..8019994 100644
--- a/src/model_car_driver_base.cpp
+++ b/src/model_car_driver_base.cpp
@@ -168,6 +168,11 @@ void *CModelCarDriverBase::data_thread(void *param)
   
   unsigned char * frame_data=NULL;
   unsigned int num;
+
+  THeader    header;
+  TDataUnion data_union;
+  tCRCUnion  crc_union;
+
   std::list<std::string> events;
   events.push_back(driver->serial_port->get_rx_event_id());
 
@@ -192,9 +197,9 @@ void *CModelCarDriverBase::data_thread(void *param)
 
       for(unsigned int i=0; i<num; i++)
       {
-        bool frame_ready = driver->process_byte(frame_data[i]);
+        bool frame_ready = driver->process_byte(header, data_union, crc_union, frame_data[i]);
         if(frame_ready)
-          driver->process_data(driver->header, driver->data_union, driver->crc_union);
+          driver->process_data(header, data_union, crc_union);
         else
         {
           if(i==num-1)
@@ -221,7 +226,7 @@ void *CModelCarDriverBase::data_thread(void *param)
 
 
 
-bool CModelCarDriverBase::process_byte(unsigned char byte)
+bool CModelCarDriverBase::process_byte(THeader &header, TDataUnion &data_union, tCRCUnion &crc_union, unsigned char byte)
 {
   bool frame_ready=false;
   
-- 
GitLab