From 241bf50b3fc2d518fb0f70a076513fba6ebe469c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E7=90=AA?= Date: Mon, 27 Jul 2026 23:19:11 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9A=94=E7=A6=BB=E5=AF=B9=E7=A0=81=E9=97=AA?= =?UTF-8?q?=E7=83=81=E4=B8=8E=E7=81=AF=E5=85=89=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/ble/ble_peripheral/app/src/Mode.c | 2 +- .../ble/ble_peripheral/app/src/Rf433.c | 128 +++++++++--------- .../ble_peripheral/app/src/light_transition.c | 38 ++++++ .../ble_peripheral/app/src/light_transition.h | 2 + 4 files changed, 105 insertions(+), 65 deletions(-) diff --git a/project/example/ble/ble_peripheral/app/src/Mode.c b/project/example/ble/ble_peripheral/app/src/Mode.c index c925f08..50b5266 100644 --- a/project/example/ble/ble_peripheral/app/src/Mode.c +++ b/project/example/ble/ble_peripheral/app/src/Mode.c @@ -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); diff --git a/project/example/ble/ble_peripheral/app/src/Rf433.c b/project/example/ble/ble_peripheral/app/src/Rf433.c index 2ec8123..519c009 100644 --- a/project/example/ble/ble_peripheral/app/src/Rf433.c +++ b/project/example/ble/ble_peripheral/app/src/Rf433.c @@ -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) - Pairing_Candidate_Reset(); + { + 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; - ssse=1; - long_press_cnt=0; + 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,9 +459,9 @@ void rf433_receive(void)//rf433 rf_flag.rf_receive_flag.current_level = 1;//当前电平状态 } // - if(time_5s<=40000){ - time_5s++; - } + if(time_5s<=PAIRING_WINDOW_TICKS){ + time_5s++; + } } uint16_t spee_dealy_time=0; //速度缓慢变换 @@ -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;//记忆标志位 diff --git a/project/example/ble/ble_peripheral/app/src/light_transition.c b/project/example/ble/ble_peripheral/app/src/light_transition.c index 4ad7784..0d263b5 100644 --- a/project/example/ble/ble_peripheral/app/src/light_transition.c +++ b/project/example/ble/ble_peripheral/app/src/light_transition.c @@ -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; diff --git a/project/example/ble/ble_peripheral/app/src/light_transition.h b/project/example/ble/ble_peripheral/app/src/light_transition.h index 7505998..b3cb4cf 100644 --- a/project/example/ble/ble_peripheral/app/src/light_transition.h +++ b/project/example/ble/ble_peripheral/app/src/light_transition.h @@ -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