PolarReceiver.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Threading.Tasks;
  3. using UniRx;
  4. using UnityEngine;
  5. namespace Sensors.Polar
  6. {
  7. [Serializable]
  8. public struct PolarSensorConfig
  9. {
  10. public int port;
  11. public string ipAddress;
  12. [Tooltip("25, 50, 100 or 200")] public int accSampleRate; //TODO: let user choose between 25, 50, 100, 200
  13. public PolarSensorConfig(int port = 9099, string ipAddress = "0.0.0.0", int accSampleRate = 25)
  14. {
  15. this.port = port;
  16. this.ipAddress = ipAddress;
  17. this.accSampleRate = accSampleRate;
  18. }
  19. }
  20. public struct PolarSensorData
  21. {
  22. public Vector3 Acc;
  23. public float EcgValue;
  24. public int Hr;
  25. }
  26. public class PolarReceiver
  27. {
  28. private readonly Subject<AccData> rawAccDataSubject = new Subject<AccData>();
  29. private readonly Subject<EcgData> rawEcgDataSubject = new Subject<EcgData>();
  30. private readonly Subject<HRData> rawHRDataSubject = new Subject<HRData>();
  31. private UdpConnection connection;
  32. private PolarSensorData sensorData;
  33. public PolarReceiver(PolarSensorConfig config)
  34. {
  35. SensorConfig = config;
  36. }
  37. public IObservable<EcgData> RawEcgData => rawEcgDataSubject.AsObservable();
  38. public IObservable<AccData> RawAccData => rawAccDataSubject.AsObservable();
  39. public IObservable<HRData> RawHRData => rawHRDataSubject.AsObservable();
  40. public PolarSensorConfig SensorConfig { get; }
  41. public PolarSensorData SensorData => sensorData;
  42. public void StartListening()
  43. {
  44. connection = new UdpConnection(SensorConfig.ipAddress, SensorConfig.port, OnAccData, OnEcgData, OnHRData);
  45. connection.Listen();
  46. Debug.Log("PolarReceiver: Listening!");
  47. }
  48. public void Dispose()
  49. {
  50. rawAccDataSubject.Dispose();
  51. rawEcgDataSubject.Dispose();
  52. rawHRDataSubject.Dispose();
  53. connection?.StopListening();
  54. }
  55. private async void OnAccData(AccData data)
  56. {
  57. rawAccDataSubject.OnNext(data);
  58. await UpdateSensorDataForAcc(data);
  59. }
  60. private async Task UpdateSensorDataForAcc(AccData data)
  61. {
  62. foreach (var item in data.Values)
  63. {
  64. sensorData.Acc = item;
  65. await Task.Delay(1000 / SensorConfig.accSampleRate);
  66. }
  67. }
  68. private void OnEcgData(EcgData data)
  69. {
  70. rawEcgDataSubject.OnNext(data);
  71. sensorData.EcgValue = data.Values[0]; //TODO
  72. }
  73. private void OnHRData(HRData data)
  74. {
  75. rawHRDataSubject.OnNext(data);
  76. sensorData.Hr = data.HeartRate;
  77. }
  78. }
  79. }