From b8e3e6392c20d650e4fdcc1266ca5a398556cfe3 Mon Sep 17 00:00:00 2001 From: myles-parfeniuk Date: Fri, 6 Jun 2025 20:47:52 -0700 Subject: [PATCH] deconstructor bugfix and delete dcd test Signed-off-by: myles-parfeniuk --- include/BNO08xTestHelper.hpp | 5 +- source/BNO08x.cpp | 2 +- test/FeatureTests.cpp | 102 +++++++++++++++++++++++------------ 3 files changed, 71 insertions(+), 38 deletions(-) diff --git a/include/BNO08xTestHelper.hpp b/include/BNO08xTestHelper.hpp index 1985f43..6ce2004 100644 --- a/include/BNO08xTestHelper.hpp +++ b/include/BNO08xTestHelper.hpp @@ -16,6 +16,7 @@ class BNO08xTestHelper { private: + static inline uint8_t test_imu_buffer[sizeof(BNO08x)]; inline static BNO08x* test_imu = nullptr; inline static bno08x_config_t imu_cfg; @@ -81,7 +82,7 @@ class BNO08xTestHelper if (test_imu != nullptr) destroy_test_imu(); - test_imu = new BNO08x(); + test_imu = new (&test_imu_buffer) BNO08x(); } /** @@ -93,7 +94,7 @@ class BNO08xTestHelper { if (test_imu != nullptr) { - delete test_imu; + test_imu->~BNO08x(); test_imu = nullptr; } } diff --git a/source/BNO08x.cpp b/source/BNO08x.cpp index 7f89131..778b372 100644 --- a/source/BNO08x.cpp +++ b/source/BNO08x.cpp @@ -1016,7 +1016,7 @@ esp_err_t BNO08x::deinit_tasks() xQueueSend(queue_rx_sensor_event, &empty_event, 0); if (init_status.sh2_HAL_service_task) - xEventGroupSetBits(sync_ctx.evt_grp_task, EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT); + xEventGroupSetBits(sync_ctx.evt_grp_task, EVT_GRP_BNO08x_TASK_HINT_ASSRT_BIT | EVT_GRP_BNO08x_TASK_RESET_OCCURRED); for (uint8_t i = 0; i < init_count; i++) if (xSemaphoreTake(sem_kill_tasks, TASK_DELETE_TIMEOUT_MS) == pdTRUE) diff --git a/test/FeatureTests.cpp b/test/FeatureTests.cpp index 438c1a7..0c8278a 100644 --- a/test/FeatureTests.cpp +++ b/test/FeatureTests.cpp @@ -277,31 +277,32 @@ TEST_CASE("Get Sample Counts", "[FeatureTests]") TEST_CASE("Enable Dynamic Calibration", "[FeatureTests]") { const constexpr char* TEST_TAG = "Enable Dynamic Calibration"; + static const constexpr uint32_t REPORT_PERIOD = 10000UL; // 10ms 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; + bno08x_quat_t quat_data; 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->rpt.rv_game.enable(REPORT_PERIOD)); TEST_ASSERT_EQUAL(true, imu->dynamic_calibration_enable(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, BNO08xAccuracy_to_str(data_accel.accuracy)); + TEST_ASSERT_EQUAL(true, imu->rpt.rv_game.has_new_data()); + quat_data = imu->rpt.rv_game.get_quat(); + sprintf(msg_buff, "Rx Data Trial %d Success: quat_data: i: %.3f j: %.3f k: %.3f real: %.3f Accuracy: %s", (i + 1), + quat_data.i, quat_data.j, quat_data.k, quat_data.real, BNO08xAccuracy_to_str(quat_data.accuracy)); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); } + + BNO08xTestHelper::print_test_end_banner(TEST_TAG); } TEST_CASE("Save Dynamic Calibration", "[FeatureTests]") @@ -312,8 +313,7 @@ TEST_CASE("Save Dynamic Calibration", "[FeatureTests]") BNO08x* imu = nullptr; char msg_buff[200] = {}; - bno08x_accel_t data_accel; - bno08x_sample_counts_t sample_counts; + bno08x_quat_t quat_data; BNO08xTestHelper::print_test_start_banner(TEST_TAG); @@ -324,12 +324,14 @@ TEST_CASE("Save Dynamic Calibration", "[FeatureTests]") 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, BNO08xAccuracy_to_str(data_accel.accuracy)); + TEST_ASSERT_EQUAL(true, imu->rpt.rv_game.has_new_data()); + quat_data = imu->rpt.rv_game.get_quat(); + sprintf(msg_buff, "Rx Data Trial %d Success: quat_data: i: %.3f j: %.3f k: %.3f real: %.3f Accuracy: %s", (i + 1), + quat_data.i, quat_data.j, quat_data.k, quat_data.real, BNO08xAccuracy_to_str(quat_data.accuracy)); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); } + + BNO08xTestHelper::print_test_end_banner(TEST_TAG); } TEST_CASE("Autosave Dynamic Calibration", "[FeatureTests]") @@ -340,8 +342,7 @@ TEST_CASE("Autosave Dynamic Calibration", "[FeatureTests]") BNO08x* imu = nullptr; char msg_buff[200] = {}; - bno08x_accel_t data_accel; - bno08x_sample_counts_t sample_counts; + bno08x_quat_t quat_data; BNO08xTestHelper::print_test_start_banner(TEST_TAG); @@ -352,14 +353,15 @@ TEST_CASE("Autosave Dynamic Calibration", "[FeatureTests]") 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, BNO08xAccuracy_to_str(data_accel.accuracy)); + TEST_ASSERT_EQUAL(true, imu->rpt.rv_game.has_new_data()); + quat_data = imu->rpt.rv_game.get_quat(); + sprintf(msg_buff, "Rx Data Trial %d Success: quat_data: i: %.3f j: %.3f k: %.3f real: %.3f Accuracy: %s", (i + 1), + quat_data.i, quat_data.j, quat_data.k, quat_data.real, BNO08xAccuracy_to_str(quat_data.accuracy)); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); } TEST_ASSERT_EQUAL(true, imu->dynamic_calibration_autosave_disable()); + BNO08xTestHelper::print_test_end_banner(TEST_TAG); } TEST_CASE("Disable Dynamic Calibration", "[FeatureTests]") @@ -370,8 +372,7 @@ TEST_CASE("Disable Dynamic Calibration", "[FeatureTests]") BNO08x* imu = nullptr; char msg_buff[200] = {}; - bno08x_accel_t data_accel; - bno08x_sample_counts_t sample_counts; + bno08x_quat_t quat_data; BNO08xTestHelper::print_test_start_banner(TEST_TAG); @@ -382,24 +383,25 @@ TEST_CASE("Disable Dynamic Calibration", "[FeatureTests]") 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, BNO08xAccuracy_to_str(data_accel.accuracy)); + TEST_ASSERT_EQUAL(true, imu->rpt.rv_game.has_new_data()); + quat_data = imu->rpt.rv_game.get_quat(); + sprintf(msg_buff, "Rx Data Trial %d Success: quat_data: i: %.3f j: %.3f k: %.3f real: %.3f Accuracy: %s", (i + 1), + quat_data.i, quat_data.j, quat_data.k, quat_data.real, BNO08xAccuracy_to_str(quat_data.accuracy)); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); } + + BNO08xTestHelper::print_test_end_banner(TEST_TAG); } -TEST_CASE("Clear Dynamic Calibration", "[FeatureTests]") +TEST_CASE("Clear Dynamic Calibration Data Ram", "[FeatureTests]") { - const constexpr char* TEST_TAG = "Clear Dynamic Calibration"; + const constexpr char* TEST_TAG = "Clear Dynamic Calibration Data Ram"; static const constexpr uint8_t ENABLED_REPORT_COUNT = 1; static const constexpr uint8_t RX_REPORT_TRIAL_CNT = ENABLED_REPORT_COUNT * 5; BNO08x* imu = nullptr; char msg_buff[200] = {}; - bno08x_accel_t data_accel; - bno08x_sample_counts_t sample_counts; + bno08x_quat_t quat_data; BNO08xTestHelper::print_test_start_banner(TEST_TAG); @@ -410,14 +412,44 @@ TEST_CASE("Clear Dynamic Calibration", "[FeatureTests]") 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, BNO08xAccuracy_to_str(data_accel.accuracy)); + TEST_ASSERT_EQUAL(true, imu->rpt.rv_game.has_new_data()); + quat_data = imu->rpt.rv_game.get_quat(); + sprintf(msg_buff, "Rx Data Trial %d Success: quat_data: i: %.3f j: %.3f k: %.3f real: %.3f Accuracy: %s", (i + 1), + quat_data.i, quat_data.j, quat_data.k, quat_data.real, BNO08xAccuracy_to_str(quat_data.accuracy)); BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); } - TEST_ASSERT_EQUAL(true, imu->disable_all_reports()); + BNO08xTestHelper::print_test_end_banner(TEST_TAG); +} + +TEST_CASE("Delete Dynamic Calibration Data", "[FeatureTests]") +{ + const constexpr char* TEST_TAG = "Delete Dynamic Calibration Data"; + + BNO08x* imu = nullptr; + static char msg_buff[200] = {0}; + static uint32_t frs_data[16] = {0}; + uint16_t words_rxd = 0U; + bno08x_accel_t data_accel; + + BNO08xTestHelper::print_test_start_banner(TEST_TAG); + + imu = BNO08xTestHelper::get_test_imu(); + + // 1. read the DCD data from FRS before we delete it and ensure it is non-0 (should be set by previous test) + TEST_ASSERT_EQUAL(true, imu->get_frs(BNO08xFrsID::DYNAMIC_CALIBRATION, frs_data, words_rxd)); + sprintf(msg_buff, "DCD before delete: %ld", frs_data[0]); + TEST_ASSERT_EQUAL(true, (frs_data[0] != 0)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); + + // 2. run FlyteSailing's delete DCD fxn and ensure DCD is now 0 + TEST_ASSERT_EQUAL(true, imu->dynamic_calibration_data_delete()); + TEST_ASSERT_EQUAL(true, imu->get_frs(BNO08xFrsID::DYNAMIC_CALIBRATION, frs_data, words_rxd)); + sprintf(msg_buff, "DCD after delete: %ld", frs_data[0]); + TEST_ASSERT_EQUAL(true, (frs_data[0] == 0)); + BNO08xTestHelper::print_test_msg(TEST_TAG, msg_buff); + + BNO08xTestHelper::print_test_end_banner(TEST_TAG); } TEST_CASE("BNO08x Driver Cleanup for [FeatureTests] Tests", "[FeatureTests]")