improved bus wait with raii class that updates last access
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user