barcode update
This commit is contained in:
parent
1e34a8259f
commit
19d6512639
|
@ -7,6 +7,7 @@
|
|||
|
||||
#define LEFT_SENSOR_PIN ( 26 )
|
||||
#define RIGHT_SENSOR_PIN ( 27 )
|
||||
#define BARCODE_SENSOR_PIN ( 22 )
|
||||
|
||||
|
||||
/* Map */
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include "line_sensor_init.h"
|
||||
|
||||
|
||||
/**
|
||||
* @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
|
||||
*
|
||||
|
@ -79,6 +115,7 @@ void
|
|||
monitor_direction_task(__unused void *params) {
|
||||
state_t left_state;
|
||||
state_t right_state;
|
||||
state_t barcode_state;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
|
@ -92,6 +129,11 @@ monitor_direction_task(__unused void *params) {
|
|||
&right_state,
|
||||
sizeof(state_t),
|
||||
portMAX_DELAY);
|
||||
|
||||
xMessageBufferReceive(barcode_sensor_msg_buffer,
|
||||
&barcode_state,
|
||||
sizeof(state_t),
|
||||
portMAX_DELAY);
|
||||
|
||||
// g_car_state.current_direction = (left_state << 1) | right_state;
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
static TickType_t lastEdgeTimeLeft = 0;
|
||||
static TickType_t lastEdgeTimeRight = 0;
|
||||
static TickType_t lastBarcodeTime = 0;
|
||||
|
||||
typedef enum { // Unused, useful for readability
|
||||
LINE_DETECTED = 0,
|
||||
|
@ -53,13 +54,16 @@ typedef struct {
|
|||
// Semaphore
|
||||
SemaphoreHandle_t g_left_sensor_sem = NULL;
|
||||
SemaphoreHandle_t g_right_sensor_sem = NULL;
|
||||
SemaphoreHandle_t g_barcode_sensor_sem = NULL;
|
||||
|
||||
// Queue
|
||||
static MessageBufferHandle_t left_sensor_msg_buffer; // Left 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 left_sensor_triggered = pdFALSE;
|
||||
static volatile BaseType_t barcode_sensor_triggered = pdFALSE;
|
||||
|
||||
// Car State Struct
|
||||
static car_state_t g_car_state;
|
||||
|
@ -82,15 +86,17 @@ static inline void
|
|||
line_sensor_setup() {
|
||||
g_left_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_set_dir_in_masked(mask);
|
||||
|
||||
left_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;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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) {
|
||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#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 DIRECTION_TASK_PRIORITY (tskIDLE_PRIORITY + 3UL)
|
||||
|
||||
|
@ -17,6 +18,10 @@ launch()
|
|||
gpio_set_irq_enabled(RIGHT_SENSOR_PIN, GPIO_IRQ_EDGE_FALL, true);
|
||||
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);
|
||||
|
||||
// struct repeating_timer g_left_sensor_timer;
|
||||
|
@ -47,6 +52,14 @@ launch()
|
|||
READ_RIGHT_SENSOR_PRIO,
|
||||
&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;
|
||||
// xTaskCreate(monitor_direction_task,
|
||||
// "Monitor Direction Task",
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#define READ_LEFT_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)
|
||||
|
||||
|
@ -48,6 +49,12 @@ launch()
|
|||
NULL,
|
||||
&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;
|
||||
xTaskCreate(monitor_left_sensor_task,
|
||||
"Monitor Left Sensor Task",
|
||||
|
@ -63,6 +70,14 @@ launch()
|
|||
NULL,
|
||||
READ_RIGHT_SENSOR_PRIO,
|
||||
&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;
|
||||
xTaskCreate(monitor_direction_task,
|
||||
|
|
Loading…
Reference in New Issue