diff --git a/ceshi/template.c b/ceshi/template.c new file mode 100644 index 0000000..dbaa23f --- /dev/null +++ b/ceshi/template.c @@ -0,0 +1,108 @@ +#include +#include + +// 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; +}