1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- using System;
- using System.Threading.Tasks;
- using UniRx;
- using UnityEngine;
- using UnityEngine.Serialization;
- namespace Sensors.Polar
- {
- [System.Serializable]
- public struct PolarSensorConfig
- {
- public int port;
- public string ipAddress;
- [Tooltip("25, 50, 100 or 200")] public int accSampleRate; //TODO: let user choose between 25, 50, 100, 200
- public PolarSensorConfig(int port = 9099, string ipAddress = "0.0.0.0", int accSampleRate = 25)
- {
- this.port = port;
- this.ipAddress = ipAddress;
- this.accSampleRate = accSampleRate;
- }
- }
- public struct PolarSensorData
- {
- public Vector3 Acc;
- public float EcgValue;
- public int Hr;
- }
- public class PolarReceiver
- {
- private UdpConnection connection;
- private PolarSensorData sensorData;
- private readonly Subject<EcgData> rawEcgDataSubject = new Subject<EcgData>();
- private readonly Subject<AccData> rawAccDataSubject = new Subject<AccData>();
- private readonly Subject<HRData> rawHRDataSubject = new Subject<HRData>();
- public IObservable<EcgData> RawEcgData => rawEcgDataSubject.AsObservable();
- public IObservable<AccData> RawAccData => rawAccDataSubject.AsObservable();
-
- public IObservable<HRData> RawHRData => rawHRDataSubject.AsObservable();
- public PolarSensorConfig SensorConfig { get; private set; }
- public PolarSensorData SensorData => sensorData;
- public PolarReceiver(PolarSensorConfig config)
- {
- SensorConfig = config;
- }
- public void StartListening()
- {
- connection = new UdpConnection(SensorConfig.ipAddress, SensorConfig.port, OnAccData, OnEcgData, OnHRData);
- connection.Listen();
- Debug.Log("PolarReceiver: Listening!");
- }
- public void Dispose()
- {
- rawAccDataSubject.Dispose();
- rawEcgDataSubject.Dispose();
- rawHRDataSubject.Dispose();
- connection?.StopListening();
- }
- private async void OnAccData(AccData data)
- {
- rawAccDataSubject.OnNext(data);
- await UpdateSensorDataForAcc(data);
- }
- private async Task UpdateSensorDataForAcc(AccData data)
- {
- foreach (var item in data.Values)
- {
- sensorData.Acc = item;
- await Task.Delay(1000 / SensorConfig.accSampleRate);
- }
- }
- private void OnEcgData(EcgData data)
- {
- rawEcgDataSubject.OnNext(data);
- sensorData.EcgValue = data.Values[0]; //TODO
- }
-
- private void OnHRData(HRData data)
- {
- rawHRDataSubject.OnNext(data);
- sensorData.Hr = data.HeartRate;
- }
- }
- }
|