Adjusted mutex lock and delay for modbus
This commit is contained in:
@@ -9,10 +9,11 @@ namespace drivers
|
||||
S50140::~S50140()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
const S50140::powerinfo_t S50140::getAll()
|
||||
{
|
||||
powerinfo_t info{MAXFLOAT};
|
||||
std::lock_guard<std::mutex> lock(m_bus.getMutex());
|
||||
info.v = getV();
|
||||
info.a = getA();
|
||||
info.pAct = getPact();
|
||||
@@ -24,79 +25,71 @@ namespace drivers
|
||||
info.whPar = getWhPar();
|
||||
return info;
|
||||
}
|
||||
|
||||
|
||||
const float_t S50140::getV()
|
||||
{
|
||||
auto lock = m_bus.getLock();
|
||||
return readFloatReg(REG_V);
|
||||
}
|
||||
const float_t S50140::getA()
|
||||
{
|
||||
auto lock = m_bus.getLock();
|
||||
return readFloatReg(REG_A);
|
||||
}
|
||||
const float_t S50140::getPact()
|
||||
{
|
||||
auto lock = m_bus.getLock();
|
||||
return readFloatReg(REG_Pact);
|
||||
}
|
||||
const float_t S50140::getPapp()
|
||||
{
|
||||
auto lock = m_bus.getLock();
|
||||
return readFloatReg(REG_Papp);
|
||||
}
|
||||
const float_t S50140::getPrea()
|
||||
{
|
||||
auto lock = m_bus.getLock();
|
||||
return readFloatReg(REG_Prea);
|
||||
}
|
||||
const float_t S50140::getPf()
|
||||
{
|
||||
auto lock = m_bus.getLock();
|
||||
return readFloatReg(REG_Pf);
|
||||
}
|
||||
const float_t S50140::getF()
|
||||
{
|
||||
auto lock = m_bus.getLock();
|
||||
return readFloatReg(REG_Freq);
|
||||
}
|
||||
const float_t S50140::getWhTot()
|
||||
{
|
||||
auto lock = m_bus.getLock();
|
||||
return readFloatReg(REG_WhTot);
|
||||
}
|
||||
const float_t S50140::getWhPar()
|
||||
{
|
||||
auto lock = m_bus.getLock();
|
||||
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();
|
||||
auto lock = m_bus.getLock();
|
||||
m_bus.readHoldingRegisters(m_address, REG_Regset, 2, value);
|
||||
if (value.empty())
|
||||
return UINT8_MAX;
|
||||
return UINT8_MAX;
|
||||
return value.front() + value.back();
|
||||
}
|
||||
|
||||
const uint16_t S50140::getCounterStatus()
|
||||
{
|
||||
std::vector<uint16_t> value;
|
||||
std::lock_guard<std::mutex> lock(m_bus.getMutex());
|
||||
delayRequest();
|
||||
auto lock = m_bus.getLock();
|
||||
m_bus.readHoldingRegisters(m_address, REG_PartCount, 2, value);
|
||||
if (value.empty())
|
||||
return UINT16_MAX;
|
||||
@@ -110,11 +103,11 @@ namespace drivers
|
||||
constexpr uint16_t resetAll = 0x0A03;
|
||||
constexpr uint16_t stopAll = 0x0A02;
|
||||
constexpr uint16_t startAll = 0x0A01;
|
||||
std::lock_guard<std::mutex> lock(m_bus.getMutex());
|
||||
while (retries++ < c_maxRetries)
|
||||
{
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user