diff --git a/src/ebusd/bushandler.cpp b/src/ebusd/bushandler.cpp index 3b1bc6f5..b3f11461 100644 --- a/src/ebusd/bushandler.cpp +++ b/src/ebusd/bushandler.cpp @@ -31,7 +31,7 @@ using std::dec; using std::hex; using std::setfill; using std::setw; - +using std::endl; // the string used for answering to a scan request (07h 04h) #define SCAN_ANSWER ("ebusd.eu;" PACKAGE_NAME ";" SCAN_VERSION ";100") @@ -1070,7 +1070,7 @@ void BusHandler::receiveCompleted() { if (message) { key = message->getKey(); } else { - key = Message::createKey(m_command, 4); // up to 4 DD bytes + key = Message::createKey(m_command, m_command[1] == BROADCAST ? 1 : 4); // up to 4 DD bytes (1 for broadcast) } m_grabbedMessages[key].setLastData(m_command, m_response); } @@ -1293,20 +1293,22 @@ void BusHandler::formatSeenInfo(ostringstream& output) { } } } - vector loadedFiles = m_messages->getLoadedFiles(address); + vector& loadedFiles = m_messages->getLoadedFiles(address); if (!loadedFiles.empty()) { bool first = true; - for (vector::iterator it = loadedFiles.begin(); it != loadedFiles.end(); it++) { + for (auto& loadedFile : loadedFiles) { if (first) { first = false; output << ", loaded \""; } else { output << ", \""; } - output << *it << "\""; - it++; - if (!(*it).empty()) { - output << " (" << *it << ")"; + output << loadedFile << "\""; + string comment; + if (m_messages->getLoadedFileInfo(loadedFile, comment)) { + if (!comment.empty()) { + output << " (" << comment << ")"; + } } } } @@ -1322,13 +1324,24 @@ void BusHandler::formatUpdateInfo(ostringstream& output) { output << ",\"r\":" << (m_device->isReadOnly() ? 1 : 0); output << ",\"an\":" << (m_answer ? 1 : 0); output << ",\"co\":" << (m_addressConflict ? 1 : 0); + if (m_grabMessages) { + size_t unknownCnt = 0; + for (map::iterator it = m_grabbedMessages.begin(); it != m_grabbedMessages.end(); + it++) { + Message* message = m_messages->find(it->second.getLastMasterData()); + if (!message) { + unknownCnt++; + } + } + output << ",\"gu\":" << unknownCnt; + } unsigned char address = 0; for (int index = 0; index < 256; index++, address++) { bool ownAddress = !m_device->isReadOnly() && (address == m_ownMasterAddress || address == m_ownSlaveAddress); if (!isValidAddress(address, false) || ((m_seenAddresses[address]&SEEN) == 0 && !ownAddress)) { continue; } - output << ",\"" << setfill('0') << setw(2) << hex << static_cast(address); + output << ",\"" << setfill('0') << setw(2) << hex << static_cast(address) << dec << setw(0); output << "\":{\"o\":" << (ownAddress ? 1 : 0); map>::iterator it = m_scanResults.find(address); if (it != m_scanResults.end()) { @@ -1345,20 +1358,22 @@ void BusHandler::formatUpdateInfo(ostringstream& output) { message->decodeLastData(output, OF_NAMES|OF_NUMERIC|OF_JSON|OF_SHORT, true); } } - vector loadedFiles = m_messages->getLoadedFiles(address); + vector& loadedFiles = m_messages->getLoadedFiles(address); if (!loadedFiles.empty()) { output << ",\"f\":["; bool first = true; - for (vector::iterator it = loadedFiles.begin(); it != loadedFiles.end(); it++) { + for (auto& loadedFile : loadedFiles) { if (first) { first = false; } else { output << ","; } - output << "{\"f\":\"" << *it << "\""; - it++; - if (!(*it).empty()) { - output << ",\"c\":\"" << *it << "\""; + output << "{\"f\":\"" << loadedFile << "\""; + string comment; + if (m_messages->getLoadedFileInfo(loadedFile, comment)) { + if (!comment.empty()) { + output << ",\"c\":\"" << comment << "\""; + } } output << "}"; } @@ -1366,6 +1381,29 @@ void BusHandler::formatUpdateInfo(ostringstream& output) { } output << "}"; } + vector loadedFiles = m_messages->getLoadedFiles(); + if (!loadedFiles.empty()) { + output << ",\"l\":{"; + bool first = true; + for (auto& loadedFile : loadedFiles) { + if (first) { + first = false; + } else { + output << ","; + } + output << "\"" << loadedFile << "\":{"; + string comment; + size_t hash, size; + time_t time; + if (m_messages->getLoadedFileInfo(loadedFile, comment, &hash, &size, &time)) { + output << "\"h\":\""; + MappedFileReader::formatHash(hash, output); + output << "\",\"s\":" << size << ",\"t\":" << time; + } + output << "}"; + } + output << "}"; + } } result_t BusHandler::scanAndWait(symbol_t dstAddress, bool loadScanConfig, bool reload) { diff --git a/src/ebusd/bushandler.h b/src/ebusd/bushandler.h index b2b2a9f4..0e5bee94 100644 --- a/src/ebusd/bushandler.h +++ b/src/ebusd/bushandler.h @@ -314,6 +314,12 @@ class GrabbedMessage { */ void setLastData(MasterSymbolString& master, SlaveSymbolString& slave); + /** + * Get the last @a MasterSymbolString. + * @return the last @a MasterSymbolString. + */ + MasterSymbolString& getLastMasterData() { return m_lastMaster; } + /** * Dump the last received data and message count to the output. * @param unknown whether to dump only if this message is unknown.