修复遥控对码和速度同步

This commit is contained in:
2026-07-27 11:30:34 +08:00
parent ef6a50597b
commit 0add5422ac
6 changed files with 156 additions and 62 deletions
@@ -4,6 +4,7 @@
#include "xc_drv_uart.h"
#include "mode.h"
#include "timer.h"
#include "light_transition.h"
#include "pwm.h"
union rf433_flag rf_flag = {0};
unsigned char high_level_time;
@@ -75,6 +76,26 @@ void rf433_gpio_init(){
}
static uint8_t ssse=0;
static volatile uint16_t rf_frame_sequence;
static uint16_t pair_last_frame_sequence;
static uint32_t pair_candidate_data;
static uint8_t pair_frame_silence_ticks;
static uint8_t pairing_feedback_active;
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;
#define PAIR_HOLD_FRAME_COUNT 8U
#define PAIR_FRAME_SILENCE_TICKS 50U
uint8_t long_flag_s=0;
// 在固定大小数组中添加新元素(滑动窗口)
@@ -89,16 +110,126 @@ void addToFixedArray(uint8_t arr[], uint8_t newValue) {
arr[0] = 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();
W_PWM_duty = 100U;
C_PWM_duty = 0U;
}
else
{
W_PWM_duty = 0U;
C_PWM_duty = 0U;
Stop_PWM();
Light_Transition_FadeActive = 0U;
Bridge_Off();
}
}
static void Pairing_Feedback_Restore(void)
{
W_PWM = pairing_saved_w;
C_PWM = pairing_saved_c;
Brightness = pairing_saved_brightness;
Mode = pairing_saved_mode;
W_PWM_duty = pairing_saved_w_duty;
C_PWM_duty = pairing_saved_c_duty;
if(pairing_saved_status == POWERON)
{
Start_PWM();
}
else
{
Stop_PWM();
if(W_PWM_duty == 0U && C_PWM_duty == 0U)
{
Light_Transition_FadeActive = 0U;
Bridge_Off();
}
}
}
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;
pairing_feedback_active = 1U;
pairing_feedback_on = 1U;
pairing_feedback_transitions = 6U;
pairing_feedback_elapsed_ms = 0U;
pairing_feedback_interval_ms = interval_ms;
Pairing_Feedback_Apply(1U);
}
static void Pairing_Feedback_Task(void)
{
if(!pairing_feedback_active) return;
pairing_feedback_elapsed_ms += 3U;
if(pairing_feedback_elapsed_ms < pairing_feedback_interval_ms) return;
pairing_feedback_elapsed_ms = 0U;
if(pairing_feedback_transitions <= 1U)
{
pairing_feedback_active = 0U;
pairing_feedback_transitions = 0U;
Pairing_Feedback_Restore();
return;
}
pairing_feedback_transitions--;
pairing_feedback_on = pairing_feedback_on ? 0U : 1U;
Pairing_Feedback_Apply(pairing_feedback_on);
}
static void Encoder_key_NoCode(){
uint8_t i=0,j=0,isok=0,updata=0;
uint16_t times_s=0;
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)&&time_5s<=40000&&ssse==0){
long_press_cnt++;
if(long_press_cnt>200){
time_5s=40011;
if(rf_frame_sequence == pair_last_frame_sequence){
if(pair_frame_silence_ticks < 0xffU) pair_frame_silence_ticks++;
if(pair_frame_silence_ticks > PAIR_FRAME_SILENCE_TICKS){
long_press_cnt = 0U;
pair_candidate_data = 0U;
}
return;
}
pair_last_frame_sequence = rf_frame_sequence;
pair_frame_silence_ticks = 0U;
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)&&time_5s<=50000&&ssse==0)){
long_press_cnt = 0U;
pair_candidate_data = 0U;
return;
}
if(pair_candidate_data == receive_data){
long_press_cnt++;
}else{
pair_candidate_data = receive_data;
long_press_cnt = 1U;
}
if(long_press_cnt>=PAIR_HOLD_FRAME_COUNT){
time_5s=50011;
ssse=1;
long_press_cnt=0;
@@ -146,30 +277,7 @@ static void Encoder_key_NoCode(){
/// EA=0;
isok=0;
if(W_PWM==0&&C_PWM==0){
if(Mode==0){
W_PWM=100;
C_PWM=0;
(void)0;/* transition */
}else {
W_PWM=100;
C_PWM=0;
(void)0;/* transition */
}
}
if(deviceStatus==POWEROFF){
startTimer(&timer1,1);
Start_PWM();
}
for (i=0;i<3;i++){
Start_PWM();
Delay_ms(times_s);
Stop_PWM();
Delay_ms(times_s);
}
Start_PWM();
startTimer(&timer1,1);
Pairing_Feedback_Start(times_s);
}
@@ -188,37 +296,18 @@ static void Encoder_key_NoCode(){
times_s=200;
match_success = 0;
if(W_PWM==0&&C_PWM==0){
W_PWM=100;
C_PWM=0;
if(Mode==0){
(void)0;/* transition */
}else {
(void)0;/* transition */
}
}
if(deviceStatus==POWEROFF){
startTimer(&timer1,1);
Start_PWM();
}
for (i=0;i<3;i++){
Start_PWM();
Delay_ms(times_s);
Stop_PWM();
Delay_ms(times_s);
}
Start_PWM();
Pairing_Feedback_Start(times_s);
}
ssse=1;
set_TaskComps_timer(2,2000);
}
}
}
void Encoder_key(){
Encoder_key_NoCode(); //一对一
Pairing_Feedback_Task();
}
@@ -275,6 +364,7 @@ void rf433_receive(void)//rf433
receive_temp = receive_temp << 1;
if (receive_data_cnt == 24)//24位数据接收完成
{
rf_frame_sequence++;
//进来这个if需要40ms
rf_flag.rf_receive_flag.receive_finish = 1;//24位数据接收完成标志
rf_flag.rf_receive_flag.sync_code = 0;
@@ -290,6 +380,7 @@ void rf433_receive(void)//rf433
receive_data_cnt++;
if (receive_data_cnt == 24)
{
rf_frame_sequence++;
//进来这个if需要40ms3748f3
rf_flag.rf_receive_flag.receive_finish = 1;//24位数据接收完成标志
rf_flag.rf_receive_flag.sync_code = 0;
@@ -386,7 +477,7 @@ void _433_fun(){
Brightness -= BRIGHTNESS_RF_STEP_PERCENT;
}
}else {
if(Speed<10)Speed++;
if(Speed<SPEED_MAX_LEVEL)Speed++;
}
break;
case Brightness_H:
@@ -402,7 +493,7 @@ void _433_fun(){
Brightness += BRIGHTNESS_RF_STEP_PERCENT;
}
}else{
if(Speed>1)Speed--;
if(Speed>SPEED_MIN_LEVEL)Speed--;
}
break;
default: