Browse Source
The machine.Pin class is also updated to support these wake-on-pin features.pull/3612/head
Eric Poulsen
7 years ago
committed by
Damien George
5 changed files with 221 additions and 8 deletions
@ -0,0 +1,140 @@ |
|||
/*
|
|||
* This file is part of the MicroPython project, http://micropython.org/
|
|||
* |
|||
* The MIT License (MIT) |
|||
* |
|||
* Copyright (c) 2017 "Eric Poulsen" <eric@zyxod.com> |
|||
* |
|||
* Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
* of this software and associated documentation files (the "Software"), to deal |
|||
* in the Software without restriction, including without limitation the rights |
|||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
* copies of the Software, and to permit persons to whom the Software is |
|||
* furnished to do so, subject to the following conditions: |
|||
* |
|||
* The above copyright notice and this permission notice shall be included in |
|||
* all copies or substantial portions of the Software. |
|||
* |
|||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
* THE SOFTWARE. |
|||
*/ |
|||
|
|||
#include <stdio.h> |
|||
#include <string.h> |
|||
|
|||
#include <time.h> |
|||
#include <sys/time.h> |
|||
#include "driver/gpio.h" |
|||
|
|||
#include "py/nlr.h" |
|||
#include "py/obj.h" |
|||
#include "py/runtime.h" |
|||
#include "py/mphal.h" |
|||
#include "timeutils.h" |
|||
#include "modmachine.h" |
|||
#include "machine_rtc.h" |
|||
#include "modesp32.h" |
|||
|
|||
extern machine_rtc_config_t machine_rtc_config; |
|||
|
|||
STATIC mp_obj_t esp32_wake_on_touch(const mp_obj_t wake) { |
|||
|
|||
if (machine_rtc_config.ext0_pin != -1) { |
|||
mp_raise_ValueError("no resources"); |
|||
} |
|||
//nlr_raise(mp_obj_new_exception_msg(&mp_type_RuntimeError, "touchpad wakeup not available for this version of ESP-IDF"));
|
|||
|
|||
machine_rtc_config.wake_on_touch = mp_obj_is_true(wake); |
|||
return mp_const_none; |
|||
} |
|||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(esp32_wake_on_touch_obj, esp32_wake_on_touch); |
|||
|
|||
STATIC mp_obj_t esp32_wake_on_ext0(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { |
|||
|
|||
if (machine_rtc_config.wake_on_touch) { |
|||
mp_raise_ValueError("no resources"); |
|||
} |
|||
enum {ARG_pin, ARG_level}; |
|||
const mp_arg_t allowed_args[] = { |
|||
{ MP_QSTR_pin, MP_ARG_OBJ, {.u_obj = mp_obj_new_int(machine_rtc_config.ext0_pin)} }, |
|||
{ MP_QSTR_level, MP_ARG_BOOL, {.u_bool = machine_rtc_config.ext0_level} }, |
|||
}; |
|||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; |
|||
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); |
|||
|
|||
if (args[ARG_pin].u_obj == mp_const_none) { |
|||
machine_rtc_config.ext0_pin = -1; // "None"
|
|||
} else { |
|||
gpio_num_t pin_id = machine_pin_get_id(args[ARG_pin].u_obj); |
|||
if (pin_id != machine_rtc_config.ext0_pin) { |
|||
if (!RTC_IS_VALID_EXT_PIN(pin_id)) { |
|||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "invalid pin")); |
|||
} |
|||
machine_rtc_config.ext0_pin = pin_id; |
|||
} |
|||
} |
|||
|
|||
machine_rtc_config.ext0_level = args[ARG_level].u_bool; |
|||
machine_rtc_config.ext0_wake_types = MACHINE_WAKE_SLEEP | MACHINE_WAKE_DEEPSLEEP; |
|||
|
|||
return mp_const_none; |
|||
} |
|||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(esp32_wake_on_ext0_obj, 0, esp32_wake_on_ext0); |
|||
|
|||
STATIC mp_obj_t esp32_wake_on_ext1(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { |
|||
enum {ARG_pins, ARG_level}; |
|||
const mp_arg_t allowed_args[] = { |
|||
{ MP_QSTR_pins, MP_ARG_OBJ, {.u_obj = mp_const_none} }, |
|||
{ MP_QSTR_level, MP_ARG_BOOL, {.u_bool = machine_rtc_config.ext1_level} }, |
|||
}; |
|||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; |
|||
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); |
|||
uint64_t ext1_pins = machine_rtc_config.ext1_pins; |
|||
|
|||
|
|||
// Check that all pins are allowed
|
|||
if (args[ARG_pins].u_obj != mp_const_none) { |
|||
mp_uint_t len = 0; |
|||
mp_obj_t *elem; |
|||
mp_obj_get_array(args[ARG_pins].u_obj, &len, &elem); |
|||
ext1_pins = 0; |
|||
|
|||
for (int i = 0; i < len; i++) { |
|||
|
|||
gpio_num_t pin_id = machine_pin_get_id(elem[i]); |
|||
if (!RTC_IS_VALID_EXT_PIN(pin_id)) { |
|||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "invalid pin")); |
|||
break; |
|||
} |
|||
ext1_pins |= (1ll << pin_id); |
|||
} |
|||
} |
|||
|
|||
machine_rtc_config.ext1_level = args[ARG_level].u_bool; |
|||
machine_rtc_config.ext1_pins = ext1_pins; |
|||
|
|||
return mp_const_none; |
|||
} |
|||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(esp32_wake_on_ext1_obj, 0, esp32_wake_on_ext1); |
|||
|
|||
STATIC const mp_rom_map_elem_t esp32_module_globals_table[] = { |
|||
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_esp32) }, |
|||
|
|||
{ MP_OBJ_NEW_QSTR(MP_QSTR_wake_on_touch), (mp_obj_t)&esp32_wake_on_touch_obj }, |
|||
{ MP_OBJ_NEW_QSTR(MP_QSTR_wake_on_ext0), (mp_obj_t)&esp32_wake_on_ext0_obj }, |
|||
{ MP_OBJ_NEW_QSTR(MP_QSTR_wake_on_ext1), (mp_obj_t)&esp32_wake_on_ext1_obj }, |
|||
{ MP_OBJ_NEW_QSTR(MP_QSTR_WAKEUP_ALL_LOW), mp_const_false }, |
|||
{ MP_OBJ_NEW_QSTR(MP_QSTR_WAKEUP_ANY_HIGH), mp_const_true }, |
|||
}; |
|||
|
|||
STATIC MP_DEFINE_CONST_DICT(esp32_module_globals, esp32_module_globals_table); |
|||
|
|||
const mp_obj_module_t esp32_module = { |
|||
.base = { &mp_type_module }, |
|||
.globals = (mp_obj_dict_t*)&esp32_module_globals, |
|||
}; |
@ -0,0 +1,29 @@ |
|||
#ifndef MICROPY_INCLUDED_ESP32_MODESP32_H |
|||
#define MICROPY_INCLUDED_ESP32_MODESP32_H |
|||
|
|||
#define RTC_VALID_EXT_PINS \ |
|||
( \ |
|||
(1ll << 0) | \ |
|||
(1ll << 2) | \ |
|||
(1ll << 4) | \ |
|||
(1ll << 12) | \ |
|||
(1ll << 13) | \ |
|||
(1ll << 14) | \ |
|||
(1ll << 15) | \ |
|||
(1ll << 25) | \ |
|||
(1ll << 26) | \ |
|||
(1ll << 27) | \ |
|||
(1ll << 32) | \ |
|||
(1ll << 33) | \ |
|||
(1ll << 34) | \ |
|||
(1ll << 35) | \ |
|||
(1ll << 36) | \ |
|||
(1ll << 37) | \ |
|||
(1ll << 38) | \ |
|||
(1ll << 39) \ |
|||
) |
|||
|
|||
#define RTC_LAST_EXT_PIN 39 |
|||
#define RTC_IS_VALID_EXT_PIN(pin_id) ((1ll << (pin_id)) & RTC_VALID_EXT_PINS) |
|||
|
|||
#endif // MICROPY_INCLUDED_ESP32_MODESP32_H
|
Loading…
Reference in new issue