Example #1
0
        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)
                });
            });
        }
Example #2
0
        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);
        }