示例#1
0
        public void Reading(HeartRateReading reading)
        {
            if (!HasFileWriter)
            {
                return;
            }

            string data = null;

            var bpm     = reading.BeatsPerMinute;
            var status  = reading.BeatsPerMinute;
            var rrvalue = reading.RRIntervals == null
                ? ""
                : string.Join(",", reading.RRIntervals);

            var dateString = DateTimeFormatter.Format(
                _settings.LogDateFormat,
                DateTime.Now,
                DateTimeFormatter.DefaultColumn);

            switch ((_settings.LogFormat ?? "").ToLower())
            {
            case "csv":
                data = $"{dateString},{bpm},{status},{reading.EnergyExpended},{rrvalue}";
                break;
            }

            if (data != null)
            {
                WriteLine(data);
            }
        }
示例#2
0
        private void Service_HeartRateUpdated(HeartRateReading reading)
        {
            try
            {
                // _leaktest is not set to true in program execution, just manually for testing
#pragma warning disable 162
                if (_leaktest)
                {
                    for (var i = 0; i < 4000; ++i)
                    {
                        Service_HeartRateUpdatedCore(reading);
                    }

                    return;
                }
#pragma warning restore 162

                Service_HeartRateUpdatedCore(reading);
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Exception in Service_HeartRateUpdated {ex}");

                Debugger.Break();
            }
        }
示例#3
0
 private void _service_HeartRateUpdated(HeartRateReading reading)
 {
     lock (_sync)
     {
         _lastUpdateTimer.Restart();
     }
 }
示例#4
0
 public void Reading(HeartRateReading reading)
 {
     if (!HasFileWriter)
     {
         return;
     }
     Write(reading.BeatsPerMinute.ToString());
 }
示例#5
0
        internal static HeartRateReading?ReadBuffer(byte[] buffer, int length)
        {
            if (length == 0)
            {
                return(null);
            }

            var ms                = new MemoryStream(buffer, 0, length);
            var flags             = (HeartRateFlags)ms.ReadByte();
            var isshort           = flags.HasFlag(HeartRateFlags.IsShort);
            var contactSensor     = (ContactSensorStatus)(((int)flags >> 1) & 3);
            var hasEnergyExpended = flags.HasFlag(HeartRateFlags.HasEnergyExpended);
            var hasRRInterval     = flags.HasFlag(HeartRateFlags.HasRRInterval);
            var minLength         = isshort ? 3 : 2;

            if (buffer.Length < minLength)
            {
                return(null);
            }

            var reading = new HeartRateReading
            {
                Flags          = flags,
                Status         = contactSensor,
                BeatsPerMinute = isshort ? ms.ReadUInt16() : ms.ReadByte()
            };

            if (hasEnergyExpended)
            {
                reading.EnergyExpended = ms.ReadUInt16();
            }

            if (hasRRInterval)
            {
                var rrvalueCount = (buffer.Length - ms.Position) / sizeof(ushort);
                var rrvalues     = new int[rrvalueCount];
                for (var i = 0; i < rrvalueCount; ++i)
                {
                    rrvalues[i] = ms.ReadUInt16();
                }

                reading.RRIntervals = rrvalues;
            }

            return(reading);
        }
示例#6
0
        public void Reading(HeartRateReading reading)
        {
            if (!HasFileWriter)
            {
                return;
            }
            if (reading.RRIntervals == null)
            {
                return;
            }
            if (reading.RRIntervals.Length == 0)
            {
                return;
            }

            WriteLine(string.Join("\r\n", AsMS(reading.RRIntervals)));
        }
示例#7
0
        private void Service_HeartRateUpdated(HeartRateReading reading)
        {
            try
            {
                if (_leaktest)
                {
                    for (var i = 0; i < 4000; ++i)
                    {
                        Service_HeartRateUpdatedCore(reading);
                    }

                    return;
                }

                Service_HeartRateUpdatedCore(reading);
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Exception in Service_HeartRateUpdated {ex}");

                Debugger.Break();
            }
        }
示例#8
0
        private void Service_HeartRateUpdatedCore(HeartRateReading reading)
        {
            _log?.Reading(reading);
            _ibi?.Reading(reading);
            _hrfile?.Reading(reading);

            var bpm    = reading.BeatsPerMinute;
            var RR     = reading.RRIntervals;
            var status = reading.Status;

            NeosVR.SendData(bpm, status);

            var isDisconnected = bpm == 0 ||
                                 status == ContactSensorStatus.NoContact;

            var iconText = bpm.ToString();

            var warnLevel  = _settings.WarnLevel;
            var alertLevel = _settings.AlertLevel;
            // <= 0 implies disabled.
            var isWarn  = warnLevel > 0 && bpm >= warnLevel;
            var isAlert = alertLevel > 0 && bpm >= alertLevel;

            lock (_updateSync)
            {
                if (isDisconnected)
                {
                    uxBpmNotifyIcon.Text = $"Disconnected {status} ({bpm})";

                    if (!_disconnectedTimeout.IsRunning)
                    {
                        _disconnectedTimeout.Start();
                    }

                    if (_disconnectedTimeout.Elapsed >
                        _settings.DisconnectedTimeout)
                    {
                        // Originally this used " ⃠" (U+20E0, "Prohibition Symbol")
                        // but MeasureString was only returning ~half of the
                        // width.
                        iconText = "X";
                    }
                }
                else
                {
                    uxBpmNotifyIcon.Text = null;
                    _disconnectedTimeout.Stop();
                }

                _iconGraphics.Clear(Color.Transparent);

                var sizingMeasurement = _iconGraphics
                                        .MeasureString(iconText, _measurementFont);

                var color = isWarn ? _settings.WarnColor : _settings.Color;

                using (var brush = new SolidBrush(color))
                    using (var font = new Font(_settings.FontName,
                                               _iconHeight * (_iconWidth / sizingMeasurement.Width),
                                               GraphicsUnit.Pixel))
                    {
                        _iconGraphics.DrawString(
                            iconText, font, brush,
                            new RectangleF(0, 0, _iconWidth, _iconHeight),
                            _iconStringFormat);
                    }

                _iconText = iconText;

                var iconHandle = _iconBitmap.GetHicon();

                using (var icon = Icon.FromHandle(iconHandle))
                {
                    uxBpmNotifyIcon.Icon = icon;

                    if (isAlert && (!_alertTimeout.IsRunning ||
                                    _alertTimeout.Elapsed >= _settings.AlertTimeout))
                    {
                        _alertTimeout.Restart();

                        var alertText = $"BPMs @ {bpm}";

                        uxBpmNotifyIcon.ShowBalloonTip(
                            (int)_settings.AlertTimeout.TotalMilliseconds,
                            alertText, alertText, ToolTipIcon.Warning);
                    }
                }

                if (_oldIconHandle != IntPtr.Zero)
                {
                    DestroyIcon(_oldIconHandle);
                }

                _oldIconHandle = iconHandle;
            }

            Invoke(new Action(() => {
                lock (_updateSync)
                {
                    uxBpmLabel.Text      = _iconText;
                    uxBpmLabel.ForeColor = isWarn
                        ? _settings.UIWarnColor
                        : _settings.UIColor;

                    UpdateUICore();
                    Invalidate();
                }
            }));
        }