Compare commits

..

2 Commits

Author SHA1 Message Date
Jonas Bark
af4d8ab183 Merge branch 'main' into web 2025-09-30 17:59:18 +02:00
Jonas Bark
c1a24cfbd1 some more experiments 2025-09-30 17:59:12 +02:00
8 changed files with 1330 additions and 10 deletions

View File

@@ -186,7 +186,7 @@ abstract class BaseDevice {
}
Future<void> processCharacteristic(String characteristic, Uint8List bytes) async {
if (kDebugMode) {
if (kDebugMode && false) {
print(
"${DateTime.now().toString().split(" ").last} Received data on $characteristic: ${bytes.map((e) => e.toRadixString(16).padLeft(2, '0')).join(' ')}",
);

View File

@@ -1,9 +1,9 @@
import 'dart:typed_data';
import 'package:swift_control/bluetooth/devices/zwift_ride.dart';
import 'package:swift_control/bluetooth/protocol/zp.pb.dart';
import '../ble.dart';
import '../protocol/zp.pb.dart';
class ZwiftClickV2 extends ZwiftRide {
ZwiftClickV2(super.scanResult);
@@ -21,7 +21,10 @@ class ZwiftClickV2 extends ZwiftRide {
}
Future<void> test() async {
await sendCommand(Opcode.GET, Get(dataObjectId: DO.PAGE_DEV_INFO.value)); // 0008 00
await sendCommand(Opcode.RESET, null);
//await sendCommand(Opcode.GET, Get(dataObjectId: VendorDO.PAGE_DEVICE_PAIRING.value)); // 0008 82E0 03
/*await sendCommand(Opcode.GET, Get(dataObjectId: DO.PAGE_DEV_INFO.value)); // 0008 00
await sendCommand(Opcode.LOG_LEVEL_SET, LogLevelSet(logLevel: LogLevel.LOGLEVEL_TRACE)); // 4108 05
await sendCommand(Opcode.GET, Get(dataObjectId: DO.PAGE_CLIENT_SERVER_CONFIGURATION.value)); // 0008 10
@@ -63,6 +66,6 @@ class ZwiftClickV2 extends ZwiftRide {
0xD7,
0xCE,
]),
);
);*/
}
}

View File

@@ -3,6 +3,7 @@ import 'package:flutter/foundation.dart';
import 'package:protobuf/protobuf.dart' as $pb;
import 'package:swift_control/bluetooth/devices/base_device.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';
@@ -70,6 +71,12 @@ class ZwiftRide extends BaseDevice {
message = bytes.sublist(1);
}
if (kDebugMode) {
print(
'${DateTime.now().toString().split(" ").last} Received $opcode: ${bytes.map((e) => e.toRadixString(16).padLeft(2, '0')).join(' ')} => ${String.fromCharCodes(bytes)} ',
);
}
if (bytes.startsWith(Constants.RESPONSE_STOPPED_CLICK_V2)) {
actionStreamInternal.add(
LogNotification('Your Zwift Click V2 no longer sends events. Connect it in the Zwift app once per day.'),
@@ -91,7 +98,9 @@ class ZwiftRide extends BaseDevice {
final response = GetResponse.fromBuffer(message);
final dataObjectType = DO.valueOf(response.dataObjectId);
if (kDebugMode) {
print('GetResponse: ${dataObjectType?.value.toRadixString(16).padLeft(4, '0')} $dataObjectType');
print(
'GetResponse: ${dataObjectType?.value.toRadixString(16).padLeft(4, '0') ?? response.dataObjectId} $dataObjectType',
);
}
switch (dataObjectType) {
@@ -113,11 +122,42 @@ class ZwiftRide extends BaseDevice {
print('PageDateTime: $pageDateTime');
}
break;
case null:
final vendorDO = VendorDO.valueOf(response.dataObjectId);
if (kDebugMode) {
print('VendorDO: $vendorDO');
}
switch (vendorDO) {
case VendorDO.DEVICE_COUNT:
// TODO: Handle this case.
break;
case VendorDO.NO_CLUE:
// TODO: Handle this case.
break;
case VendorDO.PAGE_DEVICE_PAIRING:
final page = DevicePairingDataPage.fromBuffer(response.dataObjectData);
if (kDebugMode) {
// this should show the right click device
// pairingStatus = 1 => connected and paired, otherwise it can be paired but not connected
print(
'PageDevicePairing: $page => ${page.pairingDevList.map((e) => e.device.reversed.map((d) => d.toRadixString(16).padLeft(2, '0'))).join(', ')}',
);
}
break;
case VendorDO.PAIRED_DEVICE:
// TODO: Handle this case.
break;
case VendorDO.PAIRING_STATUS:
break;
}
break;
default:
break;
}
break;
case Opcode.VENDOR_MESSAGE:
final vendorOpCode = VendorOpcode.valueOf(message.second);
print('VendorOpcode: $vendorOpCode');
break;
case Opcode.LOG_DATA:
final logMessage = LogDataNotification.fromBuffer(message);
@@ -167,8 +207,8 @@ class ZwiftRide extends BaseDevice {
}
}
Future<void> sendCommand(Opcode opCode, $pb.GeneratedMessage message) async {
final buffer = Uint8List.fromList([opCode.value, ...message.writeToBuffer()]);
Future<void> sendCommand(Opcode opCode, $pb.GeneratedMessage? message) async {
final buffer = Uint8List.fromList([opCode.value, ...message?.writeToBuffer() ?? []]);
if (kDebugMode) {
print("Sending $opCode: ${buffer.map((e) => e.toRadixString(16).padLeft(2, '0')).join(' ')}");
}

View File

@@ -0,0 +1,896 @@
//
// Generated code. Do not modify.
// source: zp_vendor.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
import 'zp_vendor.pbenum.dart';
export 'zp_vendor.pbenum.dart';
class ControllerSync extends $pb.GeneratedMessage {
factory ControllerSync({
ControllerSyncStatus? status,
$core.int? timeStamp,
}) {
final $result = create();
if (status != null) {
$result.status = status;
}
if (timeStamp != null) {
$result.timeStamp = timeStamp;
}
return $result;
}
ControllerSync._() : super();
factory ControllerSync.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory ControllerSync.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ControllerSync', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..e<ControllerSyncStatus>(1, _omitFieldNames ? '' : 'status', $pb.PbFieldType.OE, defaultOrMaker: ControllerSyncStatus.NOT_CONNECTED, valueOf: ControllerSyncStatus.valueOf, enumValues: ControllerSyncStatus.values)
..a<$core.int>(2, _omitFieldNames ? '' : 'timeStamp', $pb.PbFieldType.O3, protoName: 'timeStamp')
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
ControllerSync clone() => ControllerSync()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
ControllerSync copyWith(void Function(ControllerSync) updates) => super.copyWith((message) => updates(message as ControllerSync)) as ControllerSync;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ControllerSync create() => ControllerSync._();
ControllerSync createEmptyInstance() => create();
static $pb.PbList<ControllerSync> createRepeated() => $pb.PbList<ControllerSync>();
@$core.pragma('dart2js:noInline')
static ControllerSync getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ControllerSync>(create);
static ControllerSync? _defaultInstance;
/// optional in code; proto3 treats as present when non-zero
@$pb.TagNumber(1)
ControllerSyncStatus get status => $_getN(0);
@$pb.TagNumber(1)
set status(ControllerSyncStatus v) { setField(1, v); }
@$pb.TagNumber(1)
$core.bool hasStatus() => $_has(0);
@$pb.TagNumber(1)
void clearStatus() => clearField(1);
@$pb.TagNumber(2)
$core.int get timeStamp => $_getIZ(1);
@$pb.TagNumber(2)
set timeStamp($core.int v) { $_setSignedInt32(1, v); }
@$pb.TagNumber(2)
$core.bool hasTimeStamp() => $_has(1);
@$pb.TagNumber(2)
void clearTimeStamp() => clearField(2);
}
class EnableTestMode extends $pb.GeneratedMessage {
factory EnableTestMode({
$core.bool? enable,
}) {
final $result = create();
if (enable != null) {
$result.enable = enable;
}
return $result;
}
EnableTestMode._() : super();
factory EnableTestMode.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory EnableTestMode.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'EnableTestMode', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..aOB(1, _omitFieldNames ? '' : 'enable')
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
EnableTestMode clone() => EnableTestMode()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
EnableTestMode copyWith(void Function(EnableTestMode) updates) => super.copyWith((message) => updates(message as EnableTestMode)) as EnableTestMode;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static EnableTestMode create() => EnableTestMode._();
EnableTestMode createEmptyInstance() => create();
static $pb.PbList<EnableTestMode> createRepeated() => $pb.PbList<EnableTestMode>();
@$core.pragma('dart2js:noInline')
static EnableTestMode getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<EnableTestMode>(create);
static EnableTestMode? _defaultInstance;
@$pb.TagNumber(1)
$core.bool get enable => $_getBF(0);
@$pb.TagNumber(1)
set enable($core.bool v) { $_setBool(0, v); }
@$pb.TagNumber(1)
$core.bool hasEnable() => $_has(0);
@$pb.TagNumber(1)
void clearEnable() => clearField(1);
}
class PairDevices extends $pb.GeneratedMessage {
factory PairDevices({
$core.bool? pair,
PairDeviceType? type,
$core.List<$core.int>? deviceId,
}) {
final $result = create();
if (pair != null) {
$result.pair = pair;
}
if (type != null) {
$result.type = type;
}
if (deviceId != null) {
$result.deviceId = deviceId;
}
return $result;
}
PairDevices._() : super();
factory PairDevices.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory PairDevices.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PairDevices', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..aOB(1, _omitFieldNames ? '' : 'pair')
..e<PairDeviceType>(2, _omitFieldNames ? '' : 'type', $pb.PbFieldType.OE, defaultOrMaker: PairDeviceType.BLE, valueOf: PairDeviceType.valueOf, enumValues: PairDeviceType.values)
..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'deviceId', $pb.PbFieldType.OY, protoName: 'deviceId')
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
PairDevices clone() => PairDevices()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
PairDevices copyWith(void Function(PairDevices) updates) => super.copyWith((message) => updates(message as PairDevices)) as PairDevices;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static PairDevices create() => PairDevices._();
PairDevices createEmptyInstance() => create();
static $pb.PbList<PairDevices> createRepeated() => $pb.PbList<PairDevices>();
@$core.pragma('dart2js:noInline')
static PairDevices getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PairDevices>(create);
static PairDevices? _defaultInstance;
@$pb.TagNumber(1)
$core.bool get pair => $_getBF(0);
@$pb.TagNumber(1)
set pair($core.bool v) { $_setBool(0, v); }
@$pb.TagNumber(1)
$core.bool hasPair() => $_has(0);
@$pb.TagNumber(1)
void clearPair() => clearField(1);
@$pb.TagNumber(2)
PairDeviceType get type => $_getN(1);
@$pb.TagNumber(2)
set type(PairDeviceType v) { setField(2, v); }
@$pb.TagNumber(2)
$core.bool hasType() => $_has(1);
@$pb.TagNumber(2)
void clearType() => clearField(2);
@$pb.TagNumber(3)
$core.List<$core.int> get deviceId => $_getN(2);
@$pb.TagNumber(3)
set deviceId($core.List<$core.int> v) { $_setBytes(2, v); }
@$pb.TagNumber(3)
$core.bool hasDeviceId() => $_has(2);
@$pb.TagNumber(3)
void clearDeviceId() => clearField(3);
}
class DevicePairingDataPage_PairedDevice extends $pb.GeneratedMessage {
factory DevicePairingDataPage_PairedDevice({
$core.List<$core.int>? device,
}) {
final $result = create();
if (device != null) {
$result.device = device;
}
return $result;
}
DevicePairingDataPage_PairedDevice._() : super();
factory DevicePairingDataPage_PairedDevice.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory DevicePairingDataPage_PairedDevice.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'DevicePairingDataPage.PairedDevice', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'device', $pb.PbFieldType.OY)
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
DevicePairingDataPage_PairedDevice clone() => DevicePairingDataPage_PairedDevice()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
DevicePairingDataPage_PairedDevice copyWith(void Function(DevicePairingDataPage_PairedDevice) updates) => super.copyWith((message) => updates(message as DevicePairingDataPage_PairedDevice)) as DevicePairingDataPage_PairedDevice;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static DevicePairingDataPage_PairedDevice create() => DevicePairingDataPage_PairedDevice._();
DevicePairingDataPage_PairedDevice createEmptyInstance() => create();
static $pb.PbList<DevicePairingDataPage_PairedDevice> createRepeated() => $pb.PbList<DevicePairingDataPage_PairedDevice>();
@$core.pragma('dart2js:noInline')
static DevicePairingDataPage_PairedDevice getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DevicePairingDataPage_PairedDevice>(create);
static DevicePairingDataPage_PairedDevice? _defaultInstance;
@$pb.TagNumber(1)
$core.List<$core.int> get device => $_getN(0);
@$pb.TagNumber(1)
set device($core.List<$core.int> v) { $_setBytes(0, v); }
@$pb.TagNumber(1)
$core.bool hasDevice() => $_has(0);
@$pb.TagNumber(1)
void clearDevice() => clearField(1);
}
class DevicePairingDataPage extends $pb.GeneratedMessage {
factory DevicePairingDataPage({
$core.int? devicesCount,
$core.int? pairingStatus,
$core.Iterable<DevicePairingDataPage_PairedDevice>? pairingDevList,
}) {
final $result = create();
if (devicesCount != null) {
$result.devicesCount = devicesCount;
}
if (pairingStatus != null) {
$result.pairingStatus = pairingStatus;
}
if (pairingDevList != null) {
$result.pairingDevList.addAll(pairingDevList);
}
return $result;
}
DevicePairingDataPage._() : super();
factory DevicePairingDataPage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory DevicePairingDataPage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'DevicePairingDataPage', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..a<$core.int>(1, _omitFieldNames ? '' : 'devicesCount', $pb.PbFieldType.O3, protoName: 'devicesCount')
..a<$core.int>(2, _omitFieldNames ? '' : 'pairingStatus', $pb.PbFieldType.O3, protoName: 'pairingStatus')
..pc<DevicePairingDataPage_PairedDevice>(3, _omitFieldNames ? '' : 'pairingDevList', $pb.PbFieldType.PM, protoName: 'pairingDevList', subBuilder: DevicePairingDataPage_PairedDevice.create)
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
DevicePairingDataPage clone() => DevicePairingDataPage()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
DevicePairingDataPage copyWith(void Function(DevicePairingDataPage) updates) => super.copyWith((message) => updates(message as DevicePairingDataPage)) as DevicePairingDataPage;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static DevicePairingDataPage create() => DevicePairingDataPage._();
DevicePairingDataPage createEmptyInstance() => create();
static $pb.PbList<DevicePairingDataPage> createRepeated() => $pb.PbList<DevicePairingDataPage>();
@$core.pragma('dart2js:noInline')
static DevicePairingDataPage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DevicePairingDataPage>(create);
static DevicePairingDataPage? _defaultInstance;
@$pb.TagNumber(1)
$core.int get devicesCount => $_getIZ(0);
@$pb.TagNumber(1)
set devicesCount($core.int v) { $_setSignedInt32(0, v); }
@$pb.TagNumber(1)
$core.bool hasDevicesCount() => $_has(0);
@$pb.TagNumber(1)
void clearDevicesCount() => clearField(1);
@$pb.TagNumber(2)
$core.int get pairingStatus => $_getIZ(1);
@$pb.TagNumber(2)
set pairingStatus($core.int v) { $_setSignedInt32(1, v); }
@$pb.TagNumber(2)
$core.bool hasPairingStatus() => $_has(1);
@$pb.TagNumber(2)
void clearPairingStatus() => clearField(2);
@$pb.TagNumber(3)
$core.List<DevicePairingDataPage_PairedDevice> get pairingDevList => $_getList(2);
}
enum SetDfuTest_TestCase {
failedEnterDfu,
failedStartAdvertising,
crcFailure,
notSet
}
class SetDfuTest extends $pb.GeneratedMessage {
factory SetDfuTest({
$core.bool? failedEnterDfu,
$core.bool? failedStartAdvertising,
$core.int? crcFailure,
}) {
final $result = create();
if (failedEnterDfu != null) {
$result.failedEnterDfu = failedEnterDfu;
}
if (failedStartAdvertising != null) {
$result.failedStartAdvertising = failedStartAdvertising;
}
if (crcFailure != null) {
$result.crcFailure = crcFailure;
}
return $result;
}
SetDfuTest._() : super();
factory SetDfuTest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory SetDfuTest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static const $core.Map<$core.int, SetDfuTest_TestCase> _SetDfuTest_TestCaseByTag = {
1 : SetDfuTest_TestCase.failedEnterDfu,
2 : SetDfuTest_TestCase.failedStartAdvertising,
3 : SetDfuTest_TestCase.crcFailure,
0 : SetDfuTest_TestCase.notSet
};
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'SetDfuTest', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..oo(0, [1, 2, 3])
..aOB(1, _omitFieldNames ? '' : 'failedEnterDfu', protoName: 'failedEnterDfu')
..aOB(2, _omitFieldNames ? '' : 'failedStartAdvertising', protoName: 'failedStartAdvertising')
..a<$core.int>(3, _omitFieldNames ? '' : 'crcFailure', $pb.PbFieldType.O3, protoName: 'crcFailure')
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
SetDfuTest clone() => SetDfuTest()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
SetDfuTest copyWith(void Function(SetDfuTest) updates) => super.copyWith((message) => updates(message as SetDfuTest)) as SetDfuTest;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static SetDfuTest create() => SetDfuTest._();
SetDfuTest createEmptyInstance() => create();
static $pb.PbList<SetDfuTest> createRepeated() => $pb.PbList<SetDfuTest>();
@$core.pragma('dart2js:noInline')
static SetDfuTest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SetDfuTest>(create);
static SetDfuTest? _defaultInstance;
SetDfuTest_TestCase whichTestCase() => _SetDfuTest_TestCaseByTag[$_whichOneof(0)]!;
void clearTestCase() => clearField($_whichOneof(0));
@$pb.TagNumber(1)
$core.bool get failedEnterDfu => $_getBF(0);
@$pb.TagNumber(1)
set failedEnterDfu($core.bool v) { $_setBool(0, v); }
@$pb.TagNumber(1)
$core.bool hasFailedEnterDfu() => $_has(0);
@$pb.TagNumber(1)
void clearFailedEnterDfu() => clearField(1);
@$pb.TagNumber(2)
$core.bool get failedStartAdvertising => $_getBF(1);
@$pb.TagNumber(2)
set failedStartAdvertising($core.bool v) { $_setBool(1, v); }
@$pb.TagNumber(2)
$core.bool hasFailedStartAdvertising() => $_has(1);
@$pb.TagNumber(2)
void clearFailedStartAdvertising() => clearField(2);
@$pb.TagNumber(3)
$core.int get crcFailure => $_getIZ(2);
@$pb.TagNumber(3)
set crcFailure($core.int v) { $_setSignedInt32(2, v); }
@$pb.TagNumber(3)
$core.bool hasCrcFailure() => $_has(2);
@$pb.TagNumber(3)
void clearCrcFailure() => clearField(3);
}
class SetGearTestData extends $pb.GeneratedMessage {
factory SetGearTestData({
$core.int? frontGearIdx,
$core.int? rearGearIdx,
}) {
final $result = create();
if (frontGearIdx != null) {
$result.frontGearIdx = frontGearIdx;
}
if (rearGearIdx != null) {
$result.rearGearIdx = rearGearIdx;
}
return $result;
}
SetGearTestData._() : super();
factory SetGearTestData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory SetGearTestData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'SetGearTestData', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..a<$core.int>(1, _omitFieldNames ? '' : 'frontGearIdx', $pb.PbFieldType.O3, protoName: 'frontGearIdx')
..a<$core.int>(2, _omitFieldNames ? '' : 'rearGearIdx', $pb.PbFieldType.O3, protoName: 'rearGearIdx')
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
SetGearTestData clone() => SetGearTestData()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
SetGearTestData copyWith(void Function(SetGearTestData) updates) => super.copyWith((message) => updates(message as SetGearTestData)) as SetGearTestData;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static SetGearTestData create() => SetGearTestData._();
SetGearTestData createEmptyInstance() => create();
static $pb.PbList<SetGearTestData> createRepeated() => $pb.PbList<SetGearTestData>();
@$core.pragma('dart2js:noInline')
static SetGearTestData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SetGearTestData>(create);
static SetGearTestData? _defaultInstance;
@$pb.TagNumber(1)
$core.int get frontGearIdx => $_getIZ(0);
@$pb.TagNumber(1)
set frontGearIdx($core.int v) { $_setSignedInt32(0, v); }
@$pb.TagNumber(1)
$core.bool hasFrontGearIdx() => $_has(0);
@$pb.TagNumber(1)
void clearFrontGearIdx() => clearField(1);
@$pb.TagNumber(2)
$core.int get rearGearIdx => $_getIZ(1);
@$pb.TagNumber(2)
set rearGearIdx($core.int v) { $_setSignedInt32(1, v); }
@$pb.TagNumber(2)
$core.bool hasRearGearIdx() => $_has(1);
@$pb.TagNumber(2)
void clearRearGearIdx() => clearField(2);
}
class SetHrmTestData extends $pb.GeneratedMessage {
factory SetHrmTestData({
$core.bool? hrmPresent,
$core.int? heartRate,
}) {
final $result = create();
if (hrmPresent != null) {
$result.hrmPresent = hrmPresent;
}
if (heartRate != null) {
$result.heartRate = heartRate;
}
return $result;
}
SetHrmTestData._() : super();
factory SetHrmTestData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory SetHrmTestData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'SetHrmTestData', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..aOB(1, _omitFieldNames ? '' : 'hrmPresent', protoName: 'hrmPresent')
..a<$core.int>(2, _omitFieldNames ? '' : 'heartRate', $pb.PbFieldType.O3, protoName: 'heartRate')
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
SetHrmTestData clone() => SetHrmTestData()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
SetHrmTestData copyWith(void Function(SetHrmTestData) updates) => super.copyWith((message) => updates(message as SetHrmTestData)) as SetHrmTestData;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static SetHrmTestData create() => SetHrmTestData._();
SetHrmTestData createEmptyInstance() => create();
static $pb.PbList<SetHrmTestData> createRepeated() => $pb.PbList<SetHrmTestData>();
@$core.pragma('dart2js:noInline')
static SetHrmTestData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SetHrmTestData>(create);
static SetHrmTestData? _defaultInstance;
@$pb.TagNumber(1)
$core.bool get hrmPresent => $_getBF(0);
@$pb.TagNumber(1)
set hrmPresent($core.bool v) { $_setBool(0, v); }
@$pb.TagNumber(1)
$core.bool hasHrmPresent() => $_has(0);
@$pb.TagNumber(1)
void clearHrmPresent() => clearField(1);
@$pb.TagNumber(2)
$core.int get heartRate => $_getIZ(1);
@$pb.TagNumber(2)
set heartRate($core.int v) { $_setSignedInt32(1, v); }
@$pb.TagNumber(2)
$core.bool hasHeartRate() => $_has(1);
@$pb.TagNumber(2)
void clearHeartRate() => clearField(2);
}
class SetInputDeviceTestData_ControllerAnalogEvent extends $pb.GeneratedMessage {
factory SetInputDeviceTestData_ControllerAnalogEvent({
$core.int? sensorId,
$core.int? value,
}) {
final $result = create();
if (sensorId != null) {
$result.sensorId = sensorId;
}
if (value != null) {
$result.value = value;
}
return $result;
}
SetInputDeviceTestData_ControllerAnalogEvent._() : super();
factory SetInputDeviceTestData_ControllerAnalogEvent.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory SetInputDeviceTestData_ControllerAnalogEvent.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'SetInputDeviceTestData.ControllerAnalogEvent', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..a<$core.int>(1, _omitFieldNames ? '' : 'sensorId', $pb.PbFieldType.O3, protoName: 'sensorId')
..a<$core.int>(2, _omitFieldNames ? '' : 'value', $pb.PbFieldType.O3)
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
SetInputDeviceTestData_ControllerAnalogEvent clone() => SetInputDeviceTestData_ControllerAnalogEvent()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
SetInputDeviceTestData_ControllerAnalogEvent copyWith(void Function(SetInputDeviceTestData_ControllerAnalogEvent) updates) => super.copyWith((message) => updates(message as SetInputDeviceTestData_ControllerAnalogEvent)) as SetInputDeviceTestData_ControllerAnalogEvent;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static SetInputDeviceTestData_ControllerAnalogEvent create() => SetInputDeviceTestData_ControllerAnalogEvent._();
SetInputDeviceTestData_ControllerAnalogEvent createEmptyInstance() => create();
static $pb.PbList<SetInputDeviceTestData_ControllerAnalogEvent> createRepeated() => $pb.PbList<SetInputDeviceTestData_ControllerAnalogEvent>();
@$core.pragma('dart2js:noInline')
static SetInputDeviceTestData_ControllerAnalogEvent getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SetInputDeviceTestData_ControllerAnalogEvent>(create);
static SetInputDeviceTestData_ControllerAnalogEvent? _defaultInstance;
@$pb.TagNumber(1)
$core.int get sensorId => $_getIZ(0);
@$pb.TagNumber(1)
set sensorId($core.int v) { $_setSignedInt32(0, v); }
@$pb.TagNumber(1)
$core.bool hasSensorId() => $_has(0);
@$pb.TagNumber(1)
void clearSensorId() => clearField(1);
@$pb.TagNumber(2)
$core.int get value => $_getIZ(1);
@$pb.TagNumber(2)
set value($core.int v) { $_setSignedInt32(1, v); }
@$pb.TagNumber(2)
$core.bool hasValue() => $_has(1);
@$pb.TagNumber(2)
void clearValue() => clearField(2);
}
class SetInputDeviceTestData extends $pb.GeneratedMessage {
factory SetInputDeviceTestData({
$core.int? duration,
$core.int? buttonEvent,
$core.Iterable<SetInputDeviceTestData_ControllerAnalogEvent>? analogEventList,
}) {
final $result = create();
if (duration != null) {
$result.duration = duration;
}
if (buttonEvent != null) {
$result.buttonEvent = buttonEvent;
}
if (analogEventList != null) {
$result.analogEventList.addAll(analogEventList);
}
return $result;
}
SetInputDeviceTestData._() : super();
factory SetInputDeviceTestData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory SetInputDeviceTestData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'SetInputDeviceTestData', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..a<$core.int>(1, _omitFieldNames ? '' : 'duration', $pb.PbFieldType.O3)
..a<$core.int>(2, _omitFieldNames ? '' : 'buttonEvent', $pb.PbFieldType.O3, protoName: 'buttonEvent')
..pc<SetInputDeviceTestData_ControllerAnalogEvent>(3, _omitFieldNames ? '' : 'analogEventList', $pb.PbFieldType.PM, protoName: 'analogEventList', subBuilder: SetInputDeviceTestData_ControllerAnalogEvent.create)
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
SetInputDeviceTestData clone() => SetInputDeviceTestData()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
SetInputDeviceTestData copyWith(void Function(SetInputDeviceTestData) updates) => super.copyWith((message) => updates(message as SetInputDeviceTestData)) as SetInputDeviceTestData;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static SetInputDeviceTestData create() => SetInputDeviceTestData._();
SetInputDeviceTestData createEmptyInstance() => create();
static $pb.PbList<SetInputDeviceTestData> createRepeated() => $pb.PbList<SetInputDeviceTestData>();
@$core.pragma('dart2js:noInline')
static SetInputDeviceTestData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SetInputDeviceTestData>(create);
static SetInputDeviceTestData? _defaultInstance;
@$pb.TagNumber(1)
$core.int get duration => $_getIZ(0);
@$pb.TagNumber(1)
set duration($core.int v) { $_setSignedInt32(0, v); }
@$pb.TagNumber(1)
$core.bool hasDuration() => $_has(0);
@$pb.TagNumber(1)
void clearDuration() => clearField(1);
@$pb.TagNumber(2)
$core.int get buttonEvent => $_getIZ(1);
@$pb.TagNumber(2)
set buttonEvent($core.int v) { $_setSignedInt32(1, v); }
@$pb.TagNumber(2)
$core.bool hasButtonEvent() => $_has(1);
@$pb.TagNumber(2)
void clearButtonEvent() => clearField(2);
@$pb.TagNumber(3)
$core.List<SetInputDeviceTestData_ControllerAnalogEvent> get analogEventList => $_getList(2);
}
class SetTrainerTestData extends $pb.GeneratedMessage {
factory SetTrainerTestData({
$core.int? dataMode,
$core.int? interfaces,
TestTrainerData? testTrainerData,
}) {
final $result = create();
if (dataMode != null) {
$result.dataMode = dataMode;
}
if (interfaces != null) {
$result.interfaces = interfaces;
}
if (testTrainerData != null) {
$result.testTrainerData = testTrainerData;
}
return $result;
}
SetTrainerTestData._() : super();
factory SetTrainerTestData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory SetTrainerTestData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'SetTrainerTestData', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..a<$core.int>(1, _omitFieldNames ? '' : 'dataMode', $pb.PbFieldType.O3, protoName: 'dataMode')
..a<$core.int>(2, _omitFieldNames ? '' : 'interfaces', $pb.PbFieldType.O3)
..aOM<TestTrainerData>(3, _omitFieldNames ? '' : 'testTrainerData', protoName: 'testTrainerData', subBuilder: TestTrainerData.create)
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
SetTrainerTestData clone() => SetTrainerTestData()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
SetTrainerTestData copyWith(void Function(SetTrainerTestData) updates) => super.copyWith((message) => updates(message as SetTrainerTestData)) as SetTrainerTestData;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static SetTrainerTestData create() => SetTrainerTestData._();
SetTrainerTestData createEmptyInstance() => create();
static $pb.PbList<SetTrainerTestData> createRepeated() => $pb.PbList<SetTrainerTestData>();
@$core.pragma('dart2js:noInline')
static SetTrainerTestData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SetTrainerTestData>(create);
static SetTrainerTestData? _defaultInstance;
@$pb.TagNumber(1)
$core.int get dataMode => $_getIZ(0);
@$pb.TagNumber(1)
set dataMode($core.int v) { $_setSignedInt32(0, v); }
@$pb.TagNumber(1)
$core.bool hasDataMode() => $_has(0);
@$pb.TagNumber(1)
void clearDataMode() => clearField(1);
@$pb.TagNumber(2)
$core.int get interfaces => $_getIZ(1);
@$pb.TagNumber(2)
set interfaces($core.int v) { $_setSignedInt32(1, v); }
@$pb.TagNumber(2)
$core.bool hasInterfaces() => $_has(1);
@$pb.TagNumber(2)
void clearInterfaces() => clearField(2);
@$pb.TagNumber(3)
TestTrainerData get testTrainerData => $_getN(2);
@$pb.TagNumber(3)
set testTrainerData(TestTrainerData v) { setField(3, v); }
@$pb.TagNumber(3)
$core.bool hasTestTrainerData() => $_has(2);
@$pb.TagNumber(3)
void clearTestTrainerData() => clearField(3);
@$pb.TagNumber(3)
TestTrainerData ensureTestTrainerData() => $_ensure(2);
}
class TestTrainerData extends $pb.GeneratedMessage {
factory TestTrainerData({
$core.int? power,
$core.int? cadence,
$core.int? bikeSpeed,
$core.int? averagedPower,
$core.int? wheelSpeed,
$core.int? calculatedRealGearRatio,
}) {
final $result = create();
if (power != null) {
$result.power = power;
}
if (cadence != null) {
$result.cadence = cadence;
}
if (bikeSpeed != null) {
$result.bikeSpeed = bikeSpeed;
}
if (averagedPower != null) {
$result.averagedPower = averagedPower;
}
if (wheelSpeed != null) {
$result.wheelSpeed = wheelSpeed;
}
if (calculatedRealGearRatio != null) {
$result.calculatedRealGearRatio = calculatedRealGearRatio;
}
return $result;
}
TestTrainerData._() : super();
factory TestTrainerData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory TestTrainerData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TestTrainerData', package: const $pb.PackageName(_omitMessageNames ? '' : 'com.zwift.protobuf'), createEmptyInstance: create)
..a<$core.int>(1, _omitFieldNames ? '' : 'power', $pb.PbFieldType.O3)
..a<$core.int>(2, _omitFieldNames ? '' : 'cadence', $pb.PbFieldType.O3)
..a<$core.int>(3, _omitFieldNames ? '' : 'bikeSpeed', $pb.PbFieldType.O3, protoName: 'bikeSpeed')
..a<$core.int>(4, _omitFieldNames ? '' : 'averagedPower', $pb.PbFieldType.O3, protoName: 'averagedPower')
..a<$core.int>(5, _omitFieldNames ? '' : 'wheelSpeed', $pb.PbFieldType.O3, protoName: 'wheelSpeed')
..a<$core.int>(6, _omitFieldNames ? '' : 'calculatedRealGearRatio', $pb.PbFieldType.O3, protoName: 'calculatedRealGearRatio')
..hasRequiredFields = false
;
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
TestTrainerData clone() => TestTrainerData()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
TestTrainerData copyWith(void Function(TestTrainerData) updates) => super.copyWith((message) => updates(message as TestTrainerData)) as TestTrainerData;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static TestTrainerData create() => TestTrainerData._();
TestTrainerData createEmptyInstance() => create();
static $pb.PbList<TestTrainerData> createRepeated() => $pb.PbList<TestTrainerData>();
@$core.pragma('dart2js:noInline')
static TestTrainerData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TestTrainerData>(create);
static TestTrainerData? _defaultInstance;
@$pb.TagNumber(1)
$core.int get power => $_getIZ(0);
@$pb.TagNumber(1)
set power($core.int v) { $_setSignedInt32(0, v); }
@$pb.TagNumber(1)
$core.bool hasPower() => $_has(0);
@$pb.TagNumber(1)
void clearPower() => clearField(1);
@$pb.TagNumber(2)
$core.int get cadence => $_getIZ(1);
@$pb.TagNumber(2)
set cadence($core.int v) { $_setSignedInt32(1, v); }
@$pb.TagNumber(2)
$core.bool hasCadence() => $_has(1);
@$pb.TagNumber(2)
void clearCadence() => clearField(2);
@$pb.TagNumber(3)
$core.int get bikeSpeed => $_getIZ(2);
@$pb.TagNumber(3)
set bikeSpeed($core.int v) { $_setSignedInt32(2, v); }
@$pb.TagNumber(3)
$core.bool hasBikeSpeed() => $_has(2);
@$pb.TagNumber(3)
void clearBikeSpeed() => clearField(3);
@$pb.TagNumber(4)
$core.int get averagedPower => $_getIZ(3);
@$pb.TagNumber(4)
set averagedPower($core.int v) { $_setSignedInt32(3, v); }
@$pb.TagNumber(4)
$core.bool hasAveragedPower() => $_has(3);
@$pb.TagNumber(4)
void clearAveragedPower() => clearField(4);
@$pb.TagNumber(5)
$core.int get wheelSpeed => $_getIZ(4);
@$pb.TagNumber(5)
set wheelSpeed($core.int v) { $_setSignedInt32(4, v); }
@$pb.TagNumber(5)
$core.bool hasWheelSpeed() => $_has(4);
@$pb.TagNumber(5)
void clearWheelSpeed() => clearField(5);
@$pb.TagNumber(6)
$core.int get calculatedRealGearRatio => $_getIZ(5);
@$pb.TagNumber(6)
set calculatedRealGearRatio($core.int v) { $_setSignedInt32(5, v); }
@$pb.TagNumber(6)
$core.bool hasCalculatedRealGearRatio() => $_has(5);
@$pb.TagNumber(6)
void clearCalculatedRealGearRatio() => clearField(6);
}
const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');

View File

@@ -0,0 +1,101 @@
//
// Generated code. Do not modify.
// source: zp_vendor.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class VendorOpcode extends $pb.ProtobufEnum {
static const VendorOpcode UNDEFINED = VendorOpcode._(0, _omitEnumNames ? '' : 'UNDEFINED');
static const VendorOpcode CONTROLLER_SYNC = VendorOpcode._(1, _omitEnumNames ? '' : 'CONTROLLER_SYNC');
static const VendorOpcode PAIR_DEVICES = VendorOpcode._(2, _omitEnumNames ? '' : 'PAIR_DEVICES');
static const VendorOpcode ENABLE_TEST_MODE = VendorOpcode._(65280, _omitEnumNames ? '' : 'ENABLE_TEST_MODE');
static const VendorOpcode SET_DFU_TEST = VendorOpcode._(65281, _omitEnumNames ? '' : 'SET_DFU_TEST');
static const VendorOpcode SET_TRAINER_TEST_DATA = VendorOpcode._(65282, _omitEnumNames ? '' : 'SET_TRAINER_TEST_DATA');
static const VendorOpcode SET_INPUT_DEVICE_TEST_DATA = VendorOpcode._(65283, _omitEnumNames ? '' : 'SET_INPUT_DEVICE_TEST_DATA');
static const VendorOpcode SET_GEAR_TEST_DATA = VendorOpcode._(65284, _omitEnumNames ? '' : 'SET_GEAR_TEST_DATA');
static const VendorOpcode SET_HRM_TEST_DATA = VendorOpcode._(65285, _omitEnumNames ? '' : 'SET_HRM_TEST_DATA');
static const VendorOpcode SET_TEST_DATA = VendorOpcode._(65286, _omitEnumNames ? '' : 'SET_TEST_DATA');
static const $core.List<VendorOpcode> values = <VendorOpcode> [
UNDEFINED,
CONTROLLER_SYNC,
PAIR_DEVICES,
ENABLE_TEST_MODE,
SET_DFU_TEST,
SET_TRAINER_TEST_DATA,
SET_INPUT_DEVICE_TEST_DATA,
SET_GEAR_TEST_DATA,
SET_HRM_TEST_DATA,
SET_TEST_DATA,
];
static final $core.Map<$core.int, VendorOpcode> _byValue = $pb.ProtobufEnum.initByValue(values);
static VendorOpcode? valueOf($core.int value) => _byValue[value];
const VendorOpcode._($core.int v, $core.String n) : super(v, n);
}
class PairDeviceType extends $pb.ProtobufEnum {
static const PairDeviceType BLE = PairDeviceType._(0, _omitEnumNames ? '' : 'BLE');
static const PairDeviceType ANT = PairDeviceType._(1, _omitEnumNames ? '' : 'ANT');
static const $core.List<PairDeviceType> values = <PairDeviceType> [
BLE,
ANT,
];
static final $core.Map<$core.int, PairDeviceType> _byValue = $pb.ProtobufEnum.initByValue(values);
static PairDeviceType? valueOf($core.int value) => _byValue[value];
const PairDeviceType._($core.int v, $core.String n) : super(v, n);
}
/// Status used by ControllerSync
class ControllerSyncStatus extends $pb.ProtobufEnum {
static const ControllerSyncStatus NOT_CONNECTED = ControllerSyncStatus._(0, _omitEnumNames ? '' : 'NOT_CONNECTED');
static const ControllerSyncStatus CONNECTED = ControllerSyncStatus._(1, _omitEnumNames ? '' : 'CONNECTED');
static const $core.List<ControllerSyncStatus> values = <ControllerSyncStatus> [
NOT_CONNECTED,
CONNECTED,
];
static final $core.Map<$core.int, ControllerSyncStatus> _byValue = $pb.ProtobufEnum.initByValue(values);
static ControllerSyncStatus? valueOf($core.int value) => _byValue[value];
const ControllerSyncStatus._($core.int v, $core.String n) : super(v, n);
}
/// Looks like “data object / page” IDs used with pairing pages
class VendorDO extends $pb.ProtobufEnum {
static const VendorDO NO_CLUE = VendorDO._(0, _omitEnumNames ? '' : 'NO_CLUE');
static const VendorDO PAGE_DEVICE_PAIRING = VendorDO._(61440, _omitEnumNames ? '' : 'PAGE_DEVICE_PAIRING');
static const VendorDO DEVICE_COUNT = VendorDO._(61441, _omitEnumNames ? '' : 'DEVICE_COUNT');
static const VendorDO PAIRING_STATUS = VendorDO._(61442, _omitEnumNames ? '' : 'PAIRING_STATUS');
static const VendorDO PAIRED_DEVICE = VendorDO._(61443, _omitEnumNames ? '' : 'PAIRED_DEVICE');
static const $core.List<VendorDO> values = <VendorDO> [
NO_CLUE,
PAGE_DEVICE_PAIRING,
DEVICE_COUNT,
PAIRING_STATUS,
PAIRED_DEVICE,
];
static final $core.Map<$core.int, VendorDO> _byValue = $pb.ProtobufEnum.initByValue(values);
static VendorDO? valueOf($core.int value) => _byValue[value];
const VendorDO._($core.int v, $core.String n) : super(v, n);
}
const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names');

View File

@@ -0,0 +1,267 @@
//
// Generated code. Do not modify.
// source: zp_vendor.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
import 'dart:convert' as $convert;
import 'dart:core' as $core;
import 'dart:typed_data' as $typed_data;
@$core.Deprecated('Use vendorOpcodeDescriptor instead')
const VendorOpcode$json = {
'1': 'VendorOpcode',
'2': [
{'1': 'UNDEFINED', '2': 0},
{'1': 'CONTROLLER_SYNC', '2': 1},
{'1': 'PAIR_DEVICES', '2': 2},
{'1': 'ENABLE_TEST_MODE', '2': 65280},
{'1': 'SET_DFU_TEST', '2': 65281},
{'1': 'SET_TRAINER_TEST_DATA', '2': 65282},
{'1': 'SET_INPUT_DEVICE_TEST_DATA', '2': 65283},
{'1': 'SET_GEAR_TEST_DATA', '2': 65284},
{'1': 'SET_HRM_TEST_DATA', '2': 65285},
{'1': 'SET_TEST_DATA', '2': 65286},
],
};
/// Descriptor for `VendorOpcode`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List vendorOpcodeDescriptor = $convert.base64Decode(
'CgxWZW5kb3JPcGNvZGUSDQoJVU5ERUZJTkVEEAASEwoPQ09OVFJPTExFUl9TWU5DEAESEAoMUE'
'FJUl9ERVZJQ0VTEAISFgoQRU5BQkxFX1RFU1RfTU9ERRCA/gMSEgoMU0VUX0RGVV9URVNUEIH+'
'AxIbChVTRVRfVFJBSU5FUl9URVNUX0RBVEEQgv4DEiAKGlNFVF9JTlBVVF9ERVZJQ0VfVEVTVF'
'9EQVRBEIP+AxIYChJTRVRfR0VBUl9URVNUX0RBVEEQhP4DEhcKEVNFVF9IUk1fVEVTVF9EQVRB'
'EIX+AxITCg1TRVRfVEVTVF9EQVRBEIb+Aw==');
@$core.Deprecated('Use pairDeviceTypeDescriptor instead')
const PairDeviceType$json = {
'1': 'PairDeviceType',
'2': [
{'1': 'BLE', '2': 0},
{'1': 'ANT', '2': 1},
],
};
/// Descriptor for `PairDeviceType`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List pairDeviceTypeDescriptor = $convert.base64Decode(
'Cg5QYWlyRGV2aWNlVHlwZRIHCgNCTEUQABIHCgNBTlQQAQ==');
@$core.Deprecated('Use controllerSyncStatusDescriptor instead')
const ControllerSyncStatus$json = {
'1': 'ControllerSyncStatus',
'2': [
{'1': 'NOT_CONNECTED', '2': 0},
{'1': 'CONNECTED', '2': 1},
],
};
/// Descriptor for `ControllerSyncStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List controllerSyncStatusDescriptor = $convert.base64Decode(
'ChRDb250cm9sbGVyU3luY1N0YXR1cxIRCg1OT1RfQ09OTkVDVEVEEAASDQoJQ09OTkVDVEVEEA'
'E=');
@$core.Deprecated('Use vendorDODescriptor instead')
const VendorDO$json = {
'1': 'VendorDO',
'2': [
{'1': 'NO_CLUE', '2': 0},
{'1': 'PAGE_DEVICE_PAIRING', '2': 61440},
{'1': 'DEVICE_COUNT', '2': 61441},
{'1': 'PAIRING_STATUS', '2': 61442},
{'1': 'PAIRED_DEVICE', '2': 61443},
],
};
/// Descriptor for `VendorDO`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List vendorDODescriptor = $convert.base64Decode(
'CghWZW5kb3JETxILCgdOT19DTFVFEAASGQoTUEFHRV9ERVZJQ0VfUEFJUklORxCA4AMSEgoMRE'
'VWSUNFX0NPVU5UEIHgAxIUCg5QQUlSSU5HX1NUQVRVUxCC4AMSEwoNUEFJUkVEX0RFVklDRRCD'
'4AM=');
@$core.Deprecated('Use controllerSyncDescriptor instead')
const ControllerSync$json = {
'1': 'ControllerSync',
'2': [
{'1': 'status', '3': 1, '4': 1, '5': 14, '6': '.com.zwift.protobuf.ControllerSyncStatus', '10': 'status'},
{'1': 'timeStamp', '3': 2, '4': 1, '5': 5, '10': 'timeStamp'},
],
};
/// Descriptor for `ControllerSync`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List controllerSyncDescriptor = $convert.base64Decode(
'Cg5Db250cm9sbGVyU3luYxJACgZzdGF0dXMYASABKA4yKC5jb20uendpZnQucHJvdG9idWYuQ2'
'9udHJvbGxlclN5bmNTdGF0dXNSBnN0YXR1cxIcCgl0aW1lU3RhbXAYAiABKAVSCXRpbWVTdGFt'
'cA==');
@$core.Deprecated('Use enableTestModeDescriptor instead')
const EnableTestMode$json = {
'1': 'EnableTestMode',
'2': [
{'1': 'enable', '3': 1, '4': 1, '5': 8, '10': 'enable'},
],
};
/// Descriptor for `EnableTestMode`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List enableTestModeDescriptor = $convert.base64Decode(
'Cg5FbmFibGVUZXN0TW9kZRIWCgZlbmFibGUYASABKAhSBmVuYWJsZQ==');
@$core.Deprecated('Use pairDevicesDescriptor instead')
const PairDevices$json = {
'1': 'PairDevices',
'2': [
{'1': 'pair', '3': 1, '4': 1, '5': 8, '10': 'pair'},
{'1': 'type', '3': 2, '4': 1, '5': 14, '6': '.com.zwift.protobuf.PairDeviceType', '10': 'type'},
{'1': 'deviceId', '3': 3, '4': 1, '5': 12, '10': 'deviceId'},
],
};
/// Descriptor for `PairDevices`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List pairDevicesDescriptor = $convert.base64Decode(
'CgtQYWlyRGV2aWNlcxISCgRwYWlyGAEgASgIUgRwYWlyEjYKBHR5cGUYAiABKA4yIi5jb20uen'
'dpZnQucHJvdG9idWYuUGFpckRldmljZVR5cGVSBHR5cGUSGgoIZGV2aWNlSWQYAyABKAxSCGRl'
'dmljZUlk');
@$core.Deprecated('Use devicePairingDataPageDescriptor instead')
const DevicePairingDataPage$json = {
'1': 'DevicePairingDataPage',
'2': [
{'1': 'devicesCount', '3': 1, '4': 1, '5': 5, '10': 'devicesCount'},
{'1': 'pairingStatus', '3': 2, '4': 1, '5': 5, '10': 'pairingStatus'},
{'1': 'pairingDevList', '3': 3, '4': 3, '5': 11, '6': '.com.zwift.protobuf.DevicePairingDataPage.PairedDevice', '10': 'pairingDevList'},
],
'3': [DevicePairingDataPage_PairedDevice$json],
};
@$core.Deprecated('Use devicePairingDataPageDescriptor instead')
const DevicePairingDataPage_PairedDevice$json = {
'1': 'PairedDevice',
'2': [
{'1': 'device', '3': 1, '4': 1, '5': 12, '10': 'device'},
],
};
/// Descriptor for `DevicePairingDataPage`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List devicePairingDataPageDescriptor = $convert.base64Decode(
'ChVEZXZpY2VQYWlyaW5nRGF0YVBhZ2USIgoMZGV2aWNlc0NvdW50GAEgASgFUgxkZXZpY2VzQ2'
'91bnQSJAoNcGFpcmluZ1N0YXR1cxgCIAEoBVINcGFpcmluZ1N0YXR1cxJeCg5wYWlyaW5nRGV2'
'TGlzdBgDIAMoCzI2LmNvbS56d2lmdC5wcm90b2J1Zi5EZXZpY2VQYWlyaW5nRGF0YVBhZ2UuUG'
'FpcmVkRGV2aWNlUg5wYWlyaW5nRGV2TGlzdBomCgxQYWlyZWREZXZpY2USFgoGZGV2aWNlGAEg'
'ASgMUgZkZXZpY2U=');
@$core.Deprecated('Use setDfuTestDescriptor instead')
const SetDfuTest$json = {
'1': 'SetDfuTest',
'2': [
{'1': 'failedEnterDfu', '3': 1, '4': 1, '5': 8, '9': 0, '10': 'failedEnterDfu'},
{'1': 'failedStartAdvertising', '3': 2, '4': 1, '5': 8, '9': 0, '10': 'failedStartAdvertising'},
{'1': 'crcFailure', '3': 3, '4': 1, '5': 5, '9': 0, '10': 'crcFailure'},
],
'8': [
{'1': 'test_case'},
],
};
/// Descriptor for `SetDfuTest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List setDfuTestDescriptor = $convert.base64Decode(
'CgpTZXREZnVUZXN0EigKDmZhaWxlZEVudGVyRGZ1GAEgASgISABSDmZhaWxlZEVudGVyRGZ1Ej'
'gKFmZhaWxlZFN0YXJ0QWR2ZXJ0aXNpbmcYAiABKAhIAFIWZmFpbGVkU3RhcnRBZHZlcnRpc2lu'
'ZxIgCgpjcmNGYWlsdXJlGAMgASgFSABSCmNyY0ZhaWx1cmVCCwoJdGVzdF9jYXNl');
@$core.Deprecated('Use setGearTestDataDescriptor instead')
const SetGearTestData$json = {
'1': 'SetGearTestData',
'2': [
{'1': 'frontGearIdx', '3': 1, '4': 1, '5': 5, '10': 'frontGearIdx'},
{'1': 'rearGearIdx', '3': 2, '4': 1, '5': 5, '10': 'rearGearIdx'},
],
};
/// Descriptor for `SetGearTestData`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List setGearTestDataDescriptor = $convert.base64Decode(
'Cg9TZXRHZWFyVGVzdERhdGESIgoMZnJvbnRHZWFySWR4GAEgASgFUgxmcm9udEdlYXJJZHgSIA'
'oLcmVhckdlYXJJZHgYAiABKAVSC3JlYXJHZWFySWR4');
@$core.Deprecated('Use setHrmTestDataDescriptor instead')
const SetHrmTestData$json = {
'1': 'SetHrmTestData',
'2': [
{'1': 'hrmPresent', '3': 1, '4': 1, '5': 8, '10': 'hrmPresent'},
{'1': 'heartRate', '3': 2, '4': 1, '5': 5, '10': 'heartRate'},
],
};
/// Descriptor for `SetHrmTestData`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List setHrmTestDataDescriptor = $convert.base64Decode(
'Cg5TZXRIcm1UZXN0RGF0YRIeCgpocm1QcmVzZW50GAEgASgIUgpocm1QcmVzZW50EhwKCWhlYX'
'J0UmF0ZRgCIAEoBVIJaGVhcnRSYXRl');
@$core.Deprecated('Use setInputDeviceTestDataDescriptor instead')
const SetInputDeviceTestData$json = {
'1': 'SetInputDeviceTestData',
'2': [
{'1': 'duration', '3': 1, '4': 1, '5': 5, '10': 'duration'},
{'1': 'buttonEvent', '3': 2, '4': 1, '5': 5, '10': 'buttonEvent'},
{'1': 'analogEventList', '3': 3, '4': 3, '5': 11, '6': '.com.zwift.protobuf.SetInputDeviceTestData.ControllerAnalogEvent', '10': 'analogEventList'},
],
'3': [SetInputDeviceTestData_ControllerAnalogEvent$json],
};
@$core.Deprecated('Use setInputDeviceTestDataDescriptor instead')
const SetInputDeviceTestData_ControllerAnalogEvent$json = {
'1': 'ControllerAnalogEvent',
'2': [
{'1': 'sensorId', '3': 1, '4': 1, '5': 5, '10': 'sensorId'},
{'1': 'value', '3': 2, '4': 1, '5': 5, '10': 'value'},
],
};
/// Descriptor for `SetInputDeviceTestData`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List setInputDeviceTestDataDescriptor = $convert.base64Decode(
'ChZTZXRJbnB1dERldmljZVRlc3REYXRhEhoKCGR1cmF0aW9uGAEgASgFUghkdXJhdGlvbhIgCg'
'tidXR0b25FdmVudBgCIAEoBVILYnV0dG9uRXZlbnQSagoPYW5hbG9nRXZlbnRMaXN0GAMgAygL'
'MkAuY29tLnp3aWZ0LnByb3RvYnVmLlNldElucHV0RGV2aWNlVGVzdERhdGEuQ29udHJvbGxlck'
'FuYWxvZ0V2ZW50Ug9hbmFsb2dFdmVudExpc3QaSQoVQ29udHJvbGxlckFuYWxvZ0V2ZW50EhoK'
'CHNlbnNvcklkGAEgASgFUghzZW5zb3JJZBIUCgV2YWx1ZRgCIAEoBVIFdmFsdWU=');
@$core.Deprecated('Use setTrainerTestDataDescriptor instead')
const SetTrainerTestData$json = {
'1': 'SetTrainerTestData',
'2': [
{'1': 'dataMode', '3': 1, '4': 1, '5': 5, '10': 'dataMode'},
{'1': 'interfaces', '3': 2, '4': 1, '5': 5, '10': 'interfaces'},
{'1': 'testTrainerData', '3': 3, '4': 1, '5': 11, '6': '.com.zwift.protobuf.TestTrainerData', '10': 'testTrainerData'},
],
};
/// Descriptor for `SetTrainerTestData`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List setTrainerTestDataDescriptor = $convert.base64Decode(
'ChJTZXRUcmFpbmVyVGVzdERhdGESGgoIZGF0YU1vZGUYASABKAVSCGRhdGFNb2RlEh4KCmludG'
'VyZmFjZXMYAiABKAVSCmludGVyZmFjZXMSTQoPdGVzdFRyYWluZXJEYXRhGAMgASgLMiMuY29t'
'Lnp3aWZ0LnByb3RvYnVmLlRlc3RUcmFpbmVyRGF0YVIPdGVzdFRyYWluZXJEYXRh');
@$core.Deprecated('Use testTrainerDataDescriptor instead')
const TestTrainerData$json = {
'1': 'TestTrainerData',
'2': [
{'1': 'power', '3': 1, '4': 1, '5': 5, '10': 'power'},
{'1': 'cadence', '3': 2, '4': 1, '5': 5, '10': 'cadence'},
{'1': 'bikeSpeed', '3': 3, '4': 1, '5': 5, '10': 'bikeSpeed'},
{'1': 'averagedPower', '3': 4, '4': 1, '5': 5, '10': 'averagedPower'},
{'1': 'wheelSpeed', '3': 5, '4': 1, '5': 5, '10': 'wheelSpeed'},
{'1': 'calculatedRealGearRatio', '3': 6, '4': 1, '5': 5, '10': 'calculatedRealGearRatio'},
],
};
/// Descriptor for `TestTrainerData`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List testTrainerDataDescriptor = $convert.base64Decode(
'Cg9UZXN0VHJhaW5lckRhdGESFAoFcG93ZXIYASABKAVSBXBvd2VyEhgKB2NhZGVuY2UYAiABKA'
'VSB2NhZGVuY2USHAoJYmlrZVNwZWVkGAMgASgFUgliaWtlU3BlZWQSJAoNYXZlcmFnZWRQb3dl'
'chgEIAEoBVINYXZlcmFnZWRQb3dlchIeCgp3aGVlbFNwZWVkGAUgASgFUgp3aGVlbFNwZWVkEj'
'gKF2NhbGN1bGF0ZWRSZWFsR2VhclJhdGlvGAYgASgFUhdjYWxjdWxhdGVkUmVhbEdlYXJSYXRp'
'bw==');

View File

@@ -0,0 +1,14 @@
//
// Generated code. Do not modify.
// source: zp_vendor.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
export 'zp_vendor.pb.dart';

View File

@@ -201,13 +201,12 @@ ${it.firmwareVersion != null ? ' - Firmware Version: ${it.firmwareVersion}' : ''
setState(() {});
},
),
if (kDebugMode &&
connection.devices.any((device) => (device is ZwiftClickV2) && device.isConnected))
if (connection.devices.any((device) => (device is ZwiftClickV2) && device.isConnected))
ElevatedButton(
onPressed: () {
(connection.devices.first as ZwiftClickV2).test();
},
child: Text('Test'),
child: Text('Reset'),
),
],
),