do not override name when referencing templates, added DataField::dump()
This commit is contained in:
+61
-5
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user