Removed BNO08x dependency from BNO08xRpt

This commit is contained in:
myles-parfeniuk 2024-12-04 18:12:10 -08:00
parent f00416c297
commit 09d8481877
57 changed files with 695 additions and 563 deletions

View File

@ -1,4 +1,3 @@
---
BasedOnStyle: LLVM BasedOnStyle: LLVM
Standard: Cpp11 Standard: Cpp11
@ -35,3 +34,5 @@ IndentAccessModifiers: true
IndentPPDirectives: AfterHash IndentPPDirectives: AfterHash
IndentCaseLabels: true IndentCaseLabels: true
NamespaceIndentation: All

View File

@ -7,41 +7,22 @@
// etl includes // etl includes
#include <etl/vector.h> #include <etl/vector.h>
#include <etl/variant.h>
#include <etl/map.h> #include <etl/map.h>
// esp-idf includes // esp-idf includes
#include <driver/gpio.h>
#include <driver/spi_common.h>
#include <driver/spi_master.h>
#include <freertos/FreeRTOS.h> #include <freertos/FreeRTOS.h>
#include <freertos/task.h> #include <freertos/task.h>
#include <freertos/event_groups.h> #include <freertos/event_groups.h>
#include <freertos/queue.h> #include <freertos/queue.h>
#include <freertos/semphr.h>
// in-house includes // in-house includes
#include "BNO08x_global_types.hpp" #include "BNO08xGlobalTypes.hpp"
#include "BNO08xPrivateTypes.hpp"
#include "BNO08xSH2HAL.hpp" #include "BNO08xSH2HAL.hpp"
#include "BNO08xCbParamRptID.hpp" #include "BNO08xReports.hpp"
#include "BNO08xCbParamVoid.hpp"
#include "BNO08xRptAcceleration.hpp"
#include "BNO08xRptLinearAcceleration.hpp"
#include "BNO08xRptGravity.hpp"
#include "BNO08xRptCalMagnetometer.hpp"
#include "BNO08xRptUncalMagnetometer.hpp"
#include "BNO08xRptCalGyro.hpp"
#include "BNO08xRptUncalGyro.hpp"
#include "BNO08xRptRV.hpp"
#include "BNO08xRptGameRV.hpp"
#include "BNO08xRptARVRStabilizedRV.hpp"
#include "BNO08xRptARVRStabilizedGameRV.hpp"
#include "BNO08xRptIGyroRV.hpp"
#include "BNO08xRptRVGeomag.hpp"
#include "BNO08xRptRawMEMSGyro.hpp"
#include "BNO08xRptRawMEMSAccelerometer.hpp"
#include "BNO08xRptRawMEMSMagnetometer.hpp"
#include "BNO08xRptStepCounter.hpp"
#include "BNO08xRptActivityClassifier.hpp"
#include "BNO08xStabilityClassifier.hpp"
#include "BNO08xShakeDetector.hpp"
#include "BNO08xTapDetector.hpp"
/** /**
* @class BNO08x * @class BNO08x
@ -51,15 +32,6 @@
class BNO08x class BNO08x
{ {
public: public:
inline static sh2_SensorConfig default_sensor_cfg = {.changeSensitivityEnabled = false, ///<TODO
.changeSensitivityRelative = false,
.wakeupEnabled = false,
.alwaysOnEnabled = false,
.changeSensitivity = 0,
.reportInterval_us = 0,
.batchInterval_us = 0,
.sensorSpecific = 0};
BNO08x(bno08x_config_t imu_config = bno08x_config_t()); BNO08x(bno08x_config_t imu_config = bno08x_config_t());
~BNO08x(); ~BNO08x();
@ -74,8 +46,8 @@ class BNO08x
bool get_frs(uint16_t frs_ID, uint32_t (&data)[16], uint16_t& rx_data_sz); bool get_frs(uint16_t frs_ID, uint32_t (&data)[16], uint16_t& rx_data_sz);
bool data_available(); bool data_available();
void register_cb(std::function<void(void)> cb_fxn); bool register_cb(std::function<void(void)> cb_fxn);
void register_cb(std::function<void(uint8_t report_ID)> cb_fxn); bool register_cb(std::function<void(uint8_t report_ID)> cb_fxn);
void print_product_ids(); void print_product_ids();
@ -107,34 +79,6 @@ class BNO08x
BNO08xTapDetector tap_detector; BNO08xTapDetector tap_detector;
private: private:
/// @brief Holds info about which functionality has been successfully initialized (used by deconstructor during cleanup).
typedef struct bno08x_init_status_t
{
bool gpio_outputs; ///< True if GPIO outputs have been initialized.
bool gpio_inputs; ///< True if GPIO inputs have been initialized.
bool isr_service; ///< True if global ISR service has been initialized.
bool isr_handler; ///< True if HINT ISR handler has been initialized.
bool spi_bus; ///< True if spi_bus_initialize() has been called successfully.
bool spi_device; ///< True if spi_bus_add_device() has been called successfully.
bool sh2_HAL; ///< True if sh2_open() has been called successfully.
bool data_proc_task; ///< True if xTaskCreate has been called successfully for data_proc_task.
bool sh2_HAL_service_task; ///< True if xTaskCreate has been called successfully for sh2_HAL_service_task.
bool cb_task; ///< True if xTaskCreate has been called successfully for cb_task.
bno08x_init_status_t()
: gpio_outputs(false)
, gpio_inputs(false)
, isr_service(false)
, isr_handler(false)
, spi_bus(false)
, spi_device(false)
, data_proc_task(false)
, sh2_HAL_service_task(false)
, cb_task(false)
{
}
} bno08x_init_status_t;
// data processing task // data processing task
static const constexpr configSTACK_DEPTH_TYPE DATA_PROC_TASK_SZ = static const constexpr configSTACK_DEPTH_TYPE DATA_PROC_TASK_SZ =
CONFIG_ESP32_BNO08X_DATA_PROC_TASK_SZ; ///< Size of data_proc_task() stack in bytes CONFIG_ESP32_BNO08X_DATA_PROC_TASK_SZ; ///< Size of data_proc_task() stack in bytes
@ -203,24 +147,19 @@ class BNO08x
QueueHandle_t queue_cb_report_id; ///< Queue to send report ID of most recent report to cb_task() QueueHandle_t queue_cb_report_id; ///< Queue to send report ID of most recent report to cb_task()
etl::vector<BNO08xCbParamVoid, CONFIG_ESP32_BNO08X_CB_MAX>
cb_list_void_param; // Vector for storing any call-back functions added with register_cb()
etl::vector<BNO08xCbParamRptID, CONFIG_ESP32_BNO08X_CB_MAX>
cb_list_rpt_param; // Vector for storing any call-back functions added with register_cb()
etl::vector<BNO08xCbGeneric*, CONFIG_ESP32_BNO08X_CB_MAX>
cb_ptr_list; // Vector for storing any call-back functions added with register_cb() as pointer to generic type
bno08x_config_t imu_config{}; ///<IMU configuration settings bno08x_config_t imu_config{}; ///<IMU configuration settings
spi_bus_config_t bus_config{}; ///<SPI bus GPIO configuration settings spi_bus_config_t bus_config{}; ///<SPI bus GPIO configuration settings
spi_device_interface_config_t imu_spi_config{}; ///<SPI slave device settings spi_device_interface_config_t imu_spi_config{}; ///<SPI slave device settings
spi_device_handle_t spi_hdl{}; ///<SPI device handle spi_device_handle_t spi_hdl{}; ///<SPI device handle
spi_transaction_t spi_transaction{}; ///<SPI transaction handle spi_transaction_t spi_transaction{}; ///<SPI transaction handle
bno08x_init_status_t BNO08xPrivateTypes::bno08x_init_status_t
init_status; ///<Initialization status of various functionality, used by deconstructor during cleanup, set during initialization. init_status; ///<Initialization status of various functionality, used by deconstructor during cleanup, set during initialization.
sh2_ProductIds_t product_IDs; ///< Product ID info returned IMU at initialization, can be viewed with print_product_ids() sh2_ProductIds_t product_IDs; ///< Product ID info returned IMU at initialization, can be viewed with print_product_ids()
static const constexpr uint8_t TOTAL_RPT_COUNT = 38; ///< Amount of possible reports returned from BNO08x. BNO08xPrivateTypes::bno08x_cb_list_t cb_list; ///< Vector to contain registered callbacks.
etl::vector<uint8_t, TOTAL_RPT_COUNT> en_report_ids; ///< Vector to contain IDs of currently enabled reports
// clang-format off // clang-format off
etl::map<uint8_t, BNO08xRpt*, TOTAL_RPT_COUNT, etl::less<uint8_t>> usr_reports = etl::map<uint8_t, BNO08xRpt*, TOTAL_RPT_COUNT, etl::less<uint8_t>> usr_reports =
@ -285,81 +224,10 @@ class BNO08x
static const constexpr uint32_t SCLK_MAX_SPEED = 3000000UL; ///<Max SPI SCLK speed BNO08x is capable of. static const constexpr uint32_t SCLK_MAX_SPEED = 3000000UL; ///<Max SPI SCLK speed BNO08x is capable of.
// evt_grp_bno08x_task bits
static const constexpr EventBits_t EVT_GRP_BNO08x_TASKS_RUNNING =
(1UL << 0U); ///<When this bit is set it indicates the BNO08x tasks are running, it is always set to 1 for the duration BNO08x driver object. Cleared in deconstructor for safe task deletion.
static const constexpr EventBits_t EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT =
(1UL << 1U); ///<When this bit is set it indicates the BNO08x has asserted its host interrupt pin, thus an SPI transaction should commence.
static const constexpr EventBits_t EVT_GRP_BNO08x_TASK_RESET_OCCURRED =
(1UL << 2U); ///<When this bit is set it indicates the SH2 HAL lib has reset the IMU, any reports enabled by the user must be re-enabled.
static const constexpr EventBits_t EVT_GRP_BNO08x_TASK_DATA_AVAILABLE =
(1UL << 3U); ///<When this bit is set it indicates a report has been received for the user to read, cleared in data_available() set/cleared in handle_sensor_report()
// evt_grp_report_en bits
static const constexpr EventBits_t EVT_GRP_RPT_RV_BIT = (1UL << 0U); ///< When set, rotation vector reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_RV_GAME_BIT = (1UL << 1U); ///< When set, game rotation vector reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_RV_ARVR_S_BIT = (1UL << 2U); ///< When set, ARVR stabilized rotation vector reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_RV_ARVR_S_GAME_BIT =
(1UL << 3U); ///< When set, ARVR stabilized game rotation vector reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_GYRO_INTEGRATED_RV_BIT =
(1UL << 4U); ///< When set, gyro integrator rotation vector reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_GEOMAG_RV_BIT = (1UL << 5U); ///< When set, gyro integrator rotation vector reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_ACCELEROMETER_BIT = (1UL << 6U); ///< When set, accelerometer reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_LINEAR_ACCELEROMETER_BIT = (1UL << 7U); ///< When set, linear accelerometer reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_GRAVITY_BIT = (1UL << 8U); ///< When set, gravity reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_CAL_GYRO_BIT = (1UL << 9U); ///< When set, gyro reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_UNCAL_GYRO_BIT = (1UL << 10U); ///< When set, uncalibrated gyro reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_CAL_MAGNETOMETER_BIT = (1UL << 11U); ///< When set, calibrated magnetometer reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_UNCAL_MAGNETOMETER_BIT =
(1UL << 12U); ///< When set, uncalibrated magnetometer reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_TAP_DETECTOR_BIT = (1UL << 13U); ///< When set, tap detector reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_STEP_COUNTER_BIT = (1UL << 14U); ///< When set, step counter reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_STABILITY_CLASSIFIER_BIT =
(1UL << 15U); ///< When set, stability classifier reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_ACTIVITY_CLASSIFIER_BIT = (1UL << 16U); ///< When set, activity classifier reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_SHAKE_DETECTOR_BIT = (1UL << 17U); ///< When set, shake detector reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_RAW_ACCELEROMETER_BIT = (1UL << 18U); ///< When set, raw accelerometer reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_RAW_GYRO_BIT = (1UL << 19U); ///< When set, raw gyro reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_RAW_MAGNETOMETER_BIT = (1UL << 20U); ///< When set, raw magnetometer reports are active.
static const constexpr EventBits_t EVT_GRP_RPT_ALL =
EVT_GRP_RPT_RV_BIT | EVT_GRP_RPT_RV_GAME_BIT | EVT_GRP_RPT_RV_ARVR_S_BIT | EVT_GRP_RPT_RV_ARVR_S_GAME_BIT |
EVT_GRP_RPT_LINEAR_ACCELEROMETER_BIT | EVT_GRP_RPT_GRAVITY_BIT | EVT_GRP_RPT_CAL_GYRO_BIT | EVT_GRP_RPT_UNCAL_GYRO_BIT |
EVT_GRP_RPT_CAL_MAGNETOMETER_BIT | EVT_GRP_RPT_TAP_DETECTOR_BIT | EVT_GRP_RPT_STEP_COUNTER_BIT |
EVT_GRP_RPT_STABILITY_CLASSIFIER_BIT | EVT_GRP_RPT_ACTIVITY_CLASSIFIER_BIT | EVT_GRP_RPT_RAW_ACCELEROMETER_BIT |
EVT_GRP_RPT_RAW_GYRO_BIT | EVT_GRP_RPT_RAW_MAGNETOMETER_BIT | EVT_GRP_RPT_UNCAL_MAGNETOMETER_BIT | EVT_GRP_RPT_SHAKE_DETECTOR_BIT |
EVT_GRP_RPT_ACCELEROMETER_BIT | EVT_GRP_RPT_GEOMAG_RV_BIT | EVT_GRP_RPT_GYRO_INTEGRATED_RV_BIT;
static const constexpr char* TAG = "BNO08x"; ///< Class tag used for serial print statements static const constexpr char* TAG = "BNO08x"; ///< Class tag used for serial print statements
// we have a lot of friends
friend class BNO08xSH2HAL; friend class BNO08xSH2HAL;
friend class BNO08xTestHelper; friend class BNO08xTestHelper;
friend class BNO08xRpt;
friend class BNO08xRptRVGeneric;
friend class BNO08xRptRV;
friend class BNO08xRptGameRV;
friend class BNO08xRptARVRStabilizedRV;
friend class BNO08xRptARVRStabilizedGameRV;
friend class BNO08xRptAcceleration;
friend class BNO08xRptLinearAcceleration;
friend class BNO08xRptGravity;
friend class BNO08xRptCalMagnetometer;
friend class BNO08xRptUncalMagnetometer;
friend class BNO08xRptCalGyro;
friend class BNO08xRptUncalGyro;
friend class BNO08xRptIGyroRV;
friend class BNO08xRptRVGeomag;
friend class BNO08xRptRawMEMSGyro;
friend class BNO08xRptRawMEMSAccelerometer;
friend class BNO08xRptRawMEMSMagnetometer;
friend class BNO08xRptStepCounter;
friend class BNO08xRptActivityClassifier;
friend class BNO08xStabilityClassifier;
friend class BNO08xShakeDetector;
friend class BNO08xTapDetector;
}; };

View File

@ -1,10 +1,24 @@
/** /**
* @file BNO08x_global_types.hpp * @file BNO08xGlobalTypes.hpp
* @author Myles Parfeniuk * @author Myles Parfeniuk
*/ */
#pragma once #pragma once
// macros for bno08x_tap_detector_t
#define TAP_DETECTED_X_AXIS(tap) ((tap) & (1U << 0U) ? 1 : 0)
#define TAP_DETECTED_X_AXIS_POSITIVE(tap) ((tap) & (1U << 1U) ? 1 : 0)
#define TAP_DETECTED_Y_AXIS(tap) ((tap) & (1U << 2U) ? 1 : 0)
#define TAP_DETECTED_Y_AXIS_POSITIVE(tap) ((tap) & (1U << 3U) ? 1 : 0)
#define TAP_DETECTED_Z_AXIS(tap) ((tap) & (1U << 4U) ? 1 : 0)
#define TAP_DETECTED_Z_AXIS_POSITIVE(tap) ((tap) & (1U << 5U) ? 1 : 0)
#define TAP_DETECTED_DOUBLE(tap) ((tap) & (1U << 6U) ? 1 : 0)
// macros for bno08x_shake_detector_t
#define SHAKE_DETECTED_X(tap) ((tap) & (1U << 0U) ? 1 : 0)
#define SHAKE_DETECTED_Y(tap) ((tap) & (1U << 1U) ? 1 : 0)
#define SHAKE_DETECTED_Z(tap) ((tap) & (1U << 2U) ? 1 : 0)
// standard library includes // standard library includes
#include <math.h> #include <math.h>
#include <inttypes.h> #include <inttypes.h>
@ -19,19 +33,52 @@
// third-party includes // third-party includes
#include "sh2_SensorValue.h" #include "sh2_SensorValue.h"
// macros for bno08x_tap_detector_t /// @brief IMU configuration settings passed into constructor
#define TAP_DETECTED_X_AXIS(tap) ((tap) & (1U << 0U) ? 1 : 0) typedef struct bno08x_config_t
#define TAP_DETECTED_X_AXIS_POSITIVE(tap) ((tap) & (1U << 1U) ? 1 : 0) {
#define TAP_DETECTED_Y_AXIS(tap) ((tap) & (1U << 2U) ? 1 : 0) spi_host_device_t spi_peripheral; ///<SPI peripheral to be used
#define TAP_DETECTED_Y_AXIS_POSITIVE(tap) ((tap) & (1U << 3U) ? 1 : 0) gpio_num_t io_mosi; ///<MOSI GPIO pin (connects to BNO08x DI pin)
#define TAP_DETECTED_Z_AXIS(tap) ((tap) & (1U << 4U) ? 1 : 0) gpio_num_t io_miso; ///<MISO GPIO pin (connects to BNO08x SDA pin)
#define TAP_DETECTED_Z_AXIS_POSITIVE(tap) ((tap) & (1U << 5U) ? 1 : 0) gpio_num_t io_sclk; ///<SCLK pin (connects to BNO08x SCL pin)
#define TAP_DETECTED_DOUBLE(tap) ((tap) & (1U << 6U) ? 1 : 0) gpio_num_t io_cs; /// Chip select pin (connects to BNO08x CS pin)
gpio_num_t io_int; /// Host interrupt pin (connects to BNO08x INT pin)
gpio_num_t io_rst; /// Reset pin (connects to BNO08x RST pin)
uint32_t sclk_speed; ///<Desired SPI SCLK speed in Hz (max 3MHz)
bool install_isr_service; ///<Indicates whether the ISR service for the HINT should be installed at IMU initialization, (if gpio_install_isr_service() is called before initialize() set this to false)
// macros for bno08x_shake_detector_t /// @brief Default IMU configuration settings constructor.
#define SHAKE_DETECTED_X(tap) ((tap) & (1U << 0U) ? 1 : 0) /// To modify default GPIO pins, run "idf.py menuconfig" esp32_BNO08x->GPIO Configuration.
#define SHAKE_DETECTED_Y(tap) ((tap) & (1U << 1U) ? 1 : 0) /// Alternatively, edit the default values in "Kconfig.projbuild"
#define SHAKE_DETECTED_Z(tap) ((tap) & (1U << 2U) ? 1 : 0) bno08x_config_t(bool install_isr_service = true)
: spi_peripheral((spi_host_device_t) CONFIG_ESP32_BNO08x_SPI_HOST)
, io_mosi(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_DI)) // default: 23
, io_miso(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_SDA)) // default: 19
, io_sclk(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_SCL)) // default: 18
, io_cs(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_CS)) // default: 33
, io_int(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_HINT)) // default: 26
, io_rst(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_RST)) // default: 32
, sclk_speed(static_cast<uint32_t>(CONFIG_ESP32_BNO08X_SCL_SPEED_HZ)) // default: 2MHz
, install_isr_service(install_isr_service) // default: true
{
}
/// @brief Overloaded IMU configuration settings constructor for custom pin settings
bno08x_config_t(spi_host_device_t spi_peripheral, gpio_num_t io_mosi, gpio_num_t io_miso, gpio_num_t io_sclk, gpio_num_t io_cs,
gpio_num_t io_int, gpio_num_t io_rst, uint32_t sclk_speed, bool install_isr_service = true)
: spi_peripheral(spi_peripheral)
, io_mosi(io_mosi)
, io_miso(io_miso)
, io_sclk(io_sclk)
, io_cs(io_cs)
, io_int(io_int)
, io_rst(io_rst)
, sclk_speed(sclk_speed)
, install_isr_service(install_isr_service)
{
}
} bno08x_config_t;
typedef bno08x_config_t imu_config_t; // legacy version compatibility
/// @brief Reason for previous IMU reset (returned by get_reset_reason()) /// @brief Reason for previous IMU reset (returned by get_reset_reason())
enum class BNO08xResetReason enum class BNO08xResetReason
@ -95,55 +142,8 @@ enum class BNO08xStability
MOTION = 4, // 4 = in motion MOTION = 4, // 4 = in motion
RESERVED = 5, // 5 = reserved (not used) RESERVED = 5, // 5 = reserved (not used)
UNDEFINED = 6 // used for unit tests UNDEFINED = 6 // used for unit tests
}; };
/// @brief IMU configuration settings passed into constructor
typedef struct bno08x_config_t
{
spi_host_device_t spi_peripheral; ///<SPI peripheral to be used
gpio_num_t io_mosi; ///<MOSI GPIO pin (connects to BNO08x DI pin)
gpio_num_t io_miso; ///<MISO GPIO pin (connects to BNO08x SDA pin)
gpio_num_t io_sclk; ///<SCLK pin (connects to BNO08x SCL pin)
gpio_num_t io_cs; /// Chip select pin (connects to BNO08x CS pin)
gpio_num_t io_int; /// Host interrupt pin (connects to BNO08x INT pin)
gpio_num_t io_rst; /// Reset pin (connects to BNO08x RST pin)
uint32_t sclk_speed; ///<Desired SPI SCLK speed in Hz (max 3MHz)
bool install_isr_service; ///<Indicates whether the ISR service for the HINT should be installed at IMU initialization, (if gpio_install_isr_service() is called before initialize() set this to false)
/// @brief Default IMU configuration settings constructor.
/// To modify default GPIO pins, run "idf.py menuconfig" esp32_BNO08x->GPIO Configuration.
/// Alternatively, edit the default values in "Kconfig.projbuild"
bno08x_config_t(bool install_isr_service = true)
: spi_peripheral((spi_host_device_t) CONFIG_ESP32_BNO08x_SPI_HOST)
, io_mosi(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_DI)) // default: 23
, io_miso(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_SDA)) // default: 19
, io_sclk(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_SCL)) // default: 18
, io_cs(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_CS)) // default: 33
, io_int(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_HINT)) // default: 26
, io_rst(static_cast<gpio_num_t>(CONFIG_ESP32_BNO08X_GPIO_RST)) // default: 32
, sclk_speed(static_cast<uint32_t>(CONFIG_ESP32_BNO08X_SCL_SPEED_HZ)) // default: 2MHz
, install_isr_service(install_isr_service) // default: true
{
}
/// @brief Overloaded IMU configuration settings constructor for custom pin settings
bno08x_config_t(spi_host_device_t spi_peripheral, gpio_num_t io_mosi, gpio_num_t io_miso, gpio_num_t io_sclk, gpio_num_t io_cs,
gpio_num_t io_int, gpio_num_t io_rst, uint32_t sclk_speed, bool install_isr_service = true)
: spi_peripheral(spi_peripheral)
, io_mosi(io_mosi)
, io_miso(io_miso)
, io_sclk(io_sclk)
, io_cs(io_cs)
, io_int(io_int)
, io_rst(io_rst)
, sclk_speed(sclk_speed)
, install_isr_service(install_isr_service)
{
}
} bno08x_config_t;
/// @brief Struct to represent unit quaternion. /// @brief Struct to represent unit quaternion.
typedef struct bno08x_quat_t typedef struct bno08x_quat_t
{ {
@ -783,4 +783,4 @@ typedef struct bno08x_meta_data_t
} }
} bno08x_meta_data_t; } bno08x_meta_data_t;
typedef bno08x_config_t imu_config_t; // legacy version compatibility static const constexpr uint8_t TOTAL_RPT_COUNT = 38; ///< Amount of possible reports returned from BNO08x.

View File

@ -0,0 +1,137 @@
/**
* @file BNO08xPrivateTypes.hpp
* @author Myles Parfeniuk
*/
#pragma once
// etl includes
#include <etl/vector.h>
#include <etl/variant.h>
// esp-idf includes
#include <freertos/FreeRTOS.h>
#include <freertos/semphr.h>
#include <freertos/event_groups.h>
// in-house includes
#include "BNO08xGlobalTypes.hpp"
#include "BNO08xCbParamRptID.hpp"
#include "BNO08xCbParamVoid.hpp"
namespace BNO08xPrivateTypes
{
using bno08x_cb_list_t = etl::vector<etl::variant<BNO08xCbParamVoid, BNO08xCbParamRptID>,
CONFIG_ESP32_BNO08X_CB_MAX>; ///< Alias for vector type to contain both cb flavors.
/// @brief Holds info about which functionality has been successfully initialized (used by deconstructor during cleanup).
typedef struct bno08x_init_status_t
{
bool gpio_outputs; ///< True if GPIO outputs have been initialized.
bool gpio_inputs; ///< True if GPIO inputs have been initialized.
bool isr_service; ///< True if global ISR service has been initialized.
bool isr_handler; ///< True if HINT ISR handler has been initialized.
bool spi_bus; ///< True if spi_bus_initialize() has been called successfully.
bool spi_device; ///< True if spi_bus_add_device() has been called successfully.
bool sh2_HAL; ///< True if sh2_open() has been called successfully.
bool data_proc_task; ///< True if xTaskCreate has been called successfully for data_proc_task.
bool sh2_HAL_service_task; ///< True if xTaskCreate has been called successfully for sh2_HAL_service_task.
bool cb_task; ///< True if xTaskCreate has been called successfully for cb_task.
bno08x_init_status_t()
: gpio_outputs(false)
, gpio_inputs(false)
, isr_service(false)
, isr_handler(false)
, spi_bus(false)
, spi_device(false)
, data_proc_task(false)
, sh2_HAL_service_task(false)
, cb_task(false)
{
}
} bno08x_init_status_t;
/// @brief Holds info used to initialize report modules.
typedef struct bno08x_report_info_t
{
uint8_t ID;
EventBits_t rpt_bit;
SemaphoreHandle_t* _sh2_HAL_lock;
SemaphoreHandle_t* _data_lock;
EventGroupHandle_t* _evt_grp_rpt_en;
EventGroupHandle_t* _evt_grp_rpt_data_available;
EventGroupHandle_t* _evt_grp_bno08x_task;
etl::vector<uint8_t, TOTAL_RPT_COUNT>* _en_report_ids;
bno08x_cb_list_t* _cb_list;
bno08x_report_info_t(uint8_t ID, EventBits_t rpt_bit, SemaphoreHandle_t* _sh2_HAL_lock, SemaphoreHandle_t* _data_lock,
EventGroupHandle_t* _evt_grp_rpt_en, EventGroupHandle_t* _evt_grp_rpt_data_available, EventGroupHandle_t* _evt_grp_bno08x_task,
etl::vector<uint8_t, TOTAL_RPT_COUNT>* _en_report_ids, bno08x_cb_list_t* _cb_list)
: ID(ID)
, rpt_bit(rpt_bit)
, _sh2_HAL_lock(_sh2_HAL_lock)
, _data_lock(_data_lock)
, _evt_grp_rpt_en(_evt_grp_rpt_en)
, _evt_grp_rpt_data_available(_evt_grp_rpt_data_available)
, _evt_grp_bno08x_task(_evt_grp_bno08x_task)
, _en_report_ids(_en_report_ids)
, _cb_list(_cb_list)
{
}
} bno08x_report_info_t;
inline static sh2_SensorConfig default_sensor_cfg = {.changeSensitivityEnabled = false, ///<TODO
.changeSensitivityRelative = false,
.wakeupEnabled = false,
.alwaysOnEnabled = false,
.changeSensitivity = 0,
.reportInterval_us = 0,
.batchInterval_us = 0,
.sensorSpecific = 0};
/// @brief Bits for evt_grp_rpt_en & evt_grp_rpt_data_available
enum bno08x_rpt_bit_t : EventBits_t
{
EVT_GRP_RPT_RV_BIT = (1UL << 0U), ///< When set, rotation vector reports are active.
EVT_GRP_RPT_RV_GAME_BIT = (1UL << 1U), ///< When set, game rotation vector reports are active.
EVT_GRP_RPT_RV_ARVR_S_BIT = (1UL << 2U), ///< When set, ARVR stabilized rotation vector reports are active.
EVT_GRP_RPT_RV_ARVR_S_GAME_BIT = (1UL << 3U), ///< When set, ARVR stabilized game rotation vector reports are active.
EVT_GRP_RPT_GYRO_INTEGRATED_RV_BIT = (1UL << 4U), ///< When set, gyro integrator rotation vector reports are active.
EVT_GRP_RPT_GEOMAG_RV_BIT = (1UL << 5U), ///< When set, geomagnetic rotation vector reports are active.
EVT_GRP_RPT_ACCELEROMETER_BIT = (1UL << 6U), ///< When set, accelerometer reports are active.
EVT_GRP_RPT_LINEAR_ACCELEROMETER_BIT = (1UL << 7U), ///< When set, linear accelerometer reports are active.
EVT_GRP_RPT_GRAVITY_BIT = (1UL << 8U), ///< When set, gravity reports are active.
EVT_GRP_RPT_CAL_GYRO_BIT = (1UL << 9U), ///< When set, calibrated gyro reports are active.
EVT_GRP_RPT_UNCAL_GYRO_BIT = (1UL << 10U), ///< When set, uncalibrated gyro reports are active.
EVT_GRP_RPT_CAL_MAGNETOMETER_BIT = (1UL << 11U), ///< When set, calibrated magnetometer reports are active.
EVT_GRP_RPT_UNCAL_MAGNETOMETER_BIT = (1UL << 12U), ///< When set, uncalibrated magnetometer reports are active.
EVT_GRP_RPT_TAP_DETECTOR_BIT = (1UL << 13U), ///< When set, tap detector reports are active.
EVT_GRP_RPT_STEP_COUNTER_BIT = (1UL << 14U), ///< When set, step counter reports are active.
EVT_GRP_RPT_STABILITY_CLASSIFIER_BIT = (1UL << 15U), ///< When set, stability classifier reports are active.
EVT_GRP_RPT_ACTIVITY_CLASSIFIER_BIT = (1UL << 16U), ///< When set, activity classifier reports are active.
EVT_GRP_RPT_SHAKE_DETECTOR_BIT = (1UL << 17U), ///< When set, shake detector reports are active.
EVT_GRP_RPT_RAW_ACCELEROMETER_BIT = (1UL << 18U), ///< When set, raw accelerometer reports are active.
EVT_GRP_RPT_RAW_GYRO_BIT = (1UL << 19U), ///< When set, raw gyro reports are active.
EVT_GRP_RPT_RAW_MAGNETOMETER_BIT = (1UL << 20U), ///< When set, raw magnetometer reports are active.
EVT_GRP_RPT_ALL = EVT_GRP_RPT_RV_BIT | EVT_GRP_RPT_RV_GAME_BIT | EVT_GRP_RPT_RV_ARVR_S_BIT | EVT_GRP_RPT_RV_ARVR_S_GAME_BIT |
EVT_GRP_RPT_LINEAR_ACCELEROMETER_BIT | EVT_GRP_RPT_GRAVITY_BIT | EVT_GRP_RPT_CAL_GYRO_BIT | EVT_GRP_RPT_UNCAL_GYRO_BIT |
EVT_GRP_RPT_CAL_MAGNETOMETER_BIT | EVT_GRP_RPT_TAP_DETECTOR_BIT | EVT_GRP_RPT_STEP_COUNTER_BIT |
EVT_GRP_RPT_STABILITY_CLASSIFIER_BIT | EVT_GRP_RPT_ACTIVITY_CLASSIFIER_BIT | EVT_GRP_RPT_RAW_ACCELEROMETER_BIT |
EVT_GRP_RPT_RAW_GYRO_BIT | EVT_GRP_RPT_RAW_MAGNETOMETER_BIT | EVT_GRP_RPT_UNCAL_MAGNETOMETER_BIT |
EVT_GRP_RPT_SHAKE_DETECTOR_BIT | EVT_GRP_RPT_ACCELEROMETER_BIT | EVT_GRP_RPT_GEOMAG_RV_BIT |
EVT_GRP_RPT_GYRO_INTEGRATED_RV_BIT
};
/// @brief Bits for evt_grp_bno08x_task
enum bno08x_tsk_bit_t : EventBits_t
{
EVT_GRP_BNO08x_TASKS_RUNNING =
(1UL << 0U), ///< When this bit is set it indicates the BNO08x tasks are running, it is always set to 1 for the duration of the BNO08x driver object. Cleared in the destructor for safe task deletion.
EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT =
(1UL << 1U), ///< When this bit is set it indicates the BNO08x has asserted its host interrupt pin, thus an SPI transaction should commence.
EVT_GRP_BNO08x_TASK_RESET_OCCURRED =
(1UL << 2U), ///< When this bit is set it indicates the SH2 HAL lib has reset the IMU, any reports enabled by the user must be re-enabled.
EVT_GRP_BNO08x_TASK_DATA_AVAILABLE =
(1UL << 3U) ///< When this bit is set it indicates a report has been received for the user to read, cleared in data_available() set/cleared in handle_sensor_report().
};
};

View File

@ -1,80 +0,0 @@
/**
* @file BNO08xRpt.hpp
* @author Myles Parfeniuk
*/
#pragma once
// standard library includes
#include <functional>
// in-house includes
#include "BNO08x_global_types.hpp"
// forward dec to prevent compile errors
class BNO08x;
/**
* @class BNO08xRpt
*
* @brief Class to represent and manage reports returned from BNO08x.
*/
class BNO08xRpt
{
public:
inline static sh2_SensorConfig default_sensor_cfg = {.changeSensitivityEnabled = false, ///<TODO
.changeSensitivityRelative = false,
.wakeupEnabled = false,
.alwaysOnEnabled = false,
.changeSensitivity = 0,
.reportInterval_us = 0,
.batchInterval_us = 0,
.sensorSpecific = 0};
bool enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg = default_sensor_cfg);
bool disable(sh2_SensorConfig_t sensor_cfg = default_sensor_cfg);
void register_cb(std::function<void(void)> cb_fxn);
bool has_new_data();
bool flush();
bool get_sample_counts(bno08x_sample_counts_t& sample_counts);
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.
uint8_t ID; ///< Report ID, ex. SH2_ACCELERATION.
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.
*
* Construct a BNO08xRpt object for managing a BNO08x sensor report.
*
* @param imu Pointer to BNO08x imu object.
* @param report_ID Report ID, ex. SH2_ACCELERATION.
* @param rpt_bit Respective enable bit for report in BNO08x::evt_grp_report_en.
* @param period_us The period/interval of the report in microseconds.
*
* @return void, nothing to return
*/
BNO08xRpt(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit)
: imu(imu)
, ID(report_ID)
, rpt_bit(rpt_bit)
, period_us(period_us)
{
}
void signal_data_available();
static const constexpr float RAD_2_DEG =
(180.0f / M_PI); ///< Constant for radian to degree conversions, sed in quaternion to euler function conversions.
static const constexpr char* TAG = "BNO08xRpt";
friend class BNO08x;
};

View File

@ -9,10 +9,11 @@
#include "sh2.h" #include "sh2.h"
#include "sh2_SensorValue.h" #include "sh2_SensorValue.h"
#include "sh2_err.h" #include "sh2_err.h"
// esp-idf includes // esp-idf includes
#include <esp_log.h> #include <esp_log.h>
#include <esp_timer.h> #include <esp_timer.h>
// in-house includes
#include "BNO08xPrivateTypes.hpp"
/** /**
* @brief Clears the most significant byte of a 16-bit value. * @brief Clears the most significant byte of a 16-bit value.

View File

@ -35,5 +35,5 @@ class BNO08xCbParamRptID : public BNO08xCbGeneric
} }
private: private:
std::function<void(uint8_t)> cb_fxn; std::function<void(uint8_t)> cb_fxn; ///< Wrapped callback function passed at register_cb().
}; };

View File

@ -34,5 +34,5 @@ class BNO08xCbParamVoid : public BNO08xCbGeneric
} }
private: private:
std::function<void(void)> cb_fxn; std::function<void(void)> cb_fxn; ///< Wrapped callback function passed at register_cb().
}; };

View File

@ -0,0 +1,23 @@
#pragma once
#include "BNO08xRptAcceleration.hpp"
#include "BNO08xRptLinearAcceleration.hpp"
#include "BNO08xRptGravity.hpp"
#include "BNO08xRptCalMagnetometer.hpp"
#include "BNO08xRptUncalMagnetometer.hpp"
#include "BNO08xRptCalGyro.hpp"
#include "BNO08xRptUncalGyro.hpp"
#include "BNO08xRptRV.hpp"
#include "BNO08xRptGameRV.hpp"
#include "BNO08xRptARVRStabilizedRV.hpp"
#include "BNO08xRptARVRStabilizedGameRV.hpp"
#include "BNO08xRptIGyroRV.hpp"
#include "BNO08xRptRVGeomag.hpp"
#include "BNO08xRptRawMEMSGyro.hpp"
#include "BNO08xRptRawMEMSAccelerometer.hpp"
#include "BNO08xRptRawMEMSMagnetometer.hpp"
#include "BNO08xRptStepCounter.hpp"
#include "BNO08xRptActivityClassifier.hpp"
#include "BNO08xStabilityClassifier.hpp"
#include "BNO08xShakeDetector.hpp"
#include "BNO08xTapDetector.hpp"

View File

@ -0,0 +1,90 @@
/**
* @file BNO08xRpt.hpp
* @author Myles Parfeniuk
*/
#pragma once
// standard library includes
#include <functional>
// in-house includes
#include "BNO08xGlobalTypes.hpp"
#include "BNO08xPrivateTypes.hpp"
// hill-crest labs includes (apache 2.0 license, compatible with MIT)
#include "sh2.h"
#include "sh2_SensorValue.h"
#include "sh2_err.h"
/**
* @class BNO08xRpt
*
* @brief Class to represent and manage reports returned from BNO08x.
*/
class BNO08xRpt
{
public:
bool enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg = BNO08xPrivateTypes::default_sensor_cfg);
bool disable(sh2_SensorConfig_t sensor_cfg = BNO08xPrivateTypes::default_sensor_cfg);
bool register_cb(std::function<void(void)> cb_fxn);
bool has_new_data();
bool flush();
bool get_sample_counts(bno08x_sample_counts_t& sample_counts);
bool clear_sample_counts();
bool get_meta_data(bno08x_meta_data_t& meta_data);
uint8_t ID; ///< Report ID, ex. SH2_ACCELERATION.
EventBits_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.
protected:
SemaphoreHandle_t* _sh2_HAL_lock; ///<Mutex to prevent sh2 HAL lib functions from being accessed at same time.
SemaphoreHandle_t* _data_lock; ///<Mutex to prevent user from reading data while data_proc_task() updates it, and vice versa.
EventGroupHandle_t* _evt_grp_rpt_en; ///<Event group for indicating which reports are currently enabled.
EventGroupHandle_t*
_evt_grp_rpt_data_available; ///< Event group for indicating to BNO08xRpt::has_new_data() that a module received a new report since the last time it was called (note this group is unaffected by data read through callbacks).
EventGroupHandle_t* _evt_grp_bno08x_task; ///<Event group for indicating various BNO08x related events between tasks.
etl::vector<uint8_t, TOTAL_RPT_COUNT>* _en_report_ids; ///< Vector to contain IDs of currently enabled reports
BNO08xPrivateTypes::bno08x_cb_list_t* _cb_list; ///< Vector to contain registered callbacks.
virtual void update_data(sh2_SensorValue_t* sensor_val) = 0;
/**
* @brief BNO08xRpt report constructor.
*
* Construct a BNO08xRpt object for managing a BNO08x sensor report.
*
* @param imu Pointer to BNO08x imu object.
* @param report_ID Report ID, ex. SH2_ACCELERATION.
* @param rpt_bit Respective enable bit for report in BNO08x::evt_grp_report_en.
* @param period_us The period/interval of the report in microseconds.
*
* @return void, nothing to return
*/
BNO08xRpt(BNO08xPrivateTypes::bno08x_report_info_t info)
: ID(info.ID)
, rpt_bit(info.rpt_bit)
, period_us(0UL)
, _sh2_HAL_lock(info._sh2_HAL_lock)
, _data_lock(info._data_lock)
, _evt_grp_rpt_en(info._evt_grp_rpt_en)
, _evt_grp_rpt_data_available(info._evt_grp_rpt_data_available)
, _evt_grp_bno08x_task(info._evt_grp_bno08x_task)
, _en_report_ids(info._en_report_ids)
, _cb_list(info._cb_list)
{
}
void unlock_sh2_HAL();
void lock_sh2_HAL();
void unlock_user_data();
void lock_user_data();
void signal_data_available();
static const constexpr float RAD_2_DEG =
(180.0f / M_PI); ///< Constant for radian to degree conversions, sed in quaternion to euler function conversions.
static const constexpr char* TAG = "BNO08xRpt";
friend class BNO08x;
};

View File

@ -15,8 +15,8 @@
class BNO08xRptARVRStabilizedGameRV : public BNO08xRptRVGeneric class BNO08xRptARVRStabilizedGameRV : public BNO08xRptRVGeneric
{ {
public: public:
BNO08xRptARVRStabilizedGameRV(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptARVRStabilizedGameRV(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRptRVGeneric(imu, report_ID, period_us, rpt_bit) : BNO08xRptRVGeneric(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptARVRStabilizedRV : public BNO08xRptRVGeneric class BNO08xRptARVRStabilizedRV : public BNO08xRptRVGeneric
{ {
public: public:
BNO08xRptARVRStabilizedRV(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptARVRStabilizedRV(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRptRVGeneric(imu, report_ID, period_us, rpt_bit) : BNO08xRptRVGeneric(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptAcceleration : public BNO08xRpt class BNO08xRptAcceleration : public BNO08xRpt
{ {
public: public:
BNO08xRptAcceleration(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptAcceleration(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,12 +15,13 @@
class BNO08xRptActivityClassifier : public BNO08xRpt class BNO08xRptActivityClassifier : public BNO08xRpt
{ {
public: public:
BNO08xRptActivityClassifier(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptActivityClassifier(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }
bool enable(uint32_t time_between_reports, BNO08xActivityEnable activities_to_enable, sh2_SensorConfig_t sensor_cfg = default_sensor_cfg); bool enable(uint32_t time_between_reports, BNO08xActivityEnable activities_to_enable,
sh2_SensorConfig_t sensor_cfg = BNO08xPrivateTypes::default_sensor_cfg);
bno08x_activity_classifier_t get(); bno08x_activity_classifier_t get();
BNO08xActivity get_most_likely_activity(); BNO08xActivity get_most_likely_activity();

View File

@ -15,8 +15,8 @@
class BNO08xRptCalGyro : public BNO08xRpt class BNO08xRptCalGyro : public BNO08xRpt
{ {
public: public:
BNO08xRptCalGyro(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptCalGyro(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptCalMagnetometer : public BNO08xRpt class BNO08xRptCalMagnetometer : public BNO08xRpt
{ {
public: public:
BNO08xRptCalMagnetometer(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptCalMagnetometer(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptGameRV : public BNO08xRptRVGeneric class BNO08xRptGameRV : public BNO08xRptRVGeneric
{ {
public: public:
BNO08xRptGameRV(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptGameRV(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRptRVGeneric(imu, report_ID, period_us, rpt_bit) : BNO08xRptRVGeneric(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptGravity : public BNO08xRpt class BNO08xRptGravity : public BNO08xRpt
{ {
public: public:
BNO08xRptGravity(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptGravity(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptIGyroRV : public BNO08xRptRVGeneric class BNO08xRptIGyroRV : public BNO08xRptRVGeneric
{ {
public: public:
BNO08xRptIGyroRV(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptIGyroRV(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRptRVGeneric(imu, report_ID, period_us, rpt_bit) : BNO08xRptRVGeneric(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptLinearAcceleration : public BNO08xRpt class BNO08xRptLinearAcceleration : public BNO08xRpt
{ {
public: public:
BNO08xRptLinearAcceleration(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptLinearAcceleration(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptRV : public BNO08xRptRVGeneric class BNO08xRptRV : public BNO08xRptRVGeneric
{ {
public: public:
BNO08xRptRV(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptRV(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRptRVGeneric(imu, report_ID, period_us, rpt_bit) : BNO08xRptRVGeneric(info)
{ {
} }

View File

@ -19,8 +19,8 @@ class BNO08xRptRVGeneric : public BNO08xRpt
bno08x_euler_angle_t get_euler(bool in_degrees = true); bno08x_euler_angle_t get_euler(bool in_degrees = true);
protected: protected:
BNO08xRptRVGeneric(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptRVGeneric(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }
bool tare(bool x, bool y, bool z, sh2_TareBasis_t basis); bool tare(bool x, bool y, bool z, sh2_TareBasis_t basis);

View File

@ -15,8 +15,8 @@
class BNO08xRptRVGeomag : public BNO08xRptRVGeneric class BNO08xRptRVGeomag : public BNO08xRptRVGeneric
{ {
public: public:
BNO08xRptRVGeomag(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptRVGeomag(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRptRVGeneric(imu, report_ID, period_us, rpt_bit) : BNO08xRptRVGeneric(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptRawMEMSAccelerometer : public BNO08xRpt class BNO08xRptRawMEMSAccelerometer : public BNO08xRpt
{ {
public: public:
BNO08xRptRawMEMSAccelerometer(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptRawMEMSAccelerometer(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptRawMEMSGyro : public BNO08xRpt class BNO08xRptRawMEMSGyro : public BNO08xRpt
{ {
public: public:
BNO08xRptRawMEMSGyro(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptRawMEMSGyro(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptRawMEMSMagnetometer : public BNO08xRpt class BNO08xRptRawMEMSMagnetometer : public BNO08xRpt
{ {
public: public:
BNO08xRptRawMEMSMagnetometer(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptRawMEMSMagnetometer(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptStepCounter : public BNO08xRpt class BNO08xRptStepCounter : public BNO08xRpt
{ {
public: public:
BNO08xRptStepCounter(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptStepCounter(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xRptUncalGyro : public BNO08xRpt class BNO08xRptUncalGyro : public BNO08xRpt
{ {
public: public:
BNO08xRptUncalGyro(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptUncalGyro(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -16,8 +16,8 @@
class BNO08xRptUncalMagnetometer : public BNO08xRpt class BNO08xRptUncalMagnetometer : public BNO08xRpt
{ {
public: public:
BNO08xRptUncalMagnetometer(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xRptUncalMagnetometer(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xShakeDetector : public BNO08xRpt class BNO08xShakeDetector : public BNO08xRpt
{ {
public: public:
BNO08xShakeDetector(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xShakeDetector(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,8 +15,8 @@
class BNO08xStabilityClassifier : public BNO08xRpt class BNO08xStabilityClassifier : public BNO08xRpt
{ {
public: public:
BNO08xStabilityClassifier(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xStabilityClassifier(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }

View File

@ -15,12 +15,12 @@
class BNO08xTapDetector : public BNO08xRpt class BNO08xTapDetector : public BNO08xRpt
{ {
public: public:
BNO08xTapDetector(BNO08x* imu, uint8_t report_ID, uint32_t period_us, uint32_t rpt_bit) BNO08xTapDetector(BNO08xPrivateTypes::bno08x_report_info_t info)
: BNO08xRpt(imu, report_ID, period_us, rpt_bit) : BNO08xRpt(info)
{ {
} }
bool enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg = default_sensor_cfg); bool enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg = BNO08xPrivateTypes::default_sensor_cfg);
bno08x_tap_detector_t get(); bno08x_tap_detector_t get();
private: private:

View File

@ -4,6 +4,9 @@
*/ */
#include "BNO08x.hpp" #include "BNO08x.hpp"
#include "BNO08xPrivateTypes.hpp"
using namespace BNO08xPrivateTypes;
/** /**
* @brief BNO08x imu constructor. * @brief BNO08x imu constructor.
@ -14,27 +17,48 @@
* @return void, nothing to return * @return void, nothing to return
*/ */
BNO08x::BNO08x(bno08x_config_t imu_config) BNO08x::BNO08x(bno08x_config_t imu_config)
: accelerometer(this, SH2_ACCELEROMETER, 0UL, EVT_GRP_RPT_ACCELEROMETER_BIT) : accelerometer(bno08x_report_info_t(SH2_ACCELEROMETER, EVT_GRP_RPT_ACCELEROMETER_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
, linear_accelerometer(this, SH2_LINEAR_ACCELERATION, 0UL, EVT_GRP_RPT_LINEAR_ACCELEROMETER_BIT) &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, gravity(this, SH2_GRAVITY, 0UL, EVT_GRP_RPT_GRAVITY_BIT) , linear_accelerometer(bno08x_report_info_t(SH2_LINEAR_ACCELERATION, EVT_GRP_RPT_LINEAR_ACCELEROMETER_BIT, &sh2_HAL_lock, &data_lock,
, cal_magnetometer(this, SH2_MAGNETIC_FIELD_CALIBRATED, 0UL, EVT_GRP_RPT_CAL_MAGNETOMETER_BIT) &evt_grp_report_en, &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, uncal_magnetometer(this, SH2_MAGNETIC_FIELD_UNCALIBRATED, 0UL, EVT_GRP_RPT_UNCAL_MAGNETOMETER_BIT) , gravity(bno08x_report_info_t(SH2_GRAVITY, EVT_GRP_RPT_GRAVITY_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
, cal_gyro(this, SH2_GYROSCOPE_CALIBRATED, 0UL, EVT_GRP_RPT_CAL_GYRO_BIT) &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, uncal_gyro(this, SH2_GYROSCOPE_UNCALIBRATED, 0UL, EVT_GRP_RPT_UNCAL_GYRO_BIT) , cal_magnetometer(bno08x_report_info_t(SH2_MAGNETIC_FIELD_CALIBRATED, EVT_GRP_RPT_CAL_MAGNETOMETER_BIT, &sh2_HAL_lock, &data_lock,
, rv(this, SH2_ROTATION_VECTOR, 0UL, EVT_GRP_RPT_RV_BIT) &evt_grp_report_en, &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, rv_game(this, SH2_GAME_ROTATION_VECTOR, 0UL, EVT_GRP_RPT_RV_GAME_BIT) , uncal_magnetometer(bno08x_report_info_t(SH2_MAGNETIC_FIELD_UNCALIBRATED, EVT_GRP_RPT_UNCAL_MAGNETOMETER_BIT, &sh2_HAL_lock, &data_lock,
, rv_ARVR_stabilized(this, SH2_ARVR_STABILIZED_RV, 0UL, EVT_GRP_RPT_RV_ARVR_S_BIT) &evt_grp_report_en, &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, rv_ARVR_stabilized_game(this, SH2_ARVR_STABILIZED_GRV, 0UL, EVT_GRP_RPT_RV_ARVR_S_GAME_BIT) , cal_gyro(bno08x_report_info_t(SH2_GYROSCOPE_CALIBRATED, EVT_GRP_RPT_CAL_GYRO_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
, rv_gyro_integrated(this, SH2_GYRO_INTEGRATED_RV, 0UL, EVT_GRP_RPT_GYRO_INTEGRATED_RV_BIT) &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, rv_geomagnetic(this, SH2_GEOMAGNETIC_ROTATION_VECTOR, 0UL, EVT_GRP_RPT_GEOMAG_RV_BIT) , uncal_gyro(bno08x_report_info_t(SH2_GYROSCOPE_UNCALIBRATED, EVT_GRP_RPT_UNCAL_GYRO_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
, raw_gyro(this, SH2_RAW_GYROSCOPE, 0UL, EVT_GRP_RPT_RAW_GYRO_BIT) &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, raw_accelerometer(this, SH2_RAW_ACCELEROMETER, 0UL, EVT_GRP_RPT_RAW_ACCELEROMETER_BIT) , rv(bno08x_report_info_t(SH2_ROTATION_VECTOR, EVT_GRP_RPT_RV_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en, &evt_grp_report_data_available,
, raw_magnetometer(this, SH2_RAW_MAGNETOMETER, 0UL, EVT_GRP_RPT_RAW_MAGNETOMETER_BIT) &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, step_counter(this, SH2_STEP_COUNTER, 0UL, EVT_GRP_RPT_STEP_COUNTER_BIT) , rv_game(bno08x_report_info_t(SH2_GAME_ROTATION_VECTOR, EVT_GRP_RPT_RV_GAME_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
, activity_classifier(this, SH2_PERSONAL_ACTIVITY_CLASSIFIER, 0UL, EVT_GRP_RPT_ACTIVITY_CLASSIFIER_BIT) &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, stability_classifier(this, SH2_STABILITY_CLASSIFIER, 0UL, EVT_GRP_RPT_STABILITY_CLASSIFIER_BIT) , rv_ARVR_stabilized(bno08x_report_info_t(SH2_ARVR_STABILIZED_RV, EVT_GRP_RPT_RV_ARVR_S_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
, shake_detector(this, SH2_SHAKE_DETECTOR, 0UL, EVT_GRP_RPT_SHAKE_DETECTOR_BIT) &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, tap_detector(this, SH2_TAP_DETECTOR, 0UL, EVT_GRP_RPT_TAP_DETECTOR_BIT) , rv_ARVR_stabilized_game(bno08x_report_info_t(SH2_ARVR_STABILIZED_GRV, EVT_GRP_RPT_RV_ARVR_S_GAME_BIT, &sh2_HAL_lock, &data_lock,
&evt_grp_report_en, &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, rv_gyro_integrated(bno08x_report_info_t(SH2_GYRO_INTEGRATED_RV, EVT_GRP_RPT_GYRO_INTEGRATED_RV_BIT, &sh2_HAL_lock, &data_lock,
&evt_grp_report_en, &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, rv_geomagnetic(bno08x_report_info_t(SH2_GEOMAGNETIC_ROTATION_VECTOR, EVT_GRP_RPT_GEOMAG_RV_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
&evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, raw_gyro(bno08x_report_info_t(SH2_RAW_GYROSCOPE, EVT_GRP_RPT_RAW_GYRO_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
&evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, raw_accelerometer(bno08x_report_info_t(SH2_RAW_ACCELEROMETER, EVT_GRP_RPT_RAW_ACCELEROMETER_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
&evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, raw_magnetometer(bno08x_report_info_t(SH2_RAW_MAGNETOMETER, EVT_GRP_RPT_RAW_MAGNETOMETER_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
&evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, step_counter(bno08x_report_info_t(SH2_STEP_COUNTER, EVT_GRP_RPT_STEP_COUNTER_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
&evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, activity_classifier(bno08x_report_info_t(SH2_PERSONAL_ACTIVITY_CLASSIFIER, EVT_GRP_RPT_ACTIVITY_CLASSIFIER_BIT, &sh2_HAL_lock, &data_lock,
&evt_grp_report_en, &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, stability_classifier(bno08x_report_info_t(SH2_STABILITY_CLASSIFIER, EVT_GRP_RPT_STABILITY_CLASSIFIER_BIT, &sh2_HAL_lock, &data_lock,
&evt_grp_report_en, &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, shake_detector(bno08x_report_info_t(SH2_SHAKE_DETECTOR, EVT_GRP_RPT_SHAKE_DETECTOR_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
&evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, tap_detector(bno08x_report_info_t(SH2_TAP_DETECTOR, EVT_GRP_RPT_TAP_DETECTOR_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
&evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, data_proc_task_hdl(NULL) , data_proc_task_hdl(NULL)
, sh2_HAL_service_task_hdl(NULL) , sh2_HAL_service_task_hdl(NULL)
, cb_task_hdl(NULL) , cb_task_hdl(NULL)
@ -261,8 +285,19 @@ void BNO08x::cb_task()
do do
{ {
// execute callbacks // execute callbacks
for (auto& cb_entry : cb_ptr_list) for (auto& cb_entry : cb_list)
handle_cb(rpt_ID, cb_entry); {
BNO08xCbGeneric* cb_ptr = nullptr;
if (auto* ptr = etl::get_if<BNO08xCbParamVoid>(&cb_entry))
cb_ptr = ptr;
else if (auto* ptr = etl::get_if<BNO08xCbParamRptID>(&cb_entry))
cb_ptr = ptr;
if (cb_ptr != nullptr)
handle_cb(rpt_ID, cb_ptr);
}
xQueueReceive(queue_cb_report_id, &rpt_ID, portMAX_DELAY); xQueueReceive(queue_cb_report_id, &rpt_ID, portMAX_DELAY);
@ -339,7 +374,7 @@ void BNO08x::handle_sensor_report(sh2_SensorValue_t* sensor_val)
// update respective report with new data // update respective report with new data
rpt->update_data(sensor_val); rpt->update_data(sensor_val);
if (cb_ptr_list.size() != 0) if (cb_list.size() != 0)
if (xQueueSend(queue_cb_report_id, &rpt_ID, 0) != pdTRUE) if (xQueueSend(queue_cb_report_id, &rpt_ID, 0) != pdTRUE)
{ {
// clang-format off // clang-format off
@ -1264,14 +1299,18 @@ esp_err_t BNO08x::re_enable_reports()
{ {
EventBits_t report_en_bits = xEventGroupGetBits(evt_grp_report_en); EventBits_t report_en_bits = xEventGroupGetBits(evt_grp_report_en);
// loop through all entries of map and check if they are enabled for (const auto& rpt_ID : en_report_ids)
for (auto entry = usr_reports.begin(); entry != usr_reports.end(); ++entry)
{ {
BNO08xRpt* rpt = entry->second; BNO08xRpt* rpt = usr_reports.at(rpt_ID);
//all reports in map passed this point should be null
if (rpt == nullptr) if (rpt == nullptr)
break; {
// clang-format off
#ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS
ESP_LOGE(TAG, "NULL pointer detected in usr_reports map for enabled report.");
#endif
// clang-format on
continue;
}
if (rpt->rpt_bit & report_en_bits) if (rpt->rpt_bit & report_en_bits)
{ {
@ -1314,10 +1353,15 @@ bool BNO08x::data_available()
* *
* @return void, nothing to return * @return void, nothing to return
*/ */
void BNO08x::register_cb(std::function<void(void)> cb_fxn) bool BNO08x::register_cb(std::function<void(void)> cb_fxn)
{ {
cb_list_void_param.push_back(BNO08xCbParamVoid(cb_fxn, 0U));
cb_ptr_list.push_back(static_cast<BNO08xCbGeneric*>(&cb_list_void_param.back())); if (cb_list.size() < CONFIG_ESP32_BNO08X_CB_MAX)
{
cb_list.push_back(BNO08xCbParamVoid(cb_fxn, 0U));
return true;
}
return false;
} }
/** /**
@ -1327,10 +1371,14 @@ void BNO08x::register_cb(std::function<void(void)> cb_fxn)
* *
* @return void, nothing to return * @return void, nothing to return
*/ */
void BNO08x::register_cb(std::function<void(uint8_t report_ID)> cb_fxn) bool BNO08x::register_cb(std::function<void(uint8_t report_ID)> cb_fxn)
{ {
cb_list_rpt_param.push_back(BNO08xCbParamRptID(cb_fxn, 0U)); if (cb_list.size() < CONFIG_ESP32_BNO08X_CB_MAX)
cb_ptr_list.push_back(static_cast<BNO08xCbGeneric*>(&cb_list_rpt_param.back())); {
cb_list.push_back(BNO08xCbParamRptID(cb_fxn, 0U));
return true;
}
return false;
} }
/** /**

View File

@ -4,13 +4,12 @@
*/ */
#include "BNO08xRpt.hpp" #include "BNO08xRpt.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Enables a sensor report such that the BNO08x begins sending it. * @brief Enables a sensor report such that the BNO08x begins sending it.
* *
* @param report_period_us The period/interval of the report in microseconds. * @param report_period_us The period/interval of the report in microseconds.
* @param sensor_cfg Sensor special configuration (optional, see BNO08xRpt::default_sensor_cfg for defaults). * @param sensor_cfg Sensor special configuration (optional, see BNO08xPrivateTypes::default_sensor_cfg for defaults).
* *
* @return True if report was successfully enabled. * @return True if report was successfully enabled.
*/ */
@ -18,13 +17,13 @@ bool BNO08xRpt::enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_
{ {
int sh2_res = SH2_OK; int sh2_res = SH2_OK;
xEventGroupClearBits(imu->evt_grp_report_en, rpt_bit); // Set the event group bit EventBits_t report_en_bits = xEventGroupGetBits(*_evt_grp_rpt_en);
sensor_cfg.reportInterval_us = time_between_reports; sensor_cfg.reportInterval_us = time_between_reports;
imu->lock_sh2_HAL(); lock_sh2_HAL();
sh2_res = sh2_setSensorConfig(ID, &sensor_cfg); sh2_res = sh2_setSensorConfig(ID, &sensor_cfg);
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
if (sh2_res != SH2_OK) if (sh2_res != SH2_OK)
{ {
@ -32,9 +31,16 @@ bool BNO08xRpt::enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_
} }
else else
{ {
period_us = time_between_reports; // Update the period
xEventGroupSetBits(imu->evt_grp_report_en, rpt_bit); // Set the event group bit
vTaskDelay(30UL / portTICK_PERIOD_MS); // delay a bit to allow command to execute vTaskDelay(30UL / portTICK_PERIOD_MS); // delay a bit to allow command to execute
period_us = time_between_reports; // update the period
// if not already enabled (ie user called this, not re_enable_reports())
if (!(report_en_bits & rpt_bit))
{
_en_report_ids->push_back(ID); // add report ID to enabled report IDs
xEventGroupSetBits(*_evt_grp_rpt_en, rpt_bit); // set the event group bit
}
return true; return true;
} }
} }
@ -49,14 +55,30 @@ bool BNO08xRpt::enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_
*/ */
bool BNO08xRpt::disable(sh2_SensorConfig_t sensor_cfg) bool BNO08xRpt::disable(sh2_SensorConfig_t sensor_cfg)
{ {
EventBits_t evt_grp_report_en_bits = xEventGroupGetBits(imu->evt_grp_report_en); int16_t idx = -1;
if (evt_grp_report_en_bits & rpt_bit)
{
if (!enable(0UL, sensor_cfg)) if (!enable(0UL, sensor_cfg))
{
return false; return false;
}
else else
xEventGroupClearBits(imu->evt_grp_report_en, rpt_bit); // Set the event group bit {
for (int i = 0; i < _en_report_ids->size(); i++)
{
if (_en_report_ids->at(i) == ID)
{
idx = i;
break;
}
}
vTaskDelay(30UL / portTICK_PERIOD_MS); // delay a bit to allow command to execute
period_us = 0UL; // update the period
if (idx != -1)
_en_report_ids->erase(_en_report_ids->begin() + idx);
xEventGroupClearBits(*_evt_grp_rpt_en, rpt_bit); // Set the event group bit
} }
return true; return true;
@ -69,10 +91,14 @@ bool BNO08xRpt::disable(sh2_SensorConfig_t sensor_cfg)
* *
* @return void, nothing to return * @return void, nothing to return
*/ */
void BNO08xRpt::register_cb(std::function<void(void)> cb_fxn) bool BNO08xRpt::register_cb(std::function<void(void)> cb_fxn)
{ {
imu->cb_list_void_param.push_back(BNO08xCbParamVoid(cb_fxn, ID)); if (_cb_list->size() < CONFIG_ESP32_BNO08X_CB_MAX)
imu->cb_ptr_list.push_back(static_cast<BNO08xCbGeneric*>(&imu->cb_list_void_param.back())); {
_cb_list->push_back(BNO08xCbParamVoid(cb_fxn, ID));
return true;
}
return false;
} }
/** /**
@ -85,10 +111,10 @@ bool BNO08xRpt::has_new_data()
{ {
bool new_data = false; bool new_data = false;
if (xEventGroupGetBits(imu->evt_grp_report_data_available) & rpt_bit) if (xEventGroupGetBits(*_evt_grp_rpt_data_available) & rpt_bit)
{ {
new_data = true; new_data = true;
xEventGroupClearBits(imu->evt_grp_report_data_available, rpt_bit); xEventGroupClearBits(*_evt_grp_rpt_data_available, rpt_bit);
} }
return new_data; return new_data;
@ -103,9 +129,9 @@ bool BNO08xRpt::flush()
{ {
int success = SH2_OK; int success = SH2_OK;
imu->lock_sh2_HAL(); lock_sh2_HAL();
success = sh2_flush(ID); success = sh2_flush(ID);
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
return (success != SH2_OK) ? false : true; return (success != SH2_OK) ? false : true;
} }
@ -122,9 +148,9 @@ bool BNO08xRpt::get_sample_counts(bno08x_sample_counts_t& sample_counts)
int success = SH2_OK; int success = SH2_OK;
sh2_Counts_t pCounts; sh2_Counts_t pCounts;
imu->lock_sh2_HAL(); lock_sh2_HAL();
success = sh2_getCounts(ID, &pCounts); success = sh2_getCounts(ID, &pCounts);
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
if (success != SH2_OK) if (success != SH2_OK)
{ {
@ -146,9 +172,9 @@ bool BNO08xRpt::clear_sample_counts()
{ {
int success = SH2_OK; int success = SH2_OK;
imu->lock_sh2_HAL(); lock_sh2_HAL();
success = sh2_clearCounts(ID); success = sh2_clearCounts(ID);
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
return (success == SH2_OK); return (success == SH2_OK);
} }
@ -166,9 +192,9 @@ bool BNO08xRpt::get_meta_data(bno08x_meta_data_t& meta_data)
sh2_SensorMetadata_t sensor_meta_data; sh2_SensorMetadata_t sensor_meta_data;
imu->lock_sh2_HAL(); lock_sh2_HAL();
success = sh2_getMetadata(ID, &sensor_meta_data); success = sh2_getMetadata(ID, &sensor_meta_data);
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
if (success == SH2_OK) if (success == SH2_OK)
meta_data = sensor_meta_data; meta_data = sensor_meta_data;
@ -176,6 +202,46 @@ bool BNO08xRpt::get_meta_data(bno08x_meta_data_t& meta_data)
return (success == SH2_OK); return (success == SH2_OK);
} }
/**
* @brief Locks sh2 HAL lib to only allow the calling task to call its APIs.
*
* @return void, nothing to return
*/
void BNO08xRpt::lock_sh2_HAL()
{
xSemaphoreTake(*_sh2_HAL_lock, portMAX_DELAY);
}
/**
* @brief Unlocks sh2 HAL lib to allow other tasks to call its APIs.
*
* @return void, nothing to return
*/
void BNO08xRpt::unlock_sh2_HAL()
{
xSemaphoreGive(*_sh2_HAL_lock);
}
/**
* @brief Locks locks user data to only allow the calling task to read/modify it.
*
* @return void, nothing to return
*/
void BNO08xRpt::lock_user_data()
{
xSemaphoreTake(*_data_lock, portMAX_DELAY);
}
/**
* @brief Unlocks user data to allow other tasks to read/modify it.
*
* @return void, nothing to return
*/
void BNO08xRpt::unlock_user_data()
{
xSemaphoreGive(*_data_lock);
}
/** /**
* @brief Signals to BNO08x::data_available() that a new report has arrived. * @brief Signals to BNO08x::data_available() that a new report has arrived.
* *
@ -183,6 +249,6 @@ bool BNO08xRpt::get_meta_data(bno08x_meta_data_t& meta_data)
*/ */
void BNO08xRpt::signal_data_available() void BNO08xRpt::signal_data_available()
{ {
xEventGroupSetBits(imu->evt_grp_report_data_available, rpt_bit); xEventGroupSetBits(*_evt_grp_rpt_data_available, rpt_bit);
xEventGroupSetBits(imu->evt_grp_bno08x_task, BNO08x::EVT_GRP_BNO08x_TASK_DATA_AVAILABLE); xEventGroupSetBits(*_evt_grp_bno08x_task, BNO08xPrivateTypes::EVT_GRP_BNO08x_TASK_DATA_AVAILABLE);
} }

View File

@ -136,7 +136,7 @@ uint32_t BNO08xSH2HAL::get_time_us(sh2_Hal_t* self)
void BNO08xSH2HAL::hal_cb(void* cookie, sh2_AsyncEvent_t* pEvent) void BNO08xSH2HAL::hal_cb(void* cookie, sh2_AsyncEvent_t* pEvent)
{ {
if (pEvent->eventId == SH2_RESET) if (pEvent->eventId == SH2_RESET)
xEventGroupSetBits(imu->evt_grp_bno08x_task, BNO08x::EVT_GRP_BNO08x_TASK_RESET_OCCURRED); xEventGroupSetBits(imu->evt_grp_bno08x_task, BNO08xPrivateTypes::EVT_GRP_BNO08x_TASK_RESET_OCCURRED);
} }
/** /**

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptARVRStabilizedGameRV.hpp" #include "BNO08xRptARVRStabilizedGameRV.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates ARVR stabilized game rotation vector data from decoded sensor event. * @brief Updates ARVR stabilized game rotation vector data from decoded sensor event.
@ -15,11 +14,11 @@
*/ */
void BNO08xRptARVRStabilizedGameRV::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptARVRStabilizedGameRV::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.arvrStabilizedGRV; data = sensor_val->un.arvrStabilizedGRV;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptARVRStabilizedRV.hpp" #include "BNO08xRptARVRStabilizedRV.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates ARVR stabilized rotation vector data from decoded sensor event. * @brief Updates ARVR stabilized rotation vector data from decoded sensor event.
@ -15,11 +14,11 @@
*/ */
void BNO08xRptARVRStabilizedRV::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptARVRStabilizedRV::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.arvrStabilizedRV; data = sensor_val->un.arvrStabilizedRV;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptAcceleration.hpp" #include "BNO08xRptAcceleration.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates accelerometer data from decoded sensor event. * @brief Updates accelerometer data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptAcceleration::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptAcceleration::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.accelerometer; data = sensor_val->un.accelerometer;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -31,8 +30,8 @@ void BNO08xRptAcceleration::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_accel_t BNO08xRptAcceleration::get() bno08x_accel_t BNO08xRptAcceleration::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_accel_t rqdata = data; bno08x_accel_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,14 +4,13 @@
*/ */
#include "BNO08xRptActivityClassifier.hpp" #include "BNO08xRptActivityClassifier.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Enables activity classifier reports such that the BNO08x begins sending them. * @brief Enables activity classifier reports such that the BNO08x begins sending them.
* *
* @param time_between_reports The period/interval of the report in microseconds. * @param time_between_reports The period/interval of the report in microseconds.
* @param activities_to_enable Which activities to enable. * @param activities_to_enable Which activities to enable.
* @param sensor_cfg Sensor special configuration (optional, see BNO08xRpt::default_sensor_cfg for defaults). * @param sensor_cfg Sensor special configuration (optional, see BNO08xPrivateTypes::default_sensor_cfg for defaults).
* *
* @return True if report was successfully enabled. * @return True if report was successfully enabled.
*/ */
@ -31,12 +30,12 @@ bool BNO08xRptActivityClassifier::enable(uint32_t time_between_reports, BNO08xAc
*/ */
void BNO08xRptActivityClassifier::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptActivityClassifier::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.personalActivityClassifier; data = sensor_val->un.personalActivityClassifier;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -47,9 +46,9 @@ void BNO08xRptActivityClassifier::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_activity_classifier_t BNO08xRptActivityClassifier::get() bno08x_activity_classifier_t BNO08xRptActivityClassifier::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_activity_classifier_t rqdata = data; bno08x_activity_classifier_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }
@ -60,8 +59,8 @@ bno08x_activity_classifier_t BNO08xRptActivityClassifier::get()
*/ */
BNO08xActivity BNO08xRptActivityClassifier::get_most_likely_activity() BNO08xActivity BNO08xRptActivityClassifier::get_most_likely_activity()
{ {
imu->lock_user_data(); lock_user_data();
BNO08xActivity rqdata = static_cast<BNO08xActivity>(data.mostLikelyState); BNO08xActivity rqdata = static_cast<BNO08xActivity>(data.mostLikelyState);
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptCalGyro.hpp" #include "BNO08xRptCalGyro.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates calibrated gyro data from decoded sensor event. * @brief Updates calibrated gyro data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptCalGyro::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptCalGyro::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.gyroscope; data = sensor_val->un.gyroscope;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -31,8 +30,8 @@ void BNO08xRptCalGyro::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_gyro_t BNO08xRptCalGyro::get() bno08x_gyro_t BNO08xRptCalGyro::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_gyro_t rqdata = data; bno08x_gyro_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptCalMagnetometer.hpp" #include "BNO08xRptCalMagnetometer.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates calibrated magnetometer data from decoded sensor event. * @brief Updates calibrated magnetometer data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptCalMagnetometer::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptCalMagnetometer::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.magneticField; data = sensor_val->un.magneticField;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -31,8 +30,8 @@ void BNO08xRptCalMagnetometer::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_magf_t BNO08xRptCalMagnetometer::get() bno08x_magf_t BNO08xRptCalMagnetometer::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_magf_t rqdata = data; bno08x_magf_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptGameRV.hpp" #include "BNO08xRptGameRV.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates game rotation vector data from decoded sensor event. * @brief Updates game rotation vector data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptGameRV::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptGameRV::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.gameRotationVector; data = sensor_val->un.gameRotationVector;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -48,9 +47,9 @@ bool BNO08xRptGameRV::tare_persist()
{ {
int success = SH2_ERR; int success = SH2_ERR;
imu->lock_sh2_HAL(); lock_sh2_HAL();
success = sh2_persistTare(); success = sh2_persistTare();
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
if (success != SH2_OK) if (success != SH2_OK)
return false; return false;
@ -65,7 +64,7 @@ bool BNO08xRptGameRV::tare_persist()
*/ */
void BNO08xRptGameRV::tare_clear() void BNO08xRptGameRV::tare_clear()
{ {
imu->lock_sh2_HAL(); lock_sh2_HAL();
sh2_clearTare(); sh2_clearTare();
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptGravity.hpp" #include "BNO08xRptGravity.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates gravity data from decoded sensor event. * @brief Updates gravity data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptGravity::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptGravity::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.gravity; data = sensor_val->un.gravity;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -31,8 +30,8 @@ void BNO08xRptGravity::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_accel_t BNO08xRptGravity::get() bno08x_accel_t BNO08xRptGravity::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_accel_t rqdata = data; bno08x_accel_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptIGyroRV.hpp" #include "BNO08xRptIGyroRV.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates gyro integrated rotation vector data from decoded sensor event. * @brief Updates gyro integrated rotation vector data from decoded sensor event.
@ -15,13 +14,13 @@
*/ */
void BNO08xRptIGyroRV::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptIGyroRV::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.gyroIntegratedRV; data = sensor_val->un.gyroIntegratedRV;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
data_vel = sensor_val->un.gyroIntegratedRV; data_vel = sensor_val->un.gyroIntegratedRV;
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -35,10 +34,10 @@ void BNO08xRptIGyroRV::update_data(sh2_SensorValue_t* sensor_val)
*/ */
void BNO08xRptIGyroRV::get(bno08x_quat_t& quat, bno08x_ang_vel_t& vel) void BNO08xRptIGyroRV::get(bno08x_quat_t& quat, bno08x_ang_vel_t& vel)
{ {
imu->lock_user_data(); lock_user_data();
quat = data; quat = data;
vel = data_vel; vel = data_vel;
imu->unlock_user_data(); unlock_user_data();
} }
/** /**
@ -48,8 +47,8 @@ void BNO08xRptIGyroRV::get(bno08x_quat_t& quat, bno08x_ang_vel_t& vel)
*/ */
bno08x_ang_vel_t BNO08xRptIGyroRV::get_vel() bno08x_ang_vel_t BNO08xRptIGyroRV::get_vel()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_ang_vel_t rqdata = data_vel; bno08x_ang_vel_t rqdata = data_vel;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptLinearAcceleration.hpp" #include "BNO08xRptLinearAcceleration.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates accelerometer data from decoded sensor event. * @brief Updates accelerometer data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptLinearAcceleration::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptLinearAcceleration::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.linearAcceleration; data = sensor_val->un.linearAcceleration;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -31,8 +30,8 @@ void BNO08xRptLinearAcceleration::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_accel_t BNO08xRptLinearAcceleration::get() bno08x_accel_t BNO08xRptLinearAcceleration::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_accel_t rqdata = data; bno08x_accel_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptRV.hpp" #include "BNO08xRptRV.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates rotation vector data from decoded sensor event. * @brief Updates rotation vector data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptRV::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptRV::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.rotationVector; data = sensor_val->un.rotationVector;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -48,9 +47,9 @@ bool BNO08xRptRV::tare_persist()
{ {
int success = SH2_ERR; int success = SH2_ERR;
imu->lock_sh2_HAL(); lock_sh2_HAL();
success = sh2_persistTare(); success = sh2_persistTare();
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
if (success != SH2_OK) if (success != SH2_OK)
return false; return false;
@ -65,7 +64,7 @@ bool BNO08xRptRV::tare_persist()
*/ */
void BNO08xRptRV::tare_clear() void BNO08xRptRV::tare_clear()
{ {
imu->lock_sh2_HAL(); lock_sh2_HAL();
sh2_clearTare(); sh2_clearTare();
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptRVGeneric.hpp" #include "BNO08xRptRVGeneric.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Grabs most recent rotation vector data in form of unit quaternion, rad accuracy units in radians (if available, else constant 0.0f). * @brief Grabs most recent rotation vector data in form of unit quaternion, rad accuracy units in radians (if available, else constant 0.0f).
@ -19,9 +18,9 @@
*/ */
bno08x_quat_t BNO08xRptRVGeneric::get_quat() bno08x_quat_t BNO08xRptRVGeneric::get_quat()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_quat_t rqdata = data; bno08x_quat_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }
@ -71,9 +70,9 @@ bool BNO08xRptRVGeneric::tare(bool x, bool y, bool z, sh2_TareBasis_t basis)
if (z) if (z)
axis_flag |= SH2_TARE_Z; axis_flag |= SH2_TARE_Z;
imu->lock_sh2_HAL(); lock_sh2_HAL();
success = sh2_setTareNow(axis_flag, basis); success = sh2_setTareNow(axis_flag, basis);
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
if (success != SH2_OK) if (success != SH2_OK)
return false; return false;

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptRVGeomag.hpp" #include "BNO08xRptRVGeomag.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates geomagnetic rotation vector data from decoded sensor event. * @brief Updates geomagnetic rotation vector data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptRVGeomag::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptRVGeomag::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.geoMagRotationVector; data = sensor_val->un.geoMagRotationVector;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -47,9 +46,9 @@ bool BNO08xRptRVGeomag::tare_persist()
{ {
int success = SH2_ERR; int success = SH2_ERR;
imu->lock_sh2_HAL(); lock_sh2_HAL();
success = sh2_persistTare(); success = sh2_persistTare();
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
if (success != SH2_OK) if (success != SH2_OK)
return false; return false;
@ -64,7 +63,7 @@ bool BNO08xRptRVGeomag::tare_persist()
*/ */
void BNO08xRptRVGeomag::tare_clear() void BNO08xRptRVGeomag::tare_clear()
{ {
imu->lock_sh2_HAL(); lock_sh2_HAL();
sh2_clearTare(); sh2_clearTare();
imu->unlock_sh2_HAL(); unlock_sh2_HAL();
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptRawMEMSAccelerometer.hpp" #include "BNO08xRptRawMEMSAccelerometer.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates raw accelerometer data from decoded sensor event. * @brief Updates raw accelerometer data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptRawMEMSAccelerometer::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptRawMEMSAccelerometer::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.rawAccelerometer; data = sensor_val->un.rawAccelerometer;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -31,8 +30,8 @@ void BNO08xRptRawMEMSAccelerometer::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_raw_accel_t BNO08xRptRawMEMSAccelerometer::get() bno08x_raw_accel_t BNO08xRptRawMEMSAccelerometer::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_raw_accel_t rqdata = data; bno08x_raw_accel_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptRawMEMSGyro.hpp" #include "BNO08xRptRawMEMSGyro.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates raw mems gyro data from decoded sensor event. * @brief Updates raw mems gyro data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptRawMEMSGyro::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptRawMEMSGyro::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.rawGyroscope; data = sensor_val->un.rawGyroscope;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -31,8 +30,8 @@ void BNO08xRptRawMEMSGyro::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_raw_gyro_t BNO08xRptRawMEMSGyro::get() bno08x_raw_gyro_t BNO08xRptRawMEMSGyro::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_raw_gyro_t rqdata = data; bno08x_raw_gyro_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptRawMEMSMagnetometer.hpp" #include "BNO08xRptRawMEMSMagnetometer.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates raw magnetometer data from decoded sensor event. * @brief Updates raw magnetometer data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xRptRawMEMSMagnetometer::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptRawMEMSMagnetometer::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.rawMagnetometer; data = sensor_val->un.rawMagnetometer;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -31,8 +30,8 @@ void BNO08xRptRawMEMSMagnetometer::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_raw_magf_t BNO08xRptRawMEMSMagnetometer::get() bno08x_raw_magf_t BNO08xRptRawMEMSMagnetometer::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_raw_magf_t rqdata = data; bno08x_raw_magf_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptStepCounter.hpp" #include "BNO08xRptStepCounter.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates step counter data from decoded sensor event. * @brief Updates step counter data from decoded sensor event.
@ -17,7 +16,7 @@ void BNO08xRptStepCounter::update_data(sh2_SensorValue_t* sensor_val)
{ {
static uint16_t prev_steps = 0; static uint16_t prev_steps = 0;
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.stepCounter; data = sensor_val->un.stepCounter;
if (prev_steps > data.steps) if (prev_steps > data.steps)
@ -29,9 +28,9 @@ void BNO08xRptStepCounter::update_data(sh2_SensorValue_t* sensor_val)
prev_steps = data.steps; prev_steps = data.steps;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -42,9 +41,9 @@ void BNO08xRptStepCounter::update_data(sh2_SensorValue_t* sensor_val)
*/ */
uint32_t BNO08xRptStepCounter::get_total_steps() uint32_t BNO08xRptStepCounter::get_total_steps()
{ {
imu->lock_user_data(); lock_user_data();
uint32_t total_steps = step_accumulator + data.steps; uint32_t total_steps = step_accumulator + data.steps;
imu->unlock_user_data(); unlock_user_data();
return total_steps; return total_steps;
} }
@ -55,8 +54,8 @@ uint32_t BNO08xRptStepCounter::get_total_steps()
*/ */
bno08x_step_counter_t BNO08xRptStepCounter::get() bno08x_step_counter_t BNO08xRptStepCounter::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_step_counter_t rqdata = data; bno08x_step_counter_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptUncalGyro.hpp" #include "BNO08xRptUncalGyro.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates uncalibrated gyro data from decoded sensor event. * @brief Updates uncalibrated gyro data from decoded sensor event.
@ -15,13 +14,13 @@
*/ */
void BNO08xRptUncalGyro::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptUncalGyro::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.gyroscopeUncal; data = sensor_val->un.gyroscopeUncal;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
bias_data = sensor_val->un.gyroscopeUncal; bias_data = sensor_val->un.gyroscopeUncal;
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -35,10 +34,10 @@ void BNO08xRptUncalGyro::update_data(sh2_SensorValue_t* sensor_val)
*/ */
void BNO08xRptUncalGyro::get(bno08x_gyro_t& vel, bno08x_gyro_bias_t& bias) void BNO08xRptUncalGyro::get(bno08x_gyro_t& vel, bno08x_gyro_bias_t& bias)
{ {
imu->lock_user_data(); lock_user_data();
vel = data; vel = data;
bias = bias_data; bias = bias_data;
imu->unlock_user_data(); unlock_user_data();
} }
/** /**
@ -48,9 +47,9 @@ void BNO08xRptUncalGyro::get(bno08x_gyro_t& vel, bno08x_gyro_bias_t& bias)
*/ */
bno08x_gyro_t BNO08xRptUncalGyro::get_vel() bno08x_gyro_t BNO08xRptUncalGyro::get_vel()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_gyro_t rqdata = data; bno08x_gyro_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }
@ -61,8 +60,8 @@ bno08x_gyro_t BNO08xRptUncalGyro::get_vel()
*/ */
bno08x_gyro_bias_t BNO08xRptUncalGyro::get_bias() bno08x_gyro_bias_t BNO08xRptUncalGyro::get_bias()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_gyro_bias_t rqdata = bias_data; bno08x_gyro_bias_t rqdata = bias_data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xRptUncalMagnetometer.hpp" #include "BNO08xRptUncalMagnetometer.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates uncalibrated magf data from decoded sensor event. * @brief Updates uncalibrated magf data from decoded sensor event.
@ -15,13 +14,13 @@
*/ */
void BNO08xRptUncalMagnetometer::update_data(sh2_SensorValue_t* sensor_val) void BNO08xRptUncalMagnetometer::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.magneticFieldUncal; data = sensor_val->un.magneticFieldUncal;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
bias_data = sensor_val->un.magneticFieldUncal; bias_data = sensor_val->un.magneticFieldUncal;
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -35,10 +34,10 @@ void BNO08xRptUncalMagnetometer::update_data(sh2_SensorValue_t* sensor_val)
*/ */
void BNO08xRptUncalMagnetometer::get(bno08x_magf_t& magf, bno08x_magf_bias_t& bias) void BNO08xRptUncalMagnetometer::get(bno08x_magf_t& magf, bno08x_magf_bias_t& bias)
{ {
imu->lock_user_data(); lock_user_data();
magf = data; magf = data;
bias = bias_data; bias = bias_data;
imu->unlock_user_data(); unlock_user_data();
} }
/** /**
@ -48,9 +47,9 @@ void BNO08xRptUncalMagnetometer::get(bno08x_magf_t& magf, bno08x_magf_bias_t& bi
*/ */
bno08x_magf_t BNO08xRptUncalMagnetometer::get_magf() bno08x_magf_t BNO08xRptUncalMagnetometer::get_magf()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_magf_t rqdata = data; bno08x_magf_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }
@ -61,8 +60,8 @@ bno08x_magf_t BNO08xRptUncalMagnetometer::get_magf()
*/ */
bno08x_magf_bias_t BNO08xRptUncalMagnetometer::get_bias() bno08x_magf_bias_t BNO08xRptUncalMagnetometer::get_bias()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_magf_bias_t rqdata = bias_data; bno08x_magf_bias_t rqdata = bias_data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,8 +4,6 @@
*/ */
#include "BNO08xShakeDetector.hpp" #include "BNO08xShakeDetector.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates shake detector data from decoded sensor event. * @brief Updates shake detector data from decoded sensor event.
* *
@ -15,12 +13,12 @@
*/ */
void BNO08xShakeDetector::update_data(sh2_SensorValue_t* sensor_val) void BNO08xShakeDetector::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.shakeDetector; data = sensor_val->un.shakeDetector;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -31,8 +29,8 @@ void BNO08xShakeDetector::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_shake_detector_t BNO08xShakeDetector::get() bno08x_shake_detector_t BNO08xShakeDetector::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_shake_detector_t rqdata = data; bno08x_shake_detector_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,7 +4,6 @@
*/ */
#include "BNO08xStabilityClassifier.hpp" #include "BNO08xStabilityClassifier.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Updates stability classifier data from decoded sensor event. * @brief Updates stability classifier data from decoded sensor event.
@ -15,12 +14,12 @@
*/ */
void BNO08xStabilityClassifier::update_data(sh2_SensorValue_t* sensor_val) void BNO08xStabilityClassifier::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.stabilityClassifier; data = sensor_val->un.stabilityClassifier;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -31,9 +30,9 @@ void BNO08xStabilityClassifier::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_stability_classifier_t BNO08xStabilityClassifier::get() bno08x_stability_classifier_t BNO08xStabilityClassifier::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_stability_classifier_t rqdata = data; bno08x_stability_classifier_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }
@ -44,8 +43,8 @@ bno08x_stability_classifier_t BNO08xStabilityClassifier::get()
*/ */
BNO08xStability BNO08xStabilityClassifier::get_stability() BNO08xStability BNO08xStabilityClassifier::get_stability()
{ {
imu->lock_user_data(); lock_user_data();
BNO08xStability rqdata = data.stability; BNO08xStability rqdata = data.stability;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }

View File

@ -4,13 +4,12 @@
*/ */
#include "BNO08xTapDetector.hpp" #include "BNO08xTapDetector.hpp"
#include "BNO08x.hpp"
/** /**
* @brief Enables tap detector reports such that the BNO08x begins sending them (only sends reports when a tap is detected). * @brief Enables tap detector reports such that the BNO08x begins sending them (only sends reports when a tap is detected).
* *
* @param time_between_reports The period/interval of the report in microseconds. * @param time_between_reports The period/interval of the report in microseconds.
* @param sensor_cfg Sensor special configuration (optional, see BNO08xRpt::default_sensor_cfg for defaults). * @param sensor_cfg Sensor special configuration (optional, see BNO08xPrivateTypes::default_sensor_cfg for defaults).
* *
* @return True if report was successfully enabled. * @return True if report was successfully enabled.
*/ */
@ -31,12 +30,12 @@ bool BNO08xTapDetector::enable(uint32_t time_between_reports, sh2_SensorConfig_t
*/ */
void BNO08xTapDetector::update_data(sh2_SensorValue_t* sensor_val) void BNO08xTapDetector::update_data(sh2_SensorValue_t* sensor_val)
{ {
imu->lock_user_data(); lock_user_data();
data = sensor_val->un.tapDetector; data = sensor_val->un.tapDetector;
data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status); data.accuracy = static_cast<BNO08xAccuracy>(sensor_val->status);
imu->unlock_user_data(); unlock_user_data();
if (rpt_bit & xEventGroupGetBits(imu->evt_grp_report_en)) if (rpt_bit & xEventGroupGetBits(*_evt_grp_rpt_en))
signal_data_available(); signal_data_available();
} }
@ -47,8 +46,8 @@ void BNO08xTapDetector::update_data(sh2_SensorValue_t* sensor_val)
*/ */
bno08x_tap_detector_t BNO08xTapDetector::get() bno08x_tap_detector_t BNO08xTapDetector::get()
{ {
imu->lock_user_data(); lock_user_data();
bno08x_tap_detector_t rqdata = data; bno08x_tap_detector_t rqdata = data;
imu->unlock_user_data(); unlock_user_data();
return rqdata; return rqdata;
} }