fix for potentially missed updates (#1226)

This commit is contained in:
John
2024-03-29 08:55:07 +01:00
parent 033586c63c
commit 60088b143e
2 changed files with 16 additions and 6 deletions
+8 -3
View File
@@ -899,6 +899,7 @@ void KnxHandler::run() {
if (!m_updatedMessages.empty()) {
m_messages->lock();
if (m_con->isConnected()) {
time_t maxUpdates = 0;
for (auto it = m_updatedMessages.begin(); it != m_updatedMessages.end(); ) {
const vector<Message*>* messages = m_messages->getByKey(it->first);
if (!messages) {
@@ -906,16 +907,20 @@ void KnxHandler::run() {
continue;
}
for (const auto& message : *messages) {
if (message->getLastChangeTime() <= 0) {
time_t changeTime = message->getLastChangeTime();
if (changeTime <= 0) {
continue;
}
if (changeTime > lastUpdates && changeTime > maxUpdates) {
maxUpdates = changeTime;
}
const auto mit = m_subscribedMessages.find(message->getKey());
if (mit == m_subscribedMessages.cend()) {
continue;
}
if (!(message->getDataHandlerState()&2)) {
message->setDataHandlerState(2, true); // first update still needed
} else if (message->getLastChangeTime() <= lastUpdates) {
} else if (changeTime <= lastUpdates) {
continue;
}
for (auto destFlags : mit->second) {
@@ -936,7 +941,7 @@ void KnxHandler::run() {
}
it = m_updatedMessages.erase(it);
}
time(&lastUpdates);
lastUpdates = maxUpdates == 0 || lastUpdates > maxUpdates ? now : maxUpdates + 1;
} else {
m_updatedMessages.clear();
}
+8 -3
View File
@@ -1068,22 +1068,27 @@ void MqttHandler::run() {
if (!m_updatedMessages.empty()) {
m_messages->lock();
if (m_connected) {
time_t maxUpdates = 0;
for (auto it = m_updatedMessages.begin(); it != m_updatedMessages.end(); ) {
const vector<Message*>* messages = m_messages->getByKey(it->first);
if (messages) {
for (const auto& message : *messages) {
if (message->getLastChangeTime() > 0 && message->isAvailable()
&& (!g_onlyChanges || message->getLastChangeTime() > lastUpdates)) {
time_t changeTime = message->getLastChangeTime();
if (changeTime > 0 && message->isAvailable()
&& (!g_onlyChanges || changeTime > lastUpdates)) {
updates.str("");
updates.clear();
updates << dec;
publishMessage(message, &updates);
}
if (changeTime > lastUpdates && changeTime > maxUpdates) {
maxUpdates = changeTime;
}
}
}
it = m_updatedMessages.erase(it);
}
time(&lastUpdates);
lastUpdates = maxUpdates == 0 || lastUpdates > maxUpdates ? now : maxUpdates + 1;
} else {
m_updatedMessages.clear();
}