接入蓝牙基本结构
This commit is contained in:
1 parent
84e8b50bbf
commit
2f84f70a5f
152 files changed
+6426
-56
No files matched your search
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b2b671ee375ec854c8074b434d7ef555
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 94d000bcb9e71fe4cbc87260ce666252
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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<CrankRevolution, CrankRevolution, double> 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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1dea0a9f55f16ac45bfd5aa6a6eda4f4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c3d7a13de9df31a478b0a0c9dbcb1ac4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: afeabe604a3dc29409ecbf61f6939275
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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<WheelRevolution, WheelRevolution, double> 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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ee3e38fcbff71ea4f90a92eb251bcad4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in new issue
Block a user