126 lines
3.9 KiB
C
126 lines
3.9 KiB
C
/*基于freertos_cli实现的虚拟命令行
|
||
自身作为一个设备存在,通过串口和上位机进行交互,获得类似命令行的体验,
|
||
例如输入help可以获得帮助
|
||
输出htop 可以获得freertos任务状态等信息
|
||
|
||
通过cd可以切换目录
|
||
目录结构是
|
||
/ (root)
|
||
|-- /dev
|
||
|-- bmi088
|
||
|-- chassis_motor1
|
||
|-- /modules
|
||
|-- balance_chassis
|
||
|-- gimbal
|
||
|-- shoot
|
||
在dev里可以用show命令查看设备信息
|
||
modules暂无实现
|
||
|
||
至于dev里的设备有哪些,需要通过一个函数MRobot_RegisterDevices(设备名(字符串),结构体指针)来注册设备,我可以在任何一个任务里调用这个函数。
|
||
然后我在我的一个单独的线程里打印和发送他们。
|
||
例如我在atti_esit任务里注册了bmi088和他的结构体,我在cli线程里需要能够打印bmi088的数据。
|
||
然后我在show的时候就可以看到imu的数据了,
|
||
*/
|
||
|
||
#pragma once
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/* Includes ----------------------------------------------------------------- */
|
||
#include <stdint.h>
|
||
#include <stdbool.h>
|
||
#include "component/ahrs.h"
|
||
#include "device/device.h"
|
||
|
||
/* Exported constants ------------------------------------------------------- */
|
||
#define MROBOT_MAX_DEVICES 32
|
||
#define MROBOT_MAX_CMD_LEN 128
|
||
#define MROBOT_MAX_OUTPUT_LEN 512
|
||
#define MROBOT_RX_BUFFER_SIZE 256
|
||
|
||
/* Exported types ----------------------------------------------------------- */
|
||
typedef enum {
|
||
MROBOT_DEVICE_TYPE_IMU,
|
||
MROBOT_DEVICE_TYPE_MOTOR,
|
||
MROBOT_DEVICE_TYPE_SENSOR,
|
||
MROBOT_DEVICE_TYPE_CUSTOM,
|
||
} MRobot_DeviceType_t;
|
||
|
||
/* 设备打印回调函数类型 */
|
||
typedef void (*MRobot_PrintCallback_t)(void *device_data, char *buffer, uint16_t buffer_size);
|
||
|
||
/* 注册的设备结构 */
|
||
typedef struct {
|
||
char name[32];
|
||
MRobot_DeviceType_t type;
|
||
void *data; /* 指向实际设备数据的指针 */
|
||
MRobot_PrintCallback_t print_callback; /* 打印设备信息的回调函数 */
|
||
} MRobot_Device_t;
|
||
|
||
/* 设备模板结构体 - 使用 AHRS 标准结构 */
|
||
typedef struct {
|
||
DEVICE_Header_t header;
|
||
AHRS_Accl_t accl; /* 加速度 m/s² */
|
||
AHRS_Gyro_t gyro; /* 角速度 rad/s */
|
||
AHRS_Eulr_t euler; /* 欧拉角 rad */
|
||
AHRS_Quaternion_t quat; /* 四元数 */
|
||
float temp; /* 温度 °C */
|
||
} DEVICE_IMU_t;
|
||
|
||
typedef struct {
|
||
float rotor_abs_angle; /* 转子绝对角度 */
|
||
float rotor_speed; /* 实际转子转速 */
|
||
float torque_current; /* 转矩电流 */
|
||
float temp; /* 温度 */
|
||
} DEVICE_MOTOR_Feedback_t;
|
||
|
||
typedef struct {
|
||
DEVICE_Header_t header;
|
||
bool reverse; /* 是否反装 true表示反装 */
|
||
DEVICE_MOTOR_Feedback_t feedback;
|
||
} DEVICE_MOTOR_t;
|
||
|
||
/* Exported functions ------------------------------------------------------- */
|
||
|
||
/**
|
||
* @brief 初始化 MRobot 命令行系统(包含 UART 初始化)
|
||
*/
|
||
void MRobot_Init(void);
|
||
|
||
/**
|
||
* @brief 注册设备到 MRobot 系统
|
||
* @param name 设备名称
|
||
* @param type 设备类型
|
||
* @param data 指向设备数据结构的指针
|
||
* @param print_callback 打印设备信息的回调函数
|
||
* @retval 0 成功, -1 失败
|
||
*/
|
||
int8_t MRobot_RegisterDevice(const char *name, MRobot_DeviceType_t type,
|
||
void *data, MRobot_PrintCallback_t print_callback);
|
||
|
||
/**
|
||
* @brief 注册 IMU 设备到 MRobot(使用通用打印函数)
|
||
* @param name 设备名称
|
||
* @param imu_device 指向 DEVICE_IMU_t 结构的指针
|
||
* @retval 0 成功, -1 失败
|
||
*/
|
||
int8_t MRobot_RegisterIMU(const char *name, void *imu_device);
|
||
|
||
/**
|
||
* @brief 注册电机设备到 MRobot(使用通用打印函数)
|
||
* @param name 设备名称
|
||
* @param motor 指向 MOTOR_t 结构的指针
|
||
* @retval 0 成功, -1 失败
|
||
*/
|
||
int8_t MRobot_RegisterMotor(const char *name, void *motor);
|
||
|
||
/**
|
||
* @brief MRobot 主循环,在 CLI 任务中调用
|
||
*/
|
||
void MRobot_Run(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif |