diff options
-rw-r--r-- | vrt/include/vrt/Makefile.am | 1 | ||||
-rw-r--r-- | vrt/include/vrt/expanded_if_context_section.h | 16 | ||||
-rw-r--r-- | vrt/lib/Makefile.am | 1 | ||||
-rw-r--r-- | vrt/lib/expanded_if_context_section.cc | 233 |
4 files changed, 251 insertions, 0 deletions
diff --git a/vrt/include/vrt/Makefile.am b/vrt/include/vrt/Makefile.am index 183eaf9ce..eec3c9b7b 100644 --- a/vrt/include/vrt/Makefile.am +++ b/vrt/include/vrt/Makefile.am @@ -25,6 +25,7 @@ vrtinclude_HEADERS = \ bits.h \ copiers.h \ expanded_header.h \ + expanded_if_context_section.h \ rx.h \ rx_packet_handler.h \ types.h diff --git a/vrt/include/vrt/expanded_if_context_section.h b/vrt/include/vrt/expanded_if_context_section.h index aaa36585a..57adb581e 100644 --- a/vrt/include/vrt/expanded_if_context_section.h +++ b/vrt/include/vrt/expanded_if_context_section.h @@ -87,6 +87,22 @@ namespace vrt { int32_t ephemeris_ref_id; //< 7.1.5.23 exp_gps_ascii gps_ascii; //< 7.1.5.24 exp_context_assocs cntx_assoc_lists;//< 7.1.5.25 + + // Reset struct, empty all containers. + void clear(); + + /*! + * \brief Unpack IF Context section into expanded_if_context_section + * + * \param[in] context_section points to the context section of the raw IF Context pkt. + * \param[in] n32_bit_words is the length of the context_section. + * \param[out] cntx holds the result of unpacking the information found in context_section. + * + * \Returns true iff context_section is successfully parsed. + */ + static bool unpack(const uint32_t *context_section, // in + size_t n32_bit_words, // in + expanded_if_context_section *cntx); // out }; }; // namespace vrt diff --git a/vrt/lib/Makefile.am b/vrt/lib/Makefile.am index cab0b0c96..8ed5b0e87 100644 --- a/vrt/lib/Makefile.am +++ b/vrt/lib/Makefile.am @@ -32,6 +32,7 @@ libvrt_la_SOURCES = \ copiers.cc \ data_handler.cc \ expanded_header.cc \ + expanded_if_context_section.cc \ rx.cc \ rx_packet_handler.cc \ socket_rx_buffer.cc diff --git a/vrt/lib/expanded_if_context_section.cc b/vrt/lib/expanded_if_context_section.cc new file mode 100644 index 000000000..7a8c92dd8 --- /dev/null +++ b/vrt/lib/expanded_if_context_section.cc @@ -0,0 +1,233 @@ +/* -*- c++ -*- */ +/* + * Copyright 2010 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <vrt/expanded_if_context_section.h> +#include <cstring> +#include <gruel/inet.h> // ntohl + + +namespace vrt +{ + void + expanded_if_context_section::clear() + { + context_indicator = 0; + ref_point_id = 0; + if_ref_freq = 0; + rf_ref_freq = 0; + rf_ref_freq_offset = 0; + if_band_offset = 0; + ref_level = 0; + gain = 0; + over_range_count = 0; + sample_rate = 0; + timestamp_adj = 0; + timestamp_cal_time = 0; + temperature = 0; + device_id[0] = 0; + device_id[1] = 0; + state_and_event_ind = 0; + memset(&payload_fmt, 0, sizeof(payload_fmt)); + memset(&formatted_gps, 0, sizeof(formatted_gps)); + memset(&formatted_ins, 0, sizeof(formatted_ins)); + memset(&ecef_ephemeris, 0, sizeof(ecef_ephemeris)); + memset(&rel_ephemeris, 0, sizeof(rel_ephemeris)); + ephemeris_ref_id = 0; + gps_ascii.manuf_oui = 0; + gps_ascii.ascii.clear(); + cntx_assoc_lists.source.clear(); + cntx_assoc_lists.system.clear(); + cntx_assoc_lists.vector_comp.clear(); + cntx_assoc_lists.async_channel.clear(); + cntx_assoc_lists.async_tag.clear(); + } + + struct unpack_info { + const uint32_t *p; + size_t nwords; + size_t i; + + unpack_info(const uint32_t *p_, size_t nwords_) + : p(p_), nwords(nwords_), i(0) {} + + bool ensure(size_t n) + { + return (nwords - i) >= n; + } + + bool get_int32(int32_t &x) + { + if (!ensure(1)) + return false; + x = ntohl(p[i++]); + return true; + } + + bool get_uint32(uint32_t &x) + { + if (!ensure(1)) + return false; + x = ntohl(p[i++]); + return true; + } + + bool get_hertz(vrt_hertz_t &x) + { + if (!ensure(2)) + return false; + + uint32_t hi = ntohl(p[i++]); + uint32_t lo = ntohl(p[i++]); + x = ((int64_t) hi) << 32 | lo; + return true; + } + + bool get_db(vrt_db_t &x) + { + if (!ensure(1)) + return false; + x = ntohl(p[i++]); + return true; + } + + bool get_gain(vrt_gain_t &x) + { + if (!ensure(1)) + return false; + x = ntohl(p[i++]); + return true; + } + + bool get_int64(int64_t &x) + { + if (!ensure(2)) + return false; + + uint32_t hi = ntohl(p[i++]); + uint32_t lo = ntohl(p[i++]); + x = ((int64_t) hi) << 32 | lo; + return true; + } + + bool get_temp(vrt_temp_t &x) + { + if (!ensure(1)) + return false; + x = ntohl(p[i++]); + return true; + } + + }; + + + bool + expanded_if_context_section::unpack(const uint32_t *context_section, // in + size_t n32_bit_words, // in + expanded_if_context_section *e) // out + { + unpack_info u(context_section, n32_bit_words); + e->clear(); + + if (!u.get_uint32(e->context_indicator)) + return false; + uint32_t cif = e->context_indicator; + + if (cif & CI_REF_POINT_ID) + if (!u.get_uint32(e->ref_point_id)) + return false; + + if (cif & CI_BANDWIDTH) + if (!u.get_hertz(e->bandwidth)) + return false; + + if (cif & CI_IF_REF_FREQ) + if (!u.get_hertz(e->if_ref_freq)) + return false; + + if (cif & CI_RF_REF_FREQ) + if (!u.get_hertz(e->rf_ref_freq)) + return false; + + if (cif & CI_RF_REF_FREQ_OFFSET) + if (!u.get_hertz(e->rf_ref_freq_offset)) + return false; + + if (cif & CI_IF_BAND_OFFSET) + if (!u.get_hertz(e->if_band_offset)) + return false; + + if (cif & CI_REF_LEVEL) + if (!u.get_db(e->ref_level)) + return false; + + if (cif & CI_GAIN) + if (!u.get_gain(e->gain)) + return false; + + if (cif & CI_OVER_RANGE_COUNT) + if (!u.get_uint32(e->over_range_count)) + return false; + + if (cif & CI_SAMPLE_RATE) + if (!u.get_hertz(e->sample_rate)) + return false; + + if (cif & CI_TIMESTAMP_ADJ) + if (!u.get_int64(e->timestamp_adj)) + return false; + + if (cif & CI_TIMESTAMP_CAL_TIME) + if (!u.get_uint32(e->timestamp_cal_time)) + return false; + + if (cif & CI_TEMPERATURE) + if (!u.get_temp(e->temperature)) + return false; + + if (cif & CI_DEVICE_ID) + if (!u.get_uint32(e->device_id[0]) || !u.get_uint32(e->device_id[1])) + return false; + + if (cif & CI_STATE_AND_EVENT_IND) + if (!u.get_uint32(e->state_and_event_ind)) + return false; + + if (cif & CI_PAYLOAD_FMT) + if (!u.get_uint32(e->payload_fmt.word0) || !u.get_uint32(e->payload_fmt.word1)) + return false; + + // FIXME formatted_gps, formatted_ins + // FIXME ecef_ephemeris, rel_ephemeris + + if (cif & CI_EPHEMERIS_REF_ID) + if (!u.get_int32(e->ephemeris_ref_id)) + return false; + + // FIXME gps_ascii + // FIXME cntx_assoc_lists + + return true; + } + +}; // namespace vrt |