Files
base/app/app_base.c
2025-08-26 10:53:01 +08:00

159 lines
5.1 KiB
C

#include "app_config.h"
#include "app_dependence.h"
#include "interface.h"
#include "app_base.h"
// 使用内联函数
static inline uint8_t setBaseOn(void) { return 1; }
static inline uint8_t setBaseOff(void) { return 0; }
BaseSystem base_data;
// 输出处理函数
static void baseOutput(void *signal_id)
{
(void)signal_id;
// 根据电机状态,填充发送数据结构,发送信号
switch (base_data.base_command)
{
case 1: // 上升状态
un_lifter_output.bit_data.cmd = BASE_UP;
un_h_bridge_output1.bit_data.channel_01 = setBaseOn();
un_h_bridge_output1.bit_data.channel_02 = setBaseOff();
un_h_bridge_output2.bit_data.channel_01 = setBaseOn();
un_h_bridge_output2.bit_data.channel_02 = setBaseOff();
// printf("base: up\n");
break;
case 2: // 下降状态
un_lifter_output.bit_data.cmd = BASE_DOWN;
un_h_bridge_output1.bit_data.channel_01 = setBaseOff();
un_h_bridge_output1.bit_data.channel_02 = setBaseOn();
un_h_bridge_output2.bit_data.channel_01 = setBaseOff();
un_h_bridge_output2.bit_data.channel_02 = setBaseOn();
// printf("base: down\n");
break;
default://停止
un_lifter_output.bit_data.cmd = BASE_STOP;
un_h_bridge_output1.bit_data.channel_01 = setBaseOff();
un_h_bridge_output1.bit_data.channel_02 = setBaseOff();
un_h_bridge_output2.bit_data.channel_01 = setBaseOff();
un_h_bridge_output2.bit_data.channel_02 = setBaseOff();
// printf("base: stop\n");
break;
}
publishMessage(&un_h_bridge_output1, 1);
publishMessage(&un_h_bridge_output2, 1);
publishMessage(&un_lifter_output, 1);
}
//处理开关以及模式状态。还需要保存状态防止重启的问题。
static void baseTimerProcess(void *signal_id)
{
(void)signal_id;
if( (base_data.emergency_stop_switch) || (base_data.remote_emergency_stop) )//急停只要有一个有效就停止
{
base_data.base_command = BASE_STOP;
}
else if(base_data.mode)//自动模式 一直上升就自动
{
if(base_data.input_data > REMOTE_DEADBAND)//上升
{
base_data.base_command = BASE_UP;
}
else if(base_data.input_data < -REMOTE_DEADBAND)//下降
{
base_data.base_command = BASE_DOWN;
}
else//不停止
{
}
}
else//手动模式-
{
if(base_data.input_data > REMOTE_DEADBAND)//上升
{
base_data.base_command = BASE_UP;
}
else if(base_data.input_data < -REMOTE_DEADBAND)//下降
{
base_data.base_command = BASE_DOWN;
}
else
{
base_data.base_command = BASE_STOP;
}
}
baseOutput(signal_id);
}
// 处理所有输入信号的函数
static void baseInput(void *signal_id)
{
// BaseSystem old_data = base_data; // 定义并初始化old_data
// 填充数据
if (signal_id == &un_sw_sample)
{
base_data.emergency_stop_switch = (uint8_t)un_sw_sample.bit_data.emergency_stop_switch;
base_data.Left_switch = (uint8_t)un_sw_sample.bit_data.Left_switch;
base_data.right_switch = (uint8_t)un_sw_sample.bit_data.right_switch;
}
else if ( (signal_id == &un_remote_control_input) && (1 == un_remote_control_input.bit_data.enable) )// 遥控器断线,不更新数据
{
base_data.remote_emergency_stop = ((uint8_t)un_remote_control_input.bit_data.switch_b == 1) ? 0 : 1;
base_data.mode = ((uint8_t)un_remote_control_input.bit_data.switch_c == 1) ? 1 : 0;//
}
else if( (signal_id == &un_remote_control_input1) && (1 == un_remote_control_input.bit_data.enable) )
{
base_data.input_data = (int16_t)(un_remote_control_input1.bit_data.speed) - REMOTE_ZERO;
// printf("un_remote_control_input1: %d\n", base_data.input_data);
}
else if (signal_id == &can_fault_info)
{
// base_data.remote_fault = !can_fault_info.bit_data.remote_state;
// base_data.can_bus_fault = !can_fault_info.bit_data.motor1_state || !can_fault_info.bit_data.motor2_state || !can_fault_info.bit_data.navigator_state;
}
else if (signal_id == &ethernet_fault_Info)
{
// base_data.ethernet_fault = !ethernet_fault_Info.bit_data.auto_state && !ethernet_fault_Info.bit_data.manual_state;
}
baseTimerProcess(signal_id);
}
// 修改APP模块的初始化函数
void baseAppInit(void)
{
// 初始化
memset(&base_data, 0, sizeof(BaseSystem));
// 初始化定时器
timerInit(&base_data.base_timer);
// 订阅输入信号,处理刹车逻辑
subscribe(&un_sw_sample, baseInput);
subscribe(&un_remote_control_input, baseInput);
subscribe(&un_remote_control_input1, baseInput);
printf("app_base: initial OK \n");
}