diff --git a/example.py b/example.py index 0ac0274..028bb73 100644 --- a/example.py +++ b/example.py @@ -2,13 +2,17 @@ import tdm_ripper import numpy as np import matplotlib.pyplot as plt -tdmpath = b"samples/SineData.tdm" -tdxpath = b"samples/SineData.tdx" +tdmpatha = b"samples/SineData.tdm" +tdxpatha = b"samples/SineData.tdx" +tdmpathb = b"/Users/mariofink/Downloads/CONTI_HBS_samples/config_id_1/001_Test_DIAdem/Messung.tdm" +tdxpathb = b"/Users/mariofink/Downloads/CONTI_HBS_samples/config_id_1/001_Test_DIAdem/Messung.tdx" + +tdmpathchz = tdmpathb +tdxpathchz = tdxpathb # create instance of ripper class # RP = tdm_ripper.pytdmripper(tdmpath) -RP = tdm_ripper.pytdmripper(tdmpath,tdxpath) -# RP = tdm_ripper.pytdmripper(b"/Users/mariofink/git/Conti_HBS/data_science/python/features/tdm_tmp_slow/75_1/Messung.tdm") +RP = tdm_ripper.pytdmripper(tdmpathchz,tdxpathchz) # provide overview of available channels RP.show_channels() @@ -22,6 +26,11 @@ for i in range(0,RP.num_groups()): # print particular channel to file RP.print_channel(1,b"SineData_extract.dat") +# show some meta information +print(RP.meta_info(b"SMP_Name").decode('utf-8')) +print(RP.meta_info(b"Location").decode('utf-8')) +print('\n') + # extract channel and return it to numpy array # channels = RP.get_channel(1) # Nlen = len(channels) diff --git a/lib/tdm_ripper.cpp b/lib/tdm_ripper.cpp index 1e6e495..99b07fe 100644 --- a/lib/tdm_ripper.cpp +++ b/lib/tdm_ripper.cpp @@ -112,10 +112,24 @@ void tdm_ripper::parse_structure() pugi::xml_node subtreedata = xml_doc_.child("usi:tdm").child("usi:data"); // extract basic information about available groups + int groupcount = 0; for (pugi::xml_node anode: subtreedata.children()) { if ( std::string(anode.name()).compare("tdm_channelgroup") == 0 ) { + groupcount++; + + // meta-info is pressumably contained in FIRST channel-group xml tree element + // (eventually identify by name = TESTINFOS ??? ) + if ( groupcount == 1 ) + { + for ( pugi::xml_node mnode: anode.child("instance_attributes").children() ) + { + meta_info_.insert(std::pair(mnode.attribute("name").value(), + mnode.child_value("s"))); + } + } + int numchann = count_occ_string(anode.child_value("channels"),"id"); if ( numchann > 0 || !neglect_empty_groups_ ) { @@ -183,6 +197,8 @@ void tdm_ripper::parse_structure() std::cout< meta_info_; + // binary data container std::vector tdxbuf_; @@ -250,18 +253,18 @@ public: } } - // evtl. get group time_stamp of .tdm file given in unix format + // get time-stamp of channel-group in .tdm file given in unix format static std::string unix_timestamp(std::string unixts) { // average year of Gregorian calender const double avgdaysofyear = 365.0 + 1./4 - 1./100 + 1./400 - 8./24561; // gauge timestamp according to DIADEM result - // convert string to long int = number of second since 0000/01/01 00:00 + // convert string to long int = number of seconds since 0000/01/01 00:00 long int ts = atol(unixts.c_str()); assert( ts >= 0 ); - // use STL to convert timestamp (epoch usually starts from 01.01.1970) + // use STL to convert timestamp (epoch usually starts on 01.01.1970) std::time_t tstime = ts - 1970*avgdaysofyear*86400; // get rid of linebreak character and return the result @@ -314,6 +317,12 @@ public: void print_channel(int channelid, const char* filename, int width = 15); + // obtain any meta information about .tdm-file if available + std::string get_meta(std::string attribute_name) + { + return meta_info_[attribute_name]; + } + // 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); diff --git a/main.cpp b/main.cpp index eb47811..4d358be 100644 --- a/main.cpp +++ b/main.cpp @@ -8,7 +8,7 @@ int main(int argc, char* argv[]) assert( argc > 1 && "please provide a filename and path" ); // declare and initialize tdm_ripper - tdm_ripper ripper(argv[1]); //,"samples/SineData.tdx",false); + tdm_ripper ripper(argv[1],argv[2],false); //,"samples/SineData.tdx",false); // ripper.list_datatypes(); // ripper.show_structure(); @@ -36,6 +36,11 @@ int main(int argc, char* argv[]) std::cout<<"number of channels "<