unexpected syn is now an error, simplified, log self-update requests specially
This commit is contained in:
+21
-23
@@ -145,7 +145,7 @@ bool ActiveBusRequest::notify(result_t result, SymbolString& slave)
|
|||||||
|
|
||||||
result_t BusHandler::sendAndWait(SymbolString& master, SymbolString& slave)
|
result_t BusHandler::sendAndWait(SymbolString& master, SymbolString& slave)
|
||||||
{
|
{
|
||||||
result_t result = RESULT_SYN;
|
result_t result = RESULT_ERR_NO_SIGNAL;
|
||||||
ActiveBusRequest request(master, slave);
|
ActiveBusRequest request(master, slave);
|
||||||
|
|
||||||
for (int sendRetries=m_failedSendRetries+1; sendRetries>=0; sendRetries--) {
|
for (int sendRetries=m_failedSendRetries+1; sendRetries>=0; sendRetries--) {
|
||||||
@@ -322,7 +322,8 @@ result_t BusHandler::handleSymbol()
|
|||||||
m_remainLockCount--;
|
m_remainLockCount--;
|
||||||
else if (sending == false && m_remainLockCount == 0 && m_command.size() == 1)
|
else if (sending == false && m_remainLockCount == 0 && m_command.size() == 1)
|
||||||
m_remainLockCount = 1; // wait for next AUTO-SYN after SYN / address / SYN (bus locked for own priority)
|
m_remainLockCount = 1; // wait for next AUTO-SYN after SYN / address / SYN (bus locked for own priority)
|
||||||
return setState(bs_ready, RESULT_SYN);
|
|
||||||
|
return setState(bs_ready, RESULT_ERR_SYN);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char headerLen, crcPos;
|
unsigned char headerLen, crcPos;
|
||||||
@@ -425,13 +426,9 @@ result_t BusHandler::handleSymbol()
|
|||||||
|
|
||||||
return setState(bs_recvCmd, RESULT_ERR_NAK);
|
return setState(bs_recvCmd, RESULT_ERR_NAK);
|
||||||
}
|
}
|
||||||
if (m_currentRequest != NULL)
|
|
||||||
return setState(bs_skip, RESULT_ERR_NAK);
|
|
||||||
|
|
||||||
return setState(bs_skip, RESULT_ERR_NAK);
|
return setState(bs_skip, RESULT_ERR_NAK);
|
||||||
}
|
}
|
||||||
if (m_currentRequest != NULL)
|
|
||||||
return setState(bs_skip, RESULT_ERR_ACK);
|
|
||||||
|
|
||||||
return setState(bs_skip, RESULT_ERR_ACK);
|
return setState(bs_skip, RESULT_ERR_ACK);
|
||||||
|
|
||||||
@@ -439,12 +436,9 @@ result_t BusHandler::handleSymbol()
|
|||||||
headerLen = 0;
|
headerLen = 0;
|
||||||
crcPos = m_response.size() > headerLen ? headerLen + 1 + m_response[headerLen] : 0xff;
|
crcPos = m_response.size() > headerLen ? headerLen + 1 + m_response[headerLen] : 0xff;
|
||||||
result = m_response.push_back(recvSymbol, true, m_response.size() < crcPos);
|
result = m_response.push_back(recvSymbol, true, m_response.size() < crcPos);
|
||||||
if (result < RESULT_OK) {
|
if (result < RESULT_OK)
|
||||||
if (m_currentRequest != NULL)
|
|
||||||
return setState(bs_skip, result);
|
|
||||||
|
|
||||||
return setState(bs_skip, result);
|
return setState(bs_skip, result);
|
||||||
}
|
|
||||||
if (result == RESULT_OK && crcPos != 0xff && m_response.size() == crcPos + 1) { // CRC received
|
if (result == RESULT_OK && crcPos != 0xff && m_response.size() == crcPos + 1) { // CRC received
|
||||||
m_responseCrcValid = m_response[headerLen + 1 + m_response[headerLen]] == m_response.getCRC();
|
m_responseCrcValid = m_response[headerLen + 1 + m_response[headerLen]] == m_response.getCRC();
|
||||||
if (m_responseCrcValid) {
|
if (m_responseCrcValid) {
|
||||||
@@ -665,7 +659,15 @@ void BusHandler::receiveCompleted()
|
|||||||
}
|
}
|
||||||
|
|
||||||
Message* message = m_messages->find(m_command);
|
Message* message = m_messages->find(m_command);
|
||||||
if (message != NULL) {
|
if (message == NULL) {
|
||||||
|
if (dstAddress == BROADCAST)
|
||||||
|
logNotice(lf_update, "unknown BC cmd: %s", m_command.getDataStr().c_str());
|
||||||
|
else if (master == true)
|
||||||
|
logNotice(lf_update, "unknown MM cmd: %s", m_command.getDataStr().c_str());
|
||||||
|
else
|
||||||
|
logNotice(lf_update, "unknown MS cmd: %s / %s", m_command.getDataStr().c_str(), m_response.getDataStr().c_str());
|
||||||
|
}
|
||||||
|
else {
|
||||||
string clazz = message->getClass();
|
string clazz = message->getClass();
|
||||||
string name = message->getName();
|
string name = message->getName();
|
||||||
ostringstream output;
|
ostringstream output;
|
||||||
@@ -674,25 +676,21 @@ void BusHandler::receiveCompleted()
|
|||||||
logError(lf_update, "unable to parse %s %s from %s / %s: %s", clazz.c_str(), name.c_str(), m_command.getDataStr().c_str(), m_response.getDataStr().c_str(), getResultCode(result));
|
logError(lf_update, "unable to parse %s %s from %s / %s: %s", clazz.c_str(), name.c_str(), m_command.getDataStr().c_str(), m_response.getDataStr().c_str(), getResultCode(result));
|
||||||
else {
|
else {
|
||||||
string data = output.str();
|
string data = output.str();
|
||||||
if (message->getDstAddress() == SYN) { // any destination
|
if (m_answer == true && dstAddress == (master ? m_ownMasterAddress : m_ownSlaveAddress)) {
|
||||||
|
logNotice(lf_update, "self-update %s %s QQ=%2.2x: %s", clazz.c_str(), name.c_str(), srcAddress, data.c_str()); // TODO store in database of internal variables
|
||||||
|
}
|
||||||
|
else if (message->getDstAddress() == SYN) { // any destination
|
||||||
if (message->getSrcAddress() == SYN) // any destination and any source
|
if (message->getSrcAddress() == SYN) // any destination and any source
|
||||||
logNotice(lf_update, "update %s %s QQ=%2.2x ZZ=%2.2x: %s", clazz.c_str(), name.c_str(), srcAddress, dstAddress, data.c_str());
|
logNotice(lf_update, "update %s %s QQ=%2.2x ZZ=%2.2x: %s", clazz.c_str(), name.c_str(), srcAddress, dstAddress, data.c_str());
|
||||||
else
|
else
|
||||||
logNotice(lf_update, "update %s %s ZZ=%2.2x: %s", clazz.c_str(), name.c_str(), dstAddress, data.c_str());
|
logNotice(lf_update, "update %s %s ZZ=%2.2x: %s", clazz.c_str(), name.c_str(), dstAddress, data.c_str());
|
||||||
} else if (message->getSrcAddress() == SYN) // any source
|
}
|
||||||
logNotice(lf_update, "update %s %s QQ=%2.2x: %s", clazz.c_str(), name.c_str(), srcAddress, data.c_str());
|
else if (message->getSrcAddress() == SYN) // any source
|
||||||
|
logNotice(lf_update, "update %s %s from QQ=%2.2x: %s", clazz.c_str(), name.c_str(), srcAddress, data.c_str());
|
||||||
else
|
else
|
||||||
logNotice(lf_update, "update %s %s: %s", clazz.c_str(), name.c_str(), data.c_str());
|
logNotice(lf_update, "update %s %s: %s", clazz.c_str(), name.c_str(), data.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if (dstAddress == BROADCAST)
|
|
||||||
logNotice(lf_update, "unknown BC cmd: %s", m_command.getDataStr().c_str());
|
|
||||||
else if (master == true)
|
|
||||||
logNotice(lf_update, "unknown MM cmd: %s", m_command.getDataStr().c_str());
|
|
||||||
else
|
|
||||||
logNotice(lf_update, "unknown MS cmd: %s / %s", m_command.getDataStr().c_str(), m_response.getDataStr().c_str());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result_t BusHandler::startScan(bool full)
|
result_t BusHandler::startScan(bool full)
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ public:
|
|||||||
* @param slave reference to @a SymbolString for filling in the received slave data.
|
* @param slave reference to @a SymbolString for filling in the received slave data.
|
||||||
*/
|
*/
|
||||||
ActiveBusRequest(SymbolString& master, SymbolString& slave)
|
ActiveBusRequest(SymbolString& master, SymbolString& slave)
|
||||||
: BusRequest(master, false), m_result(RESULT_SYN), m_slave(slave) {}
|
: BusRequest(master, false), m_result(RESULT_ERR_NO_SIGNAL), m_slave(slave) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destructor.
|
* Destructor.
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ const char* getResultCode(result_t resultCode) {
|
|||||||
switch (resultCode) {
|
switch (resultCode) {
|
||||||
case RESULT_OK: return "done";
|
case RESULT_OK: return "done";
|
||||||
case RESULT_IN_ESC: return "escape sequence received";
|
case RESULT_IN_ESC: return "escape sequence received";
|
||||||
case RESULT_SYN: return "SYN received";
|
|
||||||
case RESULT_EMPTY: return "empty";
|
case RESULT_EMPTY: return "empty";
|
||||||
case RESULT_ERR_GENERIC_IO: return "ERR: generic I/O error";
|
case RESULT_ERR_GENERIC_IO: return "ERR: generic I/O error";
|
||||||
case RESULT_ERR_DEVICE: return "ERR: generic device error";
|
case RESULT_ERR_DEVICE: return "ERR: generic device error";
|
||||||
@@ -49,6 +48,8 @@ const char* getResultCode(result_t resultCode) {
|
|||||||
case RESULT_ERR_ACK: return "ERR: ACK error";
|
case RESULT_ERR_ACK: return "ERR: ACK error";
|
||||||
case RESULT_ERR_NAK: return "ERR: NAK received";
|
case RESULT_ERR_NAK: return "ERR: NAK received";
|
||||||
case RESULT_ERR_NO_SIGNAL: return "ERR: no signal";
|
case RESULT_ERR_NO_SIGNAL: return "ERR: no signal";
|
||||||
|
case RESULT_ERR_SYN: return "ERR: SYN received";
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (resultCode >= 0)
|
if (resultCode >= 0)
|
||||||
return "done: unknown result code";
|
return "done: unknown result code";
|
||||||
|
|||||||
@@ -25,8 +25,7 @@
|
|||||||
static const int RESULT_OK = 0; //!< success
|
static const int RESULT_OK = 0; //!< success
|
||||||
|
|
||||||
static const int RESULT_IN_ESC = 1; //!< start of escape sequence received
|
static const int RESULT_IN_ESC = 1; //!< start of escape sequence received
|
||||||
static const int RESULT_SYN = 2; //!< regular SYN after message received
|
static const int RESULT_EMPTY = 2; //!< empty result
|
||||||
static const int RESULT_EMPTY = 3; //!< empty result
|
|
||||||
|
|
||||||
static const int RESULT_ERR_GENERIC_IO = -1; //!< generic I/O error (usually fatal)
|
static const int RESULT_ERR_GENERIC_IO = -1; //!< generic I/O error (usually fatal)
|
||||||
static const int RESULT_ERR_DEVICE = -2; //!< generic device error (usually fatal)
|
static const int RESULT_ERR_DEVICE = -2; //!< generic device error (usually fatal)
|
||||||
@@ -52,6 +51,7 @@ static const int RESULT_ERR_ACK = -19; //!< ACK error
|
|||||||
static const int RESULT_ERR_NAK = -20; //!< NAK received
|
static const int RESULT_ERR_NAK = -20; //!< NAK received
|
||||||
|
|
||||||
static const int RESULT_ERR_NO_SIGNAL = -21; //!< no signal found on the bus
|
static const int RESULT_ERR_NO_SIGNAL = -21; //!< no signal found on the bus
|
||||||
|
static const int RESULT_ERR_SYN = -22; //!< SYN received instead of answer
|
||||||
|
|
||||||
/** type for result code. */
|
/** type for result code. */
|
||||||
typedef int result_t;
|
typedef int result_t;
|
||||||
|
|||||||
Reference in New Issue
Block a user