第一次提交
This commit is contained in:
127
app_brake.c
Normal file
127
app_brake.c
Normal file
@@ -0,0 +1,127 @@
|
||||
#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);
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user