refactor device handling to support more devices #2

This commit is contained in:
Jonas Bark
2025-10-13 11:09:18 +02:00
parent b0df25241a
commit 01509eaae9
9 changed files with 31 additions and 23 deletions

View File

@@ -43,8 +43,9 @@ class Connection {
_addDevices([scanResult]);
} else {
final manufacturerData = result.manufacturerDataList;
final data =
manufacturerData.firstOrNullWhere((e) => e.companyId == Constants.ZWIFT_MANUFACTURER_ID)?.payload;
final data = manufacturerData
.firstOrNullWhere((e) => e.companyId == Constants.ZWIFT_MANUFACTURER_ID)
?.payload;
_actionStreams.add(LogNotification('Found unknown device with identifier: ${data?.firstOrNull}'));
}
}
@@ -69,7 +70,7 @@ class Connection {
// does not work on web, may not work on Windows
if (!kIsWeb && !Platform.isWindows) {
UniversalBle.getSystemDevices(
withServices: [BleUuid.ZWIFT_CUSTOM_SERVICE_UUID, BleUuid.ZWIFT_RIDE_CUSTOM_SERVICE_UUID],
withServices: BaseDevice.servicesToScan,
).then((devices) async {
final baseDevices = devices.mapNotNull(BaseDevice.fromScanResult).toList();
if (baseDevices.isNotEmpty) {
@@ -79,8 +80,8 @@ class Connection {
}
await UniversalBle.startScan(
scanFilter: ScanFilter(withServices: [BleUuid.ZWIFT_CUSTOM_SERVICE_UUID, BleUuid.ZWIFT_RIDE_CUSTOM_SERVICE_UUID]),
platformConfig: PlatformConfig(web: WebOptions(optionalServices: [BleUuid.ZWIFT_CUSTOM_SERVICE_UUID])),
scanFilter: ScanFilter(withServices: BaseDevice.servicesToScan),
platformConfig: PlatformConfig(web: WebOptions(optionalServices: BaseDevice.servicesToScan)),
);
Future.delayed(Duration(seconds: 30)).then((_) {
if (isScanning.value) {

View File

@@ -3,10 +3,10 @@ import 'dart:async';
import 'package:dartx/dartx.dart';
import 'package:flutter/foundation.dart';
import 'package:swift_control/bluetooth/ble.dart';
import 'package:swift_control/bluetooth/devices/zwift_click.dart';
import 'package:swift_control/bluetooth/devices/zwift_clickv2.dart';
import 'package:swift_control/bluetooth/devices/zwift_play.dart';
import 'package:swift_control/bluetooth/devices/zwift_ride.dart';
import 'package:swift_control/bluetooth/devices/zwift/zwift_click.dart';
import 'package:swift_control/bluetooth/devices/zwift/zwift_clickv2.dart';
import 'package:swift_control/bluetooth/devices/zwift/zwift_play.dart';
import 'package:swift_control/bluetooth/devices/zwift/zwift_ride.dart';
import 'package:swift_control/main.dart';
import 'package:swift_control/utils/actions/desktop.dart';
import 'package:universal_ble/universal_ble.dart';
@@ -16,9 +16,10 @@ import '../messages/notification.dart';
abstract class BaseDevice {
final BleDevice scanResult;
final bool isBeta;
final List<ControllerButton> availableButtons;
BaseDevice(this.scanResult, {required this.availableButtons});
BaseDevice(this.scanResult, {required this.availableButtons, this.isBeta = false});
bool isConnected = false;
int? batteryLevel;
@@ -27,6 +28,11 @@ abstract class BaseDevice {
Timer? _longPressTimer;
Set<ControllerButton> _previouslyPressedButtons = <ControllerButton>{};
static List<String> servicesToScan = [
BleUuid.ZWIFT_CUSTOM_SERVICE_UUID,
BleUuid.ZWIFT_RIDE_CUSTOM_SERVICE_UUID,
];
static BaseDevice? fromScanResult(BleDevice scanResult) {
// Use the name first as the "System Devices" and Web (android sometimes Windows) don't have manufacturer data
final device = kIsWeb

View File

@@ -2,7 +2,7 @@ import 'package:flutter/foundation.dart';
import 'package:swift_control/bluetooth/devices/zwift/zwift_device.dart';
import 'package:swift_control/utils/keymap/buttons.dart';
import '../messages/click_notification.dart';
import '../../messages/click_notification.dart';
class ZwiftClick extends ZwiftDevice {
ZwiftClick(super.scanResult)

View File

@@ -1,9 +1,9 @@
import 'dart:typed_data';
import 'package:swift_control/bluetooth/devices/zwift_ride.dart';
import 'package:swift_control/bluetooth/devices/zwift/zwift_ride.dart';
import '../ble.dart';
import '../protocol/zp.pbenum.dart';
import '../../ble.dart';
import '../../protocol/zp.pbenum.dart';
class ZwiftClickV2 extends ZwiftRide {
ZwiftClickV2(super.scanResult);

View File

@@ -5,7 +5,7 @@ import 'package:swift_control/bluetooth/devices/zwift/zwift_device.dart';
import 'package:swift_control/bluetooth/messages/play_notification.dart';
import 'package:swift_control/utils/keymap/buttons.dart';
import '../ble.dart';
import '../../ble.dart';
class ZwiftPlay extends ZwiftDevice {
ZwiftPlay(super.scanResult)

View File

@@ -1,17 +1,17 @@
import 'package:dartx/dartx.dart';
import 'package:flutter/foundation.dart';
import 'package:protobuf/protobuf.dart' as $pb;
import 'package:swift_control/bluetooth/devices/zwift/zwift_clickv2.dart';
import 'package:swift_control/bluetooth/devices/zwift/zwift_device.dart';
import 'package:swift_control/bluetooth/devices/zwift_clickv2.dart';
import 'package:swift_control/bluetooth/messages/ride_notification.dart';
import 'package:swift_control/bluetooth/protocol/zp_vendor.pb.dart';
import 'package:swift_control/utils/keymap/buttons.dart';
import 'package:universal_ble/universal_ble.dart';
import '../../main.dart';
import '../ble.dart';
import '../messages/notification.dart';
import '../protocol/zp.pb.dart';
import '../../../main.dart';
import '../../ble.dart';
import '../../messages/notification.dart';
import '../../protocol/zp.pb.dart';
class ZwiftRide extends ZwiftDevice {
/// Minimum absolute analog value (0-100) required to trigger paddle button press.

View File

@@ -5,7 +5,7 @@ import 'package:dartx/dartx.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:swift_control/bluetooth/devices/zwift_clickv2.dart';
import 'package:swift_control/bluetooth/devices/zwift/zwift_clickv2.dart';
import 'package:swift_control/bluetooth/protocol/zp.pb.dart';
import 'package:swift_control/main.dart';
import 'package:swift_control/pages/markdown.dart';

View File

@@ -3,7 +3,7 @@ import 'dart:ui';
import 'package:accessibility/accessibility.dart';
import 'package:bluetooth_low_energy/bluetooth_low_energy.dart';
import 'package:flutter/foundation.dart';
import 'package:swift_control/bluetooth/devices/zwift_click.dart';
import 'package:swift_control/bluetooth/devices/zwift/zwift_click.dart';
import 'package:swift_control/main.dart';
import 'package:swift_control/utils/actions/base_actions.dart';
import 'package:swift_control/utils/keymap/buttons.dart';

View File

@@ -1,6 +1,7 @@
import 'dart:typed_data';
import 'package:flutter_test/flutter_test.dart';
import 'package:swift_control/bluetooth/devices/zwift_ride.dart';
import 'package:swift_control/bluetooth/devices/zwift/zwift_ride.dart';
void main() {
group('Zwift Ride Analog Paddle - ZigZag Encoding Tests', () {