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