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 0000000..c8e4b39 Binary files /dev/null and b/samples/SineData-be.tdx differ 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<