diff --git a/gr-jay/grc/CMakeLists.txt b/gr-jay/grc/CMakeLists.txt
index 914d5f5..7d8432d 100644
--- a/gr-jay/grc/CMakeLists.txt
+++ b/gr-jay/grc/CMakeLists.txt
@@ -17,9 +17,9 @@
# 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.
-
install(FILES
jay_square_ff.xml
jay_square2_ff.xml
- jay_garage.xml DESTINATION share/gnuradio/grc/blocks
+ jay_garage.xml
+ jay_preamble_sync.xml DESTINATION share/gnuradio/grc/blocks
)
diff --git a/gr-jay/grc/jay_preamble_sync.xml b/gr-jay/grc/jay_preamble_sync.xml
new file mode 100644
index 0000000..c1b1d60
--- /dev/null
+++ b/gr-jay/grc/jay_preamble_sync.xml
@@ -0,0 +1,15 @@
+
+ Preamble Synchronizer
+ jay_preamble_sync
+ [JAY]
+ import jay
+ jay.preamble_sync()
+
+ in
+ byte
+
+
+ out
+ byte
+
+
diff --git a/gr-jay/include/jay/CMakeLists.txt b/gr-jay/include/jay/CMakeLists.txt
index 3f8e8ed..76c0d23 100644
--- a/gr-jay/include/jay/CMakeLists.txt
+++ b/gr-jay/include/jay/CMakeLists.txt
@@ -25,5 +25,6 @@ install(FILES
api.h
square_ff.h
square2_ff.h
- garage.h DESTINATION include/jay
+ garage.h
+ preamble_sync.h DESTINATION include/jay
)
diff --git a/gr-jay/include/jay/preamble_sync.h b/gr-jay/include/jay/preamble_sync.h
new file mode 100644
index 0000000..a44e508
--- /dev/null
+++ b/gr-jay/include/jay/preamble_sync.h
@@ -0,0 +1,56 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2019 Jay Arrowfield.
+ *
+ * This 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.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef INCLUDED_JAY_PREAMBLE_SYNC_H
+#define INCLUDED_JAY_PREAMBLE_SYNC_H
+
+#include
+#include
+
+namespace gr {
+ namespace jay {
+
+ /*!
+ * \brief <+description of block+>
+ * \ingroup jay
+ *
+ */
+ class JAY_API preamble_sync : virtual public gr::block
+ {
+ public:
+ typedef boost::shared_ptr sptr;
+
+ /*!
+ * \brief Return a shared_ptr to a new instance of jay::preamble_sync.
+ *
+ * To avoid accidental use of raw pointers, jay::preamble_sync's
+ * constructor is in a private implementation
+ * class. jay::preamble_sync::make is the public interface for
+ * creating new instances.
+ */
+ static sptr make();
+ };
+
+ } // namespace jay
+} // namespace gr
+
+#endif /* INCLUDED_JAY_PREAMBLE_SYNC_H */
+
diff --git a/gr-jay/lib/CMakeLists.txt b/gr-jay/lib/CMakeLists.txt
index 69ed448..f8fbfc7 100644
--- a/gr-jay/lib/CMakeLists.txt
+++ b/gr-jay/lib/CMakeLists.txt
@@ -25,12 +25,11 @@ include(GrPlatform) #define LIB_SUFFIX
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIRS})
-
list(APPEND jay_sources
square_ff_impl.cc
square2_ff_impl.cc
garage_impl.cc
-)
+ preamble_sync_impl.cc )
set(jay_sources "${jay_sources}" PARENT_SCOPE)
if(NOT jay_sources)
diff --git a/gr-jay/lib/preamble_sync_impl.cc b/gr-jay/lib/preamble_sync_impl.cc
new file mode 100644
index 0000000..eff10b2
--- /dev/null
+++ b/gr-jay/lib/preamble_sync_impl.cc
@@ -0,0 +1,158 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2019 Jay Arrowfield.
+ *
+ * This 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.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; 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
+#include "preamble_sync_impl.h"
+
+namespace gr
+{
+namespace jay
+{
+
+preamble_sync::sptr preamble_sync::make()
+{
+ return gnuradio::get_initial_sptr (new preamble_sync_impl());
+}
+
+/*
+ * The private constructor
+ */
+preamble_sync_impl::preamble_sync_impl()
+: gr::block("preamble_sync", gr::io_signature::make(1, 1, sizeof(uint8_t)), gr::io_signature::make(1, 1, sizeof(uint8_t)))
+, m_state(Init)
+, m_stateNext(Init)
+, m_word(0)
+, m_wordCount(0)
+, m_preambleCount(0)
+{
+}
+
+/*
+ * Our virtual destructor.
+ */
+preamble_sync_impl::~preamble_sync_impl()
+{
+}
+
+void preamble_sync_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+ ninput_items_required[0] = 8*noutput_items;
+}
+
+int preamble_sync_impl::general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
+{
+ size_t const word_size = 8;
+
+ const uint8_t *in = (const uint8_t *) input_items[0];
+ uint8_t *out = (uint8_t *) output_items[0];
+
+ // Do <+signal processing+>
+ size_t i = 0;
+ size_t j = 0;
+ for (i=0; i < ninput_items[0]; i++)
+ {
+ if (in[i] == 0xFF)
+ {
+ if (m_state != Init)
+ {
+ m_state = Init;
+ fprintf(stderr, "Init\n");
+ }
+ continue;
+ }
+ m_word = (m_word << 1) | in[i];
+
+ if (m_wordCount != 0)
+ {
+ m_wordCount--;
+ continue;
+ }
+
+ m_word &= (typeof(m_word))(1 << word_size)-1;
+ m_stateNext = m_state;
+ switch (m_state)
+ {
+ case Init:
+ if (m_word != 0xCC)
+ {
+ m_wordCount = 0;
+ m_preambleCount = 8;
+ }
+ else
+ {
+ m_wordCount = word_size-1;
+ if (m_preambleCount)
+ {
+ m_preambleCount--;
+ }
+ else
+ {
+ m_stateNext = Preamble;
+ fprintf(stderr, "Preamble\n");
+ }
+ }
+ break;
+ case Preamble:
+ m_wordCount = word_size-1;
+ if (m_word == 0xC0)
+ {
+ m_stateNext = Sync;
+ fprintf(stderr, "Sync 1\n");
+ }
+ else if (m_word == 0xCF)
+ {
+ m_stateNext = Sync;
+ fprintf(stderr, "Sync 2\n");
+ }
+ else if (m_word == 0xF0)
+ {
+ m_wordCount = word_size/2-1;
+ m_stateNext = Sync;
+ fprintf(stderr, "Sync 3\n");
+ }
+ else if (m_word != 0xCC)
+ {
+ m_wordCount = 0;
+ m_stateNext = Init;
+ }
+ break;
+ case Sync:
+ m_wordCount = word_size-1;
+ out[j++] = m_word;
+ break;
+ }
+ m_state = m_stateNext;
+ }
+
+ // Tell runtime system how many input items we consumed on
+ // each input stream.
+ consume_each (i);
+
+ // Tell runtime system how many output items we produced.
+ return j;
+}
+
+} /* namespace jay */
+} /* namespace gr */
+
diff --git a/gr-jay/lib/preamble_sync_impl.h b/gr-jay/lib/preamble_sync_impl.h
new file mode 100644
index 0000000..66121e7
--- /dev/null
+++ b/gr-jay/lib/preamble_sync_impl.h
@@ -0,0 +1,63 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2019 Jay Arrowfield.
+ *
+ * This 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.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_JAY_PREAMBLE_SYNC_IMPL_H
+#define INCLUDED_JAY_PREAMBLE_SYNC_IMPL_H
+
+#include
+
+namespace gr
+{
+namespace jay
+{
+
+class preamble_sync_impl : public preamble_sync
+{
+ private:
+ enum State
+ {
+ Init,
+ Preamble,
+ Sync
+ };
+
+ State m_state;
+ State m_stateNext;
+ uint32_t m_word;
+ size_t m_wordCount;
+ size_t m_preambleCount;
+ public:
+ preamble_sync_impl();
+ ~preamble_sync_impl();
+
+ // Where all the action really happens
+ void forecast (int noutput_items, gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+} // namespace jay
+} // namespace gr
+
+#endif /* INCLUDED_JAY_PREAMBLE_SYNC_IMPL_H */
+
diff --git a/gr-jay/python/CMakeLists.txt b/gr-jay/python/CMakeLists.txt
index 4e8f856..92c5cc9 100644
--- a/gr-jay/python/CMakeLists.txt
+++ b/gr-jay/python/CMakeLists.txt
@@ -45,3 +45,4 @@ set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig)
GR_ADD_TEST(qa_square_ff ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_square_ff.py)
GR_ADD_TEST(qa_square2_ff ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_square2_ff.py)
GR_ADD_TEST(qa_garage ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_garage.py)
+GR_ADD_TEST(qa_preamble_sync ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_preamble_sync.py)
diff --git a/gr-jay/python/qa_preamble_sync.py b/gr-jay/python/qa_preamble_sync.py
new file mode 100755
index 0000000..48190a7
--- /dev/null
+++ b/gr-jay/python/qa_preamble_sync.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright 2019 Jay Arrowfield.
+#
+# This 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.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this software; 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
+from gnuradio import blocks
+import jay_swig as jay
+
+class qa_preamble_sync (gr_unittest.TestCase):
+
+ def setUp (self):
+ self.tb = gr.top_block ()
+
+ def tearDown (self):
+ self.tb = None
+
+ def test_001_t (self):
+ # set up fg
+ self.tb.run ()
+ # check data
+
+
+if __name__ == '__main__':
+ gr_unittest.run(qa_preamble_sync, "qa_preamble_sync.xml")
diff --git a/gr-jay/swig/jay_swig.i b/gr-jay/swig/jay_swig.i
index b1e90ee..e3e2289 100644
--- a/gr-jay/swig/jay_swig.i
+++ b/gr-jay/swig/jay_swig.i
@@ -11,6 +11,7 @@
#include "jay/square_ff.h"
#include "jay/square2_ff.h"
#include "jay/garage.h"
+#include "jay/preamble_sync.h"
%}
@@ -20,3 +21,6 @@ GR_SWIG_BLOCK_MAGIC2(jay, square_ff);
GR_SWIG_BLOCK_MAGIC2(jay, square2_ff);
%include "jay/garage.h"
GR_SWIG_BLOCK_MAGIC2(jay, garage);
+
+%include "jay/preamble_sync.h"
+GR_SWIG_BLOCK_MAGIC2(jay, preamble_sync);