diff --git a/lib/tdm_datamodel.hpp b/lib/tdm_datamodel.hpp index 77b621c..fd28b31 100644 --- a/lib/tdm_datamodel.hpp +++ b/lib/tdm_datamodel.hpp @@ -119,6 +119,15 @@ static std::string join_strings(std::vector &thestring, const char* // https://zone.ni.com/reference/de-XX/help/370858P-0113/tdmdatamodel/tdmdatamodel/tdm_header_tdx_data/ +// define mapping of locally supported datatypes to tdm datatypes +typedef short int eInt16Usi; +typedef int eInt32Usi; +typedef unsigned char eUInt8Usi; +typedef unsigned short int eUInt16Usi; +typedef unsigned int eUInt32Usi; +typedef float eFloat32Usi; +typedef double eFloat64Usi; + enum class tdmdatatype { eInt16Usi, eInt32Usi, diff --git a/lib/tdm_reaper.cpp b/lib/tdm_reaper.cpp index 4ba2ce8..ba2ddda 100644 --- a/lib/tdm_reaper.cpp +++ b/lib/tdm_reaper.cpp @@ -491,6 +491,80 @@ std::string tdm_reaper::get_localcolumn_overview(format formatter) return summary; } +std::string tdm_reaper::get_block_overview(format formatter) +{ + // summarize all output in single string + std::string summary; + + // set tabular mode of formatter + formatter.set_tabular(true); + + // compose header + formatter.set_header(true); + block blk; + summary += blk.get_info(formatter); + std::string rule; + for ( unsigned long int i = 0; i < summary.size(); i++ ) + { + rule += std::string("-"); + } + summary += std::string("\n") + rule + std::string("\n"); + + formatter.set_header(false); + for (std::map::iterator it=tdx_blocks_.begin(); + it!=tdx_blocks_.end(); ++it) + { + summary += it->second.get_info(formatter); + summary += std::string("\n"); + } + + return summary; +} + +// template +// std::string tdm_reaper::get_overview(format formatter) +// { +// // summarize all output in single string +// std::string summary; +// +// // set tabular mode of formatter +// formatter.set_tabular(true); +// +// // compose header +// formatter.set_header(true); +// tdmelement tdmel; +// summary += tdmel.get_info(formatter); +// std::string rule; +// for ( unsigned long int i = 0; i < summary.size(); i++ ) +// { +// rule += std::string("-"); +// } +// summary += std::string("\n") + rule + std::string("\n"); +// +// formatter.set_header(false); +// std::map thedat = this->get_tdm_member(tdmel); +// for ( std::map el: thedat ) +// { +// summary += el->second.get_info(formatter) + std::string("\n"); +// } +// // for (std::map::iterator it=thedat.begin(); +// // it!=thedat.end(); ++it) +// // { +// // summary += it->second.get_info(formatter); +// // summary += std::string("\n"); +// // } +// +// return summary; +// } +// +// template +// std::map tdm_reaper::get_tdm_member(block blk) +// { +// return this->tdx_blocks_; +// } +// +// template std::string tdm_reaper::get_overview(format formatter); + // -------------------------------------------------------------------------- // std::vector tdm_reaper::get_channel(std::string &id) diff --git a/lib/tdm_reaper.hpp b/lib/tdm_reaper.hpp index 012b23c..1f3788e 100644 --- a/lib/tdm_reaper.hpp +++ b/lib/tdm_reaper.hpp @@ -149,9 +149,14 @@ public: // get full channel(group) overview std::string get_channel_overview(format chformatter); - // get submatrix/localcolumn overview + // get block/submatrix/localcolumn overview + // template + // std::string get_overview(format formatter); + // template + // std::map get_tdm_member(block blk); std::string get_submatrix_overview(format formatter); std::string get_localcolumn_overview(format formatter); + std::string get_block_overview(format formatter); // get list of channelgroup ids std::vector get_channelgroup_ids() @@ -174,6 +179,75 @@ public: } // extract channel by id + template + std::vector get_channel(std::string& id) + { + // check for existence of required channel id (=key) + if ( tdmchannels_.count(id) == 1 ) + { + // // retrieve full channel info + // tdm_channel chn = tdmchannels_.at(id); + // + // // extract (first) "localcolumn" for channel + // if ( chn.local_columns_.size() != 1 ) + // { + // throw std::runtime_error(std::string("invalid local_columns_ of channel: ") + id); + // } + // localcolumn loccol = localcolumns_.at(chn.local_columns_[0]); + // + // if ( loccol.sequence_representation_ != "explicit" ) + // { + // throw std::runtime_error(std::string("unsupported sequence_representation: ") + // + loccol.sequence_representation_); + // } + // + // // use "values" id to map to external block + // block blk = tdx_blocks_.at(loccol.external_id_); + // + // // distinguish numeric datatypes + // switch ( blk.value_type_ ) + // { + // case "eInt16Usi" : + // break; + // case "eInt32Usi" : + // break; + // case "eUInt8Usi" : + // break; + // case "eUInt16Usi" : + // break; + // case "eUInt32Usi" : + // break; + // case "eFloat32Usi" : + // // declare buffer covering the required range of "tdxbuffer_" + // std::vector blkF32( tdxbuffer_.begin()+blk.byte_offset_, + // tdxbuffer_.begin()+blk.byte_offset_ + // + blk.length_*sizeof(eFloat32Usi) ); + // std::vector datvecF32(blk.length_); + // this->convert_data_to_type(blkF32,datvecF32); + // return datvecF32; + // break; + // case "eFloat64Usi" : + // // declare buffer covering the required range of "tdxbuffer_" + // std::vector blkF64( tdxbuffer_.begin()+blk.byte_offset_, + // tdxbuffer_.begin()+blk.byte_offset_ + // + blk.length_*sizeof(eFloat64Usi) ); + // std::vector datvecF64(blk.length_); + // this->convert_data_to_type(blkF64,datvecF64); + // return datvecF64; + // break; + // case "eStringUsi" : + // throw std::runtime_error("datatype 'eStringUsi' is not supported"); + // break; + // } + } + else + { + throw std::invalid_argument(std::string("channel id does not exist: ") + id); + } + + return std::vector(); + } + // (TODO introduce template T to reference specific datatype instead of double in general) std::vector get_channel(std::string &id); diff --git a/src/main.cpp b/src/main.cpp index 2cf6886..5b3225d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -199,6 +199,10 @@ int main(int argc, char* argv[]) format formatter(18,false,false,' '); std::cout< chdata = jack.get_channel(chid); // std::vector chgrids = jack.get_channelgroup_ids(); // for ( auto el: chgrids ) std::cout<