public async Task StartVibrationAsync(VibrationMode mode) { band.CheckBandConnection(); byte[] data; switch (mode) { case VibrationMode.Vibration2TimesWithLed: data = MiBandCommand.VibrationWithLed; break; case VibrationMode.Vibration10TimesWithLed: data = MiBandCommand.Vibration10TimesWithLed; break; case VibrationMode.VibrationWithoutLed: data = MiBandCommand.VibrationWithoutLed; break; default: return; } var mainService = await band.device.GetServiceAsync(MiBandService.ImmediateAlertService); var controlChar = await mainService.GetCharacteristicAsync(MiBandCharacteristic.Vibration); await controlChar.WriteAsync(data); }
public async Task <int> GetStepsAsync() { band.CheckBandConnection(); var mainService = await band.device.GetServiceAsync(MiBandService.MainService); var realtimeSteps = await mainService.GetCharacteristicAsync(MiBandCharacteristic.RealtimeSteps); var ch = await realtimeSteps.ReadAsync(); return(ch[3] << 24 | (ch[2] & 0xFF) << 16 | (ch[1] & 0xFF) << 8 | (ch[0] & 0xFF)); }
/// <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); }