From 2704bb263680a4132483be6919d7a95c2d297aab Mon Sep 17 00:00:00 2001 From: BlackMark Date: Mon, 6 Jul 2020 20:59:20 +0200 Subject: [PATCH] Change sensor interface to provide normalized values --- AdaptiveBrightness/sensor.cpp | 50 +++++++++++++++++++++++++---------- AdaptiveBrightness/sensor.hpp | 8 ++++-- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/AdaptiveBrightness/sensor.cpp b/AdaptiveBrightness/sensor.cpp index 4b613d9..91e1c07 100644 --- a/AdaptiveBrightness/sensor.cpp +++ b/AdaptiveBrightness/sensor.cpp @@ -1,5 +1,6 @@ #include "sensor.hpp" +#include #include #include @@ -7,25 +8,14 @@ #include #include "log_tr.hpp" +#include "utils.hpp" Sensor::~Sensor() { qDebug(ltr("Destroying sensor on serial port %1").arg(m_serialPortName)); } -std::pair Sensor::readRange() -{ - qDebug(ltr("Reading range of sensor on port %1").arg(m_serialPortName)); - - const auto rangeCmd = QByteArray(RANGE_CMD.data(), static_cast(RANGE_CMD.size())); - QByteArray response; - if(!getSensorCommandResponse(m_serialPortName, rangeCmd, response)) - return {-1, -1}; - - return parseRangeResponse(response); -} - -std::vector Sensor::readValues() +std::vector Sensor::readValues() { qDebug(ltr("Reading values of sensor on port %1").arg(m_serialPortName)); @@ -34,7 +24,27 @@ std::vector Sensor::readValues() if(!getSensorCommandResponse(m_serialPortName, readCmd, response)) return {}; - return parseReadResponse(response); + const auto values = parseReadResponse(response); + + if(!m_range) { + qDebug(ltr("No sensor range known")); + + const auto sensorRange = readRange(); + if(m_errorOccurred) { + return {}; + } + + m_range = sensorRange; + } + + std::vector normalizedValues; + + for(const auto& value: values) { + const auto mappedValue = 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; } Sensor::Sensor(const QString& serialPortName) : m_serialPortName(serialPortName) @@ -156,3 +166,15 @@ std::vector Sensor::parseReadResponse(const QByteArray& response) const return {}; } + +std::pair Sensor::readRange() +{ + qDebug(ltr("Reading range of sensor on port %1").arg(m_serialPortName)); + + const auto rangeCmd = QByteArray(RANGE_CMD.data(), static_cast(RANGE_CMD.size())); + QByteArray response; + if(!getSensorCommandResponse(m_serialPortName, rangeCmd, response)) + return {-1, -1}; + + return parseRangeResponse(response); +} diff --git a/AdaptiveBrightness/sensor.hpp b/AdaptiveBrightness/sensor.hpp index 78d0c9c..03e2b51 100644 --- a/AdaptiveBrightness/sensor.hpp +++ b/AdaptiveBrightness/sensor.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -12,8 +13,7 @@ class Sensor { public: ~Sensor(); - std::pair readRange(); - std::vector readValues(); + std::vector readValues(); operator bool() const { return !m_errorOccurred; } @@ -29,6 +29,8 @@ class Sensor { const QString m_serialPortName; bool m_errorOccurred = false; + std::optional> m_range; + Sensor(const QString& serialPortName); bool isValidSensor(); @@ -38,4 +40,6 @@ class Sensor { std::string parseVersionResponse(const QByteArray& response) const; std::pair parseRangeResponse(const QByteArray& response) const; std::vector parseReadResponse(const QByteArray& response) const; + + std::pair readRange(); };