123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952 |
- /*
- * xpmr.h - for Xelatec Private Mobile Radio Processes
- *
- * All Rights Reserved. Copyright (C)2007, Xelatec, LLC
- *
- * 20070808 1235 Steven Henke, W9SH, sph@xelatec.com
- *
- * 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.
- *
- */
- /*! \file
- *
- * \brief Private Land Mobile Radio Channel Voice and Signaling Processor
- *
- * \author Steven Henke, W9SH <sph@xelatec.com> Xelatec, LLC
- */
- #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 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 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
- #define u8 u_int8_t
- #define i16 int16_t
- #define u16 u_int16_t
- #define i32 int32_t
- #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 // undsoweiter
- #define M_Q20 0x00100000 // 1048576
- #define M_Q19 0x00080000 // 524288
- #define M_Q18 0x00040000 // 262144
- #define M_Q17 0x00020000 // 131072
- #define M_Q16 0x00010000 // 65536
- #define M_Q15 0x00008000 // 32768
- #define M_Q14 0x00004000 // 16384
- #define M_Q13 0x00002000 // 8182
- #define M_Q12 0x00001000 // 4096
- #define M_Q11 0x00000800 // 2048
- #define M_Q10 0x00000400 // 1024
- #define M_Q9 0x00000200 // 512
- #define M_Q8 0x00000100 // 256
- #define M_Q7 0x00000080 // 128
- #define M_Q6 0x00000040 // 64
- #define M_Q5 0x00000020 // 32
- #define M_Q4 0x00000010 // 16
- #define M_Q3 0x00000008 // 16
- #define M_Q2 0x00000004 // 16
- #define M_Q1 0x00000002 // 16
- #define M_Q0 0x00000001 // 16
- #define RADIANS_PER_CYCLE (2*M_PI)
- #define SAMPLE_RATE_INPUT 48000
- #define SAMPLE_RATE_NETWORK 8000
- #define SAMPLES_PER_BLOCK 160
- #define MS_PER_FRAME 20
- #define SAMPLES_PER_MS 8
- #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
- #define CTCSS_DETECT_POINT 1989
- #define CTCSS_HYSTERSIS 200
- #define CTCSS_TURN_OFF_TIME 160 // ms
- #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};
- enum {CD_IGNORE,CD_XPMR_NOISE,CD_XPMR_VOX,CD_HID,CD_HID_INVERT};
- enum {SD_IGNORE,SD_HID,SD_HID_INVERT,SD_XPMR}; // no,external,externalinvert,software
- enum {RX_KEY_CARRIER,RX_KEY_CARRIER_CODE};
- 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
- */
- typedef struct
- {
- i16 counter; // counter to next sample
- i16 counterFactor; // full divisor used to increment counter
- i16 binFactor;
- i16 fudgeFactor;
- i16 peak; // peak amplitude now maw sph now
- i16 enabled;
- i16 state; // dead, running, error
- i16 zIndex; // z bucket index
- i16 z[4];
- i16 zi;
- i16 dvu;
- i16 dvd;
- i16 zd;
- i16 setpt;
- i16 hyst;
- i16 decode;
- i16 diffpeak;
- 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; // source data
- i16 clamplitude;
- i16 center;
- i16 decode; // current ctcss decode index
- i32 BlankingTimer;
- u32 TurnOffTimer;
- 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];
- i8 numrxcodes;
- i16 rxCtcssMap[CTCSS_NUM_CODES];
- char *rxctcss[CTCSS_NUM_CODES]; // pointers to each tone in string above
- char *txctcss[CTCSS_NUM_CODES];
- i32 txctcssdefault_index;
- float txctcssdefault_value;
- struct{
- unsigned valid:1;
- }b;
- } t_dec_ctcss;
- /*
- Low Speed Data
- */
- /*
- general purpose pmr signal processing element
- */
- struct t_pmr_chan;
- typedef struct t_pmr_sps
- {
- i16 index; // unique to each instance
- i16 enabled; // enabled/disabled
- struct t_pmr_chan *parentChan;
-
- i16 *source; // source buffer
- i16 *sourceB; // source buffer B
- i16 *sink; // sink buffer
- i16 numChanOut; // allows output direct to interleaved buffer
- i16 selChanOut;
- i32 ticks;
- i32 timer;
- i32 count;
- void *buff; // this structure's internal buffer
- i16 *debugBuff0; // debug buffer
- i16 *debugBuff1; // debug buffer
- i16 *debugBuff2; // debug buffer
- i16 *debugBuff3; // debug buffer
- i16 nSamples; // number of samples in the buffer
- u32 buffSize; // buffer maximum index
- u32 buffInIndex; // index to current input point
- u32 buffOutIndex; // index to current output point
- u32 buffLead; // lead of input over output through cb
- i16 decimate; // decimation or interpolation factor (could be put in coef's)
- i16 interpolate;
- i16 decimator; // like the state this must be saved between calls (could be put in x's)
- u32 sampleRate; // in Hz for elements in this structure
- u32 freq; // in 0.1 Hz
- i16 measPeak; // do measure Peak
- i16 amax; // buffer amplitude maximum
- i16 amin; // buffer amplitude minimum
- i16 apeak; // buffer amplitude peak value (peak to peak)/2
- i16 setpt; // amplitude set point for amplitude comparator
- i16 hyst; // hysterysis for amplitude comparator
- i16 compOut; // amplitude comparator output
- i32 discounteru; // amplitude detector integrator discharge counter upper
- i32 discounterl; // amplitude detector integrator discharge counter lower
- i32 discfactor; // amplitude detector integrator discharge factor
- 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
- i16 delay;
- i16 decode;
- i32 inputGain; // apply to input data ? in Q7.8 format
- i32 inputGainB; // apply to input data ? in Q7.8 format
- i32 outputGain; // apply to output data ? in Q7.8 format
- i16 mixOut;
- i16 monoOut;
- i16 filterType; // iir, fir, 1, 2, 3, 4 ...
- i16 (*sigProc)(struct t_pmr_sps *sps); // function to call
- i32 calcAdjust; // final adjustment
- i16 nx; // number of x history elements
- i16 ncoef; // number of coefficients
- i16 size_x; // size of each x history element
- i16 size_coef; // size of each coefficient
- void *x; // history registers
- void *x2; // history registers, 2nd bank
- void *coef; // coefficients
- void *coef2; // coefficients 2
- void *nextSps; // next Sps function
- } 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;
- i32 inputSampleRate; // in S/s 48000
- i32 baseSampleRate; // in S/s 8000
- 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
- i16 rxSqHyst; // carrier squelch hysterysis
- i16 rxRssi; // current Rssi level
- i16 rxQuality; // signal quality metric
- i16 rxCarrierDetect; // carrier detect
- i16 rxCdType;
- i16 rxSqVoxAdj;
- i16 rxExtCarrierDetect;
- i32 inputBlanking; // Tx pulse eliminator
- i16 rxDemod; // see enum
- i16 txMod; //
- i16 rxNoiseSquelchEnable;
- i16 rxHpfEnable;
- i16 rxDeEmpEnable;
- i16 rxCenterSlicerEnable;
- i16 rxCtcssDecodeEnable;
- i16 rxDcsDecodeEnable;
- i16 rxDelayLineEnable;
- i16 txHpfEnable;
- i16 txLimiterEnable;
- i16 txPreEmpEnable;
- i16 txLpfEnable;
- char radioDuplex;
- 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;
- i32 txScramFreq;
- i32 rxScramFreq;
- i16 gainVoice;
- i16 gainSubAudible;
- i16 txMixA; // Off, Ctcss, Voice, Composite
- i16 txMixB; // Off, Ctcss, Voice, Composite
-
- i16 rxMuting;
- i16 rxCpuSaver;
- i16 txCpuSaver;
- i8 rxSqMode; // 0 open, 1 carrier, 2 coded
- i8 cdMethod;
- i16 rxSquelchPoint;
- i16 rxCarrierPoint;
- i16 rxCarrierHyst;
-
- i16 txCtcssTocShift;
- i16 txCtcssTocTime;
- i8 txTocType;
- 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
- i16 rxCompand; //
-
- i16 txEqRight; // muted, flat, pre-emp limited filtered
- i16 txEqLeft;
- i16 txPotRight; //
- i16 txPotLeft; //
- i16 rxPotRight; //
- i16 rxPotLeft; //
- i16 function;
- i16 txState; // off,settling,on,hangtime,turnoff
- i16 spsIndex;
- 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;
- t_pmr_sps *spsDelayLine; // Last signal processing struct
- t_pmr_sps *spsRxOut; // Last signal processing struct
- t_pmr_sps *spsTx; // 1st signal processing struct
-
- 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
- i32 rxVoxTimer; // Vox Hang Timer
- i16 *prxSquelchAdjust;
- // i16 *prxNoiseMeasure; // for autotune
- // i32 *prxNoiseAdjust;
- i16 *prxVoiceMeasure;
- i32 *prxVoiceAdjust;
-
- i16 *prxCtcssMeasure;
- i32 *prxCtcssAdjust;
-
- i16 *ptxVoiceAdjust; // from calling application
- i32 *ptxCtcssAdjust; // from calling application
- 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;
- i16 *pRxLsd; // subaudible only
- i16 *pRxHpf; // subaudible removed
- i16 *pRxDeEmp; // EIA Audio
- i16 *pRxSpeaker; // EIA Audio
- i16 *pRxDcTrack; // DC Restored LSD
- i16 *pRxLsdLimit; // LSD Limited
- i16 *pRxCtcss; //
- i16 *pRxSquelch;
- i16 *prxVoxMeas;
- i16 *prxMeasure;
- i16 *pTxInput; // input data
- i16 *pTxBase; // input data
- i16 *pTxHpf;
- i16 *pTxPreEmp;
- i16 *pTxLimiter;
- i16 *pTxLsd;
- i16 *pTxLsdLpf;
- i16 *pTxComposite;
- i16 *pTxMod; // upsampled, low pass filtered
-
- i16 *pTxOut; //
- i16 *pSigGen0;
- i16 *pSigGen1;
- i16 *pAlt0;
- i16 *pAlt1;
- i16 *pNull;
- #if XPMR_DEBUG0 == 1
- i16 *pRxLsdCen;
- i16 *pTstTxOut;
- i16 *prxDebug; // consolidated debug buffer
- i16 *ptxDebug; // consolidated debug buffer
- i16 *prxDebug0;
- i16 *prxDebug1;
- i16 *prxDebug2;
- i16 *prxDebug3;
- i16 *ptxDebug0;
- i16 *ptxDebug1;
- i16 *ptxDebug2;
- i16 *ptxDebug3;
- #endif
- i16 numDebugChannels;
- t_sdbg *sdbg;
- } t_pmr_chan;
- /*
- 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(t_pmr_chan *pChan);
- i16 destroyPmrChannel(t_pmr_chan *pChan);
- i16 destroyPmrSps(t_pmr_sps *pSps);
- i16 pmr_rx_frontend(t_pmr_sps *mySps);
- i16 pmr_gp_fir(t_pmr_sps *mySps);
- i16 pmr_gp_iir(t_pmr_sps *mySps);
- i16 gp_inte_00(t_pmr_sps *mySps);
- i16 gp_diff(t_pmr_sps *mySps);
- i16 CenterSlicer(t_pmr_sps *mySps);
- i16 ctcss_detect(t_pmr_chan *pmrChan);
- 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 *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 */
|