BikeSensorData.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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.Serial;
  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 PowerMeterReceiver powerMeterReceiver;
  21. [CanBeNull] private SpeedSensorReceiver speedSensorReceiver;
  22. [CanBeNull] private BreakSensorReveiver breakSensorReceiver;
  23. private BikeSensorData()
  24. {
  25. PolarReceiverAvailable = polarReceiverAvailable.ToTask();
  26. }
  27. public BreakSensorData? BreakData =>
  28. breakSensorReceiver?.Connected ?? false ? breakSensorReceiver?.SensorData : null;
  29. public SpeedSensorData? SpeedData =>
  30. speedSensorReceiver?.Connected ?? false ? speedSensorReceiver?.SensorData : null;
  31. public PowermeterSensorData? PowermeterData =>
  32. powerMeterReceiver?.Connected ?? false ? powerMeterReceiver?.SensorData : null;
  33. public HrSensorData? HrData => hrReceiver?.Connected ?? false ? hrReceiver?.SensorData : null;
  34. public BleSensorData? BleData => bleReceiver?.SensorData;
  35. [CanBeNull] public IObservable<EcgData> RawEcgData => bleReceiver?.RawEcgData;
  36. [CanBeNull] public IObservable<AccData> RawAccData => bleReceiver?.RawAccData;
  37. public BleSensorConfig? PolarConfig => bleReceiver?.SensorConfig;
  38. public Task PolarReceiverAvailable { get; }
  39. public void StartListening(SpeedSensorConfig? speedSensorConfig = null,
  40. BleSensorConfig? polarSensorConfig = null, int? powermeterId = null, int? hrAntId = null)
  41. {
  42. var awaitDevices = new List<AwaitDevice>();
  43. if (speedSensorConfig != null)
  44. {
  45. if (speedSensorReceiver != null)
  46. throw new InvalidConstraintException(
  47. "BikeSensorData: Already listening to Speed Sensor");
  48. speedSensorReceiver = new SpeedSensorReceiver(speedSensorConfig.Value);
  49. awaitDevices.Add(speedSensorReceiver);
  50. }
  51. if (hrAntId != null)
  52. {
  53. if (hrReceiver != null)
  54. throw new InvalidConstraintException(
  55. "BikeSensorData: Already listening to HR Sensor");
  56. hrReceiver = new HrReceiver(hrAntId.Value);
  57. awaitDevices.Add(hrReceiver);
  58. }
  59. if (powermeterId != null)
  60. {
  61. if (powerMeterReceiver != null)
  62. throw new InvalidConstraintException(
  63. "BikeSensorData: Already listening to Power Sensor");
  64. powerMeterReceiver = new PowerMeterReceiver(powermeterId.Value);
  65. //awaitDevices.Add(powerMeterReceiver);
  66. }
  67. if (awaitDevices.Count > 0)
  68. {
  69. try
  70. {
  71. AntDevices.Instance.StartScan(awaitDevices);
  72. }
  73. catch (Exception e)
  74. {
  75. Debug.Log($"Could not initialize Ant Devices: {e}");
  76. hrReceiver = null;
  77. powerMeterReceiver = null;
  78. speedSensorReceiver = null;
  79. }
  80. }
  81. if (polarSensorConfig != null)
  82. {
  83. if (bleReceiver != null)
  84. throw new InvalidConstraintException(
  85. "BikeSensorData: Already listening to Polar Sensor");
  86. bleReceiver = new BleReceiver(polarSensorConfig.Value);
  87. bleReceiver.StartListening();
  88. polarReceiverAvailable.OnNext(null);
  89. polarReceiverAvailable.OnCompleted();
  90. }
  91. }
  92. public void Dispose()
  93. {
  94. bleReceiver?.Dispose();
  95. //TODO: also dispose ANT sensors?
  96. polarReceiverAvailable.Dispose();
  97. bleReceiver = null;
  98. speedSensorReceiver = null;
  99. powerMeterReceiver = null;
  100. hrReceiver = null;
  101. }
  102. #region singleton
  103. private static readonly Lazy<BikeSensorData>
  104. lazy =
  105. new Lazy<BikeSensorData>
  106. (() => new BikeSensorData());
  107. public static BikeSensorData Instance => lazy.Value;
  108. #endregion
  109. }
  110. }