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.
108 lines
4.0 KiB
108 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;
|
|
}
|
|
|