From efdcdef196ecb9cfa9665519b337df8c8278ce1c Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Sun, 30 Aug 2020 15:32:26 +0300 Subject: [PATCH] sns: clean-up sensor init - BaseFilter must have virtual dtor - magnitude object is not trivial, we need to manage filter lifetime - Ensure move also moves filter object - Clean-up using magnitude object by value in functions --- code/espurna/filters/BaseFilter.h | 18 +++++++++++------- code/espurna/sensor.cpp | 19 ++++++++++++++++--- code/espurna/sensor.h | 2 -- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/code/espurna/filters/BaseFilter.h b/code/espurna/filters/BaseFilter.h index 310e49e1..7d3108cb 100644 --- a/code/espurna/filters/BaseFilter.h +++ b/code/espurna/filters/BaseFilter.h @@ -10,15 +10,19 @@ class BaseFilter { public: - virtual void add(double value) = 0; - virtual unsigned char count() = 0; - virtual void reset() = 0; - virtual double result() = 0; - virtual void resize(unsigned char size) = 0; - unsigned char size() { return _size; }; + + virtual ~BaseFilter() {} + + virtual void add(double value) = 0; + virtual unsigned char count() = 0; + virtual void reset() = 0; + virtual double result() = 0; + virtual void resize(unsigned char size) = 0; + unsigned char size() { return _size; }; protected: - unsigned char _size; + + unsigned char _size; }; diff --git a/code/espurna/sensor.cpp b/code/espurna/sensor.cpp index 029ad59b..e3a83834 100644 --- a/code/espurna/sensor.cpp +++ b/code/espurna/sensor.cpp @@ -227,6 +227,19 @@ struct sensor_magnitude_t { } sensor_magnitude_t() = default; + + sensor_magnitude_t& operator=(const sensor_magnitude_t&) = default; + sensor_magnitude_t(const sensor_magnitude_t&) = default; + + sensor_magnitude_t(sensor_magnitude_t&& other) { + *this = other; + other.filter = nullptr; + } + + ~sensor_magnitude_t() { + delete filter; + } + sensor_magnitude_t(unsigned char slot, unsigned char index_local, unsigned char type, sensor::Unit units, BaseSensor* sensor); BaseSensor * sensor { nullptr }; // Sensor object @@ -2165,7 +2178,7 @@ void _sensorLoad() { void _sensorReport(unsigned char index, double value) { - const auto& magnitude = _magnitudes.at(index); + auto& magnitude = _magnitudes.at(index); // XXX: ensure that the received 'value' will fit here // dtostrf 2nd arg only controls leading zeroes and the @@ -2596,7 +2609,7 @@ String magnitudeDescription(unsigned char index) { String magnitudeTopicIndex(unsigned char index) { char topic[32] = {0}; if (index < _magnitudes.size()) { - sensor_magnitude_t magnitude = _magnitudes[index]; + auto& magnitude = _magnitudes[index]; if (SENSOR_USE_INDEX || (sensor_magnitude_t::counts(magnitude.type) > 1)) { snprintf(topic, sizeof(topic), "%s/%u", magnitudeTopic(magnitude.type).c_str(), magnitude.index_global); } else { @@ -2724,7 +2737,7 @@ void sensorLoop() { // Get readings for (unsigned char i=0; i<_magnitudes.size(); i++) { - sensor_magnitude_t magnitude = _magnitudes[i]; + auto& magnitude = _magnitudes[i]; if (magnitude.sensor->status()) { diff --git a/code/espurna/sensor.h b/code/espurna/sensor.h index 03bde2ab..cdf278bb 100644 --- a/code/espurna/sensor.h +++ b/code/espurna/sensor.h @@ -128,8 +128,6 @@ struct Energy { }; struct Value { - constexpr static size_t BufferSize { 33u }; - double get(); double last;