From 6244f6f8ae516500b7b9435741b2ac38af88d6b5 Mon Sep 17 00:00:00 2001 From: BlackMark Date: Sun, 5 Jul 2020 00:31:54 +0200 Subject: [PATCH] Implement reading range of sensor --- AdaptiveBrightness/sensor_driver.cpp | 26 +++++++++++++++++++++++--- AdaptiveBrightness/sensor_driver.hpp | 8 +++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/AdaptiveBrightness/sensor_driver.cpp b/AdaptiveBrightness/sensor_driver.cpp index 7cac60a..6ff13b1 100644 --- a/AdaptiveBrightness/sensor_driver.cpp +++ b/AdaptiveBrightness/sensor_driver.cpp @@ -21,7 +21,14 @@ SensorDriver::Sensor::~Sensor() std::pair SensorDriver::Sensor::readRange() const { - return {0, 4 * 1024 - 1}; + 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 SensorDriver::Sensor::readValues() const @@ -29,6 +36,20 @@ std::vector SensorDriver::Sensor::readValues() const return {520, 1233, 4233}; } +std::pair SensorDriver::Sensor::parseRangeResponse(const QByteArray& response) const +{ + const auto rangeRegex = std::regex("([0-9]+),([0-9]+)"); + const auto strResponse = response.toStdString(); + std::smatch rangeMatch; + + if(std::regex_search(strResponse, rangeMatch, rangeRegex)) { + qDebug(ltr("Found range response: '%1'").arg(QString().fromStdString(rangeMatch[0].str()))); + return std::pair{std::stoi(rangeMatch[1]), std::stoi(rangeMatch[2])}; + } + + return {-1, -1}; +} + SensorDriver::SensorDriver() { qDebug("Initializing sensor driver"); @@ -59,7 +80,7 @@ std::vector SensorDriver::enumerateSensors() const return std::move(sensors); } -bool SensorDriver::getSensorCommandResponse(const QString& serialPortName, QByteArray command, QByteArray& response) const +bool SensorDriver::getSensorCommandResponse(const QString& serialPortName, QByteArray command, QByteArray& response) { QSerialPort serialPort; serialPort.setPortName(serialPortName); @@ -114,7 +135,6 @@ bool SensorDriver::getSensorCommandResponse(const QString& serialPortName, QByte bool SensorDriver::isValidSensor(const QString& serialPortName) const { - constexpr auto VERSION_CMD = std::string_view{"version"}; const auto versionCmd = QByteArray(VERSION_CMD.data(), static_cast(VERSION_CMD.size())); QByteArray response; diff --git a/AdaptiveBrightness/sensor_driver.hpp b/AdaptiveBrightness/sensor_driver.hpp index 697422b..4aa2bea 100644 --- a/AdaptiveBrightness/sensor_driver.hpp +++ b/AdaptiveBrightness/sensor_driver.hpp @@ -18,6 +18,8 @@ class SensorDriver { private: QString m_serialPortName; + + std::pair parseRangeResponse(const QByteArray& response) const; }; public: @@ -27,7 +29,11 @@ class SensorDriver { std::vector enumerateSensors() const; private: - bool getSensorCommandResponse(const QString& serialPortName, QByteArray command, QByteArray& response) const; + static constexpr auto VERSION_CMD = std::string_view{"version"}; + static constexpr auto RANGE_CMD = std::string_view{"range"}; + static constexpr auto READ_CMD = std::string_view{"read csv"}; + + static bool getSensorCommandResponse(const QString& serialPortName, QByteArray command, QByteArray& response); bool isValidSensor(const QString& serialPortName) const; std::string parseVersionResponse(const QByteArray& response) const; };