diff --git a/include/BNO08x.hpp b/include/BNO08x.hpp index e9b3d04..9cf9a58 100644 --- a/include/BNO08x.hpp +++ b/include/BNO08x.hpp @@ -3,23 +3,19 @@ * @author Myles Parfeniuk */ #pragma once + // standard library includes -#include -#include -#include #include #include #include #include // esp-idf includes -#include #include #include #include #include #include -#include // in-house includes #include "BNO08x_global_types.hpp" @@ -74,7 +70,7 @@ class BNO08x bool on(); bool sleep(); - bool get_frs(BNO08xFRSID frs_ID, uint32_t* data, uint16_t* rx_data_sz); + bool get_frs(uint16_t frs_ID, uint32_t (&data)[16], uint16_t& rx_data_sz); bool data_available(); void register_cb(std::function cb_fxn); diff --git a/include/BNO08xRpt.hpp b/include/BNO08xRpt.hpp index cd1812c..44be5b2 100644 --- a/include/BNO08xRpt.hpp +++ b/include/BNO08xRpt.hpp @@ -30,9 +30,8 @@ class BNO08xRpt bool has_new_data(); bool flush(); bool get_sample_counts(bno08x_sample_counts_t& sample_counts); - bool clear_sample_counts(); - - virtual void update_data(sh2_SensorValue_t* sensor_val) = 0; + bool clear_sample_counts(); + bool get_meta_data(bno08x_meta_data_t& meta_data); protected: BNO08x* imu; ///< Pointer to BNO08x object for enable ,disable, and update operations. @@ -40,6 +39,8 @@ class BNO08xRpt uint32_t rpt_bit; ///< Respective enable and data bit for report in BNO08x::evt_grp_report_en and BNO08x::evt_grp_report_data uint32_t period_us; ///< The period/interval of the report in microseconds. + virtual void update_data(sh2_SensorValue_t* sensor_val) = 0; + /** * @brief BNO08xRpt report constructor. * diff --git a/include/BNO08x_global_types.hpp b/include/BNO08x_global_types.hpp index 9245625..820b4b5 100644 --- a/include/BNO08x_global_types.hpp +++ b/include/BNO08x_global_types.hpp @@ -4,10 +4,18 @@ */ #pragma once +// standard library includes #include +#include +#include +#include + +// esp-idf includes #include #include #include + +// third-party includes #include "sh2_SensorValue.h" // macros for bno08x_tap_detector_t @@ -46,31 +54,6 @@ enum class BNO08xAccuracy }; using IMUAccuracy = BNO08xAccuracy; // legacy version compatibility -enum class BNO08xFRSID -{ - RawAccelerometer = 0xE301, - Accelerometer = 0xE302, - LinearAcceleration = 0xE303, - Gravity = 0xE304, - RawGyroscope = 0xE305, - CalGyro = 0xE306, - UncalGyro = 0xE307, - RawMagnetometer = 0xE308, - CalMagnetometer = 0xE309, - UncalMagnetometer = 0xE30A, - RV = 0xE30B, - RVGame = 0xE30C, - RVGeomagnetic = 0xE30D, - TapDetector = 0xE313, - StepCounter = 0xE315, - StabilityClassifier = 0xE317, - ShakeDetector = 0xE318, - ActivityClassifier = 0xE31C, - RVARVRStabilizedRotation = 0xE322, - RVARVRStabilizedGame = 0xE323, - RVGyroIntegrated = 0xE324, -}; - /// @brief BNO08xActivity Classifier enable bits passed to enable_activity_classifier() enum class BNO08xActivityEnable { @@ -542,34 +525,6 @@ typedef struct bno08x_shake_detector_t } bno08x_shake_detector_t; -/// @brief Struct to represent sample counts, returned from BNO08xRpt::get_sample_counts() -typedef struct bno08x_sample_counts_t -{ - uint32_t offered; ///< Number of samples produced by underlying data source. - uint32_t on; ///< Number of "offered" samples while this sensor was requested by host. - uint32_t accepted; ///< Number of "on" samples that passed decimation filter. - uint32_t attempted; ///< Number of "accepted" samples that passed threshold requirements and had transmission to the host attempted. - - bno08x_sample_counts_t() - : offered(0UL) - , on(0UL) - , accepted(0UL) - , attempted(0UL) - { - } - - // conversion from sh2_PersonalActivityClassifier_t - bno08x_sample_counts_t& operator=(const sh2_Counts_t& source) - { - this->offered = source.offered; - this->on = source.on; - this->accepted = source.accepted; - this->attempted = source.attempted; - - return *this; - } -} bno08x_sample_counts_t; - /// @brief Struct to represent acceleration data from acceleration, linear acceleration, and gravity reports. typedef struct bno08x_accel_t { @@ -730,4 +685,104 @@ typedef struct bno08x_stability_classifier_t } bno08x_stability_classifier_t; +/// @brief Struct to represent sample counts, returned from BNO08xRpt::get_sample_counts() +typedef struct bno08x_sample_counts_t +{ + uint32_t offered; ///< Number of samples produced by underlying data source. + uint32_t on; ///< Number of "offered" samples while this sensor was requested by host. + uint32_t accepted; ///< Number of "on" samples that passed decimation filter. + uint32_t attempted; ///< Number of "accepted" samples that passed threshold requirements and had transmission to the host attempted. + + bno08x_sample_counts_t() + : offered(0UL) + , on(0UL) + , accepted(0UL) + , attempted(0UL) + { + } + + // conversion from sh2_PersonalActivityClassifier_t + bno08x_sample_counts_t& operator=(const sh2_Counts_t& source) + { + this->offered = source.offered; + this->on = source.on; + this->accepted = source.accepted; + this->attempted = source.attempted; + + return *this; + } +} bno08x_sample_counts_t; + +/// @brief Struct to represent sensor/report meta data, returned from BNO08xRpt::get_meta_data() +typedef struct bno08x_meta_data_t +{ + uint8_t me_version; ///< Motion Engine Version + uint8_t mh_version; ///< Motion Hub Version + uint8_t sh_version; ///< SensorHub Version + uint32_t range; ///< Same units as sensor reports + uint32_t resolution; ///< Same units as sensor reports + uint16_t revision; ///< Metadata record format revision + uint16_t power_mA; ///< [mA] Fixed point 16Q10 format + uint32_t min_period_us; ///< [uS] min period to use with enable_report + uint32_t max_period_us; ///< [uS] max period to use with enable_report + uint32_t fifo_reserved; ///< (Unused) + uint32_t fifo_max; ///< (Unused) + uint32_t batch_buffer_bytes; ///< (Unused) + uint16_t q_point_1; ///< q point for sensor values + uint16_t q_point_2; ///< q point for accuracy or bias fields + uint16_t q_point_3; ///< q point for sensor data change sensitivity + uint32_t vendor_id_len; ///< [bytes] + char vendor_ID[48]; ///< Vendor name and part number + uint32_t sensor_specific_len; ///< [bytes] + uint8_t sensor_specific[48]; ///< See SH-2 Reference Manual + + // Default constructor + bno08x_meta_data_t() + : me_version(0) + , mh_version(0) + , sh_version(0) + , range(0) + , resolution(0) + , revision(0) + , power_mA(0) + , min_period_us(0) + , max_period_us(0) + , fifo_reserved(0) + , fifo_max(0) + , batch_buffer_bytes(0) + , q_point_1(0) + , q_point_2(0) + , q_point_3(0) + , vendor_id_len(0) + , sensor_specific_len(0) + { + memset(vendor_ID, 0, sizeof(vendor_ID)); + memset(sensor_specific, 0, sizeof(sensor_specific)); + } + + // Conversion constructor from sh2_SensorMetadata_t + bno08x_meta_data_t(const sh2_SensorMetadata_t& src) + { + me_version = src.meVersion; + mh_version = src.mhVersion; + sh_version = src.shVersion; + range = src.range; + resolution = src.resolution; + revision = src.revision; + power_mA = src.power_mA; + min_period_us = src.minPeriod_uS; + max_period_us = src.maxPeriod_uS; + fifo_reserved = src.fifoReserved; + fifo_max = src.fifoMax; + batch_buffer_bytes = src.batchBufferBytes; + q_point_1 = src.qPoint1; + q_point_2 = src.qPoint2; + q_point_3 = src.qPoint3; + vendor_id_len = src.vendorIdLen; + sensor_specific_len = src.sensorSpecificLen; + memcpy(vendor_ID, src.vendorId, vendor_id_len); + memcpy(sensor_specific, src.sensorSpecific, sensor_specific_len); + } +} bno08x_meta_data_t; + typedef bno08x_config_t imu_config_t; // legacy version compatibility \ No newline at end of file diff --git a/source/BNO08x.cpp b/source/BNO08x.cpp index 08b2d38..7b30e24 100644 --- a/source/BNO08x.cpp +++ b/source/BNO08x.cpp @@ -126,7 +126,7 @@ bool BNO08x::initialize() if (init_tasks() != ESP_OK) return false; - // clang-format off + // clang-format off #ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS ESP_LOGI(TAG, "Successfully initialized...."); #endif @@ -1196,12 +1196,23 @@ bool BNO08x::sleep() return (op_success == SH2_OK); } -bool BNO08x::get_frs(BNO08xFRSID frs_ID, uint32_t* data, uint16_t* rx_data_sz) +/** + * @brief Retrieves a record from flash record system (if your goal is to retrieve 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 + * + * @param frs_ID The ID of the desired record to retrieve from flash. + * @param data Buffer of 16 uint32_t to store retrieved data. + * @param rx_data_sz Reference to store number of 32 bit words retrieved from flash. + * + * @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) { int op_success = SH2_ERR; lock_sh2_HAL(); - op_success = sh2_getFrs(static_cast(frs_ID), data, rx_data_sz); + op_success = sh2_getFrs(frs_ID, data, &rx_data_sz); unlock_sh2_HAL(); return (op_success == SH2_OK); diff --git a/source/BNO08xRpt.cpp b/source/BNO08xRpt.cpp index 3248f7a..0fb1bcc 100644 --- a/source/BNO08xRpt.cpp +++ b/source/BNO08xRpt.cpp @@ -144,7 +144,30 @@ bool BNO08xRpt::clear_sample_counts() success = sh2_clearCounts(ID); imu->unlock_sh2_HAL(); - return (success != SH2_OK) ? false : true; + return (success == SH2_OK); +} + +/** + * @brief Retrieves meta data for this sensor/report by reading respective record in FRS (flash record system). + * + * Can be used to retrieve the minimum period, maximum period, actual Q points, resolution, and other info for a given sensor. + * + * @return True clear get meta data operation succeeded. + */ +bool BNO08xRpt::get_meta_data(bno08x_meta_data_t& meta_data) +{ + int success = SH2_OK; + + sh2_SensorMetadata_t sensor_meta_data; + + imu->lock_sh2_HAL(); + success = sh2_getMetadata(ID, &sensor_meta_data); + imu->unlock_sh2_HAL(); + + if (success == SH2_OK) + meta_data = sensor_meta_data; + + return (success == SH2_OK); } /**