You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
4.0 KiB

#include <stdint.h>
#include <stdbool.h>
// 1. 通用函数指针类型集合
typedef void (*Func_RetVoid_ParamVoid)(void);
typedef void (*Func_RetVoid_ParamInt32)(int32_t);
typedef bool (*Func_RetBool_ParamVoid)(void);
typedef bool (*Func_RetBool_ParamInt32)(int32_t);
// 2.1 基础控制功能
typedef enum {
CTRL_ENTER_AUTO_MODE, // 进入自动模式
CTRL_ENTER_MANUAL_MODE, // 进入手动模式
CTRL_START_MOVE, // 开始运动
CTRL_LANE_CHANGE, // 换道
CTRL_DIR_ADJUST, // 方向调整
CTRL_FUNC_MAX // 基础控制功能数量
} RobotCtrlFuncType;
// 2.2 状态检测功能
typedef enum {
CHECK_BATTERY, // 检测电池状态
CHECK_SENSOR, // 检测传感器状态
CHECK_COMM, // 检测通信状态
CHECK_FUNC_MAX // 状态检测功能数量
} RobotCheckFuncType;
// 3. 通用函数指针载体
typedef void* GenericFuncPtr;
// 4. 声明所有业务函数
// 基础控制函数
void AutoDriveMode(void);
void ManualDriveMode(void);
void StartMove(void);
bool LaneChange(int32_t lane_num);
bool DirAdjust(void);
// 状态检测函数
bool CheckBatteryStatus(void);
bool CheckSensorStatus(int32_t sensor_id);
void CheckCommStatus(void);
// 5. 重构函数向量表结构体:包含多组功能数组
typedef struct {
GenericFuncPtr ctrl_funcs[CTRL_FUNC_MAX]; // 基础控制函数数组
GenericFuncPtr check_funcs[CHECK_FUNC_MAX]; // 状态检测函数数组
// 可继续扩展:如 alarm_funcs[ALARM_FUNC_MAX] 告警函数数组
} RobotControlTable;
// 6. 定义默认的函数向量表实例(初始化多组数组)
const RobotControlTable DEFAULT_ROBOT_TABLE = {
// 初始化基础控制函数数组
.ctrl_funcs = {
[CTRL_ENTER_AUTO_MODE] = (GenericFuncPtr)(Func_RetVoid_ParamVoid)AutoDriveMode,
[CTRL_ENTER_MANUAL_MODE] = (GenericFuncPtr)(Func_RetVoid_ParamVoid)ManualDriveMode,
[CTRL_START_MOVE] = (GenericFuncPtr)(Func_RetVoid_ParamVoid)StartMove,
[CTRL_LANE_CHANGE] = (GenericFuncPtr)(Func_RetBool_ParamInt32)LaneChange,
[CTRL_DIR_ADJUST] = (GenericFuncPtr)(Func_RetBool_ParamVoid)DirAdjust
},
// 初始化状态检测函数数组
.check_funcs = {
[CHECK_BATTERY] = (GenericFuncPtr)(Func_RetBool_ParamVoid)CheckBatteryStatus,
[CHECK_SENSOR] = (GenericFuncPtr)(Func_RetBool_ParamInt32)CheckSensorStatus,
[CHECK_COMM] = (GenericFuncPtr)(Func_RetVoid_ParamVoid)CheckCommStatus
}
};
// 7. 业务逻辑函数:调用多组功能数组的函数
void robot_run(RobotControlTable *table) {
if (table == NULL) return;
// ========== 调用基础控制函数 ==========
((Func_RetVoid_ParamVoid)table->ctrl_funcs[CTRL_ENTER_AUTO_MODE])();
((Func_RetVoid_ParamVoid)table->ctrl_funcs[CTRL_START_MOVE])();
if (((Func_RetBool_ParamInt32)table->ctrl_funcs[CTRL_LANE_CHANGE])(1)) {
((Func_RetBool_ParamVoid)table->ctrl_funcs[CTRL_DIR_ADJUST])();
}
// ========== 调用状态检测函数 ==========
// 检测电池状态
if (((Func_RetBool_ParamVoid)table->check_funcs[CHECK_BATTERY])()) {
// 电池正常,检测传感器(传入传感器ID 0)
if (((Func_RetBool_ParamInt32)table->check_funcs[CHECK_SENSOR])(0)) {
// 传感器正常,检测通信状态
((Func_RetVoid_ParamVoid)table->check_funcs[CHECK_COMM])();
}
}
}
// 8. 具体函数实现
// 基础控制函数
void AutoDriveMode(void) {}
void ManualDriveMode(void) {}
void StartMove(void) {}
bool LaneChange(int32_t lane_num) { (void)lane_num; return true; }
bool DirAdjust(void) { return true; }
// 状态检测函数
bool CheckBatteryStatus(void) { return true; } // 电池正常
bool CheckSensorStatus(int32_t sensor_id) { (void)sensor_id; return true; } // 传感器正常
void CheckCommStatus(void) {} // 通信检测逻辑
// 9. 主函数:调用逻辑不变
int main() {
robot_run((RobotControlTable*)&DEFAULT_ROBOT_TABLE);
return 0;
}