@@ -7,6 +7,7 @@ import 'package:bike_control/utils/keymap/buttons.dart';
77import 'package:bike_control/widgets/ui/warning.dart' ;
88import 'package:dartx/dartx.dart' ;
99import 'package:gamepads/gamepads.dart' ;
10+ import 'package:prop/emulators/shared.dart' ;
1011import 'package:shadcn_flutter/shadcn_flutter.dart' ;
1112
1213class GamepadDevice extends BaseDevice {
@@ -18,41 +19,45 @@ class GamepadDevice extends BaseDevice {
1819
1920 @override
2021 Future <void > connect () async {
21- Gamepads .eventsByGamepad (id).listen ((event) async {
22- actionStreamInternal.add (LogNotification ('Gamepad event: ${event .key } value ${event .value } type ${event .type }' ));
22+ isConnected = true ;
2323
24- final int normalizedValue = switch (event.value) {
25- > 1.0 => 1 ,
26- < - 1.0 => - 1 ,
27- _ => event.value.toInt (),
28- };
24+ Gamepads .normalizedEvents.where ((pad) => pad.gamepadId == id).listen ((event) async {
25+ if (event.axis != null && event.value.abs ().round () != 1 && event.value.abs ().round () != 0 ) {
26+ // ignore axis events that are not fully pressed to avoid accidental triggers from analog drift or light touches
27+ return ;
28+ }
29+ final buttonKey = event.button? .name ?? '${event .axis !.name }_${event .value .round ()}' ;
2930
30- final buttonKey = event.type == KeyType .analog ? '${event .key }_$normalizedValue ' : event.key;
31- ControllerButton button = getOrAddButton (
32- buttonKey,
33- () => ControllerButton (buttonKey, sourceDeviceId: id),
31+ actionStreamInternal.add (
32+ LogNotification ('Gamepad event: ${event .button ?.name ?? event .axis !.name } value ${event .value }' ),
3433 );
3534
36- switch (event.type) {
37- case KeyType .analog:
38- final releasedValue = Platform .isWindows ? 1 : 0 ;
39-
40- if (event.value.round ().abs () != releasedValue) {
41- final buttonsClicked = [button];
42- if (_lastButtonsClicked.contentEquals (buttonsClicked) == false ) {
43- handleButtonsClicked (buttonsClicked);
44- }
45- _lastButtonsClicked = buttonsClicked;
46- } else {
47- _lastButtonsClicked = [];
48- handleButtonsClicked ([]);
49- }
50- case KeyType .button:
51- final buttonsClicked = event.value.toInt () != 1 ? [button] : < ControllerButton > [];
35+ if (event.axis != null ) {
36+ if (event.value.round ().abs () != 0 ) {
37+ ControllerButton button = getOrAddButton (
38+ buttonKey,
39+ () => ControllerButton (buttonKey, sourceDeviceId: id),
40+ );
41+ final buttonsClicked = [button];
5242 if (_lastButtonsClicked.contentEquals (buttonsClicked) == false ) {
5343 handleButtonsClicked (buttonsClicked);
5444 }
5545 _lastButtonsClicked = buttonsClicked;
46+ } else {
47+ _lastButtonsClicked = [];
48+ handleButtonsClicked ([]);
49+ }
50+ } else {
51+ ControllerButton button = getOrAddButton (
52+ buttonKey,
53+ () => ControllerButton (buttonKey, sourceDeviceId: id),
54+ );
55+ final buttonsClicked = event.value.toInt () == 1 ? [button] : < ControllerButton > [];
56+ if (_lastButtonsClicked.contentEquals (buttonsClicked) == false ) {
57+ Logger .info ("Buttons clicked: ${buttonsClicked .map ((b ) => b .name ).join (', ' )}" );
58+ handleButtonsClicked (buttonsClicked);
59+ }
60+ _lastButtonsClicked = buttonsClicked;
5661 }
5762 });
5863 }
0 commit comments