refactoring, unit test stub
This commit is contained in:
parent
d1dabc4d57
commit
a33a53dea5
|
|
@ -1,3 +1,3 @@
|
||||||
idf_component_register(SRCS BNO08x.cpp
|
idf_component_register(SRC_DIRS "source" "tests"
|
||||||
INCLUDE_DIRS .
|
INCLUDE_DIRS "include" "tests"
|
||||||
REQUIRES driver esp_timer)
|
REQUIRES driver esp_timer)
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
#include <freertos/task.h>
|
#include <freertos/task.h>
|
||||||
#include <freertos/event_groups.h>
|
#include <freertos/event_groups.h>
|
||||||
#include <freertos/queue.h>
|
#include <freertos/queue.h>
|
||||||
|
#include <freertos/semphr.h>
|
||||||
#include <rom/ets_sys.h>
|
#include <rom/ets_sys.h>
|
||||||
|
|
||||||
// standard library includes
|
// standard library includes
|
||||||
|
|
@ -88,7 +89,8 @@ typedef struct bno08x_config_t
|
||||||
class BNO08x
|
class BNO08x
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BNO08x(bno08x_config_t imu_config = default_imu_config);
|
BNO08x(bno08x_config_t imu_config = bno08x_config_t());
|
||||||
|
~BNO08x();
|
||||||
bool initialize();
|
bool initialize();
|
||||||
|
|
||||||
bool hard_reset();
|
bool hard_reset();
|
||||||
|
|
@ -327,8 +329,6 @@ class BNO08x
|
||||||
void print_header(bno08x_rx_packet_t* packet);
|
void print_header(bno08x_rx_packet_t* packet);
|
||||||
void print_packet(bno08x_rx_packet_t* packet);
|
void print_packet(bno08x_rx_packet_t* packet);
|
||||||
|
|
||||||
static bno08x_config_t default_imu_config; ///< default imu config settings
|
|
||||||
|
|
||||||
EventGroupHandle_t
|
EventGroupHandle_t
|
||||||
evt_grp_spi; ///<Event group for indicating when bno08x hint pin has triggered and when new data has been processed. Used by calls to sending or receiving functions.
|
evt_grp_spi; ///<Event group for indicating when bno08x hint pin has triggered and when new data has been processed. Used by calls to sending or receiving functions.
|
||||||
EventGroupHandle_t evt_grp_report_en; ///<Event group for indicating which reports are currently enabled.
|
EventGroupHandle_t evt_grp_report_en; ///<Event group for indicating which reports are currently enabled.
|
||||||
|
|
@ -388,6 +388,9 @@ class BNO08x
|
||||||
static void data_proc_task_trampoline(void* arg);
|
static void data_proc_task_trampoline(void* arg);
|
||||||
void data_proc_task();
|
void data_proc_task();
|
||||||
|
|
||||||
|
bool kill_tasks; ///<indicates to spi_task and data_proc task that deconstructor wants them to self-delete
|
||||||
|
SemaphoreHandle_t sem_kill_tasks;
|
||||||
|
|
||||||
static void IRAM_ATTR hint_handler(void* arg);
|
static void IRAM_ATTR hint_handler(void* arg);
|
||||||
static bool
|
static bool
|
||||||
isr_service_installed; ///<true of the isr service has been installed, only has to be done once regardless of how many devices are used
|
isr_service_installed; ///<true of the isr service has been installed, only has to be done once regardless of how many devices are used
|
||||||
|
|
@ -398,6 +401,8 @@ class BNO08x
|
||||||
static const constexpr uint64_t HOST_INT_TIMEOUT_MS =
|
static const constexpr uint64_t HOST_INT_TIMEOUT_MS =
|
||||||
300ULL; ///<Max wait between HINT being asserted by BNO08x before transaction is considered failed (in miliseconds)
|
300ULL; ///<Max wait between HINT being asserted by BNO08x before transaction is considered failed (in miliseconds)
|
||||||
|
|
||||||
|
static const constexpr uint8_t TASK_CNT = 2;
|
||||||
|
|
||||||
// evt_grp_spi bits
|
// evt_grp_spi bits
|
||||||
static const constexpr EventBits_t EVT_GRP_SPI_RX_DONE_BIT =
|
static const constexpr EventBits_t EVT_GRP_SPI_RX_DONE_BIT =
|
||||||
(1 << 0); ///<When this bit is set it indicates a receive procedure has completed.
|
(1 << 0); ///<When this bit is set it indicates a receive procedure has completed.
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
#include "BNO08x.hpp"
|
#include "BNO08x.hpp"
|
||||||
|
|
||||||
bool BNO08x::isr_service_installed = {false};
|
bool BNO08x::isr_service_installed = {false};
|
||||||
bno08x_config_t BNO08x::default_imu_config;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief BNO08x imu constructor.
|
* @brief BNO08x imu constructor.
|
||||||
|
|
@ -21,6 +20,7 @@ BNO08x::BNO08x(bno08x_config_t imu_config)
|
||||||
, queue_reset_reason(xQueueCreate(1, sizeof(uint32_t)))
|
, queue_reset_reason(xQueueCreate(1, sizeof(uint32_t)))
|
||||||
, imu_config(imu_config)
|
, imu_config(imu_config)
|
||||||
, calibration_status(1)
|
, calibration_status(1)
|
||||||
|
, kill_tasks(false)
|
||||||
|
|
||||||
{
|
{
|
||||||
uint8_t tx_buffer[50] = {0};
|
uint8_t tx_buffer[50] = {0};
|
||||||
|
|
@ -103,6 +103,46 @@ BNO08x::BNO08x(bno08x_config_t imu_config)
|
||||||
spi_device_polling_transmit(spi_hdl, &spi_transaction); // send data packet
|
spi_device_polling_transmit(spi_hdl, &spi_transaction); // send data packet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BNO08x::~BNO08x()
|
||||||
|
{
|
||||||
|
static const constexpr uint8_t TASK_DELETE_TIMEOUT_MS = 10;
|
||||||
|
bno08x_rx_packet_t dummy_packet;
|
||||||
|
uint8_t kill_count = 0;
|
||||||
|
|
||||||
|
//disable interrupts before beginning so we can ensure SPI task doesn't attempt to run
|
||||||
|
gpio_intr_disable(imu_config.io_int);
|
||||||
|
|
||||||
|
//delete tasks
|
||||||
|
kill_tasks = true;
|
||||||
|
xTaskNotifyGive(spi_task_hdl); //notify spi task for self deletion
|
||||||
|
xQueueSend(queue_rx_data, &dummy_packet, 0); //send a dummy packet to wake up data_proc task for self-deletion
|
||||||
|
|
||||||
|
for(uint8_t i = 0; i < TASK_CNT; i++)
|
||||||
|
if(xSemaphoreTake(sem_kill_tasks, TASK_DELETE_TIMEOUT_MS / portTICK_PERIOD_MS) == pdTRUE)
|
||||||
|
kill_count++;
|
||||||
|
|
||||||
|
if(kill_count != TASK_CNT)
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "Task deletion timedout in deconstructor call.");
|
||||||
|
ESP_ERROR_CHECK(ESP_ERR_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
//delete queues
|
||||||
|
vQueueDelete(queue_rx_data);
|
||||||
|
vQueueDelete(queue_tx_data);
|
||||||
|
vQueueDelete(queue_frs_read_data);
|
||||||
|
vQueueDelete(queue_reset_reason);
|
||||||
|
|
||||||
|
//delete event groups
|
||||||
|
vEventGroupDelete(evt_grp_spi);
|
||||||
|
vEventGroupDelete(evt_grp_report_en);
|
||||||
|
|
||||||
|
//clear callback list
|
||||||
|
cb_list.clear();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initializes BNO08x sensor
|
* @brief Initializes BNO08x sensor
|
||||||
*
|
*
|
||||||
|
|
@ -2784,6 +2824,9 @@ void BNO08x::spi_task()
|
||||||
gpio_intr_enable(imu_config.io_int);
|
gpio_intr_enable(imu_config.io_int);
|
||||||
|
|
||||||
ulTaskNotifyTake(pdTRUE, portMAX_DELAY); // block until notified by ISR (hint_handler)
|
ulTaskNotifyTake(pdTRUE, portMAX_DELAY); // block until notified by ISR (hint_handler)
|
||||||
|
|
||||||
|
if(kill_tasks)
|
||||||
|
break;
|
||||||
|
|
||||||
#ifdef CONFIG_ESP32_BNO08x_DEBUG_STATEMENTS
|
#ifdef CONFIG_ESP32_BNO08x_DEBUG_STATEMENTS
|
||||||
current_time = esp_timer_get_time();
|
current_time = esp_timer_get_time();
|
||||||
|
|
@ -2796,6 +2839,9 @@ void BNO08x::spi_task()
|
||||||
else
|
else
|
||||||
receive_packet(); // receive packet
|
receive_packet(); // receive packet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xSemaphoreGive(sem_kill_tasks); //signal to deconstructor deletion is completed
|
||||||
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -2825,6 +2871,9 @@ void BNO08x::data_proc_task()
|
||||||
{
|
{
|
||||||
if (xQueueReceive(queue_rx_data, &packet, portMAX_DELAY)) // receive packet from spi_task()
|
if (xQueueReceive(queue_rx_data, &packet, portMAX_DELAY)) // receive packet from spi_task()
|
||||||
{
|
{
|
||||||
|
if(kill_tasks)
|
||||||
|
break;
|
||||||
|
|
||||||
if (parse_packet(&packet) != 0) // check if packet is valid
|
if (parse_packet(&packet) != 0) // check if packet is valid
|
||||||
{
|
{
|
||||||
// execute any registered callbacks
|
// execute any registered callbacks
|
||||||
|
|
@ -2837,6 +2886,9 @@ void BNO08x::data_proc_task()
|
||||||
xEventGroupSetBits(evt_grp_spi, EVT_GRP_SPI_RX_INVALID_PACKET); // indicated invalid packet to wait_for_data()
|
xEventGroupSetBits(evt_grp_spi, EVT_GRP_SPI_RX_INVALID_PACKET); // indicated invalid packet to wait_for_data()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xSemaphoreGive(sem_kill_tasks); //signal to deconstructor deletion is completed
|
||||||
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
#include "BNO08xTestHelper.hpp"
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "stdio.h"
|
||||||
|
#include "BNO08x.hpp"
|
||||||
|
|
||||||
|
class BNO08xTestHelper
|
||||||
|
{
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
#include "BNO08xTestSuite.hpp"
|
||||||
|
|
||||||
|
void BNO08xTestSuite::run_tests()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "BNO08xTestHelper.hpp"
|
||||||
|
|
||||||
|
class BNO08xTestSuite
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void run_tests();
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue