隔离对码闪烁与灯光状态

This commit is contained in:
2026-07-27 23:19:11 +08:00
parent b85b15df17
commit 241bf50b3f
4 changed files with 105 additions and 65 deletions
@@ -364,7 +364,7 @@ pfunc modefunctin[] = { //ģʽ
Mode3,
};
void choice_mode(){
if(Light_Transition_ModeActive) return;
if(Light_Transition_ModeActive || Light_Transition_FeedbackActive()) return;
if (!timer1.active && timer1.count == 0){
if(Mode==mode0){
startTimer(&timer1,1);
@@ -90,18 +90,18 @@ static uint8_t pairing_feedback_on;
static uint8_t pairing_feedback_transitions;
static uint16_t pairing_feedback_elapsed_ms;
static uint16_t pairing_feedback_interval_ms;
static uint8_t pairing_saved_status;
static uint8_t pairing_saved_mode;
static uint8_t pairing_saved_brightness;
static uint16_t pairing_saved_w;
static uint16_t pairing_saved_c;
static uint16_t pairing_saved_w_duty;
static uint16_t pairing_saved_c_duty;
static uint8_t pair_deferred_command;
static uint8_t pair_deferred_res_data;
static uint32_t pair_deferred_receive_data;
static uint8_t pair_command_replay;
#define PAIR_HOLD_FRAME_COUNT 4U
#define PAIR_FRAME_SILENCE_TICKS 100U
#define PAIRING_WINDOW_TICKS 50000UL
uint8_t long_flag_s=0;
void _433_fun(void);
// 在固定大小数组中添加新元素(滑动窗口)
void addToFixedArray(uint8_t arr[], uint8_t newValue) {
uint8_t i;
@@ -116,53 +116,16 @@ void addToFixedArray(uint8_t arr[], uint8_t newValue) {
static void Pairing_Feedback_Apply(uint8_t on)
{
Mode = mode0;
W_PWM = 100U;
C_PWM = 0U;
Brightness = BRIGHTNESS_MAX_PERCENT;
if(on)
{
Start_PWM();
Light_Transition_SyncBrightness(BRIGHTNESS_MAX_PERCENT);
W_PWM_duty = 100U;
C_PWM_duty = 0U;
}
else
{
Light_Transition_SyncBrightness(0U);
W_PWM_duty = 0U;
C_PWM_duty = 0U;
Stop_PWM();
Light_Transition_FadeActive = 0U;
Bridge_Off();
}
Light_Transition_SetFeedback(1U, on);
}
static void Pairing_Feedback_Restore(void)
{
W_PWM = pairing_saved_w;
C_PWM = pairing_saved_c;
Brightness = pairing_saved_brightness;
Mode = pairing_saved_mode;
Light_Transition_SyncBrightness(
pairing_saved_status == POWERON ? pairing_saved_brightness : 0U);
W_PWM_duty = pairing_saved_w_duty;
C_PWM_duty = pairing_saved_c_duty;
if(pairing_saved_status == POWERON)
Light_Transition_SetFeedback(0U, 0U);
if(deviceStatus == POWERON)
{
Start_PWM();
}
else
{
Stop_PWM();
if(W_PWM_duty == 0U && C_PWM_duty == 0U)
{
Light_Transition_FadeActive = 0U;
Bridge_Off();
}
Light_Transition_BeginModeChange();
startTimer(&timer1, 1U);
}
}
@@ -170,13 +133,7 @@ static void Pairing_Feedback_Start(uint16_t interval_ms)
{
if(pairing_feedback_active) return;
pairing_saved_status = deviceStatus;
pairing_saved_mode = Mode;
pairing_saved_brightness = Brightness;
pairing_saved_w = W_PWM;
pairing_saved_c = C_PWM;
pairing_saved_w_duty = W_PWM_duty;
pairing_saved_c_duty = C_PWM_duty;
pair_deferred_command = 0U;
pairing_feedback_active = 1U;
pairing_feedback_on = 1U;
@@ -206,6 +163,32 @@ static void Pairing_Feedback_Task(void)
pairing_feedback_on = pairing_feedback_on ? 0U : 1U;
Pairing_Feedback_Apply(pairing_feedback_on);
}
static uint8_t Pairing_IsTriggerCommand(uint8_t command)
{
return command == Brightness_H || command == Brightness_L ||
command == B_Brightness_H || command == B_Brightness_L ||
command == F_Brightness_10 || command == F_Brightness_100;
}
static void Pairing_Replay_Deferred(void)
{
uint8_t current_res_data;
uint32_t current_receive_data;
if(!pair_deferred_command) return;
current_res_data = res_data;
current_receive_data = receive_data;
res_data = pair_deferred_res_data;
receive_data = pair_deferred_receive_data;
pair_deferred_command = 0U;
pair_command_replay = 1U;
_433_fun();
pair_command_replay = 0U;
res_data = current_res_data;
receive_data = current_receive_data;
}
static void Pairing_Candidate_Reset(void)
{
long_press_cnt = 0U;
@@ -214,6 +197,7 @@ static void Pairing_Candidate_Reset(void)
pair_candidate_valid = 0U;
pair_alternate_count = 0U;
pair_frame_silence_ticks = 0U;
pair_deferred_command = 0U;
}
@@ -224,12 +208,17 @@ static void Encoder_key_NoCode(){
if(pair_frame_silence_ticks < 0xffU) pair_frame_silence_ticks++;
if(pair_frame_silence_ticks > PAIR_FRAME_SILENCE_TICKS)
{
if(pair_candidate_valid &&
long_press_cnt < PAIR_HOLD_FRAME_COUNT)
Pairing_Replay_Deferred();
Pairing_Candidate_Reset();
}
if(rf_frame_sequence == pair_last_frame_sequence) return;
pair_last_frame_sequence = rf_frame_sequence;
if(ssse != 0U || time_5s > 50000U) return;
if(ssse != 0U || time_5s > PAIRING_WINDOW_TICKS) return;
if(!(res_data==Brightness_H||res_data==Brightness_L||
res_data==B_Brightness_H||res_data==B_Brightness_L||
res_data==F_Brightness_10||res_data==F_Brightness_100))
@@ -273,9 +262,10 @@ static void Encoder_key_NoCode(){
}
if(long_press_cnt>=PAIR_HOLD_FRAME_COUNT){
time_5s=50011;
time_5s=PAIRING_WINDOW_TICKS + 1U;
ssse=1;
long_press_cnt=0;
pair_deferred_command=0U;
if(res_data==Brightness_H||res_data==B_Brightness_H||res_data==F_Brightness_10){
adress=receive_data >>8;
@@ -469,7 +459,7 @@ void rf433_receive(void)//rf433
rf_flag.rf_receive_flag.current_level = 1;//当前电平状态
}
//
if(time_5s<=40000){
if(time_5s<=PAIRING_WINDOW_TICKS){
time_5s++;
}
}
@@ -480,6 +470,16 @@ uint16_t spee_dealy_time=0; //
#define REMOTE_MODE_MAX 9U
void _433_fun(){
if(Light_Transition_FeedbackActive()) return;
if(!pair_command_replay && ssse == 0U &&
time_5s <= PAIRING_WINDOW_TICKS &&
Pairing_IsTriggerCommand(res_data))
{
pair_deferred_command = 1U;
pair_deferred_res_data = res_data;
pair_deferred_receive_data = receive_data;
return;
}
if(Key_TypeDef.KEY_STATE_Click==1||KEY_STATE_re==1) return;
set_click();
sss=1;//记忆标志位
@@ -86,6 +86,8 @@ static uint8_t transition_sync_pending;
static uint16_t mode_transition_start_w;
static uint16_t mode_transition_start_c;
static uint8_t mode_transition_tick;
static volatile uint8_t feedback_active;
static volatile uint8_t feedback_on;
static uint16_t brightness_scale_for_level(uint8_t level)
{
@@ -262,6 +264,27 @@ void Light_Transition_BeginModeChange(void)
Light_Transition_ModeActive = 1U;
}
void Light_Transition_SetFeedback(uint8_t active, uint8_t on)
{
feedback_active = active ? 1U : 0U;
feedback_on = (active && on) ? 1U : 0U;
if(feedback_active)
{
W_PWM_duty = feedback_on ? LIGHT_OUTPUT_SCALE : 0U;
C_PWM_duty = 0U;
Light_Transition_W_Output_Q12 =
feedback_on ? ((uint32_t)LIGHT_OUTPUT_SCALE << 12) : 0U;
Light_Transition_C_Output_Q12 = 0U;
Light_Transition_FadeActive = 1U;
}
}
uint8_t Light_Transition_FeedbackActive(void)
{
return feedback_active;
}
void Light_Transition_Task(void)
{
uint8_t powered_on = deviceStatus != POWEROFF;
@@ -278,6 +301,21 @@ void Light_Transition_Task(void)
uint32_t scaled_c_q12;
uint8_t power_transitioning;
/*
* Pairing/clear feedback is an output-only overlay. Keep all normal
* brightness, color, mode and power state untouched while it is active.
*/
if(feedback_active)
{
W_PWM_duty = feedback_on ? LIGHT_OUTPUT_SCALE : 0U;
C_PWM_duty = 0U;
Light_Transition_W_Output_Q12 =
feedback_on ? ((uint32_t)LIGHT_OUTPUT_SCALE << 12) : 0U;
Light_Transition_C_Output_Q12 = 0U;
Light_Transition_FadeActive = 1U;
return;
}
if(!powered_on)
Light_Transition_ModeActive = 0U;
@@ -14,5 +14,7 @@ extern volatile uint32_t Light_Transition_C_Output_Q12;
void Light_Transition_Task(void);
void Light_Transition_SyncBrightness(uint8_t level);
void Light_Transition_BeginModeChange(void);
void Light_Transition_SetFeedback(uint8_t active, uint8_t on);
uint8_t Light_Transition_FeedbackActive(void);
#endif