Skip to content

Commit

Permalink
fix for potentially missed updates (#1226)
Browse files Browse the repository at this point in the history
  • Loading branch information
john30 committed Mar 29, 2024
1 parent 033586c commit 60088b1
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 6 deletions.
11 changes: 8 additions & 3 deletions src/ebusd/knxhandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -899,23 +899,28 @@ 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) {
it = m_updatedMessages.erase(it);
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) {
Expand All @@ -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();
}
Expand Down
11 changes: 8 additions & 3 deletions src/ebusd/mqtthandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down

0 comments on commit 60088b1

Please sign in to comment.