From 558711bb2b91bcd0d06d2c9ab8a30dd4ea7d3b02 Mon Sep 17 00:00:00 2001 From: hg Date: Sat, 9 May 2015 16:31:49 +0200 Subject: [PATCH] start integration of mqtt --- .cproject | 4 ++- Metro/Metro.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ Metro/Metro.h | 26 ++++++++++++++++++ MqttClient.cpp | 25 +++++++++++++++++ MqttClient.h | 10 ++++++- 5 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 Metro/Metro.cpp create mode 100644 Metro/Metro.h diff --git a/.cproject b/.cproject index de0336b..5ad54d7 100644 --- a/.cproject +++ b/.cproject @@ -27,6 +27,7 @@ + @@ -45,10 +46,11 @@ - + + diff --git a/Metro/Metro.cpp b/Metro/Metro.cpp new file mode 100644 index 0000000..3d13747 --- /dev/null +++ b/Metro/Metro.cpp @@ -0,0 +1,73 @@ + +#if defined(ARDUINO) && ARDUINO >= 100 +#include "Arduino.h" +#else +#include "WProgram.h" +#endif +#include "Metro.h" + + +Metro::Metro(unsigned long interval_millis) +{ + this->autoreset = 0; + interval(interval_millis); + reset(); +} + +// New creator so I can use either the original check behavior or benjamin.soelberg's +// suggested one (see below). +// autoreset = 0 is benjamin.soelberg's check behavior +// autoreset != 0 is the original behavior + +Metro::Metro(unsigned long interval_millis, uint8_t autoreset) +{ + this->autoreset = autoreset; // Fix by Paul Bouchier + interval(interval_millis); + reset(); +} + +void Metro::interval(unsigned long interval_millis) +{ + this->interval_millis = interval_millis; +} + +// Benjamin.soelberg's check behavior: +// When a check is true, add the interval to the internal counter. +// This should guarantee a better overall stability. + +// Original check behavior: +// When a check is true, add the interval to the current millis() counter. +// This method can add a certain offset over time. + +char Metro::check() +{ + if (millis() - this->previous_millis >= this->interval_millis) { + // As suggested by benjamin.soelberg@gmail.com, the following line + // this->previous_millis = millis(); + // was changed to + // this->previous_millis += this->interval_millis; + + // If the interval is set to 0 we revert to the original behavior + if (this->interval_millis <= 0 || this->autoreset ) { + this->previous_millis = millis(); + } else { + this->previous_millis += this->interval_millis; + } + + return 1; + } + + + + return 0; + +} + +void Metro::reset() +{ + + this->previous_millis = millis(); + +} + + diff --git a/Metro/Metro.h b/Metro/Metro.h new file mode 100644 index 0000000..cb21776 --- /dev/null +++ b/Metro/Metro.h @@ -0,0 +1,26 @@ + + +#ifndef Metro_h +#define Metro_h + +#include + +class Metro +{ + +public: + Metro(unsigned long interval_millis); + Metro(unsigned long interval_millis, uint8_t autoreset); + void interval(unsigned long interval_millis); + char check(); + void reset(); + +private: + uint8_t autoreset; + unsigned long previous_millis, interval_millis; + +}; + +#endif + + diff --git a/MqttClient.cpp b/MqttClient.cpp index 51d46c3..20dee38 100644 --- a/MqttClient.cpp +++ b/MqttClient.cpp @@ -10,6 +10,7 @@ #include #include #include +#include byte MQTT_BROKER[] = { 192, 168, 75, 1 }; @@ -26,10 +27,22 @@ void callback(char* topic, byte* payload, unsigned int length) { } +Metro secondTick = Metro(1000); + + MqttClient::MqttClient(RequestSender *meterBusMaster) : m_client(), m_meterBusMaster(meterBusMaster), m_mqttClient(MQTT_BROKER, MQTT_PORT, callback, m_client), m_disconnectState(3), m_disconnectTime(millis()) { + for (uint8_t i = 0; i < NUM_OF_DEVICES; i++) { + m_mbusDevTuple[i].address = 0; + m_mbusDevTuple[i].queryPeriod = 0; + m_mbusDevTuple[i].timer = 0; + } + + m_mbusDevTuple[0].address = 0x53; + m_mbusDevTuple[0].queryPeriod = 60; + m_mbusDevTuple[0].timer = m_mbusDevTuple[0].queryPeriod; } void MqttClient::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength) { @@ -92,6 +105,18 @@ void MqttClient::exec() { } + if (secondTick.check() == 1) { + for (uint8_t i = 0; i < NUM_OF_DEVICES; i++) { + m_mbusDevTuple[i].timer -= 1; + if (m_mbusDevTuple[i].timer == 0) { + m_mbusDevTuple[i].timer = m_mbusDevTuple[i].queryPeriod; + Serial << "Issue request for device " << m_mbusDevTuple[i].address << endl; + } + } + } + + + // m_client = m_server.available(); // if (m_client) { // uint16_t sendBufLen = 0; diff --git a/MqttClient.h b/MqttClient.h index 0a358ac..c410f67 100644 --- a/MqttClient.h +++ b/MqttClient.h @@ -11,8 +11,16 @@ #include #include #include "mBusDialog.h" +#include +#define NUM_OF_DEVICES 10 + +typedef struct { + uint8_t address; + uint16_t queryPeriod; + uint16_t timer; +} mbusDevTuple_t; class MqttClient : public ResponseCallback { public: @@ -27,7 +35,7 @@ private: PubSubClient m_mqttClient; uint8_t m_disconnectState; uint32_t m_disconnectTime; - + mbusDevTuple_t m_mbusDevTuple[NUM_OF_DEVICES]; };