diff --git a/src/lib/ebus/data.cpp b/src/lib/ebus/data.cpp index b444990d..eef428fb 100644 --- a/src/lib/ebus/data.cpp +++ b/src/lib/ebus/data.cpp @@ -367,7 +367,7 @@ result_t SingleDataField::create(const char* typeNameStr, const unsigned char le const PartType partType, int divisor, map values, SingleDataField* &returnField) { - for (size_t i = 0; i < sizeof(dataTypes) / sizeof(dataType_t); i++) { // TODO use a map + for (size_t i = 0; i < sizeof(dataTypes) / sizeof(dataType_t); i++) { const dataType_t* dataType = &dataTypes[i]; if (strcasecmp(typeNameStr, dataType->name) != 0) continue; @@ -748,8 +748,8 @@ result_t StringDataField::writeSymbols(istringstream& input, return RESULT_OK; } result_t result; - size_t i = 0; - for (size_t offset = start; i < count; offset += incr, i++) { + size_t i = 0, offset; + for (offset = start; i < count; offset += incr, i++) { switch (m_dataType.type) { case bt_hexstr: @@ -856,10 +856,9 @@ result_t StringDataField::writeSymbols(istringstream& input, } break; } - if (remainder && input.eof() && i > 0) { - count = (offset-start)*incr; + if (remainder && input.eof() && i > 0) break; - } + lastLast = last; last = value; if ((m_dataType.flags & BCD) != 0 && ((m_dataType.flags & REQ) != 0 || value != m_dataType.replacement)) { @@ -872,10 +871,10 @@ result_t StringDataField::writeSymbols(istringstream& input, output[baseOffset + offset] = (unsigned char)value; } - if (!remainder && i < m_length) // TODO check with bt_tim and m_length == 1 + if (!remainder && i < count) return RESULT_ERR_EOF; // input too short if (length!=NULL) - *length = (unsigned char)count; + *length = (unsigned char)((offset-start)*incr); return RESULT_OK; } diff --git a/src/lib/ebus/message.cpp b/src/lib/ebus/message.cpp index da27496e..82e9d0ea 100644 --- a/src/lib/ebus/message.cpp +++ b/src/lib/ebus/message.cpp @@ -733,7 +733,8 @@ ChainedMessage::ChainedMessage(const string circuit, const string name, : Message(circuit, name, isWrite, false, comment, srcAddress, dstAddress, id, data, deleteData, pollPriority, condition), - m_ids(ids), m_lengths(lengths) + m_ids(ids), m_lengths(lengths), + m_maxTimeDiff(m_ids.size()*15) // 15 seconds per message { size_t cnt = ids.size(); m_lastMasterDatas = (SymbolString**)calloc(cnt, sizeof(SymbolString*)); @@ -807,7 +808,7 @@ result_t ChainedMessage::prepareMasterPart(SymbolString& master, istringstream& return RESULT_ERR_NOTFOUND; SymbolString allData(false); - result_t result = m_data->write(input, pt_masterData, allData, 0, separator); // TODO cache this? + result_t result = m_data->write(input, pt_masterData, allData, 0, separator); if (result != RESULT_OK) return result; size_t pos = 0, addData = 0; @@ -896,7 +897,7 @@ result_t ChainedMessage::storeLastData(const PartType partType, SymbolString& da if (m_lastSlaveUpdateTimes[index]>maxTime) { maxTime = m_lastSlaveUpdateTimes[index]; } - if (minTime==0 || maxTime==0 || maxTime-minTime>30) {// TODO constant multiplied by number of messages + if (minTime==0 || maxTime==0 || maxTime-minTime>m_maxTimeDiff) { return RESULT_CONTINUE; } } @@ -904,7 +905,6 @@ result_t ChainedMessage::storeLastData(const PartType partType, SymbolString& da SymbolString master(false); SymbolString slave(false); size_t offset = 5+(m_ids[0].size()-2); // skip QQ, ZZ, PB, SB, NN - //getIdLength(); // TODO usually shorter than real ID, only use for external interface for (index=0; index > m_ids; + const vector< vector > m_ids; /** the data length for each part of the chain. */ - vector m_lengths; + const vector m_lengths; + + /** the maximum allowed time difference of any data pair. */ + const time_t m_maxTimeDiff; /** array of the last seen master datas. */ SymbolString** m_lastMasterDatas;