summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2020-11-16 11:56:20 -0500
committerDan Halbert <halbert@halwitz.org>2020-11-16 11:56:20 -0500
commitbb77f1d130d59428b66186fc52c2749531ff598e (patch)
treeeb3922b0bcafed91a190b0e73fd9b68503cdc3f7 /main.c
parent8d3a878152c7cd29871c634865dd2fe2ee8b851e (diff)
parent9a4efed8cbaca3aa48c6cc0ce0a4e267eef7a8e1 (diff)
wip: initial code changes, starting from @tannewt's sleepio branch
Diffstat (limited to 'main.c')
-rwxr-xr-xmain.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/main.c b/main.c
index 80b163f60..a200b6264 100755
--- a/main.c
+++ b/main.c
@@ -57,6 +57,9 @@
#include "supervisor/shared/status_leds.h"
#include "supervisor/shared/stack.h"
#include "supervisor/serial.h"
+#include "supervisor/usb.h"
+
+#include "shared-bindings/microcontroller/__init__.h"
#include "boards/board.h"
@@ -85,6 +88,10 @@
#include "common-hal/canio/CAN.h"
#endif
+#if CIRCUITPY_SLEEP
+#include "shared-bindings/sleep/__init__.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) {
@@ -312,6 +319,14 @@ bool run_code_py(safe_mode_t safe_mode) {
bool refreshed_epaper_display = false;
#endif
rgb_status_animation_t animation;
+ bool ok = result->return_code != PYEXEC_EXCEPTION;
+ #if CIRCUITPY_SLEEP
+ // If USB isn't enumerated then deep sleep.
+ if (ok && !supervisor_workflow_active() && supervisor_ticks_ms64() > CIRCUITPY_USB_ENUMERATION_DELAY * 1024) {
+ common_hal_sleep_deep_sleep();
+ }
+ #endif
+ // Show the animation every N seconds.
prep_rgb_status_animation(&result, found_main, safe_mode, &animation);
while (true) {
RUN_BACKGROUND_TASKS;
@@ -344,8 +359,24 @@ bool run_code_py(safe_mode_t safe_mode) {
refreshed_epaper_display = maybe_refresh_epaperdisplay();
}
#endif
-
- tick_rgb_status_animation(&animation);
+ bool animation_done = tick_rgb_status_animation(&animation);
+ if (animation_done && supervisor_workflow_active()) {
+ #if CIRCUITPY_SLEEP
+ int64_t remaining_enumeration_wait = CIRCUITPY_USB_ENUMERATION_DELAY * 1024 - supervisor_ticks_ms64();
+ // If USB isn't enumerated then deep sleep after our waiting period.
+ if (ok && remaining_enumeration_wait < 0) {
+ common_hal_sleep_deep_sleep();
+ return; // Doesn't actually get here.
+ }
+ #endif
+ // Wake up every so often to flash the error code.
+ if (!ok) {
+ port_interrupt_after_ticks(CIRCUITPY_FLASH_ERROR_PERIOD * 1024);
+ } else {
+ port_interrupt_after_ticks(remaining_enumeration_wait);
+ }
+ port_sleep_until_interrupt();
+ }
}
}
@@ -392,7 +423,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_sleep_get_reset_reason() == RESET_REASON_POWER_VALID) {
+ mp_hal_delay_ms(1500);
+ }
// USB isn't up, so we can write the file.
filesystem_set_internal_writable_by_usb(false);
@@ -511,7 +544,7 @@ int __attribute__((used)) main(void) {
}
if (exit_code == PYEXEC_FORCED_EXIT) {
if (!first_run) {
- serial_write_compressed(translate("soft reboot\n"));
+ serial_write_compressed(translate("\n\n------ soft reboot ------\n"));
}
first_run = false;
skip_repl = run_code_py(safe_mode);