Compare commits
37 Commits
88600b8915
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| b7895d61c6 | |||
| 77d9a22419 | |||
| 392a03a23d | |||
| e796ff3663 | |||
| de58e2d472 | |||
| 314b281c03 | |||
| 5253dc1df6 | |||
| 4bdedbc110 | |||
| 42043bcd55 | |||
| 45116d8857 | |||
| c930e316c4 | |||
| 1e3836cb9f | |||
| 7ea9638488 | |||
| ddec3d2431 | |||
| aeca6a5dc0 | |||
| 4956dde368 | |||
| 348631fedc | |||
| fc49f1d779 | |||
| 756bb9b6a7 | |||
| 5943b72fef | |||
| 8f4dec0bff | |||
| 78f3daf1ff | |||
| 17a4890fdc | |||
| e4f18911f9 | |||
| 17a1eab03d | |||
| 69b14243bc | |||
| 65b4fbc484 | |||
| 5b6dd9e62c | |||
| 994e08bebc | |||
| 86dbcfda4f | |||
| 5e4aba8140 | |||
| 7b791a071b | |||
| 69a68ce67c | |||
| afd6de62a0 | |||
| cb9a57a24a | |||
| 395e58f94d | |||
| 200ad19d95 |
@@ -1,13 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<ui version="4.0">
|
<ui version="4.0">
|
||||||
<class>AdaptiveBrightnessClass</class>
|
<class>MainWindow</class>
|
||||||
<widget class="QMainWindow" name="AdaptiveBrightnessClass">
|
<widget class="QMainWindow" name="MainWindow">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>406</width>
|
<width>450</width>
|
||||||
<height>306</height>
|
<height>555</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@@ -17,48 +17,541 @@
|
|||||||
<iconset resource="AdaptiveBrightness.qrc">
|
<iconset resource="AdaptiveBrightness.qrc">
|
||||||
<normaloff>:/AdaptiveBrightness/resources/system.ico</normaloff>:/AdaptiveBrightness/resources/system.ico</iconset>
|
<normaloff>:/AdaptiveBrightness/resources/system.ico</normaloff>:/AdaptiveBrightness/resources/system.ico</iconset>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="centralWidget">
|
<widget class="QWidget" name="mainWidget">
|
||||||
<layout class="QFormLayout" name="formLayout_2">
|
<layout class="QGridLayout" name="gridLayout_3">
|
||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<widget class="QGroupBox" name="groupBox">
|
<widget class="QTabWidget" name="tabs">
|
||||||
<property name="title">
|
<property name="currentIndex">
|
||||||
<string>Manual brightness control</string>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<widget class="QWidget" name="monitorTab">
|
||||||
<item row="0" column="0">
|
<attribute name="title">
|
||||||
<widget class="QSlider" name="horizontalSlider">
|
<string>Monitors</string>
|
||||||
<property name="toolTip">
|
</attribute>
|
||||||
<string>Brightness</string>
|
<layout class="QGridLayout" name="gridLayout_12">
|
||||||
</property>
|
<item row="0" column="0" colspan="2">
|
||||||
<property name="orientation">
|
<widget class="QGroupBox" name="monitorGroup">
|
||||||
<enum>Qt::Horizontal</enum>
|
<property name="title">
|
||||||
</property>
|
<string>Monitor</string>
|
||||||
</widget>
|
</property>
|
||||||
</item>
|
<layout class="QGridLayout" name="gridLayout_11">
|
||||||
</layout>
|
<item row="0" column="0">
|
||||||
|
<widget class="QComboBox" name="monitorDropdown">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QPushButton" name="monitorEnumerateButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Re-enumerate</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="monitorLimitsGroup">
|
||||||
|
<property name="title">
|
||||||
|
<string>Limits</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_9">
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QSlider" name="monitorMaxBrightnessSlider">
|
||||||
|
<property name="value">
|
||||||
|
<number>50</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="monitorMinBrightnessLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Minimum</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QSlider" name="monitorMinBrightnessSlider">
|
||||||
|
<property name="value">
|
||||||
|
<number>50</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="monitorMaxBrightnessLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Maximum</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2">
|
||||||
|
<widget class="QLabel" name="monitorMinBrightnessValueLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="monitorMaxBrightnessValueLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="monitorBrightnessGroup">
|
||||||
|
<property name="title">
|
||||||
|
<string>Brightness</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QSlider" name="monitorBrightnessSlider">
|
||||||
|
<property name="value">
|
||||||
|
<number>50</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="monitorOverrideCheck">
|
||||||
|
<property name="text">
|
||||||
|
<string>Manual override</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="monitorBrightnessValueLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="monitorOverallLimitsGroup">
|
||||||
|
<property name="title">
|
||||||
|
<string>Overall limits</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_10">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="monitorOverallMinBrightnessLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Minimum</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QSlider" name="monitorOverallMinBrightnessSlider">
|
||||||
|
<property name="value">
|
||||||
|
<number>50</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2">
|
||||||
|
<widget class="QLabel" name="monitorOverallMinBrightnessValueLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="monitorOverallMaxBrightnessLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Maximum</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QSlider" name="monitorOverallMaxBrightnessSlider">
|
||||||
|
<property name="value">
|
||||||
|
<number>50</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="monitorOverallMaxBrightnessValueLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0" colspan="2">
|
||||||
|
<spacer name="monitorBottomSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>218</width>
|
||||||
|
<height>35</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QPushButton" name="monitorResetButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Restore all monitors to defaults</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<spacer name="monitorResetSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="monitorOverallBrightnessGroup">
|
||||||
|
<property name="title">
|
||||||
|
<string>Overall brightness</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QSlider" name="monitorOverallBrightnessSlider">
|
||||||
|
<property name="value">
|
||||||
|
<number>50</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="monitorOverallBrightnessValueLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="monitorOverallOverrideCheck">
|
||||||
|
<property name="text">
|
||||||
|
<string>Manual override</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<spacer name="monitorTopSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="sensorsTab">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Sensors</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_8">
|
||||||
|
<item row="0" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="sensorGroup">
|
||||||
|
<property name="title">
|
||||||
|
<string>Sensor module</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_6">
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QPushButton" name="sensorEnumerateButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Re-enumerate</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QComboBox" name="sensorDropdown">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="sensorReadoutGroup">
|
||||||
|
<property name="title">
|
||||||
|
<string>Readout</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_5">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QTreeWidget" name="sensorReadoutValues">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>QFrame::NoFrame</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow">
|
||||||
|
<enum>QFrame::Plain</enum>
|
||||||
|
</property>
|
||||||
|
<property name="verticalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeAdjustPolicy">
|
||||||
|
<enum>QAbstractScrollArea::AdjustToContents</enum>
|
||||||
|
</property>
|
||||||
|
<property name="indentation">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Sensor</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Raw value</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Percentage</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>LDR1: Front</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>XXXX</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>LDR2: Bottom</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>XXXX</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>LDR3: Top</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>XXXX</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="sensorAggregationGroup">
|
||||||
|
<property name="title">
|
||||||
|
<string>Sensor aggregation</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_4">
|
||||||
|
<item row="0" column="0" colspan="2">
|
||||||
|
<widget class="QLabel" name="sensorAggregationFunctionLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Function</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QComboBox" name="sensorAggregationFunctionDropdown">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="sensorAggregationResultLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Module result:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="sensorAggregationValueLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QPushButton" name="sensorResetButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Restore all sensors to defaults</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<spacer name="sensorResetSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="sensorTotalAggregationGroup">
|
||||||
|
<property name="title">
|
||||||
|
<string>Total aggregation</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_7">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="sensorTotalAggregationFunctionLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Function</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QComboBox" name="sensorTotalAggregationFunctionDropdown">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="sensorTotalAggregationResultLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Result:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="sensorTotalAggregationValueLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>XXX%</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<spacer name="sensorTopSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" colspan="2">
|
||||||
|
<spacer name="sensorBottomSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenuBar" name="menuBar">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>406</width>
|
|
||||||
<height>21</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
<widget class="QToolBar" name="mainToolBar">
|
|
||||||
<attribute name="toolBarArea">
|
|
||||||
<enum>TopToolBarArea</enum>
|
|
||||||
</attribute>
|
|
||||||
<attribute name="toolBarBreak">
|
|
||||||
<bool>false</bool>
|
|
||||||
</attribute>
|
|
||||||
</widget>
|
|
||||||
<widget class="QStatusBar" name="statusBar"/>
|
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<resources>
|
<resources>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ static inline void rotateLog(const std::filesystem::path& logFileName, int numRo
|
|||||||
const auto generateRotateNames = [&]() {
|
const auto generateRotateNames = [&]() {
|
||||||
std::vector<QString> rotateFileNames = {QString().fromStdString(logFileName.string())};
|
std::vector<QString> rotateFileNames = {QString().fromStdString(logFileName.string())};
|
||||||
|
|
||||||
for(size_t i = 1; i < numRotatingLogs; ++i) {
|
for(int i = 1; i < numRotatingLogs; ++i) {
|
||||||
auto rotateName = logFileName.stem();
|
auto rotateName = logFileName.stem();
|
||||||
rotateName += std::string(".") + std::to_string(i);
|
rotateName += std::string(".") + std::to_string(i);
|
||||||
rotateName += logFileName.extension();
|
rotateName += logFileName.extension();
|
||||||
|
|||||||
@@ -5,8 +5,12 @@
|
|||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
|
#include <QAbstractButton>
|
||||||
#include <QCloseEvent>
|
#include <QCloseEvent>
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
|
#include <QSlider>
|
||||||
|
#include <QTabWidget>
|
||||||
|
#include <QWidget>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
|
|
||||||
@@ -15,69 +19,21 @@
|
|||||||
#include "sensor_driver.hpp"
|
#include "sensor_driver.hpp"
|
||||||
#include "utils.hpp"
|
#include "utils.hpp"
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), m_mtx(QMutex::RecursionMode::Recursive)
|
||||||
{
|
{
|
||||||
qDebug(ltr("Creating main window"));
|
qDebug(ltr("Creating main window"));
|
||||||
|
|
||||||
m_ui.setupUi(this);
|
m_ui.setupUi(this);
|
||||||
m_manualBrightnessSlider = m_ui.centralWidget->findChild<QGroupBox*>("groupBox")->findChild<QSlider*>("horizontalSlider");
|
|
||||||
|
|
||||||
if(m_manualBrightnessSlider) {
|
enumSensors();
|
||||||
connect(m_manualBrightnessSlider, &QSlider::valueChanged, [this](int value) {
|
enumMonitors();
|
||||||
const auto mappedBrightness = utils::map(value, 0, 100, 0.f, 1.f);
|
|
||||||
const auto newBrightness = std::clamp(mappedBrightness, 0.f, 1.f);
|
|
||||||
qDebug(ltr("Overriding brightness with %1").arg(newBrightness));
|
|
||||||
m_brightness = newBrightness;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
loadIcons();
|
setupMonitorsTab();
|
||||||
|
setupSensorsTab();
|
||||||
|
|
||||||
if(!QSystemTrayIcon::isSystemTrayAvailable()) {
|
setupTrayIcon();
|
||||||
qWarning(ltr("System tray is not available -> tray icon will be disabled"));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qDebug(ltr("System tray is available"));
|
|
||||||
|
|
||||||
m_trayIconMenu = new QMenu(this);
|
setupCallbackTimer();
|
||||||
m_showHideAction = m_trayIconMenu->addAction(tr("Show"), [this]() {
|
|
||||||
if(m_visibility) {
|
|
||||||
m_showHideAction->setText(tr("Show"));
|
|
||||||
hide();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_showHideAction->setText(tr("Hide"));
|
|
||||||
show();
|
|
||||||
}
|
|
||||||
m_visibility = !m_visibility;
|
|
||||||
});
|
|
||||||
m_trayIconMenu->addSeparator();
|
|
||||||
m_trayIconMenu->addAction(tr("Quit"), this, &QCoreApplication::quit);
|
|
||||||
|
|
||||||
qDebug(ltr("Tray icon context menu initialized"));
|
|
||||||
|
|
||||||
m_trayIcon = new QSystemTrayIcon(this);
|
|
||||||
m_trayIcon->setIcon(*m_errorIcon);
|
|
||||||
m_trayIcon->setContextMenu(m_trayIconMenu);
|
|
||||||
m_trayIcon->show();
|
|
||||||
m_trayIcon->setToolTip(tr("AdaptiveBrightness"));
|
|
||||||
connect(m_trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::trayIconClicked);
|
|
||||||
|
|
||||||
qDebug(ltr("Tray icon initialized"));
|
|
||||||
}
|
|
||||||
|
|
||||||
m_timerThread = new QThread(this);
|
|
||||||
m_timer = new QTimer(nullptr);
|
|
||||||
m_timer->setInterval(1000);
|
|
||||||
m_timer->moveToThread(m_timerThread);
|
|
||||||
m_timerThread->connect(m_timer, &QTimer::timeout, this, &MainWindow::updateState, Qt::DirectConnection);
|
|
||||||
m_timer->connect(m_timerThread, SIGNAL(started()), SLOT(start()));
|
|
||||||
m_timerThread->start();
|
|
||||||
|
|
||||||
qDebug(ltr("Tray icon update timer started"));
|
|
||||||
|
|
||||||
m_sensors = enumerateSensors();
|
|
||||||
m_monitors = enumerateMonitors();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
@@ -96,6 +52,35 @@ void MainWindow::closeEvent(QCloseEvent* event)
|
|||||||
event->ignore();
|
event->ignore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::enumSensors()
|
||||||
|
{
|
||||||
|
m_sensors.clear();
|
||||||
|
|
||||||
|
auto sensors = enumerateSensors();
|
||||||
|
|
||||||
|
for(auto& sensor: sensors) {
|
||||||
|
m_sensors.push_back({std::move(sensor)});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::enumMonitors()
|
||||||
|
{
|
||||||
|
m_mtx.lock();
|
||||||
|
|
||||||
|
m_ui.monitorDropdown->clear();
|
||||||
|
m_monitors.clear();
|
||||||
|
|
||||||
|
auto monitors = enumerateMonitors();
|
||||||
|
|
||||||
|
for(auto& monitor: monitors) {
|
||||||
|
const auto currentBrightness = monitor.getBrightness();
|
||||||
|
m_monitors.push_back({std::move(monitor), 0.f, 1.f, currentBrightness, false});
|
||||||
|
m_ui.monitorDropdown->addItem(m_monitors.back().driver.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
m_mtx.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::loadIcons()
|
void MainWindow::loadIcons()
|
||||||
{
|
{
|
||||||
qDebug(ltr("Loading icons"));
|
qDebug(ltr("Loading icons"));
|
||||||
@@ -131,13 +116,194 @@ void MainWindow::loadIcons()
|
|||||||
qDebug(ltr("Icons loaded"));
|
qDebug(ltr("Icons loaded"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::setupMonitorsTab()
|
||||||
|
{
|
||||||
|
connect(m_ui.monitorDropdown, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &MainWindow::updateCurrentMonitorGUI);
|
||||||
|
connect(m_ui.monitorEnumerateButton, &QAbstractButton::clicked, [this](bool) { enumMonitors(); });
|
||||||
|
connect(m_ui.monitorResetButton, &QAbstractButton::clicked, [this](bool) { resetAllMonitorSettings(); });
|
||||||
|
|
||||||
|
setupLimitsSlider();
|
||||||
|
setupOverallLimitsSlider();
|
||||||
|
|
||||||
|
setupBrightness();
|
||||||
|
setupOverallBrightness();
|
||||||
|
|
||||||
|
resetAllMonitorSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setupLimitsSlider()
|
||||||
|
{
|
||||||
|
connect(m_ui.monitorMinBrightnessSlider, &QSlider::valueChanged, [this](int value) {
|
||||||
|
m_ui.monitorMinBrightnessValueLabel->setText(tr("%1%").arg(value, 3));
|
||||||
|
if(value > m_ui.monitorMaxBrightnessSlider->value()) {
|
||||||
|
m_ui.monitorMaxBrightnessSlider->setValue(value);
|
||||||
|
}
|
||||||
|
const auto curIdx = m_ui.monitorDropdown->currentIndex();
|
||||||
|
m_monitors[curIdx].minBrightness = utils::map(value, 0, 100, 0.f, 1.f);
|
||||||
|
});
|
||||||
|
connect(m_ui.monitorMaxBrightnessSlider, &QSlider::valueChanged, [this](int value) {
|
||||||
|
m_ui.monitorMaxBrightnessValueLabel->setText(tr("%1%").arg(value, 3));
|
||||||
|
if(value < m_ui.monitorMinBrightnessSlider->value()) {
|
||||||
|
m_ui.monitorMinBrightnessSlider->setValue(value);
|
||||||
|
}
|
||||||
|
const auto curIdx = m_ui.monitorDropdown->currentIndex();
|
||||||
|
m_monitors[curIdx].maxBrightness = utils::map(value, 0, 100, 0.f, 1.f);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setupOverallLimitsSlider()
|
||||||
|
{
|
||||||
|
connect(m_ui.monitorOverallMinBrightnessSlider, &QSlider::valueChanged, [this](int value) {
|
||||||
|
m_ui.monitorOverallMinBrightnessValueLabel->setText(tr("%1%").arg(value, 3));
|
||||||
|
if(value > m_ui.monitorOverallMaxBrightnessSlider->value()) {
|
||||||
|
m_ui.monitorOverallMaxBrightnessSlider->setValue(value);
|
||||||
|
}
|
||||||
|
for(auto& monitor: m_monitors) {
|
||||||
|
monitor.minBrightness = utils::map(value, 0, 100, 0.f, 1.f);
|
||||||
|
}
|
||||||
|
updateCurrentMonitorGUI(m_ui.monitorDropdown->currentIndex());
|
||||||
|
});
|
||||||
|
connect(m_ui.monitorOverallMaxBrightnessSlider, &QSlider::valueChanged, [this](int value) {
|
||||||
|
m_ui.monitorOverallMaxBrightnessValueLabel->setText(tr("%1%").arg(value, 3));
|
||||||
|
if(value < m_ui.monitorOverallMinBrightnessSlider->value()) {
|
||||||
|
m_ui.monitorOverallMinBrightnessSlider->setValue(value);
|
||||||
|
}
|
||||||
|
for(auto& monitor: m_monitors) {
|
||||||
|
monitor.maxBrightness = utils::map(value, 0, 100, 0.f, 1.f);
|
||||||
|
}
|
||||||
|
updateCurrentMonitorGUI(m_ui.monitorDropdown->currentIndex());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setupBrightness()
|
||||||
|
{
|
||||||
|
m_ui.monitorBrightnessSlider->setDisabled(true);
|
||||||
|
|
||||||
|
connect(m_ui.monitorBrightnessSlider, &QSlider::valueChanged, [this](int value) {
|
||||||
|
m_ui.monitorBrightnessValueLabel->setText(tr("%1%").arg(value, 3));
|
||||||
|
const auto newBrightness = utils::map(value, 0, 100, 0.f, 1.f);
|
||||||
|
qDebug(ltr("Overriding brightness with %1").arg(newBrightness));
|
||||||
|
const auto curIdx = m_ui.monitorDropdown->currentIndex();
|
||||||
|
m_monitors[curIdx].brightness = newBrightness;
|
||||||
|
});
|
||||||
|
|
||||||
|
m_ui.monitorOverrideCheck->setChecked(false);
|
||||||
|
connect(m_ui.monitorOverrideCheck, &QCheckBox::stateChanged, [this](int state) {
|
||||||
|
m_ui.monitorBrightnessSlider->setEnabled(state == Qt::CheckState::Checked);
|
||||||
|
const auto curIdx = m_ui.monitorDropdown->currentIndex();
|
||||||
|
m_monitors[curIdx].manualOverride = state == Qt::CheckState::Checked;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setupOverallBrightness()
|
||||||
|
{
|
||||||
|
m_ui.monitorOverallBrightnessSlider->setDisabled(true);
|
||||||
|
|
||||||
|
connect(m_ui.monitorOverallBrightnessSlider, &QSlider::valueChanged, [this](int value) {
|
||||||
|
m_ui.monitorOverallBrightnessValueLabel->setText(tr("%1%").arg(value, 3));
|
||||||
|
const auto newBrightness = utils::map(value, 0, 100, 0.f, 1.f);
|
||||||
|
qDebug(ltr("Overriding overall brightness with %1").arg(newBrightness));
|
||||||
|
for(auto& monitor: m_monitors) {
|
||||||
|
if(monitor.manualOverride) {
|
||||||
|
monitor.brightness = newBrightness;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateCurrentMonitorGUI(m_ui.monitorDropdown->currentIndex());
|
||||||
|
});
|
||||||
|
|
||||||
|
m_ui.monitorOverallOverrideCheck->setChecked(false);
|
||||||
|
connect(m_ui.monitorOverallOverrideCheck, &QCheckBox::stateChanged, [this](int state) {
|
||||||
|
m_ui.monitorOverallBrightnessSlider->setEnabled(state == Qt::CheckState::Checked);
|
||||||
|
for(auto& monitor: m_monitors) {
|
||||||
|
monitor.manualOverride = state == Qt::CheckState::Checked;
|
||||||
|
}
|
||||||
|
updateCurrentMonitorGUI(m_ui.monitorDropdown->currentIndex());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setupSensorsTab()
|
||||||
|
{
|
||||||
|
m_ui.tabs->removeTab(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setupTrayIcon()
|
||||||
|
{
|
||||||
|
loadIcons();
|
||||||
|
|
||||||
|
if(!QSystemTrayIcon::isSystemTrayAvailable()) {
|
||||||
|
qWarning(ltr("System tray is not available -> tray icon will be disabled"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qDebug(ltr("System tray is available"));
|
||||||
|
|
||||||
|
m_trayIconMenu = new QMenu(this);
|
||||||
|
m_showHideAction = m_trayIconMenu->addAction(tr("Show"), [this]() {
|
||||||
|
if(m_visibility) {
|
||||||
|
m_showHideAction->setText(tr("Show"));
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_showHideAction->setText(tr("Hide"));
|
||||||
|
show();
|
||||||
|
}
|
||||||
|
m_visibility = !m_visibility;
|
||||||
|
});
|
||||||
|
m_trayIconMenu->addSeparator();
|
||||||
|
m_trayIconMenu->addAction(tr("Quit"), this, &QCoreApplication::quit);
|
||||||
|
|
||||||
|
qDebug(ltr("Tray icon context menu initialized"));
|
||||||
|
|
||||||
|
m_trayIcon = new QSystemTrayIcon(this);
|
||||||
|
m_trayIcon->setIcon(*m_errorIcon);
|
||||||
|
m_trayIcon->setContextMenu(m_trayIconMenu);
|
||||||
|
m_trayIcon->show();
|
||||||
|
m_trayIcon->setToolTip(tr("AdaptiveBrightness"));
|
||||||
|
connect(m_trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::trayIconClicked);
|
||||||
|
|
||||||
|
qDebug(ltr("Tray icon initialized"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::setupCallbackTimer()
|
||||||
|
{
|
||||||
|
m_timerThread = new QThread(this);
|
||||||
|
m_timer = new QTimer(nullptr);
|
||||||
|
m_timer->setInterval(1000);
|
||||||
|
m_timer->moveToThread(m_timerThread);
|
||||||
|
m_timerThread->connect(m_timer, &QTimer::timeout, this, &MainWindow::updateState, Qt::DirectConnection);
|
||||||
|
m_timer->connect(m_timerThread, SIGNAL(started()), SLOT(start()));
|
||||||
|
m_timerThread->start();
|
||||||
|
|
||||||
|
qDebug(ltr("Callback timer started"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::resetAllMonitorSettings()
|
||||||
|
{
|
||||||
|
m_ui.monitorOverallMinBrightnessSlider->setValue(0);
|
||||||
|
m_ui.monitorOverallMaxBrightnessSlider->setValue(100);
|
||||||
|
m_ui.monitorOverallOverrideCheck->setCheckState(Qt::CheckState::Unchecked);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::updateCurrentMonitorGUI(int index)
|
||||||
|
{
|
||||||
|
if(index == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ui.monitorMinBrightnessSlider->setValue(utils::map(m_monitors[index].minBrightness, 0.f, 1.f, 0, 100));
|
||||||
|
m_ui.monitorMaxBrightnessSlider->setValue(utils::map(m_monitors[index].maxBrightness, 0.f, 1.f, 0, 100));
|
||||||
|
m_ui.monitorBrightnessSlider->setValue(utils::map(m_monitors[index].brightness, 0.f, 1.f, 0, 100));
|
||||||
|
m_ui.monitorOverrideCheck->setChecked(m_monitors[index].manualOverride);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::updateState()
|
void MainWindow::updateState()
|
||||||
{
|
{
|
||||||
|
m_mtx.lock();
|
||||||
|
|
||||||
qDebug(ltr("Updating state"));
|
qDebug(ltr("Updating state"));
|
||||||
|
|
||||||
bool sensorError = false;
|
bool sensorError = false;
|
||||||
bool monitorError = false;
|
bool monitorError = false;
|
||||||
size_t iconBrightness = 0;
|
|
||||||
|
|
||||||
const auto getAverageSensorValue = [this](float& brightness) {
|
const auto getAverageSensorValue = [this](float& brightness) {
|
||||||
if(m_sensors.empty()) {
|
if(m_sensors.empty()) {
|
||||||
@@ -147,8 +313,8 @@ void MainWindow::updateState()
|
|||||||
std::vector<float> values;
|
std::vector<float> values;
|
||||||
|
|
||||||
for(auto& sensor: m_sensors) {
|
for(auto& sensor: m_sensors) {
|
||||||
const auto sensorValues = sensor.readValues();
|
const auto sensorValues = sensor.driver.readValues();
|
||||||
if(!sensor) {
|
if(!sensor.driver) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
values.insert(values.end(), sensorValues.begin(), sensorValues.end());
|
values.insert(values.end(), sensorValues.begin(), sensorValues.end());
|
||||||
@@ -158,35 +324,22 @@ void MainWindow::updateState()
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
const auto setAllMonitorsBrightness = [this](float& brightness) {
|
auto brightness = NAN;
|
||||||
if(m_monitors.empty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool errorOccurred = false;
|
if(!getAverageSensorValue(brightness)) {
|
||||||
for(auto& monitor: m_monitors) {
|
enumSensors();
|
||||||
if(!monitor.setBrightness(brightness)) {
|
|
||||||
errorOccurred = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return !errorOccurred;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!getAverageSensorValue(m_brightness)) {
|
|
||||||
m_sensors = enumerateSensors();
|
|
||||||
qInfo(ltr("At least one sensor became invalid, re-enumerating sensors found %1 valid sensor(s)").arg(m_sensors.size()));
|
qInfo(ltr("At least one sensor became invalid, re-enumerating sensors found %1 valid sensor(s)").arg(m_sensors.size()));
|
||||||
sensorError = true;
|
sensorError = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto roundedBrightness = std::round(utils::map(m_brightness, 0.f, 1.f, 0, 8));
|
if(!setMonitorBrightness(brightness)) {
|
||||||
iconBrightness = std::clamp<size_t>(roundedBrightness, 0, 8);
|
enumMonitors();
|
||||||
|
|
||||||
if(!setAllMonitorsBrightness(m_brightness)) {
|
|
||||||
m_monitors = enumerateMonitors();
|
|
||||||
qInfo(ltr("At least one monitor became invalid, re-enumerating monitors found %1 valid monitor(s)").arg(m_monitors.size()));
|
qInfo(ltr("At least one monitor became invalid, re-enumerating monitors found %1 valid monitor(s)").arg(m_monitors.size()));
|
||||||
monitorError = true;
|
monitorError = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto iconBrightness = utils::map(brightness, 0.f, 1.f, size_t{0}, size_t{8});
|
||||||
|
|
||||||
if(!sensorError && !monitorError && m_trayIcon) {
|
if(!sensorError && !monitorError && m_trayIcon) {
|
||||||
m_trayIcon->setIcon(*m_sensorStateIcons[iconBrightness]);
|
m_trayIcon->setIcon(*m_sensorStateIcons[iconBrightness]);
|
||||||
}
|
}
|
||||||
@@ -198,12 +351,80 @@ void MainWindow::updateState()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(m_trayIcon) {
|
if(m_trayIcon) {
|
||||||
m_trayIcon->setToolTip(tr("AdaptiveBrightness - %1%").arg(m_brightness * 100, 0, 'f', 0));
|
m_trayIcon->setToolTip(tr("AdaptiveBrightness - %1%").arg(brightness * 100, 0, 'f', 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_manualBrightnessSlider) {
|
m_mtx.unlock();
|
||||||
m_manualBrightnessSlider->setValue(utils::map(m_brightness, 0.f, 1.f, 0, 100));
|
}
|
||||||
|
|
||||||
|
bool MainWindow::setMonitorBrightness(float& brightness)
|
||||||
|
{
|
||||||
|
constexpr auto hysteresis = [](const auto& lowThreshold, const auto& highThreshold, const auto& currentValue, const auto& newValue) {
|
||||||
|
if(newValue > highThreshold || newValue < lowThreshold)
|
||||||
|
return newValue;
|
||||||
|
return currentValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
if(m_monitors.empty()) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool errorOccurred = false;
|
||||||
|
bool allMonitorsSameBrightness = true;
|
||||||
|
|
||||||
|
for(size_t i = 0; i < m_monitors.size(); ++i) {
|
||||||
|
const auto updateMonitorBrightness = [&] {
|
||||||
|
const auto brightnessRange = m_monitors[i].maxBrightness - m_monitors[i].minBrightness;
|
||||||
|
const auto hysteresisDelta = m_monitors[i].manualOverride ? 0.f : m_monitors[i].HYSTERESIS_THRESHOLD * brightnessRange;
|
||||||
|
const auto lowThreshold = std::clamp(m_monitors[i].prevBrightness - hysteresisDelta, m_monitors[i].minBrightness, m_monitors[i].maxBrightness);
|
||||||
|
const auto highThreshold = std::clamp(m_monitors[i].prevBrightness + hysteresisDelta, m_monitors[i].minBrightness, m_monitors[i].maxBrightness);
|
||||||
|
if(hysteresis(lowThreshold, highThreshold, m_monitors[i].prevBrightness, m_monitors[i].brightness) != m_monitors[i].prevBrightness) {
|
||||||
|
qDebug(ltr("Setting monitor %1 brightness from %2 to %3")
|
||||||
|
.arg(i)
|
||||||
|
.arg(m_monitors[i].prevBrightness, 0, 'f', 2)
|
||||||
|
.arg(m_monitors[i].brightness, 0, 'f', 2));
|
||||||
|
m_monitors[i].prevBrightness = m_monitors[i].brightness;
|
||||||
|
return m_monitors[i].driver.setBrightness(m_monitors[i].brightness);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qDebug(ltr("Hysteresis prevented setting monitor %1 brightness from %2 to %3")
|
||||||
|
.arg(i)
|
||||||
|
.arg(m_monitors[i].prevBrightness, 0, 'f', 2)
|
||||||
|
.arg(m_monitors[i].brightness, 0, 'f', 2));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!std::isnan(brightness) && !m_monitors[i].manualOverride) {
|
||||||
|
m_monitors[i].brightness = brightness;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_monitors[i].brightness = std::clamp(m_monitors[i].brightness, m_monitors[i].minBrightness, m_monitors[i].maxBrightness);
|
||||||
|
|
||||||
|
if(i > 0 && m_monitors[i - 1].brightness != m_monitors[i].brightness) {
|
||||||
|
allMonitorsSameBrightness = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!updateMonitorBrightness()) {
|
||||||
|
errorOccurred = true;
|
||||||
|
}
|
||||||
|
else if(m_ui.monitorDropdown->currentIndex() == static_cast<int>(i)) {
|
||||||
|
updateCurrentMonitorGUI(static_cast<int>(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!errorOccurred) {
|
||||||
|
auto avgBrightness = 0.f;
|
||||||
|
std::for_each(m_monitors.begin(), m_monitors.end(), [&avgBrightness](const auto& mon) { avgBrightness += mon.brightness; });
|
||||||
|
avgBrightness /= m_monitors.size();
|
||||||
|
brightness = avgBrightness;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(allMonitorsSameBrightness) {
|
||||||
|
m_ui.monitorOverallBrightnessSlider->setValue(utils::map(brightness, 0.f, 1.f, 0, 100));
|
||||||
|
}
|
||||||
|
|
||||||
|
return !errorOccurred;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
|
void MainWindow::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
|
#include <QMutex>
|
||||||
#include <QSlider>
|
#include <QSlider>
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
@@ -28,13 +29,33 @@ class MainWindow : public QMainWindow {
|
|||||||
private:
|
private:
|
||||||
void closeEvent(QCloseEvent* event) override;
|
void closeEvent(QCloseEvent* event) override;
|
||||||
|
|
||||||
|
void enumSensors();
|
||||||
|
void enumMonitors();
|
||||||
|
|
||||||
void loadIcons();
|
void loadIcons();
|
||||||
|
|
||||||
|
void setupMonitorsTab();
|
||||||
|
void setupLimitsSlider();
|
||||||
|
void setupOverallLimitsSlider();
|
||||||
|
void setupBrightness();
|
||||||
|
void setupOverallBrightness();
|
||||||
|
|
||||||
|
void setupSensorsTab();
|
||||||
|
|
||||||
|
void setupTrayIcon();
|
||||||
|
void setupCallbackTimer();
|
||||||
|
|
||||||
|
void resetAllMonitorSettings();
|
||||||
|
|
||||||
|
void updateCurrentMonitorGUI(int index);
|
||||||
|
|
||||||
void updateState();
|
void updateState();
|
||||||
|
|
||||||
|
bool setMonitorBrightness(float& brightness);
|
||||||
|
|
||||||
void trayIconClicked(QSystemTrayIcon::ActivationReason reason);
|
void trayIconClicked(QSystemTrayIcon::ActivationReason reason);
|
||||||
|
|
||||||
Ui::AdaptiveBrightnessClass m_ui;
|
Ui::MainWindow m_ui;
|
||||||
|
|
||||||
std::array<std::unique_ptr<QIcon>, 9> m_noSensorStateIcons;
|
std::array<std::unique_ptr<QIcon>, 9> m_noSensorStateIcons;
|
||||||
std::array<std::unique_ptr<QIcon>, 9> m_sensorStateIcons;
|
std::array<std::unique_ptr<QIcon>, 9> m_sensorStateIcons;
|
||||||
@@ -47,11 +68,23 @@ class MainWindow : public QMainWindow {
|
|||||||
|
|
||||||
QThread* m_timerThread = nullptr;
|
QThread* m_timerThread = nullptr;
|
||||||
QTimer* m_timer = nullptr;
|
QTimer* m_timer = nullptr;
|
||||||
|
QMutex m_mtx;
|
||||||
|
|
||||||
QSlider* m_manualBrightnessSlider = nullptr;
|
struct SensorData {
|
||||||
|
Sensor driver;
|
||||||
|
};
|
||||||
|
|
||||||
float m_brightness = 0.5f;
|
struct MonitorData {
|
||||||
|
static constexpr auto HYSTERESIS_THRESHOLD = 0.05f;
|
||||||
|
|
||||||
std::vector<Sensor> m_sensors;
|
Monitor driver;
|
||||||
std::vector<Monitor> m_monitors;
|
float minBrightness;
|
||||||
|
float maxBrightness;
|
||||||
|
float brightness;
|
||||||
|
float prevBrightness;
|
||||||
|
bool manualOverride;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<SensorData> m_sensors;
|
||||||
|
std::vector<MonitorData> m_monitors;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
#include <physicalmonitorenumerationapi.h>
|
#include <physicalmonitorenumerationapi.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
extern BOOL enumMonitorsCallback(HMONITOR, HDC, LPRECT, LPARAM);
|
extern BOOL enumMonitorsCallback(HMONITOR, HDC, LPRECT, LPARAM);
|
||||||
@@ -26,6 +28,8 @@ class Monitor {
|
|||||||
bool setBrightness(float percentage);
|
bool setBrightness(float percentage);
|
||||||
float getBrightness();
|
float getBrightness();
|
||||||
|
|
||||||
|
QString getName() const;
|
||||||
|
|
||||||
operator bool() const;
|
operator bool() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -53,6 +57,8 @@ class Monitor {
|
|||||||
|
|
||||||
#if defined(__clang__) || defined(__GNUC__)
|
#if defined(__clang__) || defined(__GNUC__)
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
class Monitor {
|
class Monitor {
|
||||||
public:
|
public:
|
||||||
Monitor();
|
Monitor();
|
||||||
@@ -60,6 +66,8 @@ class Monitor {
|
|||||||
bool setBrightness(float);
|
bool setBrightness(float);
|
||||||
float getBrightness();
|
float getBrightness();
|
||||||
|
|
||||||
|
QString getName() const;
|
||||||
|
|
||||||
operator bool() const;
|
operator bool() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -26,6 +26,12 @@ float Monitor::getBrightness()
|
|||||||
return NAN;
|
return NAN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString Monitor::getName() const
|
||||||
|
{
|
||||||
|
qWarning(ltr("Getting monitor name not implemented"));
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
Monitor::operator bool() const
|
Monitor::operator bool() const
|
||||||
{
|
{
|
||||||
qWarning(ltr("Checking monitor validity not implemented"));
|
qWarning(ltr("Checking monitor validity not implemented"));
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ Monitor::Monitor(Monitor&& other) noexcept
|
|||||||
other.m_hMonitor = 0;
|
other.m_hMonitor = 0;
|
||||||
other.m_physicalMonitor.name.clear();
|
other.m_physicalMonitor.name.clear();
|
||||||
other.m_physicalMonitor.handle = 0;
|
other.m_physicalMonitor.handle = 0;
|
||||||
|
other.m_brightnessRange.reset();
|
||||||
|
other.m_errorOccurred = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Monitor::~Monitor()
|
Monitor::~Monitor()
|
||||||
@@ -62,8 +64,7 @@ bool Monitor::setBrightness(float percentage)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto mappedBrightness = utils::map(percentage, 0.f, 1.f, m_brightnessRange->first, m_brightnessRange->second);
|
const auto newBrightness = utils::map(percentage, 0.f, 1.f, m_brightnessRange->first, m_brightnessRange->second);
|
||||||
const auto newBrightness = std::clamp<DWORD>(std::round(mappedBrightness), m_brightnessRange->first, m_brightnessRange->second);
|
|
||||||
|
|
||||||
if(!SetMonitorBrightness(m_physicalMonitor.handle, newBrightness)) {
|
if(!SetMonitorBrightness(m_physicalMonitor.handle, newBrightness)) {
|
||||||
qCritical(ltr("Failed to set brightness of monitor '%1' with handle '0x%2' and physical handle '0x%3', error: %4")
|
qCritical(ltr("Failed to set brightness of monitor '%1' with handle '0x%2' and physical handle '0x%3', error: %4")
|
||||||
@@ -108,7 +109,15 @@ float Monitor::getBrightness()
|
|||||||
m_brightnessRange = std::pair{minBrightness, maxBrightness};
|
m_brightnessRange = std::pair{minBrightness, maxBrightness};
|
||||||
m_errorOccurred = false;
|
m_errorOccurred = false;
|
||||||
|
|
||||||
return std::clamp(utils::map(brightness, minBrightness, maxBrightness, 0.f, 1.f), 0.f, 1.f);
|
return utils::map(brightness, minBrightness, maxBrightness, 0.f, 1.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Monitor::getName() const
|
||||||
|
{
|
||||||
|
return QString("%1 (0x%2:0x%3)")
|
||||||
|
.arg(m_physicalMonitor.name)
|
||||||
|
.arg(reinterpret_cast<qulonglong>(m_hMonitor), 0, 16)
|
||||||
|
.arg(reinterpret_cast<qulonglong>(m_physicalMonitor.handle), 0, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
Monitor::operator bool() const
|
Monitor::operator bool() const
|
||||||
|
|||||||
@@ -15,6 +15,13 @@ Sensor::~Sensor()
|
|||||||
qDebug(ltr("Destroying sensor on serial port %1").arg(m_serialPortName));
|
qDebug(ltr("Destroying sensor on serial port %1").arg(m_serialPortName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Sensor::Sensor(Sensor&& other) noexcept : m_serialPortName(other.m_serialPortName), m_errorOccurred(other.m_errorOccurred), m_range(other.m_range)
|
||||||
|
{
|
||||||
|
other.m_serialPortName.clear();
|
||||||
|
other.m_errorOccurred = false;
|
||||||
|
other.m_range.reset();
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<float> Sensor::readValues()
|
std::vector<float> Sensor::readValues()
|
||||||
{
|
{
|
||||||
qDebug(ltr("Reading values of sensor on port %1").arg(m_serialPortName));
|
qDebug(ltr("Reading values of sensor on port %1").arg(m_serialPortName));
|
||||||
@@ -40,8 +47,7 @@ std::vector<float> Sensor::readValues()
|
|||||||
std::vector<float> normalizedValues;
|
std::vector<float> normalizedValues;
|
||||||
|
|
||||||
for(const auto& value: values) {
|
for(const auto& value: values) {
|
||||||
const auto mappedValue = utils::map(value, m_range->first, m_range->second, 0.f, 1.f);
|
normalizedValues.push_back(utils::map(value, m_range->first, m_range->second, 0.f, 1.f));
|
||||||
normalizedValues.push_back(std::clamp(mappedValue, 0.f, 1.f));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return normalizedValues;
|
return normalizedValues;
|
||||||
|
|||||||
@@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
class Sensor {
|
class Sensor {
|
||||||
public:
|
public:
|
||||||
|
Sensor(const Sensor&) = delete;
|
||||||
|
Sensor(Sensor&& other) noexcept;
|
||||||
~Sensor();
|
~Sensor();
|
||||||
|
|
||||||
std::vector<float> readValues();
|
std::vector<float> readValues();
|
||||||
@@ -26,7 +28,7 @@ class Sensor {
|
|||||||
|
|
||||||
static constexpr auto SUPPORTED_FIRMWARE = std::string_view{"AdaptiveBrightness v1.2"};
|
static constexpr auto SUPPORTED_FIRMWARE = std::string_view{"AdaptiveBrightness v1.2"};
|
||||||
|
|
||||||
const QString m_serialPortName;
|
QString m_serialPortName;
|
||||||
bool m_errorOccurred = false;
|
bool m_errorOccurred = false;
|
||||||
|
|
||||||
std::optional<std::pair<int, int>> m_range;
|
std::optional<std::pair<int, int>> m_range;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ std::vector<Sensor> enumerateSensors()
|
|||||||
auto sensor = Sensor(portInfo.portName());
|
auto sensor = Sensor(portInfo.portName());
|
||||||
if(sensor.isValidSensor()) {
|
if(sensor.isValidSensor()) {
|
||||||
qInfo(ltr("Successfully enumerated sensor on port %1").arg(portInfo.portName()));
|
qInfo(ltr("Successfully enumerated sensor on port %1").arg(portInfo.portName()));
|
||||||
sensors.push_back(sensor);
|
sensors.push_back(std::move(sensor));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,30 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
namespace utils {
|
namespace utils {
|
||||||
|
|
||||||
template<typename InType, typename OutType>
|
template<typename InType, typename OutType>
|
||||||
auto map(InType value, InType inMin, InType inMax, OutType outMin, OutType outMax)
|
auto interpolate(InType value, InType inMin, InType inMax, OutType outMin, OutType outMax)
|
||||||
{
|
{
|
||||||
return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
|
return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename InType, typename OutType>
|
||||||
|
auto map(InType value, InType inMin, InType inMax, OutType outMin, OutType outMax)
|
||||||
|
{
|
||||||
|
if constexpr(std::is_integral_v<OutType>) {
|
||||||
|
return std::clamp(static_cast<OutType>(std::round(interpolate(value, inMin, inMax, outMin, outMax))), outMin, outMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::clamp(static_cast<OutType>(interpolate(value, inMin, inMax, outMin, outMax)), outMin, outMax);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename>
|
template<typename>
|
||||||
struct array_size;
|
struct array_size;
|
||||||
|
|
||||||
|
|||||||
@@ -71,10 +71,16 @@ target_link_libraries(AdaptiveBrightness
|
|||||||
Qt5::SerialPort
|
Qt5::SerialPort
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang")
|
||||||
|
target_link_libraries(AdaptiveBrightness
|
||||||
|
stdc++fs
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_link_libraries(AdaptiveBrightness
|
target_link_libraries(AdaptiveBrightness
|
||||||
Dxva2.lib
|
Dxva2.lib
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ Found DFU: [0483:df11] ver=2200, devnum=57, cfg=1, intf=0, path="2-13.2.2", alt=
|
|||||||
Found DFU: [0483:df11] ver=2200, devnum=57, cfg=1, intf=0, path="2-13.2.2", alt=0, name="@Internal Flash /0x08000000/032*0001Kg", serial="FFFFFFFEFFFF"
|
Found DFU: [0483:df11] ver=2200, devnum=57, cfg=1, intf=0, path="2-13.2.2", alt=0, name="@Internal Flash /0x08000000/032*0001Kg", serial="FFFFFFFEFFFF"
|
||||||
```
|
```
|
||||||
|
|
||||||
The firmware can then be flashing using:
|
The firmware can then be flashed using:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ dfu-util -a 0 -s 0x08000000 -D AdaptiveBrightnessFirmware.bin
|
$ dfu-util -a 0 -s 0x08000000 -D AdaptiveBrightnessFirmware.bin
|
||||||
|
|||||||
Reference in New Issue
Block a user