mirror of https://github.com/asterisk/asterisk
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							952 lines
						
					
					
						
							21 KiB
						
					
					
				
			
		
		
	
	
							952 lines
						
					
					
						
							21 KiB
						
					
					
				| /*
 | |
|  * 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 */
 | |
| 
 | |
| 
 | |
| 
 |