From a136b8f7c7602e7cc753409282f88f92139164c3 Mon Sep 17 00:00:00 2001 From: myles Date: Sun, 13 Apr 2025 11:34:41 -0700 Subject: [PATCH] frs write feature, PAC bugfix Signed-off-by: myles --- SH2/sh2.c | 64 ++++---- SH2/sh2.h | 146 +++++++++--------- include/BNO08x.hpp | 4 +- include/BNO08xGlobalTypes.hpp | 91 ++++++++++- source/BNO08x.cpp | 32 +++- source/report/BNO08xRptActivityClassifier.cpp | 2 +- test/FeatureTests.cpp | 4 - 7 files changed, 220 insertions(+), 123 deletions(-) diff --git a/SH2/sh2.c b/SH2/sh2.c index d2f00f0..f0522ef 100644 --- a/SH2/sh2.c +++ b/SH2/sh2.c @@ -1023,38 +1023,38 @@ const static struct { sh2_SensorId_t sensorId; uint16_t recordId; } sensorToRecordMap[] = { - { SH2_RAW_ACCELEROMETER, FRS_ID_META_RAW_ACCELEROMETER }, - { SH2_ACCELEROMETER, FRS_ID_META_ACCELEROMETER }, - { SH2_LINEAR_ACCELERATION, FRS_ID_META_LINEAR_ACCELERATION }, - { SH2_GRAVITY, FRS_ID_META_GRAVITY }, - { SH2_RAW_GYROSCOPE, FRS_ID_META_RAW_GYROSCOPE }, - { SH2_GYROSCOPE_CALIBRATED, FRS_ID_META_GYROSCOPE_CALIBRATED }, - { SH2_GYROSCOPE_UNCALIBRATED, FRS_ID_META_GYROSCOPE_UNCALIBRATED }, - { SH2_RAW_MAGNETOMETER, FRS_ID_META_RAW_MAGNETOMETER }, - { SH2_MAGNETIC_FIELD_CALIBRATED, FRS_ID_META_MAGNETIC_FIELD_CALIBRATED }, - { SH2_MAGNETIC_FIELD_UNCALIBRATED, FRS_ID_META_MAGNETIC_FIELD_UNCALIBRATED }, - { SH2_ROTATION_VECTOR, FRS_ID_META_ROTATION_VECTOR }, - { SH2_GAME_ROTATION_VECTOR, FRS_ID_META_GAME_ROTATION_VECTOR }, - { SH2_GEOMAGNETIC_ROTATION_VECTOR, FRS_ID_META_GEOMAGNETIC_ROTATION_VECTOR }, - { SH2_PRESSURE, FRS_ID_META_PRESSURE }, - { SH2_AMBIENT_LIGHT, FRS_ID_META_AMBIENT_LIGHT }, - { SH2_HUMIDITY, FRS_ID_META_HUMIDITY }, - { SH2_PROXIMITY, FRS_ID_META_PROXIMITY }, - { SH2_TEMPERATURE, FRS_ID_META_TEMPERATURE }, - { SH2_TAP_DETECTOR, FRS_ID_META_TAP_DETECTOR }, - { SH2_STEP_DETECTOR, FRS_ID_META_STEP_DETECTOR }, - { SH2_STEP_COUNTER, FRS_ID_META_STEP_COUNTER }, - { SH2_SIGNIFICANT_MOTION, FRS_ID_META_SIGNIFICANT_MOTION }, - { SH2_STABILITY_CLASSIFIER, FRS_ID_META_STABILITY_CLASSIFIER }, - { SH2_SHAKE_DETECTOR, FRS_ID_META_SHAKE_DETECTOR }, - { SH2_FLIP_DETECTOR, FRS_ID_META_FLIP_DETECTOR }, - { SH2_PICKUP_DETECTOR, FRS_ID_META_PICKUP_DETECTOR }, - { SH2_STABILITY_DETECTOR, FRS_ID_META_STABILITY_DETECTOR }, - { SH2_PERSONAL_ACTIVITY_CLASSIFIER, FRS_ID_META_PERSONAL_ACTIVITY_CLASSIFIER }, - { SH2_SLEEP_DETECTOR, FRS_ID_META_SLEEP_DETECTOR }, - { SH2_TILT_DETECTOR, FRS_ID_META_TILT_DETECTOR }, - { SH2_POCKET_DETECTOR, FRS_ID_META_POCKET_DETECTOR }, - { SH2_CIRCLE_DETECTOR, FRS_ID_META_CIRCLE_DETECTOR }, + { SH2_RAW_ACCELEROMETER, SH2_FRS_ID_META_RAW_ACCELEROMETER }, + { SH2_ACCELEROMETER, SH2_FRS_ID_META_ACCELEROMETER }, + { SH2_LINEAR_ACCELERATION, SH2_FRS_ID_META_LINEAR_ACCELERATION }, + { SH2_GRAVITY, SH2_FRS_ID_META_GRAVITY }, + { SH2_RAW_GYROSCOPE, SH2_FRS_ID_META_RAW_GYROSCOPE }, + { SH2_GYROSCOPE_CALIBRATED, SH2_FRS_ID_META_GYROSCOPE_CALIBRATED }, + { SH2_GYROSCOPE_UNCALIBRATED, SH2_FRS_ID_META_GYROSCOPE_UNCALIBRATED }, + { SH2_RAW_MAGNETOMETER, SH2_FRS_ID_META_RAW_MAGNETOMETER }, + { SH2_MAGNETIC_FIELD_CALIBRATED, SH2_FRS_ID_META_MAGNETIC_FIELD_CALIBRATED }, + { SH2_MAGNETIC_FIELD_UNCALIBRATED, SH2_FRS_ID_META_MAGNETIC_FIELD_UNCALIBRATED }, + { SH2_ROTATION_VECTOR, SH2_FRS_ID_META_ROTATION_VECTOR }, + { SH2_GAME_ROTATION_VECTOR, SH2_FRS_ID_META_GAME_ROTATION_VECTOR }, + { SH2_GEOMAGNETIC_ROTATION_VECTOR, SH2_FRS_ID_META_GEOMAGNETIC_ROTATION_VECTOR }, + { SH2_PRESSURE, SH2_FRS_ID_META_PRESSURE }, + { SH2_AMBIENT_LIGHT, SH2_FRS_ID_META_AMBIENT_LIGHT }, + { SH2_HUMIDITY, SH2_FRS_ID_META_HUMIDITY }, + { SH2_PROXIMITY, SH2_FRS_ID_META_PROXIMITY }, + { SH2_TEMPERATURE, SH2_FRS_ID_META_TEMPERATURE }, + { SH2_TAP_DETECTOR, SH2_FRS_ID_META_TAP_DETECTOR }, + { SH2_STEP_DETECTOR, SH2_FRS_ID_META_STEP_DETECTOR }, + { SH2_STEP_COUNTER, SH2_FRS_ID_META_STEP_COUNTER }, + { SH2_SIGNIFICANT_MOTION, SH2_FRS_ID_META_SIGNIFICANT_MOTION }, + { SH2_STABILITY_CLASSIFIER, SH2_FRS_ID_META_STABILITY_CLASSIFIER }, + { SH2_SHAKE_DETECTOR, SH2_FRS_ID_META_SHAKE_DETECTOR }, + { SH2_FLIP_DETECTOR, SH2_FRS_ID_META_FLIP_DETECTOR }, + { SH2_PICKUP_DETECTOR, SH2_FRS_ID_META_PICKUP_DETECTOR }, + { SH2_STABILITY_DETECTOR, SH2_FRS_ID_META_STABILITY_DETECTOR }, + { SH2_PERSONAL_ACTIVITY_CLASSIFIER, SH2_FRS_ID_META_PERSONAL_ACTIVITY_CLASSIFIER }, + { SH2_SLEEP_DETECTOR, SH2_FRS_ID_META_SLEEP_DETECTOR }, + { SH2_TILT_DETECTOR, SH2_FRS_ID_META_TILT_DETECTOR }, + { SH2_POCKET_DETECTOR, SH2_FRS_ID_META_POCKET_DETECTOR }, + { SH2_CIRCLE_DETECTOR, SH2_FRS_ID_META_CIRCLE_DETECTOR }, }; static void stuffMetadata(sh2_SensorMetadata_t *pData, uint32_t *frsData) diff --git a/SH2/sh2.h b/SH2/sh2.h index ec556ed..aa5630b 100644 --- a/SH2/sh2.h +++ b/SH2/sh2.h @@ -276,79 +276,79 @@ typedef enum { } sh2_CalStatus_t; // FRS Record Ids -#define STATIC_CALIBRATION_AGM (0x7979) -#define NOMINAL_CALIBRATION (0x4D4D) -#define STATIC_CALIBRATION_SRA (0x8A8A) -#define NOMINAL_CALIBRATION_SRA (0x4E4E) -#define DYNAMIC_CALIBRATION (0x1F1F) -#define ME_POWER_MGMT (0xD3E2) -#define SYSTEM_ORIENTATION (0x2D3E) -#define ACCEL_ORIENTATION (0x2D41) -#define SCREEN_ACCEL_ORIENTATION (0x2D43) -#define GYROSCOPE_ORIENTATION (0x2D46) -#define MAGNETOMETER_ORIENTATION (0x2D4C) -#define ARVR_STABILIZATION_RV (0x3E2D) -#define ARVR_STABILIZATION_GRV (0x3E2E) -#define TAP_DETECT_CONFIG (0xC269) -#define SIG_MOTION_DETECT_CONFIG (0xC274) -#define SHAKE_DETECT_CONFIG (0x7D7D) -#define MAX_FUSION_PERIOD (0xD7D7) -#define SERIAL_NUMBER (0x4B4B) -#define ES_PRESSURE_CAL (0x39AF) -#define ES_TEMPERATURE_CAL (0x4D20) -#define ES_HUMIDITY_CAL (0x1AC9) -#define ES_AMBIENT_LIGHT_CAL (0x39B1) -#define ES_PROXIMITY_CAL (0x4DA2) -#define ALS_CAL (0xD401) -#define PROXIMITY_SENSOR_CAL (0xD402) -#define PICKUP_DETECTOR_CONFIG (0x1B2A) -#define FLIP_DETECTOR_CONFIG (0xFC94) -#define STABILITY_DETECTOR_CONFIG (0xED85) -#define ACTIVITY_TRACKER_CONFIG (0xED88) -#define SLEEP_DETECTOR_CONFIG (0xED87) -#define TILT_DETECTOR_CONFIG (0xED89) -#define POCKET_DETECTOR_CONFIG (0xEF27) -#define CIRCLE_DETECTOR_CONFIG (0xEE51) -#define USER_RECORD (0x74B4) -#define ME_TIME_SOURCE_SELECT (0xD403) -#define UART_FORMAT (0xA1A1) -#define GYRO_INTEGRATED_RV_CONFIG (0xA1A2) -#define FRS_ID_META_RAW_ACCELEROMETER (0xE301) -#define FRS_ID_META_ACCELEROMETER (0xE302) -#define FRS_ID_META_LINEAR_ACCELERATION (0xE303) -#define FRS_ID_META_GRAVITY (0xE304) -#define FRS_ID_META_RAW_GYROSCOPE (0xE305) -#define FRS_ID_META_GYROSCOPE_CALIBRATED (0xE306) -#define FRS_ID_META_GYROSCOPE_UNCALIBRATED (0xE307) -#define FRS_ID_META_RAW_MAGNETOMETER (0xE308) -#define FRS_ID_META_MAGNETIC_FIELD_CALIBRATED (0xE309) -#define FRS_ID_META_MAGNETIC_FIELD_UNCALIBRATED (0xE30A) -#define FRS_ID_META_ROTATION_VECTOR (0xE30B) -#define FRS_ID_META_GAME_ROTATION_VECTOR (0xE30C) -#define FRS_ID_META_GEOMAGNETIC_ROTATION_VECTOR (0xE30D) -#define FRS_ID_META_PRESSURE (0xE30E) -#define FRS_ID_META_AMBIENT_LIGHT (0xE30F) -#define FRS_ID_META_HUMIDITY (0xE310) -#define FRS_ID_META_PROXIMITY (0xE311) -#define FRS_ID_META_TEMPERATURE (0xE312) -#define FRS_ID_META_TAP_DETECTOR (0xE313) -#define FRS_ID_META_STEP_DETECTOR (0xE314) -#define FRS_ID_META_STEP_COUNTER (0xE315) -#define FRS_ID_META_SIGNIFICANT_MOTION (0xE316) -#define FRS_ID_META_STABILITY_CLASSIFIER (0xE317) -#define FRS_ID_META_SHAKE_DETECTOR (0xE318) -#define FRS_ID_META_FLIP_DETECTOR (0xE319) -#define FRS_ID_META_PICKUP_DETECTOR (0xE31A) -#define FRS_ID_META_STABILITY_DETECTOR (0xE31B) -#define FRS_ID_META_PERSONAL_ACTIVITY_CLASSIFIER (0xE31C) -#define FRS_ID_META_SLEEP_DETECTOR (0xE31D) -#define FRS_ID_META_TILT_DETECTOR (0xE31E) -#define FRS_ID_META_POCKET_DETECTOR (0xE31F) -#define FRS_ID_META_CIRCLE_DETECTOR (0xE320) -#define FRS_ID_META_HEART_RATE_MONITOR (0xE321) -#define FRS_ID_META_ARVR_STABILIZED_RV (0xE322) -#define FRS_ID_META_ARVR_STABILIZED_GRV (0xE323) -#define FRS_ID_META_GYRO_INTEGRATED_RV (0xE324) +#define SH2_STATIC_CALIBRATION_AGM (0x7979) +#define SH2_NOMINAL_CALIBRATION (0x4D4D) +#define SH2_STATIC_CALIBRATION_SRA (0x8A8A) +#define SH2_NOMINAL_CALIBRATION_SRA (0x4E4E) +#define SH2_DYNAMIC_CALIBRATION (0x1F1F) +#define SH2_ME_POWER_MGMT (0xD3E2) +#define SH2_SYSTEM_ORIENTATION (0x2D3E) +#define SH2_ACCEL_ORIENTATION (0x2D41) +#define SH2_SCREEN_ACCEL_ORIENTATION (0x2D43) +#define SH2_GYROSCOPE_ORIENTATION (0x2D46) +#define SH2_MAGNETOMETER_ORIENTATION (0x2D4C) +#define SH2_ARVR_STABILIZATION_RV (0x3E2D) +#define SH2_ARVR_STABILIZATION_GRV (0x3E2E) +#define SH2_TAP_DETECT_CONFIG (0xC269) +#define SH2_SIG_MOTION_DETECT_CONFIG (0xC274) +#define SH2_SHAKE_DETECT_CONFIG (0x7D7D) +#define SH2_MAX_FUSION_PERIOD (0xD7D7) +#define SH2_SERIAL_NUMBER (0x4B4B) +#define SH2_ES_PRESSURE_CAL (0x39AF) +#define SH2_ES_TEMPERATURE_CAL (0x4D20) +#define SH2_ES_HUMIDITY_CAL (0x1AC9) +#define SH2_ES_AMBIENT_LIGHT_CAL (0x39B1) +#define SH2_ES_PROXIMITY_CAL (0x4DA2) +#define SH2_ALS_CAL (0xD401) +#define SH2_PROXIMITY_SENSOR_CAL (0xD402) +#define SH2_PICKUP_DETECTOR_CONFIG (0x1B2A) +#define SH2_FLIP_DETECTOR_CONFIG (0xFC94) +#define SH2_STABILITY_DETECTOR_CONFIG (0xED85) +#define SH2_ACTIVITY_TRACKER_CONFIG (0xED88) +#define SH2_SLEEP_DETECTOR_CONFIG (0xED87) +#define SH2_TILT_DETECTOR_CONFIG (0xED89) +#define SH2_POCKET_DETECTOR_CONFIG (0xEF27) +#define SH2_CIRCLE_DETECTOR_CONFIG (0xEE51) +#define SH2_USER_RECORD (0x74B4) +#define SH2_ME_TIME_SOURCE_SELECT (0xD403) +#define SH2_UART_FORMAT (0xA1A1) +#define SH2_GYRO_INTEGRATED_RV_CONFIG (0xA1A2) +#define SH2_FRS_ID_META_RAW_ACCELEROMETER (0xE301) +#define SH2_FRS_ID_META_ACCELEROMETER (0xE302) +#define SH2_FRS_ID_META_LINEAR_ACCELERATION (0xE303) +#define SH2_FRS_ID_META_GRAVITY (0xE304) +#define SH2_FRS_ID_META_RAW_GYROSCOPE (0xE305) +#define SH2_FRS_ID_META_GYROSCOPE_CALIBRATED (0xE306) +#define SH2_FRS_ID_META_GYROSCOPE_UNCALIBRATED (0xE307) +#define SH2_FRS_ID_META_RAW_MAGNETOMETER (0xE308) +#define SH2_FRS_ID_META_MAGNETIC_FIELD_CALIBRATED (0xE309) +#define SH2_FRS_ID_META_MAGNETIC_FIELD_UNCALIBRATED (0xE30A) +#define SH2_FRS_ID_META_ROTATION_VECTOR (0xE30B) +#define SH2_FRS_ID_META_GAME_ROTATION_VECTOR (0xE30C) +#define SH2_FRS_ID_META_GEOMAGNETIC_ROTATION_VECTOR (0xE30D) +#define SH2_FRS_ID_META_PRESSURE (0xE30E) +#define SH2_FRS_ID_META_AMBIENT_LIGHT (0xE30F) +#define SH2_FRS_ID_META_HUMIDITY (0xE310) +#define SH2_FRS_ID_META_PROXIMITY (0xE311) +#define SH2_FRS_ID_META_TEMPERATURE (0xE312) +#define SH2_FRS_ID_META_TAP_DETECTOR (0xE313) +#define SH2_FRS_ID_META_STEP_DETECTOR (0xE314) +#define SH2_FRS_ID_META_STEP_COUNTER (0xE315) +#define SH2_FRS_ID_META_SIGNIFICANT_MOTION (0xE316) +#define SH2_FRS_ID_META_STABILITY_CLASSIFIER (0xE317) +#define SH2_FRS_ID_META_SHAKE_DETECTOR (0xE318) +#define SH2_FRS_ID_META_FLIP_DETECTOR (0xE319) +#define SH2_FRS_ID_META_PICKUP_DETECTOR (0xE31A) +#define SH2_FRS_ID_META_STABILITY_DETECTOR (0xE31B) +#define SH2_FRS_ID_META_PERSONAL_ACTIVITY_CLASSIFIER (0xE31C) +#define SH2_FRS_ID_META_SLEEP_DETECTOR (0xE31D) +#define SH2_FRS_ID_META_TILT_DETECTOR (0xE31E) +#define SH2_FRS_ID_META_POCKET_DETECTOR (0xE31F) +#define SH2_FRS_ID_META_CIRCLE_DETECTOR (0xE320) +#define SH2_FRS_ID_META_HEART_RATE_MONITOR (0xE321) +#define SH2_FRS_ID_META_ARVR_STABILIZED_RV (0xE322) +#define SH2_FRS_ID_META_ARVR_STABILIZED_GRV (0xE323) +#define SH2_FRS_ID_META_GYRO_INTEGRATED_RV (0xE324) /** * @brief Interactive ZRO Motion Intent diff --git a/include/BNO08x.hpp b/include/BNO08x.hpp index 98f3064..215fbf4 100644 --- a/include/BNO08x.hpp +++ b/include/BNO08x.hpp @@ -61,8 +61,8 @@ class BNO08x bool set_system_orientation(float w, float x, float y, float z); bool get_system_orientation(float &w, float &x, float &y, float &z); - - bool get_frs(uint16_t frs_ID, uint32_t (&data)[16], uint16_t& rx_data_sz); + bool get_frs(BNO08xFrsID frs_ID, uint32_t (&data)[16], uint16_t& rx_data_sz); + bool write_frs(BNO08xFrsID frs_ID, uint32_t *data, const uint16_t tx_data_sz); sh2_ProductIds_t get_product_IDs(); bool data_available(); diff --git a/include/BNO08xGlobalTypes.hpp b/include/BNO08xGlobalTypes.hpp index 8ace828..ee54a0f 100644 --- a/include/BNO08xGlobalTypes.hpp +++ b/include/BNO08xGlobalTypes.hpp @@ -80,7 +80,7 @@ typedef struct bno08x_config_t } bno08x_config_t; typedef bno08x_config_t imu_config_t; // legacy version compatibility -enum class BNO08xCalSel +enum class BNO08xCalSel : uint8_t { accelerometer = SH2_CAL_ACCEL, gyro = SH2_CAL_GYRO, @@ -90,7 +90,7 @@ enum class BNO08xCalSel }; /// @brief Reason for previous IMU reset (returned by get_reset_reason()) -enum class BNO08xResetReason +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 /// @brief Sensor accuracy returned from input reports, corresponds to status bits (see ref. /// manual 6.5.1) -enum class BNO08xAccuracy +enum class BNO08xAccuracy : uint8_t { UNRELIABLE, LOW, @@ -113,7 +113,8 @@ enum class BNO08xAccuracy using IMUAccuracy = BNO08xAccuracy; // legacy version compatibility /// @brief BNO08xActivity Classifier enable bits passed to enable_activity_classifier() -enum class BNO08xActivityEnable +/// See ref manual 6.5.36.1 +enum class BNO08xActivityEnable : uint32_t { UNKNOWN = (1U << 0U), IN_VEHICLE = (1U << 1U), @@ -124,11 +125,11 @@ enum class BNO08xActivityEnable WALKING = (1U << 6U), RUNNING = (1U << 7U), ON_STAIRS = (1U << 8U), - ALL = 0x1FU + 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 +enum class BNO08xActivity : uint8_t { UNKNOWN = 0, // 0 = unknown IN_VEHICLE = 1, // 1 = in vehicle @@ -143,7 +144,7 @@ enum class BNO08xActivity }; /// @brief BNO08xStability states returned from BNO08x::stability_classifier.get() -enum class BNO08xStability +enum class BNO08xStability : uint8_t { UNKNOWN = 0, // 0 = unknown ON_TABLE = 1, // 1 = on table @@ -154,6 +155,82 @@ enum class BNO08xStability 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 Struct to represent unit quaternion. typedef struct bno08x_quat_t { diff --git a/source/BNO08x.cpp b/source/BNO08x.cpp index 7e10efa..8cd08a1 100644 --- a/source/BNO08x.cpp +++ b/source/BNO08x.cpp @@ -1728,10 +1728,10 @@ bool BNO08x::delete_calibration_data() } /** - * @brief Retrieves a record from flash record system (if your goal is to retrieve meta data use the + * @brief Retrieves a record from flash record system (if your goal is to retrieve sensor specific meta data use the * BNO08xRpt:get_meta_data() method instead) * - * For more details on returned and data and frs_ID see ref. manual 6.3.7 & 4.3 + * For more details on returned and data and frs_IDs see ref. manual 6.3.7 & 4.3 * * @param frs_ID The ID of the desired record to retrieve from flash. * @param data Buffer of 16 uint32_t to store retrieved data. @@ -1739,17 +1739,41 @@ bool BNO08x::delete_calibration_data() * * @return True if get flash record system operation succeeded. */ -bool BNO08x::get_frs(uint16_t frs_ID, uint32_t (&data)[16], uint16_t& rx_data_sz) +bool BNO08x::get_frs(BNO08xFrsID frs_ID, uint32_t (&data)[16], uint16_t& rx_data_sz) { int op_success = SH2_ERR; lock_sh2_HAL(); - op_success = sh2_getFrs(frs_ID, data, &rx_data_sz); + op_success = sh2_getFrs(static_cast(frs_ID), data, &rx_data_sz); unlock_sh2_HAL(); return (op_success == SH2_OK); } + +/** + * @brief Writes a record to flash record system. + * + * For more details on flash records and frs_IDs see ref. manual 6.3.6 & 4.3 + * + * @param frs_ID The ID of the desired to write to flash. + * @param data Buffer of 16 uint32_t to store data to send. + * @param tx_data_sz Length of data, amount of 32 bit words to write to flash. + * + * @return True if get flash record system operation succeeded. + */ +bool BNO08x::write_frs(BNO08xFrsID frs_ID, uint32_t *data, const uint16_t tx_data_sz) +{ + int op_success = SH2_ERR; + + lock_sh2_HAL(); + op_success = sh2_setFrs(static_cast(frs_ID), data, tx_data_sz); + unlock_sh2_HAL(); + + return (op_success == SH2_OK); +} + + /** * @brief Returns product ID info sent by IMU at initialization. * diff --git a/source/report/BNO08xRptActivityClassifier.cpp b/source/report/BNO08xRptActivityClassifier.cpp index 769bbe4..9966cde 100644 --- a/source/report/BNO08xRptActivityClassifier.cpp +++ b/source/report/BNO08xRptActivityClassifier.cpp @@ -34,7 +34,7 @@ void BNO08xRptActivityClassifier::update_data(sh2_SensorValue_t* sensor_val) */ bool BNO08xRptActivityClassifier::enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg) { - sensor_cfg.sensorSpecific = static_cast(activities_to_enable); // this must be set regardless of user cfg + sensor_cfg.sensorSpecific = static_cast(activities_to_enable); // this must be set regardless of user cfg // or no reports will be received return BNO08xRpt::rpt_enable(time_between_reports, sensor_cfg); } diff --git a/test/FeatureTests.cpp b/test/FeatureTests.cpp index 9e53d0e..2f0fd49 100644 --- a/test/FeatureTests.cpp +++ b/test/FeatureTests.cpp @@ -309,7 +309,6 @@ TEST_CASE("Save Dynamic Calibration", "[FeatureTests]") const constexpr char* TEST_TAG = "Save Dynamic Calibration"; static const constexpr uint8_t ENABLED_REPORT_COUNT = 1; static const constexpr uint8_t RX_REPORT_TRIAL_CNT = ENABLED_REPORT_COUNT * 5; - static const constexpr uint32_t REPORT_PERIOD = 100000UL; // 100ms BNO08x* imu = nullptr; char msg_buff[200] = {}; @@ -338,7 +337,6 @@ TEST_CASE("Autosave Dynamic Calibration", "[FeatureTests]") const constexpr char* TEST_TAG = "Autosave Dynamic Calibration"; static const constexpr uint8_t ENABLED_REPORT_COUNT = 1; static const constexpr uint8_t RX_REPORT_TRIAL_CNT = ENABLED_REPORT_COUNT * 200; - static const constexpr uint32_t REPORT_PERIOD = 100000UL; // 100ms BNO08x* imu = nullptr; char msg_buff[200] = {}; @@ -369,7 +367,6 @@ TEST_CASE("Disable Dynamic Calibration", "[FeatureTests]") const constexpr char* TEST_TAG = "Disable Dynamic Calibration"; static const constexpr uint8_t ENABLED_REPORT_COUNT = 1; static const constexpr uint8_t RX_REPORT_TRIAL_CNT = ENABLED_REPORT_COUNT * 5; - static const constexpr uint32_t REPORT_PERIOD = 100000UL; // 100ms BNO08x* imu = nullptr; char msg_buff[200] = {}; @@ -398,7 +395,6 @@ TEST_CASE("Clear Dynamic Calibration", "[FeatureTests]") const constexpr char* TEST_TAG = "Clear Dynamic Calibration"; static const constexpr uint8_t ENABLED_REPORT_COUNT = 1; static const constexpr uint8_t RX_REPORT_TRIAL_CNT = ENABLED_REPORT_COUNT * 5; - static const constexpr uint32_t REPORT_PERIOD = 100000UL; // 100ms BNO08x* imu = nullptr; char msg_buff[200] = {};