Skip to content

Commit 5dfd49f

Browse files
committed
pybricks.iodevices.XboxController: Add dpad as buttons.
Fixes https://github.com/orgs/pybricks/discussions/1537
1 parent b5a0e00 commit 5dfd49f

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@
66

77
### Added
88
- Added support for rumble in `XboxController` ([support#1024]).
9+
- Added `Button.UP`, `Button.DOWN`, `Button.LEFT`, and `Button.RIGHT` to
10+
`XboxController` buttons method ([support#1537]). The separate directional
11+
pad method remains available.
912

1013
### Changed
1114
- Allow single floating point value for brightness array ([support#1547]).
1215

1316
[support#1024]: https://github.com/pybricks/support/issues/1024
17+
[support#1537]: https://github.com/orgs/pybricks/discussions/1537
1418
[support#1547]: https://github.com/pybricks/support/issues/1547
1519

1620
## [3.4.0] - 2024-03-11

pybricks/iodevices/pb_type_iodevices_xbox_controller.c

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ STATIC xbox_input_map_t *pb_xbox_get_buttons(void) {
193193
STATIC mp_obj_t pb_xbox_button_pressed(void) {
194194
xbox_input_map_t *buttons = pb_xbox_get_buttons();
195195

196-
mp_obj_t items[16];
196+
// At most 16 simultaneous button presses, plus up to two dpad directions.
197+
mp_obj_t items[16 + 2];
197198
size_t count = 0;
198199

199200
if (buttons->buttons & 1) {
@@ -245,6 +246,30 @@ STATIC mp_obj_t pb_xbox_button_pressed(void) {
245246
items[count++] = pb_type_button_new(MP_QSTR_P4);
246247
}
247248

249+
// Dpad is available as separate method, but can also be used as
250+
// a normal set of buttons.
251+
if (buttons->dpad == 1) {
252+
items[count++] = pb_type_button_new(MP_QSTR_UP);
253+
} else if (buttons->dpad == 2) {
254+
items[count++] = pb_type_button_new(MP_QSTR_UP);
255+
items[count++] = pb_type_button_new(MP_QSTR_RIGHT);
256+
} else if (buttons->dpad == 3) {
257+
items[count++] = pb_type_button_new(MP_QSTR_RIGHT);
258+
} else if (buttons->dpad == 4) {
259+
items[count++] = pb_type_button_new(MP_QSTR_RIGHT);
260+
items[count++] = pb_type_button_new(MP_QSTR_DOWN);
261+
} else if (buttons->dpad == 5) {
262+
items[count++] = pb_type_button_new(MP_QSTR_DOWN);
263+
} else if (buttons->dpad == 6) {
264+
items[count++] = pb_type_button_new(MP_QSTR_DOWN);
265+
items[count++] = pb_type_button_new(MP_QSTR_LEFT);
266+
} else if (buttons->dpad == 7) {
267+
items[count++] = pb_type_button_new(MP_QSTR_LEFT);
268+
} else if (buttons->dpad == 8) {
269+
items[count++] = pb_type_button_new(MP_QSTR_LEFT);
270+
items[count++] = pb_type_button_new(MP_QSTR_UP);
271+
}
272+
248273
return mp_obj_new_set(count, items);
249274
}
250275

0 commit comments

Comments
 (0)