From 24c6d7ba03effe061d0088e001c8f17b1975477a Mon Sep 17 00:00:00 2001 From: myles-parfeniuk Date: Sat, 16 Nov 2024 12:21:31 -0800 Subject: [PATCH] more tests --- include/BNO08x.hpp | 12 +- include/BNO08xTestHelper.hpp | 106 ++++++++++++- test/SingleReportTests.cpp | 292 ++++++++++++++++++++++++++++++++--- 3 files changed, 383 insertions(+), 27 deletions(-) diff --git a/include/BNO08x.hpp b/include/BNO08x.hpp index 7c3fd76..efe7002 100644 --- a/include/BNO08x.hpp +++ b/include/BNO08x.hpp @@ -52,11 +52,8 @@ class BNO08x void enable_ARVR_stabilized_rotation_vector(uint32_t time_between_reports); void enable_ARVR_stabilized_game_rotation_vector(uint32_t time_between_reports); void enable_gyro_integrated_rotation_vector(uint32_t time_between_reports); - void enable_uncalibrated_gyro(uint32_t time_between_reports); void enable_calibrated_gyro(uint32_t time_between_reports); - void enable_raw_mems_gyro(uint32_t time_between_reports); - void enable_accelerometer(uint32_t time_between_reports); void enable_linear_accelerometer(uint32_t time_between_reports); void enable_gravity(uint32_t time_between_reports); @@ -65,6 +62,7 @@ class BNO08x void enable_step_counter(uint32_t time_between_reports); void enable_stability_classifier(uint32_t time_between_reports); void enable_activity_classifier(uint32_t time_between_reports, uint32_t activities_to_enable, uint8_t (&activity_confidence_vals)[9]); + void enable_raw_mems_gyro(uint32_t time_between_reports); void enable_raw_mems_accelerometer(uint32_t time_between_reports); void enable_raw_mems_magnetometer(uint32_t time_between_reports); @@ -138,17 +136,17 @@ class BNO08x float get_linear_accel_Z(); BNO08xAccuracy get_linear_accel_accuracy(); - void get_raw_mems_accel(uint16_t &x, uint16_t &y, uint16_t &z); + void get_raw_mems_accel(uint16_t& x, uint16_t& y, uint16_t& z); uint16_t get_raw_mems_accel_X(); uint16_t get_raw_mems_accel_Y(); uint16_t get_raw_mems_accel_Z(); - void get_raw_mems_gyro(uint16_t &x, uint16_t &y, uint16_t &z); + void get_raw_mems_gyro(uint16_t& x, uint16_t& y, uint16_t& z); uint16_t get_raw_mems_gyro_X(); uint16_t get_raw_mems_gyro_Y(); uint16_t get_raw_mems_gyro_Z(); - void get_raw_mems_magf(uint16_t &x, uint16_t &y, uint16_t &z); + void get_raw_mems_magf(uint16_t& x, uint16_t& y, uint16_t& z); uint16_t get_raw_mems_magf_X(); uint16_t get_raw_mems_magf_Y(); uint16_t get_raw_mems_magf_Z(); @@ -390,7 +388,7 @@ class BNO08x uint16_t raw_accel_X, raw_accel_Y, raw_accel_Z, accel_accuracy; ///uncalib_gyro_vel_x != 0.0f) + new_data = true; + + if (report_data->uncalib_gyro_vel_y != 0.0f) + new_data = true; + + if (report_data->uncalib_gyro_vel_z != 0.0f) + new_data = true; + + if (report_data->uncalib_gyro_drift_x != 0.0f) + new_data = true; + + if (report_data->uncalib_gyro_drift_y != 0.0f) + new_data = true; + + if (report_data->uncalib_gyro_drift_z != 0.0f) + new_data = true; + + if (report_data->uncalib_gyro_accuracy != BNO08xAccuracy::UNDEFINED) + new_data = true; + + return new_data; + } + + static bool calibrated_gyro_data_is_default(imu_report_data_t* report_data) + { + bool new_data = false; + + if (report_data->calib_gyro_vel_x != 0.0f) + new_data = true; + + if (report_data->calib_gyro_vel_y != 0.0f) + new_data = true; + + if (report_data->calib_gyro_vel_z != 0.0f) + new_data = true; + + if (report_data->calib_gyro_accuracy != BNO08xAccuracy::UNDEFINED) + new_data = true; + + return new_data; + } + static bool accelerometer_data_is_default(imu_report_data_t* report_data) { bool new_data = false; @@ -242,15 +301,58 @@ class BNO08xTestHelper return new_data; } + static bool magnetometer_data_is_default(imu_report_data_t* report_data) + { + bool new_data = false; + + if (report_data->magf_x != 0.0f) + new_data = true; + + if (report_data->magf_y != 0.0f) + new_data = true; + + if (report_data->magf_z != 0.0f) + new_data = true; + + if (report_data->magf_accuracy != BNO08xAccuracy::UNDEFINED) + new_data = true; + + return new_data; + } + static void update_report_data(imu_report_data_t* report_data, BNO08x* imu) { imu->get_quat(report_data->quat_I, report_data->quat_J, report_data->quat_K, report_data->quat_real, report_data->quat_radian_accuracy, report_data->quat_accuracy); - imu->get_integrated_gyro_velocity(report_data->integrated_gyro_vel_x, report_data->integrated_gyro_vel_y, report_data->integrated_gyro_vel_z); + imu->get_integrated_gyro_velocity( + report_data->integrated_gyro_vel_x, report_data->integrated_gyro_vel_y, report_data->integrated_gyro_vel_z); imu->get_accel(report_data->accel_x, report_data->accel_y, report_data->accel_z, report_data->accel_accuracy); imu->get_linear_accel(report_data->lin_accel_x, report_data->lin_accel_y, report_data->lin_accel_z, report_data->lin_accel_accuracy); imu->get_gravity(report_data->grav_x, report_data->grav_y, report_data->grav_z, report_data->grav_accuracy); - imu->get_calibrated_gyro_velocity(report_data->calib_gyro_vel_x, report_data->calib_gyro_vel_y, report_data->calib_gyro_vel_z, report_data->calib_gyro_accuracy); + imu->get_calibrated_gyro_velocity( + report_data->calib_gyro_vel_x, report_data->calib_gyro_vel_y, report_data->calib_gyro_vel_z, report_data->calib_gyro_accuracy); + imu->get_uncalibrated_gyro_velocity(report_data->uncalib_gyro_vel_x, report_data->uncalib_gyro_vel_y, report_data->uncalib_gyro_vel_z, + report_data->uncalib_gyro_drift_x, report_data->uncalib_gyro_drift_y, report_data->uncalib_gyro_drift_z, + report_data->uncalib_gyro_accuracy); + imu->get_magf(report_data->magf_x, report_data->magf_y, report_data->magf_z, report_data->magf_accuracy); } + + static const char* BNO08xAccuracy_to_str(BNO08xAccuracy accuracy) + { + switch (accuracy) + { + case BNO08xAccuracy::LOW: + return "LOW"; + case BNO08xAccuracy::MED: + return "MED"; + case BNO08xAccuracy::HIGH: + return "HIGH"; + case BNO08xAccuracy::UNDEFINED: + return "UNDEFINED"; + default: + return "UNKNOWN"; // For undefined cases or future-proofing + } + }; + }; \ No newline at end of file diff --git a/test/SingleReportTests.cpp b/test/SingleReportTests.cpp index 40184c1..a4d3c81 100644 --- a/test/SingleReportTests.cpp +++ b/test/SingleReportTests.cpp @@ -43,8 +43,10 @@ TEST_CASE("Enable/Disable Rotation Vector", "[SingleReportEnableDisable]") // assert that new data from respective report has been received TEST_ASSERT_EQUAL(true, new_data); - sprintf(msg_buff, "Enabled Report Rx Data Trial %d Success: I: %.2lf J: %.2lf K: %.2lf real: %.2lf", (i + 1), report_data.quat_I, - report_data.quat_J, report_data.quat_K, report_data.quat_real); + sprintf(msg_buff, "Enabled Report Rx Data Trial %d Success: Quat: I: %.2lf J: %.2lf K: %.2lf real: %.2lf Accuracy: %s", (i + 1), + report_data.quat_I, report_data.quat_J, report_data.quat_K, report_data.quat_real, + BNO08xTestHelper::BNO08xAccuracy_to_str(report_data.quat_accuracy)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); // reset all data used in report test @@ -120,8 +122,10 @@ TEST_CASE("Enable/Disable Game Rotation Vector", "[SingleReportEnableDisable]") // assert that new data from respective report has been received TEST_ASSERT_EQUAL(true, new_data); - sprintf(msg_buff, "Enabled Report Rx Data Trial %d Success: I: %.2lf J: %.2lf K: %.2lf real: %.2lf", (i + 1), report_data.quat_I, - report_data.quat_J, report_data.quat_K, report_data.quat_real); + sprintf(msg_buff, "Enabled Report Rx Data Trial %d Success: Quat: I: %.2lf J: %.2lf K: %.2lf real: %.2lf Accuracy: %s", (i + 1), + report_data.quat_I, report_data.quat_J, report_data.quat_K, report_data.quat_real, + BNO08xTestHelper::BNO08xAccuracy_to_str(report_data.quat_accuracy)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); // reset all data used in report test @@ -197,8 +201,10 @@ TEST_CASE("Enable/Disable ARVR Stabilized Rotation Vector", "[SingleReportEnable // assert that new data from respective report has been received TEST_ASSERT_EQUAL(true, new_data); - sprintf(msg_buff, "Enabled Report Rx Data Trial %d Success: I: %.2lf J: %.2lf K: %.2lf real: %.2lf", (i + 1), report_data.quat_I, - report_data.quat_J, report_data.quat_K, report_data.quat_real); + sprintf(msg_buff, "Enabled Report Rx Data Trial %d Success: Quat: I: %.2lf J: %.2lf K: %.2lf real: %.2lf Accuracy: %s", (i + 1), + report_data.quat_I, report_data.quat_J, report_data.quat_K, report_data.quat_real, + BNO08xTestHelper::BNO08xAccuracy_to_str(report_data.quat_accuracy)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); // reset all data used in report test @@ -275,8 +281,10 @@ TEST_CASE("Enable/Disable ARVR Stabilized Game Rotation Vector", "[SingleReportE // assert that new data from respective report has been received TEST_ASSERT_EQUAL(true, new_data); - sprintf(msg_buff, "Enabled Report Rx Data Trial %d Success: I: %.2lf J: %.2lf K: %.2lf real: %.2lf", (i + 1), report_data.quat_I, - report_data.quat_J, report_data.quat_K, report_data.quat_real); + sprintf(msg_buff, "Enabled Report Rx Data Trial %d Success: Quat: I: %.2lf J: %.2lf K: %.2lf real: %.2lf Accuracy: %s", (i + 1), + report_data.quat_I, report_data.quat_J, report_data.quat_K, report_data.quat_real, + BNO08xTestHelper::BNO08xAccuracy_to_str(report_data.quat_accuracy)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); // reset all data used in report test @@ -353,7 +361,8 @@ TEST_CASE("Enable/Disable Gyro Integrated Roation Vector", "[SingleReportEnableD TEST_ASSERT_EQUAL(true, new_data); sprintf(msg_buff, - "Enabled Report Rx Data Trial %d Success: I: %.2lf J: %.2lf K: %.2lf real: %.2lf gyro vel X: %.2lf gyro vel Y: %.2lf gyro vel Z: " + "Enabled Report Rx Data Trial %d Success: Quat: I: %.2lf J: %.2lf K: %.2lf real: %.2lf gyro vel X: %.2lf gyro vel Y: %.2lf gyro vel " + "Z: " "%.2lf ", (i + 1), report_data.quat_I, report_data.quat_J, report_data.quat_K, report_data.quat_real, report_data.integrated_gyro_vel_x, report_data.integrated_gyro_vel_y, report_data.integrated_gyro_vel_z); @@ -397,6 +406,168 @@ TEST_CASE("Enable/Disable Gyro Integrated Roation Vector", "[SingleReportEnableD BNO08xTestHelper::print_test_end_banner(TEST_TAG); } +TEST_CASE("Enable/Disable Uncalibrated Gyro", "[SingleReportEnableDisable]") +{ + const constexpr char* TEST_TAG = "Enable/Disable Uncalibrated Gyro"; + BNO08x* imu = nullptr; + BNO08xTestHelper::imu_report_data_t report_data; + bool new_data = false; + char msg_buff[200] = {}; + + BNO08xTestHelper::print_test_start_banner(TEST_TAG); + + imu = BNO08xTestHelper::get_test_imu(); + + // reset all data used in report test + imu->reset_all_data(); + BNO08xTestHelper::update_report_data(&report_data, imu); + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report enabled testing phase started."); + /*enable respective report to test and ensure it reports new data */ + imu->enable_uncalibrated_gyro(100000UL); + + for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) + { + new_data = false; + + if (imu->data_available()) + { + BNO08xTestHelper::update_report_data(&report_data, imu); + + // check if any default values have been overwritten, implying new data from respective report + new_data = BNO08xTestHelper::uncalibrated_gyro_data_is_default(&report_data); + } + + // assert that new data from respective report has been received + TEST_ASSERT_EQUAL(true, new_data); + + sprintf(msg_buff, + "Enabled Report Rx Data Trial %d Success: Uncalib Gyro: vX: %.2lf vY: %.2lf vZ: %.2lf driftX: %.2lf driftY: %.2lf driftZ: " + "%.2lf Accuracy: %s", + (i + 1), report_data.uncalib_gyro_vel_x, report_data.uncalib_gyro_vel_y, report_data.uncalib_gyro_vel_z, + report_data.uncalib_gyro_drift_x, report_data.uncalib_gyro_drift_y, report_data.uncalib_gyro_drift_z, + BNO08xTestHelper::BNO08xAccuracy_to_str(report_data.uncalib_gyro_accuracy)); + + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); + + // reset all data used in report test + imu->reset_all_data(); + BNO08xTestHelper::update_report_data(&report_data, imu); + } + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report enabled testing phase completed."); + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report disabled testing phase started."); + /*disable respective report to test and ensure it stops reporting new data */ + imu->disable_uncalibrated_gyro(); + for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) + { + new_data = false; + + if (imu->data_available()) + { + BNO08xTestHelper::update_report_data(&report_data, imu); + + // check if any default values have been overwritten, implying new data from respective report + new_data = BNO08xTestHelper::uncalibrated_gyro_data_is_default(&report_data); + } + + // assert that no new data from respective report has been received + TEST_ASSERT_NOT_EQUAL(true, new_data); + + sprintf(msg_buff, "Disabled Report No Rx Data Trial %d Success", (i + 1)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); + + // reset all data used in report test + imu->reset_all_data(); + BNO08xTestHelper::update_report_data(&report_data, imu); + } + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report disabled testing phase completed."); + + BNO08xTestHelper::print_test_end_banner(TEST_TAG); +} + +TEST_CASE("Enable/Disable Calibrated Gyro", "[SingleReportEnableDisable]") +{ + const constexpr char* TEST_TAG = "Enable/Disable Calibrated Gyro"; + BNO08x* imu = nullptr; + BNO08xTestHelper::imu_report_data_t report_data; + bool new_data = false; + char msg_buff[200] = {}; + + BNO08xTestHelper::print_test_start_banner(TEST_TAG); + + imu = BNO08xTestHelper::get_test_imu(); + + // reset all data used in report test + imu->reset_all_data(); + BNO08xTestHelper::update_report_data(&report_data, imu); + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report enabled testing phase started."); + /*enable respective report to test and ensure it reports new data */ + imu->enable_calibrated_gyro(100000UL); + + for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) + { + new_data = false; + + if (imu->data_available()) + { + BNO08xTestHelper::update_report_data(&report_data, imu); + + // check if any default values have been overwritten, implying new data from respective report + new_data = BNO08xTestHelper::calibrated_gyro_data_is_default(&report_data); + } + + // assert that new data from respective report has been received + TEST_ASSERT_EQUAL(true, new_data); + + sprintf(msg_buff, + "Enabled Report Rx Data Trial %d Success: Calibrated Gyro: vX: %.2lf vY: %.2lf vZ: " + "%.2lf Accuracy: %s", + (i + 1), report_data.calib_gyro_vel_x, report_data.calib_gyro_vel_y, report_data.calib_gyro_vel_z, + BNO08xTestHelper::BNO08xAccuracy_to_str(report_data.calib_gyro_accuracy)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); + + // reset all data used in report test + imu->reset_all_data(); + BNO08xTestHelper::update_report_data(&report_data, imu); + } + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report enabled testing phase completed."); + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report disabled testing phase started."); + /*disable respective report to test and ensure it stops reporting new data */ + imu->disable_calibrated_gyro(); + for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) + { + new_data = false; + + if (imu->data_available()) + { + BNO08xTestHelper::update_report_data(&report_data, imu); + + // check if any default values have been overwritten, implying new data from respective report + new_data = BNO08xTestHelper::calibrated_gyro_data_is_default(&report_data); + } + + // assert that no new data from respective report has been received + TEST_ASSERT_NOT_EQUAL(true, new_data); + + sprintf(msg_buff, "Disabled Report No Rx Data Trial %d Success", (i + 1)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); + + // reset all data used in report test + imu->reset_all_data(); + BNO08xTestHelper::update_report_data(&report_data, imu); + } + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report disabled testing phase completed."); + + BNO08xTestHelper::print_test_end_banner(TEST_TAG); +} + TEST_CASE("Enable/Disable Accelerometer", "[SingleReportEnableDisable]") { const constexpr char* TEST_TAG = "Enable/Disable Accelerometer"; @@ -433,9 +604,11 @@ TEST_CASE("Enable/Disable Accelerometer", "[SingleReportEnableDisable]") TEST_ASSERT_EQUAL(true, new_data); sprintf(msg_buff, - "Enabled Report Rx Data Trial %d Success: accel X: %.2lf accel Y: %.2lf accel Z: " - "%.2lf ", - (i + 1), report_data.accel_x, report_data.accel_y, report_data.accel_z); + "Enabled Report Rx Data Trial %d Success: AngularAccel: aX: %.2lf accel aY: %.2lf accel aZ: " + "%.2lf Accuracy %s", + (i + 1), report_data.accel_x, report_data.accel_y, report_data.accel_z, + BNO08xTestHelper::BNO08xAccuracy_to_str(report_data.accel_accuracy)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); // reset all data used in report test @@ -512,9 +685,11 @@ TEST_CASE("Enable/Disable Linear Accelerometer", "[SingleReportEnableDisable]") TEST_ASSERT_EQUAL(true, new_data); sprintf(msg_buff, - "Enabled Report Rx Data Trial %d Success: lin accel X: %.2lf lin accel Y: %.2lf lin accel Z: " - "%.2lf ", - (i + 1), report_data.lin_accel_x, report_data.lin_accel_y, report_data.lin_accel_z); + "Enabled Report Rx Data Trial %d Success: LinearAccel: laX: %.2lf laY: %.2lf laZ: " + "%.2lf Accuracy: %s", + (i + 1), report_data.lin_accel_x, report_data.lin_accel_y, report_data.lin_accel_z, + BNO08xTestHelper::BNO08xAccuracy_to_str(report_data.lin_accel_accuracy)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); // reset all data used in report test @@ -591,9 +766,11 @@ TEST_CASE("Enable/Disable Gravity", "[SingleReportEnableDisable]") TEST_ASSERT_EQUAL(true, new_data); sprintf(msg_buff, - "Enabled Report Rx Data Trial %d Success: grav X: %.2lf grav Y: %.2lf grav Z: " - "%.2lf ", - (i + 1), report_data.grav_x, report_data.grav_y, report_data.grav_z); + "Enabled Report Rx Data Trial %d Success: Gravity: gX: %.2lf gY: %.2lf gZ: " + "%.2lf Accuracy: %s", + (i + 1), report_data.grav_x, report_data.grav_y, report_data.grav_z, + BNO08xTestHelper::BNO08xAccuracy_to_str(report_data.grav_accuracy)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); // reset all data used in report test @@ -634,4 +811,83 @@ TEST_CASE("Enable/Disable Gravity", "[SingleReportEnableDisable]") BNO08xTestHelper::print_test_end_banner(TEST_TAG); } +TEST_CASE("Enable/Disable Magnetometer", "[SingleReportEnableDisable]") +{ + const constexpr char* TEST_TAG = "Enable/Disable Magnetometer"; + BNO08x* imu = nullptr; + BNO08xTestHelper::imu_report_data_t report_data; + bool new_data = false; + char msg_buff[200] = {}; + BNO08xTestHelper::print_test_start_banner(TEST_TAG); + + imu = BNO08xTestHelper::get_test_imu(); + + // reset all data used in report test + imu->reset_all_data(); + BNO08xTestHelper::update_report_data(&report_data, imu); + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report enabled testing phase started."); + /*enable respective report to test and ensure it reports new data */ + imu->enable_magnetometer(100000UL); + + for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) + { + new_data = false; + + if (imu->data_available()) + { + BNO08xTestHelper::update_report_data(&report_data, imu); + + // check if any default values have been overwritten, implying new data from respective report + new_data = BNO08xTestHelper::magnetometer_data_is_default(&report_data); + } + + // assert that new data from respective report has been received + TEST_ASSERT_EQUAL(true, new_data); + + sprintf(msg_buff, + "Enabled Report Rx Data Trial %d Success: Magf: mX: %.2lf mY: %.2lf mZ: " + "%.2lf Accuracy: %s", + (i + 1), report_data.magf_x, report_data.magf_y, report_data.magf_z, + BNO08xTestHelper::BNO08xAccuracy_to_str(report_data.magf_accuracy)); + + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); + + // reset all data used in report test + imu->reset_all_data(); + BNO08xTestHelper::update_report_data(&report_data, imu); + } + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report enabled testing phase completed."); + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report disabled testing phase started."); + /*disable respective report to test and ensure it stops reporting new data */ + imu->disable_magnetometer(); + for (int i = 0; i < RX_REPORT_TRIAL_CNT; i++) + { + new_data = false; + + if (imu->data_available()) + { + BNO08xTestHelper::update_report_data(&report_data, imu); + + // check if any default values have been overwritten, implying new data from respective report + new_data = BNO08xTestHelper::magnetometer_data_is_default(&report_data); + } + + // assert that no new data from respective report has been received + TEST_ASSERT_NOT_EQUAL(true, new_data); + + sprintf(msg_buff, "Disabled Report No Rx Data Trial %d Success", (i + 1)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); + + // reset all data used in report test + imu->reset_all_data(); + BNO08xTestHelper::update_report_data(&report_data, imu); + } + + BNO08xTestHelper::print_test_msg(TEST_TAG, "Report disabled testing phase completed."); + + BNO08xTestHelper::print_test_end_banner(TEST_TAG); +} \ No newline at end of file