diff --git a/apps/flowgraphs/upsat_fsk_receiver.grc b/apps/flowgraphs/upsat_fsk_receiver.grc
index 51d34a7..b2d59a8 100644
--- a/apps/flowgraphs/upsat_fsk_receiver.grc
+++ b/apps/flowgraphs/upsat_fsk_receiver.grc
@@ -433,7 +433,7 @@ we shift the LO a little further
value
- 435.8e6
+ 435.765e6
diff --git a/lib/ax25_decoder_bm_impl.cc b/lib/ax25_decoder_bm_impl.cc
index a988339..3765680 100644
--- a/lib/ax25_decoder_bm_impl.cc
+++ b/lib/ax25_decoder_bm_impl.cc
@@ -55,7 +55,8 @@ namespace gr
d_descramble (descramble),
d_max_frame_len (max_frame_len),
d_state (NO_SYNC),
- d_dec_b (0),
+ d_shift_reg(0x0),
+ d_dec_b (0x0),
d_prev_bit_nrzi(0),
d_received_bytes (0),
d_decoded_bits (0),
@@ -89,18 +90,17 @@ namespace gr
dec_bit = (~((descr_bit - d_prev_bit_nrzi) % 2)) & 0x1;
d_prev_bit_nrzi = descr_bit;
+ /* In AX.25 the LS bit is sent first */
+ d_shift_reg = (d_shift_reg >> 1) | (dec_bit << 7);
+ d_dec_b = (d_dec_b >> 1) | (dec_bit << 7);
+
switch(d_state){
case NO_SYNC:
- /* In AX.25 the LS bit is sent first */
- d_dec_b = (d_dec_b >> 1) | (dec_bit << 7);
- if(d_dec_b == AX25_SYNC_FLAG){
+ if(d_shift_reg == AX25_SYNC_FLAG){
enter_sync_state();
}
break;
case IN_SYNC:
- /* In AX.25 the LS bit is sent first */
- d_dec_b = (d_dec_b >> 1) | (dec_bit << 7);
-
/*
* If the received byte was an AX.25 sync flag, there are two
* possibilities. Either it was the end of frame or just a repeat of the
@@ -110,7 +110,7 @@ namespace gr
* re-sync after 3 repetitions of the SYNC flag. For this reason we demand
* that the distance between the last SYNC flag is greater than 3 bytes
*/
- if (d_dec_b == AX25_SYNC_FLAG) {
+ if (d_shift_reg == AX25_SYNC_FLAG) {
if(d_received_bytes < 3) {
enter_sync_state ();
}
@@ -119,11 +119,11 @@ namespace gr
enter_frame_end();
}
}
- else if((d_dec_b & 0xfc) == 0x7c){
+ else if((d_shift_reg & 0xfc) == 0x7c){
/*This was a stuffed bit */
d_dec_b <<= 1;
}
- else if((d_dec_b & 0xfe) == 0xfe){
+ else if((d_shift_reg & 0xfe) == 0xfe){
/*This can never happen... Error! */
if (d_received_bytes > AX25_MIN_ADDR_LEN) {
message_port_pub (
@@ -149,8 +149,7 @@ namespace gr
}
break;
case FRAME_END:
- d_dec_b = (d_dec_b >> 1) | (dec_bit << 7);
- if (d_dec_b == AX25_SYNC_FLAG) {
+ if (d_shift_reg == AX25_SYNC_FLAG) {
d_dec_b = 0;
d_decoded_bits = 0;
d_received_bytes = 0;
@@ -181,19 +180,18 @@ namespace gr
dec_bit = (~(((in[i] & 0x1) - d_prev_bit_nrzi) % 2)) & 0x1;
d_prev_bit_nrzi = in[i] & 0x1;
+ /* In AX.25 the LS bit is sent first */
+ d_shift_reg = (d_shift_reg >> 1) | (dec_bit << 7);
+ d_dec_b = (d_dec_b >> 1) | (dec_bit << 7);
+
switch (d_state)
{
case NO_SYNC:
- /* In AX.25 the LS bit is sent first */
- d_dec_b = (d_dec_b >> 1) | (dec_bit << 7);
- if (d_dec_b == AX25_SYNC_FLAG) {
+ if (d_shift_reg == AX25_SYNC_FLAG) {
enter_sync_state ();
}
break;
case IN_SYNC:
- /* In AX.25 the LS bit is sent first */
- d_dec_b = (d_dec_b >> 1) | (dec_bit << 7);
-
/*
* If the received byte was an AX.25 sync flag, there are two
* possibilities. Either it was the end of frame or just a repeat of the
@@ -203,7 +201,7 @@ namespace gr
* re-sync after 3 repetitions of the SYNC flag. For this reason we demand
* that the distance between the last SYNC flag is greater than 3 bytes
*/
- if (d_dec_b == AX25_SYNC_FLAG) {
+ if (d_shift_reg == AX25_SYNC_FLAG) {
if (d_received_bytes < 3) {
enter_sync_state ();
}
@@ -212,11 +210,11 @@ namespace gr
enter_frame_end ();
}
}
- else if ((d_dec_b & 0xfc) == 0x7c) {
+ else if ((d_shift_reg & 0xfc) == 0x7c) {
/*This was a stuffed bit */
d_dec_b <<= 1;
}
- else if ((d_dec_b & 0xfe) == 0xfe) {
+ else if ((d_shift_reg & 0xfe) == 0xfe) {
/*This can never happen... Error! */
if (d_received_bytes > AX25_MIN_ADDR_LEN) {
message_port_pub (
@@ -242,9 +240,9 @@ namespace gr
}
break;
case FRAME_END:
- d_dec_b = (d_dec_b >> 1) | (dec_bit << 7);
- if (d_dec_b == AX25_SYNC_FLAG) {
- d_dec_b = 0;
+ if (d_shift_reg == AX25_SYNC_FLAG) {
+ d_dec_b = 0x0;
+ d_shift_reg = 0x0;
d_decoded_bits = 0;
d_received_bytes = 0;
d_state = FRAME_END;
@@ -274,7 +272,8 @@ namespace gr
ax25_decoder_bm_impl::reset_state ()
{
d_state = NO_SYNC;
- d_dec_b = 0;
+ d_dec_b = 0x0;
+ d_shift_reg = 0x0;
d_decoded_bits = 0;
d_received_bytes = 0;
d_prev_bit_nrzi = 0;
@@ -284,7 +283,8 @@ namespace gr
ax25_decoder_bm_impl::enter_sync_state ()
{
d_state = IN_SYNC;
- d_dec_b = 0;
+ d_dec_b = 0x0;
+ d_shift_reg = 0x0;
d_decoded_bits = 0;
d_received_bytes = 0;
}
@@ -299,7 +299,8 @@ namespace gr
if (d_received_bytes < AX25_MIN_ADDR_LEN + sizeof(uint16_t)) {
message_port_pub (pmt::mp ("failed_pdu"),
pmt::make_blob (d_frame_buffer, d_received_bytes));
- d_dec_b = 0;
+ d_dec_b = 0x0;
+ d_shift_reg = 0x0;
d_decoded_bits = 0;
d_received_bytes = 0;
d_state = FRAME_END;
@@ -326,7 +327,8 @@ namespace gr
pmt::make_blob (d_frame_buffer,
d_received_bytes - sizeof(uint16_t)));
}
- d_dec_b = 0;
+ d_dec_b = 0x0;
+ d_shift_reg = 0x0;
d_decoded_bits = 0;
d_received_bytes = 0;
d_state = FRAME_END;
diff --git a/lib/ax25_decoder_bm_impl.h b/lib/ax25_decoder_bm_impl.h
index 9fa48f6..3a599d5 100644
--- a/lib/ax25_decoder_bm_impl.h
+++ b/lib/ax25_decoder_bm_impl.h
@@ -45,6 +45,7 @@ namespace gr
const bool d_descramble;
const size_t d_max_frame_len;
decoding_state_t d_state;
+ uint8_t d_shift_reg;
uint8_t d_dec_b;
uint8_t d_prev_bit_nrzi;
size_t d_received_bytes;