From 050256763c668e4ca9701472e7cb876e11df9a41 Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Tue, 19 Oct 2021 19:48:44 +0200 Subject: [PATCH] * improve runtime detection of endianness * support decoding of TDM/TDX data with endianness mismatch w.r.t. architecture => issue #16 * generate/provide bigEndian TDM/TDX example --- lib/tdm_termite.cpp | 37 +++- lib/tdm_termite.hpp | 24 +++ samples/SineData-be.tdm | 369 ++++++++++++++++++++++++++++++++++++++ samples/SineData-be.tdx | Bin 0 -> 80000 bytes samples/swapbyteorder.cpp | 63 +++++++ 5 files changed, 488 insertions(+), 5 deletions(-) create mode 100755 samples/SineData-be.tdm create mode 100644 samples/SineData-be.tdx create mode 100644 samples/swapbyteorder.cpp diff --git a/lib/tdm_termite.cpp b/lib/tdm_termite.cpp index c7ab374..b9d423d 100644 --- a/lib/tdm_termite.cpp +++ b/lib/tdm_termite.cpp @@ -194,12 +194,31 @@ void tdm_termite::process_include(bool showlog, pugi::xml_document& xml_doc) // check endianness std::string endianness(tdmincl.child("file").attribute("byteOrder").value()); - endianness_ = endianness.compare("littleEndian") == 0 ? true : false; + // endianness_ = endianness.compare("littleEndian") == 0 ? true : false; + if ( endianness.compare("littleEndian") == 0 ) + { + endianness_ = true; + } + else if ( endianness.compare("bigEndian") == 0 ) + { + endianness_ = false; + } + else + { + throw std::runtime_error(std::string("unsupported endianness: ") + endianness); + } // obtain machine's endianness - int num = 1; - machine_endianness_ = ( *(char*)&num == 1 ); - if ( machine_endianness_ != endianness_ ) throw std::runtime_error("endianness mismatch"); + machine_endianness_ = this->detect_endianness(); + // if ( machine_endianness_ != endianness_ ) + // { + // std::stringstream ss; + // ss<<"endianness mismatch: "<<"TDM = "<<(endianness_?"little":"big") + // <<" , " + // <<"Arch = "<<(machine_endianness_?"little":"big"); + // // std::cout< &buffer, for ( unsigned long int j = 0; j < sizeof(datatype); j++ ) { - dfcast[j] = (int)buffer[i*sizeof(datatype)+j]; + // matching byte order between TDM/TDX and machine's architecture ? + if ( machine_endianness_ == endianness_ ) + { + dfcast[j] = (int)buffer[i*sizeof(datatype)+j]; + } + else + { + dfcast[j] = (int)buffer[(i+1)*sizeof(datatype)-(j+1)]; + } } // save number in channel diff --git a/lib/tdm_termite.hpp b/lib/tdm_termite.hpp index 2b09e36..375ef78 100644 --- a/lib/tdm_termite.hpp +++ b/lib/tdm_termite.hpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "pugixml.hpp" #include "tdm_datamodel.hpp" @@ -64,6 +65,29 @@ class tdm_termite std::vector tdxbuffer_; std::ifstream *tdx_ifstream_; + // find machine's endianness at runtime + // detect machine endianness (C++20 !!) + // if ( std::endian::native == std::endian::little ) + // { + // machine_endianness_ = true; + // } + // else if ( std::endian::native == std::endian::big ) + // { + // machine_endianness_ = false; + // } + // else + // { + // throw std::runtime_error("mixed endianness architecture is not supported"); + // } + bool detect_endianness() + { + // int num = 1; + // machine_endianness_ = ( *(char*)&num == 1 ); + std::uint32_t num = 0x11223344; + uint8_t* dfc = reinterpret_cast(&num); + return ( dfc[0] == 0x44 ); + } + // extract list of identifiers from e.g. "#xpointer(id("usi12") id("usi13"))" std::vector extract_ids(std::string idstring) { diff --git a/samples/SineData-be.tdm b/samples/SineData-be.tdm new file mode 100755 index 0000000..4b5e97b --- /dev/null +++ b/samples/SineData-be.tdm @@ -0,0 +1,369 @@ + + + + + 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 + explicit + #xpointer(id("usi1")) + + + Untitled + #xpointer(id("usi15")) + #xpointer(id("usi25")) + 15 + 0 + explicit + #xpointer(id("usi2")) + + + Untitled + #xpointer(id("usi16")) + #xpointer(id("usi26")) + 15 + 0 + explicit + #xpointer(id("usi3")) + + + Untitled + #xpointer(id("usi17")) + #xpointer(id("usi27")) + 15 + 0 + explicit + #xpointer(id("usi4")) + + + Untitled + #xpointer(id("usi18")) + #xpointer(id("usi28")) + 15 + 0 + explicit + #xpointer(id("usi5")) + + + Untitled + #xpointer(id("usi19")) + #xpointer(id("usi29")) + 15 + 0 + explicit + #xpointer(id("usi6")) + + + Untitled + #xpointer(id("usi20")) + #xpointer(id("usi30")) + 15 + 0 + explicit + #xpointer(id("usi7")) + + + Untitled + #xpointer(id("usi21")) + #xpointer(id("usi31")) + 15 + 0 + explicit + #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 + explicit + #xpointer(id("usi10")) + + + + diff --git a/samples/SineData-be.tdx b/samples/SineData-be.tdx new file mode 100644 index 0000000000000000000000000000000000000000..c8e4b390758a46cb478189bc0f02d7b94620337f GIT binary patch literal 80000 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 CR=Vf_ literal 0 HcmV?d00001 diff --git a/samples/swapbyteorder.cpp b/samples/swapbyteorder.cpp new file mode 100644 index 0000000..ec1401b --- /dev/null +++ b/samples/swapbyteorder.cpp @@ -0,0 +1,63 @@ + +#include +#include +#include +#include + +int main(int argc, char* argv[]) +{ + for ( int i = 0; i < argc; i++ ) + { + std::cout< tdxbuf((std::istreambuf_iterator(fin)), + (std::istreambuf_iterator())); + + fin.close(); + + std::cout<<"length of buffer: "< tdxbufrev(tdxbuf.size()); + + for ( unsigned long int i = 0; i < nums; i++ ) + { + for ( unsigned long int j = 0; j < dtsize; j++ ) + { + tdxbufrev[i*dtsize+j] = tdxbuf[(i+1)*dtsize-(j+1)]; + } + } + + std::ofstream fou(argv[2],std::ifstream::binary); + + for ( unsigned char ch: tdxbufrev) + { + fou<