头文件定义
typedef struct
{
uint8_t now_val;
uint8_t last_val;
uint32_t key;
}keys_push;
#define SW1_GPIO GPIO_PD2
#define SW2_GPIO GPIO_PB7
#define SW3_GPIO GPIO_PD7
#define SW4_GPIO GPIO_PA0
#define PD2_INPUT_ENABLE 1
#define PB7_INPUT_ENABLE 1
#define PD7_INPUT_ENABLE 1
#define PA0_INPUT_ENABLE 1
#define PULL_WAKEUP_SRC_PD2 PM_PIN_PULLUP_1M
#define PULL_WAKEUP_SRC_PB7 PM_PIN_PULLUP_1M
#define PULL_WAKEUP_SRC_PD7 PM_PIN_PULLUP_1M
#define PULL_WAKEUP_SRC_PA0 PM_PIN_PULLUP_1M
.c文件
keys_push keys[]={{false , false , SW1_GPIO}, {false , false , SW2_GPIO},{false , false , SW3_GPIO},{false , false , SW4_GPIO},};
void proc_key( void )
{
model_common_t *p_model;
u8 model_index = 0;
u8 key_push = false;
u16 pub_addr = SWITCH_GROUP_ADDR_START;
static u32 tick, scan_io_interval_us = 40000 , long_push_tick = 0;
if (!clock_time_exceed (tick, scan_io_interval_us))
{
return;
}
tick = clock_time();
foreach(i , sizeof(keys)/sizeof(keys[0]))
{
keys[i].now_val = !gpio_read(keys[i].key);
if(!(keys[i].last_val )&&keys[i].now_val )
{
scan_io_interval_us = 10*1000; // fix dithering
model_index = i;
p_model = (model_common_t *)mesh_find_ele_resource_in_model(ele_adr_primary,SIG_MD_G_ONOFF_C, 1,&model_index, 0);
if(p_model && p_model->pub_adr)
{
pub_addr = p_model->pub_adr;
}
else
{
pub_addr += i;
}
key_set_proc(i);
long_push_tick = clock_time();
}
if( keys[i].now_val )
{
key_push = true;
}
keys[i].last_val = keys[i].now_val;
}
if( key_push )
{
if (clock_time_exceed (long_push_tick, 5*1000*1000)) //连续按住5秒
{
LOG_USER_MSG_INFO(0, 0,"long push some key", 0 );
long_push_tick = clock_time();
#if MANUAL_FACTORY_RESET_TX_STATUS_EN
send_and_wait_completed_reset_node_status(); //是否发送 NODE_RESET_STATUS 指令通知 gateway,或者 app。
#endif
irq_disable();
factory_reset();
#if DUAL_MODE_WITH_TLK_MESH_EN
UI_resotre_TLK_4K_with_check();
#endif
LOG_USER_MSG_INFO(0,0,"factory reset success\r\n",0);
show_ota_result(OTA_SUCCESS);
start_reboot();
}
}
}