Skip to content
Snippets Groups Projects
Commit 66b8339c authored by Andrea Zoli's avatar Andrea Zoli
Browse files

Store fields section offsets.

parent 2c8b3276
No related branches found
No related tags found
No related merge requests found
...@@ -46,6 +46,9 @@ public: ...@@ -46,6 +46,9 @@ public:
/// Logical type /// Logical type
enum LogicalFieldDataType type; enum LogicalFieldDataType type;
int sectionOffsetBits;
int sectionOffsetBytes;
}; };
...@@ -56,7 +59,7 @@ class Field ...@@ -56,7 +59,7 @@ class Field
public: public:
/// Constructor of class. /// 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. /// Destructor of class.
~Field(); ~Field();
...@@ -101,6 +104,12 @@ public: ...@@ -101,6 +104,12 @@ public:
void print(); 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: protected:
static std::map<std::string, LogicalFieldDataType> typeStringToEnum; static std::map<std::string, LogicalFieldDataType> typeStringToEnum;
...@@ -110,7 +119,6 @@ protected: ...@@ -110,7 +119,6 @@ protected:
int progressiv; int progressiv;
FieldType * type; FieldType * type;
}; };
} }
......
...@@ -62,7 +62,7 @@ std::map<std::string, LogicalFieldDataType> Field::makeMap() ...@@ -62,7 +62,7 @@ std::map<std::string, LogicalFieldDataType> Field::makeMap()
std::map<std::string, LogicalFieldDataType> Field::typeStringToEnum = 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) : progressiv(count)
{ {
value = 0; value = 0;
...@@ -93,8 +93,10 @@ Field::Field(std::string name, std::string typeStr, std::string dim, std::string ...@@ -93,8 +93,10 @@ Field::Field(std::string name, std::string typeStr, std::string dim, std::string
type->name = name; type->name = name;
type->dimension = atoi(dim.c_str()); type->dimension = atoi(dim.c_str());
type->type = Field::typeStringToEnum[typeStr]; type->type = Field::typeStringToEnum[typeStr];
type->sectionOffsetBits = sectionOffset;
type->sectionOffsetBytes = (sectionOffset % 8) ? -1 : sectionOffset / 8;
#ifdef DEBUG #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 #endif
if(prVal.compare("none") != 0) if(prVal.compare("none") != 0)
......
...@@ -125,6 +125,7 @@ void PartOfPacket::loadFields(pugi::xml_node node) ...@@ -125,6 +125,7 @@ void PartOfPacket::loadFields(pugi::xml_node node)
fields = new Field*[count]; fields = new Field*[count];
// field parsing // field parsing
int sectionOffset = 0;
for(pugi::xml_node_iterator it=node.begin(); it != node.end(); ++it) for(pugi::xml_node_iterator it=node.begin(); it != node.end(); ++it)
{ {
if(string(it->name()).compare("field") != 0) if(string(it->name()).compare("field") != 0)
...@@ -143,19 +144,21 @@ void PartOfPacket::loadFields(pugi::xml_node node) ...@@ -143,19 +144,21 @@ void PartOfPacket::loadFields(pugi::xml_node node)
name = it->attribute("name").value(); name = it->attribute("name").value();
dimension = "16"; dimension = "16";
value = "none"; value = "none";
Field* f = new Field(name, typeStr, dimension, value, numberOfFields); Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
fieldsDimension += f->size(); fieldsDimension += f->size();
fields[numberOfFields] = f; fields[numberOfFields] = f;
numberOfFields++; numberOfFields++;
sectionOffset += 16;
name = it->attribute("name").value(); name = it->attribute("name").value();
name += "__1"; name += "__1";
dimension = "16"; dimension = "16";
value = "none"; value = "none";
f = new Field(name, typeStr, dimension, value, numberOfFields); f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
fieldsDimension += f->size(); fieldsDimension += f->size();
fields[numberOfFields] = f; fields[numberOfFields] = f;
numberOfFields++; numberOfFields++;
sectionOffset += 16;
found = true; found = true;
break; break;
...@@ -172,37 +175,41 @@ void PartOfPacket::loadFields(pugi::xml_node node) ...@@ -172,37 +175,41 @@ void PartOfPacket::loadFields(pugi::xml_node node)
name = it->attribute("name").value(); name = it->attribute("name").value();
dimension = "16"; dimension = "16";
value = "none"; value = "none";
Field* f = new Field(name, typeStr, dimension, value, numberOfFields); Field* f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
fieldsDimension += f->size(); fieldsDimension += f->size();
fields[numberOfFields] = f; fields[numberOfFields] = f;
numberOfFields++; numberOfFields++;
sectionOffset += 16;
name = it->attribute("name").value(); name = it->attribute("name").value();
name += "__1"; name += "__1";
dimension = "16"; dimension = "16";
value = "none"; value = "none";
f = new Field(name, typeStr, dimension, value, numberOfFields); f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
fieldsDimension += f->size(); fieldsDimension += f->size();
fields[numberOfFields] = f; fields[numberOfFields] = f;
numberOfFields++; numberOfFields++;
sectionOffset += 16;
name = it->attribute("name").value(); name = it->attribute("name").value();
name += "__2"; name += "__2";
dimension = "16"; dimension = "16";
value = "none"; value = "none";
f = new Field(name, typeStr, dimension, value, numberOfFields); f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
fieldsDimension += f->size(); fieldsDimension += f->size();
fields[numberOfFields] = f; fields[numberOfFields] = f;
numberOfFields++; numberOfFields++;
sectionOffset += 16;
name = it->attribute("name").value(); name = it->attribute("name").value();
name += "__3"; name += "__3";
dimension = "16"; dimension = "16";
value = "none"; value = "none";
f = new Field(name, typeStr, dimension, value, numberOfFields); f = new Field(name, typeStr, dimension, value, numberOfFields, sectionOffset);
fieldsDimension += f->size(); fieldsDimension += f->size();
fields[numberOfFields] = f; fields[numberOfFields] = f;
numberOfFields++; numberOfFields++;
sectionOffset += 16;
found = true; found = true;
break; break;
...@@ -221,10 +228,11 @@ void PartOfPacket::loadFields(pugi::xml_node node) ...@@ -221,10 +228,11 @@ void PartOfPacket::loadFields(pugi::xml_node node)
value = "none"; value = "none";
else else
value = constvalue.value(); 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(); fieldsDimension += f->size();
fields[numberOfFields] = f; fields[numberOfFields] = f;
numberOfFields++; numberOfFields++;
sectionOffset += atoi(dimension.c_str());
} }
} }
...@@ -259,7 +267,7 @@ bool PartOfPacket::loadFields(InputText& fp) throw(PacketException*) ...@@ -259,7 +267,7 @@ bool PartOfPacket::loadFields(InputText& fp) throw(PacketException*)
dimension = fp.getLine(); dimension = fp.getLine();
value = 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(); fieldsDimension += f->size();
fields[numberOfFields] = f; fields[numberOfFields] = f;
numberOfFields++; numberOfFields++;
...@@ -298,7 +306,7 @@ bool PartOfPacket::loadFields(MemoryBuffer* buffer) throw(PacketException*) ...@@ -298,7 +306,7 @@ bool PartOfPacket::loadFields(MemoryBuffer* buffer) throw(PacketException*)
{ {
dimension = buffer->getbuffer(); dimension = buffer->getbuffer();
value = 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(); fieldsDimension += f->size();
fields[numberOfFields] = f; fields[numberOfFields] = f;
numberOfFields++; numberOfFields++;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment