Skip to content

Commit 40e9bb6

Browse files
committed
codal_port: Make pin_speaker a separate type, add disable/enable meths.
1 parent e6e43f1 commit 40e9bb6

File tree

3 files changed

+39
-2
lines changed

3 files changed

+39
-2
lines changed

src/codal_port/microbit_pin.c

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ const microbit_pin_obj_t microbit_p19_obj = {{&microbit_dig_pin_type}, 19, MICR
4949
const microbit_pin_obj_t microbit_p20_obj = {{&microbit_dig_pin_type}, 20, MICROBIT_HAL_PIN_P20, MODE_I2C};
5050

5151
const microbit_pin_obj_t microbit_pin_logo_obj = {{&microbit_touch_only_pin_type}, 30, MICROBIT_HAL_PIN_FACE, MODE_UNUSED};
52-
const microbit_pin_obj_t microbit_pin_speaker_obj = {{&microbit_dig_pin_type}, 31, MICROBIT_HAL_PIN_SPEAKER, MODE_UNUSED};
52+
const microbit_pin_obj_t microbit_pin_speaker_obj = {{&microbit_speaker_pin_type}, 31, MICROBIT_HAL_PIN_SPEAKER, MODE_UNUSED};
5353

5454
static mp_obj_t microbit_pin_get_mode_func(mp_obj_t self_in) {
5555
microbit_pin_obj_t *self = (microbit_pin_obj_t*)self_in;
@@ -166,6 +166,20 @@ mp_obj_t microbit_pin_is_touched(mp_obj_t self_in) {
166166
}
167167
MP_DEFINE_CONST_FUN_OBJ_1(microbit_pin_is_touched_obj, microbit_pin_is_touched);
168168

169+
STATIC mp_obj_t microbit_pin_speaker_disable(mp_obj_t self_in) {
170+
(void)self_in;
171+
microbit_pin_audio_speaker_enable(false);
172+
return mp_const_none;
173+
}
174+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(microbit_pin_speaker_disable_obj, microbit_pin_speaker_disable);
175+
176+
STATIC mp_obj_t microbit_pin_speaker_enable(mp_obj_t self_in) {
177+
(void)self_in;
178+
microbit_pin_audio_speaker_enable(true);
179+
return mp_const_none;
180+
}
181+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(microbit_pin_speaker_enable_obj, microbit_pin_speaker_enable);
182+
169183
#define PULL_CONSTANTS \
170184
{ MP_ROM_QSTR(MP_QSTR_PULL_UP), MP_ROM_INT(MICROBIT_HAL_PIN_PULL_UP) }, \
171185
{ MP_ROM_QSTR(MP_QSTR_PULL_DOWN), MP_ROM_INT(MICROBIT_HAL_PIN_PULL_DOWN) }, \
@@ -245,9 +259,26 @@ const mp_obj_type_t microbit_touch_only_pin_type = {
245259
.locals_dict = (mp_obj_dict_t *)&microbit_touch_only_pin_locals_dict,
246260
};
247261

262+
STATIC const mp_rom_map_elem_t microbit_speaker_pin_locals_dict_table[] = {
263+
{ MP_ROM_QSTR(MP_QSTR_write_digital), MP_ROM_PTR(&microbit_pin_write_digital_obj) },
264+
{ MP_ROM_QSTR(MP_QSTR_write_analog), MP_ROM_PTR(&microbit_pin_write_analog_obj) },
265+
{ MP_ROM_QSTR(MP_QSTR_set_analog_period), MP_ROM_PTR(&microbit_pin_set_analog_period_obj) },
266+
{ MP_ROM_QSTR(MP_QSTR_set_analog_period_microseconds), MP_ROM_PTR(&microbit_pin_set_analog_period_microseconds_obj) },
267+
{ MP_ROM_QSTR(MP_QSTR_get_analog_period_microseconds), MP_ROM_PTR(&microbit_pin_get_analog_period_microseconds_obj) },
268+
{ MP_ROM_QSTR(MP_QSTR_disable), MP_ROM_PTR(&microbit_pin_speaker_disable_obj) },
269+
{ MP_ROM_QSTR(MP_QSTR_enable), MP_ROM_PTR(&microbit_pin_speaker_enable_obj) },
270+
};
271+
STATIC MP_DEFINE_CONST_DICT(microbit_speaker_pin_locals_dict, microbit_speaker_pin_locals_dict_table);
272+
273+
const mp_obj_type_t microbit_speaker_pin_type = {
274+
{ &mp_type_type },
275+
.name = MP_QSTR_MicroBitSpeakerPin,
276+
.locals_dict = (mp_obj_dict_t *)&microbit_speaker_pin_locals_dict,
277+
};
278+
248279
const microbit_pin_obj_t *microbit_obj_get_pin(mp_obj_t o) {
249280
const mp_obj_type_t *type = mp_obj_get_type(o);
250-
if (type == &microbit_touch_pin_type || type == &microbit_ad_pin_type || type == &microbit_dig_pin_type) {
281+
if (type == &microbit_touch_pin_type || type == &microbit_ad_pin_type || type == &microbit_dig_pin_type || type == &microbit_speaker_pin_type) {
251282
return (microbit_pin_obj_t*)o;
252283
} else {
253284
mp_raise_TypeError("expecting a pin");

src/codal_port/microbit_pinaudio.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ STATIC void microbit_pin_audio_get_pins(mp_const_obj_t select, const microbit_pi
8686
*speaker_selected = *speaker_selected && audio_speaker_enabled;
8787
}
8888

89+
void microbit_pin_audio_speaker_enable(bool enable) {
90+
audio_speaker_enabled = enable;
91+
}
92+
8993
void microbit_pin_audio_select(mp_const_obj_t select) {
9094
// Work out which pins are selected.
9195
const microbit_pin_obj_t *pin_selected;

src/codal_port/modmicrobit.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ extern const mp_obj_type_t microbit_ad_pin_type;
7777
extern const mp_obj_type_t microbit_dig_pin_type;
7878
extern const mp_obj_type_t microbit_touch_pin_type;
7979
extern const mp_obj_type_t microbit_touch_only_pin_type;
80+
extern const mp_obj_type_t microbit_speaker_pin_type;
8081
extern const mp_obj_type_t microbit_soundevent_type;
8182

8283
extern const struct _microbit_pin_obj_t microbit_p0_obj;
@@ -202,6 +203,7 @@ bool microbit_obj_pin_acquire(const microbit_pin_obj_t *pin, const microbit_pinm
202203
const microbit_pinmode_t *microbit_pin_get_mode(const microbit_pin_obj_t *pin);
203204
void pinmode_error(const microbit_pin_obj_t *pin);
204205

206+
void microbit_pin_audio_speaker_enable(bool enable);
205207
void microbit_pin_audio_select(mp_const_obj_t select);
206208
void microbit_pin_audio_free(void);
207209

0 commit comments

Comments
 (0)