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

241 lines
8.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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_output1.bit_data.KGF05 = state_value;
un_inf_can_kgf_output1.bit_data.KGF06 = state_value;
un_inf_can_kgf_output1.bit_data.KGF10 = state_value;
un_inf_can_kgf_output1.bit_data.KGF11 = state_value;
break;
case LIGHT_TAIL://尾灯后面4个灯
un_inf_can_kgf_output2.bit_data.KGF12 = state_value;
un_inf_can_kgf_output2.bit_data.KGF13 = state_value;
un_inf_can_kgf_output2.bit_data.KGF14 = state_value;
un_inf_can_kgf_output2.bit_data.KGF15 = state_value;
break;
case LIGHT_LEFT_TURN://左转向左边4个灯
un_inf_can_kgf_output1.bit_data.KGF06 = state_value;
un_inf_can_kgf_output1.bit_data.KGF11 = state_value;
un_inf_can_kgf_output2.bit_data.KGF12 = state_value;
un_inf_can_kgf_output2.bit_data.KGF13 = state_value;
break;
case LIGHT_RIGHT_TURN://右转向灯右边4个灯
un_inf_can_kgf_output1.bit_data.KGF05 = state_value;
un_inf_can_kgf_output1.bit_data.KGF10 = state_value;
un_inf_can_kgf_output2.bit_data.KGF14 = state_value;
un_inf_can_kgf_output2.bit_data.KGF15 = state_value;
break;
case LIGHT_BRAKE://刹车灯,四个黄灯
un_inf_can_kgf_output1.bit_data.KGF10 = state_value;
un_inf_can_kgf_output1.bit_data.KGF11 = state_value;
un_inf_can_kgf_output2.bit_data.KGF13 = state_value;
un_inf_can_kgf_output2.bit_data.KGF15 = state_value;
break;
case LIGHT_ALARM://报警灯,四个红灯
un_inf_can_kgf_output1.bit_data.KGF05 = state_value;
un_inf_can_kgf_output1.bit_data.KGF06 = state_value;
un_inf_can_kgf_output2.bit_data.KGF12 = state_value;
un_inf_can_kgf_output2.bit_data.KGF14 = 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");
}