diff --git a/AdaptiveBrightness/main_window.cpp b/AdaptiveBrightness/main_window.cpp index e28f32c..b1fb0a9 100644 --- a/AdaptiveBrightness/main_window.cpp +++ b/AdaptiveBrightness/main_window.cpp @@ -1,5 +1,10 @@ #include "main_window.hpp" +#include +#include + +#include + #include #include @@ -100,4 +105,66 @@ void MainWindow::loadIcons() void MainWindow::updateState() { qDebug(ltr("Updating state")); + + bool sensorError = false; + bool monitorError = false; + size_t iconBrightness = 0; + + const auto getAverageSensorValue = [this](float& brightness) { + if(m_sensors.empty()) { + return false; + } + + std::vector values; + + for(auto& sensor: m_sensors) { + const auto sensorValues = sensor.readValues(); + if(!sensor) { + return false; + } + values.insert(values.end(), sensorValues.begin(), sensorValues.end()); + } + + brightness = std::accumulate(values.begin(), values.end(), 0.f) / values.size(); + return true; + }; + + const auto setAllMonitorsBrightness = [this](float& brightness) { + if(m_monitors.empty()) { + return false; + } + + bool errorOccurred = false; + for(auto& monitor: m_monitors) { + 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())); + sensorError = true; + } + + const auto roundedBrightness = std::round(utils::map(m_brightness, 0.f, 1.f, 0, 8)); + iconBrightness = std::clamp(roundedBrightness, 0, 8); + + 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())); + monitorError = true; + } + + if(!sensorError && !monitorError && m_trayIcon) { + m_trayIcon->setIcon(*m_sensorStateIcons[iconBrightness]); + } + else if(sensorError && !monitorError && m_trayIcon) { + m_trayIcon->setIcon(*m_noSensorStateIcons[iconBrightness]); + } + else if(m_trayIcon) { + m_trayIcon->setIcon(*m_errorIcon); + } } diff --git a/AdaptiveBrightness/main_window.hpp b/AdaptiveBrightness/main_window.hpp index 12f9f07..5dc4c4c 100644 --- a/AdaptiveBrightness/main_window.hpp +++ b/AdaptiveBrightness/main_window.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -40,7 +41,7 @@ class MainWindow : public QMainWindow { QTimer* m_timer = nullptr; - float m_brightness; + float m_brightness = 0.5f; std::vector m_sensors; std::vector m_monitors;