Skip to content

Commit e310b87

Browse files
microdev1tannewt
authored andcommitted
Get io wake working
1 parent 3a30887 commit e310b87

File tree

13 files changed

+138
-53
lines changed

13 files changed

+138
-53
lines changed

main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ int __attribute__((used)) main(void) {
509509
}
510510
if (exit_code == PYEXEC_FORCED_EXIT) {
511511
if (!first_run) {
512-
serial_write_compressed(translate("\n\n ----- soft reboot -----\n"));
512+
serial_write_compressed(translate("\n\n------ soft reboot ------\n"));
513513
}
514514
first_run = false;
515515
skip_repl = run_code_py(safe_mode);
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "shared-bindings/io_alarm/__init__.h"
2+
3+
#include "esp_sleep.h"
4+
#include "driver/rtc_io.h"
5+
6+
void common_hal_io_alarm_pin_state (uint8_t gpio, uint8_t level, bool pull) {
7+
if (!rtc_gpio_is_valid_gpio(gpio)) {
8+
mp_raise_ValueError(translate("io must be rtc io"));
9+
return;
10+
}
11+
12+
switch(esp_sleep_enable_ext0_wakeup(gpio, level)) {
13+
case ESP_ERR_INVALID_ARG:
14+
mp_raise_ValueError(translate("trigger level must be 0 or 1"));
15+
return;
16+
case ESP_ERR_INVALID_STATE:
17+
mp_raise_RuntimeError(translate("wakeup conflict"));
18+
return;
19+
default:
20+
break;
21+
}
22+
23+
if (pull) {
24+
(level) ? rtc_gpio_pulldown_en(gpio) : rtc_gpio_pullup_en(gpio);
25+
}
26+
}
27+

ports/esp32s2/common-hal/timealarm/__init__.c renamed to ports/esp32s2/common-hal/time_alarm/__init__.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#include "esp_sleep.h"
22

3-
#include "shared-bindings/timealarm/__init__.h"
3+
#include "shared-bindings/time_alarm/__init__.h"
44

5-
void common_hal_timealarm_duration (uint32_t ms) {
5+
void common_hal_time_alarm_duration (uint32_t ms) {
66
if (esp_sleep_enable_timer_wakeup((ms) * 1000) == ESP_ERR_INVALID_ARG) {
77
mp_raise_ValueError(translate("time out of range"));
88
}

ports/esp32s2/mpconfigport.mk

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ CIRCUITPY_FREQUENCYIO = 0
2222
CIRCUITPY_I2CPERIPHERAL = 0
2323
CIRCUITPY_ROTARYIO = 0
2424
CIRCUITPY_NVM = 0
25-
CIRCUITPY_TIMEALARM = 1
25+
CIRCUITPY_TIME_ALARM = 1
26+
CIRCUITPY_IO_ALARM = 1
2627
# We don't have enough endpoints to include MIDI.
2728
CIRCUITPY_USB_MIDI = 0
2829
CIRCUITPY_WIFI = 1

py/circuitpy_defns.mk

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,11 @@ endif
259259
ifeq ($(CIRCUITPY_TIME),1)
260260
SRC_PATTERNS += time/%
261261
endif
262-
ifeq ($(CIRCUITPY_TIMEALARM),1)
263-
SRC_PATTERNS += timealarm/%
262+
ifeq ($(CIRCUITPY_TIME_ALARM),1)
263+
SRC_PATTERNS += time_alarm/%
264+
endif
265+
ifeq ($(CIRCUITPY_IO_ALARM),1)
266+
SRC_PATTERNS += io_alarm/%
264267
endif
265268
ifeq ($(CIRCUITPY_TOUCHIO),1)
266269
SRC_PATTERNS += touchio/%
@@ -363,7 +366,8 @@ SRC_COMMON_HAL_ALL = \
363366
ssl/SSLContext.c \
364367
supervisor/Runtime.c \
365368
supervisor/__init__.c \
366-
timealarm/__init__.c \
369+
time_alarm/__init__.c \
370+
io_alarm/__init__.c \
367371
watchdog/WatchDogMode.c \
368372
watchdog/WatchDogTimer.c \
369373
watchdog/__init__.c \

py/circuitpy_mpconfig.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -663,11 +663,18 @@ extern const struct _mp_obj_module_t time_module;
663663
#define TIME_MODULE_ALT_NAME
664664
#endif
665665

666-
#if CIRCUITPY_TIMEALARM
667-
extern const struct _mp_obj_module_t timealarm_module;
668-
#define TIMEALARM_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_timealarm), (mp_obj_t)&timealarm_module },
666+
#if CIRCUITPY_TIME_ALARM
667+
extern const struct _mp_obj_module_t time_alarm_module;
668+
#define TIME_ALARM_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_time_alarm), (mp_obj_t)&time_alarm_module },
669669
#else
670-
#define TIMEALARM_MODULE
670+
#define TIME_ALARM_MODULE
671+
#endif
672+
673+
#if CIRCUITPY_IO_ALARM
674+
extern const struct _mp_obj_module_t io_alarm_module;
675+
#define IO_ALARM_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_io_alarm), (mp_obj_t)&io_alarm_module },
676+
#else
677+
#define IO_ALARM_MODULE
671678
#endif
672679

673680
#if CIRCUITPY_TOUCHIO
@@ -828,7 +835,8 @@ extern const struct _mp_obj_module_t wifi_module;
828835
STRUCT_MODULE \
829836
SUPERVISOR_MODULE \
830837
TOUCHIO_MODULE \
831-
TIMEALARM_MODULE \
838+
TIME_ALARM_MODULE \
839+
IO_ALARM_MODULE \
832840
UHEAP_MODULE \
833841
USB_HID_MODULE \
834842
USB_MIDI_MODULE \

py/circuitpy_mpconfig.mk

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,11 @@ CFLAGS += -DCIRCUITPY_TERMINALIO=$(CIRCUITPY_TERMINALIO)
234234
CIRCUITPY_TIME ?= 1
235235
CFLAGS += -DCIRCUITPY_TIME=$(CIRCUITPY_TIME)
236236

237-
CIRCUITPY_TIMEALARM ?= 0
238-
CFLAGS += -DCIRCUITPY_TIMEALARM=$(CIRCUITPY_TIMEALARM)
237+
CIRCUITPY_TIME_ALARM ?= 0
238+
CFLAGS += -DCIRCUITPY_TIME_ALARM=$(CIRCUITPY_TIME_ALARM)
239+
240+
CIRCUITPY_IO_ALARM ?= 0
241+
CFLAGS += -DCIRCUITPY_IO_ALARM=$(CIRCUITPY_IO_ALARM)
239242

240243
# touchio might be native or generic. See circuitpy_defns.mk.
241244
CIRCUITPY_TOUCHIO_USE_NATIVE ?= 0

shared-bindings/io_alarm/__init__.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include "py/obj.h"
2+
3+
#include "shared-bindings/io_alarm/__init__.h"
4+
#include "shared-bindings/microcontroller/Pin.h"
5+
6+
//| Set Timer Wakeup
7+
//|
8+
STATIC mp_obj_t io_alarm_pin_state(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
9+
enum { ARG_level, ARG_pull };
10+
static const mp_arg_t allowed_args[] = {
11+
{ MP_QSTR_level, MP_ARG_INT | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
12+
{ MP_QSTR_pull, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_bool = false} },
13+
};
14+
15+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
16+
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
17+
18+
mcu_pin_obj_t *pin = validate_obj_is_pin(pos_args[0]);
19+
common_hal_io_alarm_pin_state(pin->number, args[ARG_level].u_int, args[ARG_pull].u_bool);
20+
21+
return mp_const_none;
22+
}
23+
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(io_alarm_pin_state_obj, 1, io_alarm_pin_state);
24+
25+
STATIC const mp_rom_map_elem_t io_alarm_module_globals_table[] = {
26+
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_io_alarm) },
27+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PinState), MP_ROM_PTR(&io_alarm_pin_state_obj) },
28+
};
29+
STATIC MP_DEFINE_CONST_DICT(io_alarm_module_globals, io_alarm_module_globals_table);
30+
31+
const mp_obj_module_t io_alarm_module = {
32+
.base = { &mp_type_module },
33+
.globals = (mp_obj_dict_t*)&io_alarm_module_globals,
34+
};

shared-bindings/io_alarm/__init__.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_IO_ALARM___INIT___H
2+
#define MICROPY_INCLUDED_SHARED_BINDINGS_IO_ALARM___INIT___H
3+
4+
#include "py/runtime.h"
5+
6+
extern void common_hal_io_alarm_pin_state(uint8_t gpio, uint8_t level, bool pull);
7+
8+
#endif //MICROPY_INCLUDED_SHARED_BINDINGS_IO_ALARM___INIT___H

shared-bindings/time_alarm/__init__.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "py/obj.h"
2+
#include "shared-bindings/time_alarm/__init__.h"
3+
4+
//| Set Timer Wakeup
5+
//|
6+
STATIC mp_obj_t time_alarm_duration(mp_obj_t seconds_o) {
7+
#if MICROPY_PY_BUILTINS_FLOAT
8+
mp_float_t seconds = mp_obj_get_float(seconds_o);
9+
mp_float_t msecs = 1000.0f * seconds + 0.5f;
10+
#else
11+
mp_int_t seconds = mp_obj_get_int(seconds_o);
12+
mp_int_t msecs = 1000 * seconds;
13+
#endif
14+
if (seconds < 0) {
15+
mp_raise_ValueError(translate("sleep length must be non-negative"));
16+
}
17+
common_hal_time_alarm_duration(msecs);
18+
return mp_const_none;
19+
}
20+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(time_alarm_duration_obj, time_alarm_duration);
21+
22+
STATIC const mp_rom_map_elem_t time_alarm_module_globals_table[] = {
23+
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_time_alarm) },
24+
{ MP_OBJ_NEW_QSTR(MP_QSTR_Duration), MP_ROM_PTR(&time_alarm_duration_obj) },
25+
};
26+
STATIC MP_DEFINE_CONST_DICT(time_alarm_module_globals, time_alarm_module_globals_table);
27+
28+
const mp_obj_module_t time_alarm_module = {
29+
.base = { &mp_type_module },
30+
.globals = (mp_obj_dict_t*)&time_alarm_module_globals,
31+
};

0 commit comments

Comments
 (0)