From 36e9745d4dca880646df9961a0a974a725906081 Mon Sep 17 00:00:00 2001
From: Jochen Vothknecht <jochen3120@gmail.com>
Date: Sun, 7 Oct 2018 23:32:44 +0200
Subject: [PATCH] add new sensor interface

---
 main/measured.cpp | 35 +++++++++++++++--------------------
 main/measured.h   | 37 ++++++++++++++++++++++++-------------
 2 files changed, 39 insertions(+), 33 deletions(-)

diff --git a/main/measured.cpp b/main/measured.cpp
index c8d608e..53ffbe8 100644
--- a/main/measured.cpp
+++ b/main/measured.cpp
@@ -11,13 +11,6 @@
 #include "mqtt_common.h"
 
 
-typedef struct {
-    std::string name;
-    std::string type;
-    std::string unit;
-    qthing::measured::sensor_t sensor;
-} sensor_config_t;
-
 static void esp_log_backend(const std::vector<qthing::measured::MeasureResult>& data) {
     for (auto const& d: data) {
         ESP_LOGI("measured", "name=%s type=%s unit=%s value=%f", d.sensor_name.c_str(), d.sensor_type.c_str(), d.sensor_unit.c_str(), d.value);
@@ -33,6 +26,16 @@ static void measured_wrapper(void *parameter) {
 
 qthing::measured::MeasureResult::MeasureResult(const std::string& name, const std::string& type, const std::string& unit, float value) : value(value), sensor_name(name), sensor_type(type), sensor_unit(unit) {}
 
+qthing::measured::Sensor::Sensor(const std::string& name, const std::string& type, const std::string& unit) : name(name), type(type), unit(unit) {}
+
+qthing::measured::Sensor::skip_measurement_t qthing::measured::Sensor::prepare_next_measurement() {
+    return(no_skip);
+}
+
+qthing::measured::MeasureResult qthing::measured::Sensor::create_result(float value) {
+    return(qthing::measured::MeasureResult(this->name, this->type, this->unit, value));
+}
+
 /*
  *  Measured implementation
  */
@@ -55,9 +58,8 @@ void qthing::measured::Measured::measured() {
     while(true) {
         std::vector<qthing::measured::MeasureResult> data;
 
-        for (auto const& sensor: sensors) {
-            qthing::measured::MeasureResult tmp(sensor.name, sensor.type, sensor.unit, sensor.sensor());
-            data.push_back(tmp);
+        for (auto& sensor: sensors) {
+            data.push_back(sensor->measure());
         }
 
         this->backend(data);
@@ -66,15 +68,8 @@ void qthing::measured::Measured::measured() {
     }
 }
 
-void qthing::measured::Measured::register_sensor(std::string name, std::string type, std::string unit, qthing::measured::sensor_t sensor) {
-    sensor_config_t cfg = {
-        .name = name,
-        .type = type,
-        .unit = unit,
-        .sensor = sensor
-    };
-
-    this->sensors.push_back(cfg);
+void qthing::measured::Measured::register_sensor(std::string name, std::string type, std::string unit, qthing::measured::Sensor *sensor) {
+    this->sensors.push_back(sensor);
 }
 
 
@@ -104,7 +99,7 @@ static void start_measured() {
     }
 }
 
-void qthing::measured::register_sensor(std::string name, std::string type, std::string unit, qthing::measured::sensor_t sensor) {
+void qthing::measured::register_sensor(std::string name, std::string type, std::string unit, qthing::measured::Sensor *sensor) {
     start_measured();
     md->register_sensor(name, type, unit, sensor);
 }
diff --git a/main/measured.h b/main/measured.h
index 400357b..48a6fc1 100644
--- a/main/measured.h
+++ b/main/measured.h
@@ -18,40 +18,51 @@ namespace qthing {
         class MeasureResult {
             
             public:
-                MeasureResult(const std::string& name, const std::string& type, const std::string& unit, float value);
-
                 const float value;
 
                 const std::string& sensor_name;
                 const std::string& sensor_type;
                 const std::string& sensor_unit;
 
+                MeasureResult(const std::string& name, const std::string& type, const std::string& unit, float value);
+
         };
 
-        typedef std::function<float()> sensor_t;
+        class Sensor {
+
+            enum skip_measurement_t { no_skip, skip };
+
+            public:
+                const std::string& name;
+                const std::string& type;
+                const std::string& unit;
+
+                Sensor(const std::string& name, const std::string& type, const std::string& unit);
+
+                virtual skip_measurement_t prepare_next_measurement();
+                virtual MeasureResult measure() = 0;
+
+            protected:
+                MeasureResult create_result(float value);
+        };
+
+        // typedef std::function<float()> sensor_t;
         typedef std::function<void(const std::vector<MeasureResult>&)> backend_t;
 
         void register_backend(backend_t new_backend);
-        void register_sensor(std::string name, std::string type, std::string unit, sensor_t sensor);
+        void register_sensor(std::string name, std::string type, std::string unit, Sensor *sensor);
         void set_measure_period(uint16_t period);
 
         class Measured {
 
-            typedef struct {
-                std::string name;
-                std::string type;
-                std::string unit;
-                qthing::measured::sensor_t sensor;
-            } sensor_config_t;
-
             public:
                 Measured();
                 void register_backend(backend_t new_backend);
-                void register_sensor(std::string name, std::string type, std::string unit, sensor_t sensor);
+                void register_sensor(std::string name, std::string type, std::string unit, Sensor *sensor);
                 void set_measure_period(uint16_t period);
 
             private:
-                std::vector<sensor_config_t> sensors;
+                std::vector<Sensor *> sensors;
                 qthing::measured::backend_t backend;
                 uint16_t measure_period = MEASURED_PERIOD_MS;
                 void measured();
-- 
GitLab