From 382da6215ccb5b9c9dc1d7ea14c128e501f20065 Mon Sep 17 00:00:00 2001 From: john30 Date: Sat, 6 Dec 2014 16:44:52 +0100 Subject: [PATCH] reduced DataField::read() and ::write() to a single SymbolString, adjusted message accordingly --- src/lib/ebus/data.cpp | 106 +++++++++++++---------------- src/lib/ebus/data.h | 76 ++++++++------------- src/lib/ebus/message.cpp | 14 ++-- src/lib/ebus/message.h | 6 +- src/lib/ebus/test/test_data.cpp | 11 ++- src/lib/ebus/test/test_message.cpp | 4 +- 6 files changed, 99 insertions(+), 118 deletions(-) diff --git a/src/lib/ebus/data.cpp b/src/lib/ebus/data.cpp index 52810c95..8f619b72 100644 --- a/src/lib/ebus/data.cpp +++ b/src/lib/ebus/data.cpp @@ -357,35 +357,39 @@ void SingleDataField::dump(ostream& output) output << FIELD_SEPARATOR << m_dataType.name; } -result_t SingleDataField::read(SymbolString& masterData, unsigned char masterOffset, - SymbolString& slaveData, unsigned char slaveOffset, - ostringstream& output, +result_t SingleDataField::read(const PartType partType, + SymbolString& data, unsigned char offset, + ostringstream& output, bool leadingSeparator, bool verbose, char separator) { - SymbolString& input = m_partType != pt_slaveData ? masterData : slaveData; - unsigned char offset; + if (partType != m_partType) + return RESULT_OK; + switch (m_partType) { case pt_masterData: - offset = 5 + masterOffset; // skip QQ ZZ PB SB NN + offset += 5; // skip QQ ZZ PB SB NN break; case pt_slaveData: - offset = 1 + slaveOffset; // skip NN + offset += 1; // skip NN break; default: return RESULT_ERR_INVALID_PART; } if (isIgnored() == true) { - if (offset + m_length > input.size()) { + if (offset + m_length > data.size()) { return RESULT_ERR_INVALID_POS; } return RESULT_OK; } + if (leadingSeparator == true) + output << separator; + if (verbose == true) output << m_name << "="; - result_t result = readSymbols(input, offset, output); + result_t result = readSymbols(data, offset, output); if (result != RESULT_OK) return result; @@ -398,24 +402,24 @@ result_t SingleDataField::read(SymbolString& masterData, unsigned char masterOff } result_t SingleDataField::write(istringstream& input, - SymbolString& masterData, unsigned char masterOffset, - SymbolString& slaveData, unsigned char slaveOffset, - char separator) + const PartType partType, SymbolString& data, + unsigned char offset, char separator) { - SymbolString& output = m_partType != pt_slaveData ? masterData : slaveData; - unsigned char offset; + if (partType != m_partType) + return RESULT_OK; + switch (m_partType) { case pt_masterData: - offset = 5 + masterOffset; // skip QQ ZZ PB SB NN + offset += 5; // skip QQ ZZ PB SB NN break; case pt_slaveData: - offset = 1 + slaveOffset; // skip NN + offset += 1; // skip NN break; default: return RESULT_ERR_INVALID_PART; } - return writeSymbols(input, offset, output); + return writeSymbols(input, offset, data); } @@ -1050,41 +1054,32 @@ void DataFieldSet::dump(ostream& output) (*it)->dump(output); } -result_t DataFieldSet::read(SymbolString& masterData, unsigned char masterOffset, - SymbolString& slaveData, unsigned char slaveOffset, - ostringstream& output, bool verbose, char separator) +result_t DataFieldSet::read(const PartType partType, + SymbolString& data, unsigned char offset, + ostringstream& output, bool leadingSeparator, + bool verbose, char separator) { if (verbose) output << m_name << "={ "; - bool first = true; - unsigned char offsets[3]; - memset(offsets, 0, sizeof(offsets)); - offsets[pt_masterData] = masterOffset; - offsets[pt_slaveData] = slaveOffset; - bool previousFullByteOffset[] = { true, true, true }; + bool previousFullByteOffset = true; for (vector::iterator it = m_fields.begin(); it < m_fields.end(); it++) { SingleDataField* field = *it; - bool ignored = field->isIgnored(); - PartType partType = field->getPartType(); + if (partType != pt_any && field->getPartType() != partType) + continue; - if (ignored == false) { - if (first) - first = false; - else - output << separator; - } - if (previousFullByteOffset[partType] == false && field->hasFullByteOffset(false) == false) - offsets[partType]--; + if (previousFullByteOffset == false && field->hasFullByteOffset(false) == false) + offset--; - result_t result = field->read(masterData, offsets[pt_masterData], slaveData, offsets[pt_slaveData], output, verbose, separator); +//cout<<"read "<getName().c_str()<<" in part "<(field->getPartType())<<" offset "<(offsets[field->getPartType()])<read(partType, data, offset, output, leadingSeparator, verbose, separator); if (result != RESULT_OK) return result; - offsets[partType] += field->getLength(partType); - - previousFullByteOffset[partType] = field->hasFullByteOffset(true); + offset += field->getLength(partType); + previousFullByteOffset = field->hasFullByteOffset(true); + leadingSeparator |= field->isIgnored() == false; } if (verbose == true) { @@ -1097,43 +1092,38 @@ result_t DataFieldSet::read(SymbolString& masterData, unsigned char masterOffset } result_t DataFieldSet::write(istringstream& input, - SymbolString& masterData, unsigned char masterOffset, - SymbolString& slaveData, unsigned char slaveOffset, - char separator) + const PartType partType, SymbolString& data, + unsigned char offset, char separator) { string token; - unsigned char offsets[3]; - memset(offsets, 0, sizeof(offsets)); - offsets[pt_masterData] = masterOffset; - offsets[pt_slaveData] = slaveOffset; - bool previousFullByteOffset[] = { true, true, true }; + bool previousFullByteOffset = true; for (vector::iterator it = m_fields.begin(); it < m_fields.end(); it++) { SingleDataField* field = *it; - bool ignored = field->isIgnored(); - PartType partType = field->getPartType(); + if (partType != pt_any && field->getPartType() != partType) + continue; - if (previousFullByteOffset[partType] == false && field->hasFullByteOffset(false) == false) - offsets[partType]--; + if (previousFullByteOffset == false && field->hasFullByteOffset(false) == false) + offset--; result_t result; if (m_fields.size() > 1) { - if (ignored == true) + if (field->isIgnored() == true) token.clear(); else if (getline(input, token, separator) == 0) - return RESULT_ERR_EOF; // incomplete + token.clear(); istringstream single(token); - result = (*it)->write(single, masterData, offsets[pt_masterData], slaveData, offsets[pt_slaveData], separator); + result = (*it)->write(single, partType, data, offset, separator); } else - result = (*it)->write(input, masterData, offsets[pt_masterData], slaveData, offsets[pt_slaveData], separator); + result = (*it)->write(input, partType, data, offset, separator); if (result != RESULT_OK) return result; - offsets[partType] += field->getLength(partType); - previousFullByteOffset[partType] = field->hasFullByteOffset(true); + offset += field->getLength(partType); + previousFullByteOffset = field->hasFullByteOffset(true); } return RESULT_OK; diff --git a/src/lib/ebus/data.h b/src/lib/ebus/data.h index 196eeb11..49e3f59f 100644 --- a/src/lib/ebus/data.h +++ b/src/lib/ebus/data.h @@ -164,33 +164,33 @@ public: */ 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. - * @param masterOffset the additional offset to add for reading the master data. - * @param slaveData the unescaped slave data @a SymbolString for reading binary data. - * @param slaveOffset the additional offset to add for reading the slave data. + * @brief Reads the value from the @a SymbolString. + * @param partType the @a PartType of the data. + * @param data the unescaped data @a SymbolString for reading binary data. + * @param offset the additional offset to add for reading binary data. * @param output the @a ostringstream to append the formatted value to. + * @param leadingSeparator whether to prepend a separator before the formatted value. * @param verbose whether to prepend the name, append the unit (if present), and append * the comment in square brackets (if present). * @param separator the separator character between multiple fields. - * @return @a RESULT_OK on success, or an error code. + * @return @a RESULT_OK on success (or if the partType does not match), or an error code. */ - virtual result_t read(SymbolString& masterData, unsigned char masterOffset, - SymbolString& slaveData, unsigned char slaveOffset, - ostringstream& output, + virtual result_t read(const PartType partType, + SymbolString& data, unsigned char offset, + ostringstream& output, bool leadingSeparator=false, bool verbose=false, char separator=';') = 0; /** * @brief Writes the value to the master or slave @a SymbolString. * @param input the @a istringstream to parse the formatted value from. - * @param masterData the unescaped master data @a SymbolString for writing binary data. - * @param slaveData the unescaped slave data @a SymbolString for writing binary data. + * @param partType the @a PartType of the data. + * @param data the unescaped data @a SymbolString for writing binary data. + * @param offset the additional offset to add for writing binary data. * @param separator the separator character between multiple fields. * @return @a RESULT_OK on success, or an error code. */ virtual result_t write(istringstream& input, - SymbolString& masterData, unsigned char masterOffset, - SymbolString& slaveData, unsigned char slaveOffset, - char separator=';') = 0; + const PartType partType, SymbolString& data, + unsigned char offset, char separator=';') = 0; protected: @@ -255,34 +255,15 @@ public: 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. - * @param masterOffset the extra offset for reading master data. - * @param slaveData the unescaped slave data @a SymbolString for reading binary data. - * @param slaveOffset the extra offset for reading slave data. - * @param output the ostringstream to append the formatted value to. - * @param verbose whether to prepend the name, append the unit (if present), and append - * the comment in square brackets (if present). - * @return @a RESULT_OK on success, or an error code. - */ - virtual result_t read(SymbolString& masterData, unsigned char masterOffset, - SymbolString& slaveData, unsigned char slaveOffset, - ostringstream& output, - bool verbose, char separator); - /** - * @brief Writes the value to the master or slave @a SymbolString. - * @param input the @a istringstream to parse the formatted value from. - * @param masterData the unescaped master data @a SymbolString for writing binary data. - * @param masterOffset the extra offset for writing master data. - * @param slaveData the unescaped slave data @a SymbolString for writing binary data. - * @param slaveOffset the extra offset for writing slave data. - * @return @a RESULT_OK on success, or an error code. - */ + // @copydoc + virtual result_t read(const PartType partType, + SymbolString& data, unsigned char offset, + ostringstream& output, bool leadingSeparator=false, + bool verbose=false, char separator=';'); + // @copydoc virtual result_t write(istringstream& input, - SymbolString& masterData, unsigned char masterOffset, - SymbolString& slaveData, unsigned char slaveOffset, - char separator); + const PartType partType, SymbolString& data, + unsigned char offset, char separator=';');//TODO replace protected: @@ -569,15 +550,14 @@ public: // @copydoc virtual void dump(ostream& output); // @copydoc - virtual result_t read(SymbolString& masterData, unsigned char masterOffset, - SymbolString& slaveData, unsigned char slaveOffset, - ostringstream& output, - bool verbose, char separator); + virtual result_t read(const PartType partType, + SymbolString& data, unsigned char offset, + ostringstream& output, bool leadingSeparator=false, + bool verbose=false, char separator=';'); // @copydoc virtual result_t write(istringstream& input, - SymbolString& masterData, unsigned char masterOffset, - SymbolString& slaveData, unsigned char slaveOffset, - char separator); + const PartType partType, SymbolString& data, + unsigned char offset, char separator=';'); private: diff --git a/src/lib/ebus/message.cpp b/src/lib/ebus/message.cpp index 0b1def37..d233c5a7 100644 --- a/src/lib/ebus/message.cpp +++ b/src/lib/ebus/message.cpp @@ -264,18 +264,22 @@ result_t Message::prepareMaster(const unsigned char srcAddress, SymbolString& ma if (result != RESULT_OK) return result; } - SymbolString slaveData; - result = m_data->write(input, masterData, m_id.size() - 2, slaveData, 0, separator); + result = m_data->write(input, pt_masterData, masterData, m_id.size() - 2, separator); if (result != RESULT_OK) return result; - result = masterData.push_back(masterData.getCRC(), false, false); // + result = masterData.push_back(masterData.getCRC(), false, false); // TODO only if calculated return result; } -result_t Message::decode(SymbolString& masterData, SymbolString& slaveData, +result_t Message::decode(const PartType partType, SymbolString& data, ostringstream& output, char separator) { - result_t result = m_data->read(masterData, m_id.size() - 2, slaveData, 0, output, false, separator); + unsigned char offset; + if (partType == pt_masterData) + offset = m_id.size() - 2; + else + offset = 0; + result_t result = m_data->read(partType, data, offset, output, false, false, separator); if (result != RESULT_OK) return result; /*if (m_isPassive == false && answer == true) { diff --git a/src/lib/ebus/message.h b/src/lib/ebus/message.h index 25373f5d..4c975bdb 100644 --- a/src/lib/ebus/message.h +++ b/src/lib/ebus/message.h @@ -146,13 +146,13 @@ public: istringstream& input, char separator=';'); /** * @brief Decode a received message. - * @param masterData the unescaped received master @a SymbolString. - * @param slaveData the unescaped received slave @a SymbolString. + * @param partType the @a PartType of the data. + * @param data the unescaped data @a SymbolString for reading binary data. * @param output the @a ostringstream to append the formatted value to. * @param separator the separator character between multiple fields. * @return @a RESULT_OK on success, or an error code. */ - result_t decode(SymbolString& masterData, SymbolString& slaveData, + result_t decode(const PartType partType, SymbolString& data, ostringstream& output, char separator=';'); private: diff --git a/src/lib/ebus/test/test_data.cpp b/src/lib/ebus/test/test_data.cpp index 7f668f15..4096b032 100644 --- a/src/lib/ebus/test/test_data.cpp +++ b/src/lib/ebus/test/test_data.cpp @@ -97,7 +97,7 @@ int main() {"x;;uch:17", "", "10feffff00", "00", "c"}, {"x;s;uch", "0", "1025ffff0310111213", "0300010203", "W"}, {"x;s;uch", "0", "1025ffff00", "0100", ""}, - {"x;s;uch;;;;y;m;uch", "2;3","1025ffff0103", "0102", ""}, + {"x;s;uch;;;;y;m;uch", "3;2","1025ffff0103", "0102", ""}, {"x;;uch", "38", "10feffff0126", "00", ""}, {"x;;uch", "0", "10feffff0100", "00", ""}, {"x;;uch", "254", "10feffff01fe", "00", ""}, @@ -249,7 +249,10 @@ int main() ostringstream output; SymbolString writeMstr = SymbolString(mstr.getDataStr().substr(0, 10), false); SymbolString writeSstr = SymbolString(sstr.getDataStr().substr(0, 2), false); - result = fields->read(mstr, 0, sstr, 0, output, verbose); + result = fields->read(pt_masterData, mstr, 0, output, false, verbose); + if (result == RESULT_OK) { + result = fields->read(pt_slaveData, sstr, 0, output, output.str().empty() == false, verbose); + } if (failedRead == true) if (result == RESULT_OK) cout << " failed read " << fields->getName() << " >" @@ -268,7 +271,9 @@ int main() if (verbose == false) { istringstream input(expectStr); - result = fields->write(input, writeMstr, 0, writeSstr, 0); + result = fields->write(input, pt_masterData, writeMstr, 0); + if (result == RESULT_OK) + result = fields->write(input, pt_slaveData, writeSstr, 0); if (failedWrite == true) { if (result == RESULT_OK) cout << " failed write " << fields->getName() << " >" diff --git a/src/lib/ebus/test/test_message.cpp b/src/lib/ebus/test/test_message.cpp index 6a5d17fe..5509a8f5 100644 --- a/src/lib/ebus/test/test_message.cpp +++ b/src/lib/ebus/test/test_message.cpp @@ -149,7 +149,9 @@ int main() SymbolString writeMstr = SymbolString(); if (message->isPassive() == true) { ostringstream output; - result = message->decode(mstr, sstr, output); + result = message->decode(pt_masterData, mstr, output); + if (result == RESULT_OK) + result = message->decode(pt_slaveData, sstr, output); if (result != RESULT_OK) { cout << " \"" << inputStr << "\": decode error: " << getResultCode(result) << endl;