From 0eb034196de382cddc5e730087165bde84a1cdc6 Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Wed, 10 Feb 2021 15:37:24 +0100 Subject: [PATCH] imc::object: all objects parsed --- lib/imc_block.hpp | 1 + lib/imc_object.hpp | 159 ++++++++++++++++++++++++++++++++------------- 2 files changed, 115 insertions(+), 45 deletions(-) diff --git a/lib/imc_block.hpp b/lib/imc_block.hpp index d749140..1f8adb2 100644 --- a/lib/imc_block.hpp +++ b/lib/imc_block.hpp @@ -150,6 +150,7 @@ namespace imc // construct block info string std::stringstream ss; ss< #include "imc_key.hpp" //---------------------------------------------------------------------------// @@ -29,6 +30,7 @@ namespace imc // construct members by parsing particular parameters from buffer void parse(const std::vector* buffer, const std::vector& parameters) { + if ( parameters.size() < 3 ) throw std::runtime_error("invalid number of parameters in CF"); fileformat_ = std::stoi(get_parameter(buffer,¶meters[0])); processor_ = std::stoi(get_parameter(buffer,¶meters[2])); } @@ -55,6 +57,7 @@ namespace imc // construct members by parsing particular parameters from buffer void parse(const std::vector* buffer, const std::vector& parameters) { + if ( parameters.size() < 2 ) throw std::runtime_error("invalid number of parameters in CK"); version_ = std::stoi(get_parameter(buffer,¶meters[0])); length_ = std::stoi(get_parameter(buffer,¶meters[1])); closed_ = ( get_parameter(buffer,¶meters[3])==std::string("1") ); @@ -81,6 +84,7 @@ namespace imc // construct members by parsing particular parameters from buffer void parse(const std::vector* buffer, const std::vector& parameters) { + if ( parameters.size() < 7 ) throw std::runtime_error("invalid number of parameters in CB"); group_index_ = std::stoul(get_parameter(buffer,¶meters[2])); name_ = get_parameter(buffer,¶meters[4]); comment_ = get_parameter(buffer,¶meters[6]); @@ -108,6 +112,7 @@ namespace imc // construct members by parsing particular parameters from buffer void parse(const std::vector* buffer, const std::vector& parameters) { + if ( parameters.size() < 9 ) throw std::runtime_error("invalid number of parameters in CT"); group_index_ = std::stoul(get_parameter(buffer,¶meters[2])); name_ = get_parameter(buffer,¶meters[4]); text_ = get_parameter(buffer,¶meters[6]); @@ -145,6 +150,7 @@ namespace imc // construct members by parsing particular parameters from buffer void parse(const std::vector* buffer, const std::vector& parameters) { + if ( parameters.size() < 5 ) throw std::runtime_error("invalid number of parameters in CG"); number_components_ = std::stoul(get_parameter(buffer,¶meters[2])); fldtype_ = (fieldtype)std::stoi(get_parameter(buffer,¶meters[3])); dimension_ = std::stoi(get_parameter(buffer,¶meters[4])); @@ -171,6 +177,7 @@ namespace imc // construct members by parsing particular parameters from buffer void parse(const std::vector* buffer, const std::vector& parameters) { + if ( parameters.size() < 6 ) throw std::runtime_error("invalid number of parameters in CD1"); dx_ = std::stod(get_parameter(buffer,¶meters[2])); calibration_ = ( get_parameter(buffer,¶meters[3]) == std::string("1") ); unit_ = get_parameter(buffer,¶meters[5]); @@ -181,7 +188,7 @@ namespace imc { std::stringstream ss; ss<* buffer, const std::vector& parameters) { + if ( parameters.size() < 11 ) throw std::runtime_error("invalid number of parameters in CD2"); dx_ = std::stod(get_parameter(buffer,¶meters[2])); calibration_ = ( get_parameter(buffer,¶meters[3]) == std::string("1") ); unit_ = get_parameter(buffer,¶meters[5]); @@ -209,7 +217,7 @@ namespace imc ismultievent_ = ( get_parameter(buffer,¶meters[7]) == std::string("1") ); sortbuffer_ = ( get_parameter(buffer,¶meters[8]) == std::string("1") ); x0_ = std::stod(get_parameter(buffer,¶meters[9])); - pretriggerapp_ = std::stoi( get_parameter(buffer,¶meters[11]) ); + pretriggerapp_ = std::stoi( get_parameter(buffer,¶meters[10]) ); } // get info string @@ -217,7 +225,7 @@ namespace imc { std::stringstream ss; ss<* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + if ( parameters.size() < 4 ) throw std::runtime_error("invalid number of parameters in CD2"); + component_index_ = std::stoi(get_parameter(buffer,¶meters[2])); + analog_digital_ = std::stoi(get_parameter(buffer,¶meters[3])); } // get info string @@ -245,7 +255,7 @@ namespace imc { std::stringstream ss; ss<* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + if ( parameters.size() < 10 ) throw std::runtime_error("invalid number of parameters in CD2"); + buffer_reference_ = std::stoi(get_parameter(buffer,¶meters[2])); + bytes_ = std::stoi(get_parameter(buffer,¶meters[3])); + numeric_type_ = (numtype)std::stoi(get_parameter(buffer,¶meters[4])); + signbits_ = std::stoi(get_parameter(buffer,¶meters[5])); + mask_ = std::stoi(get_parameter(buffer,¶meters[6])); + offset_ = std::stoul(get_parameter(buffer,¶meters[7])); + number_subsequent_samples_ = std::stoul(get_parameter(buffer,¶meters[8])); + distance_bytes_ = std::stoul(get_parameter(buffer,¶meters[9])); } // get info string @@ -292,7 +310,7 @@ namespace imc <* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + if ( parameters.size() < 13 ) throw std::runtime_error("invalid number of parameters in CD2"); + number_buffers_ = std::stoul(get_parameter(buffer,¶meters[2])); + bytes_userinfo_ = std::stoul(get_parameter(buffer,¶meters[3])); + buffer_reference_ = std::stoul(get_parameter(buffer,¶meters[4])); + sample_index_ = std::stoul(get_parameter(buffer,¶meters[5])); + offset_buffer_ = std::stoul(get_parameter(buffer,¶meters[6])); + number_bytes_ = std::stoul(get_parameter(buffer,¶meters[7])); + offset_first_sample_ = std::stoul(get_parameter(buffer,¶meters[8])); + number_filled_bytes_ = std::stoul(get_parameter(buffer,¶meters[9])); + x0_ = std::stod(get_parameter(buffer,¶meters[11])); + add_time_ = std::stod(get_parameter(buffer,¶meters[12])); } // get info string @@ -333,7 +361,7 @@ namespace imc <* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + if ( parameters.size() < 8 ) throw std::runtime_error("invalid number of parameters in CD2"); + transform_ = (get_parameter(buffer,¶meters[2]) == std::string("1")); + factor_ = std::stod(get_parameter(buffer,¶meters[3])); + offset_ = std::stod(get_parameter(buffer,¶meters[4])); + calibration_ = (get_parameter(buffer,¶meters[5]) == std::string("1")); + unit_ = get_parameter(buffer,¶meters[7]); } // get info string @@ -375,9 +408,13 @@ namespace imc std::string comment_; // construct members by parsing particular parameters from buffer - void parse(const std::vector* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + if ( parameters.size() < 9 ) throw std::runtime_error("invalid number of parameters in CD2"); + group_index_ = std::stoul(get_parameter(buffer,¶meters[2])); + index_bit_ = (get_parameter(buffer,¶meters[4]) == std::string("1")); + name_ = get_parameter(buffer,¶meters[6]); + comment_ = get_parameter(buffer,¶meters[8]); } // get info string @@ -397,21 +434,22 @@ namespace imc { unsigned long int index_; // starting from 1 in first CS block in file // std::vector rawdata_; - unsigned long int begin_buffer_, end_buffer_; + // unsigned long int begin_buffer_, end_buffer_; // construct members by parsing particular parameters from buffer - void parse(const std::vector* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + if ( parameters.size() < 4 ) throw std::runtime_error("invalid number of parameters in CD2"); + index_ = std::stoul(get_parameter(buffer,¶meters[2])); } // get info string std::string get_info(int width = 20) { std::stringstream ss; - ss<* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + if ( parameters.size() < 7 ) throw std::runtime_error("invalid number of parameters in CD2"); + origin_ = ( get_parameter(buffer,¶meters[2]) == std::string("1") ); + generator_ = get_parameter(buffer,¶meters[4]); + comment_ = get_parameter(buffer,¶meters[6]); } // get info string @@ -440,15 +481,36 @@ namespace imc } }; - // trigger timestamp (corresponds to key NT) + // trigger timestamp (corresponds to key NT1) struct triggertime { + int day_, month_, year_; + int hour_, minute_; + double second_; std::string timestamp_; // construct members by parsing particular parameters from buffer - void parse(const std::vector* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { + if ( parameters.size() < 8 ) throw std::runtime_error("invalid number of parameters in CD2"); + day_ = std::stoi( get_parameter(buffer,¶meters[2]) ); + month_ = std::stoi( get_parameter(buffer,¶meters[3]) ); + year_ = std::stoi( get_parameter(buffer,¶meters[4]) ); + hour_ = std::stoi( get_parameter(buffer,¶meters[5]) ); + minute_ = std::stoi( get_parameter(buffer,¶meters[6]) ); + second_ = std::stod( get_parameter(buffer,¶meters[7]) ); + time_t rawtime; + struct tm* ts; + time(&rawtime); + ts = localtime(&rawtime); + ts->tm_mday = day_; + ts->tm_mon = month_; + ts->tm_year = year_-1900; + ts->tm_hour = hour_; + ts->tm_min = minute_; + ts->tm_sec = (int)second_; + timestamp_ = asctime(ts); } // get info string @@ -462,7 +524,6 @@ namespace imc } - namespace imc { // create wrapper for imc_object types @@ -524,11 +585,6 @@ namespace imc { abs_.parse(buffer,parameters); objidx_ = 5; } - else if ( key.name_ == std::string("CD") && key.version_ == 2 ) - { - abs_.parse(buffer,parameters); - objidx_ = 14; - } else if ( key.name_ == std::string("CC") ) { cmt_.parse(buffer,parameters); @@ -536,7 +592,7 @@ namespace imc { } else if ( key.name_ == std::string("CP") ) { - cmt_.parse(buffer,parameters); + pkg_.parse(buffer,parameters); objidx_ = 7; } else if ( key.name_ == std::string("Cb") ) @@ -564,17 +620,30 @@ namespace imc { org_.parse(buffer,parameters); objidx_ = 12; } - else if ( key.name_ == std::string("NT") ) + else if ( key.name_ == std::string("NT") && key.version_ == 1 ) { trt_.parse(buffer,parameters); objidx_ = 13; } + else if ( key.name_ == std::string("CD") && key.version_ == 2 ) + { + abs2_.parse(buffer,parameters); + objidx_ = 14; + } else { - throw std::logic_error( - std::string("unsupported block associated to key ") - + key.name_ + std::to_string(key.version_) - ); + if ( key.name_.at(0) == 'C' ) + { + throw std::logic_error( + std::string("unsupported block associated to critical key ") + + key.name_ + std::to_string(key.version_) + ); + } + else + { + std::cout<<"WARNING: unsupported block associated to noncritical key " + <