12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- using System;
- using System.Threading.Tasks;
- using UniRx;
- using UnityEngine;
- namespace Sensors.Polar
- {
- [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 readonly Subject<AccData> rawAccDataSubject = new Subject<AccData>();
- private readonly Subject<EcgData> rawEcgDataSubject = new Subject<EcgData>();
- private readonly Subject<HRData> rawHRDataSubject = new Subject<HRData>();
- private UdpConnection connection;
- private PolarSensorData sensorData;
- public PolarReceiver(PolarSensorConfig config)
- {
- SensorConfig = config;
- }
- public IObservable<EcgData> RawEcgData => rawEcgDataSubject.AsObservable();
- public IObservable<AccData> RawAccData => rawAccDataSubject.AsObservable();
- public IObservable<HRData> RawHRData => rawHRDataSubject.AsObservable();
- public PolarSensorConfig SensorConfig { get; }
- public PolarSensorData SensorData => sensorData;
- 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;
- }
- }
- }
|