* 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:
parent
3611e43276
commit
043784d278
9
.gitignore
vendored
9
.gitignore
vendored
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
14
makefile
14
makefile
@ -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/
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------#
|
#-----------------------------------------------------------------------------#
|
||||||
|
@ -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=",")
|
||||||
|
|
||||||
|
55
src/main.cpp
55
src/main.cpp
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user