barcode update
This commit is contained in:
parent
1e34a8259f
commit
19d6512639
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#define LEFT_SENSOR_PIN ( 26 )
|
#define LEFT_SENSOR_PIN ( 26 )
|
||||||
#define RIGHT_SENSOR_PIN ( 27 )
|
#define RIGHT_SENSOR_PIN ( 27 )
|
||||||
|
#define BARCODE_SENSOR_PIN ( 22 )
|
||||||
|
|
||||||
|
|
||||||
/* Map */
|
/* Map */
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include "line_sensor_init.h"
|
#include "line_sensor_init.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Monitor the left sensor
|
* @brief Monitor the left sensor
|
||||||
*
|
*
|
||||||
|
@ -66,7 +67,42 @@ monitor_right_sensor_task(void *params) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Monitor the barcode sensor
|
||||||
|
*
|
||||||
|
* This function will monitor the barcode sensor and send the state to the
|
||||||
|
* barcode sensor message buffer, used to scan the barcode below the car
|
||||||
|
*
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
void monitor_barcode_sensor_task(void *params) {
|
||||||
|
for (;;) {
|
||||||
|
if (xSemaphoreTake(g_barcode_sensor_sem, portMAX_DELAY) == pdTRUE) {
|
||||||
|
// Check the flag or receive the message
|
||||||
|
if (barcode_sensor_triggered == pdTRUE) {
|
||||||
|
uint32_t barcode_data = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 9; i++) {
|
||||||
|
sleep_ms(100); // Wait for a segment of the barcode
|
||||||
|
|
||||||
|
if (gpio_get(BARCODE_SENSOR_PIN)) {
|
||||||
|
barcode_data |= (1u << i);
|
||||||
|
} else {
|
||||||
|
barcode_data &= ~(1u << i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Barcode Data (binary): %09b\n", barcode_data);
|
||||||
|
|
||||||
|
// Send or process the barcode data
|
||||||
|
xMessageBufferSend(barcode_sensor_msg_buffer, &barcode_data, sizeof(uint32_t), 0);
|
||||||
|
|
||||||
|
// Reset the flag
|
||||||
|
barcode_sensor_triggered = pdFALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @brief Monitor the direction and Oritentation of the car
|
* @brief Monitor the direction and Oritentation of the car
|
||||||
*
|
*
|
||||||
|
@ -79,6 +115,7 @@ void
|
||||||
monitor_direction_task(__unused void *params) {
|
monitor_direction_task(__unused void *params) {
|
||||||
state_t left_state;
|
state_t left_state;
|
||||||
state_t right_state;
|
state_t right_state;
|
||||||
|
state_t barcode_state;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
@ -93,6 +130,11 @@ monitor_direction_task(__unused void *params) {
|
||||||
sizeof(state_t),
|
sizeof(state_t),
|
||||||
portMAX_DELAY);
|
portMAX_DELAY);
|
||||||
|
|
||||||
|
xMessageBufferReceive(barcode_sensor_msg_buffer,
|
||||||
|
&barcode_state,
|
||||||
|
sizeof(state_t),
|
||||||
|
portMAX_DELAY);
|
||||||
|
|
||||||
// g_car_state.current_direction = (left_state << 1) | right_state;
|
// g_car_state.current_direction = (left_state << 1) | right_state;
|
||||||
|
|
||||||
// switch (g_car_state.current_direction)
|
// switch (g_car_state.current_direction)
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
static TickType_t lastEdgeTimeLeft = 0;
|
static TickType_t lastEdgeTimeLeft = 0;
|
||||||
static TickType_t lastEdgeTimeRight = 0;
|
static TickType_t lastEdgeTimeRight = 0;
|
||||||
|
static TickType_t lastBarcodeTime = 0;
|
||||||
|
|
||||||
typedef enum { // Unused, useful for readability
|
typedef enum { // Unused, useful for readability
|
||||||
LINE_DETECTED = 0,
|
LINE_DETECTED = 0,
|
||||||
|
@ -53,13 +54,16 @@ typedef struct {
|
||||||
// Semaphore
|
// Semaphore
|
||||||
SemaphoreHandle_t g_left_sensor_sem = NULL;
|
SemaphoreHandle_t g_left_sensor_sem = NULL;
|
||||||
SemaphoreHandle_t g_right_sensor_sem = NULL;
|
SemaphoreHandle_t g_right_sensor_sem = NULL;
|
||||||
|
SemaphoreHandle_t g_barcode_sensor_sem = NULL;
|
||||||
|
|
||||||
// Queue
|
// Queue
|
||||||
static MessageBufferHandle_t left_sensor_msg_buffer; // Left Sensor Buffer
|
static MessageBufferHandle_t left_sensor_msg_buffer; // Left Sensor Buffer
|
||||||
static MessageBufferHandle_t right_sensor_msg_buffer; // Right Sensor Buffer
|
static MessageBufferHandle_t right_sensor_msg_buffer; // Right Sensor Buffer
|
||||||
|
static MessageBufferHandle_t barcode_sensor_msg_buffer; // Barcode Sensor Buffer
|
||||||
|
|
||||||
static volatile BaseType_t right_sensor_triggered = pdFALSE;
|
static volatile BaseType_t right_sensor_triggered = pdFALSE;
|
||||||
static volatile BaseType_t left_sensor_triggered = pdFALSE;
|
static volatile BaseType_t left_sensor_triggered = pdFALSE;
|
||||||
|
static volatile BaseType_t barcode_sensor_triggered = pdFALSE;
|
||||||
|
|
||||||
// Car State Struct
|
// Car State Struct
|
||||||
static car_state_t g_car_state;
|
static car_state_t g_car_state;
|
||||||
|
@ -82,15 +86,17 @@ static inline void
|
||||||
line_sensor_setup() {
|
line_sensor_setup() {
|
||||||
g_left_sensor_sem = xSemaphoreCreateBinary();
|
g_left_sensor_sem = xSemaphoreCreateBinary();
|
||||||
g_right_sensor_sem = xSemaphoreCreateBinary();
|
g_right_sensor_sem = xSemaphoreCreateBinary();
|
||||||
|
g_barcode_sensor_sem = xSemaphoreCreateBinary();
|
||||||
|
|
||||||
uint mask = (1 << LEFT_SENSOR_PIN) | (1 << RIGHT_SENSOR_PIN);
|
uint mask = (1 << LEFT_SENSOR_PIN) | (1 << RIGHT_SENSOR_PIN) | (1 << BARCODE_SENSOR_PIN);
|
||||||
|
|
||||||
// Initialise 2 GPIO pins and set them to input
|
// Initialise 3 GPIO pins and set them to input
|
||||||
gpio_init_mask(mask);
|
gpio_init_mask(mask);
|
||||||
gpio_set_dir_in_masked(mask);
|
gpio_set_dir_in_masked(mask);
|
||||||
|
|
||||||
left_sensor_msg_buffer = xMessageBufferCreate(30);
|
left_sensor_msg_buffer = xMessageBufferCreate(30);
|
||||||
right_sensor_msg_buffer = xMessageBufferCreate(30);
|
right_sensor_msg_buffer = xMessageBufferCreate(30);
|
||||||
|
barcode_sensor_msg_buffer = xMessageBufferCreate(30);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,6 +130,22 @@ bool h_right_sensor_timer_handler(repeating_timer_t *repeatingTimer) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Timer Interrupt Handler for the barcode sensor
|
||||||
|
*
|
||||||
|
* @param repeatingTimer
|
||||||
|
* @return True (To keep the timer running)
|
||||||
|
*/
|
||||||
|
bool h_barcode_sensor_timer_handler(repeating_timer_t *repeatingTimer) {
|
||||||
|
|
||||||
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
xSemaphoreGiveFromISR(g_barcode_sensor_sem,
|
||||||
|
&xHigherPriorityTaskWoken);
|
||||||
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void h_line_sensor_handler(void) {
|
void h_line_sensor_handler(void) {
|
||||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||||
TickType_t currentTicks = xTaskGetTickCount();
|
TickType_t currentTicks = xTaskGetTickCount();
|
||||||
|
@ -166,6 +188,25 @@ void h_line_sensor_handler(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gpio_get_irq_event_mask(BARCODE_SENSOR_PIN) & GPIO_IRQ_EDGE_FALL)
|
||||||
|
{
|
||||||
|
if ((currentTicks - lastBarcodeTime) >=
|
||||||
|
pdMS_TO_TICKS(DEBOUNCE_DELAY_MS))
|
||||||
|
{
|
||||||
|
lastBarcodeTime = currentTicks;
|
||||||
|
gpio_acknowledge_irq(BARCODE_SENSOR_PIN, GPIO_IRQ_EDGE_FALL);
|
||||||
|
// Set the flag to notify the task
|
||||||
|
barcode_sensor_triggered = pdTRUE;
|
||||||
|
xSemaphoreGiveFromISR(g_barcode_sensor_sem,
|
||||||
|
&xHigherPriorityTaskWoken);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Reset the timer to the currentTicks if the edge is ignored
|
||||||
|
lastBarcodeTime = currentTicks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#define READ_LEFT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL)
|
#define READ_LEFT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL)
|
||||||
#define READ_RIGHT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL)
|
#define READ_RIGHT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL)
|
||||||
|
#define READ_RIGHT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL)
|
||||||
|
|
||||||
#define DIRECTION_TASK_PRIORITY (tskIDLE_PRIORITY + 3UL)
|
#define DIRECTION_TASK_PRIORITY (tskIDLE_PRIORITY + 3UL)
|
||||||
|
|
||||||
|
@ -17,6 +18,10 @@ launch()
|
||||||
gpio_set_irq_enabled(RIGHT_SENSOR_PIN, GPIO_IRQ_EDGE_FALL, true);
|
gpio_set_irq_enabled(RIGHT_SENSOR_PIN, GPIO_IRQ_EDGE_FALL, true);
|
||||||
gpio_add_raw_irq_handler(RIGHT_SENSOR_PIN, h_line_sensor_handler);
|
gpio_add_raw_irq_handler(RIGHT_SENSOR_PIN, h_line_sensor_handler);
|
||||||
|
|
||||||
|
// isr to detect barcode line sensor
|
||||||
|
gpio_set_irq_enabled(BARCODE_SENSOR_PIN, GPIO_IRQ_EDGE_FALL, true);
|
||||||
|
gpio_add_raw_irq_handler(BARCODE_SENSOR_PIN, h_line_sensor_handler);
|
||||||
|
|
||||||
irq_set_enabled(IO_IRQ_BANK0, true);
|
irq_set_enabled(IO_IRQ_BANK0, true);
|
||||||
|
|
||||||
// struct repeating_timer g_left_sensor_timer;
|
// struct repeating_timer g_left_sensor_timer;
|
||||||
|
@ -47,6 +52,14 @@ launch()
|
||||||
READ_RIGHT_SENSOR_PRIO,
|
READ_RIGHT_SENSOR_PRIO,
|
||||||
&h_monitor_right_sensor_task);
|
&h_monitor_right_sensor_task);
|
||||||
|
|
||||||
|
TaskHandle_t h_monitor_barcode_sensor_task;
|
||||||
|
xTaskCreate(monitor_barcode_sensor_task,
|
||||||
|
"Monitor Barcode Sensor Task",
|
||||||
|
configMINIMAL_STACK_SIZE,
|
||||||
|
NULL,
|
||||||
|
READ_RIGHT_SENSOR_PRIO,
|
||||||
|
&h_monitor_right_sensor_task);
|
||||||
|
|
||||||
// TaskHandle_t h_monitor_direction_task;
|
// TaskHandle_t h_monitor_direction_task;
|
||||||
// xTaskCreate(monitor_direction_task,
|
// xTaskCreate(monitor_direction_task,
|
||||||
// "Monitor Direction Task",
|
// "Monitor Direction Task",
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#define READ_LEFT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL)
|
#define READ_LEFT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL)
|
||||||
#define READ_RIGHT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL)
|
#define READ_RIGHT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL)
|
||||||
|
#define READ_BARCODE_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL)
|
||||||
|
|
||||||
#define DIRECTION_TASK_PRIORITY (tskIDLE_PRIORITY + 3UL)
|
#define DIRECTION_TASK_PRIORITY (tskIDLE_PRIORITY + 3UL)
|
||||||
|
|
||||||
|
@ -48,6 +49,12 @@ launch()
|
||||||
NULL,
|
NULL,
|
||||||
&g_right_sensor_timer);
|
&g_right_sensor_timer);
|
||||||
|
|
||||||
|
struct repeating_timer g_barcode_sensor_timer;
|
||||||
|
add_repeating_timer_ms(LINE_SENSOR_READ_DELAY,
|
||||||
|
h_barcode_sensor_timer_handler,
|
||||||
|
NULL,
|
||||||
|
&g_barcode_sensor_timer);
|
||||||
|
|
||||||
TaskHandle_t h_monitor_left_sensor_task;
|
TaskHandle_t h_monitor_left_sensor_task;
|
||||||
xTaskCreate(monitor_left_sensor_task,
|
xTaskCreate(monitor_left_sensor_task,
|
||||||
"Monitor Left Sensor Task",
|
"Monitor Left Sensor Task",
|
||||||
|
@ -64,6 +71,14 @@ launch()
|
||||||
READ_RIGHT_SENSOR_PRIO,
|
READ_RIGHT_SENSOR_PRIO,
|
||||||
&h_monitor_right_sensor_task);
|
&h_monitor_right_sensor_task);
|
||||||
|
|
||||||
|
TaskHandle_t h_monitor_barcode_sensor_task;
|
||||||
|
xTaskCreate(monitor_barcode_sensor_task,
|
||||||
|
"Monitor Barcode Sensor Task",
|
||||||
|
configMINIMAL_STACK_SIZE,
|
||||||
|
NULL,
|
||||||
|
READ_BARCODE_SENSOR_PRIO,
|
||||||
|
&h_monitor_barcode_sensor_task);
|
||||||
|
|
||||||
TaskHandle_t h_monitor_direction_task;
|
TaskHandle_t h_monitor_direction_task;
|
||||||
xTaskCreate(monitor_direction_task,
|
xTaskCreate(monitor_direction_task,
|
||||||
"Monitor Direction Task",
|
"Monitor Direction Task",
|
||||||
|
|
Loading…
Reference in New Issue