disable loop mechanism

This commit is contained in:
Wolfgang Hottgenroth
2017-01-04 17:51:27 +01:00
parent 58a1a01d42
commit c9c6349290
3 changed files with 50 additions and 4 deletions

View File

@ -145,7 +145,8 @@ MeterBusMaster::MeterBusMaster() : m_sendOctets(this), m_measureCurrent(this),
m_calibrationSupport(this),
m_cmdReadyToSend(false), m_cmdReadyFromRecv(false), m_expectResponse(false),
m_sendBufLen(0), m_recvBufLen(0), m_retransmitCount(0), m_token(0),
m_responseCallback(0), m_sampling(true), m_calibration(false), m_errorCount(0) {
m_responseCallback(0), m_sampling(true), m_calibration(false), m_errorCount(0),
m_disabled(false), m_loopIsDisabled(false), m_disableDelay(0), m_disableTime(0) {
pinMode(RX_EN_PIN, OUTPUT);
digitalWrite(RX_EN_PIN, RX_DISABLE);
Serial3.begin(2400);
@ -183,9 +184,22 @@ void MeterBusMaster::prepareResponse(bool err, uint8_t in) {
if (err) {
m_errorCount++;
uint8_t errorCode = 0;
if (m_disabled) {
errorCode = 2;
} else {
errorCode = 1;
m_disableDelay++;
}
if (! m_disabled && (m_disableDelay > DISABLE_DELAY)) {
m_disabled = true;
}
//Serial << "r1" << endl;
if (m_responseCallback != 0) {
m_responseCallback->sendError(1, m_errorCount, m_token, m_name);
m_responseCallback->sendError(errorCode, m_errorCount, m_token, m_name);
}
expectedChars = 0;
state = 0;
@ -259,6 +273,21 @@ void MeterBusMaster::hold() {
}
}
void MeterBusMaster::disableLoop() {
if (! m_loopIsDisabled) {
m_loopIsDisabled = true;
m_disableTime = millis();
}
}
void MeterBusMaster::enableLoop() {
if (m_loopIsDisabled) {
m_loopIsDisabled = false;
}
}
void MeterBusMaster::exec() {
if (! m_calibration) {
static unsigned long cmdSendTime = 0;
@ -289,6 +318,15 @@ void MeterBusMaster::exec() {
}
}
// disabling
if (m_disabled) {
disableLoop();
if (m_loopIsDisabled && ((millis() - m_disableTime) > DISABLE_TIMEOUT)) {
enableLoop();
}
}
int serialInChar = Serial3.read();
if (serialInChar != -1) {
//Serial << "Got: " << _HEX(serialInChar) << endl;