26
26
27
27
#include "py/runtime.h"
28
28
#include "py/mphal.h"
29
+ #include "drv_softtimer.h"
29
30
30
31
STATIC size_t get_array (mp_obj_t * src , mp_obj_t * * items ) {
31
32
if (* src == mp_const_none ) {
@@ -63,6 +64,14 @@ STATIC mp_obj_t power_deep_sleep(size_t n_args, const mp_obj_t *pos_args, mp_map
63
64
64
65
microbit_hal_power_clear_wake_sources ();
65
66
67
+ // Configure wake-up time, if given.
68
+ bool wake_on_ms = false;
69
+ uint32_t wake_ms = UINT32_MAX ;
70
+ if (args [ARG_ms ].u_obj != mp_const_none ) {
71
+ wake_on_ms = true;
72
+ wake_ms = mp_obj_get_int (args [ARG_ms ].u_obj );
73
+ }
74
+
66
75
// Configure wake-up sources.
67
76
mp_obj_t * items ;
68
77
size_t len = get_array (& args [ARG_wake_on ].u_obj , & items );
@@ -77,15 +86,24 @@ STATIC mp_obj_t power_deep_sleep(size_t n_args, const mp_obj_t *pos_args, mp_map
77
86
}
78
87
}
79
88
89
+ // If run_every is true then check if any soft timers will expire and need to wake the device.
80
90
if (args [ARG_run_every ].u_bool ) {
81
- mp_raise_ValueError (MP_ERROR_TEXT ("run_every not implemented" ));
91
+ microbit_soft_timer_set_pause (true);
92
+ uint32_t ms = microbit_soft_timer_get_ms_to_next_expiry ();
93
+ if (ms != UINT32_MAX ) {
94
+ // A soft timer will expire in "ms" milliseconds.
95
+ wake_on_ms = true;
96
+ if (ms < wake_ms ) {
97
+ wake_ms = ms ;
98
+ }
99
+ }
82
100
}
83
101
84
- if ( args [ ARG_ms ]. u_obj == mp_const_none ) {
85
- microbit_hal_power_deep_sleep (false, 0 );
86
- } else {
87
- microbit_hal_power_deep_sleep (true, mp_obj_get_int ( args [ ARG_ms ]. u_obj ));
88
- }
102
+ // Enter low power state.
103
+ microbit_hal_power_deep_sleep (wake_on_ms , wake_ms );
104
+
105
+ // Resume soft timer (doesn't hurt to resume even if it wasn't paused).
106
+ microbit_soft_timer_set_pause (false);
89
107
90
108
return mp_const_none ;
91
109
}
0 commit comments