Merge pull request #3767 from dhalbert/sleep
Initial alarm and sleep PR: time alarms with light and deep sleep; PinAlarms not yet implemented
This commit is contained in:
commit
d7ba641ff6
@ -1 +1 @@
|
||||
Subproject commit 531e8451522e3bba3e571610e4ac70efcb0cae5a
|
||||
Subproject commit 53902152c674b0ba31536b50291f7ddd28960f47
|
@ -101,7 +101,7 @@ STATIC int parse_compile_execute(const void *source, mp_parse_input_kind_t input
|
||||
#endif
|
||||
}
|
||||
|
||||
// If the code was loaded from a file its likely to be running for a while so we'll long
|
||||
// If the code was loaded from a file it's likely to be running for a while so we'll long
|
||||
// live it and collect any garbage before running.
|
||||
if (input_kind == MP_PARSE_FILE_INPUT) {
|
||||
module_fun = make_obj_long_lived(module_fun, 6);
|
||||
@ -132,6 +132,10 @@ STATIC int parse_compile_execute(const void *source, mp_parse_input_kind_t input
|
||||
if (mp_obj_is_subclass_fast(mp_obj_get_type((mp_obj_t)nlr.ret_val), &mp_type_SystemExit)) {
|
||||
// at the moment, the value of SystemExit is unused
|
||||
ret = pyexec_system_exit;
|
||||
#if CIRCUITPY_ALARM
|
||||
} else if (mp_obj_is_subclass_fast(mp_obj_get_type((mp_obj_t)nlr.ret_val), &mp_type_DeepSleepRequest)) {
|
||||
ret = PYEXEC_DEEP_SLEEP;
|
||||
#endif
|
||||
} else {
|
||||
if ((mp_obj_t) nlr.ret_val != MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
|
||||
mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
|
||||
|
@ -49,6 +49,7 @@ extern int pyexec_system_exit;
|
||||
#define PYEXEC_FORCED_EXIT (0x100)
|
||||
#define PYEXEC_SWITCH_MODE (0x200)
|
||||
#define PYEXEC_EXCEPTION (0x400)
|
||||
#define PYEXEC_DEEP_SLEEP (0x800)
|
||||
|
||||
int pyexec_raw_repl(void);
|
||||
int pyexec_friendly_repl(void);
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-11-24 15:40-0500\n"
|
||||
"POT-Creation-Date: 2020-11-27 23:57-0500\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@ -844,6 +844,10 @@ msgstr ""
|
||||
msgid "Expected an Address"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/__init__.c
|
||||
msgid "Expected an alarm"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/_pixelbuf/PixelBuf.c
|
||||
#, c-format
|
||||
msgid "Expected tuple of length %d, got %d"
|
||||
@ -989,6 +993,10 @@ msgstr ""
|
||||
msgid "I2SOut not available"
|
||||
msgstr ""
|
||||
|
||||
#: ports/esp32s2/common-hal/alarm/pin/__init__.c
|
||||
msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
#, c-format
|
||||
msgid "IV must be %d bytes long"
|
||||
@ -1440,6 +1448,10 @@ msgid ""
|
||||
"%d bpp given"
|
||||
msgstr ""
|
||||
|
||||
#: ports/esp32s2/common-hal/alarm/__init__.c
|
||||
msgid "Only one alarm.time alarm can be set."
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/displayio/ColorConverter.c
|
||||
msgid "Only one color can be transparent at a time"
|
||||
msgstr ""
|
||||
@ -1497,6 +1509,10 @@ msgstr ""
|
||||
msgid "Pin number already reserved by EXTI"
|
||||
msgstr ""
|
||||
|
||||
#: ports/esp32s2/common-hal/alarm/__init__.c
|
||||
msgid "PinAlarm not yet implemented"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -1558,7 +1574,7 @@ msgstr ""
|
||||
msgid "RTC calibration is not supported on this board"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/time/__init__.c
|
||||
#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
|
||||
msgid "RTC is not supported on this board"
|
||||
msgstr ""
|
||||
|
||||
@ -1704,6 +1720,10 @@ msgstr ""
|
||||
msgid "Supply at least one UART pin"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/time/TimeAlarm.c
|
||||
msgid "Supply one of monotonic_time or epoch_time"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/gnss/GNSS.c
|
||||
msgid "System entry must be gnss.SatelliteSystem"
|
||||
msgstr ""
|
||||
@ -1767,6 +1787,10 @@ msgstr ""
|
||||
msgid "Tile width must exactly divide bitmap width"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/time/TimeAlarm.c
|
||||
msgid "Time is in the past."
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/Adapter.c
|
||||
#, c-format
|
||||
msgid "Timeout is too long: Maximum timeout length is %d seconds"
|
||||
@ -2481,6 +2505,10 @@ msgstr ""
|
||||
msgid "end_x should be an int"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/time/TimeAlarm.c
|
||||
msgid "epoch_time not supported on this board"
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/common-hal/busio/UART.c
|
||||
#, c-format
|
||||
msgid "error = 0x%08lX"
|
||||
@ -2850,6 +2878,10 @@ msgstr ""
|
||||
msgid "invalid syntax for number"
|
||||
msgstr ""
|
||||
|
||||
#: ports/esp32s2/common-hal/alarm/pin/__init__.c
|
||||
msgid "io must be rtc io"
|
||||
msgstr ""
|
||||
|
||||
#: py/objtype.c
|
||||
msgid "issubclass() arg 1 must be a class"
|
||||
msgstr ""
|
||||
@ -3537,6 +3569,10 @@ msgstr ""
|
||||
msgid "trapz is defined for 1D arrays of equal length"
|
||||
msgstr ""
|
||||
|
||||
#: ports/esp32s2/common-hal/alarm/pin/__init__.c
|
||||
msgid "trigger level must be 0 or 1"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/linalg/linalg.c
|
||||
msgid "tuple index out of range"
|
||||
msgstr ""
|
||||
@ -3679,6 +3715,10 @@ msgstr ""
|
||||
msgid "vectors must have same lengths"
|
||||
msgstr ""
|
||||
|
||||
#: ports/esp32s2/common-hal/alarm/pin/__init__.c
|
||||
msgid "wakeup conflict"
|
||||
msgstr ""
|
||||
|
||||
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
|
||||
msgid "watchdog not initialized"
|
||||
msgstr ""
|
||||
|
98
main.c
98
main.c
@ -47,19 +47,29 @@
|
||||
#include "mpconfigboard.h"
|
||||
#include "supervisor/background_callback.h"
|
||||
#include "supervisor/cpu.h"
|
||||
#include "supervisor/filesystem.h"
|
||||
#include "supervisor/memory.h"
|
||||
#include "supervisor/port.h"
|
||||
#include "supervisor/filesystem.h"
|
||||
#include "supervisor/serial.h"
|
||||
#include "supervisor/shared/autoreload.h"
|
||||
#include "supervisor/shared/translate.h"
|
||||
#include "supervisor/shared/rgb_led_status.h"
|
||||
#include "supervisor/shared/safe_mode.h"
|
||||
#include "supervisor/shared/status_leds.h"
|
||||
#include "supervisor/shared/stack.h"
|
||||
#include "supervisor/serial.h"
|
||||
#include "supervisor/shared/status_leds.h"
|
||||
#include "supervisor/shared/translate.h"
|
||||
#include "supervisor/shared/workflow.h"
|
||||
#include "supervisor/usb.h"
|
||||
|
||||
#include "shared-bindings/microcontroller/__init__.h"
|
||||
#include "shared-bindings/microcontroller/Processor.h"
|
||||
#include "shared-bindings/supervisor/Runtime.h"
|
||||
|
||||
#include "boards/board.h"
|
||||
|
||||
#if CIRCUITPY_ALARM
|
||||
#include "shared-bindings/alarm/__init__.h"
|
||||
#endif
|
||||
|
||||
#if CIRCUITPY_DISPLAYIO
|
||||
#include "shared-module/displayio/__init__.h"
|
||||
#endif
|
||||
@ -85,26 +95,6 @@
|
||||
#include "common-hal/canio/CAN.h"
|
||||
#endif
|
||||
|
||||
void do_str(const char *src, mp_parse_input_kind_t input_kind) {
|
||||
mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
|
||||
if (lex == NULL) {
|
||||
//printf("MemoryError: lexer could not allocate memory\n");
|
||||
return;
|
||||
}
|
||||
|
||||
nlr_buf_t nlr;
|
||||
if (nlr_push(&nlr) == 0) {
|
||||
qstr source_name = lex->source_name;
|
||||
mp_parse_tree_t parse_tree = mp_parse(lex, input_kind);
|
||||
mp_obj_t module_fun = mp_compile(&parse_tree, source_name, MP_EMIT_OPT_NONE, true);
|
||||
mp_call_function_0(module_fun);
|
||||
nlr_pop();
|
||||
} else {
|
||||
// uncaught exception
|
||||
mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
|
||||
}
|
||||
}
|
||||
|
||||
#if MICROPY_ENABLE_PYSTACK
|
||||
static size_t PLACE_IN_DTCM_BSS(_pystack[CIRCUITPY_PYSTACK_SIZE / sizeof(size_t)]);
|
||||
#endif
|
||||
@ -115,9 +105,13 @@ static void reset_devices(void) {
|
||||
#endif
|
||||
}
|
||||
|
||||
void start_mp(supervisor_allocation* heap) {
|
||||
STATIC void start_mp(supervisor_allocation* heap) {
|
||||
reset_status_led();
|
||||
autoreload_stop();
|
||||
supervisor_workflow_reset();
|
||||
#if CIRCUITPY_ALARM
|
||||
alarm_reset();
|
||||
#endif
|
||||
|
||||
// Stack limit should be less than real stack size, so we have a chance
|
||||
// to recover from limit hit. (Limit is measured in bytes.)
|
||||
@ -166,7 +160,7 @@ void start_mp(supervisor_allocation* heap) {
|
||||
#endif
|
||||
}
|
||||
|
||||
void stop_mp(void) {
|
||||
STATIC void stop_mp(void) {
|
||||
#if CIRCUITPY_NETWORK
|
||||
network_module_deinit();
|
||||
#endif
|
||||
@ -191,7 +185,7 @@ void stop_mp(void) {
|
||||
|
||||
// Look for the first file that exists in the list of filenames, using mp_import_stat().
|
||||
// Return its index. If no file found, return -1.
|
||||
const char* first_existing_file_in_list(const char * const * filenames) {
|
||||
STATIC const char* first_existing_file_in_list(const char * const * filenames) {
|
||||
for (int i = 0; filenames[i] != (char*)""; i++) {
|
||||
mp_import_stat_t stat = mp_import_stat(filenames[i]);
|
||||
if (stat == MP_IMPORT_STAT_FILE) {
|
||||
@ -201,7 +195,7 @@ const char* first_existing_file_in_list(const char * const * filenames) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool maybe_run_list(const char * const * filenames, pyexec_result_t* exec_result) {
|
||||
STATIC bool maybe_run_list(const char * const * filenames, pyexec_result_t* exec_result) {
|
||||
const char* filename = first_existing_file_in_list(filenames);
|
||||
if (filename == NULL) {
|
||||
return false;
|
||||
@ -215,7 +209,7 @@ bool maybe_run_list(const char * const * filenames, pyexec_result_t* exec_result
|
||||
return true;
|
||||
}
|
||||
|
||||
void cleanup_after_vm(supervisor_allocation* heap) {
|
||||
STATIC void cleanup_after_vm(supervisor_allocation* heap) {
|
||||
// Reset port-independent devices, like CIRCUITPY_BLEIO_HCI.
|
||||
reset_devices();
|
||||
// Turn off the display and flush the fileystem before the heap disappears.
|
||||
@ -244,7 +238,7 @@ void cleanup_after_vm(supervisor_allocation* heap) {
|
||||
reset_status_led();
|
||||
}
|
||||
|
||||
void print_code_py_status_message(safe_mode_t safe_mode) {
|
||||
STATIC void print_code_py_status_message(safe_mode_t safe_mode) {
|
||||
if (autoreload_is_enabled()) {
|
||||
serial_write_compressed(translate("Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.\n"));
|
||||
} else {
|
||||
@ -256,7 +250,7 @@ void print_code_py_status_message(safe_mode_t safe_mode) {
|
||||
}
|
||||
}
|
||||
|
||||
bool run_code_py(safe_mode_t safe_mode) {
|
||||
STATIC bool run_code_py(safe_mode_t safe_mode) {
|
||||
bool serial_connected_at_start = serial_connected();
|
||||
#if CIRCUITPY_AUTORELOAD_DELAY_MS > 0
|
||||
if (serial_connected_at_start) {
|
||||
@ -276,10 +270,12 @@ bool run_code_py(safe_mode_t safe_mode) {
|
||||
if (safe_mode == NO_SAFE_MODE) {
|
||||
new_status_color(MAIN_RUNNING);
|
||||
|
||||
static const char * const supported_filenames[] = STRING_LIST("code.txt", "code.py", "main.py", "main.txt");
|
||||
static const char * const supported_filenames[] = STRING_LIST(
|
||||
"code.txt", "code.py", "main.py", "main.txt");
|
||||
#if CIRCUITPY_FULL_BUILD
|
||||
static const char * const double_extension_filenames[] = STRING_LIST("code.txt.py", "code.py.txt", "code.txt.txt","code.py.py",
|
||||
"main.txt.py", "main.py.txt", "main.txt.txt","main.py.py");
|
||||
static const char * const double_extension_filenames[] = STRING_LIST(
|
||||
"code.txt.py", "code.py.txt", "code.txt.txt","code.py.py",
|
||||
"main.txt.py", "main.py.txt", "main.txt.txt","main.py.py");
|
||||
#endif
|
||||
|
||||
stack_resize();
|
||||
@ -295,13 +291,25 @@ bool run_code_py(safe_mode_t safe_mode) {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// TODO: on deep sleep, make sure display is refreshed before sleeping (for e-ink).
|
||||
|
||||
cleanup_after_vm(heap);
|
||||
|
||||
if (result.return_code & PYEXEC_FORCED_EXIT) {
|
||||
return reload_requested;
|
||||
}
|
||||
|
||||
#if CIRCUITPY_ALARM
|
||||
if (result.return_code & PYEXEC_DEEP_SLEEP) {
|
||||
common_hal_alarm_enter_deep_sleep();
|
||||
// Does not return.
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Program has finished running.
|
||||
|
||||
// Display a different completion message if the user has no USB attached (cannot save files)
|
||||
if (!serial_connected_at_start) {
|
||||
serial_write_compressed(translate("\nCode done running. Waiting for reload.\n"));
|
||||
@ -311,24 +319,32 @@ bool run_code_py(safe_mode_t safe_mode) {
|
||||
#if CIRCUITPY_DISPLAYIO
|
||||
bool refreshed_epaper_display = false;
|
||||
#endif
|
||||
|
||||
rgb_status_animation_t animation;
|
||||
prep_rgb_status_animation(&result, found_main, safe_mode, &animation);
|
||||
while (true) {
|
||||
|
||||
RUN_BACKGROUND_TASKS;
|
||||
if (reload_requested) {
|
||||
supervisor_set_run_reason(RUN_REASON_AUTO_RELOAD);
|
||||
reload_requested = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (serial_connected() && serial_bytes_available()) {
|
||||
// Skip REPL if reload was requested.
|
||||
return (serial_read() == CHAR_CTRL_D);
|
||||
bool ctrl_d = serial_read() == CHAR_CTRL_D;
|
||||
if (ctrl_d) {
|
||||
supervisor_set_run_reason(RUN_REASON_REPL_RELOAD);
|
||||
}
|
||||
return (ctrl_d);
|
||||
}
|
||||
|
||||
if (!serial_connected_before_animation && serial_connected()) {
|
||||
if (!serial_connected_at_start) {
|
||||
print_code_py_status_message(safe_mode);
|
||||
}
|
||||
|
||||
print_safe_mode_message(safe_mode);
|
||||
serial_write("\n");
|
||||
serial_write_compressed(translate("Press any key to enter the REPL. Use CTRL-D to reload."));
|
||||
@ -351,7 +367,7 @@ bool run_code_py(safe_mode_t safe_mode) {
|
||||
|
||||
FIL* boot_output_file;
|
||||
|
||||
void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
|
||||
STATIC void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
|
||||
// If not in safe mode, run boot before initing USB and capture output in a
|
||||
// file.
|
||||
if (filesystem_present() && safe_mode == NO_SAFE_MODE && MP_STATE_VM(vfs_mount_table) != NULL) {
|
||||
@ -392,8 +408,9 @@ void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
|
||||
if (!skip_boot_output) {
|
||||
// Wait 1.5 seconds before opening CIRCUITPY_BOOT_OUTPUT_FILE for write,
|
||||
// in case power is momentary or will fail shortly due to, say a low, battery.
|
||||
mp_hal_delay_ms(1500);
|
||||
|
||||
if (common_hal_mcu_processor_get_reset_reason() == RESET_REASON_POWER_ON) {
|
||||
mp_hal_delay_ms(1500);
|
||||
}
|
||||
// USB isn't up, so we can write the file.
|
||||
filesystem_set_internal_writable_by_usb(false);
|
||||
f_open(fs, boot_output_file, CIRCUITPY_BOOT_OUTPUT_FILE, FA_WRITE | FA_CREATE_ALWAYS);
|
||||
@ -429,7 +446,7 @@ void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
|
||||
}
|
||||
}
|
||||
|
||||
int run_repl(void) {
|
||||
STATIC int run_repl(void) {
|
||||
int exit_code = PYEXEC_FORCED_EXIT;
|
||||
stack_resize();
|
||||
filesystem_flush();
|
||||
@ -479,6 +496,9 @@ int __attribute__((used)) main(void) {
|
||||
reset_devices();
|
||||
reset_board();
|
||||
|
||||
// This is first time we are running CircuitPython after a reset or power-up.
|
||||
supervisor_set_run_reason(RUN_REASON_STARTUP);
|
||||
|
||||
// If not in safe mode turn on autoreload by default but before boot.py in case it wants to change it.
|
||||
if (safe_mode == NO_SAFE_MODE) {
|
||||
autoreload_enable();
|
||||
|
@ -65,6 +65,7 @@
|
||||
|
||||
#include "py/mphal.h"
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
|
||||
#include "samd/adc.h"
|
||||
|
||||
@ -349,3 +350,7 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
|
||||
return RESET_REASON_UNKNOWN;
|
||||
}
|
||||
|
@ -31,6 +31,7 @@
|
||||
// For NAN: remove when not needed.
|
||||
#include <math.h>
|
||||
#include "py/mphal.h"
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
|
||||
uint32_t common_hal_mcu_processor_get_frequency(void) {
|
||||
return cxd56_get_cpu_baseclk();
|
||||
@ -47,3 +48,7 @@ float common_hal_mcu_processor_get_voltage(void) {
|
||||
void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
|
||||
boardctl(BOARDIOC_UNIQUEID, (uintptr_t) raw_id);
|
||||
}
|
||||
|
||||
mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
|
||||
return RESET_REASON_UNKNOWN;
|
||||
}
|
||||
|
@ -336,10 +336,10 @@ $(BUILD)/firmware.uf2: $(BUILD)/circuitpython-firmware.bin
|
||||
$(Q)$(PYTHON3) $(TOP)/tools/uf2/utils/uf2conv.py -f 0xbfdd4eee -b 0x0000 -c -o $@ $^
|
||||
|
||||
flash: $(BUILD)/firmware.bin
|
||||
esptool.py --chip esp32s2 -p $(PORT) --no-stub -b 460800 --before=default_reset --after=hard_reset write_flash $(FLASH_FLAGS) 0x0000 $^
|
||||
esptool.py --chip esp32s2 -p $(PORT) --no-stub -b 460800 --before=default_reset --after=no_reset write_flash $(FLASH_FLAGS) 0x0000 $^
|
||||
|
||||
flash-circuitpython-only: $(BUILD)/circuitpython-firmware.bin
|
||||
esptool.py --chip esp32s2 -p $(PORT) --no-stub -b 460800 --before=default_reset --after=hard_reset write_flash $(FLASH_FLAGS) 0x10000 $^
|
||||
esptool.py --chip esp32s2 -p $(PORT) --no-stub -b 460800 --before=default_reset --after=no_reset write_flash $(FLASH_FLAGS) 0x10000 $^
|
||||
|
||||
include $(TOP)/py/mkrules.mk
|
||||
|
||||
|
198
ports/esp32s2/common-hal/alarm/__init__.c
Normal file
198
ports/esp32s2/common-hal/alarm/__init__.c
Normal file
@ -0,0 +1,198 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2016 Scott Shawcroft for Adafruit Industries
|
||||
* Copyright (c) 2019 Lucian Copeland for Adafruit Industries
|
||||
*
|
||||
* 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 "py/obj.h"
|
||||
#include "py/objtuple.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "shared-bindings/alarm/pin/PinAlarm.h"
|
||||
#include "shared-bindings/alarm/time/TimeAlarm.h"
|
||||
#include "shared-bindings/microcontroller/__init__.h"
|
||||
#include "shared-bindings/time/__init__.h"
|
||||
#include "shared-bindings/wifi/__init__.h"
|
||||
|
||||
#include "common-hal/alarm/__init__.h"
|
||||
|
||||
#include "esp_log.h"
|
||||
#include "esp_sleep.h"
|
||||
|
||||
STATIC mp_obj_tuple_t *_deep_sleep_alarms;
|
||||
|
||||
void alarm_reset(void) {
|
||||
_deep_sleep_alarms = mp_const_empty_tuple;
|
||||
}
|
||||
|
||||
void common_hal_alarm_disable_all(void) {
|
||||
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL);
|
||||
}
|
||||
|
||||
mp_obj_t common_hal_alarm_get_wake_alarm(void) {
|
||||
switch (esp_sleep_get_wakeup_cause()) {
|
||||
case ESP_SLEEP_WAKEUP_TIMER: {
|
||||
// Wake up from timer.
|
||||
alarm_time_time_alarm_obj_t *timer = m_new_obj(alarm_time_time_alarm_obj_t);
|
||||
timer->base.type = &alarm_time_time_alarm_type;
|
||||
return timer;
|
||||
}
|
||||
|
||||
case ESP_SLEEP_WAKEUP_EXT0: {
|
||||
// Wake up from GPIO
|
||||
alarm_pin_pin_alarm_obj_t *ext0 = m_new_obj(alarm_pin_pin_alarm_obj_t);
|
||||
ext0->base.type = &alarm_pin_pin_alarm_type;
|
||||
return ext0;
|
||||
}
|
||||
|
||||
case ESP_SLEEP_WAKEUP_TOUCHPAD:
|
||||
// TODO: implement TouchIO
|
||||
// Wake up from touch on pad, esp_sleep_get_touchpad_wakeup_status()
|
||||
break;
|
||||
|
||||
case ESP_SLEEP_WAKEUP_UNDEFINED:
|
||||
default:
|
||||
// Not a deep sleep reset.
|
||||
break;
|
||||
}
|
||||
return mp_const_none;
|
||||
}
|
||||
|
||||
// Set up light sleep or deep sleep alarms.
|
||||
STATIC void setup_sleep_alarms(size_t n_alarms, const mp_obj_t *alarms) {
|
||||
bool time_alarm_set = false;
|
||||
alarm_time_time_alarm_obj_t *time_alarm = MP_OBJ_NULL;
|
||||
|
||||
for (size_t i = 0; i < n_alarms; i++) {
|
||||
if (MP_OBJ_IS_TYPE(alarms[i], &alarm_pin_pin_alarm_type)) {
|
||||
mp_raise_NotImplementedError(translate("PinAlarm not yet implemented"));
|
||||
}
|
||||
else if (MP_OBJ_IS_TYPE(alarms[i], &alarm_time_time_alarm_type)) {
|
||||
if (time_alarm_set) {
|
||||
mp_raise_ValueError(translate("Only one alarm.time alarm can be set."));
|
||||
}
|
||||
time_alarm = MP_OBJ_TO_PTR(alarms[i]);
|
||||
time_alarm_set = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (time_alarm != MP_OBJ_NULL) {
|
||||
// Compute how long to actually sleep, considering the time now.
|
||||
mp_float_t now_secs = uint64_to_float(common_hal_time_monotonic_ms()) / 1000.0f;
|
||||
mp_float_t wakeup_in_secs = MAX(0.0f, time_alarm->monotonic_time - now_secs);
|
||||
const uint64_t sleep_for_us = (uint64_t) (wakeup_in_secs * 1000000);
|
||||
ESP_LOGI("ALARM", "will sleep for us: %lld", sleep_for_us);
|
||||
esp_sleep_enable_timer_wakeup(sleep_for_us);
|
||||
}
|
||||
}
|
||||
|
||||
mp_obj_t common_hal_alarm_wait_until_alarms(size_t n_alarms, const mp_obj_t *alarms) {
|
||||
if (n_alarms == 0) {
|
||||
return mp_const_none;
|
||||
}
|
||||
|
||||
bool time_alarm_set = false;
|
||||
alarm_time_time_alarm_obj_t *time_alarm = MP_OBJ_NULL;
|
||||
|
||||
for (size_t i = 0; i < n_alarms; i++) {
|
||||
if (MP_OBJ_IS_TYPE(alarms[i], &alarm_pin_pin_alarm_type)) {
|
||||
mp_raise_NotImplementedError(translate("PinAlarm not yet implemented"));
|
||||
}
|
||||
else if (MP_OBJ_IS_TYPE(alarms[i], &alarm_time_time_alarm_type)) {
|
||||
if (time_alarm_set) {
|
||||
mp_raise_ValueError(translate("Only one alarm.time alarm can be set."));
|
||||
}
|
||||
time_alarm = MP_OBJ_TO_PTR(alarms[i]);
|
||||
time_alarm_set = true;
|
||||
}
|
||||
}
|
||||
|
||||
ESP_LOGI("ALARM", "waiting for alarms");
|
||||
|
||||
if (time_alarm_set && n_alarms == 1) {
|
||||
// If we're only checking time, avoid a polling loop, so maybe we can save some power.
|
||||
const mp_float_t now_secs = uint64_to_float(common_hal_time_monotonic_ms()) / 1000.0f;
|
||||
const mp_float_t wakeup_in_secs = MAX(0.0f, time_alarm->monotonic_time - now_secs);
|
||||
const uint32_t delay_ms = (uint32_t) (wakeup_in_secs * 1000.0f);
|
||||
ESP_LOGI("ALARM", "Delay for ms: %d", delay_ms);
|
||||
common_hal_time_delay_ms((uint32_t) delay_ms);
|
||||
} else {
|
||||
// Poll for alarms.
|
||||
while (true) {
|
||||
RUN_BACKGROUND_TASKS;
|
||||
// Allow ctrl-C interrupt.
|
||||
if (mp_hal_is_interrupted()) {
|
||||
return mp_const_none;
|
||||
}
|
||||
|
||||
// TODO: Check PinAlarms.
|
||||
|
||||
if (time_alarm != MP_OBJ_NULL &&
|
||||
common_hal_time_monotonic_ms() * 1000.f >= time_alarm->monotonic_time) {
|
||||
return time_alarm;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mp_const_none;
|
||||
}
|
||||
|
||||
// Is it safe to do a light sleep? Check whether WiFi is on or there are
|
||||
// other ongoing tasks that should not be shut down.
|
||||
static bool light_sleep_ok(void) {
|
||||
return !common_hal_wifi_radio_get_enabled(&common_hal_wifi_radio_obj);
|
||||
}
|
||||
|
||||
mp_obj_t common_hal_alarm_light_sleep_until_alarms(size_t n_alarms, const mp_obj_t *alarms) {
|
||||
if (n_alarms == 0) {
|
||||
return mp_const_none;
|
||||
}
|
||||
|
||||
if (light_sleep_ok()) {
|
||||
ESP_LOGI("ALARM", "start light sleep");
|
||||
setup_sleep_alarms(n_alarms, alarms);
|
||||
esp_light_sleep_start();
|
||||
return common_hal_alarm_get_wake_alarm();
|
||||
} else {
|
||||
// Don't do an ESP32 light sleep.
|
||||
return common_hal_alarm_wait_until_alarms(n_alarms, alarms);
|
||||
}
|
||||
}
|
||||
|
||||
void common_hal_alarm_exit_and_deep_sleep_until_alarms(size_t n_alarms, const mp_obj_t *alarms) {
|
||||
setup_sleep_alarms(n_alarms, alarms);
|
||||
|
||||
// Raise an exception, which will be processed in main.c.
|
||||
mp_raise_arg1(&mp_type_DeepSleepRequest, NULL);
|
||||
}
|
||||
|
||||
void common_hal_alarm_prepare_for_deep_sleep(void) {
|
||||
// Turn off WiFi and anything else that should be shut down cleanly.
|
||||
common_hal_wifi_radio_set_enabled(&common_hal_wifi_radio_obj, false);
|
||||
}
|
||||
|
||||
void NORETURN common_hal_alarm_enter_deep_sleep(void) {
|
||||
ESP_LOGI("ALARM", "start deep sleep");
|
||||
esp_deep_sleep_start();
|
||||
}
|
32
ports/esp32s2/common-hal/alarm/__init__.h
Normal file
32
ports/esp32s2/common-hal/alarm/__init__.h
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_ALARM__INIT__H
|
||||
#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_ALARM__INIT__H
|
||||
|
||||
void alarm_reset(void);
|
||||
|
||||
#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_ALARM__INIT__H
|
53
ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
Normal file
53
ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* 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 "esp_sleep.h"
|
||||
|
||||
#include "shared-bindings/alarm/pin/PinAlarm.h"
|
||||
#include "shared-bindings/microcontroller/Pin.h"
|
||||
|
||||
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) {
|
||||
self->pin = pin;
|
||||
self->value = value;
|
||||
self->edge = edge;
|
||||
self->pull = pull;
|
||||
}
|
||||
|
||||
mcu_pin_obj_t *common_hal_alarm_pin_pin_alarm_get_pin(alarm_pin_pin_alarm_obj_t *self) {
|
||||
return self->pin;
|
||||
}
|
||||
|
||||
bool common_hal_alarm_pin_pin_alarm_get_value(alarm_pin_pin_alarm_obj_t *self) {
|
||||
return self->value;
|
||||
}
|
||||
|
||||
bool common_hal_alarm_pin_pin_alarm_get_edge(alarm_pin_pin_alarm_obj_t *self) {
|
||||
return self->edge;
|
||||
}
|
||||
|
||||
bool common_hal_alarm_pin_pin_alarm_get_pull(alarm_pin_pin_alarm_obj_t *self) {
|
||||
return self->pull;
|
||||
}
|
37
ports/esp32s2/common-hal/alarm/pin/PinAlarm.h
Normal file
37
ports/esp32s2/common-hal/alarm/pin/PinAlarm.h
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* 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 "py/obj.h"
|
||||
#include "py/objtuple.h"
|
||||
|
||||
typedef struct {
|
||||
mp_obj_base_t base;
|
||||
mcu_pin_obj_t *pin;
|
||||
bool value;
|
||||
bool all_same_value;
|
||||
bool edge;
|
||||
bool pull;
|
||||
} alarm_pin_pin_alarm_obj_t;
|
35
ports/esp32s2/common-hal/alarm/pin/__init__.c
Normal file
35
ports/esp32s2/common-hal/alarm/pin/__init__.c
Normal file
@ -0,0 +1,35 @@
|
||||
#include "shared-bindings/alarm_io/__init__.h"
|
||||
|
||||
#include "esp_sleep.h"
|
||||
#include "driver/rtc_io.h"
|
||||
|
||||
mp_obj_t common_hal_alarm_io_pin_state (alarm_io_obj_t *self_in) {
|
||||
if (!rtc_gpio_is_valid_gpio(self_in->gpio)) {
|
||||
mp_raise_ValueError(translate("io must be rtc io"));
|
||||
}
|
||||
|
||||
if (self_in->pull && !self_in->level) {
|
||||
for (uint8_t i = 0; i<=4; i+=2) {
|
||||
if (self_in->gpio == i) {
|
||||
mp_raise_ValueError(translate("IOs 0, 2 & 4 do not support internal pullup in sleep"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch(esp_sleep_enable_ext0_wakeup(self_in->gpio, self_in->level)) {
|
||||
case ESP_ERR_INVALID_ARG:
|
||||
mp_raise_ValueError(translate("trigger level must be 0 or 1"));
|
||||
case ESP_ERR_INVALID_STATE:
|
||||
mp_raise_RuntimeError(translate("wakeup conflict"));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (self_in->pull) { (self_in->level) ? rtc_gpio_pulldown_en(self_in->gpio) : rtc_gpio_pullup_en(self_in->gpio); }
|
||||
|
||||
return self_in;
|
||||
}
|
||||
|
||||
void common_hal_alarm_io_disable (void) {
|
||||
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_EXT0 | ESP_SLEEP_WAKEUP_EXT1);
|
||||
}
|
39
ports/esp32s2/common-hal/alarm/time/TimeAlarm.c
Normal file
39
ports/esp32s2/common-hal/alarm/time/TimeAlarm.c
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* 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 "esp_sleep.h"
|
||||
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "shared-bindings/alarm/time/TimeAlarm.h"
|
||||
|
||||
void common_hal_alarm_time_time_alarm_construct(alarm_time_time_alarm_obj_t *self, mp_float_t monotonic_time) {
|
||||
self->monotonic_time = monotonic_time;
|
||||
}
|
||||
|
||||
mp_float_t common_hal_alarm_time_time_alarm_get_monotonic_time(alarm_time_time_alarm_obj_t *self) {
|
||||
return self->monotonic_time;
|
||||
}
|
33
ports/esp32s2/common-hal/alarm/time/TimeAlarm.h
Normal file
33
ports/esp32s2/common-hal/alarm/time/TimeAlarm.h
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* 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 "py/obj.h"
|
||||
|
||||
typedef struct {
|
||||
mp_obj_base_t base;
|
||||
mp_float_t monotonic_time; // values compatible with time.monotonic_time()
|
||||
} alarm_time_time_alarm_obj_t;
|
@ -28,10 +28,15 @@
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
#include "supervisor/shared/translate.h"
|
||||
|
||||
#include "esp_sleep.h"
|
||||
#include "esp_system.h"
|
||||
|
||||
#include "soc/efuse_reg.h"
|
||||
|
||||
#include "components/driver/esp32s2/include/driver/temp_sensor.h"
|
||||
@ -74,3 +79,44 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
|
||||
*ptr-- = swap_nibbles(mac_address_part & 0xff); mac_address_part >>= 8;
|
||||
*ptr-- = swap_nibbles(mac_address_part & 0xff);
|
||||
}
|
||||
|
||||
mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
|
||||
switch (esp_reset_reason()) {
|
||||
case ESP_RST_POWERON:
|
||||
return RESET_REASON_POWER_ON;
|
||||
|
||||
case ESP_RST_SW:
|
||||
case ESP_RST_PANIC:
|
||||
return RESET_REASON_SOFTWARE;
|
||||
|
||||
case ESP_RST_INT_WDT:
|
||||
case ESP_RST_TASK_WDT:
|
||||
case ESP_RST_WDT:
|
||||
return RESET_REASON_WATCHDOG;
|
||||
|
||||
case ESP_RST_BROWNOUT:
|
||||
return RESET_REASON_BROWNOUT;
|
||||
|
||||
case ESP_RST_SDIO:
|
||||
case ESP_RST_EXT:
|
||||
return RESET_REASON_RESET_PIN;
|
||||
|
||||
case ESP_RST_DEEPSLEEP:
|
||||
switch (esp_sleep_get_wakeup_cause()) {
|
||||
case ESP_SLEEP_WAKEUP_TIMER:
|
||||
case ESP_SLEEP_WAKEUP_EXT0:
|
||||
case ESP_SLEEP_WAKEUP_EXT1:
|
||||
case ESP_SLEEP_WAKEUP_TOUCHPAD:
|
||||
return RESET_REASON_DEEP_SLEEP_ALARM;
|
||||
|
||||
case ESP_SLEEP_WAKEUP_UNDEFINED:
|
||||
default:
|
||||
return RESET_REASON_UNKNOWN;
|
||||
}
|
||||
|
||||
case ESP_RST_UNKNOWN:
|
||||
default:
|
||||
return RESET_REASON_UNKNOWN;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -24,8 +24,8 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_LITEX_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
|
||||
#define MICROPY_INCLUDED_LITEX_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
|
||||
#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
|
||||
#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
|
||||
|
||||
#define COMMON_HAL_MCU_PROCESSOR_UID_LENGTH 6
|
||||
|
||||
@ -36,4 +36,4 @@ typedef struct {
|
||||
// Stores no state currently.
|
||||
} mcu_processor_obj_t;
|
||||
|
||||
#endif // MICROPY_INCLUDED_LITEX_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
|
||||
#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
|
||||
|
@ -25,8 +25,8 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "py/mphal.h"
|
||||
#include "py/obj.h"
|
||||
#include "py/mphal.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "common-hal/microcontroller/Pin.h"
|
||||
|
@ -24,11 +24,11 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_RTC_RTC_H
|
||||
#define MICROPY_INCLUDED_NRF_COMMON_HAL_RTC_RTC_H
|
||||
#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_RTC_RTC_H
|
||||
#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_RTC_RTC_H
|
||||
|
||||
extern void rtc_init(void);
|
||||
extern void rtc_reset(void);
|
||||
extern void common_hal_rtc_init(void);
|
||||
|
||||
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_RTC_RTC_H
|
||||
#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_RTC_RTC_H
|
||||
|
@ -24,8 +24,8 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_LITEX_COMMON_HAL_SUPERVISOR_RUNTIME_H
|
||||
#define MICROPY_INCLUDED_LITEX_COMMON_HAL_SUPERVISOR_RUNTIME_H
|
||||
#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_SUPERVISOR_RUNTIME_H
|
||||
#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_SUPERVISOR_RUNTIME_H
|
||||
|
||||
#include "py/obj.h"
|
||||
|
||||
@ -34,4 +34,4 @@ typedef struct {
|
||||
// Stores no state currently.
|
||||
} super_runtime_obj_t;
|
||||
|
||||
#endif // MICROPY_INCLUDED_LITEX_COMMON_HAL_SUPERVISOR_RUNTIME_H
|
||||
#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_SUPERVISOR_RUNTIME_H
|
||||
|
@ -28,7 +28,7 @@
|
||||
|
||||
#include "tick.h"
|
||||
|
||||
uint64_t common_hal_time_monotonic(void) {
|
||||
uint64_t common_hal_time_monotonic_ms(void) {
|
||||
return supervisor_ticks_ms64();
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,7 @@ LONGINT_IMPL = MPZ
|
||||
|
||||
# These modules are implemented in ports/<port>/common-hal:
|
||||
CIRCUITPY_FULL_BUILD = 1
|
||||
CIRCUITPY_ALARM = 1
|
||||
CIRCUITPY_AUDIOBUSIO = 0
|
||||
CIRCUITPY_AUDIOIO = 0
|
||||
CIRCUITPY_CANIO = 1
|
||||
|
@ -23,9 +23,9 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#ifndef MICROPY_INCLUDED_LITEX_INTERNAL_FLASH_ROOT_POINTERS_H
|
||||
#define MICROPY_INCLUDED_LITEX_INTERNAL_FLASH_ROOT_POINTERS_H
|
||||
#ifndef MICROPY_INCLUDED_ESP32S2_INTERNAL_FLASH_ROOT_POINTERS_H
|
||||
#define MICROPY_INCLUDED_ESP32S2_INTERNAL_FLASH_ROOT_POINTERS_H
|
||||
|
||||
#define FLASH_ROOT_POINTERS
|
||||
|
||||
#endif // MICROPY_INCLUDED_LITEX_INTERNAL_FLASH_ROOT_POINTERS_H
|
||||
#endif // MICROPY_INCLUDED_ESP32S2_INTERNAL_FLASH_ROOT_POINTERS_H
|
||||
|
@ -26,8 +26,10 @@
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
#include "supervisor/shared/translate.h"
|
||||
|
||||
#include "csr.h"
|
||||
@ -62,3 +64,7 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
|
||||
raw_id[13] = csr_readl(CSR_VERSION_SEED_ADDR + 8);
|
||||
raw_id[14] = csr_readl(CSR_VERSION_SEED_ADDR + 12);
|
||||
}
|
||||
|
||||
mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
|
||||
return RESET_REASON_UNKNOWN;
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
|
||||
#include "tick.h"
|
||||
|
||||
uint64_t common_hal_time_monotonic(void) {
|
||||
uint64_t common_hal_time_monotonic_ms(void) {
|
||||
return supervisor_ticks_ms64();
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <math.h>
|
||||
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
|
||||
#include "fsl_tempmon.h"
|
||||
#include "fsl_ocotp.h"
|
||||
@ -70,3 +71,7 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
|
||||
}
|
||||
OCOTP_Deinit(OCOTP);
|
||||
}
|
||||
|
||||
mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
|
||||
return RESET_REASON_UNKNOWN;
|
||||
}
|
||||
|
@ -24,8 +24,8 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
#define MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
#ifndef MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1011_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
#define MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1011_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
|
||||
extern LPI2C_Type *mcu_i2c_banks[2];
|
||||
|
||||
@ -47,4 +47,4 @@ extern const mcu_periph_obj_t mcu_uart_cts_list[4];
|
||||
|
||||
extern const mcu_pwm_obj_t mcu_pwm_list[20];
|
||||
|
||||
#endif // MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIP_H
|
||||
#endif // MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1011_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
|
@ -24,8 +24,8 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
#define MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
#ifndef MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1062_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
#define MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1062_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
|
||||
extern LPI2C_Type *mcu_i2c_banks[4];
|
||||
|
||||
@ -47,4 +47,4 @@ extern const mcu_periph_obj_t mcu_uart_cts_list[9];
|
||||
|
||||
extern const mcu_pwm_obj_t mcu_pwm_list[67];
|
||||
|
||||
#endif // MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
#endif // MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1062_PERIPHERALS_MIMXRT1011_PERIPH_H
|
||||
|
@ -24,8 +24,10 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
#include "supervisor/shared/translate.h"
|
||||
|
||||
#include "nrfx_saadc.h"
|
||||
@ -119,3 +121,7 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
|
||||
((uint32_t*) raw_id)[i] = NRF_FICR->DEVICEID[i];
|
||||
}
|
||||
}
|
||||
|
||||
mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
|
||||
return RESET_REASON_UNKNOWN;
|
||||
}
|
||||
|
@ -24,8 +24,8 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
|
||||
#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
|
||||
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
|
||||
#define MICROPY_INCLUDED_NRF_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
|
||||
|
||||
void *common_hal_rgbmatrix_timer_allocate(void);
|
||||
void common_hal_rgbmatrix_timer_enable(void*);
|
||||
|
@ -25,9 +25,12 @@
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
#include "supervisor/shared/translate.h"
|
||||
|
||||
#include STM32_HAL_H
|
||||
|
||||
#if CPY_STM32F4
|
||||
@ -138,3 +141,7 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
|
||||
return RESET_REASON_UNKNOWN;
|
||||
}
|
||||
|
@ -24,8 +24,8 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
|
||||
#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
|
||||
#ifndef MICROPY_INCLUDED_STM_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
|
||||
#define MICROPY_INCLUDED_STM_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
|
||||
|
||||
void *common_hal_rgbmatrix_timer_allocate(void);
|
||||
void common_hal_rgbmatrix_timer_enable(void*);
|
||||
|
@ -99,6 +99,9 @@ endif
|
||||
ifeq ($(CIRCUITPY_AESIO),1)
|
||||
SRC_PATTERNS += aesio/%
|
||||
endif
|
||||
ifeq ($(CIRCUITPY_ALARM),1)
|
||||
SRC_PATTERNS += alarm/%
|
||||
endif
|
||||
ifeq ($(CIRCUITPY_ANALOGIO),1)
|
||||
SRC_PATTERNS += analogio/%
|
||||
endif
|
||||
@ -298,6 +301,9 @@ SRC_COMMON_HAL_ALL = \
|
||||
_bleio/__init__.c \
|
||||
_pew/PewPew.c \
|
||||
_pew/__init__.c \
|
||||
alarm/__init__.c \
|
||||
alarm/pin/PinAlarm.c \
|
||||
alarm/time/TimeAlarm.c \
|
||||
analogio/AnalogIn.c \
|
||||
analogio/AnalogOut.c \
|
||||
analogio/__init__.c \
|
||||
@ -387,15 +393,17 @@ $(filter $(SRC_PATTERNS), \
|
||||
_bleio/Address.c \
|
||||
_bleio/Attribute.c \
|
||||
_bleio/ScanEntry.c \
|
||||
canio/Match.c \
|
||||
_eve/__init__.c \
|
||||
camera/ImageFormat.c \
|
||||
canio/Match.c \
|
||||
digitalio/Direction.c \
|
||||
digitalio/DriveMode.c \
|
||||
digitalio/Pull.c \
|
||||
fontio/Glyph.c \
|
||||
math/__init__.c \
|
||||
microcontroller/ResetReason.c \
|
||||
microcontroller/RunMode.c \
|
||||
supervisor/RunReason.c \
|
||||
)
|
||||
|
||||
SRC_BINDINGS_ENUMS += \
|
||||
@ -406,9 +414,6 @@ SRC_SHARED_MODULE_ALL = \
|
||||
_bleio/Attribute.c \
|
||||
_bleio/ScanEntry.c \
|
||||
_bleio/ScanResults.c \
|
||||
canio/Match.c \
|
||||
canio/Message.c \
|
||||
canio/RemoteTransmissionRequest.c \
|
||||
_eve/__init__.c \
|
||||
_pixelbuf/PixelBuf.c \
|
||||
_pixelbuf/__init__.c \
|
||||
@ -433,6 +438,9 @@ SRC_SHARED_MODULE_ALL = \
|
||||
bitbangio/__init__.c \
|
||||
board/__init__.c \
|
||||
busio/OneWire.c \
|
||||
canio/Match.c \
|
||||
canio/Message.c \
|
||||
canio/RemoteTransmissionRequest.c \
|
||||
displayio/Bitmap.c \
|
||||
displayio/ColorConverter.c \
|
||||
displayio/Display.c \
|
||||
|
@ -245,6 +245,13 @@ extern const struct _mp_obj_module_t aesio_module;
|
||||
#define AESIO_MODULE
|
||||
#endif
|
||||
|
||||
#if CIRCUITPY_ALARM
|
||||
extern const struct _mp_obj_module_t alarm_module;
|
||||
#define ALARM_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_alarm), (mp_obj_t)&alarm_module },
|
||||
#else
|
||||
#define ALARM_MODULE
|
||||
#endif
|
||||
|
||||
#if CIRCUITPY_ANALOGIO
|
||||
#define ANALOGIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module },
|
||||
extern const struct _mp_obj_module_t analogio_module;
|
||||
@ -609,7 +616,6 @@ extern const struct _mp_obj_module_t sdioio_module;
|
||||
#define SDIOIO_MODULE
|
||||
#endif
|
||||
|
||||
|
||||
#if CIRCUITPY_SHARPDISPLAY
|
||||
extern const struct _mp_obj_module_t sharpdisplay_module;
|
||||
#define SHARPDISPLAY_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_sharpdisplay),(mp_obj_t)&sharpdisplay_module },
|
||||
@ -774,6 +780,7 @@ extern const struct _mp_obj_module_t wifi_module;
|
||||
// Some are omitted because they're in MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS above.
|
||||
#define MICROPY_PORT_BUILTIN_MODULES_STRONG_LINKS \
|
||||
AESIO_MODULE \
|
||||
ALARM_MODULE \
|
||||
ANALOGIO_MODULE \
|
||||
AUDIOBUSIO_MODULE \
|
||||
AUDIOCORE_MODULE \
|
||||
|
@ -39,6 +39,12 @@ CFLAGS += -DMICROPY_PY_ASYNC_AWAIT=$(MICROPY_PY_ASYNC_AWAIT)
|
||||
CIRCUITPY_AESIO ?= 0
|
||||
CFLAGS += -DCIRCUITPY_AESIO=$(CIRCUITPY_AESIO)
|
||||
|
||||
# TODO: CIRCUITPY_ALARM will gradually be added to
|
||||
# as many ports as possible
|
||||
# so make this 1 or CIRCUITPY_FULL_BUILD eventually
|
||||
CIRCUITPY_ALARM ?= 0
|
||||
CFLAGS += -DCIRCUITPY_ALARM=$(CIRCUITPY_ALARM)
|
||||
|
||||
CIRCUITPY_ANALOGIO ?= 1
|
||||
CFLAGS += -DCIRCUITPY_ANALOGIO=$(CIRCUITPY_ANALOGIO)
|
||||
|
||||
|
@ -35,12 +35,12 @@ typedef struct {
|
||||
} cp_enum_obj_t;
|
||||
|
||||
#define MAKE_ENUM_VALUE(type, prefix, name, value) \
|
||||
STATIC const cp_enum_obj_t prefix ## _ ## name ## _obj = { \
|
||||
const cp_enum_obj_t prefix ## _ ## name ## _obj = { \
|
||||
{ &type }, value, MP_QSTR_ ## name, \
|
||||
}
|
||||
|
||||
#define MAKE_ENUM_MAP(name) \
|
||||
STATIC const mp_rom_map_elem_t name ## _locals_table[] =
|
||||
const mp_rom_map_elem_t name ## _locals_table[] =
|
||||
|
||||
#define MAKE_ENUM_MAP_ENTRY(prefix, name) \
|
||||
{ MP_ROM_QSTR(MP_QSTR_ ## name), MP_ROM_PTR(&prefix ## _ ## name ## _obj) }
|
||||
|
@ -47,7 +47,9 @@ def preprocess(command, output_dir, fn):
|
||||
print(e, file=sys.stderr)
|
||||
|
||||
def maybe_preprocess(command, output_dir, fn):
|
||||
if subprocess.call(["grep", "-lqE", "(MP_QSTR|translate)", fn]) == 0:
|
||||
# Preprocess the source file if it contains "MP_QSTR", "translate",
|
||||
# or if it uses enum.h (which generates "MP_QSTR" strings.
|
||||
if subprocess.call(["grep", "-lqE", r"(MP_QSTR|translate|enum\.h)", fn]) == 0:
|
||||
preprocess(command, output_dir, fn)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
5
py/obj.h
5
py/obj.h
@ -640,6 +640,10 @@ extern const mp_obj_type_t mp_type_UnicodeError;
|
||||
extern const mp_obj_type_t mp_type_ValueError;
|
||||
extern const mp_obj_type_t mp_type_ViperTypeError;
|
||||
extern const mp_obj_type_t mp_type_ZeroDivisionError;
|
||||
#if CIRCUITPY_ALARM
|
||||
extern const mp_obj_type_t mp_type_DeepSleepRequest;
|
||||
#endif
|
||||
|
||||
|
||||
// Constant objects, globally accessible
|
||||
// The macros are for convenience only
|
||||
@ -679,6 +683,7 @@ mp_obj_t mp_obj_new_bytearray_by_ref(size_t n, void *items);
|
||||
#if MICROPY_PY_BUILTINS_FLOAT
|
||||
mp_obj_t mp_obj_new_int_from_float(mp_float_t val);
|
||||
mp_obj_t mp_obj_new_complex(mp_float_t real, mp_float_t imag);
|
||||
extern mp_float_t uint64_to_float(uint64_t ui64);
|
||||
#endif
|
||||
mp_obj_t mp_obj_new_exception(const mp_obj_type_t *exc_type);
|
||||
mp_obj_t mp_obj_new_exception_arg1(const mp_obj_type_t *exc_type, mp_obj_t arg);
|
||||
|
@ -318,6 +318,9 @@ MP_DEFINE_EXCEPTION(Exception, BaseException)
|
||||
#if MICROPY_PY_BUILTINS_STR_UNICODE
|
||||
MP_DEFINE_EXCEPTION(UnicodeError, ValueError)
|
||||
//TODO: Implement more UnicodeError subclasses which take arguments
|
||||
#endif
|
||||
#if CIRCUITPY_ALARM
|
||||
MP_DEFINE_EXCEPTION(DeepSleepRequest, BaseException)
|
||||
#endif
|
||||
MP_DEFINE_EXCEPTION(MpyError, ValueError)
|
||||
/*
|
||||
|
@ -333,6 +333,13 @@ mp_obj_t mp_obj_float_binary_op(mp_binary_op_t op, mp_float_t lhs_val, mp_obj_t
|
||||
return mp_obj_new_float(lhs_val);
|
||||
}
|
||||
|
||||
// Convert a uint64_t to a 32-bit float without invoking the double-precision math routines,
|
||||
// which are large.
|
||||
mp_float_t uint64_to_float(uint64_t ui64) {
|
||||
// 4294967296 = 2^32
|
||||
return (mp_float_t) ((uint32_t) (ui64 >> 32) * 4294967296.0f + (uint32_t) (ui64 & 0xffffffff));
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
#endif // MICROPY_PY_BUILTINS_FLOAT
|
||||
|
22
py/reload.c
22
py/reload.c
@ -1,6 +1,22 @@
|
||||
//
|
||||
// Created by Roy Hooper on 2018-05-14.
|
||||
//
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 by Roy Hooper
|
||||
* 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 "reload.h"
|
||||
#include "py/mpstate.h"
|
||||
|
22
py/reload.h
22
py/reload.h
@ -1,6 +1,22 @@
|
||||
//
|
||||
// Created by Roy Hooper on 2018-05-14.
|
||||
//
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 by Roy Hooper
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef CIRCUITPYTHON_RELOAD_H
|
||||
#define CIRCUITPYTHON_RELOAD_H
|
||||
|
@ -2,6 +2,9 @@
|
||||
|
||||
from typing import Union
|
||||
|
||||
import alarm
|
||||
import alarm.pin
|
||||
import alarm.time
|
||||
import array
|
||||
import audiocore
|
||||
import audiomixer
|
||||
@ -52,3 +55,14 @@ FrameBuffer = Union[rgbmatrix.RGBMatrix]
|
||||
|
||||
- `rgbmatrix.RGBMatrix`
|
||||
"""
|
||||
|
||||
Alarm = Union[
|
||||
alarm.pin.PinAlarm, alarm.time.TimeAlarm
|
||||
]
|
||||
"""Classes that implement alarms for sleeping and asynchronous notification.
|
||||
|
||||
- `alarm.pin.PinAlarm`
|
||||
- `alarm.time.TimeAlarm`
|
||||
|
||||
You can use these alarms to wake up from light or deep sleep.
|
||||
"""
|
||||
|
233
shared-bindings/alarm/__init__.c
Normal file
233
shared-bindings/alarm/__init__.c
Normal file
@ -0,0 +1,233 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* 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 "py/obj.h"
|
||||
#include "py/reload.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "shared-bindings/alarm/__init__.h"
|
||||
#include "shared-bindings/alarm/pin/PinAlarm.h"
|
||||
#include "shared-bindings/alarm/time/TimeAlarm.h"
|
||||
#include "shared-bindings/supervisor/Runtime.h"
|
||||
#include "shared-bindings/time/__init__.h"
|
||||
#include "supervisor/shared/autoreload.h"
|
||||
#include "supervisor/shared/workflow.h"
|
||||
|
||||
// Wait this long imediately after startup to see if we are connected to USB.
|
||||
#define CIRCUITPY_USB_CONNECTED_SLEEP_DELAY 5
|
||||
|
||||
//| """Alarms and sleep
|
||||
//|
|
||||
//| Provides alarms that trigger based on time intervals or on external events, such as pin
|
||||
//| changes.
|
||||
//| The program can simply wait for these alarms, or go to sleep and be awoken when they trigger.
|
||||
//|
|
||||
//| There are two supported levels of sleep: light sleep and deep sleep.
|
||||
//|
|
||||
//| Light sleep keeps sufficient state so the program can resume after sleeping.
|
||||
//| It does not shut down WiFi, BLE, or other communications, or ongoing activities such
|
||||
//| as audio playback. It reduces power consumption to the extent possible that leaves
|
||||
//| these continuing activities running. In some cases there may be no decrease in power consumption.
|
||||
//|
|
||||
//| Deep sleep shuts down power to nearly all of the microcontroller including the CPU and RAM. This can save
|
||||
//| a more significant amount of power, but CircuitPython must restart ``code.py`` from the beginning when
|
||||
//| awakened.
|
||||
//|
|
||||
//| For both light sleep and deep sleep, if CircuitPython is connected to a host computer,
|
||||
//| maintaining the connection takes priority and power consumption may not be reduced.
|
||||
//| """
|
||||
|
||||
//|
|
||||
//| wake_alarm: Alarm
|
||||
//| """The most recently triggered alarm. If CircuitPython was sleeping, the alarm the woke it from sleep."""
|
||||
//|
|
||||
|
||||
// wake_alarm is implemented as a dictionary entry, so there's no code here.
|
||||
|
||||
void validate_objs_are_alarms(size_t n_args, const mp_obj_t *objs) {
|
||||
for (size_t i = 0; i < n_args; i++) {
|
||||
if (MP_OBJ_IS_TYPE(objs[i], &alarm_pin_pin_alarm_type) ||
|
||||
MP_OBJ_IS_TYPE(objs[i], &alarm_time_time_alarm_type)) {
|
||||
continue;
|
||||
}
|
||||
mp_raise_TypeError_varg(translate("Expected an alarm"));
|
||||
}
|
||||
}
|
||||
|
||||
//| def light_sleep_until_alarms(*alarms: Alarm) -> Alarm:
|
||||
//| """Go into a light sleep until awakened one of the alarms. The alarm causing the wake-up
|
||||
//| is returned, and is also available as `alarm.wake_alarm`.
|
||||
//|
|
||||
//| If no alarms are specified, return immediately.
|
||||
//|
|
||||
//| **If CircuitPython is connected to a host computer, the connection will be maintained,
|
||||
//| and the microcontroller may not actually go into a light sleep.**
|
||||
//| This allows the user to interrupt an existing program with ctrl-C,
|
||||
//| and to edit the files in CIRCUITPY, which would not be possible in true light sleep.
|
||||
//| Thus, to use light sleep and save significant power,
|
||||
// it may be necessary to disconnect from the host.
|
||||
//| """
|
||||
//| ...
|
||||
//|
|
||||
STATIC mp_obj_t alarm_light_sleep_until_alarms(size_t n_args, const mp_obj_t *args) {
|
||||
validate_objs_are_alarms(n_args, args);
|
||||
|
||||
// See if we are connected to a host.
|
||||
// Make sure we have been awake long enough for USB to connect (enumeration delay).
|
||||
int64_t connecting_delay_msec = CIRCUITPY_USB_CONNECTED_SLEEP_DELAY * 1024 - supervisor_ticks_ms64();
|
||||
if (connecting_delay_msec > 0) {
|
||||
common_hal_time_delay_ms(connecting_delay_msec * 1000 / 1024);
|
||||
}
|
||||
|
||||
if (supervisor_workflow_active()) {
|
||||
common_hal_alarm_wait_until_alarms(n_args, args);
|
||||
} else {
|
||||
common_hal_alarm_light_sleep_until_alarms(n_args, args);
|
||||
}
|
||||
return mp_const_none;
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(alarm_light_sleep_until_alarms_obj, 1, MP_OBJ_FUN_ARGS_MAX, alarm_light_sleep_until_alarms);
|
||||
|
||||
//| def exit_and_deep_sleep_until_alarms(*alarms: Alarm) -> None:
|
||||
//| """Exit the program and go into a deep sleep, until awakened by one of the alarms.
|
||||
//| This function does not return.
|
||||
//|
|
||||
//| When awakened, the microcontroller will restart and will run ``boot.py`` and ``code.py``
|
||||
//| from the beginning.
|
||||
//|
|
||||
//| After restart, an alarm *equivalent* to the one that caused the wake-up
|
||||
//| will be available as `alarm.wake_alarm`.
|
||||
//| Its type and/or attributes may not correspond exactly to the original alarm.
|
||||
//| For time-base alarms, currently, an `alarm.time.TimeAlarm()` is created.
|
||||
//|
|
||||
//| If no alarms are specified, the microcontroller will deep sleep until reset.
|
||||
//|
|
||||
//| **If CircuitPython is connected to a host computer, `alarm.exit_and_deep_sleep_until_alarms()`
|
||||
//| then the connection will be maintained, and the system will not go into deep sleep.**
|
||||
//| This allows the user to interrupt an existing program with ctrl-C,
|
||||
//| and to edit the files in CIRCUITPY, which would not be possible in true deep sleep.
|
||||
//| Thus, to use deep sleep and save significant power, you will need to disconnect from the host.
|
||||
//|
|
||||
//| Here is skeletal example that deep-sleeps and restarts every 60 seconds:
|
||||
//|
|
||||
//| .. code-block:: python
|
||||
//|
|
||||
//| import alarm
|
||||
//| import time
|
||||
//|
|
||||
//| print("Waking up")
|
||||
//|
|
||||
//| # Set an alarm for 60 seconds from now.
|
||||
//| time_alarm = alarm.time.TimeAlarm(monotonic_time=time.monotonic() + 60)
|
||||
//|
|
||||
//| # Deep sleep until the alarm goes off. Then restart the program.
|
||||
//| alarm.exit_and_deep_sleep_until_alarms(time_alarm)
|
||||
//| """
|
||||
//| ...
|
||||
//|
|
||||
STATIC mp_obj_t alarm_exit_and_deep_sleep_until_alarms(size_t n_args, const mp_obj_t *args) {
|
||||
validate_objs_are_alarms(n_args, args);
|
||||
|
||||
// Shut down WiFi, etc.
|
||||
common_hal_alarm_prepare_for_deep_sleep();
|
||||
|
||||
// See if we are connected to a host.
|
||||
// Make sure we have been awake long enough for USB to connect (enumeration delay).
|
||||
int64_t connecting_delay_msec = CIRCUITPY_USB_CONNECTED_SLEEP_DELAY * 1024 - supervisor_ticks_ms64();
|
||||
if (connecting_delay_msec > 0) {
|
||||
common_hal_time_delay_ms(connecting_delay_msec * 1000 / 1024);
|
||||
}
|
||||
|
||||
if (supervisor_workflow_active()) {
|
||||
// Simulate deep sleep by waiting for an alarm and then restarting when done.
|
||||
common_hal_alarm_wait_until_alarms(n_args, args);
|
||||
reload_requested = true;
|
||||
supervisor_set_run_reason(RUN_REASON_STARTUP);
|
||||
mp_raise_reload_exception();
|
||||
} else {
|
||||
common_hal_alarm_exit_and_deep_sleep_until_alarms(n_args, args);
|
||||
// Does not return.
|
||||
}
|
||||
return mp_const_none;
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(alarm_exit_and_deep_sleep_until_alarms_obj, 1, MP_OBJ_FUN_ARGS_MAX, alarm_exit_and_deep_sleep_until_alarms);
|
||||
|
||||
STATIC const mp_map_elem_t alarm_pin_globals_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_pin) },
|
||||
|
||||
{ MP_ROM_QSTR(MP_QSTR_PinAlarm), MP_OBJ_FROM_PTR(&alarm_pin_pin_alarm_type) },
|
||||
};
|
||||
|
||||
STATIC MP_DEFINE_CONST_DICT(alarm_pin_globals, alarm_pin_globals_table);
|
||||
|
||||
STATIC const mp_obj_module_t alarm_pin_module = {
|
||||
.base = { &mp_type_module },
|
||||
.globals = (mp_obj_dict_t*)&alarm_pin_globals,
|
||||
};
|
||||
|
||||
STATIC const mp_map_elem_t alarm_time_globals_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_time) },
|
||||
|
||||
{ MP_ROM_QSTR(MP_QSTR_TimeAlarm), MP_OBJ_FROM_PTR(&alarm_time_time_alarm_type) },
|
||||
};
|
||||
|
||||
STATIC MP_DEFINE_CONST_DICT(alarm_time_globals, alarm_time_globals_table);
|
||||
|
||||
STATIC const mp_obj_module_t alarm_time_module = {
|
||||
.base = { &mp_type_module },
|
||||
.globals = (mp_obj_dict_t*)&alarm_time_globals,
|
||||
};
|
||||
|
||||
STATIC mp_map_elem_t alarm_module_globals_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_alarm) },
|
||||
|
||||
// wake_alarm is a mutable attribute.
|
||||
{ MP_ROM_QSTR(MP_QSTR_wake_alarm), mp_const_none },
|
||||
|
||||
{ MP_ROM_QSTR(MP_QSTR_light_sleep_until_alarms), MP_OBJ_FROM_PTR(&alarm_light_sleep_until_alarms_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_exit_and_deep_sleep_until_alarms),
|
||||
MP_OBJ_FROM_PTR(&alarm_exit_and_deep_sleep_until_alarms_obj) },
|
||||
|
||||
{ MP_ROM_QSTR(MP_QSTR_pin), MP_OBJ_FROM_PTR(&alarm_pin_module) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_time), MP_OBJ_FROM_PTR(&alarm_time_module) }
|
||||
|
||||
};
|
||||
STATIC MP_DEFINE_MUTABLE_DICT(alarm_module_globals, alarm_module_globals_table);
|
||||
|
||||
void common_hal_alarm_set_wake_alarm(mp_obj_t alarm) {
|
||||
// Equivalent of:
|
||||
// alarm.wake_alarm = alarm
|
||||
mp_map_elem_t *elem =
|
||||
mp_map_lookup(&alarm_module_globals.map, MP_ROM_QSTR(MP_QSTR_wake_alarm), MP_MAP_LOOKUP);
|
||||
if (elem) {
|
||||
elem->value = alarm;
|
||||
}
|
||||
}
|
||||
|
||||
const mp_obj_module_t alarm_module = {
|
||||
.base = { &mp_type_module },
|
||||
.globals = (mp_obj_dict_t*)&alarm_module_globals,
|
||||
};
|
43
shared-bindings/alarm/__init__.h
Normal file
43
shared-bindings/alarm/__init__.h
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_ALARM___INIT___H
|
||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_ALARM___INIT___H
|
||||
|
||||
#include "py/obj.h"
|
||||
|
||||
#include "common-hal/alarm/__init__.h"
|
||||
|
||||
extern mp_obj_t common_hal_alarm_wait_until_alarms(size_t n_alarms, const mp_obj_t *alarms);
|
||||
extern mp_obj_t common_hal_alarm_light_sleep_until_alarms(size_t n_alarms, const mp_obj_t *alarms);
|
||||
extern void common_hal_alarm_exit_and_deep_sleep_until_alarms(size_t n_alarms, const mp_obj_t *alarms);
|
||||
extern void common_hal_alarm_prepare_for_deep_sleep(void);
|
||||
extern NORETURN void common_hal_alarm_enter_deep_sleep(void);
|
||||
|
||||
// Used by wake-up code.
|
||||
extern void common_hal_alarm_set_wake_alarm(mp_obj_t alarm);
|
||||
|
||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_ALARM___INIT___H
|
131
shared-bindings/alarm/pin/PinAlarm.c
Normal file
131
shared-bindings/alarm/pin/PinAlarm.c
Normal file
@ -0,0 +1,131 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* 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 "shared-bindings/board/__init__.h"
|
||||
#include "shared-bindings/microcontroller/__init__.h"
|
||||
#include "shared-bindings/microcontroller/Pin.h"
|
||||
#include "shared-bindings/alarm/pin/PinAlarm.h"
|
||||
|
||||
#include "py/nlr.h"
|
||||
#include "py/obj.h"
|
||||
#include "py/objproperty.h"
|
||||
#include "py/runtime.h"
|
||||
#include "supervisor/shared/translate.h"
|
||||
|
||||
//| class PinAlarm:
|
||||
//| """Trigger an alarm when a pin changes state."""
|
||||
//|
|
||||
//| def __init__(self, pin: microcontroller.Pin, value: bool, edge: bool = False, pull: bool = False) -> None:
|
||||
//| """Create an alarm triggered by a `microcontroller.Pin` level. The alarm is not active
|
||||
//| until it is passed to an `alarm`-enabling function, such as `alarm.light_sleep_until_alarms()` or
|
||||
//| `alarm.exit_and_deep_sleep_until_alarms()`.
|
||||
//|
|
||||
//| :param microcontroller.Pin pin: The pin to monitor. On some ports, the choice of pin
|
||||
//| may be limited due to hardware restrictions, particularly for deep-sleep alarms.
|
||||
//| :param bool value: When active, trigger when the pin value is high (``True``) or low (``False``).
|
||||
//| On some ports, multiple `PinAlarm` objects may need to have coordinated values
|
||||
//| for deep-sleep alarms.
|
||||
//| :param bool edge: If ``True``, trigger only when there is a transition to the specified
|
||||
//| value of ``value``. If ``True``, if the alarm becomes active when the pin value already
|
||||
//| matches ``value``, the alarm is not triggered: the pin must transition from ``not value``
|
||||
//| to ``value`` to trigger the alarm. On some ports, edge-triggering may not be available,
|
||||
//| particularly for deep-sleep alarms.
|
||||
//| :param bool pull: Enable a pull-up or pull-down which pulls the pin to the level opposite
|
||||
//| that of ``value``. For instance, if ``value`` is set to ``True``, setting ``pull``
|
||||
//| to ``True`` will enable a pull-down, to hold the pin low normally until an outside signal
|
||||
//| pulls it high.
|
||||
//| """
|
||||
//| ...
|
||||
//|
|
||||
STATIC mp_obj_t alarm_pin_pin_alarm_make_new(const mp_obj_type_t *type, mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
alarm_pin_pin_alarm_obj_t *self = m_new_obj(alarm_pin_pin_alarm_obj_t);
|
||||
self->base.type = &alarm_pin_pin_alarm_type;
|
||||
enum { ARG_pin, ARG_value, ARG_edge, ARG_pull };
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_pin, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
||||
{ MP_QSTR_value, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_BOOL },
|
||||
{ MP_QSTR_edge, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
|
||||
{ MP_QSTR_pull, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
|
||||
};
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
mp_arg_parse_all(0, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
|
||||
mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[ARG_pin].u_obj);
|
||||
|
||||
common_hal_alarm_pin_pin_alarm_construct(self,
|
||||
pin,
|
||||
args[ARG_value].u_bool,
|
||||
args[ARG_edge].u_bool,
|
||||
args[ARG_pull].u_bool);
|
||||
|
||||
return MP_OBJ_FROM_PTR(self);
|
||||
}
|
||||
|
||||
//| pin: microcontroller.Pin
|
||||
//| """The trigger pin."""
|
||||
//|
|
||||
STATIC mp_obj_t alarm_pin_pin_alarm_obj_get_pin(mp_obj_t self_in) {
|
||||
alarm_pin_pin_alarm_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
return common_hal_alarm_pin_pin_alarm_get_pin(self);
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(alarm_pin_pin_alarm_get_pin_obj, alarm_pin_pin_alarm_obj_get_pin);
|
||||
|
||||
const mp_obj_property_t alarm_pin_pin_alarm_pin_obj = {
|
||||
.base.type = &mp_type_property,
|
||||
.proxy = {(mp_obj_t)&alarm_pin_pin_alarm_get_pin_obj,
|
||||
(mp_obj_t)&mp_const_none_obj,
|
||||
(mp_obj_t)&mp_const_none_obj},
|
||||
};
|
||||
|
||||
//| value: bool
|
||||
//| """The value on which to trigger."""
|
||||
//|
|
||||
STATIC mp_obj_t alarm_pin_pin_alarm_obj_get_value(mp_obj_t self_in) {
|
||||
alarm_pin_pin_alarm_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
return mp_obj_new_bool(common_hal_alarm_pin_pin_alarm_get_value(self));
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(alarm_pin_pin_alarm_get_value_obj, alarm_pin_pin_alarm_obj_get_value);
|
||||
|
||||
const mp_obj_property_t alarm_pin_pin_alarm_value_obj = {
|
||||
.base.type = &mp_type_property,
|
||||
.proxy = {(mp_obj_t)&alarm_pin_pin_alarm_get_value_obj,
|
||||
(mp_obj_t)&mp_const_none_obj,
|
||||
(mp_obj_t)&mp_const_none_obj},
|
||||
};
|
||||
|
||||
STATIC const mp_rom_map_elem_t alarm_pin_pin_alarm_locals_dict_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR_pin), MP_ROM_PTR(&alarm_pin_pin_alarm_pin_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&alarm_pin_pin_alarm_value_obj) },
|
||||
};
|
||||
|
||||
STATIC MP_DEFINE_CONST_DICT(alarm_pin_pin_alarm_locals_dict, alarm_pin_pin_alarm_locals_dict_table);
|
||||
|
||||
const mp_obj_type_t alarm_pin_pin_alarm_type = {
|
||||
{ &mp_type_type },
|
||||
.name = MP_QSTR_PinAlarm,
|
||||
.make_new = alarm_pin_pin_alarm_make_new,
|
||||
.locals_dict = (mp_obj_t)&alarm_pin_pin_alarm_locals_dict,
|
||||
};
|
43
shared-bindings/alarm/pin/PinAlarm.h
Normal file
43
shared-bindings/alarm/pin/PinAlarm.h
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_PIN_PIN_ALARM_H
|
||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_PIN_PIN_ALARM_H
|
||||
|
||||
#include "py/obj.h"
|
||||
#include "py/objtuple.h"
|
||||
#include "common-hal/microcontroller/Pin.h"
|
||||
#include "common-hal/alarm/pin/PinAlarm.h"
|
||||
|
||||
extern const mp_obj_type_t alarm_pin_pin_alarm_type;
|
||||
|
||||
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);
|
||||
extern mcu_pin_obj_t *common_hal_alarm_pin_pin_alarm_get_pin(alarm_pin_pin_alarm_obj_t *self);
|
||||
extern bool common_hal_alarm_pin_pin_alarm_get_value(alarm_pin_pin_alarm_obj_t *self);
|
||||
extern bool common_hal_alarm_pin_pin_alarm_get_edge(alarm_pin_pin_alarm_obj_t *self);
|
||||
extern bool common_hal_alarm_pin_pin_alarm_get_pull(alarm_pin_pin_alarm_obj_t *self);
|
||||
|
||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_PIN_PIN_ALARM_H
|
143
shared-bindings/alarm/time/TimeAlarm.c
Normal file
143
shared-bindings/alarm/time/TimeAlarm.c
Normal file
@ -0,0 +1,143 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* 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 "py/nlr.h"
|
||||
#include "py/obj.h"
|
||||
#include "py/objproperty.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "shared-bindings/time/__init__.h"
|
||||
#include "shared-bindings/alarm/time/TimeAlarm.h"
|
||||
|
||||
#include "supervisor/shared/translate.h"
|
||||
|
||||
#if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE
|
||||
mp_obj_t MP_WEAK rtc_get_time_source_time(void) {
|
||||
mp_raise_RuntimeError(translate("RTC is not supported on this board"));
|
||||
}
|
||||
#endif
|
||||
|
||||
//| class TimeAlarm:
|
||||
//| """Trigger an alarm when the specified time is reached."""
|
||||
//|
|
||||
//| def __init__(self, monotonic_time: Optional[float] = None, epoch_time: Optional[int] = None) -> None:
|
||||
//| """Create an alarm that will be triggered when `time.monotonic()` would equal
|
||||
//| ``monotonic_time``, or when `time.time()` would equal ``epoch_time``.
|
||||
//| Only one of the two arguments can be given.
|
||||
//| The alarm is not active until it is passed to an
|
||||
//| `alarm`-enabling function, such as `alarm.light_sleep_until_alarms()` or
|
||||
//| `alarm.exit_and_deep_sleep_until_alarms()`.
|
||||
//|
|
||||
//| If the given time is in the past when sleep occurs, the alarm will be triggered
|
||||
//| immediately.
|
||||
//| """
|
||||
//| ...
|
||||
//|
|
||||
STATIC mp_obj_t alarm_time_time_alarm_make_new(const mp_obj_type_t *type,
|
||||
mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
alarm_time_time_alarm_obj_t *self = m_new_obj(alarm_time_time_alarm_obj_t);
|
||||
self->base.type = &alarm_time_time_alarm_type;
|
||||
|
||||
enum { ARG_monotonic_time, ARG_epoch_time };
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_monotonic_time, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
||||
{ MP_QSTR_epoch_time, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
bool have_monotonic = args[ARG_monotonic_time].u_obj != mp_const_none;
|
||||
bool have_epoch = args[ARG_epoch_time].u_obj != mp_const_none;
|
||||
|
||||
if (!(have_monotonic ^ have_epoch)) {
|
||||
mp_raise_ValueError(translate("Supply one of monotonic_time or epoch_time"));
|
||||
}
|
||||
|
||||
mp_float_t monotonic_time = 0; // To avoid compiler warning.
|
||||
if (have_monotonic) {
|
||||
monotonic_time = mp_obj_get_float(args[ARG_monotonic_time].u_obj);
|
||||
}
|
||||
|
||||
mp_float_t monotonic_time_now = common_hal_time_monotonic_ms() / 1000.0;
|
||||
|
||||
if (have_epoch) {
|
||||
#if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_NONE
|
||||
mp_raise_ValueError(translate("epoch_time not supported on this board"));
|
||||
#else
|
||||
mp_uint_t epoch_time_secs = mp_obj_int_get_checked(args[ARG_epoch_time].u_obj);
|
||||
|
||||
timeutils_struct_time_t tm;
|
||||
struct_time_to_tm(rtc_get_time_source_time(), &tm);
|
||||
mp_uint_t epoch_secs_now = timeutils_seconds_since_epoch(tm.tm_year, tm.tm_mon, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec);
|
||||
// How far in the future (in secs) is the requested time?
|
||||
mp_int_t epoch_diff = epoch_time_secs - epoch_secs_now;
|
||||
// Convert it to a future monotonic time.
|
||||
monotonic_time = monotonic_time_now + epoch_diff;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (monotonic_time < monotonic_time_now) {
|
||||
mp_raise_ValueError(translate("Time is in the past."));
|
||||
}
|
||||
|
||||
common_hal_alarm_time_time_alarm_construct(self, monotonic_time);
|
||||
|
||||
return MP_OBJ_FROM_PTR(self);
|
||||
}
|
||||
|
||||
//| monotonic_time: float
|
||||
//| """When this time is reached, the alarm will trigger, based on the `time.monotonic()` clock.
|
||||
//| The time may be given as ``epoch_time`` in the constructor, but it is returned
|
||||
//| by this property only as a `time.monotonic()` time.
|
||||
//| """
|
||||
//|
|
||||
STATIC mp_obj_t alarm_time_time_alarm_obj_get_monotonic_time(mp_obj_t self_in) {
|
||||
alarm_time_time_alarm_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
return mp_obj_new_float(common_hal_alarm_time_time_alarm_get_monotonic_time(self));
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(alarm_time_time_alarm_get_monotonic_time_obj, alarm_time_time_alarm_obj_get_monotonic_time);
|
||||
|
||||
const mp_obj_property_t alarm_time_time_alarm_monotonic_time_obj = {
|
||||
.base.type = &mp_type_property,
|
||||
.proxy = {(mp_obj_t)&alarm_time_time_alarm_get_monotonic_time_obj,
|
||||
(mp_obj_t)&mp_const_none_obj,
|
||||
(mp_obj_t)&mp_const_none_obj},
|
||||
};
|
||||
|
||||
STATIC const mp_rom_map_elem_t alarm_time_time_alarm_locals_dict_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR_monotonic_time), MP_ROM_PTR(&alarm_time_time_alarm_monotonic_time_obj) },
|
||||
};
|
||||
|
||||
STATIC MP_DEFINE_CONST_DICT(alarm_time_time_alarm_locals_dict, alarm_time_time_alarm_locals_dict_table);
|
||||
|
||||
const mp_obj_type_t alarm_time_time_alarm_type = {
|
||||
{ &mp_type_type },
|
||||
.name = MP_QSTR_TimeAlarm,
|
||||
.make_new = alarm_time_time_alarm_make_new,
|
||||
.locals_dict = (mp_obj_t)&alarm_time_time_alarm_locals_dict,
|
||||
};
|
39
shared-bindings/alarm/time/TimeAlarm.h
Normal file
39
shared-bindings/alarm/time/TimeAlarm.h
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_TIME_MONOTONIC_TIME_ALARM_H
|
||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_TIME_MONOTINIC_TIME_ALARM_H
|
||||
|
||||
#include "py/obj.h"
|
||||
|
||||
#include "common-hal/alarm/time/TimeAlarm.h"
|
||||
|
||||
extern const mp_obj_type_t alarm_time_time_alarm_type;
|
||||
|
||||
extern void common_hal_alarm_time_time_alarm_construct(alarm_time_time_alarm_obj_t *self, mp_float_t monotonic_time);
|
||||
extern mp_float_t common_hal_alarm_time_time_alarm_get_monotonic_time(alarm_time_time_alarm_obj_t *self);
|
||||
|
||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_TIME_MONOTONIC_TIME_ALARM_H
|
@ -24,11 +24,11 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOIO___INIT___H
|
||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOIO___INIT___H
|
||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOPWMIO___INIT___H
|
||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOPWMIO___INIT___H
|
||||
|
||||
#include "py/obj.h"
|
||||
|
||||
// Nothing now.
|
||||
|
||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOIO___INIT___H
|
||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOPWMIO___INIT___H
|
||||
|
@ -166,7 +166,7 @@ STATIC mp_obj_t i2cperipheral_i2c_peripheral_request(size_t n_args, const mp_obj
|
||||
if (timeout_ms == 0) {
|
||||
forever = true;
|
||||
} else if (timeout_ms > 0) {
|
||||
timeout_end = common_hal_time_monotonic() + timeout_ms;
|
||||
timeout_end = common_hal_time_monotonic_ms() + timeout_ms;
|
||||
}
|
||||
|
||||
int last_error = 0;
|
||||
@ -200,7 +200,7 @@ STATIC mp_obj_t i2cperipheral_i2c_peripheral_request(size_t n_args, const mp_obj
|
||||
}
|
||||
|
||||
return mp_obj_new_i2cperipheral_i2c_peripheral_request(self, address, is_read, is_restart);
|
||||
} while (forever || common_hal_time_monotonic() < timeout_end);
|
||||
} while (forever || common_hal_time_monotonic_ms() < timeout_end);
|
||||
|
||||
if (timeout_ms > 0) {
|
||||
mp_raise_OSError(MP_ETIMEDOUT);
|
||||
@ -322,8 +322,8 @@ STATIC mp_obj_t i2cperipheral_i2c_peripheral_request_read(size_t n_args, const m
|
||||
|
||||
int i = 0;
|
||||
uint8_t *buffer = NULL;
|
||||
uint64_t timeout_end = common_hal_time_monotonic() + 10 * 1000;
|
||||
while (common_hal_time_monotonic() < timeout_end) {
|
||||
uint64_t timeout_end = common_hal_time_monotonic_ms() + 10 * 1000;
|
||||
while (common_hal_time_monotonic_ms() < timeout_end) {
|
||||
RUN_BACKGROUND_TASKS;
|
||||
if (mp_hal_is_interrupted()) {
|
||||
break;
|
||||
|
@ -67,6 +67,23 @@ const mp_obj_property_t mcu_processor_frequency_obj = {
|
||||
},
|
||||
};
|
||||
|
||||
//| reset_reason: microcontroller.ResetReason
|
||||
//| """The reason the microcontroller started up from reset state."""
|
||||
//|
|
||||
STATIC mp_obj_t mcu_processor_get_reset_reason(mp_obj_t self) {
|
||||
return cp_enum_find(&mcu_reset_reason_type, common_hal_mcu_processor_get_reset_reason());
|
||||
}
|
||||
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(mcu_processor_get_reset_reason_obj, mcu_processor_get_reset_reason);
|
||||
|
||||
const mp_obj_property_t mcu_processor_reset_reason_obj = {
|
||||
.base.type = &mp_type_property,
|
||||
.proxy = {(mp_obj_t)&mcu_processor_get_reset_reason_obj, // getter
|
||||
(mp_obj_t)&mp_const_none_obj, // no setter
|
||||
(mp_obj_t)&mp_const_none_obj, // no deleter
|
||||
},
|
||||
};
|
||||
|
||||
//| temperature: Optional[float]
|
||||
//| """The on-chip temperature, in Celsius, as a float. (read-only)
|
||||
//|
|
||||
@ -128,6 +145,7 @@ const mp_obj_property_t mcu_processor_voltage_obj = {
|
||||
|
||||
STATIC const mp_rom_map_elem_t mcu_processor_locals_dict_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&mcu_processor_frequency_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_reset_reason), MP_ROM_PTR(&mcu_processor_reset_reason_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_temperature), MP_ROM_PTR(&mcu_processor_temperature_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_uid), MP_ROM_PTR(&mcu_processor_uid_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_voltage), MP_ROM_PTR(&mcu_processor_voltage_obj) },
|
||||
|
@ -30,10 +30,12 @@
|
||||
#include "py/obj.h"
|
||||
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
|
||||
extern const mp_obj_type_t mcu_processor_type;
|
||||
|
||||
uint32_t common_hal_mcu_processor_get_frequency(void);
|
||||
mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void);
|
||||
float common_hal_mcu_processor_get_temperature(void);
|
||||
void common_hal_mcu_processor_get_uid(uint8_t raw_id[]);
|
||||
float common_hal_mcu_processor_get_voltage(void);
|
||||
|
77
shared-bindings/microcontroller/ResetReason.c
Normal file
77
shared-bindings/microcontroller/ResetReason.c
Normal file
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
|
||||
*
|
||||
* 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 "py/obj.h"
|
||||
#include "py/enum.h"
|
||||
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
|
||||
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, POWER_ON, RESET_REASON_POWER_ON);
|
||||
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, BROWNOUT, RESET_REASON_BROWNOUT);
|
||||
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, SOFTWARE, RESET_REASON_SOFTWARE);
|
||||
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, DEEP_SLEEP_ALARM, RESET_REASON_DEEP_SLEEP_ALARM);
|
||||
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, RESET_PIN, RESET_REASON_RESET_PIN);
|
||||
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, WATCHDOG, RESET_REASON_WATCHDOG);
|
||||
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, UNKNOWN, RESET_REASON_UNKNOWN);
|
||||
|
||||
//| class ResetReason:
|
||||
//| """The reason the microntroller was last reset"""
|
||||
//|
|
||||
//| POWER_ON: object
|
||||
//| """The microntroller was started from power off."""
|
||||
//|
|
||||
//| BROWNOUT: object
|
||||
//| """The microntroller was reset due to too low a voltage."""
|
||||
//|
|
||||
//| SOFTWARE: object
|
||||
//| """The microntroller was reset from software."""
|
||||
//|
|
||||
//| DEEP_SLEEP_ALARM: object
|
||||
//| """The microntroller was reset for deep sleep and restarted by an alarm."""
|
||||
//|
|
||||
//| RESET_PIN: object
|
||||
//| """The microntroller was reset by a signal on its reset pin. The pin might be connected to a reset button."""
|
||||
//|
|
||||
//| WATCHDOG: object
|
||||
//| """The microcontroller was reset by its watchdog timer."""
|
||||
//|
|
||||
//| UNKNOWN: object
|
||||
//| """The microntroller restarted for an unknown reason."""
|
||||
//|
|
||||
MAKE_ENUM_MAP(mcu_reset_reason) {
|
||||
MAKE_ENUM_MAP_ENTRY(reset_reason, POWER_ON),
|
||||
MAKE_ENUM_MAP_ENTRY(reset_reason, BROWNOUT),
|
||||
MAKE_ENUM_MAP_ENTRY(reset_reason, SOFTWARE),
|
||||
MAKE_ENUM_MAP_ENTRY(reset_reason, DEEP_SLEEP_ALARM),
|
||||
MAKE_ENUM_MAP_ENTRY(reset_reason, RESET_PIN),
|
||||
MAKE_ENUM_MAP_ENTRY(reset_reason, WATCHDOG),
|
||||
MAKE_ENUM_MAP_ENTRY(reset_reason, UNKNOWN),
|
||||
};
|
||||
STATIC MP_DEFINE_CONST_DICT(mcu_reset_reason_locals_dict, mcu_reset_reason_locals_table);
|
||||
|
||||
MAKE_PRINTER(alarm, mcu_reset_reason);
|
||||
|
||||
MAKE_ENUM_TYPE(alarm, ResetReason, mcu_reset_reason);
|
45
shared-bindings/microcontroller/ResetReason.h
Normal file
45
shared-bindings/microcontroller/ResetReason.h
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_MCU_RESET_REASON__H
|
||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_MCU_RESET_REASON__H
|
||||
|
||||
#include "py/obj.h"
|
||||
#include "py/enum.h"
|
||||
|
||||
typedef enum {
|
||||
RESET_REASON_POWER_ON,
|
||||
RESET_REASON_BROWNOUT,
|
||||
RESET_REASON_SOFTWARE,
|
||||
RESET_REASON_DEEP_SLEEP_ALARM,
|
||||
RESET_REASON_RESET_PIN,
|
||||
RESET_REASON_WATCHDOG,
|
||||
RESET_REASON_UNKNOWN,
|
||||
} mcu_reset_reason_t;
|
||||
|
||||
extern const mp_obj_type_t mcu_reset_reason_type;
|
||||
|
||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_MCU_RESET_REASON__H
|
@ -39,7 +39,6 @@
|
||||
#include "shared-bindings/microcontroller/Pin.h"
|
||||
#include "shared-bindings/microcontroller/Processor.h"
|
||||
|
||||
#include "py/runtime.h"
|
||||
#include "supervisor/shared/translate.h"
|
||||
|
||||
//| """Pin references and cpu functionality
|
||||
@ -148,16 +147,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(mcu_reset_obj, mcu_reset);
|
||||
//| This object is the sole instance of `watchdog.WatchDogTimer` when available or ``None`` otherwise."""
|
||||
//|
|
||||
|
||||
|
||||
//| """:mod:`microcontroller.pin` --- Microcontroller pin names
|
||||
//| --------------------------------------------------------
|
||||
//|
|
||||
//| .. module:: microcontroller.pin
|
||||
//| :synopsis: Microcontroller pin names
|
||||
//| :platform: SAMD21
|
||||
//|
|
||||
//| References to pins as named by the microcontroller"""
|
||||
//|
|
||||
const mp_obj_module_t mcu_pin_module = {
|
||||
.base = { &mp_type_module },
|
||||
.globals = (mp_obj_dict_t*)&mcu_pin_globals,
|
||||
|
@ -28,11 +28,11 @@
|
||||
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___INIT___H
|
||||
#define MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___INIT___H
|
||||
|
||||
#include "py/mpconfig.h"
|
||||
#include "py/obj.h"
|
||||
#include "py/mpconfig.h"
|
||||
|
||||
#include "common-hal/microcontroller/Processor.h"
|
||||
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
#include "shared-bindings/microcontroller/RunMode.h"
|
||||
|
||||
extern void common_hal_mcu_delay_us(uint32_t);
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
// This depends on shared_module because nearly all functionality is port
|
||||
// agnostic. The random module only depends on the common_hal_os_urandom or
|
||||
// common_hal_time_monotonic to seed it initially.
|
||||
// common_hal_time_monotonic_ms to seed it initially.
|
||||
|
||||
void shared_modules_random_seed(mp_uint_t seed);
|
||||
mp_uint_t shared_modules_random_getrandbits(uint8_t n);
|
||||
|
62
shared-bindings/supervisor/RunReason.c
Normal file
62
shared-bindings/supervisor/RunReason.c
Normal file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
|
||||
*
|
||||
* 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 "py/enum.h"
|
||||
|
||||
#include "shared-bindings/supervisor/RunReason.h"
|
||||
|
||||
MAKE_ENUM_VALUE(supervisor_run_reason_type, run_reason, STARTUP, RUN_REASON_STARTUP);
|
||||
MAKE_ENUM_VALUE(supervisor_run_reason_type, run_reason, AUTO_RELOAD, RUN_REASON_AUTO_RELOAD);
|
||||
MAKE_ENUM_VALUE(supervisor_run_reason_type, run_reason, SUPERVISOR_RELOAD, RUN_REASON_SUPERVISOR_RELOAD);
|
||||
MAKE_ENUM_VALUE(supervisor_run_reason_type, run_reason, REPL_RELOAD, RUN_REASON_REPL_RELOAD);
|
||||
|
||||
//| class RunReason:
|
||||
//| """The reason that CircuitPython started running."""
|
||||
//|
|
||||
//| STARTUP: object
|
||||
//| """CircuitPython started the microcontroller started up. See `microcontroller.Processor.reset_reason`
|
||||
//| for more detail on why the microcontroller was started."""
|
||||
//|
|
||||
//| AUTO_RELOAD: object
|
||||
//| """CircuitPython restarted due to an external write to the filesystem."""
|
||||
//|
|
||||
//| SUPERVISOR_RELOAD: object
|
||||
//| """CircuitPython restarted due to a call to `supervisor.reload()`."""
|
||||
//|
|
||||
//| REPL_RELOAD: object
|
||||
//| """CircuitPython started due to the user typing CTRL-D in the REPL."""
|
||||
//|
|
||||
MAKE_ENUM_MAP(supervisor_run_reason) {
|
||||
MAKE_ENUM_MAP_ENTRY(run_reason, STARTUP),
|
||||
MAKE_ENUM_MAP_ENTRY(run_reason, AUTO_RELOAD),
|
||||
MAKE_ENUM_MAP_ENTRY(run_reason, SUPERVISOR_RELOAD),
|
||||
MAKE_ENUM_MAP_ENTRY(run_reason, REPL_RELOAD),
|
||||
};
|
||||
STATIC MP_DEFINE_CONST_DICT(supervisor_run_reason_locals_dict, supervisor_run_reason_locals_table);
|
||||
|
||||
MAKE_PRINTER(supervisor, supervisor_run_reason);
|
||||
|
||||
MAKE_ENUM_TYPE(supervisor, RunReason, supervisor_run_reason);
|
36
shared-bindings/supervisor/RunReason.h
Normal file
36
shared-bindings/supervisor/RunReason.h
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
typedef enum {
|
||||
RUN_REASON_STARTUP,
|
||||
RUN_REASON_AUTO_RELOAD,
|
||||
RUN_REASON_SUPERVISOR_RELOAD,
|
||||
RUN_REASON_REPL_RELOAD,
|
||||
} supervisor_run_reason_t;
|
||||
|
||||
extern const mp_obj_type_t supervisor_run_reason_type;
|
@ -25,9 +25,16 @@
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "py/obj.h"
|
||||
#include "py/enum.h"
|
||||
#include "py/runtime.h"
|
||||
#include "py/objproperty.h"
|
||||
|
||||
#include "shared-bindings/supervisor/RunReason.h"
|
||||
#include "shared-bindings/supervisor/Runtime.h"
|
||||
|
||||
STATIC supervisor_run_reason_t _run_reason;
|
||||
|
||||
//TODO: add USB, REPL to description once they're operational
|
||||
//| class Runtime:
|
||||
//| """Current status of runtime objects.
|
||||
@ -90,9 +97,29 @@ const mp_obj_property_t supervisor_serial_bytes_available_obj = {
|
||||
};
|
||||
|
||||
|
||||
//| run_reason: RunReason
|
||||
//| """Returns why CircuitPython started running this particular time."""
|
||||
//|
|
||||
STATIC mp_obj_t supervisor_get_run_reason(mp_obj_t self) {
|
||||
return cp_enum_find(&supervisor_run_reason_type, _run_reason);
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(supervisor_get_run_reason_obj, supervisor_get_run_reason);
|
||||
|
||||
const mp_obj_property_t supervisor_run_reason_obj = {
|
||||
.base.type = &mp_type_property,
|
||||
.proxy = {(mp_obj_t)&supervisor_get_run_reason_obj,
|
||||
(mp_obj_t)&mp_const_none_obj,
|
||||
(mp_obj_t)&mp_const_none_obj},
|
||||
};
|
||||
|
||||
void supervisor_set_run_reason(supervisor_run_reason_t run_reason) {
|
||||
_run_reason = run_reason;
|
||||
}
|
||||
|
||||
STATIC const mp_rom_map_elem_t supervisor_runtime_locals_dict_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR_serial_connected), MP_ROM_PTR(&supervisor_serial_connected_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_serial_bytes_available), MP_ROM_PTR(&supervisor_serial_bytes_available_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_run_reason), MP_ROM_PTR(&supervisor_run_reason_obj) },
|
||||
};
|
||||
|
||||
STATIC MP_DEFINE_CONST_DICT(supervisor_runtime_locals_dict, supervisor_runtime_locals_dict_table);
|
||||
|
@ -30,9 +30,12 @@
|
||||
#include <stdbool.h>
|
||||
#include "py/obj.h"
|
||||
|
||||
#include "shared-bindings/supervisor/RunReason.h"
|
||||
|
||||
extern const mp_obj_type_t supervisor_runtime_type;
|
||||
|
||||
void supervisor_set_run_reason(supervisor_run_reason_t run_reason);
|
||||
|
||||
bool common_hal_get_serial_connected(void);
|
||||
|
||||
bool common_hal_get_serial_bytes_available(void);
|
||||
|
@ -32,7 +32,9 @@
|
||||
#include "supervisor/shared/rgb_led_status.h"
|
||||
#include "supervisor/shared/stack.h"
|
||||
#include "supervisor/shared/translate.h"
|
||||
#include "supervisor/shared/workflow.h"
|
||||
|
||||
#include "shared-bindings/microcontroller/__init__.h"
|
||||
#include "shared-bindings/supervisor/__init__.h"
|
||||
#include "shared-bindings/supervisor/Runtime.h"
|
||||
|
||||
@ -88,6 +90,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(supervisor_set_rgb_status_brightness_obj, supervisor_s
|
||||
//|
|
||||
STATIC mp_obj_t supervisor_reload(void) {
|
||||
reload_requested = true;
|
||||
supervisor_set_run_reason(RUN_REASON_SUPERVISOR_RELOAD);
|
||||
mp_raise_reload_exception();
|
||||
return mp_const_none;
|
||||
}
|
||||
@ -111,9 +114,9 @@ MP_DEFINE_CONST_FUN_OBJ_1(supervisor_set_next_stack_limit_obj, supervisor_set_ne
|
||||
|
||||
STATIC const mp_rom_map_elem_t supervisor_module_globals_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_supervisor) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_enable_autoreload), MP_ROM_PTR(&supervisor_enable_autoreload_obj) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_disable_autoreload), MP_ROM_PTR(&supervisor_disable_autoreload_obj) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_rgb_status_brightness), MP_ROM_PTR(&supervisor_set_rgb_status_brightness_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_enable_autoreload), MP_ROM_PTR(&supervisor_enable_autoreload_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_disable_autoreload), MP_ROM_PTR(&supervisor_disable_autoreload_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_set_rgb_status_brightness), MP_ROM_PTR(&supervisor_set_rgb_status_brightness_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_runtime), MP_ROM_PTR(&common_hal_supervisor_runtime_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_reload), MP_ROM_PTR(&supervisor_reload_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_set_next_stack_limit), MP_ROM_PTR(&supervisor_set_next_stack_limit_obj) },
|
||||
|
@ -51,9 +51,8 @@
|
||||
//| ...
|
||||
//|
|
||||
STATIC mp_obj_t time_monotonic(void) {
|
||||
uint64_t time64 = common_hal_time_monotonic();
|
||||
// 4294967296 = 2^32
|
||||
return mp_obj_new_float(((uint32_t) (time64 >> 32) * 4294967296.0f + (uint32_t) (time64 & 0xffffffff)) / 1000.0f);
|
||||
uint64_t ticks_ms = common_hal_time_monotonic_ms();
|
||||
return mp_obj_new_float(uint64_to_float(ticks_ms) / 1000.0f);
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_0(time_monotonic_obj, time_monotonic);
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
||||
extern mp_obj_t struct_time_from_tm(timeutils_struct_time_t *tm);
|
||||
extern void struct_time_to_tm(mp_obj_t t, timeutils_struct_time_t *tm);
|
||||
|
||||
extern uint64_t common_hal_time_monotonic(void);
|
||||
extern uint64_t common_hal_time_monotonic_ms(void);
|
||||
extern uint64_t common_hal_time_monotonic_ns(void);
|
||||
extern void common_hal_time_delay_ms(uint32_t);
|
||||
|
||||
|
@ -44,7 +44,7 @@ STATIC uint32_t yasmarang(void)
|
||||
{
|
||||
if (yasmarang_pad == 0xeda4baba) {
|
||||
if (!common_hal_os_urandom((uint8_t *)&yasmarang_pad, sizeof(uint32_t))) {
|
||||
yasmarang_pad = common_hal_time_monotonic() & 0xffffffff;
|
||||
yasmarang_pad = common_hal_time_monotonic_ms() & 0xffffffff;
|
||||
}
|
||||
}
|
||||
yasmarang_pad += yasmarang_dat + yasmarang_d * yasmarang_n;
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include "supervisor/port.h"
|
||||
#include "supervisor/shared/tick.h"
|
||||
|
||||
uint64_t common_hal_time_monotonic(void) {
|
||||
uint64_t common_hal_time_monotonic_ms(void) {
|
||||
return supervisor_ticks_ms64();
|
||||
}
|
||||
|
||||
|
@ -411,14 +411,15 @@ void prep_rgb_status_animation(const pyexec_result_t* result,
|
||||
#endif
|
||||
}
|
||||
|
||||
void tick_rgb_status_animation(rgb_status_animation_t* status) {
|
||||
bool tick_rgb_status_animation(rgb_status_animation_t* status) {
|
||||
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)) || (defined(CP_RGB_STATUS_LED))
|
||||
uint32_t tick_diff = supervisor_ticks_ms32() - status->pattern_start;
|
||||
if (status->ok) {
|
||||
// All is good. Ramp ALL_DONE up and down.
|
||||
if (tick_diff > ALL_GOOD_CYCLE_MS) {
|
||||
status->pattern_start = supervisor_ticks_ms32();
|
||||
tick_diff = 0;
|
||||
new_status_color(BLACK);
|
||||
return true;
|
||||
}
|
||||
|
||||
uint16_t brightness = tick_diff * 255 / (ALL_GOOD_CYCLE_MS / 2);
|
||||
@ -433,7 +434,7 @@ void tick_rgb_status_animation(rgb_status_animation_t* status) {
|
||||
} else {
|
||||
if (tick_diff > status->total_exception_cycle) {
|
||||
status->pattern_start = supervisor_ticks_ms32();
|
||||
tick_diff = 0;
|
||||
return true;
|
||||
}
|
||||
// First flash the file color.
|
||||
if (tick_diff < EXCEPTION_TYPE_LENGTH_MS) {
|
||||
@ -482,4 +483,5 @@ void tick_rgb_status_animation(rgb_status_animation_t* status) {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return false; // Animation is not finished.
|
||||
}
|
||||
|
@ -76,6 +76,6 @@ void prep_rgb_status_animation(const pyexec_result_t* result,
|
||||
bool found_main,
|
||||
safe_mode_t safe_mode,
|
||||
rgb_status_animation_t* status);
|
||||
void tick_rgb_status_animation(rgb_status_animation_t* status);
|
||||
bool tick_rgb_status_animation(rgb_status_animation_t* status);
|
||||
|
||||
#endif // MICROPY_INCLUDED_SUPERVISOR_RGB_LED_STATUS_H
|
||||
|
@ -29,6 +29,8 @@
|
||||
#include "mphalport.h"
|
||||
|
||||
#include "shared-bindings/digitalio/DigitalInOut.h"
|
||||
#include "shared-bindings/microcontroller/Processor.h"
|
||||
#include "shared-bindings/microcontroller/ResetReason.h"
|
||||
|
||||
#include "supervisor/serial.h"
|
||||
#include "supervisor/shared/rgb_led_colors.h"
|
||||
@ -52,6 +54,12 @@ safe_mode_t wait_for_safe_mode_reset(void) {
|
||||
current_safe_mode = safe_mode;
|
||||
return safe_mode;
|
||||
}
|
||||
|
||||
const mcu_reset_reason_t reset_reason = common_hal_mcu_processor_get_reset_reason();
|
||||
if (reset_reason != RESET_REASON_POWER_ON &&
|
||||
reset_reason != RESET_REASON_RESET_PIN) {
|
||||
return NO_SAFE_MODE;
|
||||
}
|
||||
port_set_saved_word(SAFE_MODE_DATA_GUARD | (MANUAL_SAFE_MODE << 8));
|
||||
// Wait for a while to allow for reset.
|
||||
temp_status_color(SAFE_MODE);
|
||||
|
@ -69,9 +69,7 @@ bool serial_connected(void) {
|
||||
#if defined(DEBUG_UART_TX) && defined(DEBUG_UART_RX)
|
||||
return true;
|
||||
#else
|
||||
// True if DTR is asserted, and the USB connection is up.
|
||||
// tud_cdc_get_line_state(): bit 0 is DTR, bit 1 is RTS
|
||||
return (tud_cdc_get_line_state() & 1) && tud_ready();
|
||||
return tud_cdc_connected();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "supervisor/port.h"
|
||||
#include "supervisor/serial.h"
|
||||
#include "supervisor/usb.h"
|
||||
#include "supervisor/shared/workflow.h"
|
||||
#include "lib/utils/interrupt_char.h"
|
||||
#include "lib/mp-readline/readline.h"
|
||||
|
||||
|
47
supervisor/shared/workflow.c
Normal file
47
supervisor/shared/workflow.c
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
|
||||
*
|
||||
* 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 <stdbool.h>
|
||||
#include "py/mpconfig.h"
|
||||
#include "tusb.h"
|
||||
|
||||
void supervisor_workflow_reset(void) {
|
||||
}
|
||||
|
||||
// Return true as soon as USB communication with host has started,
|
||||
// even before enumeration is done.
|
||||
// Not that some chips don't notice when USB is unplugged after first being plugged in,
|
||||
// so this is not perfect, but tud_suspended() check helps.
|
||||
bool supervisor_workflow_connecting(void) {
|
||||
return tud_connected() && !tud_suspended();
|
||||
}
|
||||
|
||||
// Return true if host has completed connection to us (such as USB enumeration).
|
||||
bool supervisor_workflow_active(void) {
|
||||
// Eventually there might be other non-USB workflows, such as BLE.
|
||||
// tud_ready() checks for usb mounted and not suspended.
|
||||
return tud_ready();
|
||||
}
|
32
supervisor/shared/workflow.h
Normal file
32
supervisor/shared/workflow.h
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
extern void supervisor_workflow_reset(void);
|
||||
|
||||
extern bool supervisor_workflow_connecting(void);
|
||||
extern bool supervisor_workflow_active(void);
|
@ -75,6 +75,7 @@ else
|
||||
lib/tinyusb/src/class/cdc/cdc_device.c \
|
||||
lib/tinyusb/src/tusb.c \
|
||||
supervisor/shared/serial.c \
|
||||
supervisor/shared/workflow.c \
|
||||
supervisor/usb.c \
|
||||
supervisor/shared/usb/usb_desc.c \
|
||||
supervisor/shared/usb/usb.c \
|
||||
|
30
supervisor/workflow.h
Executable file
30
supervisor/workflow.h
Executable file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
// True when the user could be actively iterating on their code.
|
||||
bool workflow_active(void);
|
@ -19,7 +19,7 @@ import black
|
||||
IMPORTS_IGNORE = frozenset({'int', 'float', 'bool', 'str', 'bytes', 'tuple', 'list', 'set', 'dict', 'bytearray', 'slice', 'file', 'buffer', 'range', 'array', 'struct_time'})
|
||||
IMPORTS_TYPING = frozenset({'Any', 'Optional', 'Union', 'Tuple', 'List', 'Sequence', 'NamedTuple', 'Iterable', 'Iterator', 'Callable', 'AnyStr', 'overload', 'Type'})
|
||||
IMPORTS_TYPES = frozenset({'TracebackType'})
|
||||
CPY_TYPING = frozenset({'ReadableBuffer', 'WriteableBuffer', 'AudioSample', 'FrameBuffer'})
|
||||
CPY_TYPING = frozenset({'ReadableBuffer', 'WriteableBuffer', 'AudioSample', 'FrameBuffer', 'Alarm'})
|
||||
|
||||
|
||||
def is_typed(node, allow_any=False):
|
||||
|
Loading…
x
Reference in New Issue
Block a user