# HG changeset patch # User František Kučera # Date 1567618881 -7200 # Node ID 642f32f76c9d89c7f454706439dc69af6973f0a4 # Parent cfb5f62ea048e32d9ca9e113487be32bb446271b display the battery charge level (from UPower) diff -r cfb5f62ea048 -r 642f32f76c9d cadMousePro-gui/nbproject/configurations.xml --- a/cadMousePro-gui/nbproject/configurations.xml Tue Sep 03 23:55:00 2019 +0200 +++ b/cadMousePro-gui/nbproject/configurations.xml Wed Sep 04 19:41:21 2019 +0200 @@ -46,6 +46,8 @@ Proxy.cpp + UPowerDeviceProxy.cpp + UPowerProxy.cpp @@ -75,6 +77,7 @@ build/Debug/src/cadMousePro-gui_autogen/S5VNLJ26FI/moc_Proxy.cpp + build/Debug/src/cadMousePro-gui_autogen/S5VNLJ26FI/moc_UPowerProxy.cpp build/Debug/src/cadMousePro-gui_autogen/mocs_compilation.cpp @@ -143,6 +146,11 @@ tool="3" flavor2="0"> + + + + + + + + + + #include +#include #include "MouseMainWindow.h" MouseMainWindow::MouseMainWindow() { proxy = new InfoGlobalcodeMouseCadMouseProInterface("info.globalcode.mouse.cadMousePro", "/info/globalcode/mouse/cadMousePro", connection, this); + upowerProxy = new OrgFreedesktopUPowerInterface("org.freedesktop.UPower", "/org/freedesktop/UPower", connection, this); setWindowTitle("cadMousePro"); @@ -42,12 +44,19 @@ statusProxy->setEnabled(false); statusUPower->setEnabled(false); statusDevice->setEnabled(false); + statusBattery->setOrientation(Qt::Orientation::Horizontal); + statusBattery->setMinimum(0); + statusBattery->setMaximum(100); + + statusUPower->setToolTip("UPower interface is used for getting the battery level"); statusName->setToolTip("name of the USB device – usually the wireless adaptor"); + statusBattery->setToolTip("battery charge level"); layout->setWidget(f++, QFormLayout::FieldRole, statusProxy); layout->setWidget(f++, QFormLayout::FieldRole, statusUPower); layout->setWidget(f++, QFormLayout::FieldRole, statusDevice); layout->setWidget(f++, QFormLayout::FieldRole, statusName); + layout->setWidget(f++, QFormLayout::FieldRole, statusBattery); QPushButton* refreshButton = new QPushButton("Refresh", panel); layout->setWidget(f++, QFormLayout::FieldRole, refreshButton); @@ -86,10 +95,10 @@ void MouseMainWindow::appendAboutLine(QFormLayout* layout, const QString& label, const QString& value, QWidget* parent) { QLabel* labelWidget = new QLabel(label, parent); QLabel* textWidget = new QLabel(value, parent); - + textWidget->setTextInteractionFlags(Qt::TextInteractionFlag::TextSelectableByMouse | Qt::TextInteractionFlag::TextBrowserInteraction); textWidget->setOpenExternalLinks(true); - + layout->addRow(labelWidget, textWidget); } @@ -107,10 +116,29 @@ tabs->addTab(panel, "About"); } +/** + * Finds the first HID mouse managed by UPower and returns its battery level. + * + * @return percentage of the current battery charge or 0 if no suitable mouse was found + */ +int MouseMainWindow::getBatteryLevel() { + auto devices = upowerProxy->EnumerateDevices(); + devices.waitForFinished(); + for (auto device : devices.value()) { + if (device.path().startsWith(upowerProxy->path() + "/devices/mouse_hid_") && device.path().endsWith("_battery")) { + OrgFreedesktopUPowerDeviceInterface battery(upowerProxy->service(), device.path(), connection, this); + if (battery.isValid()) return battery.percentage(); + } + } + return 0; // mouse with battery not found +} + void MouseMainWindow::refresh() { statusProxy->setChecked(proxy->isValid()); + statusUPower->setChecked(upowerProxy->isValid()); statusDevice->setChecked(proxy->devicePresent()); statusName->setText(proxy->deviceName()); + statusBattery->setValue(getBatteryLevel()); } void MouseMainWindow::configure() { diff -r cfb5f62ea048 -r 642f32f76c9d cadMousePro-gui/src/MouseMainWindow.h --- a/cadMousePro-gui/src/MouseMainWindow.h Tue Sep 03 23:55:00 2019 +0200 +++ b/cadMousePro-gui/src/MouseMainWindow.h Wed Sep 04 19:41:21 2019 +0200 @@ -25,9 +25,11 @@ #include #include #include +#include #include #include "generated-sources/Proxy.h" +#include "generated-sources/UPowerProxy.h" class MouseMainWindow : public QMainWindow { Q_OBJECT @@ -43,6 +45,7 @@ QCheckBox* statusUPower = new QCheckBox("connected to UPower", this); QCheckBox* statusDevice = new QCheckBox("mouse found", this); QLabel* statusName = new QLabel(this); + QProgressBar* statusBattery = new QProgressBar(this); QCheckBox* configureSmartScrolling = new QCheckBox("smart scrolling (free wheel)", this); QCheckBox* configureLiftOffDetection = new QCheckBox("lift-off detection", this); @@ -55,12 +58,15 @@ QDBusConnection connection = QDBusConnection::systemBus(); InfoGlobalcodeMouseCadMouseProInterface* proxy; + OrgFreedesktopUPowerInterface* upowerProxy; void initStatusPanel(); void initConfigurationPanel(); void initAboutPanel(); void appendAboutLine(QFormLayout* layout, const QString& label, const QString& value, QWidget* parent); + + int getBatteryLevel(); private slots: void refresh(); diff -r cfb5f62ea048 -r 642f32f76c9d d-bus/org.freedesktop.UPower.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/d-bus/org.freedesktop.UPower.xml Wed Sep 04 19:41:21 2019 +0200 @@ -0,0 +1,13 @@ + + + + + + + + + + + + +