Skip to content

Commit 68642ff

Browse files
markshannondpgeorge
authored andcommitted
Don't use DAL fibers, instead run as a single thread.
Only poll accelerometer and compass when needed.
1 parent 6c86e4e commit 68642ff

File tree

7 files changed

+90
-12
lines changed

7 files changed

+90
-12
lines changed

inc/genhdr/qstrdefs.generated.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ QDEF(MP_QSTR_accelerometer, (const byte*)"\x1e\x0d" "accelerometer")
359359
QDEF(MP_QSTR_get_x, (const byte*)"\x34\x05" "get_x")
360360
QDEF(MP_QSTR_get_y, (const byte*)"\x35\x05" "get_y")
361361
QDEF(MP_QSTR_get_z, (const byte*)"\x36\x05" "get_z")
362+
QDEF(MP_QSTR_get_values, (const byte*)"\xf4\x0a" "get_values")
362363
QDEF(MP_QSTR_MicroBitCompass, (const byte*)"\x10\x0f" "MicroBitCompass")
363364
QDEF(MP_QSTR_compass, (const byte*)"\x55\x07" "compass")
364365
QDEF(MP_QSTR_heading, (const byte*)"\x2d\x07" "heading")

inc/microbit/qstrdefsport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ Q(accelerometer)
124124
Q(get_x)
125125
Q(get_y)
126126
Q(get_z)
127+
Q(get_values)
127128

128129
Q(MicroBitCompass)
129130
Q(compass)

source/microbit/microbitaccelerometer.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,57 @@ typedef struct _microbit_accelerometer_obj_t {
3636
MicroBitAccelerometer *accelerometer;
3737
} microbit_accelerometer_obj_t;
3838

39+
bool accelerometer_up_to_date = false;
40+
3941
mp_obj_t microbit_accelerometer_get_x(mp_obj_t self_in) {
4042
microbit_accelerometer_obj_t *self = (microbit_accelerometer_obj_t*)self_in;
43+
if (!accelerometer_up_to_date) {
44+
self->accelerometer->idleTick();
45+
accelerometer_up_to_date = true;
46+
}
4147
return mp_obj_new_int(self->accelerometer->getX());
4248
}
4349
MP_DEFINE_CONST_FUN_OBJ_1(microbit_accelerometer_get_x_obj, microbit_accelerometer_get_x);
4450

4551
mp_obj_t microbit_accelerometer_get_y(mp_obj_t self_in) {
4652
microbit_accelerometer_obj_t *self = (microbit_accelerometer_obj_t*)self_in;
53+
if (!accelerometer_up_to_date) {
54+
self->accelerometer->idleTick();
55+
accelerometer_up_to_date = true;
56+
}
4757
return mp_obj_new_int(self->accelerometer->getY());
4858
}
4959
MP_DEFINE_CONST_FUN_OBJ_1(microbit_accelerometer_get_y_obj, microbit_accelerometer_get_y);
5060

5161
mp_obj_t microbit_accelerometer_get_z(mp_obj_t self_in) {
5262
microbit_accelerometer_obj_t *self = (microbit_accelerometer_obj_t*)self_in;
63+
if (!accelerometer_up_to_date) {
64+
self->accelerometer->idleTick();
65+
accelerometer_up_to_date = true;
66+
}
5367
return mp_obj_new_int(self->accelerometer->getZ());
5468
}
5569
MP_DEFINE_CONST_FUN_OBJ_1(microbit_accelerometer_get_z_obj, microbit_accelerometer_get_z);
5670

71+
mp_obj_t microbit_accelerometer_get_values(mp_obj_t self_in) {
72+
microbit_accelerometer_obj_t *self = (microbit_accelerometer_obj_t*)self_in;
73+
mp_obj_tuple_t *tuple = (mp_obj_tuple_t *)mp_obj_new_tuple(3, NULL);
74+
if (!accelerometer_up_to_date) {
75+
self->accelerometer->idleTick();
76+
accelerometer_up_to_date = true;
77+
}
78+
tuple->items[0] = mp_obj_new_int(self->accelerometer->getX());
79+
tuple->items[1] = mp_obj_new_int(self->accelerometer->getY());
80+
tuple->items[2] = mp_obj_new_int(self->accelerometer->getZ());
81+
return tuple;
82+
}
83+
MP_DEFINE_CONST_FUN_OBJ_1(microbit_accelerometer_get_values_obj, microbit_accelerometer_get_values);
84+
5785
STATIC const mp_map_elem_t microbit_accelerometer_locals_dict_table[] = {
5886
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_x), (mp_obj_t)&microbit_accelerometer_get_x_obj },
5987
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_y), (mp_obj_t)&microbit_accelerometer_get_y_obj },
6088
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_z), (mp_obj_t)&microbit_accelerometer_get_z_obj },
89+
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_values), (mp_obj_t)&microbit_accelerometer_get_values_obj },
6190
};
6291

6392
STATIC MP_DEFINE_CONST_DICT(microbit_accelerometer_locals_dict, microbit_accelerometer_locals_dict_table);

source/microbit/microbitcompass.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,26 +62,44 @@ mp_obj_t microbit_compass_clear_calibration(mp_obj_t self_in) {
6262
}
6363
MP_DEFINE_CONST_FUN_OBJ_1(microbit_compass_clear_calibration_obj, microbit_compass_clear_calibration);
6464

65+
bool compass_up_to_date = false;
66+
6567
mp_obj_t microbit_compass_heading(mp_obj_t self_in) {
6668
microbit_compass_obj_t *self = (microbit_compass_obj_t*)self_in;
69+
if (!compass_up_to_date) {
70+
self->compass->idleTick();
71+
compass_up_to_date = true;
72+
}
6773
return mp_obj_new_int(self->compass->heading());
6874
}
6975
MP_DEFINE_CONST_FUN_OBJ_1(microbit_compass_heading_obj, microbit_compass_heading);
7076

7177
mp_obj_t microbit_compass_get_x(mp_obj_t self_in) {
7278
microbit_compass_obj_t *self = (microbit_compass_obj_t*)self_in;
79+
if (!compass_up_to_date) {
80+
self->compass->idleTick();
81+
compass_up_to_date = true;
82+
}
7383
return mp_obj_new_int(self->compass->getX());
7484
}
7585
MP_DEFINE_CONST_FUN_OBJ_1(microbit_compass_get_x_obj, microbit_compass_get_x);
7686

7787
mp_obj_t microbit_compass_get_y(mp_obj_t self_in) {
7888
microbit_compass_obj_t *self = (microbit_compass_obj_t*)self_in;
89+
if (!compass_up_to_date) {
90+
self->compass->idleTick();
91+
compass_up_to_date = true;
92+
}
7993
return mp_obj_new_int(self->compass->getY());
8094
}
8195
MP_DEFINE_CONST_FUN_OBJ_1(microbit_compass_get_y_obj, microbit_compass_get_y);
8296

8397
mp_obj_t microbit_compass_get_z(mp_obj_t self_in) {
8498
microbit_compass_obj_t *self = (microbit_compass_obj_t*)self_in;
99+
if (!compass_up_to_date) {
100+
self->compass->idleTick();
101+
compass_up_to_date = true;
102+
}
85103
return mp_obj_new_int(self->compass->getZ());
86104
}
87105
MP_DEFINE_CONST_FUN_OBJ_1(microbit_compass_get_z_obj, microbit_compass_get_z);

source/microbit/microbitdisplay.cpp

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,18 +102,15 @@ static mp_obj_t async_repeat_iterable = NULL;
102102
static mp_obj_t async_iterator = NULL;
103103
// Record if an error occurs in async animation. Unfortunately there is no way to report this.
104104
static bool async_error = false;
105+
static volatile bool wakeup_event = false;
105106
static uint16_t async_nonce = 0;
106107
static mp_uint_t async_delay = 1000;
107108
static mp_uint_t async_tick = 0;
108109

109-
STATIC void wakeup_event() {
110-
// Wake up any fibers that were blocked on the animation (if any).
111-
MicroBitEvent event(MICROBIT_ID_ALERT, async_nonce);
112-
}
113-
114110
STATIC void wait_for_event() {
115-
async_nonce = uBit.MessageBus.nonce();
116-
fiber_wait_for_event(MICROBIT_ID_ALERT, async_nonce);
111+
while (!wakeup_event)
112+
__WFI();
113+
wakeup_event = false;
117114
}
118115

119116
STATIC void async_stop(void) {
@@ -125,7 +122,7 @@ STATIC void async_stop(void) {
125122
MP_STATE_PORT(async_data)[0] = NULL;
126123
MP_STATE_PORT(async_data)[1] = NULL;
127124
MP_STATE_PORT(async_data)[2] = NULL;
128-
wakeup_event();
125+
wakeup_event = true;
129126
}
130127

131128
struct DisplayPoint {
@@ -250,6 +247,7 @@ static void microbit_display_update(void) {
250247
case ASYNC_MODE_ANIMATION:
251248
{
252249
if (MP_STATE_PORT(async_data)[0] == NULL || MP_STATE_PORT(async_data)[1] == NULL) {
250+
async_stop();
253251
break;
254252
}
255253
microbit_display_obj_t *display = (microbit_display_obj_t*)MP_STATE_PORT(async_data)[0];
@@ -314,6 +312,7 @@ void microbit_display_animate(microbit_display_obj_t *self, mp_obj_t iterable, m
314312
async_repeat_iterable = iterable;
315313
MP_STATE_PORT(async_data)[2] = iterable;
316314
}
315+
wakeup_event = false;
317316
async_mode = ASYNC_MODE_ANIMATION;
318317
if (wait) {
319318
wait_for_event();
@@ -378,6 +377,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(microbit_display_scroll_obj, 1, microbit_display_scro
378377

379378
void microbit_display_clear(void) {
380379
// Reset repeat state, cancel animation and clear screen.
380+
wakeup_event = false;
381381
async_mode = ASYNC_MODE_CLEAR;
382382
async_tick = async_delay - FIBER_TICK_PERIOD_MS;
383383
wait_for_event();
@@ -461,9 +461,25 @@ microbit_display_obj_t microbit_display_obj = {
461461
.strobe_mask = 0x20
462462
};
463463

464+
extern bool compass_up_to_date;
465+
extern bool accelerometer_up_to_date;
466+
464467
static void ticker(void) {
465-
// Make sure we call the DAL ticker function.
466-
uBit.systemTick();
468+
469+
// increment our real-time counter.
470+
ticks += FIBER_TICK_PERIOD_MS;
471+
472+
if (uBit.compass.isCalibrating()) {
473+
uBit.compass.idleTick();
474+
}
475+
476+
compass_up_to_date = false;
477+
accelerometer_up_to_date = false;
478+
479+
// Update buttons
480+
uBit.buttonA.systemTick();
481+
uBit.buttonB.systemTick();
482+
467483
// Update the display.
468484
microbit_display_tick();
469485
}

source/microbit/modmicrobit.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,20 @@ STATIC mp_obj_t microbit_reset_(void) {
3838
MP_DEFINE_CONST_FUN_OBJ_0(microbit_reset_obj, microbit_reset_);
3939

4040
STATIC mp_obj_t microbit_sleep(mp_obj_t ms_in) {
41-
uBit.sleep(mp_obj_get_int(ms_in));
41+
mp_int_t ms = mp_obj_get_int(ms_in);
42+
if (ms <= 0)
43+
return mp_const_none;
44+
unsigned long current = uBit.systemTime();
45+
unsigned long wakeup = current + ms;
46+
if (wakeup < current) {
47+
// Overflow
48+
do {
49+
__WFI();
50+
} while (uBit.systemTime() > current);
51+
}
52+
do {
53+
__WFI();
54+
} while (uBit.systemTime() < wakeup);
4255
return mp_const_none;
4356
}
4457
MP_DEFINE_CONST_FUN_OBJ_1(microbit_sleep_obj, microbit_sleep);

source/microbit/mphal.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ bool mp_hal_stdin_rx_any(void) {
7777

7878
int mp_hal_stdin_rx_chr(void) {
7979
while (uart_rx_buf_tail == uart_rx_buf_head) {
80-
schedule();
80+
__WFI();
8181
}
8282
int c = uart_rx_buf[uart_rx_buf_tail];
8383
uart_rx_buf_tail = (uart_rx_buf_tail + 1) % UART_RX_BUF_SIZE;

0 commit comments

Comments
 (0)