BikeSensorData.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Threading.Tasks;
  5. using ANT_Managed_Library;
  6. using JetBrains.Annotations;
  7. using Sensors.ANT;
  8. using Sensors.Bluetooth;
  9. using Sensors.Polar;
  10. using Sensors.USB;
  11. using UniRx;
  12. using UnityEngine;
  13. namespace Sensors
  14. {
  15. public sealed class BikeSensorData
  16. {
  17. private readonly Subject<object> polarReceiverAvailable = new Subject<object>();
  18. [CanBeNull] private HrReceiver hrReceiver;
  19. [CanBeNull] private BleReceiver bleReceiver;
  20. [CanBeNull] private USBReceiver usbReceiver;
  21. [CanBeNull] private PowerMeterReceiver powerMeterReceiver;
  22. [CanBeNull] private SpeedSensorReceiver speedSensorReceiver;
  23. private BikeSensorData()
  24. {
  25. PolarReceiverAvailable = polarReceiverAvailable.ToTask();
  26. }
  27. public SpeedSensorData? SpeedData =>
  28. speedSensorReceiver?.Connected ?? false ? speedSensorReceiver?.SensorData : null;
  29. public PowermeterSensorData? PowermeterData =>
  30. powerMeterReceiver?.Connected ?? false ? powerMeterReceiver?.SensorData : null;
  31. public HrSensorData? HrData => hrReceiver?.Connected ?? false ? hrReceiver?.SensorData : null;
  32. public BleSensorData? BleData => bleReceiver?.SensorData;
  33. [CanBeNull] public IObservable<EcgData> RawEcgData => bleReceiver?.RawEcgData;
  34. [CanBeNull] public IObservable<AccData> RawAccData => bleReceiver?.RawAccData;
  35. public BleSensorConfig? PolarConfig => bleReceiver?.SensorConfig;
  36. public Task PolarReceiverAvailable { get; }
  37. public USBSensorData? UsbData => usbReceiver?.SensorData;
  38. public void StartListening(SpeedSensorConfig? speedSensorConfig = null,
  39. BleSensorConfig? polarSensorConfig = null,USBSensorConfig? usbSensorConfig = null, int? powermeterId = null, int? hrAntId = null)
  40. {
  41. var awaitDevices = new List<AwaitDevice>();
  42. if (speedSensorConfig != null)
  43. {
  44. if (speedSensorReceiver != null)
  45. throw new InvalidConstraintException(
  46. "BikeSensorData: Already listening to Speed Sensor");
  47. speedSensorReceiver = new SpeedSensorReceiver(speedSensorConfig.Value);
  48. awaitDevices.Add(speedSensorReceiver);
  49. }
  50. if (hrAntId != null)
  51. {
  52. if (hrReceiver != null)
  53. throw new InvalidConstraintException(
  54. "BikeSensorData: Already listening to HR Sensor");
  55. hrReceiver = new HrReceiver(hrAntId.Value);
  56. awaitDevices.Add(hrReceiver);
  57. }
  58. if (powermeterId != null)
  59. {
  60. if (powerMeterReceiver != null)
  61. throw new InvalidConstraintException(
  62. "BikeSensorData: Already listening to Power Sensor");
  63. powerMeterReceiver = new PowerMeterReceiver(powermeterId.Value);
  64. //awaitDevices.Add(powerMeterReceiver);
  65. }
  66. if (awaitDevices.Count > 0)
  67. {
  68. try
  69. {
  70. AntDevices.Instance.StartScan(awaitDevices);
  71. }
  72. catch (Exception e)
  73. {
  74. Debug.Log($"Could not initialize Ant Devices: {e}");
  75. hrReceiver = null;
  76. powerMeterReceiver = null;
  77. speedSensorReceiver = null;
  78. }
  79. }
  80. if (polarSensorConfig != null)
  81. {
  82. if (bleReceiver != null)
  83. throw new InvalidConstraintException(
  84. "BikeSensorData: Already listening to Polar Sensor");
  85. bleReceiver = new BleReceiver(polarSensorConfig.Value);
  86. bleReceiver.StartListening();
  87. polarReceiverAvailable.OnNext(null);
  88. polarReceiverAvailable.OnCompleted();
  89. }
  90. if(usbSensorConfig != null){
  91. if(this.usbReceiver != null){
  92. throw new InvalidConstraintException("BikeSensorData: Already listening to USB Serial Port!");
  93. }
  94. Debug.Log("Init new Usb Sensor Receiver");
  95. this.usbReceiver = new USBReceiver(usbSensorConfig.Value);
  96. this.usbReceiver.StartListening();
  97. }
  98. }
  99. public void Dispose()
  100. {
  101. bleReceiver?.Dispose();
  102. polarReceiverAvailable.Dispose();
  103. usbReceiver?.Dispose();
  104. bleReceiver = null;
  105. speedSensorReceiver = null;
  106. powerMeterReceiver = null;
  107. hrReceiver = null;
  108. }
  109. #region singleton
  110. private static readonly Lazy<BikeSensorData>
  111. lazy =
  112. new Lazy<BikeSensorData>
  113. (() => new BikeSensorData());
  114. public static BikeSensorData Instance => lazy.Value;
  115. #endregion
  116. }
  117. }