[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] [gnuradio] 28/57: fec: updating puncturing, adding doc
From: |
git |
Subject: |
[Commit-gnuradio] [gnuradio] 28/57: fec: updating puncturing, adding documentation, adding CCSDS encoder. |
Date: |
Wed, 21 May 2014 03:10:27 +0000 (UTC) |
This is an automated email from the git hooks/post-receive script.
trondeau pushed a commit to branch master
in repository gnuradio.
commit 9a4494904c77c8516c90f2c2a18518065fe36375
Author: Tom Rondeau <address@hidden>
Date: Sun May 4 14:24:50 2014 -0400
fec: updating puncturing, adding documentation, adding CCSDS encoder.
---
gnuradio-runtime/include/gnuradio/logger.h.in | 30 +-
gr-digital/examples/demod/fec_corr_and_sync.grc | 676 ++++---
gr-fec/CMakeLists.txt | 4 +-
gr-fec/examples/CMakeLists.txt | 30 +
.../examples/fecapi_decoders.grc | 2117 +++++---------------
gr-fec/examples/fecapi_encoders.grc | 1198 +++++++++++
gr-fec/examples/fecapi_tagged_decoders.grc | 1439 +++++++++++++
gr-fec/examples/fecapi_tagged_encoders.grc | 1656 +++++++++++++++
gr-fec/grc/fec_block_tree.xml | 2 +
gr-fec/grc/fec_depuncture_bb.xml | 17 +-
gr-fec/grc/fec_extended_decoder.xml | 9 +-
gr-fec/grc/fec_extended_encoder.xml | 9 +-
gr-fec/grc/variable_cc_decoder_def_list.xml | 36 +-
gr-fec/grc/variable_cc_encoder_def_list.xml | 41 +-
gr-fec/grc/variable_ccsds_decoder_def_list.xml | 93 +
gr-fec/grc/variable_ccsds_encoder_def_list.xml | 98 +
gr-fec/include/gnuradio/fec/CMakeLists.txt | 8 +-
gr-fec/include/gnuradio/fec/cc_common.h | 16 +-
gr-fec/include/gnuradio/fec/cc_decoder.h | 100 +-
gr-fec/include/gnuradio/fec/cc_encoder.h | 95 +-
gr-fec/include/gnuradio/fec/ccsds_decoder.h | 99 +
gr-fec/include/gnuradio/fec/ccsds_encoder.h | 117 ++
gr-fec/include/gnuradio/fec/decoder.h | 38 +
gr-fec/include/gnuradio/fec/depuncture_bb.h | 66 +-
gr-fec/include/gnuradio/fec/encoder.h | 20 +
gr-fec/include/gnuradio/fec/generic_decoder.h | 179 +-
gr-fec/include/gnuradio/fec/generic_encoder.h | 99 +
gr-fec/include/gnuradio/fec/puncture_bb.h | 4 +-
gr-fec/include/gnuradio/fec/tagged_decoder.h | 96 +
gr-fec/include/gnuradio/fec/tagged_encoder.h | 75 +
gr-fec/lib/CMakeLists.txt | 10 +-
gr-fec/lib/cc_decoder_impl.cc | 249 +--
gr-fec/lib/cc_decoder_impl.h | 30 +-
gr-fec/lib/cc_encoder_impl.cc | 116 +-
gr-fec/lib/cc_encoder_impl.h | 25 +-
gr-fec/lib/ccsds_decoder_impl.cc | 192 ++
gr-fec/lib/ccsds_decoder_impl.h | 83 +
gr-fec/lib/ccsds_encoder_impl.cc | 152 ++
.../fec/cc_encoder.h => lib/ccsds_encoder_impl.h} | 45 +-
gr-fec/lib/decode_ccsds_27_fb_impl.cc | 28 +-
gr-fec/lib/decode_ccsds_27_fb_impl.h | 2 +-
gr-fec/lib/decoder_impl.cc | 41 +-
gr-fec/lib/depuncture_bb_impl.cc | 51 +-
gr-fec/lib/depuncture_bb_impl.h | 7 +-
gr-fec/lib/encoder_impl.cc | 32 +-
gr-fec/lib/encoder_impl.h | 2 +
gr-fec/lib/generic_decoder.cc | 52 +-
gr-fec/lib/generic_encoder.cc | 70 +
gr-fec/lib/tagged_decoder_impl.cc | 100 +
.../lib/{encoder_impl.h => tagged_decoder_impl.h} | 39 +-
gr-fec/lib/tagged_encoder_impl.cc | 94 +
.../lib/{encoder_impl.h => tagged_encoder_impl.h} | 36 +-
gr-fec/python/fec/capillary_threaded_decoder.py | 2 +-
gr-fec/python/fec/extended_decoder.py | 44 +-
gr-fec/python/fec/extended_encoder.py | 25 +-
gr-fec/python/fec/qa_depuncture.py | 192 ++
gr-fec/swig/fec_swig.i | 26 +-
57 files changed, 7852 insertions(+), 2360 deletions(-)
diff --git a/gnuradio-runtime/include/gnuradio/logger.h.in
b/gnuradio-runtime/include/gnuradio/logger.h.in
index 7fcc519..073a616 100644
--- a/gnuradio-runtime/include/gnuradio/logger.h.in
+++ b/gnuradio-runtime/include/gnuradio/logger.h.in
@@ -1,19 +1,19 @@
/* -*- c++ -*- */
/*
* Copyright 2012-2013 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,
@@ -69,9 +69,9 @@ namespace gr {
#define GR_LOG_ASSIGN_LOGPTR(logger,name)
#define GR_CONFIG_LOGGER(config)
#define GR_CONFIG_AND_WATCH_LOGGER(config,period)
-#define GR_LOG_GETLOGGER(logger, name)
+#define GR_LOG_GETLOGGER(logger, name)
#define GR_SET_LEVEL(name, level)
-#define GR_LOG_SET_LEVEL(logger, level)
+#define GR_LOG_SET_LEVEL(logger, level)
#define GR_GET_LEVEL(name, level)
#define GR_LOG_GET_LEVEL(logger, level)
#define GR_ADD_APPENDER(name,appender)
@@ -299,11 +299,11 @@ namespace gr {
namespace gr {
/*!
- * \brief Class to control configuration of logger.
+ * \brief Class to control configuration of logger.
* This is a singleton that cna launch a thread to wathc a config file for
changes
* \ingroup logging
*/
- class logger_config
+ class GR_RUNTIME_API logger_config
{
private:
/*! \brief filename of logger config file */
@@ -313,7 +313,7 @@ namespace gr {
/*! \brief Pointer to watch thread for config file changes */
boost::thread *watch_thread;
- /*! \brief Watcher thread method
+ /*! \brief Watcher thread method
* /param filename Name of configuration file
* /param watch_period Seconds between checks for changes in config file
*/
@@ -568,7 +568,7 @@ namespace gr {
*
* Add rolling file appender to a given logger
*
- * \return vector of string names of loggers
+ * \return vector of string names of loggers
*/
GR_RUNTIME_API std::vector<std::string> logger_get_logger_names(void);
@@ -587,9 +587,9 @@ namespace gr {
#define GR_LOG_ASSIGN_LOGPTR(logger,name)
#define GR_CONFIG_LOGGER(config)
#define GR_CONFIG_AND_WATCH_LOGGER(config,period)
-#define GR_LOG_GETLOGGER(logger, name)
+#define GR_LOG_GETLOGGER(logger, name)
#define GR_SET_LEVEL(name, level)
-#define GR_LOG_SET_LEVEL(logger, level)
+#define GR_LOG_SET_LEVEL(logger, level)
#define GR_GET_LEVEL(name, level)
#define GR_LOG_GET_LEVEL(logger, level)
#define GR_ADD_APPENDER(name,appender)
@@ -640,7 +640,7 @@ namespace gr {
* \ingroup logging
*
*/
- class logger
+ class GR_RUNTIME_API logger
{
private:
/*! \brief logger pointer to logger associated wiith this wrapper class */
@@ -726,7 +726,7 @@ namespace gr {
/**************** Start Configuration Class and Methods for Python
************/
/*!
- * \brief Function to call configuration macro from python.
+ * \brief Function to call configuration macro from python.
* Note: Configuration is only updated if filename or watch_period has
changed.
* \param config_filename Name of configuration file
* \param watch_period Seconds to wait between checking for changes in conf
file.
@@ -744,7 +744,7 @@ GR_RUNTIME_API std::vector<std::string>
gr_logger_get_logger_names(void);
/*!
* \brief Function to reset logger configuration from python
- *
+ *
*/
GR_RUNTIME_API void gr_logger_reset_config(void);
diff --git a/gr-digital/examples/demod/fec_corr_and_sync.grc
b/gr-digital/examples/demod/fec_corr_and_sync.grc
index dae7094..91a0beb 100644
--- a/gr-digital/examples/demod/fec_corr_and_sync.grc
+++ b/gr-digital/examples/demod/fec_corr_and_sync.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Thu Apr 10 11:46:45 2014</timestamp>
+ <timestamp>Thu May 1 13:24:23 2014</timestamp>
<block>
<key>options</key>
<param>
@@ -76,7 +76,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(148, 1020)</value>
+ <value>(146, 1146)</value>
</param>
<param>
<key>_rotation</key>
@@ -99,7 +99,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(175, 948)</value>
+ <value>(173, 1074)</value>
</param>
<param>
<key>_rotation</key>
@@ -122,7 +122,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(34, 1020)</value>
+ <value>(32, 1146)</value>
</param>
<param>
<key>_rotation</key>
@@ -145,7 +145,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(93, 947)</value>
+ <value>(91, 1073)</value>
</param>
<param>
<key>_rotation</key>
@@ -156,7 +156,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>bb_filter</value>
+ <value>nfilts</value>
</param>
<param>
<key>_enabled</key>
@@ -164,11 +164,11 @@
</param>
<param>
<key>value</key>
- <value>firdes.root_raised_cosine(sps, sps, 1, eb, 101)</value>
+ <value>32</value>
</param>
<param>
<key>_coordinate</key>
- <value>(509, 16)</value>
+ <value>(1301, 12)</value>
</param>
<param>
<key>_rotation</key>
@@ -179,7 +179,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>matched_filter</value>
+ <value>rrc_taps</value>
</param>
<param>
<key>_enabled</key>
@@ -187,11 +187,11 @@
</param>
<param>
<key>value</key>
- <value>firdes.root_raised_cosine(nfilts, nfilts, 1, eb,
int(11*sps*nfilts))</value>
+ <value>firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), eb,
5*sps*nfilts)</value>
</param>
<param>
<key>_coordinate</key>
- <value>(510, 87)</value>
+ <value>(1301, 82)</value>
</param>
<param>
<key>_rotation</key>
@@ -202,7 +202,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>preamble</value>
+ <value>samp_rate</value>
</param>
<param>
<key>_enabled</key>
@@ -210,11 +210,11 @@
</param>
<param>
<key>value</key>
-
<value>[1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1]</value>
+ <value>100000</value>
</param>
<param>
<key>_coordinate</key>
- <value>(317, 16)</value>
+ <value>(11, 86)</value>
</param>
<param>
<key>_rotation</key>
@@ -225,7 +225,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>sps</value>
+ <value>payload_size</value>
</param>
<param>
<key>_enabled</key>
@@ -233,11 +233,11 @@
</param>
<param>
<key>value</key>
- <value>4</value>
+ <value>120</value>
</param>
<param>
<key>_coordinate</key>
- <value>(328, 87)</value>
+ <value>(119, 87)</value>
</param>
<param>
<key>_rotation</key>
@@ -248,7 +248,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>eb</value>
+ <value>gap</value>
</param>
<param>
<key>_enabled</key>
@@ -256,11 +256,11 @@
</param>
<param>
<key>value</key>
- <value>0.35</value>
+ <value>500</value>
</param>
<param>
<key>_coordinate</key>
- <value>(409, 87)</value>
+ <value>(240, 87)</value>
</param>
<param>
<key>_rotation</key>
@@ -271,7 +271,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>gap</value>
+ <value>eb</value>
</param>
<param>
<key>_enabled</key>
@@ -279,11 +279,11 @@
</param>
<param>
<key>value</key>
- <value>500</value>
+ <value>0.35</value>
</param>
<param>
<key>_coordinate</key>
- <value>(240, 87)</value>
+ <value>(409, 87)</value>
</param>
<param>
<key>_rotation</key>
@@ -294,7 +294,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>payload_size</value>
+ <value>sps</value>
</param>
<param>
<key>_enabled</key>
@@ -302,11 +302,11 @@
</param>
<param>
<key>value</key>
- <value>120</value>
+ <value>4</value>
</param>
<param>
<key>_coordinate</key>
- <value>(119, 87)</value>
+ <value>(328, 87)</value>
</param>
<param>
<key>_rotation</key>
@@ -317,7 +317,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>samp_rate</value>
+ <value>preamble</value>
</param>
<param>
<key>_enabled</key>
@@ -325,11 +325,11 @@
</param>
<param>
<key>value</key>
- <value>100000</value>
+
<value>[1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1]</value>
</param>
<param>
<key>_coordinate</key>
- <value>(11, 86)</value>
+ <value>(317, 16)</value>
</param>
<param>
<key>_rotation</key>
@@ -340,7 +340,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>rrc_taps</value>
+ <value>matched_filter</value>
</param>
<param>
<key>_enabled</key>
@@ -348,11 +348,11 @@
</param>
<param>
<key>value</key>
- <value>firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), eb,
5*sps*nfilts)</value>
+ <value>firdes.root_raised_cosine(nfilts, nfilts, 1, eb,
int(11*sps*nfilts))</value>
</param>
<param>
<key>_coordinate</key>
- <value>(1301, 82)</value>
+ <value>(510, 87)</value>
</param>
<param>
<key>_rotation</key>
@@ -363,7 +363,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>nfilts</value>
+ <value>bb_filter</value>
</param>
<param>
<key>_enabled</key>
@@ -371,11 +371,11 @@
</param>
<param>
<key>value</key>
- <value>32</value>
+ <value>firdes.root_raised_cosine(sps, sps, 1, eb, 101)</value>
</param>
<param>
<key>_coordinate</key>
- <value>(1301, 12)</value>
+ <value>(509, 16)</value>
</param>
<param>
<key>_rotation</key>
@@ -1288,6 +1288,30 @@
<value>1.0</value>
</param>
<param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
<key>affinity</key>
<value>0</value>
</param>
@@ -1571,6 +1595,30 @@
<value>1.0</value>
</param>
<param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
@@ -1744,104 +1792,6 @@
</param>
</block>
<block>
- <key>variable_cc_decoder_def</key>
- <param>
- <key>id</key>
- <value>dec</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>value</key>
- <value>"ok"</value>
- </param>
- <param>
- <key>ndim</key>
- <value>1</value>
- </param>
- <param>
- <key>dim1</key>
- <value>16</value>
- </param>
- <param>
- <key>dim2</key>
- <value>1</value>
- </param>
- <param>
- <key>framebits</key>
- <value>framebits</value>
- </param>
- <param>
- <key>k</key>
- <value>k</value>
- </param>
- <param>
- <key>rate</key>
- <value>rate</value>
- </param>
- <param>
- <key>polys</key>
- <value>polys</value>
- </param>
- <param>
- <key>state_start</key>
- <value>0</value>
- </param>
- <param>
- <key>state_end</key>
- <value>-1</value>
- </param>
- <param>
- <key>strb</key>
- <value>"terminated"</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(257, 947)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>parameter</key>
- <param>
- <key>id</key>
- <value>puncpat</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>label</key>
- <value></value>
- </param>
- <param>
- <key>value</key>
- <value>'11'</value>
- </param>
- <param>
- <key>type</key>
- <value>string</value>
- </param>
- <param>
- <key>short_id</key>
- <value></value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(159, 1091)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>digital_correlate_access_code_xx_ts</key>
<param>
<key>id</key>
@@ -1899,6 +1849,14 @@
<value>True</value>
</param>
<param>
+ <key>_coordinate</key>
+ <value>(68, 297)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
<key>constel</key>
<value>constel</value>
</param>
@@ -1938,14 +1896,6 @@
<key>maxoutbuf</key>
<value>0</value>
</param>
- <param>
- <key>_coordinate</key>
- <value>(68, 297)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
</block>
<block>
<key>variable_qtgui_range</key>
@@ -2336,6 +2286,30 @@
<value>1.0</value>
</param>
<param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
@@ -2431,42 +2405,261 @@
</param>
</block>
<block>
- <key>qtgui_time_sink_x</key>
+ <key>blocks_char_to_float</key>
<param>
<key>id</key>
- <value>qtgui_time_sink_x_0_1_0</value>
+ <value>blocks_char_to_float_0_0_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>float</value>
+ <key>vlen</key>
+ <value>1</value>
</param>
<param>
- <key>name</key>
- <value>QT GUI Plot</value>
+ <key>scale</key>
+ <value>1</value>
</param>
<param>
- <key>size</key>
- <value>20000</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>srate</key>
- <value>samp_rate</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>autoscale</key>
- <value>False</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>ymin</key>
- <value>-1.5</value>
+ <key>_coordinate</key>
+ <value>(773, 815)</value>
</param>
<param>
- <key>ymax</key>
- <value>1.5</value>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>id</key>
+ <value>puncpat</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value></value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>string</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(157, 1217)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_cc_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>16</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>framebits</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>polys</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>state_end</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>strb</key>
+ <value>"terminated"</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(269, 1073)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_char_to_float_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(779, 903)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_sub_xx</key>
+ <param>
+ <key>id</key>
+ <value>blocks_sub_xx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1309, 931)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_time_sink_x</key>
+ <param>
+ <key>id</key>
+ <value>qtgui_time_sink_x_0_1_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value>QT GUI Plot</value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>20000</value>
+ </param>
+ <param>
+ <key>srate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-1.5</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>1.5</value>
</param>
<param>
<key>nconnections</key>
@@ -2725,94 +2918,36 @@
<value>1.0</value>
</param>
<param>
- <key>affinity</key>
+ <key>label10</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1349, 808)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>blocks_sub_xx</key>
- <param>
- <key>id</key>
- <value>blocks_sub_xx_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>float</value>
- </param>
- <param>
- <key>vlen</key>
+ <key>width10</key>
<value>1</value>
</param>
<param>
- <key>num_inputs</key>
- <value>2</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(1192, 819)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>fec_ber_bf</key>
- <param>
- <key>id</key>
- <value>fec_ber_bf_0</value>
+ <key>color10</key>
+ <value>"blue"</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>style10</key>
+ <value>1</value>
</param>
<param>
- <key>berminerrors</key>
- <value>100</value>
+ <key>marker10</key>
+ <value>-1</value>
</param>
<param>
- <key>berlimit</key>
- <value>-7.0</value>
+ <key>alpha10</key>
+ <value>1.0</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
<key>_coordinate</key>
- <value>(1125, 916)</value>
+ <value>(1466, 920)</value>
</param>
<param>
<key>_rotation</key>
@@ -2938,51 +3073,20 @@
<value>("black", "black")</value>
</param>
<param>
- <key>affinity</key>
+ <key>label10</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1349, 913)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>blocks_char_to_float</key>
- <param>
- <key>id</key>
- <value>blocks_char_to_float_0_0_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>scale</key>
- <value>1</value>
+ <key>color10</key>
+ <value>("black", "black")</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
<key>_coordinate</key>
- <value>(773, 815)</value>
+ <value>(1486, 1071)</value>
</param>
<param>
<key>_rotation</key>
@@ -2990,22 +3094,26 @@
</param>
</block>
<block>
- <key>blocks_char_to_float</key>
+ <key>fec_ber_bf</key>
<param>
<key>id</key>
- <value>blocks_char_to_float_0</value>
+ <value>fec_ber_bf_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>test_mode</key>
+ <value>False</value>
</param>
<param>
- <key>scale</key>
- <value>1</value>
+ <key>berminerrors</key>
+ <value>100</value>
+ </param>
+ <param>
+ <key>berlimit</key>
+ <value>-7.0</value>
</param>
<param>
<key>affinity</key>
@@ -3021,7 +3129,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(773, 862)</value>
+ <value>(1249, 1080)</value>
</param>
<param>
<key>_rotation</key>
@@ -3149,28 +3257,22 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>fec_extended_decoder_0</source_block_id>
- <sink_block_id>fec_ber_bf_0</sink_block_id>
+ <source_block_id>blocks_char_to_float_0_0_0</source_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>mod_with_ac_0</source_block_id>
- <sink_block_id>fec_ber_bf_0</sink_block_id>
- <source_key>1</source_key>
- <sink_key>1</sink_key>
- </connection>
- <connection>
- <source_block_id>digital_binary_slicer_fb_0</source_block_id>
- <sink_block_id>fec_ber_bf_0</sink_block_id>
+ <source_block_id>fec_ber_bf_0</source_block_id>
+ <sink_block_id>qtgui_number_sink_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_char_to_float_0_0_0</source_block_id>
+ <source_block_id>blocks_char_to_float_0</source_block_id>
<sink_block_id>blocks_sub_xx_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>0</sink_key>
+ <sink_key>1</sink_key>
</connection>
<connection>
<source_block_id>blocks_sub_xx_0</source_block_id>
@@ -3179,14 +3281,20 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_char_to_float_0</source_block_id>
- <sink_block_id>blocks_sub_xx_0</sink_block_id>
+ <source_block_id>digital_binary_slicer_fb_0</source_block_id>
+ <sink_block_id>fec_ber_bf_0</sink_block_id>
<source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>mod_with_ac_0</source_block_id>
+ <sink_block_id>fec_ber_bf_0</sink_block_id>
+ <source_key>1</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>fec_ber_bf_0</source_block_id>
- <sink_block_id>qtgui_number_sink_0</sink_block_id>
+ <source_block_id>fec_extended_decoder_0</source_block_id>
+ <sink_block_id>fec_ber_bf_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
diff --git a/gr-fec/CMakeLists.txt b/gr-fec/CMakeLists.txt
index d1e1e7b..393e542 100644
--- a/gr-fec/CMakeLists.txt
+++ b/gr-fec/CMakeLists.txt
@@ -41,6 +41,8 @@ GR_SET_GLOBAL(GR_FEC_INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/include
)
+SET(GR_PKG_FEC_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/fec)
+
########################################################################
# Begin conditional configuration
########################################################################
@@ -90,7 +92,7 @@ if(ENABLE_PYTHON)
add_subdirectory(python/fec)
add_subdirectory(grc)
endif(ENABLE_PYTHON)
-#add_subdirectory(examples)
+add_subdirectory(examples)
add_subdirectory(doc)
########################################################################
diff --git a/gr-fec/examples/CMakeLists.txt b/gr-fec/examples/CMakeLists.txt
new file mode 100644
index 0000000..b5f253b
--- /dev/null
+++ b/gr-fec/examples/CMakeLists.txt
@@ -0,0 +1,30 @@
+# Copyright 2014 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.
+
+include(GrPython)
+
+install(
+ FILES
+ fecapi_decoders.grc
+ fecapi_encoders.grc
+ fecapi_tagged_decoders.grc
+ fecapi_tagged_encoders.grc
+ DESTINATION ${GR_PKG_FEC_EXAMPLES_DIR}
+ COMPONENT "fec_python"
+)
diff --git a/gr-digital/examples/demod/fec_corr_and_sync.grc
b/gr-fec/examples/fecapi_decoders.grc
similarity index 54%
copy from gr-digital/examples/demod/fec_corr_and_sync.grc
copy to gr-fec/examples/fecapi_decoders.grc
index dae7094..1782b0f 100644
--- a/gr-digital/examples/demod/fec_corr_and_sync.grc
+++ b/gr-fec/examples/fecapi_decoders.grc
@@ -1,11 +1,11 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Thu Apr 10 11:46:45 2014</timestamp>
+ <timestamp>Wed May 7 19:28:14 2014</timestamp>
<block>
<key>options</key>
<param>
<key>id</key>
- <value>test_corr_and_sync</value>
+ <value>fecapi_decoders</value>
</param>
<param>
<key>_enabled</key>
@@ -25,7 +25,7 @@
</param>
<param>
<key>window_size</key>
- <value>2000,2000</value>
+ <value>3000,2000</value>
</param>
<param>
<key>generate_options</key>
@@ -52,6 +52,10 @@
<value></value>
</param>
<param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
<key>_coordinate</key>
<value>(10, 10)</value>
</param>
@@ -64,7 +68,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>framebits</value>
+ <value>samp_rate</value>
</param>
<param>
<key>_enabled</key>
@@ -72,11 +76,15 @@
</param>
<param>
<key>value</key>
- <value>payload_size*8</value>
+ <value>50000</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(148, 1020)</value>
+ <value>(9, 95)</value>
</param>
<param>
<key>_rotation</key>
@@ -98,8 +106,12 @@
<value>2</value>
</param>
<param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(175, 948)</value>
+ <value>(347, 716)</value>
</param>
<param>
<key>_rotation</key>
@@ -118,11 +130,15 @@
</param>
<param>
<key>value</key>
- <value>[79, 109]</value>
+ <value>[109, 79]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(34, 1020)</value>
+ <value>(163, 804)</value>
</param>
<param>
<key>_rotation</key>
@@ -144,31 +160,12 @@
<value>7</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(93, 947)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>variable</key>
- <param>
- <key>id</key>
- <value>bb_filter</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>value</key>
- <value>firdes.root_raised_cosine(sps, sps, 1, eb, 101)</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(509, 16)</value>
+ <value>(246, 719)</value>
</param>
<param>
<key>_rotation</key>
@@ -179,19 +176,23 @@
<key>variable</key>
<param>
<key>id</key>
- <value>matched_filter</value>
+ <value>polys</value>
</param>
<param>
<key>_enabled</key>
- <value>True</value>
+ <value>False</value>
</param>
<param>
<key>value</key>
- <value>firdes.root_raised_cosine(nfilts, nfilts, 1, eb,
int(11*sps*nfilts))</value>
+ <value>[79, 109]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(510, 87)</value>
+ <value>(305, 801)</value>
</param>
<param>
<key>_rotation</key>
@@ -199,45 +200,38 @@
</param>
</block>
<block>
- <key>variable</key>
+ <key>parameter</key>
<param>
<key>id</key>
- <value>preamble</value>
+ <value>puncpat</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>value</key>
-
<value>[1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1]</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(317, 16)</value>
+ <key>label</key>
+ <value></value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>value</key>
+ <value>'11'</value>
</param>
- </block>
- <block>
- <key>variable</key>
<param>
- <key>id</key>
- <value>sps</value>
+ <key>type</key>
+ <value>string</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>short_id</key>
+ <value></value>
</param>
<param>
- <key>value</key>
- <value>4</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(328, 87)</value>
+ <value>(420, 9)</value>
</param>
<param>
<key>_rotation</key>
@@ -245,68 +239,50 @@
</param>
</block>
<block>
- <key>variable</key>
+ <key>fec_extended_encoder</key>
<param>
<key>id</key>
- <value>eb</value>
+ <value>fec_extended_encoder_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>value</key>
- <value>0.35</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(409, 87)</value>
+ <key>encoder_list</key>
+ <value>enc_cc</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>threadtype</key>
+ <value>capillary</value>
</param>
- </block>
- <block>
- <key>variable</key>
<param>
- <key>id</key>
- <value>gap</value>
+ <key>puncpat</key>
+ <value>puncpat</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>lentagname</key>
+ <value>None</value>
</param>
<param>
- <key>value</key>
- <value>500</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(240, 87)</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>_rotation</key>
+ <key>minoutbuf</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>variable</key>
- <param>
- <key>id</key>
- <value>payload_size</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
<param>
- <key>value</key>
- <value>120</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(119, 87)</value>
+ <value>(440, 498)</value>
</param>
<param>
<key>_rotation</key>
@@ -314,68 +290,50 @@
</param>
</block>
<block>
- <key>variable</key>
+ <key>blocks_throttle</key>
<param>
<key>id</key>
- <value>samp_rate</value>
+ <value>blocks_throttle_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>value</key>
- <value>100000</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(11, 86)</value>
+ <key>type</key>
+ <value>byte</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>samples_per_second</key>
+ <value>samp_rate</value>
</param>
- </block>
- <block>
- <key>variable</key>
<param>
- <key>id</key>
- <value>rrc_taps</value>
+ <key>vlen</key>
+ <value>1</value>
</param>
<param>
- <key>_enabled</key>
+ <key>ignoretag</key>
<value>True</value>
</param>
<param>
- <key>value</key>
- <value>firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), eb,
5*sps*nfilts)</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1301, 82)</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>_rotation</key>
+ <key>minoutbuf</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>variable</key>
- <param>
- <key>id</key>
- <value>nfilts</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
<param>
- <key>value</key>
- <value>32</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(1301, 12)</value>
+ <value>(102, 328)</value>
</param>
<param>
<key>_rotation</key>
@@ -383,109 +341,93 @@
</param>
</block>
<block>
- <key>variable_qtgui_range</key>
+ <key>analog_random_source_x</key>
<param>
<key>id</key>
- <value>freq_offset</value>
+ <value>analog_random_source_x_0</value>
</param>
<param>
<key>_enabled</key>
- <value>True</value>
+ <value>False</value>
</param>
<param>
- <key>label</key>
- <value>Frequency Offset</value>
+ <key>type</key>
+ <value>byte</value>
</param>
<param>
- <key>value</key>
+ <key>min</key>
<value>0</value>
</param>
<param>
- <key>start</key>
- <value>-0.001</value>
+ <key>max</key>
+ <value>256</value>
</param>
<param>
- <key>stop</key>
- <value>0.001</value>
+ <key>num_samps</key>
+ <value>1000</value>
</param>
<param>
- <key>step</key>
- <value>0.00002</value>
+ <key>repeat</key>
+ <value>True</value>
</param>
<param>
- <key>widget</key>
- <value>slider</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>orient</key>
- <value>Qt.Horizontal</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>min_len</key>
- <value>200</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>gui_hint</key>
- <value>4,0,1,1</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(978, 13)</value>
+ <value>(57, 525)</value>
</param>
<param>
<key>_rotation</key>
- <value>0</value>
+ <value>180</value>
</param>
</block>
<block>
- <key>variable_qtgui_range</key>
+ <key>digital_map_bb</key>
<param>
<key>id</key>
- <value>time_offset</value>
+ <value>digital_map_bb_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>label</key>
- <value>Timing Offset</value>
- </param>
- <param>
- <key>value</key>
- <value>1</value>
- </param>
- <param>
- <key>start</key>
- <value>0.995</value>
- </param>
- <param>
- <key>stop</key>
- <value>1.005</value>
+ <key>map</key>
+ <value>[-1, 1]</value>
</param>
<param>
- <key>step</key>
- <value>0.00001</value>
- </param>
- <param>
- <key>widget</key>
- <value>slider</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>orient</key>
- <value>Qt.Horizontal</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>min_len</key>
- <value>200</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>gui_hint</key>
- <value>4,1,1,1</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(1152, 12)</value>
+ <value>(755, 528)</value>
</param>
<param>
<key>_rotation</key>
@@ -493,54 +435,38 @@
</param>
</block>
<block>
- <key>variable_qtgui_range</key>
+ <key>digital_map_bb</key>
<param>
<key>id</key>
- <value>phase</value>
+ <value>digital_map_bb_0_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>label</key>
- <value>Phase offset</value>
- </param>
- <param>
- <key>value</key>
- <value>0</value>
- </param>
- <param>
- <key>start</key>
- <value>-2*scipy.pi</value>
- </param>
- <param>
- <key>stop</key>
- <value>2*scipy.pi</value>
- </param>
- <param>
- <key>step</key>
- <value>0.1</value>
+ <key>map</key>
+ <value>[-1, 1]</value>
</param>
<param>
- <key>widget</key>
- <value>slider</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>orient</key>
- <value>Qt.Horizontal</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>min_len</key>
- <value>200</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>gui_hint</key>
- <value>3,1,1,1</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(833, 13)</value>
+ <value>(747, 349)</value>
</param>
<param>
<key>_rotation</key>
@@ -548,69 +474,42 @@
</param>
</block>
<block>
- <key>variable_constellation</key>
+ <key>blocks_char_to_float</key>
<param>
<key>id</key>
- <value>constel</value>
+ <value>blocks_char_to_float_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>value</key>
- <value>"ok"</value>
- </param>
- <param>
- <key>sym_map</key>
- <value>[0,1]</value>
- </param>
- <param>
- <key>const_points</key>
- <value>[1,- 1]</value>
- </param>
- <param>
- <key>rot_sym</key>
- <value>2</value>
- </param>
- <param>
- <key>dims</key>
+ <key>vlen</key>
<value>1</value>
</param>
<param>
- <key>precision</key>
- <value>8</value>
+ <key>scale</key>
+ <value>1</value>
</param>
<param>
- <key>soft_dec_lut</key>
- <value>None</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1496, 28)</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>_rotation</key>
+ <key>minoutbuf</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>import</key>
- <param>
- <key>id</key>
- <value>import_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
<param>
- <key>import</key>
- <value>import scipy</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(205, 11)</value>
+ <value>(940, 350)</value>
</param>
<param>
<key>_rotation</key>
@@ -618,26 +517,26 @@
</param>
</block>
<block>
- <key>digital_correlate_and_sync_cc</key>
+ <key>blocks_char_to_float</key>
<param>
<key>id</key>
- <value>digital_correlate_and_sync_cc_0</value>
+ <value>blocks_char_to_float_1</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>symbols</key>
- <value>preamble</value>
+ <key>vlen</key>
+ <value>1</value>
</param>
<param>
- <key>filter</key>
- <value>matched_filter</value>
+ <key>scale</key>
+ <value>1</value>
</param>
<param>
- <key>sps</key>
- <value>sps</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>affinity</key>
@@ -653,7 +552,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(796, 179)</value>
+ <value>(938, 529)</value>
</param>
<param>
<key>_rotation</key>
@@ -661,46 +560,42 @@
</param>
</block>
<block>
- <key>digital_pfb_clock_sync_xxx</key>
+ <key>fec_extended_decoder</key>
<param>
<key>id</key>
- <value>digital_pfb_clock_sync_xxx_0</value>
+ <value>fec_extended_decoder_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>ccf</value>
+ <key>value</key>
+ <value>fec_extended_decoder</value>
</param>
<param>
- <key>sps</key>
- <value>sps</value>
+ <key>decoder_list</key>
+ <value>dec_ccsds</value>
</param>
<param>
- <key>loop_bw</key>
- <value>2*3.14/100.0</value>
- </param>
- <param>
- <key>taps</key>
- <value>rrc_taps</value>
+ <key>threadtype</key>
+ <value>none</value>
</param>
<param>
- <key>filter_size</key>
- <value>nfilts</value>
+ <key>ann</key>
+ <value>None</value>
</param>
<param>
- <key>init_phase</key>
- <value>0</value>
+ <key>puncpat</key>
+ <value>puncpat</value>
</param>
<param>
- <key>max_dev</key>
- <value>0.5</value>
+ <key>lentagname</key>
+ <value>None</value>
</param>
<param>
- <key>osps</key>
- <value>1</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>affinity</key>
@@ -716,7 +611,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(395, 300)</value>
+ <value>(1188, 308)</value>
</param>
<param>
<key>_rotation</key>
@@ -724,85 +619,42 @@
</param>
</block>
<block>
- <key>analog_random_source_x</key>
+ <key>fec_extended_decoder</key>
<param>
<key>id</key>
- <value>analog_random_source_x_0</value>
+ <value>fec_extended_decoder_0_0</value>
</param>
<param>
<key>_enabled</key>
- <value>False</value>
- </param>
- <param>
- <key>type</key>
- <value>byte</value>
- </param>
- <param>
- <key>min</key>
- <value>0</value>
- </param>
- <param>
- <key>max</key>
- <value>256</value>
- </param>
- <param>
- <key>num_samps</key>
- <value>100000</value>
- </param>
- <param>
- <key>repeat</key>
<value>True</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(84, 162)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>180</value>
- </param>
- </block>
- <block>
- <key>blocks_vector_source_x</key>
- <param>
- <key>id</key>
- <value>blocks_vector_source_x_0_1_0</value>
+ <key>value</key>
+ <value>fec_extended_decoder</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>decoder_list</key>
+ <value>dec_cc</value>
</param>
<param>
- <key>type</key>
- <value>byte</value>
+ <key>threadtype</key>
+ <value>capillary</value>
</param>
<param>
- <key>vector</key>
- <value>(payload_size/15)*[0, 0, 1, 0, 3, 0, 7, 0, 15, 0, 31, 0, 63, 0,
127]</value>
+ <key>ann</key>
+ <value>None</value>
</param>
<param>
- <key>tags</key>
- <value>[]</value>
+ <key>puncpat</key>
+ <value>puncpat</value>
</param>
<param>
- <key>repeat</key>
- <value>True</value>
+ <key>lentagname</key>
+ <value>None</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>affinity</key>
@@ -818,75 +670,36 @@
</param>
<param>
<key>_coordinate</key>
- <value>(68, 461)</value>
+ <value>(1192, 488)</value>
</param>
<param>
<key>_rotation</key>
- <value>180</value>
+ <value>0</value>
</param>
</block>
<block>
- <key>blocks_null_sink</key>
+ <key>blocks_char_to_float</key>
<param>
<key>id</key>
- <value>blocks_null_sink_0</value>
+ <value>blocks_char_to_float_1_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
<key>vlen</key>
<value>1</value>
</param>
<param>
- <key>num_inputs</key>
+ <key>scale</key>
<value>1</value>
</param>
<param>
- <key>bus_conns</key>
- <value>[[0,],]</value>
- </param>
- <param>
- <key>affinity</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1137, 156)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>digital_mpsk_snr_est_cc</key>
- <param>
- <key>id</key>
- <value>digital_mpsk_snr_est_cc_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>2</value>
- </param>
- <param>
- <key>tag_nsamples</key>
- <value>10000</value>
- </param>
- <param>
- <key>alpha</key>
- <value>0.001</value>
- </param>
- <param>
<key>affinity</key>
<value></value>
</param>
@@ -900,7 +713,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(1131, 305)</value>
+ <value>(1562, 487)</value>
</param>
<param>
<key>_rotation</key>
@@ -908,10 +721,10 @@
</param>
</block>
<block>
- <key>blocks_tag_debug</key>
+ <key>blocks_delay</key>
<param>
<key>id</key>
- <value>blocks_tag_debug_0</value>
+ <value>blocks_delay_0_0</value>
</param>
<param>
<key>_enabled</key>
@@ -919,18 +732,14 @@
</param>
<param>
<key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>name</key>
- <value></value>
+ <value>float</value>
</param>
<param>
- <key>filter</key>
- <value>snr</value>
+ <key>delay</key>
+ <value>32</value>
</param>
<param>
- <key>num_inputs</key>
+ <key>num_ports</key>
<value>1</value>
</param>
<param>
@@ -938,41 +747,10 @@
<value>1</value>
</param>
<param>
- <key>display</key>
- <value>True</value>
- </param>
- <param>
- <key>affinity</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1439, 260)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>digital_costas_loop_cc</key>
- <param>
- <key>id</key>
- <value>digital_costas_loop_cc_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>w</key>
- <value>1*3.14/50.0</value>
- </param>
- <param>
- <key>order</key>
- <value>2</value>
- </param>
- <param>
<key>affinity</key>
<value></value>
</param>
@@ -986,7 +764,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(733, 384)</value>
+ <value>(1634, 592)</value>
</param>
<param>
<key>_rotation</key>
@@ -1005,7 +783,7 @@
</param>
<param>
<key>type</key>
- <value>complex</value>
+ <value>float</value>
</param>
<param>
<key>name</key>
@@ -1013,11 +791,11 @@
</param>
<param>
<key>size</key>
- <value>5000</value>
+ <value>2048</value>
</param>
<param>
<key>srate</key>
- <value>1</value>
+ <value>samp_rate</value>
</param>
<param>
<key>autoscale</key>
@@ -1025,15 +803,15 @@
</param>
<param>
<key>ymin</key>
- <value>-2</value>
+ <value>-0.5</value>
</param>
<param>
<key>ymax</key>
- <value>2</value>
+ <value>1.5</value>
</param>
<param>
<key>nconnections</key>
- <value>1</value>
+ <value>2</value>
</param>
<param>
<key>update_time</key>
@@ -1045,11 +823,11 @@
</param>
<param>
<key>gui_hint</key>
- <value>0,0,1,1</value>
+ <value></value>
</param>
<param>
<key>tr_mode</key>
- <value>qtgui.TRIG_MODE_TAG</value>
+ <value>qtgui.TRIG_MODE_FREE</value>
</param>
<param>
<key>tr_slope</key>
@@ -1057,11 +835,11 @@
</param>
<param>
<key>tr_level</key>
- <value>1</value>
+ <value>0.0</value>
</param>
<param>
<key>tr_delay</key>
- <value>0.0</value>
+ <value>0</value>
</param>
<param>
<key>tr_chan</key>
@@ -1069,11 +847,11 @@
</param>
<param>
<key>tr_tag</key>
- <value>time_est</value>
+ <value>""</value>
</param>
<param>
<key>label1</key>
- <value></value>
+ <value>CCSDS</value>
</param>
<param>
<key>width1</key>
@@ -1089,7 +867,7 @@
</param>
<param>
<key>marker1</key>
- <value>0</value>
+ <value>-1</value>
</param>
<param>
<key>alpha1</key>
@@ -1097,7 +875,7 @@
</param>
<param>
<key>label2</key>
- <value></value>
+ <value>CC</value>
</param>
<param>
<key>width2</key>
@@ -1117,7 +895,7 @@
</param>
<param>
<key>alpha2</key>
- <value>1.0</value>
+ <value>0.6</value>
</param>
<param>
<key>label3</key>
@@ -1288,553 +1066,134 @@
<value>1.0</value>
</param>
<param>
- <key>affinity</key>
- <value>0</value>
+ <key>label10</key>
+ <value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1132, 197)</value>
+ <key>width10</key>
+ <value>1</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>color10</key>
+ <value>"blue"</value>
</param>
- </block>
- <block>
- <key>qtgui_const_sink_x</key>
<param>
- <key>id</key>
- <value>qtgui_const_sink_x_0</value>
+ <key>style10</key>
+ <value>1</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>marker10</key>
+ <value>-1</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>alpha10</key>
+ <value>1.0</value>
</param>
<param>
- <key>name</key>
- <value>QT GUI Plot</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>size</key>
- <value>1024</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>autoscale</key>
- <value>False</value>
+ <key>_coordinate</key>
+ <value>(1889, 404)</value>
</param>
<param>
- <key>ymin</key>
- <value>-2</value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>fec_extended_encoder</key>
<param>
- <key>ymax</key>
- <value>2</value>
+ <key>id</key>
+ <value>fec_extended_encoder_1</value>
</param>
<param>
- <key>xmin</key>
- <value>-2</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>xmax</key>
- <value>2</value>
+ <key>encoder_list</key>
+ <value>enc_ccsds</value>
</param>
<param>
- <key>nconnections</key>
- <value>1</value>
+ <key>threadtype</key>
+ <value>capillary</value>
</param>
<param>
- <key>update_time</key>
- <value>0.10</value>
+ <key>puncpat</key>
+ <value>puncpat</value>
</param>
<param>
- <key>gui_hint</key>
- <value>0,1,1,1</value>
+ <key>lentagname</key>
+ <value>None</value>
</param>
<param>
- <key>label1</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>width1</key>
- <value>1</value>
- </param>
- <param>
- <key>color1</key>
- <value>"blue"</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>style1</key>
+ <key>minoutbuf</key>
<value>0</value>
</param>
<param>
- <key>marker1</key>
+ <key>maxoutbuf</key>
<value>0</value>
</param>
<param>
- <key>alpha1</key>
- <value>1.0</value>
+ <key>_coordinate</key>
+ <value>(440, 318)</value>
</param>
<param>
- <key>label2</key>
- <value></value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
<param>
- <key>width2</key>
- <value>1</value>
+ <key>id</key>
+ <value>blocks_char_to_float_0_1</value>
</param>
<param>
- <key>color2</key>
- <value>"red"</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>style2</key>
- <value>0</value>
+ <key>vlen</key>
+ <value>1</value>
</param>
<param>
- <key>marker2</key>
- <value>0</value>
+ <key>scale</key>
+ <value>1</value>
</param>
<param>
- <key>alpha2</key>
- <value>1.0</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>label3</key>
+ <key>affinity</key>
<value></value>
</param>
<param>
- <key>width3</key>
- <value>1</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>color3</key>
- <value>"green"</value>
- </param>
- <param>
- <key>style3</key>
- <value>0</value>
- </param>
- <param>
- <key>marker3</key>
- <value>0</value>
- </param>
- <param>
- <key>alpha3</key>
- <value>1.0</value>
- </param>
- <param>
- <key>label4</key>
- <value></value>
- </param>
- <param>
- <key>width4</key>
- <value>1</value>
- </param>
- <param>
- <key>color4</key>
- <value>"black"</value>
- </param>
- <param>
- <key>style4</key>
- <value>0</value>
- </param>
- <param>
- <key>marker4</key>
- <value>0</value>
- </param>
- <param>
- <key>alpha4</key>
- <value>1.0</value>
- </param>
- <param>
- <key>label5</key>
- <value></value>
- </param>
- <param>
- <key>width5</key>
- <value>1</value>
- </param>
- <param>
- <key>color5</key>
- <value>"cyan"</value>
- </param>
- <param>
- <key>style5</key>
- <value>0</value>
- </param>
- <param>
- <key>marker5</key>
- <value>0</value>
- </param>
- <param>
- <key>alpha5</key>
- <value>1.0</value>
- </param>
- <param>
- <key>label6</key>
- <value></value>
- </param>
- <param>
- <key>width6</key>
- <value>1</value>
- </param>
- <param>
- <key>color6</key>
- <value>"magenta"</value>
- </param>
- <param>
- <key>style6</key>
- <value>0</value>
- </param>
- <param>
- <key>marker6</key>
- <value>0</value>
- </param>
- <param>
- <key>alpha6</key>
- <value>1.0</value>
- </param>
- <param>
- <key>label7</key>
- <value></value>
- </param>
- <param>
- <key>width7</key>
- <value>1</value>
- </param>
- <param>
- <key>color7</key>
- <value>"yellow"</value>
- </param>
- <param>
- <key>style7</key>
- <value>0</value>
- </param>
- <param>
- <key>marker7</key>
- <value>0</value>
- </param>
- <param>
- <key>alpha7</key>
- <value>1.0</value>
- </param>
- <param>
- <key>label8</key>
- <value></value>
- </param>
- <param>
- <key>width8</key>
- <value>1</value>
- </param>
- <param>
- <key>color8</key>
- <value>"dark red"</value>
- </param>
- <param>
- <key>style8</key>
- <value>0</value>
- </param>
- <param>
- <key>marker8</key>
- <value>0</value>
- </param>
- <param>
- <key>alpha8</key>
- <value>1.0</value>
- </param>
- <param>
- <key>label9</key>
- <value></value>
- </param>
- <param>
- <key>width9</key>
- <value>1</value>
- </param>
- <param>
- <key>color9</key>
- <value>"dark green"</value>
- </param>
- <param>
- <key>style9</key>
- <value>0</value>
- </param>
- <param>
- <key>marker9</key>
- <value>0</value>
- </param>
- <param>
- <key>alpha9</key>
- <value>1.0</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(1130, 393)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>blocks_throttle</key>
- <param>
- <key>id</key>
- <value>blocks_throttle_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>samples_per_second</key>
- <value>samp_rate</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>ignoretag</key>
- <value>True</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(325, 187)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>channels_channel_model</key>
- <param>
- <key>id</key>
- <value>channels_channel_model_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>noise_voltage</key>
- <value>noise</value>
- </param>
- <param>
- <key>freq_offset</key>
- <value>freq_offset</value>
- </param>
- <param>
- <key>epsilon</key>
- <value>time_offset</value>
- </param>
- <param>
- <key>taps</key>
- <value>1.0</value>
- </param>
- <param>
- <key>seed</key>
- <value>0</value>
- </param>
- <param>
- <key>block_tags</key>
- <value>False</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(568, 163)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>blocks_ctrlport_monitor_performance</key>
- <param>
- <key>id</key>
- <value>blocks_ctrlport_monitor_performance_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>False</value>
- </param>
- <param>
- <key>en</key>
- <value>True</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(24, 624)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>digital_constellation_soft_decoder_cf</key>
- <param>
- <key>id</key>
- <value>digital_constellation_soft_decoder_cf_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>constellation</key>
- <value>constel</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(367, 572)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>variable_cc_decoder_def</key>
- <param>
- <key>id</key>
- <value>dec</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>value</key>
- <value>"ok"</value>
- </param>
- <param>
- <key>ndim</key>
- <value>1</value>
- </param>
- <param>
- <key>dim1</key>
- <value>16</value>
- </param>
- <param>
- <key>dim2</key>
- <value>1</value>
- </param>
- <param>
- <key>framebits</key>
- <value>framebits</value>
- </param>
- <param>
- <key>k</key>
- <value>k</value>
- </param>
- <param>
- <key>rate</key>
- <value>rate</value>
- </param>
- <param>
- <key>polys</key>
- <value>polys</value>
- </param>
- <param>
- <key>state_start</key>
- <value>0</value>
- </param>
- <param>
- <key>state_end</key>
- <value>-1</value>
- </param>
- <param>
- <key>strb</key>
- <value>"terminated"</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(257, 947)</value>
- </param>
- <param>
- <key>_rotation</key>
+ <key>maxoutbuf</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>parameter</key>
- <param>
- <key>id</key>
- <value>puncpat</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>label</key>
- <value></value>
- </param>
- <param>
- <key>value</key>
- <value>'11'</value>
- </param>
- <param>
- <key>type</key>
- <value>string</value>
- </param>
- <param>
- <key>short_id</key>
- <value></value>
- </param>
<param>
<key>_coordinate</key>
- <value>(159, 1091)</value>
+ <value>(441, 228)</value>
</param>
<param>
<key>_rotation</key>
@@ -1842,10 +1201,10 @@
</param>
</block>
<block>
- <key>digital_correlate_access_code_xx_ts</key>
+ <key>blocks_delay</key>
<param>
<key>id</key>
- <value>digital_correlate_access_code_xx_ts_0</value>
+ <value>blocks_delay_0</value>
</param>
<param>
<key>_enabled</key>
@@ -1856,169 +1215,20 @@
<value>float</value>
</param>
<param>
- <key>access_code</key>
-
<value>0101001100100010010110110001110100001101011100111101111100000011</value>
- </param>
- <param>
- <key>threshold</key>
- <value>3</value>
- </param>
- <param>
- <key>tagname</key>
- <value>good</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(688, 556)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>mod_with_ac</key>
- <param>
- <key>id</key>
- <value>mod_with_ac_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>constel</key>
- <value>constel</value>
- </param>
- <param>
- <key>eb</key>
- <value>eb</value>
- </param>
- <param>
- <key>payload_size</key>
- <value>payload_size</value>
- </param>
- <param>
- <key>gap</key>
- <value>gap</value>
- </param>
- <param>
- <key>sps</key>
- <value>sps</value>
- </param>
- <param>
- <key>preamble</key>
- <value>preamble</value>
- </param>
- <param>
- <key>puncpat</key>
- <value>'11'</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(68, 297)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>variable_qtgui_range</key>
- <param>
- <key>id</key>
- <value>noise</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>label</key>
- <value>Noise</value>
- </param>
- <param>
- <key>value</key>
- <value>0</value>
- </param>
- <param>
- <key>start</key>
- <value>0</value>
- </param>
- <param>
- <key>stop</key>
- <value>2</value>
- </param>
- <param>
- <key>step</key>
- <value>0.005</value>
- </param>
- <param>
- <key>widget</key>
- <value>counter_slider</value>
- </param>
- <param>
- <key>orient</key>
- <value>Qt.Horizontal</value>
- </param>
- <param>
- <key>min_len</key>
- <value>200</value>
- </param>
- <param>
- <key>gui_hint</key>
- <value>3,0,1,1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(704, 14)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>blocks_char_to_float</key>
- <param>
- <key>id</key>
- <value>blocks_char_to_float_0_0_0_0</value>
+ <key>delay</key>
+ <value>32</value>
</param>
<param>
- <key>_enabled</key>
- <value>False</value>
+ <key>num_ports</key>
+ <value>1</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
<param>
- <key>scale</key>
- <value>1</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>affinity</key>
@@ -2034,7 +1244,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(1132, 472)</value>
+ <value>(696, 228)</value>
</param>
<param>
<key>_rotation</key>
@@ -2042,306 +1252,274 @@
</param>
</block>
<block>
- <key>qtgui_time_sink_x</key>
+ <key>blocks_unpack_k_bits_bb</key>
<param>
<key>id</key>
- <value>qtgui_time_sink_x_0_1</value>
+ <value>blocks_unpack_k_bits_bb_0</value>
</param>
<param>
<key>_enabled</key>
- <value>False</value>
- </param>
- <param>
- <key>type</key>
- <value>float</value>
- </param>
- <param>
- <key>name</key>
- <value>QT GUI Plot</value>
- </param>
- <param>
- <key>size</key>
- <value>3000</value>
- </param>
- <param>
- <key>srate</key>
- <value>1</value>
- </param>
- <param>
- <key>autoscale</key>
- <value>False</value>
- </param>
- <param>
- <key>ymin</key>
- <value>-0.5</value>
- </param>
- <param>
- <key>ymax</key>
- <value>1.5</value>
- </param>
- <param>
- <key>nconnections</key>
- <value>1</value>
- </param>
- <param>
- <key>update_time</key>
- <value>0.10</value>
- </param>
- <param>
- <key>entags</key>
<value>True</value>
</param>
<param>
- <key>gui_hint</key>
- <value>1,0,1,2</value>
- </param>
- <param>
- <key>tr_mode</key>
- <value>qtgui.TRIG_MODE_TAG</value>
+ <key>k</key>
+ <value>8</value>
</param>
<param>
- <key>tr_slope</key>
- <value>qtgui.TRIG_SLOPE_POS</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>tr_level</key>
- <value>0.0</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>tr_delay</key>
- <value>0.00</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>tr_chan</key>
+ <key>maxoutbuf</key>
<value>0</value>
</param>
<param>
- <key>tr_tag</key>
- <value>good</value>
+ <key>_coordinate</key>
+ <value>(105, 430)</value>
</param>
<param>
- <key>label1</key>
- <value>After AC</value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>blocks_vector_source_x</key>
<param>
- <key>width1</key>
- <value>1</value>
+ <key>id</key>
+ <value>blocks_vector_source_x_0_1_0</value>
</param>
<param>
- <key>color1</key>
- <value>"blue"</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>style1</key>
- <value>2</value>
+ <key>type</key>
+ <value>byte</value>
</param>
<param>
- <key>marker1</key>
- <value>0</value>
+ <key>vector</key>
+ <value>(frame_size/15)*[1, 0, 1, 0, 3, 0, 7, 0, 15, 0, 31, 0, 63, 0,
127]</value>
</param>
<param>
- <key>alpha1</key>
- <value>1.0</value>
+ <key>tags</key>
+ <value>[]</value>
</param>
<param>
- <key>label2</key>
- <value></value>
+ <key>repeat</key>
+ <value>True</value>
</param>
<param>
- <key>width2</key>
+ <key>vlen</key>
<value>1</value>
</param>
<param>
- <key>color2</key>
- <value>"red"</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>style2</key>
- <value>1</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>marker2</key>
- <value>-1</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>alpha2</key>
- <value>1.0</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>label3</key>
- <value></value>
+ <key>_coordinate</key>
+ <value>(59, 200)</value>
</param>
<param>
- <key>width3</key>
- <value>1</value>
+ <key>_rotation</key>
+ <value>180</value>
</param>
+ </block>
+ <block>
+ <key>variable_cc_encoder_def</key>
<param>
- <key>color3</key>
- <value>"green"</value>
+ <key>id</key>
+ <value>enc_cc</value>
</param>
<param>
- <key>style3</key>
- <value>1</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>marker3</key>
- <value>-1</value>
+ <key>value</key>
+ <value>"ok"</value>
</param>
<param>
- <key>alpha3</key>
- <value>1.0</value>
+ <key>ndim</key>
+ <value>1</value>
</param>
<param>
- <key>label4</key>
- <value></value>
+ <key>dim1</key>
+ <value>1</value>
</param>
<param>
- <key>width4</key>
+ <key>dim2</key>
<value>1</value>
</param>
<param>
- <key>color4</key>
- <value>"black"</value>
+ <key>framebits</key>
+ <value>frame_size*8</value>
</param>
<param>
- <key>style4</key>
- <value>1</value>
+ <key>k</key>
+ <value>k</value>
</param>
<param>
- <key>marker4</key>
- <value>-1</value>
+ <key>rate</key>
+ <value>rate</value>
</param>
<param>
- <key>alpha4</key>
- <value>1.0</value>
+ <key>polys</key>
+ <value>polys</value>
</param>
<param>
- <key>label5</key>
- <value></value>
+ <key>state_start</key>
+ <value>0</value>
</param>
<param>
- <key>width5</key>
- <value>1</value>
+ <key>mode</key>
+ <value>fec.CC_STREAMING</value>
</param>
<param>
- <key>color5</key>
- <value>"cyan"</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>style5</key>
- <value>1</value>
+ <key>_coordinate</key>
+ <value>(443, 720)</value>
</param>
<param>
- <key>marker5</key>
- <value>-1</value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>variable_cc_decoder_def</key>
<param>
- <key>alpha5</key>
- <value>1.0</value>
+ <key>id</key>
+ <value>dec_cc</value>
</param>
<param>
- <key>label6</key>
- <value></value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>width6</key>
- <value>1</value>
+ <key>value</key>
+ <value>"ok"</value>
</param>
<param>
- <key>color6</key>
- <value>"magenta"</value>
+ <key>ndim</key>
+ <value>1</value>
</param>
<param>
- <key>style6</key>
+ <key>dim1</key>
<value>1</value>
</param>
<param>
- <key>marker6</key>
- <value>-1</value>
+ <key>dim2</key>
+ <value>4</value>
</param>
<param>
- <key>alpha6</key>
- <value>1.0</value>
+ <key>framebits</key>
+ <value>frame_size*8</value>
</param>
<param>
- <key>label7</key>
- <value></value>
+ <key>k</key>
+ <value>k</value>
</param>
<param>
- <key>width7</key>
- <value>1</value>
+ <key>rate</key>
+ <value>rate</value>
</param>
<param>
- <key>color7</key>
- <value>"yellow"</value>
+ <key>polys</key>
+ <value>polys</value>
</param>
<param>
- <key>style7</key>
- <value>1</value>
+ <key>state_start</key>
+ <value>0</value>
</param>
<param>
- <key>marker7</key>
+ <key>state_end</key>
<value>-1</value>
</param>
<param>
- <key>alpha7</key>
- <value>1.0</value>
+ <key>mode</key>
+ <value>fec.CC_STREAMING</value>
</param>
<param>
- <key>label8</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>width8</key>
- <value>1</value>
+ <key>_coordinate</key>
+ <value>(739, 718)</value>
</param>
<param>
- <key>color8</key>
- <value>"dark red"</value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>variable_ccsds_encoder_def</key>
<param>
- <key>style8</key>
- <value>1</value>
+ <key>id</key>
+ <value>enc_ccsds</value>
</param>
<param>
- <key>marker8</key>
- <value>-1</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>alpha8</key>
- <value>1.0</value>
+ <key>value</key>
+ <value>"ok"</value>
</param>
<param>
- <key>label9</key>
- <value></value>
+ <key>ndim</key>
+ <value>1</value>
</param>
<param>
- <key>width9</key>
+ <key>dim1</key>
<value>1</value>
</param>
<param>
- <key>color9</key>
- <value>"dark green"</value>
+ <key>dim2</key>
+ <value>4</value>
</param>
<param>
- <key>style9</key>
- <value>1</value>
+ <key>framebits</key>
+ <value>frame_size*8</value>
</param>
<param>
- <key>marker9</key>
- <value>-1</value>
+ <key>state_start</key>
+ <value>0</value>
</param>
<param>
- <key>alpha9</key>
- <value>1.0</value>
+ <key>mode</key>
+ <value>fec.CC_STREAMING</value>
</param>
<param>
- <key>affinity</key>
+ <key>alias</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(1317, 448)</value>
+ <value>(1161, 742)</value>
</param>
<param>
<key>_rotation</key>
@@ -2349,10 +1527,10 @@
</param>
</block>
<block>
- <key>fec_extended_decoder</key>
+ <key>variable_ccsds_decoder_def</key>
<param>
<key>id</key>
- <value>fec_extended_decoder_0</value>
+ <value>dec_ccsds</value>
</param>
<param>
<key>_enabled</key>
@@ -2360,39 +1538,43 @@
</param>
<param>
<key>value</key>
- <value>fec_extended_decoder</value>
+ <value>"ok"</value>
</param>
<param>
- <key>decoder_list</key>
- <value>dec</value>
+ <key>ndim</key>
+ <value>1</value>
</param>
<param>
- <key>threadtype</key>
- <value>capillary</value>
+ <key>dim1</key>
+ <value>1</value>
</param>
<param>
- <key>ann</key>
- <value>None</value>
+ <key>dim2</key>
+ <value>4</value>
</param>
<param>
- <key>puncpat</key>
- <value>puncpat</value>
+ <key>framebits</key>
+ <value>frame_size*8</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>state_start</key>
+ <value>0</value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>end_state</key>
+ <value>-1</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>mode</key>
+ <value>fec.CC_STREAMING</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(1079, 570)</value>
+ <value>(1449, 735)</value>
</param>
<param>
<key>_rotation</key>
@@ -2400,14 +1582,26 @@
</param>
</block>
<block>
- <key>digital_binary_slicer_fb</key>
+ <key>blocks_char_to_float</key>
<param>
<key>id</key>
- <value>digital_binary_slicer_fb_0</value>
+ <value>blocks_char_to_float_0_0</value>
</param>
<param>
<key>_enabled</key>
- <value>False</value>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>affinity</key>
@@ -2423,7 +1617,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(725, 678)</value>
+ <value>(1492, 350)</value>
</param>
<param>
<key>_rotation</key>
@@ -2434,7 +1628,7 @@
<key>qtgui_time_sink_x</key>
<param>
<key>id</key>
- <value>qtgui_time_sink_x_0_1_0</value>
+ <value>qtgui_time_sink_x_0_0</value>
</param>
<param>
<key>_enabled</key>
@@ -2450,7 +1644,7 @@
</param>
<param>
<key>size</key>
- <value>20000</value>
+ <value>2048</value>
</param>
<param>
<key>srate</key>
@@ -2462,7 +1656,7 @@
</param>
<param>
<key>ymin</key>
- <value>-1.5</value>
+ <value>-0.5</value>
</param>
<param>
<key>ymax</key>
@@ -2470,7 +1664,7 @@
</param>
<param>
<key>nconnections</key>
- <value>1</value>
+ <value>2</value>
</param>
<param>
<key>update_time</key>
@@ -2478,15 +1672,15 @@
</param>
<param>
<key>entags</key>
- <value>False</value>
+ <value>True</value>
</param>
<param>
<key>gui_hint</key>
- <value>1,0,1,2</value>
+ <value></value>
</param>
<param>
<key>tr_mode</key>
- <value>qtgui.TRIG_MODE_TAG</value>
+ <value>qtgui.TRIG_MODE_FREE</value>
</param>
<param>
<key>tr_slope</key>
@@ -2498,7 +1692,7 @@
</param>
<param>
<key>tr_delay</key>
- <value>0.010</value>
+ <value>0</value>
</param>
<param>
<key>tr_chan</key>
@@ -2506,11 +1700,11 @@
</param>
<param>
<key>tr_tag</key>
- <value>good</value>
+ <value>""</value>
</param>
<param>
<key>label1</key>
- <value>Input Bits</value>
+ <value>Input</value>
</param>
<param>
<key>width1</key>
@@ -2534,7 +1728,7 @@
</param>
<param>
<key>label2</key>
- <value>Recieved Bits</value>
+ <value>CCSDS</value>
</param>
<param>
<key>width2</key>
@@ -2554,7 +1748,7 @@
</param>
<param>
<key>alpha2</key>
- <value>1.0</value>
+ <value>0.6</value>
</param>
<param>
<key>label3</key>
@@ -2725,225 +1919,40 @@
<value>1.0</value>
</param>
<param>
- <key>affinity</key>
+ <key>label10</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1349, 808)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>blocks_sub_xx</key>
- <param>
- <key>id</key>
- <value>blocks_sub_xx_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>float</value>
- </param>
- <param>
- <key>vlen</key>
+ <key>width10</key>
<value>1</value>
</param>
<param>
- <key>num_inputs</key>
- <value>2</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(1192, 819)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>fec_ber_bf</key>
- <param>
- <key>id</key>
- <value>fec_ber_bf_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>berminerrors</key>
- <value>100</value>
- </param>
- <param>
- <key>berlimit</key>
- <value>-7.0</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(1125, 916)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>qtgui_number_sink</key>
- <param>
- <key>id</key>
- <value>qtgui_number_sink_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>float</value>
- </param>
- <param>
- <key>autoscale</key>
- <value>False</value>
- </param>
- <param>
- <key>avg</key>
- <value>0</value>
- </param>
- <param>
- <key>graph_type</key>
- <value>qtgui.NUM_GRAPH_HORIZ</value>
+ <key>color10</key>
+ <value>"blue"</value>
</param>
<param>
- <key>nconnections</key>
+ <key>style10</key>
<value>1</value>
</param>
<param>
- <key>min</key>
+ <key>marker10</key>
<value>-1</value>
</param>
<param>
- <key>max</key>
- <value>1</value>
- </param>
- <param>
- <key>update_time</key>
- <value>0.10</value>
- </param>
- <param>
- <key>gui_hint</key>
- <value></value>
- </param>
- <param>
- <key>label1</key>
- <value></value>
- </param>
- <param>
- <key>color1</key>
- <value>("black", "black")</value>
- </param>
- <param>
- <key>label2</key>
- <value></value>
- </param>
- <param>
- <key>color2</key>
- <value>("black", "black")</value>
- </param>
- <param>
- <key>label3</key>
- <value></value>
- </param>
- <param>
- <key>color3</key>
- <value>("black", "black")</value>
- </param>
- <param>
- <key>label4</key>
- <value></value>
- </param>
- <param>
- <key>color4</key>
- <value>("black", "black")</value>
- </param>
- <param>
- <key>label5</key>
- <value></value>
- </param>
- <param>
- <key>color5</key>
- <value>("black", "black")</value>
- </param>
- <param>
- <key>label6</key>
- <value></value>
- </param>
- <param>
- <key>color6</key>
- <value>("black", "black")</value>
- </param>
- <param>
- <key>label7</key>
- <value></value>
- </param>
- <param>
- <key>color7</key>
- <value>("black", "black")</value>
- </param>
- <param>
- <key>label8</key>
- <value></value>
- </param>
- <param>
- <key>color8</key>
- <value>("black", "black")</value>
+ <key>alpha10</key>
+ <value>1.0</value>
</param>
<param>
- <key>label9</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>color9</key>
- <value>("black", "black")</value>
- </param>
- <param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(1349, 913)</value>
+ <value>(1885, 216)</value>
</param>
<param>
<key>_rotation</key>
@@ -2951,38 +1960,26 @@
</param>
</block>
<block>
- <key>blocks_char_to_float</key>
+ <key>blocks_ctrlport_monitor_performance</key>
<param>
<key>id</key>
- <value>blocks_char_to_float_0_0_0</value>
+ <value>blocks_ctrlport_monitor_performance_0</value>
</param>
<param>
<key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
+ <value>False</value>
</param>
<param>
- <key>scale</key>
- <value>1</value>
+ <key>en</key>
+ <value>True</value>
</param>
<param>
- <key>affinity</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
<key>_coordinate</key>
- <value>(773, 815)</value>
+ <value>(557, 17)</value>
</param>
<param>
<key>_rotation</key>
@@ -2990,38 +1987,38 @@
</param>
</block>
<block>
- <key>blocks_char_to_float</key>
+ <key>parameter</key>
<param>
<key>id</key>
- <value>blocks_char_to_float_0</value>
+ <value>frame_size</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>label</key>
+ <value>Frame Size</value>
</param>
<param>
- <key>scale</key>
- <value>1</value>
+ <key>value</key>
+ <value>60</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>type</key>
+ <value>intx</value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>short_id</key>
+ <value></value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(773, 862)</value>
+ <value>(249, 7)</value>
</param>
<param>
<key>_rotation</key>
@@ -3029,164 +2026,122 @@
</param>
</block>
<connection>
- <source_block_id>channels_channel_model_0</source_block_id>
- <sink_block_id>digital_correlate_and_sync_cc_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>mod_with_ac_0</source_block_id>
+ <source_block_id>blocks_vector_source_x_0_1_0</source_block_id>
<sink_block_id>blocks_throttle_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_costas_loop_cc_0</source_block_id>
- <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>digital_costas_loop_cc_0</source_block_id>
- <sink_block_id>digital_constellation_soft_decoder_cf_0</sink_block_id>
+ <source_block_id>analog_random_source_x_0</source_block_id>
+ <sink_block_id>blocks_throttle_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_correlate_and_sync_cc_0</source_block_id>
- <sink_block_id>blocks_null_sink_0</sink_block_id>
- <source_key>1</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>digital_pfb_clock_sync_xxx_0</source_block_id>
- <sink_block_id>digital_costas_loop_cc_0</sink_block_id>
+ <source_block_id>blocks_throttle_0</source_block_id>
+ <sink_block_id>blocks_unpack_k_bits_bb_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_correlate_and_sync_cc_0</source_block_id>
- <sink_block_id>digital_pfb_clock_sync_xxx_0</sink_block_id>
+ <source_block_id>blocks_unpack_k_bits_bb_0</source_block_id>
+ <sink_block_id>fec_extended_encoder_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_throttle_0</source_block_id>
- <sink_block_id>channels_channel_model_0</sink_block_id>
+ <source_block_id>blocks_delay_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_vector_source_x_0_1_0</source_block_id>
- <sink_block_id>mod_with_ac_0</sink_block_id>
+ <source_block_id>blocks_char_to_float_0</source_block_id>
+ <sink_block_id>fec_extended_decoder_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_costas_loop_cc_0</source_block_id>
- <sink_block_id>digital_mpsk_snr_est_cc_0</sink_block_id>
+ <source_block_id>fec_extended_encoder_1</source_block_id>
+ <sink_block_id>digital_map_bb_0_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_mpsk_snr_est_cc_0</source_block_id>
- <sink_block_id>blocks_tag_debug_0</sink_block_id>
+ <source_block_id>digital_map_bb_0_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_constellation_soft_decoder_cf_0</source_block_id>
- <sink_block_id>digital_correlate_access_code_xx_ts_0</sink_block_id>
+ <source_block_id>blocks_unpack_k_bits_bb_0</source_block_id>
+ <sink_block_id>fec_extended_encoder_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_correlate_access_code_xx_ts_0</source_block_id>
- <sink_block_id>fec_extended_decoder_0</sink_block_id>
+ <source_block_id>blocks_unpack_k_bits_bb_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_0_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_costas_loop_cc_0</source_block_id>
- <sink_block_id>qtgui_const_sink_x_0</sink_block_id>
+ <source_block_id>fec_extended_encoder_0</source_block_id>
+ <sink_block_id>digital_map_bb_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>fec_extended_decoder_0</source_block_id>
- <sink_block_id>blocks_char_to_float_0_0_0_0</sink_block_id>
+ <source_block_id>digital_map_bb_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>mod_with_ac_0</source_block_id>
- <sink_block_id>blocks_char_to_float_0</sink_block_id>
- <source_key>1</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>digital_correlate_access_code_xx_ts_0</source_block_id>
- <sink_block_id>digital_binary_slicer_fb_0</sink_block_id>
+ <source_block_id>blocks_char_to_float_1</source_block_id>
+ <sink_block_id>fec_extended_decoder_0_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_binary_slicer_fb_0</source_block_id>
- <sink_block_id>blocks_char_to_float_0_0_0</sink_block_id>
+ <source_block_id>blocks_delay_0_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>0</sink_key>
+ <sink_key>1</sink_key>
</connection>
<connection>
<source_block_id>fec_extended_decoder_0</source_block_id>
- <sink_block_id>blocks_char_to_float_0_0_0</sink_block_id>
+ <sink_block_id>blocks_char_to_float_0_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_char_to_float_0_0_0_0</source_block_id>
- <sink_block_id>qtgui_time_sink_x_0_1</sink_block_id>
+ <source_block_id>blocks_char_to_float_0_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>fec_extended_decoder_0</source_block_id>
- <sink_block_id>fec_ber_bf_0</sink_block_id>
+ <source_block_id>blocks_char_to_float_0_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>mod_with_ac_0</source_block_id>
- <sink_block_id>fec_ber_bf_0</sink_block_id>
- <source_key>1</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>digital_binary_slicer_fb_0</source_block_id>
- <sink_block_id>fec_ber_bf_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>blocks_char_to_float_0_0_0</source_block_id>
- <sink_block_id>blocks_sub_xx_0</sink_block_id>
+ <source_block_id>fec_extended_decoder_0_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_1_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_sub_xx_0</source_block_id>
- <sink_block_id>qtgui_time_sink_x_0_1_0</sink_block_id>
+ <source_block_id>blocks_char_to_float_1_0</source_block_id>
+ <sink_block_id>blocks_delay_0_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_char_to_float_0</source_block_id>
- <sink_block_id>blocks_sub_xx_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>1</sink_key>
- </connection>
- <connection>
- <source_block_id>fec_ber_bf_0</source_block_id>
- <sink_block_id>qtgui_number_sink_0</sink_block_id>
+ <source_block_id>blocks_char_to_float_0_1</source_block_id>
+ <sink_block_id>blocks_delay_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
diff --git a/gr-fec/examples/fecapi_encoders.grc
b/gr-fec/examples/fecapi_encoders.grc
new file mode 100644
index 0000000..f2d320b
--- /dev/null
+++ b/gr-fec/examples/fecapi_encoders.grc
@@ -0,0 +1,1198 @@
+<?xml version='1.0' encoding='ASCII'?>
+<flow_graph>
+ <timestamp>Wed May 7 19:04:31 2014</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>id</key>
+ <value>fecapi_encoders</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value></value>
+ </param>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>2000,2000</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>qt_gui</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>50000</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(7, 95)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>7</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(353, 695)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>[79, 109]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(412, 777)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>[109, 79]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(270, 780)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(454, 692)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>id</key>
+ <value>puncpat</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value></value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>string</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(420, 9)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_throttle</key>
+ <param>
+ <key>id</key>
+ <value>blocks_throttle_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>samples_per_second</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>ignoretag</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(105, 331)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>analog_random_source_x</key>
+ <param>
+ <key>id</key>
+ <value>analog_random_source_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>256</value>
+ </param>
+ <param>
+ <key>num_samps</key>
+ <value>1000</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(111, 523)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_unpack_k_bits_bb</key>
+ <param>
+ <key>id</key>
+ <value>blocks_unpack_k_bits_bb_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>8</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(118, 440)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>id</key>
+ <value>frame_size</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Frame Size</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>60</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>intx</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(249, 9)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_vector_source_x</key>
+ <param>
+ <key>id</key>
+ <value>blocks_vector_source_x_0_1_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>vector</key>
+ <value>(frame_size/15)*[0, 0, 1, 0, 3, 0, 7, 0, 15, 0, 31, 0, 63, 0,
127]</value>
+ </param>
+ <param>
+ <key>tags</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(133, 190)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_cc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_cc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>frame_size*8</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>polys</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>mode</key>
+ <value>fec.CC_TERMINATED</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(550, 696)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_ccsds_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_ccsds</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>frame_size*8</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>mode</key>
+ <value>fec.CC_TERMINATED</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(869, 700)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>fec_extended_encoder</key>
+ <param>
+ <key>id</key>
+ <value>fec_extended_encoder_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_ccsds</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>none</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>puncpat</value>
+ </param>
+ <param>
+ <key>lentagname</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(482, 287)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_char_to_float_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(818, 318)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>fec_extended_encoder</key>
+ <param>
+ <key>id</key>
+ <value>fec_extended_encoder_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_cc</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>none</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>puncpat</value>
+ </param>
+ <param>
+ <key>lentagname</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(481, 498)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_char_to_float_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(807, 527)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_time_sink_x</key>
+ <param>
+ <key>id</key>
+ <value>qtgui_time_sink_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value>QT GUI Plot</value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>2048</value>
+ </param>
+ <param>
+ <key>srate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-0.5</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>1.5</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.05</value>
+ </param>
+ <param>
+ <key>entags</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_FREE</value>
+ </param>
+ <param>
+ <key>tr_slope</key>
+ <value>qtgui.TRIG_SLOPE_POS</value>
+ </param>
+ <param>
+ <key>tr_level</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>tr_delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_chan</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_tag</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value>CCSDS</value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value>CC</value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>0.6</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"black"</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"cyan"</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1163, 381)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_ctrlport_monitor_performance</key>
+ <param>
+ <key>id</key>
+ <value>blocks_ctrlport_monitor_performance_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>en</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(549, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>blocks_vector_source_x_0_1_0</source_block_id>
+ <sink_block_id>blocks_throttle_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>analog_random_source_x_0</source_block_id>
+ <sink_block_id>blocks_throttle_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_throttle_0</source_block_id>
+ <sink_block_id>blocks_unpack_k_bits_bb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_unpack_k_bits_bb_0</source_block_id>
+ <sink_block_id>fec_extended_encoder_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_char_to_float_1</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_char_to_float_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_extended_encoder_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_extended_encoder_1</source_block_id>
+ <sink_block_id>blocks_char_to_float_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_unpack_k_bits_bb_0</source_block_id>
+ <sink_block_id>fec_extended_encoder_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/gr-fec/examples/fecapi_tagged_decoders.grc
b/gr-fec/examples/fecapi_tagged_decoders.grc
new file mode 100644
index 0000000..b9936b8
--- /dev/null
+++ b/gr-fec/examples/fecapi_tagged_decoders.grc
@@ -0,0 +1,1439 @@
+<?xml version='1.0' encoding='ASCII'?>
+<flow_graph>
+ <timestamp>Wed May 7 19:28:30 2014</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>id</key>
+ <value>fecapi_tagged_decoders</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value></value>
+ </param>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>3000,2000</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>qt_gui</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>length_tag</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"packet_len"</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(202, 112)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>50000</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(9, 95)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>7</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(562, 734)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(663, 731)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>[109, 79]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(479, 819)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>[79, 109]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(621, 816)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>id</key>
+ <value>puncpat</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value></value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>string</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(248, 9)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>id</key>
+ <value>MTU</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>MTU</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1500</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>intx</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(365, 9)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>fec_extended_decoder</key>
+ <param>
+ <key>id</key>
+ <value>fec_extended_decoder_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>fec_extended_decoder</value>
+ </param>
+ <param>
+ <key>decoder_list</key>
+ <value>dec_cc</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>none</value>
+ </param>
+ <param>
+ <key>ann</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>puncpat</value>
+ </param>
+ <param>
+ <key>lentagname</key>
+ <value>length_tag</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(923, 464)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_char_to_float_1_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1265, 506)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_char_to_float_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(678, 506)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_map_bb</key>
+ <param>
+ <key>id</key>
+ <value>digital_map_bb_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>map</key>
+ <value>[-1, 1]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(493, 506)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_char_to_float_0_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1014, 340)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_unpack_k_bits_bb</key>
+ <param>
+ <key>id</key>
+ <value>blocks_unpack_k_bits_bb_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>8</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(359, 341)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_time_sink_x</key>
+ <param>
+ <key>id</key>
+ <value>qtgui_time_sink_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value>QT GUI Plot</value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>2048</value>
+ </param>
+ <param>
+ <key>srate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-0.5</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>1.5</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>entags</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_FREE</value>
+ </param>
+ <param>
+ <key>tr_slope</key>
+ <value>qtgui.TRIG_SLOPE_POS</value>
+ </param>
+ <param>
+ <key>tr_level</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>tr_delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_chan</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_tag</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value>Input</value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value>CC</value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>0.6</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"black"</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"cyan"</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1530, 372)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_vector_source_x</key>
+ <param>
+ <key>id</key>
+ <value>blocks_vector_source_x_0_1_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>vector</key>
+ <value>4*[0, 0, 1, 0, 3, 0, 7, 0, 15, 0, 31, 0, 63, 0, 127]</value>
+ </param>
+ <param>
+ <key>tags</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(123, 218)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_throttle</key>
+ <param>
+ <key>id</key>
+ <value>blocks_throttle_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>samples_per_second</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>ignoretag</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(100, 341)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_stream_to_tagged_stream</key>
+ <param>
+ <key>id</key>
+ <value>blocks_stream_to_tagged_stream_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>packet_len</key>
+ <value>frame_size*8</value>
+ </param>
+ <param>
+ <key>len_tag_key</key>
+ <value>length_tag</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(595, 331)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>fec_extended_encoder</key>
+ <param>
+ <key>id</key>
+ <value>fec_extended_encoder_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_cc</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>none</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>puncpat</value>
+ </param>
+ <param>
+ <key>lentagname</key>
+ <value>length_tag</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(138, 474)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>analog_random_source_x</key>
+ <param>
+ <key>id</key>
+ <value>analog_random_source_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>256</value>
+ </param>
+ <param>
+ <key>num_samps</key>
+ <value>1000</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(99, 633)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_cc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_cc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>MTU*8</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>polys</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>mode</key>
+ <value>fec.CC_STREAMING</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(759, 735)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_cc_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_cc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>MTU*8</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>polys</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>state_end</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>mode</key>
+ <value>fec.CC_STREAMING</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1060, 727)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_ctrlport_monitor_performance</key>
+ <param>
+ <key>id</key>
+ <value>blocks_ctrlport_monitor_performance_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>en</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(651, 15)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>id</key>
+ <value>frame_size</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Frame Size</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>6000</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>intx</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(484, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>analog_random_source_x_0</source_block_id>
+ <sink_block_id>blocks_throttle_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_vector_source_x_0_1_0</source_block_id>
+ <sink_block_id>blocks_throttle_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_map_bb_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_char_to_float_1</source_block_id>
+ <sink_block_id>fec_extended_decoder_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_extended_decoder_0_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_1_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_char_to_float_1_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_extended_encoder_0</source_block_id>
+ <sink_block_id>digital_map_bb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_stream_to_tagged_stream_0_0</source_block_id>
+ <sink_block_id>fec_extended_encoder_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_stream_to_tagged_stream_0_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_0_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_char_to_float_0_1</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_unpack_k_bits_bb_0_0</source_block_id>
+ <sink_block_id>blocks_stream_to_tagged_stream_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_throttle_0</source_block_id>
+ <sink_block_id>blocks_unpack_k_bits_bb_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/gr-fec/examples/fecapi_tagged_encoders.grc
b/gr-fec/examples/fecapi_tagged_encoders.grc
new file mode 100644
index 0000000..d6a0504
--- /dev/null
+++ b/gr-fec/examples/fecapi_tagged_encoders.grc
@@ -0,0 +1,1656 @@
+<?xml version='1.0' encoding='ASCII'?>
+<flow_graph>
+ <timestamp>Wed May 7 19:01:11 2014</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>id</key>
+ <value>fecapi_tagged_encoders</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value></value>
+ </param>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>2000,2000</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>qt_gui</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 9)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>7</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(421, 692)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>[109, 79]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(335, 777)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>[79, 109]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(479, 781)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(522, 694)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>50000</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(13, 88)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>length_tag</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"packet_len"</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(152, 116)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>analog_random_source_x</key>
+ <param>
+ <key>id</key>
+ <value>analog_random_source_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>256</value>
+ </param>
+ <param>
+ <key>num_samps</key>
+ <value>1000</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(92, 616)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_unpack_k_bits_bb</key>
+ <param>
+ <key>id</key>
+ <value>blocks_unpack_k_bits_bb_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>8</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(128, 428)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_throttle</key>
+ <param>
+ <key>id</key>
+ <value>blocks_throttle_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>samples_per_second</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>ignoretag</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(120, 355)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_vector_source_x</key>
+ <param>
+ <key>id</key>
+ <value>blocks_vector_source_x_0_1_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>vector</key>
+ <value>4*[0, 0, 1, 0, 3, 0, 7, 0, 15, 0, 31, 0, 63, 0, 127]</value>
+ </param>
+ <param>
+ <key>tags</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(94, 226)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>id</key>
+ <value>puncpat</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value></value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>string</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(247, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>id</key>
+ <value>MTU</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>MTU</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1500</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>intx</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(364, 9)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_stream_to_tagged_stream</key>
+ <param>
+ <key>id</key>
+ <value>blocks_stream_to_tagged_stream_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>packet_len</key>
+ <value>frame_size*8</value>
+ </param>
+ <param>
+ <key>len_tag_key</key>
+ <value>length_tag</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(158, 515)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>fec_extended_encoder</key>
+ <param>
+ <key>id</key>
+ <value>fec_extended_encoder_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_cc</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>none</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>puncpat</value>
+ </param>
+ <param>
+ <key>lentagname</key>
+ <value>length_tag</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(540, 494)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>fec_extended_encoder</key>
+ <param>
+ <key>id</key>
+ <value>fec_extended_encoder_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_ccsds</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>none</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>puncpat</value>
+ </param>
+ <param>
+ <key>lentagname</key>
+ <value>length_tag</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(541, 339)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_cc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_cc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>MTU*8</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>polys</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>mode</key>
+ <value>fec.CC_TERMINATED</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(621, 693)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_ccsds_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_ccsds</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>MTU*8</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>mode</key>
+ <value>fec.CC_TERMINATED</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(915, 695)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_time_sink_x</key>
+ <param>
+ <key>id</key>
+ <value>qtgui_time_sink_x_0_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value>QT GUI Plot</value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>2048</value>
+ </param>
+ <param>
+ <key>srate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-0.5</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>1.5</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.05</value>
+ </param>
+ <param>
+ <key>entags</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_FREE</value>
+ </param>
+ <param>
+ <key>tr_slope</key>
+ <value>qtgui.TRIG_SLOPE_POS</value>
+ </param>
+ <param>
+ <key>tr_level</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>tr_delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_chan</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_tag</key>
+ <value>packet_len</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value>CCSDS</value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value>CC</value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>0.6</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"black"</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"cyan"</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1106, 494)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>id</key>
+ <value>frame_size</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Frame Size</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>60</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>intx</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(483, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_time_sink_x</key>
+ <param>
+ <key>id</key>
+ <value>qtgui_time_sink_x_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value>QT GUI Plot</value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>2048</value>
+ </param>
+ <param>
+ <key>srate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-0.5</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>1.5</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.05</value>
+ </param>
+ <param>
+ <key>entags</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_FREE</value>
+ </param>
+ <param>
+ <key>tr_slope</key>
+ <value>qtgui.TRIG_SLOPE_POS</value>
+ </param>
+ <param>
+ <key>tr_level</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>tr_delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_chan</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_tag</key>
+ <value>packet_len</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value>CCSDS</value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value>CC</value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>0.6</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"black"</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"cyan"</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1111, 339)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_char_to_float_1_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(880, 370)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_char_to_float_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(881, 525)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_ctrlport_monitor_performance</key>
+ <param>
+ <key>id</key>
+ <value>blocks_ctrlport_monitor_performance_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>en</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(651, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>blocks_stream_to_tagged_stream_0_0</source_block_id>
+ <sink_block_id>fec_extended_encoder_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_stream_to_tagged_stream_0_0</source_block_id>
+ <sink_block_id>fec_extended_encoder_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_extended_encoder_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>analog_random_source_x_0</source_block_id>
+ <sink_block_id>blocks_throttle_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_vector_source_x_0_1_0</source_block_id>
+ <sink_block_id>blocks_throttle_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_unpack_k_bits_bb_0_0</source_block_id>
+ <sink_block_id>blocks_stream_to_tagged_stream_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_throttle_0</source_block_id>
+ <sink_block_id>blocks_unpack_k_bits_bb_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_char_to_float_1</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_char_to_float_1_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_extended_encoder_0_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_1_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/gr-fec/grc/fec_block_tree.xml b/gr-fec/grc/fec_block_tree.xml
index de975ca..4d1a51a 100644
--- a/gr-fec/grc/fec_block_tree.xml
+++ b/gr-fec/grc/fec_block_tree.xml
@@ -11,10 +11,12 @@
<cat>
<name>Decoders</name>
<block>variable_cc_decoder_def</block>
+ <block>variable_ccsds_decoder_def</block>
</cat>
<cat>
<name>Encoders</name>
<block>variable_cc_encoder_def</block>
+ <block>variable_ccsds_encoder_def</block>
</cat>
<block>fec_extended_encoder</block>
<block>fec_extended_decoder</block>
diff --git a/gr-fec/grc/fec_depuncture_bb.xml b/gr-fec/grc/fec_depuncture_bb.xml
index 37173b3..1a7615d 100644
--- a/gr-fec/grc/fec_depuncture_bb.xml
+++ b/gr-fec/grc/fec_depuncture_bb.xml
@@ -3,11 +3,11 @@
<name>Depuncture</name>
<key>fec_depuncture_bb</key>
<import>from gnuradio import fec</import>
- <make>fec.depucture_bb($delay, $puncpat, $puncholes, $puncsize)</make>
+ <make>fec.depucture_bb($delay, $puncpat, $puncholes, $puncsize, $sym)</make>
<param>
- <name>Delay</name>
- <key>delay</key>
+ <name>Puncture Size</name>
+ <key>puncsize</key>
<type>int</type>
</param>
@@ -18,15 +18,18 @@
</param>
<param>
- <name>Puncture Holes</name>
- <key>puncholes</key>
+ <name>Delay</name>
+ <key>delay</key>
+ <value>0</value>
<type>int</type>
</param>
<param>
- <name>Puncture Size</name>
- <key>puncsize</key>
+ <name>Symbol</name>
+ <key>sym</key>
+ <value>127</value>
<type>int</type>
+ <hide>part</hide>
</param>
<sink>
diff --git a/gr-fec/grc/fec_extended_decoder.xml
b/gr-fec/grc/fec_extended_decoder.xml
index 4262a39..b41c18a 100644
--- a/gr-fec/grc/fec_extended_decoder.xml
+++ b/gr-fec/grc/fec_extended_decoder.xml
@@ -3,7 +3,7 @@
<name>FEC Extended Decoder</name>
<key>fec_extended_decoder</key>
<import>from gnuradio import fec</import>
- <make>self.$(id) = $(id) =
fec.extended_decoder(decoder_obj_list=$decoder_list, threading=$threadtype.arg,
ann=$ann, puncpat=$puncpat, integration_period=10000)</make>
+ <make>self.$(id) = $(id) =
fec.extended_decoder(decoder_obj_list=$decoder_list, threading=$threadtype.arg,
ann=$ann, puncpat=$puncpat, integration_period=10000,
lentagname=$lentagname)</make>
<param>
<name>fake val</name>
@@ -55,6 +55,13 @@
<type>string</type>
</param>
+ <param>
+ <name>Length Tag Name</name>
+ <key>lentagname</key>
+ <value>None</value>
+ <type>string</type>
+ </param>
+
<sink>
<name>in</name>
<type>float</type>
diff --git a/gr-fec/grc/fec_extended_encoder.xml
b/gr-fec/grc/fec_extended_encoder.xml
index 5055ca0..2c785c7 100644
--- a/gr-fec/grc/fec_extended_encoder.xml
+++ b/gr-fec/grc/fec_extended_encoder.xml
@@ -3,7 +3,7 @@
<name>FEC Extended Encoder</name>
<key>fec_extended_encoder</key>
<import>from gnuradio import fec</import>
- <make>fec.extended_encoder(encoder_obj_list=$encoder_list,
threading=$threadtype.arg, puncpat=$puncpat, )</make>
+ <make>fec.extended_encoder(encoder_obj_list=$encoder_list,
threading=$threadtype.arg, puncpat=$puncpat, lentagname=$lentagname)</make>
<param>
<name>Encoder Objects</name>
@@ -40,6 +40,13 @@
<type>string</type>
</param>
+ <param>
+ <name>Length Tag Name</name>
+ <key>lentagname</key>
+ <value>None</value>
+ <type>string</type>
+ </param>
+
<sink>
<name>in</name>
<type>byte</type>
diff --git a/gr-fec/grc/variable_cc_decoder_def_list.xml
b/gr-fec/grc/variable_cc_decoder_def_list.xml
index 52ec1c4..57d8ef5 100644
--- a/gr-fec/grc/variable_cc_decoder_def_list.xml
+++ b/gr-fec/grc/variable_cc_decoder_def_list.xml
@@ -10,9 +10,9 @@
<import>from gnuradio import fec</import>
<var_make>
#if int($ndim())==1 #
-self.$(id) = $(id) = map( (lambda a: fec.cc_decoder.make($framebits, $k,
$rate, $polys, $state_start, $state_end, $strb.tailbiting, $strb.terminated,
$strb.truncated, $strb.streaming )), range(0,$dim1) ); #slurp
+self.$(id) = $(id) = map( (lambda a: fec.cc_decoder.make($framebits, $k,
$rate, $polys, $state_start, $state_end, $mode)), range(0,$dim1) ); #slurp
#else
-self.$(id) = $(id) = map( (lambda b: map( ( lambda a:
fec.cc_decoder.make($framebits, $k, $rate, $polys, $state_start, $state_end,
$strb.tailbiting, $strb.terminated, $strb.truncated, $strb.streaming )),
range(0,$dim2) ) ), range(0,$dim1)); #slurp
+self.$(id) = $(id) = map( (lambda b: map( ( lambda a:
fec.cc_decoder.make($framebits, $k, $rate, $polys, $state_start, $state_end,
$mode)), range(0,$dim2) ) ), range(0,$dim1)); #slurp
#end if</var_make>
<make></make>
@@ -100,45 +100,27 @@ self.$(id) = $(id) = map( (lambda b: map( ( lambda a:
fec.cc_decoder.make($frame
<param>
<name>Streaming Behavior</name>
- <key>strb</key>
+ <key>mode</key>
<value></value>
<type>enum</type>
<option>
<name>Streaming</name>
- <key>"streaming"</key>
- <opt>streaming:True</opt>
- <opt>tailbiting:False</opt>
- <opt>terminated:False</opt>
- <opt>truncated:False</opt>
+ <key>fec.CC_STREAMING</key>
</option>
<option>
- <name>Tailbiting</name>
- <key>"tailbiting"</key>
- <opt>streaming:False</opt>
- <opt>tailbiting:True</opt>
- <opt>terminated:False</opt>
- <opt>truncated:False</opt>
+ <name>Terminated</name>
+ <key>fec.CC_TERMINATED</key>
</option>
<option>
- <name>Terminated</name>
- <key>"terminated"</key>
- <opt>streaming:False</opt>
- <opt>tailbiting:False</opt>
- <opt>terminated:True</opt>
- <opt>truncated:False</opt>
+ <name>Tailbiting</name>
+ <key>fec.CC_TAILBITING</key>
</option>
<option>
<name>Truncated</name>
- <key>"truncated"</key>
- <opt>streaming:False</opt>
- <opt>tailbiting:False</opt>
- <opt>terminated:False</opt>
- <opt>truncated:True</opt>
+ <key>fec.CC_TRUNCATED</key>
</option>
</param>
<doc>
- This instantiates a 1-dim array of decoders or a 2-dim array of
decoders
- See Nick if things break.
</doc>
</block>
diff --git a/gr-fec/grc/variable_cc_encoder_def_list.xml
b/gr-fec/grc/variable_cc_encoder_def_list.xml
index 18bc251..6b20401 100644
--- a/gr-fec/grc/variable_cc_encoder_def_list.xml
+++ b/gr-fec/grc/variable_cc_encoder_def_list.xml
@@ -10,9 +10,9 @@
<import>from gnuradio import fec</import>
<var_make>
#if int($ndim())==1 #
-self.$(id) = $(id) = map( (lambda a: fec.cc_encoder_make($framebits, $k,
$rate, $polys, $state_start, $state_end, $strb.tailbiting, $strb.terminated,
$strb.truncated, $strb.streaming )), range(0,$dim1) ); #slurp
+self.$(id) = $(id) = map( (lambda a: fec.cc_encoder_make($framebits, $k,
$rate, $polys, $state_start, $mode)), range(0,$dim1) ); #slurp
#else
-self.$(id) = $(id) = map( (lambda b: map( ( lambda a:
fec.cc_encoder_make($framebits, $k, $rate, $polys, $state_start, $state_end,
$strb.tailbiting, $strb.terminated, $strb.truncated, $strb.streaming )),
range(0,$dim2) ) ), range(0,$dim1)); #slurp
+self.$(id) = $(id) = map( (lambda b: map( ( lambda a:
fec.cc_encoder_make($framebits, $k, $rate, $polys, $state_start, $mode)),
range(0,$dim2) ) ), range(0,$dim1)); #slurp
#end if</var_make>
<make></make>
@@ -92,48 +92,25 @@ self.$(id) = $(id) = map( (lambda b: map( ( lambda a:
fec.cc_encoder_make($frame
</param>
<param>
- <name>End State</name>
- <key>state_end</key>
- <value>-1</value>
- <type>int</type>
- </param>
-
- <param>
<name>Streaming Behavior</name>
- <key>strb</key>
+ <key>mode</key>
<value></value>
<type>enum</type>
<option>
<name>Streaming</name>
- <key>"streaming"</key>
- <opt>streaming:True</opt>
- <opt>tailbiting:False</opt>
- <opt>terminated:False</opt>
- <opt>truncated:False</opt>
+ <key>fec.CC_STREAMING</key>
</option>
<option>
- <name>Tailbiting</name>
- <key>"tailbiting"</key>
- <opt>streaming:False</opt>
- <opt>tailbiting:True</opt>
- <opt>terminated:False</opt>
- <opt>truncated:False</opt>
+ <name>Terminated</name>
+ <key>fec.CC_TERMINATED</key>
</option>
<option>
- <name>Terminated</name>
- <key>"terminated"</key>
- <opt>streaming:False</opt>
- <opt>tailbiting:False</opt>
- <opt>terminated:True</opt>
- <opt>truncated:False</opt>
+ <name>Tailbiting</name>
+ <key>fec.CC_TAILBITING</key>
</option>
<option>
<name>Truncated</name>
- <key>"truncated"</key>
- <opt>streaming:False</opt>
- <opt>tailbiting:False</opt>
- <opt>terminated:False</opt>
- <opt>truncated:True</opt>
+ <key>fec.CC_TRUNCATED</key>
</option>
</param>
diff --git a/gr-fec/grc/variable_ccsds_decoder_def_list.xml
b/gr-fec/grc/variable_ccsds_decoder_def_list.xml
new file mode 100644
index 0000000..1017a81
--- /dev/null
+++ b/gr-fec/grc/variable_ccsds_decoder_def_list.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+# FEC CCSDS Decoder
+###################################################
+ -->
+<block>
+ <name>CCSDS Decoder Definition</name>
+ <key>variable_ccsds_decoder_def</key>
+ <import>from gnuradio import fec</import>
+ <var_make>
+#if int($ndim())==1 #
+self.$(id) = $(id) = map( (lambda a: fec.ccsds_decoder.make($framebits,
$state_start, $end_state, $mode)), range(0,$dim1) ); #slurp
+#else
+self.$(id) = $(id) = map( (lambda b: map( ( lambda a:
fec.ccsds_decoder.make($framebits, $state_start, $end_state, $mode)),
range(0,$dim2) ) ), range(0,$dim1)); #slurp
+#end if</var_make>
+ <make></make>
+
+ <param>
+ <name>Ignore Me</name>
+ <key>value</key>
+ <value>"ok"</value>
+ <type>raw</type>
+ <hide>all</hide>
+ </param>
+
+ <param>
+ <name>Threading Dimensions</name>
+ <key>ndim</key>
+ <value></value>
+ <type>enum</type>
+ <option>
+ <name>2</name>
+ <key>2</key>
+ </option>
+ <option>
+ <name>1</name>
+ <key>1</key>
+ </option>
+
+ </param>
+
+ <param>
+ <name>Dimension 1</name>
+ <key>dim1</key>
+ <value>4</value>
+ <type>int</type>
+ <hide>#if (int($ndim()) >= 1) then 'none' else 'all' #</hide>
+ </param>
+
+ <param>
+ <name>Dimension 2</name>
+ <key>dim2</key>
+ <value>4</value>
+ <type>int</type>
+ <hide>#if (int($ndim()) >= 2) then 'none' else 'all' #</hide>
+ </param>
+
+ <param>
+ <name>Frame Bits</name>
+ <key>framebits</key>
+ <value>2048</value>
+ <type>int</type>
+ </param>
+
+ <param>
+ <name>Start State</name>
+ <key>state_start</key>
+ <value>0</value>
+ <type>int</type>
+ </param>
+
+ <param>
+ <name>End State</name>
+ <key>end_state</key>
+ <value>-1</value>
+ <type>int</type>
+ </param>
+
+ <param>
+ <name>Streaming Behavior</name>
+ <key>mode</key>
+ <value></value>
+ <type>enum</type>
+ <option>
+ <name>Streaming</name>
+ <key>fec.CC_STREAMING</key>
+ </option>
+ </param>
+
+ <doc>
+ </doc>
+</block>
diff --git a/gr-fec/grc/variable_ccsds_encoder_def_list.xml
b/gr-fec/grc/variable_ccsds_encoder_def_list.xml
new file mode 100644
index 0000000..72623a6
--- /dev/null
+++ b/gr-fec/grc/variable_ccsds_encoder_def_list.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+# FEC MAKING FOR GREAT JUSTICE
+###################################################
+ -->
+<block>
+ <name>CCSDS Encoder Definition</name>
+ <key>variable_ccsds_encoder_def</key>
+ <import>from gnuradio import fec</import>
+ <var_make>
+#if int($ndim())==1 #
+self.$(id) = $(id) = map( (lambda a: fec.ccsds_encoder_make($framebits,
$state_start, $mode)), range(0,$dim1) ); #slurp
+#else
+self.$(id) = $(id) = map( (lambda b: map( ( lambda a:
fec.ccsds_encoder_make($framebits, $state_start, $mode)), range(0,$dim2) ) ),
range(0,$dim1)); #slurp
+#end if</var_make>
+ <make></make>
+
+ <param>
+ <name>Ignore Me</name>
+ <key>value</key>
+ <value>"ok"</value>
+ <type>raw</type>
+ <hide>all</hide>
+ </param>
+
+ <param>
+ <name>Threading Dimensions</name>
+ <key>ndim</key>
+ <value></value>
+ <type>enum</type>
+ <option>
+ <name>2</name>
+ <key>2</key>
+ </option>
+ <option>
+ <name>1</name>
+ <key>1</key>
+ </option>
+
+ </param>
+
+ <param>
+ <name>Dimension 1</name>
+ <key>dim1</key>
+ <value>4</value>
+ <type>int</type>
+ <hide>#if (int($ndim()) >= 1) then 'none' else 'all' #</hide>
+ </param>
+
+ <param>
+ <name>Dimension 2</name>
+ <key>dim2</key>
+ <value>4</value>
+ <type>int</type>
+ <hide>#if (int($ndim()) >= 2) then 'none' else 'all' #</hide>
+ </param>
+
+ <param>
+ <name>Frame Bits</name>
+ <key>framebits</key>
+ <value>2048</value>
+ <type>int</type>
+ </param>
+
+ <param>
+ <name>Start State</name>
+ <key>state_start</key>
+ <value>0</value>
+ <type>int</type>
+ </param>
+
+ <param>
+ <name>Streaming Behavior</name>
+ <key>mode</key>
+ <value></value>
+ <type>enum</type>
+ <option>
+ <name>Streaming</name>
+ <key>fec.CC_STREAMING</key>
+ </option>
+ <option>
+ <name>Terminated</name>
+ <key>fec.CC_TERMINATED</key>
+ </option>
+ <option>
+ <name>Tailbiting</name>
+ <key>fec.CC_TAILBITING</key>
+ </option>
+ <option>
+ <name>Truncated</name>
+ <key>fec.CC_TRUNCATED</key>
+ </option>
+ </param>
+
+ <doc>
+ </doc>
+</block>
diff --git a/gr-fec/include/gnuradio/fec/CMakeLists.txt
b/gr-fec/include/gnuradio/fec/CMakeLists.txt
index 68aae6a..01b1e71 100644
--- a/gr-fec/include/gnuradio/fec/CMakeLists.txt
+++ b/gr-fec/include/gnuradio/fec/CMakeLists.txt
@@ -78,10 +78,14 @@ install(FILES
api.h
generic_decoder.h
generic_encoder.h
- encoder.h
decoder.h
- cc_encoder.h
+ encoder.h
+ tagged_decoder.h
+ tagged_encoder.h
cc_decoder.h
+ cc_encoder.h
+ ccsds_decoder.h
+ ccsds_encoder.h
decode_ccsds_27_fb.h
encode_ccsds_27_bb.h
rs.h
diff --git a/gr-fec/include/gnuradio/fec/cc_common.h
b/gr-fec/include/gnuradio/fec/cc_common.h
index 33cf915..8abf565 100644
--- a/gr-fec/include/gnuradio/fec/cc_common.h
+++ b/gr-fec/include/gnuradio/fec/cc_common.h
@@ -23,25 +23,29 @@
#ifndef INCLUDED_FEC_CC_COMMON_H
#define INCLUDED_FEC_CC_COMMON_H
-typedef unsigned char DECISIONTYPE;
-typedef unsigned char COMPUTETYPE;
+typedef enum _cc_mode_t {
+ CC_STREAMING = 0,
+ CC_TERMINATED,
+ CC_TRUNCATED,
+ CC_TAILBITING
+} cc_mode_t;
typedef union {
//decision_t is a BIT vector
- DECISIONTYPE* t;
+ unsigned char* t;
unsigned int* w;
unsigned short* s;
unsigned char* c;
} decision_t;
typedef union {
- COMPUTETYPE* t;
+ unsigned char* t;
} metric_t;
struct v {
- COMPUTETYPE *metrics;
+ unsigned char *metrics;
metric_t old_metrics,new_metrics,metrics1,metrics2; /* Pointers to path
metrics, swapped on every bit */
- DECISIONTYPE *decisions;
+ unsigned char *decisions;
};
#endif /*INCLUDED_FEC_CC_COMMON_H*/
diff --git a/gr-fec/include/gnuradio/fec/cc_decoder.h
b/gr-fec/include/gnuradio/fec/cc_decoder.h
index 3babb5e..11f2112 100644
--- a/gr-fec/include/gnuradio/fec/cc_decoder.h
+++ b/gr-fec/include/gnuradio/fec/cc_decoder.h
@@ -25,32 +25,94 @@
#include <gnuradio/fec/api.h>
#include <gnuradio/fec/generic_decoder.h>
+#include <gnuradio/fec/cc_common.h>
#include <map>
#include <string>
-//#include <fec/cc_common.h>
namespace gr {
namespace fec {
namespace code {
- typedef void(*conv_kernel)(unsigned char *Y, unsigned char *X,
- unsigned char *syms, unsigned char *dec,
- unsigned int framebits, unsigned int excess,
- unsigned char *Branchtab);
-
- class FEC_API cc_decoder : virtual public generic_decoder
- {
- public:
- static generic_decoder::sptr make
- (int framebits, int k,
- int rate, std::vector<int> polys,
- int start_state = 0, int end_state = -1,
- bool tailbiting = false, bool terminated = false,
- bool truncated = false, bool streaming = false);
-
- virtual void set_framebits(int framebits) = 0;
- virtual void generic_work(void *inBuffer, void *outbuffer) = 0;
- };
+ typedef void(*conv_kernel)(unsigned char *Y, unsigned char *X,
+ unsigned char *syms, unsigned char *dec,
+ unsigned int framebits, unsigned int excess,
+ unsigned char *Branchtab);
+
+ /*!
+ * \brief Convolutional Code Decoding class.
+ * \ingroup error_coding_blk
+ *
+ * \details
+ * This class performs convolutional decoding via the Viterbi
+ * algorithm. While it is set up to take variable values for K,
+ * rate, and the polynomials, currently, the block is only
+ * capable of handling the following settings:
+ *
+ * \li K = 7
+ * \li rate = 1/2 (given as 2 to the constructor)
+ * \li polynomials = [109, 79]
+ *
+ * This is the well-known convolutional part of the Voyager code
+ * implemented in the CCSDS encoder. See
+ * gr::fec::code::ccsds_decoder for another variation on this
+ * block.
+ *
+ * Currently, in profiling tests run, the VOLK-accelerated
+ * Viterbi code used in this block specific to the CCSDS code
+ * runs faster than the ccsds_decoder version. Furthenr, due to
+ * I/O issues, the ccsds_decoder does not fully handle all
+ * streaming behaviors, only 'Streaming' mode. This block
+ * enables all four streaming modes.
+ *
+ * The intent of having both FECAPI code classes is to
+ * eventually allow this block to take on generic settings, much
+ * like the cc_encoder class. The ccsds_decoder would then
+ * handle this specific code case as optimized as possible.
+ *
+ * The encoder is set up wtih a number of bits per frame in the
+ * constructor. When not being used in a tagged stream mode,
+ * this encoder will only process frames of the length provided
+ * here. If used in a tagged stream block, this setting becomes
+ * the maximum allowable frame size that the block may process.
+ */
+ class FEC_API cc_decoder : virtual public generic_decoder
+ {
+ public:
+
+ /*!
+ * Build a convolutional code decoding FECAPI object.
+ *
+ * \param frame_size Number of bits per frame. If using in the
+ * tagged stream style, this is the maximum allowable
+ * number of bits per frame.
+ * \param k Constraint length (K) of the encoder.
+ * \param rate Inverse of the coder's rate
+ * (rate=2 means 2 output bits per 1 input).
+ * \param polys Vector of polynomials as integers.
+ * \param start_state Initialization state of the shift register.
+ * \param end_state Ending state of the shift register.
+ * \param mode cc_mode_t mode of the encoding.
+ */
+ static generic_decoder::sptr make
+ (int frame_size, int k,
+ int rate, std::vector<int> polys,
+ int start_state=0, int end_state=-1,
+ cc_mode_t mode=CC_STREAMING);
+
+ /*!
+ * Sets the uncoded frame size to \p frame_size. If \p
+ * frame_size is greater than the value given to the
+ * constructor, the frame size will be capped by that initial
+ * value and this function will return false. Otherwise, it
+ * returns true.
+ */
+ virtual bool set_frame_size(unsigned int frame_size) = 0;
+
+ /*!
+ * Returns the coding rate of this encoder.
+ */
+ virtual double rate() = 0;
+ };
} /* namespace code */
} /* namespace fec */
diff --git a/gr-fec/include/gnuradio/fec/cc_encoder.h
b/gr-fec/include/gnuradio/fec/cc_encoder.h
index 1857e92..28dd5f4 100644
--- a/gr-fec/include/gnuradio/fec/cc_encoder.h
+++ b/gr-fec/include/gnuradio/fec/cc_encoder.h
@@ -34,18 +34,101 @@ namespace gr {
namespace code {
/*!
- * \brief Convolutional Code Encoding block
+ * \brief Convolutional Code Encoding class.
* \ingroup error_coding_blk
+ *
+ * \details
+ * This class performs convolutional encoding for unpacked bits
+ * for frames of a constant length. This class is general in its
+ * application of the convolutional encoding and allows us to
+ * specify the constraint length, the coding rate, and the
+ * polynomials used in the coding process.
+ *
+ * The parameter \p k sets the constraint length directly. We
+ * set the coding rate by setting \p rate to R given a desired
+ * rate of 1/R. That is, for a rate 1/2 coder, we would set \p
+ * rate to 2. And the polynomial is specified as a vector of
+ * integers, where each integer represents the coding polynomial
+ * for a different arm of the code. The number of polynomials
+ * given must be the same as the value \p rate.
+ *
+ * The encoding object holds a shift register that takes in each
+ * bit from the input stream and then ANDs the shift register
+ * with each polynomial, and places the parity of the result
+ * into the output stream. The output stream is therefore also
+ * unpakced bits.
+ *
+ * The encoder is set up wtih a number of bits per frame in the
+ * constructor. When not being used in a tagged stream mode,
+ * this encoder will only process frames of the length provided
+ * here. If used in a tagged stream block, this setting becomes
+ * the maximum allowable frame size that the block may process.
+ *
+ * The \p mode is a cc_mode_t that specifies how the convolutional
+ * encoder will behave and under what conditions.
+ *
+ * \li 'CC_STREAMING': mode expects an uninterrupted flow of
+ * samples into the encoder, and the output stream is
+ * continually encoded.
+ *
+ * \li 'CC_TERMINATED': is a mode designed for packet-based
+ * systems. This mode adds rate*(k-1) bits to the output as a
+ * way to help flush the decoder.
+ *
+ * \li 'CC_TAILBITING': is another packet-based method. Instead of
+ * adding bits onto the end of the packet, this mode will
+ * continue the code between the payloads of packets by
+ * pre-initializing the state of the new packet based on the
+ * state of the last packet for (k-1) bits.
+ *
+ * \li 'CC_TRUNCATED': a truncated code always resets the registers
+ * to the \p start_state between frames.
+ *
+ * A common convolutional encoder uses K=7, Rate=1/2,
+ * Polynomials=[109, 79]. This is the Voyager code from NASA:
+ * \li 109: b(1101101) --> 1 + x + x^3 + x^4 + x^6
+ * \li 79: b(1001111) --> 1 + x^3 + x^4 + x^5 + x^6
+ *
+ * Another encoder class is providee with gr-fec called the
+ * gr::fec::code::ccsds_encoder, which implements the above code
+ * that is more highly optimized for just those specific
+ * settings.
*/
class FEC_API cc_encoder : virtual public generic_encoder
{
public:
+
+ /*!
+ * Build a convolutional code encoding FECAPI object.
+ *
+ * \param frame_size Number of bits per frame. If using in the
+ * tagged stream style, this is the maximum allowable
+ * number of bits per frame.
+ * \param k Constraint length (K) of the encoder.
+ * \param rate Inverse of the coder's rate
+ * (rate=2 means 2 output bits per 1 input).
+ * \param polys Vector of polynomials as integers.
+ * \param start_state Initialization state of the shift register.
+ * \param mode cc_mode_t mode of the encoding.
+ */
static generic_encoder::sptr make
- (int framebits, int k,
- int rate, std::vector<int> polys,
- int start_state = 0, int end_state = 0,
- bool tailbiting = false, bool terminated = false,
- bool truncated = false, bool streaming = true);
+ (int frame_size, int k, int rate,
+ std::vector<int> polys, int start_state = 0,
+ cc_mode_t mode=CC_STREAMING);
+
+ /*!
+ * Sets the uncoded frame size to \p frame_size. If \p
+ * frame_size is greater than the value given to the
+ * constructor, the frame size will be capped by that initial
+ * value and this function will return false. Otherwise, it
+ * returns true.
+ */
+ virtual bool set_frame_size(unsigned int frame_size) = 0;
+
+ /*!
+ * Returns the coding rate of this encoder.
+ */
+ virtual double rate() = 0;
};
} /* namespace code */
diff --git a/gr-fec/include/gnuradio/fec/ccsds_decoder.h
b/gr-fec/include/gnuradio/fec/ccsds_decoder.h
new file mode 100644
index 0000000..84212b4
--- /dev/null
+++ b/gr-fec/include/gnuradio/fec/ccsds_decoder.h
@@ -0,0 +1,99 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2014 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.
+ */
+
+#ifndef INCLUDED_FEC_CCSDS_DECODER_H
+#define INCLUDED_FEC_CCSDS_DECODER_H
+
+#include <gnuradio/fec/api.h>
+#include <gnuradio/fec/generic_decoder.h>
+#include <gnuradio/fec/cc_common.h>
+#include <map>
+#include <string>
+
+namespace gr {
+ namespace fec {
+ namespace code {
+
+ /*!
+ * \brief Convolutional Code Decoding class.
+ * \ingroup error_coding_blk
+ *
+ * \details
+ * This class performs convolutional decoding via the Viterbi
+ * algorithm specific to the CCSDS code:
+ *
+ * \li K = 7
+ * \li rate = 1/2
+ * \li polynomials = [109, 79]
+ *
+ * This is the well-known convolutional part of the Voyager
+ * code. See the discussion in gr::fec::code::cc_decoder for
+ * the current state of convolutional decoding.
+ *
+ * Currently, this block is transitional and only implements
+ * parts of the FECAPI.
+ *
+ * The encoder is set up wtih a number of bits per frame in the
+ * constructor. When not being used in a tagged stream mode,
+ * this encoder will only process frames of the length provided
+ * here. If used in a tagged stream block, this setting becomes
+ * the maximum allowable frame size that the block may process.
+ */
+ class FEC_API ccsds_decoder : virtual public generic_decoder
+ {
+ public:
+
+ /*!
+ * Build a convolutional code decoding FECAPI object.
+ *
+ * \param frame_size Number of bits per frame. If using in the
+ * tagged stream style, this is the maximum allowable
+ * number of bits per frame.
+ * \param start_state Initialization state of the shift register.
+ * \param end_state Ending state of the shift register.
+ * \param mode cc_mode_t mode of the encoding.
+ */
+ static generic_decoder::sptr make
+ (int frame_size,
+ int start_state=0, int end_state=-1,
+ cc_mode_t mode=CC_STREAMING);
+
+ /*!
+ * Sets the uncoded frame size to \p frame_size. If \p
+ * frame_size is greater than the value given to the
+ * constructor, the frame size will be capped by that initial
+ * value and this function will return false. Otherwise, it
+ * returns true.
+ */
+ virtual bool set_frame_size(unsigned int frame_size) = 0;
+
+ /*!
+ * Returns the coding rate of this encoder.
+ */
+ virtual double rate() = 0;
+ };
+
+ } /* namespace code */
+ } /* namespace fec */
+} /* namespace gr */
+
+#endif /* INCLUDED_FEC_CCSDS_DECODER_H */
diff --git a/gr-fec/include/gnuradio/fec/ccsds_encoder.h
b/gr-fec/include/gnuradio/fec/ccsds_encoder.h
new file mode 100644
index 0000000..9fa364a
--- /dev/null
+++ b/gr-fec/include/gnuradio/fec/ccsds_encoder.h
@@ -0,0 +1,117 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2014 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.
+ */
+
+#ifndef INCLUDED_FEC_CCSDS_ENCODER_H
+#define INCLUDED_FEC_CCSDS_ENCODER_H
+
+#include <gnuradio/fec/api.h>
+#include <gnuradio/fec/encoder.h>
+#include <gnuradio/fec/cc_common.h>
+#include <map>
+#include <string>
+
+namespace gr {
+ namespace fec {
+ namespace code {
+
+ /*!
+ * \brief CCSDS Encoding class for convolutional encoding with
+ * rate 1/2, K=7, and polynomials [109, 79].
+ * \ingroup error_coding_blk
+ *
+ * \details
+ *
+ * Uses Phil Karn's (KA9Q) implementation of the CCSDS encoder
+ * for rate 1/2, K=7, and CC polynomial [109, 79]. These are
+ * non-adjustable in this encoder. For an adjustable CC encoder
+ * where we can set the rate, constraint length, and polynomial,
+ * see gr::fec::code::cc_encoder.
+ *
+ * The encoder is set up wtih a number of bits per frame in the
+ * constructor. When not being used in a tagged stream mode,
+ * this encoder will only process frames of the length provided
+ * here. If used in a tagged stream block, this setting becomes
+ * the maximum allowable frame size that the block may process.
+ *
+ * The \p mode is a cc_mode_t that specifies how the convolutional
+ * encoder will behave and under what conditions.
+ *
+ * \li 'CC_STREAMING': mode expects an uninterrupted flow of
+ * samples into the encoder, and the output stream is
+ * continually encoded.
+ *
+ * \li 'CC_TERMINATED': is a mode designed for packet-based
+ * systems. This mode adds rate*(k-1) bits to the output as a
+ * way to help flush the decoder.
+ *
+ * \li 'CC_TAILBITING': is another packet-based method. Instead of
+ * adding bits onto the end of the packet, this mode will
+ * continue the code between the payloads of packets by
+ * pre-initializing the state of the new packet based on the
+ * state of the last packet for (k-1) bits.
+ *
+ * \li 'CC_TRUNCATED': a truncated code always resets the registers
+ * to the \p start_state between frames.
+ *
+ * A common convolutional encoder uses K=7, Rate=1/2,
+ * Polynomials=[109, 79]. This is the Voyager code from NASA:
+ * \li 109: b(1101101) --> 1 + x + x^3 + x^4 + x^6
+ * \li 79: b(1001111) --> 1 + x^3 + x^4 + x^5 + x^6
+ */
+ class FEC_API ccsds_encoder : virtual public generic_encoder
+ {
+ public:
+
+ /*!
+ * Build the CCSDS (rate=1/2, K=7, polys=[109,79]
+ * convolutional code FECAPI object.
+ *
+ * \param frame_size Number of bits per frame. If using in the
+ * tagged stream style, this is the maximum allowable
+ * number of bits per frame.
+ * \param start_state Initialization state of the shift register.
+ * \param mode cc_mode_t mode of the encoding.
+ */
+ static generic_encoder::sptr make
+ (int frame_size, int start_state = 0,
+ cc_mode_t mode=CC_STREAMING);
+
+ /*!
+ * Sets the uncoded frame size to \p frame_size. If \p
+ * frame_size is greater than the value given to the
+ * constructor, the frame size will be capped by that initial
+ * value and this function will return false. Otherwise, it
+ * returns true.
+ */
+ virtual bool set_frame_size(unsigned int frame_size) = 0;
+
+ /*!
+ * Returns the coding rate of this encoder.
+ */
+ virtual double rate() = 0;
+ };
+
+ } /* namespace code */
+ } /* namespace fec */
+} /* namespace gr */
+
+#endif /* INCLUDED_FEC_CCSDS_ENCODER_H */
diff --git a/gr-fec/include/gnuradio/fec/decoder.h
b/gr-fec/include/gnuradio/fec/decoder.h
index a4cbf36..79eeef2 100644
--- a/gr-fec/include/gnuradio/fec/decoder.h
+++ b/gr-fec/include/gnuradio/fec/decoder.h
@@ -33,12 +33,50 @@
namespace gr {
namespace fec {
+ /*!
+ * \brief General FEC decoding block that takes in a decoder
+ * variable object (derived from gr::fec::general_decoder) for use
+ * in a flowgraph.
+ *
+ * \ingroup error_coding_blk
+ *
+ * \details
+ * This block uses a decoder variable object (derived from
+ * gr::fec::generic_decoder) to decode data within a
+ * flowgraph. This block interacts with the general FECAPI
+ * architecture to handle all passing all input and output data in
+ * a flowgraph. The decoder variable takes care of understanding
+ * the requirements, data types and sizes, and boundary conditions
+ * of the specific FEC decoding algorithm.
+ *
+ * Generally, this block is used within the fec.extended_decoder
+ * Python block to handle some input/output formatting issues. In
+ * the FECAPI, the decoder variable sets properties like the input
+ * and output types and sizes and whether the output is packed or
+ * unpacked bytes. The fec.extended_decoder uses this information
+ * to set up an gr::hier_block2 structure to make sure the I/O to
+ * the variable is handled consistently, such as to make sure all
+ * inputs are floats with one soft symbol per item and the outputs
+ * are unpacked bytes with the bit in the LSB.
+ *
+ * See gr::fec::generic_decoder for detail on what information an
+ * FECAPI variable object can set if using this block directly and
+ * not as part of the fec.extended_decoder.
+ */
class FEC_API decoder : virtual public block
{
public:
typedef boost::shared_ptr<decoder> sptr;
typedef boost::shared_array<unsigned char> buf_sptr;
+ /*!
+ * Create the FEC decoder block by taking in the FECAPI decoder
+ * object as well as input and output sizes.
+ *
+ * \param my_decoder An FECAPI decoder object (See
gr::fec::generic_decoder).
+ * \param input_item_size The size of the input items (often the
my_decoder object can tell us this).
+ * \param output_item_size The size of the output items (often the
my_decoder object can tell us this).
+ */
static sptr make(generic_decoder::sptr my_decoder,
size_t input_item_size,
size_t output_item_size);
diff --git a/gr-fec/include/gnuradio/fec/depuncture_bb.h
b/gr-fec/include/gnuradio/fec/depuncture_bb.h
index e7ee51a..de11def 100644
--- a/gr-fec/include/gnuradio/fec/depuncture_bb.h
+++ b/gr-fec/include/gnuradio/fec/depuncture_bb.h
@@ -30,12 +30,62 @@ namespace gr {
namespace fec {
/*!
- * \brief Depuncture block in FECAPI
+ * \brief Depuncture a stream of samples.
* \ingroup error_coding_blk
*
* \details
+
+ * Depuncture a given block of input samples of \p puncsize. The
+ * items produced is based on the pattern \p puncpat. Basically,
+ * if:
+ *
+ * \code
+ * k = 0
+ * if _puncpat[i] == 1:
+ * out[i] = input[k++]
+ * else:
+ * out[i] = symbol # default sym=127
+ * \endcode
+ *
+ * This block is designed for unpacked bits - that is, every
+ * input sample is a bit, either a 1 or 0. It's possible to use
+ * packed bits as symbols, but the depuncturing will be done on
+ * the symbol level, not the bit level.
+ *
+ * \p puncpat is specified as a 32-bit integer that we can
+ * convert into the vector _puncpat used in the algorithm above:
+ *
+ * \code
+ * _puncpat = [0,...]
+ * for i in puncsize:
+ * _puncpat[i] = puncpat >> (puncsize-1-i)
+ * \endcode
+ *
+ * Example:
+ * \code
+ * puncsize = 8
+ * puncpat = 0xEF --> [1,1,1,0,1,1,1,1]
+ * input = [a, b, c, d, e, f, g, h]
+ * output = [a, b, c, 127, e, f, g, h]
+ * \endcode
+ *
+ * The gr.fec Python module provides a read_bitlist function
+ * that can turn a string of a puncture pattern into the correct
+ * integer form. The pattern of 0xEF could be specified as
+ * fec.readbitlist("11101111"). Also, this allows us to use
+ * puncsize=len("11101111") to make sure that our sizes are set
+ * up correctly for the pattern we want.
+ *
+ * The fec.extended_decoder takes in the puncture pattern
+ * directly as a string and uses the readbitlist inside to do
+ * the conversion.
*
- * What does this block do?
+ * The \p delay parameter delays the application of the puncture
+ * pattern. This is equivalent to circularly rotating the \p
+ * puncpat by \p delay. Note that because of the circular shift,
+ * the delay should be between 0 and \p puncsize, but this is
+ * not enforced; the effective delay will simply be \p delay mod
+ * \p puncsize. A negative value here is ignored.
*/
class FEC_API depuncture_bb : virtual public block
{
@@ -43,8 +93,16 @@ namespace gr {
// gr::fec::depuncture_bb::sptr
typedef boost::shared_ptr<depuncture_bb> sptr;
- static sptr make(int delay, int puncpat,
- int puncholes, int puncsize);
+ /*!
+ * \brief Constructs a depuncture block.
+ *
+ * \param puncsize Size of block of bits to puncture
+ * \param puncpat The puncturing pattern
+ * \param delay Delayed the puncturing pattern by shifting it
+ * \param symbol The symbol to reinsert into the stream (def=127)
+ */
+ static sptr make(int puncsize, int puncpat,
+ int delay=0, char symbol=127);
};
} /* namespace fec */
diff --git a/gr-fec/include/gnuradio/fec/encoder.h
b/gr-fec/include/gnuradio/fec/encoder.h
index 821c213..fae4bdf 100644
--- a/gr-fec/include/gnuradio/fec/encoder.h
+++ b/gr-fec/include/gnuradio/fec/encoder.h
@@ -31,11 +31,31 @@
namespace gr {
namespace fec {
+ /*!
+ * \brief Creates the encoder block for use in GNU Radio
+ * flowgraphs from a given FECAPI object derived from the
+ * generic_encoder class.
+ * \ingroup error_coding_blk
+ *
+ * \details
+ *
+ * Generally, we would use the fec.extended_encoder Python
+ * implementation to instantiate this. The extended_encoder wraps
+ * up a few more details, like taking care of puncturing as well
+ * as the encoder itself.
+ */
class FEC_API encoder : virtual public block
{
public:
typedef boost::shared_ptr<encoder> sptr;
+ /*!
+ * Build the FEC encoder block from an FECAPI encoder object.
+ *
+ * \param my_encoder An FECAPI encoder object child of the
generic_encoder class.
+ * \param input_item_size size of a block of data for the encoder.
+ * \param output_item_size size of a block of data the encoder will
produce.
+ */
static sptr make(generic_encoder::sptr my_encoder,
size_t input_item_size,
size_t output_item_size);
diff --git a/gr-fec/include/gnuradio/fec/generic_decoder.h
b/gr-fec/include/gnuradio/fec/generic_decoder.h
index 335ee85..0e14d49 100644
--- a/gr-fec/include/gnuradio/fec/generic_decoder.h
+++ b/gr-fec/include/gnuradio/fec/generic_decoder.h
@@ -24,17 +24,47 @@
#define INCLUDED_FEC_GENERIC_DECODER_H
#include <gnuradio/fec/api.h>
+#include <gnuradio/logger.h>
#include <boost/shared_ptr.hpp>
#include <boost/format.hpp>
namespace gr {
namespace fec {
+ /*!
+ * \brief Parent class for FECAPI objects.
+ *
+ * \ingroup error_coding_blk
+ *
+ * \details
+ *
+ * Parent of a decoder variable class for FECAPI that will fit
+ * into the gr::fec::decoder block to handle FEC decoding. This
+ * class provides the basic information required to fit into the
+ * FECAPI structure. It provides information about input and
+ * output data types, potential data conversions, and a few other
+ * parameters useful to establish the decoder's behavior.
+ *
+ * We create objects from FECAPI-derived classes to go into the
+ * actual GNU Radio decoder block. Each object contains its own
+ * state and so there should be a one-to-one mapping of an FECAPI
+ * object and a GR decoder block. Sharing these objects is not
+ * guaranteed to be thread-safe.
+ *
+ * This is a pure virtual class and must be derived from by a
+ * child class.
+ *
+ * \sa gr::fec::code::cc_decoder
+ * \sa gr::fec::code::ccsds_decoder
+ */
class FEC_API generic_decoder
{
+ protected:
+ gr::logger_ptr d_logger;
+
public:
friend class decoder;
- virtual void generic_work(void *inBuffer, void *outBuffer) = 0;
+ virtual void generic_work(void *inbuffer, void *outbuffer) = 0;
static int base_unique_id;
int my_id;
int unique_id();
@@ -48,24 +78,163 @@ namespace gr {
generic_decoder(std::string name);
virtual ~generic_decoder();
+ /*!
+ * Returns the rate of the code. For every r input bits, there
+ * is 1 output bit, so the rate is 1/r. Used for setting things
+ * like the encoder block's relative rate.
+ *
+ * This function MUST be reimplemented by the child class.
+ */
+ virtual double rate() = 0;
+
+ /*!
+ * Returns the input size in items that the decoder object uses
+ * to decode a full frame. Often, this number is the number of
+ * bits per frame if the input format is unpacked. If the block
+ * expects packed bytes, then this value should be the number of
+ * bytes (number of bits / 8) per input frame.
+ *
+ * The child class MUST implement this function.
+ */
virtual int get_input_size() = 0;
+
+ /*!
+ * Returns the output size in items that the decoder object
+ * produces after decoding a full frame. Often, this number is
+ * the number of bits in the outputted frame if the input format
+ * is unpacked. If the block produces packed bytes, then this
+ * value should be the number of bytes (number of bits / 8) per
+ * frame produced. This value is generally something like
+ * get_input_size()/R for a 1/R rate code.
+ *
+ * The child class MUST implement this function.
+ */
virtual int get_output_size() = 0;
+
+ /*!
+ * Sets up history for the decoder when the decoder is required
+ * to look ahead in the data stream in order to finish
+ * its processing.
+ *
+ * The child class MAY implement this function. If not
+ * reimplemented, it returns 0.
+ */
virtual int get_history();
+
+ /*!
+ * Some decoders require the input items to float around a
+ * particular soft value. We can set that floating value by
+ * setting this value to return some non-zero number.
+ *
+ * The fec.extended_decoder block will use this to create an
+ * add_const_ff block before the decoder block to adjust all
+ * input samples appropriately.
+ *
+ * The child class MAY implement this function. If not
+ * reimplemented, it returns 0.
+ */
virtual float get_shift();
- virtual const char* get_conversion();
+
+ /*!
+ * Sets the size of an input item, as in the size of a char or
+ * float item.
+ *
+ * The child class SHOULD implement this function. If not
+ * reimplemented, it returns sizeof(float) as the decoders
+ * typically expect floating point input types.
+ */
virtual int get_input_item_size();
+
+ /*!
+ * Sets the size of an output item, as in the size of a char or
+ * float item.
+ *
+ * The child class SHOULD implement this function. If not
+ * reimplemented, it returns sizeof(char) as the decoders
+ * typically expect to produce bits or bytes.
+ */
virtual int get_output_item_size();
+
+ /*!
+ * Set up a conversion type required to setup the data properly
+ * for this decoder. The decoder itself will not implement the
+ * conversion and expects an external wrapper (e.g.,
+ * fec.extended_decoder) to read this value and "do the right
+ * thing" to format the data.
+ *
+ * The default behavior is 'none', which means no conversion is
+ * required. Whatever the get_input_item_size() value returns,
+ * the input is expected to conform directly to this.
+ *
+ * This may also return 'uchar', which indicates that the
+ * wrapper should convert the standard float samples to unsigned
+ * characters, either hard sliced or 8-bit soft symbols. See
+ * gr::fec::code::cc_decoder as an example decoder that uses
+ * this conversion format.
+ *
+ * If 'packed_bits', the block expects the inputs to be packed
+ * hard bits. Each input item is a unsigned char where each of
+ * the 8-bits is a hard bit value.
+ *
+ * The child class SHOULD implement this function. If not
+ * reimplemented, it returns "none".
+ */
+ virtual const char* get_input_conversion();
+
+ /*!
+ * Set up a conversion type required to understand the output
+ * style of this decoder. Generally, follow-on processing
+ * expects unpacked bits, so we specify the conversion type here
+ * to indicate what the wrapper (e.g., fec.extended_decoder)
+ * should do to convert the output samples from the decoder into
+ * unpacked bits.
+ *
+ * The default behavior is 'none', which means no conversion is
+ * required. This should mean that the output data is produced
+ * from this decoder as unpacked bit.
+ *
+ * If 'unpack', the block produces packed bytes that should be
+ * unpacked by the wrapper. See gr::fec::code::ccsds_decoder as
+ * an example of a decoder that produces packed bytes.
+ *
+ * The child class SHOULD implement this function. If not
+ * reimplemented, it returns "none".
+ */
virtual const char* get_output_conversion();
+
+ /*!
+ * Updates the size of a decoded frame.
+ *
+ * The child class MUST implement this function and interpret
+ * how the \p frame_size information affects the block's
+ * behavior. It should also provide bounds checks.
+ */
+ virtual bool set_frame_size(unsigned int frame_size) = 0;
};
+ /*! see generic_decoder::get_output_size() */
FEC_API int get_decoder_output_size(generic_decoder::sptr my_decoder);
+
+ /*! see generic_decoder::get_input_size() */
FEC_API int get_decoder_input_size(generic_decoder::sptr my_decoder);
+
+ /*! see generic_decoder::get_shift() */
FEC_API float get_shift(generic_decoder::sptr my_decoder);
+
+ /*! see generic_decoder::get_history() */
FEC_API int get_history(generic_decoder::sptr my_decoder);
- FEC_API int get_decoder_output_item_size(generic_decoder::sptr my_decoder);
+
+ /*! see generic_decoder::get_input_item_size() */
FEC_API int get_decoder_input_item_size(generic_decoder::sptr my_decoder);
- FEC_API const char* get_conversion(generic_decoder::sptr my_decoder);
- FEC_API const char* get_output_conversion(generic_decoder::sptr
my_decoder);
+
+ /*! see generic_decoder::get_output_item_size() */
+ FEC_API int get_decoder_output_item_size(generic_decoder::sptr my_decoder);
+
+ /*! see generic_decoder::get_input_conversion() */
+ FEC_API const char* get_decoder_input_conversion(generic_decoder::sptr
my_decoder);
+
+ /*! see generic_decoder::get_output_conversion() */
+ FEC_API const char* get_decoder_output_conversion(generic_decoder::sptr
my_decoder);
} /* namespace fec */
} /* namespace gr */
diff --git a/gr-fec/include/gnuradio/fec/generic_encoder.h
b/gr-fec/include/gnuradio/fec/generic_encoder.h
index 4812873..7c5e08e 100644
--- a/gr-fec/include/gnuradio/fec/generic_encoder.h
+++ b/gr-fec/include/gnuradio/fec/generic_encoder.h
@@ -25,6 +25,7 @@
#include <gnuradio/fec/api.h>
#include <gnuradio/block.h>
+#include <gnuradio/logger.h>
#include <boost/shared_ptr.hpp>
namespace gr {
@@ -32,21 +33,119 @@ namespace gr {
class FEC_API generic_encoder
{
+ protected:
+ gr::logger_ptr d_logger;
+
public:
friend class encoder;
virtual void generic_work(void *in_buffer, void *out_buffer) = 0;
+ static int base_unique_id;
+ int my_id;
+ int unique_id();
+ std::string d_name;
+ std::string alias(){ return
(boost::format("%s%d")%d_name%unique_id()).str(); }
+
public:
typedef boost::shared_ptr<generic_encoder> sptr;
+ /*!
+ * Returns the rate of the code. For every 1 input bit, there
+ * are r output bits, so the rate is 1/r. Used for setting
+ * things like the encoder block's relative rate.
+ *
+ * This function MUST be reimplemented by the child class.
+ */
+ virtual double rate() = 0;
+
+ /*!
+ * Returns the input size in items that the encoder object uses
+ * to encode a full frame. Often, this number is the number of
+ * bits per frame if the input format is unpacked. If the block
+ * expects packed bytes, then this value should be the number of
+ * bytes (number of bits / 8) per input frame.
+ *
+ * The child class MUST implement this function.
+ */
virtual int get_input_size() = 0;
+
+ /*!
+ * Returns the output size in items that the encoder object
+ * produces after encoding a full frame. Often, this number is
+ * the number of bits in the outputted frame if the input format
+ * is unpacked. If the block produces packed bytes, then this
+ * value should be the number of bytes (number of bits / 8) per
+ * frame produced. This value is generally something like
+ * R*get_input_size() for a 1/R rate code.
+ *
+ * The child class MUST implement this function.
+ */
virtual int get_output_size() = 0;
+
+ /*!
+ * Set up a conversion type required to setup the data properly
+ * for this encoder. The encoder itself will not implement the
+ * conversion and expects an external wrapper (e.g.,
+ * fec.extended_encoder) to read this value and "do the right
+ * thing" to format the data.
+ *
+ * The default behavior is 'none', which means no conversion is
+ * required. Whatever the get_input_item_size() value returns,
+ * the input is expected to conform directly to this. Generally,
+ * this means unpacked bytes.
+ *
+ * If 'pack', the block expects the inputs to be packed
+ * bytes. The wrapper should implement a
+ * gr::blocks::pack_k_bits_bb(8) block for this.
+ *
+ * The child class MAY implement this function. If not
+ * reimplemented, it returns "none".
+ */
+ virtual const char* get_input_conversion();
+
+ /*!
+ * Set up a conversion type required to understand the output
+ * style of this encoder. Generally an encoder will produce
+ * unpacked bytes with a bit set in the LSB.
+ *
+ * The default behavior is 'none', which means no conversion is
+ * required and the encoder produces unpacked bytes.
+ *
+ * If 'packed_bits', the block produces packed bits and the
+ * wrapper should unpack these (using, for instance,
+ * gr::block::unpack_k_bits_bb(8)).
+ *
+ * The child class MAY implement this function. If not
+ * reimplemented, it returns "none".
+ */
+ virtual const char* get_output_conversion();
+
+ /*!
+ * Updates the size of the frame to encode.
+ *
+ * The child class MUST implement this function and interpret
+ * how the \p frame_size information affects the block's
+ * behavior. It should also provide bounds checks.
+ */
+ virtual bool set_frame_size(unsigned int frame_size) = 0;
+
generic_encoder(void) {};
+ generic_encoder(std::string name);
virtual ~generic_encoder();
};
+ /*! see generic_encoder::get_output_size() */
FEC_API int get_encoder_output_size(generic_encoder::sptr my_encoder);
+
+ /*! see generic_encoder::get_input_size() */
FEC_API int get_encoder_input_size(generic_encoder::sptr my_encoder);
+ /*! see generic_encoder::get_input_conversion() */
+ FEC_API const char* get_encoder_input_conversion(generic_encoder::sptr
my_encoder);
+
+ /*! see generic_encoder::get_output_conversion() */
+ FEC_API const char* get_encoder_output_conversion(generic_encoder::sptr
my_encoder);
+
+
} /* namespace fec */
} /* namespace gr */
diff --git a/gr-fec/include/gnuradio/fec/puncture_bb.h
b/gr-fec/include/gnuradio/fec/puncture_bb.h
index b803297..3fc8d7e 100644
--- a/gr-fec/include/gnuradio/fec/puncture_bb.h
+++ b/gr-fec/include/gnuradio/fec/puncture_bb.h
@@ -34,8 +34,8 @@ namespace gr {
* \ingroup error_coding_blk
*
* \details
- * For a given block of input samples of \p puncsize, the items
- * produced is based on \p puncpat. Basically, if:
+ * Puncture a given block of input samples of \p puncsize. The
+ * items produced is based on pattern \p puncpat. Basically, if:
*
* \code
* k = 0
diff --git a/gr-fec/include/gnuradio/fec/tagged_decoder.h
b/gr-fec/include/gnuradio/fec/tagged_decoder.h
new file mode 100644
index 0000000..6249037
--- /dev/null
+++ b/gr-fec/include/gnuradio/fec/tagged_decoder.h
@@ -0,0 +1,96 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2014 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.
+ */
+
+#ifndef INCLUDED_FEC_TAGGED_DECODER_H
+#define INCLUDED_FEC_TAGGED_DECODER_H
+
+#include <gnuradio/fec/api.h>
+#include <gnuradio/fec/generic_decoder.h>
+#include <gnuradio/tagged_stream_block.h>
+#include <boost/shared_ptr.hpp>
+#include <boost/shared_array.hpp>
+#include <boost/format.hpp>
+
+namespace gr {
+ namespace fec {
+
+ /*!
+ * \brief General FEC decoding block that takes in a decoder
+ * variable object (derived from gr::fec::general_decoder) for use
+ * in a flowgraph.
+ *
+ * \ingroup error_coding_blk
+ *
+ * \details
+ * This block uses a decoder variable object (derived from
+ * gr::fec::generic_decoder) to decode data within a
+ * flowgraph. This block interacts with the general FECAPI
+ * architecture to handle all passing all input and output data in
+ * a flowgraph. The decoder variable takes care of understanding
+ * the requirements, data types and sizes, and boundary conditions
+ * of the specific FEC decoding algorithm.
+ *
+ * Generally, this block is used within the fec.extended_decoder
+ * Python block to handle some input/output formatting issues. In
+ * the FECAPI, the decoder variable sets properties like the input
+ * and output types and sizes and whether the output is packed or
+ * unpacked bytes. The fec.extended_decoder uses this information
+ * to set up an gr::hier_block2 structure to make sure the I/O to
+ * the variable is handled consistently, such as to make sure all
+ * inputs are floats with one soft symbol per item and the outputs
+ * are unpacked bytes with the bit in the LSB.
+ *
+ * See gr::fec::generic_decoder for detail on what information an
+ * FECAPI variable object can set if using this block directly and
+ * not as part of the fec.extended_decoder.
+ */
+ class FEC_API tagged_decoder : virtual public tagged_stream_block
+ {
+ public:
+ typedef boost::shared_ptr<tagged_decoder> sptr;
+ typedef boost::shared_array<unsigned char> buf_sptr;
+
+ /*!
+ * Create the FEC decoder block by taking in the FECAPI decoder
+ * object as well as input and output sizes.
+ *
+ * \param my_decoder An FECAPI decoder object (See
gr::fec::generic_decoder).
+ * \param input_item_size The size of the input items (often the
my_decoder object can tell us this).
+ * \param output_item_size The size of the output items (often the
my_decoder object can tell us this).
+ * \param lengthtagname Key name of the tagged stream frame size.
+ */
+ static sptr make(generic_decoder::sptr my_decoder,
+ size_t input_item_size,
+ size_t output_item_size,
+ const std::string &lengthtagname="packet_len");
+
+ virtual int work(int noutput_items,
+ gr_vector_int& ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items) = 0;
+ virtual int calculate_output_stream_length(const gr_vector_int
&ninput_items) = 0;
+ };
+
+ } /* namespace fec */
+} /* namespace gr */
+
+#endif /* INCLUDED_FEC_TAGGED_DECODER_H */
diff --git a/gr-fec/include/gnuradio/fec/tagged_encoder.h
b/gr-fec/include/gnuradio/fec/tagged_encoder.h
new file mode 100644
index 0000000..86c2603
--- /dev/null
+++ b/gr-fec/include/gnuradio/fec/tagged_encoder.h
@@ -0,0 +1,75 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2014 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.
+ */
+
+#ifndef INCLUDED_FEC_TAGGED_ENCODER_H
+#define INCLUDED_FEC_TAGGED_ENCODER_H
+
+#include <gnuradio/fec/api.h>
+#include <gnuradio/fec/generic_encoder.h>
+#include <gnuradio/tagged_stream_block.h>
+#include <boost/shared_ptr.hpp>
+
+namespace gr {
+ namespace fec {
+
+ /*!
+ * \brief Creates the encoder block for use in GNU Radio
+ * flowgraphs from a given FECAPI object derived from the
+ * generic_encoder class.
+ * \ingroup error_coding_blk
+ *
+ * \details
+ *
+ * Generally, we would use the fec.extended_encoder Python
+ * implementation to instantiate this. The extended_encoder wraps
+ * up a few more details, like taking care of puncturing as well
+ * as the encoder itself.
+ */
+ class FEC_API tagged_encoder : virtual public tagged_stream_block
+ {
+ public:
+ typedef boost::shared_ptr<tagged_encoder> sptr;
+
+ /*!
+ * Build the FEC encoder block from an FECAPI encoder object.
+ *
+ * \param my_encoder An FECAPI encoder object child of the
generic_encoder class.
+ * \param input_item_size size of a block of data for the encoder.
+ * \param output_item_size size of a block of data the encoder will
produce.
+ * \param lengthtagname Key name of the tagged stream frame size.
+ */
+ static sptr make(generic_encoder::sptr my_encoder,
+ size_t input_item_size,
+ size_t output_item_size,
+ const std::string& lengthtagname="packet_len");
+
+ virtual int work(int noutput_items,
+ gr_vector_int& ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items) = 0;
+ virtual int calculate_output_stream_length(const gr_vector_int
&ninput_items) = 0;
+ };
+
+ } /* namespace fec */
+} /* namespace gr */
+
+#endif /* INCLUDED_FEC_TAGGED_ENCODER_H */
diff --git a/gr-fec/lib/CMakeLists.txt b/gr-fec/lib/CMakeLists.txt
index cc187d5..aa3f977 100644
--- a/gr-fec/lib/CMakeLists.txt
+++ b/gr-fec/lib/CMakeLists.txt
@@ -42,7 +42,7 @@ endif(ENABLE_GR_CTRLPORT)
link_directories(
${Boost_LIBRARY_DIRS}
- ${LOG4CPP_LIBRARIES}
+ ${LOG4CPP_LIBRARY_DIRS}
)
########################################################################
@@ -51,10 +51,14 @@ link_directories(
list(APPEND gnuradio_fec_sources
generic_decoder.cc
generic_encoder.cc
- encoder_impl.cc
decoder_impl.cc
+ encoder_impl.cc
+ tagged_decoder_impl.cc
+ tagged_encoder_impl.cc
cc_decoder_impl.cc
cc_encoder_impl.cc
+ ccsds_decoder_impl.cc
+ ccsds_encoder_impl.cc
decode_ccsds_27_fb_impl.cc
encode_ccsds_27_bb_impl.cc
ber_tools.cc
@@ -83,9 +87,9 @@ list(APPEND gnuradio_fec_libs
gnuradio-runtime
volk
${Boost_LIBRARIES}
+ ${LOG4CPP_LIBRARIES}
)
add_library(gnuradio-fec SHARED ${gnuradio_fec_sources})
target_link_libraries(gnuradio-fec ${gnuradio_fec_libs})
GR_LIBRARY_FOO(gnuradio-fec RUNTIME_COMPONENT "fec_runtime" DEVEL_COMPONENT
"fec_devel")
-
diff --git a/gr-fec/lib/cc_decoder_impl.cc b/gr-fec/lib/cc_decoder_impl.cc
index e8d8671..efaf6c0 100644
--- a/gr-fec/lib/cc_decoder_impl.cc
+++ b/gr-fec/lib/cc_decoder_impl.cc
@@ -27,7 +27,6 @@
#include "cc_decoder_impl.h"
#include <math.h>
#include <boost/assign/list_of.hpp>
-//#include <volk/volk_typedefs.h>
#include <volk/volk.h>
#include <sstream>
#include <stdio.h>
@@ -38,38 +37,35 @@ namespace gr {
namespace code {
generic_decoder::sptr
- cc_decoder::make(int framebits, int k,
+ cc_decoder::make(int frame_size, int k,
int rate, std::vector<int> polys,
int start_state, int end_state,
- bool tailbiting, bool terminated,
- bool truncated, bool streaming)
+ cc_mode_t mode)
{
return generic_decoder::sptr
- (new cc_decoder_impl(framebits, k, rate, polys,
- start_state, end_state,
- tailbiting, terminated,
- truncated, streaming));
+ (new cc_decoder_impl(frame_size, k, rate, polys,
+ start_state, end_state, mode));
}
- cc_decoder_impl::cc_decoder_impl(int framebits, int k,
+ cc_decoder_impl::cc_decoder_impl(int frame_size, int k,
int rate, std::vector<int> polys,
int start_state, int end_state,
- bool tailbiting, bool terminated,
- bool truncated, bool streaming)
+ cc_mode_t mode)
: generic_decoder("cc_decoder"),
- d_tailbiting(tailbiting),
- d_terminated(terminated),
- d_truncated(truncated),
- d_streaming(streaming),
- d_framebits(framebits),
d_k(k),
d_rate(rate),
d_partial_rate(rate),
d_polys(polys),
+ d_mode(mode),
d_start_state_chaining(start_state),
d_start_state_nonchaining(start_state),
d_end_state_nonchaining(end_state)
{
+ // Set max frame size here; all buffers and settings will be
+ // based on this value.
+ d_max_frame_size = frame_size;
+ set_frame_size(frame_size);
+
d_vp = new struct v;
d_numstates = 1 << (d_k - 1);
@@ -77,56 +73,54 @@ namespace gr {
d_decision_t_size = d_numstates/8; //packed bit array
d_managed_in_size = 0;
- if(d_tailbiting) {
+ switch(d_mode) {
+ case(CC_TAILBITING):
d_end_state = &d_end_state_chaining;
- d_veclen = d_framebits + (6 * (d_k - 1));
- d_managed_in =
(COMPUTETYPE*)volk_malloc(d_veclen*d_rate*sizeof(COMPUTETYPE),
- volk_get_alignment());
+ d_managed_in = (unsigned
char*)volk_malloc(d_veclen*d_rate*sizeof(unsigned char),
+ volk_get_alignment());
d_managed_in_size = d_veclen * d_rate;
if(d_managed_in == NULL) {
- throw std::runtime_error("bad alloc for d_managed_in!\n");
+ throw std::runtime_error("cc_decoder: bad alloc for
d_managed_in\n");
}
- }
-
- else if(d_truncated) {
+ break;
+
+ case(CC_TRUNCATED):
d_end_state = &d_end_state_chaining;
- d_veclen = d_framebits;
- }
- else if(d_terminated) {
+ break;
+
+ case(CC_TERMINATED):
d_end_state = (end_state == -1) ? &d_end_state_chaining :
&d_end_state_nonchaining;
- d_veclen = d_framebits + d_k - 1;
- }
+ break;
- //streaming
- else {
+ case(CC_STREAMING):
d_end_state = &d_end_state_chaining;
- d_veclen = d_framebits + d_k - 1;
+ break;
+
+ default:
+ throw std::runtime_error("cc_decoder: mode not recognized");
}
- d_vp->metrics = (COMPUTETYPE*) volk_malloc(2 * sizeof(COMPUTETYPE) *
d_numstates, volk_get_alignment());
+ d_vp->metrics = (unsigned char*)volk_malloc(2*sizeof(unsigned
char)*d_numstates,
+ volk_get_alignment());
if(d_vp->metrics == NULL) {
throw std::runtime_error("bad alloc for d_vp->metrics!\n");
}
-
-
d_vp->metrics1.t = d_vp->metrics;
d_vp->metrics2.t = d_vp->metrics + d_numstates;
- d_vp->decisions = (DECISIONTYPE*)
volk_malloc(d_veclen*d_decision_t_size, volk_get_alignment());
+ d_vp->decisions = (unsigned
char*)volk_malloc(d_veclen*d_decision_t_size,
+ volk_get_alignment());
if(d_vp->decisions == NULL) {
throw std::runtime_error("bad alloc for d_vp->decisions!\n");
}
-
-
- Branchtab = (COMPUTETYPE*) volk_malloc(sizeof(COMPUTETYPE) *
d_numstates/2*rate, volk_get_alignment());
+ Branchtab = (unsigned char*)volk_malloc(sizeof(unsigned
char)*d_numstates/2*rate,
+ volk_get_alignment());
if(Branchtab == NULL) {
throw std::runtime_error("bad alloc for d_vp->decisions!\n");
}
-
-
create_viterbi();
if(d_k-1<8) {
@@ -164,18 +158,17 @@ namespace gr {
cc_decoder_impl::get_output_size()
{
//unpacked bits
- return d_framebits;
+ return d_frame_size;
}
int
cc_decoder_impl::get_input_size()
{
- if(d_terminated) {
- return d_rate * (d_framebits + d_k - 1);
+ if(d_mode == CC_TERMINATED) {
+ return d_rate * (d_frame_size + d_k - 1);
}
-
else {
- return d_rate * d_framebits;
+ return d_rate * d_frame_size;
}
}
@@ -188,7 +181,7 @@ namespace gr {
int
cc_decoder_impl::get_history()
{
- if(d_streaming) {
+ if(d_mode == CC_STREAMING) {
return d_rate * (d_k - 1);
}
else {
@@ -196,8 +189,6 @@ namespace gr {
}
}
-
-
float
cc_decoder_impl::get_shift()
{
@@ -205,7 +196,7 @@ namespace gr {
}
const char*
- cc_decoder_impl::get_conversion()
+ cc_decoder_impl::get_input_conversion()
{
return "uchar";
}
@@ -222,20 +213,25 @@ namespace gr {
}
}
- if(d_streaming) {
- //printf("streaming\n");
+ switch(d_mode) {
+ case(CC_STREAMING):
d_start_state = &d_start_state_chaining;
init_viterbi_unbiased(d_vp);
- }
- else if(d_tailbiting) {
- //printf("tailbiting\n");
+ break;
+
+ case(CC_TAILBITING):
d_start_state = &d_start_state_nonchaining;
init_viterbi_unbiased(d_vp);
- }
- else {
- //printf("other!\n");
+ break;
+
+ case(CC_TRUNCATED):
+ case(CC_TERMINATED):
d_start_state = &d_start_state_nonchaining;
init_viterbi(d_vp, *d_start_state);
+ break;
+
+ default:
+ throw std::runtime_error("cc_decoder: mode not recognized");
}
return;
@@ -309,9 +305,9 @@ namespace gr {
int
cc_decoder_impl::find_endstate()
{
- COMPUTETYPE* met = ((d_k + d_veclen)%2 == 0)? d_vp->new_metrics.t :
d_vp->old_metrics.t;
+ unsigned char* met = ((d_k + d_veclen)%2 == 0)? d_vp->new_metrics.t :
d_vp->old_metrics.t;
- COMPUTETYPE min = met[0];
+ unsigned char min = met[0];
int state = 0;
for(int i = 1; i < d_numstates; ++i) {
if(met[i] < min) {
@@ -319,35 +315,34 @@ namespace gr {
state = i;
}
-
+
}
//printf("min %d\n", state);
return state;
}
int
- cc_decoder_impl::update_viterbi_blk(COMPUTETYPE* syms, int nbits)
+ cc_decoder_impl::update_viterbi_blk(unsigned char* syms, int nbits)
{
- DECISIONTYPE *d;
+ unsigned char *d;
d = d_vp->decisions;
-
memset(d,0,d_decision_t_size * nbits);
-
- d_kernel( d_vp->new_metrics.t, d_vp->old_metrics.t, syms, d, nbits -
(d_k - 1), d_k -1, Branchtab);
+ d_kernel(d_vp->new_metrics.t, d_vp->old_metrics.t, syms,
+ d, nbits - (d_k - 1), d_k - 1, Branchtab);
return 0;
}
int
- cc_decoder_impl::chainback_viterbi(DECISIONTYPE* data,
+ cc_decoder_impl::chainback_viterbi(unsigned char* data,
unsigned int nbits,
unsigned int endstate,
unsigned int tailsize)
{
- DECISIONTYPE *d;
+ unsigned char *d;
/* ADDSHIFT and SUBSHIFT make sure that the thing returned is a byte.
*/
d = d_vp->decisions;
@@ -365,17 +360,17 @@ namespace gr {
d += tailsize * d_decision_t_size ; /* Look past tail */
int retval;
int dif = tailsize - (d_k - 1);
- //printf("break, %d, %d\n", dif, (nbits+dif)%d_framebits);
+ //printf("break, %d, %d\n", dif, (nbits+dif)%d_frame_size);
decision_t dec;
- while(nbits-- > d_framebits - (d_k - 1)) {
+ while(nbits-- > d_frame_size - (d_k - 1)) {
int k;
dec.t = &d[nbits * d_decision_t_size];
k = (dec.w[(endstate>>d_ADDSHIFT)/32] >>
((endstate>>d_ADDSHIFT)%32)) & 1;
endstate = (endstate >> 1) | (k << (d_k-2+d_ADDSHIFT));
//data[((nbits+dif)%nbits)>>3] = endstate>>d_SUBSHIFT;
- //printf("%d, %d\n", k, (nbits+dif)%d_framebits);
- data[((nbits+dif)%d_framebits)] = k;
+ //printf("%d, %d\n", k, (nbits+dif)%d_frame_size);
+ data[((nbits+dif)%d_frame_size)] = k;
retval = endstate;
}
@@ -389,82 +384,100 @@ namespace gr {
k = (dec.w[(endstate>>d_ADDSHIFT)/32] >>
((endstate>>d_ADDSHIFT)%32)) & 1;
endstate = (endstate >> 1) | (k << (d_k-2+d_ADDSHIFT));
- data[((nbits+dif)%d_framebits)] = k;
+ data[((nbits+dif)%d_frame_size)] = k;
}
- //printf("%d, %d, %d, %d, %d, %d, %d, %d\n",
data[4095],data[4094],data[4093],data[4092],data[4091],data[4090],data[4089],data[4088]);
+
return retval >> d_ADDSHIFT;
}
- void
- cc_decoder_impl::set_framebits(int framebits)
+ bool
+ cc_decoder_impl::set_frame_size(unsigned int frame_size)
{
- d_framebits = framebits;
- if(d_tailbiting) {
- d_veclen = d_framebits + (6 * (d_k - 1));
+ bool ret = true;
+ if(frame_size > d_max_frame_size) {
+ GR_LOG_INFO(d_logger, boost::format("tried to set frame to %1%; max
possible is %2%") \
+ % frame_size % d_max_frame_size);
+ frame_size = d_max_frame_size;
+ ret = false;
+ }
+
+ d_frame_size = frame_size;
+
+ switch(d_mode) {
+ case(CC_TAILBITING):
+ d_veclen = d_frame_size + (6 * (d_k - 1));
if(d_veclen * d_rate > d_managed_in_size) {
throw std::runtime_error("attempt to resize beyond d_managed_in
buffer size!\n");
}
+ break;
+
+ case(CC_TRUNCATED):
+ d_veclen = d_frame_size;
+ break;
+
+ case(CC_STREAMING):
+ case(CC_TERMINATED):
+ d_veclen = d_frame_size + d_k - 1;
+ break;
+
+ default:
+ throw std::runtime_error("cc_decoder: mode not recognized");
}
- else if(d_truncated) {
- d_veclen = d_framebits;
- }
- else {
- d_veclen = d_framebits + d_k - 1;
- }
+
+ return ret;
+ }
+
+ double
+ cc_decoder_impl::rate()
+ {
+ return 1.0/static_cast<double>(d_rate);
}
void
- cc_decoder_impl::generic_work(void *inBuffer, void *outBuffer)
+ cc_decoder_impl::generic_work(void *inbuffer, void *outbuffer)
{
- const COMPUTETYPE *in = (const COMPUTETYPE *) inBuffer;
- DECISIONTYPE *out = (DECISIONTYPE *) outBuffer;
-
- if(d_tailbiting) {
- memcpy(d_managed_in, in, d_framebits * d_rate * sizeof(COMPUTETYPE));
- memcpy(d_managed_in + d_framebits * d_rate * sizeof(COMPUTETYPE), in,
- (d_veclen - d_framebits) * d_rate * sizeof(COMPUTETYPE));
- /*for(int i = 0; i < d_veclen * d_rate; ++i) {
- printf("%u...%d\n", d_managed_in[i], i);
- }*/
+ const unsigned char *in = (const unsigned char *) inbuffer;
+ unsigned char *out = (unsigned char *) outbuffer;
+
+ switch(d_mode) {
+
+ case(CC_TAILBITING):
+ memcpy(d_managed_in, in, d_frame_size * d_rate * sizeof(unsigned
char));
+ memcpy(d_managed_in + d_frame_size * d_rate * sizeof(unsigned char),
in,
+ (d_veclen - d_frame_size) * d_rate * sizeof(unsigned char));
update_viterbi_blk(d_managed_in, d_veclen);
d_end_state_chaining = find_endstate();
- chainback_viterbi(&out[0], d_framebits, *d_end_state, d_veclen -
d_framebits);
+ chainback_viterbi(&out[0], d_frame_size, *d_end_state, d_veclen -
d_frame_size);
init_viterbi_unbiased(d_vp);
- }
+ break;
-
- else if(d_truncated) {
- update_viterbi_blk((COMPUTETYPE*)(&in[0]), d_veclen);
+ case(CC_TRUNCATED):
+ update_viterbi_blk((unsigned char*)(&in[0]), d_veclen);
d_end_state_chaining = find_endstate();
- //printf("...end %d\n", d_end_state_chaining);
for(unsigned int i = 0; i < d_k-1; ++i) {
out[d_veclen - 1 - i] = ((*d_end_state) >> i) & 1;
}
- d_start_state_chaining = chainback_viterbi(&out[0], d_framebits -
(d_k - 1),
+ d_start_state_chaining = chainback_viterbi(&out[0], d_frame_size -
(d_k - 1),
*d_end_state, d_k - 1);
init_viterbi(d_vp, *d_start_state);
- /*for(int i = d_framebits - 25; i < d_framebits; ++i) {
- //for(int i = 0; i < 25; ++i) {
- printf("%u... : %u\n", out[i], i);
- }*/
- }
- //terminated or streaming
- else {
- update_viterbi_blk((COMPUTETYPE*)(&in[0]), d_veclen);
+ break;
+
+ case(CC_STREAMING):
+ case(CC_TERMINATED):
+ update_viterbi_blk((unsigned char*)(&in[0]), d_veclen);
d_end_state_chaining = find_endstate();
- //printf("es: %d, %d\n", d_end_state_chaining, *d_end_state);
- d_start_state_chaining = chainback_viterbi(&out[0], d_framebits,
*d_end_state,
- d_veclen - d_framebits);
+ d_start_state_chaining = chainback_viterbi(&out[0], d_frame_size,
*d_end_state,
+ d_veclen - d_frame_size);
init_viterbi(d_vp, *d_start_state);
- /*for(int i = d_framebits * d_rate - 25; i < d_framebits * d_rate;
++i) {
- printf("%u... : %u\n", in[i], i);
- }*/
+ break;
+
+ default:
+ throw std::runtime_error("cc_decoder: mode not recognized");
}
}
} /* namespace code */
} /* namespace fec */
} /* namespace gr */
-
diff --git a/gr-fec/lib/cc_decoder_impl.h b/gr-fec/lib/cc_decoder_impl.h
index 725a27d..d0b1af3 100644
--- a/gr-fec/lib/cc_decoder_impl.h
+++ b/gr-fec/lib/cc_decoder_impl.h
@@ -26,7 +26,6 @@
#include <map>
#include <string>
#include <gnuradio/fec/cc_decoder.h>
-#include <gnuradio/fec/cc_common.h>
namespace gr {
namespace fec {
@@ -41,36 +40,36 @@ namespace gr {
int get_history();
float get_shift();
int get_input_item_size();
- const char* get_conversion();
+ const char* get_input_conversion();
//const char* get_output_conversion();
//everything else...
void create_viterbi();
int init_viterbi(struct v* vp, int starting_state);
int init_viterbi_unbiased(struct v* vp);
- int update_viterbi_blk(COMPUTETYPE* syms, int nbits);
+ int update_viterbi_blk(unsigned char* syms, int nbits);
int chainback_viterbi(unsigned char* data, unsigned int nbits,
unsigned int endstate, unsigned int tailsize);
int find_endstate();
int tester[12];
- COMPUTETYPE *Branchtab;
+ unsigned char *Branchtab;
unsigned char Partab[256];
- bool d_tailbiting;
- bool d_terminated;
- bool d_truncated;
- bool d_streaming;
+
int d_ADDSHIFT;
int d_SUBSHIFT;
conv_kernel d_kernel;
- unsigned int d_framebits;
+ unsigned int d_max_frame_size;
+ unsigned int d_frame_size;
unsigned int d_k;
unsigned int d_rate;
unsigned int d_partial_rate;
std::vector<int> d_polys;
+ cc_mode_t d_mode;
+
struct v* d_vp;
- COMPUTETYPE* d_managed_in;
+ unsigned char* d_managed_in;
unsigned int d_managed_in_size;
int d_numstates;
int d_decision_t_size;
@@ -81,21 +80,22 @@ namespace gr {
int d_end_state_chaining;
int d_end_state_nonchaining;
unsigned int d_veclen;
+
int parity(int x);
int parityb(unsigned char x);
void partab_init(void);
std::map<std::string, conv_kernel> yp_kernel;
public:
- cc_decoder_impl(int framebits, int k,
+ cc_decoder_impl(int frame_size, int k,
int rate, std::vector<int> polys,
int start_state = 0, int end_state = -1,
- bool tailbiting = false, bool terminated = false,
- bool truncated = false, bool streaming = false);
+ cc_mode_t mode=CC_STREAMING);
~cc_decoder_impl();
- void set_framebits(int framebits);
- void generic_work(void *inBuffer, void *outbuffer);
+ void generic_work(void *inbuffer, void *outbuffer);
+ bool set_frame_size(unsigned int frame_size);
+ double rate();
};
} /* namespace code */
diff --git a/gr-fec/lib/cc_encoder_impl.cc b/gr-fec/lib/cc_encoder_impl.cc
index bf8617d..abbf1a8 100644
--- a/gr-fec/lib/cc_encoder_impl.cc
+++ b/gr-fec/lib/cc_encoder_impl.cc
@@ -40,32 +40,32 @@ namespace gr {
namespace code {
generic_encoder::sptr
- cc_encoder::make(int framebits, int k,
- int rate, std::vector<int> polys,
- int start_state, int end_state,
- bool tailbiting, bool terminated,
- bool truncated, bool streaming)
+ cc_encoder::make(int frame_size, int k, int rate,
+ std::vector<int> polys, int start_state,
+ cc_mode_t mode)
{
return generic_encoder::sptr
- (new cc_encoder_impl(framebits, k,
- rate, polys,
- start_state, end_state,
- tailbiting, terminated,
- truncated, streaming));
+ (new cc_encoder_impl(frame_size, k, rate,
+ polys, start_state,
+ mode));
}
- cc_encoder_impl::cc_encoder_impl(int framebits, int k,
- int rate, std::vector<int> polys,
- int start_state, int end_state,
- bool tailbiting, bool terminated,
- bool truncated, bool streaming)
- : d_framebits(framebits),
+ cc_encoder_impl::cc_encoder_impl(int frame_size, int k, int rate,
+ std::vector<int> polys, int start_state,
+ cc_mode_t mode)
+ : generic_encoder("cc_encoder"),
d_rate(rate), d_k(k), d_polys(polys),
d_start_state(start_state),
- d_tailbiting(tailbiting), d_terminated(terminated),
- d_truncated(truncated), d_streaming(streaming)
+ d_mode(mode)
{
+ if(static_cast<size_t>(d_rate) != d_polys.size()) {
+ throw std::runtime_error("cc_encoder: Number of polynomials must be
the same as the value of rate");
+ }
+
partab_init();
+
+ d_max_frame_size = frame_size;
+ set_frame_size(frame_size);
}
cc_encoder_impl::~cc_encoder_impl()
@@ -75,8 +75,30 @@ namespace gr {
int
cc_encoder_impl::get_output_size()
{
- if(d_terminated) {
- return d_rate * (d_framebits + d_k - 1);
+ return d_output_size;
+ }
+
+ int
+ cc_encoder_impl::get_input_size()
+ {
+ return d_frame_size;
+ }
+
+ bool
+ cc_encoder_impl::set_frame_size(unsigned int frame_size)
+ {
+ bool ret = true;
+ if(frame_size > d_max_frame_size) {
+ GR_LOG_INFO(d_logger, boost::format("tried to set frame to %1%; max
possible is %2%") \
+ % frame_size % d_max_frame_size);
+ frame_size = d_max_frame_size;
+ ret = false;
+ }
+
+ d_frame_size = frame_size;
+
+ if(d_mode == CC_TERMINATED) {
+ d_output_size = d_rate * (d_frame_size + d_k - 1);
}
/*
else if(d_trunc_intrinsic) {
@@ -86,18 +108,20 @@ namespace gr {
cnt++;
}
}
- return (d_rate * (d_framebits)) + (cnt * (d_k - 1));
+ d_output_size = (d_rate * (d_frame_size)) + (cnt * (d_k - 1));
}
*/
else {
- return d_rate * d_framebits;
+ d_output_size = d_rate * d_frame_size;
}
+
+ return ret;
}
- int
- cc_encoder_impl::get_input_size()
+ double
+ cc_encoder_impl::rate()
{
- return d_framebits;
+ return 1.0/static_cast<double>(d_rate);
}
int
@@ -138,65 +162,37 @@ namespace gr {
const unsigned char *in = (const unsigned char *) in_buffer;
unsigned char *out = (unsigned char *) out_buffer;
- int my_state = d_start_state;
- //printf("ms: %d\n", my_state);
+ unsigned char my_state = d_start_state;
- if(d_tailbiting) {
+ if(d_mode == CC_TAILBITING) {
for(unsigned int i = 0; i < d_k - 1; ++i) {
- my_state = (my_state << 1) | (in[d_framebits - (d_k - 1) + i] &
1);
+ my_state = (my_state << 1) | (in[d_frame_size - (d_k - 1) + i] &
1);
}
}
- //printf("start... %d\n", my_state & ((1 << (d_k - 1)) - 1));
- for(unsigned int i = 0; i < d_framebits; ++i) {
+ for(unsigned int i = 0; i < d_frame_size; ++i) {
my_state = (my_state << 1) | (in[i] & 1);
for(unsigned int j = 0; j < d_rate; ++j) {
out[i * d_rate + j] = parity(my_state & d_polys[j]) == 0 ? 0 : 1;
}
}
- if(d_terminated) {
+ if(d_mode == CC_TERMINATED) {
for(unsigned int i = 0; i < d_k - 1; ++i) {
my_state = (my_state << 1) | ((d_start_state >> (d_k - 2 - i)) &
1);
for(unsigned int j = 0; j < d_rate; ++j) {
- out[(i + d_framebits) * d_rate + j] = parity(my_state &
d_polys[j]) == 0 ? 0 : 1;
- }
- }
- }
-
- /*
- if(d_trunc_intrinsic) {
- for(int i = 0; i < d_k - 1; ++i) {
- my_state = (my_state << 1) | ((d_start_state >> d_k - 2 - i) & 1);
- int cnt = 0;
- for(int j = 0; j < d_rate; ++j) {
- if(d_polys[j] != 1) {
- out[(i + d_framebits) * d_rate + cnt] = parity(my_state &
d_polys[j]) == 0 ? 0 : 1;
- cnt++;
- }
+ out[(i + d_frame_size) * d_rate + j] = parity(my_state &
d_polys[j]) == 0 ? 0 : 1;
}
}
}
- */
- if(d_truncated) {
- //printf("end... %d\n", my_state & ((1 << (d_k - 1)) - 1));
+ if(d_mode == CC_TRUNCATED) {
my_state = d_start_state;
}
d_start_state = my_state;
- //d_start_state = my_state & (1 << d_k -1) - 1;
- //printf("ms: %d\n", d_start_state);
-
- /*
- for(int i = d_framebits * d_rate - 25; i < d_framebits * d_rate; ++i) {
- //for(int i = 0; i < 25; ++i) {
- printf("...%d : %u\n", out[i], i);
- }
- */
}
} /* namespace code */
} /* namespace fec */
} /* namespace gr */
-
diff --git a/gr-fec/lib/cc_encoder_impl.h b/gr-fec/lib/cc_encoder_impl.h
index e7a17bd..0088875 100644
--- a/gr-fec/lib/cc_encoder_impl.h
+++ b/gr-fec/lib/cc_encoder_impl.h
@@ -14,7 +14,7 @@
* 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
+p * 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.
@@ -35,13 +35,14 @@ namespace gr {
{
private:
//plug into the generic fec api
- void generic_work(void *inBuffer, void *outbuffer);
+ void generic_work(void *inbuffer, void *outbuffer);
int get_output_size();
int get_input_size();
//everything else...
unsigned char Partab[256];
- unsigned int d_framebits;
+ unsigned int d_frame_size;
+ unsigned int d_max_frame_size;
unsigned int d_rate;
unsigned int d_k;
std::vector<int> d_polys;
@@ -49,21 +50,21 @@ namespace gr {
int d_numstates;
int d_decision_t_size;
int d_start_state;
- bool d_tailbiting;
- bool d_terminated;
- bool d_truncated;
- bool d_streaming;
+ cc_mode_t d_mode;
+ int d_output_size;
+
int parity(int x);
int parityb(unsigned char x);
void partab_init(void);
public:
- cc_encoder_impl(int framebits, int k,
- int rate, std::vector<int> polys,
- int start_state = 0, int end_state = 0,
- bool tailbiting = false, bool terminated = false,
- bool truncated = false, bool streaming = true);
+ cc_encoder_impl(int frame_size, int k, int rate,
+ std::vector<int> polys, int start_state = 0,
+ cc_mode_t mode=CC_STREAMING);
~cc_encoder_impl();
+
+ bool set_frame_size(unsigned int frame_size);
+ double rate();
};
} /* namespace code */
diff --git a/gr-fec/lib/ccsds_decoder_impl.cc b/gr-fec/lib/ccsds_decoder_impl.cc
new file mode 100644
index 0000000..a68d027
--- /dev/null
+++ b/gr-fec/lib/ccsds_decoder_impl.cc
@@ -0,0 +1,192 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2013-2014 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 "ccsds_decoder_impl.h"
+#include <math.h>
+#include <boost/assign/list_of.hpp>
+#include <volk/volk.h>
+#include <sstream>
+#include <vector>
+#include <iostream>
+
+namespace gr {
+ namespace fec {
+ namespace code {
+
+ generic_decoder::sptr
+ ccsds_decoder::make(int frame_size,
+ int start_state, int end_state,
+ cc_mode_t mode)
+ {
+ return generic_decoder::sptr
+ (new ccsds_decoder_impl(frame_size, start_state, end_state, mode));
+ }
+
+ ccsds_decoder_impl::ccsds_decoder_impl(int frame_size,
+ int start_state, int end_state,
+ cc_mode_t mode)
+ : generic_decoder("ccsds_decoder"),
+ d_count(0), d_frame_size(frame_size),
+ d_mode(mode),
+ d_start_state_chaining(start_state),
+ d_start_state_nonchaining(start_state),
+ d_end_state_nonchaining(end_state)
+ {
+ // Set max frame size here; all buffers and settings will be
+ // based on this value.
+ d_max_frame_size = frame_size;
+ set_frame_size(frame_size);
+
+ float RATE = 0.5;
+ float ebn0 = 12.0;
+ float esn0 = RATE*pow(10.0, ebn0/10.0);
+
+ gen_met(d_mettab, 100, esn0, 0.0, 4);
+ viterbi_chunks_init(d_state0);
+ viterbi_chunks_init(d_state1);
+ }
+
+ ccsds_decoder_impl::~ccsds_decoder_impl()
+ {
+ }
+
+ int
+ ccsds_decoder_impl::get_output_size()
+ {
+ // packed bits
+ return d_frame_size/8;
+ }
+
+ int
+ ccsds_decoder_impl::get_input_size()
+ {
+ if(d_mode == CC_TERMINATED) {
+ return 2*(d_frame_size + 7 - 1);
+ }
+ else {
+ return 2*d_frame_size;
+ }
+ }
+
+ int
+ ccsds_decoder_impl::get_input_item_size()
+ {
+ return sizeof(float);
+ }
+
+ int
+ ccsds_decoder_impl::get_history()
+ {
+ if(d_mode == CC_STREAMING) {
+ return 2*(7 - 1);
+ }
+ else {
+ return 0;
+ }
+ }
+
+ float
+ ccsds_decoder_impl::get_shift()
+ {
+ return 0.0;
+ }
+
+ const char*
+ ccsds_decoder_impl::get_input_conversion()
+ {
+ return "none";
+ }
+
+ const char*
+ ccsds_decoder_impl::get_output_conversion()
+ {
+ return "unpack";
+ }
+
+ bool
+ ccsds_decoder_impl::set_frame_size(unsigned int frame_size)
+ {
+ bool ret = true;
+ if(frame_size > d_max_frame_size) {
+ GR_LOG_INFO(d_logger, boost::format("tried to set frame to %1%; max
possible is %2%") \
+ % frame_size % d_max_frame_size);
+ frame_size = d_max_frame_size;
+ ret = false;
+ }
+
+ d_frame_size = frame_size;
+
+ return ret;
+ }
+
+ double
+ ccsds_decoder_impl::rate()
+ {
+ return 0.5;
+ }
+
+ void
+ ccsds_decoder_impl::generic_work(void *inbuffer, void *outbuffer)
+ {
+ const float *in = (const float*)inbuffer;
+ unsigned char *out = (unsigned char*)outbuffer;
+
+ switch(d_mode) {
+
+ case(CC_STREAMING):
+ for(unsigned int i = 0; i < d_frame_size*2; i++) {
+ // Translate and clip [-1.0..1.0] to [28..228]
+ float sample = in[i]*100.0+128.0;
+ if(sample > 255.0)
+ sample = 255.0;
+ else if(sample < 0.0)
+ sample = 0.0;
+
+ d_viterbi_in[d_count % 4] = (unsigned char)(floorf(sample));
+ if((d_count % 4) == 3) {
+ // Every fourth symbol, perform butterfly operation
+ viterbi_butterfly2(d_viterbi_in, d_mettab, d_state0, d_state1);
+
+ // Every sixteenth symbol, read out a byte
+ if(d_count % 16 == 11) {
+ unsigned char tmp;
+ viterbi_get_output(d_state0, out++);
+ viterbi_get_output(d_state0, &tmp);
+ }
+ }
+
+ d_count++;
+ }
+ break;
+
+ default:
+ throw std::runtime_error("ccsds_decoder: mode not recognized");
+ }
+ }
+
+ } /* namespace code */
+ } /* namespace fec */
+} /* namespace gr */
diff --git a/gr-fec/lib/ccsds_decoder_impl.h b/gr-fec/lib/ccsds_decoder_impl.h
new file mode 100644
index 0000000..26ccec4
--- /dev/null
+++ b/gr-fec/lib/ccsds_decoder_impl.h
@@ -0,0 +1,83 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2013-2014 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.
+ */
+
+#ifndef INCLUDED_FEC_CCSDS_DECODER_IMPL_H
+#define INCLUDED_FEC_CCSDS_DECODER_IMPL_H
+
+#include <map>
+#include <string>
+#include <gnuradio/fec/ccsds_decoder.h>
+
+extern "C" {
+#include <gnuradio/fec/viterbi.h>
+}
+
+namespace gr {
+ namespace fec {
+ namespace code {
+
+ class FEC_API ccsds_decoder_impl : public ccsds_decoder
+ {
+ private:
+ //plug into the generic FECAPI
+ void generic_work(void *inbuffer, void *outbuffer);
+ int get_output_size();
+ int get_input_size();
+ int get_history();
+ float get_shift();
+ int get_input_item_size();
+ const char* get_input_conversion();
+ const char* get_output_conversion();
+
+ // Viterbi state
+ int d_mettab[2][256];
+ struct viterbi_state d_state0[64];
+ struct viterbi_state d_state1[64];
+ unsigned char d_viterbi_in[16];
+ int d_count;
+
+ unsigned int d_max_frame_size;
+ unsigned int d_frame_size;
+ cc_mode_t d_mode;
+
+ int *d_start_state;
+ int d_start_state_chaining;
+ int d_start_state_nonchaining;
+ int *d_end_state;
+ int d_end_state_chaining;
+ int d_end_state_nonchaining;
+
+ public:
+ ccsds_decoder_impl(int frame_size,
+ int start_state=0, int end_state=-1,
+ cc_mode_t mode=CC_STREAMING);
+ ~ccsds_decoder_impl();
+
+ bool set_frame_size(unsigned int frame_size);
+ double rate();
+ };
+
+ } /* namespace code */
+ } /* namespace fec */
+} /* namespace gr */
+
+#endif /* INCLUDED_FEC_CCSDS_DECODER_IMPL_H */
diff --git a/gr-fec/lib/ccsds_encoder_impl.cc b/gr-fec/lib/ccsds_encoder_impl.cc
new file mode 100644
index 0000000..2a2228a
--- /dev/null
+++ b/gr-fec/lib/ccsds_encoder_impl.cc
@@ -0,0 +1,152 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2014 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 "ccsds_encoder_impl.h"
+#include <gnuradio/fec/generic_encoder.h>
+#include <cstdio>
+
+extern "C" {
+#include <gnuradio/fec/viterbi.h>
+}
+
+namespace gr {
+ namespace fec {
+ namespace code {
+
+ generic_encoder::sptr
+ ccsds_encoder::make(int frame_size, int start_state,
+ cc_mode_t mode)
+ {
+ return generic_encoder::sptr
+ (new ccsds_encoder_impl(frame_size, start_state, mode));
+ }
+
+ ccsds_encoder_impl::ccsds_encoder_impl(int frame_size, int start_state,
+ cc_mode_t mode)
+ : generic_encoder("ccsds_encoder"),
+ d_start_state(static_cast<unsigned char>(start_state)),
+ d_mode(mode)
+ {
+ d_max_frame_size = frame_size;
+ set_frame_size(frame_size);
+ }
+
+ ccsds_encoder_impl::~ccsds_encoder_impl()
+ {
+ }
+
+ int
+ ccsds_encoder_impl::get_output_size()
+ {
+ return d_output_size;
+ }
+
+ int
+ ccsds_encoder_impl::get_input_size()
+ {
+ return d_frame_size/8; // packed byte input
+ }
+
+ const char*
+ ccsds_encoder_impl::get_input_conversion()
+ {
+ // Expects packed data input; tell wrapper to pack it.
+ return "pack";
+ }
+
+ bool
+ ccsds_encoder_impl::set_frame_size(unsigned int frame_size)
+ {
+ bool ret = true;
+ if(frame_size > d_max_frame_size) {
+ GR_LOG_INFO(d_logger, boost::format("tried to set frame to %1%; max
possible is %2%") \
+ % frame_size % d_max_frame_size);
+ frame_size = d_max_frame_size;
+ ret = false;
+ }
+
+ d_frame_size = frame_size;
+
+ if(d_mode == CC_TERMINATED) {
+ d_output_size = 2*(d_frame_size + 7 - 1);
+ }
+ else {
+ d_output_size = 2*d_frame_size;
+ }
+
+ return ret;
+ }
+
+ double
+ ccsds_encoder_impl::rate()
+ {
+ return 0.5;
+ }
+
+ void
+ ccsds_encoder_impl::generic_work(void *in_buffer, void *out_buffer)
+ {
+ unsigned char *in = (unsigned char*) in_buffer;
+ unsigned char *out = (unsigned char*) out_buffer;
+
+ unsigned char my_state = d_start_state;
+
+ if(d_mode == CC_TAILBITING) {
+ // Grab K-1 (6) bits of data from the last input byte to add
+ // onto the from of the encoding stream for tailbiting mode.
+ unsigned char sym = in[d_frame_size/8 - 1];
+ for(unsigned int i = 0; i < 7 - 1; ++i) {
+ my_state = (my_state << 1) | ((sym >> (5 - i)) & 1);
+ }
+ }
+
+ my_state = encode(out, in, d_frame_size/8, my_state);
+
+ if(d_mode == CC_TERMINATED) {
+ // encode works on bytes, but we are only adding some number
+ // of bits to the end of the frame, so we abuse the encode
+ // function by reshifting the start state within the
+ // for-loop and only taking the last two bits out of the
+ // encoded 2-bytes.
+ unsigned char end_bits[16];
+ for(unsigned int i = 0; i < (7 - 1); ++i) {
+ my_state = (my_state << 1) | ((d_start_state >> (7 - 2 - i)) & 1);
+ encode(&end_bits[0], &my_state, 1, my_state);
+ out[(i + d_frame_size) * 2 + 0] = end_bits[14];
+ out[(i + d_frame_size) * 2 + 1] = end_bits[15];
+ }
+ }
+
+ if(d_mode == CC_TRUNCATED) {
+ my_state = d_start_state;
+ }
+
+ d_start_state = my_state;
+ }
+
+ } /* namespace code */
+ } /* namespace fec */
+} /* namespace gr */
diff --git a/gr-fec/include/gnuradio/fec/cc_encoder.h
b/gr-fec/lib/ccsds_encoder_impl.h
similarity index 51%
copy from gr-fec/include/gnuradio/fec/cc_encoder.h
copy to gr-fec/lib/ccsds_encoder_impl.h
index 1857e92..e67890b 100644
--- a/gr-fec/include/gnuradio/fec/cc_encoder.h
+++ b/gr-fec/lib/ccsds_encoder_impl.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2013-2014 Free Software Foundation, Inc.
+ * Copyright 2014 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -20,36 +20,45 @@
* Boston, MA 02110-1301, USA.
*/
-#ifndef INCLUDED_FEC_CC_ENCODER_H
-#define INCLUDED_FEC_CC_ENCODER_H
+#ifndef INCLUDED_FEC_CCSDS_ENCODER_IMPL_H
+#define INCLUDED_FEC_CCSDS_ENCODER_IMPL_H
-#include <gnuradio/fec/api.h>
-#include <gnuradio/fec/encoder.h>
-#include <gnuradio/fec/cc_common.h>
#include <map>
#include <string>
+#include <gnuradio/fec/ccsds_encoder.h>
namespace gr {
namespace fec {
namespace code {
- /*!
- * \brief Convolutional Code Encoding block
- * \ingroup error_coding_blk
- */
- class FEC_API cc_encoder : virtual public generic_encoder
+ class FEC_API ccsds_encoder_impl : public ccsds_encoder
{
+ private:
+ //plug into the generic fec api
+ void generic_work(void *inbuffer, void *outbuffer);
+ int get_output_size();
+ int get_input_size();
+ const char* get_input_conversion();
+
+ unsigned int d_max_frame_size;
+ unsigned int d_frame_size;
+
+ unsigned char d_start_state;
+ cc_mode_t d_mode;
+
+ int d_output_size;
+
public:
- static generic_encoder::sptr make
- (int framebits, int k,
- int rate, std::vector<int> polys,
- int start_state = 0, int end_state = 0,
- bool tailbiting = false, bool terminated = false,
- bool truncated = false, bool streaming = true);
+ ccsds_encoder_impl(int frame_size, int start_state = 0,
+ cc_mode_t mode=CC_STREAMING);
+ ~ccsds_encoder_impl();
+
+ bool set_frame_size(unsigned int frame_size);
+ double rate();
};
} /* namespace code */
} /* namespace fec */
} /* namespace gr */
-#endif /* INCLUDED_FEC_CC_ENCODER_H */
+#endif /* INCLUDED_FEC_CCSDS_ENCODER_IMPL_H */
diff --git a/gr-fec/lib/decode_ccsds_27_fb_impl.cc
b/gr-fec/lib/decode_ccsds_27_fb_impl.cc
index 014297c..9b782b7 100644
--- a/gr-fec/lib/decode_ccsds_27_fb_impl.cc
+++ b/gr-fec/lib/decode_ccsds_27_fb_impl.cc
@@ -37,14 +37,14 @@ namespace gr {
decode_ccsds_27_fb_impl::decode_ccsds_27_fb_impl()
: sync_decimator("decode_ccsds_27_fb",
- io_signature::make (1, 1, sizeof(float)),
- io_signature::make (1, 1, sizeof(char)),
- 2*8), d_count(0) // Rate 1/2 code, unpacked to
packed conversion
+ io_signature::make (1, 1, sizeof(float)),
+ io_signature::make (1, 1, sizeof(char)),
+ 2*8), d_count(0) // Rate 1/2 code, unpacked to packed
conversion
{
float RATE = 0.5;
float ebn0 = 12.0;
float esn0 = RATE*pow(10.0, ebn0/10.0);
-
+
gen_met(d_mettab, 100, esn0, 0.0, 256);
viterbi_chunks_init(d_state0);
viterbi_chunks_init(d_state1);
@@ -55,23 +55,23 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
- const float *in = (const float *)input_items[0];
- unsigned char *out = (unsigned char *)output_items[0];
-
+ const float *in = (const float*)input_items[0];
+ unsigned char *out = (unsigned char*)output_items[0];
+
for (int i = 0; i < noutput_items*16; i++) {
// Translate and clip [-1.0..1.0] to [28..228]
float sample = in[i]*100.0+128.0;
- if (sample > 255.0)
+ if(sample > 255.0)
sample = 255.0;
- else if (sample < 0.0)
+ else if(sample < 0.0)
sample = 0.0;
unsigned char sym = (unsigned char)(floor(sample));
-
+
d_viterbi_in[d_count % 4] = sym;
- if ((d_count % 4) == 3) {
+ if((d_count % 4) == 3) {
// Every fourth symbol, perform butterfly operation
viterbi_butterfly2(d_viterbi_in, d_mettab, d_state0, d_state1);
-
+
// Every sixteenth symbol, read out a byte
if (d_count % 16 == 11) {
// long metric =
@@ -79,10 +79,10 @@ namespace gr {
// printf("%li\n", *(out-1), metric);
}
}
-
+
d_count++;
}
-
+
return noutput_items;
}
diff --git a/gr-fec/lib/decode_ccsds_27_fb_impl.h
b/gr-fec/lib/decode_ccsds_27_fb_impl.h
index cd16c6a..83fed60 100644
--- a/gr-fec/lib/decode_ccsds_27_fb_impl.h
+++ b/gr-fec/lib/decode_ccsds_27_fb_impl.h
@@ -40,7 +40,7 @@ namespace gr {
struct viterbi_state d_state0[64];
struct viterbi_state d_state1[64];
unsigned char d_viterbi_in[16];
-
+
int d_count;
public:
diff --git a/gr-fec/lib/decoder_impl.cc b/gr-fec/lib/decoder_impl.cc
index 30132d0..dfc0842 100644
--- a/gr-fec/lib/decoder_impl.cc
+++ b/gr-fec/lib/decoder_impl.cc
@@ -50,13 +50,14 @@ namespace gr {
{
set_fixed_rate(true);
set_relative_rate((double)(my_decoder->get_output_size())/my_decoder->get_input_size());
+ GR_LOG_DEBUG(d_debug_logger, boost::format("relative_rate: %1%") %
relative_rate());
//want to guarantee you have enough to run at least one time...
//remember! this is not a sync block... set_output_multiple does not
//actually guarantee the output multiple... it DOES guarantee how many
//outputs (hence inputs) are made available... this is WEIRD to do in
//GNU Radio, and the algorithm is sensitive to this value
- set_output_multiple(my_decoder->get_output_size() +
(my_decoder->get_history() ) );
+ set_output_multiple(my_decoder->get_output_size() +
(my_decoder->get_history()));
d_inbuf = buf_sptr(new unsigned char[(my_decoder->get_input_size() +
my_decoder->get_history())*input_item_size]);
d_decoder = my_decoder;
}
@@ -64,20 +65,20 @@ namespace gr {
int
decoder_impl::fixed_rate_ninput_to_noutput(int ninput)
{
- return
(int)(((d_decoder->get_output_size()/(double)d_decoder->get_input_size()) *
ninput) + .5);
+ return (int)(0.5 + ninput*relative_rate());
}
int
decoder_impl::fixed_rate_noutput_to_ninput(int noutput)
{
- return
(int)(((d_decoder->get_input_size()/(double)d_decoder->get_output_size()) *
noutput) + .5);
+ return (int)(0.5 + noutput/relative_rate());
}
void
decoder_impl::forecast(int noutput_items,
gr_vector_int& ninput_items_required)
{
- ninput_items_required[0] =
(int)(((d_decoder->get_input_size()/(double)d_decoder->get_output_size()) *
noutput_items) + .5);
+ ninput_items_required[0] = 0.5 +
fixed_rate_noutput_to_ninput(noutput_items);
}
int
@@ -86,35 +87,39 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
- const unsigned char *inBuffer = (unsigned char*)input_items[0];
- unsigned char *outBuffer = (unsigned char *)output_items[0];
+ const unsigned char *in = (unsigned char*)input_items[0];
+ unsigned char *out = (unsigned char *)output_items[0];
- int outnum = (int)(((1.0/relative_rate()) * noutput_items) + .5);
- int innum = (int)(relative_rate() * (ninput_items[0] -
d_decoder->get_history()) + .5)/(output_multiple() - d_decoder->get_history());
+ int outnum = (int)(((1.0/relative_rate()) * noutput_items) + 0.5);
+ int innum = (int)(relative_rate() * (ninput_items[0] -
d_decoder->get_history()) + 0.5)/(output_multiple() - d_decoder->get_history());
int items = (outnum <= ninput_items[0] - d_decoder->get_history()) ?
noutput_items/(output_multiple() - d_decoder->get_history()) :
innum;
- //GR_LOG_DEBUG(d_debug_logger, boost::formt("%1%, %2%, %3%") \
- // % outnum % ninput_items[0] % items);
+ GR_LOG_DEBUG(d_debug_logger, boost::format("%1%, %2%, %3%") \
+ % outnum % ninput_items[0] % items);
for(int i = 0; i < items; ++i) {
memcpy((void *)d_inbuf.get(),
- inBuffer+(i*(d_decoder->get_input_size()) * d_input_item_size),
+ in+(i*(d_decoder->get_input_size()) * d_input_item_size),
(d_decoder->get_input_size() + d_decoder->get_history()) *
d_input_item_size);
d_decoder->generic_work((void*)d_inbuf.get(),
-
(void*)(outBuffer+(i*d_decoder->get_output_size()*d_output_item_size)));
+
(void*)(out+(i*d_decoder->get_output_size()*d_output_item_size)));
+
+ add_item_tag(0, nitems_written(0) +
((i+1)*d_decoder->get_output_size()*d_output_item_size),
+ pmt::intern(d_decoder->alias()), pmt::PMT_T,
pmt::intern(alias()));
}
- // GR_LOG_DEBUG(d_debug_logger, boost::format("consumed %1%") \
- // % (int)(((1.0/relative_rate())*items*(output_multiple() -
d_decoder->get_history())) + .5));
- // GR_LOG_DEBUG(d_debug_logger, boost::format("returned %1%") \
- // % (items * (output_multiple() -
d_decoder->get_history())));
+ int consumed = static_cast<int>(items/relative_rate()*(output_multiple()
- d_decoder->get_history()) + 0.5);
+ int returned = items*(output_multiple() - d_decoder->get_history());
+
+ GR_LOG_DEBUG(d_debug_logger, boost::format("consumed %1%") % consumed);
+ GR_LOG_DEBUG(d_debug_logger, boost::format("returned %1%") % returned);
- consume_each((int)(((1.0/relative_rate()) * items * (output_multiple() -
d_decoder->get_history())) + .5));
- return items * (output_multiple() - d_decoder->get_history());
+ consume_each(consumed);
+ return returned;
}
} /* namespace fec */
diff --git a/gr-fec/lib/depuncture_bb_impl.cc b/gr-fec/lib/depuncture_bb_impl.cc
index b353f99..e388120 100644
--- a/gr-fec/lib/depuncture_bb_impl.cc
+++ b/gr-fec/lib/depuncture_bb_impl.cc
@@ -26,6 +26,7 @@
#include "depuncture_bb_impl.h"
#include <gnuradio/io_signature.h>
+#include <volk/volk.h>
#include <boost/bind.hpp>
#include <pmt/pmt.h>
#include <string>
@@ -35,23 +36,42 @@ namespace gr {
namespace fec {
depuncture_bb::sptr
- depuncture_bb::make(int delay, int puncpat, int puncholes, int puncsize)
+ depuncture_bb::make(int puncsize, int puncpat,
+ int delay, char symbol)
{
return gnuradio::get_initial_sptr
- (new depuncture_bb_impl(delay, puncpat, puncholes, puncsize));
+ (new depuncture_bb_impl(puncsize, puncpat,
+ delay, symbol));
}
- depuncture_bb_impl::depuncture_bb_impl(int delay, int puncpat,
- int puncholes, int puncsize)
+ depuncture_bb_impl::depuncture_bb_impl(int puncsize, int puncpat,
+ int delay, char symbol)
: block("depuncture_bb",
io_signature::make(1, 1, sizeof(unsigned char)),
io_signature::make(1, 1, sizeof(unsigned char))),
- d_delay(delay), d_puncholes(puncholes), d_puncsize(puncsize)
+ d_puncsize(puncsize), d_delay(delay), d_sym(symbol)
{
+ // Create a mask of all 1's of puncsize length
+ int mask = 0;
+ for(int i = 0; i < d_puncsize; i++)
+ mask |= 1 << i;
+
+ // Rotate the pattern for the delay value; then mask it if there
+ // are any excess 1's in the pattern.
for(int i = 0; i < d_delay; ++i) {
puncpat = ((puncpat & 1) << (d_puncsize - 1)) + (puncpat >> 1);
}
- d_puncpat = puncpat;
+ d_puncpat = puncpat & mask;
+
+ // Calculate the number of holes in the pattern. The mask is all
+ // 1's given puncsize and puncpat is a pattern with >= puncsize
+ // 0's (masked to ensure this). The difference between the
+ // number of 1's in the mask and the puncpat is the number of
+ // holes.
+ uint32_t count_mask=0, count_pat=0;
+ volk_32u_popcnt(&count_mask, static_cast<uint32_t>(mask));
+ volk_32u_popcnt(&count_pat, static_cast<uint32_t>(d_puncpat));
+ d_puncholes = count_mask - count_pat;
set_fixed_rate(true);
set_relative_rate((double)d_puncsize/(d_puncsize - d_puncholes));
@@ -103,24 +123,27 @@ namespace gr {
for(int i=0, k=0; i < noutput_items/output_multiple(); ++i) {
for(int j = 0; j < output_multiple(); ++j) {
- out[i*output_multiple() + j] = ((d_puncpat >> (d_puncsize - 1 - j)) &
1) ? in[k++] : 127;
+ out[i*output_multiple() + j] = ((d_puncpat >> (d_puncsize - 1 - j)) &
1) ? in[k++] : d_sym;
}
}
/*
- printf(">>>>>>start\n");
+ GR_LOG_DEBUG(d_debug_logger, ">>>>>> start");
for(int i = 0, k=0; i < noutput_items; ++i) {
if((d_puncpat >> (d_puncsize - 1 - (i % d_puncsize))) & 1) {
- printf("%d...%d\n", out[i], in[k++]);
+ GR_LOG_DEBUG(d_debug_logger, boost::format("%1%...%2%") \
+ % out[i] % in[k++]);
}
else {
- printf("snit %d\n", out[i]);
+ GR_LOG_DEBUG(d_debug_logger, boost::format("snit %1%") % out[i]);
}
}
- */
- /*printf("comp: %d, %d\n", noutput_items, ninput_items[0]);
- printf("consuming %d\n", (int)(((1.0/relative_rate()) * noutput_items) +
.5));*/
+ GR_LOG_DEBUG(d_debug_logger, boost::format("comp: %1%, %2%\n") \
+ % noutput_items % ninput_items[0]);
+ GR_LOG_DEBUG(d_debug_logger, boost::format("consuming %1%") \
+ % ((int)(((1.0/relative_rate()) * noutput_items) + .5)));
+ */
consume_each((int)(((1.0/relative_rate()) * noutput_items) + .5));
return noutput_items;
@@ -128,5 +151,3 @@ namespace gr {
} /* namespace fec */
} /* namespace gr */
-
-
diff --git a/gr-fec/lib/depuncture_bb_impl.h b/gr-fec/lib/depuncture_bb_impl.h
index 9e21012..013276d 100644
--- a/gr-fec/lib/depuncture_bb_impl.h
+++ b/gr-fec/lib/depuncture_bb_impl.h
@@ -31,14 +31,15 @@ namespace gr {
class FEC_API depuncture_bb_impl : public depuncture_bb
{
private:
+ int d_puncsize;
int d_delay;
int d_puncholes;
- int d_puncsize;
int d_puncpat;
+ char d_sym;
public:
- depuncture_bb_impl(int delay, int puncpat,
- int puncholes, int puncsize);
+ depuncture_bb_impl(int puncsize, int puncpat,
+ int delay=0, char symbol=127);
~depuncture_bb_impl();
int general_work(int noutput_items,
diff --git a/gr-fec/lib/encoder_impl.cc b/gr-fec/lib/encoder_impl.cc
index b595648..399bcc4 100644
--- a/gr-fec/lib/encoder_impl.cc
+++ b/gr-fec/lib/encoder_impl.cc
@@ -51,9 +51,12 @@ namespace gr {
d_output_item_size(output_item_size)
{
set_fixed_rate(true);
-
set_relative_rate((double)my_encoder->get_output_size()/my_encoder->get_input_size());
+
set_relative_rate((double)my_encoder->get_output_size()/(double)my_encoder->get_input_size());
set_output_multiple(my_encoder->get_output_size());
d_encoder = my_encoder;
+
+ d_input_size = d_encoder->get_input_size()*d_input_item_size;
+ d_output_size = d_encoder->get_output_size()*d_output_item_size;
}
encoder_impl::~encoder_impl()
@@ -63,20 +66,20 @@ namespace gr {
int
encoder_impl::fixed_rate_ninput_to_noutput(int ninput)
{
- return
(int)(((d_encoder->get_output_size()/(double)d_encoder->get_input_size()) *
ninput) + .5);
+ return (int)(0.5 + ninput*relative_rate());
}
int
encoder_impl::fixed_rate_noutput_to_ninput(int noutput)
{
- return
(int)(((d_encoder->get_input_size()/(double)d_encoder->get_output_size()) *
noutput) + .5);
+ return (int)(0.5 + noutput/relative_rate());
}
void
encoder_impl::forecast(int noutput_items,
gr_vector_int& ninput_items_required)
{
- ninput_items_required[0] =
(int)(((d_encoder->get_input_size()/(double)d_encoder->get_output_size()) *
noutput_items) + .5);
+ ninput_items_required[0] = fixed_rate_noutput_to_ninput(noutput_items);
}
int
@@ -85,15 +88,24 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
- char *inBuffer = (char*)input_items[0];
- char *outBuffer = (char*)output_items[0];
+ char *inbuffer = (char*)input_items[0];
+ char *outbuffer = (char*)output_items[0];
+
+ GR_LOG_DEBUG(d_debug_logger, boost::format("%1%, %2%, %3%") \
+ % noutput_items % ninput_items[0] %
(noutput_items/output_multiple()));
- for(int i = 0; i < noutput_items/output_multiple(); ++i) {
-
d_encoder->generic_work((void*)(inBuffer+(i*d_encoder->get_input_size()*d_input_item_size)),
-
(void*)(outBuffer+(i*d_encoder->get_output_size()*d_output_item_size)));
+
+ for(int i = 0; i < noutput_items/output_multiple(); i++) {
+ d_encoder->generic_work((void*)(inbuffer+(i*d_input_size)),
+ (void*)(outbuffer+(i*d_output_size)));
}
- consume_each((int)(((1.0/relative_rate()) * noutput_items) + .5));
+ GR_LOG_DEBUG(d_debug_logger, boost::format("consuming: %1%") \
+ % (fixed_rate_noutput_to_ninput(noutput_items)));
+ GR_LOG_DEBUG(d_debug_logger, boost::format("returning: %1%") \
+ % (noutput_items));
+
+ consume_each(fixed_rate_noutput_to_ninput(noutput_items));
return noutput_items;
}
diff --git a/gr-fec/lib/encoder_impl.h b/gr-fec/lib/encoder_impl.h
index 300f1c0..3f32521 100644
--- a/gr-fec/lib/encoder_impl.h
+++ b/gr-fec/lib/encoder_impl.h
@@ -34,6 +34,8 @@ namespace gr {
generic_encoder::sptr d_encoder;
size_t d_input_item_size;
size_t d_output_item_size;
+ size_t d_input_size;
+ size_t d_output_size;
public:
encoder_impl(generic_encoder::sptr my_encoder,
diff --git a/gr-fec/lib/generic_decoder.cc b/gr-fec/lib/generic_decoder.cc
index e9a5fc1..ed93ec1 100644
--- a/gr-fec/lib/generic_decoder.cc
+++ b/gr-fec/lib/generic_decoder.cc
@@ -25,6 +25,7 @@
#endif
#include <gnuradio/fec/generic_decoder.h>
+#include <gnuradio/prefs.h>
#include <stdio.h>
namespace gr {
@@ -34,6 +35,35 @@ namespace gr {
{
d_name = name;
my_id = base_unique_id++;
+
+#ifdef ENABLE_GR_LOG
+#ifdef HAVE_LOG4CPP
+ prefs *p = prefs::singleton();
+ std::string config_file = p->get_string("LOG", "log_config", "");
+ std::string log_level = p->get_string("LOG", "log_level", "off");
+ std::string log_file = p->get_string("LOG", "log_file", "");
+
+ GR_CONFIG_LOGGER(config_file);
+
+ GR_LOG_GETLOGGER(LOG, "gr_log." + alias());
+ GR_LOG_SET_LEVEL(LOG, log_level);
+ if(log_file.size() > 0) {
+ if(log_file == "stdout") {
+ GR_LOG_ADD_CONSOLE_APPENDER(LOG, "cout","gr::log :%p: %c{1} - %m%n");
+ }
+ else if(log_file == "stderr") {
+ GR_LOG_ADD_CONSOLE_APPENDER(LOG, "cerr","gr::log :%p: %c{1} - %m%n");
+ }
+ else {
+ GR_LOG_ADD_FILE_APPENDER(LOG, log_file , true,"%r :%p: %c{1} -
%m%n");
+ }
+ }
+ d_logger = LOG;
+
+#endif /* HAVE_LOG4CPP */
+#else /* ENABLE_GR_LOG */
+ d_logger = NULL;
+#endif /* ENABLE_GR_LOG */
}
generic_decoder::~generic_decoder()
@@ -52,22 +82,22 @@ namespace gr {
return 0.0;
}
- const char*
- generic_decoder::get_conversion()
- {
- return "none";
- }
-
int
generic_decoder::get_input_item_size()
{
- return 4;
+ return sizeof(float);
}
int
generic_decoder::get_output_item_size()
{
- return 1;
+ return sizeof(char);
+ }
+
+ const char*
+ generic_decoder::get_input_conversion()
+ {
+ return "none";
}
const char*
@@ -123,13 +153,13 @@ namespace gr {
}
const char*
- get_conversion(generic_decoder::sptr my_decoder)
+ get_decoder_input_conversion(generic_decoder::sptr my_decoder)
{
- return my_decoder->get_conversion();
+ return my_decoder->get_input_conversion();
}
const char*
- get_output_conversion(generic_decoder::sptr my_decoder)
+ get_decoder_output_conversion(generic_decoder::sptr my_decoder)
{
return my_decoder->get_output_conversion();
}
diff --git a/gr-fec/lib/generic_encoder.cc b/gr-fec/lib/generic_encoder.cc
index 9402b66..934d193 100644
--- a/gr-fec/lib/generic_encoder.cc
+++ b/gr-fec/lib/generic_encoder.cc
@@ -25,15 +25,73 @@
#endif
#include <gnuradio/fec/generic_encoder.h>
+#include <gnuradio/prefs.h>
#include <stdio.h>
namespace gr {
namespace fec {
+ generic_encoder::generic_encoder(std::string name)
+ {
+ d_name = name;
+ my_id = base_unique_id++;
+
+#ifdef ENABLE_GR_LOG
+#ifdef HAVE_LOG4CPP
+ prefs *p = prefs::singleton();
+ std::string config_file = p->get_string("LOG", "log_config", "");
+ std::string log_level = p->get_string("LOG", "log_level", "off");
+ std::string log_file = p->get_string("LOG", "log_file", "");
+
+ GR_CONFIG_LOGGER(config_file);
+
+ GR_LOG_GETLOGGER(LOG, "gr_log." + alias());
+ GR_LOG_SET_LEVEL(LOG, log_level);
+ if(log_file.size() > 0) {
+ if(log_file == "stdout") {
+ GR_LOG_ADD_CONSOLE_APPENDER(LOG, "cout","gr::log :%p: %c{1} - %m%n");
+ }
+ else if(log_file == "stderr") {
+ GR_LOG_ADD_CONSOLE_APPENDER(LOG, "cerr","gr::log :%p: %c{1} - %m%n");
+ }
+ else {
+ GR_LOG_ADD_FILE_APPENDER(LOG, log_file , true,"%r :%p: %c{1} -
%m%n");
+ }
+ }
+ d_logger = LOG;
+
+#endif /* HAVE_LOG4CPP */
+#else /* ENABLE_GR_LOG */
+ d_logger = NULL;
+#endif /* ENABLE_GR_LOG */
+ }
+
generic_encoder::~generic_encoder()
{
}
+ const char*
+ generic_encoder::get_input_conversion()
+ {
+ return "none";
+ }
+
+ const char*
+ generic_encoder::get_output_conversion()
+ {
+ return "none";
+ }
+
+ int generic_encoder::base_unique_id = 1;
+ int
+ generic_encoder::unique_id()
+ {
+ return my_id;
+ }
+
+ /*******************************************************
+ * Static functions
+ ******************************************************/
int
get_encoder_output_size(generic_encoder::sptr my_encoder)
{
@@ -46,5 +104,17 @@ namespace gr {
return my_encoder->get_input_size();
}
+ const char*
+ get_encoder_input_conversion(generic_encoder::sptr my_encoder)
+ {
+ return my_encoder->get_input_conversion();
+ }
+
+ const char*
+ get_encoder_output_conversion(generic_encoder::sptr my_encoder)
+ {
+ return my_encoder->get_output_conversion();
+ }
+
} /* namespace fec */
} /* namespace gr */
diff --git a/gr-fec/lib/tagged_decoder_impl.cc
b/gr-fec/lib/tagged_decoder_impl.cc
new file mode 100644
index 0000000..595537c
--- /dev/null
+++ b/gr-fec/lib/tagged_decoder_impl.cc
@@ -0,0 +1,100 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2014 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 "tagged_decoder_impl.h"
+#include <gnuradio/io_signature.h>
+#include <stdio.h>
+
+namespace gr {
+ namespace fec {
+
+ tagged_decoder::sptr
+ tagged_decoder::make(generic_decoder::sptr my_decoder,
+ size_t input_item_size,
+ size_t output_item_size,
+ const std::string &lengthtagname)
+ {
+ return gnuradio::get_initial_sptr
+ ( new tagged_decoder_impl(my_decoder, input_item_size,
+ output_item_size, lengthtagname));
+ }
+
+ tagged_decoder_impl::tagged_decoder_impl(generic_decoder::sptr my_decoder,
+ size_t input_item_size,
+ size_t output_item_size,
+ const std::string &lengthtagname)
+ : tagged_stream_block("fec_tagged_decoder",
+ io_signature::make(1, 1, input_item_size),
+ io_signature::make(1, 1, output_item_size),
+ lengthtagname),
+ d_input_item_size(input_item_size),
d_output_item_size(output_item_size)
+ {
+ d_inbuf = buf_sptr(new unsigned char[(my_decoder->get_input_size() +
my_decoder->get_history())*input_item_size]);
+ d_decoder = my_decoder;
+
+ set_relative_rate(d_decoder->rate());
+ }
+
+ int
+ tagged_decoder_impl::calculate_output_stream_length(const gr_vector_int
&ninput_items)
+ {
+ return d_decoder->get_output_size();
+ }
+
+ tagged_decoder_impl::~tagged_decoder_impl()
+ {
+ }
+
+ int
+ tagged_decoder_impl::work(int noutput_items,
+ gr_vector_int& ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const unsigned char *in = (unsigned char*)input_items[0];
+ unsigned char *out = (unsigned char *)output_items[0];
+
+ d_decoder->set_frame_size(ninput_items[0]/2);
+ if(noutput_items < d_decoder->get_output_size())
+ return 0;
+
+ GR_LOG_DEBUG(d_debug_logger, boost::format("%1%, %2%, %3%") \
+ % noutput_items % ninput_items[0] %
d_decoder->get_output_size());
+
+ memcpy((void *)d_inbuf.get(),
+ in+(d_decoder->get_input_size() * d_input_item_size),
+ (d_decoder->get_input_size() + d_decoder->get_history()) *
d_input_item_size);
+
+ d_decoder->generic_work((void*)d_inbuf.get(), (void*)(out));
+
+ add_item_tag(0, nitems_written(0) +
d_decoder->get_output_size()*d_output_item_size,
+ pmt::intern(d_decoder->alias()), pmt::PMT_T,
pmt::intern(alias()));
+
+ return d_decoder->get_output_size();
+ }
+
+ } /* namespace fec */
+} /* namespace gr */
diff --git a/gr-fec/lib/encoder_impl.h b/gr-fec/lib/tagged_decoder_impl.h
similarity index 52%
copy from gr-fec/lib/encoder_impl.h
copy to gr-fec/lib/tagged_decoder_impl.h
index 300f1c0..4eeab25 100644
--- a/gr-fec/lib/encoder_impl.h
+++ b/gr-fec/lib/tagged_decoder_impl.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2013-2014 Free Software Foundation, Inc.
+ * Copyright 2014 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -20,38 +20,37 @@
* Boston, MA 02110-1301, USA.
*/
-#ifndef INCLUDED_FEC_ENCODER_IMPL_H
-#define INCLUDED_FEC_ENCODER_IMPL_H
+#ifndef INCLUDED_FEC_TAGGED_DECODER_IMPL_H
+#define INCLUDED_FEC_TAGGED_DECODER_IMPL_H
-#include <gnuradio/fec/encoder.h>
+#include <gnuradio/fec/tagged_decoder.h>
namespace gr {
namespace fec {
- class FEC_API encoder_impl : public encoder
+ class FEC_API tagged_decoder_impl : public tagged_decoder
{
private:
- generic_encoder::sptr d_encoder;
+ generic_decoder::sptr d_decoder;
size_t d_input_item_size;
size_t d_output_item_size;
+ buf_sptr d_inbuf;
public:
- encoder_impl(generic_encoder::sptr my_encoder,
- size_t input_item_size,
- size_t output_item_size);
- ~encoder_impl();
-
- int general_work(int noutput_items,
- gr_vector_int& ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
- int fixed_rate_ninput_to_noutput(int ninput);
- int fixed_rate_noutput_to_ninput(int noutput);
- void forecast(int noutput_items,
- gr_vector_int& ninput_items_required);
+ tagged_decoder_impl(generic_decoder::sptr my_decoder,
+ size_t input_item_size,
+ size_t output_item_size,
+ const std::string &lengthtagname="packet_len");
+ ~tagged_decoder_impl();
+
+ int work(int noutput_items,
+ gr_vector_int& ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ int calculate_output_stream_length(const gr_vector_int &ninput_items);
};
} /* namespace fec */
} /* namespace gr */
-#endif /* INCLUDED_FEC_ENCODER_IMPL_H */
+#endif /* INCLUDED_FEC_TAGGED_DECODER_IMPL_H */
diff --git a/gr-fec/lib/tagged_encoder_impl.cc
b/gr-fec/lib/tagged_encoder_impl.cc
new file mode 100644
index 0000000..f914866
--- /dev/null
+++ b/gr-fec/lib/tagged_encoder_impl.cc
@@ -0,0 +1,94 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2014 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 "tagged_encoder_impl.h"
+#include <gnuradio/io_signature.h>
+#include <stdio.h>
+
+namespace gr {
+ namespace fec {
+
+ tagged_encoder::sptr
+ tagged_encoder::make(generic_encoder::sptr my_encoder,
+ size_t input_item_size,
+ size_t output_item_size,
+ const std::string& lengthtagname)
+ {
+ return gnuradio::get_initial_sptr
+ (new tagged_encoder_impl(my_encoder, input_item_size,
+ output_item_size,
+ lengthtagname));
+ }
+
+ tagged_encoder_impl::tagged_encoder_impl(generic_encoder::sptr my_encoder,
+ size_t input_item_size,
+ size_t output_item_size,
+ const std::string& lengthtagname)
+ : tagged_stream_block("fec_tagged_encoder",
+ io_signature::make(1, 1, input_item_size),
+ io_signature::make(1, 1, output_item_size),
+ lengthtagname),
+ d_input_item_size(input_item_size),
d_output_item_size(output_item_size)
+ {
+ d_encoder = my_encoder;
+ }
+
+ tagged_encoder_impl::~tagged_encoder_impl()
+ {
+ }
+
+ int
+ tagged_encoder_impl::calculate_output_stream_length(const gr_vector_int
&ninput_items)
+ {
+ return d_encoder->get_output_size();
+ }
+
+ int
+ tagged_encoder_impl::work(int noutput_items,
+ gr_vector_int& ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ char *inbuffer = (char*)input_items[0];
+ char *outbuffer = (char*)output_items[0];
+
+ d_encoder->set_frame_size(ninput_items[0]);
+ if(noutput_items < d_encoder->get_output_size())
+ return 0;
+
+ GR_LOG_DEBUG(d_debug_logger, boost::format("nout: %1% nin: %2% ret:
%3%") \
+ % noutput_items % ninput_items[0] %
d_encoder->get_output_size());
+
+ d_encoder->generic_work((void*)(inbuffer), (void*)(outbuffer));
+
+ add_item_tag(0, nitems_written(0) +
(d_encoder->get_output_size()*d_output_item_size),
+ pmt::intern(d_encoder->alias()), pmt::PMT_T,
pmt::intern(alias()));
+
+ return d_encoder->get_output_size();
+ }
+
+ } /* namespace fec */
+} /* namespace gr */
diff --git a/gr-fec/lib/encoder_impl.h b/gr-fec/lib/tagged_encoder_impl.h
similarity index 54%
copy from gr-fec/lib/encoder_impl.h
copy to gr-fec/lib/tagged_encoder_impl.h
index 300f1c0..55b3553 100644
--- a/gr-fec/lib/encoder_impl.h
+++ b/gr-fec/lib/tagged_encoder_impl.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2013-2014 Free Software Foundation, Inc.
+ * Copyright 2014 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -20,15 +20,15 @@
* Boston, MA 02110-1301, USA.
*/
-#ifndef INCLUDED_FEC_ENCODER_IMPL_H
-#define INCLUDED_FEC_ENCODER_IMPL_H
+#ifndef INCLUDED_FEC_TAGGED_ENCODER_IMPL_H
+#define INCLUDED_FEC_TAGGED_ENCODER_IMPL_H
-#include <gnuradio/fec/encoder.h>
+#include <gnuradio/fec/tagged_encoder.h>
namespace gr {
namespace fec {
- class FEC_API encoder_impl : public encoder
+ class FEC_API tagged_encoder_impl : public tagged_encoder
{
private:
generic_encoder::sptr d_encoder;
@@ -36,22 +36,20 @@ namespace gr {
size_t d_output_item_size;
public:
- encoder_impl(generic_encoder::sptr my_encoder,
- size_t input_item_size,
- size_t output_item_size);
- ~encoder_impl();
-
- int general_work(int noutput_items,
- gr_vector_int& ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
- int fixed_rate_ninput_to_noutput(int ninput);
- int fixed_rate_noutput_to_ninput(int noutput);
- void forecast(int noutput_items,
- gr_vector_int& ninput_items_required);
+ tagged_encoder_impl(generic_encoder::sptr my_encoder,
+ size_t input_item_size,
+ size_t output_item_size,
+ const std::string &lengthtagname="packet_len");
+ ~tagged_encoder_impl();
+
+ int work(int noutput_items,
+ gr_vector_int& ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ int calculate_output_stream_length(const gr_vector_int &ninput_items);
};
} /* namespace fec */
} /* namespace gr */
-#endif /* INCLUDED_FEC_ENCODER_IMPL_H */
+#endif /* INCLUDED_FEC_TAGGED_ENCODER_IMPL_H */
diff --git a/gr-fec/python/fec/capillary_threaded_decoder.py
b/gr-fec/python/fec/capillary_threaded_decoder.py
index fcfa39e..c4990ab 100644
--- a/gr-fec/python/fec/capillary_threaded_decoder.py
+++ b/gr-fec/python/fec/capillary_threaded_decoder.py
@@ -47,7 +47,7 @@ class capillary_threaded_decoder(gr.hier_block2):
for i in range(int(math.log(len(decoder_list_0), 2))):
for j in range(int(math.pow(2, i))):
self.interleaves_0.append(blocks.interleave(output_size,
-
fec.get_decoder_output_size(decoder_list_0[0])))
+
fec.get_decoder_output_size(decoder_list_0[0])))
rootcount = 0
branchcount = 1
diff --git a/gr-fec/python/fec/extended_decoder.py
b/gr-fec/python/fec/extended_decoder.py
index dafedd8..d50746c 100644
--- a/gr-fec/python/fec/extended_decoder.py
+++ b/gr-fec/python/fec/extended_decoder.py
@@ -76,28 +76,33 @@ class extended_decoder(gr.hier_block2):
}
def __init__(self, decoder_obj_list, threading, ann=None, puncpat='11',
- integration_period=10000, flush=None, rotator=None):
- gr.hier_block2.__init__(
- self, "extended_decoder",
- gr.io_signature(1, 1, gr.sizeof_float),
- gr.io_signature(1, 1, gr.sizeof_char))
+ integration_period=10000, flush=None, rotator=None,
lentagname=None):
+ gr.hier_block2.__init__(self, "extended_decoder",
+ gr.io_signature(1, 1, gr.sizeof_float),
+ gr.io_signature(1, 1, gr.sizeof_char))
self.blocks=[]
self.ann=ann
self.puncpat=puncpat
self.flush=flush
+ if type(lentagname) == str:
+ if(lentagname.lower() == 'none'):
+ lentagname = None
+
message_collector_connected=False
##anything going through the annihilator needs shifted, uchar vals
- if fec.get_conversion(decoder_obj_list[0]) == "uchar" or
fec.get_conversion(decoder_obj_list[0]) == "packed_bits":
+ if fec.get_decoder_input_conversion(decoder_obj_list[0]) == "uchar" or
\
+ fec.get_decoder_input_conversion(decoder_obj_list[0]) ==
"packed_bits":
self.blocks.append(blocks.multiply_const_ff(48.0))
if fec.get_shift(decoder_obj_list[0]) != 0.0:
self.blocks.append(blocks.add_const_ff(fec.get_shift(decoder_obj_list[0])))
- elif fec.get_conversion(decoder_obj_list[0]) == "packed_bits":
+ elif fec.get_decoder_input_conversion(decoder_obj_list[0]) ==
"packed_bits":
self.blocks.append(blocks.add_const_ff(128.0))
- if fec.get_conversion(decoder_obj_list[0]) == "uchar" or
fec.get_conversion(decoder_obj_list[0]) == "packed_bits":
+ if fec.get_decoder_input_conversion(decoder_obj_list[0]) == "uchar" or
\
+ fec.get_decoder_input_conversion(decoder_obj_list[0]) ==
"packed_bits":
self.blocks.append(blocks.float_to_uchar());
const_index = 0; #index that corresponds to mod order for specinvert
purposes
@@ -122,12 +127,10 @@ class extended_decoder(gr.hier_block2):
self.blocks.append(fec.corr_bb(cat, len(puncpat) -
puncpat.count('0'),
len(ann), integration_period,
flush, synd_garble))
- #print puncpat
if self.puncpat != '11':
- self.blocks.append(fec.depuncture_bb(0, read_bitlist(puncpat),
- puncpat.count('0'),
len(puncpat)))
+ self.blocks.append(fec.depuncture_bb(len(puncpat),
read_bitlist(puncpat), 0))
- if fec.get_conversion(decoder_obj_list[0]) == "packed_bits":
+ if fec.get_decoder_input_conversion(decoder_obj_list[0]) ==
"packed_bits":
self.blocks.append(blocks.uchar_to_float())
self.blocks.append(blocks.add_const_ff(-128.0))
self.blocks.append(digital.binary_slicer_fb())
@@ -135,6 +138,7 @@ class extended_decoder(gr.hier_block2):
if(len(decoder_obj_list) > 1):
assert fec.get_history(decoder_obj_list[0]) == 0
+
if threading == 'capillary':
self.blocks.append(capillary_threaded_decoder(decoder_obj_list,
fec.get_decoder_input_item_size(decoder_obj_list[0]),
@@ -146,11 +150,17 @@ class extended_decoder(gr.hier_block2):
fec.get_decoder_output_item_size(decoder_obj_list[0])))
else:
- self.blocks.append(fec.decoder(decoder_obj_list[0],
-
fec.get_decoder_input_item_size(decoder_obj_list[0]),
-
fec.get_decoder_output_item_size(decoder_obj_list[0])))
-
- if fec.get_output_conversion(decoder_obj_list[0]) == "unpack":
+ if(not lentagname):
+ self.blocks.append(fec.decoder(decoder_obj_list[0],
+
fec.get_decoder_input_item_size(decoder_obj_list[0]),
+
fec.get_decoder_output_item_size(decoder_obj_list[0])))
+ else:
+ self.blocks.append(fec.tagged_decoder(decoder_obj_list[0],
+
fec.get_decoder_input_item_size(decoder_obj_list[0]),
+
fec.get_decoder_output_item_size(decoder_obj_list[0]),
+ lentagname))
+
+ if fec.get_decoder_output_conversion(decoder_obj_list[0]) == "unpack":
self.blocks.append(blocks.packed_to_unpacked_bb(1,
gr.GR_MSB_FIRST));
self.connect((self, 0), (self.blocks[0], 0));
diff --git a/gr-fec/python/fec/extended_encoder.py
b/gr-fec/python/fec/extended_encoder.py
index b2dcc26..01b9e09 100644
--- a/gr-fec/python/fec/extended_encoder.py
+++ b/gr-fec/python/fec/extended_encoder.py
@@ -20,7 +20,7 @@
# Boston, MA 02110-1301, USA.
#
-from gnuradio import gr
+from gnuradio import gr, blocks
import fec_swig as fec
from threaded_encoder import threaded_encoder
@@ -28,13 +28,22 @@ from capillary_threaded_encoder import
capillary_threaded_encoder
from bitflip import read_bitlist
class extended_encoder(gr.hier_block2):
- def __init__(self, encoder_obj_list, threading, puncpat=None):
+ def __init__(self, encoder_obj_list, threading, puncpat=None,
+ lentagname=None):
gr.hier_block2.__init__(self, "extended_encoder",
gr.io_signature(1, 1, gr.sizeof_char),
gr.io_signature(1, 1, gr.sizeof_char))
self.blocks=[]
self.puncpat=puncpat
+
+ if type(lentagname) == str:
+ if(lentagname.lower() == 'none'):
+ lentagname = None
+
+ if fec.get_encoder_input_conversion(encoder_obj_list[0]) == "pack":
+ self.blocks.append(blocks.pack_k_bits_bb(8))
+
if threading == 'capillary':
self.blocks.append(capillary_threaded_encoder(encoder_obj_list,
gr.sizeof_char,
@@ -44,9 +53,15 @@ class extended_encoder(gr.hier_block2):
gr.sizeof_char,
gr.sizeof_char))
else:
- self.blocks.append(fec.encoder(encoder_obj_list[0],
- gr.sizeof_char,
- gr.sizeof_char))
+ if(not lentagname):
+ self.blocks.append(fec.encoder(encoder_obj_list[0],
+ gr.sizeof_char,
+ gr.sizeof_char))
+ else:
+ self.blocks.append(fec.tagged_encoder(encoder_obj_list[0],
+ gr.sizeof_char,
+ gr.sizeof_char,
+ lentagname))
if self.puncpat != '11':
self.blocks.append(fec.puncture_bb(len(puncpat),
read_bitlist(puncpat), 0))
diff --git a/gr-fec/python/fec/qa_depuncture.py
b/gr-fec/python/fec/qa_depuncture.py
new file mode 100644
index 0000000..5566e83
--- /dev/null
+++ b/gr-fec/python/fec/qa_depuncture.py
@@ -0,0 +1,192 @@
+#!/usr/bin/env python
+#
+# Copyright 2014 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.
+#
+
+from gnuradio import gr, gr_unittest
+import fec_swig as fec
+import blocks_swig as blocks
+from collections import deque
+
+class test_depuncture (gr_unittest.TestCase):
+
+ def depuncture_setup(self):
+ p = []
+ for i in range(self.puncsize):
+ p.append(self.puncpat >> (self.puncsize - 1 - i) & 1)
+ d = deque(p)
+ d.rotate(self.delay)
+ _puncpat = list(d)
+
+ k = 0
+ self.expected = []
+ for n in range(len(self.src_data)/(self.puncsize - self.puncholes)):
+ for i in range(self.puncsize):
+ if _puncpat[i] == 1:
+ self.expected.append(self.src_data[k]);
+ k+=1
+ else:
+ self.expected.append(self.sym)
+
+ def setUp(self):
+ self.src_data = 2000*range(64)
+ self.tb = gr.top_block ()
+
+ def tearDown(self):
+ self.tb = None
+
+ def test_000(self):
+ # Test normal operation of the depuncture block
+
+ self.puncsize = 8
+ self.puncpat = 0xEF
+ self.delay = 0
+ self.sym = 0
+ self.puncholes = 1
+
+ self.depuncture_setup()
+
+ src = blocks.vector_source_b(self.src_data)
+ op = fec.depuncture_bb(self.puncsize, self.puncpat,
+ self.delay, self.sym)
+ dst = blocks.vector_sink_b()
+
+ self.tb.connect(src, op, dst)
+ self.tb.run()
+
+ dst_data = list(dst.data())
+ for i in xrange(len(dst_data)):
+ dst_data[i] = int(dst_data[i])
+
+ self.assertEqual(self.expected, dst_data)
+
+ def test_001(self):
+ # Test normal operation of the depuncture block with a delay
+
+ self.puncsize = 8
+ self.puncpat = 0xEF
+ self.delay = 1
+ self.sym = 0
+ self.puncholes = 1
+
+ self.depuncture_setup()
+
+ src = blocks.vector_source_b(self.src_data)
+ op = fec.depuncture_bb(self.puncsize, self.puncpat,
+ self.delay, self.sym)
+ dst = blocks.vector_sink_b()
+
+ self.tb.connect(src, op, dst)
+ self.tb.run()
+
+ dst_data = list(dst.data())
+ for i in xrange(len(dst_data)):
+ dst_data[i] = int(dst_data[i])
+
+ self.assertEqual(self.expected, dst_data)
+
+ def test_002(self):
+ # Test scenario where we have defined a puncture pattern with
+ # more bits than the puncsize.
+
+ self.puncsize = 4
+ self.puncpat = 0x5555
+ self.delay = 0
+ self.sym = 0
+ self.puncholes = 2
+
+ self.depuncture_setup()
+
+ src = blocks.vector_source_b(self.src_data)
+ op = fec.depuncture_bb(self.puncsize, self.puncpat,
+ self.delay, self.sym)
+ dst = blocks.vector_sink_b()
+
+ self.tb.connect(src, op, dst)
+ self.tb.run()
+
+ dst_data = list(dst.data())
+ for i in xrange(len(dst_data)):
+ dst_data[i] = int(dst_data[i])
+
+ self.assertEqual(self.expected, dst_data)
+
+ def test_003(self):
+ # Test scenario where we have defined a puncture pattern with
+ # more bits than the puncsize with a delay. The python code
+ # doesn't account for this when creating self.expected, but
+ # this should be equivalent to a puncpat of the correct size.
+
+ self.puncsize = 4
+ self.puncpat0 = 0x5555 # too many bits set
+ self.puncpat1 = 0x55 # num bits = puncsize
+ self.delay = 1
+ self.sym = 0
+
+ src = blocks.vector_source_b(self.src_data)
+ op0 = fec.depuncture_bb(self.puncsize, self.puncpat0,
+ self.delay, self.sym)
+ op1 = fec.depuncture_bb(self.puncsize, self.puncpat1,
+ self.delay, self.sym)
+ dst0 = blocks.vector_sink_b()
+ dst1 = blocks.vector_sink_b()
+
+ self.tb.connect(src, op0, dst0)
+ self.tb.connect(src, op1, dst1)
+ self.tb.run()
+
+ dst_data0 = list(dst0.data())
+ for i in xrange(len(dst_data0)):
+ dst_data0[i] = int(dst_data0[i])
+
+ dst_data1 = list(dst1.data())
+ for i in xrange(len(dst_data1)):
+ dst_data1[i] = int(dst_data1[i])
+
+ self.assertEqual(dst_data1, dst_data0)
+
+ def test_004(self):
+ # Test normal operation of the depuncture block without
+ # specifying the fill symbol (defaults to 127).
+
+ self.puncsize = 8
+ self.puncpat = 0xEF
+ self.delay = 0
+ self.sym = 127
+ self.puncholes = 1
+
+ self.depuncture_setup()
+
+ src = blocks.vector_source_b(self.src_data)
+ op = fec.depuncture_bb(self.puncsize, self.puncpat,
+ self.delay)
+ dst = blocks.vector_sink_b()
+
+ self.tb.connect(src, op, dst)
+ self.tb.run()
+
+ dst_data = list(dst.data())
+ for i in xrange(len(dst_data)):
+ dst_data[i] = int(dst_data[i])
+
+ self.assertEqual(self.expected, dst_data)
+
+if __name__ == '__main__':
+ gr_unittest.run(test_depuncture, "test_depuncture.xml")
diff --git a/gr-fec/swig/fec_swig.i b/gr-fec/swig/fec_swig.i
index e3cbd33..ae9b663 100644
--- a/gr-fec/swig/fec_swig.i
+++ b/gr-fec/swig/fec_swig.i
@@ -27,6 +27,8 @@
//load generated python docstrings
%include "fec_swig_doc.i"
+%include "gnuradio/fec/cc_common.h"
+
%nodefaultctor gr::fec::generic_encoder;
%template(generic_encoder_sptr) boost::shared_ptr<gr::fec::generic_encoder>;
@@ -34,12 +36,16 @@
%template(generic_decoder_sptr) boost::shared_ptr<gr::fec::generic_decoder>;
%{
-#include "gnuradio/fec/generic_encoder.h"
#include "gnuradio/fec/generic_decoder.h"
-#include "gnuradio/fec/encoder.h"
+#include "gnuradio/fec/generic_encoder.h"
#include "gnuradio/fec/decoder.h"
-#include "gnuradio/fec/cc_encoder.h"
+#include "gnuradio/fec/encoder.h"
+#include "gnuradio/fec/tagged_decoder.h"
+#include "gnuradio/fec/tagged_encoder.h"
#include "gnuradio/fec/cc_decoder.h"
+#include "gnuradio/fec/cc_encoder.h"
+#include "gnuradio/fec/ccsds_decoder.h"
+#include "gnuradio/fec/ccsds_encoder.h"
#include "gnuradio/fec/decode_ccsds_27_fb.h"
#include "gnuradio/fec/encode_ccsds_27_bb.h"
#include "gnuradio/fec/ber_bf.h"
@@ -49,12 +55,16 @@
#include "gnuradio/fec/depuncture_bb.h"
%}
-%include "gnuradio/fec/generic_encoder.h"
%include "gnuradio/fec/generic_decoder.h"
-%include "gnuradio/fec/encoder.h"
+%include "gnuradio/fec/generic_encoder.h"
%include "gnuradio/fec/decoder.h"
-%include "gnuradio/fec/cc_encoder.h"
+%include "gnuradio/fec/encoder.h"
+%include "gnuradio/fec/tagged_decoder.h"
+%include "gnuradio/fec/tagged_encoder.h"
%include "gnuradio/fec/cc_decoder.h"
+%include "gnuradio/fec/cc_encoder.h"
+%include "gnuradio/fec/ccsds_decoder.h"
+%include "gnuradio/fec/ccsds_encoder.h"
%include "gnuradio/fec/decode_ccsds_27_fb.h"
%include "gnuradio/fec/encode_ccsds_27_bb.h"
%include "gnuradio/fec/ber_bf.h"
@@ -63,8 +73,10 @@
%include "gnuradio/fec/puncture_ff.h"
%include "gnuradio/fec/depuncture_bb.h"
-GR_SWIG_BLOCK_MAGIC2(fec, encoder);
GR_SWIG_BLOCK_MAGIC2(fec, decoder);
+GR_SWIG_BLOCK_MAGIC2(fec, encoder);
+GR_SWIG_BLOCK_MAGIC2(fec, tagged_decoder);
+GR_SWIG_BLOCK_MAGIC2(fec, tagged_encoder);
GR_SWIG_BLOCK_MAGIC2(fec, decode_ccsds_27_fb);
GR_SWIG_BLOCK_MAGIC2(fec, encode_ccsds_27_bb);
GR_SWIG_BLOCK_MAGIC2(fec, ber_bf);
- [Commit-gnuradio] [gnuradio] 55/57: fec: wip: fixing up allocated memory; allowing async encoder deployment to be used with CCSDS (packed input requirement)., (continued)
- [Commit-gnuradio] [gnuradio] 55/57: fec: wip: fixing up allocated memory; allowing async encoder deployment to be used with CCSDS (packed input requirement)., git, 2014/05/20
- [Commit-gnuradio] [gnuradio] 41/57: digital: adding an async message passsing CRC32 calc/check block for PDUs., git, 2014/05/20
- [Commit-gnuradio] [gnuradio] 38/57: fec: wip: cleaning up tagged decoder, rep code., git, 2014/05/20
- [Commit-gnuradio] [gnuradio] 57/57: digital: fixing up some work done in the fec api development., git, 2014/05/20
- [Commit-gnuradio] [gnuradio] 40/57: fec: wip: adding async (PDU) encoder and decoder blocks., git, 2014/05/20
- [Commit-gnuradio] [gnuradio] 36/57: fec: wip: mods for ber plotting. Now adding theoretical BPSK in AWGN curve., git, 2014/05/20
- [Commit-gnuradio] [gnuradio] 52/57: fec: wip: async encoder/decoder working deployments., git, 2014/05/20
- [Commit-gnuradio] [gnuradio] 16/57: fec: Merging fecapi with support for CC code., git, 2014/05/20
- [Commit-gnuradio] [gnuradio] 33/57: fec: wip: adding a dummy encoder/decoder and repetition code to exercise the API., git, 2014/05/20
- [Commit-gnuradio] [gnuradio] 49/57: blocks: adding reverse packing/unpacking functions., git, 2014/05/20
- [Commit-gnuradio] [gnuradio] 28/57: fec: updating puncturing, adding documentation, adding CCSDS encoder.,
git <=
- [Commit-gnuradio] [gnuradio] 05/57: codec2 library update, git, 2014/05/20