diff --git a/src/Data/DataController.cpp b/src/Data/DataController.cpp index 1cf5071..d06eed7 100644 --- a/src/Data/DataController.cpp +++ b/src/Data/DataController.cpp @@ -17,26 +17,25 @@ DataController *DataController::Instance() DataController::DataController() : _temperatureMeasurements( "temperature", - readTemperature, + TemperatureSensor::Instance(), TEMPERATURE_AVG_LOOKBACK, TEMPERATURE_SIGNIFICANT_CHANGE, PUBLISH_INTERVAL), _humidityMeasurements( "humidity", - readHumidity, + HumiditySensor::Instance(), HUMIDITY_AVG_LOOKBACK, HUMIDITY_SIGNIFICANT_CHANGE, PUBLISH_INTERVAL), _distanceMeasurements( "distance", - readDistance, + DistanceSensor::Instance(), DISTANCE_AVG_LOOKBACK, DISTANCE_SIGNIFICANT_CHANGE, PUBLISH_INTERVAL), _logger("DATA") { _ui = DoughUI::Instance(); - _sensors = DoughSensors::Instance(); _mqtt = DoughMQTT::Instance(); } @@ -52,6 +51,10 @@ void DataController::setup() DoughMQTT *mqtt = DoughMQTT::Instance(); mqtt->onConnect(DataController::handleMqttConnect); mqtt->onMessage(DataController::handleMqttMessage); + + _temperatureMeasurements.setup(); + _humidityMeasurements.setup(); + _distanceMeasurements.setup(); } void DataController::handleMqttConnect(DoughMQTT *mqtt) diff --git a/src/Data/DataController.h b/src/Data/DataController.h index dac2e6f..a2cb18e 100644 --- a/src/Data/DataController.h +++ b/src/Data/DataController.h @@ -29,7 +29,9 @@ #include #include "Data/Measurements.h" -#include "Sensors/DoughSensors.h" +#include "Sensors/TemperatureSensor.h" +#include "Sensors/HumiditySensor.h" +#include "Sensors/DistanceSensor.h" #include "Network/DoughWiFi.h" #include "Network/DoughMQTT.h" #include "UI/DoughUI.h" @@ -64,7 +66,6 @@ private: static DataController *_instance; DoughUI *_ui; DoughMQTT *_mqtt; - DoughSensors *_sensors; Measurements _temperatureMeasurements; Measurements _humidityMeasurements; Measurements _distanceMeasurements; diff --git a/src/Data/Measurements.cpp b/src/Data/Measurements.cpp index 06d0afd..9166c13 100644 --- a/src/Data/Measurements.cpp +++ b/src/Data/Measurements.cpp @@ -3,26 +3,29 @@ Measurements::Measurements( const char *mqttKey, - Measurement (*measureFunc)(), + SensorBase *sensor, unsigned int storageSize, unsigned int significantChange, unsigned int minimumPublishTime) { _mqttKey = mqttKey; - _measureFunc = measureFunc; + _sensor = sensor; _storageSize = storageSize; _significantChange = significantChange; _minimumPublishTime = minimumPublishTime; _mqtt = DoughMQTT::Instance(); +} +void Measurements::setup() +{ // Format the key to use for publishing the average (i.e. "/average"). - auto lenAverageKey = strlen(mqttKey) + 8; // +8 for the "/average" suffix - _mqttAverageKey = new char[lenAverageKey + 1]; // +1 for the ending \0 + auto lenAverageKey = strlen(_mqttKey) + 9; // +9 for the "/average\0" suffix + _mqttAverageKey = new char[lenAverageKey]; snprintf(_mqttAverageKey, lenAverageKey, "%s/average", _mqttKey); // Initialize the storage for holding the measurements. - _storage = new Measurement *[storageSize]; - for (unsigned int i = 0; i < storageSize; i++) + _storage = new Measurement *[_storageSize]; + for (unsigned int i = 0; i < _storageSize; i++) { _storage[i] = new Measurement; } @@ -31,8 +34,8 @@ Measurements::Measurements( void Measurements::process() { - auto m = _measureFunc(); - _add(m); + auto m = _sensor->read(); + _store(m); if (_mustPublish()) { _publish(); @@ -103,7 +106,7 @@ void Measurements::_publish() last.copyTo(&_lastPublished); } -void Measurements::_add(Measurement measurement) +void Measurements::_store(Measurement measurement) { measurement.copyTo(_storage[_next()]); diff --git a/src/Data/Measurements.h b/src/Data/Measurements.h index e4256ff..cab4561 100644 --- a/src/Data/Measurements.h +++ b/src/Data/Measurements.h @@ -2,6 +2,7 @@ #define DOUGH_DATA_MEASUREMENTS_H #include +#include "Sensors/SensorBase.h" #include "Data/Measurement.h" #include "Network/DoughMQTT.h" @@ -18,8 +19,8 @@ public: /** * Create a new Measurements object. * - * @param measureFunc - * Function that reads a sensor and returns a Measurement object. + * @param sensor + * The sensor to read, implements SensorBase. * @param storageSize * Number of measurements to keep track of for computing an average. * @param significantChange @@ -31,10 +32,11 @@ public: */ Measurements( const char *mqttKey, - Measurement (*measureFunc)(), + SensorBase *sensor, unsigned int storageSize, unsigned int significantChange, unsigned int minimumPublishTime); + void setup(); void process(); Measurement getLast(); Measurement getAverage(); @@ -44,7 +46,7 @@ private: DoughMQTT *_mqtt; const char *_mqttKey; char *_mqttAverageKey; - Measurement (*_measureFunc)(); + SensorBase *_sensor; Measurement **_storage; unsigned int _storageSize; unsigned int _significantChange; @@ -57,7 +59,7 @@ private: Measurement _lastPublishedAverage; bool _mustPublish(); void _publish(); - void _add(Measurement measurement); + void _store(Measurement measurement); unsigned int _next(); }; diff --git a/src/Sensors/DistanceSensor.cpp b/src/Sensors/DistanceSensor.cpp new file mode 100644 index 0000000..370049f --- /dev/null +++ b/src/Sensors/DistanceSensor.cpp @@ -0,0 +1,59 @@ +#include "DistanceSensor.h" + +// ---------------------------------------------------------------------- +// Constructor +// ---------------------------------------------------------------------- + +DistanceSensor *DistanceSensor::_instance = nullptr; + +DistanceSensor *DistanceSensor::Instance() +{ + if (DistanceSensor::_instance == nullptr) + { + DistanceSensor::_instance = new DistanceSensor(); + } + return DistanceSensor::_instance; +} + +DistanceSensor::DistanceSensor() : _logger("DISTANCE") +{ + _hcsr04 = new SensorHCSR04(HCSR04_TRIG_PIN, HCSR04_ECHO_PIN); +} + +// ---------------------------------------------------------------------- +// setup +// ---------------------------------------------------------------------- + +void DistanceSensor::setup() +{ + _hcsr04->setup(); +} + +void DistanceSensor::setTemperature(int temperature) +{ + _hcsr04->setTemperature(temperature); +} + +void DistanceSensor::setHumidity(int humidity) +{ + _hcsr04->setHumidity(humidity); +} + +// ---------------------------------------------------------------------- +// loop +// ---------------------------------------------------------------------- + +Measurement DistanceSensor::read() +{ + int d = _hcsr04->readDistance(); + if (d == -1) + { + _logger.log("s", "ERROR - Distance measurement failed"); + return Measurement::Failed(); + } + else + { + _logger.log("sis", "Distance = ", d, "mm"); + return Measurement::Value(d); + } +} \ No newline at end of file diff --git a/src/Sensors/DistanceSensor.h b/src/Sensors/DistanceSensor.h new file mode 100644 index 0000000..f59081d --- /dev/null +++ b/src/Sensors/DistanceSensor.h @@ -0,0 +1,29 @@ +#ifndef DOUGH_SENSORS_DISTANCE_H +#define DOUGH_SENSORS_DISTANCE_H + +#include "Sensors/SensorBase.h" +#include "Sensors/LowLevel/SensorHCSR04.h" +#include "UI/DoughLogger.h" +#include "Data/Measurement.h" +#include "config.h" + +/** + * This class provides access to the distance sensor in the device. + */ +class DistanceSensor : public SensorBase +{ +public: + static DistanceSensor *Instance(); + void setup(); + void setTemperature(int temperature); + void setHumidity(int humidity); + Measurement read(); + +private: + DistanceSensor(); + static DistanceSensor *_instance; + DoughLogger _logger; + SensorHCSR04 *_hcsr04; +}; + +#endif diff --git a/src/Sensors/DoughSensors.cpp b/src/Sensors/DoughSensors.cpp deleted file mode 100644 index e82e09e..0000000 --- a/src/Sensors/DoughSensors.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include "DoughSensors.h" - -// ---------------------------------------------------------------------- -// Constructor -// ---------------------------------------------------------------------- - -DoughSensors *DoughSensors::_instance = nullptr; - -DoughSensors *DoughSensors::Instance() -{ - if (DoughSensors::_instance == nullptr) - { - DoughSensors::_instance = new DoughSensors(); - } - return DoughSensors::_instance; -} - -DoughSensors::DoughSensors() : _logger("SENSORS") -{ - _dht = new DHT(DHT11_DATA_PIN, DHT11); - _hcsr04 = new HCSR04(HCSR04_TRIG_PIN, HCSR04_ECHO_PIN); -} - -// ---------------------------------------------------------------------- -// setup -// ---------------------------------------------------------------------- - -void DoughSensors::setup() -{ - _dht->begin(); - _hcsr04->begin(); -} - -// ---------------------------------------------------------------------- -// loop -// ---------------------------------------------------------------------- - -Measurement DoughSensors::readTemperature() -{ - float t = _dht->readTemperature(); - if (isnan(t)) - { - _logger.log("s", "ERROR - Temperature measurement failed"); - return Measurement::Failed(); - } - else - { - _logger.log("sis", "Temperature = ", int(t), "°C "); - _hcsr04->setTemperature(int(t)); - auto m = Measurement::Value(int(t)); - return m; - } -} - -Measurement DoughSensors::readHumidity() -{ - int h = _dht->readHumidity(); - if (h == 0) - { - _logger.log("s", "ERROR - Humidity measurement failed"); - return Measurement::Failed(); - } - else - { - _logger.log("sis", "Humidity = ", h, "%"); - _hcsr04->setHumidity(h); - return Measurement::Value(h); - } -} - -Measurement DoughSensors::readDistance() -{ - int d = _hcsr04->readDistance(); - if (d == -1) - { - _logger.log("s", "ERROR - Distance measurement failed"); - return Measurement::Failed(); - } - else - { - _logger.log("sis", "Distance = ", d, "mm"); - return Measurement::Value(d); - } -} - -// ---------------------------------------------------------------------- -// Function access to the sensor reading. -// ---------------------------------------------------------------------- - -Measurement readTemperature() -{ - return DoughSensors::Instance()->readTemperature(); -} - -Measurement readHumidity() -{ - return DoughSensors::Instance()->readHumidity(); -} - -Measurement readDistance() -{ - return DoughSensors::Instance()->readDistance(); -} \ No newline at end of file diff --git a/src/Sensors/DoughSensors.h b/src/Sensors/DoughSensors.h deleted file mode 100644 index 24639bf..0000000 --- a/src/Sensors/DoughSensors.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef DOUGH_SENSORS_H -#define DOUGH_SENSORS_H - -#include -#include "Sensors/HCSR04.h" -#include "UI/DoughLogger.h" -#include "Data/Measurement.h" -#include "config.h" - -/** - * This class provides access to the sensors in the device. - */ -class DoughSensors -{ -public: - static DoughSensors *Instance(); - void setup(); - Measurement readTemperature(); - Measurement readHumidity(); - Measurement readDistance(); - -private: - DoughSensors(); - static DoughSensors *_instance; - DoughLogger _logger; - DHT *_dht; - HCSR04 *_hcsr04; -}; - -Measurement readTemperature(); -Measurement readHumidity(); -Measurement readDistance(); - -#endif diff --git a/src/Sensors/HumiditySensor.cpp b/src/Sensors/HumiditySensor.cpp new file mode 100644 index 0000000..334d34a --- /dev/null +++ b/src/Sensors/HumiditySensor.cpp @@ -0,0 +1,47 @@ +#include "HumiditySensor.h" + +// ---------------------------------------------------------------------- +// Constructor +// ---------------------------------------------------------------------- + +HumiditySensor *HumiditySensor::_instance = nullptr; + +HumiditySensor *HumiditySensor::Instance() +{ + if (HumiditySensor::_instance == nullptr) + { + HumiditySensor::_instance = new HumiditySensor(); + } + return HumiditySensor::_instance; +} + +HumiditySensor::HumiditySensor() : _logger("HUMIDITY") {} + +// ---------------------------------------------------------------------- +// setup +// ---------------------------------------------------------------------- + +void HumiditySensor::setup() +{ + SensorDHT11::Instance()->begin(); +} + +// ---------------------------------------------------------------------- +// loop +// ---------------------------------------------------------------------- + +Measurement HumiditySensor::read() +{ + float t = SensorDHT11::Instance()->readHumidity(); + if (t == -1) + { + _logger.log("s", "ERROR - Humidity measurement failed"); + return Measurement::Failed(); + } + else + { + _logger.log("sis", "Humidity = ", int(t), "%"); + DistanceSensor::Instance()->setHumidity(int(t)); + return Measurement::Value(int(t)); + } +} \ No newline at end of file diff --git a/src/Sensors/HumiditySensor.h b/src/Sensors/HumiditySensor.h new file mode 100644 index 0000000..807525a --- /dev/null +++ b/src/Sensors/HumiditySensor.h @@ -0,0 +1,27 @@ +#ifndef DOUGH_SENSORS_HUMIDITY_H +#define DOUGH_SENSORS_HUMIDITY_H + +#include "Sensors/SensorBase.h" +#include "Sensors/LowLevel/SensorDHT11.h" +#include "UI/DoughLogger.h" +#include "Data/Measurement.h" +#include "Sensors/DistanceSensor.h" +#include "config.h" + +/** + * This class provides access to the humidity sensor in the device. + */ +class HumiditySensor : public SensorBase +{ +public: + static HumiditySensor *Instance(); + void setup(); + Measurement read(); + +private: + HumiditySensor(); + static HumiditySensor *_instance; + DoughLogger _logger; +}; + +#endif \ No newline at end of file diff --git a/src/Sensors/LowLevel/SensorDHT11.cpp b/src/Sensors/LowLevel/SensorDHT11.cpp new file mode 100644 index 0000000..cd67b5e --- /dev/null +++ b/src/Sensors/LowLevel/SensorDHT11.cpp @@ -0,0 +1,44 @@ +#include "Sensors/LowLevel/SensorDHT11.h" + +// ---------------------------------------------------------------------- +// Constructor +// ---------------------------------------------------------------------- + +SensorDHT11 *SensorDHT11::_instance = nullptr; + +SensorDHT11 *SensorDHT11::Instance() +{ + if (SensorDHT11::_instance == nullptr) + { + SensorDHT11::_instance = new SensorDHT11(); + } + return SensorDHT11::_instance; +} + +SensorDHT11::SensorDHT11() +{ + _dht = new DHT(DHT11_DATA_PIN, DHT11); +} + +// ---------------------------------------------------------------------- +// setup +// ---------------------------------------------------------------------- + +void SensorDHT11::begin() +{ + _dht->begin(); +} + +// ---------------------------------------------------------------------- +// loop +// ---------------------------------------------------------------------- + +float SensorDHT11::readHumidity() +{ + return _dht->readHumidity(); +} + +float SensorDHT11::readTemperature() +{ + return _dht->readTemperature(); +} \ No newline at end of file diff --git a/src/Sensors/LowLevel/SensorDHT11.h b/src/Sensors/LowLevel/SensorDHT11.h new file mode 100644 index 0000000..199bee1 --- /dev/null +++ b/src/Sensors/LowLevel/SensorDHT11.h @@ -0,0 +1,24 @@ +#ifndef DOUGH_SENSORS_DHT11_H +#define DOUGH_SENSORS_DHT11_H + +#include +#include "config.h" + +/** + * This class provides access to the DHT11 sensor in the device. + */ +class SensorDHT11 +{ +public: + static SensorDHT11 *Instance(); + void begin(); + float readTemperature(); + float readHumidity(); + +private: + SensorDHT11(); + static SensorDHT11 *_instance; + DHT *_dht; +}; + +#endif \ No newline at end of file diff --git a/src/Sensors/HCSR04.cpp b/src/Sensors/LowLevel/SensorHCSR04.cpp similarity index 75% rename from src/Sensors/HCSR04.cpp rename to src/Sensors/LowLevel/SensorHCSR04.cpp index 0930464..a58203b 100644 --- a/src/Sensors/HCSR04.cpp +++ b/src/Sensors/LowLevel/SensorHCSR04.cpp @@ -1,26 +1,32 @@ -#include "Sensors/HCSR04.h" +#include "Sensors/LowLevel/SensorHCSR04.h" -HCSR04::HCSR04(int triggerPin, int echoPin) +SensorHCSR04::SensorHCSR04(int triggerPin, int echoPin) : _logger("HCSR04") { _triggerPin = triggerPin; _echoPin = echoPin; _temperature = HCSR04_INIT_TEMPERATURE; _humidity = HCSR04_INIT_HUMIDITY; + #ifndef HCSR04_DEBUG + _logger.suspend(); + #endif } -void HCSR04::begin() +void SensorHCSR04::setup() { + _logger.log("sisi", "Setup output pin ", _triggerPin, " and input pin ", _echoPin); pinMode(_triggerPin, OUTPUT); pinMode(_echoPin, INPUT); } -void HCSR04::setTemperature(int temperature) +void SensorHCSR04::setTemperature(int temperature) { + _logger.log("sis", "Set temperature to ", temperature, "°C"); _temperature = temperature; } -void HCSR04::setHumidity(int humidity) +void SensorHCSR04::setHumidity(int humidity) { + _logger.log("sis", "Set humidity to ", humidity, "%"); _humidity = humidity; } @@ -29,7 +35,7 @@ void HCSR04::setHumidity(int humidity) * When reading the distance fails, -1 is returned. * Otherwise the distance in mm. */ -int HCSR04::readDistance() +int SensorHCSR04::readDistance() { _setSpeedOfSound(); _setEchoTimeout(); @@ -47,20 +53,22 @@ int HCSR04::readDistance() * and relative humidity. I derived this formula from a YouTube * video about the HC-SR04: https://youtu.be/6F1B_N6LuKw?t=1548 */ -void HCSR04::_setSpeedOfSound() +void SensorHCSR04::_setSpeedOfSound() { _speedOfSound = 0.3314 + (0.000606 * _temperature) + (0.0000124 * _humidity); + _logger.log("sfs", "Speed of sound = ", _speedOfSound, "mm/Ms"); } -void HCSR04::_setEchoTimeout() +void SensorHCSR04::_setEchoTimeout() { _echoTimeout = HCSR04_MAX_MM * 2 / _speedOfSound; + _logger.log("sfs", "Echo timeout = ", _echoTimeout, "Ms"); } -void HCSR04::_takeSamples() +void SensorHCSR04::_takeSamples() { _successfulSamples = 0; for (int i = 0; i < HCSR04_SAMPLES_TAKE; i++) @@ -81,12 +89,12 @@ void HCSR04::_takeSamples() } } -bool HCSR04::_haveEnoughSamples() +bool SensorHCSR04::_haveEnoughSamples() { return _successfulSamples >= HCSR04_SAMPLES_USE; } -int HCSR04::_takeSample() +int SensorHCSR04::_takeSample() { // Send 10μs trigger to ask sensor for a measurement. digitalWrite(HCSR04_TRIG_PIN, LOW); @@ -100,6 +108,7 @@ int HCSR04::_takeSample() // Compute the distance, based on the echo signal length. double distance = durationMicroSec / 2.0 * _speedOfSound; + _logger.log("sfs", "Sample result = ", distance, "mm"); if (distance < HCSR04_MIN_MM || distance >= HCSR04_MAX_MM) { return -1; @@ -110,7 +119,7 @@ int HCSR04::_takeSample() } } -void HCSR04::_sortSamples() +void SensorHCSR04::_sortSamples() { int holder, x, y; for (x = 0; x < _successfulSamples; x++) @@ -133,7 +142,7 @@ void HCSR04::_sortSamples() * When not enough samples were collected in the previous steps, then * NAN is returned. */ -int HCSR04::_computeAverage() +int SensorHCSR04::_computeAverage() { float sum = 0; int offset = (_successfulSamples - HCSR04_SAMPLES_USE) / 2; diff --git a/src/Sensors/HCSR04.h b/src/Sensors/LowLevel/SensorHCSR04.h similarity index 88% rename from src/Sensors/HCSR04.h rename to src/Sensors/LowLevel/SensorHCSR04.h index 0c0a5ca..42c941f 100644 --- a/src/Sensors/HCSR04.h +++ b/src/Sensors/LowLevel/SensorHCSR04.h @@ -25,22 +25,27 @@ #define HCSR04_INIT_TEMPERATURE 19.000 #define HCSR04_INIT_HUMIDITY 50.000 +// Define this one to enable HCSR04 debug logging. +#undef HCSR04_DEBUG + #include +#include "UI/DoughLogger.h" #include "config.h" /** * This class is used to get a distance reading from an HCSR04 sensor. */ -class HCSR04 +class SensorHCSR04 { public: - HCSR04(int triggerPin, int echoPin); - void begin(); + SensorHCSR04(int triggerPin, int echoPin); + void setup(); void setTemperature(int temperature); void setHumidity(int humidity); int readDistance(); private: + DoughLogger _logger; int _triggerPin; int _echoPin; int _humidity; diff --git a/src/Sensors/SensorBase.h b/src/Sensors/SensorBase.h new file mode 100644 index 0000000..5e5134a --- /dev/null +++ b/src/Sensors/SensorBase.h @@ -0,0 +1,16 @@ +#ifndef DOUGH_SENSORS_BASE_H +#define DOUGH_SENSORS_BASE_H + +#include "Data/Measurement.h" + +/** + * This interface is implemented by all sensors. + */ +class SensorBase +{ +public: + virtual void setup(); + virtual Measurement read(); +}; + +#endif \ No newline at end of file diff --git a/src/Sensors/TemperatureSensor.cpp b/src/Sensors/TemperatureSensor.cpp new file mode 100644 index 0000000..c71ec11 --- /dev/null +++ b/src/Sensors/TemperatureSensor.cpp @@ -0,0 +1,47 @@ +#include "TemperatureSensor.h" + +// ---------------------------------------------------------------------- +// Constructor +// ---------------------------------------------------------------------- + +TemperatureSensor *TemperatureSensor::_instance = nullptr; + +TemperatureSensor *TemperatureSensor::Instance() +{ + if (TemperatureSensor::_instance == nullptr) + { + TemperatureSensor::_instance = new TemperatureSensor(); + } + return TemperatureSensor::_instance; +} + +TemperatureSensor::TemperatureSensor() : _logger("TEMPERATURE") {} + +// ---------------------------------------------------------------------- +// setup +// ---------------------------------------------------------------------- + +void TemperatureSensor::setup() +{ + SensorDHT11::Instance()->begin(); +} + +// ---------------------------------------------------------------------- +// loop +// ---------------------------------------------------------------------- + +Measurement TemperatureSensor::read() +{ + float t = SensorDHT11::Instance()->readTemperature(); + if (isnan(t)) + { + _logger.log("s", "ERROR - Temperature measurement failed"); + return Measurement::Failed(); + } + else + { + _logger.log("sis", "Temperature = ", int(t), "°C"); + DistanceSensor::Instance()->setTemperature(int(t)); + return Measurement::Value(int(t)); + } +} \ No newline at end of file diff --git a/src/Sensors/TemperatureSensor.h b/src/Sensors/TemperatureSensor.h new file mode 100644 index 0000000..6d2b3e8 --- /dev/null +++ b/src/Sensors/TemperatureSensor.h @@ -0,0 +1,27 @@ +#ifndef DOUGH_SENSORS_TEMPERATURE_H +#define DOUGH_SENSORS_TEMPERATURE_H + +#include "Sensors/SensorBase.h" +#include "Sensors/LowLevel/SensorDHT11.h" +#include "UI/DoughLogger.h" +#include "Data/Measurement.h" +#include "Sensors/DistanceSensor.h" +#include "config.h" + +/** + * This class provides access to the temperature sensor in the device. + */ +class TemperatureSensor : public SensorBase +{ +public: + static TemperatureSensor *Instance(); + void setup(); + Measurement read(); + +private: + TemperatureSensor(); + static TemperatureSensor *_instance; + DoughLogger _logger; +}; + +#endif \ No newline at end of file diff --git a/src/UI/DoughLogger.cpp b/src/UI/DoughLogger.cpp index 8d546c2..75f204f 100644 --- a/src/UI/DoughLogger.cpp +++ b/src/UI/DoughLogger.cpp @@ -5,8 +5,23 @@ DoughLogger::DoughLogger(const char *section) _section = section; } +void DoughLogger::suspend() +{ + _suspended = true; +} + +void DoughLogger::resume() +{ + _suspended = false; +} + void DoughLogger::log(const char *fmt, ...) { + if (_suspended) + { + return; + } + char buf[LOGGER_PREFIX_BUFLEN]; snprintf(buf, sizeof(buf) / sizeof(buf[0]), LOGGER_PREFIX_FORMAT, _section); Serial.print(buf); diff --git a/src/UI/DoughLogger.h b/src/UI/DoughLogger.h index 7f77fa4..f8e6b99 100644 --- a/src/UI/DoughLogger.h +++ b/src/UI/DoughLogger.h @@ -2,7 +2,7 @@ #define DOUGH_LOGGER_H #define LOGGER_PREFIX_BUFLEN 16 -#define LOGGER_PREFIX_FORMAT "%10s | " +#define LOGGER_PREFIX_FORMAT "%11s | " #include #include @@ -17,9 +17,12 @@ class DoughLogger public: DoughLogger(const char *section); void log(const char *fmt, ...); + void suspend(); + void resume(); private: const char *_section; + bool _suspended = false; }; #endif diff --git a/src/main.cpp b/src/main.cpp index fb79287..34f784a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,17 +1,19 @@ #include "main.h" +// TODO: move config to a separate class +// TODO: see if I can give each sensor its own built-in loop schedule for sampling, the DoughData class might be overkill in the latest setup. // TOOD: implement the calibration logic -// TODO: use different timings for temperature, humidity and distance measurements. Temp/Humidity together takes about 500ms, which slows down stuff. -// TODO: make the measuring more loop-y, giving back control to the main loop more often for better UI responsiveness // TODO: see what more stuff can be moved to the UI code. Maybe state to UI state translation ought to be there as well -// TODO: use longer term averages for data +// TODO: make significantChange part of sensor class? DoughBoyState state = CONFIGURING; auto logger = DoughLogger("MAIN"); void setup() { - DoughSensors::Instance()->setup(); + TemperatureSensor::Instance()->setup(); + HumiditySensor::Instance()->setup(); + DistanceSensor::Instance()->setup(); DoughWiFi::Instance()->setup(); DoughMQTT::Instance()->setup(); DataController::Instance()->setup(); diff --git a/src/main.h b/src/main.h index 95cbcc7..314890c 100644 --- a/src/main.h +++ b/src/main.h @@ -2,9 +2,11 @@ #define DOUGHBOY_H #include +#include "Sensors/TemperatureSensor.h" +#include "Sensors/HumiditySensor.h" +#include "Sensors/DistanceSensor.h" #include "Network/DoughWiFi.h" #include "Network/DoughMQTT.h" -#include "Sensors/DoughSensors.h" #include "Data/DataController.h" #include "UI/DoughButton.h" #include "UI/DoughUI.h"