#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"); }