[svn-commits] jdixon: branch jdixon/chan_usbradio-1.4 r150886 - /team/jdixon/chan_usbradio-...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Oct 17 21:52:53 CDT 2008


Author: jdixon
Date: Fri Oct 17 21:52:52 2008
New Revision: 150886

URL: http://svn.digium.com/view/asterisk?view=rev&rev=150886
Log:
Added new-newkey mode and phone VOX mode for remote bases

Modified:
    team/jdixon/chan_usbradio-1.4/apps/app_rpt.c

Modified: team/jdixon/chan_usbradio-1.4/apps/app_rpt.c
URL: http://svn.digium.com/view/asterisk/team/jdixon/chan_usbradio-1.4/apps/app_rpt.c?view=diff&rev=150886&r1=150885&r2=150886
==============================================================================
--- team/jdixon/chan_usbradio-1.4/apps/app_rpt.c (original)
+++ team/jdixon/chan_usbradio-1.4/apps/app_rpt.c Fri Oct 17 21:52:52 2008
@@ -22,7 +22,7 @@
 /*! \file
  *
  * \brief Radio Repeater / Remote Base program 
- *  version 0.152 10/6/08 
+ *  version 0.153 10/17/08 
  * 
  * \author Jim Dixon, WB6NIL <jim at lambdatel.com>
  *
@@ -176,7 +176,6 @@
 #define ast_strdup strdup
 #endif
 
-
 #define	MAXDTMF 32
 #define	MAXMACRO 2048
 #define	MAXLINKLIST 512
@@ -284,6 +283,8 @@
 #define	VOX_RECOVER_MS 500
 #define	SIMPLEX_PATCH_DELAY 25
 #define	SIMPLEX_PHONE_DELAY 25
+
+#define	RX_LINGER_TIME 50
 
 #define	STATPOST_PROGRAM "/usr/bin/wget,-q,--output-document=/dev/null,--no-check-certificate"
 
@@ -382,7 +383,7 @@
 /*! Stop the tones from playing */
 void ast_playtones_stop(struct ast_channel *chan);
 
-static  char *tdesc = "Radio Repeater / Remote Base  version 0.152  10/6/2008";
+static  char *tdesc = "Radio Repeater / Remote Base  version 0.153  10/17/2008";
 
 static char *app = "Rpt";
 
@@ -466,6 +467,7 @@
 
 char *discstr = "!!DISCONNECT!!";
 char *newkeystr = "!NEWKEY!";
+char *newkey1str = "!NEWKEY1!";
 static char *remote_rig_ft897="ft897";
 static char *remote_rig_rbi="rbi";
 static char *remote_rig_kenwood="kenwood";
@@ -483,7 +485,7 @@
 LOCAL_USER_DECL;
 #endif
 
-#define	MSWAIT 200
+#define	MSWAIT 20
 #define	HANGTIME 5000
 #define	TOTIME 180000
 #define	IDTIME 300000
@@ -560,6 +562,7 @@
 	long 	retrytimer;
 	long	retxtimer;
 	long	rerxtimer;
+	long	rxlingertimer;
 	int	retries;
 	int	max_retries;
 	int	reconnects;
@@ -846,10 +849,16 @@
 	int keyposttimer;			
 	char newkey;
 	char inpadtest;
+	long rxlingertimer;
 #ifdef OLD_ASTERISK
 	AST_LIST_HEAD(, ast_frame) txq;
 #else
 	AST_LIST_HEAD_NOLOCK(, ast_frame) txq;
+#endif
+#ifdef OLD_ASTERISK
+	AST_LIST_HEAD(, ast_frame) rxq;
+#else
+	AST_LIST_HEAD_NOLOCK(, ast_frame) rxq;
 #endif
 	char txrealkeyed;
 #ifdef	__RPT_NOTCH
@@ -1171,6 +1180,9 @@
 		}
 	} else v->enacount = 0;
 	return(v->lastvox);
+
+
+
 }
 
 
@@ -5779,10 +5791,15 @@
 static void send_newkey(struct ast_channel *chan)
 {
 
+	ast_sendtext(chan,newkey1str);
+	return;
+}
+
+static void send_old_newkey(struct ast_channel *chan)
+{
 	ast_sendtext(chan,newkeystr);
 	return;
 }
-
 
 /* 
  * Connect a link 
@@ -6936,7 +6953,16 @@
         }
         if (!strcmp(tmp,newkeystr))
         {
-		mylink->newkey = 1;
+		if (!mylink->newkey)
+		{
+			send_old_newkey(mylink->chan);
+			mylink->newkey = 1;
+		}
+                return;
+        }
+        if (!strcmp(tmp,newkey1str))
+        {
+		mylink->newkey = 2;
                 return;
         }
 	if (tmp[0] == 'L')
@@ -10640,7 +10666,16 @@
 	if (!strcmp(tmp,discstr)) return 0;
         if (!strcmp(tmp,newkeystr))
         {
-		myrpt->newkey = 1;
+		if (!myrpt->newkey) 
+		{
+			send_old_newkey(myrpt->rxchannel);
+			myrpt->newkey = 1;
+		}
+                return 0;
+        }
+        if (!strcmp(tmp,newkey1str))
+        {
+		myrpt->newkey = 2;
                 return 0;
         }
 
@@ -12064,6 +12099,27 @@
 		while(l != &myrpt->links)
 		{
 			int myrx,mymaxct;
+			
+			if (l->rxlingertimer) l->rxlingertimer -= elap;
+			if (l->rxlingertimer < 0) l->rxlingertimer = 0;
+
+			if ((l->newkey == 2) && l->lastrealrx && (!l->rxlingertimer))
+			{
+				l->lastrealrx = 0;
+				l->rerxtimer = 0;
+				if (l->lastrx1)
+				{
+					if (myrpt->p.archivedir)
+					{
+						char str[100];
+							sprintf(str,"RXUNKEY,%s",l->name);
+						donodelog(myrpt,str);
+					}
+					l->lastrx1 = 0;
+					if(myrpt->p.duplex) 
+						rpt_telemetry(myrpt,LINKUNKEY,l);
+				}
+			}				
 
 			if (l->voxtotimer) l->voxtotimer -= elap;
 			if (l->voxtotimer < 0) l->voxtotimer = 0;
@@ -12122,7 +12178,7 @@
 							myrpt->name,lstr,l->name);
 				}
 			}
-			if (l->newkey)
+			if (l->newkey == 1)
 			{
 				if ((l->retxtimer += elap) >= REDUNDANT_TX_TIME)
 				{
@@ -12805,7 +12861,7 @@
 				{
 					if (totx)
 					{
-						ast_indicate(l->chan,AST_CONTROL_RADIO_KEY);
+						if (l->newkey < 2) ast_indicate(l->chan,AST_CONTROL_RADIO_KEY);
 					}
 					else
 					{
@@ -12904,6 +12960,23 @@
 				{
 					int ismuted,n1;
 
+					l->rxlingertimer = RX_LINGER_TIME;
+					if ((l->newkey == 2) && (!l->lastrealrx))
+					{
+						l->lastrealrx = 1;
+						l->rerxtimer = 0;
+						if (!l->lastrx1)
+						{
+							if (myrpt->p.archivedir)
+							{
+								char str[100];
+
+								sprintf(str,"RXKEY,%s",l->name);
+								donodelog(myrpt,str);
+							}
+							l->lastrx1 = 1;
+						}
+					}
 					if (((l->phonemode) && (l->phonevox)) || 
 					    (!strncasecmp(l->chan->name,"echolink",8)) ||
 						(!strncasecmp(l->chan->name,"irlp",4)))
@@ -13049,7 +13122,7 @@
 							l->reconnects++;
 					}
 					/* if RX key */
-					if (f->subclass == AST_CONTROL_RADIO_KEY)
+					if ((f->subclass == AST_CONTROL_RADIO_KEY) && (l->newkey < 2))
 					{
 						if (debug == 7 ) printf("@@@@ rx key\n");
 						l->lastrealrx = 1;
@@ -13069,6 +13142,7 @@
 					/* if RX un-key */
 					if (f->subclass == AST_CONTROL_RADIO_UNKEY)
 					{
+
 						if (debug == 7) printf("@@@@ rx un-key\n");
 						l->lastrealrx = 0;
 						l->rerxtimer = 0;
@@ -13175,7 +13249,9 @@
 				}
 				if (f->frametype == AST_FRAME_VOICE)
 				{
-					if (l->chan) ast_write(l->chan,f);
+					if (l->chan && ((l->newkey < 2) || l->lasttx ||
+					    strncasecmp(l->chan->name,"IAX",3)))
+						ast_write(l->chan,f);
 				}
 				if (f->frametype == AST_FRAME_CONTROL)
 				{
@@ -13552,7 +13628,7 @@
 
 static int rpt_exec(struct ast_channel *chan, void *data)
 {
-	int res=-1,i,rem_totx,rem_rx,remkeyed,n,phone_mode = 0;
+	int res=-1,i,x,rem_totx,rem_rx,remkeyed,n,phone_mode = 0;
 	int iskenwood_pci4,authtold,authreq,setting,notremming,reming;
 	int ismuted,dtmfed,phone_vox = 0, phone_monitor = 0;
 #ifdef	OLD_ASTERISK
@@ -13560,7 +13636,7 @@
 #endif
 	char tmp[256], keyed = 0,keyed1 = 0;
 	char *options,*stringp,*tele,c,*altp,*memp;
-	char sx[320],*sy;
+	char sx[320],*sy,myfirst;
 	struct	rpt *myrpt;
 	struct ast_frame *f,*f1,*f2;
 	struct ast_channel *who;
@@ -13568,7 +13644,7 @@
 	struct	rpt_link *l;
 	ZT_CONFINFO ci;  /* conference info */
 	ZT_PARAMS par;
-	int ms,elap,nullfd;
+	int ms,elap,nullfd,n1,myrx;
 	time_t t,last_timeout_warning;
 	struct	zt_radio_param z;
 	struct rpt_tele *telem;
@@ -14190,6 +14266,7 @@
 #ifdef	OLD_ASTERISK
 	LOCAL_USER_ADD(u);
 #endif
+	voxinit_rpt(myrpt,1);
 	rpt_mutex_unlock(&myrpt->lock);
 	/* find our index, and load the vars initially */
 	for(i = 0; i < nrpts; i++)
@@ -14500,6 +14577,7 @@
 	if (myrpt->rxchannel != myrpt->txchannel)
 		cs[n++] = myrpt->txchannel;
 	if (!phone_mode) send_newkey(chan);
+	myfirst = 0;
 	/* start un-locked */
 	for(;;) 
 	{
@@ -14618,6 +14696,37 @@
 			if (myrpt->dtmf_local_timer > 1) myrpt->dtmf_local_timer -= elap;
 			if (myrpt->dtmf_local_timer < 1) myrpt->dtmf_local_timer = 1;
 		}
+		if (myrpt->voxtotimer) myrpt->voxtotimer -= elap;
+		if (myrpt->voxtotimer < 0) myrpt->voxtotimer = 0;
+		myrx = keyed;
+		if (phone_mode && phone_vox)
+		{
+			myrx = (!AST_LIST_EMPTY(&myrpt->rxq));
+			if (myrpt->voxtotimer <= 0)
+			{
+				if (myrpt->voxtostate)
+				{
+					myrpt->voxtotimer = myrpt->p.voxtimeout_ms;
+					myrpt->voxtostate = 0;
+				}				
+				else
+				{
+					myrpt->voxtotimer = myrpt->p.voxrecover_ms;
+					myrpt->voxtostate = 1;
+				}
+			}
+			if (!myrpt->voxtostate)
+				myrx = myrx || myrpt->wasvox ;
+		}
+		keyed = myrx;
+		if (myrpt->rxlingertimer) myrpt->rxlingertimer -= elap;
+		if (myrpt->rxlingertimer < 0) myrpt->rxlingertimer = 0;
+
+		if ((myrpt->newkey == 2) && keyed && (!myrpt->rxlingertimer))
+		{
+			myrpt->rerxtimer = 0;
+			keyed = 0;
+		}
 		rpt_mutex_lock(&myrpt->lock);
 		do_dtmf_local(myrpt,0);
 		rpt_mutex_unlock(&myrpt->lock);
@@ -14656,7 +14765,7 @@
 		if (rem_rx && (!myrpt->remoterx))
 		{
 			myrpt->remoterx = 1;
-			ast_indicate(chan,AST_CONTROL_RADIO_KEY);
+			if (myrpt->newkey < 2) ast_indicate(chan,AST_CONTROL_RADIO_KEY);
 		}
 		if ((!rem_rx) && (myrpt->remoterx))
 		{
@@ -14677,7 +14786,7 @@
 				break; /* if not logged in, hang up after a time */
 			}
 		}
-		if (myrpt->newkey)
+		if (myrpt->newkey == 1)
 		{
 			if ((myrpt->retxtimer += elap) >= REDUNDANT_TX_TIME)
 			{
@@ -14784,6 +14893,58 @@
 			}
 			if (f->frametype == AST_FRAME_VOICE)
 			{
+				if (myrpt->newkey == 2)
+				{
+					myrpt->rxlingertimer = RX_LINGER_TIME;
+					if (!keyed)
+					{
+						keyed = 1;
+						myrpt->rerxtimer = 0;
+					}
+				}
+				if (phone_mode && phone_vox)
+				{
+					n1 = dovox(&myrpt->vox,
+						f->data,f->datalen / 2);
+					if (n1 != myrpt->wasvox)
+					{
+						if (debug) ast_log(LOG_DEBUG,"Remote  vox %d\n",n1);
+						myrpt->wasvox = n1;
+						myrpt->voxtostate = 0;
+						if (n1) myrpt->voxtotimer = myrpt->p.voxtimeout_ms;
+						else myrpt->voxtotimer = 0;
+					}
+					if (n1)
+					{
+						if (!myfirst)
+						{
+						    x = 0;
+						    AST_LIST_TRAVERSE(&myrpt->rxq, f1,
+							frame_list) x++;
+						    for(;x < myrpt->p.simplexphonedelay; x++)
+						    {
+							f1 = ast_frdup(f);
+							memset(f1->data,0,f1->datalen);
+								AST_LIST_INSERT_TAIL(&myrpt->rxq,
+									f1,frame_list);
+						    }
+						    myfirst = 1;
+						}
+						f1 = ast_frdup(f);
+						AST_LIST_INSERT_TAIL(&myrpt->rxq,f1,frame_list);
+					} else myfirst = 0; 
+					x = 0;
+					AST_LIST_TRAVERSE(&myrpt->rxq, f1,frame_list) x++;
+					if (!x)
+					{
+						memset(f->data,0,f->datalen);
+					}
+					else
+					{
+						ast_frfree(f);
+						f = AST_LIST_REMOVE_HEAD(&myrpt->rxq,frame_list);
+					}
+				}
 				if (ioctl(chan->fds[0], ZT_GETCONFMUTE, &ismuted) == -1)
 				{
 					ismuted = 0;
@@ -14863,7 +15024,7 @@
 					break;
 				}
 				/* if RX key */
-				if (f->subclass == AST_CONTROL_RADIO_KEY)
+				if ((f->subclass == AST_CONTROL_RADIO_KEY) && (myrpt->newkey < 2))
 				{
 					if (debug == 7) printf("@@@@ rx key\n");
 					keyed = 1;
@@ -14942,7 +15103,9 @@
 			}
 			if (f->frametype == AST_FRAME_VOICE)
 			{
-				ast_write(chan,f);
+				if ((myrpt->newkey < 2) || myrpt->remoterx ||
+				    strncasecmp(chan->name,"IAX",3))
+					ast_write(chan,f);
 			}
 			if (f->frametype == AST_FRAME_CONTROL)
 			{




More information about the svn-commits mailing list