private void Timer_Tick(object state)
        {
            int count;

            lock (_sync)
            {
                count = (_count = ++_count) % HeartRates.Length;
            }

            HeartRateUpdated?.Invoke(HeartRates[count]);
        }
        private void Timer_Tick(object state)
        {
            int count;

            lock (_sync)
            {
                count = _count = ++_count;

                if (count >= HeartRates.Length)
                {
                    return;
                }
            }

            HeartRateUpdated?.Invoke(HeartRates[count]);
        }
Exemple #3
0
        public void HeartRate_ValueChanged(
            GattCharacteristic sender,
            GattValueChangedEventArgs args)
        {
            var buffer = args.CharacteristicValue;

            if (buffer.Length == 0)
            {
                return;
            }

            var byteBuffer = Interlocked.Exchange(ref _buffer, null)
                             ?? new byte[buffer.Length];

            if (byteBuffer.Length != buffer.Length)
            {
                byteBuffer = new byte[buffer.Length];
            }

            try
            {
                using var reader = DataReader.FromBuffer(buffer);
                reader.ReadBytes(byteBuffer);

                var readingValue = ReadBuffer(byteBuffer, (int)buffer.Length);

                if (readingValue == null)
                {
                    Debug.WriteLine($"Buffer was too small. Got {buffer.Length}.");
                    return;
                }

                var reading = readingValue.Value;
                Debug.WriteLine($"Read {reading.Flags:X} {reading.Status} {reading.BeatsPerMinute}");

                HeartRateUpdated?.Invoke(reading);
            }
            finally
            {
                Volatile.Write(ref _buffer, byteBuffer);
            }
        }
        private void HeartRate_ValueChanged(
            GattCharacteristic sender,
            GattValueChangedEventArgs args)
        {
            var value = args.CharacteristicValue;

            if (value.Length == 0)
            {
                return;
            }

            using (var reader = DataReader.FromBuffer(value))
            {
                byte[] data = new byte[value.Length];
                reader.ReadBytes(data);
                var bpm           = -1;
                var flags         = data[0];
                var isshort       = (flags & 1) == 1; // 1 == UINT16
                var contactSensor = (ContactSensorStatus)((flags >> 1) & 3);
                var minLength     = isshort ? 3 : 2;

                if (value.Length < minLength)
                {
                    Debug.WriteLine($"Buffer was too small. Got {value.Length}, expected {minLength}.");
                    return;
                }

                HeartRateServiceData hrsd = new HeartRateServiceData(data);
                LogData(hrsd);

                bpm = hrsd.HeartRateMeasurement;

                Debug.WriteLine($"Read {flags.ToString("X")} {contactSensor} {bpm}");
                foreach (var rr in hrsd.RRIntervals)
                {
                    Debug.WriteLine($"RR Interval {rr}");
                }

                HeartRateUpdated?.Invoke(contactSensor, bpm);
            }
        }
Exemple #5
0
        public void HeartRate_ValueChanged(
            GattCharacteristic sender,
            GattValueChangedEventArgs args)
        {
            var value = args.CharacteristicValue;

            if (value.Length == 0)
            {
                return;
            }

            using (var reader = DataReader.FromBuffer(value))
            {
                var bpm           = -1;
                var flags         = reader.ReadByte();
                var isshort       = (flags & 1) == 1;
                var contactSensor = (ContactSensorStatus)((flags >> 1) & 3);
                var minLength     = isshort ? 3 : 2;

                if (value.Length < minLength)
                {
                    Debug.WriteLine($"Buffer was too small. Got {value.Length}, expected {minLength}.");
                    return;
                }

                if (value.Length > 1)
                {
                    bpm = isshort
                        ? reader.ReadUInt16()
                        : reader.ReadByte();
                }

                Debug.WriteLine($"Read {flags:X} {contactSensor} {bpm}");

                HeartRateUpdated?.Invoke(contactSensor, bpm);
            }
        }
Exemple #6
0
 protected virtual void OnHeartRateUpdated()
 => HeartRateUpdated?.Invoke(
     this,
     new HeartBeatEventArgs(PreviousHeartBeat, CurrentHeartBeat));