第一次提交,修改保存刷写上位机IP

This commit is contained in:
2025-09-07 19:16:08 +08:00
commit 8242f618d1
58 changed files with 10917 additions and 0 deletions

227
app/app_light.c Normal file
View File

@@ -0,0 +1,227 @@
#include "app_config.h"
#include "interface.h"
#include "app_frm_monitor.h"
#include "app_frm_signal.h"
#include "app_frm_timer.h"
#include "app_param_manage.h"
#include "app_light.h"
#include "app_power.h"
// 声明 light_data 变量
LightSystem light_data;
// ... existing code ...
// 定义灯光按钮状态枚举
typedef enum {
BUTTON_STATE_INITIAL,
BUTTON_STATE_SHORT_PRESS,
BUTTON_STATE_DOUBLE_PRESS_DETECTED,
BUTTON_STATE_SECOND_PRESS_DETECTED
} LightButtonState;
// 定义灯光按钮结构体
typedef struct {
LightButtonState state;
uint32_t press_start_time;
uint32_t release_start_time;
uint8_t is_light_on;
Timer timer;
} LightButton;
// 全局变量
static LightButton light_button = {BUTTON_STATE_INITIAL, 0, 0, 0, {0}};
static uint8_t power_state = 0;
// 灯光按钮处理函数
static void handleLightButton(void)
{
switch (light_button.state)
{
case BUTTON_STATE_INITIAL:
if (light_data.light_switch == app_close())
{
light_button.state = BUTTON_STATE_SHORT_PRESS;
timerStart(&light_button.timer, 300, 0); // 启动短按定时器300ms
}
break;
case BUTTON_STATE_SHORT_PRESS:
if (light_data.light_switch == app_open())
{
if (light_button.timer.active) // 定时器未到期,短按完成,等待双击
{
light_button.state = BUTTON_STATE_DOUBLE_PRESS_DETECTED;
timerStart(&light_button.timer, 300, 0); // 启动双击等待定时器300ms
}
}
else if (!light_button.timer.active) // 短按定时器到期,重置为初始状态
{
light_button.state = BUTTON_STATE_INITIAL;
}
break;
case BUTTON_STATE_DOUBLE_PRESS_DETECTED:
if (light_data.light_switch == app_close())
{
light_button.state = BUTTON_STATE_SECOND_PRESS_DETECTED;
timerStart(&light_button.timer, 300, 0); // 启动第二次按下定时器300ms
}
else if (!light_button.timer.active) // 双击等待定时器到期,重置为初始状态
{
light_button.state = BUTTON_STATE_INITIAL;
}
break;
case BUTTON_STATE_SECOND_PRESS_DETECTED:
if (light_data.light_switch == app_open())
{
if (!light_button.timer.active) // 第二次按下完成,切换灯光状态
{
light_button.is_light_on = !light_button.is_light_on;
printf("LightButton: is_light_on = %d\n", light_button.is_light_on);
light_button.state = BUTTON_STATE_INITIAL;
}
}
else if (!light_button.timer.active) // 第二次按下定时器到期,重置为初始状态
{
light_button.state = BUTTON_STATE_INITIAL;
}
break;
default:
light_button.state = BUTTON_STATE_INITIAL;
break;
}
}
// 灯光输出处理函数
static void lightOutput(void *signal_id)
{
(void)signal_id;
// 根据当前状态,控制各个灯光
for (int32_t i = 0; i < LIGHT_COUNT; i++)
{
uint8_t state_value = (light_data.states[i] == LIGHT_ON) ? setLightOn() : setLightOff();
// 先判断灯光类型并设置状态
switch (i)
{//正常所有灯光熄灭
case LIGHT_HEAD://头灯前面4个灯
un_inf_can_kgf_output2.bit_data.KGF07 = state_value;
un_inf_can_kgf_output2.bit_data.KGF09 = state_value;
break;
case LIGHT_TAIL://尾灯后面4个灯
un_inf_can_kgf_output2.bit_data.KGF11 = state_value;
un_inf_can_kgf_output2.bit_data.KGF13 = state_value;
break;
case LIGHT_LEFT_TURN://左转向左边4个灯
un_inf_can_kgf_output2.bit_data.KGF08 = state_value;
un_inf_can_kgf_output2.bit_data.KGF12 = state_value;
break;
case LIGHT_RIGHT_TURN://右转向灯右边4个灯
un_inf_can_kgf_output2.bit_data.KGF10 = state_value;
un_inf_can_kgf_output2.bit_data.KGF14 = state_value;
break;
case LIGHT_BRAKE://刹车灯,四个黄灯
un_inf_can_kgf_output2.bit_data.KGF11 = state_value;
un_inf_can_kgf_output2.bit_data.KGF13 = state_value;
break;
case LIGHT_ALARM://报警灯,四个红灯
un_inf_can_kgf_output2.bit_data.KGF11 = state_value;
un_inf_can_kgf_output2.bit_data.KGF13 = state_value;
break;
}
}
// 灯的状态有变化就存入参数一个灯对应一位共6位
for (int32_t i = 0; i < LIGHT_COUNT; i++)
{
light_data.light_state |= (light_data.states[i] << i);
}
if (light_data.light_state != light_data.old_light_state)
{
setParam("lightSt", (float)light_data.light_state);
light_data.old_light_state = light_data.light_state;
}
publishMessage(&un_inf_can_kgf_output1, 1);
}
// 灯光状态处理函数
static void lightProcess(void *signal_id)
{
(void)signal_id;
if(0 != power_state)//处于非掉电模式才能打开
{
// 调用按钮处理函数
handleLightButton();
}
else
{
light_button.state = BUTTON_STATE_INITIAL;//一直保持初始化模式
light_button.is_light_on = LIGHT_OFF;//一直关闭
}
// 根据双击标志控制灯光输出,相当于灯光总开关
for (int32_t i = 0; i < LIGHT_COUNT; i++)
{
light_data.states[i] = (LightState)(light_button.is_light_on);
}
lightOutput(NULL);
timerStart(&light_data.timer_function, 100, 1);
}
// 处理输入信号的函数
static void lightInput(void *signal_id)
{
// LightSystem old_data = light_data;
// 填充数据
if ( (signal_id == &un_remote_control_input) && (1 == un_remote_control_input.bit_data.enable) )// 遥控器断线,不更新数据
{
// 保存遥控器输入开关状态
light_data.light_switch = un_remote_control_input.bit_data.switch_d ? LIGHT_ON : LIGHT_OFF;
}
else if(signal_id == &power_data)
{
power_state = power_data.current_state;
}
}
// APP模块的初始化
void lightAppInit(void)
{
// 初始化时恢复灯光状态
light_data.light_state = (uint8_t)getParam("lightSt");
light_data.old_light_state = light_data.light_state;
// 根据灯光状态恢复灯光
for (int32_t i = 0; i < LIGHT_COUNT; i++)
{
light_data.states[i] = (LightState)( (light_data.light_state >> i) & 1 );
}
// 初始化
memset(&light_data, 0, sizeof(LightSystem));
for (int32_t i = 0; i < LIGHT_COUNT; i++)
{
light_data.states[i] = LIGHT_OFF;
light_data.brightness[i] = 255; // 默认最大亮度
light_data.blink_state[i] = 0; // 初始化闪烁状态
light_data.blink_interval[i] = 500; // 默认闪烁间隔500ms
}
// 订阅输入信号,处理灯光逻辑
subscribe(&un_remote_control_input, lightInput);
subscribe(&power_data, lightInput);
// 订阅定时器
subscribe(&light_data.timer_function, lightProcess);
timerStart(&light_data.timer_function, 500, 1);
printf("app_light: initial OK \n");
}