9898#endif
9999
100100// How long to wait for host to enumerate (secs).
101- #define CIRCUITPY_USB_ENUMERATION_DELAY 1
101+ #define CIRCUITPY_USB_ENUMERATION_DELAY 5
102102
103103// How long to flash errors on the RGB status LED before going to sleep (secs)
104104#define CIRCUITPY_FLASH_ERROR_PERIOD 10
@@ -319,26 +319,28 @@ STATIC bool run_code_py(safe_mode_t safe_mode) {
319319 bool ok = result .return_code != PYEXEC_EXCEPTION ;
320320
321321 ESP_LOGI ("main" , "common_hal_alarm_enable_deep_sleep_alarms()" );
322- // Decide whether to deep sleep.
323322 #if CIRCUITPY_ALARM
324323 // Enable pin or time alarms before sleeping.
325324 common_hal_alarm_enable_deep_sleep_alarms ();
326325 #endif
327326
328- // Normally we won't deep sleep if there was an error or if we are connected to a host
329- // but either of those can be enabled.
330- // *********DON'T SLEEP IF USB HASN'T HAD TIME TO ENUMERATE.
331- bool will_deep_sleep =
332- (ok || supervisor_workflow_get_allow_deep_sleep_on_error ()) &&
333- (!supervisor_workflow_active () || supervisor_workflow_get_allow_deep_sleep_when_connected ());
334-
335- ESP_LOGI ("main" , "ok %d" , will_deep_sleep );
336- ESP_LOGI ("main" , "...on_error() %d" , supervisor_workflow_get_allow_deep_sleep_on_error ());
337- ESP_LOGI ("main" , "supervisor_workflow_active() %d" , supervisor_workflow_active ());
338- ESP_LOGI ("main" , "...when_connected() %d" , supervisor_workflow_get_allow_deep_sleep_when_connected ());
339- will_deep_sleep = false;
327+
340328 prep_rgb_status_animation (& result , found_main , safe_mode , & animation );
341329 while (true) {
330+ // Normally we won't deep sleep if there was an error or if we are connected to a host
331+ // but either of those can be enabled.
332+ // It's ok to deep sleep if we're not connected to a host, but we need to make sure
333+ // we're giving enough time for USB enumeration to happen.
334+ bool deep_sleep_allowed =
335+ (ok || supervisor_workflow_get_allow_deep_sleep_on_error ()) &&
336+ (!supervisor_workflow_active () || supervisor_workflow_get_allow_deep_sleep_when_connected ()) &&
337+ (supervisor_ticks_ms64 () > CIRCUITPY_USB_ENUMERATION_DELAY * 1024 );
338+
339+ ESP_LOGI ("main" , "ok %d" , deep_sleep_allowed );
340+ ESP_LOGI ("main" , "...on_error() %d" , supervisor_workflow_get_allow_deep_sleep_on_error ());
341+ ESP_LOGI ("main" , "supervisor_workflow_active() %d" , supervisor_workflow_active ());
342+ ESP_LOGI ("main" , "...when_connected() %d" , supervisor_workflow_get_allow_deep_sleep_when_connected ());
343+ ESP_LOGI ("main" , "supervisor_ticks_ms64() %lld" , supervisor_ticks_ms64 ());
342344 RUN_BACKGROUND_TASKS ;
343345 if (reload_requested ) {
344346 supervisor_set_run_reason (RUN_REASON_AUTO_RELOAD );
@@ -360,7 +362,7 @@ STATIC bool run_code_py(safe_mode_t safe_mode) {
360362 print_code_py_status_message (safe_mode );
361363 }
362364 // We won't be going into the REPL if we're going to sleep.
363- if (!will_deep_sleep ) {
365+ if (!deep_sleep_allowed ) {
364366 print_safe_mode_message (safe_mode );
365367 serial_write ("\n" );
366368 serial_write_compressed (translate ("Press any key to enter the REPL. Use CTRL-D to reload." ));
@@ -379,27 +381,31 @@ STATIC bool run_code_py(safe_mode_t safe_mode) {
379381 #endif
380382
381383 bool animation_done = false;
382- if (will_deep_sleep && ok ) {
384+
385+ if (deep_sleep_allowed && ok ) {
383386 // Skip animation if everything is OK.
384387 animation_done = true;
385388 } else {
386389 animation_done = tick_rgb_status_animation (& animation );
387390 }
388391 // Do an error animation only once before deep-sleeping.
389- if (animation_done && will_deep_sleep ) {
390- int64_t remaining_enumeration_wait = CIRCUITPY_USB_ENUMERATION_DELAY * 1024 - supervisor_ticks_ms64 ();
391- // If USB isn't enumerated then deep sleep after our waiting period.
392- if (ok && remaining_enumeration_wait < 0 ) {
392+ if (animation_done ) {
393+ if (deep_sleep_allowed ) {
393394 common_hal_mcu_deep_sleep ();
394395 // Does not return.
395396 }
397+
396398 // Wake up every so often to flash the error code.
397399 if (!ok ) {
398400 port_interrupt_after_ticks (CIRCUITPY_FLASH_ERROR_PERIOD * 1024 );
399401 } else {
400- port_interrupt_after_ticks (remaining_enumeration_wait );
402+ int64_t remaining_enumeration_wait =
403+ CIRCUITPY_USB_ENUMERATION_DELAY * 1024 - supervisor_ticks_ms64 ();
404+ if (remaining_enumeration_wait > 0 ) {
405+ port_interrupt_after_ticks (remaining_enumeration_wait );
406+ }
407+ port_sleep_until_interrupt ();
401408 }
402- port_sleep_until_interrupt ();
403409 }
404410 }
405411}
0 commit comments