diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/ao.h | 7 | ||||
| -rw-r--r-- | src/core/ao_fec.h | 2 | ||||
| -rw-r--r-- | src/core/ao_fec_rx.c | 26 | 
3 files changed, 24 insertions, 11 deletions
diff --git a/src/core/ao.h b/src/core/ao.h index 62eb488e..861a0fd4 100644 --- a/src/core/ao.h +++ b/src/core/ao.h @@ -511,6 +511,13 @@ extern __xdata uint8_t ao_radio_dma_done;  extern __xdata uint8_t ao_radio_done;  extern __xdata uint8_t ao_radio_mutex; +#ifdef PKT_APPEND_STATUS_1_CRC_OK +#define AO_RADIO_STATUS_CRC_OK	PKT_APPEND_STATUS_1_CRC_OK +#else +#include <ao_fec.h> +#define AO_RADIO_STATUS_CRC_OK	AO_FEC_DECODE_CRC_OK +#endif +  void  ao_radio_general_isr(void) ao_arch_interrupt(16); diff --git a/src/core/ao_fec.h b/src/core/ao_fec.h index f1192b62..771732bd 100644 --- a/src/core/ao_fec.h +++ b/src/core/ao_fec.h @@ -70,6 +70,8 @@ ao_fec_encode(const uint8_t *in, uint8_t len, uint8_t *out);  #define AO_FEC_DECODE_BLOCK	(32)	/* callback must return multiples of this many bits */ +#define AO_FEC_DECODE_CRC_OK	0x80	/* stored in out[out_len-1] */ +  uint8_t  ao_fec_decode(const uint8_t *in, uint16_t in_len, uint8_t *out, uint8_t out_len, uint16_t (*callback)()); diff --git a/src/core/ao_fec_rx.c b/src/core/ao_fec_rx.c index 0d400bb0..d4c98475 100644 --- a/src/core/ao_fec_rx.c +++ b/src/core/ao_fec_rx.c @@ -211,6 +211,7 @@ ao_fec_decode(const uint8_t *in, uint16_t len, uint8_t *out, uint8_t out_len, ui  			int8_t		dist = b - (o + 8);	/* distance to last ready-for-writing bit */  			uint32_t	min_cost;		/* lowest cost */  			uint8_t		min_state;		/* lowest cost state */ +			uint8_t		byte;  			/* Find the best fit at the current point  			 * of the decode. @@ -238,24 +239,27 @@ ao_fec_decode(const uint8_t *in, uint16_t len, uint8_t *out, uint8_t out_len, ui  			printf ("\tbit %3d min_cost %5d old bit %3d old_state %x bits %02x whiten %0x\n",  				i/2, min_cost, o + 8, min_state, (bits[p][min_state] >> dist) & 0xff, *whiten);  #endif -			if (out_len) { -				uint8_t	byte = (bits[p][min_state] >> dist) ^ *whiten++; +			byte = (bits[p][min_state] >> dist) ^ *whiten++; +			*out++ = byte; +			if (out_len > 2) +				crc = ao_fec_crc_byte(byte, crc); -				if (out_len > 2) { -					crc = ao_fec_crc_byte(byte, crc); -					*out++ = byte; -				} else { -					*out++ = byte ^ (crc >> 8); -					crc <<= 8; -				} -				--out_len; +			if (!--out_len) { +				if ((out[-2] == (uint8_t) (crc >> 8)) && +				    out[-1] == (uint8_t) crc) +					out[-1] = AO_FEC_DECODE_CRC_OK; +				else +					out[-1] = 0; +				out[-2] = 0; +				goto done;  			}  			o += 8;  		}  	} +done:  #if AO_PROFILE  	ao_fec_decode_start = start_tick;  	ao_fec_decode_end = ao_profile_tick();  #endif -	return len/16; +	return 1;  }  | 
