From 7eb364aa6aca6bd4045821e0b36d113de91d5d40 Mon Sep 17 00:00:00 2001 From: scorpion-26 <58082714+scorpion-26@users.noreply.github.com> Date: Sat, 14 Jan 2023 23:23:00 +0100 Subject: [PATCH] Add missing files Otherwise, there will be a lot of nasty, and unavoidable errors --- assets/bt.png | Bin 0 -> 29603 bytes src/BluetoothDevices.cpp | 305 +++++++++++++++++++++++++++++++++++++++ src/BluetoothDevices.h | 8 + 3 files changed, 313 insertions(+) create mode 100644 assets/bt.png create mode 100644 src/BluetoothDevices.cpp create mode 100644 src/BluetoothDevices.h diff --git a/assets/bt.png b/assets/bt.png new file mode 100644 index 0000000000000000000000000000000000000000..6335da9ddeb21b1b99d8678558e050de8c64f243 GIT binary patch literal 29603 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 +#include +#include +#include + +#ifdef HAS_BLUEZ +namespace BluetoothDevices +{ + namespace DynCtx + { + enum class DeviceState + { + Invalid = BIT(0), + Failed = BIT(1), // Request failed + RequestConnect = BIT(2), // If device is requested to connect + RequestDisconnect = BIT(3), // If device is requested to disconnect + Connected = BIT(4), // BlueZ says to us, that it is connected + Disconnected = BIT(5), // BlueZ says to us, that it is disconnected + }; + DEFINE_ENUM_FLAGS(DeviceState); + + struct BTDeviceWithState + { + System::BluetoothDevice device{}; + DeviceState state{}; + }; + + std::mutex deviceMutex; + std::vector devices; + Box* deviceListBox; + Window* win; + bool scanning = false; + + void OnClick(Button& button, BTDeviceWithState& device) + { + DeviceState& state = device.state; + + // Clear failed bit + state &= ~DeviceState::Failed; + button.RemoveClass("failed"); + + // Only try to connect, if we know we're already disconnected and we haven't requested before(Same for disconnect) + if (FLAG_CHECK(state, DeviceState::Disconnected) && !FLAG_CHECK(state, DeviceState::RequestConnect)) + { + button.AddClass("active"); + button.RemoveClass("inactive"); + state |= DeviceState::RequestConnect; + + System::Connect(device.device, [&dev = device, &but = button](bool success, System::BluetoothDevice&) + { + deviceMutex.lock(); + if (!success) + { + dev.state &= ~DeviceState::RequestConnect; + dev.state |= DeviceState::Failed; + but.AddClass("failed"); + } + deviceMutex.unlock(); + }); + } + else if (FLAG_CHECK(state, DeviceState::Connected) && !FLAG_CHECK(state, DeviceState::RequestDisconnect)) + { + button.AddClass("inactive"); + button.RemoveClass("active"); + state |= DeviceState::RequestDisconnect; + + System::Disconnect(device.device, [&dev = device, &but = button](bool success, System::BluetoothDevice&) + { + deviceMutex.lock(); + if (!success) + { + dev.state &= ~DeviceState::RequestDisconnect; + dev.state |= DeviceState::Failed; + but.AddClass("failed"); + } + deviceMutex.unlock(); + }); + } + } + + void UpdateDeviceUIElem(Button& button, BTDeviceWithState& device) + { + if (device.device.name.size()) + { + button.SetText(device.device.name); + } + else + { + button.SetText(device.device.mac); + } + bool requestConnect = FLAG_CHECK(device.state, DeviceState::RequestConnect); + bool requestDisconnect = FLAG_CHECK(device.state, DeviceState::RequestDisconnect); + if (requestConnect || (!requestDisconnect && FLAG_CHECK(device.state, DeviceState::Connected))) + { + button.AddClass("active"); + button.RemoveClass("inactive"); + } + else if (requestDisconnect || (!requestConnect && FLAG_CHECK(device.state, DeviceState::Disconnected))) + { + button.AddClass("inactive"); + button.RemoveClass("active"); + } + if (FLAG_CHECK(device.state, DeviceState::Failed)) + { + button.AddClass("failed"); + } + else + { + button.RemoveClass("failed"); + } + + button.OnClick( + [&dev = device](Button& button) + { + OnClick(button, dev); + }); + } + + void InvalidateDeviceUI() + { + // Shrink + if (deviceListBox->GetChilds().size() > devices.size()) + { + for (size_t i = deviceListBox->GetChilds().size() - 1; i >= devices.size(); i--) + { + deviceListBox->RemoveChild(i); + } + } + + size_t idx = 0; + for (auto& device : devices) + { + if (idx >= deviceListBox->GetChilds().size()) + { + // Create new + auto button = Widget::Create