From 2e92b15ec5e01bf8ae3ce8d7c6aa40d713a2884d Mon Sep 17 00:00:00 2001 From: john30 Date: Sun, 15 Feb 2015 18:36:14 +0100 Subject: [PATCH] unexpected syn is now an error, simplified, log self-update requests specially --- src/ebusd/bushandler.cpp | 44 +++++++++++++++++++--------------------- src/ebusd/bushandler.h | 2 +- src/lib/ebus/result.cpp | 3 ++- src/lib/ebus/result.h | 4 ++-- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/ebusd/bushandler.cpp b/src/ebusd/bushandler.cpp index 3f26d40a..de818781 100644 --- a/src/ebusd/bushandler.cpp +++ b/src/ebusd/bushandler.cpp @@ -145,7 +145,7 @@ bool ActiveBusRequest::notify(result_t result, 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); for (int sendRetries=m_failedSendRetries+1; sendRetries>=0; sendRetries--) { @@ -322,7 +322,8 @@ result_t BusHandler::handleSymbol() m_remainLockCount--; 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) - return setState(bs_ready, RESULT_SYN); + + return setState(bs_ready, RESULT_ERR_SYN); } unsigned char headerLen, crcPos; @@ -425,13 +426,9 @@ result_t BusHandler::handleSymbol() 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); } - if (m_currentRequest != NULL) - return setState(bs_skip, RESULT_ERR_ACK); return setState(bs_skip, RESULT_ERR_ACK); @@ -439,12 +436,9 @@ result_t BusHandler::handleSymbol() headerLen = 0; crcPos = m_response.size() > headerLen ? headerLen + 1 + m_response[headerLen] : 0xff; result = m_response.push_back(recvSymbol, true, m_response.size() < crcPos); - if (result < RESULT_OK) { - if (m_currentRequest != NULL) - return setState(bs_skip, result); - + if (result < RESULT_OK) return setState(bs_skip, result); - } + 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(); if (m_responseCrcValid) { @@ -665,7 +659,15 @@ void BusHandler::receiveCompleted() } 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 name = message->getName(); 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)); else { 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 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 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 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) diff --git a/src/ebusd/bushandler.h b/src/ebusd/bushandler.h index e19a54ca..176d2ce0 100644 --- a/src/ebusd/bushandler.h +++ b/src/ebusd/bushandler.h @@ -220,7 +220,7 @@ public: * @param slave reference to @a SymbolString for filling in the received slave data. */ 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. diff --git a/src/lib/ebus/result.cpp b/src/lib/ebus/result.cpp index 226ec1ad..ed872ace 100644 --- a/src/lib/ebus/result.cpp +++ b/src/lib/ebus/result.cpp @@ -26,7 +26,6 @@ const char* getResultCode(result_t resultCode) { switch (resultCode) { case RESULT_OK: return "done"; case RESULT_IN_ESC: return "escape sequence received"; - case RESULT_SYN: return "SYN received"; case RESULT_EMPTY: return "empty"; case RESULT_ERR_GENERIC_IO: return "ERR: generic I/O 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_NAK: return "ERR: NAK received"; case RESULT_ERR_NO_SIGNAL: return "ERR: no signal"; + case RESULT_ERR_SYN: return "ERR: SYN received"; + default: if (resultCode >= 0) return "done: unknown result code"; diff --git a/src/lib/ebus/result.h b/src/lib/ebus/result.h index 66c968d5..dfb690c7 100644 --- a/src/lib/ebus/result.h +++ b/src/lib/ebus/result.h @@ -25,8 +25,7 @@ static const int RESULT_OK = 0; //!< success 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 = 3; //!< empty result +static const int RESULT_EMPTY = 2; //!< empty result 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) @@ -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_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. */ typedef int result_t;