Skip to content

Commit 9ddc573

Browse files
committed
microbit: Add was_touched and get_touches to MicroBiTouchPin.
Signed-off-by: Damien George <[email protected]>
1 parent c9d6016 commit 9ddc573

File tree

4 files changed

+49
-19
lines changed

4 files changed

+49
-19
lines changed

inc/genhdr/qstrdefs.generated.h

+2
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,7 @@ QDEF(MP_QSTR_gc, (const byte*)"\x61\x02" "gc")
589589
QDEF(MP_QSTR_generator, (const byte*)"\x96\x09" "generator")
590590
QDEF(MP_QSTR_get, (const byte*)"\x33\x03" "get")
591591
QDEF(MP_QSTR_get_strength, (const byte*)"\x69\x0c" "get_strength")
592+
QDEF(MP_QSTR_get_touches, (const byte*)"\x1f\x0b" "get_touches")
592593
QDEF(MP_QSTR_getattr, (const byte*)"\xc0\x07" "getattr")
593594
QDEF(MP_QSTR_globals, (const byte*)"\x9d\x07" "globals")
594595
QDEF(MP_QSTR_hasattr, (const byte*)"\x8c\x07" "hasattr")
@@ -749,5 +750,6 @@ QDEF(MP_QSTR_utime, (const byte*)"\xe5\x05" "utime")
749750
QDEF(MP_QSTR_value, (const byte*)"\x4e\x05" "value")
750751
QDEF(MP_QSTR_values, (const byte*)"\x7d\x06" "values")
751752
QDEF(MP_QSTR_version_info, (const byte*)"\x6e\x0c" "version_info")
753+
QDEF(MP_QSTR_was_touched, (const byte*)"\xdb\x0b" "was_touched")
752754
QDEF(MP_QSTR_wfi, (const byte*)"\x9d\x03" "wfi")
753755
QDEF(MP_QSTR_zip, (const byte*)"\xe6\x03" "zip")

inc/microbit/modmicrobit.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,9 @@ const microbit_pinmode_t *microbit_pin_get_mode(const microbit_pin_obj_t *pin);
115115
bool microbit_obj_pin_can_be_acquired(const microbit_pin_obj_t *pin);
116116
void pinmode_error(const microbit_pin_obj_t *pin);
117117

118-
bool microbit_pin_high_debounced(microbit_pin_obj_t *pin);
118+
bool microbit_pin_debounce_is_high(const microbit_pin_obj_t *pin);
119+
bool microbit_pin_debounce_was_pressed(const microbit_pin_obj_t *pin);
120+
unsigned int microbit_pin_debounce_get_presses(const microbit_pin_obj_t *pin);
119121

120122
/****************************************************************/
121123
// microbit.Image class

source/microbit/microbitbutton.cpp

+19-12
Original file line numberDiff line numberDiff line change
@@ -59,28 +59,20 @@ static inline debounce_state_t *get_debounce_state(const microbit_pin_obj_t *pin
5959

6060
mp_obj_t microbit_button_is_pressed(mp_obj_t self_in) {
6161
microbit_button_obj_t *self = (microbit_button_obj_t*)self_in;
62-
debounce_state_t *debounce = get_debounce_state(self->pin);
6362
/* Button is pressed if pin is low */
64-
return mp_obj_new_bool(!debounce->debounced_high);
63+
return mp_obj_new_bool(!microbit_pin_debounce_is_high(self->pin));
6564
}
6665
MP_DEFINE_CONST_FUN_OBJ_1(microbit_button_is_pressed_obj, microbit_button_is_pressed);
6766

6867
mp_obj_t microbit_button_get_presses(mp_obj_t self_in) {
6968
microbit_button_obj_t *self = (microbit_button_obj_t*)self_in;
70-
debounce_state_t *debounce = get_debounce_state(self->pin);
71-
mp_obj_t n_presses = mp_obj_new_int(debounce->pressed >> 1);
72-
debounce->pressed &= 1;
73-
return n_presses;
69+
return mp_obj_new_int(microbit_pin_debounce_get_presses(self->pin));
7470
}
7571
MP_DEFINE_CONST_FUN_OBJ_1(microbit_button_get_presses_obj, microbit_button_get_presses);
7672

7773
mp_obj_t microbit_button_was_pressed(mp_obj_t self_in) {
7874
microbit_button_obj_t *self = (microbit_button_obj_t*)self_in;
79-
debounce_state_t *debounce = get_debounce_state(self->pin);
80-
mp_int_t presses = debounce->pressed;
81-
mp_obj_t result = mp_obj_new_bool(presses & 1);
82-
debounce->pressed = presses & -2;
83-
return result;
75+
return mp_obj_new_bool(microbit_pin_debounce_was_pressed(self->pin));
8476
}
8577
MP_DEFINE_CONST_FUN_OBJ_1(microbit_button_was_pressed_obj, microbit_button_was_pressed);
8678

@@ -184,9 +176,24 @@ void microbit_button_tick(void) {
184176
update(&microbit_p2_obj);
185177
}
186178

187-
bool microbit_pin_high_debounced(microbit_pin_obj_t *pin) {
179+
bool microbit_pin_debounce_is_high(const microbit_pin_obj_t *pin) {
188180
debounce_state_t *debounce = get_debounce_state(pin);
189181
return debounce->debounced_high;
190182
}
191183

184+
bool microbit_pin_debounce_was_pressed(const microbit_pin_obj_t *pin) {
185+
debounce_state_t *debounce = get_debounce_state(pin);
186+
uint16_t presses = debounce->pressed;
187+
bool result = presses & 1;
188+
debounce->pressed = presses & -2;
189+
return result;
190+
}
191+
192+
unsigned int microbit_pin_debounce_get_presses(const microbit_pin_obj_t *pin) {
193+
debounce_state_t *debounce = get_debounce_state(pin);
194+
unsigned int n_presses = debounce->pressed >> 1;
195+
debounce->pressed &= 1;
196+
return n_presses;
197+
}
198+
192199
}

source/microbit/microbitpin.cpp

+25-6
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ const microbit_pin_obj_t microbit_p16_obj = {{&microbit_dig_pin_type}, 16, MICRO
5454
const microbit_pin_obj_t microbit_p19_obj = {{&microbit_dig_pin_type}, 19, MICROBIT_PIN_P19, MODE_I2C};
5555
const microbit_pin_obj_t microbit_p20_obj = {{&microbit_dig_pin_type}, 20, MICROBIT_PIN_P20, MODE_I2C};
5656

57+
static void microbit_pin_configure_touch_mode(microbit_pin_obj_t *self) {
58+
const microbit_pinmode_t *mode = microbit_pin_get_mode(self);
59+
if (mode != microbit_pin_mode_touch && mode != microbit_pin_mode_button) {
60+
microbit_obj_pin_acquire(self, microbit_pin_mode_touch);
61+
nrf_gpio_cfg_input(self->name, NRF_GPIO_PIN_NOPULL);
62+
}
63+
}
5764

5865
static mp_obj_t microbit_pin_get_mode_func(mp_obj_t self_in) {
5966
microbit_pin_obj_t *self = (microbit_pin_obj_t*)self_in;
@@ -179,16 +186,26 @@ MP_DEFINE_CONST_FUN_OBJ_1(microbit_pin_get_analog_period_microseconds_obj, micro
179186

180187
mp_obj_t microbit_pin_is_touched(mp_obj_t self_in) {
181188
microbit_pin_obj_t *self = (microbit_pin_obj_t*)self_in;
182-
const microbit_pinmode_t *mode = microbit_pin_get_mode(self);
183-
if (mode != microbit_pin_mode_touch && mode != microbit_pin_mode_button) {
184-
microbit_obj_pin_acquire(self, microbit_pin_mode_touch);
185-
nrf_gpio_cfg_input(self->name, NRF_GPIO_PIN_NOPULL);
186-
}
189+
microbit_pin_configure_touch_mode(self);
187190
/* Pin is touched if it is low after debouncing */
188-
return mp_obj_new_bool(!microbit_pin_high_debounced(self));
191+
return mp_obj_new_bool(!microbit_pin_debounce_is_high(self));
189192
}
190193
MP_DEFINE_CONST_FUN_OBJ_1(microbit_pin_is_touched_obj, microbit_pin_is_touched);
191194

195+
mp_obj_t microbit_pin_was_touched(mp_obj_t self_in) {
196+
microbit_pin_obj_t *self = (microbit_pin_obj_t*)self_in;
197+
microbit_pin_configure_touch_mode(self);
198+
return mp_obj_new_bool(microbit_pin_debounce_was_pressed(self));
199+
}
200+
MP_DEFINE_CONST_FUN_OBJ_1(microbit_pin_was_touched_obj, microbit_pin_was_touched);
201+
202+
mp_obj_t microbit_pin_get_touches(mp_obj_t self_in) {
203+
microbit_pin_obj_t *self = (microbit_pin_obj_t*)self_in;
204+
microbit_pin_configure_touch_mode(self);
205+
return mp_obj_new_int(microbit_pin_debounce_get_presses(self));
206+
}
207+
MP_DEFINE_CONST_FUN_OBJ_1(microbit_pin_get_touches_obj, microbit_pin_get_touches);
208+
192209
#define PULL_CONSTANTS \
193210
{ MP_OBJ_NEW_QSTR(MP_QSTR_PULL_UP), MP_OBJ_NEW_SMALL_INT(NRF_GPIO_PIN_PULLUP) }, \
194211
{ MP_OBJ_NEW_QSTR(MP_QSTR_PULL_DOWN), MP_OBJ_NEW_SMALL_INT(NRF_GPIO_PIN_PULLDOWN) }, \
@@ -230,6 +247,8 @@ STATIC const mp_map_elem_t microbit_touch_pin_locals_dict_table[] = {
230247
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_analog_period_microseconds), (mp_obj_t)&microbit_pin_set_analog_period_microseconds_obj },
231248
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_analog_period_microseconds), (mp_obj_t)&microbit_pin_get_analog_period_microseconds_obj },
232249
{ MP_OBJ_NEW_QSTR(MP_QSTR_is_touched), (mp_obj_t)&microbit_pin_is_touched_obj },
250+
{ MP_OBJ_NEW_QSTR(MP_QSTR_was_touched), (mp_obj_t)&microbit_pin_was_touched_obj },
251+
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_touches), (mp_obj_t)&microbit_pin_get_touches_obj },
233252
PULL_CONSTANTS,
234253
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_pull),(mp_obj_t)&microbit_pin_get_pull_obj },
235254
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_pull),(mp_obj_t)&microbit_pin_set_pull_obj },

0 commit comments

Comments
 (0)