dynamic/ME calibration feature

This commit is contained in:
myles-parfeniuk 2024-12-04 20:07:40 -08:00
parent 09d8481877
commit 7af261c73c
28 changed files with 1216 additions and 575 deletions

View File

@ -26,7 +26,10 @@ SpaceAfterCStyleCast: true
CommentPragmas: '^[/!]<' CommentPragmas: '^[/!]<'
ColumnLimit: 150 ColumnLimit: 100
WrapComments: true
AllowShortCommentsOnASingleLine: true
AlignConsecutiveComments: true
BreakBeforeBraces: Allman BreakBeforeBraces: Allman
IndentAccessModifiers: true IndentAccessModifiers: true

View File

@ -43,7 +43,16 @@ class BNO08x
bool on(); bool on();
bool sleep(); bool sleep();
// sh2_startCal (cmd id 12, calibration)
bool enable_dynamic_calibration(BNO08xCalSel sensor);
bool disable_dynamic_calibration(BNO08xCalSel sensor);
bool enable_autosave_dynamic_calibration();
bool disable_autosave_dynamic_calibration();
bool save_dynamic_calibration();
bool clear_dynamic_calibration();
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);
sh2_ProductIds_t get_product_IDs();
bool data_available(); bool data_available();
bool register_cb(std::function<void(void)> cb_fxn); bool register_cb(std::function<void(void)> cb_fxn);
@ -56,27 +65,27 @@ class BNO08x
static const char* stability_to_str(BNO08xStability stability); static const char* stability_to_str(BNO08xStability stability);
static const char* accuracy_to_str(BNO08xAccuracy accuracy); static const char* accuracy_to_str(BNO08xAccuracy accuracy);
BNO08xRptAcceleration accelerometer; BNO08xRptAcceleration rpt_accelerometer;
BNO08xRptLinearAcceleration linear_accelerometer; BNO08xRptLinearAcceleration rpt_linear_accelerometer;
BNO08xRptGravity gravity; BNO08xRptGravity rpt_gravity;
BNO08xRptCalMagnetometer cal_magnetometer; BNO08xRptCalMagnetometer rpt_cal_magnetometer;
BNO08xRptUncalMagnetometer uncal_magnetometer; BNO08xRptUncalMagnetometer rpt_uncal_magnetometer;
BNO08xRptCalGyro cal_gyro; BNO08xRptCalGyro rpt_cal_gyro;
BNO08xRptUncalGyro uncal_gyro; BNO08xRptUncalGyro rpt_uncal_gyro;
BNO08xRptRV rv; BNO08xRptRV rpt_rv;
BNO08xRptGameRV rv_game; BNO08xRptGameRV rpt_rv_game;
BNO08xRptARVRStabilizedRV rv_ARVR_stabilized; BNO08xRptARVRStabilizedRV rpt_rv_ARVR_stabilized;
BNO08xRptARVRStabilizedGameRV rv_ARVR_stabilized_game; BNO08xRptARVRStabilizedGameRV rpt_rv_ARVR_stabilized_game;
BNO08xRptIGyroRV rv_gyro_integrated; BNO08xRptIGyroRV rpt_rv_gyro_integrated;
BNO08xRptRVGeomag rv_geomagnetic; BNO08xRptRVGeomag rpt_rv_geomagnetic;
BNO08xRptRawMEMSGyro raw_gyro; BNO08xRptRawMEMSGyro rpt_raw_gyro;
BNO08xRptRawMEMSAccelerometer raw_accelerometer; BNO08xRptRawMEMSAccelerometer rpt_raw_accelerometer;
BNO08xRptRawMEMSMagnetometer raw_magnetometer; BNO08xRptRawMEMSMagnetometer rpt_raw_magnetometer;
BNO08xRptStepCounter step_counter; BNO08xRptStepCounter rpt_step_counter;
BNO08xRptActivityClassifier activity_classifier; BNO08xRptActivityClassifier rpt_activity_classifier;
BNO08xStabilityClassifier stability_classifier; BNO08xStabilityClassifier rpt_stability_classifier;
BNO08xShakeDetector shake_detector; BNO08xShakeDetector rpt_shake_detector;
BNO08xTapDetector tap_detector; BNO08xTapDetector rpt_tap_detector;
private: private:
// data processing task // data processing task
@ -94,13 +103,16 @@ class BNO08x
void sh2_HAL_service_task(); void sh2_HAL_service_task();
// callback task // callback task
static const constexpr configSTACK_DEPTH_TYPE CB_TASK_SZ = CONFIG_ESP32_BNO08X_CB_TASK_SZ; ///< Size of sh2_HAL_service_task() stack in bytes static const constexpr configSTACK_DEPTH_TYPE CB_TASK_SZ =
CONFIG_ESP32_BNO08X_CB_TASK_SZ; ///< Size of sh2_HAL_service_task() stack in bytes
TaskHandle_t cb_task_hdl; ///<sh2_HAL_service_task() task handle TaskHandle_t cb_task_hdl; ///<sh2_HAL_service_task() task handle
static void cb_task_trampoline(void* arg); static void cb_task_trampoline(void* arg);
void cb_task(); void cb_task();
SemaphoreHandle_t sh2_HAL_lock; ///<Mutex to prevent sh2 HAL lib functions from being accessed at same time. SemaphoreHandle_t
SemaphoreHandle_t data_lock; ///<Mutex to prevent user from reading data while data_proc_task() updates it, and vice versa. 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.
SemaphoreHandle_t sem_kill_tasks; ///<Counting Semaphore to count amount of killed tasks. SemaphoreHandle_t sem_kill_tasks; ///<Counting Semaphore to count amount of killed tasks.
void lock_sh2_HAL(); void lock_sh2_HAL();
@ -137,15 +149,18 @@ class BNO08x
sh2_Hal_t sh2_HAL; ///< sh2 hardware abstraction layer struct for use with sh2 HAL lib. sh2_Hal_t sh2_HAL; ///< sh2 hardware abstraction layer struct for use with sh2 HAL lib.
EventGroupHandle_t evt_grp_bno08x_task; ///<Event group for indicating various BNO08x related events between tasks.
EventGroupHandle_t evt_grp_report_en; ///<Event group for indicating which reports are currently enabled.
EventGroupHandle_t EventGroupHandle_t
evt_grp_report_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). evt_grp_bno08x_task; ///<Event group for indicating various BNO08x related events between tasks.
EventGroupHandle_t
evt_grp_report_en; ///<Event group for indicating which reports are currently enabled.
EventGroupHandle_t
evt_grp_report_data_available; ///< Event group for indicating to BNO08xRpt::has_new_data() that a module received a new report.
QueueHandle_t QueueHandle_t
queue_rx_sensor_event; ///< Queue to send sensor events from sh2 HAL sensor event callback (BNO08xSH2HAL::sensor_event_cb()) to data_proc_task() queue_rx_sensor_event; ///< Queue to send sensor events from sh2 HAL sensor event callback (BNO08xSH2HAL::sensor_event_cb()) to data_proc_task()
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()
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
@ -155,36 +170,38 @@ class BNO08x
BNO08xPrivateTypes::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()
BNO08xPrivateTypes::bno08x_cb_list_t cb_list; ///< Vector to contain registered callbacks. 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 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 =
{ {
{SH2_ACCELEROMETER, &accelerometer}, {SH2_ACCELEROMETER, &rpt_accelerometer},
{SH2_LINEAR_ACCELERATION, &linear_accelerometer}, {SH2_LINEAR_ACCELERATION, &rpt_linear_accelerometer},
{SH2_GRAVITY, &gravity}, {SH2_GRAVITY, &rpt_gravity},
{SH2_MAGNETIC_FIELD_CALIBRATED, &cal_magnetometer}, {SH2_MAGNETIC_FIELD_CALIBRATED, &rpt_cal_magnetometer},
{SH2_MAGNETIC_FIELD_UNCALIBRATED, &uncal_magnetometer}, {SH2_MAGNETIC_FIELD_UNCALIBRATED, &rpt_uncal_magnetometer},
{SH2_GYROSCOPE_CALIBRATED, &cal_gyro}, {SH2_GYROSCOPE_CALIBRATED, &rpt_cal_gyro},
{SH2_GYROSCOPE_UNCALIBRATED, &uncal_gyro}, {SH2_GYROSCOPE_UNCALIBRATED, &rpt_uncal_gyro},
{SH2_ROTATION_VECTOR, &rv}, {SH2_ROTATION_VECTOR, &rpt_rv},
{SH2_GAME_ROTATION_VECTOR, &rv_game}, {SH2_GAME_ROTATION_VECTOR, &rpt_rv_game},
{SH2_ARVR_STABILIZED_RV, &rv_ARVR_stabilized}, {SH2_ARVR_STABILIZED_RV, &rpt_rv_ARVR_stabilized},
{SH2_ARVR_STABILIZED_GRV, &rv_ARVR_stabilized_game}, {SH2_ARVR_STABILIZED_GRV, &rpt_rv_ARVR_stabilized_game},
{SH2_GYRO_INTEGRATED_RV, &rv_gyro_integrated}, {SH2_GYRO_INTEGRATED_RV, &rpt_rv_gyro_integrated},
{SH2_GEOMAGNETIC_ROTATION_VECTOR, &rv_geomagnetic}, {SH2_GEOMAGNETIC_ROTATION_VECTOR, &rpt_rv_geomagnetic},
{SH2_RAW_GYROSCOPE, &raw_gyro}, {SH2_RAW_GYROSCOPE, &rpt_raw_gyro},
{SH2_RAW_ACCELEROMETER, &raw_accelerometer}, {SH2_RAW_ACCELEROMETER, &rpt_raw_accelerometer},
{SH2_RAW_MAGNETOMETER, &raw_magnetometer}, {SH2_RAW_MAGNETOMETER, &rpt_raw_magnetometer},
{SH2_STEP_COUNTER, &step_counter}, {SH2_STEP_COUNTER, &rpt_step_counter},
{SH2_PERSONAL_ACTIVITY_CLASSIFIER, &activity_classifier}, {SH2_PERSONAL_ACTIVITY_CLASSIFIER, &rpt_activity_classifier},
{SH2_STABILITY_CLASSIFIER, &stability_classifier}, {SH2_STABILITY_CLASSIFIER, &rpt_stability_classifier},
{SH2_SHAKE_DETECTOR, &shake_detector}, {SH2_SHAKE_DETECTOR, &rpt_shake_detector},
{SH2_TAP_DETECTOR, &tap_detector}, {SH2_TAP_DETECTOR, &rpt_tap_detector},
// not implemented, see include/report for existing implementations to add your own // not implemented, see include/report for existing implementations to add your own
{SH2_PRESSURE, nullptr}, // requires auxilary i2c sensor {SH2_PRESSURE, nullptr}, // requires auxilary i2c sensor
@ -208,7 +225,8 @@ class BNO08x
static void IRAM_ATTR hint_handler(void* arg); static void IRAM_ATTR hint_handler(void* arg);
static const constexpr uint16_t RX_DATA_LENGTH = 300U; ///<length buffer containing data received over spi static const constexpr uint16_t RX_DATA_LENGTH =
300U; ///<length buffer containing data received over spi
static const constexpr TickType_t HOST_INT_TIMEOUT_DEFAULT_MS = static const constexpr TickType_t HOST_INT_TIMEOUT_DEFAULT_MS =
CONFIG_ESP32_BNO08X_HINT_TIMEOUT_MS / CONFIG_ESP32_BNO08X_HINT_TIMEOUT_MS /
@ -222,9 +240,8 @@ class BNO08x
CONFIG_ESP32_BNO08X_HARD_RESET_DELAY_MS / CONFIG_ESP32_BNO08X_HARD_RESET_DELAY_MS /
portTICK_PERIOD_MS; ///<How long RST pin is held low during hard reset (min 10ns according to datasheet, but should be longer for stable operation) portTICK_PERIOD_MS; ///<How long RST pin is held low during hard reset (min 10ns according to datasheet, but should be longer for stable operation)
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.
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

View File

@ -64,8 +64,9 @@ typedef struct bno08x_config_t
} }
/// @brief Overloaded IMU configuration settings constructor for custom pin settings /// @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, bno08x_config_t(spi_host_device_t spi_peripheral, gpio_num_t io_mosi, gpio_num_t io_miso,
gpio_num_t io_int, gpio_num_t io_rst, uint32_t sclk_speed, bool install_isr_service = true) 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) : spi_peripheral(spi_peripheral)
, io_mosi(io_mosi) , io_mosi(io_mosi)
, io_miso(io_miso) , io_miso(io_miso)
@ -80,6 +81,15 @@ typedef struct bno08x_config_t
} bno08x_config_t; } bno08x_config_t;
typedef bno08x_config_t imu_config_t; // legacy version compatibility typedef bno08x_config_t imu_config_t; // legacy version compatibility
enum class BNO08xCalSel
{
accelerometer = SH2_CAL_ACCEL,
gyro = SH2_CAL_GYRO,
magnetometer = SH2_CAL_MAG,
planar_accelerometer = SH2_CAL_PLANAR,
all = (SH2_CAL_ACCEL | SH2_CAL_GYRO | SH2_CAL_MAG | SH2_CAL_PLANAR)
};
/// @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
{ {
@ -91,7 +101,8 @@ enum class BNO08xResetReason
OTHER ///< Previous reset was due to power other reason. OTHER ///< Previous reset was due to power other reason.
}; };
/// @brief Sensor accuracy returned from input reports, corresponds to status bits (see ref. manual 6.5.1) /// @brief Sensor accuracy returned from input reports, corresponds to status bits (see ref.
/// manual 6.5.1)
enum class BNO08xAccuracy enum class BNO08xAccuracy
{ {
UNRELIABLE, UNRELIABLE,
@ -220,9 +231,11 @@ typedef struct bno08x_euler_angle_t
// overloaded = operator for quat to euler conversion // overloaded = operator for quat to euler conversion
bno08x_euler_angle_t& operator=(const bno08x_quat_t& source) bno08x_euler_angle_t& operator=(const bno08x_quat_t& source)
{ {
this->x = atan2(2.0f * (source.real * source.i + source.j * source.k), 1.0f - 2.0f * (source.i * source.i + source.j * source.j)); this->x = atan2(2.0f * (source.real * source.i + source.j * source.k),
1.0f - 2.0f * (source.i * source.i + source.j * source.j));
this->y = asin(2.0f * (source.real * source.j - source.k * source.i)); this->y = asin(2.0f * (source.real * source.j - source.k * source.i));
this->z = atan2(2.0f * (source.real * source.k + source.i * source.j), 1.0f - 2.0f * (source.j * source.j + source.k * source.k)); this->z = atan2(2.0f * (source.real * source.k + source.i * source.j),
1.0f - 2.0f * (source.j * source.j + source.k * source.k));
this->rad_accuracy = source.rad_accuracy; this->rad_accuracy = source.rad_accuracy;
this->accuracy = source.accuracy; this->accuracy = source.accuracy;
return *this; return *this;
@ -429,7 +442,8 @@ typedef struct bno08x_activity_classifier_t
} }
} bno08x_activity_classifier_t; } bno08x_activity_classifier_t;
/// @brief Struct to represent tap detector data (flag meaning: 0 = no tap, 1 = positive tap on axis, -1 = negative tap on axis) /// @brief Struct to represent tap detector data (flag meaning: 0 = no tap, 1 = positive tap on
/// axis, -1 = negative tap on axis)
typedef struct bno08x_tap_detector_t typedef struct bno08x_tap_detector_t
{ {
int8_t x_flag; int8_t x_flag;
@ -523,7 +537,8 @@ typedef struct bno08x_shake_detector_t
} bno08x_shake_detector_t; } bno08x_shake_detector_t;
/// @brief Struct to represent acceleration data from acceleration, linear acceleration, and gravity reports. /// @brief Struct to represent acceleration data from acceleration, linear acceleration, and gravity
/// reports.
typedef struct bno08x_accel_t typedef struct bno08x_accel_t
{ {
float x; float x;
@ -604,7 +619,8 @@ typedef struct bno08x_raw_gyro_t
} }
} bno08x_raw_gyro_t; } bno08x_raw_gyro_t;
/// @brief Struct to represent raw mems accelerometer data from raw accelerometer reports (units in ADC counts). /// @brief Struct to represent raw mems accelerometer data from raw accelerometer reports (units in
/// ADC counts).
typedef struct bno08x_raw_accel_t typedef struct bno08x_raw_accel_t
{ {
int16_t x; int16_t x;
@ -633,7 +649,8 @@ typedef struct bno08x_raw_accel_t
} }
} bno08x_raw_accel_t; } bno08x_raw_accel_t;
/// @brief Struct to represent raw mems magnetometer data from raw magnetometer reports (units in ADC counts). /// @brief Struct to represent raw mems magnetometer data from raw magnetometer reports (units in
/// ADC counts).
typedef struct bno08x_raw_magf_t typedef struct bno08x_raw_magf_t
{ {
int16_t x; int16_t x;
@ -689,7 +706,8 @@ typedef struct bno08x_sample_counts_t
uint32_t offered; ///< Number of samples produced by underlying data source. uint32_t offered; ///< Number of samples produced by underlying data source.
uint32_t on; ///< Number of "offered" samples while this sensor was requested by host. uint32_t on; ///< Number of "offered" samples while this sensor was requested by host.
uint32_t accepted; ///< Number of "on" samples that passed decimation filter. uint32_t accepted; ///< Number of "on" samples that passed decimation filter.
uint32_t attempted; ///< Number of "accepted" samples that passed threshold requirements and had transmission to the host attempted. uint32_t
attempted; ///< Number of "accepted" samples that passed threshold requirements and had transmission to the host attempted.
bno08x_sample_counts_t() bno08x_sample_counts_t()
: offered(0UL) : offered(0UL)
@ -783,4 +801,5 @@ typedef struct bno08x_meta_data_t
} }
} bno08x_meta_data_t; } bno08x_meta_data_t;
static const constexpr uint8_t TOTAL_RPT_COUNT = 38; ///< Amount of possible reports returned from BNO08x. static const constexpr uint8_t TOTAL_RPT_COUNT =
38; ///< Amount of possible reports returned from BNO08x.

View File

@ -22,7 +22,8 @@ namespace BNO08xPrivateTypes
using bno08x_cb_list_t = etl::vector<etl::variant<BNO08xCbParamVoid, BNO08xCbParamRptID>, 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. 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). /// @brief Holds info about which functionality has been successfully initialized (used by
/// deconstructor during cleanup).
typedef struct bno08x_init_status_t typedef struct bno08x_init_status_t
{ {
bool gpio_outputs; ///< True if GPIO outputs have been initialized. bool gpio_outputs; ///< True if GPIO outputs have been initialized.
@ -63,9 +64,12 @@ namespace BNO08xPrivateTypes
etl::vector<uint8_t, TOTAL_RPT_COUNT>* _en_report_ids; etl::vector<uint8_t, TOTAL_RPT_COUNT>* _en_report_ids;
bno08x_cb_list_t* _cb_list; 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, bno08x_report_info_t(uint8_t ID, EventBits_t rpt_bit, SemaphoreHandle_t* _sh2_HAL_lock,
EventGroupHandle_t* _evt_grp_rpt_en, EventGroupHandle_t* _evt_grp_rpt_data_available, EventGroupHandle_t* _evt_grp_bno08x_task, SemaphoreHandle_t* _data_lock, EventGroupHandle_t* _evt_grp_rpt_en,
etl::vector<uint8_t, TOTAL_RPT_COUNT>* _en_report_ids, bno08x_cb_list_t* _cb_list) 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) : ID(ID)
, rpt_bit(rpt_bit) , rpt_bit(rpt_bit)
, _sh2_HAL_lock(_sh2_HAL_lock) , _sh2_HAL_lock(_sh2_HAL_lock)
@ -92,33 +96,52 @@ namespace BNO08xPrivateTypes
enum bno08x_rpt_bit_t : EventBits_t 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_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_GAME_BIT =
EVT_GRP_RPT_RV_ARVR_S_BIT = (1UL << 2U), ///< When set, ARVR stabilized rotation vector reports are active. (1UL << 1U), ///< When set, game 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_RV_ARVR_S_BIT =
EVT_GRP_RPT_GYRO_INTEGRATED_RV_BIT = (1UL << 4U), ///< When set, gyro integrator rotation vector reports are active. (1UL << 2U), ///< When set, ARVR stabilized rotation vector reports are active.
EVT_GRP_RPT_GEOMAG_RV_BIT = (1UL << 5U), ///< When set, geomagnetic rotation vector reports are active. EVT_GRP_RPT_RV_ARVR_S_GAME_BIT =
EVT_GRP_RPT_ACCELEROMETER_BIT = (1UL << 6U), ///< When set, accelerometer reports are active. (1UL << 3U), ///< When set, ARVR stabilized game rotation vector reports are active.
EVT_GRP_RPT_LINEAR_ACCELEROMETER_BIT = (1UL << 7U), ///< When set, linear accelerometer 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_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_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_UNCAL_GYRO_BIT =
EVT_GRP_RPT_CAL_MAGNETOMETER_BIT = (1UL << 11U), ///< When set, calibrated magnetometer reports are active. (1UL << 10U), ///< When set, uncalibrated gyro reports are active.
EVT_GRP_RPT_UNCAL_MAGNETOMETER_BIT = (1UL << 12U), ///< When set, uncalibrated magnetometer 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_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_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_STABILITY_CLASSIFIER_BIT =
EVT_GRP_RPT_ACTIVITY_CLASSIFIER_BIT = (1UL << 16U), ///< When set, activity classifier reports are active. (1UL << 15U), ///< When set, stability classifier reports are active.
EVT_GRP_RPT_SHAKE_DETECTOR_BIT = (1UL << 17U), ///< When set, shake detector reports are active. EVT_GRP_RPT_ACTIVITY_CLASSIFIER_BIT =
EVT_GRP_RPT_RAW_ACCELEROMETER_BIT = (1UL << 18U), ///< When set, raw accelerometer reports are active. (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_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_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_ALL = EVT_GRP_RPT_RV_BIT | EVT_GRP_RPT_RV_GAME_BIT | EVT_GRP_RPT_RV_ARVR_S_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_RV_ARVR_S_GAME_BIT | EVT_GRP_RPT_LINEAR_ACCELEROMETER_BIT |
EVT_GRP_RPT_CAL_MAGNETOMETER_BIT | EVT_GRP_RPT_TAP_DETECTOR_BIT | EVT_GRP_RPT_STEP_COUNTER_BIT | EVT_GRP_RPT_GRAVITY_BIT | EVT_GRP_RPT_CAL_GYRO_BIT |
EVT_GRP_RPT_STABILITY_CLASSIFIER_BIT | EVT_GRP_RPT_ACTIVITY_CLASSIFIER_BIT | EVT_GRP_RPT_RAW_ACCELEROMETER_BIT | EVT_GRP_RPT_UNCAL_GYRO_BIT | EVT_GRP_RPT_CAL_MAGNETOMETER_BIT |
EVT_GRP_RPT_RAW_GYRO_BIT | EVT_GRP_RPT_RAW_MAGNETOMETER_BIT | EVT_GRP_RPT_UNCAL_MAGNETOMETER_BIT | EVT_GRP_RPT_TAP_DETECTOR_BIT | EVT_GRP_RPT_STEP_COUNTER_BIT |
EVT_GRP_RPT_SHAKE_DETECTOR_BIT | EVT_GRP_RPT_ACCELEROMETER_BIT | EVT_GRP_RPT_GEOMAG_RV_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 EVT_GRP_RPT_GYRO_INTEGRATED_RV_BIT
}; };
@ -134,4 +157,4 @@ namespace BNO08xPrivateTypes
EVT_GRP_BNO08x_TASK_DATA_AVAILABLE = 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(). (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().
}; };
}; }; // namespace BNO08xPrivateTypes

View File

@ -57,10 +57,12 @@
* @param packet Pointer to bno08x_rx_packet_t containing data. * @param packet Pointer to bno08x_rx_packet_t containing data.
* @return Length of SHTP packet. * @return Length of SHTP packet.
*/ */
#define PARSE_PACKET_LENGTH(header) (UINT16_CLR_LSB(static_cast<uint16_t>(header[1]) << 8U) | UINT16_CLR_MSB(static_cast<uint16_t>(header[0]))) #define PARSE_PACKET_LENGTH(header) \
(UINT16_CLR_LSB(static_cast<uint16_t>(header[1]) << 8U) | \
UINT16_CLR_MSB(static_cast<uint16_t>(header[0])))
// forward dec to prevent compile errors // forward dec to prevent compile errors
class BNO08x; class BNO08x;
/** /**
* @class BNO08xSH2HAL * @class BNO08xSH2HAL

View File

@ -31,7 +31,8 @@ class BNO08xTestHelper
*/ */
static void print_test_start_banner(const char* TEST_TAG) static void print_test_start_banner(const char* TEST_TAG)
{ {
printf("------------------------ BEGIN TEST: %s ------------------------\n\r", TEST_TAG); printf("------------------------ BEGIN TEST: %s ------------------------\n\r",
TEST_TAG);
} }
/** /**

View File

@ -21,12 +21,14 @@ class BNO08xTestSuite
private: private:
static void print_begin_tests_banner(const char* test_set_name) static void print_begin_tests_banner(const char* test_set_name)
{ {
printf("####################### BEGIN TESTS: %s #######################\n\r", test_set_name); printf("####################### BEGIN TESTS: %s #######################\n\r",
test_set_name);
} }
static void print_end_tests_banner(const char* test_set_name) static void print_end_tests_banner(const char* test_set_name)
{ {
printf("####################### END TESTS: %s #######################\n\r", test_set_name); printf("####################### END TESTS: %s #######################\n\r",
test_set_name);
} }
public: public:

View File

@ -12,7 +12,8 @@
/** /**
* @class BNO08xCbGeneric * @class BNO08xCbGeneric
* *
* @brief Parent class to represent callback functions as generic type such that all flavors can be invoked by single type. * @brief Parent class to represent callback functions as generic type such that all flavors can be
* invoked by single type.
*/ */
class BNO08xCbGeneric class BNO08xCbGeneric
{ {

View File

@ -24,7 +24,8 @@ class BNO08xCbParamVoid : public BNO08xCbGeneric
/** /**
* @brief Invokes contained callback function. * @brief Invokes contained callback function.
* *
* @param rpt_ID n/a, not used, kept to maintain same prototype as BNO08xCbParamRptID::invoke() * @param rpt_ID n/a, not used, kept to maintain same prototype as
* BNO08xCbParamRptID::invoke()
* *
* @return void, nothing to return * @return void, nothing to return
*/ */

View File

@ -23,7 +23,8 @@
class BNO08xRpt class BNO08xRpt
{ {
public: public:
bool enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg = BNO08xPrivateTypes::default_sensor_cfg); 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 disable(sh2_SensorConfig_t sensor_cfg = BNO08xPrivateTypes::default_sensor_cfg);
bool register_cb(std::function<void(void)> cb_fxn); bool register_cb(std::function<void(void)> cb_fxn);
bool has_new_data(); bool has_new_data();
@ -33,17 +34,23 @@ class BNO08xRpt
bool get_meta_data(bno08x_meta_data_t& meta_data); bool get_meta_data(bno08x_meta_data_t& meta_data);
uint8_t ID; ///< Report ID, ex. SH2_ACCELERATION. 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 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. uint32_t period_us; ///< The period/interval of the report in microseconds.
protected: protected:
SemaphoreHandle_t* _sh2_HAL_lock; ///<Mutex to prevent sh2 HAL lib functions from being accessed at same time. SemaphoreHandle_t*
SemaphoreHandle_t* _data_lock; ///<Mutex to prevent user from reading data while data_proc_task() updates it, and vice versa. _sh2_HAL_lock; ///<Mutex to prevent sh2 HAL lib functions from being accessed at same time.
EventGroupHandle_t* _evt_grp_rpt_en; ///<Event group for indicating which reports are currently enabled. 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* 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). _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. EventGroupHandle_t*
etl::vector<uint8_t, TOTAL_RPT_COUNT>* _en_report_ids; ///< Vector to contain IDs of currently enabled reports _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. BNO08xPrivateTypes::bno08x_cb_list_t* _cb_list; ///< Vector to contain registered callbacks.
virtual void update_data(sh2_SensorValue_t* sensor_val) = 0; virtual void update_data(sh2_SensorValue_t* sensor_val) = 0;
@ -82,7 +89,8 @@ class BNO08xRpt
void signal_data_available(); void signal_data_available();
static const constexpr float RAD_2_DEG = static const constexpr float RAD_2_DEG =
(180.0f / M_PI); ///< Constant for radian to degree conversions, sed in quaternion to euler function conversions. (180.0f /
M_PI); ///< Constant for radian to degree conversions, sed in quaternion to euler function conversions.
static const constexpr char* TAG = "BNO08xRpt"; static const constexpr char* TAG = "BNO08xRpt";

View File

@ -27,6 +27,7 @@ class BNO08xRptActivityClassifier : public BNO08xRpt
private: private:
void update_data(sh2_SensorValue_t* sensor_val) override; void update_data(sh2_SensorValue_t* sensor_val) override;
bno08x_activity_classifier_t data; ///< Most recent report data, doesn't account for step rollover. bno08x_activity_classifier_t
data; ///< Most recent report data, doesn't account for step rollover.
static const constexpr char* TAG = "BNO08xRptActivityClassifier"; static const constexpr char* TAG = "BNO08xRptActivityClassifier";
}; };

View File

@ -20,7 +20,8 @@ class BNO08xTapDetector : public BNO08xRpt
{ {
} }
bool enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg = BNO08xPrivateTypes::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

@ -13,52 +13,74 @@ using namespace BNO08xPrivateTypes;
* *
* Construct a BNO08x object for managing a BNO08x sensor. * Construct a BNO08x object for managing a BNO08x sensor.
* *
* @param imu_config Configuration settings (optional), default settings can be seen in bno08x_config_t * @param imu_config Configuration settings (optional), default settings can be seen in
* bno08x_config_t
* @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(bno08x_report_info_t(SH2_ACCELEROMETER, EVT_GRP_RPT_ACCELEROMETER_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en, : rpt_accelerometer(bno08x_report_info_t(SH2_ACCELEROMETER, EVT_GRP_RPT_ACCELEROMETER_BIT,
&evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list)) &sh2_HAL_lock, &data_lock, &evt_grp_report_en, &evt_grp_report_data_available,
, linear_accelerometer(bno08x_report_info_t(SH2_LINEAR_ACCELERATION, EVT_GRP_RPT_LINEAR_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))
, gravity(bno08x_report_info_t(SH2_GRAVITY, EVT_GRP_RPT_GRAVITY_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
&evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, cal_magnetometer(bno08x_report_info_t(SH2_MAGNETIC_FIELD_CALIBRATED, EVT_GRP_RPT_CAL_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))
, uncal_magnetometer(bno08x_report_info_t(SH2_MAGNETIC_FIELD_UNCALIBRATED, EVT_GRP_RPT_UNCAL_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))
, cal_gyro(bno08x_report_info_t(SH2_GYROSCOPE_CALIBRATED, EVT_GRP_RPT_CAL_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))
, uncal_gyro(bno08x_report_info_t(SH2_GYROSCOPE_UNCALIBRATED, EVT_GRP_RPT_UNCAL_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))
, 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,
&evt_grp_bno08x_task, &en_report_ids, &cb_list)) &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, 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, , rpt_linear_accelerometer(bno08x_report_info_t(SH2_LINEAR_ACCELERATION,
EVT_GRP_RPT_LINEAR_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)) &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, 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, , rpt_gravity(bno08x_report_info_t(SH2_GRAVITY, EVT_GRP_RPT_GRAVITY_BIT, &sh2_HAL_lock,
&data_lock, &evt_grp_report_en, &evt_grp_report_data_available, &evt_grp_bno08x_task,
&en_report_ids, &cb_list))
, rpt_cal_magnetometer(bno08x_report_info_t(SH2_MAGNETIC_FIELD_CALIBRATED,
EVT_GRP_RPT_CAL_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)) &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, 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, , rpt_uncal_magnetometer(bno08x_report_info_t(SH2_MAGNETIC_FIELD_UNCALIBRATED,
&evt_grp_report_en, &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list)) EVT_GRP_RPT_UNCAL_MAGNETOMETER_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
, 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)) &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, , rpt_cal_gyro(bno08x_report_info_t(SH2_GYROSCOPE_CALIBRATED, EVT_GRP_RPT_CAL_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))
, rpt_uncal_gyro(bno08x_report_info_t(SH2_GYROSCOPE_UNCALIBRATED, EVT_GRP_RPT_UNCAL_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))
, rpt_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, &evt_grp_bno08x_task,
&en_report_ids, &cb_list))
, rpt_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, &evt_grp_report_data_available,
&evt_grp_bno08x_task, &en_report_ids, &cb_list))
, rpt_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, &evt_grp_report_data_available,
&evt_grp_bno08x_task, &en_report_ids, &cb_list))
, rpt_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)) &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, , rpt_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)) &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, , rpt_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)) &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, , rpt_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))
, rpt_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)) &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, , rpt_raw_magnetometer(bno08x_report_info_t(SH2_RAW_MAGNETOMETER,
&evt_grp_report_en, &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list)) EVT_GRP_RPT_RAW_MAGNETOMETER_BIT, &sh2_HAL_lock, &data_lock, &evt_grp_report_en,
, 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)) &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, , rpt_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))
, rpt_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)) &evt_grp_report_data_available, &evt_grp_bno08x_task, &en_report_ids, &cb_list))
, rpt_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))
, rpt_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))
, rpt_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)
@ -118,7 +140,8 @@ BNO08x::~BNO08x()
* @brief Initializes BNO08x sensor * @brief Initializes BNO08x sensor
* *
* Resets sensor and goes through initialization process. * Resets sensor and goes through initialization process.
* Configures GPIO, required ISRs, and launches two tasks, one to manage SPI transactions, another to process any received data. * Configures GPIO, required ISRs, and launches two tasks, one to manage SPI transactions, another
* to process any received data.
* *
* @return True if initialization was success, false if otherwise. * @return True if initialization was success, false if otherwise.
*/ */
@ -168,12 +191,14 @@ bool BNO08x::initialize()
*/ */
void BNO08x::data_proc_task_trampoline(void* arg) void BNO08x::data_proc_task_trampoline(void* arg)
{ {
BNO08x* imu = (BNO08x*) arg; // cast argument received by xTaskCreate ("this" pointer to imu object created by constructor call) BNO08x* imu = (BNO08x*) arg; // cast argument received by xTaskCreate ("this" pointer to imu
// object created by constructor call)
imu->data_proc_task(); // launch data processing task task from object imu->data_proc_task(); // launch data processing task task from object
} }
/** /**
* @brief Task responsible for parsing/handling sensor events sent by SH2 HAL and updating data that is returned to user. * @brief Task responsible for parsing/handling sensor events sent by SH2 HAL and updating data that
* is returned to user.
* *
* @return void, nothing to return * @return void, nothing to return
*/ */
@ -213,12 +238,14 @@ void BNO08x::data_proc_task()
*/ */
void BNO08x::sh2_HAL_service_task_trampoline(void* arg) void BNO08x::sh2_HAL_service_task_trampoline(void* arg)
{ {
BNO08x* imu = (BNO08x*) arg; // cast argument received by xTaskCreate ("this" pointer to imu object created by constructor call) BNO08x* imu = (BNO08x*) arg; // cast argument received by xTaskCreate ("this" pointer to imu
// object created by constructor call)
imu->sh2_HAL_service_task(); // launch data processing task task from object imu->sh2_HAL_service_task(); // launch data processing task task from object
} }
/** /**
* @brief Task responsible for calling shtp_service() when HINT is asserted to dispatch any sh2 HAL lib callbacks. * @brief Task responsible for calling shtp_service() when HINT is asserted to dispatch any sh2 HAL
* lib callbacks.
* *
* @return void, nothing to return * @return void, nothing to return
*/ */
@ -248,8 +275,9 @@ void BNO08x::sh2_HAL_service_task()
unlock_sh2_HAL(); unlock_sh2_HAL();
} }
evt_grp_bno08x_task_bits = xEventGroupWaitBits( evt_grp_bno08x_task_bits = xEventGroupWaitBits(evt_grp_bno08x_task,
evt_grp_bno08x_task, EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT | EVT_GRP_BNO08x_TASK_RESET_OCCURRED, pdFALSE, pdFALSE, portMAX_DELAY); EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT | EVT_GRP_BNO08x_TASK_RESET_OCCURRED, pdFALSE,
pdFALSE, portMAX_DELAY);
} while (evt_grp_bno08x_task_bits & EVT_GRP_BNO08x_TASKS_RUNNING); } while (evt_grp_bno08x_task_bits & EVT_GRP_BNO08x_TASKS_RUNNING);
@ -268,7 +296,8 @@ void BNO08x::sh2_HAL_service_task()
*/ */
void BNO08x::cb_task_trampoline(void* arg) void BNO08x::cb_task_trampoline(void* arg)
{ {
BNO08x* imu = (BNO08x*) arg; // cast argument received by xTaskCreate ("this" pointer to imu object created by constructor call) BNO08x* imu = (BNO08x*) arg; // cast argument received by xTaskCreate ("this" pointer to imu
// object created by constructor call)
imu->cb_task(); // launch data processing task task from object imu->cb_task(); // launch data processing task task from object
} }
@ -401,7 +430,8 @@ void BNO08x::handle_cb(uint8_t rpt_ID, BNO08xCbGeneric* cb_entry)
} }
/** /**
* @brief Initializes required esp-idf SPI data structures with values from user passed bno08x_config_t struct. * @brief Initializes required esp-idf SPI data structures with values from user passed
* bno08x_config_t struct.
* *
* @return ESP_OK if initialization was success. * @return ESP_OK if initialization was success.
*/ */
@ -470,7 +500,8 @@ esp_err_t BNO08x::init_config_args()
bus_config.quadwp_io_num = -1; // write protect signal gpio (not used) bus_config.quadwp_io_num = -1; // write protect signal gpio (not used)
// SPI slave device specific config // SPI slave device specific config
imu_spi_config.mode = 0x3; // set mode to 3 as per BNO08x datasheet (CPHA second edge, CPOL bus high when idle) imu_spi_config.mode = 0x3; // set mode to 3 as per BNO08x datasheet (CPHA second edge, CPOL bus
// high when idle)
if (imu_config.sclk_speed > SCLK_MAX_SPEED) // max sclk speed of 3MHz for BNO08x if (imu_config.sclk_speed > SCLK_MAX_SPEED) // max sclk speed of 3MHz for BNO08x
{ {
@ -487,9 +518,11 @@ esp_err_t BNO08x::init_config_args()
imu_spi_config.clock_speed_hz = imu_config.sclk_speed; // assign SCLK speed imu_spi_config.clock_speed_hz = imu_config.sclk_speed; // assign SCLK speed
imu_spi_config.address_bits = 0; // 0 address bits, not using this system imu_spi_config.address_bits = 0; // 0 address bits, not using this system
imu_spi_config.command_bits = 0; // 0 command bits, not using this system imu_spi_config.command_bits = 0; // 0 command bits, not using this system
imu_spi_config.spics_io_num = -1; // due to esp32 silicon issue, chip select cannot be used with full-duplex mode imu_spi_config.spics_io_num =
-1; // due to esp32 silicon issue, chip select cannot be used with full-duplex mode
// driver, it must be handled via calls to gpio pins // driver, it must be handled via calls to gpio pins
imu_spi_config.queue_size = static_cast<int>(CONFIG_ESP32_BNO08X_SPI_QUEUE_SZ); // set max allowable queued SPI transactions imu_spi_config.queue_size = static_cast<int>(
CONFIG_ESP32_BNO08X_SPI_QUEUE_SZ); // set max allowable queued SPI transactions
return ESP_OK; return ESP_OK;
} }
@ -523,7 +556,8 @@ esp_err_t BNO08x::init_gpio_inputs()
} }
else else
{ {
init_status.gpio_inputs = true; // set gpio_inputs to initialized such that deconstructor knows to clean them up init_status.gpio_inputs = true; // set gpio_inputs to initialized such that deconstructor
// knows to clean them up
} }
return ret; return ret;
@ -559,7 +593,8 @@ esp_err_t BNO08x::init_gpio_outputs()
} }
else else
{ {
init_status.gpio_outputs = true; // set gpio_inputs to initialized such that deconstructor knows to clean them up init_status.gpio_outputs = true; // set gpio_inputs to initialized such that deconstructor
// knows to clean them up
} }
return ret; return ret;
@ -615,8 +650,9 @@ esp_err_t BNO08x::init_hint_isr()
} }
else else
{ {
init_status.isr_service = true; // set isr service to initialized such that deconstructor knows to clean it up (this will be ignored if init_status.isr_service =
// imu_config.install_isr_service == false) true; // set isr service to initialized such that deconstructor knows to clean it up
// (this will be ignored if imu_config.install_isr_service == false)
} }
ret = gpio_isr_handler_add(imu_config.io_int, hint_handler, (void*) this); ret = gpio_isr_handler_add(imu_config.io_int, hint_handler, (void*) this);
@ -633,7 +669,8 @@ esp_err_t BNO08x::init_hint_isr()
} }
else else
{ {
init_status.isr_handler = true; // set isr handler to initialized such that deconstructor knows to clean it up init_status.isr_handler =
true; // set isr handler to initialized such that deconstructor knows to clean it up
} }
return ret; return ret;
@ -651,7 +688,8 @@ esp_err_t BNO08x::init_tasks()
xEventGroupSetBits(evt_grp_bno08x_task, EVT_GRP_BNO08x_TASKS_RUNNING); xEventGroupSetBits(evt_grp_bno08x_task, EVT_GRP_BNO08x_TASKS_RUNNING);
// launch data processing task // launch data processing task
task_created = xTaskCreate(&data_proc_task_trampoline, "bno08x_data_processing_task", DATA_PROC_TASK_SZ, this, 6, &data_proc_task_hdl); task_created = xTaskCreate(&data_proc_task_trampoline, "bno08x_data_processing_task",
DATA_PROC_TASK_SZ, this, 6, &data_proc_task_hdl);
if (task_created != pdTRUE) if (task_created != pdTRUE)
{ {
@ -669,7 +707,8 @@ esp_err_t BNO08x::init_tasks()
} }
// launch cb task // launch cb task
task_created = xTaskCreate(&cb_task_trampoline, "bno08x_cb_task", CB_TASK_SZ, this, 5, &cb_task_hdl); task_created =
xTaskCreate(&cb_task_trampoline, "bno08x_cb_task", CB_TASK_SZ, this, 5, &cb_task_hdl);
if (task_created != pdTRUE) if (task_created != pdTRUE)
{ {
@ -687,8 +726,8 @@ esp_err_t BNO08x::init_tasks()
} }
// launch sh2 hal service task // launch sh2 hal service task
task_created = task_created = xTaskCreate(&sh2_HAL_service_task_trampoline, "bno08x_sh2_HAL_service_task",
xTaskCreate(&sh2_HAL_service_task_trampoline, "bno08x_sh2_HAL_service_task", SH2_HAL_SERVICE_TASK_SZ, this, 7, &sh2_HAL_service_task_hdl); SH2_HAL_SERVICE_TASK_SZ, this, 7, &sh2_HAL_service_task_hdl);
if (task_created != pdTRUE) if (task_created != pdTRUE)
{ {
@ -999,13 +1038,15 @@ esp_err_t BNO08x::deinit_tasks()
// disable interrupts before beginning so we can ensure SPI transaction doesn't attempt to run // disable interrupts before beginning so we can ensure SPI transaction doesn't attempt to run
gpio_intr_disable(imu_config.io_int); gpio_intr_disable(imu_config.io_int);
init_count += (static_cast<uint8_t>(init_status.cb_task) + static_cast<uint8_t>(init_status.data_proc_task) + init_count += (static_cast<uint8_t>(init_status.cb_task) +
static_cast<uint8_t>(init_status.data_proc_task) +
static_cast<uint8_t>(init_status.sh2_HAL_service_task)); static_cast<uint8_t>(init_status.sh2_HAL_service_task));
if (init_count != 0) if (init_count != 0)
{ {
sem_kill_tasks = xSemaphoreCreateCounting(init_count, 0); sem_kill_tasks = xSemaphoreCreateCounting(init_count, 0);
xEventGroupClearBits(evt_grp_bno08x_task, EVT_GRP_BNO08x_TASKS_RUNNING); // clear task running bit request deletion of tasks xEventGroupClearBits(evt_grp_bno08x_task,
EVT_GRP_BNO08x_TASKS_RUNNING); // clear task running bit request deletion of tasks
if (init_status.cb_task) if (init_status.cb_task)
xQueueSend(queue_cb_report_id, &empty_ID, 0); xQueueSend(queue_cb_report_id, &empty_ID, 0);
@ -1218,7 +1259,165 @@ bool BNO08x::sleep()
} }
/** /**
* @brief Retrieves a record from flash record system (if your goal is to retrieve meta data use the BNO08xRpt:get_meta_data() method instead) * @brief Enables dynamic/motion engine calibration for specified sensor(s), see ref. manual 6.4.6.1
*
* @param sensor The sensor(s) to enable dynamic/ME calibration for.
*
* @return True if enable dynamic/ME calibration succeeded.
*/
bool BNO08x::enable_dynamic_calibration(BNO08xCalSel sensor)
{
int op_success = SH2_ERR;
lock_sh2_HAL();
op_success = sh2_setCalConfig(static_cast<uint8_t>(sensor));
unlock_sh2_HAL();
return (op_success == SH2_OK);
}
/**
* @brief Disables dynamic/motion engine calibration for specified sensor(s), see ref.
* manual 6.4.6.1
*
* @param sensor The sensor(s) to disable dynamic/ME calibration for.
*
* @return True if disable dynamic/ME calibration succeeded.
*/
bool BNO08x::disable_dynamic_calibration(BNO08xCalSel sensor)
{
int op_success = SH2_ERR;
uint8_t active_sensors = 0U;
lock_sh2_HAL();
op_success = sh2_getCalConfig(&active_sensors);
unlock_sh2_HAL();
if (op_success == SH2_OK)
{
active_sensors &= ~static_cast<uint8_t>(sensor);
lock_sh2_HAL();
op_success = sh2_setCalConfig(active_sensors);
unlock_sh2_HAL();
}
return (op_success == SH2_OK);
}
/**
* @brief Enables the automatic saving of dynamic/ME calibration data to BNO08x internal flash See
* ref manual 6.4.7.1.
*
* @return True if dynamic/ME calibration autosave data enable succeeded.
*/
bool BNO08x::enable_autosave_dynamic_calibration()
{
int op_success = SH2_ERR;
lock_sh2_HAL();
op_success = sh2_setDcdAutoSave(true);
unlock_sh2_HAL();
return (op_success == SH2_OK);
}
/**
* @brief Disables the automatic saving of dynamic/ME calibration data to BNO08x internal flash See
* ref manual 6.4.7.1.
*
* @return True if dynamic/ME calibration autosave data enable succeeded.
*/
bool BNO08x::disable_autosave_dynamic_calibration()
{
int op_success = SH2_ERR;
lock_sh2_HAL();
op_success = sh2_setDcdAutoSave(false);
unlock_sh2_HAL();
return (op_success == SH2_OK);
}
/**
* @brief Saves dynamic/motion engine calibration data to BNO08x internal flash immediately. See ref
* manual 6.4.5.1
*
* @return True if save dynamic/ME calibration data succeeded.
*/
bool BNO08x::save_dynamic_calibration()
{
int op_success = SH2_ERR;
lock_sh2_HAL();
op_success = sh2_saveDcdNow();
unlock_sh2_HAL();
return (op_success == SH2_OK);
}
/**
* @brief Clears dynamic/motion engine calibration data and resets BNO08x device. See ref
* manual 6.4.9.1
*
* @return True if save dynamic/ME calibration data succeeded.
*/
bool BNO08x::clear_dynamic_calibration()
{
int op_success = SH2_ERR;
// send clear DCD and reset command
lock_sh2_HAL();
op_success = sh2_clearDcdAndReset();
unlock_sh2_HAL();
if (op_success == SH2_OK)
{
// wait for reset to be detected by SH2 HAL lib
if (wait_for_reset() == ESP_OK)
{
// run service to dispatch callbacks
lock_sh2_HAL();
sh2_service();
unlock_sh2_HAL();
if (get_reset_reason() == BNO08xResetReason::EXT_RST)
{
return true;
}
else
{
// clang-format off
#ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS
ESP_LOGE(TAG, "Clear dynamic calibration failure, incorrect reset reason returned.");
#endif
// clang-format on
}
}
else
{
// clang-format off
#ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS
ESP_LOGE(TAG, "Clear dynamic calibration failure, reset never detected after sending command.");
#endif
// clang-format on
}
}
else
{
// clang-format off
#ifdef CONFIG_ESP32_BNO08x_LOG_STATEMENTS
ESP_LOGE(TAG, "Clear dynamic calibration failure, failed to send reset command");
#endif
// clang-format on
}
return false;
}
/**
* @brief Retrieves a record from flash record system (if your goal is to retrieve meta data use the
* BNO08xRpt:get_meta_data() method instead)
* *
* For more details on returned and data and frs_ID see ref. manual 6.3.7 & 4.3 * For more details on returned and data and frs_ID see ref. manual 6.3.7 & 4.3
* *
@ -1239,6 +1438,16 @@ bool BNO08x::get_frs(uint16_t frs_ID, uint32_t (&data)[16], uint16_t& rx_data_sz
return (op_success == SH2_OK); return (op_success == SH2_OK);
} }
/**
* @brief Returns product ID info sent by IMU at initialization.
*
* @return The product ID info returned at initialization.
*/
sh2_ProductIds_t BNO08x::get_product_IDs()
{
return product_IDs;
}
/** /**
* @brief Waits for HINT pin assertion or HOST_INT_TIMEOUT_DEFAULT_MS to elapse. * @brief Waits for HINT pin assertion or HOST_INT_TIMEOUT_DEFAULT_MS to elapse.
* *
@ -1249,7 +1458,8 @@ esp_err_t BNO08x::wait_for_hint()
{ {
EventBits_t spi_evt_bits; EventBits_t spi_evt_bits;
spi_evt_bits = xEventGroupWaitBits(evt_grp_bno08x_task, EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT, pdTRUE, pdFALSE, HOST_INT_TIMEOUT_DEFAULT_MS); spi_evt_bits = xEventGroupWaitBits(evt_grp_bno08x_task, EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT,
pdTRUE, pdFALSE, HOST_INT_TIMEOUT_DEFAULT_MS);
if (spi_evt_bits & EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT) if (spi_evt_bits & EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT)
return ESP_OK; return ESP_OK;
@ -1265,7 +1475,8 @@ esp_err_t BNO08x::wait_for_hint()
*/ */
esp_err_t BNO08x::wait_for_reset() esp_err_t BNO08x::wait_for_reset()
{ {
if (xEventGroupWaitBits(evt_grp_bno08x_task, EVT_GRP_BNO08x_TASK_RESET_OCCURRED, pdFALSE, pdFALSE, HOST_INT_TIMEOUT_DEFAULT_MS) & if (xEventGroupWaitBits(evt_grp_bno08x_task, EVT_GRP_BNO08x_TASK_RESET_OCCURRED, pdFALSE,
pdFALSE, HOST_INT_TIMEOUT_DEFAULT_MS) &
EVT_GRP_BNO08x_TASK_RESET_OCCURRED) EVT_GRP_BNO08x_TASK_RESET_OCCURRED)
return ESP_OK; return ESP_OK;
else else
@ -1291,7 +1502,8 @@ void BNO08x::toggle_reset()
} }
/** /**
* @brief Re-enables all reports enabled by user (called when BNO08x reset is detected by sh2 HAL lib). * @brief Re-enables all reports enabled by user (called when BNO08x reset is detected by sh2 HAL
* lib).
* *
* @return ESP_OK if enabled reports were successfuly re-enabled. * @return ESP_OK if enabled reports were successfuly re-enabled.
*/ */
@ -1339,7 +1551,8 @@ esp_err_t BNO08x::re_enable_reports()
bool BNO08x::data_available() bool BNO08x::data_available()
{ {
if (xEventGroupWaitBits(evt_grp_bno08x_task, EVT_GRP_BNO08x_TASK_DATA_AVAILABLE, pdTRUE, pdFALSE, DATA_AVAILABLE_TIMEOUT_MS) & if (xEventGroupWaitBits(evt_grp_bno08x_task, EVT_GRP_BNO08x_TASK_DATA_AVAILABLE, pdTRUE,
pdFALSE, DATA_AVAILABLE_TIMEOUT_MS) &
EVT_GRP_BNO08x_TASK_DATA_AVAILABLE) EVT_GRP_BNO08x_TASK_DATA_AVAILABLE)
return true; return true;
@ -1365,9 +1578,11 @@ bool BNO08x::register_cb(std::function<void(void)> cb_fxn)
} }
/** /**
* @brief Registers a callback to execute when new data from a report is received, overloaded with callback param for most recent report ID. * @brief Registers a callback to execute when new data from a report is received, overloaded with
* callback param for most recent report ID.
* *
* @param cb_fxn Pointer to the call-back function should be of void return type with single input param of uint8_t for most recent report ID. * @param cb_fxn Pointer to the call-back function should be of void return type with single input
* param of uint8_t for most recent report ID.
* *
* @return void, nothing to return * @return void, nothing to return
*/ */
@ -1399,8 +1614,9 @@ void BNO08x::print_product_ids()
" SW Build Number: 0x%" PRIx32 "\n\r" " SW Build Number: 0x%" PRIx32 "\n\r"
" SW Version Patch: 0x%" PRIx16 "\n\r" " SW Version Patch: 0x%" PRIx16 "\n\r"
" ---------------------------\n\r", " ---------------------------\n\r",
i, product_IDs.entry->swPartNumber, product_IDs.entry->swVersionMajor, product_IDs.entry->swVersionMinor, i, product_IDs.entry->swPartNumber, product_IDs.entry->swVersionMajor,
product_IDs.entry->swBuildNumber, product_IDs.entry->swVersionPatch); product_IDs.entry->swVersionMinor, product_IDs.entry->swBuildNumber,
product_IDs.entry->swVersionPatch);
} }
} }
@ -1495,10 +1711,11 @@ const char* BNO08x::accuracy_to_str(BNO08xAccuracy accuracy)
void IRAM_ATTR BNO08x::hint_handler(void* arg) void IRAM_ATTR BNO08x::hint_handler(void* arg)
{ {
BaseType_t xHighPriorityTaskWoken = pdFALSE; BaseType_t xHighPriorityTaskWoken = pdFALSE;
BNO08x* imu = (BNO08x*) arg; // cast argument received by gpio_isr_handler_add ("this" pointer to imu object BNO08x* imu = (BNO08x*) arg; // cast argument received by gpio_isr_handler_add ("this" pointer
// created by constructor call) // to imu object created by constructor call)
// notify any tasks/function calls waiting for HINT assertion // notify any tasks/function calls waiting for HINT assertion
xEventGroupSetBitsFromISR(imu->evt_grp_bno08x_task, EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT, &xHighPriorityTaskWoken); xEventGroupSetBitsFromISR(
imu->evt_grp_bno08x_task, EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT, &xHighPriorityTaskWoken);
portYIELD_FROM_ISR(xHighPriorityTaskWoken); // perform context switch if necessary portYIELD_FROM_ISR(xHighPriorityTaskWoken); // perform context switch if necessary
} }

View File

@ -9,7 +9,8 @@
* @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 BNO08xPrivateTypes::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.
*/ */
@ -46,7 +47,8 @@ bool BNO08xRpt::enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_
} }
/** /**
* @brief Disables a sensor report by setting its period to 0us such that the BNO08x stops sending it. * @brief Disables a sensor report by setting its period to 0us such that the BNO08x stops sending
* it.
* *
* @param sensor_ID The ID of the sensor for the respective report to be disabled. * @param sensor_ID The ID of the sensor for the respective report to be disabled.
* @param sensor_cfg Sensor special configuration. * @param sensor_cfg Sensor special configuration.
@ -180,9 +182,11 @@ bool BNO08xRpt::clear_sample_counts()
} }
/** /**
* @brief Retrieves meta data for this sensor/report by reading respective record in FRS (flash record system). * @brief Retrieves meta data for this sensor/report by reading respective record in FRS (flash
* record system).
* *
* Can be used to retrieve the minimum period, maximum period, actual Q points, resolution, and other info for a given sensor. * Can be used to retrieve the minimum period, maximum period, actual Q points, resolution, and
* other info for a given sensor.
* *
* @return True clear get meta data operation succeeded. * @return True clear get meta data operation succeeded.
*/ */
@ -250,5 +254,6 @@ void BNO08xRpt::unlock_user_data()
void BNO08xRpt::signal_data_available() void BNO08xRpt::signal_data_available()
{ {
xEventGroupSetBits(*_evt_grp_rpt_data_available, rpt_bit); xEventGroupSetBits(*_evt_grp_rpt_data_available, rpt_bit);
xEventGroupSetBits(*_evt_grp_bno08x_task, BNO08xPrivateTypes::EVT_GRP_BNO08x_TASK_DATA_AVAILABLE); xEventGroupSetBits(
*_evt_grp_bno08x_task, BNO08xPrivateTypes::EVT_GRP_BNO08x_TASK_DATA_AVAILABLE);
} }

View File

@ -33,7 +33,8 @@ int BNO08xSH2HAL::spi_open(sh2_Hal_t* self)
} }
/** /**
* @brief Closes SPI instance (nothing to do here, but required by sh2 HAL lib for cases where other communication protocols are used.) * @brief Closes SPI instance (nothing to do here, but required by sh2 HAL lib for cases where other
* communication protocols are used.)
* *
* @return void, nothing to return * @return void, nothing to return
*/ */
@ -136,7 +137,8 @@ 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, BNO08xPrivateTypes::EVT_GRP_BNO08x_TASK_RESET_OCCURRED); xEventGroupSetBits(
imu->evt_grp_bno08x_task, BNO08xPrivateTypes::EVT_GRP_BNO08x_TASK_RESET_OCCURRED);
} }
/** /**

View File

@ -10,13 +10,17 @@
* *
* @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 BNO08xPrivateTypes::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.
*/ */
bool BNO08xRptActivityClassifier::enable(uint32_t time_between_reports, BNO08xActivityEnable activities_to_enable, sh2_SensorConfig_t sensor_cfg) bool BNO08xRptActivityClassifier::enable(uint32_t time_between_reports,
BNO08xActivityEnable activities_to_enable, sh2_SensorConfig_t sensor_cfg)
{ {
sensor_cfg.sensorSpecific = static_cast<uint8_t>(activities_to_enable); // this must be set regardless of user cfg or no reports will be received sensor_cfg.sensorSpecific =
static_cast<uint8_t>(activities_to_enable); // this must be set regardless of user cfg
// or no reports will be received
return BNO08xRpt::enable(time_between_reports, sensor_cfg); return BNO08xRpt::enable(time_between_reports, sensor_cfg);
} }

View File

@ -41,7 +41,8 @@ void BNO08xRptIGyroRV::get(bno08x_quat_t& quat, bno08x_ang_vel_t& vel)
} }
/** /**
* @brief Grabs most recent gyro integrated rotation vector angular velocity data, units are in rad/s. * @brief Grabs most recent gyro integrated rotation vector angular velocity data, units are in
* rad/s.
* *
* @return Struct containing requested data. * @return Struct containing requested data.
*/ */

View File

@ -6,7 +6,8 @@
#include "BNO08xRptRVGeneric.hpp" #include "BNO08xRptRVGeneric.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).
* *
* The following RV reports have rad accuracy data: * The following RV reports have rad accuracy data:
* *
@ -25,7 +26,8 @@ bno08x_quat_t BNO08xRptRVGeneric::get_quat()
} }
/** /**
* @brief Grabs most recent rotation vector data in form of an euler angle, units are in degrees or rads. * @brief Grabs most recent rotation vector data in form of an euler angle, units are in degrees or
* rads.
* *
* @param in_degrees If true returned euler angle is in degrees, if false in radians * @param in_degrees If true returned euler angle is in degrees, if false in radians
* *

View File

@ -24,7 +24,8 @@ void BNO08xRptRawMEMSAccelerometer::update_data(sh2_SensorValue_t* sensor_val)
} }
/** /**
* @brief Grabs most recent raw accelerometer data, units are ADC counts, time_stamp in microseconds. * @brief Grabs most recent raw accelerometer data, units are ADC counts, time_stamp in
* microseconds.
* *
* @return Struct containing requested data. * @return Struct containing requested data.
*/ */

View File

@ -48,7 +48,8 @@ uint32_t BNO08xRptStepCounter::get_total_steps()
} }
/** /**
* @brief Grabs most recent step counter data (rollover not accounted for in step count, just most recent report data). * @brief Grabs most recent step counter data (rollover not accounted for in step count, just most
* recent report data).
* *
* @return Struct containing requested data. * @return Struct containing requested data.
*/ */

View File

@ -4,6 +4,7 @@
*/ */
#include "BNO08xShakeDetector.hpp" #include "BNO08xShakeDetector.hpp"
/** /**
* @brief Updates shake detector data from decoded sensor event. * @brief Updates shake detector data from decoded sensor event.
* *

View File

@ -6,17 +6,21 @@
#include "BNO08xTapDetector.hpp" #include "BNO08xTapDetector.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 BNO08xPrivateTypes::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.
*/ */
bool BNO08xTapDetector::enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg) bool BNO08xTapDetector::enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg)
{ {
sensor_cfg.changeSensitivityEnabled = true; // this must be set regardless of user cfg or no reports will be received sensor_cfg.changeSensitivityEnabled =
sensor_cfg.changeSensitivity = 0U; // this must be set regardless of user cfg or no reports will be received true; // this must be set regardless of user cfg or no reports will be received
sensor_cfg.changeSensitivity =
0U; // this must be set regardless of user cfg or no reports will be received
return BNO08xRpt::enable(time_between_reports, sensor_cfg); return BNO08xRpt::enable(time_between_reports, sensor_cfg);
} }

View File

@ -3,16 +3,19 @@
* @author Myles Parfeniuk * @author Myles Parfeniuk
* *
* *
* @warning YOU MUST ADD THE FOLLOWING LINE TO YOUR MAIN PROJECTS CMakeLists.txt IN ORDER FOR THIS TEST SUITE TO BE BUILT WITH PROJECT: * @warning YOU MUST ADD THE FOLLOWING LINE TO YOUR MAIN PROJECTS CMakeLists.txt IN ORDER FOR THIS
* set(TEST_COMPONENTS "esp32_BNO08x" CACHE STRING "Components to test.") * TEST SUITE TO BE BUILT WITH PROJECT: set(TEST_COMPONENTS "esp32_BNO08x" CACHE STRING "Components
* to test.")
*/ */
#include "unity.h" #include "unity.h"
#include "../include/BNO08xTestHelper.hpp" #include "../include/BNO08xTestHelper.hpp"
TEST_CASE("BNO08x Driver Creation for [CallbackAllReportVoidInputParam] Tests", "[CallbackAllReportVoidInputParam]") TEST_CASE("BNO08x Driver Creation for [CallbackAllReportVoidInputParam] Tests",
"[CallbackAllReportVoidInputParam]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Creation for [CallbackAllReportVoidInputParam] Tests"; const constexpr char* TEST_TAG =
"BNO08x Driver Creation for [CallbackAllReportVoidInputParam] Tests";
BNO08x* imu = nullptr; BNO08x* imu = nullptr;
@ -56,76 +59,101 @@ TEST_CASE("Void Input Param Flavor Cb", "[CallbackAllReportVoidInputParam]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
imu->register_cb( imu->register_cb(
[&imu, &data_available_accel, &data_available_lin_accel, &data_available_grav, &data_available_cal_gyro, &data_available_cal_magnetometer, [&imu, &data_available_accel, &data_available_lin_accel, &data_available_grav,
&data_accel, &data_available_rv, &data_available_rv_game, &data_available_rv_geomagnetic, &data_quat, &data_vel, &data_magf, &data_available_cal_gyro, &data_available_cal_magnetometer, &data_accel,
&msg_buff, &test_running]() &data_available_rv, &data_available_rv_game, &data_available_rv_geomagnetic,
&data_quat, &data_vel, &data_magf, &msg_buff, &test_running]()
{ {
static int i = 0; static int i = 0;
if (i < RX_REPORT_TRIAL_CNT) if (i < RX_REPORT_TRIAL_CNT)
{ {
if (imu->accelerometer.has_new_data()) if (imu->rpt_accelerometer.has_new_data())
{ {
data_available_accel = true; data_available_accel = true;
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, sprintf(msg_buff,
data_accel.y, data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f "
"accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
else if (imu->linear_accelerometer.has_new_data()) else if (imu->rpt_linear_accelerometer.has_new_data())
{ {
data_available_lin_accel = true; data_available_lin_accel = true;
data_accel = imu->linear_accelerometer.get(); data_accel = imu->rpt_linear_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: LinAccel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, sprintf(msg_buff,
data_accel.y, data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: LinAccel: [m/s^2] x: %.2f y: %.2f z: "
"%.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
else if (imu->gravity.has_new_data()) else if (imu->rpt_gravity.has_new_data())
{ {
data_available_grav = true; data_available_grav = true;
data_accel = imu->gravity.get(); data_accel = imu->rpt_gravity.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Gravity: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, sprintf(msg_buff,
data_accel.y, data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Gravity: [m/s^2] x: %.2f y: %.2f z: "
"%.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
else if (imu->cal_gyro.has_new_data()) else if (imu->rpt_cal_gyro.has_new_data())
{ {
data_available_cal_gyro = true; data_available_cal_gyro = true;
data_vel = imu->cal_gyro.get(); data_vel = imu->rpt_cal_gyro.get();
sprintf(msg_buff, "Rx Data Trial %d Success: CalGyro: [rad/s] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_vel.x, sprintf(msg_buff,
data_vel.y, data_vel.z, BNO08x::accuracy_to_str(data_vel.accuracy)); "Rx Data Trial %d Success: CalGyro: [rad/s] x: %.2f y: %.2f z: "
"%.2f accuracy: %s ",
(i + 1), data_vel.x, data_vel.y, data_vel.z,
BNO08x::accuracy_to_str(data_vel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
else if (imu->cal_magnetometer.has_new_data()) else if (imu->rpt_cal_magnetometer.has_new_data())
{ {
data_available_cal_magnetometer = true; data_available_cal_magnetometer = true;
data_magf = imu->cal_magnetometer.get(); data_magf = imu->rpt_cal_magnetometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: CalMagnetometer: [uTesla] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data_magf.x, data_magf.y, data_magf.z, BNO08x::accuracy_to_str(data_magf.accuracy)); "Rx Data Trial %d Success: CalMagnetometer: [uTesla] x: %.2f y: "
"%.2f z: %.2f accuracy: %s ",
(i + 1), data_magf.x, data_magf.y, data_magf.z,
BNO08x::accuracy_to_str(data_magf.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
else if (imu->rv.has_new_data()) else if (imu->rpt_rv.has_new_data())
{ {
data_available_rv = true; data_available_rv = true;
data_quat = imu->rv.get_quat(); data_quat = imu->rpt_rv.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data_quat.real, data_quat.i, data_quat.j, data_quat.k, BNO08x::accuracy_to_str(data_quat.accuracy)); "Rx Data Trial %d Success: RV: [n/a] real: %.2f i: %.2f j: %.2f k: "
"%.2f accuracy: %s ",
(i + 1), data_quat.real, data_quat.i, data_quat.j, data_quat.k,
BNO08x::accuracy_to_str(data_quat.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
else if (imu->rv_game.has_new_data()) else if (imu->rpt_rv_game.has_new_data())
{ {
data_available_rv_game = true; data_available_rv_game = true;
data_quat = imu->rv_game.get_quat(); data_quat = imu->rpt_rv_game.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV Game: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data_quat.real, data_quat.i, data_quat.j, data_quat.k, BNO08x::accuracy_to_str(data_quat.accuracy)); "Rx Data Trial %d Success: RV Game: [n/a] real: %.2f i: %.2f j: "
"%.2f k: %.2f accuracy: %s ",
(i + 1), data_quat.real, data_quat.i, data_quat.j, data_quat.k,
BNO08x::accuracy_to_str(data_quat.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
else if (imu->rv_geomagnetic.has_new_data()) else if (imu->rpt_rv_geomagnetic.has_new_data())
{ {
data_available_rv_geomagnetic = true; data_available_rv_geomagnetic = true;
data_quat = imu->rv_geomagnetic.get_quat(); data_quat = imu->rpt_rv_geomagnetic.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV Geomagnetic: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data_quat.real, data_quat.i, data_quat.j, data_quat.k, BNO08x::accuracy_to_str(data_quat.accuracy)); "Rx Data Trial %d Success: RV Geomagnetic: [n/a] real: %.2f i: "
"%.2f j: %.2f k: %.2f accuracy: %s ",
(i + 1), data_quat.real, data_quat.i, data_quat.j, data_quat.k,
BNO08x::accuracy_to_str(data_quat.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
@ -133,26 +161,26 @@ TEST_CASE("Void Input Param Flavor Cb", "[CallbackAllReportVoidInputParam]")
} }
else if (test_running) else if (test_running)
{ {
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.disable());
TEST_ASSERT_EQUAL(true, imu->gravity.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_gravity.disable());
TEST_ASSERT_EQUAL(true, imu->cal_gyro.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_cal_gyro.disable());
TEST_ASSERT_EQUAL(true, imu->cal_magnetometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_cal_magnetometer.disable());
TEST_ASSERT_EQUAL(true, imu->rv.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv.disable());
TEST_ASSERT_EQUAL(true, imu->rv_game.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_game.disable());
TEST_ASSERT_EQUAL(true, imu->rv_geomagnetic.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_geomagnetic.disable());
test_running = false; test_running = false;
} }
}); });
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->gravity.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_gravity.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->cal_gyro.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_cal_gyro.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->cal_magnetometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_cal_magnetometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->rv.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->rv_game.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_game.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->rv_geomagnetic.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_geomagnetic.enable(REPORT_PERIOD));
while (test_running) while (test_running)
{ {
@ -170,9 +198,11 @@ TEST_CASE("Void Input Param Flavor Cb", "[CallbackAllReportVoidInputParam]")
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
TEST_CASE("BNO08x Driver Cleanup for [CallbackAllReportVoidInputParam] Tests", "[CallbackAllReportVoidInputParam]") TEST_CASE("BNO08x Driver Cleanup for [CallbackAllReportVoidInputParam] Tests",
"[CallbackAllReportVoidInputParam]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Cleanup for [CallbackAllReportVoidInputParam] Tests"; const constexpr char* TEST_TAG =
"BNO08x Driver Cleanup for [CallbackAllReportVoidInputParam] Tests";
BNO08xTestHelper::print_test_start_banner(TEST_TAG); BNO08xTestHelper::print_test_start_banner(TEST_TAG);
BNO08xTestHelper::print_test_msg(TEST_TAG, "Destroying BNO08x Driver."); BNO08xTestHelper::print_test_msg(TEST_TAG, "Destroying BNO08x Driver.");
@ -181,9 +211,11 @@ TEST_CASE("BNO08x Driver Cleanup for [CallbackAllReportVoidInputParam] Tests", "
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
TEST_CASE("BNO08x Driver Creation for [CallbackAllReportIDInputParam] Tests", "[CallbackAllReportIDInputParam]") TEST_CASE("BNO08x Driver Creation for [CallbackAllReportIDInputParam] Tests",
"[CallbackAllReportIDInputParam]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Creation for [CallbackAllReportIDInputParam] Tests"; const constexpr char* TEST_TAG =
"BNO08x Driver Creation for [CallbackAllReportIDInputParam] Tests";
BNO08x* imu = nullptr; BNO08x* imu = nullptr;
@ -226,9 +258,10 @@ TEST_CASE("Report ID Input Param Flavor Cb", "[CallbackAllReportIDInputParam]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
imu->register_cb( imu->register_cb(
[&imu, &data_available_accel, &data_available_lin_accel, &data_available_grav, &data_available_cal_gyro, &data_available_cal_magnetometer, [&imu, &data_available_accel, &data_available_lin_accel, &data_available_grav,
&data_accel, &data_available_rv, &data_available_rv_game, &data_available_rv_geomagnetic, &data_quat, &data_vel, &data_magf, &data_available_cal_gyro, &data_available_cal_magnetometer, &data_accel,
&msg_buff, &test_running](uint8_t report_ID) &data_available_rv, &data_available_rv_game, &data_available_rv_geomagnetic,
&data_quat, &data_vel, &data_magf, &msg_buff, &test_running](uint8_t report_ID)
{ {
static int i = 0; static int i = 0;
if (i < RX_REPORT_TRIAL_CNT) if (i < RX_REPORT_TRIAL_CNT)
@ -238,65 +271,89 @@ TEST_CASE("Report ID Input Param Flavor Cb", "[CallbackAllReportIDInputParam]")
case SH2_ACCELEROMETER: case SH2_ACCELEROMETER:
data_available_accel = true; data_available_accel = true;
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, sprintf(msg_buff,
data_accel.y, data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: "
"%.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
break; break;
case SH2_LINEAR_ACCELERATION: case SH2_LINEAR_ACCELERATION:
data_available_lin_accel = true; data_available_lin_accel = true;
data_accel = imu->linear_accelerometer.get(); data_accel = imu->rpt_linear_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: LinAccel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data_accel.x, data_accel.y, data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: LinAccel: [m/s^2] x: %.2f y: %.2f "
"z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
break; break;
case SH2_GRAVITY: case SH2_GRAVITY:
data_available_grav = true; data_available_grav = true;
data_accel = imu->gravity.get(); data_accel = imu->rpt_gravity.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Gravity: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data_accel.x, data_accel.y, data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Gravity: [m/s^2] x: %.2f y: %.2f z: "
"%.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
break; break;
case SH2_GYROSCOPE_CALIBRATED: case SH2_GYROSCOPE_CALIBRATED:
data_available_cal_gyro = true; data_available_cal_gyro = true;
data_vel = imu->cal_gyro.get(); data_vel = imu->rpt_cal_gyro.get();
sprintf(msg_buff, "Rx Data Trial %d Success: CalGyro: [rad/s] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_vel.x, sprintf(msg_buff,
data_vel.y, data_vel.z, BNO08x::accuracy_to_str(data_vel.accuracy)); "Rx Data Trial %d Success: CalGyro: [rad/s] x: %.2f y: %.2f z: "
"%.2f accuracy: %s ",
(i + 1), data_vel.x, data_vel.y, data_vel.z,
BNO08x::accuracy_to_str(data_vel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
break; break;
case SH2_MAGNETIC_FIELD_CALIBRATED: case SH2_MAGNETIC_FIELD_CALIBRATED:
data_available_cal_magnetometer = true; data_available_cal_magnetometer = true;
data_magf = imu->cal_magnetometer.get(); data_magf = imu->rpt_cal_magnetometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: CalMagnetometer: [uTesla] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data_magf.x, data_magf.y, data_magf.z, BNO08x::accuracy_to_str(data_magf.accuracy)); "Rx Data Trial %d Success: CalMagnetometer: [uTesla] x: %.2f "
"y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_magf.x, data_magf.y, data_magf.z,
BNO08x::accuracy_to_str(data_magf.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
break; break;
case SH2_ROTATION_VECTOR: case SH2_ROTATION_VECTOR:
data_available_rv = true; data_available_rv = true;
data_quat = imu->rv.get_quat(); data_quat = imu->rpt_rv.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data_quat.real, data_quat.i, data_quat.j, data_quat.k, BNO08x::accuracy_to_str(data_quat.accuracy)); "Rx Data Trial %d Success: RV: [n/a] real: %.2f i: %.2f j: "
"%.2f k: %.2f accuracy: %s ",
(i + 1), data_quat.real, data_quat.i, data_quat.j, data_quat.k,
BNO08x::accuracy_to_str(data_quat.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
break; break;
case SH2_GAME_ROTATION_VECTOR: case SH2_GAME_ROTATION_VECTOR:
data_available_rv_game = true; data_available_rv_game = true;
data_quat = imu->rv_game.get_quat(); data_quat = imu->rpt_rv_game.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV Game: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data_quat.real, data_quat.i, data_quat.j, data_quat.k, BNO08x::accuracy_to_str(data_quat.accuracy)); "Rx Data Trial %d Success: RV Game: [n/a] real: %.2f i: %.2f "
"j: %.2f k: %.2f accuracy: %s ",
(i + 1), data_quat.real, data_quat.i, data_quat.j, data_quat.k,
BNO08x::accuracy_to_str(data_quat.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
break; break;
case SH2_GEOMAGNETIC_ROTATION_VECTOR: case SH2_GEOMAGNETIC_ROTATION_VECTOR:
data_available_rv_geomagnetic = true; data_available_rv_geomagnetic = true;
data_quat = imu->rv_geomagnetic.get_quat(); data_quat = imu->rpt_rv_geomagnetic.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV Geomagnetic: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", sprintf(msg_buff,
(i + 1), data_quat.real, data_quat.i, data_quat.j, data_quat.k, BNO08x::accuracy_to_str(data_quat.accuracy)); "Rx Data Trial %d Success: RV Geomagnetic: [n/a] real: %.2f i: "
"%.2f j: %.2f k: %.2f accuracy: %s ",
(i + 1), data_quat.real, data_quat.i, data_quat.j, data_quat.k,
BNO08x::accuracy_to_str(data_quat.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
break; break;
@ -309,26 +366,26 @@ TEST_CASE("Report ID Input Param Flavor Cb", "[CallbackAllReportIDInputParam]")
} }
else if (test_running) else if (test_running)
{ {
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.disable());
TEST_ASSERT_EQUAL(true, imu->gravity.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_gravity.disable());
TEST_ASSERT_EQUAL(true, imu->cal_gyro.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_cal_gyro.disable());
TEST_ASSERT_EQUAL(true, imu->cal_magnetometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_cal_magnetometer.disable());
TEST_ASSERT_EQUAL(true, imu->rv.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv.disable());
TEST_ASSERT_EQUAL(true, imu->rv_game.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_game.disable());
TEST_ASSERT_EQUAL(true, imu->rv_geomagnetic.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_geomagnetic.disable());
test_running = false; test_running = false;
} }
}); });
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->gravity.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_gravity.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->cal_gyro.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_cal_gyro.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->cal_magnetometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_cal_magnetometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->rv.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->rv_game.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_game.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->rv_geomagnetic.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_geomagnetic.enable(REPORT_PERIOD));
while (test_running) while (test_running)
{ {
@ -346,9 +403,11 @@ TEST_CASE("Report ID Input Param Flavor Cb", "[CallbackAllReportIDInputParam]")
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
TEST_CASE("BNO08x Driver Cleanup for [CallbackAllReportIDInputParam] Tests", "[CallbackAllReportIDInputParam]") TEST_CASE("BNO08x Driver Cleanup for [CallbackAllReportIDInputParam] Tests",
"[CallbackAllReportIDInputParam]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Cleanup for [CallbackAllReportIDInputParam] Tests"; const constexpr char* TEST_TAG =
"BNO08x Driver Cleanup for [CallbackAllReportIDInputParam] Tests";
BNO08xTestHelper::print_test_start_banner(TEST_TAG); BNO08xTestHelper::print_test_start_banner(TEST_TAG);
BNO08xTestHelper::print_test_msg(TEST_TAG, "Destroying BNO08x Driver."); BNO08xTestHelper::print_test_msg(TEST_TAG, "Destroying BNO08x Driver.");
@ -357,9 +416,11 @@ TEST_CASE("BNO08x Driver Cleanup for [CallbackAllReportIDInputParam] Tests", "[C
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
TEST_CASE("BNO08x Driver Creation for [CallbackSingleReportVoidInputParam] Tests", "[CallbackSingleReportVoidInputParam]") TEST_CASE("BNO08x Driver Creation for [CallbackSingleReportVoidInputParam] Tests",
"[CallbackSingleReportVoidInputParam]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Creation for [CallbackSingleReportVoidInputParam] Tests"; const constexpr char* TEST_TAG =
"BNO08x Driver Creation for [CallbackSingleReportVoidInputParam] Tests";
BNO08x* imu = nullptr; BNO08x* imu = nullptr;
@ -391,7 +452,7 @@ TEST_CASE("Single Report Void Input Param Flavor Cb", "[CallbackSingleReportVoid
BNO08xTestHelper::print_test_start_banner(TEST_TAG); BNO08xTestHelper::print_test_start_banner(TEST_TAG);
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
imu->accelerometer.register_cb( imu->rpt_accelerometer.register_cb(
[&imu, &data_available_accel, &data_accel, &msg_buff, &test_running]() [&imu, &data_available_accel, &data_accel, &msg_buff, &test_running]()
{ {
static int i = 0; static int i = 0;
@ -399,21 +460,24 @@ TEST_CASE("Single Report Void Input Param Flavor Cb", "[CallbackSingleReportVoid
if (i < RX_REPORT_TRIAL_CNT) if (i < RX_REPORT_TRIAL_CNT)
{ {
data_available_accel = true; data_available_accel = true;
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, sprintf(msg_buff,
data_accel.y, data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f "
"accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
i++; i++;
} }
else if (test_running) else if (test_running)
{ {
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
test_running = false; test_running = false;
} }
}); });
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
while (test_running) while (test_running)
{ {
@ -424,9 +488,11 @@ TEST_CASE("Single Report Void Input Param Flavor Cb", "[CallbackSingleReportVoid
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
TEST_CASE("BNO08x Driver Cleanup for [CallbackSingleReportVoidInputParam] Tests", "[CallbackSingleReportVoidInputParam]") TEST_CASE("BNO08x Driver Cleanup for [CallbackSingleReportVoidInputParam] Tests",
"[CallbackSingleReportVoidInputParam]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Cleanup for [CallbackSingleReportVoidInputParam] Tests"; const constexpr char* TEST_TAG =
"BNO08x Driver Cleanup for [CallbackSingleReportVoidInputParam] Tests";
BNO08xTestHelper::print_test_start_banner(TEST_TAG); BNO08xTestHelper::print_test_start_banner(TEST_TAG);
BNO08xTestHelper::print_test_msg(TEST_TAG, "Destroying BNO08x Driver."); BNO08xTestHelper::print_test_msg(TEST_TAG, "Destroying BNO08x Driver.");

View File

@ -3,8 +3,9 @@
* @author Myles Parfeniuk * @author Myles Parfeniuk
* *
* *
* @warning YOU MUST ADD THE FOLLOWING LINE TO YOUR MAIN PROJECTS CMakeLists.txt IN ORDER FOR THIS TEST SUITE TO BE BUILT WITH PROJECT: * @warning YOU MUST ADD THE FOLLOWING LINE TO YOUR MAIN PROJECTS CMakeLists.txt IN ORDER FOR THIS
* set(TEST_COMPONENTS "esp32_BNO08x" CACHE STRING "Components to test.") * TEST SUITE TO BE BUILT WITH PROJECT: set(TEST_COMPONENTS "esp32_BNO08x" CACHE STRING "Components
* to test.")
*/ */
#include "unity.h" #include "unity.h"
@ -41,15 +42,17 @@ TEST_CASE("Hard Reset", "[FeatureTests]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
TEST_ASSERT_EQUAL(true, imu->data_available()); TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->accelerometer.has_new_data()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
@ -59,14 +62,16 @@ TEST_CASE("Hard Reset", "[FeatureTests]")
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
TEST_ASSERT_EQUAL(true, imu->data_available()); TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->accelerometer.has_new_data()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -86,15 +91,17 @@ TEST_CASE("Soft Reset", "[FeatureTests]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
TEST_ASSERT_EQUAL(true, imu->data_available()); TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->accelerometer.has_new_data()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
@ -104,14 +111,16 @@ TEST_CASE("Soft Reset", "[FeatureTests]")
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
TEST_ASSERT_EQUAL(true, imu->data_available()); TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->accelerometer.has_new_data()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -131,15 +140,17 @@ TEST_CASE("Sleep", "[FeatureTests]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
TEST_ASSERT_EQUAL(true, imu->data_available()); TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->accelerometer.has_new_data()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
@ -158,14 +169,16 @@ TEST_CASE("Sleep", "[FeatureTests]")
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
TEST_ASSERT_EQUAL(true, imu->data_available()); TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->accelerometer.has_new_data()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -186,36 +199,43 @@ TEST_CASE("Get Metadata", "[FeatureTests]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
TEST_ASSERT_EQUAL(true, imu->data_available()); TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->accelerometer.has_new_data()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
BNO08xTestHelper::print_test_msg(TEST_TAG, "Getting meta data..."); BNO08xTestHelper::print_test_msg(TEST_TAG, "Getting meta data...");
TEST_ASSERT_EQUAL(true, imu->accelerometer.get_meta_data(meta_data)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.get_meta_data(meta_data));
sprintf(msg_buff, "Re-enabling report with fastest possible period of %ldus from accelerometer meta data.", meta_data.min_period_us); sprintf(msg_buff,
"Re-enabling report with fastest possible period of %ldus from accelerometer meta "
"data.",
meta_data.min_period_us);
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(meta_data.min_period_us)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(meta_data.min_period_us));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
TEST_ASSERT_EQUAL(true, imu->data_available()); TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->accelerometer.has_new_data()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -236,40 +256,204 @@ TEST_CASE("Get Sample Counts", "[FeatureTests]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
TEST_ASSERT_EQUAL(true, imu->data_available()); TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->accelerometer.has_new_data()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
BNO08xTestHelper::print_test_msg(TEST_TAG, "Getting sample counts..."); BNO08xTestHelper::print_test_msg(TEST_TAG, "Getting sample counts...");
TEST_ASSERT_EQUAL(true, imu->accelerometer.get_sample_counts(sample_counts)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.get_sample_counts(sample_counts));
sprintf(msg_buff, "offered: %ld on: %ld accepted: %ld attempted: %ld", sample_counts.offered, sample_counts.on, sample_counts.accepted, sprintf(msg_buff, "offered: %ld on: %ld accepted: %ld attempted: %ld", sample_counts.offered,
sample_counts.attempted); sample_counts.on, sample_counts.accepted, sample_counts.attempted);
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
TEST_ASSERT_EQUAL(true, imu->data_available()); TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->accelerometer.has_new_data()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
TEST_CASE("Enable Dynamic Calibration", "[FeatureTests]")
{
const constexpr char* TEST_TAG = "Enable Dynamic Calibration";
static const constexpr uint8_t ENABLED_REPORT_COUNT = 1;
static const constexpr uint8_t RX_REPORT_TRIAL_CNT = ENABLED_REPORT_COUNT * 5;
static const constexpr uint32_t REPORT_PERIOD = 100000UL; // 100ms
BNO08x* imu = nullptr;
char msg_buff[200] = {};
bno08x_accel_t data_accel;
bno08x_sample_counts_t sample_counts;
BNO08xTestHelper::print_test_start_banner(TEST_TAG);
imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->enable_dynamic_calibration(BNO08xCalSel::all));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{
TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff,
"Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
}
}
TEST_CASE("Save Dynamic Calibration", "[FeatureTests]")
{
const constexpr char* TEST_TAG = "Save Dynamic Calibration";
static const constexpr uint8_t ENABLED_REPORT_COUNT = 1;
static const constexpr uint8_t RX_REPORT_TRIAL_CNT = ENABLED_REPORT_COUNT * 5;
static const constexpr uint32_t REPORT_PERIOD = 100000UL; // 100ms
BNO08x* imu = nullptr;
char msg_buff[200] = {};
bno08x_accel_t data_accel;
bno08x_sample_counts_t sample_counts;
BNO08xTestHelper::print_test_start_banner(TEST_TAG);
imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->save_dynamic_calibration());
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{
TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff,
"Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
}
}
TEST_CASE("Autosave Dynamic Calibration", "[FeatureTests]")
{
const constexpr char* TEST_TAG = "Autosave Dynamic Calibration";
static const constexpr uint8_t ENABLED_REPORT_COUNT = 1;
static const constexpr uint8_t RX_REPORT_TRIAL_CNT = ENABLED_REPORT_COUNT * 200;
static const constexpr uint32_t REPORT_PERIOD = 100000UL; // 100ms
BNO08x* imu = nullptr;
char msg_buff[200] = {};
bno08x_accel_t data_accel;
bno08x_sample_counts_t sample_counts;
BNO08xTestHelper::print_test_start_banner(TEST_TAG);
imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->enable_autosave_dynamic_calibration());
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{
TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff,
"Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
}
TEST_ASSERT_EQUAL(true, imu->disable_autosave_dynamic_calibration());
}
TEST_CASE("Disable Dynamic Calibration", "[FeatureTests]")
{
const constexpr char* TEST_TAG = "Disable Dynamic Calibration";
static const constexpr uint8_t ENABLED_REPORT_COUNT = 1;
static const constexpr uint8_t RX_REPORT_TRIAL_CNT = ENABLED_REPORT_COUNT * 5;
static const constexpr uint32_t REPORT_PERIOD = 100000UL; // 100ms
BNO08x* imu = nullptr;
char msg_buff[200] = {};
bno08x_accel_t data_accel;
bno08x_sample_counts_t sample_counts;
BNO08xTestHelper::print_test_start_banner(TEST_TAG);
imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->disable_dynamic_calibration(BNO08xCalSel::all));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{
TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff,
"Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
}
}
TEST_CASE("Clear Dynamic Calibration", "[FeatureTests]")
{
const constexpr char* TEST_TAG = "Clear Dynamic Calibration";
static const constexpr uint8_t ENABLED_REPORT_COUNT = 1;
static const constexpr uint8_t RX_REPORT_TRIAL_CNT = ENABLED_REPORT_COUNT * 5;
static const constexpr uint32_t REPORT_PERIOD = 100000UL; // 100ms
BNO08x* imu = nullptr;
char msg_buff[200] = {};
bno08x_accel_t data_accel;
bno08x_sample_counts_t sample_counts;
BNO08xTestHelper::print_test_start_banner(TEST_TAG);
imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->clear_dynamic_calibration());
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{
TEST_ASSERT_EQUAL(true, imu->data_available());
TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.has_new_data());
data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff,
"Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
}
TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
}
TEST_CASE("BNO08x Driver Cleanup for [FeatureTests] Tests", "[FeatureTests]") TEST_CASE("BNO08x Driver Cleanup for [FeatureTests] Tests", "[FeatureTests]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Cleanup for [FeatureTests] Tests"; const constexpr char* TEST_TAG = "BNO08x Driver Cleanup for [FeatureTests] Tests";

View File

@ -3,8 +3,9 @@
* @author Myles Parfeniuk * @author Myles Parfeniuk
* *
* *
* @warning YOU MUST ADD THE FOLLOWING LINE TO YOUR MAIN PROJECTS CMakeLists.txt IN ORDER FOR THIS TEST SUITE TO BE BUILT WITH PROJECT: * @warning YOU MUST ADD THE FOLLOWING LINE TO YOUR MAIN PROJECTS CMakeLists.txt IN ORDER FOR THIS
* set(TEST_COMPONENTS "esp32_BNO08x" CACHE STRING "Components to test.") * TEST SUITE TO BE BUILT WITH PROJECT: set(TEST_COMPONENTS "esp32_BNO08x" CACHE STRING "Components
* to test.")
*/ */
#include "unity.h" #include "unity.h"
@ -17,7 +18,8 @@ TEST_CASE("InitComprehensive Config Args", "[InitComprehensive]")
BNO08xTestHelper::print_test_start_banner(TEST_TAG); BNO08xTestHelper::print_test_start_banner(TEST_TAG);
BNO08xTestHelper::print_test_msg(TEST_TAG, "Creating test IMU for [InitComprehensive] and [DeinitComprehensive]."); BNO08xTestHelper::print_test_msg(
TEST_TAG, "Creating test IMU for [InitComprehensive] and [DeinitComprehensive].");
BNO08xTestHelper::create_test_imu(); BNO08xTestHelper::create_test_imu();
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();

View File

@ -3,14 +3,16 @@
* @author Myles Parfeniuk * @author Myles Parfeniuk
* *
* *
* @warning YOU MUST ADD THE FOLLOWING LINE TO YOUR MAIN PROJECTS CMakeLists.txt IN ORDER FOR THIS TEST SUITE TO BE BUILT WITH PROJECT: * @warning YOU MUST ADD THE FOLLOWING LINE TO YOUR MAIN PROJECTS CMakeLists.txt IN ORDER FOR THIS
* set(TEST_COMPONENTS "esp32_BNO08x" CACHE STRING "Components to test.") * TEST SUITE TO BE BUILT WITH PROJECT: set(TEST_COMPONENTS "esp32_BNO08x" CACHE STRING "Components
* to test.")
*/ */
#include "unity.h" #include "unity.h"
#include "../include/BNO08xTestHelper.hpp" #include "../include/BNO08xTestHelper.hpp"
TEST_CASE("BNO08x Driver Creation for [MultiReportEnableDisable] Tests", "[MultiReportEnableDisable]") TEST_CASE(
"BNO08x Driver Creation for [MultiReportEnableDisable] Tests", "[MultiReportEnableDisable]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Creation for [MultiReportEnableDisable] Tests"; const constexpr char* TEST_TAG = "BNO08x Driver Creation for [MultiReportEnableDisable] Tests";
BNO08x* imu = nullptr; BNO08x* imu = nullptr;
@ -45,35 +47,39 @@ TEST_CASE("Enable/Disable Dual Report", "[MultiReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
if (imu->accelerometer.has_new_data()) if (imu->rpt_accelerometer.has_new_data())
{ {
data_available_accel = true; data_available_accel = true;
data = imu->accelerometer.get(); data = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data.x, data.y, data.z, sprintf(msg_buff,
BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data.x, data.y, data.z, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->linear_accelerometer.has_new_data()) if (imu->rpt_linear_accelerometer.has_new_data())
{ {
data_available_lin_accel = true; data_available_lin_accel = true;
data = imu->linear_accelerometer.get(); data = imu->rpt_linear_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: LinAccel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data.x, data.y, data.z, sprintf(msg_buff,
BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: LinAccel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data.x, data.y, data.z, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
} }
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.disable());
TEST_ASSERT_EQUAL(true, data_available_accel); TEST_ASSERT_EQUAL(true, data_available_accel);
TEST_ASSERT_EQUAL(true, data_available_lin_accel); TEST_ASSERT_EQUAL(true, data_available_lin_accel);
@ -103,57 +109,69 @@ TEST_CASE("Enable/Disable Quad Report", "[MultiReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->gravity.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_gravity.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->cal_gyro.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_cal_gyro.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
if (imu->accelerometer.has_new_data()) if (imu->rpt_accelerometer.has_new_data())
{ {
data_available_accel = true; data_available_accel = true;
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->linear_accelerometer.has_new_data()) if (imu->rpt_linear_accelerometer.has_new_data())
{ {
data_available_lin_accel = true; data_available_lin_accel = true;
data_accel = imu->linear_accelerometer.get(); data_accel = imu->rpt_linear_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: LinAccel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, sprintf(msg_buff,
data_accel.y, data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: LinAccel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->gravity.has_new_data()) if (imu->rpt_gravity.has_new_data())
{ {
data_available_gravity = true; data_available_gravity = true;
data_accel = imu->gravity.get(); data_accel = imu->rpt_gravity.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Gravity: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Gravity: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->cal_gyro.has_new_data()) if (imu->rpt_cal_gyro.has_new_data())
{ {
data_available_cal_gyro = true; data_available_cal_gyro = true;
data_vel = imu->cal_gyro.get(); data_vel = imu->rpt_cal_gyro.get();
sprintf(msg_buff, "Rx Data Trial %d Success: CalGyro: [rad/s] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_vel.x, data_vel.y, sprintf(msg_buff,
data_vel.z, BNO08x::accuracy_to_str(data_vel.accuracy)); "Rx Data Trial %d Success: CalGyro: [rad/s] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data_vel.x, data_vel.y, data_vel.z,
BNO08x::accuracy_to_str(data_vel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
} }
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.disable());
TEST_ASSERT_EQUAL(true, imu->gravity.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_gravity.disable());
TEST_ASSERT_EQUAL(true, imu->cal_gyro.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_cal_gyro.disable());
TEST_ASSERT_EQUAL(true, data_available_accel); TEST_ASSERT_EQUAL(true, data_available_accel);
TEST_ASSERT_EQUAL(true, data_available_lin_accel); TEST_ASSERT_EQUAL(true, data_available_lin_accel);
@ -191,101 +209,125 @@ TEST_CASE("Enable/Disable Octo Report", "[MultiReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->gravity.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_gravity.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->cal_gyro.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_cal_gyro.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->cal_magnetometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_cal_magnetometer.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->rv.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->rv_game.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_game.enable(REPORT_PERIOD));
TEST_ASSERT_EQUAL(true, imu->rv_geomagnetic.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_geomagnetic.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
if (imu->accelerometer.has_new_data()) if (imu->rpt_accelerometer.has_new_data())
{ {
data_available_accel = true; data_available_accel = true;
data_accel = imu->accelerometer.get(); data_accel = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->linear_accelerometer.has_new_data()) if (imu->rpt_linear_accelerometer.has_new_data())
{ {
data_available_lin_accel = true; data_available_lin_accel = true;
data_accel = imu->linear_accelerometer.get(); data_accel = imu->rpt_linear_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: LinAccel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, sprintf(msg_buff,
data_accel.y, data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: LinAccel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->gravity.has_new_data()) if (imu->rpt_gravity.has_new_data())
{ {
data_available_gravity = true; data_available_gravity = true;
data_accel = imu->gravity.get(); data_accel = imu->rpt_gravity.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Gravity: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_accel.x, data_accel.y, sprintf(msg_buff,
data_accel.z, BNO08x::accuracy_to_str(data_accel.accuracy)); "Rx Data Trial %d Success: Gravity: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data_accel.x, data_accel.y, data_accel.z,
BNO08x::accuracy_to_str(data_accel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->cal_gyro.has_new_data()) if (imu->rpt_cal_gyro.has_new_data())
{ {
data_available_cal_gyro = true; data_available_cal_gyro = true;
data_vel = imu->cal_gyro.get(); data_vel = imu->rpt_cal_gyro.get();
sprintf(msg_buff, "Rx Data Trial %d Success: CalGyro: [rad/s] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_vel.x, data_vel.y, sprintf(msg_buff,
data_vel.z, BNO08x::accuracy_to_str(data_vel.accuracy)); "Rx Data Trial %d Success: CalGyro: [rad/s] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data_vel.x, data_vel.y, data_vel.z,
BNO08x::accuracy_to_str(data_vel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->cal_magnetometer.has_new_data()) if (imu->rpt_cal_magnetometer.has_new_data())
{ {
data_available_cal_magnetometer = true; data_available_cal_magnetometer = true;
data_magf = imu->cal_magnetometer.get(); data_magf = imu->rpt_cal_magnetometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: CalMagnetometer: [uTesla] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data_magf.x, sprintf(msg_buff,
data_magf.y, data_magf.z, BNO08x::accuracy_to_str(data_magf.accuracy)); "Rx Data Trial %d Success: CalMagnetometer: [uTesla] x: %.2f y: %.2f z: %.2f "
"accuracy: %s ",
(i + 1), data_magf.x, data_magf.y, data_magf.z,
BNO08x::accuracy_to_str(data_magf.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->rv.has_new_data()) if (imu->rpt_rv.has_new_data())
{ {
data_available_rv = true; data_available_rv = true;
data_quat = imu->rv.get_quat(); data_quat = imu->rpt_rv.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), data_quat.real, sprintf(msg_buff,
data_quat.i, data_quat.j, data_quat.k, BNO08x::accuracy_to_str(data_quat.accuracy)); "Rx Data Trial %d Success: RV: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f "
"accuracy: %s ",
(i + 1), data_quat.real, data_quat.i, data_quat.j, data_quat.k,
BNO08x::accuracy_to_str(data_quat.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->rv_game.has_new_data()) if (imu->rpt_rv_game.has_new_data())
{ {
data_available_rv_game = true; data_available_rv_game = true;
data_quat = imu->rv_game.get_quat(); data_quat = imu->rpt_rv_game.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV Game: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), data_quat.real, sprintf(msg_buff,
data_quat.i, data_quat.j, data_quat.k, BNO08x::accuracy_to_str(data_quat.accuracy)); "Rx Data Trial %d Success: RV Game: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f "
"accuracy: %s ",
(i + 1), data_quat.real, data_quat.i, data_quat.j, data_quat.k,
BNO08x::accuracy_to_str(data_quat.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
if (imu->rv_geomagnetic.has_new_data()) if (imu->rpt_rv_geomagnetic.has_new_data())
{ {
data_available_rv_geomagnetic = true; data_available_rv_geomagnetic = true;
data_quat = imu->rv_geomagnetic.get_quat(); data_quat = imu->rpt_rv_geomagnetic.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV Geomagnetic: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data_quat.real, data_quat.i, data_quat.j, data_quat.k, BNO08x::accuracy_to_str(data_quat.accuracy)); "Rx Data Trial %d Success: RV Geomagnetic: [n/a] real: %.2f i: %.2f j: %.2f k: "
"%.2f accuracy: %s ",
(i + 1), data_quat.real, data_quat.i, data_quat.j, data_quat.k,
BNO08x::accuracy_to_str(data_quat.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
} }
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.disable());
TEST_ASSERT_EQUAL(true, imu->gravity.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_gravity.disable());
TEST_ASSERT_EQUAL(true, imu->cal_gyro.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_cal_gyro.disable());
TEST_ASSERT_EQUAL(true, imu->cal_magnetometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_cal_magnetometer.disable());
TEST_ASSERT_EQUAL(true, imu->rv.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv.disable());
TEST_ASSERT_EQUAL(true, imu->rv_game.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_game.disable());
TEST_ASSERT_EQUAL(true, imu->rv_geomagnetic.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_geomagnetic.disable());
TEST_ASSERT_EQUAL(true, data_available_accel); TEST_ASSERT_EQUAL(true, data_available_accel);
TEST_ASSERT_EQUAL(true, data_available_lin_accel); TEST_ASSERT_EQUAL(true, data_available_lin_accel);
@ -299,7 +341,8 @@ TEST_CASE("Enable/Disable Octo Report", "[MultiReportEnableDisable]")
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
TEST_CASE("BNO08x Driver Cleanup for [MultiReportEnableDisable] Tests", "[MultiReportEnableDisable]") TEST_CASE(
"BNO08x Driver Cleanup for [MultiReportEnableDisable] Tests", "[MultiReportEnableDisable]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Cleanup for [MultiReportEnableDisable] Tests"; const constexpr char* TEST_TAG = "BNO08x Driver Cleanup for [MultiReportEnableDisable] Tests";

View File

@ -3,14 +3,16 @@
* @author Myles Parfeniuk * @author Myles Parfeniuk
* *
* *
* @warning YOU MUST ADD THE FOLLOWING LINE TO YOUR MAIN PROJECTS CMakeLists.txt IN ORDER FOR THIS TEST SUITE TO BE BUILT WITH PROJECT: * @warning YOU MUST ADD THE FOLLOWING LINE TO YOUR MAIN PROJECTS CMakeLists.txt IN ORDER FOR THIS
* set(TEST_COMPONENTS "esp32_BNO08x" CACHE STRING "Components to test.") * TEST SUITE TO BE BUILT WITH PROJECT: set(TEST_COMPONENTS "esp32_BNO08x" CACHE STRING "Components
* to test.")
*/ */
#include "unity.h" #include "unity.h"
#include "../include/BNO08xTestHelper.hpp" #include "../include/BNO08xTestHelper.hpp"
TEST_CASE("BNO08x Driver Creation for [SingleReportEnableDisable] Tests", "[SingleReportEnableDisable]") TEST_CASE("BNO08x Driver Creation for [SingleReportEnableDisable] Tests",
"[SingleReportEnableDisable]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Creation for [SingleReportEnableDisable] Tests"; const constexpr char* TEST_TAG = "BNO08x Driver Creation for [SingleReportEnableDisable] Tests";
BNO08x* imu = nullptr; BNO08x* imu = nullptr;
@ -42,25 +44,27 @@ TEST_CASE("Enable Incorrect Report", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
wrong_report_data_available = imu->linear_accelerometer.has_new_data(); wrong_report_data_available = imu->rpt_linear_accelerometer.has_new_data();
TEST_ASSERT_EQUAL(false, wrong_report_data_available); TEST_ASSERT_EQUAL(false, wrong_report_data_available);
data = imu->linear_accelerometer.get(); data = imu->rpt_linear_accelerometer.get();
sprintf(msg_buff, "No Rx Data Trial %d Success: LinAccelDefaults: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data.x, data.y, sprintf(msg_buff,
data.z, BNO08x::accuracy_to_str(data.accuracy)); "No Rx Data Trial %d Success: LinAccelDefaults: [m/s^2] x: %.2f y: %.2f z: %.2f "
"accuracy: %s ",
(i + 1), data.x, data.y, data.z, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -80,25 +84,26 @@ TEST_CASE("Enable/Disable Accelerometer", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->accelerometer.has_new_data(); report_data_available = imu->rpt_accelerometer.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->accelerometer.get(); data = imu->rpt_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data.x, data.y, data.z, sprintf(msg_buff,
BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: Accel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data.x, data.y, data.z, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_accelerometer.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -118,25 +123,27 @@ TEST_CASE("Enable/Disable Linear Accelerometer", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->linear_accelerometer.has_new_data(); report_data_available = imu->rpt_linear_accelerometer.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->linear_accelerometer.get(); data = imu->rpt_linear_accelerometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: LinearAccel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data.x, data.y, data.z, sprintf(msg_buff,
BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: LinearAccel: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: "
"%s ",
(i + 1), data.x, data.y, data.z, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->linear_accelerometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_linear_accelerometer.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -156,25 +163,26 @@ TEST_CASE("Enable/Disable Gravity", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->gravity.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_gravity.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->gravity.has_new_data(); report_data_available = imu->rpt_gravity.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->gravity.get(); data = imu->rpt_gravity.get();
sprintf(msg_buff, "Rx Data Trial %d Success: Gravity: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data.x, data.y, data.z, sprintf(msg_buff,
BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: Gravity: [m/s^2] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data.x, data.y, data.z, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->gravity.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_gravity.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -194,25 +202,27 @@ TEST_CASE("Enable/Disable Cal Magnetometer", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->cal_magnetometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_cal_magnetometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->cal_magnetometer.has_new_data(); report_data_available = imu->rpt_cal_magnetometer.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->cal_magnetometer.get(); data = imu->rpt_cal_magnetometer.get();
sprintf(msg_buff, "Rx Data Trial %d Success: CalMagnetometer: [uTesla] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data.x, data.y, sprintf(msg_buff,
data.z, BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: CalMagnetometer: [uTesla] x: %.2f y: %.2f z: %.2f "
"accuracy: %s ",
(i + 1), data.x, data.y, data.z, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->cal_magnetometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_cal_magnetometer.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -233,26 +243,28 @@ TEST_CASE("Enable/Disable Uncal Magnetometer", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->uncal_magnetometer.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_uncal_magnetometer.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->uncal_magnetometer.has_new_data(); report_data_available = imu->rpt_uncal_magnetometer.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
imu->uncal_magnetometer.get(data_magf, data_bias); imu->rpt_uncal_magnetometer.get(data_magf, data_bias);
sprintf(msg_buff, sprintf(msg_buff,
"Rx Data Trial %d Success: UncalMagnetometer: [uTesla] x: %.2f y: %.2f z: %.2f x_bias: %.2f y_bias: %.2f z_bias: %.2f accuracy: %s ", "Rx Data Trial %d Success: UncalMagnetometer: [uTesla] x: %.2f y: %.2f z: %.2f "
(i + 1), data_magf.x, data_magf.y, data_magf.z, data_bias.x, data_bias.y, data_bias.z, BNO08x::accuracy_to_str(data_magf.accuracy)); "x_bias: %.2f y_bias: %.2f z_bias: %.2f accuracy: %s ",
(i + 1), data_magf.x, data_magf.y, data_magf.z, data_bias.x, data_bias.y,
data_bias.z, BNO08x::accuracy_to_str(data_magf.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->uncal_magnetometer.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_uncal_magnetometer.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -272,25 +284,26 @@ TEST_CASE("Enable/Disable Cal Gyro", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->cal_gyro.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_cal_gyro.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->cal_gyro.has_new_data(); report_data_available = imu->rpt_cal_gyro.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->cal_gyro.get(); data = imu->rpt_cal_gyro.get();
sprintf(msg_buff, "Rx Data Trial %d Success: CalGyro: [rad/s] x: %.2f y: %.2f z: %.2f accuracy: %s ", (i + 1), data.x, data.y, data.z, sprintf(msg_buff,
BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: CalGyro: [rad/s] x: %.2f y: %.2f z: %.2f accuracy: %s ",
(i + 1), data.x, data.y, data.z, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->cal_gyro.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_cal_gyro.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -311,25 +324,28 @@ TEST_CASE("Enable/Disable Uncal Gyro", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->uncal_gyro.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_uncal_gyro.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->uncal_gyro.has_new_data(); report_data_available = imu->rpt_uncal_gyro.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
imu->uncal_gyro.get(data_vel, data_bias); imu->rpt_uncal_gyro.get(data_vel, data_bias);
sprintf(msg_buff, "Rx Data Trial %d Success: UncalGyro: [rad/s] x: %.2f y: %.2f z: %.2f x_bias: %.2f y_bias: %.2f z_bias: %.2f accuracy: %s ", sprintf(msg_buff,
(i + 1), data_vel.x, data_vel.y, data_vel.z, data_bias.x, data_bias.y, data_bias.z, BNO08x::accuracy_to_str(data_vel.accuracy)); "Rx Data Trial %d Success: UncalGyro: [rad/s] x: %.2f y: %.2f z: %.2f x_bias: %.2f "
"y_bias: %.2f z_bias: %.2f accuracy: %s ",
(i + 1), data_vel.x, data_vel.y, data_vel.z, data_bias.x, data_bias.y, data_bias.z,
BNO08x::accuracy_to_str(data_vel.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->uncal_gyro.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_uncal_gyro.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -349,25 +365,27 @@ TEST_CASE("Enable/Disable RV", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->rv.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->rv.has_new_data(); report_data_available = imu->rpt_rv.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->rv.get_quat(); data = imu->rpt_rv.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), data.real, data.i, data.j, sprintf(msg_buff,
data.k, BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: RV: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: "
"%s ",
(i + 1), data.real, data.i, data.j, data.k, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->rv.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -387,25 +405,27 @@ TEST_CASE("Enable/Disable Game RV", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->rv_game.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_game.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->rv_game.has_new_data(); report_data_available = imu->rpt_rv_game.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->rv_game.get_quat(); data = imu->rpt_rv_game.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV Game: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), data.real, data.i, sprintf(msg_buff,
data.j, data.k, BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: RV Game: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f "
"accuracy: %s ",
(i + 1), data.real, data.i, data.j, data.k, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->rv_game.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_game.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -425,25 +445,27 @@ TEST_CASE("Enable/Disable ARVR Stabilized RV", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->rv_ARVR_stabilized.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_ARVR_stabilized.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->rv_ARVR_stabilized.has_new_data(); report_data_available = imu->rpt_rv_ARVR_stabilized.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->rv_ARVR_stabilized.get_quat(); data = imu->rpt_rv_ARVR_stabilized.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV ARVR Stabilized: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), data.real, sprintf(msg_buff,
data.i, data.j, data.k, BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: RV ARVR Stabilized: [n/a] real: %.2f i: %.2f j: %.2f k: "
"%.2f accuracy: %s ",
(i + 1), data.real, data.i, data.j, data.k, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->rv_ARVR_stabilized.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_ARVR_stabilized.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -463,25 +485,27 @@ TEST_CASE("Enable/Disable ARVR Stabilized Game RV", "[SingleReportEnableDisable]
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->rv_ARVR_stabilized_game.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_ARVR_stabilized_game.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->rv_ARVR_stabilized_game.has_new_data(); report_data_available = imu->rpt_rv_ARVR_stabilized_game.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->rv_ARVR_stabilized_game.get_quat(); data = imu->rpt_rv_ARVR_stabilized_game.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV ARVR Stabilized Game: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), sprintf(msg_buff,
data.real, data.i, data.j, data.k, BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: RV ARVR Stabilized Game: [n/a] real: %.2f i: %.2f j: "
"%.2f k: %.2f accuracy: %s ",
(i + 1), data.real, data.i, data.j, data.k, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->rv_ARVR_stabilized_game.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_ARVR_stabilized_game.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -501,25 +525,27 @@ TEST_CASE("Enable/Disable Gyro Integrated RV", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->rv_gyro_integrated.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_gyro_integrated.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->rv_gyro_integrated.has_new_data(); report_data_available = imu->rpt_rv_gyro_integrated.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->rv_gyro_integrated.get_quat(); data = imu->rpt_rv_gyro_integrated.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV Gyro Integrated: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), data.real, sprintf(msg_buff,
data.i, data.j, data.k, BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: RV Gyro Integrated: [n/a] real: %.2f i: %.2f j: %.2f k: "
"%.2f accuracy: %s ",
(i + 1), data.real, data.i, data.j, data.k, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->rv_gyro_integrated.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_gyro_integrated.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
@ -539,30 +565,33 @@ TEST_CASE("Enable/Disable Geomagnetic RV", "[SingleReportEnableDisable]")
imu = BNO08xTestHelper::get_test_imu(); imu = BNO08xTestHelper::get_test_imu();
TEST_ASSERT_EQUAL(true, imu->rv_geomagnetic.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->rpt_rv_geomagnetic.enable(REPORT_PERIOD));
for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++)
{ {
data_available = imu->data_available(); data_available = imu->data_available();
TEST_ASSERT_EQUAL(true, data_available); TEST_ASSERT_EQUAL(true, data_available);
report_data_available = imu->rv_geomagnetic.has_new_data(); report_data_available = imu->rpt_rv_geomagnetic.has_new_data();
TEST_ASSERT_EQUAL(true, report_data_available); TEST_ASSERT_EQUAL(true, report_data_available);
data = imu->rv_geomagnetic.get_quat(); data = imu->rpt_rv_geomagnetic.get_quat();
sprintf(msg_buff, "Rx Data Trial %d Success: RV Geomagnetic: [n/a] real: %.2f i: %.2f j: %.2f k: %.2f accuracy: %s ", (i + 1), data.real, sprintf(msg_buff,
data.i, data.j, data.k, BNO08x::accuracy_to_str(data.accuracy)); "Rx Data Trial %d Success: RV Geomagnetic: [n/a] real: %.2f i: %.2f j: %.2f k: "
"%.2f accuracy: %s ",
(i + 1), data.real, data.i, data.j, data.k, BNO08x::accuracy_to_str(data.accuracy));
BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff);
} }
TEST_ASSERT_EQUAL(true, imu->rv_geomagnetic.disable()); TEST_ASSERT_EQUAL(true, imu->rpt_rv_geomagnetic.disable());
BNO08xTestHelper::print_test_end_banner(TEST_TAG); BNO08xTestHelper::print_test_end_banner(TEST_TAG);
} }
TEST_CASE("BNO08x Driver Cleanup for [SingleReportEnableDisable] Tests", "[SingleReportEnableDisable]") TEST_CASE("BNO08x Driver Cleanup for [SingleReportEnableDisable] Tests",
"[SingleReportEnableDisable]")
{ {
const constexpr char* TEST_TAG = "BNO08x Driver Cleanup for [SingleReportEnableDisable] Tests"; const constexpr char* TEST_TAG = "BNO08x Driver Cleanup for [SingleReportEnableDisable] Tests";