111 lines
3.5 KiB
C
111 lines
3.5 KiB
C
/*
|
||
cli Task
|
||
|
||
*/
|
||
|
||
/* Includes ----------------------------------------------------------------- */
|
||
#include "task/user_task.h"
|
||
/* USER INCLUDE BEGIN */
|
||
#include "device/mrobot.h"
|
||
#include "bsp/uart.h"
|
||
#include <string.h>
|
||
#include <stdbool.h>
|
||
/* 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 */
|
||
}
|
||
|
||
} |