128 lines
4.5 KiB
C
128 lines
4.5 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);
|
|
|
|
|
|
}
|