From bb53b5ccef30073f282b85ff424cc611a504e397 Mon Sep 17 00:00:00 2001 From: Silvano Seva Date: Sun, 6 Dec 2020 09:12:36 +0100 Subject: [PATCH] Added squelch system to MD3x0 rtx driver --- platform/drivers/baseband/rtx_MD3x0.c | 66 +++++++++++++++++++++++--- tests/platform/MD380_FM_simpleRtx.c | 67 +++++++++------------------ 2 files changed, 82 insertions(+), 51 deletions(-) diff --git a/platform/drivers/baseband/rtx_MD3x0.c b/platform/drivers/baseband/rtx_MD3x0.c index f9646c40..99e3063b 100644 --- a/platform/drivers/baseband/rtx_MD3x0.c +++ b/platform/drivers/baseband/rtx_MD3x0.c @@ -18,12 +18,14 @@ * along with this program; if not, see * ***************************************************************************/ +#include #include #include #include #include #include #include +#include #include #include #include @@ -32,7 +34,6 @@ #include "HR-C5000_MD3x0.h" #include "pll_MD3x0.h" -#include "toneGenerator_MDx.h" #include struct rtxStatus_t @@ -53,9 +54,12 @@ struct rtxStatus_t } rtxStatus; -OS_Q cfgMailbox; -const md3x0Calib_t *calData; -const freq_t IF_FREQ = 49950000; /* Intermediate frequency: 49.95MHz */ +OS_Q cfgMailbox; /* Queue for incoming config messages */ +const md3x0Calib_t *calData; /* Pointer to calibration data */ +const freq_t IF_FREQ = 49950000; /* Intermediate frequency: 49.95MHz */ + +uint8_t sqlOpenTsh; /* Squelch opening threshold */ +uint8_t sqlCloseTsh; /* Squelch closing threshold */ static void printUnsignedInt(unsigned int x) { @@ -124,7 +128,7 @@ void _setOpMode() void _enableTxStage() { -// if(rtxStatus.txDisable == 1) return; + if(rtxStatus.txDisable == 1) return; gpio_clearPin(RX_STG_EN); @@ -198,6 +202,34 @@ void _setCTCSS() } } +void _updateSqlThresholds() +{ + /* + * TODO: + * - check why openSql9 is less than openSql1, maybe parameters are swapped + * - squelch levels 1 - 9 + */ + uint8_t sql1OpenTsh = interpCalParameter(rtxStatus.rxFrequency, calData->rxFreq, + calData->openSql9, 9); + + uint8_t sql1CloseTsh = interpCalParameter(rtxStatus.rxFrequency, calData->rxFreq, + calData->closeSql9, 9); + + sqlOpenTsh = sql1OpenTsh; + sqlCloseTsh = sql1CloseTsh; + +/* uint8_t sql9OpenTsh = interpCalParameter(rtxStatus.rxFrequency, calData->rxFreq, + calData->openSql1, 9); + + uint8_t sql9CloseTsh = interpCalParameter(rtxStatus.rxFrequency, calData->rxFreq, + calData->closeSql1, 9); + + sqlOpenTsh = sql1OpenTsh + ((rtxStatus.sqlLevel - 1) * + (sql9OpenTsh - sql1OpenTsh))/8; + + sqlCloseTsh = sql1CloseTsh + ((rtxStatus.sqlLevel - 1) * + (sql9CloseTsh - sql1CloseTsh))/8; */ +} void rtx_init() { @@ -240,7 +272,7 @@ void rtx_init() gpio_setPin(MIC_PWR); /* Turn on microphone */ gpio_setPin(AMP_EN); /* Turn on audio amplifier */ gpio_setPin(FM_MUTE); /* Unmute path from AF_out to amplifier */ - gpio_clearPin(SPK_MUTE); /* Mute speaker */ + gpio_setPin(SPK_MUTE); /* Mute speaker */ /* * Configure and enble DAC @@ -359,11 +391,31 @@ void rtx_taskFunc() _setBandwidth(); _updateC5000IQparams(); _setCTCSS(); + _updateSqlThresholds(); /* TODO: temporarily force to RX mode if rtx is off. */ if(rtxStatus.opStatus == OFF) _enableRxStage(); } + if(rtxStatus.opStatus == RX) + { + /* Convert back voltage to ADC counts */ + float sqlValue = (adc1_getMeasurement(1) * 4096.0f)/3300.0f; + uint16_t sqlLevel = ((uint16_t) sqlValue) >> 6; + + if((gpio_readPin(SPK_MUTE) == 1) && (sqlLevel > sqlOpenTsh)) + { + gpio_clearPin(SPK_MUTE); + platform_ledOn(GREEN); + } + + if((gpio_readPin(SPK_MUTE) == 0) && (sqlLevel < sqlCloseTsh)) + { + gpio_setPin(SPK_MUTE); + platform_ledOff(GREEN); + } + } + if(platform_getPttStatus() && (rtxStatus.opStatus != TX)) { _disableRtxStages(); @@ -387,5 +439,5 @@ void rtx_taskFunc() float rtx_getRssi() { - return 0; + return adc1_getMeasurement(1); } diff --git a/tests/platform/MD380_FM_simpleRtx.c b/tests/platform/MD380_FM_simpleRtx.c index 4ab0eb7c..c51b8541 100644 --- a/tests/platform/MD380_FM_simpleRtx.c +++ b/tests/platform/MD380_FM_simpleRtx.c @@ -21,68 +21,47 @@ #include #include #include +#include #include #include "gpio.h" #include "delays.h" #include "rtx.h" #include "platform.h" #include "hwconfig.h" -#include "HR-C5000_MD3x0.h" -#include "toneGenerator_MDxx380.h" +#include "toneGenerator_MDx.h" int main(void) { platform_init(); -// toneGen_init(); -// toneGen_setToneFreq(77.0f); - - gpio_setMode(SPK_MUTE, OUTPUT); - gpio_setMode(AMP_EN, OUTPUT); - gpio_setMode(FM_MUTE, OUTPUT); - - gpio_setPin(AMP_EN); /* Turn on audio amplifier */ - gpio_setPin(FM_MUTE); /* Unmute path from AF_out to amplifier */ - gpio_clearPin(SPK_MUTE); /* Unmute speaker */ + toneGen_init(); rtx_init(); - rtx_setTxFreq(430100000.0f); - rtx_setRxFreq(430100000.0f); - rtx_setBandwidth(BW_25); - rtx_setOpmode(FM); - rtx_setFuncmode(RX); - gpio_setMode(GPIOA, 14, OUTPUT); /* Micpwr_sw */ - gpio_setPin(GPIOA, 14); + freq_t rptFreq = 430100000; + freq_t rptShift = 1600000; + tone_t ctcss = 719; - bool txActive = false; - uint8_t count = 0; + /* + * Allocate a configuration message for RTX. + * This memory chunk is then freed inside the driver, so you must not call + * free() in this pointer! + */ + rtxConfig_t *cfg = ((rtxConfig_t *) malloc(sizeof(rtxConfig_t))); + + cfg->opMode = FM; + cfg->bandwidth = BW_25; + cfg->rxFrequency = rptFreq; + cfg->txFrequency = rptFreq + rptShift; + cfg->txPower = 1.0f; + cfg->sqlLevel = 3; + cfg->rxTone = 0; + cfg->txTone = ctcss; + rtx_configure(cfg); while (1) { - if(platform_getPttStatus() && (txActive == false)) - { - rtx_setFuncmode(OFF); - rtx_setFuncmode(TX); - C5000_startAnalogTx(); - platform_ledOn(RED); - txActive = true; - } - if(!platform_getPttStatus() && (txActive == true)) - { - rtx_setFuncmode(OFF); - C5000_stopAnalogTx(); - platform_ledOff(RED); - rtx_setFuncmode(RX); - txActive = false; - } - - count++; - if(count == 50) - { - printf("RSSI: %f\r\n", rtx_getRssi()); - count = 0; - } + rtx_taskFunc(); OS_ERR err; OSTimeDlyHMSM(0u, 0u, 0u, 10u, OS_OPT_TIME_HMSM_STRICT, &err);