Added squelch system to MD3x0 rtx driver

This commit is contained in:
Silvano Seva 2020-12-06 09:12:36 +01:00
parent 2c0b75b221
commit bb53b5ccef
2 changed files with 82 additions and 51 deletions

View File

@ -18,12 +18,14 @@
* along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#include <toneGenerator_MDx.h>
#include <calibInfo_MDx.h>
#include <calibUtils.h>
#include <datatypes.h>
#include <hwconfig.h>
#include <platform.h>
#include <ADC1_MDx.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <gpio.h>
@ -32,7 +34,6 @@
#include "HR-C5000_MD3x0.h"
#include "pll_MD3x0.h"
#include "toneGenerator_MDx.h"
#include <stdio.h>
struct rtxStatus_t
@ -53,10 +54,13 @@ struct rtxStatus_t
}
rtxStatus;
OS_Q cfgMailbox;
const md3x0Calib_t *calData;
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)
{
static const char hexdigits[]="0123456789abcdef";
@ -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);
}

View File

@ -21,68 +21,47 @@
#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <os.h>
#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);