diff --git a/include/Field.h b/include/Field.h index 82c10d3a9f7d62bf94445d754025f16f9463864f..4ce4f8ed00420e49533c39893293e0a6f23aa4ca 100644 --- a/include/Field.h +++ b/include/Field.h @@ -46,6 +46,9 @@ public: /// Logical type enum LogicalFieldDataType type; + + int sectionOffsetBits; + int sectionOffsetBytes; }; @@ -56,7 +59,7 @@ class Field public: /// Constructor of class. - Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count); + Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count, int sectionOffset); /// Destructor of class. ~Field(); @@ -100,7 +103,13 @@ public: }; void print(); - + + /// Returns the offset in bytes of the field from the begin of the section. + /// Warning: if the field is not aligned to 8-bit this method returns -1. + int getSectionOffset() { + return type->sectionOffsetBytes; + } + protected: static std::map<std::string, LogicalFieldDataType> typeStringToEnum; @@ -110,7 +119,6 @@ protected: int progressiv; FieldType * type; - }; } diff --git a/src/Field.cpp b/src/Field.cpp index 5d5f0c15c0c9c7ac15c50ca7af70f82d346fcf67..360dc66d971ad3780e79e33c2090ca90a98a9984 100644 --- a/src/Field.cpp +++ b/src/Field.cpp @@ -62,7 +62,7 @@ std::map<std::string, LogicalFieldDataType> Field::makeMap() std::map<std::string, LogicalFieldDataType> Field::typeStringToEnum = Field::makeMap(); -Field::Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count) +Field::Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count, int sectionOffset) : progressiv(count) { value = 0; @@ -93,8 +93,10 @@ Field::Field(std::string name, std::string typeStr, std::string dim, std::string type->name = name; type->dimension = atoi(dim.c_str()); type->type = Field::typeStringToEnum[typeStr]; + type->sectionOffsetBits = sectionOffset; + type->sectionOffsetBytes = (sectionOffset % 8) ? -1 : sectionOffset / 8; #ifdef DEBUG - std::cout << "Adding field '" << name << "', " << type->dimension << " bits type " << typeStr << " (" << type->type << ")" << std::endl; + std::cout << "Adding field '" << name << "', " << type->dimension << " bits type " << typeStr << " (" << type->type << ")" << " section offset " << type->sectionOffsetBits << " " << type->sectionOffsetBytes << std::endl; #endif if(prVal.compare("none") != 0) diff --git a/src/PartOfPacket.cpp b/src/PartOfPacket.cpp index b920659cafc75d1af9c35bd3f14a43bf8862cab0..ef09237d7f5531801c2d09c34ce1b7c4a6f10a01 100644 --- a/src/PartOfPacket.cpp +++ b/src/PartOfPacket.cpp @@ -125,6 +125,7 @@ void PartOfPacket::loadFields(pugi::xml_node node) fields = new Field*[count]; // field parsing + int sectionOffset = 0; for(pugi::xml_node_iterator it=node.begin(); it != node.end(); ++it) { if(string(it->name()).compare("field") != 0) @@ -143,19 +144,21 @@ void PartOfPacket::loadFields(pugi::xml_node node) name = it->attribute("name").value(); dimension = "16"; value = "none"; - Field* f = new Field(name, typeStr, dimension, value, numberOfFields); + Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; + sectionOffset += 16; name = it->attribute("name").value(); name += "__1"; dimension = "16"; value = "none"; - f = new Field(name, typeStr, dimension, value, numberOfFields); + f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; + sectionOffset += 16; found = true; break; @@ -172,37 +175,41 @@ void PartOfPacket::loadFields(pugi::xml_node node) name = it->attribute("name").value(); dimension = "16"; value = "none"; - Field* f = new Field(name, typeStr, dimension, value, numberOfFields); + Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; + sectionOffset += 16; name = it->attribute("name").value(); name += "__1"; dimension = "16"; value = "none"; - f = new Field(name, typeStr, dimension, value, numberOfFields); + f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; + sectionOffset += 16; name = it->attribute("name").value(); name += "__2"; dimension = "16"; value = "none"; - f = new Field(name, typeStr, dimension, value, numberOfFields); + f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; + sectionOffset += 16; name = it->attribute("name").value(); name += "__3"; dimension = "16"; value = "none"; - f = new Field(name, typeStr, dimension, value, numberOfFields); + f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; + sectionOffset += 16; found = true; break; @@ -221,10 +228,11 @@ void PartOfPacket::loadFields(pugi::xml_node node) value = "none"; else value = constvalue.value(); - Field* f = new Field(name, typeStr, dimension, value, numberOfFields); + Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; + sectionOffset += atoi(dimension.c_str()); } } @@ -259,7 +267,7 @@ bool PartOfPacket::loadFields(InputText& fp) throw(PacketException*) dimension = fp.getLine(); value = fp.getLine(); - Field* f = new Field(name, "", dimension, value, numberOfFields); + Field* f = new Field(name, "", dimension, value, numberOfFields, -1); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; @@ -298,7 +306,7 @@ bool PartOfPacket::loadFields(MemoryBuffer* buffer) throw(PacketException*) { dimension = buffer->getbuffer(); value = buffer->getbuffer(); - Field* f = new Field(name, "", dimension, value, numberOfFields); + Field* f = new Field(name, "", dimension, value, numberOfFields, -1); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++;