diff --git a/lib/upsat_fsk_frame_acquisition_impl.cc b/lib/upsat_fsk_frame_acquisition_impl.cc index 2737c4b..6f63020 100644 --- a/lib/upsat_fsk_frame_acquisition_impl.cc +++ b/lib/upsat_fsk_frame_acquisition_impl.cc @@ -95,6 +95,7 @@ namespace gr { d_state = SEARCHING; d_decoded_bytes = 0; + d_decoded_bits = 0; d_shifting_byte = 0; } @@ -109,18 +110,24 @@ namespace gr upsat_fsk_frame_acquisition_impl::have_sync () { d_state = HAVE_SYNC_WORD; + d_decoded_bytes = 0; + d_decoded_bits = 0; } inline void upsat_fsk_frame_acquisition_impl::have_frame_len () { d_state = HAVE_FRAME_LEN; + d_decoded_bytes = 0; + d_decoded_bits = 0; } inline void upsat_fsk_frame_acquisition_impl::have_payload () { d_state = HAVE_PAYLOAD; + d_decoded_bytes = 0; + d_decoded_bits = 0; } int @@ -132,6 +139,7 @@ namespace gr const float *in = (const float *) input_items[0]; for (i = 0; i < noutput_items; i++) { slice_and_shift (in[i]); + switch (d_state) { case SEARCHING: @@ -140,13 +148,55 @@ namespace gr } break; case HAVE_PREAMBLE: + d_decoded_bits++; + + if(d_decoded_bits == 8) { + d_decoded_bits = 0; + if(d_shifting_byte == d_preamble[d_decoded_bytes]){ + d_decoded_bytes++; + if(d_decoded_bytes == d_preamble_len){ + /* End of the preamble. It's time for the sync word */ + have_sync(); + } + } + else{ + /* Reset the preamble detection */ + reset_state(); + } + } break; case HAVE_SYNC_WORD: + d_decoded_bits++; + if(d_decoded_bits == 8) { + d_decoded_bits = 0; + if(d_shifting_byte == d_sync_word[d_decoded_bytes]) { + d_decoded_bytes++; + if(d_decoded_bytes == d_sync_word_len){ + have_frame_len(); + } + } + else{ + reset_state(); + } + } + break; + case HAVE_FRAME_LEN: + d_decoded_bits++; + if(d_decoded_bits == 8) { + d_frame_len = d_decoded_bytes; + have_payload(); + } break; case HAVE_PAYLOAD: - if (d_decoded_bytes == d_frame_len) { - message_port_pub (pmt::mp ("pdu"), - pmt::make_blob (d_pdu, d_frame_len)); + d_decoded_bits++; + if (d_decoded_bits == 8) { + d_decoded_bits = 0; + d_pdu[d_decoded_bytes] = d_shifting_byte; + if (d_decoded_bytes == d_frame_len) { + message_port_pub (pmt::mp ("pdu"), + pmt::make_blob (d_pdu, d_frame_len)); + reset_state (); + } } break; default: diff --git a/lib/upsat_fsk_frame_acquisition_impl.h b/lib/upsat_fsk_frame_acquisition_impl.h index 0695031..ff614fa 100644 --- a/lib/upsat_fsk_frame_acquisition_impl.h +++ b/lib/upsat_fsk_frame_acquisition_impl.h @@ -52,6 +52,7 @@ namespace gr decoding_state_t d_state; uint8_t d_shifting_byte; size_t d_decoded_bytes; + size_t d_decoded_bits; size_t d_frame_len; uint8_t *d_pdu;