From 0f1eb82acd3d810493a184ce96e8d3c2256a759e Mon Sep 17 00:00:00 2001 From: Kang Zuoling Date: Fri, 28 May 2021 17:42:38 +0800 Subject: [PATCH] add touch element deep sleep example and auto sleep example --- components/touch_element/touch_element.c | 10 ++ .../touch_element_sleep/main/CMakeLists.txt | 2 - .../main/Kconfig.projbuild | 15 -- .../CMakeLists.txt | 2 +- .../touch_elem_auto_sleep/main/CMakeLists.txt | 2 + .../main/Kconfig.projbuild | 17 +++ .../main/example_main.c} | 66 ++++----- .../touch_elem_deep_sleep/CMakeLists.txt | 8 ++ .../touch_elem_deep_sleep/main/CMakeLists.txt | 2 + .../main/Kconfig.projbuild | 69 ++++++++++ .../main/touch_elem_deep_sleep.c | 130 ++++++++++++++++++ 11 files changed, 262 insertions(+), 61 deletions(-) delete mode 100644 examples/peripherals/touch_element/touch_element_sleep/main/CMakeLists.txt delete mode 100644 examples/peripherals/touch_element/touch_element_sleep/main/Kconfig.projbuild rename examples/peripherals/touch_element/touch_element_sleep/{ => touch_elem_auto_sleep}/CMakeLists.txt (91%) create mode 100644 examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/CMakeLists.txt create mode 100644 examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/Kconfig.projbuild rename examples/peripherals/touch_element/touch_element_sleep/{main/touch_element_sleep.c => touch_elem_auto_sleep/main/example_main.c} (67%) create mode 100644 examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/CMakeLists.txt create mode 100644 examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/CMakeLists.txt create mode 100644 examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/Kconfig.projbuild create mode 100644 examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/touch_elem_deep_sleep.c diff --git a/components/touch_element/touch_element.c b/components/touch_element/touch_element.c index 90c888ba1a..1409dd6aa9 100644 --- a/components/touch_element/touch_element.c +++ b/components/touch_element/touch_element.c @@ -380,7 +380,9 @@ static void te_intr_cb(void *arg) if (touch_trig_diff & 0x1) { if (touch_trig_status & BIT(pad_num)) { if (s_te_obj->sleep_handle != NULL) { +#ifdef CONFIG_PM_ENABLE esp_pm_lock_acquire(s_te_obj->sleep_handle->pm_lock); +#endif } te_intr_msg.channel_state = TE_STATE_PRESS; te_intr_msg.intr_type = TE_INTR_PRESS; @@ -444,7 +446,9 @@ static void te_proc_timer_cb(void *arg) te_object_update_state(te_intr_msg); if (te_intr_msg.intr_type == TE_INTR_RELEASE) { if (s_te_obj->sleep_handle != NULL) { +#ifdef CONFIG_PM_ENABLE esp_pm_lock_release(s_te_obj->sleep_handle->pm_lock); +#endif } } } else if (te_intr_msg.intr_type == TE_INTR_SCAN_DONE) { @@ -453,7 +457,9 @@ static void te_proc_timer_cb(void *arg) te_object_set_threshold(); //TODO: add set threshold error processing ESP_LOGD(TE_DEBUG_TAG, "Set threshold"); if (s_te_obj->sleep_handle != NULL) { +#ifdef CONFIG_PM_ENABLE esp_pm_lock_release(s_te_obj->sleep_handle->pm_lock); +#endif } } if (waterproof_check_state()) { @@ -1009,10 +1015,12 @@ esp_err_t touch_element_sleep_install(touch_elem_sleep_config_t *sleep_config) s_te_obj->sleep_handle->non_volatile_threshold = threshold_shadow; #endif +#ifdef CONFIG_PM_ENABLE ret = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "touch_element", &s_te_obj->sleep_handle->pm_lock); TE_CHECK_GOTO(ret == ESP_OK, cleanup); ret = esp_pm_lock_acquire(s_te_obj->sleep_handle->pm_lock); TE_CHECK_GOTO(ret == ESP_OK, cleanup); +#endif return ESP_OK; cleanup: @@ -1030,10 +1038,12 @@ void touch_element_sleep_uninstall(void) { esp_err_t ret; if (s_te_obj->sleep_handle->pm_lock != NULL) { +#ifdef CONFIG_PM_ENABLE ret = esp_pm_lock_delete(s_te_obj->sleep_handle->pm_lock); if (ret != ESP_OK) { abort(); } +#endif } if (s_te_obj->sleep_handle->wakeup_handle != NULL) { te_button_handle_t button_handle = s_te_obj->sleep_handle->wakeup_handle; diff --git a/examples/peripherals/touch_element/touch_element_sleep/main/CMakeLists.txt b/examples/peripherals/touch_element/touch_element_sleep/main/CMakeLists.txt deleted file mode 100644 index 5ad924d077..0000000000 --- a/examples/peripherals/touch_element/touch_element_sleep/main/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -idf_component_register(SRCS "touch_element_sleep.c" - INCLUDE_DIRS ".") diff --git a/examples/peripherals/touch_element/touch_element_sleep/main/Kconfig.projbuild b/examples/peripherals/touch_element/touch_element_sleep/main/Kconfig.projbuild deleted file mode 100644 index 2518e7429a..0000000000 --- a/examples/peripherals/touch_element/touch_element_sleep/main/Kconfig.projbuild +++ /dev/null @@ -1,15 +0,0 @@ -menu "Example Configuration" - - choice TOUCH_SENSOR_EXAMPLE_TYPE - bool "Select touch element dispatch method" - default TOUCH_ELEM_EVENT - help - Select touch element dispatch method (event task or callback) for this example. - - config TOUCH_ELEM_EVENT - bool "Dispatch by event task" - config TOUCH_ELEM_CALLBACK - bool "Dispatch by callback" - endchoice - -endmenu diff --git a/examples/peripherals/touch_element/touch_element_sleep/CMakeLists.txt b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/CMakeLists.txt similarity index 91% rename from examples/peripherals/touch_element/touch_element_sleep/CMakeLists.txt rename to examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/CMakeLists.txt index 1b4cd9e672..3c81ebef01 100644 --- a/examples/peripherals/touch_element/touch_element_sleep/CMakeLists.txt +++ b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/CMakeLists.txt @@ -5,4 +5,4 @@ cmake_minimum_required(VERSION 3.5) include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(touch_element_sleep) +project(touch_elem_auto_sleep) diff --git a/examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/CMakeLists.txt b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/CMakeLists.txt new file mode 100644 index 0000000000..b5b2d66b77 --- /dev/null +++ b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "example_main.c" + INCLUDE_DIRS ".") diff --git a/examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/Kconfig.projbuild b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/Kconfig.projbuild new file mode 100644 index 0000000000..c30707c9ab --- /dev/null +++ b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/Kconfig.projbuild @@ -0,0 +1,17 @@ +menu "Example Configuration" + + config TE_PM_ENABLE + bool "Touch Element power management" + default y + + config TE_MAX_CPU_FREQ + int "Touch Element sleep DFS maximum cpu frequency" + depends on PM_DFS_INIT_AUTO + default ESP32S2_DEFAULT_CPU_FREQ_MHZ + + config TE_MIN_CPU_FREQ + int "Touch Element sleep DFS minimum cpu frequency" + depends on PM_DFS_INIT_AUTO + default 10 + +endmenu diff --git a/examples/peripherals/touch_element/touch_element_sleep/main/touch_element_sleep.c b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/example_main.c similarity index 67% rename from examples/peripherals/touch_element/touch_element_sleep/main/touch_element_sleep.c rename to examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/example_main.c index d0777077b5..1e04204aca 100644 --- a/examples/peripherals/touch_element/touch_element_sleep/main/touch_element_sleep.c +++ b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_auto_sleep/main/example_main.c @@ -14,14 +14,12 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "touch_element/touch_button.h" #include "esp_log.h" -#include "esp_sleep.h" -#include "soc/soc.h" -#include "soc/rtc_cntl_reg.h" #include "esp_pm.h" +#include "touch_element/touch_button.h" + +static const char *TAG = "Touch elem auto sleep"; -static const char *TAG = "Touch Button Example"; #define TOUCH_BUTTON_NUM 5 /* Touch buttons handle */ @@ -45,7 +43,6 @@ static const float channel_sens_array[TOUCH_BUTTON_NUM] = { 0.03F, }; -#ifdef CONFIG_TOUCH_ELEM_EVENT /* Button event handler task */ static void button_handler_task(void *arg) { @@ -68,34 +65,24 @@ static void button_handler_task(void *arg) } } } -#elif CONFIG_TOUCH_ELEM_CALLBACK -/* Button callback routine */ -static void button_handler(touch_button_handle_t out_handle, touch_button_message_t *out_message, void *arg) -{ - (void) out_handle; //Unused - if (out_message->event == TOUCH_BUTTON_EVT_ON_PRESS) { - ESP_LOGI(TAG, "Button[%d] Press", (uint32_t)arg); - if (out_handle == button_handle[0]) { -// esp_deep_sleep_start(); - } else if (out_handle == button_handle[1]) { - esp_deep_sleep_start(); - } - } else if (out_message->event == TOUCH_BUTTON_EVT_ON_RELEASE) { - ESP_LOGI(TAG, "Button[%d] Release", (uint32_t)arg); - } else if (out_message->event == TOUCH_BUTTON_EVT_ON_LONGPRESS) { - ESP_LOGI(TAG, "Button[%d] LongPress", (uint32_t)arg); - } -} -#endif + void app_main(void) { -// esp_pm_config_esp32s2_t pm_config = { -// .max_freq_mhz = 160, -// .min_freq_mhz = 160, -// .light_sleep_enable = true -// }; -// ESP_ERROR_CHECK( esp_pm_configure(&pm_config) ); +#ifdef CONFIG_PM_ENABLE //System power management + esp_pm_config_esp32s2_t pm_config = { +#ifdef CONFIG_PM_DFS_INIT_AUTO //Power management dynamic frequency scaling + .max_freq_mhz = CONFIG_TE_MAX_CPU_FREQ, + .min_freq_mhz = CONFIG_TE_MIN_CPU_FREQ, +#endif +#ifdef CONFIG_FREERTOS_USE_TICKLESS_IDLE //FreeRTOS tickless + .light_sleep_enable = true +#else + .light_sleep_enable = false +#endif + }; + ESP_ERROR_CHECK( esp_pm_configure(&pm_config)); +#endif /* Initialize Touch Element library */ touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); ESP_ERROR_CHECK(touch_element_install(&global_config)); @@ -114,30 +101,23 @@ void app_main(void) /* Subscribe touch button events (On Press, On Release, On LongPress) */ ESP_ERROR_CHECK(touch_button_subscribe_event(button_handle[i], TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE | TOUCH_ELEM_EVENT_ON_LONGPRESS, (void *)channel_array[i])); -#ifdef CONFIG_TOUCH_ELEM_EVENT /* Set EVENT as the dispatch method */ ESP_ERROR_CHECK(touch_button_set_dispatch_method(button_handle[i], TOUCH_ELEM_DISP_EVENT)); -#elif CONFIG_TOUCH_ELEM_CALLBACK - /* Set EVENT as the dispatch method */ - ESP_ERROR_CHECK(touch_button_set_dispatch_method(button_handle[i], TOUCH_ELEM_DISP_CALLBACK)); - /* Register a handler function to handle event messages */ - ESP_ERROR_CHECK(touch_button_set_callback(button_handle[i], button_handler)); -#endif /* Set LongPress event trigger threshold time */ ESP_ERROR_CHECK(touch_button_set_longpress(button_handle[i], 1000)); } ESP_LOGI(TAG, "Touch buttons created"); + +#ifdef CONFIG_TE_PM_ENABLE touch_elem_sleep_config_t sleep_config = { .scan_time = global_config.hardware.sample_count, .sleep_time = global_config.hardware.sleep_cycle, }; ESP_ERROR_CHECK(touch_element_sleep_install(&sleep_config)); - ESP_ERROR_CHECK(touch_element_sleep_add_wakeup(button_handle[0])); - ESP_ERROR_CHECK(touch_element_sleep_config_wakeup_calibration(button_handle[0], true)); - touch_pad_sleep_channel_t sleep_channel_info; - touch_pad_sleep_channel_get_info(&sleep_channel_info); - printf("----------%d\n", sleep_channel_info.touch_num); +#endif + touch_element_start(); ESP_LOGI(TAG, "Touch element library start"); + xTaskCreate(&button_handler_task, "button_handler_task", 4 * 1024, NULL, 5, NULL); vTaskDelay(pdMS_TO_TICKS(1000)); } diff --git a/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/CMakeLists.txt b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/CMakeLists.txt new file mode 100644 index 0000000000..3be0e36916 --- /dev/null +++ b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(touch_elem_deep_sleep) diff --git a/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/CMakeLists.txt b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/CMakeLists.txt new file mode 100644 index 0000000000..d7a6bf5299 --- /dev/null +++ b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "touch_elem_deep_sleep.c" + INCLUDE_DIRS ".") diff --git a/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/Kconfig.projbuild b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/Kconfig.projbuild new file mode 100644 index 0000000000..c0558306d4 --- /dev/null +++ b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/Kconfig.projbuild @@ -0,0 +1,69 @@ +menu "Example Configuration" + + choice + + prompt "Select a button as Deep Sleep wakeup source" + default TE_WAKEUP_USE_BUTTON_1 + + config TE_WAKEUP_USE_BUTTON_1 + bool "Button 1" + + config TE_WAKEUP_USE_BUTTON_2 + bool "Button 2" + + config TE_WAKEUP_USE_BUTTON_3 + bool "Button 3" + + config TE_WAKEUP_USE_BUTTON_4 + bool "Button 4" + + config TE_WAKEUP_USE_BUTTON_5 + bool "Button 5" + + endchoice + + config TE_WAKEUP_BUTTON_INDEX + int + default 0 if TE_WAKEUP_USE_BUTTON_1 + default 1 if TE_WAKEUP_USE_BUTTON_2 + default 2 if TE_WAKEUP_USE_BUTTON_3 + default 3 if TE_WAKEUP_USE_BUTTON_4 + default 4 if TE_WAKEUP_USE_BUTTON_5 + + choice + + prompt "Select a button as Deep Sleep entry" + default TE_ENTRY_USE_BUTTON_1 + + config TE_ENTRY_USE_BUTTON_1 + bool "Button 1" + + config TE_ENTRY_USE_BUTTON_2 + bool "Button 2" + + config TE_ENTRY_USE_BUTTON_3 + bool "Button 3" + + config TE_ENTRY_USE_BUTTON_4 + bool "Button 4" + + config TE_ENTRY_USE_BUTTON_5 + bool "Button 5" + + endchoice + + config TE_ENTRY_BUTTON_INDEX + int + default 0 if TE_ENTRY_USE_BUTTON_1 + default 1 if TE_ENTRY_USE_BUTTON_2 + default 2 if TE_ENTRY_USE_BUTTON_3 + default 3 if TE_ENTRY_USE_BUTTON_4 + default 4 if TE_ENTRY_USE_BUTTON_5 + + config TE_SKIP_CALIBRATION + bool "Touch Element skip wakeup calibration" + depends on TE_SKIP_DSLEEP_WAKEUP_CALIBRATION + default y + + +endmenu diff --git a/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/touch_elem_deep_sleep.c b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/touch_elem_deep_sleep.c new file mode 100644 index 0000000000..714f1c7c4e --- /dev/null +++ b/examples/peripherals/touch_element/touch_element_sleep/touch_elem_deep_sleep/main/touch_elem_deep_sleep.c @@ -0,0 +1,130 @@ +/* Touch Sensor - Example + + For other examples please check: + https://github.com/espressif/esp-idf/tree/master/examples + + See README.md file to get detailed usage of this example. + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "esp_sleep.h" +#include "touch_element/touch_button.h" + +static const char *TAG = "Touch Button Example"; + +#define TOUCH_BUTTON_NUM 5 + +/* Touch buttons handle */ +static touch_button_handle_t button_handle[TOUCH_BUTTON_NUM]; +static touch_button_handle_t wakeup_button_handle = NULL; +static touch_button_handle_t entry_button_handle = NULL; + + +/* Touch buttons channel array */ +static const touch_pad_t channel_array[TOUCH_BUTTON_NUM] = { + TOUCH_PAD_NUM1, + TOUCH_PAD_NUM2, + TOUCH_PAD_NUM3, + TOUCH_PAD_NUM4, + TOUCH_PAD_NUM5, +}; + +/* Touch buttons channel sensitivity array */ +static const float channel_sens_array[TOUCH_BUTTON_NUM] = { + 0.03F, + 0.03F, + 0.03F, + 0.03F, + 0.03F, +}; + +/* Button event handler task */ +static void button_handler_task(void *arg) +{ + (void) arg; //Unused + touch_elem_message_t element_message; + while (1) { + /* Waiting for touch element messages */ + touch_element_message_receive(&element_message, portMAX_DELAY); + if (element_message.element_type != TOUCH_ELEM_TYPE_BUTTON) { + continue; + } + /* Decode message */ + const touch_button_message_t *button_message = touch_button_get_message(&element_message); + + if (element_message.handle == entry_button_handle) { + if (button_message->event == TOUCH_BUTTON_EVT_ON_PRESS) { + ESP_LOGI(TAG, "Entering Deep sleep ..."); + fflush(stdout); + esp_deep_sleep_start(); + } + } + + if (button_message->event == TOUCH_BUTTON_EVT_ON_PRESS) { + ESP_LOGI(TAG, "Button[%d] Press", (uint32_t)element_message.arg); + } else if (button_message->event == TOUCH_BUTTON_EVT_ON_RELEASE) { + ESP_LOGI(TAG, "Button[%d] Release", (uint32_t)element_message.arg); + } else if (button_message->event == TOUCH_BUTTON_EVT_ON_LONGPRESS) { + ESP_LOGI(TAG, "Button[%d] LongPress", (uint32_t)element_message.arg); + } + } +} + +void app_main(void) +{ + esp_sleep_wakeup_cause_t wakeup_ret = esp_sleep_get_wakeup_cause(); + printf("------%d\n", wakeup_ret); + /* Initialize Touch Element library */ + touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); + ESP_ERROR_CHECK(touch_element_install(&global_config)); + ESP_LOGI(TAG, "Touch element library installed"); + + touch_button_global_config_t button_global_config = TOUCH_BUTTON_GLOBAL_DEFAULT_CONFIG(); + ESP_ERROR_CHECK(touch_button_install(&button_global_config)); + ESP_LOGI(TAG, "Touch button installed"); + for (int i = 0; i < TOUCH_BUTTON_NUM; i++) { + touch_button_config_t button_config = { + .channel_num = channel_array[i], + .channel_sens = channel_sens_array[i] + }; + /* Create Touch buttons */ + ESP_ERROR_CHECK(touch_button_create(&button_config, &button_handle[i])); + /* Subscribe touch button events (On Press, On Release, On LongPress) */ + if (i == CONFIG_TE_WAKEUP_BUTTON_INDEX || i == CONFIG_TE_ENTRY_BUTTON_INDEX) { + continue; + } else { + ESP_ERROR_CHECK(touch_button_subscribe_event(button_handle[i], TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, (void *)channel_array[i])); + } + + /* Set EVENT as the dispatch method */ + ESP_ERROR_CHECK(touch_button_set_dispatch_method(button_handle[i], TOUCH_ELEM_DISP_EVENT)); + } + wakeup_button_handle = button_handle[CONFIG_TE_WAKEUP_BUTTON_INDEX]; + entry_button_handle = button_handle[CONFIG_TE_ENTRY_BUTTON_INDEX]; + ESP_ERROR_CHECK(touch_button_subscribe_event(entry_button_handle, TOUCH_ELEM_EVENT_ON_PRESS, (void *)channel_array[CONFIG_TE_ENTRY_BUTTON_INDEX])); + ESP_ERROR_CHECK(touch_button_set_dispatch_method(entry_button_handle, TOUCH_ELEM_DISP_EVENT)); + ESP_LOGI(TAG, "Touch buttons created"); + + touch_elem_sleep_config_t sleep_config = { + .scan_time = global_config.hardware.sample_count, + .sleep_time = global_config.hardware.sleep_cycle, + }; + ESP_ERROR_CHECK(touch_element_sleep_install(&sleep_config)); + ESP_ERROR_CHECK(touch_element_sleep_add_wakeup(wakeup_button_handle)); +#ifdef CONFIG_TE_SKIP_CALIBRATION + ESP_ERROR_CHECK(touch_element_sleep_config_wakeup_calibration(wakeup_button_handle, true)); +#endif + + touch_element_start(); + ESP_LOGI(TAG, "Touch element library start"); + xTaskCreate(&button_handler_task, "button_handler_task", 4 * 1024, NULL, 5, NULL); + ESP_LOGI(TAG, "Press Button[%d] to enter sleep and press Button[%d] to wakeup system", channel_array[CONFIG_TE_ENTRY_BUTTON_INDEX], channel_array[CONFIG_TE_WAKEUP_BUTTON_INDEX]); +}