From 19d651263926fbb64cb1a4ba96f1d947805af3d0 Mon Sep 17 00:00:00 2001 From: soapysoltionss <2200754@sit.singaporetech.edu.sg> Date: Sun, 29 Oct 2023 15:46:20 +0800 Subject: [PATCH] barcode update --- frtos/config/line_sensor_config.h | 1 + frtos/line_sensor/line_sensor.h | 42 ++++++++++++++++++++++++++ frtos/line_sensor/line_sensor_init.h | 45 ++++++++++++++++++++++++++-- frtos/line_sensor/line_sensor_test.c | 13 ++++++++ frtos/rtos_car.c | 15 ++++++++++ 5 files changed, 114 insertions(+), 2 deletions(-) diff --git a/frtos/config/line_sensor_config.h b/frtos/config/line_sensor_config.h index f9f7c72..68ec354 100644 --- a/frtos/config/line_sensor_config.h +++ b/frtos/config/line_sensor_config.h @@ -7,6 +7,7 @@ #define LEFT_SENSOR_PIN ( 26 ) #define RIGHT_SENSOR_PIN ( 27 ) +#define BARCODE_SENSOR_PIN ( 22 ) /* Map */ diff --git a/frtos/line_sensor/line_sensor.h b/frtos/line_sensor/line_sensor.h index 23c30e0..11c6429 100644 --- a/frtos/line_sensor/line_sensor.h +++ b/frtos/line_sensor/line_sensor.h @@ -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; diff --git a/frtos/line_sensor/line_sensor_init.h b/frtos/line_sensor/line_sensor_init.h index ecfb4ec..0d45987 100644 --- a/frtos/line_sensor/line_sensor_init.h +++ b/frtos/line_sensor/line_sensor_init.h @@ -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); } diff --git a/frtos/line_sensor/line_sensor_test.c b/frtos/line_sensor/line_sensor_test.c index 44750da..054384a 100644 --- a/frtos/line_sensor/line_sensor_test.c +++ b/frtos/line_sensor/line_sensor_test.c @@ -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", diff --git a/frtos/rtos_car.c b/frtos/rtos_car.c index 8084001..50df6a6 100644 --- a/frtos/rtos_car.c +++ b/frtos/rtos_car.c @@ -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,