Skip to content

Commit 1fca297

Browse files
committed
A couple sleep fixes
* Better messaging when code is stopped by an auto-reload. * Auto-reload works during sleeps on ESP32-S2. Ticks wake up the main task each time. * Made internal naming consistent. CamelCase Python names are NOT separated by an underscore.
1 parent d4e9eea commit 1fca297

File tree

14 files changed

+142
-149
lines changed

14 files changed

+142
-149
lines changed

main.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,11 @@ STATIC bool run_code_py(safe_mode_t safe_mode) {
308308
return reload_requested;
309309
}
310310

311-
// Display a different completion message if the user has no USB attached (cannot save files)
312-
serial_write_compressed(translate("\nCode done running. Waiting for reload.\n"));
311+
if (reload_requested && result.return_code == PYEXEC_EXCEPTION) {
312+
serial_write_compressed(translate("\nCode stopped by auto-reload.\n"));
313+
} else {
314+
serial_write_compressed(translate("\nCode done running.\n"));
315+
}
313316
}
314317

315318
// Program has finished running.
@@ -407,7 +410,7 @@ STATIC bool run_code_py(safe_mode_t safe_mode) {
407410
alarm_enter_deep_sleep();
408411
// Does not return.
409412
} else {
410-
serial_write_compressed(translate("Pretending to deep sleep until alarm, any key or file write.\n"));
413+
serial_write_compressed(translate("Pretending to deep sleep until alarm, CTRL-C or file write.\n"));
411414
}
412415
}
413416
}

ports/esp32s2/common-hal/alarm/__init__.c

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ const alarm_sleep_memory_obj_t alarm_sleep_memory_obj = {
5454

5555
void alarm_reset(void) {
5656
alarm_time_timealarm_reset();
57-
alarm_pin_pin_alarm_reset();
57+
alarm_pin_pinalarm_reset();
5858
alarm_sleep_memory_reset();
5959
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL);
6060
}
@@ -63,7 +63,7 @@ STATIC esp_sleep_wakeup_cause_t _get_wakeup_cause(void) {
6363
if (alarm_time_timealarm_woke_us_up()) {
6464
return ESP_SLEEP_WAKEUP_TIMER;
6565
}
66-
if (alarm_pin_pin_alarm_woke_us_up()) {
66+
if (alarm_pin_pinalarm_woke_us_up()) {
6767
return ESP_SLEEP_WAKEUP_GPIO;
6868
}
6969

@@ -84,7 +84,7 @@ STATIC mp_obj_t _get_wake_alarm(size_t n_alarms, const mp_obj_t *alarms) {
8484
case ESP_SLEEP_WAKEUP_GPIO:
8585
case ESP_SLEEP_WAKEUP_EXT0:
8686
case ESP_SLEEP_WAKEUP_EXT1: {
87-
return alarm_pin_pin_alarm_get_wakeup_alarm(n_alarms, alarms);
87+
return alarm_pin_pinalarm_get_wakeup_alarm(n_alarms, alarms);
8888
}
8989

9090
case ESP_SLEEP_WAKEUP_TOUCHPAD:
@@ -106,7 +106,7 @@ mp_obj_t common_hal_alarm_get_wake_alarm(void) {
106106

107107
// Set up light sleep or deep sleep alarms.
108108
STATIC void _setup_sleep_alarms(bool deep_sleep, size_t n_alarms, const mp_obj_t *alarms) {
109-
alarm_pin_pin_alarm_set_alarms(deep_sleep, n_alarms, alarms);
109+
alarm_pin_pinalarm_set_alarms(deep_sleep, n_alarms, alarms);
110110
alarm_time_timealarm_set_alarms(deep_sleep, n_alarms, alarms);
111111
}
112112

@@ -123,25 +123,14 @@ STATIC void _idle_until_alarm(void) {
123123
}
124124
}
125125

126-
// Is it safe to do a light sleep? Check whether WiFi is on or there are
127-
// other ongoing tasks that should not be shut down.
128-
STATIC bool _light_sleep_ok(void) {
129-
int64_t connecting_delay_ticks = CIRCUITPY_USB_CONNECTED_SLEEP_DELAY * 1024 - port_get_raw_ticks(NULL);
130-
return !common_hal_wifi_radio_get_enabled(&common_hal_wifi_radio_obj) &&
131-
!supervisor_workflow_active() &&
132-
connecting_delay_ticks <= 0;
133-
}
134-
135126
mp_obj_t common_hal_alarm_light_sleep_until_alarms(size_t n_alarms, const mp_obj_t *alarms) {
136127
_setup_sleep_alarms(false, n_alarms, alarms);
137128

138-
// Light sleep can break some functionality so only do it when possible. Otherwise we idle.
139-
if (_light_sleep_ok()) {
140-
// Flush the UART to complete the log line.
141-
uart_wait_tx_idle_polling(CONFIG_ESP_CONSOLE_UART_NUM);
142-
esp_light_sleep_start();
143-
} else {
144-
_idle_until_alarm();
129+
// We cannot esp_light_sleep_start() here because it shuts down all non-RTC peripherals.
130+
_idle_until_alarm();
131+
132+
if (mp_hal_is_interrupted()) {
133+
return mp_const_none; // Shouldn't be given to python code because exception handling should kick in.
145134
}
146135

147136
mp_obj_t wake_alarm = _get_wake_alarm(n_alarms, alarms);
@@ -154,7 +143,7 @@ void common_hal_alarm_set_deep_sleep_alarms(size_t n_alarms, const mp_obj_t *ala
154143
}
155144

156145
void NORETURN alarm_enter_deep_sleep(void) {
157-
alarm_pin_pin_alarm_prepare_for_deep_sleep();
146+
alarm_pin_pinalarm_prepare_for_deep_sleep();
158147
// The ESP-IDF caches the deep sleep settings and applies them before sleep.
159148
// We don't need to worry about resetting them in the interim.
160149
esp_deep_sleep_start();

ports/esp32s2/common-hal/alarm/pin/PinAlarm.c

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
#include "components/soc/src/esp32s2/include/hal/gpio_ll.h"
3939
#include "components/xtensa/include/esp_debug_helpers.h"
4040

41-
void common_hal_alarm_pin_pin_alarm_construct(alarm_pin_pin_alarm_obj_t *self, mcu_pin_obj_t *pin, bool value, bool edge, bool pull) {
41+
void common_hal_alarm_pin_pinalarm_construct(alarm_pin_pinalarm_obj_t *self, mcu_pin_obj_t *pin, bool value, bool edge, bool pull) {
4242
if (edge) {
4343
mp_raise_ValueError(translate("Cannot wake on pin edge. Only level."));
4444
}
@@ -51,41 +51,41 @@ void common_hal_alarm_pin_pin_alarm_construct(alarm_pin_pin_alarm_obj_t *self, m
5151
self->pull = pull;
5252
}
5353

54-
mcu_pin_obj_t *common_hal_alarm_pin_pin_alarm_get_pin(alarm_pin_pin_alarm_obj_t *self) {
54+
mcu_pin_obj_t *common_hal_alarm_pin_pinalarm_get_pin(alarm_pin_pinalarm_obj_t *self) {
5555
return self->pin;
5656
}
5757

58-
bool common_hal_alarm_pin_pin_alarm_get_value(alarm_pin_pin_alarm_obj_t *self) {
58+
bool common_hal_alarm_pin_pinalarm_get_value(alarm_pin_pinalarm_obj_t *self) {
5959
return self->value;
6060
}
6161

62-
bool common_hal_alarm_pin_pin_alarm_get_edge(alarm_pin_pin_alarm_obj_t *self) {
62+
bool common_hal_alarm_pin_pinalarm_get_edge(alarm_pin_pinalarm_obj_t *self) {
6363
return false;
6464
}
6565

66-
bool common_hal_alarm_pin_pin_alarm_get_pull(alarm_pin_pin_alarm_obj_t *self) {
66+
bool common_hal_alarm_pin_pinalarm_get_pull(alarm_pin_pinalarm_obj_t *self) {
6767
return self->pull;
6868
}
6969

7070
gpio_isr_handle_t gpio_interrupt_handle;
7171
// Low and high are relative to pin number. 32+ is high. <32 is low.
72-
static volatile uint32_t low_pin_status = 0;
73-
static volatile uint32_t high_pin_status = 0;
72+
static volatile uint32_t pin_31_0_status = 0;
73+
static volatile uint32_t pin_63_32_status = 0;
7474
void gpio_interrupt(void *arg) {
7575
(void) arg;
7676

77-
gpio_ll_get_intr_status(&GPIO, xPortGetCoreID(), (uint32_t*) &low_pin_status);
78-
gpio_ll_clear_intr_status(&GPIO, low_pin_status);
79-
gpio_ll_get_intr_status_high(&GPIO, xPortGetCoreID(), (uint32_t*) &high_pin_status);
80-
gpio_ll_clear_intr_status_high(&GPIO, high_pin_status);
77+
gpio_ll_get_intr_status(&GPIO, xPortGetCoreID(), (uint32_t*) &pin_31_0_status);
78+
gpio_ll_clear_intr_status(&GPIO, pin_31_0_status);
79+
gpio_ll_get_intr_status_high(&GPIO, xPortGetCoreID(), (uint32_t*) &pin_63_32_status);
80+
gpio_ll_clear_intr_status_high(&GPIO, pin_63_32_status);
8181

8282
// disable the interrupts that fired, maybe all of them
8383
for (size_t i = 0; i < 32; i++) {
8484
uint32_t mask = 1 << i;
85-
if ((low_pin_status & mask) != 0) {
85+
if ((pin_31_0_status & mask) != 0) {
8686
gpio_ll_intr_disable(&GPIO, i);
8787
}
88-
if ((high_pin_status & mask) != 0) {
88+
if ((pin_63_32_status & mask) != 0) {
8989
gpio_ll_intr_disable(&GPIO, 32 + i);
9090
}
9191
}
@@ -96,18 +96,18 @@ void gpio_interrupt(void *arg) {
9696
}
9797
}
9898

99-
bool alarm_pin_pin_alarm_woke_us_up(void) {
100-
return low_pin_status != 0 || high_pin_status != 0;
99+
bool alarm_pin_pinalarm_woke_us_up(void) {
100+
return pin_31_0_status != 0 || pin_63_32_status != 0;
101101
}
102102

103-
mp_obj_t alarm_pin_pin_alarm_get_wakeup_alarm(size_t n_alarms, const mp_obj_t *alarms) {
103+
mp_obj_t alarm_pin_pinalarm_get_wakeup_alarm(size_t n_alarms, const mp_obj_t *alarms) {
104104
// First, check to see if we match any given alarms.
105-
uint64_t pin_status = ((uint64_t) high_pin_status) << 32 | low_pin_status;
105+
uint64_t pin_status = ((uint64_t) pin_63_32_status) << 32 | pin_31_0_status;
106106
for (size_t i = 0; i < n_alarms; i++) {
107-
if (!MP_OBJ_IS_TYPE(alarms[i], &alarm_pin_pin_alarm_type)) {
107+
if (!MP_OBJ_IS_TYPE(alarms[i], &alarm_pin_pinalarm_type)) {
108108
continue;
109109
}
110-
alarm_pin_pin_alarm_obj_t *alarm = MP_OBJ_TO_PTR(alarms[i]);
110+
alarm_pin_pinalarm_obj_t *alarm = MP_OBJ_TO_PTR(alarms[i]);
111111
if ((pin_status & (1ull << alarm->pin->number)) != 0) {
112112
return alarms[i];
113113
}
@@ -131,8 +131,8 @@ mp_obj_t alarm_pin_pin_alarm_get_wakeup_alarm(size_t n_alarms, const mp_obj_t *a
131131
}
132132
}
133133

134-
alarm_pin_pin_alarm_obj_t *alarm = m_new_obj(alarm_pin_pin_alarm_obj_t);
135-
alarm->base.type = &alarm_pin_pin_alarm_type;
134+
alarm_pin_pinalarm_obj_t *alarm = m_new_obj(alarm_pin_pinalarm_obj_t);
135+
alarm->base.type = &alarm_pin_pinalarm_type;
136136
alarm->pin = NULL;
137137
// Map the pin number back to a pin object.
138138
for (size_t i = 0; i < mcu_pin_globals.map.used; i++) {
@@ -151,7 +151,7 @@ static uint64_t high_alarms = 0;
151151
static uint64_t low_alarms = 0;
152152
static uint64_t pull_pins = 0;
153153

154-
void alarm_pin_pin_alarm_reset(void) {
154+
void alarm_pin_pinalarm_reset(void) {
155155
if (gpio_interrupt_handle != NULL) {
156156
esp_intr_free(gpio_interrupt_handle);
157157
gpio_interrupt_handle = NULL;
@@ -168,21 +168,21 @@ void alarm_pin_pin_alarm_reset(void) {
168168
high_alarms = 0;
169169
low_alarms = 0;
170170
pull_pins = 0;
171-
high_pin_status = 0;
172-
low_pin_status = 0;
171+
pin_63_32_status = 0;
172+
pin_31_0_status = 0;
173173
}
174174

175-
void alarm_pin_pin_alarm_set_alarms(bool deep_sleep, size_t n_alarms, const mp_obj_t *alarms) {
175+
void alarm_pin_pinalarm_set_alarms(bool deep_sleep, size_t n_alarms, const mp_obj_t *alarms) {
176176
// Bitmask of wake up settings.
177177
size_t high_count = 0;
178178
size_t low_count = 0;
179179

180180
for (size_t i = 0; i < n_alarms; i++) {
181181
// TODO: Check for ULP or touch alarms because they can't coexist with GPIO alarms.
182-
if (!MP_OBJ_IS_TYPE(alarms[i], &alarm_pin_pin_alarm_type)) {
182+
if (!MP_OBJ_IS_TYPE(alarms[i], &alarm_pin_pinalarm_type)) {
183183
continue;
184184
}
185-
alarm_pin_pin_alarm_obj_t *alarm = MP_OBJ_TO_PTR(alarms[i]);
185+
alarm_pin_pinalarm_obj_t *alarm = MP_OBJ_TO_PTR(alarms[i]);
186186

187187
gpio_num_t pin_number = alarm->pin->number;
188188
if (alarm->value) {
@@ -239,8 +239,8 @@ void alarm_pin_pin_alarm_set_alarms(bool deep_sleep, size_t n_alarms, const mp_o
239239
}
240240
// Set GPIO interrupts so they wake us from light sleep or from idle via the
241241
// interrupt handler above.
242-
low_pin_status = 0;
243-
high_pin_status = 0;
242+
pin_31_0_status = 0;
243+
pin_63_32_status = 0;
244244
if (gpio_isr_register(gpio_interrupt, NULL, 0, &gpio_interrupt_handle) != ESP_OK) {
245245
mp_raise_ValueError(translate("Can only alarm on RTC IO from deep sleep."));
246246
}
@@ -282,7 +282,7 @@ void alarm_pin_pin_alarm_set_alarms(bool deep_sleep, size_t n_alarms, const mp_o
282282
}
283283

284284

285-
void alarm_pin_pin_alarm_prepare_for_deep_sleep(void) {
285+
void alarm_pin_pinalarm_prepare_for_deep_sleep(void) {
286286
if (pull_pins == 0) {
287287
return;
288288
}

ports/esp32s2/common-hal/alarm/pin/PinAlarm.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ typedef struct {
3232
mcu_pin_obj_t *pin;
3333
bool value;
3434
bool pull;
35-
} alarm_pin_pin_alarm_obj_t;
35+
} alarm_pin_pinalarm_obj_t;
3636

37-
void alarm_pin_pin_alarm_reset(void);
38-
void alarm_pin_pin_alarm_set_alarms(bool deep_sleep, size_t n_alarms, const mp_obj_t *alarms);
39-
void alarm_pin_pin_alarm_prepare_for_deep_sleep(void);
40-
mp_obj_t alarm_pin_pin_alarm_get_wakeup_alarm(size_t n_alarms, const mp_obj_t *alarms);
41-
bool alarm_pin_pin_alarm_woke_us_up(void);
37+
void alarm_pin_pinalarm_reset(void);
38+
void alarm_pin_pinalarm_set_alarms(bool deep_sleep, size_t n_alarms, const mp_obj_t *alarms);
39+
void alarm_pin_pinalarm_prepare_for_deep_sleep(void);
40+
mp_obj_t alarm_pin_pinalarm_get_wakeup_alarm(size_t n_alarms, const mp_obj_t *alarms);
41+
bool alarm_pin_pinalarm_woke_us_up(void);

ports/esp32s2/common-hal/alarm/time/TimeAlarm.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,23 @@
3434
#include "shared-bindings/alarm/time/TimeAlarm.h"
3535
#include "shared-bindings/time/__init__.h"
3636

37-
void common_hal_alarm_time_time_alarm_construct(alarm_time_time_alarm_obj_t *self, mp_float_t monotonic_time) {
37+
void common_hal_alarm_time_timealarm_construct(alarm_time_timealarm_obj_t *self, mp_float_t monotonic_time) {
3838
self->monotonic_time = monotonic_time;
3939
}
4040

41-
mp_float_t common_hal_alarm_time_time_alarm_get_monotonic_time(alarm_time_time_alarm_obj_t *self) {
41+
mp_float_t common_hal_alarm_time_timealarm_get_monotonic_time(alarm_time_timealarm_obj_t *self) {
4242
return self->monotonic_time;
4343
}
4444

4545
mp_obj_t alarm_time_timealarm_get_wakeup_alarm(size_t n_alarms, const mp_obj_t *alarms) {
4646
// First, check to see if we match
4747
for (size_t i = 0; i < n_alarms; i++) {
48-
if (MP_OBJ_IS_TYPE(alarms[i], &alarm_time_time_alarm_type)) {
48+
if (MP_OBJ_IS_TYPE(alarms[i], &alarm_time_timealarm_type)) {
4949
return alarms[i];
5050
}
5151
}
52-
alarm_time_time_alarm_obj_t *timer = m_new_obj(alarm_time_time_alarm_obj_t);
53-
timer->base.type = &alarm_time_time_alarm_type;
52+
alarm_time_timealarm_obj_t *timer = m_new_obj(alarm_time_timealarm_obj_t);
53+
timer->base.type = &alarm_time_timealarm_type;
5454
// TODO: Set monotonic_time based on the RTC state.
5555
timer->monotonic_time = 0.0f;
5656
return timer;
@@ -78,20 +78,20 @@ void alarm_time_timealarm_reset(void) {
7878
}
7979

8080
void alarm_time_timealarm_set_alarms(bool deep_sleep, size_t n_alarms, const mp_obj_t *alarms) {
81-
bool time_alarm_set = false;
82-
alarm_time_time_alarm_obj_t *time_alarm = MP_OBJ_NULL;
81+
bool timealarm_set = false;
82+
alarm_time_timealarm_obj_t *timealarm = MP_OBJ_NULL;
8383

8484
for (size_t i = 0; i < n_alarms; i++) {
85-
if (!MP_OBJ_IS_TYPE(alarms[i], &alarm_time_time_alarm_type)) {
85+
if (!MP_OBJ_IS_TYPE(alarms[i], &alarm_time_timealarm_type)) {
8686
continue;
8787
}
88-
if (time_alarm_set) {
88+
if (timealarm_set) {
8989
mp_raise_ValueError(translate("Only one alarm.time alarm can be set."));
9090
}
91-
time_alarm = MP_OBJ_TO_PTR(alarms[i]);
92-
time_alarm_set = true;
91+
timealarm = MP_OBJ_TO_PTR(alarms[i]);
92+
timealarm_set = true;
9393
}
94-
if (!time_alarm_set) {
94+
if (!timealarm_set) {
9595
return;
9696
}
9797

@@ -109,7 +109,7 @@ void alarm_time_timealarm_set_alarms(bool deep_sleep, size_t n_alarms, const mp_
109109

110110
// Compute how long to actually sleep, considering the time now.
111111
mp_float_t now_secs = uint64_to_float(common_hal_time_monotonic_ms()) / 1000.0f;
112-
mp_float_t wakeup_in_secs = MAX(0.0f, time_alarm->monotonic_time - now_secs);
112+
mp_float_t wakeup_in_secs = MAX(0.0f, timealarm->monotonic_time - now_secs);
113113
const uint64_t sleep_for_us = (uint64_t) (wakeup_in_secs * 1000000);
114114
esp_sleep_enable_timer_wakeup(sleep_for_us);
115115

ports/esp32s2/common-hal/alarm/time/TimeAlarm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
typedef struct {
3131
mp_obj_base_t base;
3232
mp_float_t monotonic_time; // values compatible with time.monotonic_time()
33-
} alarm_time_time_alarm_obj_t;
33+
} alarm_time_timealarm_obj_t;
3434

3535
// Find the alarm object that caused us to wake up or create an equivalent one.
3636
mp_obj_t alarm_time_timealarm_get_wakeup_alarm(size_t n_alarms, const mp_obj_t *alarms);

0 commit comments

Comments
 (0)