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;
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<string>::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<string>::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<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,
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<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,
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<unsigned>(m_bitCount);
else
output << ":" << static_cast<unsigned>(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<unsigned>(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<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,
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<SingleDataField*>::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)
+17
View File
@@ -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<unsigned int, string> values,
vector<SingleDataField*>& 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<unsigned int, string> values,
vector<SingleDataField*>& fields);
// @copydoc
virtual void dump(ostream& output);
protected:
@@ -490,6 +503,8 @@ public:
string unit, const PartType partType, unsigned int divisor,
map<unsigned int, string> values,
vector<SingleDataField*>& 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,