completed support for enhanced proto
This commit is contained in:
+45
-25
@@ -454,11 +454,13 @@ result_t BusHandler::handleSymbol() {
|
|||||||
}
|
}
|
||||||
if (startRequest != nullptr) { // initiate arbitration
|
if (startRequest != nullptr) { // initiate arbitration
|
||||||
result_t ret = m_device->startArbitration(startRequest->m_master[0]);
|
result_t ret = m_device->startArbitration(startRequest->m_master[0]);
|
||||||
if (ret != RESULT_OK) {
|
if (ret == RESULT_OK) {
|
||||||
|
logDebug(lf_bus, "arbitration start with %2.2x", startRequest->m_master[0]);
|
||||||
|
} else {
|
||||||
logError(lf_bus, "arbitration start: %s", getResultCode(ret));
|
logError(lf_bus, "arbitration start: %s", getResultCode(ret));
|
||||||
|
m_nextRequests.remove(startRequest);
|
||||||
m_currentRequest = startRequest;
|
m_currentRequest = startRequest;
|
||||||
setState(bs_ready, ret); // force the failed request to be notified
|
setState(bs_ready, ret); // force the failed request to be notified
|
||||||
startRequest = nullptr;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -476,7 +478,7 @@ result_t BusHandler::handleSymbol() {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case bs_recvCmdAck:
|
case bs_recvCmdAck:
|
||||||
timeout = m_slaveRecvTimeout+(m_currentRequest ? m_transferLatency:0);
|
timeout = m_slaveRecvTimeout+(m_currentRequest ? m_transferLatency : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case bs_recvRes:
|
case bs_recvRes:
|
||||||
@@ -603,32 +605,46 @@ result_t BusHandler::handleSymbol() {
|
|||||||
m_remainLockCount = 0;
|
m_remainLockCount = 0;
|
||||||
m_lastSynReceiveTime = recvTime;
|
m_lastSynReceiveTime = recvTime;
|
||||||
sentAutoSyn = true;
|
sentAutoSyn = true;
|
||||||
|
setState(bs_ready, RESULT_OK);
|
||||||
}
|
}
|
||||||
if (arbitrationState == as_lost) {
|
switch (arbitrationState) {
|
||||||
if (m_currentRequest == nullptr) {
|
case as_lost:
|
||||||
BusRequest *startRequest = m_nextRequests.peek();
|
logDebug(lf_bus, "arbitration lost");
|
||||||
if (startRequest != nullptr && m_nextRequests.remove(startRequest)) {
|
if (m_currentRequest == nullptr) {
|
||||||
m_currentRequest = startRequest; // force the failed request to be notified
|
BusRequest *startRequest = m_nextRequests.peek();
|
||||||
|
if (startRequest != nullptr && m_nextRequests.remove(startRequest)) {
|
||||||
|
m_currentRequest = startRequest; // force the failed request to be notified
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
setState(m_state, RESULT_ERR_BUS_LOST);
|
||||||
setState(m_state, RESULT_ERR_BUS_LOST);
|
break;
|
||||||
} else if (arbitrationState == as_won) { // implies RESULT_OK
|
case as_won: // implies RESULT_OK
|
||||||
if (m_currentRequest == nullptr) {
|
if (m_currentRequest != nullptr) {
|
||||||
m_currentRequest = m_nextRequests.peek();
|
logNotice(lf_bus, "arbitration won while handling another request");
|
||||||
}
|
setState(bs_ready, RESULT_OK); // force the current request to be notified
|
||||||
if (m_currentRequest == nullptr) {
|
} else {
|
||||||
logDebug(lf_bus, "arbitration won without request");
|
BusRequest *startRequest = m_nextRequests.peek();
|
||||||
} else if (m_state == bs_ready) {
|
if (m_state != bs_ready || startRequest == nullptr || !m_nextRequests.remove(startRequest)) {
|
||||||
if (!m_nextRequests.remove(m_currentRequest)) {
|
logNotice(lf_bus, "arbitration won in invalid state %s", getStateCode(m_state));
|
||||||
// request already removed (e.g. due to timeout)
|
setState(bs_ready, RESULT_ERR_TIMEOUT);
|
||||||
return setState(bs_skip, RESULT_ERR_TIMEOUT);
|
} else {
|
||||||
|
logDebug(lf_bus, "arbitration won");
|
||||||
|
m_currentRequest = startRequest;
|
||||||
|
sendSymbol = m_currentRequest->m_master[0];
|
||||||
|
sending = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sendSymbol = m_currentRequest->m_master[0];
|
break;
|
||||||
sending = true;
|
case as_running:
|
||||||
}
|
break;
|
||||||
|
case as_error:
|
||||||
|
logError(lf_bus, "arbitration start error"); // TODO cancel all requests?
|
||||||
|
break;
|
||||||
|
default: // only as_none
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (sentAutoSyn) {
|
if (sentAutoSyn && !sending) {
|
||||||
return setState(bs_ready, RESULT_OK);
|
return RESULT_OK;
|
||||||
}
|
}
|
||||||
time_t now;
|
time_t now;
|
||||||
time(&now);
|
time(&now);
|
||||||
@@ -978,6 +994,9 @@ result_t BusHandler::setState(BusState state, result_t result, bool firstRepetit
|
|||||||
}
|
}
|
||||||
m_currentRequest = nullptr;
|
m_currentRequest = nullptr;
|
||||||
}
|
}
|
||||||
|
if (state == bs_skip) {
|
||||||
|
m_device->startArbitration(SYN); // reset arbitration state
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state == bs_noSignal) { // notify all requests
|
if (state == bs_noSignal) { // notify all requests
|
||||||
@@ -1012,6 +1031,7 @@ result_t BusHandler::setState(BusState state, result_t result, bool firstRepetit
|
|||||||
} else if (m_state == bs_noSignal) {
|
} else if (m_state == bs_noSignal) {
|
||||||
logNotice(lf_bus, "signal acquired");
|
logNotice(lf_bus, "signal acquired");
|
||||||
}
|
}
|
||||||
|
// logDebug(lf_bus, "state: from %s to %s with %s", getStateCode(m_state), getStateCode(state), getResultCode(result));
|
||||||
m_state = state;
|
m_state = state;
|
||||||
|
|
||||||
if (state == bs_ready || state == bs_skip) {
|
if (state == bs_ready || state == bs_skip) {
|
||||||
|
|||||||
Reference in New Issue
Block a user