diff --git a/lib/RS485/RS485_Driver.cpp b/lib/RS485/RS485_Driver.cpp index a53bfd2..36793c9 100644 --- a/lib/RS485/RS485_Driver.cpp +++ b/lib/RS485/RS485_Driver.cpp @@ -71,7 +71,6 @@ namespace drivers const bool MODBUS::readCoils(const uint8_t device, const uint16_t reg, const uint16_t num, std::vector &coils) { constexpr uint8_t func = 0x01; - std::lock_guard lock(m_mutex); LOG_DEBUG("Read coils: dev[", device, "], reg[", reg, "], num[", num, "]"); return readBinary(device, func, reg, num, coils); } @@ -80,7 +79,6 @@ namespace drivers const bool MODBUS::readInputs(const uint8_t device, const uint16_t reg, const uint8_t num, std::vector &inputs) { constexpr uint8_t func = 0x02; - std::lock_guard lock(m_mutex); LOG_DEBUG("Read multi inputs: dev[", device, "], reg[", reg, "], num[", num, "]"); return readBinary(device, func, reg, num, inputs); } @@ -89,7 +87,6 @@ namespace drivers const bool MODBUS::readHoldingRegisters(const uint8_t device, const uint16_t reg, const uint8_t num, std::vector &values) { constexpr uint8_t func = 0x03; - std::lock_guard lock(m_mutex); LOG_DEBUG("Read multi holding registers: dev[", device, "], reg[", reg, "], num[", num, "]"); return readInteger(device, func, reg, num, values); } @@ -98,7 +95,6 @@ namespace drivers const bool MODBUS::readInputRegisters(const uint8_t device, const uint16_t reg, const uint8_t num, std::vector &values) { constexpr uint8_t func = 0x04; - std::lock_guard lock(m_mutex); LOG_DEBUG("Read multi input registers: dev[", device, "], reg[", reg, "], num[", num, "]"); return readInteger(device, func, reg, num, values); } @@ -107,7 +103,6 @@ namespace drivers const bool MODBUS::writeCoil(const uint8_t device, const uint16_t coil, const bool value) { constexpr uint8_t func = 0x05; - std::lock_guard lock(m_mutex); LOG_DEBUG("Write single coil: dev[", device, "], coil[", coil, "], value[", value ? "true" : "false", "]"); return writeBinary(device, func, coil, {value}); } @@ -116,7 +111,6 @@ namespace drivers const bool MODBUS::writeRegister(const uint8_t device, const uint16_t reg, const uint16_t value) { constexpr uint8_t func = 0x06; - std::lock_guard lock(m_mutex); LOG_DEBUG("Write single register: dev[", device, "], reg[", reg, "], value[", value, "]"); return writeInteger(device, func, reg, {value}, false); } @@ -125,7 +119,6 @@ namespace drivers const bool MODBUS::writeCoils(const uint8_t device, const uint16_t coils, const std::vector &values) { constexpr uint8_t func = 0x0F; - std::lock_guard lock(m_mutex); LOG_DEBUG("Write multi coils: dev[", device, "], start[", coils, "], num[", values.size(), "]"); return writeBinary(device, func, coils, values); } @@ -134,7 +127,6 @@ namespace drivers const bool MODBUS::writeRegisters(const uint8_t device, const uint16_t reg, const std::vector &values) { constexpr uint8_t func = 0x10; - std::lock_guard lock(m_mutex); LOG_DEBUG("Write multi registers: dev[", device, "], start[", reg, "], num[", values.size(), "]"); return writeInteger(device, func, reg, values, true); } diff --git a/lib/RS485/RS485_Driver.h b/lib/RS485/RS485_Driver.h index d3d968e..4e96fbe 100644 --- a/lib/RS485/RS485_Driver.h +++ b/lib/RS485/RS485_Driver.h @@ -60,6 +60,10 @@ namespace drivers MODBUS(const MODBUS &) = delete; // remove copy constructors MODBUS &operator=(const MODBUS &) = delete; + // Get transaction lock + std::unique_lock getLock() { + return std::unique_lock(m_mutex); + } // Func 0x01 const bool readCoils(const uint8_t device, const uint16_t reg, const uint16_t num, std::vector &coils); diff --git a/lib/SENECA/S50140_Driver.cpp b/lib/SENECA/S50140_Driver.cpp index 0531275..1647748 100644 --- a/lib/SENECA/S50140_Driver.cpp +++ b/lib/SENECA/S50140_Driver.cpp @@ -76,6 +76,7 @@ namespace drivers { std::vector value; delayRequest(); + auto lock = m_bus.getLock(); m_bus.readHoldingRegisters(m_address, REG_Regset, 2, value); if (value.empty()) return UINT8_MAX; @@ -86,6 +87,7 @@ namespace drivers { std::vector value; delayRequest(); + auto lock = m_bus.getLock(); m_bus.readHoldingRegisters(m_address, REG_PartCount, 2, value); if (value.empty()) return UINT16_MAX; @@ -103,6 +105,7 @@ namespace drivers { bool ok(true); delayRequest(); + auto lock = m_bus.getLock(); LOG_WARN("Powermeter Counter STOP"); ok &= m_bus.writeRegisters(m_address, REG_PartCount, {nullVal, stopAll}); delayRequest(); @@ -126,6 +129,7 @@ namespace drivers while (retries++ < maxRetries) { delayRequest(); + auto lock = m_bus.getLock(); if (m_bus.readHoldingRegisters(m_address, reg, dataWords, values) && values.size() == dataWords) { floatval_t fv; // potrebbe essere il contrario, vedremo diff --git a/lib/TEMP/R4DCB08_Driver.cpp b/lib/TEMP/R4DCB08_Driver.cpp index 92d2ea0..1dc2b5e 100644 --- a/lib/TEMP/R4DCB08_Driver.cpp +++ b/lib/TEMP/R4DCB08_Driver.cpp @@ -22,6 +22,7 @@ namespace drivers } while (retries++ < maxRetries) { + auto lock = m_bus.getLock(); if (m_bus.readHoldingRegisters(m_address, REG_TEMP + ch, 1, rawT) && !rawT.empty()) { return rawT.front() / 10.0f; @@ -40,6 +41,7 @@ namespace drivers std::vector out; while (retries++ < maxRetries) { + auto lock = m_bus.getLock(); if (m_bus.readHoldingRegisters(m_address, REG_TEMP, getNum(), rawT) && !rawT.empty()) { out.reserve(rawT.size()); @@ -67,6 +69,7 @@ namespace drivers { // convert to decimal degreees to register value while (retries++ < maxRetries) { + auto lock = m_bus.getLock(); if (m_bus.writeRegister(m_address, REG_TEMPCORR + channel, v*10)) { channel++; @@ -88,6 +91,7 @@ namespace drivers while (retries++ < maxRetries) { + auto lock = m_bus.getLock(); if (m_bus.readHoldingRegisters(m_address, REG_TEMPCORR, getNum(), rawV)) { out.reserve(rawV.size()); @@ -114,6 +118,7 @@ namespace drivers std::vector rawT; while (retries++ < maxRetries) { + auto lock = m_bus.getLock(); if (m_bus.readHoldingRegisters(m_address, REG_TEMP, T_MAX, rawT)) { for (auto v : rawT) diff --git a/src/remoteIO.cpp b/src/remoteIO.cpp index 8da6d71..8f11e58 100644 --- a/src/remoteIO.cpp +++ b/src/remoteIO.cpp @@ -4,6 +4,7 @@ remoteIO::remoteIO(const uint8_t address, drivers::MODBUS &bus) : m_address(addr { LOG_INFO("Initializing relay module"); std::vector response; + auto lock = m_bus.getLock(); if (!m_bus.readHoldingRegisters(m_address, REG_VERSION, 1, response)) { LOG_ERROR("Unable to inizialize relay module"); @@ -21,6 +22,7 @@ remoteIO::~remoteIO() const bool remoteIO::setOut(const channel_t ch, const bool value) { + auto lock = m_bus.getLock(); if (!m_initialized) return false; LOG_DEBUG("Write Channel", ch, "->", value ? "True" : "False"); @@ -29,6 +31,7 @@ const bool remoteIO::setOut(const channel_t ch, const bool value) const bool remoteIO::toggleOut(const channel_t ch) { + auto lock = m_bus.getLock(); if (!m_initialized) return false; std::vector value; @@ -40,6 +43,7 @@ const bool remoteIO::toggleOut(const channel_t ch) const bool remoteIO::setOutPort(const std::vector values) { + auto lock = m_bus.getLock(); if (!m_initialized) return false; LOG_DEBUG("Write Port", CH_MAX); @@ -48,6 +52,7 @@ const bool remoteIO::setOutPort(const std::vector values) const bool remoteIO::getOut(const channel_t ch, bool &value) { + auto lock = m_bus.getLock(); if (!m_initialized) return false; std::vector values; @@ -60,6 +65,7 @@ const bool remoteIO::getOut(const channel_t ch, bool &value) const bool remoteIO::getOutPort(std::vector &values) { + auto lock = m_bus.getLock(); if (!m_initialized) return false; LOG_DEBUG("Read Port", CH_MAX); @@ -68,6 +74,7 @@ const bool remoteIO::getOutPort(std::vector &values) const bool remoteIO::getIn(const channel_t input, bool &value) { + auto lock = m_bus.getLock(); if (!m_initialized) return false; std::vector values; @@ -80,6 +87,7 @@ const bool remoteIO::getIn(const channel_t input, bool &value) const bool remoteIO::getInPort(std::vector &values) { + auto lock = m_bus.getLock(); if (!m_initialized) return false; LOG_DEBUG("Read Inputs", CH_MAX);