public void Export(string path, EmpaticaSession empaticaSession, OcsSession ocsSession) { var directoryName = $"{_directoryName}{DateTime.Now.ToFileTime()}"; var directoryPath = Path.Combine(path, directoryName); var fileName = directoryPath + ".zip"; RxApp.MainThreadScheduler.Schedule(async() => { await Observable.Start(() => { if (!Directory.Exists(directoryPath)) { Directory.CreateDirectory(directoryPath); } var bvp = Path.Combine(directoryPath, $"BVP.{_extension}"); File.WriteAllText(bvp, FormatData(empaticaSession.Bvp.Items)); var ibi = Path.Combine(directoryPath, $"IBI.{_extension}"); File.WriteAllText(ibi, FormatData(empaticaSession.Ibi.Items)); var hr = Path.Combine(directoryPath, $"HR.{_extension}"); File.WriteAllText(hr, FormatData(empaticaSession.Hr.Items)); var gsr = Path.Combine(directoryPath, $"GSR.{_extension}"); File.WriteAllText(gsr, FormatData(empaticaSession.Gsr.Items)); var temperature = Path.Combine(directoryPath, $"Temperature.{_extension}"); File.WriteAllText(temperature, FormatData(empaticaSession.Temperature.Items)); var ocs = Path.Combine(directoryPath, $"OCS.{_extension}"); File.WriteAllText(ocs, FormatData(ocsSession.Ocs.Items)); var nnMean = Path.Combine(directoryPath, $"NNMean.{_extension}"); File.WriteAllText(nnMean, FormatData(ocsSession.NnMean.Items)); var sdNn = Path.Combine(directoryPath, $"SDNN.{_extension}"); File.WriteAllText(sdNn, FormatData(ocsSession.SdNn.Items)); var meanEda = Path.Combine(directoryPath, $"MeanEDA.{_extension}"); File.WriteAllText(meanEda, FormatData(ocsSession.MeanEda.Items)); var peakEda = Path.Combine(directoryPath, $"PeakEda.{_extension}"); File.WriteAllText(peakEda, FormatData(ocsSession.PeakEda.Items)); ZipFile.CreateFromDirectory(directoryPath, fileName); }, RxApp.TaskpoolScheduler); await Share.RequestAsync(new ShareFileRequest { Title = "Export Data", File = new ShareFile(fileName) }); }); }
public CybaticaHandler(IEmpaticaHandler empaticaHandler = null, IDataExporter dataExporter = null) { _empaticaHandler = empaticaHandler ?? Locator.Current.GetService <IEmpaticaHandler>(); _dataExporter = dataExporter ?? Locator.Current.GetService <IDataExporter>(); _empaticaSession = new EmpaticaSession(); _ocsSession = new OcsSession(); _stopwatch = new Stopwatch(); var calculator = new OcsCalculator(); AccelerationConnectable = _empaticaSession.Acceleration.Connect(); BatteryConnectable = _empaticaSession.BatteryLevel.Connect(); BvpConnectable = _empaticaSession.Bvp.Connect(); GsrConnectable = _empaticaSession.Gsr.Connect(); HrConnectable = _empaticaSession.Hr.Connect(); IbiConnectable = _empaticaSession.Ibi.Connect(); TagConnectable = _empaticaSession.Tag.Connect(); TemperatureConnectable = _empaticaSession.Temperature.Connect(); OcsConnectable = _ocsSession.Ocs.Connect(); NnMeanConnectable = _ocsSession.NnMean.Connect(); SdNnConnectable = _ocsSession.SdNn.Connect(); MeanEdaConnectable = _ocsSession.MeanEda.Connect(); PeakEdaConnectable = _ocsSession.PeakEda.Connect(); _empaticaHandler.AccelerationAction = acceleration => { _empaticaSession.AddAcceleration(acceleration); Acceleration = acceleration; }; _empaticaHandler.BvpAction = bvp => { _empaticaSession.AddBvp(bvp); Bvp = bvp; }; _empaticaHandler.GsrAction = gsr => { _empaticaSession.AddGsr(gsr); Gsr = gsr; }; _empaticaHandler.HrAction = hr => { _empaticaSession.AddHr(hr); Hr = hr; }; _empaticaHandler.IbiAction = ibi => { _empaticaSession.AddIbi(ibi); Ibi = ibi; }; _empaticaHandler.TemperatureAction = temperature => { _empaticaSession.AddTemperature(temperature); Temperature = temperature; }; var observer = Observable.Interval(TimeSpan.FromSeconds(1)) .SubscribeOn(RxApp.TaskpoolScheduler) .Where(_ => _isCapturing) .Publish(); var ocs = observer .Where(_ => _isDataSession) .Subscribe(_ => { var tmp = _ocsSession.NnMean.Items.LastOrDefault().Value; var nnMeanRatio = Math.Abs(tmp) > 0.01f ? tmp / _baseNnMeanAve : 1f; tmp = _ocsSession.SdNn.Items.LastOrDefault().Value; var sdNnRatio = Math.Abs(tmp) > 0.01f ? tmp / _baseSdNnAve : 1f; tmp = _ocsSession.MeanEda.Items.LastOrDefault().Value; var meanEdaRatio = Math.Abs(tmp) > 0.01f ? tmp / _baseMeanEdaAve : 1f; tmp = _ocsSession.PeakEda.Items.LastOrDefault().Value; var peakEdaRatio = Math.Abs(tmp) > 0.01f ? tmp / _basePeakEdaAve : 1f; var calculatedOcs = new AnalysisData(calculator.CalculateOcs(nnMeanRatio, sdNnRatio, meanEdaRatio, peakEdaRatio), DateTimeOffset.Now.ToUnixTimeSeconds() - _startedTime); _ocsSession.AddOcs(calculatedOcs); Ocs = calculatedOcs; }); var analysisData = observer .Subscribe(_ => { var time = DateTimeOffset.Now.ToUnixTimeSeconds() - _startedTime; var ibi = _empaticaSession.Ibi.Items .Skip(1) .Where(x => x.Value > 0 && x.Timestamp > time - 60) .Select(x => x.Value) .ToArray(); var gsr = _empaticaSession.Gsr.Items .Skip(1) .Where(x => x.Value > 0 && x.Timestamp > time - 60) .Select(x => x.Value) .ToArray(); var nnMean = new AnalysisData(ibi.AverageEx(), time); _ocsSession.AddNnMean(nnMean); NnMean = nnMean; var sdNn = new AnalysisData(ibi.StdDev(), time); _ocsSession.AddSdNn(sdNn); SdNn = sdNn; var meanEda = new AnalysisData(gsr.AverageEx(), time); _ocsSession.AddMeanEda(meanEda); MeanEda = meanEda; var peakEda = new AnalysisData(gsr.MaxEx(), time); _ocsSession.AddPeakEda(peakEda); PeakEda = peakEda; }); _cleanUp = new CompositeDisposable(observer.Connect(), ocs, analysisData); }