diff --git a/src/lib/ebus/data.cpp b/src/lib/ebus/data.cpp index 2af7a240..75b8c36a 100644 --- a/src/lib/ebus/data.cpp +++ b/src/lib/ebus/data.cpp @@ -136,8 +136,6 @@ result_t DataField::create(vector::iterator& it, unsigned int divisor = 0; const bool isTemplate = dstAddress == SYN; string token; - if (it == end) - break; // name;part;type[:len][;[divisor|values][;[unit][;[comment]]]] const string name = *it++; @@ -152,7 +150,7 @@ result_t DataField::create(vector::iterator& it, firstName = name; firstComment = comment; } - if (dstAddress == BROADCAST || isMaster(dstAddress) + if (dstAddress == BROADCAST || isMaster(dstAddress) == true || (isTemplate == false && isSetMessage == true && partStr[0] == 0) || strcasecmp(partStr, "M") == 0) { // master data partType = pt_masterData; @@ -238,7 +236,7 @@ result_t DataField::create(vector::iterator& it, break; } found = true; - result = templ->derive(name, comment, unit, partType, divisor, values, fields); + result = templ->derive("", "", "", partType, divisor, values, fields); if (result != RESULT_OK) break; } @@ -347,6 +345,16 @@ result_t DataField::create(vector::iterator& it, } +void SingleDataField::dump(ostream& output) +{ + output << m_name << FIELD_SEPARATOR; + if (m_partType == pt_masterData) + output << "m"; + else if (m_partType == pt_slaveData) + output << "s"; + output << FIELD_SEPARATOR << m_dataType.name; +} + result_t SingleDataField::read(SymbolString& masterData, unsigned char masterOffset, SymbolString& slaveData, unsigned char slaveOffset, ostringstream& output, @@ -365,7 +373,6 @@ result_t SingleDataField::read(SymbolString& masterData, unsigned char masterOff default: return RESULT_ERR_INVALID_ARG; // invalid part type } - if (isIgnored() == true) { if (offset + m_length > input.size()) { return RESULT_ERR_INVALID_ARG; @@ -431,6 +438,15 @@ result_t StringDataField::derive(string name, string comment, return RESULT_OK; } +void StringDataField::dump(ostream& output) +{ + SingleDataField::dump(output); + if ((m_dataType.flags & ADJ) != 0) + output << ":" << static_cast(m_length); + output << FIELD_SEPARATOR << FIELD_SEPARATOR; // no value list, no divisor + output << m_unit << FIELD_SEPARATOR << m_comment << FIELD_SEPARATOR; +} + result_t StringDataField::readSymbols(SymbolString& input, unsigned char baseOffset, ostringstream& output) { @@ -633,6 +649,18 @@ bool NumericDataField::hasFullByteOffset(bool after) || (after == true && m_bitOffset + (m_bitCount % 8) >= 8); } +void NumericDataField::dump(ostream& output) +{ + SingleDataField::dump(output); + if ((m_dataType.flags & ADJ) != 0) { + if ((m_dataType.maxBits % 8) != 0) + output << ":" << static_cast(m_bitCount); + else + output << ":" << static_cast(m_length); + } + output << FIELD_SEPARATOR; +} + result_t NumericDataField::readRawValue(SymbolString& input, unsigned char baseOffset, unsigned int& value) { @@ -749,6 +777,13 @@ result_t NumberDataField::derive(string name, string comment, return RESULT_OK; } +void NumberDataField::dump(ostream& output) +{ + NumericDataField::dump(output); + output << static_cast(m_divisor) << FIELD_SEPARATOR; + output << m_unit << FIELD_SEPARATOR << m_comment << FIELD_SEPARATOR; +} + result_t NumberDataField::readSymbols(SymbolString& input, unsigned char baseOffset, ostringstream& output) { @@ -881,6 +916,21 @@ result_t ValueListDataField::derive(string name, string comment, return RESULT_OK; } +void ValueListDataField::dump(ostream& output) +{ + NumericDataField::dump(output); + bool first = true; + for (map::iterator it = m_values.begin(); it != m_values.end(); it++) { + if (first == true) + first = false; + else + output << VALUE_SEPARATOR; + output << static_cast(it->first) << "=" << it->second; + } + output << FIELD_SEPARATOR; + output << m_unit << FIELD_SEPARATOR << m_comment << FIELD_SEPARATOR; +} + result_t ValueListDataField::readSymbols(SymbolString& input, unsigned char baseOffset, ostringstream& output) { @@ -968,6 +1018,12 @@ result_t DataFieldSet::derive(string name, string comment, return RESULT_OK; } +void DataFieldSet::dump(ostream& output) +{ + for (vector::iterator it = m_fields.begin(); it < m_fields.end(); it++) + (*it)->dump(output); +} + result_t DataFieldSet::read(SymbolString& masterData, unsigned char masterOffset, SymbolString& slaveData, unsigned char slaveOffset, ostringstream& output, bool verbose, char separator) diff --git a/src/lib/ebus/data.h b/src/lib/ebus/data.h index a62de4e3..9e8c4b75 100644 --- a/src/lib/ebus/data.h +++ b/src/lib/ebus/data.h @@ -158,6 +158,11 @@ public: * @return the field comment. */ string getComment() const { return m_comment; } + /** + * @brief Dump the field settings to the output. + * @param output the @a ostream to dump to. + */ + virtual void dump(ostream& output) = 0; /** * @brief Reads the value from the master or slave @a SymbolString. * @param masterData the unescaped master data @a SymbolString for reading binary data. @@ -248,6 +253,8 @@ public: * only consumes a part of a byte and a subsequent field may re-use the same offset. */ virtual bool hasFullByteOffset(bool after) { return true; } + // @copydoc + virtual void dump(ostream& output); /** * @brief Reads the value from the master or slave @a SymbolString. * @param masterData the unescaped master data @a SymbolString for reading binary data. @@ -339,6 +346,8 @@ public: string unit, const PartType partType, unsigned int divisor, map values, vector& fields); + // @copydoc + virtual void dump(ostream& output); protected: @@ -379,6 +388,8 @@ public: virtual ~NumericDataField() {} // @copydoc virtual bool hasFullByteOffset(bool after); + // @copydoc + virtual void dump(ostream& output); protected: @@ -441,6 +452,8 @@ public: string unit, const PartType partType, unsigned int divisor, map values, vector& fields); + // @copydoc + virtual void dump(ostream& output); protected: @@ -490,6 +503,8 @@ public: string unit, const PartType partType, unsigned int divisor, map values, vector& fields); + // @copydoc + virtual void dump(ostream& output); protected: @@ -552,6 +567,8 @@ public: */ size_t size() const { return m_fields.size(); } // @copydoc + virtual void dump(ostream& output); + // @copydoc virtual result_t read(SymbolString& masterData, unsigned char masterOffset, SymbolString& slaveData, unsigned char slaveOffset, ostringstream& output,