Skip to content

Commit 32438a1

Browse files
committed
improve gamepad support (should fix #343 )
1 parent 70a08a3 commit 32438a1

5 files changed

Lines changed: 54 additions & 55 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Rouvy is now officially supported by BikeControl! Read more about it [in our blo
44

55
**Features**:
66
- Long press now repeats the single click action by default, useful for continuous gear shifting or volume adjustments
7+
- Improved Gamepad support
78

89
**Fixes**:
910
- Bluetooth Media Remotes now trigger actions correctly

lib/bluetooth/devices/gamepad/gamepad_device.dart

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:bike_control/utils/keymap/buttons.dart';
77
import 'package:bike_control/widgets/ui/warning.dart';
88
import 'package:dartx/dartx.dart';
99
import 'package:gamepads/gamepads.dart';
10+
import 'package:prop/emulators/shared.dart';
1011
import 'package:shadcn_flutter/shadcn_flutter.dart';
1112

1213
class 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
}

pubspec.lock

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -651,67 +651,66 @@ packages:
651651
dependency: "direct main"
652652
description:
653653
name: gamepads
654-
sha256: "3a8a35502f0b3d28ea55e2c6c42320583389c0514a2bdd92ba0440d0cadd628e"
654+
sha256: "22249e4a78208f48bc84798f701cd1adee07cef34189954886ccf175580e9920"
655655
url: "https://pub.dev"
656656
source: hosted
657-
version: "0.1.9"
657+
version: "0.1.10+1"
658658
gamepads_android:
659659
dependency: transitive
660660
description:
661661
name: gamepads_android
662-
sha256: "7913cd171ff06d5b588cb3e1dae64390c6e1352dd2999ff19a96d822eb7441fd"
662+
sha256: aa71cb514f6aea3fddb21734ff52f38870c5054100fc44b798b6b9f91c4eef16
663663
url: "https://pub.dev"
664664
source: hosted
665-
version: "0.1.6"
665+
version: "0.1.7"
666666
gamepads_darwin:
667667
dependency: transitive
668668
description:
669669
name: gamepads_darwin
670-
sha256: "91250975ee196703816c55117502ec53ce4a1b881ca50dec1d0fbcb9fbb75eff"
670+
sha256: a7668dc17f2e4b95c29c54e961c3ef6e34e3997718383e96dd0bdf5a5c3b03c8
671671
url: "https://pub.dev"
672672
source: hosted
673-
version: "0.1.2+2"
673+
version: "0.1.2+4"
674674
gamepads_ios:
675675
dependency: transitive
676676
description:
677677
name: gamepads_ios
678-
sha256: "085459e2f677c18c4b15aee5dacc66e0b05491d4ed32bd3041c8328394e00d3a"
678+
sha256: "514a37d4b1b17bf47fe911ee1b750eca6be2b8abbdb71f200b9ad3186014d413"
679679
url: "https://pub.dev"
680680
source: hosted
681-
version: "0.1.3+1"
681+
version: "0.1.3+3"
682682
gamepads_linux:
683683
dependency: transitive
684684
description:
685685
name: gamepads_linux
686-
sha256: f4c17915a84400d7f624aadb6371424ada596eedff2a25663121453e65917e0d
686+
sha256: "80bf70df6da6185926e6d8b2feb98e725e6fe99290afafaea91dba471e8c1c1e"
687687
url: "https://pub.dev"
688688
source: hosted
689-
version: "0.1.1+3"
689+
version: "0.1.2"
690690
gamepads_platform_interface:
691691
dependency: transitive
692692
description:
693693
name: gamepads_platform_interface
694-
sha256: ddab8677a4137d92e381b04cc97a8081ae4b75673dc0f24c846618d2b5226c4f
694+
sha256: "9ddb3b61c780284a17739d759929d2e32b912d12d9145ee493ffe2b43fc6256a"
695695
url: "https://pub.dev"
696696
source: hosted
697-
version: "0.1.2+1"
697+
version: "0.1.3"
698698
gamepads_web:
699699
dependency: transitive
700700
description:
701701
name: gamepads_web
702-
sha256: "4885a792f16de023c4975854ffe17ffccacb46beb1e78ac1ecde76fd10edcb22"
702+
sha256: bf198f958727cd2d96f19be8b8d49057c9eb6b3095728d794181362b740d69ac
703703
url: "https://pub.dev"
704704
source: hosted
705-
version: "0.1.0"
705+
version: "0.1.1"
706706
gamepads_windows:
707-
dependency: "direct overridden"
707+
dependency: transitive
708708
description:
709-
path: "packages/gamepads_windows"
710-
ref: windows-api-rework
711-
resolved-ref: a4b8ded91b14d799ef0998a738b1f2031fef0bd2
712-
url: "https://github.com/lea108/gamepads.git"
713-
source: git
714-
version: "0.1.4+1"
709+
name: gamepads_windows
710+
sha256: "64285cc35c86748627bb29d486c4c7c631b0d11fe8128c89658946d9c2b32c1c"
711+
url: "https://pub.dev"
712+
source: hosted
713+
version: "0.3.0"
715714
gap:
716715
dependency: transitive
717716
description:

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ dependencies:
1818
universal_ble:
1919
git:
2020
url: https://github.com/jonasbark/universal_ble.git
21-
gamepads: ^0.1.8+2
21+
gamepads: ^0.1.10+1
2222

2323
lottie: ^3.3.2
2424
d4rt: ^0.2.2

pubspec_overrides_ci.yaml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,3 @@ dependency_overrides:
22
path_provider_foundation: ">=2.3.0 <2.6.0"
33
prop:
44
path: prop
5-
6-
gamepads_windows:
7-
git:
8-
url: https://github.com/lea108/gamepads.git
9-
ref: windows-api-rework
10-
path: packages/gamepads_windows

0 commit comments

Comments
 (0)