387 lines
8.1 KiB
C
387 lines
8.1 KiB
C
#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}; // 通道1(GPIO5)高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}; // 通道2(GPIO2)高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=GPIO5,2=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();
|
||
|
||
}
|
||
}
|