From b935019aa70994677b7009820323b1e61f8cf689 Mon Sep 17 00:00:00 2001 From: john30 Date: Thu, 12 Mar 2015 23:29:25 +0100 Subject: [PATCH] allow empty field list, formatting --- src/lib/ebus/message.cpp | 47 ++++++++++++++++-------------- src/lib/ebus/test/test_message.cpp | 11 +++---- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/lib/ebus/message.cpp b/src/lib/ebus/message.cpp index 289d018c..995f8e95 100644 --- a/src/lib/ebus/message.cpp +++ b/src/lib/ebus/message.cpp @@ -52,7 +52,7 @@ Message::Message(const string clazz, const string name, const bool isWrite, else key |= 0x1fLL << (8 * exp--); // special value for active key |= (unsigned long long)dstAddress << (8 * exp--); - for (vector::const_iterator it=id.begin(); it::const_iterator it = id.begin(); it < id.end(); it++) key |= (unsigned long long)*it << (8 * exp--); m_key = key; } @@ -193,18 +193,16 @@ result_t Message::create(vector::iterator& it, const vector::ite } vector id; - for (int pos=0, useDefaults=1; pos<2; pos++) { // message id (PBSB, optional master data) + bool useDefaults = true; + for (int pos = 0; pos < 2 && it != end; pos++) { // message id (PBSB, optional master data) string token = *it++; - if (useDefaults == 1) { + if (useDefaults) { if (pos == 0 && token.size() > 0) - useDefaults = 0; + useDefaults = false; else token = getDefault("", defaults, defaultPos).append(token); - } istringstream input(token); - if (it == end) - return RESULT_ERR_EOF; while (!input.eof()) { while (input.peek() == ' ') input.get(); @@ -223,9 +221,9 @@ result_t Message::create(vector::iterator& it, const vector::ite } id.push_back(value); } - if (pos == 0 && id.size() != 2) { + if (pos == 0 && id.size() != 2) return RESULT_ERR_INVALID_ARG; // missing/too short/too PBSB - } + defaultPos++; } if (id.size() < 2 || id.size() > 6) { @@ -254,9 +252,14 @@ result_t Message::create(vector::iterator& it, const vector::ite } } DataField* data = NULL; - result = DataField::create(it, realEnd, templates, data, isWrite, false, isBroadcastOrMasterDestination); - if (result != RESULT_OK) { - return result; + if (it==realEnd) { + vector fields; + data = new DataFieldSet("", "", fields); + } else { + result = DataField::create(it, realEnd, templates, data, isWrite, false, isBroadcastOrMasterDestination); + if (result != RESULT_OK) { + return result; + } } if (id.size() + data->getLength(pt_masterData) > 2 + MAX_POS || data->getLength(pt_slaveData) > MAX_POS) { // max NN exceeded @@ -306,7 +309,7 @@ result_t Message::prepareMaster(const unsigned char srcAddress, SymbolString& ma result = master.push_back((unsigned char)(m_id.size() - 2 + addData), false, false); if (result != RESULT_OK) return result; - for (size_t i=2; iread(partType, data, offset, output, leadingSeparator, verbose, fieldName, fieldIndex, separator); if (result < RESULT_OK) return result; - if (result == RESULT_EMPTY) + if (result == RESULT_EMPTY && fieldName != NULL) return RESULT_ERR_NOTFOUND; time(&m_lastUpdateTime); @@ -385,14 +388,14 @@ result_t Message::decode(SymbolString& masterData, SymbolString& slaveData, result_t result = m_data->read(pt_masterData, masterData, offset, output, leadingSeparator, verbose, NULL, -1, separator); if (result < RESULT_OK) return result; - bool empty = result==RESULT_EMPTY; + bool empty = result == RESULT_EMPTY; offset = 0; leadingSeparator = output.str().length() > startPos; result = m_data->read(pt_slaveData, slaveData, offset, output, leadingSeparator, verbose, NULL, -1, separator); if (result < RESULT_OK) return result; - if (empty && result == RESULT_EMPTY) - return RESULT_ERR_NOTFOUND; + if (result == RESULT_EMPTY && !empty) + result = RESULT_OK; time(&m_lastUpdateTime); if (masterData != m_lastMasterData) { @@ -416,13 +419,13 @@ result_t Message::decodeLastData(ostringstream& output, result_t result = m_data->read(pt_masterData, m_lastMasterData, offset, output, leadingSeparator, verbose, fieldName, fieldIndex, separator); if (result < RESULT_OK) return result; - bool empty = result==RESULT_EMPTY; + bool empty = result == RESULT_EMPTY; offset = 0; leadingSeparator = output.str().length() > startPos; result = m_data->read(pt_slaveData, m_lastSlaveData, offset, output, leadingSeparator, verbose, fieldName, fieldIndex, separator); if (result < RESULT_OK) return result; - if (empty && result == RESULT_EMPTY) + if (empty && result == RESULT_EMPTY && fieldName != NULL) return RESULT_ERR_NOTFOUND; return RESULT_OK; } @@ -469,7 +472,7 @@ void Message::dump(ostream& output) output << hex << setw(2) << setfill('0') << static_cast(m_dstAddress); output << FIELD_SEPARATOR; unsigned int cnt = 0; - for (vector::const_iterator it=m_id.begin(); it::const_iterator it = m_id.begin(); it < m_id.end(); it++) { if (cnt++ == 2) output << FIELD_SEPARATOR; output << hex << setw(2) << setfill('0') << static_cast(*it); @@ -565,7 +568,7 @@ Message* MessageMap::find(const string& clazz, const string& name, const bool is { string lclass = strtolower(clazz); string lname = strtolower(name); - for (int i=0; i<2; i++) { + for (int i = 0; i < 2; i++) { string key; if (i == 0) key = string(isPassive ? "P" : (isWrite ? "W" : "R")) + lclass + FIELD_SEPARATOR + lname; @@ -644,7 +647,7 @@ Message* MessageMap::find(SymbolString& master) key |= (unsigned long long)master[1] << (8 * exp--); key |= (unsigned long long)master[2] << (8 * exp--); key |= (unsigned long long)master[3] << (8 * exp--); - for (unsigned char i=0; i::iterator it = m_messagesByKey.find(key); diff --git a/src/lib/ebus/test/test_message.cpp b/src/lib/ebus/test/test_message.cpp index 69eeae71..feff0b88 100644 --- a/src/lib/ebus/test/test_message.cpp +++ b/src/lib/ebus/test/test_message.cpp @@ -58,6 +58,7 @@ int main() {"u,,first,,,fe,0700,,x,,bda", "26.10.2014", "fffe07000426100614", "00", "p"}, {"u,broadcast,hwStatus,,,fe,b505,27,,,UCH,,,,,,UCH,,,,,,UCH,,,", "0;19;0", "10feb505042700130097", "00", ""}, {"w,,first,,,15,b509,0400,date,,bda", "26.10.2014", "ff15b50906040026100614", "00", "m"}, + {"w,,first,,,15,b509", "", "ff15b50900", "00", "m"}, {"r,ehp,time,,,08,b509,0d2800,,,time", "15:00:17", "ff08b509030d2800", "0311000f", "md"}, {"r,ehp,time,,,08;10,b509,0d2800,,,time", "15:00:17", "ff08b509030d2800", "0311000f", "c"}, {"r,ehp,time,,,08;09,b509,0d2800,,,time", "15:00:17", "ff08b509030d2800", "0311000f", "md*"}, @@ -107,7 +108,7 @@ int main() entries.push_back(item); if (deleteMessages.size()>0) { - for (vector::iterator it = deleteMessages.begin(); it!=deleteMessages.end(); it++) { + for (vector::iterator it = deleteMessages.begin(); it != deleteMessages.end(); it++) { Message* deleteMessage = *it; delete deleteMessage; } @@ -117,7 +118,7 @@ int main() // store new template DataField* fields = NULL; vector::iterator it = entries.begin(); - result = DataField::create(it, entries.end(), templates, fields); + result = DataField::create(it, entries.end(), templates, fields, false, true, false); if (result != RESULT_OK) cout << "\"" << check[0] << "\": template fields create error: " << getResultCode(result) << endl; else if (it != entries.end()) { @@ -178,7 +179,7 @@ int main() cout << "\"" << check[0] << "\": create OK" << endl; if (!dontMap) { result_t result = RESULT_OK; - for (vector::iterator it = deleteMessages.begin(); it!=deleteMessages.end(); it++) { + for (vector::iterator it = deleteMessages.begin(); it != deleteMessages.end(); it++) { Message* deleteMessage = *it; result_t result = messages->add(deleteMessage); if (result != RESULT_OK) { @@ -187,7 +188,7 @@ int main() break; } } - if (result!=RESULT_OK) + if (result != RESULT_OK) continue; cout << " map OK" << endl; message = deleteMessages.front(); @@ -244,7 +245,7 @@ int main() } if (deleteMessages.size()>0) { - for (vector::iterator it = deleteMessages.begin(); it!=deleteMessages.end(); it++) { + for (vector::iterator it = deleteMessages.begin(); it != deleteMessages.end(); it++) { Message* deleteMessage = *it; delete deleteMessage; }