|
11 | 11 | #include "freertos/FreeRTOS.h" |
12 | 12 | #include "freertos/event_groups.h" |
13 | 13 | #include "freertos/task.h" |
| 14 | +#include "driver/rtc_io.h" |
14 | 15 |
|
15 | 16 | #include "core/os.h" |
16 | 17 | #include "user/audio_player.h" |
17 | 18 |
|
18 | | -#define TAG "os" |
| 19 | +#define OS_PWR_TAG "os_power" |
19 | 20 |
|
20 | 21 | EventGroupHandle_t user_event_group; |
21 | 22 |
|
22 | | -#if defined(CONFIG_ENABLE_WAKEUP_KEY) || defined(CONFIG_ENABLE_SLEEP_KEY) |
23 | | -void os_enter_sleep_mode(void) |
| 23 | +#if defined(CONFIG_ENABLE_WAKEUP_KEY) || defined(CONFIG_ENABLE_SLEEP_KEY) || defined(CONFIG_ENABLE_OTA_OVER_SPP) |
| 24 | +static EventBits_t sleep_wait_bits = 0; |
| 25 | +static EventBits_t restart_wait_bits = 0; |
| 26 | + |
| 27 | +static void os_power_task_handle(void *pvParameters) |
24 | 28 | { |
25 | | - ESP_LOGI(TAG, "entering sleep mode"); |
| 29 | + ESP_LOGI(OS_PWR_TAG, "started."); |
| 30 | + |
| 31 | + while (1) { |
| 32 | + xEventGroupWaitBits( |
| 33 | + user_event_group, |
| 34 | + OS_PWR_SLEEP_BIT | OS_PWR_RESTART_BIT, |
| 35 | + pdFALSE, |
| 36 | + pdFALSE, |
| 37 | + portMAX_DELAY |
| 38 | + ); |
| 39 | + |
| 40 | + EventBits_t uxBits = xEventGroupGetBits(user_event_group); |
| 41 | + if (uxBits & OS_PWR_SLEEP_BIT) { |
| 42 | + for (int i=3; i>0; i--) { |
| 43 | + ESP_LOGW(OS_PWR_TAG, "sleep countdown...%d", i); |
| 44 | + vTaskDelay(1000 / portTICK_RATE_MS); |
| 45 | + } |
| 46 | + |
| 47 | + xEventGroupWaitBits( |
| 48 | + user_event_group, |
| 49 | + sleep_wait_bits, |
| 50 | + pdFALSE, |
| 51 | + pdTRUE, |
| 52 | + portMAX_DELAY |
| 53 | + ); |
| 54 | + |
| 55 | +#ifdef CONFIG_ENABLE_WAKEUP_KEY |
| 56 | + esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); |
| 57 | + rtc_gpio_set_direction(CONFIG_WAKEUP_KEY_PIN, RTC_GPIO_MODE_INPUT_ONLY); |
| 58 | + #ifdef CONFIG_WAKEUP_KEY_ACTIVE_LOW |
| 59 | + rtc_gpio_pulldown_dis(CONFIG_WAKEUP_KEY_PIN); |
| 60 | + rtc_gpio_pullup_en(CONFIG_WAKEUP_KEY_PIN); |
| 61 | + esp_sleep_enable_ext1_wakeup(1ULL << CONFIG_WAKEUP_KEY_PIN, ESP_EXT1_WAKEUP_ALL_LOW); |
| 62 | + #else |
| 63 | + rtc_gpio_pullup_dis(CONFIG_WAKEUP_KEY_PIN); |
| 64 | + rtc_gpio_pulldown_en(CONFIG_WAKEUP_KEY_PIN); |
| 65 | + esp_sleep_enable_ext1_wakeup(1ULL << CONFIG_WAKEUP_KEY_PIN, ESP_EXT1_WAKEUP_ANY_HIGH); |
| 66 | + #endif |
| 67 | +#endif |
26 | 68 |
|
| 69 | + ESP_LOGW(OS_PWR_TAG, "sleep now"); |
| 70 | + esp_deep_sleep_start(); |
| 71 | + } else if (uxBits & OS_PWR_RESTART_BIT) { |
| 72 | + for (int i=3; i>0; i--) { |
| 73 | + ESP_LOGW(OS_PWR_TAG, "restart countdown...%d", i); |
| 74 | + vTaskDelay(1000 / portTICK_RATE_MS); |
| 75 | + } |
| 76 | + |
| 77 | + xEventGroupWaitBits( |
| 78 | + user_event_group, |
| 79 | + restart_wait_bits, |
| 80 | + pdFALSE, |
| 81 | + pdTRUE, |
| 82 | + portMAX_DELAY |
| 83 | + ); |
| 84 | + |
| 85 | + ESP_LOGW(OS_PWR_TAG, "restart now"); |
| 86 | + esp_restart(); |
| 87 | + } |
| 88 | + } |
| 89 | +} |
| 90 | + |
| 91 | +void os_power_sleep_wait(EventBits_t bits) |
| 92 | +{ |
| 93 | + if (bits) { |
| 94 | + sleep_wait_bits = bits; |
| 95 | + xEventGroupSetBits(user_event_group, OS_PWR_SLEEP_BIT); |
| 96 | + } else { |
27 | 97 | #ifdef CONFIG_ENABLE_WAKEUP_KEY |
| 98 | + esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); |
| 99 | + rtc_gpio_set_direction(CONFIG_WAKEUP_KEY_PIN, RTC_GPIO_MODE_INPUT_ONLY); |
28 | 100 | #ifdef CONFIG_WAKEUP_KEY_ACTIVE_LOW |
| 101 | + rtc_gpio_pulldown_dis(CONFIG_WAKEUP_KEY_PIN); |
| 102 | + rtc_gpio_pullup_en(CONFIG_WAKEUP_KEY_PIN); |
29 | 103 | esp_sleep_enable_ext1_wakeup(1ULL << CONFIG_WAKEUP_KEY_PIN, ESP_EXT1_WAKEUP_ALL_LOW); |
30 | 104 | #else |
| 105 | + rtc_gpio_pullup_dis(CONFIG_WAKEUP_KEY_PIN); |
| 106 | + rtc_gpio_pulldown_en(CONFIG_WAKEUP_KEY_PIN); |
31 | 107 | esp_sleep_enable_ext1_wakeup(1ULL << CONFIG_WAKEUP_KEY_PIN, ESP_EXT1_WAKEUP_ANY_HIGH); |
32 | | - #endif // #ifdef CONFIG_WAKEUP_KEY_ACTIVE_LOW |
33 | | -#endif // #ifdef CONFIG_ENABLE_WAKEUP_KEY |
| 108 | + #endif |
| 109 | +#endif |
| 110 | + ESP_LOGW(OS_PWR_TAG, "sleep now"); |
| 111 | + esp_deep_sleep_start(); |
| 112 | + } |
| 113 | +} |
34 | 114 |
|
35 | | - esp_deep_sleep_start(); |
| 115 | +void os_power_restart_wait(EventBits_t bits) |
| 116 | +{ |
| 117 | + if (bits) { |
| 118 | + restart_wait_bits = bits; |
| 119 | + xEventGroupSetBits(user_event_group, OS_PWR_RESTART_BIT); |
| 120 | + } else { |
| 121 | + ESP_LOGW(OS_PWR_TAG, "restart now"); |
| 122 | + esp_restart(); |
| 123 | + } |
36 | 124 | } |
37 | | -#endif // #if defined(CONFIG_ENABLE_WAKEUP_KEY) || defined(CONFIG_ENABLE_SLEEP_KEY) |
| 125 | +#endif |
38 | 126 |
|
39 | 127 | void os_init(void) |
40 | 128 | { |
| 129 | + user_event_group = xEventGroupCreate(); |
| 130 | + |
41 | 131 | #ifdef CONFIG_ENABLE_WAKEUP_KEY |
42 | | - ESP_LOGI(TAG, "checking wakeup cause"); |
| 132 | + ESP_LOGW(OS_PWR_TAG, "checking wakeup cause"); |
43 | 133 | if (esp_sleep_get_wakeup_cause() != ESP_SLEEP_WAKEUP_UNDEFINED) { |
44 | 134 | vTaskDelay(CONFIG_WAKEUP_KEY_EXTRA_HOLD_TIME / portTICK_RATE_MS); |
45 | 135 |
|
46 | 136 | #ifdef CONFIG_WAKEUP_KEY_ACTIVE_LOW |
47 | | - if (gpio_get_level(CONFIG_WAKEUP_KEY_PIN) == 0) { |
| 137 | + if (rtc_gpio_get_level(CONFIG_WAKEUP_KEY_PIN) == 0) { |
48 | 138 | #else |
49 | | - if (gpio_get_level(CONFIG_WAKEUP_KEY_PIN) == 1) { |
| 139 | + if (rtc_gpio_get_level(CONFIG_WAKEUP_KEY_PIN) == 1) { |
50 | 140 | #endif |
51 | | - ESP_LOGI(TAG, "resuming from sleep mode"); |
| 141 | + ESP_LOGW(OS_PWR_TAG, "resuming from sleep mode"); |
52 | 142 | } else { |
53 | | - ESP_LOGI(TAG, "resume aborted"); |
| 143 | + ESP_LOGW(OS_PWR_TAG, "resume aborted"); |
54 | 144 |
|
55 | | - os_enter_sleep_mode(); |
| 145 | + os_power_sleep_wait(0); |
56 | 146 | } |
57 | 147 | } else { |
58 | | - os_enter_sleep_mode(); |
| 148 | + os_power_sleep_wait(0); |
59 | 149 | } |
60 | | -#endif // CONFIG_ENABLE_WAKEUP_KEY |
61 | | - |
62 | | - user_event_group = xEventGroupCreate(); |
63 | 150 |
|
64 | | -#ifdef CONFIG_ENABLE_WAKEUP_KEY |
| 151 | +#ifdef CONFIG_ENABLE_AUDIO_PROMPT |
65 | 152 | audio_player_play_file(2); |
66 | 153 | #endif |
| 154 | +#endif // CONFIG_ENABLE_WAKEUP_KEY |
| 155 | + |
| 156 | +#if defined(CONFIG_ENABLE_WAKEUP_KEY) || defined(CONFIG_ENABLE_SLEEP_KEY) || defined(CONFIG_ENABLE_OTA_OVER_SPP) |
| 157 | + xTaskCreatePinnedToCore(os_power_task_handle, "OsPowerT", 2048, NULL, 5, NULL, 0); |
| 158 | +#endif |
67 | 159 | } |
0 commit comments