* rawmerge.hpp: generalize/fix condition for consistent timeseries

* introduce propagation of C++ exceptions to Cython/Python
* convert all cout/cerr output to exceptions
* Cython: introduce separate 'do_conversion' => avoid constructor to
trigger conversion
This commit is contained in:
Mario Fink 2020-09-18 18:43:25 +02:00
parent 3611e43276
commit 043784d278
9 changed files with 135 additions and 128 deletions

9
.gitignore vendored
View File

@ -1,6 +1,4 @@
/build
eatraw eatraw
eatdev eatdev
@ -8,11 +6,14 @@ nohup.out
.DS_Store .DS_Store
*.so
raw_eater.cpp raw_eater.cpp
raw_meat.cpp raw_meat.cpp
cyt/*.cpp cyt/*.cpp
/build
*.log
*.so
*.o *.o
*.csv
*.parquet

View File

@ -14,14 +14,18 @@ from libcpp cimport bool
# #
# for how to overload the constructor see # for how to overload the constructor see
# https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html # https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html
# and propagating exceptions from C++ to Python
# http://docs.cython.org/en/latest/src/userguide/wrapping_CPlusPlus.html#exceptions
cdef extern from "../lib/raweat.hpp": cdef extern from "../lib/raweat.hpp":
cdef cppclass raw_eater: cdef cppclass raw_eater:
# constructor(s) # constructor(s)
raw_eater() except+ raw_eater() except +
raw_eater(string) except + raw_eater(string) except +
# set new file for decoding # set new file for decoding
void set_file(string) void set_file(string)
# perform conversion (pass any C++ exceptions to Python)
void setup_and_conversion() except +
# get validity of data format # get validity of data format
bool get_valid() bool get_valid()
# get channel name and unit # get channel name and unit

View File

@ -30,6 +30,9 @@ cdef class raweater:
raise ValueError("'" + str(rawfile) + "' does not exist") raise ValueError("'" + str(rawfile) + "' does not exist")
self.rawit.set_file(rawfile) self.rawit.set_file(rawfile)
def do_conversion(self):
self.rawit.setup_and_conversion()
def validity(self): def validity(self):
return self.rawit.get_valid() return self.rawit.get_valid()

View File

@ -23,8 +23,8 @@ cdef extern from "../lib/rawmerge.hpp":
vector[double] get_data() vector[double] get_data()
# dump all data to .csv # dump all data to .csv
void write_table(const char*,char) void write_table(const char*,char)
# add channel and try to merge it # add channel and try to merge it (pass C++ exceptions to Python)
bool add_channel(string) bool add_channel(string) except +
# get total number of (added) channels # get total number of (added) channels
int get_num_channels() int get_num_channels()
# get list of channel names # get list of channel names

View File

@ -80,7 +80,7 @@ public:
raw_eater(std::string rawfile, bool showlog = false) : rawfile_(rawfile) raw_eater(std::string rawfile, bool showlog = false) : rawfile_(rawfile)
{ {
// trigger setup and conversion // trigger setup and conversion
if ( ! rawfile.empty() ) this->setup_and_conversion(showlog); //if ( ! rawfile.empty() ) this->setup_and_conversion(showlog);
} }
raw_eater() raw_eater()
@ -88,6 +88,12 @@ public:
} }
// destructor
~raw_eater()
{
}
// provide/set new raw file // provide/set new raw file
void set_file(std::string rawfile, bool showlog = false) void set_file(std::string rawfile, bool showlog = false)
{ {
@ -100,11 +106,11 @@ public:
datmes_.clear(); datmes_.clear();
// do setup and conversion // do setup and conversion
setup_and_conversion(showlog); //setup_and_conversion(showlog);
} }
// set up and conversion // set up and conversion
void setup_and_conversion(bool showlog) void setup_and_conversion(bool showlog = false)
{ {
// make sure 'raw_file' is already set // make sure 'raw_file' is already set
assert ( !rawfile_.empty() ); assert ( !rawfile_.empty() );
@ -123,10 +129,8 @@ public:
if ( showlog ) if ( showlog )
{ {
// show raw data // show raw data and display predefined markers
this->show_buffer(); this->show_buffer();
// display predefined markers
this->show_markers(); this->show_markers();
} }
@ -150,12 +154,6 @@ public:
} }
} }
// destructor
~raw_eater()
{
}
// display buffer/data properties // display buffer/data properties
void show_buffer(int numel = 32) void show_buffer(int numel = 32)
{ {
@ -239,10 +237,16 @@ public:
unsigned long int totalmarksize = 0; unsigned long int totalmarksize = 0;
for (std::pair<std::string,std::vector<unsigned char>> mrk : markers_ ) for (std::pair<std::string,std::vector<unsigned char>> mrk : markers_ )
{ {
//assert ( datasec_[mrk.first].size() > 0 && "marker segment of length zero" );
if ( datasec_[mrk.first].size() == 0 ) if ( datasec_[mrk.first].size() == 0 )
{ {
std::cout<<"warning: "<<mrk.first<<" not found in buffer\n"; std::string errmess = mrk.first + std::string(" not found in buffer");
// std::cerr<<errmess;
try {
throw std::runtime_error(errmess);
} catch( const std::exception& e ) {
throw;
//std::cout<<e.what()<<"\n";
}
} }
totalmarksize += datasec_[mrk.first].size(); totalmarksize += datasec_[mrk.first].size();
} }
@ -250,7 +254,6 @@ public:
// std::cout<<"\n"; // std::cout<<"\n";
// check validity of format // check validity of format
// assert ( totalmarksize > 0 && "didn't find any predefined marker => probably not a valid .raw-file" );
valid_ = ( totalmarksize < 100 ) ? false : true; valid_ = ( totalmarksize < 100 ) ? false : true;
} }
@ -389,7 +392,6 @@ public:
} }
else else
{ {
// switch for datatypes // switch for datatypes
switch ( dattype ) switch ( dattype )
{ {
@ -414,9 +416,9 @@ public:
convert_data_as_type<unsigned long int>(datbuf,factor,offset); convert_data_as_type<unsigned long int>(datbuf,factor,offset);
break; break;
case 6 : case 6 :
std::cout<<"warning: 'signed long int' datatype with experimental support\n";
// assert ( sizeof(signed long int)*8 == typesize ); // assert ( sizeof(signed long int)*8 == typesize );
// convert_data_as_type<signed long int>(datbuf,factor,offset); // convert_data_as_type<signed long int>(datbuf,factor,offset);
// throw std::runtime_error("warning: 'signed long int' datatype with experimental support");
assert ( sizeof(int)*8 == typesize ); assert ( sizeof(int)*8 == typesize );
convert_data_as_type<int>(datbuf,factor,offset); convert_data_as_type<int>(datbuf,factor,offset);
break; break;
@ -429,13 +431,13 @@ public:
convert_data_as_type<double>(datbuf,factor,offset); convert_data_as_type<double>(datbuf,factor,offset);
break; break;
case 9 : case 9 :
std::cerr<<"'imc Devices Transitional Recording' datatype not supported\n"; throw std::runtime_error("'imc Devices Transitional Recording' datatype not supported");
break; break;
case 10 : case 10 :
std::cerr<<"'Timestamp Ascii' datatype not supported\n"; throw std::runtime_error("'Timestamp Ascii' datatype not supported");
break; break;
case 11 : case 11 :
std::cout<<"warning: '2-Byte-Word digital' datatype with experimental support\n"; // throw std::runtime_error("warning: '2-Byte-Word digital' datatype with experimental support");
assert ( sizeof(short int)*8 == typesize ); assert ( sizeof(short int)*8 == typesize );
convert_data_as_type<short int>(datbuf,factor,offset); convert_data_as_type<short int>(datbuf,factor,offset);
break; break;

View File

@ -83,13 +83,19 @@ public:
{ {
// set raw file and perform conversion // set raw file and perform conversion
this->set_file(rawfile,showlog); this->set_file(rawfile,showlog);
// try {
this->setup_and_conversion();
// } catch (const std::exception& e) {
// // throw;
// std::cout<<e.what();
// }
// show channel name, unit, timestep, time unit, etc. // show channel name, unit, timestep, time unit, etc.
if ( showlog && this->get_valid() ) if ( showlog && this->get_valid() )
{ {
std::cout<<this->get_name()<<" ["<<this->get_unit()<<"]"<<"\n";
std::cout<<"Time ["<<this->get_temp_unit()<<"]"<<"\n"; std::cout<<"Time ["<<this->get_temp_unit()<<"]"<<"\n";
for ( unsigned long int i = 0; i < 5; i++ ) std::cout<<this->get_time()[i]<<"\n"; for ( unsigned long int i = 0; i < 5; i++ ) std::cout<<this->get_time()[i]<<"\n";
std::cout<<this->get_name()<<" ["<<this->get_unit()<<"]"<<"\n";
for ( unsigned long int i = 0; i < 5; i++ ) std::cout<<this->get_data()[i]<<"\n"; for ( unsigned long int i = 0; i < 5; i++ ) std::cout<<this->get_data()[i]<<"\n";
std::cout<<"lenght of channel "<<this->get_time().size()<<"\n"; std::cout<<"lenght of channel "<<this->get_time().size()<<"\n";
std::cout<<"\n"; std::cout<<"\n";
@ -126,12 +132,9 @@ public:
std::vector<double> td = this->get_data(); std::vector<double> td = this->get_data();
// compare start/end of timeseries (define tolerance) // compare start/end of timeseries (define tolerance)
double deltat = 7*fmax(this->get_dt(),this->dt_); double deltat = 9*fmax(this->get_dt(),this->dt_);
if ( ( this->timeseries_[0] - ts[0] < deltat ) if ( ( fabs( this->timeseries_[0] - ts[0] ) < deltat )
&& ( this->timeseries_.back() - ts.back() < deltat ) ) && ( fabs( this->timeseries_.back() - ts.back() ) < deltat ) )
// double tol = 0.001;
// if ( ( (this->timeseries_[0]-ts[0])/ts[0] < tol )
// && ( (this->timeseries_.back()-ts.back())/ts.back() < tol ) )
{ {
// resulting new time series // resulting new time series
std::vector<double> newts; std::vector<double> newts;
@ -155,9 +158,14 @@ public:
else else
{ {
// refuse to merge due to inconsistent start of timeseries // refuse to merge due to inconsistent start of timeseries
std::cerr<<"rawmerge: add_channel '"<<rawfile std::string errmess = std::string("rawmerge: add_channel '") + rawfile
<<"' : inconsistent start of time series, i.e. " + std::string("' : inconsistent start of time series, i.e. ")
<<timeseries_[0]<<" vs. "<<ts[0]<<"\n"; + std::to_string(timeseries_[0]) + std::string(" vs. ")
+ std::to_string(ts[0])
+ std::string("( timesteps: ") + std::to_string(this->get_dt())
+ std::string(" and ") + std::to_string(this->dt_) + std::string(")");
// std::cerr<<errmess<<"\n";
throw std::runtime_error(errmess);
return false; return false;
} }
@ -165,9 +173,12 @@ public:
else else
{ {
// refuse to merge due to different temporal units // refuse to merge due to different temporal units
std::cerr<<"rawmerge: add_channel '"<<rawfile std::string errmess = std::string("rawmerge: add_channel '") + rawfile
<<"' : inconsistent time units: '" + std::string("' : inconsistent time units: ', i.e. '")
<<this->get_temp_unit()<<"' versus '"<<this->temp_unit_<<"'\n"; + this->get_temp_unit() + std::string("' vs. '")
+ this->temp_unit_ + std::string("'");
// std::cerr<<errmess<<"\n";
throw std::runtime_error(errmess);
return false; return false;
} }
@ -175,7 +186,10 @@ public:
else else
{ {
// provided file does not feature a valid .raw format // provided file does not feature a valid .raw format
std::cerr<<"rawmerge: add_channel '"<<rawfile<<"' : invalid .raw file\n"; std::string errmess = std::string("rawmerge: add_channel '") + rawfile
+ std::string("' : invalid .raw file");
// std::cerr<<errmess<<"\n";
throw std::runtime_error(errmess);
return false; return false;
} }

View File

@ -15,13 +15,14 @@ EXE = eatraw
# compiler and its options # compiler and its options
CCC = g++ -std=c++11 CCC = g++ -std=c++11
OPT = -O3 -Wall -mavx -mno-tbm -mf16c -mno-f16c #OPT = -O3 -Wall -mavx -mno-tbm -mf16c -mno-f16c
OPT = -O3 -Wall -Werror
#-----------------------------------------------------------------------------# #-----------------------------------------------------------------------------#
# C++ # C++
# build executable # build executable
$(EXE) : $(SRC)main.cpp $(LIB)raweat.hpp $(LIB)hexshow.hpp $(LIB)rawmerge.hpp $(EXE) : $(SRC)main.cpp $(LIB)raweat.hpp $(LIB)hexshow.hpp $(LIB)rawmerge.hpp output
$(CCC) $(OPT) $< -o $@ $(CCC) $(OPT) $< -o $@
# development version # development version
@ -37,6 +38,7 @@ clean :
rm -f $(EXE) rm -f $(EXE)
rm -f eatall rm -f eatall
rm -f eatdev rm -f eatdev
rm -rf output/
# check existence of name of executable globally # check existence of name of executable globally
chexe:=$(shell command -v $(EXE)) chexe:=$(shell command -v $(EXE))
@ -59,7 +61,8 @@ uninstall :
# build python module # build python module
py : $(CYT)setup_raw_eater.py $(CYT)raw_eater.pyx $(CYT)raw_eater.pxd $(LIB)raweat.hpp \ py : $(CYT)setup_raw_eater.py $(CYT)raw_eater.pyx $(CYT)raw_eater.pxd $(LIB)raweat.hpp \
$(CYT)setup_raw_meat.py $(CYT)raw_meat.pyx $(CYT)raw_meat.pxd $(LIB)rawmerge.hpp $(CYT)setup_raw_meat.py $(CYT)raw_meat.pyx $(CYT)raw_meat.pxd $(LIB)rawmerge.hpp \
output
python3 $(CYT)setup_raw_eater.py build_ext --inplace python3 $(CYT)setup_raw_eater.py build_ext --inplace
python3 $(CYT)setup_raw_meat.py build_ext --inplace python3 $(CYT)setup_raw_meat.py build_ext --inplace
cp raw_eater.cpython-*.so pyt/ cp raw_eater.cpython-*.so pyt/
@ -80,5 +83,10 @@ py-clean :
rm -f $(CYT)raw_meat.cpp rm -f $(CYT)raw_meat.cpp
rm -rf build/ rm -rf build/
rm -f *.txt rm -f *.txt
rm -rf output/
# prepare directory for test output
output :
mkdir -pv output/
#-----------------------------------------------------------------------------# #-----------------------------------------------------------------------------#

View File

@ -5,65 +5,23 @@ import raw_eater
import raw_meat import raw_meat
import pyarrow as pa import pyarrow as pa
import pyarrow.parquet as pq import pyarrow.parquet as pq
import glob
from pathlib import Path
rawlist1 = [ fileobj1 = Path("smp/Rangerover_Evoque_F-RR534_2019-05-07/").rglob("*.raw")
"smp/Rangerover_Evoque_F-RR534_2019-05-07/BrakePedalActiveQF_HS.raw", rawlist1 = [str(fl) for fl in fileobj1]
"smp/Rangerover_Evoque_F-RR534_2019-05-07/BrakePressure_HS.raw",
"smp/Rangerover_Evoque_F-RR534_2019-05-07/EngineSpeed_HS.raw",
"smp/Rangerover_Evoque_F-RR534_2019-05-07/pressure_FL.raw",
"smp/Rangerover_Evoque_F-RR534_2019-05-07/pressure_RL.raw",
"smp/Rangerover_Evoque_F-RR534_2019-05-07/pressure_Vacuum.raw",
"smp/VehicleSpeed_HS.raw",
"smp/Rangerover_Evoque_F-RR534_2019-05-07/ABS_A_Port1.raw",
"./pyt/example.py",
"smp/Rangerover_Evoque_F-RR534_2019-05-07/LateralAcceleration_HS.raw",
"smp/Rangerover_Evoque_F-RR534_2019-05-07/Temp_Disc_FR.raw"
]
rawlist2 = [ fileobj2 = Path("smp/Mercedes_E-Klasse-2019-08-08/").rglob("*.raw")
"smp/Mercedes_E-Klasse-2019-08-08/ACC_lat.raw", rawlist2 = [str(fl) for fl in fileobj2]
"smp/Mercedes_E-Klasse-2019-08-08/ACC_long.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_AccelPdlPosn.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_AirTemp_Outsd_IC.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_AirTemp_Outsd.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_BrkPdl_Stat.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_BrkTrq_D_V2.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_BrkTrq_R.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_BrkTrq_V2.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_EngLoad_OBD.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_EngRPM.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_Odo.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_PkBrk_Stat.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_StWhl_Angl.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_StWhl_AnglSpd.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_TC_liquidFuelCons1.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_VehSpd_Disp.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_WhlRPM_FL.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_WhlRPM_FR.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_WhlRPM_RL.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Flex_WhlRPM_RR.raw",
"smp/Mercedes_E-Klasse-2019-08-08/GPS.height.raw",
"smp/Mercedes_E-Klasse-2019-08-08/GPS.speed.raw",
"smp/Mercedes_E-Klasse-2019-08-08/GPS.time.sec.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Pressure_FL.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Pressure_PC.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Pressure_RR.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Pressure_SC.raw",
"smp/Mercedes_E-Klasse-2019-08-08/setup_id.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Temp_Disc_FL.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Temp_Disc_FR.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Temp_Disc_RL.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Temp_Disc_RR.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Temp_Fluid_FL.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Temp_Fluid_RL.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Travel_Piston.raw",
"smp/Mercedes_E-Klasse-2019-08-08/Vacuum_Booster.raw",
"smp/Mercedes_E-Klasse-2019-08-08/vehicle_id.raw"
]
rawlist = rawlist2 rawlist = rawlist1 #[rawlist1[0],rawlist1[4],rawlist2[0],rawlist2[6]]
for fil in rawlist2 :
rawlist.append(fil)
rawlist.append("smp/pressure_Vacuum.asc")
print("") print("")
print(rawlist)
print()
#-----------------------------------------------------------------------------# #-----------------------------------------------------------------------------#
@ -80,8 +38,12 @@ for rf in rawlist :
# eatraw = raw_eater.raweater(rf.encode()) # eatraw = raw_eater.raweater(rf.encode())
# eatraw = raw_meat.rawmerger(rf.encode()) # eatraw = raw_meat.rawmerger(rf.encode())
# use global instance of "raw_eater" # use global instance of "raw_eater" to set file and perform decoding
eatraw.set_file(rf.encode()) eatraw.set_file(rf.encode())
try :
eatraw.do_conversion()
except RuntimeError as e :
print("conversion failed: " + str(e))
# check validity of file format # check validity of file format
if eatraw.validity() : if eatraw.validity() :
@ -106,7 +68,7 @@ for rf in rawlist :
outname = rf.split('/')[-1].replace('raw','csv') outname = rf.split('/')[-1].replace('raw','csv')
print("write output to : " + outname) print("write output to : " + outname)
eatraw.write_table((outname).encode(),ord(' ')) eatraw.write_table(("output/"+outname).encode(),ord(' '))
else : else :
@ -124,17 +86,17 @@ eatmea = raw_meat.rawmerger(''.encode()) #rawlist[0].encode())
# add every single channel/file in list # add every single channel/file in list
for rf in rawlist : for rf in rawlist :
print("\nadding channel " + str(rf)) print("\nadding channel " + str(rf))
succ = eatmea.add_channel(rf.encode()) try :
if succ : succ = eatmea.add_channel(rf.encode())
print("\nrecent time series: length: " + str(len(eatmea.get_time_series())) + "\n") print("\nrecent time series: length: " + str(len(eatmea.get_time_series())) + "\n")
else : except RuntimeError as e :
print("\nfailed to add channel\n") print("failed to add channel: " + str(e))
# show summary of successfully merged channels # show summary of successfully merged channels
print("\nmerged channels:\n") print("\nmerged channels:\n")
# write merged table to .csv output # write merged table to .csv output
eatmea.write_table_all('allchannels.csv'.encode(),ord(',')) eatmea.write_table_all('output/allchannels.csv'.encode(),ord(','))
# get number of successfully merged channels and their names (+units) # get number of successfully merged channels and their names (+units)
numch = eatmea.get_num_channels() numch = eatmea.get_num_channels()
@ -166,10 +128,10 @@ pyarwtab = pa.Table.from_arrays(pyarrs,chnames)
print("\n" + 60*"-" + "\n" + str(pyarwtab) + "\n") print("\n" + 60*"-" + "\n" + str(pyarwtab) + "\n")
# write pyarrow table to .parquet file with compression # write pyarrow table to .parquet file with compression
pq.write_table(pyarwtab,'allchannels.parquet',compression='BROTLI') # compression='BROTLI', 'SNAPPY') pq.write_table(pyarwtab,'output/allchannels.parquet',compression='BROTLI') # compression='BROTLI', 'SNAPPY')
# try to read and decode the .parquet file # try to read and decode the .parquet file
df = pq.read_table('allchannels.parquet') df = pq.read_table('output/allchannels.parquet')
print(df.to_pandas()) print(df.to_pandas())
# df.to_pandas().to_csv('allchannels.csv',index=False,encoding='utf-8',sep=",") # df.to_pandas().to_csv('allchannels.csv',index=False,encoding='utf-8',sep=",")

View File

@ -9,14 +9,6 @@
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
// std::cout<<"number of CLI-arguments: "<<argc<<"\n";
// for ( int i = 0; i < argc; i++ ) std::cout<<std::setw(5)<<i<<": "<<argv[i]<<"\n";
// path of filename provided ?
// assert( argc > 2 && "please provide a filename and path for input and output" );
// check number of CLI arguments
// assert( argc == 3 );
if ( argc != 3 ) //or ( argc == 1 && std::string(argv[1]) == str::string("--help") ) if ( argc != 3 ) //or ( argc == 1 && std::string(argv[1]) == str::string("--help") )
{ {
@ -29,19 +21,18 @@ int main(int argc, char* argv[])
// get name/path of file from CLI argument // get name/path of file from CLI argument
std::string rawfile(argv[1]); std::string rawfile(argv[1]);
// declare instance of "raw_eater" // declare instance of 'raw_eater' (and decode data)
raw_eater eatraw(rawfile,true); raw_eater eatraw; //rawfile,false);
// declare instance of "raw_merger" // set file to be decoded
// raw_merger eatmea; eatraw.set_file(rawfile,true);
// eatmea.add_channel(rawfile,true);
// eatmea.add_channel("smp/VehicleSpeed_HS.raw",true);
// eatmea.add_channel("smp/VehicleSpeed_HS.raw",true);
// eatmea.add_channel("smp/Rangerover_Evoque_F-RR534_2019-05-07/Temp_Disc_FR.raw",true);
//eatraw.show_markers(); // do conversion
eatraw.setup_and_conversion(false);
// std::cout<<"\n"; // eatraw.show_markers();
// std::cout<<"\n";
// std::map<std::string,std::vector<unsigned char>> marks = eatraw.get_markers(); // std::map<std::string,std::vector<unsigned char>> marks = eatraw.get_markers();
// for ( auto mrk: marks ) // for ( auto mrk: marks )
// { // {
@ -67,10 +58,32 @@ int main(int argc, char* argv[])
// write data in csv-file // write data in csv-file
if ( eatraw.get_valid() ) if ( eatraw.get_valid() )
{ {
// eatraw.write_table(std::string(argv[2]));
eatraw.write_table(std::string(argv[2]),' '); eatraw.write_table(std::string(argv[2]),' ');
// eatmea.write_table(std::string(argv[2])); }
// eatmea.write_table(std::string(argv[2]),' '); else
{
std::cout<<"=> invalid/corrupt .raw file\n";
}
//---------------------------------------------------------------------------//
// declare instance of 'raw_merger'
raw_merger eatmea;
// add channels
eatmea.add_channel(rawfile,false);
// eatmea.add_channel("smp/VehicleSpeed_HS.raw",true);
// eatmea.add_channel("smp/Mercedes_E-Klasse-2019-08-08/Flex_StWhl_AnglSpd.raw",false);
// eatmea.add_channel("smp/Rangerover_Evoque_F-RR534_2019-05-07/Temp_Disc_FR.raw",false);
// write merged table
if ( eatmea.get_num_channels() > 0 )
{
eatmea.write_table_all("output/allchannels.csv",' ');
}
else
{
std::cout<<"no valid channel added\n";
} }
return 0; return 0;