added automatic detection of number of masters and enabled by default, fixed check of master address during scan

This commit is contained in:
john30
2015-03-07 12:07:29 +01:00
parent 9bf17b86c6
commit ee415e0ea3
2 changed files with 30 additions and 6 deletions
+24 -3
View File
@@ -603,8 +603,16 @@ result_t BusHandler::setState(BusState state, result_t result, bool firstRepetit
else if (state == bs_sendSyn || (result != RESULT_OK && !firstRepetition)) {
logDebug(lf_bus, "notify request: %s", getResultCode(result));
unsigned char dstAddress = m_currentRequest->m_master[1];
if (result == RESULT_OK && isValidAddress(dstAddress, false))
if (result == RESULT_OK && isValidAddress(dstAddress, false) && !m_seenAddresses[dstAddress]) {
if (m_autoLockCount) {
unsigned char master = getMasterAddress(dstAddress);
if (master != SYN && !m_seenAddresses[master]) {
m_seenAddresses[master] = true;
m_lockCount++;
}
}
m_seenAddresses[dstAddress] = true;
}
bool restart = m_currentRequest->notify(result, m_response);
if (restart) {
m_currentRequest->m_busLostRetries = 0;
@@ -664,15 +672,28 @@ void BusHandler::receiveCompleted()
{
unsigned char srcAddress = m_command[0], dstAddress = m_command[1];
bool master = isMaster(dstAddress);
if (m_autoLockCount && isMaster(srcAddress) && !m_seenAddresses[srcAddress]) {
m_lockCount++;
}
m_seenAddresses[srcAddress] = true;
if (dstAddress == BROADCAST)
logInfo(lf_update, "update BC cmd: %s", m_command.getDataStr().c_str());
else if (master) {
logInfo(lf_update, "update MM cmd: %s", m_command.getDataStr().c_str());
if (m_autoLockCount && !m_seenAddresses[dstAddress]) {
m_lockCount++;
}
m_seenAddresses[dstAddress] = true;
}
else {
logInfo(lf_update, "update MS cmd: %s / %s", m_command.getDataStr().c_str(), m_response.getDataStr().c_str());
if (m_autoLockCount) {
unsigned char master = getMasterAddress(dstAddress);
if (master != SYN && !m_seenAddresses[master]) {
m_seenAddresses[master] = true;
m_lockCount++;
}
}
m_seenAddresses[dstAddress] = true;
}
@@ -736,8 +757,8 @@ result_t BusHandler::startScan(bool full)
if (!isValidAddress(slave, false) || isMaster(slave))
continue;
if (!full && !m_seenAddresses[slave]) {
unsigned char master = (unsigned char)(slave+256-5); // check if we saw the corresponding master already
if (!isMaster(master) || !m_seenAddresses[slave])
unsigned char master = getMasterAddress(slave); // check if we saw the corresponding master already
if (master == SYN || !m_seenAddresses[master])
continue;
}
+6 -3
View File
@@ -258,7 +258,7 @@ public:
* @param failedSendRetries the number of times a failed send is repeated (other than lost arbitration).
* @param slaveRecvTimeout the maximum time in microseconds an addressed slave is expected to acknowledge.
* @param busAcquireTimeout the maximum time in microseconds for bus acquisition.
* @param lockCount the number of AUTO-SYN symbols before sending is allowed after lost arbitration.
* @param lockCount the number of AUTO-SYN symbols before sending is allowed after lost arbitration, or 0 for auto detection.
* @param pollInterval the interval in seconds in which poll messages are cycled, or 0 if disabled.
*/
BusHandler(Device* device, MessageMap* messages,
@@ -270,7 +270,7 @@ public:
m_ownMasterAddress(ownAddress), m_ownSlaveAddress((unsigned char)(ownAddress+5)), m_answer(answer),
m_busLostRetries(busLostRetries), m_failedSendRetries(failedSendRetries),
m_busAcquireTimeout(busAcquireTimeout), m_slaveRecvTimeout(slaveRecvTimeout),
m_lockCount(lockCount), m_remainLockCount(lockCount),
m_autoLockCount(lockCount==0), m_lockCount(lockCount==0 ? 1 : lockCount), m_remainLockCount(lockCount),
m_pollInterval(pollInterval), m_lastReceive(0), m_lastPoll(0),
m_currentRequest(NULL), m_nextSendPos(0),
m_symPerSec(0), m_maxSymPerSec(0),
@@ -389,8 +389,11 @@ private:
/** the maximum time in microseconds an addressed slave is expected to acknowledge. */
const unsigned int m_slaveRecvTimeout;
/** whether m_lockCount shall be detected automatically. */
const bool m_autoLockCount;
/** the number of AUTO-SYN symbols before sending is allowed after lost arbitration. */
const unsigned int m_lockCount;
unsigned int m_lockCount;
/** the remaining number of AUTO-SYN symbols before sending is allowed again. */
unsigned int m_remainLockCount;