diff options
Diffstat (limited to 'gr-pdu/lib/pdu_split_impl.cc')
-rw-r--r-- | gr-pdu/lib/pdu_split_impl.cc | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/gr-pdu/lib/pdu_split_impl.cc b/gr-pdu/lib/pdu_split_impl.cc new file mode 100644 index 0000000000..491f00683c --- /dev/null +++ b/gr-pdu/lib/pdu_split_impl.cc @@ -0,0 +1,61 @@ +/* -*- c++ -*- */ +/* + * Copyright 2021 NTESS LLC. + * + * This file is part of GNU Radio + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pdu_split_impl.h" +#include <gnuradio/io_signature.h> +#include <gnuradio/pdu/pdu.h> + +namespace gr { +namespace pdu { + +pdu_split::sptr pdu_split::make(const bool pass_empty_data) +{ + return gnuradio::make_block_sptr<pdu_split_impl>(pass_empty_data); +} + +pdu_split_impl::pdu_split_impl(const bool pass_empty_data) + : gr::block("pdu_split", io_signature::make(0, 0, 0), io_signature::make(0, 0, 0)), + d_pass_empty_data(pass_empty_data) +{ + message_port_register_in(PMTCONSTSTR__pdus()); + set_msg_handler(PMTCONSTSTR__pdus(), + [this](pmt::pmt_t msg) { this->handle_pdu(msg); }); + message_port_register_out(PMTCONSTSTR__dict()); + message_port_register_out(PMTCONSTSTR__data()); +} + +pdu_split_impl::~pdu_split_impl() {} + +void pdu_split_impl::handle_pdu(pmt::pmt_t pdu) +{ + // make sure the data is a PDU + if (!(pmt::is_pdu(pdu))) { + GR_LOG_WARN(d_logger, "Message received is not a PDU, dropping"); + return; + } + + pmt::pmt_t meta = pmt::car(pdu); + pmt::pmt_t data = pmt::cdr(pdu); + + if ((!pmt::equal(meta, pmt::PMT_NIL)) | d_pass_empty_data) { + message_port_pub(PMTCONSTSTR__dict(), meta); + } + + if (pmt::length(data) | d_pass_empty_data) { + message_port_pub(PMTCONSTSTR__data(), data); + } +} + +} /* namespace pdu */ +} /* namespace gr */ |