/** * @file BNO08x.hpp * @author Myles Parfeniuk */ #pragma once // etl includes #include #include #include // esp-idf includes #include #include #include #include #include #include #include // in-house includes #include "BNO08xGlobalTypes.hpp" #include "BNO08xPrivateTypes.hpp" #include "BNO08xSH2HAL.hpp" #include "BNO08xReports.hpp" /** * @class BNO08x * * @brief BNO08x IMU driver class. * */ class BNO08x { public: BNO08x(bno08x_config_t imu_config = bno08x_config_t()); ~BNO08x(); bool initialize(); bool hard_reset(); bool soft_reset(); bool disable_all_reports(); BNO08xResetReason get_reset_reason(); bool on(); bool sleep(); // bool calibration_turntable_start(uint32_t period_us); // bool calibration_turntable_end(sh2_CalStatus_t& status); bool dynamic_calibration_enable(BNO08xCalSel sensor); bool dynamic_calibration_disable(BNO08xCalSel sensor); bool dynamic_calibration_autosave_enable(); bool dynamic_calibration_autosave_disable(); bool dynamic_calibration_save(); bool dynamic_calibration_clear(); bool dynamic_calibration_run_routine(); bool get_frs(uint16_t frs_ID, uint32_t (&data)[16], uint16_t& rx_data_sz); sh2_ProductIds_t get_product_IDs(); bool data_available(); bool register_cb(std::function cb_fxn); bool register_cb(std::function cb_fxn); void print_product_ids(); // enum helper fxns static const char* activity_to_str(BNO08xActivity activity); static const char* stability_to_str(BNO08xStability stability); static const char* accuracy_to_str(BNO08xAccuracy accuracy); /// @brief Contains report implementations. typedef struct bno08x_reports_t { BNO08xRptAcceleration accelerometer; BNO08xRptLinearAcceleration linear_accelerometer; BNO08xRptGravity gravity; BNO08xRptCalMagnetometer cal_magnetometer; BNO08xRptUncalMagnetometer uncal_magnetometer; BNO08xRptCalGyro cal_gyro; BNO08xRptUncalGyro uncal_gyro; BNO08xRptRV rv; BNO08xRptGameRV rv_game; BNO08xRptARVRStabilizedRV rv_ARVR_stabilized; BNO08xRptARVRStabilizedGameRV rv_ARVR_stabilized_game; BNO08xRptIGyroRV rv_gyro_integrated; BNO08xRptRVGeomag rv_geomagnetic; BNO08xRptRawMEMSGyro raw_gyro; BNO08xRptRawMEMSAccelerometer raw_accelerometer; BNO08xRptRawMEMSMagnetometer raw_magnetometer; BNO08xRptStepCounter step_counter; BNO08xRptActivityClassifier activity_classifier; BNO08xRptStabilityClassifier stability_classifier; BNO08xRptShakeDetector shake_detector; BNO08xRptTapDetector tap_detector; bno08x_reports_t(BNO08xPrivateTypes::bno08x_sync_ctx_t* sync_ctx) : accelerometer(SH2_ACCELEROMETER, BNO08xPrivateTypes::EVT_GRP_RPT_ACCELEROMETER_BIT, sync_ctx) , linear_accelerometer( SH2_LINEAR_ACCELERATION, BNO08xPrivateTypes::EVT_GRP_RPT_LINEAR_ACCELEROMETER_BIT, sync_ctx) , gravity(SH2_GRAVITY, BNO08xPrivateTypes::EVT_GRP_RPT_GRAVITY_BIT, sync_ctx) , cal_magnetometer( SH2_MAGNETIC_FIELD_CALIBRATED, BNO08xPrivateTypes::EVT_GRP_RPT_CAL_MAGNETOMETER_BIT, sync_ctx) , uncal_magnetometer( SH2_MAGNETIC_FIELD_UNCALIBRATED, BNO08xPrivateTypes::EVT_GRP_RPT_UNCAL_MAGNETOMETER_BIT, sync_ctx) , cal_gyro(SH2_GYROSCOPE_CALIBRATED, BNO08xPrivateTypes::EVT_GRP_RPT_CAL_GYRO_BIT, sync_ctx) , uncal_gyro(SH2_GYROSCOPE_UNCALIBRATED, BNO08xPrivateTypes::EVT_GRP_RPT_UNCAL_GYRO_BIT, sync_ctx) , rv(SH2_ROTATION_VECTOR, BNO08xPrivateTypes::EVT_GRP_RPT_RV_BIT, sync_ctx) , rv_game(SH2_GAME_ROTATION_VECTOR, BNO08xPrivateTypes::EVT_GRP_RPT_RV_GAME_BIT, sync_ctx) , rv_ARVR_stabilized(SH2_ARVR_STABILIZED_RV, BNO08xPrivateTypes::EVT_GRP_RPT_RV_ARVR_S_BIT, sync_ctx) , rv_ARVR_stabilized_game( SH2_ARVR_STABILIZED_GRV, BNO08xPrivateTypes::EVT_GRP_RPT_RV_ARVR_S_GAME_BIT, sync_ctx) , rv_gyro_integrated(SH2_GYRO_INTEGRATED_RV, BNO08xPrivateTypes::EVT_GRP_RPT_GYRO_INTEGRATED_RV_BIT, sync_ctx) , rv_geomagnetic(SH2_GEOMAGNETIC_ROTATION_VECTOR, BNO08xPrivateTypes::EVT_GRP_RPT_GEOMAG_RV_BIT, sync_ctx) , raw_gyro(SH2_RAW_GYROSCOPE, BNO08xPrivateTypes::EVT_GRP_RPT_RAW_GYRO_BIT, sync_ctx) , raw_accelerometer(SH2_RAW_ACCELEROMETER, BNO08xPrivateTypes::EVT_GRP_RPT_RAW_ACCELEROMETER_BIT, sync_ctx) , raw_magnetometer(SH2_RAW_MAGNETOMETER, BNO08xPrivateTypes::EVT_GRP_RPT_RAW_MAGNETOMETER_BIT, sync_ctx) , step_counter(SH2_STEP_COUNTER, BNO08xPrivateTypes::EVT_GRP_RPT_STEP_COUNTER_BIT, sync_ctx) , activity_classifier( SH2_PERSONAL_ACTIVITY_CLASSIFIER, BNO08xPrivateTypes::EVT_GRP_RPT_ACTIVITY_CLASSIFIER_BIT, sync_ctx) , stability_classifier( SH2_STABILITY_CLASSIFIER, BNO08xPrivateTypes::EVT_GRP_RPT_STABILITY_CLASSIFIER_BIT, sync_ctx) , shake_detector(SH2_SHAKE_DETECTOR, BNO08xPrivateTypes::EVT_GRP_RPT_SHAKE_DETECTOR_BIT, sync_ctx) , tap_detector(SH2_TAP_DETECTOR, BNO08xPrivateTypes::EVT_GRP_RPT_TAP_DETECTOR_BIT, sync_ctx) { } } bno08x_reports_t; bno08x_reports_t rpt; private: // data processing task 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 TaskHandle_t data_proc_task_hdl; ///> usr_reports = { {SH2_ACCELEROMETER, &rpt.accelerometer}, {SH2_LINEAR_ACCELERATION, &rpt.linear_accelerometer}, {SH2_GRAVITY, &rpt.gravity}, {SH2_MAGNETIC_FIELD_CALIBRATED, &rpt.cal_magnetometer}, {SH2_MAGNETIC_FIELD_UNCALIBRATED, &rpt.uncal_magnetometer}, {SH2_GYROSCOPE_CALIBRATED, &rpt.cal_gyro}, {SH2_GYROSCOPE_UNCALIBRATED, &rpt.uncal_gyro}, {SH2_ROTATION_VECTOR, &rpt.rv}, {SH2_GAME_ROTATION_VECTOR, &rpt.rv_game}, {SH2_ARVR_STABILIZED_RV, &rpt.rv_ARVR_stabilized}, {SH2_ARVR_STABILIZED_GRV, &rpt.rv_ARVR_stabilized_game}, {SH2_GYRO_INTEGRATED_RV, &rpt.rv_gyro_integrated}, {SH2_GEOMAGNETIC_ROTATION_VECTOR, &rpt.rv_geomagnetic}, {SH2_RAW_GYROSCOPE, &rpt.raw_gyro}, {SH2_RAW_ACCELEROMETER, &rpt.raw_accelerometer}, {SH2_RAW_MAGNETOMETER, &rpt.raw_magnetometer}, {SH2_STEP_COUNTER, &rpt.step_counter}, {SH2_PERSONAL_ACTIVITY_CLASSIFIER, &rpt.activity_classifier}, {SH2_STABILITY_CLASSIFIER, &rpt.stability_classifier}, {SH2_SHAKE_DETECTOR, &rpt.shake_detector}, {SH2_TAP_DETECTOR, &rpt.tap_detector}, // not implemented, see include/report for existing implementations to add your own {SH2_PRESSURE, nullptr}, // requires auxilary i2c sensor {SH2_AMBIENT_LIGHT, nullptr}, // requires auxilary i2c sensor {SH2_HUMIDITY, nullptr}, // requires auxilary i2c sensor {SH2_PROXIMITY, nullptr}, // requires auxilary i2c sensor {SH2_TEMPERATURE, nullptr}, // requires auxilary i2c sensor {SH2_HEART_RATE_MONITOR, nullptr}, // requires auxilary i2c sensor {SH2_STEP_DETECTOR, nullptr}, {SH2_SIGNIFICANT_MOTION, nullptr}, {SH2_FLIP_DETECTOR, nullptr}, {SH2_PICKUP_DETECTOR, nullptr}, {SH2_STABILITY_DETECTOR, nullptr}, {SH2_SLEEP_DETECTOR, nullptr}, {SH2_TILT_DETECTOR, nullptr}, {SH2_POCKET_DETECTOR, nullptr}, {SH2_CIRCLE_DETECTOR, nullptr}, {SH2_IZRO_MOTION_REQUEST, nullptr} }; // clang-format on static void IRAM_ATTR hint_handler(void* arg); static const constexpr uint16_t RX_DATA_LENGTH = 300U; ///