From 817f61bbdd180a2854116c85ccf1020e561c523f Mon Sep 17 00:00:00 2001
From: Tom Rondeau <tom@trondeau.com>
Date: Tue, 14 Jun 2016 10:48:00 -0700
Subject: digital: Complete overhaul of protocol handling

See documentation for details. In brief:

- digital_protocol_* classes added (replace packet header blocks)
- header_buffer class added
- Lots of QA

    - default packet formatter: contains access code and payload length
      fields.

    - counter packet formatter: also contains the bits/sym in the payload
      modulation and a packet number counter.

    - Also adds QA code and the infrastructure for C++ QA code in
      gr-digital.

    - New block to use the packet formatter objects.

      - The header and payload are transmitted as PDU messages out of different ports.

    - header_buffer class for header formatting.

      - Used by packet_formatter_x classes to more easily add and format
        header data for transmission.

    - New blocks that parse headers.

      - Handles either hard or soft bits. Produces an info message to
        instruct payload demod.

    - 'receive mode' to header_buffer class.

      - Designed to make extracting fields from the received header bits
        easier for packet formatter classes. Use extract_field[N] to get
        the different fields out of a collected set of header bits.  *
        Docs describing both functions with small examples for how to use
        them.

    - Don't force access code to be a multiple of 8

      - need to verify everything else handles this correctly.

      - Throw an exception in the ctor if setting the code failed and emit a
        log message.

Committed-By: Martin Braun <martin.braun@ettus.com>
---
 gr-digital/lib/protocol_parser_b_impl.cc | 83 ++++++++++++++++++++++++++++++++
 1 file changed, 83 insertions(+)
 create mode 100644 gr-digital/lib/protocol_parser_b_impl.cc

(limited to 'gr-digital/lib/protocol_parser_b_impl.cc')

diff --git a/gr-digital/lib/protocol_parser_b_impl.cc b/gr-digital/lib/protocol_parser_b_impl.cc
new file mode 100644
index 0000000000..642fcae812
--- /dev/null
+++ b/gr-digital/lib/protocol_parser_b_impl.cc
@@ -0,0 +1,83 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2015-2016 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 GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "protocol_parser_b_impl.h"
+#include <gnuradio/io_signature.h>
+#include <stdexcept>
+#include <volk/volk.h>
+#include <iostream>
+
+namespace gr {
+  namespace digital {
+
+    protocol_parser_b::sptr
+    protocol_parser_b::make(const header_format_base::sptr &format)
+    {
+      return gnuradio::get_initial_sptr
+	(new protocol_parser_b_impl(format));
+    }
+
+
+    protocol_parser_b_impl::protocol_parser_b_impl(const header_format_base::sptr &format)
+      : sync_block("protocol_parser_b",
+                   io_signature::make(1, 1, sizeof(char)),
+                   io_signature::make(0, 0, 0))
+    {
+      d_format = format;
+
+      d_out_port = pmt::mp("info");
+      message_port_register_out(d_out_port);
+    }
+
+    protocol_parser_b_impl::~protocol_parser_b_impl()
+    {
+    }
+
+    int
+    protocol_parser_b_impl::work(int noutput_items,
+                                 gr_vector_const_void_star &input_items,
+                                 gr_vector_void_star &output_items)
+    {
+      const unsigned char *in = (const unsigned char*)input_items[0];
+
+      int count = 0;
+      std::vector<pmt::pmt_t> info;
+      bool ret = d_format->parse(noutput_items, in, info, count);
+
+      if(ret) {
+        for(size_t i = 0; i < info.size(); i++) {
+          message_port_pub(d_out_port, info[i]);
+        }
+      }
+      else {
+        message_port_pub(d_out_port, pmt::PMT_F);
+      }
+
+      return count;
+    }
+
+  } /* namespace digital */
+} /* namespace gr */
-- 
cgit v1.2.3