Improved data carrier detection

This commit is contained in:
Mark Qvist 2018-04-24 15:34:50 +02:00
parent 145b1154f9
commit 01c629a6fd
4 changed files with 25 additions and 4 deletions

View File

@ -9,7 +9,7 @@
#define FREQUENCY_CORRECTION 0
// ADC settings
#define OPEN_SQUELCH false
#define OPEN_SQUELCH true
#define ADC_REFERENCE REF_3V3
// OR
//#define ADC_REFERENCE REF_5V

View File

@ -205,6 +205,14 @@ static bool hdlcParse(Hdlc *hdlc, bool bit, FIFOBuffer *fifo) {
// on the RX LED.
fifo_push(fifo, HDLC_FLAG);
hdlc->receiving = true;
if (hdlc->dcd_count < DCD_MIN_COUNT) {
hdlc->dcd = false;
hdlc->dcd_count++;
} else {
hdlc->dcd = true;
}
#if OPEN_SQUELCH == false
LED_RX_ON();
#endif
@ -215,7 +223,8 @@ static bool hdlcParse(Hdlc *hdlc, bool bit, FIFOBuffer *fifo) {
ret = false;
hdlc->receiving = false;
LED_RX_OFF();
hdlc->dcd = false;
hdlc->dcd_count = 0;
}
// Everytime we receive a HDLC_FLAG, we reset the
@ -239,10 +248,18 @@ static bool hdlcParse(Hdlc *hdlc, bool bit, FIFOBuffer *fifo) {
// If we have, something probably went wrong at the
// transmitting end, and we abort the reception.
hdlc->receiving = false;
LED_RX_OFF();
hdlc->dcd = false;
hdlc->dcd_count = 0;
return ret;
}
// Check the DCD status and set RX LED appropriately
if (hdlc->dcd) {
LED_RX_ON();
} else {
LED_RX_OFF();
}
// If we have not yet seen a HDLC_FLAG indicating that
// a transmission is actually taking place, don't bother
// with anything.

View File

@ -52,6 +52,8 @@ inline static uint8_t sinSample(uint16_t i) {
#define SAMPLESPERBIT (SAMPLERATE / BITRATE)
#define PHASE_INC 1 // Nudge by an eigth of a sample each adjustment
#define DCD_MIN_COUNT 6
#if BITRATE == 960
#define FILTER_CUTOFF 600
#define MARK_FREQ 960
@ -80,6 +82,8 @@ typedef struct Hdlc
uint8_t bitIndex;
uint8_t currentByte;
bool receiving;
bool dcd;
uint8_t dcd_count;
} Hdlc;
typedef struct Afsk

View File

@ -49,7 +49,7 @@ void kiss_csma(AX25Ctx *ctx, uint8_t *buf, size_t len) {
bool sent = false;
while (!sent) {
//puts("Waiting in CSMA");
if(!channel->hdlc.receiving) {
if(!channel->hdlc.dcd) {
uint8_t tp = rand() & 0xFF;
if (tp < p) {
ax25_sendRaw(ctx, buf, len);