added arbitration delay measurement

This commit is contained in:
john30
2017-11-19 14:14:18 +01:00
parent 2210140e4f
commit 551d7e5417
3 changed files with 62 additions and 12 deletions
+25 -7
View File
@@ -419,7 +419,7 @@ void BusHandler::run() {
setState(bs_noSignal, result);
}
symCount = 0;
m_symLatencyMin = m_symLatencyMax = -1;
m_symbolLatencyMin = m_symbolLatencyMax = m_arbitrationDelayMin = m_arbitrationDelayMax = -1;
time(&lastTime);
lastTime += 2;
}
@@ -603,6 +603,7 @@ result_t BusHandler::handleSymbol() {
logNotice(lf_bus, "acting as AUTO-SYN generator");
}
m_remainLockCount = 0;
m_lastSynReceiveTime = recvTime;
return setState(bs_ready, result);
}
}
@@ -629,6 +630,7 @@ result_t BusHandler::handleSymbol() {
} else if (!sending && m_remainLockCount == 0 && m_command.size() == 1) {
m_remainLockCount = 1; // wait for next AUTO-SYN after SYN / address / SYN (bus locked for own priority)
}
clockGettime(&m_lastSynReceiveTime);
return setState(bs_ready, m_state == bs_skip ? RESULT_OK : RESULT_ERR_SYN);
}
@@ -686,6 +688,22 @@ result_t BusHandler::handleSymbol() {
m_currentRequest = startRequest;
// check arbitration
if (recvSymbol == sendSymbol) { // arbitration successful
// measure arbitration delay
long long latencyLong = (sentTime.tv_sec*1000000000 + sentTime.tv_nsec
- m_lastSynReceiveTime.tv_sec*1000000000 - m_lastSynReceiveTime.tv_nsec)/1000;
if (latencyLong >= 0 && latencyLong <= 10000) { // skip clock skew or out of reasonable range
int latency = (int)latencyLong;
logDebug(lf_bus, "arbitration delay %d ns", latency);
if (m_arbitrationDelayMin < 0 || (latency < m_arbitrationDelayMin || latency > m_arbitrationDelayMax)) {
if (m_arbitrationDelayMin == -1 || latency < m_arbitrationDelayMin) {
m_arbitrationDelayMin = latency;
}
if (m_arbitrationDelayMax == -1 || latency > m_arbitrationDelayMax) {
m_arbitrationDelayMax = latency;
}
logInfo(lf_bus, "arbitration delay %d - %d ns", m_arbitrationDelayMin, m_arbitrationDelayMax);
}
}
m_nextSendPos = 1;
m_repeat = false;
return setState(bs_sendCmd, RESULT_OK);
@@ -1006,16 +1024,16 @@ void BusHandler::measureLatency(struct timespec* sentTime, struct timespec* recv
}
int latency = (int)latencyLong;
logDebug(lf_bus, "send/receive symbol latency %d ms", latency);
if (m_symLatencyMin >= 0 && (latency >= m_symLatencyMin && latency <= m_symLatencyMax)) {
if (m_symbolLatencyMin >= 0 && (latency >= m_symbolLatencyMin && latency <= m_symbolLatencyMax)) {
return;
}
if (m_symLatencyMin == -1 || latency < m_symLatencyMin) {
m_symLatencyMin = latency;
if (m_symbolLatencyMin == -1 || latency < m_symbolLatencyMin) {
m_symbolLatencyMin = latency;
}
if (m_symLatencyMax == -1 || latency > m_symLatencyMax) {
m_symLatencyMax = latency;
if (m_symbolLatencyMax == -1 || latency > m_symbolLatencyMax) {
m_symbolLatencyMax = latency;
}
logInfo(lf_bus, "send/receive symbol latency %lld - %lld ms", m_symLatencyMin, m_symLatencyMax);
logInfo(lf_bus, "send/receive symbol latency %d - %d ms", m_symbolLatencyMin, m_symbolLatencyMax);
}
bool BusHandler::addSeenAddress(symbol_t address) {
+29 -5
View File
@@ -378,12 +378,15 @@ class BusHandler : public WaitThread {
m_masterCount(device->isReadOnly()?0:1), m_autoLockCount(lockCount == 0),
m_lockCount(lockCount <= 3 ? 3 : lockCount), m_remainLockCount(m_autoLockCount ? 1 : 0),
m_generateSynInterval(generateSyn ? SYN_TIMEOUT*getMasterNumber(ownAddress)+SYMBOL_DURATION : 0),
m_pollInterval(pollInterval), m_symLatencyMin(-1), m_symLatencyMax(-1), m_lastReceive(0), m_lastPoll(0),
m_pollInterval(pollInterval), m_symbolLatencyMin(-1), m_symbolLatencyMax(-1), m_arbitrationDelayMin(-1),
m_arbitrationDelayMax(-1), m_lastReceive(0), m_lastPoll(0),
m_currentRequest(NULL), m_currentAnswering(false), m_runningScans(0), m_nextSendPos(0),
m_symPerSec(0), m_maxSymPerSec(0),
m_state(bs_noSignal), m_escape(0), m_crc(0), m_crcValid(false), m_repeat(false),
m_grabMessages(true) {
memset(m_seenAddresses, 0, sizeof(m_seenAddresses));
m_lastSynReceiveTime.tv_sec = 0;
m_lastSynReceiveTime.tv_nsec = 0;
}
/**
@@ -548,13 +551,25 @@ class BusHandler : public WaitThread {
* Return the minimal measured latency between send and receive of a symbol.
* @return the minimal measured latency between send and receive of a symbol in milliseconds, -1 if not yet known.
*/
int getMinSymbolLatency() const { return m_symLatencyMin; }
int getMinSymbolLatency() const { return m_symbolLatencyMin; }
/**
* Return the maximal measured latency between send and receive of a symbol.
* @return the maximal measured latency between send and receive of a symbol in milliseconds, -1 if not yet known.
*/
int getMaxSymbolLatency() const { return m_symLatencyMax; }
int getMaxSymbolLatency() const { return m_symbolLatencyMax; }
/**
* Return the minimal measured delay between received SYN and sent own master address in nanoseconds.
* @return the minimal measured delay between received SYN and sent own master address in nanoseconds, -1 if not yet known.
*/
int getMinArbitrationDelay() const { return m_arbitrationDelayMin; }
/**
* Return the maximal measured delay between received SYN and sent own master address in nanoseconds.
* @return the maximal measured delay between received SYN and sent own master address in nanoseconds, -1 if not yet known.
*/
int getMaxArbitrationDelay() const { return m_arbitrationDelayMax; }
/**
* Return the number of masters already seen.
@@ -678,10 +693,19 @@ class BusHandler : public WaitThread {
const unsigned int m_pollInterval;
/** the minimal measured latency between send and receive of a symbol in milliseconds, -1 if not yet known. */
int m_symLatencyMin;
int m_symbolLatencyMin;
/** the maximal measured latency between send and receive of a symbol in milliseconds, -1 if not yet known. */
int m_symLatencyMax;
int m_symbolLatencyMax;
/** the minimal measured delay between received SYN and sent own master address in nanoseconds, -1 if not yet known. */
int m_arbitrationDelayMin;
/** the maximal measured delay between received SYN and sent own master address in nanoseconds, -1 if not yet known. */
int m_arbitrationDelayMax;
/** the time of the last received SYN symbol, or 0 for never. */
struct timespec m_lastSynReceiveTime;
/** the time of the last received symbol, or 0 for never. */
time_t m_lastReceive;
Executable → Regular
+8
View File
@@ -1569,6 +1569,10 @@ result_t MainLoop::executeInfo(const vector<string>& args, const string& user, o
*ostream << "signal: acquired\n"
<< "symbol rate: " << m_busHandler->getSymbolRate() << "\n"
<< "max symbol rate: " << m_busHandler->getMaxSymbolRate() << "\n";
if (m_busHandler->getMinArbitrationDelay() >= 0) {
*ostream << "min arbitration nanos: " << m_busHandler->getMinArbitrationDelay() << "\n"
<< "max arbitration nanos: " << m_busHandler->getMaxArbitrationDelay() << "\n";
}
if (m_busHandler->getMinSymbolLatency() >= 0) {
*ostream << "min symbol latency: " << m_busHandler->getMinSymbolLatency() << "\n"
<< "max symbol latency: " << m_busHandler->getMaxSymbolLatency() << "\n";
@@ -1791,6 +1795,10 @@ result_t MainLoop::executeGet(const vector<string>& args, bool* connected, ostri
if (m_busHandler->hasSignal()) {
*ostream << ",\n \"symbolrate\": " << m_busHandler->getSymbolRate()
<< ",\n \"maxsymbolrate\": " << m_busHandler->getMaxSymbolRate();
if (m_busHandler->getMinArbitrationDelay() >= 0) {
*ostream << ",\n \"minarbitrationnanos\": " << m_busHandler->getMinArbitrationDelay()
<< ",\n \"minarbitrationnanos\": " << m_busHandler->getMaxArbitrationDelay();
}
if (m_busHandler->getMinSymbolLatency() >= 0) {
*ostream << ",\n \"minsymbollatency\": " << m_busHandler->getMinSymbolLatency()
<< ",\n \"maxsymbollatency\": " << m_busHandler->getMaxSymbolLatency();