/* cli Task */ /* Includes ----------------------------------------------------------------- */ #include "task/user_task.h" /* USER INCLUDE BEGIN */ #include "device/mrobot.h" #include "bsp/uart.h" #include #include /* USER INCLUDE END */ /* Private typedef ---------------------------------------------------------- */ /* Private define ----------------------------------------------------------- */ /* Private macro ------------------------------------------------------------ */ /* Private variables -------------------------------------------------------- */ /* USER STRUCT BEGIN */ static uint8_t uart_rx_char; static uint8_t cmd_buffer[128]; static volatile uint8_t cmd_index = 0; static volatile bool cmd_ready = false; static char output_buffer[512]; /* USER STRUCT END */ /* Private function --------------------------------------------------------- */ /* UART 接收中断回调 */ static void cli_uart_rx_callback(void) { uint8_t ch = uart_rx_char; if (ch == '\r' || ch == '\n') { if (cmd_index > 0) { cmd_buffer[cmd_index] = '\0'; cmd_ready = true; /* 发送换行 */ BSP_UART_Transmit(BSP_UART_VOFA, (uint8_t *)"\r\n", 2, false); } } else if (ch == 127 || ch == 8) { /* 退格键 */ if (cmd_index > 0) { cmd_index--; /* 回显退格 */ const char *backspace = "\b \b"; BSP_UART_Transmit(BSP_UART_VOFA, (uint8_t *)backspace, 3, false); } } else if (ch >= 32 && ch < 127 && cmd_index < sizeof(cmd_buffer) - 1) { /* 只接受可打印字符 */ cmd_buffer[cmd_index++] = ch; /* 回显字符 */ BSP_UART_Transmit(BSP_UART_VOFA, &ch, 1, false); } /* 重新启动接收 */ BSP_UART_Receive(BSP_UART_VOFA, &uart_rx_char, 1, false); } /* Exported functions ------------------------------------------------------- */ void Task_cli(void *argument) { (void)argument; /* 未使用argument,消除警告 */ osDelay(CLI_INIT_DELAY); /* 延时一段时间再开启任务 */ /* USER CODE INIT BEGIN */ /* 初始化 MRobot CLI 系统 */ MRobot_Init(); /* 注册 UART 接收回调 */ BSP_UART_RegisterCallback(BSP_UART_VOFA, BSP_UART_RX_CPLT_CB, cli_uart_rx_callback); /* 启动 UART 接收 */ BSP_UART_Receive(BSP_UART_VOFA, &uart_rx_char, 1, false); /* 发送欢迎消息 */ const char *welcome = "\r\n\r\n" "================================\r\n" " MRobot CLI v1.0\r\n" " 输入 'help' 获取帮助\r\n" "================================\r\n" "root@mrobot:~$ "; BSP_UART_Transmit(BSP_UART_VOFA, (uint8_t *)welcome, strlen(welcome), false); /* USER CODE INIT END */ while (1) { /* USER CODE BEGIN */ /* 检查是否有命令需要处理 */ if (cmd_ready) { /* 处理命令 */ if (MRobot_ProcessCommand((char *)cmd_buffer, output_buffer, sizeof(output_buffer)) == 0) { if (strlen(output_buffer) > 0) { BSP_UART_Transmit(BSP_UART_VOFA, (uint8_t *)output_buffer, strlen(output_buffer), false); osDelay(10); /* 等待发送完成 */ } } /* 发送提示符 */ char prompt[128]; snprintf(prompt, sizeof(prompt), "root@mrobot:%s$ ", MRobot_GetCurrentPath()); BSP_UART_Transmit(BSP_UART_VOFA, (uint8_t *)prompt, strlen(prompt), false); osDelay(5); /* 等待发送完成 */ /* 重置状态 */ cmd_index = 0; cmd_ready = false; } osDelay(10); /* USER CODE END */ } }