From fbcdc062a19c5dd360b16847f3c7939b9877844e Mon Sep 17 00:00:00 2001 From: Michele Date: Wed, 5 Jul 2017 21:50:59 +0200 Subject: [PATCH] Changed BtHrp start logic. Reverted to a revised async/await implementation. --- Cardia.v12.suo | Bin 366592 -> 368640 bytes Cardia/PresentationModel/Cardia.cs | 9 +- HRM/HRP/BtHrp.cs | 128 ++++++++++++++--------------- 3 files changed, 69 insertions(+), 68 deletions(-) diff --git a/Cardia.v12.suo b/Cardia.v12.suo index 495453730201840e49cfb7107ef39612a147fe06..420714852a27b5787509cc5e5aadd225ba031efd 100644 GIT binary patch delta 11510 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 delta 7024 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 Boyq_J diff --git a/Cardia/PresentationModel/Cardia.cs b/Cardia/PresentationModel/Cardia.cs index d4b9452..9c435a6 100644 --- a/Cardia/PresentationModel/Cardia.cs +++ b/Cardia/PresentationModel/Cardia.cs @@ -623,10 +623,13 @@ public void Start() return; } - signalGenerator.Start(); + if (hrm.Running) + { + signalGenerator.Start(); - if (Started != null) - Started(this); + if (Started != null) + Started(this); + } } public void Stop() diff --git a/HRM/HRP/BtHrp.cs b/HRM/HRP/BtHrp.cs index 9a68cd6..2da3f19 100644 --- a/HRM/HRP/BtHrp.cs +++ b/HRM/HRP/BtHrp.cs @@ -177,7 +177,7 @@ public DeviceInformation Device public delegate void DeviceChangedEventHandler(object sender, DeviceInformation device); public event DeviceChangedEventHandler DeviceChanged; - public override void Start() + public override async void Start() { if (Running) return; @@ -188,98 +188,95 @@ public override void Start() lastReceivedDate = DateTime.Now; - ConfigureServiceForNotificationsAsync(); - timeoutTimer.Start(); Running = true; + + ConfigureServiceForNotificationsAsync(); } - private void ConfigureServiceForNotificationsAsync() - { - new Thread(async () => + private async void ConfigureServiceForNotificationsAsync() + { + try { - Thread.CurrentThread.IsBackground = true; - try - { #if DEBUG - logger.Debug("Getting GattDeviceService " + device.Name + "with id " + device.Id); + logger.Debug("Getting GattDeviceService " + device.Name + " with id " + device.Id); #endif + service = await GattDeviceService.FromIdAsync(device.Id); + if (initDelay > 0) + await Task.Delay(initDelay); - service = await GattDeviceService.FromIdAsync(device.Id); - Thread.Sleep(initDelay); - - // Obtain the characteristic for which notifications are to be received + // Obtain the characteristic for which notifications are to be received #if DEBUG - logger.Debug("Getting HeartRateMeasurement GattCharacteristic " + characteristicIndex); + logger.Debug("Getting HeartRateMeasurement GattCharacteristic " + characteristicIndex); #endif - characteristic = service.GetCharacteristics(GattCharacteristicUuids.HeartRateMeasurement)[characteristicIndex]; + characteristic = service.GetCharacteristics(GattCharacteristicUuids.HeartRateMeasurement)[characteristicIndex]; - // While encryption is not required by all devices, if encryption is supported by the device, - // it can be enabled by setting the ProtectionLevel property of the Characteristic object. - // All subsequent operations on the characteristic will work over an encrypted link. + // While encryption is not required by all devices, if encryption is supported by the device, + // it can be enabled by setting the ProtectionLevel property of the Characteristic object. + // All subsequent operations on the characteristic will work over an encrypted link. #if DEBUG - logger.Debug("Setting EncryptionRequired protection level on GattCharacteristic"); + logger.Debug("Setting EncryptionRequired protection level on GattCharacteristic"); #endif - characteristic.ProtectionLevel = GattProtectionLevel.EncryptionRequired; + characteristic.ProtectionLevel = GattProtectionLevel.EncryptionRequired; - // Register the event handler for receiving notifications - Thread.Sleep(initDelay); + // Register the event handler for receiving notifications + if (initDelay > 0) + await Task.Delay(initDelay); #if DEBUG - logger.Debug("Registering event handler onction level on GattCharacteristic"); + logger.Debug("Registering event handler onction level on GattCharacteristic"); #endif - characteristic.ValueChanged += Characteristic_ValueChanged; + characteristic.ValueChanged += Characteristic_ValueChanged; - // In order to avoid unnecessary communication with the device, determine if the device is already - // correctly configured to send notifications. - // By default ReadClientCharacteristicConfigurationDescriptorAsync will attempt to get the current - // value from the system cache and communication with the device is not typically required. + // In order to avoid unnecessary communication with the device, determine if the device is already + // correctly configured to send notifications. + // By default ReadClientCharacteristicConfigurationDescriptorAsync will attempt to get the current + // value from the system cache and communication with the device is not typically required. #if DEBUG - logger.Debug("Reading GattCharacteristic configuration descriptor"); + logger.Debug("Reading GattCharacteristic configuration descriptor"); #endif - var currentDescriptorValue = await characteristic.ReadClientCharacteristicConfigurationDescriptorAsync(); + var currentDescriptorValue = await characteristic.ReadClientCharacteristicConfigurationDescriptorAsync(); - if ((currentDescriptorValue.Status != GattCommunicationStatus.Success) || - (currentDescriptorValue.ClientCharacteristicConfigurationDescriptor != CHARACTERISTIC_NOTIFICATION_TYPE)) - { - // Set the Client Characteristic Configuration Descriptor to enable the device to send notifications - // when the Characteristic value changes + if ((currentDescriptorValue.Status != GattCommunicationStatus.Success) || + (currentDescriptorValue.ClientCharacteristicConfigurationDescriptor != CHARACTERISTIC_NOTIFICATION_TYPE)) + { + // Set the Client Characteristic Configuration Descriptor to enable the device to send notifications + // when the Characteristic value changes #if DEBUG - logger.Debug("Setting GattCharacteristic configuration descriptor to enable notifications"); + logger.Debug("Setting GattCharacteristic configuration descriptor to enable notifications"); #endif - GattCommunicationStatus status = - await characteristic.WriteClientCharacteristicConfigurationDescriptorAsync( - CHARACTERISTIC_NOTIFICATION_TYPE); + GattCommunicationStatus status = + await characteristic.WriteClientCharacteristicConfigurationDescriptorAsync( + CHARACTERISTIC_NOTIFICATION_TYPE); - if (status == GattCommunicationStatus.Unreachable) - { + if (status == GattCommunicationStatus.Unreachable) + { #if DEBUG - logger.Debug("Device unreachable"); + logger.Debug("Device unreachable"); #endif - // Register a PnpObjectWatcher to detect when a connection to the device is established, - // such that the application can retry device configuration. - StartDeviceConnectionWatcher(); - } + // Register a PnpObjectWatcher to detect when a connection to the device is established, + // such that the application can retry device configuration. + StartDeviceConnectionWatcher(); } - else - { + } + else + { #if DEBUG - logger.Debug("Configuration successfull"); + logger.Debug("Configuration successfull"); #endif - } } - catch (Exception e) - { + } + catch (Exception e) + { #if DEBUG - logger.Warn("Error configuring HRP device", e); + logger.Warn("Error configuring HRP device", e); #endif - Stop(); - FireTimeout("Bluetooth HRP device initialization failed"); - //throw new Exception("Bluetooth HRP device initialization failed"); - } - }).Start(); + Stop(); + FireTimeout("Bluetooth HRP device initialization failed"); + //throw new Exception("Bluetooth HRP device initialization failed"); + } } private void Characteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args) @@ -552,14 +549,9 @@ public override void Reset() public override void Dispose() { - if (service != null) - { - service.Dispose(); - service = null; - } - if (characteristic != null) { + characteristic.ValueChanged -= Characteristic_ValueChanged; characteristic = null; } @@ -568,6 +560,12 @@ public override void Dispose() watcher.Stop(); watcher = null; } + + if (service != null) + { + service.Dispose(); + service = null; + } } } }