do not override name when referencing templates, added DataField::dump()

This commit is contained in:
john30
2014-11-30 20:05:35 +01:00
parent 7d46a58ba5
commit 46fb6763bc
2 changed files with 78 additions and 5 deletions
+61 -5
View File
@@ -136,8 +136,6 @@ result_t DataField::create(vector<string>::iterator& it,
unsigned int divisor = 0; unsigned int divisor = 0;
const bool isTemplate = dstAddress == SYN; const bool isTemplate = dstAddress == SYN;
string token; string token;
if (it == end)
break;
// name;part;type[:len][;[divisor|values][;[unit][;[comment]]]] // name;part;type[:len][;[divisor|values][;[unit][;[comment]]]]
const string name = *it++; const string name = *it++;
@@ -152,7 +150,7 @@ result_t DataField::create(vector<string>::iterator& it,
firstName = name; firstName = name;
firstComment = comment; firstComment = comment;
} }
if (dstAddress == BROADCAST || isMaster(dstAddress) if (dstAddress == BROADCAST || isMaster(dstAddress) == true
|| (isTemplate == false && isSetMessage == true && partStr[0] == 0) || (isTemplate == false && isSetMessage == true && partStr[0] == 0)
|| strcasecmp(partStr, "M") == 0) { // master data || strcasecmp(partStr, "M") == 0) { // master data
partType = pt_masterData; partType = pt_masterData;
@@ -238,7 +236,7 @@ result_t DataField::create(vector<string>::iterator& it,
break; break;
} }
found = true; found = true;
result = templ->derive(name, comment, unit, partType, divisor, values, fields); result = templ->derive("", "", "", partType, divisor, values, fields);
if (result != RESULT_OK) if (result != RESULT_OK)
break; break;
} }
@@ -347,6 +345,16 @@ result_t DataField::create(vector<string>::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, result_t SingleDataField::read(SymbolString& masterData, unsigned char masterOffset,
SymbolString& slaveData, unsigned char slaveOffset, SymbolString& slaveData, unsigned char slaveOffset,
ostringstream& output, ostringstream& output,
@@ -365,7 +373,6 @@ result_t SingleDataField::read(SymbolString& masterData, unsigned char masterOff
default: default:
return RESULT_ERR_INVALID_ARG; // invalid part type return RESULT_ERR_INVALID_ARG; // invalid part type
} }
if (isIgnored() == true) { if (isIgnored() == true) {
if (offset + m_length > input.size()) { if (offset + m_length > input.size()) {
return RESULT_ERR_INVALID_ARG; return RESULT_ERR_INVALID_ARG;
@@ -431,6 +438,15 @@ result_t StringDataField::derive(string name, string comment,
return RESULT_OK; return RESULT_OK;
} }
void StringDataField::dump(ostream& output)
{
SingleDataField::dump(output);
if ((m_dataType.flags & ADJ) != 0)
output << ":" << static_cast<unsigned>(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, result_t StringDataField::readSymbols(SymbolString& input,
unsigned char baseOffset, ostringstream& output) unsigned char baseOffset, ostringstream& output)
{ {
@@ -633,6 +649,18 @@ bool NumericDataField::hasFullByteOffset(bool after)
|| (after == true && m_bitOffset + (m_bitCount % 8) >= 8); || (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<unsigned>(m_bitCount);
else
output << ":" << static_cast<unsigned>(m_length);
}
output << FIELD_SEPARATOR;
}
result_t NumericDataField::readRawValue(SymbolString& input, result_t NumericDataField::readRawValue(SymbolString& input,
unsigned char baseOffset, unsigned int& value) unsigned char baseOffset, unsigned int& value)
{ {
@@ -749,6 +777,13 @@ result_t NumberDataField::derive(string name, string comment,
return RESULT_OK; return RESULT_OK;
} }
void NumberDataField::dump(ostream& output)
{
NumericDataField::dump(output);
output << static_cast<unsigned>(m_divisor) << FIELD_SEPARATOR;
output << m_unit << FIELD_SEPARATOR << m_comment << FIELD_SEPARATOR;
}
result_t NumberDataField::readSymbols(SymbolString& input, result_t NumberDataField::readSymbols(SymbolString& input,
unsigned char baseOffset, ostringstream& output) unsigned char baseOffset, ostringstream& output)
{ {
@@ -881,6 +916,21 @@ result_t ValueListDataField::derive(string name, string comment,
return RESULT_OK; return RESULT_OK;
} }
void ValueListDataField::dump(ostream& output)
{
NumericDataField::dump(output);
bool first = true;
for (map<unsigned int, string>::iterator it = m_values.begin(); it != m_values.end(); it++) {
if (first == true)
first = false;
else
output << VALUE_SEPARATOR;
output << static_cast<unsigned>(it->first) << "=" << it->second;
}
output << FIELD_SEPARATOR;
output << m_unit << FIELD_SEPARATOR << m_comment << FIELD_SEPARATOR;
}
result_t ValueListDataField::readSymbols(SymbolString& input, result_t ValueListDataField::readSymbols(SymbolString& input,
unsigned char baseOffset, ostringstream& output) unsigned char baseOffset, ostringstream& output)
{ {
@@ -968,6 +1018,12 @@ result_t DataFieldSet::derive(string name, string comment,
return RESULT_OK; return RESULT_OK;
} }
void DataFieldSet::dump(ostream& output)
{
for (vector<SingleDataField*>::iterator it = m_fields.begin(); it < m_fields.end(); it++)
(*it)->dump(output);
}
result_t DataFieldSet::read(SymbolString& masterData, unsigned char masterOffset, result_t DataFieldSet::read(SymbolString& masterData, unsigned char masterOffset,
SymbolString& slaveData, unsigned char slaveOffset, SymbolString& slaveData, unsigned char slaveOffset,
ostringstream& output, bool verbose, char separator) ostringstream& output, bool verbose, char separator)
+17
View File
@@ -158,6 +158,11 @@ public:
* @return the field comment. * @return the field comment.
*/ */
string getComment() const { return m_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. * @brief Reads the value from the master or slave @a SymbolString.
* @param masterData the unescaped master data @a SymbolString for reading binary data. * @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. * only consumes a part of a byte and a subsequent field may re-use the same offset.
*/ */
virtual bool hasFullByteOffset(bool after) { return true; } virtual bool hasFullByteOffset(bool after) { return true; }
// @copydoc
virtual void dump(ostream& output);
/** /**
* @brief Reads the value from the master or slave @a SymbolString. * @brief Reads the value from the master or slave @a SymbolString.
* @param masterData the unescaped master data @a SymbolString for reading binary data. * @param masterData the unescaped master data @a SymbolString for reading binary data.
@@ -339,6 +346,8 @@ public:
string unit, const PartType partType, string unit, const PartType partType,
unsigned int divisor, map<unsigned int, string> values, unsigned int divisor, map<unsigned int, string> values,
vector<SingleDataField*>& fields); vector<SingleDataField*>& fields);
// @copydoc
virtual void dump(ostream& output);
protected: protected:
@@ -379,6 +388,8 @@ public:
virtual ~NumericDataField() {} virtual ~NumericDataField() {}
// @copydoc // @copydoc
virtual bool hasFullByteOffset(bool after); virtual bool hasFullByteOffset(bool after);
// @copydoc
virtual void dump(ostream& output);
protected: protected:
@@ -441,6 +452,8 @@ public:
string unit, const PartType partType, string unit, const PartType partType,
unsigned int divisor, map<unsigned int, string> values, unsigned int divisor, map<unsigned int, string> values,
vector<SingleDataField*>& fields); vector<SingleDataField*>& fields);
// @copydoc
virtual void dump(ostream& output);
protected: protected:
@@ -490,6 +503,8 @@ public:
string unit, const PartType partType, unsigned int divisor, string unit, const PartType partType, unsigned int divisor,
map<unsigned int, string> values, map<unsigned int, string> values,
vector<SingleDataField*>& fields); vector<SingleDataField*>& fields);
// @copydoc
virtual void dump(ostream& output);
protected: protected:
@@ -552,6 +567,8 @@ public:
*/ */
size_t size() const { return m_fields.size(); } size_t size() const { return m_fields.size(); }
// @copydoc // @copydoc
virtual void dump(ostream& output);
// @copydoc
virtual result_t read(SymbolString& masterData, unsigned char masterOffset, virtual result_t read(SymbolString& masterData, unsigned char masterOffset,
SymbolString& slaveData, unsigned char slaveOffset, SymbolString& slaveData, unsigned char slaveOffset,
ostringstream& output, ostringstream& output,