diff --git a/config.csv b/config.csv index 3f0ecc5..95f87e9 100644 --- a/config.csv +++ b/config.csv @@ -1,4 +1,4 @@ bsp,can,fdcan,dwt,gpio,i2c,mm,spi,uart,pwm,time,flash component,ahrs,capacity,cmd,crc8,crc16,error_detect,filter,FreeRTOS_CLI,limiter,mixer,pid,ui,user_math -device,dr16,bmi088,ist8310,motor,motor_rm,motor_dm,motor_vesc,motor_lk,motor_lz,motor_odrive,dm_imu,rc_can,servo,buzzer,led,ws2812,vofa,ops9,oid,lcd_driver,mrobot +device,dr16,bmi088,ist8310,motor,motor_rm,motor_dm,motor_vesc,motor_lk,motor_lz,motor_odrive,dm_imu,rc_can,servo,buzzer,led,ws2812,vofa,ops9,oid,lcd_driver,putty module, \ No newline at end of file diff --git a/device/config.yaml b/device/config.yaml index 60e73f8..5d7baa4 100644 --- a/device/config.yaml +++ b/device/config.yaml @@ -261,7 +261,7 @@ devices: header: "lcd.h" source: "lcd.c" - mrobot: + putty: name: "MRobot CLI" description: "基于 FreeRTOS CLI 的嵌入式调试命令行系统,支持设备注册与监控、类 Unix 文件系统命令、htop 风格任务监控等" dependencies: @@ -269,9 +269,9 @@ devices: component: ["freertos_cli"] bsp_requirements: - type: "uart" - var_name: "BSP_UART_MROBOT" + var_name: "BSP_UART_PUTTY" description: "用于 MRobot CLI 命令行交互" thread_signals: [] files: - header: "mrobot.h" - source: "mrobot.c" \ No newline at end of file + header: "putty.h" + source: "putty.c" \ No newline at end of file diff --git a/device/mrobot/mrobot.c b/device/putty/putty.c similarity index 90% rename from device/mrobot/mrobot.c rename to device/putty/putty.c index 3a77112..0dfdd11 100644 --- a/device/mrobot/mrobot.c +++ b/device/putty/putty.c @@ -1,10 +1,10 @@ /** - * @file mrobot.c - * @brief MRobot CLI 实现 + * @file putty.c + * @brief Putty CLI 实现 */ /* Includes ----------------------------------------------------------------- */ -#include "device/mrobot.h" +#include "device/putty.h" #include "component/freertos_cli.h" #include "bsp/uart.h" #include "bsp/mm.h" @@ -39,19 +39,19 @@ static const char *const CLI_WELCOME_MESSAGE = /* CLI 上下文结构体 - 封装所有状态 */ typedef struct { /* 设备管理 */ - MRobot_Device_t devices[MROBOT_MAX_DEVICES]; + Putty_Device_t devices[PUTTY_MAX_DEVICES]; uint8_t device_count; /* 自定义命令 */ - CLI_Command_Definition_t *custom_cmds[MROBOT_MAX_CUSTOM_COMMANDS]; + CLI_Command_Definition_t *custom_cmds[PUTTY_MAX_CUSTOM_COMMANDS]; uint8_t custom_cmd_count; /* CLI 状态 */ - MRobot_State_t state; - char current_path[MROBOT_PATH_MAX_LEN]; + Putty_State_t state; + char current_path[PUTTY_PATH_MAX_LEN]; /* 命令缓冲区 */ - uint8_t cmd_buffer[MROBOT_CMD_BUFFER_SIZE]; + uint8_t cmd_buffer[PUTTY_CMD_BUFFER_SIZE]; volatile uint8_t cmd_index; volatile bool cmd_ready; @@ -61,20 +61,20 @@ typedef struct { volatile bool htop_exit; /* 输出缓冲区 */ - char output_buffer[MROBOT_OUTPUT_BUFFER_SIZE]; + char output_buffer[PUTTY_OUTPUT_BUFFER_SIZE]; /* 初始化标志 */ bool initialized; /* 互斥锁 */ SemaphoreHandle_t mutex; -} MRobot_Context_t; +} Putty_Context_t; /* Private variables -------------------------------------------------------- */ -static MRobot_Context_t ctx = { +static Putty_Context_t ctx = { .device_count = 0, .custom_cmd_count = 0, - .state = MROBOT_STATE_IDLE, + .state = PUTTY_STATE_IDLE, .current_path = "/", .cmd_index = 0, .cmd_ready = false, @@ -85,7 +85,6 @@ static MRobot_Context_t ctx = { }; /* Private function prototypes ---------------------------------------------- */ -/* 命令处理函数 */ static BaseType_t cmd_help(char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString); static BaseType_t cmd_htop(char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString); static BaseType_t cmd_cd(char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString); @@ -128,8 +127,8 @@ static void send_string(const char *str) { * @brief 发送命令提示符 */ static void send_prompt(void) { - char prompt[MROBOT_PATH_MAX_LEN + 32]; - snprintf(prompt, sizeof(prompt), MROBOT_USER_NAME "@" MROBOT_HOST_NAME ":%s$ ", ctx.current_path); + char prompt[PUTTY_PATH_MAX_LEN + 32]; + snprintf(prompt, sizeof(prompt), PUTTY_USER_NAME "@" PUTTY_HOST_NAME ":%s$ ", ctx.current_path); send_string(prompt); } @@ -147,7 +146,7 @@ static void uart_rx_callback(void) { uint8_t ch = ctx.uart_rx_char; /* htop 模式下检查退出键 */ - if (ctx.state == MROBOT_STATE_HTOP) { + if (ctx.state == PUTTY_STATE_HTOP) { if (ch == 'q' || ch == 'Q' || ch == 27) { ctx.htop_exit = true; } @@ -187,7 +186,7 @@ static BaseType_t cmd_help(char *pcWriteBuffer, size_t xWriteBufferLen, const ch (void)pcCommandString; int offset = snprintf(pcWriteBuffer, xWriteBufferLen, - "MRobot CLI v2.0\r\n" + "Putty CLI v2.0\r\n" "================\r\n" "Built-in Commands:\r\n"); @@ -217,7 +216,7 @@ static BaseType_t cmd_htop(char *pcWriteBuffer, size_t xWriteBufferLen, const ch (void)pcCommandString; (void)pcWriteBuffer; (void)xWriteBufferLen; - /* htop 模式在 MRobot_Run 中处理 */ + /* htop 模式在 Putty_Run 中处理 */ return pdFALSE; } @@ -238,7 +237,7 @@ static BaseType_t cmd_cd(char *pcWriteBuffer, size_t xWriteBufferLen, const char } /* 安全复制路径参数 */ - char path[MROBOT_PATH_MAX_LEN]; + char path[PUTTY_PATH_MAX_LEN]; size_t copy_len = (size_t)param_len < sizeof(path) - 1 ? (size_t)param_len : sizeof(path) - 1; strncpy(path, param, copy_len); path[copy_len] = '\0'; @@ -304,7 +303,7 @@ static BaseType_t cmd_show(char *pcWriteBuffer, size_t xWriteBufferLen, const ch /* 使用局部静态变量跟踪多次打印状态 */ static uint32_t print_count = 0; static uint32_t current_iter = 0; - static char target_device[MROBOT_DEVICE_NAME_LEN] = {0}; + static char target_device[PUTTY_DEVICE_NAME_LEN] = {0}; /* 首次调用时解析参数 */ if (current_iter == 0) { @@ -380,7 +379,7 @@ static BaseType_t cmd_show(char *pcWriteBuffer, size_t xWriteBufferLen, const ch } } else { /* 显示指定设备 */ - const MRobot_Device_t *dev = MRobot_FindDevice(target_device); + const Putty_Device_t *dev = Putty_FindDevice(target_device); if (dev == NULL) { snprintf(pcWriteBuffer, xWriteBufferLen, @@ -404,7 +403,7 @@ static BaseType_t cmd_show(char *pcWriteBuffer, size_t xWriteBufferLen, const ch /* 判断是否继续打印 */ current_iter++; if (current_iter < print_count) { - osDelay(MROBOT_HTOP_REFRESH_MS); + osDelay(PUTTY_HTOP_REFRESH_MS); return pdTRUE; } else { current_iter = 0; @@ -417,7 +416,7 @@ static BaseType_t cmd_show(char *pcWriteBuffer, size_t xWriteBufferLen, const ch * ========================================================================== */ static void handle_htop_mode(void) { send_string(ANSI_CLEAR_SCREEN); - send_string("=== MRobot Task Monitor (Press 'q' to exit) ===\r\n\r\n"); + send_string("=== Putty Task Monitor (Press 'q' to exit) ===\r\n\r\n"); /* 获取任务列表 */ char task_buffer[1024]; @@ -465,20 +464,20 @@ static void handle_htop_mode(void) { /* 检查退出 */ if (ctx.htop_exit) { - ctx.state = MROBOT_STATE_IDLE; + ctx.state = PUTTY_STATE_IDLE; ctx.htop_exit = false; send_string(ANSI_CLEAR_SCREEN); send_prompt(); } - osDelay(MROBOT_HTOP_REFRESH_MS); + osDelay(PUTTY_HTOP_REFRESH_MS); } /* ========================================================================== */ /* 公共 API 实现 */ /* ========================================================================== */ -void MRobot_Init(void) { +void Putty_Init(void) { if (ctx.initialized) return; /* 创建互斥锁 */ @@ -487,7 +486,7 @@ void MRobot_Init(void) { /* 初始化状态(保留已注册的设备) */ // 注意:不清除 devices 和 device_count,因为其他任务可能已经注册了设备 ctx.custom_cmd_count = 0; - ctx.state = MROBOT_STATE_IDLE; + ctx.state = PUTTY_STATE_IDLE; strcpy(ctx.current_path, "/"); ctx.cmd_index = 0; ctx.cmd_ready = false; @@ -518,7 +517,7 @@ void MRobot_Init(void) { ctx.initialized = true; } -void MRobot_DeInit(void) { +void Putty_DeInit(void) { if (!ctx.initialized) return; /* 释放自定义命令内存 */ @@ -538,23 +537,23 @@ void MRobot_DeInit(void) { ctx.initialized = false; } -MRobot_State_t MRobot_GetState(void) { +Putty_State_t Putty_GetState(void) { return ctx.state; } -MRobot_Error_t MRobot_RegisterDevice(const char *name, void *data, MRobot_PrintCallback_t print_cb) { +Putty_Error_t Putty_RegisterDevice(const char *name, void *data, Putty_PrintCallback_t print_cb) { if (name == NULL || data == NULL) { - return MROBOT_ERR_NULL_PTR; + return PUTTY_ERR_NULL_PTR; } - if (ctx.device_count >= MROBOT_MAX_DEVICES) { - return MROBOT_ERR_FULL; + if (ctx.device_count >= PUTTY_MAX_DEVICES) { + return PUTTY_ERR_FULL; } /* 检查重名 */ for (uint8_t i = 0; i < ctx.device_count; i++) { if (strcmp(ctx.devices[i].name, name) == 0) { - return MROBOT_ERR_INVALID_ARG; /* 设备名已存在 */ + return PUTTY_ERR_INVALID_ARG; /* 设备名已存在 */ } } @@ -563,8 +562,8 @@ MRobot_Error_t MRobot_RegisterDevice(const char *name, void *data, MRobot_PrintC xSemaphoreTake(ctx.mutex, portMAX_DELAY); } - strncpy(ctx.devices[ctx.device_count].name, name, MROBOT_DEVICE_NAME_LEN - 1); - ctx.devices[ctx.device_count].name[MROBOT_DEVICE_NAME_LEN - 1] = '\0'; + strncpy(ctx.devices[ctx.device_count].name, name, PUTTY_DEVICE_NAME_LEN - 1); + ctx.devices[ctx.device_count].name[PUTTY_DEVICE_NAME_LEN - 1] = '\0'; ctx.devices[ctx.device_count].data = data; ctx.devices[ctx.device_count].print_cb = print_cb; ctx.device_count++; @@ -573,12 +572,12 @@ MRobot_Error_t MRobot_RegisterDevice(const char *name, void *data, MRobot_PrintC xSemaphoreGive(ctx.mutex); } - return MROBOT_OK; + return PUTTY_OK; } -MRobot_Error_t MRobot_UnregisterDevice(const char *name) { +Putty_Error_t Putty_UnregisterDevice(const char *name) { if (name == NULL) { - return MROBOT_ERR_NULL_PTR; + return PUTTY_ERR_NULL_PTR; } if (ctx.mutex != NULL) { @@ -596,30 +595,30 @@ MRobot_Error_t MRobot_UnregisterDevice(const char *name) { if (ctx.mutex != NULL) { xSemaphoreGive(ctx.mutex); } - return MROBOT_OK; + return PUTTY_OK; } } if (ctx.mutex != NULL) { xSemaphoreGive(ctx.mutex); } - return MROBOT_ERR_NOT_FOUND; + return PUTTY_ERR_NOT_FOUND; } -MRobot_Error_t MRobot_RegisterCommand(const char *command, const char *help_text, - MRobot_CommandCallback_t callback, int8_t param_count) { +Putty_Error_t Putty_RegisterCommand(const char *command, const char *help_text, + Putty_CommandCallback_t callback, int8_t param_count) { if (command == NULL || help_text == NULL || callback == NULL) { - return MROBOT_ERR_NULL_PTR; + return PUTTY_ERR_NULL_PTR; } - if (ctx.custom_cmd_count >= MROBOT_MAX_CUSTOM_COMMANDS) { - return MROBOT_ERR_FULL; + if (ctx.custom_cmd_count >= PUTTY_MAX_CUSTOM_COMMANDS) { + return PUTTY_ERR_FULL; } /* 动态分配命令结构体 */ CLI_Command_Definition_t *cmd_def = BSP_Malloc(sizeof(CLI_Command_Definition_t)); if (cmd_def == NULL) { - return MROBOT_ERR_ALLOC; + return PUTTY_ERR_ALLOC; } /* 初始化命令定义 */ @@ -634,14 +633,14 @@ MRobot_Error_t MRobot_RegisterCommand(const char *command, const char *help_text ctx.custom_cmds[ctx.custom_cmd_count] = cmd_def; ctx.custom_cmd_count++; - return MROBOT_OK; + return PUTTY_OK; } -uint8_t MRobot_GetDeviceCount(void) { +uint8_t Putty_GetDeviceCount(void) { return ctx.device_count; } -const MRobot_Device_t *MRobot_FindDevice(const char *name) { +const Putty_Device_t *Putty_FindDevice(const char *name) { if (name == NULL) return NULL; for (uint8_t i = 0; i < ctx.device_count; i++) { @@ -652,10 +651,10 @@ const MRobot_Device_t *MRobot_FindDevice(const char *name) { return NULL; } -int MRobot_Printf(const char *fmt, ...) { +int Putty_Printf(const char *fmt, ...) { if (fmt == NULL || !ctx.initialized) return -1; - char buffer[MROBOT_OUTPUT_BUFFER_SIZE]; + char buffer[PUTTY_OUTPUT_BUFFER_SIZE]; va_list args; va_start(args, fmt); int len = format_float_va(buffer, sizeof(buffer), fmt, args); @@ -710,7 +709,7 @@ static int format_float_va(char *buf, size_t size, const char *fmt, va_list args switch (*p) { case 'f': { /* 浮点数 */ double val = va_arg(args, double); - written = MRobot_FormatFloat(buf_ptr, buf_remain, (float)val, precision); + written = Putty_FormatFloat(buf_ptr, buf_remain, (float)val, precision); break; } case 'd': @@ -785,7 +784,7 @@ static int format_float_va(char *buf, size_t size, const char *fmt, va_list args return (int)(buf_ptr - buf); } -int MRobot_Snprintf(char *buf, size_t size, const char *fmt, ...) { +int Putty_Snprintf(char *buf, size_t size, const char *fmt, ...) { va_list args; va_start(args, fmt); int len = format_float_va(buf, size, fmt, args); @@ -793,7 +792,7 @@ int MRobot_Snprintf(char *buf, size_t size, const char *fmt, ...) { return len; } -int MRobot_FormatFloat(char *buf, size_t size, float val, int precision) { +int Putty_FormatFloat(char *buf, size_t size, float val, int precision) { if (buf == NULL || size == 0) return 0; int offset = 0; @@ -831,22 +830,22 @@ int MRobot_FormatFloat(char *buf, size_t size, float val, int precision) { return (written > 0) ? (offset + written) : offset; } -void MRobot_Run(void) { +void Putty_Run(void) { if (!ctx.initialized) return; /* htop 模式 */ - if (ctx.state == MROBOT_STATE_HTOP) { + if (ctx.state == PUTTY_STATE_HTOP) { handle_htop_mode(); return; } /* 处理命令 */ if (ctx.cmd_ready) { - ctx.state = MROBOT_STATE_PROCESSING; + ctx.state = PUTTY_STATE_PROCESSING; /* 检查是否是 htop 命令 */ if (strcmp((char *)ctx.cmd_buffer, "htop") == 0) { - ctx.state = MROBOT_STATE_HTOP; + ctx.state = PUTTY_STATE_HTOP; ctx.htop_exit = false; } else { /* 处理其他命令 */ @@ -863,7 +862,7 @@ void MRobot_Run(void) { } while (more != pdFALSE); send_prompt(); - ctx.state = MROBOT_STATE_IDLE; + ctx.state = PUTTY_STATE_IDLE; } ctx.cmd_index = 0; diff --git a/device/mrobot/mrobot.h b/device/putty/putty.h similarity index 56% rename from device/mrobot/mrobot.h rename to device/putty/putty.h index 69d8b3a..cdeb80f 100644 --- a/device/mrobot/mrobot.h +++ b/device/putty/putty.h @@ -1,6 +1,6 @@ /** - * @file mrobot.h - * @brief MRobot CLI - 基于 FreeRTOS CLI 的嵌入式调试命令行系统 + * @file putty.h + * @brief Putty CLI - 基于 FreeRTOS CLI 的嵌入式调试命令行系统 * * 功能特性: * - 设备注册与监控(IMU、电机、传感器等) @@ -25,7 +25,7 @@ * // 2. 实现打印回调 * static int print_imu(const void *data, char *buf, size_t size) { * const MyIMU_t *imu = (const MyIMU_t *)data; - * return MRobot_Snprintf(buf, size, + * return Putty_Snprintf(buf, size, * " Status: %s\r\n" * " Accel : X=%.3f Y=%.3f Z=%.3f\r\n" * " Euler : R=%.2f P=%.2f Y=%.2f\r\n" @@ -37,7 +37,7 @@ * } * * // 3. 注册设备 - * MRobot_RegisterDevice("imu", &my_imu, print_imu); + * Putty_RegisterDevice("imu", &my_imu, print_imu); * @endcode * * @example 电机设备注册示例 @@ -53,7 +53,7 @@ * * static int print_motor(const void *data, char *buf, size_t size) { * const MyMotor_t *m = (const MyMotor_t *)data; - * return MRobot_Snprintf(buf, size, + * return Putty_Snprintf(buf, size, * " Status : %s\r\n" * " Angle : %.2f deg\r\n" * " Speed : %.1f RPM\r\n" @@ -63,10 +63,10 @@ * } * * // 注册 4 个电机 - * MRobot_RegisterDevice("motor0", &motor[0], print_motor); - * MRobot_RegisterDevice("motor1", &motor[1], print_motor); - * MRobot_RegisterDevice("motor2", &motor[2], print_motor); - * MRobot_RegisterDevice("motor3", &motor[3], print_motor); + * Putty_RegisterDevice("motor0", &motor[0], print_motor); + * Putty_RegisterDevice("motor1", &motor[1], print_motor); + * Putty_RegisterDevice("motor2", &motor[2], print_motor); + * Putty_RegisterDevice("motor3", &motor[3], print_motor); * @endcode * * @example 自定义校准命令示例 @@ -79,24 +79,24 @@ * const char *param = FreeRTOS_CLIGetParameter(cmd, 1, NULL); * * if (param == NULL) { - * return MRobot_Snprintf(buf, size, "Usage: cali \r\n"); + * return Putty_Snprintf(buf, size, "Usage: cali \r\n"); * } * if (strncmp(param, "gyro", 4) == 0) { * // 采集 1000 次陀螺仪数据求平均 - * MRobot_Snprintf(buf, size, "Calibrating gyro... keep IMU still!\r\n"); + * Putty_Snprintf(buf, size, "Calibrating gyro... keep IMU still!\r\n"); * // ... 校准逻辑 ... * return 0; * } * if (strncmp(param, "save", 4) == 0) { * // 保存到 Flash - * MRobot_Snprintf(buf, size, "Calibration saved to flash.\r\n"); + * Putty_Snprintf(buf, size, "Calibration saved to flash.\r\n"); * return 0; * } - * return MRobot_Snprintf(buf, size, "Unknown: %s\r\n", param); + * return Putty_Snprintf(buf, size, "Unknown: %s\r\n", param); * } * * // 注册命令 - * MRobot_RegisterCommand("cali", "cali : IMU calibration\r\n", cmd_cali, -1); + * Putty_RegisterCommand("cali", "cali : IMU calibration", cmd_cali, -1); * @endcode */ @@ -115,60 +115,60 @@ extern "C" { /* Configuration ------------------------------------------------------------ */ /* 可在编译时通过 -D 选项覆盖这些默认值 */ -#ifndef MROBOT_MAX_DEVICES -#define MROBOT_MAX_DEVICES 64 /* 最大设备数 */ +#ifndef PUTTY_MAX_DEVICES +#define PUTTY_MAX_DEVICES 64 /* 最大设备数 */ #endif -#ifndef MROBOT_MAX_CUSTOM_COMMANDS -#define MROBOT_MAX_CUSTOM_COMMANDS 16 /* 最大自定义命令数 */ +#ifndef PUTTY_MAX_CUSTOM_COMMANDS +#define PUTTY_MAX_CUSTOM_COMMANDS 16 /* 最大自定义命令数 */ #endif -#ifndef MROBOT_CMD_BUFFER_SIZE -#define MROBOT_CMD_BUFFER_SIZE 128 /* 命令缓冲区大小 */ +#ifndef PUTTY_CMD_BUFFER_SIZE +#define PUTTY_CMD_BUFFER_SIZE 128 /* 命令缓冲区大小 */ #endif -#ifndef MROBOT_OUTPUT_BUFFER_SIZE -#define MROBOT_OUTPUT_BUFFER_SIZE 512 /* 输出缓冲区大小 */ +#ifndef PUTTY_OUTPUT_BUFFER_SIZE +#define PUTTY_OUTPUT_BUFFER_SIZE 512 /* 输出缓冲区大小 */ #endif -#ifndef MROBOT_DEVICE_NAME_LEN -#define MROBOT_DEVICE_NAME_LEN 32 /* 设备名最大长度 */ +#ifndef PUTTY_DEVICE_NAME_LEN +#define PUTTY_DEVICE_NAME_LEN 32 /* 设备名最大长度 */ #endif -#ifndef MROBOT_PATH_MAX_LEN -#define MROBOT_PATH_MAX_LEN 64 /* 路径最大长度 */ +#ifndef PUTTY_PATH_MAX_LEN +#define PUTTY_PATH_MAX_LEN 64 /* 路径最大长度 */ #endif -#ifndef MROBOT_HTOP_REFRESH_MS -#define MROBOT_HTOP_REFRESH_MS 200 /* htop 刷新间隔 (ms) */ +#ifndef PUTTY_HTOP_REFRESH_MS +#define PUTTY_HTOP_REFRESH_MS 200 /* htop 刷新间隔 (ms) */ #endif -#ifndef MROBOT_USER_NAME -#define MROBOT_USER_NAME "root" /* CLI 用户名 */ +#ifndef PUTTY_USER_NAME +#define PUTTY_USER_NAME "root" /* CLI 用户名 */ #endif -#ifndef MROBOT_HOST_NAME -#define MROBOT_HOST_NAME "MRobot" /* CLI 主机名 */ +#ifndef PUTTY_HOST_NAME +#define PUTTY_HOST_NAME "MRobot" /* CLI 主机名 */ #endif /* Error codes -------------------------------------------------------------- */ typedef enum { - MROBOT_OK = 0, /* 成功 */ - MROBOT_ERR_FULL = -1, /* 容量已满 */ - MROBOT_ERR_NULL_PTR = -2, /* 空指针 */ - MROBOT_ERR_INVALID_ARG = -3, /* 无效参数 */ - MROBOT_ERR_NOT_FOUND = -4, /* 未找到 */ - MROBOT_ERR_ALLOC = -5, /* 内存分配失败 */ - MROBOT_ERR_BUSY = -6, /* 设备忙 */ - MROBOT_ERR_NOT_INIT = -7, /* 未初始化 */ -} MRobot_Error_t; + PUTTY_OK = 0, /* 成功 */ + PUTTY_ERR_FULL = -1, /* 容量已满 */ + PUTTY_ERR_NULL_PTR = -2, /* 空指针 */ + PUTTY_ERR_INVALID_ARG = -3, /* 无效参数 */ + PUTTY_ERR_NOT_FOUND = -4, /* 未找到 */ + PUTTY_ERR_ALLOC = -5, /* 内存分配失败 */ + PUTTY_ERR_BUSY = -6, /* 设备忙 */ + PUTTY_ERR_NOT_INIT = -7, /* 未初始化 */ +} Putty_Error_t; /* CLI 运行状态 */ typedef enum { - MROBOT_STATE_IDLE, /* 空闲状态,等待输入 */ - MROBOT_STATE_HTOP, /* htop 模式 */ - MROBOT_STATE_PROCESSING, /* 正在处理命令 */ -} MRobot_State_t; + PUTTY_STATE_IDLE, /* 空闲状态,等待输入 */ + PUTTY_STATE_HTOP, /* htop 模式 */ + PUTTY_STATE_PROCESSING, /* 正在处理命令 */ +} Putty_State_t; /* Callback types ----------------------------------------------------------- */ @@ -180,54 +180,54 @@ typedef enum { * @return 实际写入的字节数 * @note 用户需要自行实现此函数来格式化设备数据 */ -typedef int (*MRobot_PrintCallback_t)(const void *device_data, char *buffer, size_t buffer_size); +typedef int (*Putty_PrintCallback_t)(const void *device_data, char *buffer, size_t buffer_size); /** * @brief 命令处理回调函数类型(与 FreeRTOS CLI 兼容) */ -typedef long (*MRobot_CommandCallback_t)(char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString); +typedef long (*Putty_CommandCallback_t)(char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString); /* Device structure --------------------------------------------------------- */ typedef struct { - char name[MROBOT_DEVICE_NAME_LEN]; /* 设备名称 */ + char name[PUTTY_DEVICE_NAME_LEN]; /* 设备名称 */ void *data; /* 用户设备数据指针 */ - MRobot_PrintCallback_t print_cb; /* 用户打印回调函数 */ -} MRobot_Device_t; + Putty_PrintCallback_t print_cb; /* 用户打印回调函数 */ +} Putty_Device_t; /* Public API --------------------------------------------------------------- */ /** - * @brief 初始化 MRobot CLI 系统 + * @brief 初始化 Putty CLI 系统 * @note 必须在 FreeRTOS 调度器启动后调用 */ -void MRobot_Init(void); +void Putty_Init(void); /** - * @brief 反初始化 MRobot CLI 系统,释放资源 + * @brief 反初始化 Putty CLI 系统,释放资源 */ -void MRobot_DeInit(void); +void Putty_DeInit(void); /** * @brief 获取当前 CLI 状态 - * @return MRobot_State_t 当前状态 + * @return Putty_State_t 当前状态 */ -MRobot_State_t MRobot_GetState(void); +Putty_State_t Putty_GetState(void); /** - * @brief 注册设备到 MRobot 系统 - * @param name 设备名称(会被截断到 MROBOT_DEVICE_NAME_LEN-1) + * @brief 注册设备到 Putty 系统 + * @param name 设备名称(会被截断到 PUTTY_DEVICE_NAME_LEN-1) * @param data 设备数据指针(不能为 NULL) * @param print_cb 打印回调函数(可为 NULL,但无法用 show 命令查看) - * @return MRobot_Error_t 错误码 + * @return Putty_Error_t 错误码 */ -MRobot_Error_t MRobot_RegisterDevice(const char *name, void *data, MRobot_PrintCallback_t print_cb); +Putty_Error_t Putty_RegisterDevice(const char *name, void *data, Putty_PrintCallback_t print_cb); /** * @brief 注销设备 * @param name 设备名称 - * @return MRobot_Error_t 错误码 + * @return Putty_Error_t 错误码 */ -MRobot_Error_t MRobot_UnregisterDevice(const char *name); +Putty_Error_t Putty_UnregisterDevice(const char *name); /** * @brief 注册自定义命令 @@ -235,29 +235,29 @@ MRobot_Error_t MRobot_UnregisterDevice(const char *name); * @param help_text 帮助文本 * @param callback 命令回调函数 * @param param_count 参数个数(-1 表示可变参数) - * @return MRobot_Error_t 错误码 + * @return Putty_Error_t 错误码 */ -MRobot_Error_t MRobot_RegisterCommand(const char *command, const char *help_text, - MRobot_CommandCallback_t callback, int8_t param_count); +Putty_Error_t Putty_RegisterCommand(const char *command, const char *help_text, + Putty_CommandCallback_t callback, int8_t param_count); /** * @brief 获取已注册设备数量 * @return 设备数量 */ -uint8_t MRobot_GetDeviceCount(void); +uint8_t Putty_GetDeviceCount(void); /** * @brief 根据名称查找设备 * @param name 设备名称 * @return 设备指针,未找到返回 NULL */ -const MRobot_Device_t *MRobot_FindDevice(const char *name); +const Putty_Device_t *Putty_FindDevice(const char *name); /** - * @brief MRobot 主循环,在 CLI 任务中周期性调用 + * @brief Putty 主循环,在 CLI 任务中周期性调用 * @note 建议调用周期 10ms */ -void MRobot_Run(void); +void Putty_Run(void); /** * @brief 格式化输出到 CLI 终端(线程安全,支持浮点数) @@ -273,23 +273,23 @@ void MRobot_Run(void); * - %% : 百分号 * * @example - * MRobot_Printf("Euler: R=%.2f P=%.2f Y=%.2f\\r\\n", roll, pitch, yaw); + * Putty_Printf("Euler: R=%.2f P=%.2f Y=%.2f\\r\\n", roll, pitch, yaw); */ -int MRobot_Printf(const char *fmt, ...); +int Putty_Printf(const char *fmt, ...); /** * @brief 格式化到缓冲区(用于回调函数,支持浮点数) - * @note 格式说明符同 MRobot_Printf + * @note 格式说明符同 Putty_Printf * * @example * static int print_imu(const void *data, char *buf, size_t size) { * const BMI088_t *imu = (const BMI088_t *)data; - * return MRobot_Snprintf(buf, size, + * return Putty_Snprintf(buf, size, * " Accel: X=%.3f Y=%.3f Z=%.3f\\r\\n", * imu->accl.x, imu->accl.y, imu->accl.z); * } */ -int MRobot_Snprintf(char *buf, size_t size, const char *fmt, ...); +int Putty_Snprintf(char *buf, size_t size, const char *fmt, ...); /* Utility functions -------------------------------------------------------- */ @@ -303,10 +303,10 @@ int MRobot_Snprintf(char *buf, size_t size, const char *fmt, ...); * * @example * char buf[16]; - * MRobot_FormatFloat(buf, sizeof(buf), 3.14159f, 2); // "3.14" - * MRobot_FormatFloat(buf, sizeof(buf), -0.001f, 4); // "-0.0010" + * Putty_FormatFloat(buf, sizeof(buf), 3.14159f, 2); // "3.14" + * Putty_FormatFloat(buf, sizeof(buf), -0.001f, 4); // "-0.0010" */ -int MRobot_FormatFloat(char *buf, size_t size, float val, int precision); +int Putty_FormatFloat(char *buf, size_t size, float val, int precision); #ifdef __cplusplus }