From 9b672a75039c85e0ece91f52bdb411fccf301141 Mon Sep 17 00:00:00 2001 From: Yandrik Date: Mon, 4 May 2026 13:18:03 +0200 Subject: [PATCH] feat: update optimizations --- lib/controller/bluetooth.dart | 21 +++++++++++++++++ lib/model/shifter_types.dart | 2 +- lib/service/firmware_update_service.dart | 23 +++++++++++++++++++ .../service/firmware_update_service_test.dart | 15 ++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/lib/controller/bluetooth.dart b/lib/controller/bluetooth.dart index b67b12b..262a437 100644 --- a/lib/controller/bluetooth.dart +++ b/lib/controller/bluetooth.dart @@ -363,6 +363,27 @@ class BluetoothController { } } + Future> requestHighPerformanceConnection( + String deviceId, + ) async { + if (defaultTargetPlatform != TargetPlatform.android) { + return Ok(null); + } + + try { + await _ble.requestConnectionPriority( + deviceId: deviceId, + priority: ConnectionPriority.highPerformance, + ); + log.info('High-performance BLE connection requested for $deviceId'); + return Ok(null); + } catch (e) { + return bail( + 'Error requesting high-performance BLE connection for $deviceId: $e', + ); + } + } + Future> _requestInitialMtu(String deviceId) async { if (defaultTargetPlatform != TargetPlatform.android) { return Ok(null); diff --git a/lib/model/shifter_types.dart b/lib/model/shifter_types.dart index a5a27c1..e15576e 100644 --- a/lib/model/shifter_types.dart +++ b/lib/model/shifter_types.dart @@ -45,7 +45,7 @@ const int universalShifterBootloaderDfuMaxPayloadSizeBytes = universalShifterBootloaderDfuDataHeaderSizeBytes; const int universalShifterBootloaderDfuStatusSizeBytes = 6; const int universalShifterAttWriteOverheadBytes = 3; -const int universalShifterDfuPreferredMtu = 128; +const int universalShifterDfuPreferredMtu = 131; const int universalShifterDfuAppStart = 0x00030000; const int universalShifterDfuAppSlotSizeBytes = 0x0003F000; diff --git a/lib/service/firmware_update_service.dart b/lib/service/firmware_update_service.dart index ae2196b..0bfd65c 100644 --- a/lib/service/firmware_update_service.dart +++ b/lib/service/firmware_update_service.dart @@ -148,6 +148,8 @@ class FirmwareUpdateService { await _connectToBootloader(timeout: effectiveBootloaderConnectTimeout); } + await _optimizeBootloaderConnection(); + final mtuResult = await _transport.negotiateMtu(requestedMtu: requestedMtu); if (mtuResult.isErr()) { @@ -455,6 +457,13 @@ class FirmwareUpdateService { } } + Future _optimizeBootloaderConnection() async { + final result = await _transport.optimizeBootloaderConnection(); + if (result.isErr()) { + _emitProgress(errorMessage: result.unwrapErr().toString()); + } + } + Future _sendStartAndWaitForStatus( BootloaderDfuStartPayload payload, { required Duration timeout, @@ -481,6 +490,7 @@ class FirmwareUpdateService { errorMessage: failure.message, ); await _connectToBootloader(timeout: bootloaderConnectTimeout); + await _optimizeBootloaderConnection(); await _subscribeToStatus(); _emitProgress(state: DfuUpdateState.waitingForStatus); return _requestStatus(timeout: timeout); @@ -746,6 +756,8 @@ abstract interface class FirmwareUpdateTransport { Future> connectToBootloader({required Duration timeout}); + Future> optimizeBootloaderConnection(); + Future> negotiateMtu({required int requestedMtu}); Stream> subscribeToStatus(); @@ -832,6 +844,17 @@ class ShifterFirmwareUpdateTransport implements FirmwareUpdateTransport { ); } + @override + Future> optimizeBootloaderConnection() { + final deviceId = _requireBootloaderDeviceId(); + if (deviceId.isErr()) { + return Future.value(Err(deviceId.unwrapErr())); + } + return bluetoothController.requestHighPerformanceConnection( + deviceId.unwrap(), + ); + } + @override Future> negotiateMtu({required int requestedMtu}) { final deviceId = _requireBootloaderDeviceId(); diff --git a/test/service/firmware_update_service_test.dart b/test/service/firmware_update_service_test.dart index e67cd6a..5a49493 100644 --- a/test/service/firmware_update_service_test.dart +++ b/test/service/firmware_update_service_test.dart @@ -28,6 +28,7 @@ void main() { 'enterBootloader', 'waitForAppDisconnect', 'connectToBootloader', + 'optimizeBootloaderConnection', 'negotiateMtu', 'readStatus', 'waitForBootloaderDisconnect', @@ -68,6 +69,7 @@ void main() { expect(result.isOk(), isTrue); expect(transport.steps, [ 'isConnectedToBootloader', + 'optimizeBootloaderConnection', 'negotiateMtu', 'readStatus', 'waitForBootloaderDisconnect', @@ -162,6 +164,12 @@ void main() { transport.steps.where((step) => step == 'connectToBootloader').length, 2, ); + expect( + transport.steps + .where((step) => step == 'optimizeBootloaderConnection') + .length, + 2, + ); expect( transport.controlWrites .where((write) => write.first == universalShifterDfuOpcodeGetStatus) @@ -344,9 +352,16 @@ class _FakeFirmwareUpdateTransport implements FirmwareUpdateTransport { return Ok(null); } + @override + Future> optimizeBootloaderConnection() async { + steps.add('optimizeBootloaderConnection'); + return Ok(null); + } + @override Future> negotiateMtu({required int requestedMtu}) async { steps.add('negotiateMtu'); + expect(requestedMtu, universalShifterDfuPreferredMtu); return Ok(128); }