diff --git a/include/Field.h b/include/Field.h index 79b4ef8199684497b8f61fb137baaacfb1df052f..82c10d3a9f7d62bf94445d754025f16f9463864f 100644 --- a/include/Field.h +++ b/include/Field.h @@ -20,14 +20,13 @@ #include "PacketLibDefinition.h" #include <string> +#include <map> namespace PacketLib { enum LogicalFieldDataType { UNKNOWN, UINT1, UINT2, UINT3, UINT4, UINT5, UINT6, UINT7, UINT8, UINT9, UINT10, UINT11, UINT12, UINT13, UINT14, UINT15, UINT16, INT16, UINT24, INT24, UINT32, INT32, UINT64, INT64, FLOAT, DOUBLE, BYTEARRAY }; - - class FieldType { @@ -45,7 +44,7 @@ public: /// Name of the field. std::string name; - /// Logical type - NOT USED FOR NOW + /// Logical type enum LogicalFieldDataType type; }; @@ -57,7 +56,7 @@ class Field public: /// Constructor of class. - Field(std::string name, std::string dimension, std::string predefinedValue, int progressiv); + Field(std::string name, std::string typeStr, std::string dim, std::string prVal, int count); /// Destructor of class. ~Field(); @@ -102,16 +101,11 @@ public: void print(); - /// Get a description of the type (e.g. int32, 16, etc) and the number of bits of each single field - ///\param type (input) the type read from configuration file - ///\param outtype (output) the type as enum - ///\param outtypenfields (output) the number of physical fields equivalent to this logical field - ///\param outputfieldsbitsize (output) the number of bits of each single field - static void getType(char* type, enum LogicalFieldDataType &outtype, int &outtypenfields, int &outputfieldsbitsize); - - protected: + static std::map<std::string, LogicalFieldDataType> typeStringToEnum; + static std::map<std::string, LogicalFieldDataType> makeMap(); + /// Index of packet in the list of packet. int progressiv; diff --git a/src/Field.cpp b/src/Field.cpp index ed9bffc3c6e6baec2d08d78913d6056883054292..ad9af9385e6c89515225436b0120ab4381d3f9cb 100644 --- a/src/Field.cpp +++ b/src/Field.cpp @@ -23,7 +23,45 @@ using namespace PacketLib; static FieldType** filedTypeList = 0; -Field::Field(std::string n, std::string dim, std::string prVal, int count) : progressiv(count) +std::map<std::string, LogicalFieldDataType> Field::makeMap() +{ + std::map<std::string, LogicalFieldDataType> map; + + map[""] = UNKNOWN; + map["uint1"] = UINT1; + map["uint2"] = UINT2; + map["uint3"] = UINT3; + map["uint4"] = UINT4; + map["uint5"] = UINT5; + map["uint6"] = UINT6; + map["uint7"] = UINT7; + map["uint8"] = UINT8; + map["uint9"] = UINT9; + map["uint10"] = UINT10; + map["uint11"] = UINT11; + map["uint12"] = UINT12; + map["uint13"] = UINT13; + map["uint14"] = UINT14; + map["uint15"] = UINT15; + map["uint16"] = UINT16; + map["int16"] = INT16; + map["uint24"] = UINT24; + map["int24"] = INT24; + map["uint32"] = UINT32; + map["int32"] = INT32; + map["uint64"] = UINT64; + map["int64"] = INT64; + map["float"] = FLOAT; + map["double"] = DOUBLE; + map["bytes"] = BYTEARRAY; + + return map; +} + +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) + : progressiv(count) { value = 0; /// create FieldType list @@ -38,7 +76,7 @@ Field::Field(std::string n, std::string dim, std::string prVal, int count) : pro type = 0; while(filedTypeList[i] != 0) { - if(filedTypeList[i]->name == n) + if(filedTypeList[i]->name == name) { type = filedTypeList[i]; break; @@ -50,10 +88,11 @@ Field::Field(std::string n, std::string dim, std::string prVal, int count) : pro { type = new FieldType; filedTypeList[i] = type; - type->name = n; - type->dimension = atoi(dim.c_str()); + type->name = name; + type->dimension = atoi(dim.c_str()); + type->type = Field::typeStringToEnum[typeStr]; #ifdef DEBUG - std::cout << "Adding field '" << n << "' at index " << i << ", " << type->dimension << " bits" << std::endl; + std::cout << "Adding field '" << name << "' at index " << i << ", " << type->dimension << " bits type " << typeStr << " (" << type->type << ")" << std::endl; #endif if(prVal.compare("none") != 0) @@ -79,94 +118,3 @@ Field::~Field() void Field::print() { cout << progressiv << " " << getName() << " " << size() << endl; } - -void Field::getType(char* type, enum LogicalFieldDataType &outtype, int &outtypenfields, int &outputfieldsbitsize) { - outtype = UNKNOWN; - outputfieldsbitsize = 0; - outtypenfields = 0; - int dim = atoi(type); - if(dim == 0) { - //>= 16bit - outputfieldsbitsize = 16; - if(strcmp(type, "int16") == 0) { - outtypenfields = 1; - outtype = INT16; - } else if(strcmp(type, "uint16") == 0) { - outtypenfields = 1; - outtype = UINT16; - } else if(strcmp(type, "int32") == 0) { - outtypenfields = 2; - outtype = INT32; - } else if(strcmp(type, "uint32") == 0) { - outtypenfields = 2; - outtype = UINT32; - } else if(strcmp(type, "float") == 0) { - outtypenfields = 2; - outtype = FLOAT; - } else if(strcmp(type, "int64") == 0) { - outtypenfields = 4; - outtype = INT64; - } else if(strcmp(type, "uint64") == 0) { - outtypenfields = 4; - outtype = UINT64; - } else if(strcmp(type, "double") == 0) { - outtypenfields = 4; - outtype = DOUBLE; - } - } else { - //<=16 bit (unsigned) - outtypenfields = 1; - outputfieldsbitsize = dim; - switch(dim) { - case 1: - outtype = UINT1; - break; - case 2: - outtype = UINT2; - break; - case 3: - outtype = UINT3; - break; - case 4: - outtype = UINT4; - break; - case 5: - outtype = UINT5; - break; - case 6: - outtype = UINT6; - break; - case 7: - outtype = UINT7; - break; - case 8: - outtype = UINT8; - break; - case 9: - outtype = UINT9; - break; - case 10: - outtype = UINT10; - break; - case 11: - outtype = UINT11; - break; - case 12: - outtype = UINT12; - break; - case 13: - outtype = UINT13; - break; - case 14: - outtype = UINT14; - break; - case 15: - outtype = UINT15; - break; - case 16: - outtype = UINT16; - break; - } - } -} - diff --git a/src/PartOfPacket.cpp b/src/PartOfPacket.cpp index 749a48b4ed0f8bba87b04a01058ab5c369925844..df6590073bedfc95f8b5a8f0f598b54256698116 100644 --- a/src/PartOfPacket.cpp +++ b/src/PartOfPacket.cpp @@ -143,7 +143,7 @@ void PartOfPacket::loadFields(pugi::xml_node node) name = it->attribute("name").value(); dimension = "16"; value = "none"; - Field* f = new Field(name, dimension, value, numberOfFields); + Field* f = new Field(name, typeStr, dimension, value, numberOfFields); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; @@ -152,7 +152,7 @@ void PartOfPacket::loadFields(pugi::xml_node node) name += "__1"; dimension = "16"; value = "none"; - f = new Field(name, dimension, value, numberOfFields); + f = new Field(name, typeStr, dimension, value, numberOfFields); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; @@ -172,7 +172,7 @@ void PartOfPacket::loadFields(pugi::xml_node node) name = it->attribute("name").value(); dimension = "16"; value = "none"; - Field* f = new Field(name, dimension, value, numberOfFields); + Field* f = new Field(name, typeStr, dimension, value, numberOfFields); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; @@ -181,7 +181,7 @@ void PartOfPacket::loadFields(pugi::xml_node node) name += "__1"; dimension = "16"; value = "none"; - f = new Field(name, dimension, value, numberOfFields); + f = new Field(name, typeStr, dimension, value, numberOfFields); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; @@ -190,7 +190,7 @@ void PartOfPacket::loadFields(pugi::xml_node node) name += "__2"; dimension = "16"; value = "none"; - f = new Field(name, dimension, value, numberOfFields); + f = new Field(name, typeStr, dimension, value, numberOfFields); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; @@ -199,7 +199,7 @@ void PartOfPacket::loadFields(pugi::xml_node node) name += "__3"; dimension = "16"; value = "none"; - f = new Field(name, dimension, value, numberOfFields); + f = new Field(name, typeStr, dimension, value, numberOfFields); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; @@ -221,7 +221,7 @@ void PartOfPacket::loadFields(pugi::xml_node node) value = "none"; else value = constvalue.value(); - Field* f = new Field(name, dimension, value, numberOfFields); + Field* f = new Field(name, typeStr, dimension, value, numberOfFields); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; @@ -259,7 +259,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); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++; @@ -298,7 +298,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); fieldsDimension += f->size(); fields[numberOfFields] = f; numberOfFields++;