第一次提交,修改保存刷写上位机IP
This commit is contained in:
227
app/app_light.c
Normal file
227
app/app_light.c
Normal 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");
|
||||
}
|
||||
Reference in New Issue
Block a user