From cdd26bbfe88ea284524f214a5d09def07f54ff44 Mon Sep 17 00:00:00 2001 From: john30 Date: Sun, 24 Mar 2019 14:50:35 +0100 Subject: [PATCH] added last time to GrabbedMessage in preparation of direct mode --- src/ebusd/bushandler.cpp | 40 +++++++++++++++++++++++++++------------- src/ebusd/bushandler.h | 27 ++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 16 deletions(-) mode change 100755 => 100644 src/ebusd/bushandler.cpp mode change 100755 => 100644 src/ebusd/bushandler.h diff --git a/src/ebusd/bushandler.cpp b/src/ebusd/bushandler.cpp old mode 100755 new mode 100644 index 42f06491..ddf51a85 --- a/src/ebusd/bushandler.cpp +++ b/src/ebusd/bushandler.cpp @@ -190,6 +190,7 @@ bool ActiveBusRequest::notify(result_t result, const SlaveSymbolString& slave) { void GrabbedMessage::setLastData(const MasterSymbolString& master, const SlaveSymbolString& slave) { + time(&m_lastTime); m_lastMaster = master; m_lastSlave = slave; m_count++; @@ -249,7 +250,8 @@ bool decodeType(const DataType* type, const SymbolString& input, size_t length, return !first; } -bool GrabbedMessage::dump(bool unknown, MessageMap* messages, bool first, bool decode, ostringstream* output) const { +bool GrabbedMessage::dump(bool unknown, MessageMap* messages, bool first, bool decode, ostringstream* output, + bool isDirectMode) const { Message* message = messages->find(m_lastMaster); if (unknown && message) { return false; @@ -260,11 +262,13 @@ bool GrabbedMessage::dump(bool unknown, MessageMap* messages, bool first, bool d symbol_t dstAddress = m_lastMaster[1]; *output << m_lastMaster.getStr(); if (dstAddress != BROADCAST && !isMaster(dstAddress)) { - *output << " / " << m_lastSlave.getStr(); + *output << (isDirectMode ? " " : " / ") << m_lastSlave.getStr(); } - *output << " = " << m_count; - if (message) { - *output << ": " << message->getCircuit() << " " << message->getName(); + if (!isDirectMode) { + *output << " = " << m_count; + if (message) { + *output << ": " << message->getCircuit() << " " << message->getName(); + } } if (decode) { DataTypeList *types = DataTypeList::getInstance(); @@ -1544,16 +1548,26 @@ bool BusHandler::enableGrab(bool enable) { return true; } -void BusHandler::formatGrabResult(bool unknown, bool decode, ostringstream* output) const { +void BusHandler::formatGrabResult(bool unknown, bool decode, ostringstream* output, bool isDirectMode, + time_t since, time_t until) const { if (!m_grabMessages) { - *output << "grab disabled"; - } else { - bool first = true; - for (const auto& it : m_grabbedMessages) { - if (it.second.dump(unknown, m_messages, first, decode, output)) { - first = false; - } + if (!isDirectMode) { + *output << "grab disabled"; } + return; + } + bool first = true; + for (const auto& it : m_grabbedMessages) { + if (since > 0 && it.second.getLastTime() < since + || until > 0 && it.second.getLastTime() >= until) { + continue; + } + if (it.second.dump(unknown, m_messages, first, decode, output, isDirectMode)) { + first = false; + } + } + if (isDirectMode && !first) { + *output << endl; } } diff --git a/src/ebusd/bushandler.h b/src/ebusd/bushandler.h old mode 100755 new mode 100644 index e66a5544..da93e88c --- a/src/ebusd/bushandler.h +++ b/src/ebusd/bushandler.h @@ -296,7 +296,7 @@ class GrabbedMessage { /** * Construct a new instance. */ - GrabbedMessage() : m_count(0) {} + GrabbedMessage() : m_lastTime(0), m_count(0) {} /** * Copy constructor. @@ -314,6 +314,12 @@ class GrabbedMessage { */ void setLastData(const MasterSymbolString& master, const SlaveSymbolString& slave); + /** + * Get the last received time. + * @return the last received time. + */ + time_t getLastTime() const { return m_lastTime; } + /** * Get the last @a MasterSymbolString. * @return the last @a MasterSymbolString. @@ -327,12 +333,17 @@ class GrabbedMessage { * @param first whether this is the first message to be added to the output. * @param decode whether to add decoding hints. * @param output the @a ostringstream to format the messages to. + * @param isDirectMode true for direct mode, false for grab command. * @return whether the message was added to the output. */ - bool dump(bool unknown, MessageMap* messages, bool first, bool decode, ostringstream* output) const; + bool dump(bool unknown, MessageMap* messages, bool first, bool decode, ostringstream* output, + bool isDirectMode = false) const; private: + /** the last received time. */ + time_t m_lastTime; + /** the last @a MasterSymbolString. */ MasterSymbolString m_lastMaster; @@ -516,13 +527,23 @@ class BusHandler : public WaitThread { */ bool enableGrab(bool enable = true); + /** + * Return whether grabbing unknown messages is enabled. + * @return whether grabbing unknown messages is enabled. + */ + bool isGrabEnabled() { return m_grabMessages; } + /** * Format the grabbed messages to the @a ostringstream. * @param unknown whether to dump only unknown messages. * @param decode whether to add decoding hints. * @param output the @a ostringstream to format the messages to. + * @param isDirectMode true for direct mode, false for grab command. + * @param since the start time from which to add received messages (inclusive), or 0 for all. + * @param until the end time to which to add received messages (exclusive), or 0 for all. */ - void formatGrabResult(bool unknown, bool decode, ostringstream* output) const; + void formatGrabResult(bool unknown, bool decode, ostringstream* output, bool isDirectMode = false, + time_t since = 0, time_t until = 0) const; /** * Return true when a signal on the bus is available.