Compare commits

...

4 Commits

Author SHA1 Message Date
jonasbark
700afb1050 Document local connection method for Rouvy
Added instructions for the local connection method in Rouvy.
2025-12-16 19:56:56 +01:00
Jonas Bark
d943544e56 Merge branch 'main' of github.com:jonasbark/swiftcontrol 2025-12-16 19:53:42 +01:00
Jonas Bark
e994eb01dd less confusing messages 2025-12-16 19:53:25 +01:00
jonasbark
59d953bbc4 Update Windows Store version to 4.1.0 2025-12-16 14:36:30 +01:00
6 changed files with 19 additions and 11 deletions

View File

@@ -0,0 +1,4 @@
## Local Connection method
*
The local connection method (avalable on Android, Windows and macOS) allows BikeControl to directly control Rouvy either using touch or keyboard keys. This way you don't need to select any "Controllers" at all in Rouvy.
Make sure the "Virtual Shifting Controls" are enabled: https://support.rouvy.com/hc/en-us/articles/32452137189393-Virtual-Shifting#h_01K9SWGWYMAVQV108SQ9KWQAKC

View File

@@ -1 +1 @@
4.0.0
4.1.0

View File

@@ -1,12 +1,12 @@
import 'dart:async';
import 'package:dartx/dartx.dart';
import 'package:flutter/material.dart';
import 'package:bike_control/bluetooth/devices/zwift/constants.dart';
import 'package:bike_control/utils/actions/desktop.dart';
import 'package:bike_control/utils/core.dart';
import 'package:bike_control/utils/keymap/apps/custom_app.dart';
import 'package:bike_control/utils/keymap/manager.dart';
import 'package:dartx/dartx.dart';
import 'package:flutter/material.dart';
import '../../utils/keymap/buttons.dart';
import '../messages/notification.dart';
@@ -113,7 +113,7 @@ abstract class BaseDevice {
for (final action in buttonsClicked) {
// For repeated actions, don't trigger key down/up events (useful for long press)
final result = await core.actionHandler.performAction(action, isKeyDown: true, isKeyUp: false);
actionStreamInternal.add(LogNotification(result.message));
actionStreamInternal.add(ActionNotification(result));
}
}
@@ -127,7 +127,7 @@ abstract class BaseDevice {
Future<void> performRelease(List<ControllerButton> buttonsReleased) async {
for (final action in buttonsReleased) {
final result = await core.actionHandler.performAction(action, isKeyDown: false, isKeyUp: true);
actionStreamInternal.add(ActionNotification(result));
actionStreamInternal.add(LogNotification(result.message));
}
}

View File

@@ -1,7 +1,6 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:bike_control/bluetooth/devices/trainer_connection.dart';
import 'package:bike_control/bluetooth/devices/zwift/protocol/zp.pb.dart';
import 'package:bike_control/bluetooth/messages/notification.dart';
@@ -11,6 +10,7 @@ import 'package:bike_control/utils/core.dart';
import 'package:bike_control/utils/keymap/buttons.dart';
import 'package:bike_control/utils/keymap/keymap.dart';
import 'package:bike_control/utils/requirements/multi.dart';
import 'package:flutter/foundation.dart';
class WhooshLink extends TrainerConnection {
Socket? _socket;
@@ -155,7 +155,7 @@ class WhooshLink extends TrainerConnection {
InGameAction.steerRight,
];
if (jsonObject != null && !isKeyDown && !supportsIsKeyUpActions.contains(keyPair.inGameAction)) {
return Success('No Action sent on key down for action: ${keyPair.inGameAction}');
return Ignored('No Action sent on key down for action: ${keyPair.inGameAction}');
} else if (jsonObject != null) {
final jsonString = jsonEncode(jsonObject);
_socket?.writeln(jsonString);

View File

@@ -32,6 +32,10 @@ class NotHandled extends ActionResult {
const NotHandled(super.message);
}
class Ignored extends ActionResult {
const Ignored(super.message);
}
class Error extends ActionResult {
const Error(super.message);
}

View File

@@ -2,9 +2,6 @@ import 'dart:async';
import 'dart:math' as math;
import 'dart:ui';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:bike_control/bluetooth/devices/zwift/protocol/zp.pb.dart';
import 'package:bike_control/utils/actions/base_actions.dart' as actions;
import 'package:bike_control/utils/core.dart';
@@ -13,6 +10,9 @@ import 'package:bike_control/utils/keymap/apps/custom_app.dart';
import 'package:bike_control/utils/keymap/buttons.dart';
import 'package:bike_control/widgets/ui/button_widget.dart';
import 'package:bike_control/widgets/ui/toast.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import '../bluetooth/messages/notification.dart';
@@ -125,7 +125,7 @@ class _TestbedState extends State<Testbed> with SingleTickerProviderStateMixin {
}
}
}
} else if (data is ActionNotification) {
} else if (data is ActionNotification && data.result is! actions.Ignored) {
buildToast(
context,
location: ToastLocation.bottomLeft,