From db0e0c67cea7242454f62b83afb0fa5bda03007a Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Mon, 18 Jul 2022 19:13:58 +0200 Subject: [PATCH] Simplify MqttPublishing * Moved all fields to an array * Moved target topic generation to separate method --- include/MqttPublishing.h | 19 +++++++++++++- src/MqttPublishing.cpp | 57 ++++++++++++++++++++++------------------ 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/include/MqttPublishing.h b/include/MqttPublishing.h index 0ac8be5..14bc14c 100644 --- a/include/MqttPublishing.h +++ b/include/MqttPublishing.h @@ -12,10 +12,27 @@ public: void loop(); private: - void publishField(String subtopic, std::shared_ptr inv, uint8_t channel, uint8_t fieldId, String topic = ""); + void publishField(std::shared_ptr inv, uint8_t channel, uint8_t fieldId); + String getTopic(std::shared_ptr inv, uint8_t channel, uint8_t fieldId); uint32_t _lastPublishStats[INV_MAX_COUNT]; uint32_t _lastPublish; + + uint8_t _publishFields[13] = { + FLD_UDC, + FLD_IDC, + FLD_PDC, + FLD_YD, + FLD_YT, + FLD_UAC, + FLD_IAC, + FLD_PAC, + FLD_F, + FLD_T, + FLD_PCT, + FLD_EFF, + FLD_IRR + }; }; extern MqttPublishingClass MqttPublishing; \ No newline at end of file diff --git a/src/MqttPublishing.cpp b/src/MqttPublishing.cpp index 7380916..768492c 100644 --- a/src/MqttPublishing.cpp +++ b/src/MqttPublishing.cpp @@ -41,23 +41,9 @@ void MqttPublishingClass::loop() // Loop all channels for (uint8_t c = 0; c <= inv->Statistics()->getChannelCount(); c++) { - publishField(subtopic, inv, c, FLD_UDC); - publishField(subtopic, inv, c, FLD_IDC); - if (c == 0) { - publishField(subtopic, inv, c, FLD_PDC, "powerdc"); - } else { - publishField(subtopic, inv, c, FLD_PDC); + for (uint8_t f = 0; f < sizeof(_publishFields); f++) { + publishField(inv, c, _publishFields[f]); } - publishField(subtopic, inv, c, FLD_YD); - publishField(subtopic, inv, c, FLD_YT); - publishField(subtopic, inv, c, FLD_UAC); - publishField(subtopic, inv, c, FLD_IAC); - publishField(subtopic, inv, c, FLD_PAC); - publishField(subtopic, inv, c, FLD_F); - publishField(subtopic, inv, c, FLD_T); - publishField(subtopic, inv, c, FLD_PCT); - publishField(subtopic, inv, c, FLD_EFF); - publishField(subtopic, inv, c, FLD_IRR); } } @@ -68,16 +54,35 @@ void MqttPublishingClass::loop() } } -void MqttPublishingClass::publishField(String subtopic, std::shared_ptr inv, uint8_t channel, uint8_t fieldId, String topic) +void MqttPublishingClass::publishField(std::shared_ptr inv, uint8_t channel, uint8_t fieldId) { - if (inv->Statistics()->hasChannelFieldValue(channel, fieldId)) { - String chanName; - if (topic == "") { - chanName = inv->Statistics()->getChannelFieldName(channel, fieldId); - } else { - chanName = topic; - } - chanName.toLowerCase(); - MqttSettings.publish(subtopic + "/" + String(channel) + "/" + chanName, String(inv->Statistics()->getChannelFieldValue(channel, fieldId))); + String topic = getTopic(inv, channel, fieldId); + if (topic == "") { + return; } + + MqttSettings.publish(topic, String(inv->Statistics()->getChannelFieldValue(channel, fieldId))); +} + +String MqttPublishingClass::getTopic(std::shared_ptr inv, uint8_t channel, uint8_t fieldId) +{ + if (!inv->Statistics()->hasChannelFieldValue(channel, fieldId)) { + return String(""); + } + + char buffer[sizeof(uint64_t) * 8 + 1]; + sprintf(buffer, "%0lx%08lx", + ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), + ((uint32_t)(inv->serial() & 0xFFFFFFFF))); + String invSerial = String(buffer); + + String chanName; + if (channel == 0 && fieldId == FLD_PDC) { + chanName = "powerdc"; + } else { + chanName = inv->Statistics()->getChannelFieldName(channel, fieldId); + chanName.toLowerCase(); + } + + return invSerial + "/" + String(channel) + "/" + chanName; } \ No newline at end of file