Files
hpw421/project/example/ble/ble_peripheral/app/src/rf433.c
T
2026-07-22 11:37:38 +08:00

387 lines
8.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "rf433.h"
#include <stdbool.h>
#include "xc_drv_gpio.h"
#include "key.h"
#include "led.h"
#include "uart_1.h"
#include "switch_s.h"
#include "timeslice.h"
#include "dbg.h"
#include "rf433_decoder.h"
#include "usr_server.h"
////用bit表示通道
//#define CH_GPIO2 0x01
//#define CH_GPIO5 0x10
Rf433DecoderFrame_t rf433_frame;
uint8_t adress_H=0;
uint8_t adress_L=0;
uint8_t key_state=0;
uint8_t KEY_STATE_re=0; // 长按
static uint8_t power=2;
uint8_t res_data=255; //433返回的最后一个控制字节(低八位)
uint8_t adress_ture_flag=0;
uint8_t adress_H_ch1[5] = {0}; // 通道1GPIO5)高8位地址
uint8_t adress_L_ch1[5] = {0}; // 通道1低8位地址
uint8_t adress_ch1_index = 0; // 通道1地址索引(0-4
uint8_t adress_H_ch2[5] = {0}; // 通道2GPIO2)高8位地址
uint8_t adress_L_ch2[5] = {0}; // 通道2低8位地址
uint8_t adress_ch2_index = 0; // 通道2地址索引(0-4
uint8_t match_ch = 0; // 匹配到的通道(1=GPIO52=GPIO2
#define MATCH_CH1 (1 << 0) //GPIO5
#define MATCH_CH2 (1 << 1) // 通道2匹配标记
uint8_t flash_ch1_state=0;
uint8_t flash_ch2_state=0;
#define rf433_long_time 500
uint16_t long_timer=0;
uint8_t last_H_adress=0;
uint8_t last_L_adress=0;
typedef struct {
uint32_t KEY_STATE_Click; // 单击
uint32_t KEY_STATE_LONG_PRESS; // 长按
} _Key_TypeDef;
_Key_TypeDef Key_TypeDef={0,0};
void flash_run(void)
{
set_TaskComps_timer(2,1000);
}
void rf433_gpio_init(void){
GPIO_InitCfg_t GPIO_InitCfg = { 0 }; // 清零初始化配置结构体
GPIO_InitCfg.Mux = GPIO_Mux0; // 选择功能复用器0
GPIO_InitCfg.FunSel = GPIO_Dx; // 选择GPIO功能(非特殊功能)
GPIO_InitCfg.Pull = GPIO_PULLUP; // 上拉电阻使能
GPIO_InitCfg.Dir = GPIO_DIR_INPUT; // 输出方向
GPIO_InitCfg.Int = NOT_INT; // 不使能中断
GPIO_InitCfg.Pin = RF433_PIN; // 设置RF引脚
xc_gpio_init(&GPIO_InitCfg); // 初始化GPIO
}
void chx_gpio_init(void)
{
GPIO_InitCfg_t GPIO_InitCfg = { 0 }; // 清零初始化配置结构体
GPIO_InitCfg.Mux = GPIO_Mux0; // 选择功能复用器0
GPIO_InitCfg.FunSel = GPIO_Dx; // 选择GPIO功能(非特殊功能)
GPIO_InitCfg.Pull = GPIO_NOPULL; //下拉电阻使能
GPIO_InitCfg.Dir = GPIO_DIR_OUTPUT; // 输出方向
GPIO_InitCfg.Int = NOT_INT; // 不使能中断
GPIO_InitCfg.Pin = RELAY_CH2_PIN; // 设置通道2引脚
xc_gpio_init(&GPIO_InitCfg); // 初始化GPIO
if(flash_ch2_state==1)
{
xc_gpio_write_pin(RELAY_CH2_PIN,GPIO_PIN_SET);
}
else
{
xc_gpio_write_pin(RELAY_CH2_PIN,GPIO_PIN_RESET);
}
}
//该函数选择哪个按键为单击,哪个为长按按键
static void set_click(void)
{
if(res_data==black_on||res_data==black_off||res_data==white_on_off||res_data==white_w){
Key_TypeDef.KEY_STATE_Click=1; //单击
}
else{
Key_TypeDef.KEY_STATE_LONG_PRESS=1; //长按
KEY_STATE_re=1;
}
}
void app_key_callback_handler(uint16_t key_value) //按键回调函数
{
switch(key_value)
{
case REC_KEY_UP_LONG_DOWN: //长按
led_state=1;
key_state=KEY_LONG;
break;
case MODE_DOUBLE_CLICK: //双击
key_state=KEY_SHORT;
power=4;
led_state=2;
break;
default:
break;
}
}
void ble_mode_scan(void)
{
if(receive_mode)
{
switch(receive_mode)
{
case 2:
receive_mode=0;
key_state=KEY_SHORT;
power=4;
led_state=2;
break;
case 4:
receive_mode=0;
led_state=1;
key_state=KEY_LONG;
break;
default : break;
}
}
}
void _433_fun(void)
{
// if(Key_TypeDef.KEY_STATE_Click==1||KEY_STATE_re==1) return;
// set_click(); //设置单击长按
switch(res_data)
{
case 0x03: //如果是3键遥控或者是正方形白色遥控
if(match_ch & MATCH_CH1){
xc_gpio_toggle_pin(RELAY_CH2_PIN);
flash_ch2_state=xc_gpio_read_pin(RELAY_CH2_PIN);
ble_state_mark_dirty(BLE_STATE_DIRTY_OUTPUT | BLE_STATE_DIRTY_RF433);
}
break;
case 0x04: //如果是黑色长方形遥控或者椭圆遥控关闭按键
if(match_ch & MATCH_CH1)
{
xc_gpio_write_pin(RELAY_CH2_PIN,GPIO_PIN_RESET);
flash_ch2_state=xc_gpio_read_pin(RELAY_CH2_PIN);
ble_state_mark_dirty(BLE_STATE_DIRTY_OUTPUT | BLE_STATE_DIRTY_RF433);
}
break;
case 0x02: //如果是黑色长方形遥控或者椭圆遥控打开按键
if(match_ch & MATCH_CH1)
{
xc_gpio_write_pin(RELAY_CH2_PIN,GPIO_PIN_SET);
flash_ch2_state=xc_gpio_read_pin(RELAY_CH2_PIN);
ble_state_mark_dirty(BLE_STATE_DIRTY_OUTPUT | BLE_STATE_DIRTY_RF433);
}
break;
default:
break;
}
}
void scan_433(void)
{
uint8_t i=0;
bool rf433_decoder_flag=false;
rf433_decoder_flag=rf433_decoder_get_frame(&rf433_frame);
if(long_timer>0)
{
long_timer--;
}
// if(rf433_sw_flag==1)
// {
// rf433_sw_flag=0;
// }
if(rf433_sw_flag==2)
{
rf433_sw_flag=0;
power=4;
key_state=KEY_SHORT;
led_state=2;
}
if(rf433_decoder_flag)
{
adress_H = rf433_frame.addr_h;
adress_L = rf433_frame.addr_l;
res_data = rf433_frame.key ;
}
// if(power==3 && rf433_decoder_flag==true && key_state==KEY_SHORT ) //双击对码GPIO2
// {
//
//
// key_state=0;
// power=2;
// led_state=0;
//
//
//
// if(adress_ch2_index>4)
// {
// adress_ch2_index=0;
// }
//
// adress_ture_flag=0;
//
// for(i=0;i<5;i++)
// {
// if(adress_H_ch2[i]==adress_H && adress_L_ch2[i]==adress_L)
// {
// adress_ture_flag=1;
//
// break;
// }
// }
// if(adress_ture_flag==0)
// {
//
// adress_H_ch2[adress_ch2_index] = adress_H;
// adress_L_ch2[adress_ch2_index] = adress_L;
// adress_ch2_index++; // 索引自增
// }
//
//
// }
if(power==4 && rf433_decoder_flag==true && key_state==KEY_SHORT ) //四击对码GPIO5
{
key_state=0;
power=2;
led_state=0;
if(adress_ch1_index>4)
{
adress_ch1_index=0;
}
adress_ture_flag=0;
for(i=0;i<5;i++)
{
if(adress_H_ch1[i]==adress_H && adress_L_ch1[i]==adress_L)
{
adress_ture_flag=1;
break;
}
}
if(adress_ture_flag==0)
{
adress_H_ch1[adress_ch1_index] = adress_H;
adress_L_ch1[adress_ch1_index] = adress_L;
adress_ch1_index++; // 索引自增
}
}
if(power==2 && rf433_decoder_flag==true)
{
if(long_timer>0 && (last_H_adress == adress_H && last_L_adress == adress_L))
{
return;
}
// 初始化匹配状态
match_ch = 0;
for(i=0; i<5; i++)
{
if( adress_H_ch1[i] == adress_H && adress_L_ch1[i] == adress_L )
{
match_ch|= MATCH_CH1;
break;
}
}
// for(i=0; i<5; i++)
// {
// if(adress_H_ch2[i]==adress_H && adress_L_ch2[i]==adress_L)
// {
// match_ch|= MATCH_CH2; // 标记匹配到通道2
// break;
// }
// }
if(match_ch != 0)
{
_433_fun();
flash_run();
}
last_H_adress=adress_H;
last_L_adress=adress_L;
long_timer=rf433_long_time;
}
if( key_state==KEY_LONG )
{
key_state=0;
memset(adress_H_ch1, 0, sizeof(adress_H_ch1));
memset(adress_H_ch2, 0, sizeof(adress_H_ch2));
memset(adress_L_ch1, 0, sizeof(adress_L_ch1));
memset(adress_L_ch2, 0, sizeof(adress_L_ch2));
adress_ch1_index=0;
adress_ch2_index=0;
flash_run();
}
}