Exemple #1
0
        private void btn_heartRate_Click(object sender, EventArgs e)
        {
            var hrValue = (HeartRateMode)HeartRateMode.Parse(typeof(HeartRateMode), lb_HeartRateSetter.SelectedItem.ToString());


            var statusSetter = new SetHeatRate()
            {
                NewHeartRateMode = hrValue
            };
            var result = client.Send(1, statusSetter);

            AddMessage(result);
        }
        /// <summary>
        /// Gets the HeartRate Scanner readings: Use SpotMode to get one reading, ContnousMode to get the readings obtained in 20Seconds of Scan.
        /// SleepMode is currently unsupported
        /// </summary>
        /// <returns>
        /// List of int each representing an HeartRate reading.
        /// </returns>
        public Task <List <int> > GetHertRateScan(HeartRateMode mode)
        {
            band.CheckBandConnection();

            var heartRateTCS      = new TaskCompletionSource <List <int> >();
            var heartRateReadings = new List <int>();

            switch (mode)
            {
            case HeartRateMode.Spot:
            {
                //heartRateMode = HeartRateMode.Spot;
                Task.Run(async() =>
                    {
                        try
                        {
                            var heartRateService = await band.device.GetServiceAsync(MiBandService.HeartRateService);

                            //Subscribe
                            var heartRateMeasurement = await heartRateService.GetCharacteristicAsync(MiBandCharacteristic.HeartRateMeasurement);
                            var descriptor           = await heartRateMeasurement.GetDescriptorAsync(MiBandDescriptor.DescriptorUpdateNotification);

                            heartRateMeasurement.ValueUpdated += (o, args) =>
                            {
                                var data = args.Characteristic.Value;
                                if (data.Length == 2 && data[0] == 6)
                                {
                                    int heartRate = data[1] & 0xFF;

                                    heartRateReadings.Add(heartRate);
                                    heartRateTCS.TrySetResult(heartRateReadings);
                                }
                                else
                                {
                                    heartRateTCS.TrySetException(new Exception("HeartRate Data is Not Valid"));
                                }
                            };

                            await descriptor.WriteAsync(MiBandCommand.EnableNotifications);
                            await heartRateMeasurement.StartUpdatesAsync();

                            //Write
                            var controlPoint = await heartRateService.GetCharacteristicAsync(MiBandCharacteristic.HeartRateControlPoint);
                            await controlPoint.WriteAsync(MiBandCommand.StartHeartRateManual);
                        }
                        catch (Exception e)
                        {
                            Debug.WriteLine(e.Message);
                            throw;
                        }
                    });

                return(heartRateTCS.Task);
            }

            case HeartRateMode.Countinous:
            {
                Task.Run(async() =>
                    {
                        var heartRateService = await band.device.GetServiceAsync(MiBandService.HeartRateService);

                        //Subscribe
                        var heartRateMeasurement = await heartRateService.GetCharacteristicAsync(MiBandCharacteristic.HeartRateMeasurement);
                        var descriptor           = await heartRateMeasurement.GetDescriptorAsync(MiBandDescriptor.DescriptorUpdateNotification);

                        heartRateMeasurement.ValueUpdated += (o, args) =>
                        {
                            var data = args.Characteristic.Value;
                            if (data.Length == 2 && data[0] == 6)
                            {
                                int heartRate = data[1] & 0xFF;

                                heartRateReadings.Add(heartRate);
                            }
                            else
                            {
                                heartRateTCS.TrySetException(new Exception("HeartRate Data is Not Valid"));
                            }
                        };

                        await descriptor.WriteAsync(MiBandCommand.EnableNotifications);
                        await heartRateMeasurement.StartUpdatesAsync();

                        //Write
                        var controlPoint = await heartRateService.GetCharacteristicAsync(MiBandCharacteristic.HeartRateControlPoint);
                        await controlPoint.WriteAsync(MiBandCommand.StartHeartRateContinuous);

                        //TODO: Change to something better
                        await Task.Delay(20000);
                        heartRateTCS.SetResult(heartRateReadings);
                    });

                return(heartRateTCS.Task);
            }
            }

            return(null);
        }