#include "rf433.h" #include #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(); } }