diff --git a/CMakeLists.txt b/CMakeLists.txt index 405ae10..f7b6bf2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,7 @@ add_compile_definitions(configTICK_CORE=0) # ) -add_subdirectory(./Blinky) -add_subdirectory(./Listener) -add_subdirectory(./Yeller) +add_subdirectory(./Talky) +# add_subdirectory(./Listener) +# add_subdirectory(./Yeller) diff --git a/Talky/CMakeLists.txt b/Talky/CMakeLists.txt new file mode 100644 index 0000000..6356c74 --- /dev/null +++ b/Talky/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.5.0) + +set(APP_NAME "Talky") + +add_executable(${APP_NAME} + ./main.c +) + +target_link_libraries(${APP_NAME} LINK_PUBLIC + pico_stdlib + FreeRTOS-Kernel + FreeRTOS-Kernel-Heap4 +) + +pico_enable_stdio_usb(${APP_NAME} 1) +pico_enable_stdio_uart(${APP_NAME} 0) + +pico_add_extra_outputs(${APP_NAME}) + diff --git a/Talky/main.c b/Talky/main.c new file mode 100644 index 0000000..f2b790a --- /dev/null +++ b/Talky/main.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include "FreeRTOS.h" +#include +#include + +#define BUFFER_SIZE 256 + +char NULLCHAR = 0x0; +QueueHandle_t MESSAGES = NULL; + + +void vReadSerial(void* params) { + // Setup + MESSAGES = xQueueCreate(4, BUFFER_SIZE); // Message queue + unsigned int len = 0; // Buffer ptr + int ret; + char ret_char; + char* buffer = pvPortMalloc(BUFFER_SIZE * sizeof(char)); + + // start loop + while(true) { + ret = getchar_timeout_us(0); + if(ret != PICO_ERROR_TIMEOUT) { + // If returned char exists, or... + ret_char = (char)ret; + if (ret_char & 0xE0) { + // If char is printable, echo it, copy to buffer, and increment ptr + printf("%c", ret_char); + memcpy(buffer+len*sizeof(char), &ret_char, sizeof(char)); + len++; + } else if (len) { + // Otw, and if buffer is not empty, check special chars + switch(ret_char) { + // Backspace + // "Delete" char, ie decrement ptr + case 8: + len--; + break; + // CR, LF + // Send message to queue with null char and reset ptr + case 10: + case 13: + memcpy(buffer+len*sizeof(char), &NULLCHAR, sizeof(char)); + xQueueSendToBack(MESSAGES, buffer, 50); + printf("\n"); + len = 0; + break; + // Otw do nothing + default: + break; + }; + } + } + } +} + +void vProcessMessages(void* params) { + // Wait for queue to be intialized + while(true) { + if (MESSAGES != NULL) { break; } + } + char* command = pvPortMalloc(BUFFER_SIZE * sizeof(char)); + while(MESSAGES != NULL) { + if (xQueueReceive(MESSAGES, command, 50)) { + printf("Recieved message: "); + printf("%s\n", command); + } + } + +} + +void main() { + stdio_init_all(); + busy_wait_ms(1000); + gpio_init(PICO_DEFAULT_LED_PIN); + gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT); + xTaskCreate(vReadSerial, "Read serial", 128, NULL, 1, NULL); + xTaskCreate(vProcessMessages, "Process messages", 128, NULL, 1, NULL); + vTaskStartScheduler(); +} +