#include <stdint.h>
2
3// ========================
4// 定义枚举类型(示例)
5// ========================
6typedef enum {
7 GEAR_N = 0, // 空档
8 GEAR_R = 14, // 倒档
9 GEAR_1 = 1,
10 GEAR_2 = 2,
11 GEAR_3 = 3,
12 GEAR_4 = 4,
13 GEAR_5 = 5,
14 GEAR_6 = 6,
15 GEAR_7 = 7,
16 GEAR_8 = 8,
17 GEAR_SHIFTING = 15 // 换挡中
18} TCU_Gear_E;
// ========================
// 函数接口声明
// ========================
extern uint8_t VHAL_TCUGear_enum; // 外部输入:TCU 实际档位
extern int8_t KINP_TCUGearMin_enum; // 最小允许档位(例如 0)
extern int8_t KINP_TCUGearMax_enum; // 最大允许档位(例如 8)
// ========================
// 内部变量(模拟 Z⁻¹ 记忆单元)
// ========================
static TCU_Gear_E VINP_TCUGear_enum_mem = GEAR_N; // 初始为空档
// ========================
// 主函数:档位处理逻辑
// ========================
TCU_Gear_E VINP_TCUGear_enum(void) {
TCU_Gear_E current_input;
TCU_Gear_E filtered_input;
TCU_Gear_E final_output;
// Step 1: 获取当前输入并预处理
if (VHAL_TCUGear_enum == 14) {
current_input = -1;
} else if (VHAL_TCUGear_enum == 0) {
current_input = GEAR_N; // 无效输入设为空档
}
else if (VHAL_TCUGear_enum == -1) {
current_input = GEAR_N; // 无效输入设为空档
} else if (VHAL_TCUGear_enum == GEAR_SHIFTING) {//15
current_input = VINP_TCUGear_enum_mem; // 换挡中时维持上一档
} else {
current_input = (TCU_Gear_E)VHAL_TCUGear_enum;
}
// Step 2: 边界检查
if (current_input >= KINP_TCUGearMin_enum && current_input <= KINP_TCUGearMax_enum) {
filtered_input = current_input;
} else {
filtered_input = GEAR_N; // 超出范围则置为空档
}
// Step 3: 更新记忆变量(模拟 Z⁻¹)
final_output = filtered_input;
VINP_TCUGear_enum_mem = final_output;
return final_output;
}