corrected address conflict detection, log entry for starting bus handling wiht address and answer info

This commit is contained in:
john30
2017-04-17 20:56:13 +02:00
parent b77e0d092c
commit f252b079b1
2 changed files with 25 additions and 7 deletions
+19 -5
View File
@@ -382,6 +382,8 @@ void BusHandler::run() {
time_t now, lastTime; time_t now, lastTime;
time(&lastTime); time(&lastTime);
lastTime += 2; lastTime += 2;
logNotice(lf_bus, "bus started with own address %2.2x/%2.2x%s", m_ownMasterAddress, m_ownSlaveAddress,
m_answer?" in answer mode":"");
do { do {
if (m_device->isValid() && !m_reconnect) { if (m_device->isValid() && !m_reconnect) {
result_t result = handleSymbol(); result_t result = handleSymbol();
@@ -705,6 +707,7 @@ result_t BusHandler::handleSymbol() {
if (dstAddress == m_ownMasterAddress || dstAddress == m_ownSlaveAddress) { if (dstAddress == m_ownMasterAddress || dstAddress == m_ownSlaveAddress) {
if (m_crcValid) { if (m_crcValid) {
addSeenAddress(m_command[0]); addSeenAddress(m_command[0]);
m_currentAnswering = true;
return setState(bs_sendCmdAck, RESULT_OK); return setState(bs_sendCmdAck, RESULT_OK);
} }
return setState(bs_sendCmdAck, RESULT_ERR_CRC); return setState(bs_sendCmdAck, RESULT_ERR_CRC);
@@ -782,12 +785,18 @@ result_t BusHandler::handleSymbol() {
if (!m_crcValid) { if (!m_crcValid) {
return setState(bs_skip, RESULT_ERR_ACK); return setState(bs_skip, RESULT_ERR_ACK);
} }
receiveCompleted(); if (!m_currentAnswering) {
receiveCompleted();
}
return setState(bs_skip, RESULT_OK); return setState(bs_skip, RESULT_OK);
} }
if (recvSymbol == NAK) { if (recvSymbol == NAK) {
if (!m_repeat) { if (!m_repeat) {
m_repeat = true; m_repeat = true;
if (m_currentAnswering) {
m_nextSendPos = 0;
return setState(bs_sendRes, RESULT_ERR_NAK, true);
}
m_response.clear(); m_response.clear();
return setState(bs_recvRes, RESULT_ERR_NAK, true); return setState(bs_recvRes, RESULT_ERR_NAK, true);
} }
@@ -984,16 +993,18 @@ result_t BusHandler::setState(BusState state, result_t result, bool firstRepetit
m_crcValid = false; m_crcValid = false;
m_response.clear(); m_response.clear();
m_nextSendPos = 0; m_nextSendPos = 0;
m_currentAnswering = false;
} else if (state == bs_recvRes || state == bs_sendRes) { } else if (state == bs_recvRes || state == bs_sendRes) {
m_crc = 0; m_crc = 0;
} }
return result; return result;
} }
void BusHandler::addSeenAddress(symbol_t address) { bool BusHandler::addSeenAddress(symbol_t address) {
if (!isValidAddress(address, false)) { if (!isValidAddress(address, false)) {
return; return false;
} }
bool hadConflict = m_addressConflict;
if (!isMaster(address)) { if (!isMaster(address)) {
if (!m_device->isReadOnly() && address == m_ownSlaveAddress) { if (!m_device->isReadOnly() && address == m_ownSlaveAddress) {
if (!m_addressConflict) { if (!m_addressConflict) {
@@ -1004,7 +1015,7 @@ void BusHandler::addSeenAddress(symbol_t address) {
m_seenAddresses[address] |= SEEN; m_seenAddresses[address] |= SEEN;
address = getMasterAddress(address); address = getMasterAddress(address);
if (address == SYN) { if (address == SYN) {
return; return m_addressConflict && !hadConflict;
} }
} }
if ((m_seenAddresses[address]&SEEN) == 0) { if ((m_seenAddresses[address]&SEEN) == 0) {
@@ -1022,6 +1033,7 @@ void BusHandler::addSeenAddress(symbol_t address) {
} }
m_seenAddresses[address] |= SEEN; m_seenAddresses[address] |= SEEN;
} }
return m_addressConflict && !hadConflict;
} }
void BusHandler::receiveCompleted() { void BusHandler::receiveCompleted() {
@@ -1033,7 +1045,9 @@ void BusHandler::receiveCompleted() {
if (!m_currentRequest) { if (!m_currentRequest) {
addSeenAddress(srcAddress); addSeenAddress(srcAddress);
} }
addSeenAddress(dstAddress); if (!m_currentAnswering) {
addSeenAddress(dstAddress);
}
bool master = isMaster(dstAddress); bool master = isMaster(dstAddress);
if (dstAddress == BROADCAST) { if (dstAddress == BROADCAST) {
+6 -2
View File
@@ -379,7 +379,7 @@ class BusHandler : public WaitThread {
m_lockCount(lockCount <= 3 ? 3 : lockCount), m_remainLockCount(m_autoLockCount ? 1 : 0), m_lockCount(lockCount <= 3 ? 3 : lockCount), m_remainLockCount(m_autoLockCount ? 1 : 0),
m_generateSynInterval(generateSyn ? SYN_TIMEOUT*getMasterNumber(ownAddress)+SYMBOL_DURATION : 0), m_generateSynInterval(generateSyn ? SYN_TIMEOUT*getMasterNumber(ownAddress)+SYMBOL_DURATION : 0),
m_pollInterval(pollInterval), m_lastReceive(0), m_lastPoll(0), m_pollInterval(pollInterval), m_lastReceive(0), m_lastPoll(0),
m_currentRequest(NULL), m_runningScans(0), m_nextSendPos(0), m_currentRequest(NULL), m_currentAnswering(false), m_runningScans(0), m_nextSendPos(0),
m_symPerSec(0), m_maxSymPerSec(0), m_symPerSec(0), m_maxSymPerSec(0),
m_state(bs_noSignal), m_escape(0), m_crc(0), m_crcValid(false), m_repeat(false), m_state(bs_noSignal), m_escape(0), m_crc(0), m_crcValid(false), m_repeat(false),
m_grabMessages(true) { m_grabMessages(true) {
@@ -572,8 +572,9 @@ class BusHandler : public WaitThread {
/** /**
* Add a seen bus address. * Add a seen bus address.
* @param address the seen bus address. * @param address the seen bus address.
* @return true if a conflict with the own addresses was detected, false otherwise.
*/ */
void addSeenAddress(symbol_t address); bool addSeenAddress(symbol_t address);
/** /**
* Called when a passive reception was successfully completed. * Called when a passive reception was successfully completed.
@@ -657,6 +658,9 @@ class BusHandler : public WaitThread {
/** the currently handled BusRequest, or NULL. */ /** the currently handled BusRequest, or NULL. */
BusRequest* m_currentRequest; BusRequest* m_currentRequest;
/** whether currently answering a request from another participant. */
bool m_currentAnswering;
/** the queue of @a BusRequests that are already finished. */ /** the queue of @a BusRequests that are already finished. */
Queue<BusRequest*> m_finishedRequests; Queue<BusRequest*> m_finishedRequests;