From 4aadee10478d8be2720f8981215d034d4ef88228 Mon Sep 17 00:00:00 2001
From: Fabrizio Monti <fabrizio.monti@skywarder.eu>
Date: Tue, 27 Feb 2024 23:34:53 +0100
Subject: [PATCH] [VN300] Moved functions used to collect gyroscope,
 accelerometer, magnetometer and quaternion data inside VNCommonSerial.

---
 src/shared/sensors/Vectornav/VN300/VN300.cpp  | 114 ------------------
 src/shared/sensors/Vectornav/VN300/VN300.h    |  23 ----
 .../sensors/Vectornav/VNCommonSerial.cpp      | 113 +++++++++++++++++
 src/shared/sensors/Vectornav/VNCommonSerial.h |  40 ++++++
 4 files changed, 153 insertions(+), 137 deletions(-)

diff --git a/src/shared/sensors/Vectornav/VN300/VN300.cpp b/src/shared/sensors/Vectornav/VN300/VN300.cpp
index 032184fc7..430760dbd 100755
--- a/src/shared/sensors/Vectornav/VN300/VN300.cpp
+++ b/src/shared/sensors/Vectornav/VN300/VN300.cpp
@@ -277,8 +277,6 @@ VN300Data VN300::sampleImpl()
 
 VN300Data VN300::sampleBinary()
 {
-    // TODO: rewrite completely
-
     // This function is used to clear the usart buffer, it needs to be replaced
     // with the function from usart class
     // TODO
@@ -822,118 +820,6 @@ bool VN300::selfTestImpl()
     return true;
 }
 
-QuaternionData VN300::sampleQuaternion()
-{
-    unsigned int indexStart = 0;
-    char *nextNumber;
-    QuaternionData data;
-
-    // Look for the second ',' in the string
-    // I can avoid the string control because it has already been done in
-    // sampleImpl
-    for (int i = 0; i < 2; i++)
-    {
-        while (indexStart < recvStringLength && recvString[indexStart] != ',')
-        {
-            indexStart++;
-        }
-        indexStart++;
-    }
-
-    // Parse the data
-    data.quaternionTimestamp = TimestampTimer::getTimestamp();
-    data.quaternionX = strtod(recvString.data() + indexStart + 1, &nextNumber);
-    data.quaternionY = strtod(nextNumber + 1, &nextNumber);
-    data.quaternionZ = strtod(nextNumber + 1, &nextNumber);
-    data.quaternionW = strtod(nextNumber + 1, NULL);
-
-    return data;
-}
-
-MagnetometerData VN300::sampleMagnetometer()
-{
-    unsigned int indexStart = 0;
-    char *nextNumber;
-    MagnetometerData data;
-
-    // Look for the sixth ',' in the string
-    // I can avoid the string control because it has already been done in
-    // sampleImpl
-    for (int i = 0; i < 6; i++)
-    {
-        while (indexStart < recvStringLength && recvString[indexStart] != ',')
-        {
-            indexStart++;
-        }
-        indexStart++;
-    }
-
-    // Parse the data
-    data.magneticFieldTimestamp = TimestampTimer::getTimestamp();
-    data.magneticFieldX =
-        strtod(recvString.data() + indexStart + 1, &nextNumber);
-    data.magneticFieldY = strtod(nextNumber + 1, &nextNumber);
-    data.magneticFieldZ = strtod(nextNumber + 1, NULL);
-
-    return data;
-}
-
-AccelerometerData VN300::sampleAccelerometer()
-{
-    unsigned int indexStart = 0;
-    char *nextNumber;
-    AccelerometerData data;
-
-    // Look for the ninth ',' in the string
-    // I can avoid the string control because it has already been done in
-    // sampleImpl
-    for (int i = 0; i < 9; i++)
-    {
-        while (indexStart < recvStringLength && recvString[indexStart] != ',')
-        {
-            indexStart++;
-        }
-        indexStart++;
-    }
-
-    // Parse the data
-    data.accelerationTimestamp = TimestampTimer::getTimestamp();
-    data.accelerationX =
-        strtod(recvString.data() + indexStart + 1, &nextNumber);
-    data.accelerationY = strtod(nextNumber + 1, &nextNumber);
-    data.accelerationZ = strtod(nextNumber + 1, NULL);
-
-    return data;
-}
-
-GyroscopeData VN300::sampleGyroscope()
-{
-    unsigned int indexStart = 0;
-    char *nextNumber;
-    GyroscopeData data;
-
-    // Look for the twelfth ',' in the string
-    // I can avoid the string control because it has already been done in
-    // sampleImpl
-    for (int i = 0; i < 12; i++)
-    {
-        while (indexStart < recvStringLength && recvString[indexStart] != ',')
-        {
-            indexStart++;
-        }
-        indexStart++;
-    }
-
-    // Parse the data
-    data.angularSpeedTimestamp = TimestampTimer::getTimestamp();
-    data.angularSpeedX =
-        strtod(recvString.data() + indexStart + 1, &nextNumber);
-    data.angularSpeedY = strtod(nextNumber + 1, &nextNumber);
-    data.angularSpeedZ = strtod(nextNumber + 1, NULL);
-
-    return data;
-}
-
 VN300Defs::Ins_Lla VN300::sampleIns()
 {
     unsigned int indexStart = 0;
diff --git a/src/shared/sensors/Vectornav/VN300/VN300.h b/src/shared/sensors/Vectornav/VN300/VN300.h
index 3d5abd288..9e88c7072 100755
--- a/src/shared/sensors/Vectornav/VN300/VN300.h
+++ b/src/shared/sensors/Vectornav/VN300/VN300.h
@@ -210,14 +210,6 @@ private:
      */
     bool selfTestImpl();
 
-    QuaternionData sampleQuaternion();
-
-    MagnetometerData sampleMagnetometer();
-
-    AccelerometerData sampleAccelerometer();
-
-    GyroscopeData sampleGyroscope();
-
     VN300Defs::Ins_Lla sampleIns();
 
     VN300Data sampleBinary();
@@ -311,20 +303,5 @@ private:
      * @brief Binary output polling command
      */
     string preSampleBin1 = "";
-
-    /**
-     * @brief Maximum size of the receiving string.
-     */
-    static const uint8_t recvStringMaxDimension = 200;
-
-    /**
-     * @brief Buffer used to store the string received from the sensor.
-     */
-    std::array<char, recvStringMaxDimension> recvString;
-
-    /**
-     * @brief Actual strlen() of the recvString.
-     */
-    uint8_t recvStringLength = 0;
 };
 }  // namespace Boardcore
diff --git a/src/shared/sensors/Vectornav/VNCommonSerial.cpp b/src/shared/sensors/Vectornav/VNCommonSerial.cpp
index 17ca4dcdc..21fb61f5c 100644
--- a/src/shared/sensors/Vectornav/VNCommonSerial.cpp
+++ b/src/shared/sensors/Vectornav/VNCommonSerial.cpp
@@ -22,6 +22,7 @@
 
 #include "VNCommonSerial.h"
 
+#include <drivers/timer/TimestampTimer.h>
 #include <utils/Debug.h>
 
 namespace Boardcore
@@ -141,4 +142,116 @@ bool VNCommonSerial::asyncPause()
     return true;
 }
 
+QuaternionData VNCommonSerial::sampleQuaternion()
+{
+    unsigned int indexStart = 0;
+    char *nextNumber;
+    QuaternionData data;
+
+    // Look for the second ',' in the string
+    // I can avoid the string control because it has already been done in
+    // sampleImpl
+    for (int i = 0; i < 2; i++)
+    {
+        while (indexStart < recvStringLength && recvString[indexStart] != ',')
+        {
+            indexStart++;
+        }
+        indexStart++;
+    }
+
+    // Parse the data
+    data.quaternionTimestamp = TimestampTimer::getTimestamp();
+    data.quaternionX = strtod(recvString.data() + indexStart + 1, &nextNumber);
+    data.quaternionY = strtod(nextNumber + 1, &nextNumber);
+    data.quaternionZ = strtod(nextNumber + 1, &nextNumber);
+    data.quaternionW = strtod(nextNumber + 1, NULL);
+
+    return data;
+}
+
+MagnetometerData VNCommonSerial::sampleMagnetometer()
+{
+    unsigned int indexStart = 0;
+    char *nextNumber;
+    MagnetometerData data;
+
+    // Look for the sixth ',' in the string
+    // I can avoid the string control because it has already been done in
+    // sampleImpl
+    for (int i = 0; i < 6; i++)
+    {
+        while (indexStart < recvStringLength && recvString[indexStart] != ',')
+        {
+            indexStart++;
+        }
+        indexStart++;
+    }
+
+    // Parse the data
+    data.magneticFieldTimestamp = TimestampTimer::getTimestamp();
+    data.magneticFieldX =
+        strtod(recvString.data() + indexStart + 1, &nextNumber);
+    data.magneticFieldY = strtod(nextNumber + 1, &nextNumber);
+    data.magneticFieldZ = strtod(nextNumber + 1, NULL);
+
+    return data;
+}
+
+AccelerometerData VNCommonSerial::sampleAccelerometer()
+{
+    unsigned int indexStart = 0;
+    char *nextNumber;
+    AccelerometerData data;
+
+    // Look for the ninth ',' in the string
+    // I can avoid the string control because it has already been done in
+    // sampleImpl
+    for (int i = 0; i < 9; i++)
+    {
+        while (indexStart < recvStringLength && recvString[indexStart] != ',')
+        {
+            indexStart++;
+        }
+        indexStart++;
+    }
+
+    // Parse the data
+    data.accelerationTimestamp = TimestampTimer::getTimestamp();
+    data.accelerationX =
+        strtod(recvString.data() + indexStart + 1, &nextNumber);
+    data.accelerationY = strtod(nextNumber + 1, &nextNumber);
+    data.accelerationZ = strtod(nextNumber + 1, NULL);
+
+    return data;
+}
+
+GyroscopeData VNCommonSerial::sampleGyroscope()
+{
+    unsigned int indexStart = 0;
+    char *nextNumber;
+    GyroscopeData data;
+
+    // Look for the twelfth ',' in the string
+    // I can avoid the string control because it has already been done in
+    // sampleImpl
+    for (int i = 0; i < 12; i++)
+    {
+        while (indexStart < recvStringLength && recvString[indexStart] != ',')
+        {
+            indexStart++;
+        }
+        indexStart++;
+    }
+
+    // Parse the data
+    data.angularSpeedTimestamp = TimestampTimer::getTimestamp();
+    data.angularSpeedX =
+        strtod(recvString.data() + indexStart + 1, &nextNumber);
+    data.angularSpeedY = strtod(nextNumber + 1, &nextNumber);
+    data.angularSpeedZ = strtod(nextNumber + 1, NULL);
+
+    return data;
+}
+
 }  // namespace Boardcore
diff --git a/src/shared/sensors/Vectornav/VNCommonSerial.h b/src/shared/sensors/Vectornav/VNCommonSerial.h
index db983fa07..1f2e4c7f0 100644
--- a/src/shared/sensors/Vectornav/VNCommonSerial.h
+++ b/src/shared/sensors/Vectornav/VNCommonSerial.h
@@ -24,6 +24,7 @@
 
 #include <diagnostic/PrintLogger.h>
 #include <drivers/usart/USART.h>
+#include <sensors/SensorData.h>
 
 #include <string>
 
@@ -98,6 +99,30 @@ protected:
      */
     bool asyncPause();
 
+    /**
+     * @brief Utility function used to extract quaternion data from the
+     * receiving string.
+     */
+    QuaternionData sampleQuaternion();
+
+    /**
+     * @brief Utility function used to extract magnetometer data from the
+     * receiving string.
+     */
+    MagnetometerData sampleMagnetometer();
+
+    /**
+     * @brief Utility function used to extract accelerometer data from the
+     * receiving string.
+     */
+    AccelerometerData sampleAccelerometer();
+
+    /**
+     * @brief Utility function used to extract gyroscope data from the receiving
+     * string.
+     */
+    GyroscopeData sampleGyroscope();
+
     /**
      * @brief Serial interface that is needed to communicate
      * with the sensor via ASCII codes.
@@ -108,6 +133,21 @@ protected:
     CRCOptions crc;
 
     PrintLogger logger;
+
+    /**
+     * @brief Maximum size of the receiving string.
+     */
+    static const uint8_t recvStringMaxDimension = 200;
+
+    /**
+     * @brief Buffer used to store the string received from the sensor.
+     */
+    std::array<char, recvStringMaxDimension> recvString;
+
+    /**
+     * @brief Actual strlen() of the recvString.
+     */
+    uint8_t recvStringLength = 0;
 };
 
 }  // namespace Boardcore
-- 
GitLab