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