From c283cc28f636118c24ec4effac07be9d38ce9e53 Mon Sep 17 00:00:00 2001 From: milanzlicic Date: Mon, 16 Jun 2025 11:30:11 +0200 Subject: [PATCH] Default wait of 2 seconds for reconnect if not increasing --- more_modbus/ModbusReader.cpp | 41 +++++++++++++++++++++++++++++------- more_modbus/ModbusReader.h | 6 +++++- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/more_modbus/ModbusReader.cpp b/more_modbus/ModbusReader.cpp index 00ae56d..353da91 100644 --- a/more_modbus/ModbusReader.cpp +++ b/more_modbus/ModbusReader.cpp @@ -28,10 +28,17 @@ using namespace wolkabout::legacy; +namespace +{ +auto DEFAULT_RECONNECT_TIMEOUT = std::chrono::seconds{2}; +} + namespace wolkabout::more_modbus { -ModbusReader::ModbusReader(ModbusClient& modbusClient, const std::chrono::milliseconds& readPeriod) -: m_modbusClient(modbusClient), m_devices(), m_readerShouldRun(false), m_threads(), m_readPeriod(readPeriod) +ModbusReader::ModbusReader(ModbusClient& modbusClient, const std::chrono::milliseconds& readPeriod, + bool increasingReconnectPeriod) +: m_modbusClient{modbusClient}, m_readerShouldRun{false}, m_readPeriod{readPeriod}, +m_increasingReconnectPeriod{increasingReconnectPeriod} { } @@ -259,12 +266,7 @@ void ModbusReader::run() LOG(INFO) << "ModbusReader: Attempting to connect"; while (!m_modbusClient.connect()) { - // Timing logic, increase the time after which we attempt to reconnect. - std::this_thread::sleep_for(std::chrono::seconds(m_timeoutDurations[m_timeoutIterator])); - if ((uint32_t)m_timeoutIterator < m_timeoutDurations.size() - 1) - { - m_timeoutIterator++; - } + std::this_thread::sleep_for(getReconnectWaitTime()); } m_shouldReconnect = false; m_timeoutIterator = 0; @@ -502,4 +504,27 @@ void ModbusReader::triggerDeviceStatusUpdate(const std::shared_ptr m_deviceStatusReported[device->getSlaveAddress()] = true; } + +std::chrono::milliseconds ModbusReader::getReconnectWaitTime() +{ + if (!m_increasingReconnectPeriod) + { + return DEFAULT_RECONNECT_TIMEOUT; + } + + // Timing logic, increase the time after which we attempt to reconnect. + if (m_timeoutIterator >= m_timeoutDurations.size()) + { + m_timeoutIterator = m_timeoutDurations.size() - 1; + } + + const auto duration = m_timeoutDurations[m_timeoutIterator]; + + if (m_timeoutIterator < m_timeoutDurations.size() - 1) + { + ++m_timeoutIterator; + } + + return std::chrono::seconds{duration}; +} } // namespace wolkabout::more_modbus diff --git a/more_modbus/ModbusReader.h b/more_modbus/ModbusReader.h index 4012cf2..06002ca 100644 --- a/more_modbus/ModbusReader.h +++ b/more_modbus/ModbusReader.h @@ -44,7 +44,8 @@ class ModbusReader : public std::enable_shared_from_this * @param modbusClient one of implementations of the abstract class * @param readPeriod time period for cycling reads */ - ModbusReader(ModbusClient& modbusClient, const std::chrono::milliseconds& readPeriod); + ModbusReader(ModbusClient& modbusClient, const std::chrono::milliseconds& readPeriod, + bool increasingReconnectPeriod = true); /** * Default virtual destructor. @@ -129,6 +130,8 @@ class ModbusReader : public std::enable_shared_from_this void triggerDeviceStatusUpdate(const std::shared_ptr& device, bool status); + std::chrono::milliseconds getReconnectWaitTime(); + std::function)> m_onIterationStatuses; // Modbus client and device data @@ -156,6 +159,7 @@ class ModbusReader : public std::enable_shared_from_this std::map> m_threads; std::map> m_rewriteThreads; std::chrono::milliseconds m_readPeriod; + bool m_increasingReconnectPeriod; }; } // namespace wolkabout::more_modbus