From b16539264fb97e7bb0aca535dd22c9ea308212a3 Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Tue, 30 Apr 2019 16:22:15 +0200 Subject: [PATCH] added units and excluced datatypes --- .gitignore | 1 + lib/tdm_ripper.cpp | 55 ++++++++++++++++++++++++++++++++-------------- lib/tdm_ripper.hpp | 4 +++- main.cpp | 2 +- pytdm_ripper.pyx | 2 -- 5 files changed, 43 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index 8977592..bfe4b89 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ build/ *.o *.a *.dat +data/ diff --git a/lib/tdm_ripper.cpp b/lib/tdm_ripper.cpp index dd586ea..bd8f5f7 100644 --- a/lib/tdm_ripper.cpp +++ b/lib/tdm_ripper.cpp @@ -3,7 +3,7 @@ tdm_ripper::tdm_ripper(std::string tdmfile, std::string tdxfile): tdmfile_(tdmfile), tdxfile_(tdxfile), num_channels_(0), num_groups_(0), - channel_id_(0), inc_id_(0), group_id_(0), channel_name_(0), group_name_(0), + channel_id_(0), inc_id_(0), units_(0), channel_name_(0), group_id_(0), group_name_(0), num_channels_group_(0), channels_group_(0), channel_ext_(0), minmax_(0), byteoffset_(0), length_(0), type_(0), external_id_(0) { @@ -118,14 +118,16 @@ void tdm_ripper::parse_structure() if ( groupid.find(group_id_[g]) != std::string::npos ) channels_group_.push_back(g+1); } + // obtain measurement unit of channel + units_.push_back(anode.child_value("unit_string")); + if ( (*(units_.end()-1)).compare("°C") == 0 ) (*(units_.end()-1)) = "deg. Celsius"; + // obtain minimum/maximum of channel std::pair minmaxchan(atof(anode.child_value("minimum")), atof(anode.child_value("maximum"))); minmax_.push_back(minmaxchan); - // TODO correct order of channels w.r.t. to list of offset, length and type by - // considering the xpointer id's !!!! - // follow xpointers to get external id + // get correct assignment of channels to byteoffset, length and datatype std::string locol = get_str_between(anode.child_value("local_columns"),"\"","\""); std::string locolval; for (pugi::xml_node anode: subtreedata.children()) @@ -145,7 +147,6 @@ void tdm_ripper::parse_structure() locolvalext = anode.child("values").attribute("external").value(); } } - // std::cout< tdm_ripper::convert_channel(int channelid) std::vector cseg(tdxbuf_.begin()+byteoffset+i*typesize, tdxbuf_.begin()+byteoffset+(i+1)*typesize); - if ( type_[channelid-1].compare("eInt32Usi") == 0 ) chann[i] = convert_int(cseg); - if ( type_[channelid-1].compare("eFloat64Usi") == 0 ) chann[i] = convert_double(cseg); - - // check if converted value is within expected range - // if ( chann[i] < minmax_[channelid-1].first || chann[i] > minmax_[channelid-1].second ) std::cout<= minmax_[channelid-1].first && chann[i] <= minmax_[channelid-1].second ); + if ( type_[channelid-1].compare("eInt32Usi") == 0 ) + { + chann[i] = convert_int(cseg); + } + else if ( type_[channelid-1].compare("eFloat64Usi") == 0 ) + { + chann[i] = convert_double(cseg); + } + else + { + assert( false && "datatype not supported!" ); + } } return chann; @@ -385,7 +397,16 @@ std::vector tdm_ripper::get_channel(int channelid) { assert( channelid > 0 && channelid <= num_channels_ && "please provide valid channel id" ); - return convert_channel(channel_ext_[channelid-1]); + std::vector chann = convert_channel(channel_ext_[channelid-1]); + + // check if converted value is within expected range + for ( int i = 0; i < (int)chann.size(); i++ ) + { + assert( chann[i] >= minmax_[channelid-1].first - 1.0e-10 + && chann[i] <= minmax_[channelid-1].second + 1.0e-10 ); + } + + return chann; } void tdm_ripper::print_channel(int channelid, const char* filename, int width) diff --git a/lib/tdm_ripper.hpp b/lib/tdm_ripper.hpp index 94e11bf..bdffe7c 100644 --- a/lib/tdm_ripper.hpp +++ b/lib/tdm_ripper.hpp @@ -25,10 +25,12 @@ class tdm_ripper // number/names/ids of channels, channelgroups and channels's assignment to groups int num_channels_, num_groups_; - std::vector channel_id_, inc_id_, group_id_, channel_name_, group_name_; + std::vector channel_id_, inc_id_, units_, channel_name_; + std::vector group_id_, group_name_; std::vector num_channels_group_; std::vector channels_group_; std::vector channel_ext_; + // evtl. get group time_stamp of .tdm file in the unix format, i.e. #seconds since 01.01.0000 with average year having 365+97/400 = 365.2425 days // minimum/maximum value in particular channel (is provided in .tdm file as float) std::vector> minmax_; diff --git a/main.cpp b/main.cpp index 02e578d..6368899 100644 --- a/main.cpp +++ b/main.cpp @@ -10,7 +10,7 @@ int main(int argc, char* argv[]) // declare and initialize tdm_ripper tdm_ripper ripper(argv[1]); - ripper.list_datatypes(); + // ripper.list_datatypes(); // int sn = -76476; // std::vector bych = ripper.convert_int(sn); diff --git a/pytdm_ripper.pyx b/pytdm_ripper.pyx index a1f9e8e..e9c4ebb 100644 --- a/pytdm_ripper.pyx +++ b/pytdm_ripper.pyx @@ -35,5 +35,3 @@ cdef class pytdmripper: # .channel_name(i, j) # .channel(i, j) # .close() - # - # evtl. get time_stamp of .tdm file in the unix format, i.e. #seconds since 01.01.0000 with average year having 365+97/400 = 365.2425 days