diff --git a/lib/bluetooth/devices/wahoo/wahoo_kickr_headwind.dart b/lib/bluetooth/devices/wahoo/wahoo_kickr_headwind.dart index 594f28f2..27daf18d 100644 --- a/lib/bluetooth/devices/wahoo/wahoo_kickr_headwind.dart +++ b/lib/bluetooth/devices/wahoo/wahoo_kickr_headwind.dart @@ -126,6 +126,27 @@ class WahooKickrHeadwind extends BluetoothDevice { final speed = keyPair.inGameActionValue ?? 0; await setSpeed(speed); return Success('Headwind speed set to $speed%'); + } else if (keyPair.inGameAction == InGameAction.headwindSpeedInc || + keyPair.inGameAction == InGameAction.headwindSpeedDec || + keyPair.inGameAction == InGameAction.headwindSpeedCyclicInc || + keyPair.inGameAction == InGameAction.headwindSpeedCyclicDec) { + final step = 25; + int speed = 0; + switch (keyPair.inGameAction) { + case InGameAction.headwindSpeedInc: + speed = _currentSpeed + step > 100 ? 100 : _currentSpeed + step; + case InGameAction.headwindSpeedDec: + speed = _currentSpeed - step < 0 ? 0 : _currentSpeed - step; + case InGameAction.headwindSpeedCyclicInc: + speed = _currentSpeed + step > 100 ? (_currentSpeed < 100 ? 100 : 0) : _currentSpeed + step; + case InGameAction.headwindSpeedCyclicDec: + speed = _currentSpeed - step < 0 ? (_currentSpeed > 0 ? 0 : 100) : _currentSpeed - step; + default: + return Error('Failed to control Headwind: Unknown action'); + } + await setSpeed(speed); + _currentSpeed = speed; + return Success('Headwind speed set to $speed%'); } else if (keyPair.inGameAction == InGameAction.headwindHeartRateMode) { await setHeartRateMode(); return Success('Headwind set to Heart Rate mode'); diff --git a/lib/pages/button_edit.dart b/lib/pages/button_edit.dart index 7a18a403..1d7b7dae 100644 --- a/lib/pages/button_edit.dart +++ b/lib/pages/button_edit.dart @@ -512,6 +512,10 @@ class _ButtonEditPageState extends State { isActive: _keyPair.inGameAction != null && (_keyPair.inGameAction == InGameAction.headwindSpeed || + _keyPair.inGameAction == InGameAction.headwindSpeedInc || + _keyPair.inGameAction == InGameAction.headwindSpeedDec || + _keyPair.inGameAction == InGameAction.headwindSpeedCyclicInc || + _keyPair.inGameAction == InGameAction.headwindSpeedCyclicDec || _keyPair.inGameAction == InGameAction.headwindHeartRateMode), value: _keyPair.inGameAction != null ? '${_keyPair.inGameAction} ${_keyPair.inGameActionValue ?? ""}'.trim() @@ -540,6 +544,54 @@ class _ButtonEditPageState extends State { .toList(), child: Text('Set Speed'), ), + MenuButton( + child: Text('Increase Speed'), + onPressed: (_) { + _keyPair.inGameAction = InGameAction.headwindSpeedInc; + _keyPair.inGameActionValue = null; + _keyPair.androidAction = null; + _keyPair.command = null; + _keyPair.screenshotPath = null; + widget.onUpdate(); + setState(() {}); + }, + ), + MenuButton( + child: Text('Decrease Speed'), + onPressed: (_) { + _keyPair.inGameAction = InGameAction.headwindSpeedDec; + _keyPair.inGameActionValue = null; + _keyPair.androidAction = null; + _keyPair.command = null; + _keyPair.screenshotPath = null; + widget.onUpdate(); + setState(() {}); + }, + ), + MenuButton( + child: Text('Increase Speed Cyclically'), + onPressed: (_) { + _keyPair.inGameAction = InGameAction.headwindSpeedCyclicInc; + _keyPair.inGameActionValue = null; + _keyPair.androidAction = null; + _keyPair.command = null; + _keyPair.screenshotPath = null; + widget.onUpdate(); + setState(() {}); + }, + ), + MenuButton( + child: Text('Decrease Speed Cyclically'), + onPressed: (_) { + _keyPair.inGameAction = InGameAction.headwindSpeedCyclicDec; + _keyPair.inGameActionValue = null; + _keyPair.androidAction = null; + _keyPair.command = null; + _keyPair.screenshotPath = null; + widget.onUpdate(); + setState(() {}); + }, + ), MenuButton( child: Text('Set to Heart Rate Mode'), onPressed: (_) { diff --git a/lib/utils/actions/base_actions.dart b/lib/utils/actions/base_actions.dart index f137be2c..0e9f8006 100644 --- a/lib/utils/actions/base_actions.dart +++ b/lib/utils/actions/base_actions.dart @@ -146,6 +146,10 @@ abstract class BaseActions { // Handle Headwind actions if (keyPair.inGameAction == InGameAction.headwindSpeed || + keyPair.inGameAction == InGameAction.headwindSpeedInc || + keyPair.inGameAction == InGameAction.headwindSpeedDec || + keyPair.inGameAction == InGameAction.headwindSpeedCyclicInc || + keyPair.inGameAction == InGameAction.headwindSpeedCyclicDec || keyPair.inGameAction == InGameAction.headwindHeartRateMode) { final headwind = core.connection.accessories.where((h) => h.isConnected).firstOrNull; if (headwind == null) { diff --git a/lib/utils/keymap/buttons.dart b/lib/utils/keymap/buttons.dart index 18af0e4f..4f9d6fef 100644 --- a/lib/utils/keymap/buttons.dart +++ b/lib/utils/keymap/buttons.dart @@ -39,6 +39,10 @@ enum InGameAction { // headwind headwindSpeed('Headwind Speed', possibleValues: [0, 25, 50, 75, 100], icon: Icons.air), + headwindSpeedInc('Headwind Speed Increase', icon: Icons.air), + headwindSpeedDec('Headwind Speed Decrease', icon: Icons.air), + headwindSpeedCyclicInc('Headwind Speed Cyclic Increase', icon: Icons.air), + headwindSpeedCyclicDec('Headwind Speed Cyclic Decrease', icon: Icons.air), headwindHeartRateMode('Headwind HR Mode', icon: Icons.favorite), // openbikecontrol