Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 33 additions & 8 deletions more_modbus/ModbusReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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}
{
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -502,4 +504,27 @@ void ModbusReader::triggerDeviceStatusUpdate(const std::shared_ptr<ModbusDevice>

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
6 changes: 5 additions & 1 deletion more_modbus/ModbusReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ class ModbusReader : public std::enable_shared_from_this<ModbusReader>
* @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.
Expand Down Expand Up @@ -129,6 +130,8 @@ class ModbusReader : public std::enable_shared_from_this<ModbusReader>

void triggerDeviceStatusUpdate(const std::shared_ptr<ModbusDevice>& device, bool status);

std::chrono::milliseconds getReconnectWaitTime();

std::function<void(std::map<int16_t, bool>)> m_onIterationStatuses;

// Modbus client and device data
Expand Down Expand Up @@ -156,6 +159,7 @@ class ModbusReader : public std::enable_shared_from_this<ModbusReader>
std::map<int16_t, std::unique_ptr<std::thread>> m_threads;
std::map<int16_t, std::unique_ptr<std::thread>> m_rewriteThreads;
std::chrono::milliseconds m_readPeriod;
bool m_increasingReconnectPeriod;
};
} // namespace wolkabout::more_modbus

Expand Down
Loading