From 4ab09cde9ee8ed0538943e4734e9c01ac925c803 Mon Sep 17 00:00:00 2001 From: roy01 Date: Wed, 22 Apr 2026 11:28:47 +0800 Subject: [PATCH] feat: implement UART command processing and versioning --- app/inc/main.h | 2 +- app/inc/uart_cmd_srv.h | 30 +++++++++++ app/inc/uart_drv.h | 10 +++- app/src/main.c | 4 +- app/src/uart_cmd_srv.c | 114 +++++++++++++++++++++++++++++++++++++++++ app/src/uart_drv.c | 14 +++-- 6 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 app/inc/uart_cmd_srv.h create mode 100644 app/src/uart_cmd_srv.c diff --git a/app/inc/main.h b/app/inc/main.h index c4c2d46..7b44028 100644 --- a/app/inc/main.h +++ b/app/inc/main.h @@ -26,7 +26,7 @@ extern "C" //============================================================================= // Macro Definition //============================================================================= - +#define FW_VERSION "0.0.1" //============================================================================= // Structure Definition //============================================================================= diff --git a/app/inc/uart_cmd_srv.h b/app/inc/uart_cmd_srv.h new file mode 100644 index 0000000..85e6bf3 --- /dev/null +++ b/app/inc/uart_cmd_srv.h @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2026 Wisetop. All Rights Reserved. + */ +/** @file main.c + * + * @version 0.0.1 + * @date 2026/04/22 + * @license + * @description + */ + +#ifndef __UART_CMD_SRV_H__ +#define __UART_CMD_SRV_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "uart_drv.h" + +#include "main.h" + + void uart_cmd_process(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/app/inc/uart_drv.h b/app/inc/uart_drv.h index 0975bdc..94c3f26 100644 --- a/app/inc/uart_drv.h +++ b/app/inc/uart_drv.h @@ -6,11 +6,19 @@ extern "C" { #endif -#include "syslog.h" +#include "main.h" + +#define UART_RX_BUF_SIZE 128 + + extern volatile char g_uart_rx_buf[UART_RX_BUF_SIZE]; + extern volatile uint16_t g_uart_rx_idx; + extern volatile bool g_uart_rx_complete; #define uart_send_msg(str, ...) printf(str, ##__VA_ARGS__); void uart_init(void); + void uart_clear_rx_frame(void); + bool uart_is_frame_ready(void); #ifdef __cplusplus } diff --git a/app/src/main.c b/app/src/main.c index 2b60d1a..24ffbc1 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -10,7 +10,7 @@ */ #include "main.h" -#include "uart_drv.h" +#include "uart_cmd_srv.h" //============================================================================= // Constant Definition //============================================================================= @@ -50,7 +50,7 @@ int main(void) while (1) { - __NOP(); + uart_cmd_process(); } return 0; } diff --git a/app/src/uart_cmd_srv.c b/app/src/uart_cmd_srv.c new file mode 100644 index 0000000..1edee19 --- /dev/null +++ b/app/src/uart_cmd_srv.c @@ -0,0 +1,114 @@ +#include "uart_cmd_srv.h" + +#include +#include + +static bool cmd_match_with_arg(const volatile char *buf, const char *prefix, const char **arg_out) +{ + size_t len = strlen(prefix); + for (size_t i = 0; i < len; i++) + { + if (buf[i] != prefix[i]) + return false; + } + if (buf[len] == ' ') + { + *arg_out = (const char *)&buf[len + 1]; + return true; + } + return false; +} + +static int32_t cmd_parse_int_list(const char *arg, int32_t *out, int32_t max_count) +{ + int32_t count = 0; + char *end = NULL; + const char *p = arg; + + while (*p != '\0' && count < max_count) + { + while (*p == ' ') + p++; + + if (*p == '\0') + break; + + out[count] = strtol(p, &end, 10); + if (end == p) + return -1; + + count++; + p = end; + } + + while (*p == ' ') + p++; + + if (*p != '\0') + return -1; + + return count; +} + +void uart_cmd_process(void) +{ + if (!uart_is_frame_ready()) + return; + + const char *arg = NULL; + char *cmd = (char *)g_uart_rx_buf; + + if (strcmp(cmd, "help") == 0) + { + uart_send_msg("Commands:\r\n"); + uart_send_msg(" help - show this help\r\n"); + uart_send_msg(" fw_ver - show firmware version\r\n"); + uart_send_msg(" pwm_en 1/0 - enable/disable PWM output\r\n"); + uart_send_msg(" val n1 n2 ... - parse integer values\r\n"); + } + else if (strcmp(cmd, "fw_ver") == 0) + { + uart_send_msg("FW: " FW_VERSION "\r\n"); + } + else if (cmd_match_with_arg(cmd, "pwm_en", &arg)) + { + if (arg[0] == '1') + { + uart_send_msg("OK pwm on\r\n"); + } + else if (arg[0] == '0') + { + uart_send_msg("OK pwm off\r\n"); + } + else + { + uart_send_msg("ERR usage: pwm_en 1/0\r\n"); + } + } + else if (cmd_match_with_arg(cmd, "val", &arg)) + { + int32_t values[8] = { 0 }; + int32_t parsed = cmd_parse_int_list(arg, values, 8); + + if (parsed <= 0) + { + uart_send_msg("ERR usage: val n1 n2 ...\r\n"); + } + else + { + for (int32_t i = 0; i < parsed; i++) + { + char buf[32]; + snprintf(buf, sizeof(buf), "%d\r\n", values[i]); + uart_send_msg(buf); + } + } + } + else + { + uart_send_msg("ERR unknown cmd\r\n"); + } + + /* Reset for next command */ + uart_clear_rx_frame(); +} diff --git a/app/src/uart_drv.c b/app/src/uart_drv.c index dd4e304..f5dc45d 100644 --- a/app/src/uart_drv.c +++ b/app/src/uart_drv.c @@ -1,5 +1,4 @@ #include "uart_drv.h" -#include "hal_device.h" /* UART config */ #define UART_DEVICE UART0 @@ -13,8 +12,6 @@ #define UART_RX_PIN GPIO_Pin_05 #define UART_RX_AF GPIO_AF_1 -#define UART_RX_BUF_SIZE 128 - volatile char g_uart_rx_buf[UART_RX_BUF_SIZE]; volatile uint16_t g_uart_rx_idx = 0; volatile bool g_uart_rx_complete = false; @@ -53,6 +50,17 @@ __INTERRUPT void uart_rx_handler(void) // } // } +void uart_clear_rx_frame(void) +{ + g_uart_rx_idx = 0; + g_uart_rx_complete = false; +} + +bool uart_is_frame_ready(void) +{ + return g_uart_rx_complete; +} + /* Configure PB3 as UART0 TX, PB5 as UART0 RX */ void uart_init(void) {