From 01c629a6fdcbec481a9fc15a39341ffc60a7c135 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Tue, 24 Apr 2018 15:34:50 +0200 Subject: [PATCH] Improved data carrier detection --- device.h | 2 +- hardware/AFSK.c | 21 +++++++++++++++++++-- hardware/AFSK.h | 4 ++++ protocol/KISS.c | 2 +- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/device.h b/device.h index c26447a..499ae09 100755 --- a/device.h +++ b/device.h @@ -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 diff --git a/hardware/AFSK.c b/hardware/AFSK.c index 7c234c2..f82a81f 100755 --- a/hardware/AFSK.c +++ b/hardware/AFSK.c @@ -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. diff --git a/hardware/AFSK.h b/hardware/AFSK.h index e171fd8..8a0169f 100755 --- a/hardware/AFSK.h +++ b/hardware/AFSK.h @@ -51,6 +51,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 @@ -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 diff --git a/protocol/KISS.c b/protocol/KISS.c index 0c6e967..ad175c5 100755 --- a/protocol/KISS.c +++ b/protocol/KISS.c @@ -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);