diff --git a/gr-jay/lib/preamble_sync_impl.cc b/gr-jay/lib/preamble_sync_impl.cc index 446beb9..2912c1c 100644 --- a/gr-jay/lib/preamble_sync_impl.cc +++ b/gr-jay/lib/preamble_sync_impl.cc @@ -35,16 +35,19 @@ preamble_sync::sptr preamble_sync::make() return gnuradio::get_initial_sptr (new preamble_sync_impl()); } +const char* preamble_sync_impl::stateNames[NUM_STATES] = {"PreambleSlow", "SyncSlow", "DataSlow", "PreambleFast", "SyncFast", "DataFast"}; + /* * 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_state(PreambleSlow) +, m_stateNext(PreambleSlow) , m_word(0) , m_wordCount(0) -, m_preambleCount(0) +, m_wordSize(1) +, m_dataCount(0) { } @@ -62,8 +65,8 @@ void preamble_sync_impl::forecast (int noutput_items, gr_vector_int &ninput_item 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; - + uint8_t zero = 0x01; + const uint8_t fastSyncWord[4] = {0x7C, 0xD2, 0x15, 0xD8}; const uint8_t *in = (const uint8_t *) input_items[0]; uint8_t *out = (uint8_t *) output_items[0]; @@ -74,14 +77,23 @@ int preamble_sync_impl::general_work (int noutput_items, gr_vector_int &ninput_i { if (in[i] == 0xFF) { - if (m_state != Init) + if (m_state != PreambleSlow) { - m_state = Init; - fprintf(stderr, "Init\n"); + m_state = PreambleSlow; + m_wordCount = 0; + fprintf(stderr, "Reset\n"); } continue; } - m_word = (m_word << 1) | in[i]; + + if (in[i] == zero) + { + m_word = (m_word << 1) | 0; + } + else + { + m_word = (m_word << 1) | 1; + } if (m_wordCount != 0) { @@ -89,63 +101,64 @@ int preamble_sync_impl::general_work (int noutput_items, gr_vector_int &ninput_i continue; } - m_word &= (typeof(m_word))(1 << word_size)-1; m_stateNext = m_state; switch (m_state) { - case Init: - if (m_word != 0xCC) + case PreambleSlow: + if ((m_word & 0xFF) == 0xCC) { - m_wordCount = 0; - m_preambleCount = 8; + m_wordSize = 1; + m_stateNext = SyncSlow; } - else + break; + case SyncSlow: + if ((m_word & 0xFF) == 0x3F) { - m_wordCount = word_size-1; - if (m_preambleCount) + m_wordSize = 8; + m_dataCount = 1; + out[j++] = m_word; + m_stateNext = DataSlow; + } + break; + case DataSlow: + m_dataCount++; + out[j++] = m_word; + if (m_dataCount == 0xA0) + { + m_wordSize = 1; + m_stateNext = PreambleFast; + } + break; + case PreambleFast: + if ((m_word & 0xFF) == 0xAA) + { + m_wordSize = 8; + m_dataCount = 0; + m_stateNext = SyncFast; + } + break; + case SyncFast: + if ((m_word & 0xFF) == fastSyncWord[m_dataCount]) + { + out[j++] = m_word; + m_dataCount++; + if (m_dataCount == 4) { - m_preambleCount--; - } - else - { - m_stateNext = Preamble; - fprintf(stderr, "Preamble\n"); + m_stateNext = DataFast; } } 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; + case DataFast: + m_wordSize = 8; out[j++] = m_word; break; + } if (m_state != m_stateNext) { - fprintf(stderr, "State changed\n"); + fprintf(stderr, "State changed: %s => %s\n", stateNames[m_state], stateNames[m_stateNext]); } + m_wordCount = m_wordSize - 1; m_state = m_stateNext; } @@ -155,6 +168,7 @@ int preamble_sync_impl::general_work (int noutput_items, gr_vector_int &ninput_i // Tell runtime system how many output items we produced. return j; + } } /* namespace jay */ diff --git a/gr-jay/lib/preamble_sync_impl.h b/gr-jay/lib/preamble_sync_impl.h index 66121e7..1a98095 100644 --- a/gr-jay/lib/preamble_sync_impl.h +++ b/gr-jay/lib/preamble_sync_impl.h @@ -33,16 +33,25 @@ class preamble_sync_impl : public preamble_sync private: enum State { - Init, - Preamble, - Sync + PreambleSlow = 0, + SyncSlow, + DataSlow, + PreambleFast, + SyncFast, + DataFast, + NUM_STATES + }; + static const char *stateNames[NUM_STATES]; + State m_state; State m_stateNext; uint32_t m_word; size_t m_wordCount; - size_t m_preambleCount; + size_t m_wordSize; + size_t m_dataCount; + public: preamble_sync_impl(); ~preamble_sync_impl();