From 2f84f70a5fe57687fb8a06f7214f4159ed706e3a Mon Sep 17 00:00:00 2001 From: suntao Date: Wed, 19 May 2021 14:38:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E5=85=A5=E8=93=9D=E7=89=99=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Plugins/WclBlePluginCPP.dll | Bin 0 -> 892928 bytes Assets/Plugins/WclBlePluginCPP.dll.meta | 27 + Assets/Scripts/App.cs | 14 + Assets/Scripts/Devices/AbstractDevice.cs | 33 + Assets/Scripts/Devices/AbstractDevice.cs.meta | 11 + .../Scripts/Devices/Ant/AbstractAntDevice.cs | 20 +- .../Scripts/Devices/Ant/AntDeviceAdapter.cs | 61 + .../Devices/Ant/AntDeviceAdapter.cs.meta | 11 + Assets/Scripts/Devices/Ant/DataSourceBase.cs | 2 +- Assets/Scripts/Devices/Ble.meta | 8 + .../Scripts/Devices/Ble/BitConvertHelper.cs | 48 + .../Devices/Ble/BitConvertHelper.cs.meta | 11 + .../Devices/Ble/BleCharacteristicInfo.cs | 77 ++ .../Devices/Ble/BleCharacteristicInfo.cs.meta | 11 + .../Ble/BleCharacteristicProperties.cs | 29 + .../Ble/BleCharacteristicProperties.cs.meta | 11 + .../Devices/Ble/BleCharacteristicWriteType.cs | 16 + .../Ble/BleCharacteristicWriteType.cs.meta | 11 + Assets/Scripts/Devices/Ble/BleDevice.cs | 236 ++++ Assets/Scripts/Devices/Ble/BleDevice.cs.meta | 11 + .../Scripts/Devices/Ble/BleDeviceAdapter.cs | 78 ++ .../Devices/Ble/BleDeviceAdapter.cs.meta | 11 + .../Devices/Ble/BleHwInterfaceError.cs | 77 ++ .../Devices/Ble/BleHwInterfaceError.cs.meta | 11 + .../Scripts/Devices/Ble/BlePeripheralInfo.cs | 59 + .../Devices/Ble/BlePeripheralInfo.cs.meta | 11 + Assets/Scripts/Devices/Ble/BleResponse.cs | 41 + .../Scripts/Devices/Ble/BleResponse.cs.meta | 11 + Assets/Scripts/Devices/Ble/BleServiceInfo.cs | 61 + .../Devices/Ble/BleServiceInfo.cs.meta | 11 + Assets/Scripts/Devices/Ble/BleState.cs | 24 + Assets/Scripts/Devices/Ble/BleState.cs.meta | 11 + .../Ble/BluetoothStateChangedCallback.cs | 11 + .../Ble/BluetoothStateChangedCallback.cs.meta | 11 + .../Scripts/Devices/Ble/Characteristic.meta | 8 + .../Characteristic/BaseCharacteristicValue.cs | 29 + .../BaseCharacteristicValue.cs.meta | 11 + .../Ble/Characteristic/BleMathHelper.cs | 31 + .../Ble/Characteristic/BleMathHelper.cs.meta | 11 + .../Ble/Characteristic/CrankRevolution.cs | 57 + .../Characteristic/CrankRevolution.cs.meta | 11 + .../Characteristic/HeartRateMeasurement.cs | 76 ++ .../HeartRateMeasurement.cs.meta | 11 + .../SuccessOnlyCharacteristicValue.cs | 22 + .../SuccessOnlyCharacteristicValue.cs.meta | 11 + .../Ble/Characteristic/WheelRevolution.cs | 57 + .../Characteristic/WheelRevolution.cs.meta | 11 + .../Devices/Ble/CharacteristicReadCallback.cs | 11 + .../Ble/CharacteristicReadCallback.cs.meta | 11 + .../Ble/CharacteristicsDiscoveredCallback.cs | 11 + .../CharacteristicsDiscoveredCallback.cs.meta | 11 + Assets/Scripts/Devices/Ble/Commands.meta | 8 + .../Ble/Commands/CommandResponseCode.cs | 26 + .../Ble/Commands/CommandResponseCode.cs.meta | 11 + Assets/Scripts/Devices/Ble/Devices.meta | 8 + .../Devices/Ble/Devices/CyclingPower.cs | 52 + .../Devices/Ble/Devices/CyclingPower.cs.meta | 11 + Assets/Scripts/Devices/Ble/Devices/Ftms.cs | 26 + .../Scripts/Devices/Ble/Devices/Ftms.cs.meta | 11 + .../Scripts/Devices/Ble/Devices/HeartRate.cs | 62 + .../Devices/Ble/Devices/HeartRate.cs.meta | 11 + Assets/Scripts/Devices/Ble/Extension.meta | 8 + .../Devices/Ble/Extension/EnumExtensions.cs | 17 + .../Ble/Extension/EnumExtensions.cs.meta | 11 + Assets/Scripts/Devices/Ble/HeartRate.meta | 8 + .../HeartRate/HeartRateMeasurementValue.cs | 70 + .../HeartRateMeasurementValue.cs.meta | 11 + .../Devices/Ble/HeartRate/HeartRateService.cs | 60 + .../Ble/HeartRate/HeartRateService.cs.meta | 11 + .../Ble/PeripheralDisconnectedCallback.cs | 11 + .../PeripheralDisconnectedCallback.cs.meta | 11 + Assets/Scripts/Devices/Ble/Scan.meta | 8 + .../Devices/Ble/Scan/BleAdvertisementInfo.cs | 40 + .../Ble/Scan/BleAdvertisementInfo.cs.meta | 11 + Assets/Scripts/Devices/Ble/Service.meta | 8 + .../Scripts/Devices/Ble/Service/BleService.cs | 190 +++ .../Devices/Ble/Service/BleService.cs.meta | 11 + Assets/Scripts/Devices/Ble/Win.meta | 8 + .../Scripts/Devices/Ble/Win/BleDeviceProxy.cs | 27 + .../Devices/Ble/Win/BleDeviceProxy.cs.meta | 11 + .../Devices/Ble/Win/BleWinHwInterface.cs | 409 ++++++ .../Devices/Ble/Win/BleWinHwInterface.cs.meta | 11 + Assets/Scripts/Devices/Ble/Win/CPPBridge.meta | 8 + .../Ble/Win/CPPBridge/GattCharacteristic.cs | 60 + .../Win/CPPBridge/GattCharacteristic.cs.meta | 11 + .../Ble/Win/CPPBridge/GattCharacteristics.cs | 21 + .../Win/CPPBridge/GattCharacteristics.cs.meta | 11 + .../Devices/Ble/Win/CPPBridge/GattService.cs | 20 + .../Ble/Win/CPPBridge/GattService.cs.meta | 11 + .../Devices/Ble/Win/CPPBridge/GattServices.cs | 21 + .../Ble/Win/CPPBridge/GattServices.cs.meta | 11 + .../Devices/Ble/Win/CPPBridge/GattUuid.cs | 34 + .../Ble/Win/CPPBridge/GattUuid.cs.meta | 11 + .../Ble/Win/CPPBridge/GattUuidExtension.cs | 30 + .../Win/CPPBridge/GattUuidExtension.cs.meta | 11 + .../Ble/Win/CPPBridge/WCL_NOTIFY_EVENT.cs | 8 + .../Win/CPPBridge/WCL_NOTIFY_EVENT.cs.meta | 11 + .../Win/CPPBridge/WclBleAdvertisementType.cs | 24 + .../CPPBridge/WclBleAdvertisementType.cs.meta | 11 + .../Win/CPPBridge/WclBleGattClientState.cs | 22 + .../CPPBridge/WclBleGattClientState.cs.meta | 11 + .../Scripts/Devices/Ble/Win/GattConnected.cs | 11 + .../Devices/Ble/Win/GattConnected.cs.meta | 11 + .../Devices/Ble/Win/GattDisconnected.cs | 11 + .../Devices/Ble/Win/GattDisconnected.cs.meta | 11 + .../Devices/Ble/Win/GattServicesDiscovered.cs | 11 + .../Ble/Win/GattServicesDiscovered.cs.meta | 11 + Assets/Scripts/Devices/Ble/Win/ServiceUuid.cs | 27 + .../Devices/Ble/Win/ServiceUuid.cs.meta | 11 + .../Scripts/Devices/Ble/Win/ServiceUuids.cs | 343 +++++ .../Devices/Ble/Win/ServiceUuids.cs.meta | 11 + .../Scripts/Devices/Ble/Win/WclBleErrors.cs | 1151 +++++++++++++++++ .../Devices/Ble/Win/WclBleErrors.cs.meta | 11 + .../Devices/Ble/Win/WclBleGattClient.cs | 302 +++++ .../Devices/Ble/Win/WclBleGattClient.cs.meta | 11 + .../Devices/Ble/Win/WclBleGattThread.cs | 403 ++++++ .../Devices/Ble/Win/WclBleGattThread.cs.meta | 11 + .../Devices/Ble/Win/WclBleMainThread.cs | 163 +++ .../Devices/Ble/Win/WclBleMainThread.cs.meta | 11 + .../Scripts/Devices/Ble/Win/WclBleManager.cs | 195 +++ .../Devices/Ble/Win/WclBleManager.cs.meta | 11 + .../Devices/Ble/Win/WclBleManagerStatus.cs | 22 + .../Ble/Win/WclBleManagerStatus.cs.meta | 11 + .../Scripts/Devices/Ble/Win/WclBleWatcher.cs | 201 +++ .../Devices/Ble/Win/WclBleWatcher.cs.meta | 11 + Assets/Scripts/Devices/Commands.meta | 8 + Assets/Scripts/Devices/Commands/Command.cs | 32 + .../Scripts/Devices/Commands/Command.cs.meta | 11 + .../Scripts/Devices/Commands/CommandAction.cs | 10 + .../Devices/Commands/CommandAction.cs.meta | 11 + .../Devices/Commands/CommandFactory.cs | 35 + .../Devices/Commands/CommandFactory.cs.meta | 11 + .../Devices/Commands/CommandResponseStatus.cs | 35 + .../Commands/CommandResponseStatus.cs.meta | 11 + .../Scripts/Devices/Commands/CommandType.cs | 87 ++ .../Devices/Commands/CommandType.cs.meta | 11 + Assets/Scripts/Devices/ConnectionInterface.cs | 15 + .../Devices/ConnectionInterface.cs.meta | 11 + Assets/Scripts/Devices/DeviceAdapter.cs | 30 + Assets/Scripts/Devices/DeviceAdapter.cs.meta | 11 + Assets/Scripts/Devices/DeviceAdapterState.cs | 14 + .../Devices/DeviceAdapterState.cs.meta | 11 + .../Scripts/Devices/{Ant => }/DeviceState.cs | 0 .../Devices/{Ant => }/DeviceState.cs.meta | 0 Assets/Scripts/Devices/MainDeviceAdapter.cs | 73 ++ .../Scripts/Devices/MainDeviceAdapter.cs.meta | 11 + Assets/Scripts/Scenes/MainController.cs | 27 +- .../UI/Prefab/Device/ConnectDeviceModal.cs | 15 +- .../Scripts/UI/Prefab/Device/DeviceCache.cs | 7 +- Assets/Scripts/UI/Prefab/Device/DeviceItem.cs | 5 +- Assets/Scripts/UI/Prefab/Device/DeviceView.cs | 14 +- .../UI/Prefab/Panel/DeviceController.cs | 13 +- 152 files changed, 6426 insertions(+), 56 deletions(-) create mode 100644 Assets/Plugins/WclBlePluginCPP.dll create mode 100644 Assets/Plugins/WclBlePluginCPP.dll.meta create mode 100644 Assets/Scripts/Devices/AbstractDevice.cs create mode 100644 Assets/Scripts/Devices/AbstractDevice.cs.meta create mode 100644 Assets/Scripts/Devices/Ant/AntDeviceAdapter.cs create mode 100644 Assets/Scripts/Devices/Ant/AntDeviceAdapter.cs.meta create mode 100644 Assets/Scripts/Devices/Ble.meta create mode 100644 Assets/Scripts/Devices/Ble/BitConvertHelper.cs create mode 100644 Assets/Scripts/Devices/Ble/BitConvertHelper.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BleCharacteristicInfo.cs create mode 100644 Assets/Scripts/Devices/Ble/BleCharacteristicInfo.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BleCharacteristicProperties.cs create mode 100644 Assets/Scripts/Devices/Ble/BleCharacteristicProperties.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BleCharacteristicWriteType.cs create mode 100644 Assets/Scripts/Devices/Ble/BleCharacteristicWriteType.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BleDevice.cs create mode 100644 Assets/Scripts/Devices/Ble/BleDevice.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs create mode 100644 Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BleHwInterfaceError.cs create mode 100644 Assets/Scripts/Devices/Ble/BleHwInterfaceError.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BlePeripheralInfo.cs create mode 100644 Assets/Scripts/Devices/Ble/BlePeripheralInfo.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BleResponse.cs create mode 100644 Assets/Scripts/Devices/Ble/BleResponse.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BleServiceInfo.cs create mode 100644 Assets/Scripts/Devices/Ble/BleServiceInfo.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BleState.cs create mode 100644 Assets/Scripts/Devices/Ble/BleState.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/BluetoothStateChangedCallback.cs create mode 100644 Assets/Scripts/Devices/Ble/BluetoothStateChangedCallback.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Characteristic.meta create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/BaseCharacteristicValue.cs create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/BaseCharacteristicValue.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/BleMathHelper.cs create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/BleMathHelper.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/CrankRevolution.cs create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/CrankRevolution.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/HeartRateMeasurement.cs create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/HeartRateMeasurement.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/SuccessOnlyCharacteristicValue.cs create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/SuccessOnlyCharacteristicValue.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/WheelRevolution.cs create mode 100644 Assets/Scripts/Devices/Ble/Characteristic/WheelRevolution.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/CharacteristicReadCallback.cs create mode 100644 Assets/Scripts/Devices/Ble/CharacteristicReadCallback.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/CharacteristicsDiscoveredCallback.cs create mode 100644 Assets/Scripts/Devices/Ble/CharacteristicsDiscoveredCallback.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Commands.meta create mode 100644 Assets/Scripts/Devices/Ble/Commands/CommandResponseCode.cs create mode 100644 Assets/Scripts/Devices/Ble/Commands/CommandResponseCode.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Devices.meta create mode 100644 Assets/Scripts/Devices/Ble/Devices/CyclingPower.cs create mode 100644 Assets/Scripts/Devices/Ble/Devices/CyclingPower.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Devices/Ftms.cs create mode 100644 Assets/Scripts/Devices/Ble/Devices/Ftms.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Devices/HeartRate.cs create mode 100644 Assets/Scripts/Devices/Ble/Devices/HeartRate.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Extension.meta create mode 100644 Assets/Scripts/Devices/Ble/Extension/EnumExtensions.cs create mode 100644 Assets/Scripts/Devices/Ble/Extension/EnumExtensions.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/HeartRate.meta create mode 100644 Assets/Scripts/Devices/Ble/HeartRate/HeartRateMeasurementValue.cs create mode 100644 Assets/Scripts/Devices/Ble/HeartRate/HeartRateMeasurementValue.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/HeartRate/HeartRateService.cs create mode 100644 Assets/Scripts/Devices/Ble/HeartRate/HeartRateService.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/PeripheralDisconnectedCallback.cs create mode 100644 Assets/Scripts/Devices/Ble/PeripheralDisconnectedCallback.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Scan.meta create mode 100644 Assets/Scripts/Devices/Ble/Scan/BleAdvertisementInfo.cs create mode 100644 Assets/Scripts/Devices/Ble/Scan/BleAdvertisementInfo.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Service.meta create mode 100644 Assets/Scripts/Devices/Ble/Service/BleService.cs create mode 100644 Assets/Scripts/Devices/Ble/Service/BleService.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/BleDeviceProxy.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/BleDeviceProxy.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristic.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristic.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristics.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristics.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattService.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattService.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattServices.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattServices.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuid.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuid.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuidExtension.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuidExtension.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/WCL_NOTIFY_EVENT.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/WCL_NOTIFY_EVENT.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleAdvertisementType.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleAdvertisementType.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleGattClientState.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleGattClientState.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/GattConnected.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/GattConnected.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/GattDisconnected.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/GattDisconnected.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/GattServicesDiscovered.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/GattServicesDiscovered.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/ServiceUuid.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/ServiceUuid.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/ServiceUuids.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/ServiceUuids.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleErrors.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleErrors.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleGattClient.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleGattClient.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleGattThread.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleGattThread.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleManager.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleManager.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleManagerStatus.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleManagerStatus.cs.meta create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleWatcher.cs create mode 100644 Assets/Scripts/Devices/Ble/Win/WclBleWatcher.cs.meta create mode 100644 Assets/Scripts/Devices/Commands.meta create mode 100644 Assets/Scripts/Devices/Commands/Command.cs create mode 100644 Assets/Scripts/Devices/Commands/Command.cs.meta create mode 100644 Assets/Scripts/Devices/Commands/CommandAction.cs create mode 100644 Assets/Scripts/Devices/Commands/CommandAction.cs.meta create mode 100644 Assets/Scripts/Devices/Commands/CommandFactory.cs create mode 100644 Assets/Scripts/Devices/Commands/CommandFactory.cs.meta create mode 100644 Assets/Scripts/Devices/Commands/CommandResponseStatus.cs create mode 100644 Assets/Scripts/Devices/Commands/CommandResponseStatus.cs.meta create mode 100644 Assets/Scripts/Devices/Commands/CommandType.cs create mode 100644 Assets/Scripts/Devices/Commands/CommandType.cs.meta create mode 100644 Assets/Scripts/Devices/ConnectionInterface.cs create mode 100644 Assets/Scripts/Devices/ConnectionInterface.cs.meta create mode 100644 Assets/Scripts/Devices/DeviceAdapter.cs create mode 100644 Assets/Scripts/Devices/DeviceAdapter.cs.meta create mode 100644 Assets/Scripts/Devices/DeviceAdapterState.cs create mode 100644 Assets/Scripts/Devices/DeviceAdapterState.cs.meta rename Assets/Scripts/Devices/{Ant => }/DeviceState.cs (100%) rename Assets/Scripts/Devices/{Ant => }/DeviceState.cs.meta (100%) create mode 100644 Assets/Scripts/Devices/MainDeviceAdapter.cs create mode 100644 Assets/Scripts/Devices/MainDeviceAdapter.cs.meta diff --git a/Assets/Plugins/WclBlePluginCPP.dll b/Assets/Plugins/WclBlePluginCPP.dll new file mode 100644 index 0000000000000000000000000000000000000000..dc28c79132e7c5a03dd2c1a369156fa810171f6e GIT binary patch literal 892928 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 {V*xq_|CPoDQ3HH?G!!xjo77mY`7eMXvPRadhW} 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�?UJHS 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�Ks=T`iJT4Qr^J{V=aabwRRo1=P4etE>UZT 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/WclBlePluginCPP.dll.meta b/Assets/Plugins/WclBlePluginCPP.dll.meta new file mode 100644 index 00000000..2aefccfb --- /dev/null +++ b/Assets/Plugins/WclBlePluginCPP.dll.meta @@ -0,0 +1,27 @@ +fileFormatVersion: 2 +guid: cfc0710c09383b54f8aa661624975c47 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/App.cs b/Assets/Scripts/App.cs index cb6dfbe8..b22a285c 100644 --- a/Assets/Scripts/App.cs +++ b/Assets/Scripts/App.cs @@ -7,6 +7,7 @@ using UnityEngine; using System.Net; using System.Globalization; using System.Threading; +using Assets.Scripts.Devices; public static class App { @@ -50,6 +51,19 @@ public static class App //public static string AppDownloadUrl { get; internal set; } //public static string AppVersionCode { get; internal set; } + private static MainDeviceAdapter mainDeviceAdapter; + public static MainDeviceAdapter MainDeviceAdapter + { + get + { + if(mainDeviceAdapter == null) + { + mainDeviceAdapter = new MainDeviceAdapter(); + } + return mainDeviceAdapter; + } + } + static App() { CultureInfo currentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone(); diff --git a/Assets/Scripts/Devices/AbstractDevice.cs b/Assets/Scripts/Devices/AbstractDevice.cs new file mode 100644 index 00000000..0ecc01ea --- /dev/null +++ b/Assets/Scripts/Devices/AbstractDevice.cs @@ -0,0 +1,33 @@ +using Assets.Scripts.Devices.Ant; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices +{ + public abstract class AbstractDevice + { + public virtual DeviceState State { get; set; } = DeviceState.Disconnected; + + public SensorType Sensor { get; protected set; } + + public virtual string Name + { + get; + protected set; + } + + public virtual ushort DeviceNumber { get; set; } + + public virtual int Priority + { + get; protected set; + } + + public abstract void Connect(); + + public abstract void Disconnect(bool save = true); + } +} diff --git a/Assets/Scripts/Devices/AbstractDevice.cs.meta b/Assets/Scripts/Devices/AbstractDevice.cs.meta new file mode 100644 index 00000000..f7dd1d69 --- /dev/null +++ b/Assets/Scripts/Devices/AbstractDevice.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c92a5d01ab0176b46bb79faf3ffa2fc0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ant/AbstractAntDevice.cs b/Assets/Scripts/Devices/Ant/AbstractAntDevice.cs index 1eff0d37..22a60158 100644 --- a/Assets/Scripts/Devices/Ant/AbstractAntDevice.cs +++ b/Assets/Scripts/Devices/Ant/AbstractAntDevice.cs @@ -12,16 +12,12 @@ namespace Assets.Scripts.Devices.Ant { public abstract class AbstractAntDevice : DataSourceBase { - public string Name - { - get; - protected set; - } + public AntChannelProfile searchProfile; public bool isInitialized = false; private DeviceState state; - public DeviceState State + public override DeviceState State { get { @@ -37,7 +33,7 @@ namespace Assets.Scripts.Devices.Ant StateChange?.Invoke(state); } } - public SensorType Sensor { get; private set; } + private int _ManufacturerId; /// @@ -56,7 +52,7 @@ namespace Assets.Scripts.Devices.Ant } private ushort _DeviceNumber; - public ushort DeviceNumber + public override ushort DeviceNumber { get { @@ -92,10 +88,6 @@ namespace Assets.Scripts.Devices.Ant public bool pairingEnabled; } - public virtual int Priority - { - get; protected set; - } //private readonly Rhino.PowerFun.Services.DeviceService deviceService; //private readonly DeviceDetailService _deviceDetailService; @@ -174,7 +166,7 @@ namespace Assets.Scripts.Devices.Ant // base.reset(); //} - public void Connect() + public override void Connect() { if (State == DeviceState.Connected || State == DeviceState.Connecting) return; @@ -182,7 +174,7 @@ namespace Assets.Scripts.Devices.Ant AntConnector.Instance().ConnectDevice(this); } - public void Disconnect(bool save = true) + public override void Disconnect(bool save = true) { if (State == DeviceState.Disconnected || State == DeviceState.Disconnecting) return; diff --git a/Assets/Scripts/Devices/Ant/AntDeviceAdapter.cs b/Assets/Scripts/Devices/Ant/AntDeviceAdapter.cs new file mode 100644 index 00000000..bea79f1f --- /dev/null +++ b/Assets/Scripts/Devices/Ant/AntDeviceAdapter.cs @@ -0,0 +1,61 @@ +using Assets.Scripts.UI.Prefab.Device; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Devices.Ant +{ + public class AntDeviceAdapter : DeviceAdapter + { + public override ConnectionInterface Interface => ConnectionInterface.ANT; + + public AntDeviceAdapter() + { + AntConnector.Instance((device2) => { + if (device2.State == DeviceState.Disconnected) + { + //Debug.Log($"探索到新的设备{ device2.DeviceNumber }"); + //自动连接 + if (DeviceCache.Exist(device2)) + { + Debug.Log("自动连接" + device2.DeviceNumber); + device2.Connect(); + } + } + }, Debug.Log); + } + + public override DeviceAdapterState GetState() + { + if (AntConnector.Instance().IsAvailable) + { + return DeviceAdapterState.On; + } + return DeviceAdapterState.Unavailable; + } + + public override IEnumerable GetDevices() + { + return AntConnector.Instance().discoveredDevices; + } + + public override void StartScan() + { + //throw new NotImplementedException(); + } + + public override void StopScan() + { + //throw new NotImplementedException(); + } + + public override void Dispose() + { + AntConnector.Instance().Dispose(); + base.Dispose(); + } + } +} diff --git a/Assets/Scripts/Devices/Ant/AntDeviceAdapter.cs.meta b/Assets/Scripts/Devices/Ant/AntDeviceAdapter.cs.meta new file mode 100644 index 00000000..7062acc4 --- /dev/null +++ b/Assets/Scripts/Devices/Ant/AntDeviceAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aa2b23675a0486a40881d44a57de8d73 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ant/DataSourceBase.cs b/Assets/Scripts/Devices/Ant/DataSourceBase.cs index d496c7dc..54098f96 100644 --- a/Assets/Scripts/Devices/Ant/DataSourceBase.cs +++ b/Assets/Scripts/Devices/Ant/DataSourceBase.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace Assets.Scripts.Devices.Ant { - public abstract class DataSourceBase + public abstract class DataSourceBase : AbstractDevice { //double distanceTravelled = 0; //DataSourcePacket lastPacketRcvd = null; diff --git a/Assets/Scripts/Devices/Ble.meta b/Assets/Scripts/Devices/Ble.meta new file mode 100644 index 00000000..c3abd978 --- /dev/null +++ b/Assets/Scripts/Devices/Ble.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 157803f0c8b4ed542a209a947896097b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BitConvertHelper.cs b/Assets/Scripts/Devices/Ble/BitConvertHelper.cs new file mode 100644 index 00000000..242e8f3a --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BitConvertHelper.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts +{ + public static class BitConvertHelper + { + public static byte Lsn(byte b) + { + return (byte)(b & 15); + } + + // Token: 0x060032F7 RID: 13047 RVA: 0x000C22C3 File Offset: 0x000C04C3 + public static byte Lsn(byte[] bytes, int index) + { + return BitConvertHelper.Lsn(bytes[index]); + } + + public static byte ToUInt8(byte[] bytes, int index) + { + return bytes[index]; + } + + // Token: 0x060032FB RID: 13051 RVA: 0x000C22E8 File Offset: 0x000C04E8 + public static ushort ToUInt12(byte[] bytes, int index) + { + return (ushort)((int)bytes[index] + ((int)BitConvertHelper.Lsn(bytes[index + 1]) << 8)); + } + + public static ushort ToUInt16(byte[] bytes, int startIndex) + { + return BitConverter.ToUInt16(bytes, startIndex); + } + + public static short ToInt16(byte[] bytes, int startIndex) + { + return BitConverter.ToInt16(bytes, startIndex); + } + + public static uint ToUInt32(byte[] bytes, int startIndex) + { + return BitConverter.ToUInt32(bytes, startIndex); + } + } +} diff --git a/Assets/Scripts/Devices/Ble/BitConvertHelper.cs.meta b/Assets/Scripts/Devices/Ble/BitConvertHelper.cs.meta new file mode 100644 index 00000000..9956fb13 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BitConvertHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 26dac648c68553d4bb2bccf4e54c4dfc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BleCharacteristicInfo.cs b/Assets/Scripts/Devices/Ble/BleCharacteristicInfo.cs new file mode 100644 index 00000000..addcc5e5 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleCharacteristicInfo.cs @@ -0,0 +1,77 @@ +using Assets.Scripts.Devices.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + public abstract class BleCharacteristicInfo + { + // Token: 0x170005BF RID: 1471 + // (get) Token: 0x06001FE3 RID: 8163 RVA: 0x00085CF7 File Offset: 0x00083EF7 + public BlePeripheralInfo Peripheral + { + get + { + return this.Service.Peripheral; + } + } + + // Token: 0x170005C0 RID: 1472 + // (get) Token: 0x06001FE4 RID: 8164 RVA: 0x00085D04 File Offset: 0x00083F04 + public BleServiceInfo Service { get; } + + // Token: 0x170005C1 RID: 1473 + // (get) Token: 0x06001FE5 RID: 8165 RVA: 0x00085D0C File Offset: 0x00083F0C + public Guid Id { get; } + + // Token: 0x170005C2 RID: 1474 + // (get) Token: 0x06001FE6 RID: 8166 RVA: 0x00085D14 File Offset: 0x00083F14 + public BleCharacteristicProperties Properties { get; } + + // Token: 0x06001FE7 RID: 8167 RVA: 0x00085D1C File Offset: 0x00083F1C + protected BleCharacteristicInfo(Guid id, BleServiceInfo service, BleCharacteristicProperties properties) + { + this.Id = id; + this.Service = service; + this.Properties = properties; + } + + // Token: 0x06001FE8 RID: 8168 RVA: 0x00085D3C File Offset: 0x00083F3C + public bool MatchGuid(Guid guid) + { + return this.Id.Equals(guid); + } + + // Token: 0x06001FE9 RID: 8169 RVA: 0x00085D58 File Offset: 0x00083F58 + public bool MatchAddress(string address) + { + return this.Peripheral.MatchAddress(address); + } + + // Token: 0x06001FEA RID: 8170 RVA: 0x00085D68 File Offset: 0x00083F68 + public override bool Equals(object obj) + { + if (obj == null || !(base.GetType() == obj.GetType())) + { + return false; + } + BleCharacteristicInfo bleCharacteristicInfo = (BleCharacteristicInfo)obj; + return this.Id.Equals(bleCharacteristicInfo.Id) && this.Service.Equals(bleCharacteristicInfo.Service); + } + + // Token: 0x06001FEB RID: 8171 RVA: 0x00085DC0 File Offset: 0x00083FC0 + public override int GetHashCode() + { + return (17 * 23 + this.Id.GetHashCode()) * 23 + this.Peripheral.GetHashCode(); + } + + // Token: 0x06001FEC RID: 8172 RVA: 0x00085DF6 File Offset: 0x00083FF6 + public override string ToString() + { + return this.Id.ToString(); + } + } +} diff --git a/Assets/Scripts/Devices/Ble/BleCharacteristicInfo.cs.meta b/Assets/Scripts/Devices/Ble/BleCharacteristicInfo.cs.meta new file mode 100644 index 00000000..567ac8d2 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleCharacteristicInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f417f704e04e35e4aaef2dcd366551ab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BleCharacteristicProperties.cs b/Assets/Scripts/Devices/Ble/BleCharacteristicProperties.cs new file mode 100644 index 00000000..331d99a5 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleCharacteristicProperties.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + [Flags] + public enum BleCharacteristicProperties + { + // Token: 0x0400115A RID: 4442 + Broadcast = 1, + // Token: 0x0400115B RID: 4443 + Read = 2, + // Token: 0x0400115C RID: 4444 + WriteWithoutResponse = 4, + // Token: 0x0400115D RID: 4445 + Write = 8, + // Token: 0x0400115E RID: 4446 + Notify = 16, + // Token: 0x0400115F RID: 4447 + Indicate = 32, + // Token: 0x04001160 RID: 4448 + SignedWrites = 64, + // Token: 0x04001161 RID: 4449 + ExtendedProperties = 128 + } +} diff --git a/Assets/Scripts/Devices/Ble/BleCharacteristicProperties.cs.meta b/Assets/Scripts/Devices/Ble/BleCharacteristicProperties.cs.meta new file mode 100644 index 00000000..2908cb19 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleCharacteristicProperties.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 44ea993e814c6f8408d93324b7cf4232 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BleCharacteristicWriteType.cs b/Assets/Scripts/Devices/Ble/BleCharacteristicWriteType.cs new file mode 100644 index 00000000..947c3e68 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleCharacteristicWriteType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + public enum BleCharacteristicWriteType + { + // Token: 0x04001163 RID: 4451 + WriteWithResponse, + // Token: 0x04001164 RID: 4452 + WriteWithoutResponse + } +} diff --git a/Assets/Scripts/Devices/Ble/BleCharacteristicWriteType.cs.meta b/Assets/Scripts/Devices/Ble/BleCharacteristicWriteType.cs.meta new file mode 100644 index 00000000..4908201b --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleCharacteristicWriteType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 849439c6d534a5f4c9fd3ae52018478f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BleDevice.cs b/Assets/Scripts/Devices/Ble/BleDevice.cs new file mode 100644 index 00000000..6041daef --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleDevice.cs @@ -0,0 +1,236 @@ +using Assets.Scripts.Ble; +using Assets.Scripts.Ble.HeartRate; +using Assets.Scripts.Ble.Service; +using Assets.Scripts.Devices.Ant; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Devices.Ble +{ + + public abstract class BleDevice : AbstractDevice + { + protected BleWinHwInterface hwInterface; + protected BlePeripheralInfo peripheralInfo; + private readonly HashSet services = new HashSet(); + + private readonly HashSet pendingServices = new HashSet(); + + public override string Name { get => peripheralInfo.Name; protected set => base.Name = value; } + + public BleDevice(BlePeripheralInfo peripheralInfo, BleWinHwInterface bleWinHwInterface, SensorType sensor) //: base(peripheralInfo) + { + this.hwInterface = bleWinHwInterface; + this.hwInterface.BluetoothStateChangedEvent += BluetoothStateChangedEvent; + this.peripheralInfo = peripheralInfo; + + base.Sensor = sensor; + + //base.Name = this.peripheralInfo.Name; + + //Debug.Log(base.Name + "," + sensor.ToString()); + } + + public void ConnectToPeripheralIfPossible() + { + this.hwInterface.ConnectPeripheral(this.peripheralInfo, PeripheralConnectedAction); + } + + private void PeripheralConnectedAction(BleWinHwInterface hwInterface, BlePeripheralInfo sender, BleResponse response) + { + if (response.IsSuccess) + { + State = DeviceState.Connected; + Debug.Log("连接成功"); + hwInterface.DiscoverServices(this.peripheralInfo, ServicesDiscoveredAction);//, this.ServicesDiscoveredAction); + } + } + + private void ServicesDiscoveredAction(BleWinHwInterface hwInterface, BlePeripheralInfo sender, BleResponse> response) + { + //Debug.Log("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"); + + this.CreateServices(response.Data); + } + + protected abstract void CreateServices(List discoveredServices); + //private void CreateServices(List discoveredServices) + //{ + // foreach (var item in discoveredServices) + // { + //BleService service = null; + //if (item.MatchGuid(ServiceUuids.Services.Single(s => s.IdByteArray == ServiceUuids.DeviceInformation).IdGuid)) + //{ + // Debug.Log("device infomation"); + //} + //else if (item.MatchGuid(ServiceUuids.Services.Single(s => s.IdByteArray == ServiceUuids.Battery).IdGuid)) + //{ + // Debug.Log("battery"); + // //service = new BatteryService(item, this.hwInterface); + //} + //else if (item.MatchGuid(ServiceUuids.Get(ServiceUuids.HeartRate).IdGuid)) + //{ + // Debug.Log("发现 heartRate 服务"); + // service = new HeartRateService(item, this.hwInterface); + //} + //else if (item.MatchGuid(ServiceUuids.Get(ServiceUuids.CyclingSpeedCadence).IdGuid)) + //{ + // //service = new CyclingSpeedCadence.CyclingSpeedCadenceService(item, this.hwInterface); + //} + //else if (item.MatchGuid(ServiceUuids.Get(ServiceUuids.CyclingPower).IdGuid)) + //{ + // Debug.Log("cycling power"); + // this.CreateCyclingPowerService(item); + //} + //else if (item.MatchGuid(ServiceUuids.Services.Single(s => s.IdByteArray == ServiceUuids.Ftms).IdGuid)) + //{ + // Debug.Log("ftms"); + // this.CreateFtmsService(item); + //} + //else if (item.MatchGuid(ServiceUuids.Services.Single(s => s.IdByteArray == ServiceUuids.TacxBle).IdGuid)) + //{ + // Debug.Log("tacx ble"); + // //service = new TacxFecService(item, this.hwInterface); + //} + //this.AddService(service, null); + // } + //} + + private void CreateFtmsService(BleServiceInfo serviceInfo) + { + this.hwInterface.DiscoverCharacteristic(serviceInfo, (hwInterface, bleServiceInfo, response) => + { + if (this.CheckPendingServiceCharacteristicsResponse(serviceInfo, response)) + { + this.CreateFtmsService(serviceInfo, response); + } + }); + } + + private void CreateFtmsService(BleServiceInfo serviceInfo, BleResponse> response) + { + BleService service; + //if (response.Data.Any((BleCharacteristicInfo characteristicInfo) => characteristicInfo.MatchGuid(BleApi.Characteristics.CycleOpsFtmsSystemWeight))) + //{ + //service = new CycleOpsFtmsService(serviceInfo, base.Settings, this.hwInterface, new ServiceStateChanged(this.ServiceStateChanged), new ServiceCapabilitiesUpdated(this.ServiceCapabilitiesUpdated)); + //} + //else + //{ + //FixType fixType = FixType.FtmsFeature7ByteResponse; + //if (this.IsWattbike()) + //{ + // fixType |= FixType.WattbikeFeatureInconsistency; + //} + //service = new FtmsService(serviceInfo, base.Settings, this.hwInterface, new ServiceStateChanged(this.ServiceStateChanged), new ServiceCapabilitiesUpdated(this.ServiceCapabilitiesUpdated), fixType); + //service = new Ftms.FtmsService(serviceInfo, hwInterface); + //} + //this.AddService(service, response); + } + + + private void CreateCyclingPowerService(BleServiceInfo serviceInfo) + { + this.pendingServices.Add(serviceInfo); + this.hwInterface.DiscoverCharacteristic(serviceInfo, (hwInterface, service, response) => + { + if (this.CheckPendingServiceCharacteristicsResponse(serviceInfo, response)) + { + this.CreateCyclingPowerService(serviceInfo, response); + } + }); + } + + private void CreateCyclingPowerService(BleServiceInfo serviceInfo, BleResponse> response) + { + //BleService service = null; + //if (response.Data.Any((BleCharacteristicInfo characteristicInfo) => characteristicInfo.MatchGuid(ServiceUuids.Characteristics.WahooControlPoint))) + //{ + // //service = new WahooService(serviceInfo, base.Settings, this.hwInterface, new ServiceStateChanged(this.ServiceStateChanged), new ServiceCapabilitiesUpdated(this.ServiceCapabilitiesUpdated), fixType); + //} + //else + //{ + // service = new CyclingPowerService(serviceInfo, this.hwInterface); + // this.AddService(service, response); + //} + + } + + private void AddService(BleService service, BleResponse> scanCharacteristicsResponse = null) + { + if (service == null) + { + return; + } + this.services.Add(service); + service.DiscoverCharacteristics(scanCharacteristicsResponse); + } + + private bool CheckPendingServiceCharacteristicsResponse(BleServiceInfo serviceInfo, BleResponse bleResponse) + { + if (bleResponse.IsSuccess) + { + return true; + } + this.pendingServices.Remove(serviceInfo); + this.CheckAndSetConnectionStatus(); + return false; + } + + public void SendCommand() + { + + } + + private void CheckAndSetConnectionStatus() + { + } + + private void Disconnect() + { + if (this.State != DeviceState.Disconnected) + { + this.hwInterface.DisconnectPeripheral(this.peripheralInfo, ()=> { + this.State = DeviceState.Disconnected; + }); + } + } + + private void BluetoothStateChangedEvent(BleWinHwInterface hwInterface, BleState state) + { + switch (state) + { + case BleState.Unknown: + break; + case BleState.Unavailable: + break; + case BleState.Unauthorize: + break; + case BleState.Reseting: + break; + case BleState.Off: + this.Disconnect(); + break; + case BleState.On: + + break; + default: + break; + } + } + + public override void Connect() + { + this.ConnectToPeripheralIfPossible(); + } + + public override void Disconnect(bool save = true) + { + //throw new NotImplementedException(); + + } + } +} diff --git a/Assets/Scripts/Devices/Ble/BleDevice.cs.meta b/Assets/Scripts/Devices/Ble/BleDevice.cs.meta new file mode 100644 index 00000000..fb0b2e1c --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleDevice.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b14e74cc46a1e184ea96a01f17bb4e3a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs b/Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs new file mode 100644 index 00000000..d4be45c5 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs @@ -0,0 +1,78 @@ +using Assets.Scripts.Ble; +using Assets.Scripts.Ble.Service; +using Assets.Scripts.Devices.Ble.Devices; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Devices.Ble +{ + public class BleDeviceAdapter : DeviceAdapter + { + public override ConnectionInterface Interface => ConnectionInterface.BLE; + + private IDictionary discoveredDevices = new Dictionary(); + + private BleWinHwInterface hwInterface; + public BleDeviceAdapter() + { + hwInterface = BleWinHwInterface.GetInterface(); + } + + public override IEnumerable GetDevices() + { + //throw new NotImplementedException(); + return discoveredDevices.Select(d => d.Value); + } + + public override DeviceAdapterState GetState() + { + if(hwInterface.BleState == BleState.On) + { + return DeviceAdapterState.On; + } + return DeviceAdapterState.Unavailable; + } + + public override void StartScan() + { + hwInterface.StartScan((device) => + { + if (!discoveredDevices.ContainsKey(device.Peripheral.Address)) + { + Debug.Log("发现设备" + device.Peripheral.Address + device.Peripheral.Name + ", type:" + device.SensorType); + if(device.SensorType == Ant.SensorType.Trainer) + { + //var device1 = new Ftms(device.Peripheral, hwInterface); + //discoveredDevices.Add(device.Peripheral.Address, device1); + } + else if(device.SensorType == Ant.SensorType.HeartRate) + { + var device1 = new HeartRate(device.Peripheral, hwInterface); + discoveredDevices.Add(device.Peripheral.Address, device1); + } + else if(device.SensorType == Ant.SensorType.Power) + { + var device1 = new CyclingPower(device.Peripheral, hwInterface); + discoveredDevices.Add(device.Peripheral.Address, device1); + } + //discoveredDevices.Add(device.Peripheral.Address, new BleDevice(device.Peripheral, hwInterface, device.SensorType)); + } + }); + } + + public override void StopScan() + { + + } + + public override void Dispose() + { + hwInterface.Dispose(); + base.Dispose(); + } + } +} diff --git a/Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs.meta b/Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs.meta new file mode 100644 index 00000000..fdb7d4bc --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 21c2c84c243633f4ba4403b51c0272c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BleHwInterfaceError.cs b/Assets/Scripts/Devices/Ble/BleHwInterfaceError.cs new file mode 100644 index 00000000..41af1800 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleHwInterfaceError.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices.Ble +{ + public class BleHwInterfaceError + { + public int? Code { get; } + + // Token: 0x170005C4 RID: 1476 + // (get) Token: 0x06001FEE RID: 8174 RVA: 0x00085E0B File Offset: 0x0008400B + public string Domain { get; } + + // Token: 0x170005C5 RID: 1477 + // (get) Token: 0x06001FEF RID: 8175 RVA: 0x00085E13 File Offset: 0x00084013 + public string Description { get; } + + // Token: 0x06001FF0 RID: 8176 RVA: 0x00085E1B File Offset: 0x0008401B + public BleHwInterfaceError(int? code, string domain, string description) + { + this.Code = code; + this.Domain = domain; + this.Description = description; + } + + // Token: 0x06001FF1 RID: 8177 RVA: 0x00085E38 File Offset: 0x00084038 + public BleHwInterfaceError(string description) : this(null, null, description) + { + } + + // Token: 0x06001FF2 RID: 8178 RVA: 0x00085E58 File Offset: 0x00084058 + public override string ToString() + { + int? code = this.Code; + if (code != null && this.Domain == "WclBleGattClientErrorDomain") + { + string str = "BleHWPluginError:\n"; + code = this.Code; + return str + ((code != null) ? code.GetValueOrDefault().ToString() : null) + "\n-Description: " + this.Description; + } + code = this.Code; + if (code != null && this.Domain != null) + { + return string.Format("BleHWPluginError:\n-Domain: {0}\n-Code: {1}\n-Description: {2}", this.Domain, this.Code, this.Description); + } + return "BleHWPluginError:-Description: " + this.Description; + } + + // Token: 0x06001FF3 RID: 8179 RVA: 0x00085F08 File Offset: 0x00084108 + public static BleHwInterfaceError ParseFromString(string message) + { + string[] array = (message != null) ? message.Split(new char[] + { + '|' + }, 3, StringSplitOptions.RemoveEmptyEntries) : null; + if (array == null || array.Length == 0) + { + return null; + } + int value; + if (array.Length == 3 && int.TryParse(array[1], out value)) + { + return new BleHwInterfaceError(new int?(value), array[0], array[2]); + } + return new BleHwInterfaceError(message); + } + + // Token: 0x06001FF4 RID: 8180 RVA: 0x00085F64 File Offset: 0x00084164 + public override int GetHashCode() + { + return (this.Code.GetHashCode() * 397 ^ ((this.Domain != null) ? this.Domain.GetHashCode() : 0)) * 397 ^ ((this.Description != null) ? this.Description.GetHashCode() : 0); + } + } +} diff --git a/Assets/Scripts/Devices/Ble/BleHwInterfaceError.cs.meta b/Assets/Scripts/Devices/Ble/BleHwInterfaceError.cs.meta new file mode 100644 index 00000000..c74e6e24 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleHwInterfaceError.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 58ab8c2cfa7e96e43b69bb7e0e7e10c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BlePeripheralInfo.cs b/Assets/Scripts/Devices/Ble/BlePeripheralInfo.cs new file mode 100644 index 00000000..2b12c5ce --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BlePeripheralInfo.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices.Ble +{ + public abstract class BlePeripheralInfo + { + // Token: 0x170005C6 RID: 1478 + // (get) Token: 0x06001FF5 RID: 8181 RVA: 0x00085FBF File Offset: 0x000841BF + // (set) Token: 0x06001FF6 RID: 8182 RVA: 0x00085FC7 File Offset: 0x000841C7 + public string Name { get; protected set; } + + // Token: 0x170005C7 RID: 1479 + // (get) Token: 0x06001FF7 RID: 8183 RVA: 0x00085FD0 File Offset: 0x000841D0 + public string Address { get; } + + // Token: 0x06001FF8 RID: 8184 RVA: 0x00085FD8 File Offset: 0x000841D8 + protected BlePeripheralInfo(string address, string name) + { + this.Address = address; + this.Name = name; + } + + // Token: 0x06001FF9 RID: 8185 RVA: 0x00085FEE File Offset: 0x000841EE + public bool MatchAddress(string address) + { + return address != null && address.Equals(this.Address); + } + + // Token: 0x06001FFA RID: 8186 RVA: 0x00086001 File Offset: 0x00084201 + public override bool Equals(object other) + { + return other != null && base.GetType() == other.GetType() && this.Address.Equals(((BlePeripheralInfo)other).Address); + } + + // Token: 0x06001FFB RID: 8187 RVA: 0x00086031 File Offset: 0x00084231 + public override int GetHashCode() + { + return this.Address.GetHashCode(); + } + + // Token: 0x06001FFC RID: 8188 RVA: 0x00086040 File Offset: 0x00084240 + public override string ToString() + { + return string.Concat(new string[] + { + base.GetType().Name, + ": ", + string.IsNullOrEmpty(this.Name) ? "" : (this.Name + " "), + "[", + this.Address, + "]" + }); + } + } +} diff --git a/Assets/Scripts/Devices/Ble/BlePeripheralInfo.cs.meta b/Assets/Scripts/Devices/Ble/BlePeripheralInfo.cs.meta new file mode 100644 index 00000000..3d425929 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BlePeripheralInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 006773ea103cc3042a0b5e2f815a24eb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BleResponse.cs b/Assets/Scripts/Devices/Ble/BleResponse.cs new file mode 100644 index 00000000..0c15559d --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleResponse.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices.Ble +{ + public class BleResponse + { + // Token: 0x170005C8 RID: 1480 + // (get) Token: 0x06001FFD RID: 8189 RVA: 0x000860AE File Offset: 0x000842AE + // (set) Token: 0x06001FFE RID: 8190 RVA: 0x000860B6 File Offset: 0x000842B6 + public bool IsSuccess { get; set; } + + // Token: 0x170005C9 RID: 1481 + // (get) Token: 0x06001FFF RID: 8191 RVA: 0x000860BF File Offset: 0x000842BF + // (set) Token: 0x06002000 RID: 8192 RVA: 0x000860C7 File Offset: 0x000842C7 + public BleHwInterfaceError Error { get; set; } + + // Token: 0x06002001 RID: 8193 RVA: 0x000860D0 File Offset: 0x000842D0 + public override string ToString() + { + return (this.IsSuccess ? "Success" : "Fail") + "\n" + ((this.Error == null) ? "" : this.Error.ToString()); + } + } + + public class BleResponse : BleResponse + { + // Token: 0x170005CA RID: 1482 + // (get) Token: 0x06002003 RID: 8195 RVA: 0x00086112 File Offset: 0x00084312 + // (set) Token: 0x06002004 RID: 8196 RVA: 0x0008611A File Offset: 0x0008431A + public T Data { get; set; } + + // Token: 0x06002005 RID: 8197 RVA: 0x00086123 File Offset: 0x00084323 + public override string ToString() + { + return base.ToString() + "\n" + this.Data; + } + } +} diff --git a/Assets/Scripts/Devices/Ble/BleResponse.cs.meta b/Assets/Scripts/Devices/Ble/BleResponse.cs.meta new file mode 100644 index 00000000..ce84e17f --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleResponse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8d19e34c55f7b3347ac0cbc36b231d9e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BleServiceInfo.cs b/Assets/Scripts/Devices/Ble/BleServiceInfo.cs new file mode 100644 index 00000000..2934d274 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleServiceInfo.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices.Ble +{ + public abstract class BleServiceInfo + { + // Token: 0x170005CB RID: 1483 + // (get) Token: 0x06002007 RID: 8199 RVA: 0x00086148 File Offset: 0x00084348 + public BlePeripheralInfo Peripheral { get; } + + // Token: 0x170005CC RID: 1484 + // (get) Token: 0x06002008 RID: 8200 RVA: 0x00086150 File Offset: 0x00084350 + public Guid Id { get; } + + // Token: 0x06002009 RID: 8201 RVA: 0x00086158 File Offset: 0x00084358 + protected BleServiceInfo(Guid id, BlePeripheralInfo peripheral) + { + this.Id = id; + this.Peripheral = peripheral; + } + + // Token: 0x0600200A RID: 8202 RVA: 0x00086170 File Offset: 0x00084370 + public bool MatchGuid(Guid serviceId) + { + return this.Id.Equals(serviceId); + } + + // Token: 0x0600200B RID: 8203 RVA: 0x0008618C File Offset: 0x0008438C + public bool MatchAddress(string address) + { + return this.Peripheral.MatchAddress(address); + } + + // Token: 0x0600200C RID: 8204 RVA: 0x0008619C File Offset: 0x0008439C + public override bool Equals(object obj) + { + if (obj == null || !(base.GetType() == obj.GetType())) + { + return false; + } + BleServiceInfo bleServiceInfo = (BleServiceInfo)obj; + return this.Id.Equals(bleServiceInfo.Id) && this.Peripheral.Equals(bleServiceInfo.Peripheral); + } + + // Token: 0x0600200D RID: 8205 RVA: 0x000861F4 File Offset: 0x000843F4 + public override int GetHashCode() + { + return (17 * 23 + this.Id.GetHashCode()) * 23 + this.Peripheral.GetHashCode(); + } + + // Token: 0x0600200E RID: 8206 RVA: 0x0008622A File Offset: 0x0008442A + public override string ToString() + { + return this.Id.ToString(); + } + } +} diff --git a/Assets/Scripts/Devices/Ble/BleServiceInfo.cs.meta b/Assets/Scripts/Devices/Ble/BleServiceInfo.cs.meta new file mode 100644 index 00000000..ab1da8e5 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleServiceInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 06cb344f28950ca4496070fab301ae52 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BleState.cs b/Assets/Scripts/Devices/Ble/BleState.cs new file mode 100644 index 00000000..97919388 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleState.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + public enum BleState + { + // Token: 0x04001072 RID: 4210 + Unknown, + // Token: 0x04001073 RID: 4211 + Unavailable, + // Token: 0x04001074 RID: 4212 + Unauthorize, + // Token: 0x04001075 RID: 4213 + Reseting, + // Token: 0x04001076 RID: 4214 + Off, + // Token: 0x04001077 RID: 4215 + On + } +} diff --git a/Assets/Scripts/Devices/Ble/BleState.cs.meta b/Assets/Scripts/Devices/Ble/BleState.cs.meta new file mode 100644 index 00000000..4101ee6b --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BleState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ac691d8c317dd743bf581fce607c5a3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/BluetoothStateChangedCallback.cs b/Assets/Scripts/Devices/Ble/BluetoothStateChangedCallback.cs new file mode 100644 index 00000000..c8fd1484 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BluetoothStateChangedCallback.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + public delegate void BluetoothStateChangedCallback(BleWinHwInterface hwInterface, BleState bleState); + +} diff --git a/Assets/Scripts/Devices/Ble/BluetoothStateChangedCallback.cs.meta b/Assets/Scripts/Devices/Ble/BluetoothStateChangedCallback.cs.meta new file mode 100644 index 00000000..b94dc648 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/BluetoothStateChangedCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 663a2ebaee4b5a6428d06a6d0a113f9a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Characteristic.meta b/Assets/Scripts/Devices/Ble/Characteristic.meta new file mode 100644 index 00000000..89fdd514 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fb86ae4477864e74bb38dbdbf83bd787 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Characteristic/BaseCharacteristicValue.cs b/Assets/Scripts/Devices/Ble/Characteristic/BaseCharacteristicValue.cs new file mode 100644 index 00000000..991eb00e --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/BaseCharacteristicValue.cs @@ -0,0 +1,29 @@ +using Assets.Scripts.Ble.Commands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Characteristic +{ + public abstract class BaseCharacteristicValue + { + protected BaseCharacteristicValue(Guid id, byte[] data) + { + this.RawData = data; + this.Id = id; + } + + // Token: 0x17000665 RID: 1637 + // (get) Token: 0x060022A2 RID: 8866 RVA: 0x0008F366 File Offset: 0x0008D566 + public Guid Id { get; } + + // Token: 0x17000666 RID: 1638 + // (get) Token: 0x060022A3 RID: 8867 RVA: 0x0008F36E File Offset: 0x0008D56E + public byte[] RawData { get; } + + // Token: 0x060022A4 RID: 8868 + public abstract CommandResponseCode ToDeviceCommandResponseCode(); + } +} diff --git a/Assets/Scripts/Devices/Ble/Characteristic/BaseCharacteristicValue.cs.meta b/Assets/Scripts/Devices/Ble/Characteristic/BaseCharacteristicValue.cs.meta new file mode 100644 index 00000000..cf8805ec --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/BaseCharacteristicValue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b2b671ee375ec854c8074b434d7ef555 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Characteristic/BleMathHelper.cs b/Assets/Scripts/Devices/Ble/Characteristic/BleMathHelper.cs new file mode 100644 index 00000000..2d8f176e --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/BleMathHelper.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Characteristic +{ + public static class BleMathHelper + { + // Token: 0x06000028 RID: 40 RVA: 0x00002740 File Offset: 0x00000940 + public static double WheelFrequency(WheelRevolution? lastWheelRevolution, WheelRevolution? newWheelRevolution, uint timeResolution) + { + return WheelRevolution.ComputeValue(lastWheelRevolution, newWheelRevolution, delegate (WheelRevolution lastValue, WheelRevolution newValue) + { + WheelRevolution wheelRevolution = newValue - lastValue; + return wheelRevolution.Count / ((double)wheelRevolution.Time / timeResolution); + }); + } + + // Token: 0x06000029 RID: 41 RVA: 0x0000276D File Offset: 0x0000096D + public static double CrankFrequency(CrankRevolution? lastCrankRevolutions, CrankRevolution? newCrankRevolutions) + { + return CrankRevolution.ComputeValue(lastCrankRevolutions, newCrankRevolutions, delegate (CrankRevolution lastValue, CrankRevolution newValue) + { + CrankRevolution crankRevolution = newValue - lastValue; + return (double)crankRevolution.Count / ((double)crankRevolution.Time / 1024.0); + }); + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Characteristic/BleMathHelper.cs.meta b/Assets/Scripts/Devices/Ble/Characteristic/BleMathHelper.cs.meta new file mode 100644 index 00000000..8a094579 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/BleMathHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 94d000bcb9e71fe4cbc87260ce666252 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Characteristic/CrankRevolution.cs b/Assets/Scripts/Devices/Ble/Characteristic/CrankRevolution.cs new file mode 100644 index 00000000..e2e68ccb --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/CrankRevolution.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Characteristic +{ + public struct CrankRevolution + { + // Token: 0x060022A5 RID: 8869 RVA: 0x0008F378 File Offset: 0x0008D578 + public static CrankRevolution operator -(CrankRevolution obj1, CrankRevolution obj2) + { + return new CrankRevolution + { + Count = (ushort)(obj1.Count - obj2.Count), + Time = (ushort)(obj1.Time - obj2.Time) + }; + } + + // Token: 0x060022A6 RID: 8870 RVA: 0x0008F3B8 File Offset: 0x0008D5B8 + public static double ComputeValue(CrankRevolution? lastValue, CrankRevolution? newValue, Func validValueComputation) + { + if (newValue == null || lastValue == null || validValueComputation == null) + { + return double.NaN; + } + if (newValue.Value.Time != lastValue.Value.Time) + { + return validValueComputation(lastValue.Value, newValue.Value); + } + if (newValue.Value.Count == lastValue.Value.Count) + { + return double.NaN; + } + throw new ArgumentException("CrankRevolution Count changed but Time remain same -> strange behaviour"); + } + + // Token: 0x060022A7 RID: 8871 RVA: 0x0008F441 File Offset: 0x0008D641 + public override string ToString() + { + return string.Format("Time: {0}, Count: {1}", this.Time, this.Count); + } + + // Token: 0x04001543 RID: 5443 + public const ushort MaxCount = 65535; + + // Token: 0x04001544 RID: 5444 + public const ushort MaxTime = 65535; + + // Token: 0x04001545 RID: 5445 + public ushort Count; + + // Token: 0x04001546 RID: 5446 + public ushort Time; + } +} diff --git a/Assets/Scripts/Devices/Ble/Characteristic/CrankRevolution.cs.meta b/Assets/Scripts/Devices/Ble/Characteristic/CrankRevolution.cs.meta new file mode 100644 index 00000000..49f3ed9c --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/CrankRevolution.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1dea0a9f55f16ac45bfd5aa6a6eda4f4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Characteristic/HeartRateMeasurement.cs b/Assets/Scripts/Devices/Ble/Characteristic/HeartRateMeasurement.cs new file mode 100644 index 00000000..00985c01 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/HeartRateMeasurement.cs @@ -0,0 +1,76 @@ +using Assets.Scripts.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Devices.Ble.Characteristic +{ + public class HeartRateMeasurement + { + public Guid Uuid + { + get + { + return ServiceUuids.Characteristics.HrMeasurement; + } + } + + public Guid ServiceUuid + { + get + { + return ServiceUuids.Get(ServiceUuids.HeartRate).IdGuid; + } + } + + private HrmFormat Format { get; set; } + + // Token: 0x170005EB RID: 1515 + // (get) Token: 0x0600214D RID: 8525 RVA: 0x0008999B File Offset: 0x00087B9B + public int BeatsPerMinute { get; private set; } + + public void HandleAttributeReceived(byte[] data) + { + HrmFlags hrmFlags = (HrmFlags)BitConvertHelper.ToUInt8(data, 0); + this.Format = (HrmFormat)(hrmFlags.HasFlag(HrmFlags.Format) ? 1 : 0); + if (this.Format == HrmFormat.Short) + { + this.BeatsPerMinute = BitConvertHelper.ToUInt8(data, 1); + Debug.Log("心率:" + this.BeatsPerMinute); + return; + } + if (data.Length < 3) + { + throw new ArgumentException("数据出错"); + } + this.BeatsPerMinute = BitConvertHelper.ToUInt16(data, 1); + } + + [Flags] + private enum HrmFlags + { + // Token: 0x040029D0 RID: 10704 + Format = 1, + // Token: 0x040029D1 RID: 10705 + SensorContactStatus1 = 2, + // Token: 0x040029D2 RID: 10706 + SensorContactStatus2 = 4, + // Token: 0x040029D3 RID: 10707 + Energy = 8, + // Token: 0x040029D4 RID: 10708 + RR = 16 + } + + // Token: 0x02000921 RID: 2337 + private enum HrmFormat + { + // Token: 0x040029D6 RID: 10710 + Short, + // Token: 0x040029D7 RID: 10711 + Long + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Characteristic/HeartRateMeasurement.cs.meta b/Assets/Scripts/Devices/Ble/Characteristic/HeartRateMeasurement.cs.meta new file mode 100644 index 00000000..26291525 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/HeartRateMeasurement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3d7a13de9df31a478b0a0c9dbcb1ac4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Characteristic/SuccessOnlyCharacteristicValue.cs b/Assets/Scripts/Devices/Ble/Characteristic/SuccessOnlyCharacteristicValue.cs new file mode 100644 index 00000000..f2e158a8 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/SuccessOnlyCharacteristicValue.cs @@ -0,0 +1,22 @@ +using Assets.Scripts.Ble.Commands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Characteristic +{ + public abstract class SuccessOnlyCharacteristicValue : BaseCharacteristicValue + { + protected SuccessOnlyCharacteristicValue(Guid id, byte[] data) : base(id, data) + { + } + + // Token: 0x060022AB RID: 8875 RVA: 0x0008F4F0 File Offset: 0x0008D6F0 + public override CommandResponseCode ToDeviceCommandResponseCode() + { + return CommandResponseCode.Success; + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Characteristic/SuccessOnlyCharacteristicValue.cs.meta b/Assets/Scripts/Devices/Ble/Characteristic/SuccessOnlyCharacteristicValue.cs.meta new file mode 100644 index 00000000..067f0acb --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/SuccessOnlyCharacteristicValue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: afeabe604a3dc29409ecbf61f6939275 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Characteristic/WheelRevolution.cs b/Assets/Scripts/Devices/Ble/Characteristic/WheelRevolution.cs new file mode 100644 index 00000000..0317806a --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/WheelRevolution.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Characteristic +{ + public struct WheelRevolution + { + // Token: 0x060022AE RID: 8878 RVA: 0x0008F510 File Offset: 0x0008D710 + public static WheelRevolution operator -(WheelRevolution obj1, WheelRevolution obj2) + { + return new WheelRevolution + { + Count = obj1.Count - obj2.Count, + Time = (ushort)(obj1.Time - obj2.Time) + }; + } + + // Token: 0x060022AF RID: 8879 RVA: 0x0008F550 File Offset: 0x0008D750 + public static double ComputeValue(WheelRevolution? lastValue, WheelRevolution? newValue, Func validValueComputation) + { + if (newValue == null || lastValue == null) + { + return double.NaN; + } + if (newValue.Value.Time != lastValue.Value.Time) + { + return validValueComputation(lastValue.Value, newValue.Value); + } + if (newValue.Value.Count == lastValue.Value.Count) + { + return double.NaN; + } + throw new ArgumentException("WheelRevolution Count changed but Time remain same -> strange behaviour"); + } + + // Token: 0x060022B0 RID: 8880 RVA: 0x0008F5D6 File Offset: 0x0008D7D6 + public override string ToString() + { + return string.Format("Time: {0}, Count: {1}", this.Time, this.Count); + } + + // Token: 0x04001548 RID: 5448 + public const uint MaxCount = 4294967295U; + + // Token: 0x04001549 RID: 5449 + public const ushort MaxTime = 65535; + + // Token: 0x0400154A RID: 5450 + public uint Count; + + // Token: 0x0400154B RID: 5451 + public ushort Time; + } +} diff --git a/Assets/Scripts/Devices/Ble/Characteristic/WheelRevolution.cs.meta b/Assets/Scripts/Devices/Ble/Characteristic/WheelRevolution.cs.meta new file mode 100644 index 00000000..a09df0b5 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Characteristic/WheelRevolution.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee3e38fcbff71ea4f90a92eb251bcad4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/CharacteristicReadCallback.cs b/Assets/Scripts/Devices/Ble/CharacteristicReadCallback.cs new file mode 100644 index 00000000..9328c12a --- /dev/null +++ b/Assets/Scripts/Devices/Ble/CharacteristicReadCallback.cs @@ -0,0 +1,11 @@ +using Assets.Scripts.Devices.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + public delegate void CharacteristicReadCallback(BleWinHwInterface hwInterface, BleCharacteristicInfo characteristic, BleResponse response); +} diff --git a/Assets/Scripts/Devices/Ble/CharacteristicReadCallback.cs.meta b/Assets/Scripts/Devices/Ble/CharacteristicReadCallback.cs.meta new file mode 100644 index 00000000..10ff1995 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/CharacteristicReadCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c69fa47ce56b72942920665130ab2bde +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/CharacteristicsDiscoveredCallback.cs b/Assets/Scripts/Devices/Ble/CharacteristicsDiscoveredCallback.cs new file mode 100644 index 00000000..d3fab0e7 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/CharacteristicsDiscoveredCallback.cs @@ -0,0 +1,11 @@ +using Assets.Scripts.Devices.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + public delegate void CharacteristicsDiscoveredCallback(BleWinHwInterface hwInterface, BleServiceInfo service, BleResponse> response); +} diff --git a/Assets/Scripts/Devices/Ble/CharacteristicsDiscoveredCallback.cs.meta b/Assets/Scripts/Devices/Ble/CharacteristicsDiscoveredCallback.cs.meta new file mode 100644 index 00000000..9ca5c131 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/CharacteristicsDiscoveredCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 18b405762349d704d807b732d2ddb8b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Commands.meta b/Assets/Scripts/Devices/Ble/Commands.meta new file mode 100644 index 00000000..6da855f4 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Commands.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b91b6f3c17790a0429113c8b8cba4da1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Commands/CommandResponseCode.cs b/Assets/Scripts/Devices/Ble/Commands/CommandResponseCode.cs new file mode 100644 index 00000000..338b40fd --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Commands/CommandResponseCode.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Commands +{ + public enum CommandResponseCode + { + // Token: 0x04000FEB RID: 4075 + Success = 1, + // Token: 0x04000FEC RID: 4076 + NotSupported, + // Token: 0x04000FED RID: 4077 + InvalidParameter, + // Token: 0x04000FEE RID: 4078 + OperationFailed, + // Token: 0x04000FEF RID: 4079 + UnexpectedResult, + // Token: 0x04000FF0 RID: 4080 + TypeMismatch, + // Token: 0x04000FF1 RID: 4081 + Expired + } +} diff --git a/Assets/Scripts/Devices/Ble/Commands/CommandResponseCode.cs.meta b/Assets/Scripts/Devices/Ble/Commands/CommandResponseCode.cs.meta new file mode 100644 index 00000000..670df178 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Commands/CommandResponseCode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 49da5bf4f261fb04b927a90f0e1dd85b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Devices.meta b/Assets/Scripts/Devices/Ble/Devices.meta new file mode 100644 index 00000000..a565efe4 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Devices.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 925f23e73bb082b4f8420a22aa1a96e6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Devices/CyclingPower.cs b/Assets/Scripts/Devices/Ble/Devices/CyclingPower.cs new file mode 100644 index 00000000..bbfafbd1 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Devices/CyclingPower.cs @@ -0,0 +1,52 @@ +using Assets.Scripts.Ble; +using Assets.Scripts.Devices.Ant.Interfaces; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Devices.Ble.Devices +{ + public class CyclingPower : BleDevice, IPowerDevice + { + private List Services; + public CyclingPower(BlePeripheralInfo peripheralInfo, BleWinHwInterface bleWinHwInterface) : base(peripheralInfo, bleWinHwInterface, Ant.SensorType.Power) + { + bleWinHwInterface.CharacteristicReadEvent += CharacteristicReadMainCallback; + } + + public int Power { get => 999; set => throw new NotImplementedException(); } + + protected override void CreateServices(List discoveredServices) + { + this.Services = discoveredServices; + + foreach (var service in this.Services) + { + hwInterface.DiscoverCharacteristic(service, (hwInterface, service1, response) => + { + foreach (var character in response.Data) + { + if (character.MatchGuid(ServiceUuids.Characteristics.CyclingPowerMeasurement)) + { + Debug.Log("功率功能"); + + this.hwInterface.SubscribeCharacteristic(character, (hw, cha, res) => + { + Debug.Log("1111111111111111111111"); + }); + } + } + }); + } + } + + + private void CharacteristicReadMainCallback(BleWinHwInterface hwInterface, BleCharacteristicInfo characteristic, BleResponse response) + { + Debug.Log("main call" + string.Join(",", response.Data)); + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Devices/CyclingPower.cs.meta b/Assets/Scripts/Devices/Ble/Devices/CyclingPower.cs.meta new file mode 100644 index 00000000..28fd3a11 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Devices/CyclingPower.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1bfee528ff9d5854a87190f63ce65ee6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Devices/Ftms.cs b/Assets/Scripts/Devices/Ble/Devices/Ftms.cs new file mode 100644 index 00000000..141fbcfc --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Devices/Ftms.cs @@ -0,0 +1,26 @@ +using Assets.Scripts.Ble; +using Assets.Scripts.Devices.Ant.Interfaces; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices.Ble.Devices +{ + public class Ftms : BleDevice, IPowerDevice + { + + public Ftms(BlePeripheralInfo peripheralInfo, BleWinHwInterface bleWinHwInterface) :base(peripheralInfo, bleWinHwInterface, Ant.SensorType.Trainer) + { + + } + + public int Power { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + protected override void CreateServices(List discoveredServices) + { + throw new NotImplementedException(); + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Devices/Ftms.cs.meta b/Assets/Scripts/Devices/Ble/Devices/Ftms.cs.meta new file mode 100644 index 00000000..943c760b --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Devices/Ftms.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c3826d0749b3b743876392548083207 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Devices/HeartRate.cs b/Assets/Scripts/Devices/Ble/Devices/HeartRate.cs new file mode 100644 index 00000000..437e3798 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Devices/HeartRate.cs @@ -0,0 +1,62 @@ +using Assets.Scripts.Ble; +using Assets.Scripts.Devices.Ant.Interfaces; +using Assets.Scripts.Devices.Ble.Characteristic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Devices.Ble.Devices +{ + public class HeartRate : BleDevice, IHeartRateDevice + { + int IHeartRateDevice.HeartRate { get => heartRateMeasurement.BeatsPerMinute; set => throw new NotImplementedException(); } + + private List Services; + private HeartRateMeasurement heartRateMeasurement; + public HeartRate(BlePeripheralInfo peripheralInfo, BleWinHwInterface bleWinHwInterface) : base(peripheralInfo, bleWinHwInterface, Ant.SensorType.HeartRate) + { + Debug.Log("创建心率设备"); + heartRateMeasurement = new HeartRateMeasurement(); + + bleWinHwInterface.CharacteristicReadEvent += CharacteristicReadMainCallback; + } + + + + protected override void CreateServices(List discoveredServices) + { + //throw new NotImplementedException(); + this.Services = discoveredServices; + + foreach (var service in this.Services) + { + hwInterface.DiscoverCharacteristic(service, (hwInterface, service1, response) => + { + foreach (var character in response.Data) + { + if (character.MatchGuid(heartRateMeasurement.Uuid)) + { + Debug.Log("心率功能"); + + this.hwInterface.SubscribeCharacteristic(character, (hw, cha, res) => + { + Debug.Log("1111111111111111111111"); + }); + } + } + }); + } + + } + + private void CharacteristicReadMainCallback(BleWinHwInterface hwInterface, BleCharacteristicInfo characteristic, BleResponse response) + { + Debug.Log("main call" + string.Join(",", response.Data)); + heartRateMeasurement.HandleAttributeReceived(response.Data); + } + } + +} diff --git a/Assets/Scripts/Devices/Ble/Devices/HeartRate.cs.meta b/Assets/Scripts/Devices/Ble/Devices/HeartRate.cs.meta new file mode 100644 index 00000000..1291f208 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Devices/HeartRate.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b880a0d1b518452488d5e1a69d0cc1ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Extension.meta b/Assets/Scripts/Devices/Ble/Extension.meta new file mode 100644 index 00000000..ab4d04f5 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Extension.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f4e5e995271d2b04ea04a51eb6c999c5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Extension/EnumExtensions.cs b/Assets/Scripts/Devices/Ble/Extension/EnumExtensions.cs new file mode 100644 index 00000000..3d887c8a --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Extension/EnumExtensions.cs @@ -0,0 +1,17 @@ +using Assets.Scripts.Ble.Commands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices.Ble.Extension +{ + public static class EnumExtensions + { + public static CommandResponseCode ToDeviceCommandResponseType(this BleHwInterfaceError error) + { + return CommandResponseCode.OperationFailed; + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Extension/EnumExtensions.cs.meta b/Assets/Scripts/Devices/Ble/Extension/EnumExtensions.cs.meta new file mode 100644 index 00000000..fab97449 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Extension/EnumExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e363293eef5f264c9de132f6c24b01e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/HeartRate.meta b/Assets/Scripts/Devices/Ble/HeartRate.meta new file mode 100644 index 00000000..b17abb5e --- /dev/null +++ b/Assets/Scripts/Devices/Ble/HeartRate.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d9ddacaed9a7562489aa2476a0f74aca +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/HeartRate/HeartRateMeasurementValue.cs b/Assets/Scripts/Devices/Ble/HeartRate/HeartRateMeasurementValue.cs new file mode 100644 index 00000000..8dd7457b --- /dev/null +++ b/Assets/Scripts/Devices/Ble/HeartRate/HeartRateMeasurementValue.cs @@ -0,0 +1,70 @@ +using Assets.Scripts.Ble.Characteristic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.HeartRate +{ + public class HeartRateMeasurementValue : SuccessOnlyCharacteristicValue + { + private HeartRateMeasurementValue.HrmFormat Format { get; } + + // Token: 0x170005EB RID: 1515 + // (get) Token: 0x0600214D RID: 8525 RVA: 0x0008999B File Offset: 0x00087B9B + public int BeatsPerMinute { get; } + + public HeartRateMeasurementValue(byte[] data): base(ServiceUuids.Characteristics.HrMeasurement, data) + { + if(data == null || data.Length < 2) + { + throw new ArgumentException(string.Concat(new string[] + { + "Invalid data for ", + base.Id.ToString(), + " ", + (data != null) ? string.Join(",", data) : null, + "." + }), "data"); + } + HeartRateMeasurementValue.HrmFlags hrmFlags = (HeartRateMeasurementValue.HrmFlags)BitConvertHelper.ToUInt8(data, 0); + this.Format = (HrmFormat)(hrmFlags.HasFlag(HeartRateMeasurementValue.HrmFlags.Format) ? 1 : 0); + if (this.Format == HeartRateMeasurementValue.HrmFormat.Short) + { + this.BeatsPerMinute = BitConvertHelper.ToUInt8(data, 1); + return; + } + if(data.Length < 3) + { + throw new ArgumentException("数据出错"); + } + this.BeatsPerMinute = BitConvertHelper.ToUInt16(data, 1); + } + + + [Flags] + private enum HrmFlags + { + // Token: 0x040029D0 RID: 10704 + Format = 1, + // Token: 0x040029D1 RID: 10705 + SensorContactStatus1 = 2, + // Token: 0x040029D2 RID: 10706 + SensorContactStatus2 = 4, + // Token: 0x040029D3 RID: 10707 + Energy = 8, + // Token: 0x040029D4 RID: 10708 + RR = 16 + } + + // Token: 0x02000921 RID: 2337 + private enum HrmFormat + { + // Token: 0x040029D6 RID: 10710 + Short, + // Token: 0x040029D7 RID: 10711 + Long + } + } +} diff --git a/Assets/Scripts/Devices/Ble/HeartRate/HeartRateMeasurementValue.cs.meta b/Assets/Scripts/Devices/Ble/HeartRate/HeartRateMeasurementValue.cs.meta new file mode 100644 index 00000000..e4b82809 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/HeartRate/HeartRateMeasurementValue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3668128267e8c52448ad703e31f8bd88 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/HeartRate/HeartRateService.cs b/Assets/Scripts/Devices/Ble/HeartRate/HeartRateService.cs new file mode 100644 index 00000000..dc9f5fef --- /dev/null +++ b/Assets/Scripts/Devices/Ble/HeartRate/HeartRateService.cs @@ -0,0 +1,60 @@ +using Assets.Scripts.Ble.Commands; +using Assets.Scripts.Ble.Service; +using Assets.Scripts.Commands; +using Assets.Scripts.Devices.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Ble.HeartRate +{ + public class HeartRateService : BleService + { + private BleCharacteristicInfo heartRateCharacteristic; + + public HeartRateService(BleServiceInfo serviceInfo, BleWinHwInterface bleWinHwInterface) :base(serviceInfo, bleWinHwInterface) + { + + } + + protected override void CharacteristicsDiscovered(BleResponse> response) + { + foreach (var item in response.Data) + { + if (item.MatchGuid(ServiceUuids.Characteristics.HrMeasurement)) + { + this.heartRateCharacteristic = item; + base.SubscribeCharacteristic(item, HrmCharacteristicSubscribed, HrmCharacteristicRead); + } + if (item.MatchGuid(ServiceUuids.Characteristics.BodySensorLocation)) + { + + } + } + } + + private void HrmCharacteristicSubscribed(BleWinHwInterface winHwInterface, BleCharacteristicInfo characteristic, BleResponse response) + { + + } + + private void HrmCharacteristicRead(BleWinHwInterface winHwInterface, BleCharacteristicInfo characteristic, BleResponse response) + { + HeartRateMeasurementValue heartRateMeasurementValue; + if(base.CheckCharacteristicResponse(characteristic, response, (BleCharacteristicInfo info, BleResponse bleResponse) => new HeartRateMeasurementValue(bleResponse.Data), out heartRateMeasurementValue) != CommandResponseCode.Success) + { + return; + } + + //Debug.Log("心率:"+heartRateMeasurementValue.BeatsPerMinute); + } + + protected override BleCharacteristicInfo GetCharacteristicForCommandType(CommandType type) + { + return null; + } + } +} diff --git a/Assets/Scripts/Devices/Ble/HeartRate/HeartRateService.cs.meta b/Assets/Scripts/Devices/Ble/HeartRate/HeartRateService.cs.meta new file mode 100644 index 00000000..fea5edb0 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/HeartRate/HeartRateService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d36bb0439a6a6c142af91aa05a67a7e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/PeripheralDisconnectedCallback.cs b/Assets/Scripts/Devices/Ble/PeripheralDisconnectedCallback.cs new file mode 100644 index 00000000..aefb5811 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/PeripheralDisconnectedCallback.cs @@ -0,0 +1,11 @@ +using Assets.Scripts.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices.Ble +{ + public delegate void PeripheralDisconnectedCallback(BleWinHwInterface hwInterface, BlePeripheralInfo peripheral, BleResponse response); +} diff --git a/Assets/Scripts/Devices/Ble/PeripheralDisconnectedCallback.cs.meta b/Assets/Scripts/Devices/Ble/PeripheralDisconnectedCallback.cs.meta new file mode 100644 index 00000000..7b270e3c --- /dev/null +++ b/Assets/Scripts/Devices/Ble/PeripheralDisconnectedCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 267fe052d333eec4db01b694b8d68180 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Scan.meta b/Assets/Scripts/Devices/Ble/Scan.meta new file mode 100644 index 00000000..2c283a69 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Scan.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 42dcd8e06e630564bb971b809b953305 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Scan/BleAdvertisementInfo.cs b/Assets/Scripts/Devices/Ble/Scan/BleAdvertisementInfo.cs new file mode 100644 index 00000000..b66dcdf9 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Scan/BleAdvertisementInfo.cs @@ -0,0 +1,40 @@ +using Assets.Scripts.Devices.Ant; +using Assets.Scripts.Devices.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Scan +{ + /// + /// 广播数据 + /// + public class BleAdvertisementInfo + { + public BlePeripheralInfo Peripheral { get; } + public int Rssi { get; } + + public SensorType SensorType { get; } + public BleAdvertisementInfo(BlePeripheralInfo peripheral, int rssi, bool connectible, List services, byte[] manufactureData, SensorType sensor) + { + this.Peripheral = peripheral; + this.Rssi = rssi; + //this.Connectible = connectible; + this.services = services; + //this.ManufactureData = manufactureData; + + this.SensorType = sensor; + } + + private readonly List services; + public IReadOnlyList Services + { + get + { + return this.services; + } + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Scan/BleAdvertisementInfo.cs.meta b/Assets/Scripts/Devices/Ble/Scan/BleAdvertisementInfo.cs.meta new file mode 100644 index 00000000..acc74136 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Scan/BleAdvertisementInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4809c38d934e9a247a4e70bbcf6fd67b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Service.meta b/Assets/Scripts/Devices/Ble/Service.meta new file mode 100644 index 00000000..06b84002 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Service.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ffc07810002114f4e845efdbc1f8f47e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Service/BleService.cs b/Assets/Scripts/Devices/Ble/Service/BleService.cs new file mode 100644 index 00000000..40a0f123 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Service/BleService.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Assets.Scripts.Ble.Characteristic; +using Assets.Scripts.Ble.Commands; +using Assets.Scripts.Commands; +using Assets.Scripts.Devices.Ble; +using Assets.Scripts.Devices.Ble.Extension; +using UnityEngine; + +namespace Assets.Scripts.Ble.Service +{ + public abstract class BleService + { + private BleWinHwInterface hwInterface; + private BleServiceInfo serviceInfo; + + private List characteristics; + private readonly Dictionary>> registeredCharacteristicReadEvents = new Dictionary>>(); + + public IReadOnlyList Characteristics + { + get + { + return this.characteristics; + } + } + + private CommandType supportedCommands; + + // Token: 0x0400110D RID: 4365 + private CommandType tempCommands; + + public CommandType SupportedCommands + { + get + { + return this.supportedCommands; + } + private set + { + if (this.supportedCommands.HasFlag(value)) + { + return; + } + this.supportedCommands |= value; + } + } + + + public BleService(BleServiceInfo serviceInfo, BleWinHwInterface bleHwInterface) + { + this.hwInterface = bleHwInterface; + this.serviceInfo = serviceInfo; + + this.hwInterface.CharacteristicReadEvent += CharacteristicReadMainCallback; + } + + private void CharacteristicReadMainCallback(BleWinHwInterface hwInterface, BleCharacteristicInfo characteristic, BleResponse response) + { + //Debug.Log("read main callback"); + if (this.registeredCharacteristicReadEvents.ContainsKey(characteristic.Id) && characteristic.Service.Equals(this.serviceInfo)) + { + //Debug.Log("read main callback 1111111111111"); + this.registeredCharacteristicReadEvents[characteristic.Id](hwInterface, characteristic, response); + } + } + + public void DiscoverCharacteristics(BleResponse> scanCharacteristicsResponse = null) + { + if (scanCharacteristicsResponse == null) + { + Debug.Log("ccc ======================================== "+this.serviceInfo.Peripheral.Name); + this.hwInterface.DiscoverCharacteristic(this.serviceInfo, this.CheckCharacteristicDiscoveredResponse); + return; + } + this.CheckCharacteristicDiscoveredResponse(this.hwInterface, this.serviceInfo, scanCharacteristicsResponse); + } + + private void CheckCharacteristicDiscoveredResponse(BleWinHwInterface hwInterface, BleServiceInfo service, BleResponse> response) + { + if (!service.Equals(this.serviceInfo)) + { + return; + } + if (!response.IsSuccess) + { + return; + } + //if(response.Data) + + this.characteristics = response.Data; + + this.CharacteristicsDiscovered(response); + } + + protected abstract void CharacteristicsDiscovered(BleResponse> response); + + protected void SubscribeCharacteristic(BleCharacteristicInfo characteristic, Action notificationCallback, + Action> readCallback) + { + this.hwInterface.SubscribeCharacteristic(characteristic, (hw, info, response) => + { + if (readCallback != null) + { + this.registeredCharacteristicReadEvents[characteristic.Id] = readCallback; + Debug.Log("添加callback"); + } + + if (notificationCallback == null) + { + return; + } + notificationCallback.Invoke(hw, info, response); + }); + } + + protected Commands.CommandResponseCode CheckCharacteristicResponse(BleCharacteristicInfo characteristic, BleResponse response, + Func, TResponseValue> valueCreator, out TResponseValue value) where TResponseValue : BaseCharacteristicValue + { + value = default(TResponseValue); + + if (!response.IsSuccess) + { + return response.Error.ToDeviceCommandResponseType(); + } + + try + { + value = valueCreator(characteristic, response); + } + catch (Exception ex) + { + + throw; + } + + CommandResponseCode commandResponseCode = value.ToDeviceCommandResponseCode(); + + return commandResponseCode; + } + + protected void AddSupportedCommand(CommandType newCommands) + { + this.SupportedCommands |= newCommands; + + if (newCommands.HasFlag(CommandType.SetSimParameters)) + { + + + } + + } + + + + protected void ReadCharacteristic(BleCharacteristicInfo characteristic, CharacteristicReadCallback callback) + { + this.hwInterface.ReadCharacteristic(characteristic, callback); + } + + protected BleCharacteristicInfo CheckServiceCanSendCommand(Command command) + { + CommandType type = command.Type; + //if (!this.SupportedCommands(type)) + //{ + + //} + + BleCharacteristicInfo characteristicForCommandType = this.GetCharacteristicForCommandType(type); + + return characteristicForCommandType; + } + + + protected abstract BleCharacteristicInfo GetCharacteristicForCommandType(CommandType type); + + public bool SupportsCommands(CommandType flags) + { + return this.SupportedCommands.HasFlag(flags); + } + + public virtual bool SendCommand(Command command) + { + return false; + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Service/BleService.cs.meta b/Assets/Scripts/Devices/Ble/Service/BleService.cs.meta new file mode 100644 index 00000000..df8b2a9b --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Service/BleService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 927b28f8d3c950b4793567e37f28d27c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win.meta b/Assets/Scripts/Devices/Ble/Win.meta new file mode 100644 index 00000000..1b572306 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bee6ebee782762641bf45036d063e6d5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/BleDeviceProxy.cs b/Assets/Scripts/Devices/Ble/Win/BleDeviceProxy.cs new file mode 100644 index 00000000..498a4540 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/BleDeviceProxy.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + /// + /// rouvy里的 WinBlePeripheralInfo类 + /// + public class BleDeviceProxy + { + public string Address { get; set; } + + public string Name { get; set; } + + public int Rssi { get; set; } + + public List Services { get; set; } + + public BleDeviceProxy() + { + + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/BleDeviceProxy.cs.meta b/Assets/Scripts/Devices/Ble/Win/BleDeviceProxy.cs.meta new file mode 100644 index 00000000..b247debe --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/BleDeviceProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 33bb64404b5022f4d888be258a6b970a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs b/Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs new file mode 100644 index 00000000..e9a623e5 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs @@ -0,0 +1,409 @@ +using Assets.Scripts.Ble.Scan; +using Assets.Scripts.Ble.Win; +using Assets.Scripts.Devices.Ant; +using Assets.Scripts.Devices.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Ble +{ + public sealed class BleWinHwInterface + { + private static BleWinHwInterface hwInterface; + private WclBleMainThread wclBleMainThread; + + private readonly Dictionary pCache = new Dictionary(); + + private Action _discoveredCallback; + + private Dictionary> callbacks = new Dictionary>(); + private Dictionary>>> servicesCallbacks = new Dictionary>>>(); + //private Dictionary>>> characteristicsCallbacks = new Dictionary>>>(); + private Dictionary> characteristicNotificationCallbacks = new Dictionary>(); + private Dictionary characteristicReadCallbacks = new Dictionary(); + private Dictionary characteristicsDiscoveredCallbacks = new Dictionary(); + + + private CharacteristicReadCallback characteristicReadEvent; + public event CharacteristicReadCallback CharacteristicReadEvent + { + add + { + this.characteristicReadEvent += value; + } + remove + { + this.characteristicReadEvent -= value; + } + } + + private BluetoothStateChangedCallback bluetoothStateChanged; + public event BluetoothStateChangedCallback BluetoothStateChangedEvent + { + add + { + this.bluetoothStateChanged += value; + } + remove + { + this.bluetoothStateChanged -= value; + } + } + + private BleState nativeState; + public BleState BleState + { + get + { + return this.nativeState; + } + private set + { + if(this.nativeState != value) + { + this.nativeState = value; + this.bluetoothStateChanged?.Invoke(this, this.nativeState); + } + } + } + + private PeripheralDisconnectedCallback peripheralDisconnectedEvent; + public event PeripheralDisconnectedCallback PeripheralDisconnectedEvent + { + add + { + this.peripheralDisconnectedEvent += value; + } + remove + { + this.peripheralDisconnectedEvent -= value; + } + } + + private BleWinHwInterface() + { + wclBleMainThread = new WclBleMainThread(); + wclBleMainThread.ManagerStatusChanged += ManagerStatusChanged; + wclBleMainThread.ScanInfoReceived += WatcherScanInfoReceived; + //wclBleMainThread.gatt + wclBleMainThread.Start(); + + } + + private void WatcherScanInfoReceived(WclBleMainThread sender, long address, string name, int rssi, CPPBridge.WclBleAdvertisementType packetType, Guid? service) + { + //Debug.Log($"address:{ address }, name:{ name }, service:{ (service == null ? "" : service.Value.ToString()) }"); + if (!string.IsNullOrWhiteSpace(name)) + { + if (pCache.ContainsKey(address.ToString())) + { + ((pCache[address.ToString()].Peripheral) as WinBlePeripheralInfo).SetName(name); + } + } + //Debug.Log("service:" + service.ToString()+",name:" + name); + if (service.HasValue && ServiceUuids.Services.Select(s => s.IdGuid).Any(x => x.Equals(service.Value))) + { + SensorType sensor = SensorType.None; + List services = null; + if (service != null) + { + + services = new List { service.Value }; + foreach(var item in ServiceUuids.Services) + { + if(item.IdGuid != service.Value) + { + continue; + } + if(item.IdByteArray == ServiceUuids.Ftms) + { + sensor = SensorType.Trainer; + } + else if(item.IdByteArray == ServiceUuids.HeartRate) + { + sensor = SensorType.HeartRate; + } + else if(item.IdByteArray == ServiceUuids.CyclingPower) + { + sensor = SensorType.Power; + } + } + }; + + if (!pCache.ContainsKey(address.ToString())) { + var device = new BleAdvertisementInfo(new WinBlePeripheralInfo(address.ToString(), name), rssi, true, services, null, sensor); + pCache.Add(address.ToString(), device); + + WclBleGattThread gattClient = this.SetUpGattClient(device.Peripheral); + //this.ConnectInternal(gattClient); + } + + _discoveredCallback?.Invoke(pCache[address.ToString()]); + } + } + + private WclBleGattThread SetUpGattClient(BlePeripheralInfo peripheral) + { + WclBleGattThread wclBleGattThread = this.wclBleMainThread.CreateGattThread(peripheral); + wclBleGattThread.GattConnected += this.GattConnected; + wclBleGattThread.GattDisconnected += this.GattDisconnected; + wclBleGattThread.GattServicesDiscovered += this.GattServicesDiscovered; + wclBleGattThread.GattCharacteristicsDiscovered += this.GattCharacteristicsDiscovered; + wclBleGattThread.GattCharacteristicSubscribed += this.GattCharacteristicSubscribed; + wclBleGattThread.GattCharacteristicRead += this.GattCharacteristicRead; + wclBleGattThread.GattCharacteristicWrote += this.GattCharacteristicWrote; + wclBleGattThread.GattCharacteristicChanged += this.GattCharacteristicChanged; + wclBleGattThread.Start(); + return wclBleGattThread; + } + + internal void ConnectPeripheral(BlePeripheralInfo info, Action callback) + { + this.callbacks.Add(info, callback); + WclBleGattThread wclBleGattThread = this.wclBleMainThread.GetGattThread(info); + if(wclBleGattThread == null) + { + wclBleGattThread = this.SetUpGattClient(info); + this.ConnectInternal(wclBleGattThread); + return; + } + else + { + this.ConnectInternal(wclBleGattThread); + } + } + + private void ConnectInternal(WclBleGattThread gattClient) + { + int num = gattClient.Connect(); + Debug.Log("连接设备返回" + num); + } + + internal void DisconnectPeripheral(BlePeripheralInfo peripheral, Action callback) + { + var gattThread = this.wclBleMainThread.GetGattThread(peripheral); + if(gattThread != null) + { + this.callbacks.Remove(peripheral); + this.servicesCallbacks.Remove(peripheral); + this.characteristicNotificationCallbacks.Remove(peripheral); + + gattThread.Discounect(); + + callback?.Invoke(); + } + } + + + public static BleWinHwInterface GetInterface() + { + if(hwInterface == null) + { + hwInterface = new BleWinHwInterface(); + } + + return hwInterface; + } + + public void StartScan(Action discoveredCallBack) + { + _discoveredCallback = discoveredCallBack; + this.wclBleMainThread.StartWatcher(); + } + + private void ManagerStatusChanged(WclBleMainThread sender, WclBleManagerStatus status) + { + this.BleState = BleWinHwInterface.StateFromNativeState(status); + Debug.Log("win hw:" + status); + + } + + private void GattConnected(WclBleGattThread gattClient, BleResponse response) + { + Debug.Log($"gatt connected { response.ToString() }"); + this.callbacks[gattClient.Peripheral].Invoke(this, gattClient.Peripheral, response); + } + + private void GattDisconnected(WclBleGattThread gattClient, BleResponse response) + { + Debug.Log("gatt disconnected"); + } + private void GattServicesDiscovered(WclBleGattThread gattClient, BleResponse> response) + { + Debug.Log("services discovered"); + //this.callbacks[gattClient.Peripheral].Invoke(this, gattClient.Peripheral, response); + + foreach (var item in response.Data) + { + Debug.Log(item.ToString()); + } + + if (this.servicesCallbacks.ContainsKey(gattClient.Peripheral)) + { + this.servicesCallbacks[gattClient.Peripheral].Invoke(this, gattClient.Peripheral, response); + } + } + + private void GattCharacteristicsDiscovered(WclBleGattThread gattClient, BleServiceInfo service, BleResponse> response) + { + Debug.Log("characteristics discovered"); + + if (this.characteristicsDiscoveredCallbacks.ContainsKey(service)) + { + this.characteristicsDiscoveredCallbacks[service].Invoke(this, service, response); + } + } + + private void GattCharacteristicSubscribed(WclBleGattThread gattClient, BleCharacteristicInfo characteristic, BleResponse response) + { + Debug.Log("characteristics subscribed"); + if (this.characteristicNotificationCallbacks.ContainsKey(gattClient.Peripheral)) + { + this.characteristicNotificationCallbacks[gattClient.Peripheral].Invoke(this, characteristic, response); + } + } + private void GattCharacteristicRead(WclBleGattThread gattClient, BleCharacteristicInfo characteristic, BleResponse response) + { + Debug.Log("characteristic read"); + + if (this.characteristicReadCallbacks.ContainsKey(characteristic)) + { + this.characteristicReadCallbacks[characteristic].Invoke(this, characteristic, response); + this.characteristicReadCallbacks.Remove(characteristic); + } + + this.characteristicReadEvent.Invoke(this, characteristic, response); + } + + private void GattCharacteristicWrote(WclBleGattThread gattClient, BleCharacteristicInfo characteristic, BleResponse response) + { + Debug.Log("characteristic wrote"); + } + private void GattCharacteristicChanged(WclBleGattThread gattClient, BleCharacteristicInfo characteristic, BleResponse response) + { + Debug.Log("characteristic changed"); + if(this.wclBleMainThread.GetGattThread(characteristic.Peripheral) != null) + { + this.characteristicReadEvent.Invoke(this, characteristic, response); + } + } + + public void DiscoverServices(BlePeripheralInfo peripheral, Action>> callback) + { + WclBleGattThread gattThread = this.wclBleMainThread.GetGattThread(peripheral); + if(gattThread == null) + { + return; + } + + this.servicesCallbacks.Add(peripheral, callback); + int num = gattThread.DiscoverServices(); + if (WclBleErrors.IsSuccessCode(num)) + { + return; + } + + + BleResponse> response = new BleResponse> + { + IsSuccess = false, + Error = new BleHwInterfaceError(new int?(num), "WclBleGattClientErrorDomain", string.Format("Error discovering services - {0}", num)) + }; + this.GattServicesDiscovered(gattThread, response); + } + + public void DiscoverCharacteristic(BleServiceInfo service, CharacteristicsDiscoveredCallback callback) + { + WclBleGattThread gattThread = this.wclBleMainThread.GetGattThread(service.Peripheral); + if(gattThread == null) + { + return; + } + this.characteristicsDiscoveredCallbacks.Add(service, callback); + int num = gattThread.DiscoverCharacteristics(service); + if (WclBleErrors.IsSuccessCode(num)) + { + return; + } + BleResponse> response = new BleResponse> + { + IsSuccess = false, + Error = new BleHwInterfaceError(new int?(num), "WclBleGattClientErrorDomain", string.Format("Error discovering characteristics - {0}", num)) + }; + this.GattCharacteristicsDiscovered(gattThread, service, response); + } + + public void SubscribeCharacteristic(BleCharacteristicInfo characteristic, Action callback) + { + WclBleGattThread gattThread = this.wclBleMainThread.GetGattThread(characteristic.Peripheral); + + this.characteristicNotificationCallbacks.Add(gattThread.Peripheral, callback); + int num = gattThread.SubscribeCharacteristic(characteristic); + if (WclBleErrors.IsSuccessCode(num)) + { + return; + } + BleResponse> response = new BleResponse> + { + IsSuccess = false, + Error = new BleHwInterfaceError(new int?(num), "WclBleGattClientErrorDomain", string.Format("Error subscribing characteristic - {0}", num)) + }; + this.GattCharacteristicSubscribed(gattThread, characteristic, response); + } + + public void Dispose() + { + this.wclBleMainThread.Dispose(); + this.wclBleMainThread = null; + hwInterface = null; + } + + public void ReadCharacteristic(BleCharacteristicInfo characteristic, CharacteristicReadCallback callback) + { + WclBleGattThread gattThread = this.wclBleMainThread.GetGattThread(characteristic.Peripheral); + if(gattThread == null) + { + return; + } + this.characteristicReadCallbacks.Add(characteristic, callback); + int num = gattThread.ReadCharacteristicValue(characteristic); + if (WclBleErrors.IsSuccessCode(num)) + { + return; + } + } + + private static BleState StateFromNativeState(WclBleManagerStatus status) + { + switch (status) + { + case WclBleManagerStatus.RadioOff: + return BleState.Off; + case WclBleManagerStatus.RadioOn: + return BleState.On; + case WclBleManagerStatus.Unknown: + return BleState.Unknown; + default: + return BleState.Unavailable; + } + } + + private class WinBlePeripheralInfo : BlePeripheralInfo + { + // Token: 0x06003F35 RID: 16181 RVA: 0x000E9FBF File Offset: 0x000E81BF + public WinBlePeripheralInfo(string address, string name) : base(address, name) + { + } + + // Token: 0x06003F36 RID: 16182 RVA: 0x000E9FC9 File Offset: 0x000E81C9 + public void SetName(string name) + { + base.Name = name; + } + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs.meta b/Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs.meta new file mode 100644 index 00000000..3fdd7831 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8749d096f14d0ea44ad8ab90a45d70f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge.meta b/Assets/Scripts/Devices/Ble/Win/CPPBridge.meta new file mode 100644 index 00000000..577cbda2 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a5379f968d8a33a4fa0f222d169164d4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristic.cs b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristic.cs new file mode 100644 index 00000000..0178f415 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristic.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Win.CPPBridge +{ + [StructLayout(LayoutKind.Sequential, Pack = 1)] + internal struct GattCharacteristic + { + // Token: 0x04001350 RID: 4944 + [MarshalAs(UnmanagedType.U2)] + public ushort ServiceHandle; + + // Token: 0x04001351 RID: 4945 + public GattUuid Uuid; + + // Token: 0x04001352 RID: 4946 + [MarshalAs(UnmanagedType.U2)] + public ushort Handle; + + // Token: 0x04001353 RID: 4947 + [MarshalAs(UnmanagedType.U2)] + public ushort ValueHandle; + + // Token: 0x04001354 RID: 4948 + [MarshalAs(UnmanagedType.Bool)] + public bool IsBroadcastable; + + // Token: 0x04001355 RID: 4949 + [MarshalAs(UnmanagedType.Bool)] + public bool IsReadable; + + // Token: 0x04001356 RID: 4950 + [MarshalAs(UnmanagedType.Bool)] + public bool IsWritable; + + // Token: 0x04001357 RID: 4951 + [MarshalAs(UnmanagedType.Bool)] + public bool IsWritableWithoutResponse; + + // Token: 0x04001358 RID: 4952 + [MarshalAs(UnmanagedType.Bool)] + public bool IsSignedWritable; + + // Token: 0x04001359 RID: 4953 + [MarshalAs(UnmanagedType.Bool)] + public bool IsNotifiable; + + // Token: 0x0400135A RID: 4954 + [MarshalAs(UnmanagedType.Bool)] + public bool IsIndicatable; + + // Token: 0x0400135B RID: 4955 + [MarshalAs(UnmanagedType.Bool)] + public bool HasExtendedProperties; + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristic.cs.meta b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristic.cs.meta new file mode 100644 index 00000000..39e293f7 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristic.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7e3cd838ef790974db97b48787131436 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristics.cs b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristics.cs new file mode 100644 index 00000000..c0887ecd --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristics.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Win.CPPBridge +{ + [StructLayout(LayoutKind.Sequential, Pack = 1)] + internal struct GattCharacteristics + { + // Token: 0x0400135C RID: 4956 + [MarshalAs(UnmanagedType.U1)] + public byte Count; + + // Token: 0x0400135D RID: 4957 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)] + public GattCharacteristic[] Chars; + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristics.cs.meta b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristics.cs.meta new file mode 100644 index 00000000..9234834f --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattCharacteristics.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 34261dc02869ee243a7168adabe60fc9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattService.cs b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattService.cs new file mode 100644 index 00000000..671acdb7 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattService.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Win.CPPBridge +{ + [StructLayout(LayoutKind.Sequential, Pack = 1)] + internal struct GattService + { + // Token: 0x0400135E RID: 4958 + public GattUuid Uuid; + + // Token: 0x0400135F RID: 4959 + [MarshalAs(UnmanagedType.U2)] + public ushort Handle; + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattService.cs.meta b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattService.cs.meta new file mode 100644 index 00000000..8ffc3239 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2daabe73d2950c243a1a6a872bd74445 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattServices.cs b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattServices.cs new file mode 100644 index 00000000..dc545bd2 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattServices.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Win.CPPBridge +{ + [StructLayout(LayoutKind.Sequential, Pack = 1)] + internal struct GattServices + { + // Token: 0x04001360 RID: 4960 + [MarshalAs(UnmanagedType.U1)] + public byte Count; + + // Token: 0x04001361 RID: 4961 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)] + public GattService[] Services; + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattServices.cs.meta b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattServices.cs.meta new file mode 100644 index 00000000..7c3ded3f --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattServices.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb895de0d5e252c4e9cf793690ddf39c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuid.cs b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuid.cs new file mode 100644 index 00000000..63fb41d7 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuid.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Win.CPPBridge +{ + [StructLayout(LayoutKind.Sequential, Pack = 1)] + internal struct GattUuid + { + // Token: 0x06002139 RID: 8505 RVA: 0x000896C8 File Offset: 0x000878C8 + public override string ToString() + { + if (!this.IsShortUuid) + { + return string.Format("{0:D}", this.LongUuid); + } + return string.Format("0x{0:X}", this.ShortUuid); + } + + // Token: 0x04001362 RID: 4962 + [MarshalAs(UnmanagedType.Bool)] + public bool IsShortUuid; + + // Token: 0x04001363 RID: 4963 + [MarshalAs(UnmanagedType.U2)] + public ushort ShortUuid; + + // Token: 0x04001364 RID: 4964 + public Guid LongUuid; + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuid.cs.meta b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuid.cs.meta new file mode 100644 index 00000000..3de27e38 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuid.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 980c29814813f4c419759b2b0f6158eb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuidExtension.cs b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuidExtension.cs new file mode 100644 index 00000000..dd8965f8 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuidExtension.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Win.CPPBridge +{ + internal static class GattUuidExtension + { + // Token: 0x0600213A RID: 8506 RVA: 0x000896FD File Offset: 0x000878FD + public static Guid WclShortGuidToGuid(this ushort shortUuid) + { + return new Guid("0000XXXX-0000-1000-8000-00805F9B34FB".Replace("XXXX", shortUuid.ToString("X4"))); + } + + // Token: 0x0600213B RID: 8507 RVA: 0x0008971F File Offset: 0x0008791F + public static Guid WclGuidToNormalizedGuid(this GattUuid uuid) + { + if (uuid.IsShortUuid) + { + return new Guid("0000XXXX-0000-1000-8000-00805F9B34FB".Replace("XXXX", uuid.ShortUuid.ToString("X4"))); + } + return uuid.LongUuid; + } + + // Token: 0x04001365 RID: 4965 + public const string GuidTemplate = "0000XXXX-0000-1000-8000-00805F9B34FB"; + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuidExtension.cs.meta b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuidExtension.cs.meta new file mode 100644 index 00000000..d4fc0e46 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/GattUuidExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9a96dd52c07e9f749806d13f85953f1c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/WCL_NOTIFY_EVENT.cs b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WCL_NOTIFY_EVENT.cs new file mode 100644 index 00000000..2279053c --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WCL_NOTIFY_EVENT.cs @@ -0,0 +1,8 @@ +using System; +using System.Runtime.InteropServices; + +namespace Assets.Scripts.Ble.CPPBridge +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = false)] + internal delegate void WCL_NOTIFY_EVENT([MarshalAs(UnmanagedType.SysInt)][In] IntPtr sender); +} diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/WCL_NOTIFY_EVENT.cs.meta b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WCL_NOTIFY_EVENT.cs.meta new file mode 100644 index 00000000..dbf2d834 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WCL_NOTIFY_EVENT.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 857859a8d81c3474d98b6f9a08158d1c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleAdvertisementType.cs b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleAdvertisementType.cs new file mode 100644 index 00000000..4e6a5bac --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleAdvertisementType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.CPPBridge +{ + internal enum WclBleAdvertisementType + { + // Token: 0x0400136D RID: 4973 + ConnectableUndirected, + // Token: 0x0400136E RID: 4974 + ConnectableDirected, + // Token: 0x0400136F RID: 4975 + ScannableUndirected, + // Token: 0x04001370 RID: 4976 + NonConnectableUndirected, + // Token: 0x04001371 RID: 4977 + ScanResponse, + // Token: 0x04001372 RID: 4978 + Unknown + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleAdvertisementType.cs.meta b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleAdvertisementType.cs.meta new file mode 100644 index 00000000..6813d51d --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleAdvertisementType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: da17e15eaae28fb4aaa037e484e6563b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleGattClientState.cs b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleGattClientState.cs new file mode 100644 index 00000000..c371ed1b --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleGattClientState.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Win.CPPBridge +{ + internal enum WclBleGattClientState + { + // Token: 0x04001374 RID: 4980 + Disconnected, + // Token: 0x04001375 RID: 4981 + Preparing, + // Token: 0x04001376 RID: 4982 + Connecting, + // Token: 0x04001377 RID: 4983 + Connected, + // Token: 0x04001378 RID: 4984 + Disconnecting + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleGattClientState.cs.meta b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleGattClientState.cs.meta new file mode 100644 index 00000000..b2b92363 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/CPPBridge/WclBleGattClientState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0ba37be1c32d2744fb72633ab646ca6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/GattConnected.cs b/Assets/Scripts/Devices/Ble/Win/GattConnected.cs new file mode 100644 index 00000000..c7d4da72 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/GattConnected.cs @@ -0,0 +1,11 @@ +using Assets.Scripts.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices.Ble.Win +{ + internal delegate void GattConnected(WclBleGattThread gatt, BleResponse response); +} diff --git a/Assets/Scripts/Devices/Ble/Win/GattConnected.cs.meta b/Assets/Scripts/Devices/Ble/Win/GattConnected.cs.meta new file mode 100644 index 00000000..b1cf5251 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/GattConnected.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4daa321f84b44e14a8784f7470afefe2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/GattDisconnected.cs b/Assets/Scripts/Devices/Ble/Win/GattDisconnected.cs new file mode 100644 index 00000000..1d54c17a --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/GattDisconnected.cs @@ -0,0 +1,11 @@ +using Assets.Scripts.Devices.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Win +{ + internal delegate void GattDisconnected(WclBleGattThread gatt, BleResponse response); +} diff --git a/Assets/Scripts/Devices/Ble/Win/GattDisconnected.cs.meta b/Assets/Scripts/Devices/Ble/Win/GattDisconnected.cs.meta new file mode 100644 index 00000000..a3b6e54c --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/GattDisconnected.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d6d9e75965935a47a46eb30e0faf550 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/GattServicesDiscovered.cs b/Assets/Scripts/Devices/Ble/Win/GattServicesDiscovered.cs new file mode 100644 index 00000000..c39ed4dd --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/GattServicesDiscovered.cs @@ -0,0 +1,11 @@ +using Assets.Scripts.Devices.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Win +{ + internal delegate void GattServicesDiscovered(WclBleGattThread gatt, BleResponse> response); +} diff --git a/Assets/Scripts/Devices/Ble/Win/GattServicesDiscovered.cs.meta b/Assets/Scripts/Devices/Ble/Win/GattServicesDiscovered.cs.meta new file mode 100644 index 00000000..3aab0a45 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/GattServicesDiscovered.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d817b05c3d2f464b97cefe9f618803a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/ServiceUuid.cs b/Assets/Scripts/Devices/Ble/Win/ServiceUuid.cs new file mode 100644 index 00000000..9d29cbf4 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/ServiceUuid.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + public class ServiceUuid + { + public Guid IdGuid { get; } + + public byte[] IdByteArray { get; } + + public bool IsCycling { get; } + + public ServiceUuid(Guid idGuid, byte[] idByteArray, bool isCycling) + { + // ISSUE: reference to a compiler-generated field + this.IdByteArray = idByteArray; + // ISSUE: reference to a compiler-generated field + this.IdGuid = idGuid; + // ISSUE: reference to a compiler-generated field + this.IsCycling = isCycling; + } + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/ServiceUuid.cs.meta b/Assets/Scripts/Devices/Ble/Win/ServiceUuid.cs.meta new file mode 100644 index 00000000..2a835ce7 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/ServiceUuid.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 219f9436857f49e40a86f16c35aafca5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/ServiceUuids.cs b/Assets/Scripts/Devices/Ble/Win/ServiceUuids.cs new file mode 100644 index 00000000..ac77290a --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/ServiceUuids.cs @@ -0,0 +1,343 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + public static class ServiceUuids + { + public static readonly byte[] GenericAccessService = new byte[2] + { + (byte) 24, + (byte) 0 + }; + public static readonly byte[] DeviceInformation = new byte[2] + { + (byte) 24, + (byte) 10 + }; + public static readonly byte[] Battery = new byte[2] + { + (byte) 24, + (byte) 15 + }; + public static readonly byte[] CyclingPower = new byte[2] + { + (byte) 24, + (byte) 24 + }; + public static readonly byte[] CyclingSpeedCadence = new byte[2] + { + (byte) 24, + (byte) 22 + }; + public static readonly byte[] HeartRate = new byte[2] + { + (byte) 24, + (byte) 13 + }; + public static readonly byte[] Ftms = new byte[2] + { + (byte) 24, + (byte) 38 + }; + public static readonly byte[] KineticInRide = new byte[16] + { + (byte) 233, + (byte) 65, + (byte) 1, + (byte) 0, + (byte) 180, + (byte) 52, + (byte) 68, + (byte) 107, + (byte) 181, + (byte) 204, + (byte) 54, + (byte) 89, + (byte) 47, + (byte) 196, + (byte) 199, + (byte) 36 + }; + public static readonly byte[] KineticSmartControl = new byte[16] + { + (byte) 233, + (byte) 65, + (byte) 2, + (byte) 0, + (byte) 180, + (byte) 52, + (byte) 68, + (byte) 107, + (byte) 181, + (byte) 204, + (byte) 54, + (byte) 89, + (byte) 47, + (byte) 196, + (byte) 199, + (byte) 36 + }; + public static readonly byte[] TacxBle = new byte[16] + { + (byte) 110, + (byte) 64, + (byte) 254, + (byte) 193, + (byte) 181, + (byte) 163, + (byte) 243, + (byte) 147, + (byte) 224, + (byte) 169, + (byte) 229, + (byte) 14, + (byte) 36, + (byte) 220, + (byte) 202, + (byte) 158 + }; + public static readonly byte[] Elite = new byte[16] + { + (byte) 52, + (byte) 123, + (byte) 0, + (byte) 1, + (byte) 118, + (byte) 53, + (byte) 64, + (byte) 139, + (byte) 137, + (byte) 24, + (byte) 143, + (byte) 243, + (byte) 148, + (byte) 156, + (byte) 229, + (byte) 146 + }; + public static readonly byte[] PowerBeam = new byte[16] + { + (byte) 192, + (byte) 244, + (byte) 1, + (byte) 58, + (byte) 168, + (byte) 55, + (byte) 65, + (byte) 101, + (byte) 186, + (byte) 185, + (byte) 101, + (byte) 78, + (byte) 247, + (byte) 7, + (byte) 71, + (byte) 198 + }; + public static readonly byte[][] CyclingRelatedServices = new byte[9][] + { + ServiceUuids.CyclingPower, + ServiceUuids.CyclingSpeedCadence, + ServiceUuids.HeartRate, + ServiceUuids.KineticInRide, + ServiceUuids.KineticSmartControl, + ServiceUuids.TacxBle, + ServiceUuids.Elite, + ServiceUuids.PowerBeam, + ServiceUuids.Ftms, + }; + public static readonly IReadOnlyList Services = (IReadOnlyList)new List() + { + new ServiceUuid(new Guid("0000180A-0000-1000-8000-00805F9B34FB"), ServiceUuids.DeviceInformation, false), + new ServiceUuid(new Guid("0000180F-0000-1000-8000-00805F9B34FB"), ServiceUuids.Battery, false), + new ServiceUuid(new Guid("00001818-0000-1000-8000-00805F9B34FB"), ServiceUuids.CyclingPower, true), + new ServiceUuid(new Guid("00001816-0000-1000-8000-00805F9B34FB"), ServiceUuids.CyclingSpeedCadence, true), + new ServiceUuid(new Guid("0000180D-0000-1000-8000-00805F9B34FB"), ServiceUuids.HeartRate, true), + new ServiceUuid(new Guid("00001826-0000-1000-8000-00805F9B34FB"), ServiceUuids.Ftms, true), + new ServiceUuid(new Guid("000141e9-34b4-6b44-b5cc-36592fc4c724"), ServiceUuids.KineticInRide, true), + new ServiceUuid(new Guid("000241e9-34b4-6b44-b5cc-36592fc4c724"), ServiceUuids.KineticSmartControl, true), + new ServiceUuid(new Guid("6e40fec1-b5a3-f393-e0a9-e50e24dcca9e"), ServiceUuids.TacxBle, true), + new ServiceUuid(new Guid("01007b34-3576-8b40-8918-8ff3949ce592"), ServiceUuids.Elite, true), + new ServiceUuid(new Guid("3a01f4c0-37a8-6541-bab9-654ef70747c6"), ServiceUuids.PowerBeam, true), + }; + public static readonly IReadOnlyList CyclingServices = ServiceUuids.Services.Where(s => s.IsCycling).ToList(); + + public static ServiceUuid Get(byte[] type) + { + return ServiceUuids.Services.Single(s => s.IdByteArray == type); + } + + + public static class Characteristics + { + /// + /// Heart Rate Measurement + /// + public static Guid HrMeasurement = new Guid("00002A37-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028D4 RID: 10452 + public static Guid BodySensorLocation = new Guid("00002A38-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028D5 RID: 10453 + public static Guid CscMeasurement = new Guid("00002A5B-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028D6 RID: 10454 + public static Guid CscFeature = new Guid("00002A5C-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028D7 RID: 10455 + public static Guid SensorLocation = new Guid("00002A5D-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028D8 RID: 10456 + public static Guid ScControlPoint = new Guid("00002A55-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028D9 RID: 10457 + public static Guid CyclingPowerMeasurement = new Guid("00002A63-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028DA RID: 10458 + public static Guid CyclingPowerVector = new Guid("00002A64-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028DB RID: 10459 + public static Guid CyclingPowerFeature = new Guid("00002A65-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028DC RID: 10460 + public static Guid CyclingPowerControlPoint = new Guid("00002A66-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028DD RID: 10461 + public static Guid FitnessMachineFeature = new Guid("00002ACC-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028DE RID: 10462 + public static Guid FitnessMachineControlPoint = new Guid("00002AD9-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028DF RID: 10463 + public static Guid IndoorBikeData = new Guid("00002AD2-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028E0 RID: 10464 + public static Guid FitnessMachineStatus = new Guid("00002ADA-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028E1 RID: 10465 + public static Guid FirmwareRevision = new Guid("00002A26-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028E2 RID: 10466 + public static Guid HardwareRevision = new Guid("00002A27-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028E3 RID: 10467 + public static Guid SoftwareRevision = new Guid("00002A28-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028E4 RID: 10468 + public static Guid ManufactureNameString = new Guid("00002A29-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028E5 RID: 10469 + public static Guid ModelNumber = new Guid("00002A24-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028E6 RID: 10470 + public static Guid SerialNumber = new Guid("00002A25-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028E7 RID: 10471 + public static Guid PnPId = new Guid("00002A50-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028E8 RID: 10472 + public static Guid BatteryLevel = new Guid("00002A19-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028E9 RID: 10473 + public static Guid RscMeasurement = new Guid("00002A53-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028EA RID: 10474 + public static Guid RscFeature = new Guid("00002A54-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028EB RID: 10475 + public static Guid CycleOpsControlPoint = new Guid("CA31A533-A858-4DC7-A650-FDEB6DAD4C14"); + + // Token: 0x040028EC RID: 10476 + public static Guid CycleOpsFtmsSystemWeight = new Guid("0D18A170-5498-11E9-8647-D663BD873D93"); + + // Token: 0x040028ED RID: 10477 + public static Guid EliteBreak = new Guid("347B0010-7635-408B-8918-8FF3949CE592"); + + // Token: 0x040028EE RID: 10478 + public static Guid EliteOutOfRange = new Guid("347B0011-7635-408B-8918-8FF3949CE592"); + + // Token: 0x040028EF RID: 10479 + public static Guid EliteSystemWeight = new Guid("347B0018-7635-408B-8918-8FF3949CE592"); + + // Token: 0x040028F0 RID: 10480 + public static Guid EliteTrainerCapabilities = new Guid("347B0019-7635-408B-8918-8FF3949CE592"); + + // Token: 0x040028F1 RID: 10481 + public static Guid StagesRead = new Guid("0C46BEB0-9C22-48FF-AE0E-C6EAE1A2F4E5"); + + // Token: 0x040028F2 RID: 10482 + public static Guid StagesWrite = new Guid("0C46BEB1-9C22-48FF-AE0E-C6EAE1A2F4E5"); + + // Token: 0x040028F3 RID: 10483 + public static Guid TacxFecRead = new Guid("6E40FEC2-B5A3-F393-E0A9-E50E24DCCA9E"); + + // Token: 0x040028F4 RID: 10484 + public static Guid TacxFecWrite = new Guid("6E40FEC3-B5A3-F393-E0A9-E50E24DCCA9E"); + + // Token: 0x040028F5 RID: 10485 + public static Guid TechnoGymStSimulation = new Guid("58094966-498C-470D-8051-37E617A13895"); + + // Token: 0x040028F6 RID: 10486 + public static Guid WahooControlPoint = new Guid("A026E005-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x040028F7 RID: 10487 + public static Guid WattbikeAtomRead = new Guid("B4CC1224-BC02-4CAE-ADB9-1217AD2860D1"); + + // Token: 0x040028F8 RID: 10488 + public static Guid WattbikeAtomWrite = new Guid("B4CC1225-BC02-4CAE-ADB9-1217AD2860D1"); + + // Token: 0x040028F9 RID: 10489 + public static Guid WattbikeAtomXRead = new Guid("BABF1724-CEDB-444C-88C3-C672C7A59806"); + + // Token: 0x040028FA RID: 10490 + public static Guid WattbikeAtomXWrite = new Guid("BABF1725-CEDB-444C-88C3-C672C7A59806"); + + // Token: 0x040028FB RID: 10491 + public static Guid FitnessMachineTrainingStatus = new Guid("00002AD3-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028FC RID: 10492 + public static Guid FitnessMachineSupportedResistanceLevelRange = new Guid("00002AD6-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028FD RID: 10493 + public static Guid FitnessMachineSupportedPowerRange = new Guid("00002AD8-0000-1000-8000-00805F9B34FB"); + + // Token: 0x040028FE RID: 10494 + public static Guid GemFwUpdate = new Guid("A026E002-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x040028FF RID: 10495 + public static Guid GemFwUpdate4 = new Guid("A026E004-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x04002900 RID: 10496 + public static Guid WahooA = new Guid("A026E00A-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x04002901 RID: 10497 + public static Guid Wahoo23 = new Guid("A026E023-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x04002902 RID: 10498 + public static Guid Wahoo37 = new Guid("A026E037-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x04002903 RID: 10499 + public static Guid WahooFitnessType = new Guid("A026E01F-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x04002904 RID: 10500 + public static Guid WahooFitnessState = new Guid("A026E01E-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x04002905 RID: 10501 + public static Guid WahooFitnessStateName = new Guid("A026E020-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x04002906 RID: 10502 + public static Guid WahooFitnessMeasurement = new Guid("A026E01D-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x04002907 RID: 10503 + public static Guid WahooFitnessWorkoutProgramName = new Guid("A026E01B-0A7D-4AB3-97FA-F1500F9FEB8B"); + + // Token: 0x04002908 RID: 10504 + public static Guid WahooFitnessSensorMeasurementInput = new Guid("A026E016-0A7D-4AB3-97FA-F1500F9FEB8B"); + } + + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/ServiceUuids.cs.meta b/Assets/Scripts/Devices/Ble/Win/ServiceUuids.cs.meta new file mode 100644 index 00000000..f3ac9e89 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/ServiceUuids.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c595e469b7e8ef744bf1d32496bbb15d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleErrors.cs b/Assets/Scripts/Devices/Ble/Win/WclBleErrors.cs new file mode 100644 index 00000000..922e91fb --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleErrors.cs @@ -0,0 +1,1151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble.Win +{ + public static class WclBleErrors + { + // Token: 0x06002081 RID: 8321 RVA: 0x00087496 File Offset: 0x00085696 + public static bool IsSuccessCode(int code) + { + return code == 0; + } + + // Token: 0x0400118F RID: 4495 + public const int WCL_E_SUCCESS = 0; + + // Token: 0x04001190 RID: 4496 + public const int WCL_E_BASE = 65536; + + // Token: 0x04001191 RID: 4497 + public const int WCL_E_INVALID_ARGUMENT = 65536; + + // Token: 0x04001192 RID: 4498 + public const int WCL_E_OUT_OF_MEMORY = 65537; + + // Token: 0x04001193 RID: 4499 + public const int WCL_E_THREAD_RUNNING = 65538; + + // Token: 0x04001194 RID: 4500 + public const int WCL_E_UNABLE_CREATE_THREAD_INIT_EVENT = 65539; + + // Token: 0x04001195 RID: 4501 + public const int WCL_E_UNABLE_CREATE_THREAD = 65540; + + // Token: 0x04001196 RID: 4502 + public const int WCL_E_THREAD_NOT_RUNNING = 65541; + + // Token: 0x04001197 RID: 4503 + public const int WCL_E_THREAD_SIGNAL_FAILED = 65542; + + // Token: 0x04001198 RID: 4504 + public const int WCL_E_THREAD_MESSAGE_REGISTRATION_FAILED = 65543; + + // Token: 0x04001199 RID: 4505 + public const int WCL_E_THREAD_WINDOW_CREATION_FAILED = 65544; + + // Token: 0x0400119A RID: 4506 + public const int WCL_E_THREAD_INITIALIZATION_FAILED = 65545; + + // Token: 0x0400119B RID: 4507 + public const int WCL_E_MR_BASE = 69632; + + // Token: 0x0400119C RID: 4508 + public const int WCL_E_MR_CLOSED = 69632; + + // Token: 0x0400119D RID: 4509 + public const int WCL_E_MR_OPENED = 69633; + + // Token: 0x0400119E RID: 4510 + public const int WCL_E_MR_NOT_OPENED = 69634; + + // Token: 0x0400119F RID: 4511 + public const int WCL_E_MR_UNABLE_SYNCHRONIZE = 69635; + + // Token: 0x040011A0 RID: 4512 + public const int WCL_E_MR_UNABLE_REGISTER_SYNC_OBJ = 69636; + + // Token: 0x040011A1 RID: 4513 + public const int WCL_E_MR_UNABLE_CREATE_SYNC_OBJ = 69637; + + // Token: 0x040011A2 RID: 4514 + public const int WCL_E_MR_SYNC_OBJ_NOT_CREATED = 69638; + + // Token: 0x040011A3 RID: 4515 + public const int WCL_E_MB_BASE = 73728; + + // Token: 0x040011A4 RID: 4516 + public const int WCL_E_MB_RECEIVER_ALREADY_SUBSCRIBED = 73728; + + // Token: 0x040011A5 RID: 4517 + public const int WCL_E_MB_RECEIVER_NOT_SUBSCRIBED = 73729; + + // Token: 0x040011A6 RID: 4518 + public const int WCL_E_MB_CAN_NOT_INIT_HW_THREAD = 73730; + + // Token: 0x040011A7 RID: 4519 + public const int WCL_E_MB_CAN_NOT_START_HW_THREAD = 73731; + + // Token: 0x040011A8 RID: 4520 + public const int WCL_E_MB_UNABLE_CREATE_HW_OBJ = 73732; + + // Token: 0x040011A9 RID: 4521 + public const int WCL_E_MB_UNABLE_REGISTER_HW_NOTIFY = 73733; + + // Token: 0x040011AA RID: 4522 + public const int WCL_E_MB_UNABLE_CREATE_MUTEX = 73734; + + // Token: 0x040011AB RID: 4523 + public const int WCL_E_MB_NOT_CREATED = 73735; + + // Token: 0x040011AC RID: 4524 + public const int WCL_E_MB_REF_COUNT_ERROR = 73736; + + // Token: 0x040011AD RID: 4525 + public const int WCL_E_MB_RUNNING = 73737; + + // Token: 0x040011AE RID: 4526 + public const int WCL_E_WINRT_BASE = 77824; + + // Token: 0x040011AF RID: 4527 + public const int WCL_E_WINRT_UNABLE_CREATE_MUTEX = 77824; + + // Token: 0x040011B0 RID: 4528 + public const int WCL_E_WINRT_UNABLE_LOAD_CORE_DLL = 77825; + + // Token: 0x040011B1 RID: 4529 + public const int WCL_E_WINRT_UNABLE_LOAD_STRING_DLL = 77826; + + // Token: 0x040011B2 RID: 4530 + public const int WCL_E_WINRT_INIT_FAILED = 77827; + + // Token: 0x040011B3 RID: 4531 + public const int WCL_E_WINRT_UNABLE_CREATE_STRING = 77828; + + // Token: 0x040011B4 RID: 4532 + public const int WCL_E_WINRT_UNABLE_ACTIVATE_INSTANCE = 77829; + + // Token: 0x040011B5 RID: 4533 + public const int WCL_E_WINRT_UNABLE_CREATE_INTERFACE = 77830; + + // Token: 0x040011B6 RID: 4534 + public const int WCL_E_WINRT_ASYNC_OPERATION_FAILED = 77831; + + // Token: 0x040011B7 RID: 4535 + public const int WCL_E_WINRT_ASYNC_OPERATION_CANCELLED = 77832; + + // Token: 0x040011B8 RID: 4536 + public const int WCL_E_WINRT_ASYNC_OPERATION_ERROR = 77833; + + // Token: 0x040011B9 RID: 4537 + public const int WCL_E_WINRT_DETACH_BUFFER_FAILED = 77834; + + // Token: 0x040011BA RID: 4538 + public const int WCL_E_CONNECTION_BASE = 196608; + + // Token: 0x040011BB RID: 4539 + public const int WCL_E_CONNECTION_ACTIVE = 196608; + + // Token: 0x040011BC RID: 4540 + public const int WCL_E_CONNECTION_NOT_ACTIVE = 196609; + + // Token: 0x040011BD RID: 4541 + public const int WCL_E_CONNECTION_UNABLE_CREATE_TERMINATE_EVENT = 196610; + + // Token: 0x040011BE RID: 4542 + public const int WCL_E_CONNECTION_UNABLE_CREATE_CONNECTION_COMPLETE_EVENT = 196611; + + // Token: 0x040011BF RID: 4543 + public const int WCL_E_CONNECTION_UNABLE_START_COMMUNICATION = 196612; + + // Token: 0x040011C0 RID: 4544 + public const int WCL_E_CONNECTION_TERMINATED = 196613; + + // Token: 0x040011C1 RID: 4545 + public const int WCL_E_CONNECTION_TERMINATED_BY_USER = 196614; + + // Token: 0x040011C2 RID: 4546 + public const int WCL_E_CONNECTION_UNABLE_CREATE_INIT_EVENT = 196615; + + // Token: 0x040011C3 RID: 4547 + public const int WCL_E_CONNECTION_CLOSED = 196616; + + // Token: 0x040011C4 RID: 4548 + public const int WCL_E_CONNECTION_UNEXPECTED = 196617; + + // Token: 0x040011C5 RID: 4549 + public const int WCL_E_CONNECTION_UNABLE_CREATE_OR_INIT_CLIENT = 196618; + + // Token: 0x040011C6 RID: 4550 + public const int WCL_E_CONNECTION_UNABLE_FIND_CLIENT_CLASS = 196619; + + // Token: 0x040011C7 RID: 4551 + public const int WCL_E_OBEX_BASE = 200704; + + // Token: 0x040011C8 RID: 4552 + public const int WCL_E_OBEX_NOT_CONNECTED = 200704; + + // Token: 0x040011C9 RID: 4553 + public const int WCL_E_OBEX_CONNECTED = 200705; + + // Token: 0x040011CA RID: 4554 + public const int WCL_E_OBEX_OPERATION_IN_PROGRESS = 200706; + + // Token: 0x040011CB RID: 4555 + public const int WCL_E_OBEX_CONTINUE = 200707; + + // Token: 0x040011CC RID: 4556 + public const int WCL_E_OBEX_CREATED = 200708; + + // Token: 0x040011CD RID: 4557 + public const int WCL_E_OBEX_ACCEPTED = 200709; + + // Token: 0x040011CE RID: 4558 + public const int WCL_E_OBEX_NON_AUTHORITATIVE = 200710; + + // Token: 0x040011CF RID: 4559 + public const int WCL_E_OBEX_NO_CONTENT = 200711; + + // Token: 0x040011D0 RID: 4560 + public const int WCL_E_OBEX_RESET_CONTENT = 200712; + + // Token: 0x040011D1 RID: 4561 + public const int WCL_E_OBEX_PARTIAL_CONTENT = 200713; + + // Token: 0x040011D2 RID: 4562 + public const int WCL_E_OBEX_MULTIPLE_CHOICES = 200714; + + // Token: 0x040011D3 RID: 4563 + public const int WCL_E_OBEX_MOVED_PERMANENTLY = 200715; + + // Token: 0x040011D4 RID: 4564 + public const int WCL_E_OBEX_MOVED_TEMPORARY = 200716; + + // Token: 0x040011D5 RID: 4565 + public const int WCL_E_OBEX_SEE_OTHER = 200717; + + // Token: 0x040011D6 RID: 4566 + public const int WCL_E_OBEX_NOT_MODIFIED = 200718; + + // Token: 0x040011D7 RID: 4567 + public const int WCL_E_OBEX_USE_PROXY = 200719; + + // Token: 0x040011D8 RID: 4568 + public const int WCL_E_OBEX_BAD_REQUEST = 200720; + + // Token: 0x040011D9 RID: 4569 + public const int WCL_E_OBEX_UNAUTHORIZED = 200721; + + // Token: 0x040011DA RID: 4570 + public const int WCL_E_OBEX_PAYMENT_REQUIRED = 200722; + + // Token: 0x040011DB RID: 4571 + public const int WCL_E_OBEX_FORBIDDEN = 200723; + + // Token: 0x040011DC RID: 4572 + public const int WCL_E_OBEX_NOT_FOUND = 200724; + + // Token: 0x040011DD RID: 4573 + public const int WCL_E_OBEX_METHOD_NOT_ALLOWED = 200725; + + // Token: 0x040011DE RID: 4574 + public const int WCL_E_OBEX_NOT_ACCEPTABLE = 200726; + + // Token: 0x040011DF RID: 4575 + public const int WCL_E_OBEX_PROXY_AUTH_REQUIRED = 200727; + + // Token: 0x040011E0 RID: 4576 + public const int WCL_E_OBEX_REQUEST_TIMEOUT = 200728; + + // Token: 0x040011E1 RID: 4577 + public const int WCL_E_OBEX_CONFLICT = 200729; + + // Token: 0x040011E2 RID: 4578 + public const int WCL_E_OBEX_GONE = 200730; + + // Token: 0x040011E3 RID: 4579 + public const int WCL_E_OBEX_LENGTH_REQUIRED = 200731; + + // Token: 0x040011E4 RID: 4580 + public const int WCL_E_OBEX_PRECONDITION_FAILED = 200732; + + // Token: 0x040011E5 RID: 4581 + public const int WCL_E_OBEX_REQUEST_TOO_LARGE = 200733; + + // Token: 0x040011E6 RID: 4582 + public const int WCL_E_OBEX_URL_TOO_LARGE = 200734; + + // Token: 0x040011E7 RID: 4583 + public const int WCL_E_OBEX_UNSUPPORTED_MEDIA_TYPE = 200735; + + // Token: 0x040011E8 RID: 4584 + public const int WCL_E_OBEX_INTERNAL = 200736; + + // Token: 0x040011E9 RID: 4585 + public const int WCL_E_OBEX_NOT_IMPLEMENTED = 200737; + + // Token: 0x040011EA RID: 4586 + public const int WCL_E_OBEX_BAD_GATEWAY = 200738; + + // Token: 0x040011EB RID: 4587 + public const int WCL_E_OBEX_SERVICE_UNAVAILABLE = 200739; + + // Token: 0x040011EC RID: 4588 + public const int WCL_E_OBEX_GATEWAY_TIMEOUT = 200740; + + // Token: 0x040011ED RID: 4589 + public const int WCL_E_OBEX_HTTP_VERSION_NOT_SUPPORTED = 200741; + + // Token: 0x040011EE RID: 4590 + public const int WCL_E_OBEX_DATABASE_FULL = 200742; + + // Token: 0x040011EF RID: 4591 + public const int WCL_E_OBEX_DATABASE_LOCKED = 200743; + + // Token: 0x040011F0 RID: 4592 + public const int WCL_E_OBEX_OPERATION_TERMINATED_BY_DISCONNECT = 200744; + + // Token: 0x040011F1 RID: 4593 + public const int WCL_E_OBEX_OPERATION_TERMINATED_BY_USER = 200745; + + // Token: 0x040011F2 RID: 4594 + public const int WCL_E_OBEX_INVALID_OPERATION_SEQUENCE = 200746; + + // Token: 0x040011F3 RID: 4595 + public const int WCL_E_OBEX_DISCONNECTED = 200747; + + // Token: 0x040011F4 RID: 4596 + public const int WCL_E_OBEX_UNEXPECTED = 200748; + + // Token: 0x040011F5 RID: 4597 + public const int WCL_E_OBEX_CREATE_CONNECTION_ID_MUTEX_FAILED = 200749; + + // Token: 0x040011F6 RID: 4598 + public const int WCL_E_OBEX_MAX_CONNECTION_ID = 200750; + + // Token: 0x040011F7 RID: 4599 + public const int WCL_E_OBEX_INVALID_STATE = 200751; + + // Token: 0x040011F8 RID: 4600 + public const int WCL_E_BLUETOOTH_BASE = 327680; + + // Token: 0x040011F9 RID: 4601 + public const int WCL_E_BLUETOOTH_MANAGER_CLOSED = 327680; + + // Token: 0x040011FA RID: 4602 + public const int WCL_E_BLUETOOTH_MANAGER_OPENED = 327681; + + // Token: 0x040011FB RID: 4603 + public const int WCL_E_BLUETOOTH_MANAGER_OPEN_FAILED = 327682; + + // Token: 0x040011FC RID: 4604 + public const int WCL_E_BLUETOOTH_MANAGER_EXISTS = 327683; + + // Token: 0x040011FD RID: 4605 + public const int WCL_E_BLUETOOTH_DRIVER_NOT_AVAILABLE = 327684; + + // Token: 0x040011FE RID: 4606 + public const int WCL_E_BLUETOOTH_HARDWARE_NOT_AVAILABLE = 327685; + + // Token: 0x040011FF RID: 4607 + public const int WCL_E_BLUETOOTH_API_NOT_LOADED = 327686; + + // Token: 0x04001200 RID: 4608 + public const int WCL_E_BLUETOOTH_API_INITIALIZATION_FAILED = 327687; + + // Token: 0x04001201 RID: 4609 + public const int WCL_E_BLUETOOTH_API_NOT_FOUND = 327688; + + // Token: 0x04001202 RID: 4610 + public const int WCL_E_BLUETOOTH_API_NOT_INITIALIZED = 327689; + + // Token: 0x04001203 RID: 4611 + public const int WCL_E_BLUETOOTH_WRONG_DRIVER_VERSION = 327690; + + // Token: 0x04001204 RID: 4612 + public const int WCL_E_BLUETOOTH_RADIO_OPENED = 327691; + + // Token: 0x04001205 RID: 4613 + public const int WCL_E_BLUETOOTH_RADIO_CLOSED = 327692; + + // Token: 0x04001206 RID: 4614 + public const int WCL_E_BLUETOOTH_RADIO_REMOVED = 327693; + + // Token: 0x04001207 RID: 4615 + public const int WCL_E_BLUETOOTH_RADIO_INSTANCE_INIT_FAILED = 327694; + + // Token: 0x04001208 RID: 4616 + public const int WCL_E_BLUETOOTH_RADIO_INSTANCE_EXISTS = 327695; + + // Token: 0x04001209 RID: 4617 + public const int WCL_E_BLUETOOTH_RADIO_UNAVAILABLE = 327696; + + // Token: 0x0400120A RID: 4618 + public const int WCL_E_BLUETOOTH_UNABLE_CHANGE_CONNECTABLE_STATE = 327697; + + // Token: 0x0400120B RID: 4619 + public const int WCL_E_BLUETOOTH_UNABLE_CHANGE_DISCOVERABLE_STATE = 327698; + + // Token: 0x0400120C RID: 4620 + public const int WCL_E_BLUETOOTH_UNABLE_CHANGE_NAME = 327699; + + // Token: 0x0400120D RID: 4621 + public const int WCL_E_BLUETOOTH_FEATURE_NOT_SUPPORTED = 327700; + + // Token: 0x0400120E RID: 4622 + public const int WCL_E_BLUETOOTH_UNEXPECTED = 327701; + + // Token: 0x0400120F RID: 4623 + public const int WCL_E_BLUETOOTH_LINK_UNEXPECTED = 327702; + + // Token: 0x04001210 RID: 4624 + public const int WCL_E_BLUETOOTH_OPERATION_FAILED = 327703; + + // Token: 0x04001211 RID: 4625 + public const int WCL_E_BLUETOOTH_OPERATION_CONFLICT = 327704; + + // Token: 0x04001212 RID: 4626 + public const int WCL_E_BLUETOOTH_NO_MORE_CONNECTION_ALLOWED = 327705; + + // Token: 0x04001213 RID: 4627 + public const int WCL_E_BLUETOOTH_OBJECT_EXISTS = 327706; + + // Token: 0x04001214 RID: 4628 + public const int WCL_E_BLUETOOTH_OBJECT_IN_USE = 327707; + + // Token: 0x04001215 RID: 4629 + public const int WCL_E_BLUETOOTH_DISCOVERING_RUNNING = 327708; + + // Token: 0x04001216 RID: 4630 + public const int WCL_E_BLUETOOTH_DISCOVERING_NOT_RUNNING = 327709; + + // Token: 0x04001217 RID: 4631 + public const int WCL_E_BLUETOOTH_DISCOVERING_TERMINATED = 327710; + + // Token: 0x04001218 RID: 4632 + public const int WCL_E_BLUETOOTH_CANCELLED_BY_USER = 327711; + + // Token: 0x04001219 RID: 4633 + public const int WCL_E_BLUETOOTH_TIMEOUT = 327712; + + // Token: 0x0400121A RID: 4634 + public const int WCL_E_BLUETOOTH_CONNECTION_TERMINATED_BY_USER = 327713; + + // Token: 0x0400121B RID: 4635 + public const int WCL_E_BLUETOOTH_PENDING = 327714; + + // Token: 0x0400121C RID: 4636 + public const int WCL_E_BLUETOOTH_CONNECTION_FAILED = 327715; + + // Token: 0x0400121D RID: 4637 + public const int WCL_E_BLUETOOTH_DEVICE_NOT_FOUND = 327716; + + // Token: 0x0400121E RID: 4638 + public const int WCL_E_BLUETOOTH_PAIRING = 327717; + + // Token: 0x0400121F RID: 4639 + public const int WCL_E_BLUETOOTH_UNABLE_START_PAIRING = 327718; + + // Token: 0x04001220 RID: 4640 + public const int WCL_E_BLUETOOTH_ALREADY_PAIRED = 327719; + + // Token: 0x04001221 RID: 4641 + public const int WCL_E_BLUETOOTH_DEVICE_NOT_PAIRED = 327720; + + // Token: 0x04001222 RID: 4642 + public const int WCL_E_BLUETOOTH_ACCESS_DENIED = 327721; + + // Token: 0x04001223 RID: 4643 + public const int WCL_E_BLUETOOTH_AUTHENTICATION_FAILED = 327722; + + // Token: 0x04001224 RID: 4644 + public const int WCL_E_BLUETOOTH_REJECTED = 327723; + + // Token: 0x04001225 RID: 4645 + public const int WCL_E_BLUETOOTH_UNABLE_GET_READ_BUFFER = 327724; + + // Token: 0x04001226 RID: 4646 + public const int WCL_E_BLUETOOTH_UNABLE_GET_WRITE_BUFFER = 327725; + + // Token: 0x04001227 RID: 4647 + public const int WCL_E_BLUETOOTH_UNABLE_SET_READ_BUFFER = 327726; + + // Token: 0x04001228 RID: 4648 + public const int WCL_E_BLUETOOTH_UNABLE_SET_WRITE_BUFFER = 327727; + + // Token: 0x04001229 RID: 4649 + public const int WCL_E_BLUETOOTH_CLIENT_CONNECTED = 327728; + + // Token: 0x0400122A RID: 4650 + public const int WCL_E_BLUETOOTH_CLIENT_NOT_CONNECTED = 327729; + + // Token: 0x0400122B RID: 4651 + public const int WCL_E_BLUETOOTH_L2CAP_DISCONNECTED = 327730; + + // Token: 0x0400122C RID: 4652 + public const int WCL_E_BLUETOOTH_INVALID_DEVICE_TYPE = 327731; + + // Token: 0x0400122D RID: 4653 + public const int WCL_E_BLUETOOTH_CHANNEL_IN_USE = 327732; + + // Token: 0x0400122E RID: 4654 + public const int WCL_E_BLUETOOTH_SERVICE_NOT_VALID = 327733; + + // Token: 0x0400122F RID: 4655 + public const int WCL_E_BLUETOOTH_SERVICE_NOT_FOUND = 327734; + + // Token: 0x04001230 RID: 4656 + public const int WCL_E_BLUETOOTH_UNABLE_CREATE_SOCKET = 327735; + + // Token: 0x04001231 RID: 4657 + public const int WCL_E_BLUETOOTH_UNABLE_SET_CLIENT_SECURITY = 327736; + + // Token: 0x04001232 RID: 4658 + public const int WCL_E_BLUETOOTH_UNABLE_CREATE_EVENT = 327737; + + // Token: 0x04001233 RID: 4659 + public const int WCL_E_BLUETOOTH_UNABLE_SET_EVENT = 327738; + + // Token: 0x04001234 RID: 4660 + public const int WCL_E_BLUETOOTH_UNABLE_LOCK_CONNECT_MUTEX = 327739; + + // Token: 0x04001235 RID: 4661 + public const int WCL_E_BLUETOOTH_UNABLE_INIT_OVERLAPPED_OPERATION = 327740; + + // Token: 0x04001236 RID: 4662 + public const int WCL_E_BLUETOOTH_UNABLE_CREATE_DISCONNECT_EVENT = 327741; + + // Token: 0x04001237 RID: 4663 + public const int WCL_E_BLUETOOTH_UNABLE_CREATE_CONNECT_EVENT = 327742; + + // Token: 0x04001238 RID: 4664 + public const int WCL_E_BLUETOOTH_UNABLE_LOCK_SDP_MUTEX = 327743; + + // Token: 0x04001239 RID: 4665 + public const int WCL_E_BLUETOOTH_RFCOMM_SESSION_DISCONNECTED = 327744; + + // Token: 0x0400123A RID: 4666 + public const int WCL_E_BLUETOOTH_RFCOMM_DOWN = 327745; + + // Token: 0x0400123B RID: 4667 + public const int WCL_E_BLUETOOTH_RFCOMM_DISCONNECTED = 327746; + + // Token: 0x0400123C RID: 4668 + public const int WCL_E_BLUETOOTH_UNABLE_TO_RESOLVE_ADDRESS = 327747; + + // Token: 0x0400123D RID: 4669 + public const int WCL_E_BLUETOOTH_UNABLE_ADD_ADP_RECORD = 327748; + + // Token: 0x0400123E RID: 4670 + public const int WCL_E_BLUETOOTH_UNABLE_SET_SERVER_SECURITY = 327749; + + // Token: 0x0400123F RID: 4671 + public const int WCL_E_BLUETOOTH_LOCAL_SERVICE_ACTIVE = 327750; + + // Token: 0x04001240 RID: 4672 + public const int WCL_E_BLUETOOTH_UNABLE_CREATE_SERVER = 327751; + + // Token: 0x04001241 RID: 4673 + public const int WCL_E_BLUETOOTH_UNABLE_ENUMERATE_LOCAL_SERVICES = 327752; + + // Token: 0x04001242 RID: 4674 + public const int WCL_E_BLUETOOTH_UNABLE_STOP_LOCAL_SERVER = 327753; + + // Token: 0x04001243 RID: 4675 + public const int WCL_E_BLUETOOTH_UNABLE_TO_UPDATE_LOCAL_SERVER = 327754; + + // Token: 0x04001244 RID: 4676 + public const int WCL_E_BLUETOOTH_SETUP_COM_FAILED = 327755; + + // Token: 0x04001245 RID: 4677 + public const int WCL_E_BLUETOOTH_UNABLE_OPEN_CLIENT_COM = 327756; + + // Token: 0x04001246 RID: 4678 + public const int WCL_E_BLUETOOTH_UNABLE_OPEN_SERVER_COM = 327757; + + // Token: 0x04001247 RID: 4679 + public const int WCL_E_BLUETOOTH_WRITE_FAILED = 327758; + + // Token: 0x04001248 RID: 4680 + public const int WCL_E_BLUETOOTH_READ_FAILED = 327759; + + // Token: 0x04001249 RID: 4681 + public const int WCL_E_BLUETOOTH_UNABLE_CREATE_WND = 327760; + + // Token: 0x0400124A RID: 4682 + public const int WCL_E_BLUETOOTH_UNABLE_REGISTER_MESSAGE = 327761; + + // Token: 0x0400124B RID: 4683 + public const int WCL_E_BLUETOOTH_UNABLE_CREATE_SYNC_EVENT = 327762; + + // Token: 0x0400124C RID: 4684 + public const int WCL_E_BLUETOOTH_SDP_TRANSACTION = 327763; + + // Token: 0x0400124D RID: 4685 + public const int WCL_E_BLUETOOTH_UNABLE_START_SDP_THREAD = 327764; + + // Token: 0x0400124E RID: 4686 + public const int WCL_E_BLUETOOTH_UNABLE_START_CONNECT_THREAD = 327765; + + // Token: 0x0400124F RID: 4687 + public const int WCL_E_BLUETOOTH_UNABLE_START_LISTEN_THREAD = 327766; + + // Token: 0x04001250 RID: 4688 + public const int WCL_E_BLUETOOTH_DISCOVERING_FAILED = 327767; + + // Token: 0x04001251 RID: 4689 + public const int WCL_E_BLUETOOTH_READ_REMOTE_NAME_FAILED = 327768; + + // Token: 0x04001252 RID: 4690 + public const int WCL_E_BLUETOOTH_DESTROY_COM_FAILED = 327769; + + // Token: 0x04001253 RID: 4691 + public const int WCL_E_BLUETOOTH_CONNECT_COM_FAILED = 327770; + + // Token: 0x04001254 RID: 4692 + public const int WCL_E_BLUETOOTH_DISCONNECT_COM_FAILED = 327771; + + // Token: 0x04001255 RID: 4693 + public const int WCL_E_BLUETOOTH_UNABLE_TO_SWITCH_ON_OR_OFF = 327772; + + // Token: 0x04001256 RID: 4694 + public const int WCL_E_BLUETOOTH_CANNOT_ASSIGN_PSM = 327773; + + // Token: 0x04001257 RID: 4695 + public const int WCL_E_BLUETOOTH_GETLOCALINFO_FAILED = 327774; + + // Token: 0x04001258 RID: 4696 + public const int WCL_E_BLUETOOTH_DISCONNECT_SDP_FAILED = 327775; + + // Token: 0x04001259 RID: 4697 + public const int WCL_E_BLUETOOTH_UNABLE_REGISTER_COM_NOTIFICATION = 327776; + + // Token: 0x0400125A RID: 4698 + public const int WCL_E_BLUETOOTH_SETLOCALINFO_FAILED = 327777; + + // Token: 0x0400125B RID: 4699 + public const int WCL_E_BLUETOOTH_UNABLE_TO_GET_CONNECTED_DEVICES = 327778; + + // Token: 0x0400125C RID: 4700 + public const int WCL_E_BLUETOOTH_UNABLE_CONNECT = 327779; + + // Token: 0x0400125D RID: 4701 + public const int WCL_E_BLUETOOTH_CONNECT_PSM = 327780; + + // Token: 0x0400125E RID: 4702 + public const int WCL_E_BLUETOOTH_SDP_PARSE_ERROR = 327781; + + // Token: 0x0400125F RID: 4703 + public const int WCL_E_BLUETOOTH_UNABLE_READ_RSSI = 327782; + + // Token: 0x04001260 RID: 4704 + public const int WCL_E_BLUETOOTH_UNABLE_CHANGE_PAIRING_MODE = 327783; + + // Token: 0x04001261 RID: 4705 + public const int WCL_E_BLUETOOTH_SDP_ERROR = 327784; + + // Token: 0x04001262 RID: 4706 + public const int WCL_E_BLUETOOTH_UNABLE_START_THREAD = 327785; + + // Token: 0x04001263 RID: 4707 + public const int WCL_E_BLUETOOTH_UNABLE_CREATE_INIT_EVENT = 327786; + + // Token: 0x04001264 RID: 4708 + public const int WCL_E_BLUETOOTH_UNABLE_START_INIT_THREAD = 327787; + + // Token: 0x04001265 RID: 4709 + public const int WCL_E_BLUETOOTH_VCOM_NOT_FOUND = 327788; + + // Token: 0x04001266 RID: 4710 + public const int WCL_E_BLUETOOTH_VCOM_EXISTS = 327789; + + // Token: 0x04001267 RID: 4711 + public const int WCL_E_BLUETOOTH_CREATE_DEVICE_STATICS_FAILED = 327790; + + // Token: 0x04001268 RID: 4712 + public const int WCL_E_BLUETOOTH_START_ASYNC_OPERATION_FAILED = 327791; + + // Token: 0x04001269 RID: 4713 + public const int WCL_E_BLUETOOTH_SET_ASYNC_OPERATION_EVENT_HANDLER_FAILED = 327792; + + // Token: 0x0400126A RID: 4714 + public const int WCL_E_BLUETOOTH_CREATE_DEVICE_FAILED = 327793; + + // Token: 0x0400126B RID: 4715 + public const int WCL_E_BLUETOOTH_GET_ASYNC_OPERATION_RESULT_FAILED = 327794; + + // Token: 0x0400126C RID: 4716 + public const int WCL_E_BLUETOOTH_GET_DEVICE_ID_FAILED = 327795; + + // Token: 0x0400126D RID: 4717 + public const int WCL_E_BLUETOOTH_GET_DEVICE_PROPERTIES_FAILED = 327796; + + // Token: 0x0400126E RID: 4718 + public const int WCL_E_BLUETOOTH_START_RSSI_THREAD_FAILED = 327797; + + // Token: 0x0400126F RID: 4719 + public const int WCL_E_BLUETOOTH_GET_RSSI_READING_RESULT_FAILED = 327798; + + // Token: 0x04001270 RID: 4720 + public const int WCL_E_BLUETOOTH_INCOMPATIBLE_OS_BITS = 327799; + + // Token: 0x04001271 RID: 4721 + public const int WCL_E_BLUETOOTH_GET_RADIOS_LIST_FAILED = 327800; + + // Token: 0x04001272 RID: 4722 + public const int WCL_E_BLUETOOTH_GET_RADIOS_COUNT_FAILED = 327801; + + // Token: 0x04001273 RID: 4723 + public const int WCL_E_BLUETOOTH_GET_BLUETOOTH_RADIO_FAILED = 327802; + + // Token: 0x04001274 RID: 4724 + public const int WCL_E_BLUETOOTH_UNABLE_CHANGE_RADIO_STATE = 327803; + + // Token: 0x04001275 RID: 4725 + public const int WCL_E_BLUETOOTH_START_GET_DEV_TYPE_THREAD_FAILED = 327804; + + // Token: 0x04001276 RID: 4726 + public const int WCL_E_BLUETOOTH_GET_DEV_TYPE_THREAD_GET_RESULT_FAILED = 327805; + + // Token: 0x04001277 RID: 4727 + public const int WCL_E_BLUETOOTH_START_GET_DEV_NAME_THREAD_FAILED = 327806; + + // Token: 0x04001278 RID: 4728 + public const int WCL_E_BLUETOOTH_GET_DEV_NAME_THREAD_GET_RESULT_FAILED = 327807; + + // Token: 0x04001279 RID: 4729 + public const int WCL_E_BLUETOOTH_NO_SYSTEM_RESOURCES = 327808; + + // Token: 0x0400127A RID: 4730 + public const int WCL_E_BLUETOOTH_CREATE_REG_CHANGE_TERMINATION_EVENT_FAILED = 327809; + + // Token: 0x0400127B RID: 4731 + public const int WCL_E_BLUETOOTH_CREATE_REG_CHANGE_RESULT_EVENT_FAILED = 327810; + + // Token: 0x0400127C RID: 4732 + public const int WCL_E_BLUETOOTH_START_REG_CHANGE_THREAD_FAILED = 327811; + + // Token: 0x0400127D RID: 4733 + public const int WCL_E_BLUETOOTH_REGISTER_AUTHENTICATION_CALLBACK_FAILED = 327812; + + // Token: 0x0400127E RID: 4734 + public const int WCL_E_BLUETOOTH_FAILED_TO_OPEN_AUTH_AGENT_REG_KEY = 327813; + + // Token: 0x0400127F RID: 4735 + public const int WCL_E_BLUETOOTH_CREATE_REG_CHANGES_NOTIFICATION_EVENT_FAILED = 327814; + + // Token: 0x04001280 RID: 4736 + public const int WCL_E_BLUETOOTH_UNABLE_SET_REGISTRY_CHANGES_NOTIFICATIONS = 327815; + + // Token: 0x04001281 RID: 4737 + public const int WCL_E_BLUETOOTH_UNABLE_TO_DISABLE_AUTHENTICATION_AGENT = 327816; + + // Token: 0x04001282 RID: 4738 + public const int WCL_E_BLUETOOTH_PAIRED_BY_OTHER = 327817; + + // Token: 0x04001283 RID: 4739 + public const int WCL_E_BLUETOOTH_DEVICE_ALREADY_INSTALLED = 327818; + + // Token: 0x04001284 RID: 4740 + public const int WCL_E_BLUETOOTH_DEVICE_NOT_INSTALLED = 327819; + + // Token: 0x04001285 RID: 4741 + public const int WCL_E_BLUETOOTH_DEVICE_NOT_CONNECTED = 327820; + + // Token: 0x04001286 RID: 4742 + public const int WCL_E_BLUETOOTH_ENUM_CONNECTION_FAILED = 327821; + + // Token: 0x04001287 RID: 4743 + public const int WCL_E_BLUETOOTH_WAIT_FAILED = 327822; + + // Token: 0x04001288 RID: 4744 + public const int WCL_E_BLUETOOTH_LE_BASE = 331776; + + // Token: 0x04001289 RID: 4745 + public const int WCL_E_BLUETOOTH_LE_INVALID_HANDLE = 331776; + + // Token: 0x0400128A RID: 4746 + public const int WCL_E_BLUETOOTH_LE_READ_NOT_PERMITTED = 331777; + + // Token: 0x0400128B RID: 4747 + public const int WCL_E_BLUETOOTH_LE_WRITE_NOT_PERMITTED = 331778; + + // Token: 0x0400128C RID: 4748 + public const int WCL_E_BLUETOOTH_LE_INVALID_PDU = 331779; + + // Token: 0x0400128D RID: 4749 + public const int WCL_E_BLUETOOTH_LE_INSUFFICIENT_AUTHENTICATION = 331780; + + // Token: 0x0400128E RID: 4750 + public const int WCL_E_BLUETOOTH_LE_REQUEST_NOT_SUPPORTED = 331781; + + // Token: 0x0400128F RID: 4751 + public const int WCL_E_BLUETOOTH_LE_INVALID_OFFSET = 331782; + + // Token: 0x04001290 RID: 4752 + public const int WCL_E_BLUETOOTH_LE_INSUFFICIENT_AUTHORIZATION = 331783; + + // Token: 0x04001291 RID: 4753 + public const int WCL_E_BLUETOOTH_LE_PREPARE_QUEUE_FULL = 331784; + + // Token: 0x04001292 RID: 4754 + public const int WCL_E_BLUETOOTH_LE_ATTRIBUTE_NOT_FOUND = 331785; + + // Token: 0x04001293 RID: 4755 + public const int WCL_E_BLUETOOTH_LE_ATTRIBUTE_NOT_LONG = 331786; + + // Token: 0x04001294 RID: 4756 + public const int WCL_E_BLUETOOTH_LE_INSUFFICIENT_ENCRYPTION_KEYSIZE = 331787; + + // Token: 0x04001295 RID: 4757 + public const int WCL_E_BLUETOOTH_LE_INVALID_ATTRIBUTE_VALUE_LENGTH = 331788; + + // Token: 0x04001296 RID: 4758 + public const int WCL_E_BLUETOOTH_LE_INSUFFICIENT_ENCRYPTION = 331789; + + // Token: 0x04001297 RID: 4759 + public const int WCL_E_BLUETOOTH_LE_UNSUPPORTED_GROUP_TYPE = 331790; + + // Token: 0x04001298 RID: 4760 + public const int WCL_E_BLUETOOTH_LE_INSUFFICIENT_RESOURCES = 331791; + + // Token: 0x04001299 RID: 4761 + public const int WCL_E_BLUETOOTH_LE_SMP_FAILED = 331792; + + // Token: 0x0400129A RID: 4762 + public const int WCL_E_BLUETOOTH_LE_TASK_CANCEL = 331793; + + // Token: 0x0400129B RID: 4763 + public const int WCL_E_BLUETOOTH_LE_CONNECT_FAILED = 331794; + + // Token: 0x0400129C RID: 4764 + public const int WCL_E_BLUETOOTH_LE_TIMEOUT = 331795; + + // Token: 0x0400129D RID: 4765 + public const int WCL_E_BLUETOOTH_LE_WRONG_CONFIGURATION = 331796; + + // Token: 0x0400129E RID: 4766 + public const int WCL_E_BLUETOOTH_LE_PROCEDURE_IN_PROGRESS = 331797; + + // Token: 0x0400129F RID: 4767 + public const int WCL_E_BLUETOOTH_LE_OUT_OF_RANGE = 331798; + + // Token: 0x040012A0 RID: 4768 + public const int WCL_E_BLUETOOTH_LE_RELIABLE_WRITE_ACTIVE = 331799; + + // Token: 0x040012A1 RID: 4769 + public const int WCL_E_BLUETOOTH_LE_RELIABLE_WRITE_NOT_ACTIVE = 331800; + + // Token: 0x040012A2 RID: 4770 + public const int WCL_E_BLUETOOTH_LE_ALREADY_SUBSCRIBED = 331801; + + // Token: 0x040012A3 RID: 4771 + public const int WCL_E_BLUETOOTH_LE_NOT_SUBSCRIBED = 331802; + + // Token: 0x040012A4 RID: 4772 + public const int WCL_E_BLUETOOTH_LE_DEVICES_SCANNING_ENABLED = 331803; + + // Token: 0x040012A5 RID: 4773 + public const int WCL_E_BLUETOOTH_LE_DEVICES_SCANNING_DISABLED = 331804; + + // Token: 0x040012A6 RID: 4774 + public const int WCL_E_BLUETOOTH_LE_INAVLID_USER_BUFFER = 331805; + + // Token: 0x040012A7 RID: 4775 + public const int WCL_E_BLUETOOTH_LE_INCONSISTENT_DATA = 331806; + + // Token: 0x040012A8 RID: 4776 + public const int WCL_E_BLUETOOTH_LE_COMMUNICATION_FAILED = 331807; + + // Token: 0x040012A9 RID: 4777 + public const int WCL_E_BLUETOOTH_LE_CHARACTERISTIC_NOT_READABLE = 331808; + + // Token: 0x040012AA RID: 4778 + public const int WCL_E_BLUETOOTH_LE_CREATE_WATCHER_FAILED = 331809; + + // Token: 0x040012AB RID: 4779 + public const int WCL_E_BLUETOOTH_LE_SET_SCANNING_MODE_FAILED = 331810; + + // Token: 0x040012AC RID: 4780 + public const int WCL_E_BLUETOOTH_LE_START_WATCHER_FAILED = 331811; + + // Token: 0x040012AD RID: 4781 + public const int WCL_E_BLUETOOTH_LE_START_WINRT_THREAD_FAILED = 331812; + + // Token: 0x040012AE RID: 4782 + public const int WCL_E_BLUETOOTH_LE_SET_EVENT_HANDLER_FAILED = 331813; + + // Token: 0x040012AF RID: 4783 + public const int WCL_E_BLUETOOTH_LE_CREATE_DEVICE_STATICS_FAILED = 331814; + + // Token: 0x040012B0 RID: 4784 + public const int WCL_E_BLUETOOTH_LE_CREATE_DEVICE_FAILED = 331815; + + // Token: 0x040012B1 RID: 4785 + public const int WCL_E_BLUETOOTH_LE_START_ASYNC_OPERATION_FAILED = 331816; + + // Token: 0x040012B2 RID: 4786 + public const int WCL_E_BLUETOOTH_LE_SET_ASYNC_OPERATION_EVENT_HANDLER_FAILED = 331817; + + // Token: 0x040012B3 RID: 4787 + public const int WCL_E_BLUETOOTH_LE_GET_ASYNC_OPERATION_RESULT_FAILED = 331818; + + // Token: 0x040012B4 RID: 4788 + public const int WCL_E_BLUETOOTH_LE_CREATE_DEVICE2_FAILED = 331819; + + // Token: 0x040012B5 RID: 4789 + public const int WCL_E_BLUETOOTH_LE_GET_DEVICE_INFORMATION_FAILED = 331820; + + // Token: 0x040012B6 RID: 4790 + public const int WCL_E_BLUETOOTH_LE_GET_DEVICE_INFORMATION2_FAILED = 331821; + + // Token: 0x040012B7 RID: 4791 + public const int WCL_E_BLUETOOTH_LE_GET_DEVICE_INFORMATION_PAIRING_FAILED = 331822; + + // Token: 0x040012B8 RID: 4792 + public const int WCL_E_BLUETOOTH_LE_GET_DEVICE_INFORMATION_PAIRING2_FAILED = 331823; + + // Token: 0x040012B9 RID: 4793 + public const int WCL_E_BLUETOOTH_LE_GET_DEVICE_INFORMATION_CUSTOM_PAIRING_FAILED = 331824; + + // Token: 0x040012BA RID: 4794 + public const int WCL_E_BLUETOOTH_LE_BEACON_MONITORING_RUNNING = 331825; + + // Token: 0x040012BB RID: 4795 + public const int WCL_E_BLUETOOTH_LE_BEACON_MONITORING_NOT_RUNNING = 331826; + + // Token: 0x040012BC RID: 4796 + public const int WCL_E_BLUETOOTH_LE_ADVERTISING_RUNNING = 331827; + + // Token: 0x040012BD RID: 4797 + public const int WCL_E_BLUETOOTH_LE_ADVERTISING_NOT_RUNNING = 331828; + + // Token: 0x040012BE RID: 4798 + public const int WCL_E_BLUETOOTH_LE_ADVERTISING_UNBALE_CREATE_INIT_EVENT = 331829; + + // Token: 0x040012BF RID: 4799 + public const int WCL_E_BLUETOOTH_LE_ADVERTISING_UNBALE_CREATE_TERMINATE_EVENT = 331830; + + // Token: 0x040012C0 RID: 4800 + public const int WCL_E_BLUETOOTH_LE_ADVERTISING_UNBALE_START_THREAD = 331831; + + // Token: 0x040012C1 RID: 4801 + public const int WCL_E_BLUETOOTH_LE_ADVERTISING_START_FAILED = 331832; + + // Token: 0x040012C2 RID: 4802 + public const int WCL_E_BLUETOOTH_LE_UNABLE_GET_ADVERTISER = 331833; + + // Token: 0x040012C3 RID: 4803 + public const int WCL_E_BLUETOOTH_LE_UNABLE_GET_ADVERTISER_MANUFACTURER_DATA = 331834; + + // Token: 0x040012C4 RID: 4804 + public const int WCL_E_BLUETOOTH_LE_UNABLE_SET_ADVERTISING_DATA = 331835; + + // Token: 0x040012C5 RID: 4805 + public const int WCL_E_BLUETOOTH_LE_UNABLE_ADD_ADVERTISING_DATA = 331836; + + // Token: 0x040012C6 RID: 4806 + public const int WCL_E_BLUETOOTH_LE_UNABLE_GET_ADVERTISER_DATA = 331837; + + // Token: 0x040012C7 RID: 4807 + public const int WCL_E_BLUETOOTH_LE_EDDYSTONE_URL_TOO_SHORT = 331838; + + // Token: 0x040012C8 RID: 4808 + public const int WCL_E_BLUETOOTH_LE_EDDYSTONE_URL_SCHEME_INVALID = 331839; + + // Token: 0x040012C9 RID: 4809 + public const int WCL_E_BLUETOOTH_LE_EDDYSTONE_URL_TOO_LONG = 331840; + + // Token: 0x040012CA RID: 4810 + public const int WCL_E_BLUETOOTH_LE_ASYNC_PAIR_FAILED = 331841; + + // Token: 0x040012CB RID: 4811 + public const int WCL_E_BLUETOOTH_LE_ASYNC_PAIR_ERROR = 331842; + + // Token: 0x040012CC RID: 4812 + public const int WCL_E_BLUETOOTH_LE_MANUAL_PAIRING_REQUIRED = 331843; + + // Token: 0x040012CD RID: 4813 + public const int WCL_E_BLUETOOTH_LE_AUTH_NOT_READY_TO_PAIR = 331844; + + // Token: 0x040012CE RID: 4814 + public const int WCL_E_BLUETOOTH_LE_AUTH_NOT_PAIRED = 331845; + + // Token: 0x040012CF RID: 4815 + public const int WCL_E_BLUETOOTH_LE_AUTH_CONNECTION_REJECTED = 331846; + + // Token: 0x040012D0 RID: 4816 + public const int WCL_E_BLUETOOTH_LE_AUTH_TOO_MANY_CONNECTIONS = 331847; + + // Token: 0x040012D1 RID: 4817 + public const int WCL_E_BLUETOOTH_LE_AUTH_HARDWARE_FAILURE = 331848; + + // Token: 0x040012D2 RID: 4818 + public const int WCL_E_BLUETOOTH_LE_AUTH_TIMEOUT = 331849; + + // Token: 0x040012D3 RID: 4819 + public const int WCL_E_BLUETOOTH_LE_AUTH_NOT_ALLOWED = 331850; + + // Token: 0x040012D4 RID: 4820 + public const int WCL_E_BLUETOOTH_LE_AUTH_FAILURE = 331851; + + // Token: 0x040012D5 RID: 4821 + public const int WCL_E_BLUETOOTH_LE_AUTH_NO_SUPPORTED_PROFILE = 331852; + + // Token: 0x040012D6 RID: 4822 + public const int WCL_E_BLUETOOTH_LE_AUTH_PROTECTION_LEVEL_COULD_NOT_BE_MET = 331853; + + // Token: 0x040012D7 RID: 4823 + public const int WCL_E_BLUETOOTH_LE_AUTH_ACCESS_DENIED = 331854; + + // Token: 0x040012D8 RID: 4824 + public const int WCL_E_BLUETOOTH_LE_AUTH_INVALID_CEREMONY_DATA = 331855; + + // Token: 0x040012D9 RID: 4825 + public const int WCL_E_BLUETOOTH_LE_AUTH_PAIRING_CANCELED = 331856; + + // Token: 0x040012DA RID: 4826 + public const int WCL_E_BLUETOOTH_LE_AUTH_OPERATION_ALREADY_IN_POROGRESS = 331857; + + // Token: 0x040012DB RID: 4827 + public const int WCL_E_BLUETOOTH_LE_AUTH_REQUIRED_HANDLER_NOT_REGISTERED = 331858; + + // Token: 0x040012DC RID: 4828 + public const int WCL_E_BLUETOOTH_LE_AUTH_REJECTED_BY_HANDLER = 331859; + + // Token: 0x040012DD RID: 4829 + public const int WCL_E_BLUETOOTH_LE_AUTH_REMOTE_DEVICE_HAS_ASSOCIATION = 331860; + + // Token: 0x040012DE RID: 4830 + public const int WCL_E_BLUETOOTH_LE_AUTH_FAILED = 331861; + + // Token: 0x040012DF RID: 4831 + public const int WCL_E_BLUETOOTH_LE_SET_PROTECTION_LEVEL_FAILED = 331862; + + // Token: 0x040012E0 RID: 4832 + public const int WCL_E_BLUETOOTH_LE_CHARACTERISTIC_NOT_WRITABLE = 331863; + + // Token: 0x040012E1 RID: 4833 + public const int WCL_E_BLUETOOTH_LE_DEVICE_NOT_DISCOVERED = 331864; + + // Token: 0x040012E2 RID: 4834 + public const int WCL_E_BLUETOOTH_LE_ALREADY_PAIRED = 331865; + + // Token: 0x040012E3 RID: 4835 + public const int WCL_E_BLUETOOTH_LE_UNSUPPORTED_BY_HARDWARE = 331866; + + // Token: 0x040012E4 RID: 4836 + public const int WCL_E_BLUETOOTH_LE_UNABLE_START_UNPAIRING = 331867; + + // Token: 0x040012E5 RID: 4837 + public const int WCL_E_BLUETOOTH_LE_DEVICE_NOT_FOUND = 331868; + + // Token: 0x040012E6 RID: 4838 + public const int WCL_E_BLUETOOTH_LE_GET_DEVICE_ID_FAILED = 331869; + + // Token: 0x040012E7 RID: 4839 + public const int WCL_E_BLUETOOTH_LE_GET_DEVICE_PROPERTIES_FAILED = 331870; + + // Token: 0x040012E8 RID: 4840 + public const int WCL_E_BLUETOOTH_LE_FEATURE_NOT_SUPPORTED = 331871; + + // Token: 0x040012E9 RID: 4841 + public const int WCL_E_BLUETOOTH_LE_UNABLE_READ_RSSI = 331872; + + // Token: 0x040012EA RID: 4842 + public const int WCL_E_BLUETOOTH_LE_START_RSSI_THREAD_FAILED = 331873; + + // Token: 0x040012EB RID: 4843 + public const int WCL_E_BLUETOOTH_LE_GET_RSSI_READING_RESULT_FAILED = 331874; + + // Token: 0x040012EC RID: 4844 + public const int WCL_E_BLUETOOTH_LE_ADVERTISING_SET_NAME_FAILED = 331875; + + // Token: 0x040012ED RID: 4845 + public const int WCL_E_BLUETOOTH_LE_GET_OPERATION_RESULT_FAULED = 331876; + + // Token: 0x040012EE RID: 4846 + public const int WCL_E_BLUETOOTH_LE_GET_ROOT_SERVICE_FAILED = 331877; + + // Token: 0x040012EF RID: 4847 + public const int WCL_E_BLUETOOTH_LE_GET_SERVICE_HANDLE_FAILED = 331878; + + // Token: 0x040012F0 RID: 4848 + public const int WCL_E_BLUETOOTH_LE_GET_CHARACTERISTIC_HANDLE_FAILED = 331879; + + // Token: 0x040012F1 RID: 4849 + public const int WCL_E_BLUETOOTH_LE_GET_DESCRIPTOR_HANDLE_FAILED = 331880; + + // Token: 0x040012F2 RID: 4850 + public const int WCL_E_BLUETOOTH_LE_GET_DESCRIPTOR_UUID_FAILED = 331881; + + // Token: 0x040012F3 RID: 4851 + public const int WCL_E_BLUETOOTH_LE_GET_PRESENTATION_FORMATS_FAILED = 331882; + + // Token: 0x040012F4 RID: 4852 + public const int WCL_E_BLUETOOTH_LE_GET_PRESENTATION_FORMATS_LIST_SIZE_FAILED = 331883; + + // Token: 0x040012F5 RID: 4853 + public const int WCL_E_BLUETOOTH_LE_GET_PRESENTATION_FORMAT_FAILED = 331884; + + // Token: 0x040012F6 RID: 4854 + public const int WCL_E_BLUETOOTH_LE_GET_PRESENTATION_FORMAT_TYPE_FAILED = 331885; + + // Token: 0x040012F7 RID: 4855 + public const int WCL_E_BLUETOOTH_LE_GET_PRESENTATION_FORMAT_EXPONENT_FAILED = 331886; + + // Token: 0x040012F8 RID: 4856 + public const int WCL_E_BLUETOOTH_LE_GET_PRESENTATION_FORMAT_UNIT_FAILED = 331887; + + // Token: 0x040012F9 RID: 4857 + public const int WCL_E_BLUETOOTH_LE_GET_PRESENTATION_FORMAT_NAMESPACE_FAILED = 331888; + + // Token: 0x040012FA RID: 4858 + public const int WCL_E_BLUETOOTH_LE_GET_PRESENTATION_FORMAT_DESCRIPTION_FAILED = 331889; + + // Token: 0x040012FB RID: 4859 + public const int WCL_E_BLUETOOTH_LE_GET_DESCRIPTOR_VALUE_SIZE_FAILED = 331890; + + // Token: 0x040012FC RID: 4860 + public const int WCL_E_BLUETOOTH_LE_GET_DESCRIPTOR_VALUE_RAW_DATA_FAILED = 331891; + + // Token: 0x040012FD RID: 4861 + public const int WCL_E_BLUETOOTH_LE_GET_DESCRIPTOR_VALUE_DATA_FAILED = 331892; + + // Token: 0x040012FE RID: 4862 + public const int WCL_E_BLUETOOTH_LE_GET_CHARACTERISTIC_UUID_FAILED = 331893; + + // Token: 0x040012FF RID: 4863 + public const int WCL_E_BLUETOOTH_LE_GET_CHARACTERISTIC_PROPETIES_FAILED = 331894; + + // Token: 0x04001300 RID: 4864 + public const int WCL_E_BLUETOOTH_LE_GET_DESCRIPTOR_VALUE_DATA_BUFFER_FAILED = 331895; + + // Token: 0x04001301 RID: 4865 + public const int WCL_E_BLUETOOTH_LE_GET_CHARACTERISTIC_VALUE_DATA_BUFFER_FAILED = 331896; + + // Token: 0x04001302 RID: 4866 + public const int WCL_E_BLUETOOTH_LE_GET_CHARACTERISTIC_VALUE_SIZE_FAILED = 331897; + + // Token: 0x04001303 RID: 4867 + public const int WCL_E_BLUETOOTH_LE_GET_CHARACTERISITC_VALUE_RAW_DATA_FAILED = 331898; + + // Token: 0x04001304 RID: 4868 + public const int WCL_E_BLUETOOTH_LE_GET_CHARACTERISITC_VALUE_DATA_FAILED = 331899; + + // Token: 0x04001305 RID: 4869 + public const int WCL_E_BLUETOOTH_LE_GET_DESCRIPTORS_LIST_SIZE_FAILED = 331900; + + // Token: 0x04001306 RID: 4870 + public const int WCL_E_BLUETOOTH_LE_GET_SERVICE_UUID_FAILED = 331901; + + // Token: 0x04001307 RID: 4871 + public const int WCL_E_BLUETOOTH_LE_GET_CHARACTERISITCS_LIST_SIZE_FAILED = 331902; + + // Token: 0x04001308 RID: 4872 + public const int WCL_E_BLUETOOTH_LE_GET_SERVICES_LIST_SIZE_FAILED = 331903; + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleErrors.cs.meta b/Assets/Scripts/Devices/Ble/Win/WclBleErrors.cs.meta new file mode 100644 index 00000000..5197840c --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleErrors.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 037f3eff461a68d40bdf5880692fc0cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleGattClient.cs b/Assets/Scripts/Devices/Ble/Win/WclBleGattClient.cs new file mode 100644 index 00000000..2e5fe915 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleGattClient.cs @@ -0,0 +1,302 @@ +using Assets.Scripts.Ble.Win.CPPBridge; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Ble.Win +{ + internal class WclBleGattClient + { + public WclBleGattClient(long address, IntPtr radio) + { + this.gattAddress = address; + this.rPtr = radio; + this.CConnectEvent = new WclBleGattClient.GATTCLIENT_CONNECT(this.OnConnected); + this.CDisconnectEvent = new WclBleGattClient.GATTCLIENT_DISCONNECT(this.OnDisconnected); + this.FCharacteristicChangedEvent = new WclBleGattClient.GATTCLIENT_ONCHANGED(this.OnCharacteristicChanged); + this.mPtr = WclBleGattClient.WCLGattClientCreate(this.CConnectEvent, this.CDisconnectEvent, this.FCharacteristicChangedEvent); + } + + // Token: 0x06002086 RID: 8326 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLGattClientConnect([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Client, [MarshalAs(UnmanagedType.SysInt)][In] IntPtr Radio, [MarshalAs(UnmanagedType.I8)][In] long Address); + + // Token: 0x06002087 RID: 8327 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.SysInt)] + private static extern IntPtr WCLGattClientCreate([MarshalAs(UnmanagedType.FunctionPtr)][In] WclBleGattClient.GATTCLIENT_CONNECT OnConnect, [MarshalAs(UnmanagedType.FunctionPtr)][In] WclBleGattClient.GATTCLIENT_DISCONNECT OnDisconnect, [MarshalAs(UnmanagedType.FunctionPtr)][In] WclBleGattClient.GATTCLIENT_ONCHANGED OnChanged); + + // Token: 0x06002088 RID: 8328 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + private static extern void WCLGattClientDestroy([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Client); + + // Token: 0x06002089 RID: 8329 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLGattClientDisconnect([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Client); + + // Token: 0x0600208A RID: 8330 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + private static extern void WCLGattClientFreeMem([MarshalAs(UnmanagedType.SysInt)][In] IntPtr pMem); + + // Token: 0x0600208B RID: 8331 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLGattClientGetCharacteristics([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Client, [In] ref GattService Service, [In][Out] ref GattCharacteristics Chars); + + // Token: 0x0600208C RID: 8332 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLGattClientGetServices([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Client, [In][Out] ref GattServices Services); + + // Token: 0x0600208D RID: 8333 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.U4)] + private static extern WclBleGattClientState WCLGattClientGetState([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Client); + + // Token: 0x0600208E RID: 8334 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLGattClientReadCharacteristicValue([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Client, [In] ref GattCharacteristic Char, [MarshalAs(UnmanagedType.SysInt)][In][Out] ref IntPtr ppValue, [MarshalAs(UnmanagedType.U4)][In][Out] ref uint pSize); + + // Token: 0x0600208F RID: 8335 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLGattClientSubscribeCharacteristic([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Client, [In] ref GattCharacteristic Char); + + // Token: 0x06002090 RID: 8336 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLGattClientUnsubscribeCharacteristic([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Client, [In] ref GattCharacteristic Char); + + // Token: 0x06002091 RID: 8337 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLGattClientWriteCharacteristicValue([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Client, [In] ref GattCharacteristic Char, [MarshalAs(UnmanagedType.SysInt)][In] IntPtr pValue, [MarshalAs(UnmanagedType.U4)][In] uint Size); + + // Token: 0x170005D4 RID: 1492 + // (get) Token: 0x06002092 RID: 8338 RVA: 0x00087790 File Offset: 0x00085990 + public WclBleGattClientState State + { + get + { + return WclBleGattClient.WCLGattClientGetState(this.mPtr); + } + } + + // Token: 0x06002093 RID: 8339 RVA: 0x000877A4 File Offset: 0x000859A4 + public void Connect() + { + if (this.mPtr != IntPtr.Zero) + { + int num = WclBleGattClient.WCLGattClientConnect(this.mPtr, this.rPtr, this.gattAddress); + if (num != 0) + { + this.OnConnected(this.mPtr, num); + } + } + } + + // Token: 0x06002094 RID: 8340 RVA: 0x000877F4 File Offset: 0x000859F4 + public void Disconnect() + { + if (this.mPtr != IntPtr.Zero) + { + //WclBleGattClient.log.Info("Disconnect called", Array.Empty()); + int num = WclBleGattClient.WCLGattClientDisconnect(this.mPtr); + //WclBleGattClient.log.Info(string.Format("Disconnect {0:X} response {1}", this.gattAddress, num), Array.Empty()); + } + } + + // Token: 0x06002095 RID: 8341 RVA: 0x00087864 File Offset: 0x00085A64 + public int DiscoverCharacteristics(GattService service, out GattCharacteristics characteristics) + { + characteristics = new GattCharacteristics + { + Count = 0, + Chars = new GattCharacteristic[255] + }; + return WclBleGattClient.WCLGattClientGetCharacteristics(this.mPtr, ref service, ref characteristics); + } + + // Token: 0x06002096 RID: 8342 RVA: 0x000878B0 File Offset: 0x00085AB0 + public int DiscoverServices(out GattServices services) + { + services = new GattServices + { + Count = 0, + Services = new GattService[255] + }; + return WclBleGattClient.WCLGattClientGetServices(this.mPtr, ref services); + } + + // Token: 0x06002097 RID: 8343 RVA: 0x000878F8 File Offset: 0x00085AF8 + public int ReadCharacteristicValue(GattCharacteristic characteristic, out byte[] value) + { + value = null; + IntPtr zero = IntPtr.Zero; + uint num = 0U; + int num2 = WclBleGattClient.WCLGattClientReadCharacteristicValue(this.mPtr, ref characteristic, ref zero, ref num); + if (num2 == 0 && zero != IntPtr.Zero && num > 0U) + { + value = new byte[num]; + Marshal.Copy(zero, value, 0, (int)num); + WclBleGattClient.WCLGattClientFreeMem(zero); + } + return num2; + } + + // Token: 0x06002098 RID: 8344 RVA: 0x00087953 File Offset: 0x00085B53 + public int SubscribeCharacteristic(GattCharacteristic characteristic) + { + return WclBleGattClient.WCLGattClientSubscribeCharacteristic(this.mPtr, ref characteristic); + } + + // Token: 0x06002099 RID: 8345 RVA: 0x00087968 File Offset: 0x00085B68 + public int WriteCharacteristic(GattCharacteristic characteristic, byte[] value) + { + IntPtr intPtr; + try + { + intPtr = Marshal.AllocHGlobal(value.Length); + } + catch + { + intPtr = IntPtr.Zero; + } + if (intPtr == IntPtr.Zero) + { + return 65537; + } + Marshal.Copy(value, 0, intPtr, value.Length); + int result = WclBleGattClient.WCLGattClientWriteCharacteristicValue(this.mPtr, ref characteristic, intPtr, (uint)value.Length); + Marshal.FreeHGlobal(intPtr); + return result; + } + + // Token: 0x0600209A RID: 8346 RVA: 0x000879D4 File Offset: 0x00085BD4 + public void Dispose() + { + WclBleGattClient.WCLGattClientDestroy(this.mPtr); + this.mPtr = IntPtr.Zero; + this.rPtr = IntPtr.Zero; + this.CConnectEvent = null; + this.CDisconnectEvent = null; + this.FCharacteristicChangedEvent = null; + } + + // Token: 0x0600209B RID: 8347 RVA: 0x00087A0C File Offset: 0x00085C0C + private void OnCharacteristicChanged(IntPtr sender, ushort handle, IntPtr pValue, uint valueLen) + { + //Debug.Log("char changed"); + if (pValue != IntPtr.Zero && valueLen > 0U) + { + byte[] array = new byte[valueLen]; + Marshal.Copy(pValue, array, 0, (int)valueLen); + try + { + WclBleGattClient.GattCharacteristicChanged characteristicChanged = this.CharacteristicChanged; + if (characteristicChanged != null) + { + characteristicChanged(this, handle, array); + } + } + catch (Exception arg) + { + //WclBleGattClient.log.Error(string.Format("GattConnection characteristic changed callback processing error - {0}", arg), Array.Empty()); + } + } + } + + // Token: 0x0600209C RID: 8348 RVA: 0x00087A80 File Offset: 0x00085C80 + private void OnConnected(IntPtr client, int error) + { + try + { + WclBleGattClient.GattConnectionChanged connected = this.Connected; + if (connected != null) + { + connected(this, error); + } + } + catch (Exception arg) + { + //WclBleGattClient.log.Error(string.Format("GattConnection connect callback processing error - {0}", arg), Array.Empty()); + Debug.LogError(arg); + } + } + + // Token: 0x0600209D RID: 8349 RVA: 0x00087AD0 File Offset: 0x00085CD0 + private void OnDisconnected(IntPtr client, int reason) + { + try + { + WclBleGattClient.GattConnectionChanged disconnected = this.Disconnected; + if (disconnected != null) + { + disconnected(this, reason); + } + } + catch (Exception arg) + { + //WclBleGattClient.log.Error(string.Format("GattConnection disconnect callback processing error - {0}", arg), Array.Empty()); + } + } + + // Token: 0x0400130B RID: 4875 + public WclBleGattClient.GattCharacteristicChanged CharacteristicChanged; + + // Token: 0x0400130C RID: 4876 + public WclBleGattClient.GattConnectionChanged Connected; + + // Token: 0x0400130D RID: 4877 + public WclBleGattClient.GattConnectionChanged Disconnected; + + // Token: 0x0400130F RID: 4879 + private WclBleGattClient.GATTCLIENT_CONNECT CConnectEvent; + + // Token: 0x04001310 RID: 4880 + private WclBleGattClient.GATTCLIENT_DISCONNECT CDisconnectEvent; + + // Token: 0x04001311 RID: 4881 + private WclBleGattClient.GATTCLIENT_ONCHANGED FCharacteristicChangedEvent; + + // Token: 0x04001312 RID: 4882 + private readonly long gattAddress; + + // Token: 0x04001313 RID: 4883 + private IntPtr mPtr; + + // Token: 0x04001314 RID: 4884 + private IntPtr rPtr; + + // Token: 0x020008FB RID: 2299 + // (Invoke) Token: 0x06003F5A RID: 16218 + public delegate void GattCharacteristicChanged(WclBleGattClient connection, ushort handle, byte[] value); + + // Token: 0x020008FC RID: 2300 + // (Invoke) Token: 0x06003F5E RID: 16222 + public delegate void GattConnectionChanged(WclBleGattClient connection, int error); + + // Token: 0x020008FD RID: 2301 + // (Invoke) Token: 0x06003F62 RID: 16226 + [UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = false)] + private delegate void GATTCLIENT_CONNECT([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Sender, [MarshalAs(UnmanagedType.I4)][In] int Error); + + // Token: 0x020008FE RID: 2302 + // (Invoke) Token: 0x06003F66 RID: 16230 + [UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = false)] + private delegate void GATTCLIENT_DISCONNECT([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Sender, [MarshalAs(UnmanagedType.I4)][In] int Reason); + + // Token: 0x020008FF RID: 2303 + // (Invoke) Token: 0x06003F6A RID: 16234 + [UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = false)] + private delegate void GATTCLIENT_ONCHANGED([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Sender, [MarshalAs(UnmanagedType.U2)][In] ushort Handle, [MarshalAs(UnmanagedType.SysInt)][In] IntPtr Value, [MarshalAs(UnmanagedType.U4)][In] uint ValueLen); + + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleGattClient.cs.meta b/Assets/Scripts/Devices/Ble/Win/WclBleGattClient.cs.meta new file mode 100644 index 00000000..1442e67b --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleGattClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c6d5039e76dd26d40a81e37ae83d2587 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleGattThread.cs b/Assets/Scripts/Devices/Ble/Win/WclBleGattThread.cs new file mode 100644 index 00000000..869a7cb1 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleGattThread.cs @@ -0,0 +1,403 @@ +using Assets.Scripts.Ble.Win; +using Assets.Scripts.Ble.Win.CPPBridge; +using Assets.Scripts.Devices.Ble; +using Assets.Scripts.Devices.Ble.Win; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Ble +{ + internal class WclBleGattThread + { + public delegate void GattCharacteristicChangedDelegate(WclBleGattThread gattClient, BleCharacteristicInfo characteristic, BleResponse response); + public delegate void GattCharacteristicReadDelegate(WclBleGattThread gattClient, BleCharacteristicInfo characteristic, BleResponse response); + public delegate void GattCharacteristicsDiscoveredDelegate(WclBleGattThread gattClient, BleServiceInfo service, BleResponse> response); + public delegate void GattCharacteristicSubscribedDelegate(WclBleGattThread gattClient, BleCharacteristicInfo characteristic, BleResponse response); + public delegate void GattCharacteristicWroteDelegate(WclBleGattThread gattClient, BleCharacteristicInfo characteristic, BleResponse response); + + + private WclBleGattThread.GattCharacteristicChangedDelegate gattCharacteristicChanged; + private WclBleGattThread.GattCharacteristicReadDelegate gattCharacteristicRead; + + // Token: 0x0400131E RID: 4894 + private WclBleGattThread.GattCharacteristicsDiscoveredDelegate gattCharacteristicsDiscovered; + + // Token: 0x0400131F RID: 4895 + private WclBleGattThread.GattCharacteristicSubscribedDelegate gattCharacteristicsSubscribed; + + + private GattConnected gattConnected; + + // Token: 0x04001322 RID: 4898 + private GattDisconnected gattDisconnected; + + private GattServicesDiscovered gattServicesDiscovered; + + public event WclBleGattThread.GattCharacteristicChangedDelegate GattCharacteristicChanged + { + add + { + this.gattCharacteristicChanged += value; + } + remove + { + this.gattCharacteristicChanged -= value; + } + } + + // Token: 0x14000039 RID: 57 + // (add) Token: 0x060020AE RID: 8366 RVA: 0x00087BB3 File Offset: 0x00085DB3 + // (remove) Token: 0x060020AF RID: 8367 RVA: 0x00087BC7 File Offset: 0x00085DC7 + public event WclBleGattThread.GattCharacteristicReadDelegate GattCharacteristicRead + { + add + { + this.gattCharacteristicRead += value; + } + remove + { + this.gattCharacteristicRead -= value; + } + } + + // Token: 0x1400003A RID: 58 + // (add) Token: 0x060020B0 RID: 8368 RVA: 0x00087BDB File Offset: 0x00085DDB + // (remove) Token: 0x060020B1 RID: 8369 RVA: 0x00087BEF File Offset: 0x00085DEF + public event WclBleGattThread.GattCharacteristicsDiscoveredDelegate GattCharacteristicsDiscovered + { + add + { + this.gattCharacteristicsDiscovered += value; + } + remove + { + this.gattCharacteristicsDiscovered -= value; + } + } + + // Token: 0x1400003B RID: 59 + // (add) Token: 0x060020B2 RID: 8370 RVA: 0x00087C03 File Offset: 0x00085E03 + // (remove) Token: 0x060020B3 RID: 8371 RVA: 0x00087C17 File Offset: 0x00085E17 + public event WclBleGattThread.GattCharacteristicSubscribedDelegate GattCharacteristicSubscribed + { + add + { + this.gattCharacteristicsSubscribed += value; + } + remove + { + this.gattCharacteristicsSubscribed -= value; + } + } + + private WclBleGattThread.GattCharacteristicWroteDelegate gattCharacteristicWrote; + public event WclBleGattThread.GattCharacteristicWroteDelegate GattCharacteristicWrote + { + add + { + this.gattCharacteristicWrote += value; + } + remove + { + this.gattCharacteristicWrote -= value; + } + } + + // Token: 0x1400003D RID: 61 + // (add) Token: 0x060020B6 RID: 8374 RVA: 0x00087C53 File Offset: 0x00085E53 + // (remove) Token: 0x060020B7 RID: 8375 RVA: 0x00087C67 File Offset: 0x00085E67 + public event GattConnected GattConnected + { + add + { + this.gattConnected += value; + } + remove + { + this.gattConnected -= value; + } + } + + // Token: 0x1400003E RID: 62 + // (add) Token: 0x060020B8 RID: 8376 RVA: 0x00087C7B File Offset: 0x00085E7B + // (remove) Token: 0x060020B9 RID: 8377 RVA: 0x00087C8F File Offset: 0x00085E8F + public event GattDisconnected GattDisconnected + { + add + { + this.gattDisconnected += value; + } + remove + { + this.gattDisconnected -= value; + } + } + + // Token: 0x1400003F RID: 63 + // (add) Token: 0x060020BA RID: 8378 RVA: 0x00087CA3 File Offset: 0x00085EA3 + // (remove) Token: 0x060020BB RID: 8379 RVA: 0x00087CB7 File Offset: 0x00085EB7 + public event GattServicesDiscovered GattServicesDiscovered + { + add + { + this.gattServicesDiscovered += value; + } + remove + { + this.gattServicesDiscovered -= value; + } + } + private readonly Dictionary charMapping = new Dictionary(); + + private readonly Dictionary servicesMapping = new Dictionary(); + + private readonly Dictionary subscribedCharHandles = new Dictionary(); + + private WclBleGattClient gatt; + private IntPtr rPtr; + private BlePeripheralInfo _bleDevice; + private readonly long address; + + public BlePeripheralInfo Peripheral { get; } + + internal WclBleGattThread(BlePeripheralInfo bleDevice, IntPtr radio) + { + this.Peripheral = bleDevice; + this.rPtr = radio; + _bleDevice = bleDevice; + //this.address = long.Parse(_bleDevice.Address, System.Globalization.NumberStyles.HexNumber); + this.address = long.Parse(_bleDevice.Address); + } + + public bool Start() + { + this.SetUpWorkerThread(); + return true; + } + + private void SetUpWorkerThread() + { + this.gatt = new WclBleGattClient(this.address, this.rPtr) + { + Connected = new WclBleGattClient.GattConnectionChanged(this.OnConnected), + Disconnected = new WclBleGattClient.GattConnectionChanged(this.OnDisconnected), + CharacteristicChanged = new WclBleGattClient.GattCharacteristicChanged(this.OnCharacteristicChanged) + }; + } + + private void OnCharacteristicChanged(WclBleGattClient connection, ushort handle, byte[] value) + { + if (!this.subscribedCharHandles.ContainsKey(handle)) { + return; + } + BleCharacteristicInfo characteristic = this.subscribedCharHandles[handle]; + BleResponse response = new BleResponse + { + IsSuccess = true, + Data = value + }; + this.gattCharacteristicChanged?.Invoke(this, characteristic, response); + } + + private void OnCharacteristicRead(BleCharacteristicInfo characteristic, int result, byte[] data) + { + BleResponse response = new BleResponse + { + IsSuccess = WclBleErrors.IsSuccessCode(result) + }; + if (response.IsSuccess) + { + response.Data = data; + } + else + { + response.Error = new BleHwInterfaceError(new int?(result), "WclBleGattClientErrorDomain", "Error when reading value"); + } + this.gattCharacteristicRead.Invoke(this, characteristic, response); + } + + private void OnCharacteristicsDiscovered(BleServiceInfo service, int result, GattCharacteristics characteristics) + { + BleResponse> response = new BleResponse> + { + IsSuccess = WclBleErrors.IsSuccessCode(result) + }; + if (response.IsSuccess) + { + response.Data = this.ProcessCharacteristics(service, characteristics); + } + else + { + // response.Error = new BleHwInterfaceError(new int?(result), "WclBleGattClientErrorDomain", "Error when reading BLE services"); + } + this.gattCharacteristicsDiscovered(this, service, response); + } + + private void OnConnected(WclBleGattClient sender, int error) + { + BleResponse response = new BleResponse + { + IsSuccess = WclBleErrors.IsSuccessCode(error) + }; + + this.gattConnected?.Invoke(this, response); + } + + private void OnDisconnected(WclBleGattClient sender, int reason) + { + BleResponse response = new BleResponse + { + IsSuccess = true, + Error = new BleHwInterfaceError(new int?(reason), "WclBleGattClientErrorDomain", string.Format("GATT disconnect reason is - {0}", reason)) + }; + this.gattDisconnected?.Invoke(this, response); + } + + public int Connect() + { + this.gatt.Connect(); + return WclBleErrors.WCL_E_SUCCESS; + } + + public int Discounect() + { + this.gatt.Disconnect(); + return WclBleErrors.WCL_E_SUCCESS; + } + + + public int DiscoverServices() + { + GattServices services; + int result = this.gatt.DiscoverServices(out services); + this.OnServicesDiscovered(result, services); + return WclBleErrors.WCL_E_SUCCESS; + } + + private void OnServicesDiscovered(int result, GattServices services) + { + BleResponse> response = new BleResponse> + { + IsSuccess = WclBleErrors.IsSuccessCode(result) + }; + if (response.IsSuccess) + { + response.Data = this.ProcessServices(services); + } + else + { + response.Error = new BleHwInterfaceError(new int?(result), "WclBleGattClientErrorDomain", "Error when reading BLE services"); + } + + gattServicesDiscovered(this, response); + } + + private List ProcessCharacteristics(BleServiceInfo service, GattCharacteristics characteristics) + { + List list = new List((int)characteristics.Count); + for (int i = 0; i < (int)characteristics.Count; i++) + { + GattCharacteristic gattCharacteristic = characteristics.Chars[i]; + WclBleGattThread.WinBleCharacteristicInfo winBleCharacteristicInfo = new WclBleGattThread.WinBleCharacteristicInfo(service, gattCharacteristic.Uuid.WclGuidToNormalizedGuid()); + this.charMapping[winBleCharacteristicInfo] = gattCharacteristic; + list.Add(winBleCharacteristicInfo); + } + return list; + } + private List ProcessServices(GattServices services) + { + List list = new List((int)services.Count); + for (int i = 0; i < (int)services.Count; i++) + { + GattService gattService = services.Services[i]; + WclBleGattThread.WinBleServiceInfo winBleServiceInfo = new WclBleGattThread.WinBleServiceInfo(this._bleDevice, gattService.Uuid.WclGuidToNormalizedGuid()); + this.servicesMapping[winBleServiceInfo] = gattService; + list.Add(winBleServiceInfo); + } + return list; + } + + public int DiscoverCharacteristics(BleServiceInfo service) + { + GattService ns = this.servicesMapping[service]; + + GattCharacteristics characteristics; + int result = this.gatt.DiscoverCharacteristics(ns, out characteristics); + this.OnCharacteristicsDiscovered(service, result, characteristics); + + return WclBleErrors.WCL_E_SUCCESS; + } + + + public int ReadCharacteristicValue(BleCharacteristicInfo characteristic) + { + if (!charMapping.ContainsKey(characteristic)) + { + return WclBleErrors.WCL_E_CONNECTION_NOT_ACTIVE; + } + GattCharacteristic nCh = this.charMapping[characteristic]; + + byte[] data; + int result = this.gatt.ReadCharacteristicValue(nCh, out data); + this.OnCharacteristicRead(characteristic, result, data); + + return WclBleErrors.WCL_E_SUCCESS; + } + + public int SubscribeCharacteristic(BleCharacteristicInfo characteristic) + { + if (!this.charMapping.ContainsKey(characteristic)) + { + return WclBleErrors.WCL_E_CONNECTION_NOT_ACTIVE; + } + + GattCharacteristic nCh = this.charMapping[characteristic]; + + int result = this.gatt.SubscribeCharacteristic(nCh); + this.OnCharacteristicsSubscribed(characteristic, nCh, result); + + return WclBleErrors.WCL_E_SUCCESS; + } + + private void OnCharacteristicsSubscribed(BleCharacteristicInfo characteristic, GattCharacteristic nCharacteristic, int result) + { + Debug.Log("char subscribed"); + BleResponse response = new BleResponse + { + IsSuccess = WclBleErrors.IsSuccessCode(result) + }; + if (response.IsSuccess) + { + this.subscribedCharHandles[nCharacteristic.Handle] = characteristic; + } + else + { + response.Error = new BleHwInterfaceError(new int?(result), "WclBleGattClientErrorDomain", "Error when subscribing Characteristics"); + } + this.gattCharacteristicsSubscribed(this, characteristic, response); + } + + private class WinBleCharacteristicInfo : BleCharacteristicInfo + { + // Token: 0x06003F85 RID: 16261 RVA: 0x000EA274 File Offset: 0x000E8474 + public WinBleCharacteristicInfo(BleServiceInfo service, Guid id) : base(id, service, (BleCharacteristicProperties)0) + { + } + } + + private class WinBleServiceInfo : BleServiceInfo + { + // Token: 0x06003F86 RID: 16262 RVA: 0x000EA27F File Offset: 0x000E847F + public WinBleServiceInfo(BlePeripheralInfo peripheral, Guid id) : base(id, peripheral) + { + } + } + + + + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleGattThread.cs.meta b/Assets/Scripts/Devices/Ble/Win/WclBleGattThread.cs.meta new file mode 100644 index 00000000..f0de77fb --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleGattThread.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 39de45743ce824f4ea156708d5ce5e66 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs b/Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs new file mode 100644 index 00000000..11f9535e --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs @@ -0,0 +1,163 @@ +using Assets.Scripts.Ble.CPPBridge; +using Assets.Scripts.Devices.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Ble +{ + internal class WclBleMainThread + { + internal delegate void ManagerStatusChangedCallback(WclBleMainThread thread, WclBleManagerStatus status); + + private WclBleMainThread.ManagerStatusChangedCallback managerStatusChanged; + public event WclBleMainThread.ManagerStatusChangedCallback ManagerStatusChanged + { + add + { + this.managerStatusChanged += value; + } + remove + { + this.managerStatusChanged -= value; + } + } + + private WclBleManager wclBleManager; + private WclBleWatcher wclWatcher; + private readonly object locker = new object(); + private readonly Dictionary gattClients = new Dictionary(); + internal WclBleMainThread() + { + + } + private Thread wThread; + + public bool Start() + { + //this.wThread = new Thread(new ThreadStart(this.SetUpWorkerThread)); + //this.wThread.Start(); + //Task.Run(() => + //{ + // this.SetUpWorkerThread(); + //}); + + SetUpWorkerThread(); + return true; + } + + private void SetUpWorkerThread() + { + wclBleManager = new WclBleManager + { + ManagerStatusChanged = new WclBleManager.ManagerStatusChangedCallback(this.OnManagerStatusChanged) + + }; + var num = wclBleManager.Open(); + if (num != 0) + { + Debug.LogWarning(string.Format("WCL BLE open failed: 0x{0:X8}", num)); + } + + wclWatcher = new WclBleWatcher + { + InfoPacketReceived = new WclBleWatcher.InfoPacketReceivedEvent(OnInfoPacketReceived), + UuidPacketReceived = new WclBleWatcher.UuidPacketReceivedEvent(OnUuidPacketReceived) + }; + //Debug.Log("bbb"); + } + + private void OnManagerStatusChanged(WclBleManager manager, WclBleManagerStatus status) + { + //Debug.Log(status); + //WclBleMainThread.SafeInvoke(this.managerStatusChanged, this, status); + this.managerStatusChanged(this, status); + } + + private void OnInfoPacketReceived(object sender, long address, long timestamp, sbyte rssi, string name, WclBleAdvertisementType packetType, byte flags) + { + this.scanInfoReceived(this, address, name, rssi, packetType, null); + } + + // Token: 0x060020E7 RID: 8423 RVA: 0x000889ED File Offset: 0x00086BED + private void OnUuidPacketReceived(object sender, long address, long timestamp, sbyte rssi, Guid uuid) + { + this.scanInfoReceived(this, address, null, rssi, WclBleAdvertisementType.Unknown, new Guid?(uuid)); + } + + private static void SafeInvoke(WclBleMainThread.ManagerStatusChangedCallback callback, WclBleMainThread thread, WclBleManagerStatus status) + { + callback.Method.Invoke(callback.Target, new object[] { + thread, + status, + }); + } + + public void Dispose() + { + wclBleManager.Dispose(); + } + + public string Test() + { + return wclBleManager.Test(); + } + + public WclBleGattThread GetGattThread(BlePeripheralInfo info) + { + lock (locker) + { + if (this.gattClients.ContainsKey(info)) + { + return this.gattClients[info]; + } + + return null; + } + } + + public bool StartWatcher() + { + this.wclWatcher.StartScan(this.wclBleManager.Radio); + return true; + } + + + public WclBleGattThread CreateGattThread(BlePeripheralInfo info) + { + lock (locker) + { + if (gattClients.ContainsKey(info)) + { + throw new ArgumentException("gatt thread 已经创建"); + } + + WclBleGattThread wclBleGattThread = new WclBleGattThread(info, this.wclBleManager.Radio); + this.gattClients[info] = wclBleGattThread; + + return wclBleGattThread; + } + } + + public event WclBleMainThread.WclAdvertisementPacketDelegate ScanInfoReceived + { + add + { + this.scanInfoReceived += value; + } + remove + { + this.scanInfoReceived -= value; + } + } + + private WclBleMainThread.WclAdvertisementPacketDelegate scanInfoReceived; + + public delegate void WclAdvertisementPacketDelegate(WclBleMainThread sender, long address, string name, int rssi, WclBleAdvertisementType packetType, Guid? service); + + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs.meta b/Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs.meta new file mode 100644 index 00000000..b5f9bc4d --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1a6d20f12634ae6478884e4f302c6622 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleManager.cs b/Assets/Scripts/Devices/Ble/Win/WclBleManager.cs new file mode 100644 index 00000000..8418b6f8 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleManager.cs @@ -0,0 +1,195 @@ +using Assets.Scripts.Ble.CPPBridge; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Assets.Scripts.Ble +{ + internal class WclBleManager + { + // Token: 0x06002170 RID: 8560 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.SysInt)] + private static extern IntPtr WCLManagerCreate([MarshalAs(UnmanagedType.FunctionPtr)][In] WclBleManager.WCL_MANAGER_STATUS_CHANGED Initialize, [MarshalAs(UnmanagedType.FunctionPtr)][In] WclBleManager.WCL_MANAGER_STATUS_CHANGED StatusCHanges, [MarshalAs(UnmanagedType.FunctionPtr)][In] WCL_NOTIFY_EVENT beforeClose); + + // Token: 0x06002171 RID: 8561 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + private static extern void WCLManagerDestroy([MarshalAs(UnmanagedType.SysInt)][In] IntPtr manager); + + // Token: 0x06002172 RID: 8562 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLManagerOpen([MarshalAs(UnmanagedType.SysInt)][In] IntPtr manager); + + // Token: 0x06002173 RID: 8563 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLManagerClose([MarshalAs(UnmanagedType.SysInt)][In] IntPtr manager); + + // Token: 0x06002174 RID: 8564 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool WCLManagerGetActive([MarshalAs(UnmanagedType.SysInt)][In] IntPtr manager); + + // Token: 0x06002175 RID: 8565 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.SysInt)] + private static extern IntPtr WCLManagerGetRadio([MarshalAs(UnmanagedType.SysInt)][In] IntPtr manager); + + // Token: 0x06002176 RID: 8566 RVA: 0x0008B181 File Offset: 0x00089381 + private void OnInitialized(IntPtr sender, WclBleManagerStatus status) + { + //if (WclBleManager.Info) + //{ + // WclBleManager.log.Info(string.Format("WCLBleManger initialized with state {0}", status), Array.Empty()); + //} + this.BleStatus = status; + } + + // Token: 0x06002177 RID: 8567 RVA: 0x0008B1B0 File Offset: 0x000893B0 + private void OnBeforeClose(IntPtr sender) + { + //if (WclBleManager.Info) + //{ + // WclBleManager.log.Info("Closing WCLBleManager -> BeforeClose called", Array.Empty()); + //} + } + + // Token: 0x06002178 RID: 8568 RVA: 0x0008B1CD File Offset: 0x000893CD + private void OnStatusChanges(IntPtr sender, WclBleManagerStatus status) + { + //if (WclBleManager.Info) + //{ + Debug.Log(string.Format("WCLBleManger state changed -> new state {0}", status)); + //} + + //System.IO.File.WriteAllText("d:/demo.log", status.ToString()); + this.BleStatus = status; + } + + // Token: 0x170005F4 RID: 1524 + // (get) Token: 0x06002179 RID: 8569 RVA: 0x0008B1FC File Offset: 0x000893FC + public bool Active + { + get + { + return WclBleManager.WCLManagerGetActive(this.mPtr); + } + } + + // Token: 0x170005F5 RID: 1525 + // (get) Token: 0x0600217A RID: 8570 RVA: 0x0008B20F File Offset: 0x0008940F + public IntPtr Radio + { + get + { + return WclBleManager.WCLManagerGetRadio(this.mPtr); + } + } + + // Token: 0x170005F6 RID: 1526 + // (get) Token: 0x0600217B RID: 8571 RVA: 0x0008B222 File Offset: 0x00089422 + // (set) Token: 0x0600217C RID: 8572 RVA: 0x0008B22A File Offset: 0x0008942A + public WclBleManagerStatus BleStatus + { + get + { + return this.nativeStatus; + } + private set + { + if (this.nativeStatus != value) + { + this.nativeStatus = value; + WclBleManager.SafeInvoke(this.ManagerStatusChanged, this, this.nativeStatus); + } + } + } + + // Token: 0x170005F7 RID: 1527 + // (get) Token: 0x0600217D RID: 8573 RVA: 0x0008B24E File Offset: 0x0008944E + //public WclBleWatcher BleWatcher { get; } + + // Token: 0x0600217E RID: 8574 RVA: 0x0008B258 File Offset: 0x00089458 + public WclBleManager() + { + this.CInitialized = new WclBleManager.WCL_MANAGER_STATUS_CHANGED(this.OnInitialized); + this.CStatusChanged = new WclBleManager.WCL_MANAGER_STATUS_CHANGED(this.OnStatusChanges); + this.CBeforeClose = new WCL_NOTIFY_EVENT(this.OnBeforeClose); + this.mPtr = WclBleManager.WCLManagerCreate(this.CInitialized, this.CStatusChanged, this.CBeforeClose); + } + + // Token: 0x0600217F RID: 8575 RVA: 0x0008B2BE File Offset: 0x000894BE + public int Open() + { + return WclBleManager.WCLManagerOpen(this.mPtr); + } + + // Token: 0x06002180 RID: 8576 RVA: 0x0008B2D1 File Offset: 0x000894D1 + public int Close() + { + return WclBleManager.WCLManagerClose(this.mPtr); + } + + // Token: 0x06002181 RID: 8577 RVA: 0x0008B2E4 File Offset: 0x000894E4 + public void Dispose() + { + //if (WclBleManager.Debug) + //{ + // WclBleManager.log.Debug("WclBleManger disposed", Array.Empty()); + //} + WclBleManager.WCLManagerDestroy(this.mPtr); + this.mPtr = IntPtr.Zero; + this.CInitialized = null; + this.CBeforeClose = null; + this.CStatusChanged = null; + } + + public string Test() + { + return ""; + } + + // Token: 0x06002182 RID: 8578 RVA: 0x0008B337 File Offset: 0x00089537 + private static void SafeInvoke(WclBleManager.ManagerStatusChangedCallback callback, WclBleManager manager, WclBleManagerStatus status) + { + //ExceptionUtils.SafeInvoke(callback, new object[] + //{ + // manager, + // status + //}, WclBleManager.log); + callback(manager, status); + } + + // Token: 0x04001390 RID: 5008 + public WclBleManager.ManagerStatusChangedCallback ManagerStatusChanged; + + // Token: 0x04001391 RID: 5009 + private IntPtr mPtr; + + // Token: 0x04001392 RID: 5010 + private WclBleManager.WCL_MANAGER_STATUS_CHANGED CInitialized; + + // Token: 0x04001393 RID: 5011 + private WclBleManager.WCL_MANAGER_STATUS_CHANGED CStatusChanged; + + // Token: 0x04001394 RID: 5012 + private WCL_NOTIFY_EVENT CBeforeClose; + + // Token: 0x04001395 RID: 5013 + private WclBleManagerStatus nativeStatus; + + // Token: 0x0200093C RID: 2364 + // (Invoke) Token: 0x06004079 RID: 16505 + internal delegate void ManagerStatusChangedCallback(WclBleManager manager, WclBleManagerStatus status); + + // Token: 0x0200093D RID: 2365 + // (Invoke) Token: 0x0600407D RID: 16509 + [UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = false)] + internal delegate void WCL_MANAGER_STATUS_CHANGED([MarshalAs(UnmanagedType.SysInt)][In] IntPtr sender, WclBleManagerStatus status); + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleManager.cs.meta b/Assets/Scripts/Devices/Ble/Win/WclBleManager.cs.meta new file mode 100644 index 00000000..1598f7f9 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c4b3ea90154c9e4b9cc0446bc75717b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleManagerStatus.cs b/Assets/Scripts/Devices/Ble/Win/WclBleManagerStatus.cs new file mode 100644 index 00000000..bf30522c --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleManagerStatus.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Ble +{ + internal enum WclBleManagerStatus + { + // Token: 0x04001339 RID: 4921 + HardwareNotFound, + // Token: 0x0400133A RID: 4922 + UnsupportedRadio, + // Token: 0x0400133B RID: 4923 + RadioOff, + // Token: 0x0400133C RID: 4924 + RadioOn, + // Token: 0x0400133D RID: 4925 + Unknown + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleManagerStatus.cs.meta b/Assets/Scripts/Devices/Ble/Win/WclBleManagerStatus.cs.meta new file mode 100644 index 00000000..4ce7b8e3 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleManagerStatus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9eb1abc2338676b4b8a7588b06c9f6cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleWatcher.cs b/Assets/Scripts/Devices/Ble/Win/WclBleWatcher.cs new file mode 100644 index 00000000..8be3d505 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleWatcher.cs @@ -0,0 +1,201 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.InteropServices; +using Assets.Scripts.Ble.CPPBridge; +using UnityEngine; + +namespace Assets.Scripts.Ble +{ + internal class WclBleWatcher + { + internal WclBleWatcher() + { + this.CStarted = new WCL_NOTIFY_EVENT(this.OnStart); + this.CStopped = new WCL_NOTIFY_EVENT(this.OnStop); + this.CUuidPacketReceived = new WclBleWatcher.WCL_ADV_UUID_PKT_EVENT(this.OnUuidPacketReceived); + this.CInfoPackageReceived = new WclBleWatcher.WCL_ADV_INFO_PKT_EVENT(this.OnInfoPacketReceived); + this.mPtr = WclBleWatcher.WCLWatcherCreate(this.CInfoPackageReceived, this.CStarted, this.CStopped, this.CUuidPacketReceived); + } + + // Token: 0x170005E5 RID: 1509 + // (get) Token: 0x06002127 RID: 8487 RVA: 0x00089426 File Offset: 0x00087626 + public bool Active + { + get + { + //base.CheckDisposed(); + return WclBleWatcher.WCLWatcherGetActive(this.mPtr); + } + } + + // Token: 0x0600212A RID: 8490 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.SysInt)] + private static extern IntPtr WCLWatcherCreate([MarshalAs(UnmanagedType.FunctionPtr)][In] WclBleWatcher.WCL_ADV_INFO_PKT_EVENT InfoPacketReceived, [MarshalAs(UnmanagedType.FunctionPtr)][In] WCL_NOTIFY_EVENT Started, [MarshalAs(UnmanagedType.FunctionPtr)][In] WCL_NOTIFY_EVENT Stopped, [MarshalAs(UnmanagedType.FunctionPtr)][In] WclBleWatcher.WCL_ADV_UUID_PKT_EVENT UidPacketReceived); + + // Token: 0x0600212B RID: 8491 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + private static extern void WCLWatcherDestroy([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Watcher); + + // Token: 0x0600212C RID: 8492 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool WCLWatcherGetActive([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Watcher); + + // Token: 0x0600212D RID: 8493 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLWatcherStart([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Watcher, [MarshalAs(UnmanagedType.SysInt)][In] IntPtr Radio); + + // Token: 0x0600212E RID: 8494 + [DllImport("WclBlePluginCPP.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.I4)] + private static extern int WCLWatcherStop([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Watcher); + + // Token: 0x0600212F RID: 8495 RVA: 0x00089464 File Offset: 0x00087664 + public void StartScan(IntPtr radio) + { + if (!this.Active) + { + int num = WclBleWatcher.WCLWatcherStart(this.mPtr, radio); + //if (WclBleWatcher.Info) + { + Debug.Log(string.Format("BLE watcher started with result {0}", num)); + } + } + } + + // Token: 0x06002130 RID: 8496 RVA: 0x000894B4 File Offset: 0x000876B4 + public bool StopScan() + { + if (this.Active) + { + int num = WclBleWatcher.WCLWatcherStop(this.mPtr); + + Debug.Log(string.Format("BLE watcher stopped with result {0}", num)); + + return num == 0; + } + return false; + } + + // Token: 0x06002131 RID: 8497 RVA: 0x00089508 File Offset: 0x00087708 + public void Dispose() + { + WclBleWatcher.WCLWatcherDestroy(this.mPtr); + this.mPtr = IntPtr.Zero; + this.CInfoPackageReceived = null; + this.CUuidPacketReceived = null; + this.CStarted = null; + this.CStopped = null; + + Debug.Log("BLE watcher disposed"); + } + + // Token: 0x06002132 RID: 8498 RVA: 0x00089564 File Offset: 0x00087764 + private void OnInfoPacketReceived(IntPtr sender, long address, long timestamp, sbyte rssi, string name, WclBleAdvertisementType packetType, byte flags) + { + //Debug.Log($"address:{ address }, name:{ name }, rssi:{ rssi }, type:{ packetType }"); + //delegate + //{ + // WclBleWatcher.SafeInvoke(this.InfoPacketReceived, this, address, timestamp, rssi, name, packetType, flags); + //}.OnUIThreadAsync(); + this.InfoPacketReceived(this, address, timestamp, rssi, name, packetType, flags); + } + + // Token: 0x06002133 RID: 8499 RVA: 0x000895BC File Offset: 0x000877BC + private void OnUuidPacketReceived(IntPtr sender, long address, long timestamp, sbyte rssi, Guid uuid) + { + //Debug.Log($"uuid:{ uuid.ToString() }, address:{ address }, rssi:{ rssi }"); + //delegate + //{ + // WclBleWatcher.SafeInvoke(this.UuidPacketReceived, this, address, timestamp, rssi, uuid); + //}.OnUIThreadAsync(); + + this.UuidPacketReceived(this, address, timestamp, rssi, uuid); + } + + // Token: 0x06002134 RID: 8500 RVA: 0x000895F9 File Offset: 0x000877F9 + private void OnStart(IntPtr Sender) + { + Debug.Log("watcher started"); + } + + // Token: 0x06002135 RID: 8501 RVA: 0x0008960F File Offset: 0x0008780F + private void OnStop(IntPtr Sender) + { + Debug.Log("Watcher closed"); + } + + // Token: 0x06002136 RID: 8502 RVA: 0x00089628 File Offset: 0x00087828 + private static void SafeInvoke(WclBleWatcher.InfoPacketReceivedEvent callback, object sender, long address, long timestamp, sbyte rssi, string name, WclBleAdvertisementType packetType, byte flags) + { + //ExceptionUtils.SafeInvoke(callback, new object[] + //{ + // sender, + // address, + // timestamp, + // rssi, + // name, + // packetType, + // flags + //}, WclBleWatcher.log); + } + + // Token: 0x06002137 RID: 8503 RVA: 0x0008967F File Offset: 0x0008787F + private static void SafeInvoke(WclBleWatcher.UuidPacketReceivedEvent callback, object sender, long address, long timestamp, sbyte rssi, Guid uuid) + { + //ExceptionUtils.SafeInvoke(callback, new object[] + //{ + // sender, + // address, + // timestamp, + // rssi, + // uuid + //}, WclBleWatcher.log); + } + + // Token: 0x04001348 RID: 4936 + public WclBleWatcher.InfoPacketReceivedEvent InfoPacketReceived; + + // Token: 0x04001349 RID: 4937 + public WclBleWatcher.UuidPacketReceivedEvent UuidPacketReceived; + + // Token: 0x0400134B RID: 4939 + private WclBleWatcher.WCL_ADV_INFO_PKT_EVENT CInfoPackageReceived; + + // Token: 0x0400134C RID: 4940 + private WCL_NOTIFY_EVENT CStarted; + + // Token: 0x0400134D RID: 4941 + private WCL_NOTIFY_EVENT CStopped; + + // Token: 0x0400134E RID: 4942 + private WclBleWatcher.WCL_ADV_UUID_PKT_EVENT CUuidPacketReceived; + + // Token: 0x0400134F RID: 4943 + private IntPtr mPtr; + + // Token: 0x02000919 RID: 2329 + // (Invoke) Token: 0x06003FB3 RID: 16307 + public delegate void InfoPacketReceivedEvent(object Sender, long Address, long Timestamp, sbyte Rssi, string Name, WclBleAdvertisementType PacketType, byte Flags); + + // Token: 0x0200091A RID: 2330 + // (Invoke) Token: 0x06003FB7 RID: 16311 + public delegate void UuidPacketReceivedEvent(object Sender, long Address, long Timestamp, sbyte Rssi, Guid Uuid); + + // Token: 0x0200091B RID: 2331 + // (Invoke) Token: 0x06003FBB RID: 16315 + [UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = false)] + private delegate void WCL_ADV_INFO_PKT_EVENT([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Sender, [MarshalAs(UnmanagedType.I8)][In] long Address, [MarshalAs(UnmanagedType.I8)][In] long Timestamp, [MarshalAs(UnmanagedType.I1)][In] sbyte Rssi, [MarshalAs(UnmanagedType.LPWStr)][In] string Name, [MarshalAs(UnmanagedType.U4)][In] WclBleAdvertisementType PacketType, [MarshalAs(UnmanagedType.U1)][In] byte Flags); + + // Token: 0x0200091C RID: 2332 + // (Invoke) Token: 0x06003FBF RID: 16319 + [UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = false)] + private delegate void WCL_ADV_UUID_PKT_EVENT([MarshalAs(UnmanagedType.SysInt)][In] IntPtr Sender, [MarshalAs(UnmanagedType.I8)][In] long Address, [MarshalAs(UnmanagedType.I8)][In] long Timestamp, [MarshalAs(UnmanagedType.I1)][In] sbyte Rssi, [In] Guid Uuid); + + } +} diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleWatcher.cs.meta b/Assets/Scripts/Devices/Ble/Win/WclBleWatcher.cs.meta new file mode 100644 index 00000000..c62dbfa2 --- /dev/null +++ b/Assets/Scripts/Devices/Ble/Win/WclBleWatcher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4edd43fac4981e04b833e77483087f81 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Commands.meta b/Assets/Scripts/Devices/Commands.meta new file mode 100644 index 00000000..91f9658f --- /dev/null +++ b/Assets/Scripts/Devices/Commands.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a2364164ca52b2d448ea4ae2a32e4fc5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Commands/Command.cs b/Assets/Scripts/Devices/Commands/Command.cs new file mode 100644 index 00000000..12c63aeb --- /dev/null +++ b/Assets/Scripts/Devices/Commands/Command.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Commands +{ + public sealed class Command + { + public CommandType Type { get; } + + // Token: 0x17000562 RID: 1378 + // (get) Token: 0x06001DF3 RID: 7667 RVA: 0x0007E52C File Offset: 0x0007C72C + public CommandAction Action { get; } + + // Token: 0x17000563 RID: 1379 + // (get) Token: 0x06001DF4 RID: 7668 RVA: 0x0007E534 File Offset: 0x0007C734 + public object Parameters { get; } + + public Command(CommandType type, CommandAction action) : this(type, null, action) + { + } + + public Command(CommandType type, object parameters, CommandAction action) + { + this.Type = type; + this.Action = action; + this.Parameters = parameters; + } + } +} diff --git a/Assets/Scripts/Devices/Commands/Command.cs.meta b/Assets/Scripts/Devices/Commands/Command.cs.meta new file mode 100644 index 00000000..348d604f --- /dev/null +++ b/Assets/Scripts/Devices/Commands/Command.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bf2dd0151702c7b44bd89069c600abdf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Commands/CommandAction.cs b/Assets/Scripts/Devices/Commands/CommandAction.cs new file mode 100644 index 00000000..940bf9c8 --- /dev/null +++ b/Assets/Scripts/Devices/Commands/CommandAction.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Commands +{ + public delegate void CommandAction(CommandResponseStatus responseStatus, object responseData); +} diff --git a/Assets/Scripts/Devices/Commands/CommandAction.cs.meta b/Assets/Scripts/Devices/Commands/CommandAction.cs.meta new file mode 100644 index 00000000..d8b8d8a3 --- /dev/null +++ b/Assets/Scripts/Devices/Commands/CommandAction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d7be1a82849ca5489cbe39940c1e9ab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Commands/CommandFactory.cs b/Assets/Scripts/Devices/Commands/CommandFactory.cs new file mode 100644 index 00000000..890aa8e0 --- /dev/null +++ b/Assets/Scripts/Devices/Commands/CommandFactory.cs @@ -0,0 +1,35 @@ +using Assets.Scripts.Ble.Commands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Commands +{ + public static class CommandFactory + { + public static Command GetBatteryLevel(Action action = null) + { + return new Command(CommandType.GetBatteryLevel, CommandFactory.InjectCommandAction(action)); + } + + private static CommandAction InjectCommandAction(Action action) where T : struct + { + if (action == null) + { + return null; + } + return delegate (CommandResponseStatus status, object data) + { + T? arg = data as T?; + if (data != null && arg == null) + { + action(new CommandResponseStatus(status.Type, CommandResponseCode.TypeMismatch), null); + return; + } + action(status, arg); + }; + } + } +} diff --git a/Assets/Scripts/Devices/Commands/CommandFactory.cs.meta b/Assets/Scripts/Devices/Commands/CommandFactory.cs.meta new file mode 100644 index 00000000..01af21a9 --- /dev/null +++ b/Assets/Scripts/Devices/Commands/CommandFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f3273ce1de02c2c49adbdce0197d700e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Commands/CommandResponseStatus.cs b/Assets/Scripts/Devices/Commands/CommandResponseStatus.cs new file mode 100644 index 00000000..766aa66d --- /dev/null +++ b/Assets/Scripts/Devices/Commands/CommandResponseStatus.cs @@ -0,0 +1,35 @@ +using Assets.Scripts.Ble.Commands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Commands +{ + public sealed class CommandResponseStatus + { + public CommandResponseCode ResponseCode { get; } + + // Token: 0x17000565 RID: 1381 + // (get) Token: 0x06001E0C RID: 7692 RVA: 0x0007E7DC File Offset: 0x0007C9DC + public CommandType Type { get; } + + // Token: 0x17000566 RID: 1382 + // (get) Token: 0x06001E0D RID: 7693 RVA: 0x0007E7E4 File Offset: 0x0007C9E4 + public bool IsSuccess + { + get + { + return this.ResponseCode == CommandResponseCode.Success; + } + } + + // Token: 0x06001E0E RID: 7694 RVA: 0x0007E7EF File Offset: 0x0007C9EF + public CommandResponseStatus(CommandType type, CommandResponseCode responseCode) + { + this.ResponseCode = responseCode; + this.Type = type; + } + } +} diff --git a/Assets/Scripts/Devices/Commands/CommandResponseStatus.cs.meta b/Assets/Scripts/Devices/Commands/CommandResponseStatus.cs.meta new file mode 100644 index 00000000..6e1406e8 --- /dev/null +++ b/Assets/Scripts/Devices/Commands/CommandResponseStatus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e4aa7fe902c40744b67a6cc6dfc5f6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Commands/CommandType.cs b/Assets/Scripts/Devices/Commands/CommandType.cs new file mode 100644 index 00000000..3ee9cef8 --- /dev/null +++ b/Assets/Scripts/Devices/Commands/CommandType.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Commands +{ + [Flags] + public enum CommandType : long + { + // Token: 0x04000FF5 RID: 4085 + None = 0L, + // Token: 0x04000FF6 RID: 4086 + SetTargetPower = 1L, + // Token: 0x04000FF7 RID: 4087 + SetSimParameters = 2L, + // Token: 0x04000FF8 RID: 4088 + SetTargetGear = 4L, + // Token: 0x04000FF9 RID: 4089 + GetCurrentGear = 8L, + // Token: 0x04000FFA RID: 4090 + GetResistanceControlType = 16L, + // Token: 0x04000FFB RID: 4091 + SetResistanceControlType = 32L, + // Token: 0x04000FFC RID: 4092 + SupportGearing = 64L, + // Token: 0x04000FFD RID: 4093 + SetCircumference = 128L, + // Token: 0x04000FFE RID: 4094 + SetSystemWeight = 256L, + // Token: 0x04000FFF RID: 4095 + SetTargetInclination = 512L, + // Token: 0x04001000 RID: 4096 + GetAutoZeroSupport = 1024L, + // Token: 0x04001001 RID: 4097 + GetAutoZero = 2048L, + // Token: 0x04001002 RID: 4098 + SetAutoZero = 4096L, + // Token: 0x04001003 RID: 4099 + SetManualZeroSupport = 8192L, + // Token: 0x04001004 RID: 4100 + SetManualZero = 16384L, + // Token: 0x04001005 RID: 4101 + RequestCrankLength = 32768L, + // Token: 0x04001006 RID: 4102 + SetCrankLength = 65536L, + // Token: 0x04001007 RID: 4103 + WarmupRollDownCalibration = 131072L, + // Token: 0x04001008 RID: 4104 + StartRollDownCalibration = 262144L, + // Token: 0x04001009 RID: 4105 + StopRollDownCalibration = 524288L, + // Token: 0x0400100A RID: 4106 + GetRollDownCalibrationStatus = 1048576L, + // Token: 0x0400100B RID: 4107 + GetRollDownCalibrationParameters = 2097152L, + // Token: 0x0400100C RID: 4108 + GetRollDownCalibrationType = 4194304L, + // Token: 0x0400100D RID: 4109 + GetBatteryLevel = 1073741824L, + // Token: 0x0400100E RID: 4110 + GetPnPId = 2147483648L, + // Token: 0x0400100F RID: 4111 + GetSensorLocation = 549755813888L, + // Token: 0x04001010 RID: 4112 + GetSupportedSensorLocations = 1099511627776L, + // Token: 0x04001011 RID: 4113 + RequestFtmsControl = 1125899906842624L, + // Token: 0x04001012 RID: 4114 + StartTraining = 2251799813685248L, + // Token: 0x04001013 RID: 4115 + PauseTraining = 4503599627370496L, + // Token: 0x04001014 RID: 4116 + ResumeTraining = 9007199254740992L, + // Token: 0x04001015 RID: 4117 + StopTraining = 18014398509481984L, + // Token: 0x04001016 RID: 4118 + RequestAntPage = 1152921504606846976L, + // Token: 0x04001017 RID: 4119 + CyclingDevice = 1073741839L, + // Token: 0x04001018 RID: 4120 + RunningDevice = 1073741826L, + // Token: 0x04001019 RID: 4121 + TrainingController = 33776997205278720L + } +} diff --git a/Assets/Scripts/Devices/Commands/CommandType.cs.meta b/Assets/Scripts/Devices/Commands/CommandType.cs.meta new file mode 100644 index 00000000..3202420a --- /dev/null +++ b/Assets/Scripts/Devices/Commands/CommandType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a68646ff4441e2f4f8ea96a3056525d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/ConnectionInterface.cs b/Assets/Scripts/Devices/ConnectionInterface.cs new file mode 100644 index 00000000..b5f6b4b0 --- /dev/null +++ b/Assets/Scripts/Devices/ConnectionInterface.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices +{ + public enum ConnectionInterface + { + BLE, + // Token: 0x04000F34 RID: 3892 + ANT, + } +} diff --git a/Assets/Scripts/Devices/ConnectionInterface.cs.meta b/Assets/Scripts/Devices/ConnectionInterface.cs.meta new file mode 100644 index 00000000..8e4c79af --- /dev/null +++ b/Assets/Scripts/Devices/ConnectionInterface.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f6046f9ad97fcc40852598494f5038a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/DeviceAdapter.cs b/Assets/Scripts/Devices/DeviceAdapter.cs new file mode 100644 index 00000000..d38547e3 --- /dev/null +++ b/Assets/Scripts/Devices/DeviceAdapter.cs @@ -0,0 +1,30 @@ +using Assets.Scripts.Devices.Ant; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices +{ + public abstract class DeviceAdapter : IDisposable + { + public abstract ConnectionInterface Interface { get; } + + + public abstract DeviceAdapterState GetState(); + + public abstract IEnumerable GetDevices(); + + public abstract void StartScan(); + + public abstract void StopScan(); + + public virtual void Dispose() + { + + } + + + } +} diff --git a/Assets/Scripts/Devices/DeviceAdapter.cs.meta b/Assets/Scripts/Devices/DeviceAdapter.cs.meta new file mode 100644 index 00000000..5342b235 --- /dev/null +++ b/Assets/Scripts/Devices/DeviceAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 939bd48cf939e254f9ac83fce8a21377 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/DeviceAdapterState.cs b/Assets/Scripts/Devices/DeviceAdapterState.cs new file mode 100644 index 00000000..5e54dc5d --- /dev/null +++ b/Assets/Scripts/Devices/DeviceAdapterState.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices +{ + public enum DeviceAdapterState + { + Unavailable, + On + } +} diff --git a/Assets/Scripts/Devices/DeviceAdapterState.cs.meta b/Assets/Scripts/Devices/DeviceAdapterState.cs.meta new file mode 100644 index 00000000..40cffe3a --- /dev/null +++ b/Assets/Scripts/Devices/DeviceAdapterState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 31b98212ebf6189499c66311681482ed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Devices/Ant/DeviceState.cs b/Assets/Scripts/Devices/DeviceState.cs similarity index 100% rename from Assets/Scripts/Devices/Ant/DeviceState.cs rename to Assets/Scripts/Devices/DeviceState.cs diff --git a/Assets/Scripts/Devices/Ant/DeviceState.cs.meta b/Assets/Scripts/Devices/DeviceState.cs.meta similarity index 100% rename from Assets/Scripts/Devices/Ant/DeviceState.cs.meta rename to Assets/Scripts/Devices/DeviceState.cs.meta diff --git a/Assets/Scripts/Devices/MainDeviceAdapter.cs b/Assets/Scripts/Devices/MainDeviceAdapter.cs new file mode 100644 index 00000000..c1e93101 --- /dev/null +++ b/Assets/Scripts/Devices/MainDeviceAdapter.cs @@ -0,0 +1,73 @@ +using Assets.Scripts.Devices.Ant; +using Assets.Scripts.Devices.Ble; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Devices +{ + public sealed class MainDeviceAdapter : IDisposable + { + private List adapters = new List(); + public MainDeviceAdapter() + { + this.CreateAntAdapter(); + this.CreateBleAdapter(); + } + + private void CreateAntAdapter() + { + adapters.Add(new AntDeviceAdapter()); + } + + private void CreateBleAdapter() + { + adapters.Add(new BleDeviceAdapter()); + } + + public void StartScan() + { + adapters.ForEach(item => + { + item.StartScan(); + }); + } + + public void StopScan() + { + + } + + public DeviceAdapterState GetState(ConnectionInterface connectionInterface) + { + var adapter = adapters.FirstOrDefault(a => a.Interface == connectionInterface); + if(adapter != null) + { + return adapter.GetState(); + } + return DeviceAdapterState.Unavailable; + } + + public IEnumerable GetDevices() + { + var result = new List(); + foreach (var item in adapters) + { + result.AddRange(item.GetDevices()); + } + + return result; + } + + public void Dispose() + { + //throw new NotImplementedException(); + foreach (var item in adapters) + { + item.Dispose(); + } + } + } +} diff --git a/Assets/Scripts/Devices/MainDeviceAdapter.cs.meta b/Assets/Scripts/Devices/MainDeviceAdapter.cs.meta new file mode 100644 index 00000000..ba6aa1cc --- /dev/null +++ b/Assets/Scripts/Devices/MainDeviceAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2239cfdb557e6714f85ce68cf6a2ce0a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Scenes/MainController.cs b/Assets/Scripts/Scenes/MainController.cs index 4bf4fa70..9fa86c3b 100644 --- a/Assets/Scripts/Scenes/MainController.cs +++ b/Assets/Scripts/Scenes/MainController.cs @@ -18,18 +18,19 @@ public class MainController : MonoBehaviour Version.text = "V"+App.AppVersion; DeviceCache.Init(PFConstants.DeviceCacheFolder); - AntConnector.Instance((device2) => { - if (device2.State == DeviceState.Disconnected) - { - //Debug.Log($"探索到新的设备{ device2.DeviceNumber }"); - //自动连接 - if (DeviceCache.Exist(device2)) - { - Debug.Log("自动连接" + device2.DeviceNumber); - device2.Connect(); - } - } - }, Debug.Log); + //AntConnector.Instance((device2) => { + // if (device2.State == DeviceState.Disconnected) + // { + // //Debug.Log($"探索到新的设备{ device2.DeviceNumber }"); + // //自动连接 + // if (DeviceCache.Exist(device2)) + // { + // Debug.Log("自动连接" + device2.DeviceNumber); + // device2.Connect(); + // } + // } + //}, Debug.Log); + App.MainDeviceAdapter.StartScan(); //Debug.Log(Application.dataPath); @@ -89,6 +90,6 @@ public class MainController : MonoBehaviour private void OnApplicationQuit() { - AntConnector.Instance().Dispose(); + App.MainDeviceAdapter.Dispose(); } } diff --git a/Assets/Scripts/UI/Prefab/Device/ConnectDeviceModal.cs b/Assets/Scripts/UI/Prefab/Device/ConnectDeviceModal.cs index 446931be..1175eb8d 100644 --- a/Assets/Scripts/UI/Prefab/Device/ConnectDeviceModal.cs +++ b/Assets/Scripts/UI/Prefab/Device/ConnectDeviceModal.cs @@ -10,6 +10,7 @@ using Assets.Scripts.Devices.Ant.Interfaces; using Assets.Scripts.UI.Control; using Assets.Scripts; using Assets.Scripts.UI.Prefab.Device; +using Assets.Scripts.Devices; public class ConnectDeviceModal : PFUIPanel { @@ -126,26 +127,26 @@ public class ConnectDeviceModal : PFUIPanel { //Debug.Log(AntConnector.Instance().discoveredDevices.Count(d => d.Sensor == SensorType)); - var devices = new List(); - var a = AntConnector.Instance().discoveredDevices; + var devices = new List(); + //var a = AntConnector.Instance().discoveredDevices; switch (SensorType) { case SensorType.Cadence: - devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is ICadenceDevice && d.State == DeviceState.Connected)).OrderBy(d=>d.Priority).ToList(); + devices = App.MainDeviceAdapter.GetDevices().Where(d => d.Sensor == SensorType || (d is ICadenceDevice && d.State == DeviceState.Connected)).OrderBy(d=>d.Priority).ToList(); break; case SensorType.HeartRate: - devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is IHeartRateDevice && d.State == DeviceState.Connected)).OrderBy(d => d.Priority).ToList(); + devices = App.MainDeviceAdapter.GetDevices().Where(d => d.Sensor == SensorType || (d is IHeartRateDevice && d.State == DeviceState.Connected)).OrderBy(d => d.Priority).ToList(); break; case SensorType.Power: - devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is IPowerDevice && d.State == DeviceState.Connected)).OrderBy(d=>d.Priority).ToList(); + devices = App.MainDeviceAdapter.GetDevices().Where(d => d.Sensor == SensorType || (d is IPowerDevice && d.State == DeviceState.Connected)).OrderBy(d=>d.Priority).ToList(); break; case SensorType.Speed: break; case SensorType.SpeedCadence: - devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is ISpeedDevice && d.State == DeviceState.Connected)).OrderBy(d => d.Priority).ToList(); + devices = App.MainDeviceAdapter.GetDevices().Where(d => d.Sensor == SensorType || (d is ISpeedDevice && d.State == DeviceState.Connected)).OrderBy(d => d.Priority).ToList(); break; case SensorType.Trainer: - devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType).ToList(); + devices = App.MainDeviceAdapter.GetDevices().Where(d => d.Sensor == SensorType).ToList(); break; case SensorType.VirtualPower: break; diff --git a/Assets/Scripts/UI/Prefab/Device/DeviceCache.cs b/Assets/Scripts/UI/Prefab/Device/DeviceCache.cs index ebaaf8e6..ff934417 100644 --- a/Assets/Scripts/UI/Prefab/Device/DeviceCache.cs +++ b/Assets/Scripts/UI/Prefab/Device/DeviceCache.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using System.Collections.Concurrent; using UnityEngine; using Newtonsoft.Json; +using Assets.Scripts.Devices; namespace Assets.Scripts.UI.Prefab.Device { @@ -36,7 +37,7 @@ namespace Assets.Scripts.UI.Prefab.Device } } - public static void Add(AbstractAntDevice antDevice) + public static void Add(AbstractDevice antDevice) { Debug.Log("添加设备" + antDevice.DeviceNumber); @@ -52,7 +53,7 @@ namespace Assets.Scripts.UI.Prefab.Device Write(); } - public static bool Exist(AbstractAntDevice antDevice) + public static bool Exist(AbstractDevice antDevice) { ushort a; if(dict.TryGetValue(antDevice.Sensor.ToString(), out a)) @@ -63,7 +64,7 @@ namespace Assets.Scripts.UI.Prefab.Device return false; } - public static void Remove(AbstractAntDevice antDevice) + public static void Remove(AbstractDevice antDevice) { if(dict == null) { diff --git a/Assets/Scripts/UI/Prefab/Device/DeviceItem.cs b/Assets/Scripts/UI/Prefab/Device/DeviceItem.cs index 996023c0..ccee8601 100644 --- a/Assets/Scripts/UI/Prefab/Device/DeviceItem.cs +++ b/Assets/Scripts/UI/Prefab/Device/DeviceItem.cs @@ -1,4 +1,5 @@ -using Assets.Scripts.Devices.Ant; +using Assets.Scripts.Devices; +using Assets.Scripts.Devices.Ant; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -9,7 +10,7 @@ public class DeviceItem : Selectable, IEventSystemHandler, IPointerClickHandler { private bool isOn; private Text mText; - public AbstractAntDevice DeviceInfo + public AbstractDevice DeviceInfo { get;set; } diff --git a/Assets/Scripts/UI/Prefab/Device/DeviceView.cs b/Assets/Scripts/UI/Prefab/Device/DeviceView.cs index 05eb71df..8af5e55f 100644 --- a/Assets/Scripts/UI/Prefab/Device/DeviceView.cs +++ b/Assets/Scripts/UI/Prefab/Device/DeviceView.cs @@ -12,6 +12,7 @@ using Assets.Scripts.UI.UIEffect; using Assets.Scripts; using DG.Tweening; using Assets.Scripts.UI.Prefab.Device; +using Assets.Scripts.Devices; public class DeviceView : MonoBehaviour { @@ -225,7 +226,7 @@ public class DeviceView : MonoBehaviour title.text = GetTitle(); - var hasDevice = AntConnector.Instance().discoveredDevices.Any(d => d.Sensor == SensorType); + var hasDevice = App.MainDeviceAdapter.GetDevices().Any(d => d.Sensor == SensorType); if (hasDevice) { mSearchButton.SetActive(false); @@ -309,7 +310,7 @@ public class DeviceView : MonoBehaviour } - string GetValue(AbstractAntDevice connectedDevice) + string GetValue(AbstractDevice connectedDevice) { switch (SensorType) { @@ -338,19 +339,20 @@ public class DeviceView : MonoBehaviour } return ""; } - AbstractAntDevice GetCurrentDevice() + AbstractDevice GetCurrentDevice() { - return AntConnector.Instance().discoveredDevices.FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType); + //return AntConnector.Instance().discoveredDevices.FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType); + return App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType); } /// /// 获取已经连接的设备 /// /// - AbstractAntDevice GetDevice() + AbstractDevice GetDevice() { //return AntConnector.Instance().discoveredDevices.FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType); - var devices = AntConnector.Instance().discoveredDevices.Where(d => (d.State == DeviceState.Connected)); + var devices = App.MainDeviceAdapter.GetDevices().Where(d => (d.State == DeviceState.Connected)); switch (SensorType) { case SensorType.None: diff --git a/Assets/Scripts/UI/Prefab/Panel/DeviceController.cs b/Assets/Scripts/UI/Prefab/Panel/DeviceController.cs index 0cd3e1c4..6ff744fc 100644 --- a/Assets/Scripts/UI/Prefab/Panel/DeviceController.cs +++ b/Assets/Scripts/UI/Prefab/Panel/DeviceController.cs @@ -109,16 +109,9 @@ public class DeviceController : PFUIPanel timer -= Time.deltaTime; if (timer <= 0) { - Available = AntConnector.Instance().IsAvailable; - //if (AntConnector.Instance().IsAvailable) - //{ - // antStatus.sprite = ant1; - //} - //else - //{ - // antStatus.sprite = ant0; - //} - + //Available = AntConnector.Instance().IsAvailable; + Available = App.MainDeviceAdapter.GetState(Assets.Scripts.Devices.ConnectionInterface.ANT) == Assets.Scripts.Devices.DeviceAdapterState.On; + timer = 1.0f; } }