From 9f2deae08af7e73a2967600ddf2d7a03c8b311ce Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Fri, 26 Apr 2019 17:52:17 +0200 Subject: [PATCH] started conversion of eInt types --- lib/tdm_ripper.cpp | 127 +++++++++++++++++++++++++++++---------------- lib/tdm_ripper.hpp | 19 +++++-- main.cpp | 15 ++++-- makefile | 1 + 4 files changed, 109 insertions(+), 53 deletions(-) diff --git a/lib/tdm_ripper.cpp b/lib/tdm_ripper.cpp index 21133b7..fad99d6 100644 --- a/lib/tdm_ripper.cpp +++ b/lib/tdm_ripper.cpp @@ -7,7 +7,6 @@ tdm_ripper::tdm_ripper(std::string tdmfile, std::string tdxfile): num_channels_group_(0), channels_group_(0), byteoffset_(0), length_(0), type_(0) { - // TODO directly provide the C datatype to be used!! datatypes_ = { {"eInt8Usi",8}, {"eInt16Usi",16}, @@ -128,55 +127,55 @@ void tdm_ripper::parse_structure() && num_channels_ == (int)channels_group_.size() ); } -void tdm_ripper::show_channels(int width, int maxshow) +void tdm_ripper::list_channels(std::ostream& gout, int width, int maxshow) { - std::cout< maxshow ) { for ( int i = num_channels_-maxshow; i < num_channels_; i++ ) { - std::cout< bych) +{ + assert( bych.size() == sizeof(int) ); + assert( endianness_ ); + + int df = 0.0; + + uint8_t *dfcast = reinterpret_cast(&df); + + for ( int i = 0; i < (int)sizeof(int); i++ ) + { + dfcast[i] = (int)bych[i]; + } + + return df; +} + // convert array of chars to floating point double -double tdm_ripper::convert_float(std::vector bych) +double tdm_ripper::convert_double(std::vector bych) { assert( bych.size() == sizeof(double) ); assert( endianness_ ); @@ -254,15 +288,19 @@ double tdm_ripper::convert_float(std::vector bych) return df; } -std::vector tdm_ripper::convert_channel(int byteoffset, int length, int typesize) +std::vector tdm_ripper::convert_channel(int byteoffset, int length, std::string type) { std::vector chann(length); + int typesize = datatypes_[type]/CHAR_BIT; + for ( int i = 0; i < length; i++ ) { std::vector cseg(tdxbuf_.begin()+byteoffset+i*typesize, tdxbuf_.begin()+byteoffset+(i+1)*typesize); - chann[i] = convert_float(cseg); + + if ( type.compare("eInt32Usi") == 0 ) chann[i] = convert_int(cseg); + if ( type.compare("eFloat64Usi") == 0 ) chann[i] = convert_double(cseg); } return chann; @@ -272,8 +310,9 @@ std::vector tdm_ripper::get_channel(int channelid) { assert( channelid > 0 && channelid <= num_channels_ && "please provide valid channel id" ); - return convert_channel(byteoffset_[channelid-1],length_[channelid-1], - datatypes_[type_[channelid-1]]/CHAR_BIT); + return convert_channel(byteoffset_[channelid-1],length_[channelid-1],type_[channelid-1]); + // return convert_channel(byteoffset_[channelid-1],length_[channelid-1], + // datatypes_[type_[channelid-1]]/CHAR_BIT); } 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 045af87..82357d7 100644 --- a/lib/tdm_ripper.hpp +++ b/lib/tdm_ripper.hpp @@ -48,7 +48,7 @@ public: void parse_structure(); - void show_channels(int width = 15, int maxshow = 300); + void list_channels(std::ostream& gout = std::cout, int width = 15, int maxshow = 300); void show_structure(); @@ -77,16 +77,27 @@ public: return num_groups_; } - // convert array of chars to single floating point double - double convert_float(std::vector bych); + void list_datatypes(); + + // convert array of chars to single integer or floating point double + int convert_int(std::vector bych); + double convert_double(std::vector bych); // convert entire channel, i.e. expert of .tdx binary file - std::vector convert_channel(int byteoffset, int length, int typesize); + // std::vector convert_channel(int byteoffset, int length, int typesize); + std::vector convert_channel(int byteoffset, int length, std::string type); std::vector get_channel(int channelid); void print_channel(int channelid, const char* filename, int width = 15); + // TODO add elements/methods to build .tdm and write .tdx files for your own data + // by constructing xml document tree and write data to binary .tdx + // void set_channels(std::vector channels); + // void set_groups(std::vector groups); + // void set_assigment(std::vector assignment); + // void set_channel(int i, std::vector data); + }; #endif diff --git a/main.cpp b/main.cpp index 7a44b84..7086acb 100644 --- a/main.cpp +++ b/main.cpp @@ -10,17 +10,22 @@ int main(int argc, char* argv[]) // declare and initialize tdm_ripper tdm_ripper ripper(argv[1]); - ripper.show_channels(); + ripper.list_datatypes(); + + ripper.list_channels(); + std::ofstream fout("list_of_channels.dat"); + ripper.list_channels(fout); + fout.close(); // ripper.show_structure(); std::cout<<"number of channels "< channA = ripper.get_channel(9); - // for ( auto el: channA ) std::cout< channA = ripper.get_channel(1); + for ( auto el: channA ) std::cout<