diff --git a/core/tty_uart.c b/core/tty_uart.c index 4e10e880..d687b14b 100644 --- a/core/tty_uart.c +++ b/core/tty_uart.c @@ -1,3 +1,5 @@ +#define _GNU_SOURCE +#include #include "furi.h" #include "main.h" @@ -7,14 +9,43 @@ void handle_uart_write(const void* data, size_t size, void* ctx) { HAL_UART_Transmit(&DEBUG_UART, (uint8_t*)data, (uint16_t)size, HAL_MAX_DELAY); } +static ssize_t stdout_write(void *_cookie, const char *buf, size_t n) { + FuriRecordSubscriber *log = pvTaskGetThreadLocalStoragePointer(NULL, 0); + if (log == NULL) { + log = furi_open("tty", false, false, NULL, NULL, NULL); + vTaskSetThreadLocalStoragePointer(NULL, 0, log); + } + if (buf == 0) { + /* + * This means that we should flush internal buffers. Since we + * don't we just return. (Remember, "handle" == -1 means that all + * handles should be flushed.) + */ + return 0; + } + + furi_write(log, buf, n); + + return n; +} + bool register_tty_uart() { if(!furi_create("tty", NULL, 0)) { return false; } - + if(furi_open("tty", false, false, handle_uart_write, NULL, NULL) == NULL) { return false; } + FILE* fp = fopencookie(NULL, "w+", (cookie_io_functions_t) { + .read = NULL, + .write = stdout_write, + .seek = NULL, + .close = NULL, + }); + setvbuf(fp, NULL, _IONBF, 0); + stdout = fp; + return true; -} \ No newline at end of file +} diff --git a/target_f1/Inc/FreeRTOSConfig.h b/target_f1/Inc/FreeRTOSConfig.h index 7b29e66c..085eb0c7 100644 --- a/target_f1/Inc/FreeRTOSConfig.h +++ b/target_f1/Inc/FreeRTOSConfig.h @@ -68,6 +68,7 @@ #define configQUEUE_REGISTRY_SIZE 8 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 #define configUSE_COUNTING_SEMAPHORES 1 +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 1 /* Co-routine definitions. */ #define configUSE_CO_ROUTINES 0 diff --git a/target_f2/Inc/FreeRTOSConfig.h b/target_f2/Inc/FreeRTOSConfig.h index 7b29e66c..085eb0c7 100644 --- a/target_f2/Inc/FreeRTOSConfig.h +++ b/target_f2/Inc/FreeRTOSConfig.h @@ -68,6 +68,7 @@ #define configQUEUE_REGISTRY_SIZE 8 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 #define configUSE_COUNTING_SEMAPHORES 1 +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 1 /* Co-routine definitions. */ #define configUSE_CO_ROUTINES 0