#include #include #include "user_button.h" #include "iot_button.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "freertos/semphr.h" #include "freertos/timers.h" #include "../EPD//include/EPD.h" #include #include #include #include static const char *LOG_TAG = "user button"; static struct timeval btn_last_time;//左屏超过30s,不发送按键lora信息 extern QueueHandle_t button_Data_queue; extern SemaphoreHandle_t button_semaphore; static button_handle_t user_button_handle[KEY_NUM] = {0}; static button_handle_t user_powerbutton_handle[3] = {0}; TimerHandle_t btn_timer_handle; RTC_FAST_ATTR static bool is_setting = false; RTC_FAST_ATTR static bool is_reset_net = false;//配网 RTC_FAST_ATTR static bool is_send_lora = false; uint16_t adc_value[][2]= { {BAOYANG_MIN_ADC,BAOYANG_MAX_ADC}, {FENGCUN_MIN_ADC,FENGCUN_MAX_ADC}, {GUZHUANG_MIN_ADC,GUZHANG_MAX_ADC}, {DAILIAO_MIN_ADC,DAILIAO_MAX_ADC}, {TINGJI_MIN_ADC,TINGJI_MAX_ADC}, {YUNXING_MIN_ADC,YUNXING_MAX_ADC}, }; static void press_up_cb(void *arg,void *usr_data); static void long_press_up_cb(void *arg,void *usr_data); uint16_t power_adc_value[][2]= { {0,100}, {1000,1900}, {2000,3063}, }; int find_key_value(int value) { int key = 0xff; for(int i =0 ;i<6;i++) { if( (adc_value[i][1]>=value)&& (adc_value[i][0]<=value) ) { key = i; printf("key vaule %d\r\n",i); break; } } return key; } static void user_button_single_click_cb(void *arg,void *usr_data); static void power_long_press_start_cb(void *arg,void *usr_data); static void power_long_press_hold_cb(void *arg,void *usr_data); static void power_long_press_up_cb(void *arg,void *usr_data); static void power_single_press_cb(void *arg,void *usr_data); static void user_button_single_UP_cb(void *arg,void *usr_data); static void power_button_multi_press_cb(void *arg,void *usr_data); static void power_left_single_press_cb(void *arg,void *usr_data) { printf("%s\r\n",__FUNCTION__); } static void power_right_single_press_cb(void *arg,void *usr_data) { printf("%s\r\n",__FUNCTION__); } int button_idx = 0; int power_button_idx = 0; int power_button_mult_time = 0; void btn_timer_Callback(TimerHandle_t xTimer) { ESP_LOGW(LOG_TAG, "btn_timer_Callback"); if(is_setting) { is_setting = false; } else if (is_reset_net) { is_reset_net = false; } is_setting = 0; //xTimerStop(btn_timer_handle,0); } static void get_rtc_time(struct tm* tmp) { struct timeval tv; gettimeofday(&tv, NULL); // 打印 RTC 时间戳 printf("RTC Timestamp: %lld\n", tv.tv_sec); // 使用 localtime 函数将时间戳转换为本地时间 tmp = localtime(&tv.tv_sec); // 打印本地时间 printf(" get_rtc_time: %04d-%02d-%02d %02d:%02d:%02d\n", tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, tmp->tm_hour, tmp->tm_min, tmp->tm_sec); } bool is_btn_timeout(void) { struct timeval now_time; gettimeofday(&now_time, NULL); ESP_LOGD(LOG_TAG,"is_send_lora= %s now_time = %lld,last = %lld,\n",is_send_lora?"ture":"false",now_time.tv_sec, btn_last_time.tv_sec); struct tm* tmp = localtime(&now_time.tv_sec); // ESP_LOGI(LOG_TAG,"时间: %04d-%02d-%02d %02d:%02d:%02d\n", // tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, // tmp->tm_hour, tmp->tm_min, tmp->tm_sec); if(((now_time.tv_sec - btn_last_time.tv_sec) > 30)&&(is_send_lora)) { ESP_LOGW(LOG_TAG,"发送-----现在按键时间: %04d-%02d-%02d %02d:%02d:%02d\n", tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, tmp->tm_hour, tmp->tm_min, tmp->tm_sec); is_send_lora = false; return true; } return false; } void reset_btn_last_time(void) { if(!is_send_lora) { is_send_lora = true; } gettimeofday(&btn_last_time, NULL); struct tm* tmp = localtime(&btn_last_time.tv_sec); // printf("btn_last_time: %lld\n", btn_last_time.tv_sec); ESP_LOGW(LOG_TAG,"最后按键时间: %04d-%02d-%02d %02d:%02d:%02d\n", tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, tmp->tm_hour, tmp->tm_min, tmp->tm_sec); } void button_init(adc_oneshot_unit_handle_t adc_handle) { int i; printf("button_init\n"); #if 1 button_config_t adc_btn_cfg = { .type = BUTTON_TYPE_ADC, .long_press_time = CONFIG_BUTTON_LONG_PRESS_TIME_MS, .short_press_time = CONFIG_BUTTON_SHORT_PRESS_TIME_MS, .adc_button_config = { .adc_channel = 7, .adc_handle = &adc_handle, }, }; //左边6个按键初始化 for(i = 0;i < KEY_NUM ;i++) { adc_btn_cfg.adc_button_config.button_index = i; adc_btn_cfg.adc_button_config.min = adc_value[i][0] ; adc_btn_cfg.adc_button_config.max = adc_value[i][1] ; user_button_handle[i] = iot_button_create(&adc_btn_cfg); if(NULL == user_button_handle[i]) { printf( "Button create failed"); } button_idx = i; // iot_button_register_cb( user_button_handle[i], BUTTON_PRESS_DOWN, user_button_single_click_cb,button_idx); iot_button_register_cb( user_button_handle[i], BUTTON_PRESS_UP, user_button_single_click_cb,button_idx);//松手才发按键消息 // iot_button_register_cb( user_button_handle[i], BUTTON_LONG_PRESS_UP, long_press_up_cb,button_idx); //iot_button_register_cb( user_button_handle[i], BUTTON_PRESS_UP, user_button_single_click_cb,button_idx); } #endif //电源按键 btn_timer_handle = xTimerCreate( "btn_timer_handle", pdMS_TO_TICKS(10*1000), pdFALSE, 0, btn_timer_Callback ); #if 0 //右边3个按键 目前只是用一个按键 POWER button_config_t power_btn_cfg = { .type = BUTTON_TYPE_GPIO, .long_press_time = CONFIG_BUTTON_LONG_PRESS_TIME_MS, .short_press_time = CONFIG_BUTTON_SHORT_PRESS_TIME_MS, .adc_button_config = { .adc_channel = 3, .adc_handle = &adc_handle, }, }; for(int i = 0;i < 1 ;i++) { power_btn_cfg.adc_button_config.button_index = i; power_btn_cfg.adc_button_config.min = power_adc_value[i][0] ; power_btn_cfg.adc_button_config.max = power_adc_value[i][1] ; user_powerbutton_handle[i] = iot_button_create(&power_btn_cfg); if(NULL == user_powerbutton_handle[i]) { printf( "Button create failed"); } button_idx = i; iot_button_register_cb( user_powerbutton_handle[i], BUTTON_PRESS_DOWN, power_single_press_cb,button_idx); #if 0 iot_button_register_cb( user_powerbutton_handle[i], BUTTON_LONG_PRESS_START, power_long_press_cb,button_idx); #else iot_button_register_cb( user_powerbutton_handle[i], BUTTON_LONG_PRESS_START, power_long_press_start_cb,button_idx); iot_button_register_cb( user_powerbutton_handle[i], BUTTON_LONG_PRESS_HOLD, power_long_press_hold_cb,button_idx); iot_button_register_cb( user_powerbutton_handle[i], BUTTON_LONG_PRESS_UP, power_long_press_up_cb,button_idx); #endif //注册按键多次按键回调 button_event_config_t btn_cfg; btn_cfg.event = BUTTON_MULTIPLE_CLICK; // btn_cfg.event_data.multiple_clicks.clicks = POWER_KEY_PRSSS_COUNT_OTA; // power_button_mult_time = btn_cfg.event_data.multiple_clicks.clicks ; // iot_button_register_event_cb(user_powerbutton_handle[i], btn_cfg, power_button_multi_press_cb, power_button_mult_time); btn_cfg.event_data.multiple_clicks.clicks = POWER_KEY_PRSSS_COUNT_RESET; power_button_mult_time = btn_cfg.event_data.multiple_clicks.clicks ; iot_button_register_event_cb(user_powerbutton_handle[i], btn_cfg, power_button_multi_press_cb, power_button_mult_time); btn_cfg.event_data.multiple_clicks.clicks = POWER_KEY_PRSSS_BLE_OTA_MODE; power_button_mult_time = btn_cfg.event_data.multiple_clicks.clicks ; iot_button_register_event_cb(user_powerbutton_handle[i], btn_cfg, power_button_multi_press_cb, power_button_mult_time); // //注册按键长按按键回调 // button_event_config_t btn_long_press_cfg; // btn_cfg.event = BUTTON_LONG_PRESS_START; } #else button_config_t power_btn_cfg = { .type = BUTTON_TYPE_GPIO, .long_press_time = CONFIG_BUTTON_LONG_PRESS_TIME_MS, .short_press_time = CONFIG_BUTTON_SHORT_PRESS_TIME_MS, .gpio_button_config = { .gpio_num = 4, .active_level = 0, }, }; for( i = 0;i < 1 ;i++) { //power_btn_cfg.adc_button_config.button_index = i; //power_btn_cfg.adc_button_config.min = power_adc_value[i][0] ; //power_btn_cfg.adc_button_config.max = power_adc_value[i][1] ; user_powerbutton_handle[i] = iot_button_create(&power_btn_cfg); if(NULL == user_powerbutton_handle[i]) { printf( "Button create failed"); } button_idx = i; iot_button_register_cb( user_powerbutton_handle[i], BUTTON_PRESS_DOWN, power_single_press_cb,button_idx); #if 0 iot_button_register_cb( user_powerbutton_handle[i], BUTTON_LONG_PRESS_START, power_long_press_cb,button_idx); #else iot_button_register_cb( user_powerbutton_handle[i], BUTTON_LONG_PRESS_START, power_long_press_start_cb,button_idx); iot_button_register_cb( user_powerbutton_handle[i], BUTTON_LONG_PRESS_HOLD, power_long_press_hold_cb,button_idx); iot_button_register_cb( user_powerbutton_handle[i], BUTTON_LONG_PRESS_UP, power_long_press_up_cb,button_idx); #endif //注册按键多次按键回调 button_event_config_t btn_cfg; btn_cfg.event = BUTTON_MULTIPLE_CLICK; // btn_cfg.event_data.multiple_clicks.clicks = POWER_KEY_PRSSS_COUNT_OTA; // power_button_mult_time = btn_cfg.event_data.multiple_clicks.clicks ; // iot_button_register_event_cb(user_powerbutton_handle[i], btn_cfg, power_button_multi_press_cb, power_button_mult_time); btn_cfg.event_data.multiple_clicks.clicks = POWER_KEY_PRSSS_COUNT_RESET; power_button_mult_time = btn_cfg.event_data.multiple_clicks.clicks ; iot_button_register_event_cb(user_powerbutton_handle[i], btn_cfg, power_button_multi_press_cb, power_button_mult_time); btn_cfg.event_data.multiple_clicks.clicks = POWER_KEY_PRSSS_DIS_RIGHT; power_button_mult_time = btn_cfg.event_data.multiple_clicks.clicks ; iot_button_register_event_cb(user_powerbutton_handle[i], btn_cfg, power_button_multi_press_cb, power_button_mult_time); btn_cfg.event_data.multiple_clicks.clicks = POWER_KEY_PRSSS_BLE_OTA_MODE; power_button_mult_time = btn_cfg.event_data.multiple_clicks.clicks ; iot_button_register_event_cb(user_powerbutton_handle[i], btn_cfg, power_button_multi_press_cb, power_button_mult_time); // //注册按键长按按键回调 // button_event_config_t btn_long_press_cfg; // btn_cfg.event = BUTTON_LONG_PRESS_START; } #endif } void button_deinit(void) { printf("button_deinit\n"); for(int i=0;i