improved bus wait with raii class that updates last access

This commit is contained in:
Emanuele Trabattoni
2025-07-25 10:57:17 +02:00
parent bb0832ad4f
commit 31c6cd9606
14 changed files with 173 additions and 127 deletions

View File

@@ -1,4 +1,7 @@
#include <S50140_Driver.h>
#include <busdelay.h>
#define BUS_DELAY drivers::BusDelay(m_lastRequest, c_minDelay, "S50140")
namespace drivers
{
@@ -63,22 +66,11 @@ namespace drivers
return readFloatReg(REG_WhPart);
}
void S50140::delayRequest()
{
auto now = millis();
if ((now - m_lastRequest) < c_minDelay)
{ // minimum m_lastRequest between requests
LOG_DEBUG("S50140 delay request", (now-m_lastRequest));
delay(now - m_lastRequest);
}
m_lastRequest = millis();
}
const uint8_t S50140::getRegset()
{
std::vector<uint16_t> value;
std::lock_guard<std::mutex> lock(m_bus.getMutex());
delayRequest();
BUS_DELAY;
m_bus.readHoldingRegisters(m_address, REG_Regset, 2, value);
if (value.empty())
return UINT8_MAX;
@@ -89,7 +81,7 @@ namespace drivers
{
std::vector<uint16_t> value;
std::lock_guard<std::mutex> lock(m_bus.getMutex());
delayRequest();
BUS_DELAY;
m_bus.readHoldingRegisters(m_address, REG_PartCount, 2, value);
if (value.empty())
return UINT16_MAX;
@@ -107,18 +99,24 @@ namespace drivers
while (retries++ < c_maxRetries)
{
bool ok(true);
delayRequest();
LOG_WARN("Powermeter Counter STOP");
ok &= m_bus.writeRegisters(m_address, REG_PartCount, {nullVal, stopAll});
delayRequest();
LOG_WARN("Powermeter Counter RESET");
ok &= m_bus.writeRegisters(m_address, REG_PartCount, {nullVal, resetAll});
delayRequest();
LOG_WARN("Powermeter Counter START");
ok &= m_bus.writeRegisters(m_address, REG_PartCount, {nullVal, startAll});
{
LOG_WARN("Powermeter Counter STOP");
BUS_DELAY;
ok &= m_bus.writeRegisters(m_address, REG_PartCount, {nullVal, stopAll});
};
{
LOG_WARN("Powermeter Counter RESET");
BUS_DELAY;
ok &= m_bus.writeRegisters(m_address, REG_PartCount, {nullVal, resetAll});
};
{
LOG_WARN("Powermeter Counter START");
BUS_DELAY;
ok &= m_bus.writeRegisters(m_address, REG_PartCount, {nullVal, startAll});
};
if (ok)
return;
LOG_ERROR("Unable to Reset Powermeter Partial Counters, device", m_address);
LOG_ERROR("Unable to Reset Powermeter Partial Counters, device", printHex(m_address).c_str());
}
return;
}
@@ -127,10 +125,9 @@ namespace drivers
{
uint8_t retries(0);
std::vector<uint16_t> values;
while (retries++ < c_maxRetries)
{
delayRequest();
BUS_DELAY;
if (m_bus.readHoldingRegisters(m_address, reg, c_dataWords, values) && values.size() == c_dataWords)
{
floatval_t fv; // potrebbe essere il contrario, vedremo
@@ -138,9 +135,11 @@ namespace drivers
fv.words.hi = values[1];
return fv.f;
}
LOG_ERROR("Unable to Read Powermeter values, device", m_address);
LOG_ERROR("Unable to Read Powermeter values, device", printHex(m_address).c_str());
}
return MAXFLOAT;
}
}
}
#undef BUS_DELAY

View File

@@ -4,6 +4,7 @@
#include <DebugLog.h>
#include <RS485_Driver.h>
#include <utils.h>
namespace drivers
{
@@ -13,7 +14,7 @@ namespace drivers
private:
const uint8_t c_maxRetries = 5;
const uint8_t c_dataWords = 2;
const uint32_t c_minDelay = 500;
const uint32_t c_minDelay = 100;
const uint16_t REG_V = 0x100C;
const uint16_t REG_A = 0x1016;
@@ -74,7 +75,6 @@ namespace drivers
void resetPartialCounters();
private:
void delayRequest();
float_t readFloatReg(const uint16_t reg);
private: