Files
test/app_brake.c
2025-07-05 20:11:15 +08:00

128 lines
4.3 KiB
C

#include "app_config.h"
//定义并初始化
BrakeSystem brake_system = {
.brake_timer = {0, 0, 0, 0, 0}, // 初始化 Timer 结构体
.brake_command = 0,
.brake_motor_state = 0,
.brake_command_in_progress = 0,
.emergency_stop_switch = 0,
.remote_emergency_stop = 0,
.remote_fault = 0,
.can_bus_fault = 0,
.ethernet_fault = 0,
.mode_signal = 0
};
// 处理所有输入信号的函数
static void processInputSignals(void *signal_id)
{
(void)signal_id; // 标记变量为已使用,避免编译器警告
// 如果当前有刹车命令在执行,忽略新的输入信号
if (brake_system.brake_command_in_progress)
{
return;
}
if (brake_system.emergency_stop_switch || brake_system.remote_emergency_stop ||
(brake_system.mode_signal == 0 && brake_system.remote_fault) || // 手动模式下的遥控器故障
(brake_system.mode_signal == 1 && (brake_system.can_bus_fault || brake_system.ethernet_fault))) // 自动模式下的CAN总线或以太网通信故障
{
brake_system.brake_command = 1; // 发送刹车指令
publishMessage(&brake_system.brake_command, 1);
brake_system.brake_command_in_progress = 1; // 标记刹车命令正在执行
}
else
{
brake_system.brake_command = 2; // 发送释放刹车指令
publishMessage(&brake_system.brake_command, 1);
brake_system.brake_command_in_progress = 1; // 标记释放命令正在执行
}
}
// 刹车信号处理函数
static void brakeProcess(void *signal_id)
{
(void)signal_id; // 标记变量为已使用,避免编译器警告
int signal = *(int *)signal_id;
if (signal == 1) // 刹车
{
brake_system.brake_motor_state = 1;
publishMessage(&brake_system.brake_motor_state, 1); // 状态改变时发送刹车电机状态信号
timerInit(&brake_system.brake_timer, 1500); // 控制刹车电机前进,保持1.5秒
}
else if (signal == 2) // 释放刹车
{
brake_system.brake_motor_state = 2;
publishMessage(&brake_system.brake_motor_state, 1); // 状态改变时发送刹车电机状态信号
timerInit(&brake_system.brake_timer, 800); // 控制刹车电机后退,保持0.8秒
}
timerStart(&brake_system.brake_timer);
}
// 定时器信号处理函数
static void brakeTimerProcess(void *signal_id)
{
(void)signal_id; // 标记变量为已使用,避免编译器警告
brake_system.brake_motor_state = 0;
brake_system.brake_command_in_progress = 0; // 刹车命令执行完成,重置状态
publishMessage(&brake_system.brake_motor_state, 1); // 状态改变时发送刹车电机状态信号
}
// 输出处理函数
static void outputProcess(void *signal_id)
{
(void)signal_id; // 标记变量为已使用,避免编译器警告
//根据电机状态,填充发送数据结构,发送信号
switch (brake_system.brake_motor_state) {
case 1: // 电机前进状态
UnHBridgeOutput.brake_motor1 = 0;
UnHBridgeOutput.brake_motor2 = 1;
UnHBridgeOutput.sleep_01 = 0;
break;
case 2: // 电机后退状态
UnHBridgeOutput.brake_motor1 = 1;
UnHBridgeOutput.brake_motor2 = 0;
UnHBridgeOutput.sleep_01 = 0;
break;
default:
UnHBridgeOutput.brake_motor1 = 0;
UnHBridgeOutput.brake_motor2 = 0;
UnHBridgeOutput.sleep_01 = 0;
break;
}
publishMessage(&UnHBridgeOutput, 1);
}
// APP模块的初始化
void brakeAppInit(void)
{
// 初始化定时器,使用 brake_timer 的地址作为信号ID
timerInit(&brake_system.brake_timer, 0);
// 订阅刹车命令
subscribe(&brake_system.brake_command, brakeProcess);
// 订阅定时器信号,用于停止电机
subscribe(&brake_system.brake_timer, brakeTimerProcess);
// 订阅电机状态
subscribe(&brake_system.brake_motor_state, outputProcess);
// 订阅输入信号,处理刹车逻辑
subscribe(&UnSwSample, processInputSignals);
subscribe(&UnRemoteControlInput, processInputSignals);
subscribe(&brake_system.remote_fault, processInputSignals);
subscribe(&brake_system.can_bus_fault, processInputSignals);
subscribe(&brake_system.ethernet_fault, processInputSignals);
subscribe(&brake_system.mode_signal, processInputSignals);
}