Implement main update loop

This commit is contained in:
BlackMark 2020-07-06 22:09:44 +02:00
parent 2704bb2636
commit 46e0e8d0a6
2 changed files with 69 additions and 1 deletions

View File

@ -1,5 +1,10 @@
#include "main_window.hpp"
#include <algorithm>
#include <numeric>
#include <cmath>
#include <QtDebug>
#include <QtGlobal>
@ -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<float> 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<size_t>(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);
}
}

View File

@ -2,6 +2,7 @@
#include <array>
#include <memory>
#include <vector>
#include <QAction>
#include <QIcon>
@ -40,7 +41,7 @@ class MainWindow : public QMainWindow {
QTimer* m_timer = nullptr;
float m_brightness;
float m_brightness = 0.5f;
std::vector<Sensor> m_sensors;
std::vector<Monitor> m_monitors;