From ec3b078468f15fa24e3cdd43ddb041afc8f5ad98 Mon Sep 17 00:00:00 2001 From: myles-parfeniuk Date: Sat, 31 May 2025 12:48:13 -0700 Subject: [PATCH] refactor FlyteSailing PR for internal wrappers, move enum helper fxns Signed-off-by: myles-parfeniuk --- include/BNO08x.hpp | 12 +- include/BNO08xGlobalTypes.hpp | 397 +++++++++++++++++++++++++++------- source/BNO08x.cpp | 181 ++++------------ 3 files changed, 367 insertions(+), 223 deletions(-) diff --git a/include/BNO08x.hpp b/include/BNO08x.hpp index 215fbf4..04a4a5b 100644 --- a/include/BNO08x.hpp +++ b/include/BNO08x.hpp @@ -52,11 +52,10 @@ class BNO08x bool dynamic_calibration_autosave_enable(); bool dynamic_calibration_autosave_disable(); bool dynamic_calibration_save(); - bool dynamic_calibration_clear(); + bool dynamic_calibration_clear_data_ram(); + bool dynamic_calibration_delete_data(); bool dynamic_calibration_run_routine(); - bool delete_calibration_data(); - constexpr static float SQRT2OVER2 = 0.7071067811865476f; // sqrt(2)/2, used for setting system orientation bool set_system_orientation(float w, float x, float y, float z); bool get_system_orientation(float &w, float &x, float &y, float &z); @@ -71,12 +70,7 @@ class BNO08x void print_product_ids(); void print_system_orientation(); - - // enum helper fxns - static const char* activity_to_str(BNO08xActivity activity); - static const char* stability_to_str(BNO08xStability stability); - static const char* accuracy_to_str(BNO08xAccuracy accuracy); - + /// @brief Contains report implementations. typedef struct bno08x_reports_t { diff --git a/include/BNO08xGlobalTypes.hpp b/include/BNO08xGlobalTypes.hpp index ee54a0f..e8acc26 100644 --- a/include/BNO08xGlobalTypes.hpp +++ b/include/BNO08xGlobalTypes.hpp @@ -90,7 +90,7 @@ enum class BNO08xCalSel : uint8_t }; /// @brief Reason for previous IMU reset (returned by get_reset_reason()) -enum class BNO08xResetReason : uint8_t +enum class BNO08xResetReason : uint8_t { UNDEFINED, ///< Undefined reset reason, this should never occur and is an error. POR, ///< Previous reset was due to power on reset. @@ -102,7 +102,7 @@ enum class BNO08xResetReason : uint8_t /// @brief Sensor accuracy returned from input reports, corresponds to status bits (see ref. /// manual 6.5.1) -enum class BNO08xAccuracy : uint8_t +enum class BNO08xAccuracy : uint8_t { UNRELIABLE, LOW, @@ -112,9 +112,28 @@ enum class BNO08xAccuracy : uint8_t }; using IMUAccuracy = BNO08xAccuracy; // legacy version compatibility +const constexpr char* BNO08xAccuracy_to_str(BNO08xAccuracy accuracy) +{ + switch (accuracy) + { + case BNO08xAccuracy::UNRELIABLE: + return "UNRELIABLE"; + case BNO08xAccuracy::LOW: + return "LOW"; + case BNO08xAccuracy::MED: + return "MED"; + case BNO08xAccuracy::HIGH: + return "HIGH"; + case BNO08xAccuracy::UNDEFINED: + return "UNDEFINED"; + default: + return "UNDEFINED"; + } +} + /// @brief BNO08xActivity Classifier enable bits passed to enable_activity_classifier() /// See ref manual 6.5.36.1 -enum class BNO08xActivityEnable : uint32_t +enum class BNO08xActivityEnable : uint32_t { UNKNOWN = (1U << 0U), IN_VEHICLE = (1U << 1U), @@ -125,11 +144,11 @@ enum class BNO08xActivityEnable : uint32_t WALKING = (1U << 6U), RUNNING = (1U << 7U), ON_STAIRS = (1U << 8U), - ALL = ( UNKNOWN | IN_VEHICLE | ON_BICYCLE | ON_FOOT | STILL | TILTING | WALKING | RUNNING | ON_STAIRS) + ALL = (UNKNOWN | IN_VEHICLE | ON_BICYCLE | ON_FOOT | STILL | TILTING | WALKING | RUNNING | ON_STAIRS) }; /// @brief BNO08xActivity states returned from BNO08x::activity_classifier.get() -enum class BNO08xActivity : uint8_t +enum class BNO08xActivity : uint8_t { UNKNOWN = 0, // 0 = unknown IN_VEHICLE = 1, // 1 = in vehicle @@ -143,8 +162,42 @@ enum class BNO08xActivity : uint8_t UNDEFINED = 9 // used for unit tests }; +/** + * @brief Converts a BNO08xActivity enum to string. + * + * @return The resulting string conversion of the enum. + */ +const constexpr char* BNO08xActivity_to_str(BNO08xActivity activity) +{ + switch (activity) + { + case BNO08xActivity::UNKNOWN: + return "UNKNOWN"; + case BNO08xActivity::IN_VEHICLE: + return "IN_VEHICLE"; + case BNO08xActivity::ON_BICYCLE: + return "ON_BICYCLE"; + case BNO08xActivity::ON_FOOT: + return "ON_FOOT"; + case BNO08xActivity::STILL: + return "STILL"; + case BNO08xActivity::TILTING: + return "TILTING"; + case BNO08xActivity::WALKING: + return "WALKING"; + case BNO08xActivity::RUNNING: + return "RUNNING"; + case BNO08xActivity::ON_STAIRS: + return "ON_STAIRS"; + case BNO08xActivity::UNDEFINED: + return "UNDEFINED"; + default: + return "UNDEFINED"; + } +} + /// @brief BNO08xStability states returned from BNO08x::stability_classifier.get() -enum class BNO08xStability : uint8_t +enum class BNO08xStability : uint8_t { UNKNOWN = 0, // 0 = unknown ON_TABLE = 1, // 1 = on table @@ -155,82 +208,266 @@ enum class BNO08xStability : uint8_t UNDEFINED = 6 // used for unit tests }; -enum class BNO08xFrsID : uint16_t { - STATIC_CALIBRATION_AGM = 0x7979, - NOMINAL_CALIBRATION = 0x4D4D, - STATIC_CALIBRATION_SRA = 0x8A8A, - NOMINAL_CALIBRATION_SRA = 0x4E4E, - DYNAMIC_CALIBRATION = 0x1F1F, - ME_POWER_MGMT = 0xD3E2, - SYSTEM_ORIENTATION = 0x2D3E, - ACCEL_ORIENTATION = 0x2D41, - SCREEN_ACCEL_ORIENTATION = 0x2D43, - GYROSCOPE_ORIENTATION = 0x2D46, - MAGNETOMETER_ORIENTATION = 0x2D4C, - ARVR_STABILIZATION_RV = 0x3E2D, - ARVR_STABILIZATION_GRV = 0x3E2E, - TAP_DETECT_CONFIG = 0xC269, - SIG_MOTION_DETECT_CONFIG = 0xC274, - SHAKE_DETECT_CONFIG = 0x7D7D, - MAX_FUSION_PERIOD = 0xD7D7, - SERIAL_NUMBER = 0x4B4B, - ES_PRESSURE_CAL = 0x39AF, - ES_TEMPERATURE_CAL = 0x4D20, - ES_HUMIDITY_CAL = 0x1AC9, - ES_AMBIENT_LIGHT_CAL = 0x39B1, - ES_PROXIMITY_CAL = 0x4DA2, - ALS_CAL = 0xD401, - PROXIMITY_SENSOR_CAL = 0xD402, - PICKUP_DETECTOR_CONFIG = 0x1B2A, - FLIP_DETECTOR_CONFIG = 0xFC94, - STABILITY_DETECTOR_CONFIG = 0xED85, - ACTIVITY_TRACKER_CONFIG = 0xED88, - SLEEP_DETECTOR_CONFIG = 0xED87, - TILT_DETECTOR_CONFIG = 0xED89, - POCKET_DETECTOR_CONFIG = 0xEF27, - CIRCLE_DETECTOR_CONFIG = 0xEE51, - USER_RECORD = 0x74B4, - ME_TIME_SOURCE_SELECT = 0xD403, - UART_FORMAT = 0xA1A1, - GYRO_INTEGRATED_RV_CONFIG = 0xA1A2, - META_RAW_ACCELEROMETER = 0xE301, - META_ACCELEROMETER = 0xE302, - META_LINEAR_ACCELERATION = 0xE303, - META_GRAVITY = 0xE304, - META_RAW_GYROSCOPE = 0xE305, - META_GYROSCOPE_CALIBRATED = 0xE306, - META_GYROSCOPE_UNCALIBRATED = 0xE307, - META_RAW_MAGNETOMETER = 0xE308, - META_MAGNETIC_FIELD_CALIBRATED = 0xE309, - META_MAGNETIC_FIELD_UNCALIBRATED = 0xE30A, - META_ROTATION_VECTOR = 0xE30B, - META_GAME_ROTATION_VECTOR = 0xE30C, - META_GEOMAGNETIC_ROTATION_VECTOR = 0xE30D, - META_PRESSURE = 0xE30E, - META_AMBIENT_LIGHT = 0xE30F, - META_HUMIDITY = 0xE310, - META_PROXIMITY = 0xE311, - META_TEMPERATURE = 0xE312, - META_TAP_DETECTOR = 0xE313, - META_STEP_DETECTOR = 0xE314, - META_STEP_COUNTER = 0xE315, - META_SIGNIFICANT_MOTION = 0xE316, - META_STABILITY_CLASSIFIER = 0xE317, - META_SHAKE_DETECTOR = 0xE318, - META_FLIP_DETECTOR = 0xE319, - META_PICKUP_DETECTOR = 0xE31A, - META_STABILITY_DETECTOR = 0xE31B, - META_PERSONAL_ACTIVITY_CLASSIFIER = 0xE31C, - META_SLEEP_DETECTOR = 0xE31D, - META_TILT_DETECTOR = 0xE31E, - META_POCKET_DETECTOR = 0xE31F, - META_CIRCLE_DETECTOR = 0xE320, - META_HEART_RATE_MONITOR = 0xE321, - META_ARVR_STABILIZED_RV = 0xE322, - META_ARVR_STABILIZED_GRV = 0xE323, - META_GYRO_INTEGRATED_RV = 0xE324 +/** + * @brief Converts a BNO08xStability enum to string. + * + * @return The resulting string conversion of the enum. + */ +const constexpr char* BNO08xStability_to_str(BNO08xStability stability) +{ + switch (stability) + { + case BNO08xStability::UNKNOWN: + return "UNKNOWN"; + case BNO08xStability::ON_TABLE: + return "ON_TABLE"; + case BNO08xStability::STATIONARY: + return "STATIONARY"; + case BNO08xStability::STABLE: + return "STABLE"; + case BNO08xStability::MOTION: + return "MOTION"; + case BNO08xStability::RESERVED: + return "RESERVED"; + case BNO08xStability::UNDEFINED: + return "UNDEFINED"; + default: + return "UNDEFINED"; + } +} + +enum class BNO08xFrsID : uint16_t +{ + STATIC_CALIBRATION_AGM = 0x7979, + NOMINAL_CALIBRATION = 0x4D4D, + STATIC_CALIBRATION_SRA = 0x8A8A, + NOMINAL_CALIBRATION_SRA = 0x4E4E, + DYNAMIC_CALIBRATION = 0x1F1F, + ME_POWER_MGMT = 0xD3E2, + SYSTEM_ORIENTATION = 0x2D3E, + ACCEL_ORIENTATION = 0x2D41, + SCREEN_ACCEL_ORIENTATION = 0x2D43, + GYROSCOPE_ORIENTATION = 0x2D46, + MAGNETOMETER_ORIENTATION = 0x2D4C, + ARVR_STABILIZATION_RV = 0x3E2D, + ARVR_STABILIZATION_GRV = 0x3E2E, + TAP_DETECT_CONFIG = 0xC269, + SIG_MOTION_DETECT_CONFIG = 0xC274, + SHAKE_DETECT_CONFIG = 0x7D7D, + MAX_FUSION_PERIOD = 0xD7D7, + SERIAL_NUMBER = 0x4B4B, + ES_PRESSURE_CAL = 0x39AF, + ES_TEMPERATURE_CAL = 0x4D20, + ES_HUMIDITY_CAL = 0x1AC9, + ES_AMBIENT_LIGHT_CAL = 0x39B1, + ES_PROXIMITY_CAL = 0x4DA2, + ALS_CAL = 0xD401, + PROXIMITY_SENSOR_CAL = 0xD402, + PICKUP_DETECTOR_CONFIG = 0x1B2A, + FLIP_DETECTOR_CONFIG = 0xFC94, + STABILITY_DETECTOR_CONFIG = 0xED85, + ACTIVITY_TRACKER_CONFIG = 0xED88, + SLEEP_DETECTOR_CONFIG = 0xED87, + TILT_DETECTOR_CONFIG = 0xED89, + POCKET_DETECTOR_CONFIG = 0xEF27, + CIRCLE_DETECTOR_CONFIG = 0xEE51, + USER_RECORD = 0x74B4, + ME_TIME_SOURCE_SELECT = 0xD403, + UART_FORMAT = 0xA1A1, + GYRO_INTEGRATED_RV_CONFIG = 0xA1A2, + META_RAW_ACCELEROMETER = 0xE301, + META_ACCELEROMETER = 0xE302, + META_LINEAR_ACCELERATION = 0xE303, + META_GRAVITY = 0xE304, + META_RAW_GYROSCOPE = 0xE305, + META_GYROSCOPE_CALIBRATED = 0xE306, + META_GYROSCOPE_UNCALIBRATED = 0xE307, + META_RAW_MAGNETOMETER = 0xE308, + META_MAGNETIC_FIELD_CALIBRATED = 0xE309, + META_MAGNETIC_FIELD_UNCALIBRATED = 0xE30A, + META_ROTATION_VECTOR = 0xE30B, + META_GAME_ROTATION_VECTOR = 0xE30C, + META_GEOMAGNETIC_ROTATION_VECTOR = 0xE30D, + META_PRESSURE = 0xE30E, + META_AMBIENT_LIGHT = 0xE30F, + META_HUMIDITY = 0xE310, + META_PROXIMITY = 0xE311, + META_TEMPERATURE = 0xE312, + META_TAP_DETECTOR = 0xE313, + META_STEP_DETECTOR = 0xE314, + META_STEP_COUNTER = 0xE315, + META_SIGNIFICANT_MOTION = 0xE316, + META_STABILITY_CLASSIFIER = 0xE317, + META_SHAKE_DETECTOR = 0xE318, + META_FLIP_DETECTOR = 0xE319, + META_PICKUP_DETECTOR = 0xE31A, + META_STABILITY_DETECTOR = 0xE31B, + META_PERSONAL_ACTIVITY_CLASSIFIER = 0xE31C, + META_SLEEP_DETECTOR = 0xE31D, + META_TILT_DETECTOR = 0xE31E, + META_POCKET_DETECTOR = 0xE31F, + META_CIRCLE_DETECTOR = 0xE320, + META_HEART_RATE_MONITOR = 0xE321, + META_ARVR_STABILIZED_RV = 0xE322, + META_ARVR_STABILIZED_GRV = 0xE323, + META_GYRO_INTEGRATED_RV = 0xE324 }; +const constexpr char* BNO08xFrsID_to_str(BNO08xFrsID id) +{ + switch (id) + { + case BNO08xFrsID::STATIC_CALIBRATION_AGM: + return "STATIC_CALIBRATION_AGM"; + case BNO08xFrsID::NOMINAL_CALIBRATION: + return "NOMINAL_CALIBRATION"; + case BNO08xFrsID::STATIC_CALIBRATION_SRA: + return "STATIC_CALIBRATION_SRA"; + case BNO08xFrsID::NOMINAL_CALIBRATION_SRA: + return "NOMINAL_CALIBRATION_SRA"; + case BNO08xFrsID::DYNAMIC_CALIBRATION: + return "DYNAMIC_CALIBRATION"; + case BNO08xFrsID::ME_POWER_MGMT: + return "ME_POWER_MGMT"; + case BNO08xFrsID::SYSTEM_ORIENTATION: + return "SYSTEM_ORIENTATION"; + case BNO08xFrsID::ACCEL_ORIENTATION: + return "ACCEL_ORIENTATION"; + case BNO08xFrsID::SCREEN_ACCEL_ORIENTATION: + return "SCREEN_ACCEL_ORIENTATION"; + case BNO08xFrsID::GYROSCOPE_ORIENTATION: + return "GYROSCOPE_ORIENTATION"; + case BNO08xFrsID::MAGNETOMETER_ORIENTATION: + return "MAGNETOMETER_ORIENTATION"; + case BNO08xFrsID::ARVR_STABILIZATION_RV: + return "ARVR_STABILIZATION_RV"; + case BNO08xFrsID::ARVR_STABILIZATION_GRV: + return "ARVR_STABILIZATION_GRV"; + case BNO08xFrsID::TAP_DETECT_CONFIG: + return "TAP_DETECT_CONFIG"; + case BNO08xFrsID::SIG_MOTION_DETECT_CONFIG: + return "SIG_MOTION_DETECT_CONFIG"; + case BNO08xFrsID::SHAKE_DETECT_CONFIG: + return "SHAKE_DETECT_CONFIG"; + case BNO08xFrsID::MAX_FUSION_PERIOD: + return "MAX_FUSION_PERIOD"; + case BNO08xFrsID::SERIAL_NUMBER: + return "SERIAL_NUMBER"; + case BNO08xFrsID::ES_PRESSURE_CAL: + return "ES_PRESSURE_CAL"; + case BNO08xFrsID::ES_TEMPERATURE_CAL: + return "ES_TEMPERATURE_CAL"; + case BNO08xFrsID::ES_HUMIDITY_CAL: + return "ES_HUMIDITY_CAL"; + case BNO08xFrsID::ES_AMBIENT_LIGHT_CAL: + return "ES_AMBIENT_LIGHT_CAL"; + case BNO08xFrsID::ES_PROXIMITY_CAL: + return "ES_PROXIMITY_CAL"; + case BNO08xFrsID::ALS_CAL: + return "ALS_CAL"; + case BNO08xFrsID::PROXIMITY_SENSOR_CAL: + return "PROXIMITY_SENSOR_CAL"; + case BNO08xFrsID::PICKUP_DETECTOR_CONFIG: + return "PICKUP_DETECTOR_CONFIG"; + case BNO08xFrsID::FLIP_DETECTOR_CONFIG: + return "FLIP_DETECTOR_CONFIG"; + case BNO08xFrsID::STABILITY_DETECTOR_CONFIG: + return "STABILITY_DETECTOR_CONFIG"; + case BNO08xFrsID::ACTIVITY_TRACKER_CONFIG: + return "ACTIVITY_TRACKER_CONFIG"; + case BNO08xFrsID::SLEEP_DETECTOR_CONFIG: + return "SLEEP_DETECTOR_CONFIG"; + case BNO08xFrsID::TILT_DETECTOR_CONFIG: + return "TILT_DETECTOR_CONFIG"; + case BNO08xFrsID::POCKET_DETECTOR_CONFIG: + return "POCKET_DETECTOR_CONFIG"; + case BNO08xFrsID::CIRCLE_DETECTOR_CONFIG: + return "CIRCLE_DETECTOR_CONFIG"; + case BNO08xFrsID::USER_RECORD: + return "USER_RECORD"; + case BNO08xFrsID::ME_TIME_SOURCE_SELECT: + return "ME_TIME_SOURCE_SELECT"; + case BNO08xFrsID::UART_FORMAT: + return "UART_FORMAT"; + case BNO08xFrsID::GYRO_INTEGRATED_RV_CONFIG: + return "GYRO_INTEGRATED_RV_CONFIG"; + case BNO08xFrsID::META_RAW_ACCELEROMETER: + return "META_RAW_ACCELEROMETER"; + case BNO08xFrsID::META_ACCELEROMETER: + return "META_ACCELEROMETER"; + case BNO08xFrsID::META_LINEAR_ACCELERATION: + return "META_LINEAR_ACCELERATION"; + case BNO08xFrsID::META_GRAVITY: + return "META_GRAVITY"; + case BNO08xFrsID::META_RAW_GYROSCOPE: + return "META_RAW_GYROSCOPE"; + case BNO08xFrsID::META_GYROSCOPE_CALIBRATED: + return "META_GYROSCOPE_CALIBRATED"; + case BNO08xFrsID::META_GYROSCOPE_UNCALIBRATED: + return "META_GYROSCOPE_UNCALIBRATED"; + case BNO08xFrsID::META_RAW_MAGNETOMETER: + return "META_RAW_MAGNETOMETER"; + case BNO08xFrsID::META_MAGNETIC_FIELD_CALIBRATED: + return "META_MAGNETIC_FIELD_CALIBRATED"; + case BNO08xFrsID::META_MAGNETIC_FIELD_UNCALIBRATED: + return "META_MAGNETIC_FIELD_UNCALIBRATED"; + case BNO08xFrsID::META_ROTATION_VECTOR: + return "META_ROTATION_VECTOR"; + case BNO08xFrsID::META_GAME_ROTATION_VECTOR: + return "META_GAME_ROTATION_VECTOR"; + case BNO08xFrsID::META_GEOMAGNETIC_ROTATION_VECTOR: + return "META_GEOMAGNETIC_ROTATION_VECTOR"; + case BNO08xFrsID::META_PRESSURE: + return "META_PRESSURE"; + case BNO08xFrsID::META_AMBIENT_LIGHT: + return "META_AMBIENT_LIGHT"; + case BNO08xFrsID::META_HUMIDITY: + return "META_HUMIDITY"; + case BNO08xFrsID::META_PROXIMITY: + return "META_PROXIMITY"; + case BNO08xFrsID::META_TEMPERATURE: + return "META_TEMPERATURE"; + case BNO08xFrsID::META_TAP_DETECTOR: + return "META_TAP_DETECTOR"; + case BNO08xFrsID::META_STEP_DETECTOR: + return "META_STEP_DETECTOR"; + case BNO08xFrsID::META_STEP_COUNTER: + return "META_STEP_COUNTER"; + case BNO08xFrsID::META_SIGNIFICANT_MOTION: + return "META_SIGNIFICANT_MOTION"; + case BNO08xFrsID::META_STABILITY_CLASSIFIER: + return "META_STABILITY_CLASSIFIER"; + case BNO08xFrsID::META_SHAKE_DETECTOR: + return "META_SHAKE_DETECTOR"; + case BNO08xFrsID::META_FLIP_DETECTOR: + return "META_FLIP_DETECTOR"; + case BNO08xFrsID::META_PICKUP_DETECTOR: + return "META_PICKUP_DETECTOR"; + case BNO08xFrsID::META_STABILITY_DETECTOR: + return "META_STABILITY_DETECTOR"; + case BNO08xFrsID::META_PERSONAL_ACTIVITY_CLASSIFIER: + return "META_PERSONAL_ACTIVITY_CLASSIFIER"; + case BNO08xFrsID::META_SLEEP_DETECTOR: + return "META_SLEEP_DETECTOR"; + case BNO08xFrsID::META_TILT_DETECTOR: + return "META_TILT_DETECTOR"; + case BNO08xFrsID::META_POCKET_DETECTOR: + return "META_POCKET_DETECTOR"; + case BNO08xFrsID::META_CIRCLE_DETECTOR: + return "META_CIRCLE_DETECTOR"; + case BNO08xFrsID::META_HEART_RATE_MONITOR: + return "META_HEART_RATE_MONITOR"; + case BNO08xFrsID::META_ARVR_STABILIZED_RV: + return "META_ARVR_STABILIZED_RV"; + case BNO08xFrsID::META_ARVR_STABILIZED_GRV: + return "META_ARVR_STABILIZED_GRV"; + case BNO08xFrsID::META_GYRO_INTEGRATED_RV: + return "META_GYRO_INTEGRATED_RV"; + default: + return "UNKNOWN"; + } +} + /// @brief Struct to represent unit quaternion. typedef struct bno08x_quat_t { diff --git a/source/BNO08x.cpp b/source/BNO08x.cpp index 8cd08a1..970f1bb 100644 --- a/source/BNO08x.cpp +++ b/source/BNO08x.cpp @@ -1408,12 +1408,12 @@ bool BNO08x::dynamic_calibration_save() } /** - * @brief Clears dynamic/motion engine calibration data and resets BNO08x device. See ref + * @brief Clears dynamic/motion engine calibration data from ram and resets BNO08x device. See ref * manual 6.4.9.1 * * @return True if save dynamic/ME calibration data succeeded. */ -bool BNO08x::dynamic_calibration_clear() +bool BNO08x::dynamic_calibration_clear_data_ram() { int op_success = SH2_ERR; @@ -1440,7 +1440,7 @@ bool BNO08x::dynamic_calibration_clear() { // clang-format off #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS - ESP_LOGE(TAG, "Clear dynamic calibration failure, incorrect reset reason returned."); + ESP_LOGE(TAG, "dynamic_calibration_clear_data_ram(): Clear dynamic calibration failure, incorrect reset reason returned."); #endif // clang-format on } @@ -1449,7 +1449,7 @@ bool BNO08x::dynamic_calibration_clear() { // clang-format off #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS - ESP_LOGE(TAG, "Clear dynamic calibration failure, reset never detected after sending command."); + ESP_LOGE(TAG, "dynamic_calibration_clear_data_ram(): Clear dynamic calibration failure, reset never detected after sending command."); #endif // clang-format on } @@ -1458,7 +1458,7 @@ bool BNO08x::dynamic_calibration_clear() { // clang-format off #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS - ESP_LOGE(TAG, "Clear dynamic calibration failure, failed to send reset command"); + ESP_LOGE(TAG, "dynamic_calibration_clear_data_ram(): Clear dynamic calibration failure, failed to clearDcdAndReset command with %li", static_cast(op_success)); #endif // clang-format on } @@ -1609,7 +1609,7 @@ bool BNO08x::dynamic_calibration_run_routine() // clang-format off #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS - ESP_LOGI(TAG, "dynamic_calibration_run_routine(): magf_avg_acc: %s quat_avg_acc: %s", accuracy_to_str(magf_accuracy_avg), accuracy_to_str(quat_accuracy_avg)); + ESP_LOGI(TAG, "dynamic_calibration_run_routine(): magf_avg_acc: %s quat_avg_acc: %s", BNO08xAccuracy_to_str(magf_accuracy_avg), BNO08xAccuracy_to_str(quat_accuracy_avg)); #endif // clang-format on @@ -1686,7 +1686,7 @@ bool BNO08x::dynamic_calibration_run_routine() * Follows the steps outlined in ref. manual 6.4.9 * @return True if delete dynamic calibration data operation succeeded. */ -bool BNO08x::delete_calibration_data() +bool BNO08x::dynamic_calibration_delete_data() { // 1. Reset hub (using hard_reset) if (!hard_reset()) { @@ -1697,28 +1697,13 @@ bool BNO08x::delete_calibration_data() } // 2. Delete flash copy of DCD via FRS - int op_success = SH2_ERR; - lock_sh2_HAL(); // Deleting FRS record: use sh2_setFrs with nullptr and 0 words - op_success = sh2_setFrs(DYNAMIC_CALIBRATION, nullptr, 0U); - unlock_sh2_HAL(); - if (op_success != SH2_OK) { - #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS - ESP_LOGE(TAG, "delete_calibration_data(): failed to delete DCD FRS record, op_success: %li", (int32_t)op_success); - #endif - return false; - } + if(!write_frs(BNO08xFrsID::DYNAMIC_CALIBRATION, nullptr, 0U)) + return false; // 3. Issue Clear DCD and Reset Command (atomic clear DCD from RAM and reset) - lock_sh2_HAL(); - op_success = sh2_clearDcdAndReset(); - unlock_sh2_HAL(); - if (op_success != SH2_OK) { - #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS - ESP_LOGE(TAG, "delete_calibration_data(): failed to clear DCD and reset, op_success: %li", (int32_t)op_success); - #endif - return false; - } + if(!dynamic_calibration_clear_data_ram()) + return false; #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS ESP_LOGI(TAG, "delete_calibration_data(): calibration data cleared successfully"); @@ -1747,6 +1732,16 @@ bool BNO08x::get_frs(BNO08xFrsID frs_ID, uint32_t (&data)[16], uint16_t& rx_data op_success = sh2_getFrs(static_cast(frs_ID), data, &rx_data_sz); unlock_sh2_HAL(); + if (op_success != SH2_OK) + { + // clang-format off + #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS + ESP_LOGE(TAG, "get_frs(): Failed to retrieve FRS record for ID: %s, op_success: %li", BNO08xFrsID_to_str(frs_ID), static_cast(op_success)); + #endif + // clang-format off + return false; + } + return (op_success == SH2_OK); } @@ -1770,6 +1765,16 @@ bool BNO08x::write_frs(BNO08xFrsID frs_ID, uint32_t *data, const uint16_t tx_dat op_success = sh2_setFrs(static_cast(frs_ID), data, tx_data_sz); unlock_sh2_HAL(); + if (op_success != SH2_OK) + { + // clang-format off + #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS + ESP_LOGE(TAG, "write_frs(): Failed to write FRS record for ID: %s, op_success: %li", BNO08xFrsID_to_str(frs_ID), static_cast(op_success)); + #endif + // clang-format off + return false; + } + return (op_success == SH2_OK); } @@ -2002,121 +2007,29 @@ bool BNO08x::set_system_orientation(float w, float x, float y, float z) static_cast(float_to_q30(w)) // W component }; - int op_success = SH2_ERR; - lock_sh2_HAL(); - op_success = sh2_setFrs(SYSTEM_ORIENTATION, (uint32_t*)&orientation_raw, 4); - unlock_sh2_HAL(); - - if (op_success != SH2_OK) - { - #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS - ESP_LOGE(TAG, "Failed to set mounting orientation, op_success: %li", (int32_t)op_success); - #endif - return false; - } - return true; -} - -bool BNO08x::get_system_orientation(float& w, float& x, float& y, float& z) -{ - uint16_t words = 4; - uint32_t raw[4] = {0}; - - lock_sh2_HAL(); - int op_success = sh2_getFrs(SYSTEM_ORIENTATION, raw, &words); - unlock_sh2_HAL(); - - if (op_success != SH2_OK) { - return false; - } - - x = q30_to_float((int32_t)raw[0]); - y = q30_to_float((int32_t)raw[1]); - z = q30_to_float((int32_t)raw[2]); - w = q30_to_float((int32_t)raw[3]); + if(!write_frs(BNO08xFrsID::SYSTEM_ORIENTATION, orientation_raw, sizeof(orientation_raw))) + return false; return true; } -/** - * @brief Converts a BNO08xActivity enum to string. - * - * @return The resulting string conversion of the enum. - */ -const char* BNO08x::activity_to_str(BNO08xActivity activity) +bool BNO08x::get_system_orientation(float& real, float& i, float& j, float& k) { - switch (activity) - { - case BNO08xActivity::UNKNOWN: - return "UNKNOWN"; - case BNO08xActivity::IN_VEHICLE: - return "IN_VEHICLE"; - case BNO08xActivity::ON_BICYCLE: - return "ON_BICYCLE"; - case BNO08xActivity::ON_FOOT: - return "ON_FOOT"; - case BNO08xActivity::STILL: - return "STILL"; - case BNO08xActivity::TILTING: - return "TILTING"; - case BNO08xActivity::WALKING: - return "WALKING"; - case BNO08xActivity::RUNNING: - return "RUNNING"; - case BNO08xActivity::ON_STAIRS: - return "ON_STAIRS"; - case BNO08xActivity::UNDEFINED: - return "UNDEFINED"; - default: - return "UNDEFINED"; - } -} + uint16_t words_rxd = 0U; + uint32_t raw[16] = {0}; -/** - * @brief Converts a BNO08xStability enum to string. - * - * @return The resulting string conversion of the enum. - */ -const char* BNO08x::stability_to_str(BNO08xStability stability) -{ - switch (stability) - { - case BNO08xStability::UNKNOWN: - return "UNKNOWN"; - case BNO08xStability::ON_TABLE: - return "ON_TABLE"; - case BNO08xStability::STATIONARY: - return "STATIONARY"; - case BNO08xStability::STABLE: - return "STABLE"; - case BNO08xStability::MOTION: - return "MOTION"; - case BNO08xStability::RESERVED: - return "RESERVED"; - case BNO08xStability::UNDEFINED: - return "UNDEFINED"; - default: - return "UNDEFINED"; - } -} + if(!get_frs(BNO08xFrsID::SYSTEM_ORIENTATION, raw, words_rxd)) + return false; + + if(words_rxd >= 4U) + return false; -const char* BNO08x::accuracy_to_str(BNO08xAccuracy accuracy) -{ - switch (accuracy) - { - case BNO08xAccuracy::UNRELIABLE: - return "UNRELIABLE"; - case BNO08xAccuracy::LOW: - return "LOW"; - case BNO08xAccuracy::MED: - return "MED"; - case BNO08xAccuracy::HIGH: - return "HIGH"; - case BNO08xAccuracy::UNDEFINED: - return "UNDEFINED"; - default: - return "UNDEFINED"; - } + i = q30_to_float((int32_t)raw[0]); + j = q30_to_float((int32_t)raw[1]); + k = q30_to_float((int32_t)raw[2]); + real = q30_to_float((int32_t)raw[3]); + + return true; } /**