From 68378ef8fa283da8efdd251f4e7e2ace6a2dafe3 Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Wed, 12 Feb 2020 11:54:25 +0000 Subject: [PATCH] read and parse all segment marker elements and start distinction between datatype based on header info --- csv/VehicleSpeed_HS.csv | 600 ++++++++++++++++++++++++++++++++++++++++ eatit | Bin 57640 -> 71816 bytes src/main.cpp | 11 +- src/raweat.hpp | 240 ++++++++++------ 4 files changed, 758 insertions(+), 93 deletions(-) diff --git a/csv/VehicleSpeed_HS.csv b/csv/VehicleSpeed_HS.csv index e69de29..fc86944 100644 --- a/csv/VehicleSpeed_HS.csv +++ b/csv/VehicleSpeed_HS.csv @@ -0,0 +1,600 @@ +5.94 +5.93 +5.92 +5.9 +5.9 +5.89 +5.89 +5.87 +5.84 +5.83 +5.81 +5.79 +5.78 +5.76 +5.75 +5.74 +5.74 +5.73 +5.73 +5.72 +5.71 +5.71 +5.69 +5.69 +5.68 +5.66 +5.63 +5.62 +5.6 +5.58 +5.57 +5.55 +5.53 +5.51 +5.5 +5.47 +5.45 +5.42 +5.4 +5.38 +5.35 +5.31 +5.28 +5.27 +5.24 +5.19 +5.16 +5.14 +5.11 +5.06 +5.02 +5 +4.97 +4.92 +4.88 +4.86 +4.82 +4.77 +4.74 +4.7 +4.66 +4.62 +4.58 +4.54 +4.48 +4.43 +4.37 +4.31 +4.24 +4.18 +4.13 +4.06 +3.98 +3.91 +3.83 +3.77 +3.72 +3.64 +3.57 +3.51 +3.44 +3.39 +3.33 +3.28 +3.24 +3.17 +3.11 +3.06 +3.01 +2.96 +2.92 +2.88 +2.83 +2.79 +2.75 +2.71 +2.68 +2.64 +2.61 +2.59 +2.56 +2.55 +2.52 +2.51 +2.49 +2.48 +2.46 +2.46 +2.45 +2.44 +2.43 +2.42 +2.41 +2.4 +2.41 +2.39 +2.38 +2.35 +2.31 +2.26 +2.21 +2.16 +2.1 +2.05 +2.01 +1.94 +1.91 +1.84 +1.77 +1.73 +1.65 +1.59 +1.58 +1.55 +1.52 +1.53 +1.52 +1.5 +1.49 +1.47 +1.47 +1.47 +1.47 +1.48 +1.48 +1.48 +1.48 +1.48 +1.46 +1.44 +1.44 +1.43 +1.41 +1.41 +1.4 +1.38 +1.37 +1.36 +1.35 +1.33 +1.32 +1.31 +1.28 +1.27 +1.26 +1.24 +1.22 +1.21 +1.21 +1.19 +1.17 +1.16 +1.16 +1.13 +1.12 +1.12 +1.11 +1.09 +1.08 +1.07 +1.07 +1.05 +1.04 +1.03 +1.02 +1.01 +0.99 +0.98 +0.96 +0.95 +0.94 +0.9 +0.87 +0.84 +0.8 +0.79 +0.78 +0.75 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/eatit b/eatit index 636f1087861148e8843f9ab71659e1d731afc642..8686a609078a07071faad7ec4157493edf0141e4 100755 GIT binary patch literal 71816 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 literal 57640 zcmeFa33yaR)<1lc&=3*m=)f5FR-+~em;lj4MH7<1ZS7zNg5rXmkOY!3+aw)`iW(S=(C{z|&kk)48M>^z;erLXDySWzB?4eM z@~W?uBtnlw>~Pm81y32RLc1K;_4GFWjQQnjPBZeui@7^M^hu7UEp1zIbxkV9CV}?S441wr0^u(@(6e zoLpN|-_km{HRq(sCrzKy+%RRTw43yaJA2N2sfqnJhSkB zHva2O;5ifjeG-fPxn^MzT(8u46`)cpY&ma2ncNcd(Jo&c6 z8aIsfeEeN;&+|JbTyfhgO;3zGr8($3bgnP(*KdE`cFcrTV+vx_2FKollClj$pX&iQ za3~PzNF4a?{f5V1hK?VOP920b9Q+9=$8hkM&H{O2%kjvl66e*}Cu z{EczokHw*XdmK638i!67IP%#Nr`~mO;06Z6aQyr(PJ2BtB*Wn+ z#Nl&69Qh{kICMBq3|H@|ap0M8=)Vm7;pABl_)*$VweCNvTGEl`^8(~Xc*gO-lox zgtx6#@Dd9iLcbrN9irtupx`Me&*y5$;b?7~wnj~JGG`Hfs71fgs@JCTF8Y!9WfuN) zBIDuw%6hBs_DH%-{$dWZ=8eQ0;%2Z^UN>wRX&7*`6|TaJR{>?*+UjqtYHDt%FR!f$T;gAv`NR2}-q2W8UsQ4y zd7tL@LXu|#PzN#CT>OAWvbwY81+pswmo!$P)u2@DUsh9DRS%ih1Z;WbT5WHDWQG@2 zRe4hpa;6F+U?xx=ARp+1tZ7Xx^?{nYDt}c|Q$th1)S|g(N&g@#)_s*#6-`xjRrP^5 zy$V{DwI%32e?@D#e-ZSs-d|B3sHjE;R3+2z4^%fbEc4e^)h`KDtEwOymMzao7tK4#Uvk#GY5rPJL$gn+ZKx=(t%~W~$z&bM zos|<+j+*)<@s(*_Ikixgmqu4X`|T#9f_Q@`R$~;SaH`#rQ6^#<3MS%csFMRWDOz}{ zvjxLxgerM*Qx%5&(yF4msDM=`Eh=YAngcQ#p??1{;fjX3#`2~rYQG{43Ng~Hm@l?}>97b*MZ?7EnU{@u8y+?=ZY?fD!4r352N?{JOVGhY3_2CE1M6sb6wFW=DErpriGjKmphp7e_JeaMD=E~R; z$0W+ae`Kp6QBj{IRRMohYeiLKpaw2fV}JvBUSN7fLrXx(BTD{1XyNxw_Zq>XhlxSXL}LbxO8YuwX&{Os_v{ z$}})8*b5e*QQAn9B8`?qYOvyPX$K(9Cjs1Zsm44$ zzj*n6l&-&~cyU_ecyvf>dKqw*x*c2G+Ja;3qraI~?#F2YiXWBr7_PUfhr90sE`kZj?{o0ScPA0t21|qcAtAwBFfZOYH!t)()d%u8idyiSN z@A61MIOT6Y_C5mPGi)G2d%aCK`^A3j^*Q0QY#>5={ZDv-18%RM33u*e+xroOpW(#6 z&m$=;<1x-+Pr3tcuj!ea>40O)D*EI&;H<-b@*HsLmi_1sIP12b5(nJYY340(z%g*6 zPniRbp&osz9q=(xsHQbK;4l!;r_});7lmqCn*;84z*jopw#{I6rvrX~1AmnR?%aP` z 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 marks = eatraw.get_markers(); for ( auto mrk: marks ) @@ -40,12 +43,14 @@ int main(int argc, char* argv[]) std::cout< segvec = eatraw.get_segment(mrk.first); + std::cout<<"number of elements in segment: "< maindata = eatraw.get_data(); diff --git a/src/raweat.hpp b/src/raweat.hpp index 58f9f87..74c0660 100644 --- a/src/raweat.hpp +++ b/src/raweat.hpp @@ -53,12 +53,13 @@ private: // data sections corresponding to markers std::map> datasec_; + // split segments into arrays of simple number/string element + std::map> segments_; + // length of data array unsigned long int datsize_; // TODO preliminary: for now, we assume 32/64 bit ? floats in all data - // index in buffer of datasec_["datas marker"] where actual data starts - unsigned long int datstartidx_; std::vector datmes_; public: @@ -116,12 +117,14 @@ public: std::cout<> mrk : markers_ ) { - assert( mrk.second.size() > 0 && "please don't defined any empty marker" ); + assert( mrk.second.size() > 0 && "please don't define any empty marker" ); // find marker's byte sequence in buffer for ( unsigned long int idx = 0; idx < rawdata_.size(); idx++ ) @@ -150,10 +153,7 @@ public: } else { - // make sure the data marker is actually the last and extends until end of file - //assert( TODO && "data marker doesn't appear to be the very last"); - - // that's the data itself + // data marker is actually assumed to be the last and should extend until end of file for ( unsigned long int didx = idx; didx < rawdata_.size()-1; didx++ ) { markseq.push_back(rawdata_[didx]); @@ -161,21 +161,6 @@ public: // obtain length of data segment datsize_ = markseq.size(); - - // find starting index (supposed to be after fourth comma = 0x2c) - int countcomma = 0; - for ( unsigned long int buidx = 0; buidx < datsize_; buidx++ ) - { - // count number of comma chars in head of data segment - if ( markseq[buidx] == 0x2c ) countcomma++; - - // save position following fourth comma - if ( countcomma == 4 ) - { - datstartidx_ = buidx + 1; - break; - } - } } // save segment corresponding to marker @@ -198,6 +183,143 @@ public: return datasec_[marker]; } + // split data segments into arrays + void split_segments() + { + // split segments of all markers + for (std::pair> mrk : markers_ ) + { + // declare empty array for this segment and auxiliary string + std::vector segvec; + std::string elstr(""); + + // only start collecting after first comma in segment + bool parse = false; + + // count number of commata + long int commcount = 0; + + // parse data segment + for ( unsigned char el: datasec_[mrk.first] ) + { + // note that data segment of "datas marker" may contain any number of 0x2c's + if ( ( el != 0x2c && parse ) || ( mrk.first == "datas marker" && commcount > 2 ) ) + { + elstr.push_back(el); + } + else if ( el == 0x2c && parse ) + { + // comma marks end of element of segment: save string and reset it + segvec.push_back(elstr); + elstr = std::string(""); + commcount++; + } + else + { + // enable parsing after first comma + if ( el == 0x2c ) parse = true; + } + } + // include last element + segvec.push_back(elstr); + + // save array of elements + segments_.insert(std::pair>(mrk.first,segvec));; + } + } + +//---------------------------------------------------------------------------// + + // convert actual measurement data + void convert_data() + { + // by convention, the actual data is the 4th element + std::string datstr = segments_["datas marker"][3]; + std::vector datbuf(datstr.begin(),datstr.end()); + + // retrieve datatype from segment + int typesize = std::stoi(segments_["datyp marker"][5]); + + if ( typesize == 32 ) convert_data_32_bit_float(datbuf); + if ( false ) convert_data_16_bit_float(); + if ( typesize == 16 ) convert_data_16_bit_decimal(datbuf); + + } + + // convert single precision 32bit floating point numbers + void convert_data_32_bit_float(std::vector &datbuf) + { + // check size of buffer assuming size of single precision float is 4 byte + assert ( datbuf.size()%4 == 0 && "length of buffer is not a multiple of 4" ); + + // get number of single precision floats in buffer + unsigned long int totnumfl = datbuf.size()/(int)sizeof(float); + for ( unsigned long int numfl = 0; numfl < totnumfl; numfl++ ) + { + // assuming 4 byte (32bit) float + float num = 0.0; + uint8_t* pnum = reinterpret_cast(&num); + + // parse all 4 bytes of the number + for ( int byi = 0; byi < (int)sizeof(float); byi++ ) + { + // TODO what's the byte order (little/big endian) in the file?? + // for now, we just don't care... + pnum[byi] = (int)datbuf[(unsigned long int)(numfl*sizeof(float)+byi)]; + } + + // add number of array + datmes_.push_back((double)num); + } + } + + // convert half-precision (16bit) floating point numbers + void convert_data_16_bit_float() + { + assert ( (datsize_-28)%2 == 0 && "length of buffer is not a multiple of 2" ); + + unsigned long int totnumby = (datsize_-28)/2; + for ( unsigned long int by = 0; by < totnumby; by++ ) + { + // declare single (16bit) floating point number + half_float::half hfl; + + // reinterpret bytes in buffer as memory of floating point number + uint8_t* pnum = reinterpret_cast(&hfl); + for ( int i = 0; i < (int)sizeof(half_float::half); i++ ) + { + pnum[i] = (int)datasec_["datas marker"][(unsigned long int)(28+by*sizeof(half_float::half)+i)]; + } + + // add number to array + datmes_.push_back((double)hfl); + } + } + + // convert 16bit "decimal-encoding" floating point numbers + void convert_data_16_bit_decimal(std::vector &datbuf) + { + assert ( datbuf.size()%2 == 0 && "length of data is not a multiple of 2" ); + + // encoding parameters + double shift = -128.; + double scale = 1.0/100.; + double offse = 0.0; + + for ( unsigned long int idx = 0; idx < datbuf.size()-1; idx += 2 ) + { + // convert to float + datmes_.push_back( + + (double)( (int)(datbuf[idx])*1. + ( (int)(datbuf[idx+1])*1. + shift )*256. )*scale + offse + + ); + } + + } + +//---------------------------------------------------------------------------// + // show hex dump void show_hex(std::vector &datavec, int width = 32, unsigned long int maxchars = 512) { @@ -238,80 +360,18 @@ public: std::cout<(&num); - for ( int byi = 0; byi < (int)sizeof(float); byi++ ) - { - // TODO what's the byte order in the file?? - // for now, we just don't care... - pnum[byi] = (int)datasec_["datas marker"][(unsigned long int)(28+numfl*sizeof(float)+byi)]; - } - - // add number of array - datmes_.push_back((double)num); - } - } - - // convert half-precision (16bit) floating point numbers - void convert_data_16_bit_float() - { - assert ( (datsize_-28)%2 == 0 && "length of buffer is not a multiple of 2" ); - - unsigned long int totnumby = (datsize_-28)/2; - for ( unsigned long int by = 0; by < totnumby; by++ ) - { - // declare single (16bit) floating point number - half_float::half hfl; - - // reinterpret bytes in buffer as memory of floating point number - uint8_t* pnum = reinterpret_cast(&hfl); - for ( int i = 0; i < (int)sizeof(half_float::half); i++ ) - { - pnum[i] = (int)datasec_["datas marker"][(unsigned long int)(28+by*sizeof(half_float::half)+i)]; - } - - // add number to array - datmes_.push_back((double)hfl); - } - } - - // convert 16bit "decimal-encoding" floating point numbers - void convert_data_16_bit_decimal() - { - assert ( (datsize_-datstartidx_)%2 == 0 && "length of data is not a multiple of 2" ); - - double flstp = 0.04395; - - // parse bytes in data buffer - unsigned long int totnumby = (datsize_-datstartidx_)/2; - for ( unsigned long int by = 0; by < totnumby; by++ ) - { - // retrieve set of two subsequent bytes - std::vector pnum; - for ( int i = 0; i < 2; i++ ) pnum.push_back(datasec_["datas marker"][(unsigned long int)(datstartidx_+by*2+i)]); - - // convert to double - //datmes_.push_back((double)( (((int)pnum[0]-128)*256 + (int)pnum[1])/100.0 )); - datmes_.push_back((double)( (((int)pnum[1]-128)*256. + (int)pnum[0])/100.0 )); - //datmes_.push_back( (double) ( ( (int)pnum[0] + (int)pnum[1]*256 )*flstp ) ); - } - } - // get data array encoded as floats/doubles std::vector& get_data() { return datmes_; } + // get segment's array of elements + std::vector get_segment(std::string marker) + { + return segments_[marker]; + } + // write data to csv-like file void write_data(std::string filename, int precision = 9) {