|
|
|
@ -5,15 +5,25 @@
|
|
|
|
|
*
|
|
|
|
|
* 20070808 1235 Steven Henke, W9SH, sph@xelatec.com
|
|
|
|
|
*
|
|
|
|
|
* See http://www.asterisk.org for more information about
|
|
|
|
|
* the Asterisk project. Please do not directly contact
|
|
|
|
|
* any of the maintainers of this project for assistance;
|
|
|
|
|
* the project provides a web site, mailing lists and IRC
|
|
|
|
|
* channels for your use.
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
|
*
|
|
|
|
|
* This version may be optionally licenced under the GNU LGPL licence.
|
|
|
|
|
*
|
|
|
|
|
* A license has been granted to Digium (via disclaimer) for the use of
|
|
|
|
|
* this code.
|
|
|
|
|
*
|
|
|
|
|
* This program is free software, distributed under the terms of
|
|
|
|
|
* the GNU General Public License Version 2. See the LICENSE file
|
|
|
|
|
* at the top of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*! \file
|
|
|
|
@ -23,25 +33,73 @@
|
|
|
|
|
* \author Steven Henke, W9SH <sph@xelatec.com> Xelatec, LLC
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef XPMR_H
|
|
|
|
|
#define XPMR_H 1
|
|
|
|
|
#ifndef XPMR_H
|
|
|
|
|
#define XPMR_H 1
|
|
|
|
|
|
|
|
|
|
#define XPMR_DEV 0 // when running in test mode
|
|
|
|
|
|
|
|
|
|
#define XPMR_TRACE_LEVEL 0
|
|
|
|
|
|
|
|
|
|
#ifdef RADIO_RTX
|
|
|
|
|
#define DTX_PROG 1 // rf transceiver module
|
|
|
|
|
#define XPMR_PPTP 0 // parallel port test probe
|
|
|
|
|
#else
|
|
|
|
|
#define DTX_PROG 0
|
|
|
|
|
#define XPMR_PPTP 0
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if (DTX_PROG == 1) || XPMR_PPTP == 1
|
|
|
|
|
#include <parapindriver.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef CHAN_USBRADIO
|
|
|
|
|
#define XPMR_DEBUG0 1
|
|
|
|
|
#define XPMR_TRACE 0
|
|
|
|
|
#define XPMR_TRACE 1
|
|
|
|
|
#define TRACEO(level,a) { if ( o->tracelevel >= level ) {printf a;} }
|
|
|
|
|
#else
|
|
|
|
|
#define XPMR_DEBUG0 1
|
|
|
|
|
#define XPMR_TRACE 1
|
|
|
|
|
#define TRACEO(level,a)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define LSD_DFS 5
|
|
|
|
|
#define LSD_DFD 1
|
|
|
|
|
|
|
|
|
|
#if(XPMR_DEBUG0 == 1)
|
|
|
|
|
#define XPMR_DEBUG_CHANS 16
|
|
|
|
|
#define TSCOPE(a) {strace a;}
|
|
|
|
|
#else
|
|
|
|
|
#define XPMR_DEBUG_CHANS 0
|
|
|
|
|
#define TSCOPE(a)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#define XPMR_TRACE_AMP 8192
|
|
|
|
|
|
|
|
|
|
// TRACEM(3,TSYS_LSD,("pmr_lsdctl_exec() RX FRAME UNPROCESSED.\n"));
|
|
|
|
|
#if(XPMR_TRACE == 1)
|
|
|
|
|
#define TRACEX(a) {printf a;}
|
|
|
|
|
#define TRACEXL(a) {printf("%s @ %u : ",__FILE__ ,__LINE__); printf a; }
|
|
|
|
|
#define TRACEXT(a) { struct timeval hack; gettimeofday(&hack,NULL); printf("%ld.",hack.tv_sec%100000); printf("%i : ",(int)hack.tv_usec); printf a; }
|
|
|
|
|
#define TRACEXT(a) {struct timeval hack; gettimeofday(&hack,NULL); printf("%ld.",hack.tv_sec%100000); printf("%i : ",(int)hack.tv_usec); printf a; }
|
|
|
|
|
#define TRACEXR(a) {printf a;}
|
|
|
|
|
#define TRACEC(level,a) {if(pChan->tracelevel>=level){printf("%08i ",pChan->frameCountRx);printf a;} }
|
|
|
|
|
#define TRACEF(level,a) {if(pChan->tracelevel>=level){printf a;} }
|
|
|
|
|
#define TRACEJ(level,a) {if(XPMR_TRACE_LEVEL>=level){printf a;} }
|
|
|
|
|
#define TRACES(level,a) {if(mySps->parentChan->tracelevel >= level){printf a;} }
|
|
|
|
|
#define TRACET(level,a) {if(pChan->tracelevel>=level){printf("%08i %02i",pChan->frameCountRx,pChan->rptnum);printf a;} }
|
|
|
|
|
#define TRACEXR(a) {printf a;}
|
|
|
|
|
#define TRACEM(level,sys,a) {if(pChan->tracelevel>=level || (pChan->tracesys[sys])){printf a;} }
|
|
|
|
|
#else
|
|
|
|
|
#define TRACEX(a)
|
|
|
|
|
#define TRACEXL(a)
|
|
|
|
|
#define TRACEXT(a)
|
|
|
|
|
#define TRACEC(level,a)
|
|
|
|
|
#define TRACEF(level,a)
|
|
|
|
|
#define TRACEJ(level,a)
|
|
|
|
|
#define TRACES(level,a)
|
|
|
|
|
#define TRACET(level,a)
|
|
|
|
|
#define TRACEXR(a)
|
|
|
|
|
#define TRACEM(level,sys,a)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#define i8 int8_t
|
|
|
|
@ -52,11 +110,18 @@
|
|
|
|
|
#define u32 u_int32_t
|
|
|
|
|
#define i64 int64_t
|
|
|
|
|
#define u64 u_int64_t
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define M_Q31 0x80000000 //
|
|
|
|
|
#define M_Q30 0x40000000 //
|
|
|
|
|
#define M_Q29 0x20000000 //
|
|
|
|
|
#define M_Q28 0x10000000 //
|
|
|
|
|
#define M_Q27 0x08000000 //
|
|
|
|
|
#define M_Q26 0x04000000 //
|
|
|
|
|
#define M_Q25 0x02000000 //
|
|
|
|
|
#define M_Q24 0x01000000 //
|
|
|
|
|
#define M_Q23 0x00800000 //
|
|
|
|
|
#define M_Q22 0x00400000 //
|
|
|
|
|
#define M_Q21 0x00200000 //
|
|
|
|
|
#define M_Q21 0x00200000 // undsoweiter
|
|
|
|
|
#define M_Q20 0x00100000 // 1048576
|
|
|
|
|
#define M_Q19 0x00080000 // 524288
|
|
|
|
|
#define M_Q18 0x00040000 // 262144
|
|
|
|
@ -86,8 +151,11 @@
|
|
|
|
|
|
|
|
|
|
#define SAMPLES_PER_BLOCK 160
|
|
|
|
|
#define MS_PER_FRAME 20
|
|
|
|
|
#define SAMPLES_PER_MS 8
|
|
|
|
|
|
|
|
|
|
#define CTCSS_NUM_CODES 38
|
|
|
|
|
#define CTCSS_NULL -1
|
|
|
|
|
#define CTCSS_RXONLY -2
|
|
|
|
|
#define CTCSS_NUM_CODES 38 // 0 - 37
|
|
|
|
|
#define CTCSS_SCOUNT_MUL 100
|
|
|
|
|
#define CTCSS_INTEGRATE 3932 // 32767*.120 // 120/1000 // 0.120
|
|
|
|
|
#define CTCSS_INPUT_LIMIT 1000
|
|
|
|
@ -98,6 +166,61 @@
|
|
|
|
|
#define CTCSS_TURN_OFF_SHIFT 240 // degrees
|
|
|
|
|
#define TOC_NOTONE_TIME 600 // ms
|
|
|
|
|
|
|
|
|
|
#define DDB_FRAME_SIZE 160 // clock de-drift defaults
|
|
|
|
|
#define DDB_FRAMES_IN_BUFF 8
|
|
|
|
|
#define DDB_ERR_MODULUS 10000
|
|
|
|
|
|
|
|
|
|
#define DCS_TURN_OFF_TIME 180
|
|
|
|
|
|
|
|
|
|
#define NUM_TXLSD_FRAMEBUFFERS 4
|
|
|
|
|
|
|
|
|
|
#define CHAN_TXSTATE_IDLE 0
|
|
|
|
|
#define CHAN_TXSTATE_ACTIVE 1
|
|
|
|
|
#define CHAN_TXSTATE_TOC 2
|
|
|
|
|
#define CHAN_TXSTATE_HANGING 3
|
|
|
|
|
#define CHAN_TXSTATE_FINISHING 4
|
|
|
|
|
#define CHAN_TXSTATE_COMPLETE 5
|
|
|
|
|
#define CHAN_TXSTATE_USURPED 9
|
|
|
|
|
|
|
|
|
|
#define SMODE_NULL 0
|
|
|
|
|
#define SMODE_CARRIER 1
|
|
|
|
|
#define SMODE_CTCSS 2
|
|
|
|
|
#define SMODE_DCS 3
|
|
|
|
|
#define SMODE_LSD 4
|
|
|
|
|
#define SMODE_MPT 5
|
|
|
|
|
#define SMODE_DST 6
|
|
|
|
|
#define SMODE_P25 7
|
|
|
|
|
#define SMODE_MDC 8
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define SPS_OPT_START 1
|
|
|
|
|
#define SPS_OPT_STOP 2
|
|
|
|
|
#define SPS_OPT_TURNOFF 3
|
|
|
|
|
#define SPS_OPT_STOPNOW 4
|
|
|
|
|
|
|
|
|
|
#define SPS_STAT_STOPPED 0
|
|
|
|
|
#define SPS_STAT_STARTING 1
|
|
|
|
|
#define SPS_STAT_RUNNING 2
|
|
|
|
|
#define SPS_STAT_HALTING 3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define PP_BIT_TEST 6
|
|
|
|
|
#define PP_REG_LEN 32
|
|
|
|
|
#define PP_BIT_TIME 100000
|
|
|
|
|
|
|
|
|
|
#define DTX_CLK LP_PIN02
|
|
|
|
|
#define DTX_DATA LP_PIN03
|
|
|
|
|
#define DTX_ENABLE LP_PIN04
|
|
|
|
|
#define DTX_TX LP_PIN05 // only used on older mods
|
|
|
|
|
#define DTX_TXPWR LP_PIN06 // not used
|
|
|
|
|
#define DTX_TP1 LP_PIN07 // not used
|
|
|
|
|
#define DTX_TP2 LP_PIN08 // not used
|
|
|
|
|
|
|
|
|
|
#define BIN_PROG_0 LP_PIN06
|
|
|
|
|
#define BIN_PROG_1 LP_PIN07
|
|
|
|
|
#define BIN_PROG_2 LP_PIN08
|
|
|
|
|
#define BIN_PROG_3 LP_PIN09
|
|
|
|
|
|
|
|
|
|
#ifndef CHAN_USBRADIO
|
|
|
|
|
enum {RX_AUDIO_NONE,RX_AUDIO_SPEAKER,RX_AUDIO_FLAT};
|
|
|
|
|
enum {TX_AUDIO_NONE,TX_AUDIO_FLAT,TX_AUDIO_FILTERED,TX_AUDIO_PROC};
|
|
|
|
@ -108,6 +231,130 @@ enum {TX_OUT_OFF,TX_OUT_VOICE,TX_OUT_LSD,TX_OUT_COMPOSITE,TX_OUT_AUX};
|
|
|
|
|
enum {TOC_NONE,TOC_PHASE,TOC_NOTONE};
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
enum dbg_pts {
|
|
|
|
|
|
|
|
|
|
RX_INPUT,
|
|
|
|
|
RX_NOISE_AMP,
|
|
|
|
|
RX_NOISE_TRIG,
|
|
|
|
|
|
|
|
|
|
RX_CTCSS_LPF,
|
|
|
|
|
RX_CTCSS_CENTER,
|
|
|
|
|
RX_CTCSS_NRZ,
|
|
|
|
|
RX_CTCSS_CLK,
|
|
|
|
|
RX_CTCSS_P0,
|
|
|
|
|
RX_CTCSS_P1,
|
|
|
|
|
RX_CTCSS_ACCUM,
|
|
|
|
|
RX_CTCSS_DVDT,
|
|
|
|
|
RX_CTCSS_DECODE,
|
|
|
|
|
|
|
|
|
|
RX_DCS_CENTER,
|
|
|
|
|
RX_DCS_DEC,
|
|
|
|
|
RX_DCS_DIN,
|
|
|
|
|
RX_DCS_CLK,
|
|
|
|
|
RX_DCS_DAT,
|
|
|
|
|
|
|
|
|
|
RX_LSD_LPF,
|
|
|
|
|
RX_LSD_CLK,
|
|
|
|
|
RX_LSD_DAT,
|
|
|
|
|
RX_LSD_DEC,
|
|
|
|
|
|
|
|
|
|
RX_LSD_CENTER,
|
|
|
|
|
RX_LSD_SYNC,
|
|
|
|
|
RX_LSD_STATE,
|
|
|
|
|
RX_LSD_ERR,
|
|
|
|
|
RX_LSD_INTE,
|
|
|
|
|
|
|
|
|
|
RX_SMODE,
|
|
|
|
|
|
|
|
|
|
TX_PTT_IN,
|
|
|
|
|
TX_PTT_OUT,
|
|
|
|
|
|
|
|
|
|
TX_DEDRIFT_LEAD,
|
|
|
|
|
TX_DEDRIFT_ERR,
|
|
|
|
|
TX_DEDRIFT_FACTOR,
|
|
|
|
|
TX_DEDRIFT_DRIFT,
|
|
|
|
|
TX_DEDRIFT_TWIDDLE,
|
|
|
|
|
|
|
|
|
|
TX_CTCSS_GEN,
|
|
|
|
|
|
|
|
|
|
TX_SIGGEN_0,
|
|
|
|
|
|
|
|
|
|
TX_DCS_CLK,
|
|
|
|
|
TX_DCS_DAT,
|
|
|
|
|
TX_DCS_LPF,
|
|
|
|
|
|
|
|
|
|
TX_LSD_CLK,
|
|
|
|
|
TX_LSD_DAT,
|
|
|
|
|
TX_LSD_GEN,
|
|
|
|
|
TX_LSD_LPF,
|
|
|
|
|
|
|
|
|
|
TX_NET_INT,
|
|
|
|
|
TX_VOX_HPF,
|
|
|
|
|
TX_VOX_LIM,
|
|
|
|
|
|
|
|
|
|
TX_VOX_LPF,
|
|
|
|
|
|
|
|
|
|
TX_OUT_A,
|
|
|
|
|
TX_OUT_B,
|
|
|
|
|
|
|
|
|
|
NUM_DEBUG_PTS
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
i16 mode;
|
|
|
|
|
i16 point[NUM_DEBUG_PTS];
|
|
|
|
|
i16 trace[16];
|
|
|
|
|
i16 scale[16];
|
|
|
|
|
i16 offset[16];
|
|
|
|
|
i16 buffer[16 * SAMPLES_PER_BLOCK]; // allocate for rx and tx
|
|
|
|
|
i16 *source[16];
|
|
|
|
|
} t_sdbg;
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
i16 lock;
|
|
|
|
|
i16 option; // 1 = data in, 0 = data out
|
|
|
|
|
i16 debug;
|
|
|
|
|
i16 debugcnt;
|
|
|
|
|
i32 rxframecnt;
|
|
|
|
|
i32 txframecnt;
|
|
|
|
|
|
|
|
|
|
i32 skew;
|
|
|
|
|
|
|
|
|
|
i16 frames;
|
|
|
|
|
i16 framesize;
|
|
|
|
|
i16 buffersize;
|
|
|
|
|
|
|
|
|
|
i32 timer;
|
|
|
|
|
|
|
|
|
|
i32 x0,x1,y0,y1;
|
|
|
|
|
|
|
|
|
|
i16 inputindex;
|
|
|
|
|
i16 outputindex;
|
|
|
|
|
i16 lead;
|
|
|
|
|
i16 err;
|
|
|
|
|
i16 accum;
|
|
|
|
|
|
|
|
|
|
i16 *ptr; // source or destination
|
|
|
|
|
i16 *buff;
|
|
|
|
|
|
|
|
|
|
i16 inputcnt;
|
|
|
|
|
i16 initcnt;
|
|
|
|
|
|
|
|
|
|
i32 factor;
|
|
|
|
|
i32 drift;
|
|
|
|
|
i32 modulus;
|
|
|
|
|
i32 z1;
|
|
|
|
|
struct {
|
|
|
|
|
unsigned rxlock:1;
|
|
|
|
|
unsigned txlock:1;
|
|
|
|
|
unsigned twiddle:1;
|
|
|
|
|
unsigned doitnow:1;
|
|
|
|
|
}b;
|
|
|
|
|
}
|
|
|
|
|
t_dedrift;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
one structure for each ctcss tone to decode
|
|
|
|
|
*/
|
|
|
|
@ -121,7 +368,7 @@ typedef struct
|
|
|
|
|
i16 enabled;
|
|
|
|
|
i16 state; // dead, running, error
|
|
|
|
|
i16 zIndex; // z bucket index
|
|
|
|
|
i16 z[4]; // maw sph today
|
|
|
|
|
i16 z[4];
|
|
|
|
|
i16 zi;
|
|
|
|
|
i16 dvu;
|
|
|
|
|
i16 dvd;
|
|
|
|
@ -130,78 +377,62 @@ typedef struct
|
|
|
|
|
i16 hyst;
|
|
|
|
|
i16 decode;
|
|
|
|
|
i16 diffpeak;
|
|
|
|
|
i16 debug; // value held from last pass
|
|
|
|
|
i16 debug;
|
|
|
|
|
|
|
|
|
|
#if XPMR_DEBUG0 == 1
|
|
|
|
|
i16 lasttv0;
|
|
|
|
|
i16 lasttv1;
|
|
|
|
|
i16 lasttv2;
|
|
|
|
|
i16 lasttv3;
|
|
|
|
|
|
|
|
|
|
i16 *pDebug0; // pointer to debug output
|
|
|
|
|
i16 *pDebug1; // pointer to debug output
|
|
|
|
|
i16 *pDebug2; // pointer to debug output
|
|
|
|
|
i16 *pDebug3; // pointer to debug output
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
} t_tdet;
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
i16 enabled; // if 0 none, 0xFFFF all tones, or single tone
|
|
|
|
|
i16 *input;
|
|
|
|
|
i16 *input; // source data
|
|
|
|
|
i16 clamplitude;
|
|
|
|
|
i16 center;
|
|
|
|
|
i16 decode; // current ctcss decode index
|
|
|
|
|
i32 BlankingTimer;
|
|
|
|
|
u32 TurnOffTimer;
|
|
|
|
|
t_tdet tdet[CTCSS_NUM_CODES];
|
|
|
|
|
i16 gain;
|
|
|
|
|
i16 limit;
|
|
|
|
|
i16 debugIndex;
|
|
|
|
|
i16 *pDebug0;
|
|
|
|
|
i16 *pDebug1;
|
|
|
|
|
i16 *pDebug2;
|
|
|
|
|
i16 *pDebug3;
|
|
|
|
|
i16 testIndex;
|
|
|
|
|
i16 multiFreq;
|
|
|
|
|
i8 relax;
|
|
|
|
|
t_tdet tdet[CTCSS_NUM_CODES];
|
|
|
|
|
|
|
|
|
|
} t_dec_ctcss;
|
|
|
|
|
i8 numrxcodes;
|
|
|
|
|
i16 rxCtcssMap[CTCSS_NUM_CODES];
|
|
|
|
|
char *rxctcss[CTCSS_NUM_CODES]; // pointers to each tone in string above
|
|
|
|
|
char *txctcss[CTCSS_NUM_CODES];
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
i16 enabled; // if 0 none, 0xFFFF all tones, or single tone
|
|
|
|
|
i16 clamplitude;
|
|
|
|
|
i16 center;
|
|
|
|
|
i16 decode; // current ctcss decode value
|
|
|
|
|
i32 BlankingTimer;
|
|
|
|
|
u32 TurnOffTimer;
|
|
|
|
|
i16 gain;
|
|
|
|
|
i16 limit;
|
|
|
|
|
i16 *pDebug0;
|
|
|
|
|
i16 *pDebug1;
|
|
|
|
|
i16 rxPolarity;
|
|
|
|
|
} t_dec_dcs;
|
|
|
|
|
i32 txctcssdefault_index;
|
|
|
|
|
float txctcssdefault_value;
|
|
|
|
|
|
|
|
|
|
struct{
|
|
|
|
|
unsigned valid:1;
|
|
|
|
|
}b;
|
|
|
|
|
} t_dec_ctcss;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Low Speed Data decoding both polarities
|
|
|
|
|
Low Speed Data
|
|
|
|
|
*/
|
|
|
|
|
/*
|
|
|
|
|
general purpose pmr signal processing element
|
|
|
|
|
*/
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
i16 counter; // counter to next sample
|
|
|
|
|
i16 synced;
|
|
|
|
|
u32 syncCorr[2];
|
|
|
|
|
u32 data[2];
|
|
|
|
|
i16 state; // disabled, enabled,
|
|
|
|
|
i16 decode;
|
|
|
|
|
i16 debug;
|
|
|
|
|
|
|
|
|
|
i16 polarity;
|
|
|
|
|
u32 frameNum;
|
|
|
|
|
|
|
|
|
|
u16 area;
|
|
|
|
|
u16 chan;
|
|
|
|
|
u16 home;
|
|
|
|
|
u16 id;
|
|
|
|
|
u16 free;
|
|
|
|
|
|
|
|
|
|
u16 crc;
|
|
|
|
|
i16 rssi;
|
|
|
|
|
|
|
|
|
|
} t_decLsd;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* general purpose pmr signal processing element */
|
|
|
|
|
|
|
|
|
|
struct t_pmr_chan;
|
|
|
|
|
|
|
|
|
@ -211,6 +442,7 @@ typedef struct t_pmr_sps
|
|
|
|
|
|
|
|
|
|
i16 enabled; // enabled/disabled
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct t_pmr_chan *parentChan;
|
|
|
|
|
|
|
|
|
|
i16 *source; // source buffer
|
|
|
|
@ -220,7 +452,9 @@ typedef struct t_pmr_sps
|
|
|
|
|
i16 numChanOut; // allows output direct to interleaved buffer
|
|
|
|
|
i16 selChanOut;
|
|
|
|
|
|
|
|
|
|
u32 ticks;
|
|
|
|
|
i32 ticks;
|
|
|
|
|
i32 timer;
|
|
|
|
|
i32 count;
|
|
|
|
|
|
|
|
|
|
void *buff; // this structure's internal buffer
|
|
|
|
|
|
|
|
|
@ -258,6 +492,29 @@ typedef struct t_pmr_sps
|
|
|
|
|
i16 err; // error condition
|
|
|
|
|
i16 option; // option / request zero
|
|
|
|
|
i16 state; // stopped, start, stopped assumes zero'd
|
|
|
|
|
|
|
|
|
|
i16 pending;
|
|
|
|
|
|
|
|
|
|
struct {
|
|
|
|
|
unsigned hit:1;
|
|
|
|
|
unsigned hitlast:1;
|
|
|
|
|
unsigned hita:1;
|
|
|
|
|
unsigned hitb:1;
|
|
|
|
|
unsigned bithit:1;
|
|
|
|
|
unsigned now:1;
|
|
|
|
|
unsigned next:1;
|
|
|
|
|
unsigned prev:1;
|
|
|
|
|
unsigned clock:1;
|
|
|
|
|
unsigned hold:1;
|
|
|
|
|
unsigned opt1:1;
|
|
|
|
|
unsigned opt2:1;
|
|
|
|
|
unsigned polarity:1;
|
|
|
|
|
unsigned dotting:1;
|
|
|
|
|
unsigned lastbitpending:1;
|
|
|
|
|
unsigned outzero:1;
|
|
|
|
|
unsigned settling:1;
|
|
|
|
|
unsigned syncing:1;
|
|
|
|
|
}b;
|
|
|
|
|
|
|
|
|
|
i16 cleared; // output buffer cleared
|
|
|
|
|
|
|
|
|
@ -288,14 +545,28 @@ typedef struct t_pmr_sps
|
|
|
|
|
|
|
|
|
|
} t_pmr_sps;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct t_dec_dcs;
|
|
|
|
|
struct t_lsd_control;
|
|
|
|
|
struct t_decLsd;;
|
|
|
|
|
struct t_encLsd;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
pmr channel
|
|
|
|
|
*/
|
|
|
|
|
typedef struct t_pmr_chan
|
|
|
|
|
{
|
|
|
|
|
i16 index; // which one
|
|
|
|
|
i16 devicenum; // belongs to
|
|
|
|
|
|
|
|
|
|
char *name;
|
|
|
|
|
|
|
|
|
|
i16 enabled; // enabled/disabled
|
|
|
|
|
i16 status; // ok, error, busy, idle, initializing
|
|
|
|
|
|
|
|
|
|
i16 tracelevel;
|
|
|
|
|
i16 tracetype;
|
|
|
|
|
u32 tracemask;
|
|
|
|
|
|
|
|
|
|
i16 nSamplesRx; // max frame size
|
|
|
|
|
i16 nSamplesTx;
|
|
|
|
@ -306,11 +577,23 @@ typedef struct t_pmr_chan
|
|
|
|
|
i16 inputGain;
|
|
|
|
|
i16 inputOffset;
|
|
|
|
|
|
|
|
|
|
i32 ticks; // time ticks
|
|
|
|
|
u32 frameCountRx; // number processed
|
|
|
|
|
u32 frameCountTx;
|
|
|
|
|
|
|
|
|
|
i8 txframelock;
|
|
|
|
|
|
|
|
|
|
i32 txHangTime;
|
|
|
|
|
i32 txHangTimer;
|
|
|
|
|
i32 txTurnOff;
|
|
|
|
|
i16 txBufferClear;
|
|
|
|
|
|
|
|
|
|
u32 txfreq;
|
|
|
|
|
u32 rxfreq;
|
|
|
|
|
i8 txpower;
|
|
|
|
|
|
|
|
|
|
i32 txsettletime; // in samples
|
|
|
|
|
i32 txsettletimer;
|
|
|
|
|
|
|
|
|
|
i16 rxDC; // average DC value of input
|
|
|
|
|
i16 rxSqSet; // carrier squelch threshold
|
|
|
|
@ -319,6 +602,7 @@ typedef struct t_pmr_chan
|
|
|
|
|
i16 rxQuality; // signal quality metric
|
|
|
|
|
i16 rxCarrierDetect; // carrier detect
|
|
|
|
|
i16 rxCdType;
|
|
|
|
|
i16 rxSqVoxAdj;
|
|
|
|
|
i16 rxExtCarrierDetect;
|
|
|
|
|
i32 inputBlanking; // Tx pulse eliminator
|
|
|
|
|
|
|
|
|
@ -340,20 +624,54 @@ typedef struct t_pmr_chan
|
|
|
|
|
|
|
|
|
|
char radioDuplex;
|
|
|
|
|
|
|
|
|
|
struct {
|
|
|
|
|
unsigned pmrNoiseSquelch:1;
|
|
|
|
|
unsigned rxHpf:1;
|
|
|
|
|
unsigned txHpf:1;
|
|
|
|
|
unsigned txLpf:1;
|
|
|
|
|
unsigned rxDeEmphasis:1;
|
|
|
|
|
unsigned txPreEmphasis:1;
|
|
|
|
|
unsigned startSpecialTone:1;
|
|
|
|
|
unsigned stopSpecialTone:1;
|
|
|
|
|
unsigned doingSpecialTone:1;
|
|
|
|
|
unsigned extCarrierDetect:1;
|
|
|
|
|
unsigned txCapture:1;
|
|
|
|
|
unsigned rxCapture:1;
|
|
|
|
|
}b;
|
|
|
|
|
char *pStr;
|
|
|
|
|
|
|
|
|
|
// start channel signaling codes source
|
|
|
|
|
char *pRxCodeSrc; // source
|
|
|
|
|
char *pTxCodeSrc; // source
|
|
|
|
|
char *pTxCodeDefault; // source
|
|
|
|
|
// end channel signaling codes source
|
|
|
|
|
|
|
|
|
|
// start signaling code info derived from source
|
|
|
|
|
i16 numrxcodes;
|
|
|
|
|
i16 numtxcodes;
|
|
|
|
|
char *pRxCodeStr; // copied and cut up
|
|
|
|
|
char **pRxCode; // pointers to subs
|
|
|
|
|
char *pTxCodeStr;
|
|
|
|
|
char **pTxCode;
|
|
|
|
|
|
|
|
|
|
char txctcssdefault[16]; // codes from higher level
|
|
|
|
|
|
|
|
|
|
char *rxctcssfreqs; // rest are derived from this
|
|
|
|
|
char *txctcssfreqs;
|
|
|
|
|
|
|
|
|
|
char numrxctcssfreqs;
|
|
|
|
|
char numtxctcssfreqs;
|
|
|
|
|
|
|
|
|
|
char *rxctcss[CTCSS_NUM_CODES]; // pointers to each tone in string above
|
|
|
|
|
char *txctcss[CTCSS_NUM_CODES];
|
|
|
|
|
|
|
|
|
|
i16 rxCtcssMap[CTCSS_NUM_CODES];
|
|
|
|
|
|
|
|
|
|
i8 txcodedefaultsmode;
|
|
|
|
|
i16 txctcssdefault_index;
|
|
|
|
|
float txctcssdefault_value;
|
|
|
|
|
|
|
|
|
|
char txctcssfreq[32]; // encode now
|
|
|
|
|
char rxctcssfreq[32]; // decode now
|
|
|
|
|
// end most of signaling code info derived from source
|
|
|
|
|
|
|
|
|
|
struct t_lsd_control *pLsdCtl;
|
|
|
|
|
|
|
|
|
|
i16 rptnum;
|
|
|
|
|
i16 area;
|
|
|
|
|
char *ukey;
|
|
|
|
|
u32 idleinterval;
|
|
|
|
|
char turnoffs;
|
|
|
|
|
|
|
|
|
|
char pplock;
|
|
|
|
|
|
|
|
|
|
t_dedrift dd;
|
|
|
|
|
|
|
|
|
|
i16 dummy;
|
|
|
|
|
|
|
|
|
@ -379,21 +697,34 @@ typedef struct t_pmr_chan
|
|
|
|
|
|
|
|
|
|
i16 rxCarrierPoint;
|
|
|
|
|
i16 rxCarrierHyst;
|
|
|
|
|
|
|
|
|
|
i16 rxCtcssMap[CTCSS_NUM_CODES];
|
|
|
|
|
|
|
|
|
|
i16 txCtcssTocShift;
|
|
|
|
|
i16 txCtcssTocTime;
|
|
|
|
|
i8 txTocType;
|
|
|
|
|
|
|
|
|
|
float txCtcssFreq;
|
|
|
|
|
float rxCtcssFreq;
|
|
|
|
|
float rxInputGain;
|
|
|
|
|
|
|
|
|
|
i16 rxCtcssIndex;
|
|
|
|
|
i16 smode; // ctcss, dcs, lsd
|
|
|
|
|
i16 smodecode;
|
|
|
|
|
i16 smodewas; // ctcss, dcs, lsd
|
|
|
|
|
i32 smodetimer; // in ms
|
|
|
|
|
i32 smodetime; // to set in ms
|
|
|
|
|
|
|
|
|
|
t_dec_ctcss *rxCtcss;
|
|
|
|
|
struct t_dec_dcs *decDcs;
|
|
|
|
|
struct t_decLsd *decLsd;
|
|
|
|
|
struct t_encLsd *pLsdEnc;
|
|
|
|
|
|
|
|
|
|
i16 clamplitudeDcs;
|
|
|
|
|
i16 centerDcs;
|
|
|
|
|
u32 dcsBlankingTimer;
|
|
|
|
|
i16 dcsDecode; // current dcs decode value
|
|
|
|
|
|
|
|
|
|
i16 clamplitudeLsd;
|
|
|
|
|
i16 centerLsd;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i16 txPttIn; // from external request
|
|
|
|
|
i16 txPttOut; // to radio hardware
|
|
|
|
|
i16 txPttHid;
|
|
|
|
|
|
|
|
|
|
i16 bandwidth; // wide/narrow
|
|
|
|
|
i16 txCompand; // type
|
|
|
|
@ -410,12 +741,15 @@ typedef struct t_pmr_chan
|
|
|
|
|
|
|
|
|
|
i16 function;
|
|
|
|
|
|
|
|
|
|
i16 txState; // off,settling,on,hangtime,turnoff
|
|
|
|
|
i16 txState; // off,settling,on,hangtime,turnoff
|
|
|
|
|
|
|
|
|
|
i16 spsIndex;
|
|
|
|
|
|
|
|
|
|
t_pmr_sps *spsMeasure; // measurement block
|
|
|
|
|
t_pmr_sps *spsMeasure; // measurement block
|
|
|
|
|
|
|
|
|
|
t_pmr_sps *spsRx; // 1st signal processing struct
|
|
|
|
|
t_pmr_sps *spsRxLsd;
|
|
|
|
|
t_pmr_sps *spsRxLsdNrz;
|
|
|
|
|
t_pmr_sps *spsRxDeEmp;
|
|
|
|
|
t_pmr_sps *spsRxHpf;
|
|
|
|
|
t_pmr_sps *spsRxVox;
|
|
|
|
@ -423,14 +757,14 @@ typedef struct t_pmr_chan
|
|
|
|
|
t_pmr_sps *spsRxOut; // Last signal processing struct
|
|
|
|
|
|
|
|
|
|
t_pmr_sps *spsTx; // 1st signal processing struct
|
|
|
|
|
|
|
|
|
|
t_pmr_sps *spsTxLsdLpf;
|
|
|
|
|
|
|
|
|
|
t_pmr_sps *spsTxOutA; // Last signal processing struct
|
|
|
|
|
|
|
|
|
|
t_pmr_sps *spsTxOutB; // Last signal processing struct
|
|
|
|
|
|
|
|
|
|
t_pmr_sps *spsSigGen0; // ctcss
|
|
|
|
|
t_pmr_sps *spsSigGen1; // test and other tones
|
|
|
|
|
t_pmr_sps *spsLsdGen;
|
|
|
|
|
t_pmr_sps *spsTxLsdLpf;
|
|
|
|
|
|
|
|
|
|
// tune tweaks
|
|
|
|
|
|
|
|
|
@ -452,6 +786,58 @@ typedef struct t_pmr_chan
|
|
|
|
|
|
|
|
|
|
i32 *ptxLimiterAdjust; // from calling application
|
|
|
|
|
|
|
|
|
|
struct {
|
|
|
|
|
unsigned pmrNoiseSquelch:1;
|
|
|
|
|
unsigned rxHpf:1;
|
|
|
|
|
unsigned txHpf:1;
|
|
|
|
|
unsigned txLpf:1;
|
|
|
|
|
unsigned rxDeEmphasis:1;
|
|
|
|
|
unsigned txPreEmphasis:1;
|
|
|
|
|
unsigned startSpecialTone:1;
|
|
|
|
|
unsigned stopSpecialTone:1;
|
|
|
|
|
unsigned doingSpecialTone:1;
|
|
|
|
|
unsigned extCarrierDetect:1;
|
|
|
|
|
unsigned txCapture:1;
|
|
|
|
|
unsigned rxCapture:1;
|
|
|
|
|
unsigned reprog:1;
|
|
|
|
|
unsigned radioactive:1;
|
|
|
|
|
unsigned rxplmon:1;
|
|
|
|
|
unsigned remoted:1;
|
|
|
|
|
unsigned loopback:1;
|
|
|
|
|
unsigned rxpolarity:1;
|
|
|
|
|
unsigned txpolarity:1;
|
|
|
|
|
unsigned dcsrxpolarity:1;
|
|
|
|
|
unsigned dcstxpolarity:1;
|
|
|
|
|
unsigned lsdrxpolarity:1;
|
|
|
|
|
unsigned lsdtxpolarity:1;
|
|
|
|
|
unsigned txsettling:1;
|
|
|
|
|
unsigned smodeturnoff:1;
|
|
|
|
|
|
|
|
|
|
unsigned ctcssRxEnable:1;
|
|
|
|
|
unsigned ctcssTxEnable:1;
|
|
|
|
|
unsigned dcsRxEnable:1;
|
|
|
|
|
unsigned dcsTxEnable:1;
|
|
|
|
|
unsigned lmrRxEnable:1;
|
|
|
|
|
unsigned lmrTxEnable:1;
|
|
|
|
|
unsigned mdcRxEnable:1;
|
|
|
|
|
unsigned mdcTxEnable:1;
|
|
|
|
|
unsigned dstRxEnable:1;
|
|
|
|
|
unsigned dstTxEnable:1;
|
|
|
|
|
unsigned p25RxEnable:1;
|
|
|
|
|
unsigned p25TxEnable:1;
|
|
|
|
|
unsigned ax25Enable:1;
|
|
|
|
|
|
|
|
|
|
unsigned txCtcssInhibit:1;
|
|
|
|
|
|
|
|
|
|
unsigned rxkeyed:1;
|
|
|
|
|
unsigned rxhalted:1;
|
|
|
|
|
unsigned txhalted:1;
|
|
|
|
|
unsigned pptp_p1:1;
|
|
|
|
|
unsigned pptp_p2:1;
|
|
|
|
|
unsigned tuning:1;
|
|
|
|
|
unsigned pttwas:1;
|
|
|
|
|
}b;
|
|
|
|
|
|
|
|
|
|
i16 *pRxDemod; // buffers
|
|
|
|
|
i16 *pRxBase; // decimated lpf input
|
|
|
|
|
i16 *pRxNoise;
|
|
|
|
@ -463,7 +849,10 @@ typedef struct t_pmr_chan
|
|
|
|
|
i16 *pRxLsdLimit; // LSD Limited
|
|
|
|
|
i16 *pRxCtcss; //
|
|
|
|
|
i16 *pRxSquelch;
|
|
|
|
|
i16 *prxVoxMeas;
|
|
|
|
|
i16 *prxMeasure;
|
|
|
|
|
|
|
|
|
|
i16 *pTxInput; // input data
|
|
|
|
|
i16 *pTxBase; // input data
|
|
|
|
|
i16 *pTxHpf;
|
|
|
|
|
i16 *pTxPreEmp;
|
|
|
|
@ -474,11 +863,6 @@ typedef struct t_pmr_chan
|
|
|
|
|
i16 *pTxMod; // upsampled, low pass filtered
|
|
|
|
|
|
|
|
|
|
i16 *pTxOut; //
|
|
|
|
|
|
|
|
|
|
i16 *pTxPttIn;
|
|
|
|
|
i16 *pTxPttOut;
|
|
|
|
|
i16 *pTxHang;
|
|
|
|
|
i16 *pTxCode;
|
|
|
|
|
|
|
|
|
|
i16 *pSigGen0;
|
|
|
|
|
i16 *pSigGen1;
|
|
|
|
@ -488,6 +872,12 @@ typedef struct t_pmr_chan
|
|
|
|
|
|
|
|
|
|
i16 *pNull;
|
|
|
|
|
|
|
|
|
|
#if XPMR_DEBUG0 == 1
|
|
|
|
|
|
|
|
|
|
i16 *pRxLsdCen;
|
|
|
|
|
|
|
|
|
|
i16 *pTstTxOut;
|
|
|
|
|
|
|
|
|
|
i16 *prxDebug; // consolidated debug buffer
|
|
|
|
|
i16 *ptxDebug; // consolidated debug buffer
|
|
|
|
|
|
|
|
|
@ -501,23 +891,23 @@ typedef struct t_pmr_chan
|
|
|
|
|
i16 *ptxDebug2;
|
|
|
|
|
i16 *ptxDebug3;
|
|
|
|
|
|
|
|
|
|
t_dec_ctcss *rxCtcss;
|
|
|
|
|
|
|
|
|
|
i16 clamplitudeDcs;
|
|
|
|
|
i16 centerDcs;
|
|
|
|
|
u32 dcsBlankingTimer;
|
|
|
|
|
i16 dcsDecode; // current dcs decode value
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
i16 clamplitudeLsd;
|
|
|
|
|
i16 centerLsd;
|
|
|
|
|
t_decLsd decLsd[2]; // for both polarities
|
|
|
|
|
i16 numDebugChannels;
|
|
|
|
|
|
|
|
|
|
t_sdbg *sdbg;
|
|
|
|
|
|
|
|
|
|
} t_pmr_chan;
|
|
|
|
|
|
|
|
|
|
static i16 TxTestTone(t_pmr_chan *pChan, i16 function);
|
|
|
|
|
/*
|
|
|
|
|
function prototype declarations
|
|
|
|
|
*/
|
|
|
|
|
void strace(i16 point, t_sdbg *sdbg, i16 index, i16 value);
|
|
|
|
|
void strace2(t_sdbg *sdbg);
|
|
|
|
|
|
|
|
|
|
static i16 TxTestTone(t_pmr_chan *pChan, i16 function);
|
|
|
|
|
t_pmr_chan *createPmrChannel(t_pmr_chan *tChan, i16 numSamples);
|
|
|
|
|
t_pmr_sps *createPmrSps(void);
|
|
|
|
|
t_pmr_sps *createPmrSps(t_pmr_chan *pChan);
|
|
|
|
|
i16 destroyPmrChannel(t_pmr_chan *pChan);
|
|
|
|
|
i16 destroyPmrSps(t_pmr_sps *pSps);
|
|
|
|
|
i16 pmr_rx_frontend(t_pmr_sps *mySps);
|
|
|
|
@ -531,10 +921,28 @@ i16 SoftLimiter(t_pmr_sps *mySps);
|
|
|
|
|
i16 SigGen(t_pmr_sps *mySps);
|
|
|
|
|
i16 pmrMixer(t_pmr_sps *mySps);
|
|
|
|
|
i16 DelayLine(t_pmr_sps *mySps);
|
|
|
|
|
i16 PmrRx(t_pmr_chan *PmrChan, i16 *input, i16 *output);
|
|
|
|
|
i16 PmrTx(t_pmr_chan *PmrChan, i16 *input, i16 *output);
|
|
|
|
|
|
|
|
|
|
i16 PmrRx(t_pmr_chan *PmrChan, i16 *input, i16 *outputrx, i16 *outputtx );
|
|
|
|
|
i16 PmrTx(t_pmr_chan *PmrChan, i16 *input);
|
|
|
|
|
|
|
|
|
|
i16 string_parse(char *src, char **dest, char ***ptrs);
|
|
|
|
|
i16 code_string_parse(t_pmr_chan *pChan);
|
|
|
|
|
|
|
|
|
|
i16 CtcssFreqIndex(float freq);
|
|
|
|
|
i16 MeasureBlock(t_pmr_sps *mySps);
|
|
|
|
|
|
|
|
|
|
void dedrift (t_pmr_chan *pChan);
|
|
|
|
|
void dedrift_write (t_pmr_chan *pChan, i16 *src);
|
|
|
|
|
|
|
|
|
|
void ppspiout (u32 spidata);
|
|
|
|
|
void progdtx (t_pmr_chan *pChan);
|
|
|
|
|
void ppbinout (u8 chan);
|
|
|
|
|
|
|
|
|
|
#if XPMR_PPTP == 1
|
|
|
|
|
void pptp_init (void);
|
|
|
|
|
void pptp_write (i16 bit, i16 state);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif /* ! XPMR_H */
|
|
|
|
|
|
|
|
|
|
/* end of file */
|
|
|
|
|