228 lines
7.5 KiB
C
228 lines
7.5 KiB
C
#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");
|
||
}
|