From 1aab873c2b6a09e00f0dff69ae39b43a4d8f811d Mon Sep 17 00:00:00 2001 From: Devoalda Date: Sat, 21 Oct 2023 14:20:21 +0800 Subject: [PATCH] feature(Line Sensor + Car Common): Restructured Line Sensor files Added test for Line Sensor Added Car Dir for common functionalities --- frtos/CMakeLists.txt | 1 + frtos/car/CMakeLists.txt | 15 ++ frtos/car/car.h | 20 +++ frtos/car/car_init.h | 44 +++++ frtos/config/line_sensor_config.h | 16 ++ frtos/line_sensor/CMakeLists.txt | 18 +- frtos/line_sensor/Config.h | 19 --- frtos/line_sensor/FreeRTOSConfig.h | 143 ---------------- frtos/line_sensor/line_sensor.h | 156 +----------------- frtos/line_sensor/line_sensor_init.h | 118 +++++++++++++ frtos/line_sensor/line_sensor_test.c | 65 ++++++++ .../{line_sensor.c => line_sensor_unused.c} | 0 frtos/line_sensor/lwipopts.h | 25 --- frtos/rtos_car.c | 54 +++++- 14 files changed, 347 insertions(+), 347 deletions(-) create mode 100644 frtos/car/CMakeLists.txt create mode 100644 frtos/car/car.h create mode 100644 frtos/car/car_init.h create mode 100644 frtos/config/line_sensor_config.h delete mode 100644 frtos/line_sensor/Config.h delete mode 100644 frtos/line_sensor/FreeRTOSConfig.h create mode 100644 frtos/line_sensor/line_sensor_init.h create mode 100644 frtos/line_sensor/line_sensor_test.c rename frtos/line_sensor/{line_sensor.c => line_sensor_unused.c} (100%) delete mode 100644 frtos/line_sensor/lwipopts.h diff --git a/frtos/CMakeLists.txt b/frtos/CMakeLists.txt index e9403ef..2cd8e5e 100644 --- a/frtos/CMakeLists.txt +++ b/frtos/CMakeLists.txt @@ -2,6 +2,7 @@ include(FreeRTOS_Kernel_import.cmake) add_subdirectory(motor) add_subdirectory(line_sensor) +add_subdirectory(car) add_executable(rtos_car rtos_car.c) diff --git a/frtos/car/CMakeLists.txt b/frtos/car/CMakeLists.txt new file mode 100644 index 0000000..baae2e3 --- /dev/null +++ b/frtos/car/CMakeLists.txt @@ -0,0 +1,15 @@ +add_library( + car + car.h +) + +target_link_libraries( + car + hardware_adc + pico_stdlib + FreeRTOS-Kernel-Heap4 # FreeRTOS kernel and dynamic heap +) + +target_include_directories(car + PRIVATE ../config +) \ No newline at end of file diff --git a/frtos/car/car.h b/frtos/car/car.h new file mode 100644 index 0000000..b0340cf --- /dev/null +++ b/frtos/car/car.h @@ -0,0 +1,20 @@ +/** + * @brief Common Car Functionalities for the RTOS Car + */ + +#ifndef CAR_H +#define CAR_H + +#include "car_init.h" + +static car_state_t initialize_car_state() { + g_car_state.x = MAP_SIZE >> 1; + g_car_state.y = MAP_SIZE >> 1; + g_car_state.current_direction = FORWARD; + g_car_state.orientation = NORTH; + + return g_car_state; +} + + +#endif /* CAR_H */ \ No newline at end of file diff --git a/frtos/car/car_init.h b/frtos/car/car_init.h new file mode 100644 index 0000000..11cab94 --- /dev/null +++ b/frtos/car/car_init.h @@ -0,0 +1,44 @@ +/** + * @brief Car Init + */ + +#ifndef CAR_INIT_H +#define CAR_INIT_H + +#include + +#include "pico/stdlib.h" + +#include "FreeRTOS.h" +#include "task.h" + +#include "line_sensor_config.h" + +typedef enum { + ERROR = 0, + RIGHT = 1, + LEFT = 2, + FORWARD = 3 +} direction_t; + +typedef enum { + NORTH = 0, + EAST = 1, + SOUTH = 2, + WEST = 3, +} orientation_t; + +typedef struct { + u_int8_t x; // Current x coordinate + u_int8_t y; // Current y coordinate + direction_t current_direction; // Current direction (forward, left, right) + orientation_t orientation; // Current orientation (N, E, S, W) +} car_state_t; + +/* Common Car State Structure (TODO: TBC)*/ + +static car_state_t g_car_state; + + + +#endif /* CAR_INIT_H */ \ No newline at end of file diff --git a/frtos/config/line_sensor_config.h b/frtos/config/line_sensor_config.h new file mode 100644 index 0000000..f9f7c72 --- /dev/null +++ b/frtos/config/line_sensor_config.h @@ -0,0 +1,16 @@ +#ifndef CONFIG_H +#define CONFIG_H + +/* ADC Configuration */ + +#define LINE_SENSOR_READ_DELAY ( 100 ) + +#define LEFT_SENSOR_PIN ( 26 ) +#define RIGHT_SENSOR_PIN ( 27 ) + + +/* Map */ +#define MAP_START_SYMBOL ( 5 ) +#define MAP_SIZE 20 + +#endif //CONFIG_H diff --git a/frtos/line_sensor/CMakeLists.txt b/frtos/line_sensor/CMakeLists.txt index dcd82c9..05b63ca 100644 --- a/frtos/line_sensor/CMakeLists.txt +++ b/frtos/line_sensor/CMakeLists.txt @@ -1,14 +1,18 @@ -add_library(line_sensor - line_sensor.c - line_sensor.h - Config.h +add_executable( + line_sensor_test + line_sensor_test.c ) -target_link_libraries(line_sensor +target_link_libraries( + line_sensor_test hardware_adc pico_stdlib FreeRTOS-Kernel-Heap4 # FreeRTOS kernel and dynamic heap ) -target_include_directories(line_sensor - PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") \ No newline at end of file +target_include_directories(line_sensor_test + PRIVATE ../config +) + +pico_enable_stdio_usb(line_sensor_test 1) +pico_add_extra_outputs(line_sensor_test) \ No newline at end of file diff --git a/frtos/line_sensor/Config.h b/frtos/line_sensor/Config.h deleted file mode 100644 index 5eac01c..0000000 --- a/frtos/line_sensor/Config.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef CONFIG_H -#define CONFIG_H - -/* ADC Configuration */ -#define VREF ( 3.3f ) - -#define ADC_READING_DELAY_MS ( 300 ) - -#define LEFT_SENSOR_PIN ( 26 ) -#define RIGHT_SENSOR_PIN ( 27 ) // Comment this line out -// if you only have one - -#define THRESHOLD ( VREF / 2 ) // 50% of VREF - -/* Map */ -#define MAP_START_SYMBOL ( 5 ) -#define MAP_SIZE 20 - -#endif //CONFIG_H diff --git a/frtos/line_sensor/FreeRTOSConfig.h b/frtos/line_sensor/FreeRTOSConfig.h deleted file mode 100644 index f715e60..0000000 --- a/frtos/line_sensor/FreeRTOSConfig.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * FreeRTOS V202111.00 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef FREERTOS_CONFIG_H -#define FREERTOS_CONFIG_H - -/*----------------------------------------------------------- - * Application specific definitions. - * - * These definitions should be adjusted for your particular hardware and - * application requirements. - * - * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE - * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. - * - * See http://www.freertos.org/a00110.html - *----------------------------------------------------------*/ - -/* Scheduler Related */ -#define configUSE_PREEMPTION 1 -#define configUSE_TICKLESS_IDLE 0 -#define configUSE_IDLE_HOOK 0 -#define configUSE_TICK_HOOK 0 -#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) -#define configMAX_PRIORITIES 32 -#define configMINIMAL_STACK_SIZE ( configSTACK_DEPTH_TYPE ) 256 -#define configUSE_16_BIT_TICKS 0 - -#define configIDLE_SHOULD_YIELD 1 - -/* Synchronization Related */ -#define configUSE_MUTEXES 1 -#define configUSE_RECURSIVE_MUTEXES 1 -#define configUSE_APPLICATION_TASK_TAG 0 -#define configUSE_COUNTING_SEMAPHORES 1 -#define configQUEUE_REGISTRY_SIZE 8 -#define configUSE_QUEUE_SETS 1 -#define configUSE_TIME_SLICING 1 -#define configUSE_NEWLIB_REENTRANT 0 -// todo need this for lwip FreeRTOS sys_arch to compile -#define configENABLE_BACKWARD_COMPATIBILITY 1 -#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5 - -/* System */ -#define configSTACK_DEPTH_TYPE uint32_t -#define configMESSAGE_BUFFER_LENGTH_TYPE size_t - -/* Memory allocation related definitions. */ -#define configSUPPORT_STATIC_ALLOCATION 0 -#define configSUPPORT_DYNAMIC_ALLOCATION 1 -#define configTOTAL_HEAP_SIZE (128*1024) -#define configAPPLICATION_ALLOCATED_HEAP 0 - -/* Hook function related definitions. */ -#define configCHECK_FOR_STACK_OVERFLOW 0 -#define configUSE_MALLOC_FAILED_HOOK 0 -#define configUSE_DAEMON_TASK_STARTUP_HOOK 0 - -/* Run time and task stats gathering related definitions. */ -#define configGENERATE_RUN_TIME_STATS 0 -#define configUSE_TRACE_FACILITY 1 -#define configUSE_STATS_FORMATTING_FUNCTIONS 0 - -/* Co-routine related definitions. */ -#define configUSE_CO_ROUTINES 0 -#define configMAX_CO_ROUTINE_PRIORITIES 1 - -/* Software timer related definitions. */ -#define configUSE_TIMERS 1 -#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) -#define configTIMER_QUEUE_LENGTH 10 -#define configTIMER_TASK_STACK_DEPTH 1024 - -/* Interrupt nesting behaviour configuration. */ -/* -#define configKERNEL_INTERRUPT_PRIORITY [dependent of processor] -#define configMAX_SYSCALL_INTERRUPT_PRIORITY [dependent on processor and application] -#define configMAX_API_CALL_INTERRUPT_PRIORITY [dependent on processor and application] -*/ - -#if FREE_RTOS_KERNEL_SMP // set by the RP2040 SMP port of FreeRTOS -/* SMP port only */ -#define configNUM_CORES 1 -#define configTICK_CORE 0 -#define configRUN_MULTIPLE_PRIORITIES 1 -#define configUSE_CORE_AFFINITY 0 -#endif - -/* RP2040 specific */ -#define configSUPPORT_PICO_SYNC_INTEROP 1 -#define configSUPPORT_PICO_TIME_INTEROP 1 - -#include -/* Define to trap errors during development. */ -#define configASSERT(x) assert(x) - -/* Set the following definitions to 1 to include the API function, or zero -to exclude the API function. */ -#define INCLUDE_vTaskPrioritySet 1 -#define INCLUDE_uxTaskPriorityGet 1 -#define INCLUDE_vTaskDelete 1 -#define INCLUDE_vTaskSuspend 1 -#define INCLUDE_vTaskDelayUntil 1 -#define INCLUDE_vTaskDelay 1 -#define INCLUDE_xTaskGetSchedulerState 1 -#define INCLUDE_xTaskGetCurrentTaskHandle 1 -#define INCLUDE_uxTaskGetStackHighWaterMark 1 -#define INCLUDE_xTaskGetIdleTaskHandle 1 -#define INCLUDE_eTaskGetState 1 -#define INCLUDE_xTimerPendFunctionCall 1 -#define INCLUDE_xTaskAbortDelay 1 -#define INCLUDE_xTaskGetHandle 1 -#define INCLUDE_xTaskResumeFromISR 1 -#define INCLUDE_xQueueGetMutexHolder 1 - -/* A header file that defines trace macro can be included here. */ - -#endif /* FREERTOS_CONFIG_H */ - diff --git a/frtos/line_sensor/line_sensor.h b/frtos/line_sensor/line_sensor.h index 14bf3fb..bfdb9e8 100644 --- a/frtos/line_sensor/line_sensor.h +++ b/frtos/line_sensor/line_sensor.h @@ -1,83 +1,10 @@ -#include -#include "pico/stdlib.h" - -#include "hardware/adc.h" - -#include "FreeRTOS.h" -#include "task.h" -#include "message_buffer.h" -#include "semphr.h" - -#include "Config.h" - -typedef enum { // Unused, useful for readability - LINE_DETECTED = 0, - LINE_NOT_DETECTED = 1, -} state_t; - -typedef enum { - ERROR = 0, - RIGHT = 1, - LEFT = 2, - FORWARD = 3 -} direction_t; - -typedef enum { - NORTH = 0, - EAST = 1, - SOUTH = 2, - WEST = 3, -} orientation_t; - -typedef struct { - u_int8_t x; // Current x coordinate - u_int8_t y; // Current y coordinate - direction_t current_direction; // Current direction (forward, left, right) - orientation_t orientation; // Current orientation (N, E, S, W) -} car_state_t; - -// Semaphore -SemaphoreHandle_t g_left_sensor_sem = NULL; -SemaphoreHandle_t g_right_sensor_sem = NULL; - -// Queue -static MessageBufferHandle_t left_sensor_msg_buffer; // Left Sensor Buffer -static MessageBufferHandle_t right_sensor_msg_buffer; // Right Sensor Buffer - -// Car State Struct -static car_state_t g_car_state; - -static car_state_t initialize_car_state() { - g_car_state.x = MAP_SIZE >> 1; - g_car_state.y = MAP_SIZE >> 1; - g_car_state.current_direction = FORWARD; - g_car_state.orientation = NORTH; - - return g_car_state; -} - /** - * @brief Setup the Line Sensor - * - * This function will setup the Line Sensor by initializing it as an input + * @file line_sensor.h + * @brief Monitor the line sensor and update the car state accordingly + * @author Woon Jun Wei */ -static inline void -line_sensor_setup() { - g_left_sensor_sem = xSemaphoreCreateBinary(); - g_right_sensor_sem = xSemaphoreCreateBinary(); - - // Setup GPIO Interrupts - uint mask = (1 << LEFT_SENSOR_PIN) | (1 << RIGHT_SENSOR_PIN); - - // Initialise 2 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); - -} +#include "line_sensor_init.h" /** * @brief Monitor the left sensor @@ -207,77 +134,4 @@ monitor_direction_task(__unused void *params) { break; } } -} - -/** - * @brief Timer Interrupt Handler for the left sensor - * @param rt - * @return True (To keep the timer running) - */ -bool h_left_sensor_timer_handler(repeating_timer_t *repeatingTimer) { - - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - xSemaphoreGiveFromISR(g_left_sensor_sem, - &xHigherPriorityTaskWoken); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - return true; -} - -/** - * @brief Timer Interrupt Handler for the right sensor - * - * @param repeatingTimer - * @return True (To keep the timer running) - */ -bool h_right_sensor_timer_handler(repeating_timer_t *repeatingTimer) { - - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - xSemaphoreGiveFromISR(g_right_sensor_sem, - &xHigherPriorityTaskWoken); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - - return true; -} - -/** -* Main Launch body - * This is to be in the main launch function for FreeRTOS - * - * // Repeating timer - * struct repeating_timer g_left_sensor_timer; - * add_repeating_timer_ms(100, - * h_left_sensor_timer_handler, - * NULL, - * &g_left_sensor_timer); - - * struct repeating_timer g_right_sensor_timer; - * add_repeating_timer_ms(100, - * h_right_sensor_timer_handler, - * NULL, - * &g_right_sensor_timer); - - - * TaskHandle_t h_monitor_left_sensor_task; - * xTaskCreate(monitor_left_sensor_task, - * "Monitor Left Sensor Task", - * configMINIMAL_STACK_SIZE, - * NULL, - * LEFT_TASK_PRIORITY, - * &h_monitor_left_sensor_task); - - * TaskHandle_t h_monitor_right_sensor_task; - * xTaskCreate(monitor_right_sensor_task, - * "Monitor Right Sensor Task", - * configMINIMAL_STACK_SIZE, - * NULL, - * RIGHT_TASK_PRIORITY, - * &h_monitor_right_sensor_task); - - * TaskHandle_t h_monitor_direction_task; - * xTaskCreate(monitor_direction_task, - * "Monitor Direction Task", - * configMINIMAL_STACK_SIZE, - * NULL, - * DIRECTION_TASK_PRIORITY, - * &h_monitor_direction_task); -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/frtos/line_sensor/line_sensor_init.h b/frtos/line_sensor/line_sensor_init.h new file mode 100644 index 0000000..775ba9d --- /dev/null +++ b/frtos/line_sensor/line_sensor_init.h @@ -0,0 +1,118 @@ +/** + * @file line_sensor_init.h + * @brief Initialise the line sensor + * @author Woon Jun Wei + */ + +#ifndef LINE_SENSOR_INIT_H +#define LINE_SENSOR_INIT_H + +#include +#include "pico/stdlib.h" + +#include "hardware/adc.h" + +#include "FreeRTOS.h" +#include "task.h" +#include "message_buffer.h" +#include "semphr.h" + +#include "line_sensor_config.h" + +typedef enum { // Unused, useful for readability + LINE_DETECTED = 0, + LINE_NOT_DETECTED = 1, +} state_t; + +typedef enum { + ERROR = 0, + RIGHT = 1, + LEFT = 2, + FORWARD = 3 +} direction_t; + +typedef enum { + NORTH = 0, + EAST = 1, + SOUTH = 2, + WEST = 3, +} orientation_t; + +typedef struct { + u_int8_t x; // Current x coordinate + u_int8_t y; // Current y coordinate + direction_t current_direction; // Current direction (forward, left, right) + orientation_t orientation; // Current orientation (N, E, S, W) +} car_state_t; + +// Semaphore +SemaphoreHandle_t g_left_sensor_sem = NULL; +SemaphoreHandle_t g_right_sensor_sem = NULL; + +// Queue +static MessageBufferHandle_t left_sensor_msg_buffer; // Left Sensor Buffer +static MessageBufferHandle_t right_sensor_msg_buffer; // Right Sensor Buffer + +// Car State Struct +static car_state_t g_car_state; + +static car_state_t initialize_car_state() { + g_car_state.x = MAP_SIZE >> 1; + g_car_state.y = MAP_SIZE >> 1; + g_car_state.current_direction = FORWARD; + g_car_state.orientation = NORTH; + + return g_car_state; +} + +/** + * @brief Setup the Line Sensor + * + * This function will setup the Line Sensor by initializing it as an input + */ +static inline void +line_sensor_setup() { + g_left_sensor_sem = xSemaphoreCreateBinary(); + g_right_sensor_sem = xSemaphoreCreateBinary(); + + uint mask = (1 << LEFT_SENSOR_PIN) | (1 << RIGHT_SENSOR_PIN); + + // Initialise 2 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); + +} + +/** + * @brief Timer Interrupt Handler for the left sensor + * @param rt + * @return True (To keep the timer running) + */ +bool h_left_sensor_timer_handler(repeating_timer_t *repeatingTimer) { + + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + xSemaphoreGiveFromISR(g_left_sensor_sem, + &xHigherPriorityTaskWoken); + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + return true; +} + +/** + * @brief Timer Interrupt Handler for the right sensor + * + * @param repeatingTimer + * @return True (To keep the timer running) + */ +bool h_right_sensor_timer_handler(repeating_timer_t *repeatingTimer) { + + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + xSemaphoreGiveFromISR(g_right_sensor_sem, + &xHigherPriorityTaskWoken); + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + + return true; +} +#endif /* LINE_SENSOR_INIT_H */ diff --git a/frtos/line_sensor/line_sensor_test.c b/frtos/line_sensor/line_sensor_test.c new file mode 100644 index 0000000..ecfc0f2 --- /dev/null +++ b/frtos/line_sensor/line_sensor_test.c @@ -0,0 +1,65 @@ + +#include "line_sensor.h" + +#define READ_LEFT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL) +#define READ_RIGHT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL) + +#define DIRECTION_TASK_PRIORITY (tskIDLE_PRIORITY + 3UL) + +void +launch() +{ + struct repeating_timer g_left_sensor_timer; + add_repeating_timer_ms(LINE_SENSOR_READ_DELAY, + h_left_sensor_timer_handler, + NULL, + &g_left_sensor_timer); + + struct repeating_timer g_right_sensor_timer; + add_repeating_timer_ms(LINE_SENSOR_READ_DELAY, + h_right_sensor_timer_handler, + NULL, + &g_right_sensor_timer); + + TaskHandle_t h_monitor_left_sensor_task; + xTaskCreate(monitor_left_sensor_task, + "Monitor Left Sensor Task", + configMINIMAL_STACK_SIZE, + NULL, + READ_LEFT_SENSOR_PRIO, + &h_monitor_left_sensor_task); + + TaskHandle_t h_monitor_right_sensor_task; + xTaskCreate(monitor_right_sensor_task, + "Monitor Right 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", + configMINIMAL_STACK_SIZE, + NULL, + DIRECTION_TASK_PRIORITY, + &h_monitor_direction_task); + + vTaskStartScheduler(); +} + +int +main (void) +{ + stdio_usb_init(); + + sleep_ms(2000); + printf("Test started!\n"); + + line_sensor_setup(); + initialize_car_state(); + + launch(); + + return (0); +} \ No newline at end of file diff --git a/frtos/line_sensor/line_sensor.c b/frtos/line_sensor/line_sensor_unused.c similarity index 100% rename from frtos/line_sensor/line_sensor.c rename to frtos/line_sensor/line_sensor_unused.c diff --git a/frtos/line_sensor/lwipopts.h b/frtos/line_sensor/lwipopts.h deleted file mode 100644 index 051c08a..0000000 --- a/frtos/line_sensor/lwipopts.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _LWIPOPTS_H -#define _LWIPOPTS_H - -// Generally you would define your own explicit list of lwIP options -// (see https://www.nongnu.org/lwip/2_1_x/group__lwip__opts.html) -// -// This example uses a common include to avoid repetition -#include "lwipopts_examples_common.h" - -#if !NO_SYS -#define TCPIP_THREAD_STACKSIZE 1024 -#define DEFAULT_THREAD_STACKSIZE 1024 -#define DEFAULT_RAW_RECVMBOX_SIZE 8 -#define TCPIP_MBOX_SIZE 8 -#define LWIP_TIMEVAL_PRIVATE 0 - -// not necessary, can be done either way -#define LWIP_TCPIP_CORE_LOCKING_INPUT 1 - -// ping_thread sets socket receive timeout, so enable this feature -#define LWIP_SO_RCVTIMEO 1 -#endif - - -#endif diff --git a/frtos/rtos_car.c b/frtos/rtos_car.c index 2b9e283..26ea84e 100644 --- a/frtos/rtos_car.c +++ b/frtos/rtos_car.c @@ -15,8 +15,18 @@ #include "motor_speed.h" #include "motor_direction.h" -#define READ_LEFT_WHEEL_SPEED_PRIO (tskIDLE_PRIORITY + 1UL) -#define READ_RIGHT_WHEEL_SPEED_PRIO (tskIDLE_PRIORITY + 1UL) +#include "line_sensor.h" + +#define READ_LEFT_WHEEL_SPEED_PRIO (tskIDLE_PRIORITY + 1UL) +#define READ_RIGHT_WHEEL_SPEED_PRIO (tskIDLE_PRIORITY + 1UL) + +#define READ_LEFT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL) +#define READ_RIGHT_SENSOR_PRIO (tskIDLE_PRIORITY + 2UL) + +#define DIRECTION_TASK_PRIORITY (tskIDLE_PRIORITY + 3UL) + +/* Common Car State Structure (TODO: TBC)*/ +//static car_state_t g_car_state; void launch() @@ -53,6 +63,42 @@ launch() READ_RIGHT_WHEEL_SPEED_PRIO, &h_monitor_right_wheel_speed_task_handle); + struct repeating_timer g_left_sensor_timer; + add_repeating_timer_ms(LINE_SENSOR_READ_DELAY, + h_left_sensor_timer_handler, + NULL, + &g_left_sensor_timer); + + struct repeating_timer g_right_sensor_timer; + add_repeating_timer_ms(LINE_SENSOR_READ_DELAY, + h_right_sensor_timer_handler, + NULL, + &g_right_sensor_timer); + + TaskHandle_t h_monitor_left_sensor_task; + xTaskCreate(monitor_left_sensor_task, + "Monitor Left Sensor Task", + configMINIMAL_STACK_SIZE, + NULL, + READ_LEFT_SENSOR_PRIO, + &h_monitor_left_sensor_task); + + TaskHandle_t h_monitor_right_sensor_task; + xTaskCreate(monitor_right_sensor_task, + "Monitor Right 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", + configMINIMAL_STACK_SIZE, + NULL, + DIRECTION_TASK_PRIORITY, + &h_monitor_direction_task); + vTaskStartScheduler(); } @@ -65,6 +111,10 @@ main (void) set_wheel_direction(DIRECTION_LEFT_FORWARD | DIRECTION_RIGHT_FORWARD); + line_sensor_setup(); + + initialize_car_state(); // TODO: Could be common functionality, To confirm + // during Integration launch(); return (0);