From 4b337722bccf684c673187977ac1315f1192047e Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Tue, 26 Jan 2021 19:08:31 +0100 Subject: [PATCH] activate support for implicit_linear/raw_linear representation --- lib/tdm_datamodel.hpp | 17 ++ lib/tdm_datatype.hpp | 2 +- lib/tdm_format.hpp | 14 ++ lib/tdm_reaper.cpp | 54 ++++- lib/tdm_reaper.hpp | 31 +++ samples/SineData_implicit.tdm | 377 ++++++++++++++++++++++++++++++++++ 6 files changed, 489 insertions(+), 6 deletions(-) create mode 100755 samples/SineData_implicit.tdm diff --git a/lib/tdm_datamodel.hpp b/lib/tdm_datamodel.hpp index 76c4389..bb87e43 100644 --- a/lib/tdm_datamodel.hpp +++ b/lib/tdm_datamodel.hpp @@ -302,6 +302,22 @@ struct localcolumn { std::string values_; // -> refers to usi:data -> _sequence std::string external_id_; + localcolumn () { + id_ = std::string(""); + name_ = std::string(""); + description_ = std::string(""); + measurement_quantity_ = std::string(""); + submatrix_ = std::string(""); + global_flag_ = 15; + independent_ = 0; + minimum_ = 0.0; + maximum_ = 0.0; + sequence_representation_ = std::string("explicit"); + generation_parameters_ = { 0.0, 1.0 }; + values_ = std::string(""); + external_id_ = std::string(""); + } + const std::string get_info() { return get_info(defformat); } const std::string get_info(format& formatter) { @@ -313,6 +329,7 @@ struct localcolumn { std::make_pair("minimum",std::to_string(minimum_)), std::make_pair("maximum",std::to_string(maximum_)), std::make_pair("sequence_representation",sequence_representation_), + std::make_pair("generation_parameters",join(generation_parameters_)), std::make_pair("values",values_), std::make_pair("external",external_id_) }); diff --git a/lib/tdm_datatype.hpp b/lib/tdm_datatype.hpp index d0d196f..bc0a3c4 100644 --- a/lib/tdm_datatype.hpp +++ b/lib/tdm_datatype.hpp @@ -107,7 +107,7 @@ public: // obtain number as double double as_double() { - double num; + double num = 0.0; if ( dtidx_ == 0 ) num = (double)sint16_; else if ( dtidx_ == 1 ) num = (double)sint32_; else if ( dtidx_ == 2 ) num = (double)uint8_; diff --git a/lib/tdm_format.hpp b/lib/tdm_format.hpp index c4e3e4e..a4931ee 100644 --- a/lib/tdm_format.hpp +++ b/lib/tdm_format.hpp @@ -100,6 +100,20 @@ static std::string join_strings(std::vector &thestring, const char* return joined; } +// join a list of numbers +template +static std::string join(std::vector &thevec, const char* sep = " ") +{ + std::string joined; + for ( unsigned int i = 0; i < thevec.size(); i++ ) + { + joined += std::to_string(thevec.at(i)); + if ( i+1 < thevec.size() ) joined += std::string(sep); + } + + return joined; +} + #endif // -------------------------------------------------------------------------- // diff --git a/lib/tdm_reaper.cpp b/lib/tdm_reaper.cpp index 9240fab..aca0124 100644 --- a/lib/tdm_reaper.cpp +++ b/lib/tdm_reaper.cpp @@ -352,8 +352,22 @@ void tdm_reaper::process_localcolumns(bool showlog, pugi::xml_document& xml_doc) lcmax = lcmax.empty() ? std::string("0.0") : lcmax; locc.maximum_ = std::stod(lcmax); locc.sequence_representation_ = loccol.child_value("sequence_representation"); - // TODO - // .... loccal.child_value("generation_parameters"); + std::string genpar = loccol.child_value("generation_parameters"); + // check for any given generation parameters (applies to 'implicit_linear' channels only) + if ( !genpar.empty() ) + { + // check for two floats + std::vector params = this->split(genpar,std::string(" ")); + if ( params.size() == 2 ) + { + // remove default elements and insert new numbers + locc.generation_parameters_.clear(); + for ( std::string el: params ) + { + locc.generation_parameters_.push_back(std::stod(el)); + } + } + } std::vector vl = this->extract_ids(loccol.child_value("values")); if ( vl.size() == 1 ) @@ -541,10 +555,13 @@ std::vector tdm_reaper::get_channel(std::string& id) } localcolumn loccol = localcolumns_.at(chn.local_columns_[0]); - if ( loccol.sequence_representation_ != "explicit" ) + // check sequence_representation + if ( loccol.sequence_representation_ != "explicit" + && loccol.sequence_representation_ != "implicit_linear" + && loccol.sequence_representation_ != "raw_linear" ) { throw std::runtime_error(std::string("unsupported sequence_representation: ") - + loccol.sequence_representation_); + + loccol.sequence_representation_ ); } // use "values" id to map to external block @@ -598,6 +615,26 @@ std::vector tdm_reaper::get_channel(std::string& id) throw std::runtime_error(std::string("unsupported/unknown datatype") + blk.value_type_); } + // apply offset and factor for implicit_linear and raw_linear representation + if ( loccol.sequence_representation_ == "implicit_linear" + || loccol.sequence_representation_ == "raw_linear" ) + { + // datatype has to be 'DT_DOUBLE' for these representations + if ( chn.datatype_ != std::string("DT_DOUBLE") ) + { + throw std::runtime_error( std::string("inconsistent sequence_representation and datatype: ") + + chn.id_ + std::string(",") + loccol.sequence_representation_ + + std::string(",") + chn.datatype_ ); + } + + // scale and shift channel + for ( auto &el: datavec ) + { + el = loccol.generation_parameters_[0] + + el.as_double()*loccol.generation_parameters_[1]; + } + } + return datavec; } else @@ -754,7 +791,14 @@ void tdm_reaper::print_group(std::string &id, const char* filename, bool include } else { - fou< split(std::string fullstring, std::string delstr) + { + // declare array of resulting strings + std::vector splitstrings(0); + + // parse input string for substring + while ( fullstring.find(delstr) != std::string::npos ) + { + // find first occurence of delimiting string in 'mystring' + std::size_t delpos = fullstring.find(delstr); + + // extract substring + std::string stringel = fullstring.substr(0,delpos); + + // append first word to array + if ( !stringel.empty() ) + { + splitstrings.push_back(stringel); + } + + // remove first word from 'fullstring' + fullstring = fullstring.substr(delpos+delstr.size(),fullstring.size()); + } + + // append last word to array + splitstrings.push_back(fullstring); + + return splitstrings; + } + public: // encoding diff --git a/samples/SineData_implicit.tdm b/samples/SineData_implicit.tdm new file mode 100755 index 0000000..244252a --- /dev/null +++ b/samples/SineData_implicit.tdm @@ -0,0 +1,377 @@ + + + + + National Instruments USI + 1.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SineData.TDM + Sine signals of various amplitudes and frequencies. + SineData + National Instruments + 2008-05-06T17:20:12.65074539184570313 + #xpointer(id("usi12") id("usi13")) + + + Amplitudes + Sine Signals of various amplitudes. + #xpointer(id("usi11")) + + 1 + + #xpointer(id("usi14") id("usi15") id("usi16") id("usi17") id("usi18")) + #xpointer(id("usi24") id("usi25") id("usi26") id("usi27") id("usi28")) + + + Frequencies + Sine signals of various frequencies. + #xpointer(id("usi11")) + + 1 + + #xpointer(id("usi19") id("usi20") id("usi21") id("usi22") id("usi23")) + #xpointer(id("usi29") id("usi30") id("usi31") id("usi32") id("usi33")) + + + A = 1 + #xpointer(id("usi12")) + DT_DOUBLE + -0.999997146387718 + 0.999999682931835 + + 0 + 1000 + 10 + + #xpointer(id("usi34")) + + + A = 2 + #xpointer(id("usi12")) + DT_DOUBLE + -1.99999429277544 + 1.99999936586367 + + 1 + 1000 + 10 + + #xpointer(id("usi35")) + + + A = 4 + #xpointer(id("usi12")) + DT_DOUBLE + -3.99998858555087 + 3.99999873172734 + + 2 + 1000 + 10 + + #xpointer(id("usi36")) + + + A = 8 + #xpointer(id("usi12")) + DT_DOUBLE + -7.99997717110174 + 7.99999746345468 + + 3 + 1000 + 10 + + #xpointer(id("usi37")) + + + A = 16 + #xpointer(id("usi12")) + DT_DOUBLE + -15.9999543422035 + 15.9999949269094 + + 4 + 1000 + 10 + + #xpointer(id("usi38")) + + + F = 1 + #xpointer(id("usi13")) + DT_DOUBLE + -0.999997146387718 + 0.999999682931835 + + 0 + 1000 + 10 + + #xpointer(id("usi39")) + + + F = 2 + #xpointer(id("usi13")) + DT_DOUBLE + -0.999999230697499 + 0.999995986891472 + + 1 + 1000 + 10 + + #xpointer(id("usi40")) + + + F = 4 + #xpointer(id("usi13")) + DT_DOUBLE + -0.999999230697499 + 0.99994907791452 + + 2 + 1000 + 10 + + #xpointer(id("usi41")) + + + F = 8 + #xpointer(id("usi13")) + DT_DOUBLE + -0.999999230697499 + 0.999996490345607 + + 3 + 1000 + 10 + + #xpointer(id("usi42")) + + + F = 16 + #xpointer(id("usi13")) + DT_DOUBLE + -0.999999230697499 + 0.999993076284592 + + 4 + 1000 + 10 + + #xpointer(id("usi43")) + + + Untitled + #xpointer(id("usi12")) + 1000 + #xpointer(id("usi34")) + + + Untitled + #xpointer(id("usi12")) + 1000 + #xpointer(id("usi35")) + + + Untitled + #xpointer(id("usi12")) + 1000 + #xpointer(id("usi36")) + + + Untitled + #xpointer(id("usi12")) + 1000 + #xpointer(id("usi37")) + + + Untitled + #xpointer(id("usi12")) + 1000 + #xpointer(id("usi38")) + + + Untitled + #xpointer(id("usi13")) + 1000 + #xpointer(id("usi39")) + + + Untitled + #xpointer(id("usi13")) + 1000 + #xpointer(id("usi40")) + + + Untitled + #xpointer(id("usi13")) + 1000 + #xpointer(id("usi41")) + + + Untitled + #xpointer(id("usi13")) + 1000 + #xpointer(id("usi42")) + + + Untitled + #xpointer(id("usi13")) + 1000 + #xpointer(id("usi43")) + + + Untitled + #xpointer(id("usi14")) + #xpointer(id("usi24")) + 15 + 0 + implicit_linear + -0.5 1.2 + #xpointer(id("usi1")) + + + Untitled + #xpointer(id("usi15")) + #xpointer(id("usi25")) + 15 + 0 + implicit_linear + -0.5 1.2 + #xpointer(id("usi2")) + + + Untitled + #xpointer(id("usi16")) + #xpointer(id("usi26")) + 15 + 0 + implicit_linear + -0.5 1.2 + #xpointer(id("usi3")) + + + Untitled + #xpointer(id("usi17")) + #xpointer(id("usi27")) + 15 + 0 + implicit_linear + -0.5 1.2 + #xpointer(id("usi4")) + + + Untitled + #xpointer(id("usi18")) + #xpointer(id("usi28")) + 15 + 0 + implicit_linear + -0.5 1.2 + #xpointer(id("usi5")) + + + Untitled + #xpointer(id("usi19")) + #xpointer(id("usi29")) + 15 + 0 + implicit_linear + -0.5 1.2 + #xpointer(id("usi6")) + + + Untitled + #xpointer(id("usi20")) + #xpointer(id("usi30")) + 15 + 0 + implicit_linear + -0.5 1.2 + #xpointer(id("usi7")) + + + Untitled + #xpointer(id("usi21")) + #xpointer(id("usi31")) + 15 + 0 + implicit_linear + -0.0 1.0 + #xpointer(id("usi8")) + + + Untitled + #xpointer(id("usi22")) + #xpointer(id("usi32")) + 15 + 0 + explicit + #xpointer(id("usi9")) + + + Untitled + #xpointer(id("usi23")) + #xpointer(id("usi33")) + 15 + 0 + implicit_linear + #xpointer(id("usi10")) + + + +