fix: resolve BLE device names correctly on Windows (#174)
* fix: resolve BLE device names correctly on Windows * Clear map on dispose
This commit is contained in:
@@ -743,8 +743,16 @@ namespace universal_ble
|
|||||||
/// Device Added from DeviceWatcher
|
/// Device Added from DeviceWatcher
|
||||||
device_watcher_added_token_ = device_watcher_.Added([this](DeviceWatcher sender, const DeviceInformation& device_info)
|
device_watcher_added_token_ = device_watcher_.Added([this](DeviceWatcher sender, const DeviceInformation& device_info)
|
||||||
{
|
{
|
||||||
const std::string device_id = to_string(device_info.Id());
|
const auto properties = device_info.Properties();
|
||||||
device_watcher_devices_.insert_or_assign(device_id, device_info);
|
if (!properties.HasKey(device_address_key))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const auto device_address = to_string(properties.Lookup(device_address_key).as<IPropertyValue>().GetString());
|
||||||
|
const std::string device_info_id = to_string(device_info.Id());
|
||||||
|
// Map Id -> MAC and MAC -> DeviceInformation
|
||||||
|
device_watcher_id_to_mac_.insert_or_assign(device_info_id, device_address);
|
||||||
|
device_watcher_devices_.insert_or_assign(device_address, device_info);
|
||||||
OnDeviceInfoReceived(device_info);
|
OnDeviceInfoReceived(device_info);
|
||||||
// On Device Added
|
// On Device Added
|
||||||
});
|
});
|
||||||
@@ -752,13 +760,20 @@ namespace universal_ble
|
|||||||
// Update only if device is already discovered in deviceWatcher.Added
|
// Update only if device is already discovered in deviceWatcher.Added
|
||||||
device_watcher_updated_token_ = device_watcher_.Updated([this](DeviceWatcher sender, const DeviceInformationUpdate& device_info_update)
|
device_watcher_updated_token_ = device_watcher_.Updated([this](DeviceWatcher sender, const DeviceInformationUpdate& device_info_update)
|
||||||
{
|
{
|
||||||
const std::string device_id = to_string(device_info_update.Id());
|
const std::string device_info_id = to_string(device_info_update.Id());
|
||||||
const auto it = device_watcher_devices_.get(device_id);
|
// Resolve MAC from Id
|
||||||
|
const auto mac_lookup = device_watcher_id_to_mac_.get(device_info_id);
|
||||||
|
if (!mac_lookup.has_value())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const std::string mac_key = mac_lookup.value();
|
||||||
|
const auto it = device_watcher_devices_.get(mac_key);
|
||||||
if (it.has_value())
|
if (it.has_value())
|
||||||
{
|
{
|
||||||
const auto value = it.value();
|
const auto value = it.value();
|
||||||
value.Update(device_info_update);
|
value.Update(device_info_update);
|
||||||
device_watcher_devices_.insert_or_assign(device_id, value);
|
device_watcher_devices_.insert_or_assign(mac_key, value);
|
||||||
OnDeviceInfoReceived(value);
|
OnDeviceInfoReceived(value);
|
||||||
}
|
}
|
||||||
// On Device Updated
|
// On Device Updated
|
||||||
@@ -767,7 +782,13 @@ namespace universal_ble
|
|||||||
device_watcher_removed_token_ = device_watcher_.Removed([this](DeviceWatcher sender, const DeviceInformationUpdate& args)
|
device_watcher_removed_token_ = device_watcher_.Removed([this](DeviceWatcher sender, const DeviceInformationUpdate& args)
|
||||||
{
|
{
|
||||||
const std::string device_id = to_string(args.Id());
|
const std::string device_id = to_string(args.Id());
|
||||||
device_watcher_devices_.remove(device_id);
|
const auto mac_lookup = device_watcher_id_to_mac_.get(device_id);
|
||||||
|
if (mac_lookup.has_value())
|
||||||
|
{
|
||||||
|
const std::string mac_key = mac_lookup.value();
|
||||||
|
device_watcher_devices_.remove(mac_key);
|
||||||
|
device_watcher_id_to_mac_.remove(device_id);
|
||||||
|
}
|
||||||
// On Device Removed
|
// On Device Removed
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -803,6 +824,7 @@ namespace universal_ble
|
|||||||
}
|
}
|
||||||
device_watcher_ = nullptr;
|
device_watcher_ = nullptr;
|
||||||
device_watcher_devices_.clear();
|
device_watcher_devices_.clear();
|
||||||
|
device_watcher_id_to_mac_.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -108,6 +108,8 @@ namespace universal_ble
|
|||||||
std::unordered_map<uint64_t, std::unique_ptr<BluetoothDeviceAgent>> connected_devices_{};
|
std::unordered_map<uint64_t, std::unique_ptr<BluetoothDeviceAgent>> connected_devices_{};
|
||||||
ThreadSafeMap<std::string, DeviceInformation> device_watcher_devices_{};
|
ThreadSafeMap<std::string, DeviceInformation> device_watcher_devices_{};
|
||||||
ThreadSafeMap<std::string, UniversalBleScanResult> scan_results_{};
|
ThreadSafeMap<std::string, UniversalBleScanResult> scan_results_{};
|
||||||
|
// Maps DeviceInformation.Id() -> MAC address string used as key in device_watcher_devices_
|
||||||
|
ThreadSafeMap<std::string, std::string> device_watcher_id_to_mac_{};
|
||||||
|
|
||||||
event_token bluetooth_le_watcher_received_token_;
|
event_token bluetooth_le_watcher_received_token_;
|
||||||
event_token device_watcher_added_token_;
|
event_token device_watcher_added_token_;
|
||||||
|
|||||||
Reference in New Issue
Block a user