PolarReceiver.cs 2.8 KB

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