1 changed files with 108 additions and 0 deletions
@ -0,0 +1,108 @@ |
|||||
|
#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; |
||||
|
} |
||||
Loading…
Reference in new issue