[asterisk-commits] jdixon: branch jdixon/chan_usbradio-1.4 r115604 - /team/jdixon/chan_usbradio-...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sun May 11 18:16:19 CDT 2008


Author: jdixon
Date: Sun May 11 18:16:19 2008
New Revision: 115604

URL: http://svn.digium.com/view/asterisk?view=rev&rev=115604
Log:
Update to version 0.114, added initial support for version 1.6 and other stuff

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=115604&r1=115603&r2=115604
==============================================================================
--- team/jdixon/chan_usbradio-1.4/apps/app_rpt.c (original)
+++ team/jdixon/chan_usbradio-1.4/apps/app_rpt.c Sun May 11 18:16:19 2008
@@ -1,3 +1,4 @@
+/* #define	NEW_ASTERISK */
 /* #define OLD_ASTERISK */
 /*
  * Asterisk -- An open source telephony toolkit.
@@ -20,7 +21,7 @@
 /*! \file
  *
  * \brief Radio Repeater / Remote Base program 
- *  version 0.113 5/11/08 
+ *  version 0.112 4/13/08 2055 EDT
  * 
  * \author Jim Dixon, WB6NIL <jim at lambdatel.com>
  *
@@ -363,12 +364,17 @@
 #include "asterisk/manager.h"
 #include <termios.h>
 
+#ifdef	NEW_ASTERISK
+struct ast_flags config_flags = { CONFIG_FLAG_WITHCOMMENTS };
+#endif
+
+
 /* Start a tone-list going */
 int ast_playtones_start(struct ast_channel *chan, int vol, const char* tonelist, int interruptible);
 /*! Stop the tones from playing */
 void ast_playtones_stop(struct ast_channel *chan);
 
-static  char *tdesc = "Radio Repeater / Remote Base  version 0.113  5/11/2008";
+static  char *tdesc = "Radio Repeater / Remote Base  version 0.112  4/13/2008";
 
 static char *app = "Rpt";
 
@@ -1216,6 +1222,8 @@
 "Usage: rpt cmd <nodename> <cmd-name> <cmd-index> <cmd-args.\n"
 "       Send a command to a node.\n        i.e. rpt cmd 2000 ilink 3 2001\n";
 
+#ifndef	NEW_ASTERISK
+
 static struct ast_cli_entry  cli_debug =
         { { "rpt", "debug", "level" }, rpt_do_debug, 
 		"Enable app_rpt debugging", debug_usage };
@@ -1259,6 +1267,8 @@
 static struct ast_cli_entry  cli_cmd =
         { { "rpt", "cmd" }, rpt_do_cmd,
 		"Execute a DTMF function", cmd_usage };
+
+#endif
 
 /*
 * Telemetry defaults
@@ -1528,7 +1538,11 @@
                        l = l->next;
                        continue;
                }
+#ifdef	NEW_ASTERISK
+               if (l->chan) ast_senddigit(l->chan,c,0);
+#else
                if (l->chan) ast_senddigit(l->chan,c);
+#endif
                l = l->next;
        }
        return;
@@ -1592,6 +1606,9 @@
 	/* if at timeout */
 	if (myrpt->dtmf_local_timer == 1)
 	{
+		if(debug > 6)
+			ast_log(LOG_NOTICE,"time out dtmf_local_timer=%i\n",myrpt->dtmf_local_timer);
+
 		/* if anything in the string */
 		if (myrpt->dtmf_local_str[0])
 		{
@@ -1988,7 +2005,11 @@
 	if (mystat.st_mtime > last)
 	{
 		if (ourcfg) ast_config_destroy(ourcfg);
+#ifdef	NEW_ASTERISK
+		ourcfg = ast_config_load(myrpt->p.extnodefile,config_flags);
+#else
 		ourcfg = ast_config_load(myrpt->p.extnodefile);
+#endif
 		/* if file not there, just bail */
 		if (!ourcfg)
 		{
@@ -2144,6 +2165,18 @@
 
 */
 
+#ifdef	NEW_ASTERISK
+static void rpt_localtime( time_t * t, struct ast_tm *lt)
+{
+struct timeval tv;
+
+	tv.tv_sec = *t;
+	tv.tv_usec = 0;
+	ast_localtime(&tv, lt, NULL);
+
+}
+
+#else
 static void rpt_localtime( time_t * t, struct tm *lt)
 {
 #ifdef OLD_ASTERISK
@@ -2152,6 +2185,8 @@
 	ast_localtime(t, lt, NULL);
 #endif
 }
+#endif
+
 
 /* Retrieve an int from a config file */
                                                                                 
@@ -2198,7 +2233,11 @@
 			(init) ? "Loading initial" : "Re-Loading",rpt_vars[n].name);
 	ast_mutex_lock(&rpt_vars[n].lock);
 	if (rpt_vars[n].cfg) ast_config_destroy(rpt_vars[n].cfg);
+#ifdef	NEW_ASTERISK
+	cfg = ast_config_load("rpt.conf",config_flags);
+#else
 	cfg = ast_config_load("rpt.conf");
+#endif
 	if (!cfg) {
 		ast_mutex_unlock(&rpt_vars[n].lock);
  		ast_log(LOG_NOTICE, "Unable to open radio repeater configuration rpt.conf.  Radio Repeater disabled.\n");
@@ -3229,6 +3268,192 @@
 	return play_tone_pair(chan, 0, 0, duration, 0);
 }
 
+#ifdef	NEW_ASTERISK
+
+static char *res2cli(int r)
+
+{
+	switch (r)
+	{
+	    case RESULT_SUCCESS:
+		return(CLI_SUCCESS);
+	    case RESULT_SHOWUSAGE:
+		return(CLI_SHOWUSAGE);
+	    default:
+		return(CLI_FAILURE);
+	}
+}
+
+static char *handle_cli_debug(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt debug level";
+                e->usage = debug_usage;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_debug(a->fd,a->argc,a->argv));
+}
+
+static char *handle_cli_dump(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt dump level";
+                e->usage = dump_usage;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_dump(a->fd,a->argc,a->argv));
+}
+
+
+static char *handle_cli_stats(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt stats";
+                e->usage = dump_stats;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_stats(a->fd,a->argc,a->argv));
+}
+
+static char *handle_cli_nodes(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt nodes";
+                e->usage = dump_nodes;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_nodes(a->fd,a->argc,a->argv));
+}
+
+static char *handle_cli_local_nodes(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt localnodes";
+                e->usage = usage_local_nodes;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_local_nodes(a->fd,a->argc,a->argv));
+}
+
+static char *handle_cli_lstats(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt lstats";
+                e->usage = dump_lstats;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_lstats(a->fd,a->argc,a->argv));
+}
+
+static char *handle_cli_reload(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt reload";
+                e->usage = reload_usage;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_reload(a->fd,a->argc,a->argv));
+}
+
+static char *handle_cli_restart(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt restart";
+                e->usage = restart_usage;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_restart(a->fd,a->argc,a->argv));
+}
+
+static char *handle_cli_fun(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt fun";
+                e->usage = fun_usage;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_fun(a->fd,a->argc,a->argv));
+}
+
+static char *handle_cli_fun1(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt fun1";
+                e->usage = fun_usage;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_fun1(a->fd,a->argc,a->argv));
+}
+
+static char *handle_cli_cmd(struct ast_cli_entry *e,
+	int cmd, struct ast_cli_args *a)
+{
+        switch (cmd) {
+        case CLI_INIT:
+                e->command = "rpt cmd";
+                e->usage = cmd_usage;
+                return NULL;
+        case CLI_GENERATE:
+                return NULL;
+	}
+	return res2cli(rpt_do_cmd(a->fd,a->argc,a->argv));
+}
+
+static struct ast_cli_entry rpt_cli[] = {
+	AST_CLI_DEFINE(handle_cli_debug,"Enable app_rpt debugging"),
+	AST_CLI_DEFINE(handle_cli_dump,"Dump app_rpt structs for debugging"),
+	AST_CLI_DEFINE(handle_cli_stats,"Dump node statistics"),
+	AST_CLI_DEFINE(handle_cli_nodes,"Dump node list"),
+	AST_CLI_DEFINE(handle_cli_local_nodes,	"Dump list of local node numbers"),
+	AST_CLI_DEFINE(handle_cli_lstats,"Dump link statistics"),
+	AST_CLI_DEFINE(handle_cli_reload,"Reload app_rpt config"),
+	AST_CLI_DEFINE(handle_cli_restart,"Restart app_rpt"),
+	AST_CLI_DEFINE(handle_cli_fun,"Execute a DTMF function"),
+	AST_CLI_DEFINE(handle_cli_fun1,"Execute a DTMF function"),
+	AST_CLI_DEFINE(handle_cli_cmd,"Execute a DTMF function")
+};
+
+#endif
 
 static int send_morse(struct ast_channel *chan, char *string, int speed, int freq, int amplitude)
 {
@@ -3690,14 +3915,12 @@
 /*
 * Wait a configurable interval of time 
 */
-
-
 static void wait_interval(struct rpt *myrpt, int type, struct ast_channel *chan)
 {
 	int interval;
 	interval = get_wait_interval(myrpt, type);
 	if(debug)
-		ast_log(LOG_NOTICE," Delay interval = %d\n", interval);
+		ast_log(LOG_NOTICE,"Delay interval = %d\n", interval);
 	if(interval)
 		ast_safe_sleep(chan,interval);
 	if(debug)
@@ -3719,7 +3942,11 @@
 int id_malloc, vmajor, vminor, m;
 char *p,*ct,*ct_copy,*ident, *nodename,*cp;
 time_t t;
+#ifdef	NEW_ASTERISK
+struct ast_tm localtm;
+#else
 struct tm localtm;
+#endif
 char lbuf[MAXLINKLIST],*strs[MAXLINKLIST];
 int	i,ns,rbimode;
 char mhz[MAXREMSTR];
@@ -3735,14 +3962,14 @@
 	rpt_mutex_lock(&myrpt->lock);
 	nodename = ast_strdup(myrpt->name);
 	if(!nodename)
-        {
-                fprintf(stderr,"rpt:Sorry unable strdup nodename\n");
-                rpt_mutex_lock(&myrpt->lock);
-                remque((struct qelem *)mytele);
-                ast_log(LOG_NOTICE,"Telemetry thread aborted at line %d, mode: %d\n",__LINE__, mytele->mode); /*@@@@@@@@@@@*/
-                rpt_mutex_unlock(&myrpt->lock);
-                ast_free(mytele);
-                pthread_exit(NULL);
+	{
+	    fprintf(stderr,"rpt:Sorry unable strdup nodename\n");
+	    rpt_mutex_lock(&myrpt->lock);
+	    remque((struct qelem *)mytele);
+	    ast_log(LOG_NOTICE,"Telemetry thread aborted at line %d, mode: %d\n",__LINE__, mytele->mode); /*@@@@@@@@@@@*/
+	    rpt_mutex_unlock(&myrpt->lock);
+	    ast_free(mytele);
+	    pthread_exit(NULL);
 	}
 
 	if (myrpt->p.ident){
@@ -4985,6 +5212,9 @@
 pthread_attr_t attr;
 char *v1, *v2;
 
+	if(debug > 6)
+		ast_log(LOG_NOTICE,"mode=%i  data=%s\n",mode, (char *)data);
+
 	switch(mode)
 	{
 	    case UNKEY:
@@ -5316,7 +5546,11 @@
 			wf.subclass = myrpt->mydtmf;
 			rpt_mutex_unlock(&myrpt->lock);
 			ast_queue_frame(mychannel,&wf);
+#ifdef	NEW_ASTERISK
+			ast_senddigit(genchannel,myrpt->mydtmf,0);
+#else
 			ast_senddigit(genchannel,myrpt->mydtmf);
+#endif
 			rpt_mutex_lock(&myrpt->lock);
 			myrpt->mydtmf = 0;
 		}
@@ -5419,15 +5653,16 @@
 	return;
 }
 
-/* send newkey message */
+/* send newkey request */
 
 static void send_newkey(struct ast_channel *chan)
 {
 
-        ast_safe_sleep(chan,10);
-        ast_sendtext(chan,newkeystr);
-        return;
-}
+	ast_safe_sleep(chan,10);
+	ast_sendtext(chan,newkeystr);
+	return;
+}
+
 
 /* 
  * Connect a link 
@@ -6348,19 +6583,20 @@
 /*
 * Collect digits one by one until something matches
 */
-
 static int collect_function_digits(struct rpt *myrpt, char *digits, 
 	int command_source, struct rpt_link *mylink)
 {
-	int i;
+	int i,rv;
 	char *stringp,*action,*param,*functiondigits;
 	char function_table_name[30] = "";
 	char workstring[200];
 	
 	struct ast_variable *vp;
 	
-	if(debug)	
-		printf("@@@@ Digits collected: %s, source: %d\n", digits, command_source);
+	if (debug > 6) ast_log(LOG_NOTICE,"digits=%s  source=%d\n",digits, command_source);
+
+	//if(debug)	
+	//	printf("@@@@ Digits collected: %s, source: %d\n", digits, command_source);
 	
 	if (command_source == SOURCE_DPHONE) {
 		if (!myrpt->p.dphone_functions) return DC_INDETERMINATE;
@@ -6378,12 +6614,14 @@
 		strncpy(function_table_name, myrpt->p.link_functions, sizeof(function_table_name) - 1);
 	else
 		strncpy(function_table_name, myrpt->p.functions, sizeof(function_table_name) - 1);
+    /* find context for function table in rpt.conf file */
 	vp = ast_variable_browse(myrpt->cfg, function_table_name);
 	while(vp) {
 		if(!strncasecmp(vp->name, digits, strlen(vp->name)))
 			break;
 		vp = vp->next;
 	}	
+	/* if function context not found */
 	if(!vp) {
 		int n;
 
@@ -6426,7 +6664,9 @@
 		return DC_ERROR;
 	}
 	functiondigits = digits + strlen(vp->name);
-	return (*function_table[i].function)(myrpt, param, functiondigits, command_source, mylink);
+	rv=(*function_table[i].function)(myrpt, param, functiondigits, command_source, mylink);
+	if (debug > 6) ast_log(LOG_NOTICE,"rv=%i\n",rv);
+	return(rv);
 }
 
 
@@ -8342,52 +8582,47 @@
 */
 
 /* Check to see that the frequency is valid */
-/* Hard coded limits now, configurable later, maybe? */
-
+/* returns 0 if frequency is valid          */
 
 static int check_freq_ic706(int m, int d, int *defmode, char mars)
 {
 	int dflmd = REM_MODE_FM;
-
-	if(debug)
-		printf("check_freq_ic706(%i,%i,%i,%i)\n",m,d,*defmode,mars);
-
-	if(m == 1){ /* 160 meters */
+	int rv=0;
+
+	if(debug > 6)
+		ast_log(LOG_NOTICE,"(%i,%i,%i,%i)\n",m,d,*defmode,mars);
+
+	/* first test for standard amateur radio bands */
+
+	if(m == 1){ 					/* 160 meters */
 		dflmd =	REM_MODE_LSB; 
-		if(d < 80000)
-			return -1;
-	}
-	else if(m == 3){ /* 80 meters */
+		if(d < 80000)rv=-1;
+	}
+	else if(m == 3){ 				/* 80 meters */
 		dflmd = REM_MODE_LSB;
-		if(d < 50000)
-			return -1;
-	}
-	else if(m == 7){ /* 40 meters */
+		if(d < 50000)rv=-1;
+	}
+	else if(m == 7){ 				/* 40 meters */
 		dflmd = REM_MODE_LSB;
-		if(d > 30000)
-			return -1;
-	}
-	else if(m == 14){ /* 20 meters */
+		if(d > 30000)rv=-1;
+	}
+	else if(m == 14){ 				/* 20 meters */
 		dflmd = REM_MODE_USB;
-		if(d > 35000)
-			return -1;
-	}
-	else if(m == 18){ /* 17 meters */
+		if(d > 35000)rv=-1;
+	}
+	else if(m == 18){ 							/* 17 meters */
 		dflmd = REM_MODE_USB;
-		if((d < 6800) || (d > 16800))
-			return -1;
+		if((d < 6800) || (d > 16800))rv=-1;
 	}
 	else if(m == 21){ /* 15 meters */
 		dflmd = REM_MODE_USB;
-		if((d < 20000) || (d > 45000))
-			return -1;
+		if((d < 20000) || (d > 45000))rv=-1;
 	}
 	else if(m == 24){ /* 12 meters */
 		dflmd = REM_MODE_USB;
-		if((d < 89000) || (d > 99000))
-			return -1;
-	}
-	else if(m == 28){ /* 10 meters */
+		if((d < 89000) || (d > 99000))rv=-1;
+	}
+	else if(m == 28){ 							/* 10 meters */
 		dflmd = REM_MODE_USB;
 	}
 	else if(m == 29){ 
@@ -8395,15 +8630,13 @@
 			dflmd = REM_MODE_FM;
 		else
 			dflmd = REM_MODE_USB;
-		if(d > 70000)
-			return -1;
-	}
-	else if(m == 50){ /* 6 meters */
+		if(d > 70000)rv=-1;
+	}
+	else if(m == 50){ 							/* 6 meters */
 		if(d >= 30000)
 			dflmd = REM_MODE_FM;
 		else
 			dflmd = REM_MODE_USB;
-
 	}
 	else if((m >= 51) && ( m < 54)){
 		dflmd = REM_MODE_FM;
@@ -8417,53 +8650,56 @@
 	else if((m >= 145) && (m < 148)){
 		dflmd = REM_MODE_FM;
 	}
-	else if((m >= 430) && (m < 450)){ /* 70 centimeters */
+	else if((m >= 430) && (m < 450)){ 			/* 70 centimeters */
 		if(m  < 438)
 			dflmd = REM_MODE_USB;
 		else
 			dflmd = REM_MODE_FM;
-		;
-	}
-	// expanded coverage
-	if(mars){
-		if((m >= 450) && (m < 470)){ /* LMR */
+	}
+
+	/* check expanded coverage */
+	if(mars && rv<0){
+		if((m >= 450) && (m < 470)){ 			/* LMR */
 			dflmd = REM_MODE_FM;
-		}
-		else if((m >= 148) && (m < 174)){ /* LMR */
+			rv=0;
+		}
+		else if((m >= 148) && (m < 174)){ 		/* LMR */
 			dflmd = REM_MODE_FM;
-		}
-		else if((m >= 138) && (m < 144)){ /* VHF-AM AIRCRAFT */
+			rv=0;
+		}
+		else if((m >= 138) && (m < 144)){ 		/* VHF-AM AIRCRAFT */
 			dflmd = REM_MODE_AM;
-		}
-		else if((m >= 108) && (m < 138)){ /* VHF-AM AIRCRAFT */
+			rv=0;
+		}
+		else if((m >= 108) && (m < 138)){ 		/* VHF-AM AIRCRAFT */
 			dflmd = REM_MODE_AM;
-		}
-		else if( (m==0 && d>=55000) || (m==1 && d<=75000) ){ /* AM BCB*/
+			rv=0;
+		}
+		else if( (m==0 && d>=55000) || (m==1 && d<=75000) ){ 	/* AM BCB*/
 			dflmd = REM_MODE_AM;
-		}
-  		else if( (m == 1 && d>75000) || (m>1 && m<30) ){ /* HF SWL*/
+			rv=0;
+		}
+  		else if( (m == 1 && d>75000) || (m>1 && m<30) ){ 		/* HF SWL*/
 			dflmd = REM_MODE_AM;
-		}
-		else
-			return -1;
-	}
-	else
-		return -1;
+			rv=0;
+		}
+	}
 
 	if(defmode)
 		*defmode = dflmd;
 
-	if(debug)
-		printf("check_freq_ic706(%i,%i,%i,%i) return 0\n",m,d,*defmode,mars);
-
-	return 0;
+	if(debug > 1)
+		ast_log(LOG_NOTICE,"(%i,%i,%i,%i) returning %i\n",m,d,*defmode,mars,rv);
+
+	return rv;
 }
 
 /* take a PL frequency and turn it into a code */
 static int ic706_pltocode(char *str)
 {
-int i;
-char *s;
+	int i;
+	char *s;
+	int rv=-1;
 
 	s = strchr(str,'.');
 	i = 0;
@@ -8472,107 +8708,110 @@
 	switch(i)
 	{
 	    case 670:
-		return 0;
+			rv=0;
 	    case 693:
-		return 1;
+			rv=1;
 	    case 719:
-		return 2;
+			rv=2;
 	    case 744:
-		return 3;
+			rv=3;
 	    case 770:
-		return 4;
+			rv=4;
 	    case 797:
-		return 5;
+			rv=5;
 	    case 825:
-		return 6;
+			rv=6;
 	    case 854:
-		return 7;
+			rv=7;
 	    case 885:
-		return 8;
+			rv=8;
 	    case 915:
-		return 9;
+			rv=9;
 	    case 948:
-		return 10;
+			rv=10;
 	    case 974:
-		return 11;
+			rv=11;
 	    case 1000:
-		return 12;
+			rv=12;
 	    case 1035:
-		return 13;
+			rv=13;
 	    case 1072:
-		return 14;
+			rv=14;
 	    case 1109:
-		return 15;
+			rv=15;
 	    case 1148:
-		return 16;
+			rv=16;
 	    case 1188:
-		return 17;
+			rv=17;
 	    case 1230:
-		return 18;
+			rv=18;
 	    case 1273:
-		return 19;
+			rv=19;
 	    case 1318:
-		return 20;
+			rv=20;
 	    case 1365:
-		return 21;
+			rv=21;
 	    case 1413:
-		return 22;
+			rv=22;
 	    case 1462:
-		return 23;
+			rv=23;
 	    case 1514:
-		return 24;
+			rv=24;
 	    case 1567:
-		return 25;
+			rv=25;
 	    case 1598:
-		return 26;
+			rv=26;
 	    case 1622:
-		return 27;
+			rv=27;
 	    case 1655:
-		return 28;		
+			rv=28;		
 	    case 1679:
-		return 29;
+			rv=29;
 	    case 1713:
-		return 30;
+			rv=30;
 	    case 1738:
-		return 31;
+			rv=31;
 	    case 1773:
-		return 32;
+			rv=32;
 	    case 1799:
-		return 33;
-            case 1835:
-		return 34;
+			rv=33;
+        case 1835:
+			rv=34;
 	    case 1862:
-		return 35;
+			rv=35;
 	    case 1899:
-		return 36;
+			rv=36;
 	    case 1928:
-		return 37;
+			rv=37;
 	    case 1966:
-		return 38;
+			rv=38;
 	    case 1995:
-		return 39;
+			rv=39;
 	    case 2035:
-		return 40;
+			rv=40;
 	    case 2065:
-		return 41;
+			rv=41;
 	    case 2107:
-		return 42;
+			rv=42;
 	    case 2181:
-		return 43;
+			rv=43;
 	    case 2257:
-		return 44;
+			rv=44;
 	    case 2291:
-		return 45;
+			rv=45;
 	    case 2336:
-		return 46;
+			rv=46;
 	    case 2418:
-		return 47;
+			rv=47;
 	    case 2503:
-		return 48;
+			rv=48;
 	    case 2541:
-		return 49;
-	}
-	return -1;
+			rv=49;
+	}
+	if(debug > 1)
+		ast_log(LOG_NOTICE,"%i  rv=%i\n",i, rv);
+
+	return rv;
 }
 
 /* ic-706 simple commands */
@@ -8603,7 +8842,7 @@
 
 	fd = 0;
 	if(debug) 
-		printf("New frequency: %s\n",newfreq);
+		ast_log(LOG_NOTICE,"newfreq:%s\n",newfreq); 			
 
 	if(split_freq(mhz, decimals, newfreq))
 		return -1; 
@@ -8633,6 +8872,9 @@
 {
 	unsigned char c;
 
+	if(debug > 6)
+		ast_log(LOG_NOTICE,"offset=%i\n",offset);
+
 	switch(offset){
 		case	REM_SIMPLEX:
 			c = 0x10;
@@ -8660,6 +8902,9 @@
 {
 	unsigned char c;
 	
+	if(debug > 6)
+		ast_log(LOG_NOTICE,"newmode=%i\n",newmode);
+
 	switch(newmode){
 		case	REM_MODE_FM:
 			c = 5;
@@ -8689,6 +8934,9 @@
 {
 	unsigned char cmdstr[10];
 	int rv;
+
+	if(debug > 6)
+		ast_log(LOG_NOTICE,"txplon=%i  rxplon=%i \n",txplon,rxplon);
 
 	cmdstr[0] = cmdstr[1] = 0xfe;
 	cmdstr[2] = myrpt->p.civaddr;
@@ -8722,6 +8970,9 @@
 	int h,d,rv;
 
 	memset(cmdstr, 0, 5);
+
+	if(debug > 6)
+		ast_log(LOG_NOTICE,"txtone=%s  rxtone=%s \n",txtone,rxtone);
 
 	if(split_ctcss_freq(hertz, decimal, txtone))
 		return -1; 
@@ -9015,11 +9266,12 @@
 
 /*
  * Check TX frequency before transmitting
- */
+   rv=1 if tx frequency in ok.
+*/
 
 static char check_tx_freq(struct rpt *myrpt)
 {
-	int i;
+	int i,rv=0;
 	int radio_mhz, radio_decimals, ulimit_mhz, ulimit_decimals, llimit_mhz, llimit_decimals;
 	char radio_mhz_char[MAXREMSTR];
 	char radio_decimals_char[MAXREMSTR];
@@ -9029,13 +9281,17 @@
 	char *limit_ranges[40];
 	struct ast_variable *limitlist;
 	
+	if(debug > 3){
+		ast_log(LOG_NOTICE, "myrpt->freq = %s\n", myrpt->freq);
+	}
 
 	/* Must have user logged in and tx_limits defined */
 
 	if(!myrpt->p.txlimitsstanzaname || !myrpt->loginuser[0] || !myrpt->loginlevel[0]){
 		if(debug > 3){
-			ast_log(LOG_NOTICE, "No tx band table defined, or no user logged in\n");
-		}
+			ast_log(LOG_NOTICE, "No tx band table defined, or no user logged in. rv=1\n");
+		}
+		rv=1;
 		return 1; /* Assume it's ok otherwise */
 	}
 
@@ -9043,7 +9299,8 @@
 	limitlist = ast_variable_browse(myrpt->cfg, myrpt->p.txlimitsstanzaname);
 
 	if(!limitlist){
-		ast_log(LOG_WARNING, "No entries in %s band table stanza\n", myrpt->p.txlimitsstanzaname);
+		ast_log(LOG_WARNING, "No entries in %s band table stanza. rv=0\n", myrpt->p.txlimitsstanzaname);
+		rv=0;
 		return 0;
 	}
 
@@ -9051,7 +9308,6 @@
 	radio_mhz = atoi(radio_mhz_char);
 	radio_decimals = decimals2int(radio_decimals_char);
 
-
 	if(debug > 3){
 		ast_log(LOG_NOTICE, "Login User = %s, login level = %s\n", myrpt->loginuser, myrpt->loginlevel);
 	}
@@ -9064,12 +9320,13 @@
 	}
 
 	if(!limitlist){
-		ast_log(LOG_WARNING, "Can't find %s entry in band table stanza %s\n", myrpt->loginlevel, myrpt->p.txlimitsstanzaname);
-		return 0;
+		ast_log(LOG_WARNING, "Can't find %s entry in band table stanza %s. rv=0\n", myrpt->loginlevel, myrpt->p.txlimitsstanzaname);
+		rv=0;
+	    return 0;
 	}
 	
 	if(debug > 3){
-		ast_log(LOG_NOTICE, "Auth %s = %s\n", limitlist->name, limitlist->value);
+		ast_log(LOG_NOTICE, "Auth: %s = %s\n", limitlist->name, limitlist->value);
 	}
 
 	/* Parse the limits */
@@ -9082,14 +9339,14 @@
 		char *r,*s;
 		strncpy(range, limit_ranges[i], 40);
 		range[39] = 0;
-                if(debug > 3){
-			ast_log(LOG_NOTICE, "Checking to see if %s is within limits of %s\n", myrpt->freq, range);
-                }        
+        if(debug > 3) 
+        	ast_log(LOG_NOTICE, "Check %s within %s\n", myrpt->freq, range);
 	
 		r = strchr(range, '-');
 		if(!r){
-			ast_log(LOG_WARNING, "Malformed range in %s tx band table entry\n", limitlist->name);
-			return 0;
+			ast_log(LOG_WARNING, "Malformed range in %s tx band table entry. rv=0\n", limitlist->name);
+			rv=0;
+			break;
 		}
 		*r++ = 0;
 		s = eatwhite(range);
@@ -9106,41 +9363,53 @@
 				if(radio_decimals >= llimit_decimals){ /* Cannot be below llimit decimals */
 					if(llimit_mhz == ulimit_mhz){ /* If bandwidth < 1Mhz, check ulimit decimals */
 						if(radio_decimals <= ulimit_decimals){
-							return 1;
+							rv=1;
+							break;
 						}
 						else{
 							if(debug > 3)
 								ast_log(LOG_NOTICE, "Invalid TX frequency, debug msg 1\n");
-							return 0;
+							rv=0;
+							break;
 						}
 					}
 					else{
-						return 1;
+						rv=1;
+						break;
 					}
 				}
 				else{ /* Is below llimit decimals */
 					if(debug > 3)
 						ast_log(LOG_NOTICE, "Invalid TX frequency, debug msg 2\n");
-					return 0;
+					rv=0;
+					break;
 				}
 			}
 			else if(radio_mhz == ulimit_mhz){ /* CASE 2: TX freq not in llimit mhz portion of band */
 				if(radio_decimals <= ulimit_decimals){
-					return 1;
+					if(debug > 3)
+						ast_log(LOG_NOTICE, "radio_decimals <= ulimit_decimals\n");
+					rv=1;
+					break;
 				}
 				else{ /* Is above ulimit decimals */
 					if(debug > 3)
 						ast_log(LOG_NOTICE, "Invalid TX frequency, debug msg 3\n");
-					return 0;
+					rv=0;
+					break;
 				}
 			}
 			else /* CASE 3: TX freq within a multi-Mhz band and ok */
-				return 1; 
-		}
-	}
-	if(debug > 3) /* No match found in TX band table */
-		ast_log(LOG_NOTICE, "Invalid TX frequency, debug msg 4\n");
-	return 0;
+				if(debug > 3)
+						ast_log(LOG_NOTICE, "Valid TX freq within a multi-Mhz band and ok.\n");
+				rv=1;
+				break;
+		}
+	}
+	if(debug > 3)  
+		ast_log(LOG_NOTICE, "rv=%i\n",rv);
+
+	return rv;
 }
 
 
@@ -9310,6 +9579,10 @@
 	char oc,*cp,*cp1,*cp2;
 	char tmp[20], freq[20] = "", savestr[20] = "";
 	char mhz[MAXREMSTR], decimals[MAXREMSTR];
+
+    if(debug > 6) {
+    	ast_log(LOG_NOTICE,"%s param=%s digitbuf=%s source=%i\n",myrpt->name,param,digitbuf,command_source);
+	}
 
 	if((!param) || (command_source == SOURCE_RPT) || (command_source == SOURCE_LNK))
 		return DC_ERROR;
@@ -9420,14 +9693,14 @@
 			snprintf(freq, sizeof(freq), "%s.%03d%02d",s1, k, ht);
 
 			if(debug)
-				printf("New frequency: %s\n", freq);		
+				ast_log(LOG_NOTICE, "New frequency: %s\n", freq);
 	
 			split_freq(mhz, decimals, freq);
 			m = atoi(mhz);
 			d = atoi(decimals);
 
-                        if(check_freq(myrpt, m, d, &defmode)) /* Check to see if frequency entered is legit */
-                                goto invalid_freq;
+			if(check_freq(myrpt, m, d, &defmode)) /* Check to see if frequency entered is legit */
+			        goto invalid_freq;
 
 
  			if((defmode == REM_MODE_FM) && (digitbuf[i] == '*')) /* If FM, user must enter and additional offset digit */
@@ -9522,9 +9795,18 @@
 			/* cant set tx tone on RBI (rx tone does both) */
 			if(!strcmp(myrpt->remoterig, remote_rig_rbi))
 				return DC_ERROR;
+			/*  eventually for the ic706 instead of just throwing the exception
+				we can check if we are in encode only mode and allow the tx
+				ctcss code to be changed. but at least the warning message is
+				issued for now.
+			*/
 			if(!strcmp(myrpt->remoterig, remote_rig_ic706))
+			{
+				if(debug)
+					ast_log(LOG_WARNING,"Setting IC706 Tx CTCSS Code Not Supported. Set Rx Code for both.\n");
 				return DC_ERROR;
-	    		for(i = 0, j = 0, k = 0, l = 0 ; digitbuf[i] ; i++){ /* look for N+*N */
+			}
+	    	for(i = 0, j = 0, k = 0, l = 0 ; digitbuf[i] ; i++){ /* look for N+*N */
 				if(digitbuf[i] == '*'){
 					j++;
 					continue;
@@ -9727,6 +10009,8 @@
 			rpt_telemetry(myrpt,REMXXX,(void *)p);
 			return DC_COMPLETEQUIET;
 		case 119: /* Tune Request */
+			if(debug > 3)
+				ast_log(LOG_NOTICE,"TUNE REQUEST\n");
 			/* if not currently going, and valid to do */
 			if((!myrpt->tunerequest) && 
 			    ((!strcmp(myrpt->remoterig, remote_rig_ft897) || 
@@ -9773,6 +10057,9 @@
 {
 time_t	now;
 int	ret,res = 0,src;
+
+	if(debug > 6)
+		ast_log(LOG_NOTICE,"c=%c  phonemode=%i  dtmfidx=%i\n",c,phonemode,myrpt->dtmfidx);
 
 	time(&myrpt->last_activity_time);
 	/* Stop scan mode if in scan mode */
@@ -10246,7 +10533,12 @@
 static void do_scheduler(struct rpt *myrpt)
 {
 	int i,res;
+
+#ifdef	NEW_ASTERISK
+	struct ast_tm tmnow;
+#else
 	struct tm tmnow;
+#endif
 	struct ast_variable *skedlist;
 	char *strs[5],*vp,*val,value[100];
 
@@ -10296,8 +10588,8 @@
 		return;
 	}
 
-        /* get pointer to linked list of scheduler entries */
-        skedlist = ast_variable_browse(myrpt->cfg, myrpt->p.skedstanzaname);
+    /* get pointer to linked list of scheduler entries */
+    skedlist = ast_variable_browse(myrpt->cfg, myrpt->p.skedstanzaname);
 
 	if(debug > 6){
 		ast_log(LOG_NOTICE, "Time now: %02d:%02d %02d %02d %02d\n",
@@ -12563,7 +12855,11 @@
         while(!ast_test_flag(&ast_options,AST_OPT_FLAG_FULLY_BOOTED))
                 usleep(250000);
 #endif
+#ifdef	NEW_ASTERISK
+	rpt_vars[n].cfg = ast_config_load("rpt.conf",config_flags);
+#else
 	rpt_vars[n].cfg = ast_config_load("rpt.conf");
+#endif
 	cfg = rpt_vars[n].cfg;
 	if (!cfg) {
 		ast_log(LOG_NOTICE, "Unable to open radio repeater configuration rpt.conf.  Radio Repeater disabled.\n");
@@ -13800,11 +14096,16 @@
 		rpt_mutex_lock(&myrpt->lock);
 		do_dtmf_local(myrpt,0);
 		rpt_mutex_unlock(&myrpt->lock);
+		//
 		rem_totx =  myrpt->dtmf_local_timer && (!phone_mode);
 		rem_totx |= keyed && (!myrpt->tunerequest);
 		rem_rx = (remkeyed && (!setting)) || (myrpt->tele.next != &myrpt->tele);
 		if(!strcmp(myrpt->remoterig, remote_rig_ic706))
 			rem_totx |= myrpt->tunerequest;
+		//
+	    if((debug > 6) && rem_totx) {
+	    	ast_log(LOG_NOTICE,"Set rem_totx=%i.  dtmf_local_timer=%i phone_mode=%i keyed=%i tunerequest=%i\n",rem_totx,myrpt->dtmf_local_timer,phone_mode,keyed,myrpt->tunerequest);
+		}
 		if (keyed && (!keyed1))
 		{
 			keyed1 = 1;
@@ -13870,10 +14171,14 @@
 		}
 		if (rem_totx && (!myrpt->remotetx))
 		{
-			/* if not authed, and needed, dont transmit */
+			/* if not authed, and needed, do not transmit */
 			if ((!myrpt->p.authlevel) || myrpt->loginlevel[0])
 			{
+				if(debug > 6)
+					ast_log(LOG_NOTICE,"Handle rem_totx=%i.  dtmf_local_timer=%i  tunerequest=%i\n",rem_totx,myrpt->dtmf_local_timer,myrpt->tunerequest);
+
 				myrpt->remotetx = 1;
+				/* asdf maw ??? is this really what you want? Doesn't it always get executed? */
 				if((myrpt->remtxfreqok = check_tx_freq(myrpt)))
 				{
 					time(&myrpt->last_activity_time);
@@ -14243,6 +14548,472 @@
     astman_append(s, "\r\n");	/* Properly terminate Manager output */
     return RESULT_SUCCESS;
 } /* manager_rpt_local_nodes() */
+
+
+
+/*
+ * Append Success and ActionID to manager response message
+ */
+
+static void rpt_manager_success(struct mansession *s, const struct message *m)
+{
+	const char *id = astman_get_header(m, "ActionID");
+	if (!ast_strlen_zero(id))
+		astman_append(s, "ActionID: %s\r\n", id);
+	astman_append(s, "Response: Success\r\n");
+}
+
+/*
+* Dump statistics to manager session
+*/
+
+static int rpt_manager_do_stats(struct mansession *s, const struct message *m, char *str)
+{
+	int i,j,numoflinks;
+	int dailytxtime, dailykerchunks;
+	time_t now;
+	int totalkerchunks, dailykeyups, totalkeyups, timeouts;
+	int totalexecdcommands, dailyexecdcommands, hours, minutes, seconds;
+	long long totaltxtime;
+	struct	rpt_link *l;
+	char *listoflinks[MAX_STAT_LINKS];	
+	char *lastdtmfcommand,*parrot_ena;
+	char *tot_state, *ider_state, *patch_state;
+	char *reverse_patch_state, *sys_ena, *tot_ena, *link_ena, *patch_ena;
+	char *sch_ena, *input_signal, *called_number, *user_funs, *tail_type;
+	char *transmitterkeyed;
+	const char *node = astman_get_header(m, "Node");
+	struct rpt *myrpt;
+
+	static char *not_applicable = "N/A";
+
+	tot_state = ider_state = 
+	patch_state = reverse_patch_state = 
+	input_signal = not_applicable;
+	called_number = lastdtmfcommand = transmitterkeyed = NULL;
+
+	time(&now);
+	for(i = 0; i < nrpts; i++)
+	{
+		if ((node)&&(!strcmp(node,rpt_vars[i].name))){
+			rpt_manager_success(s,m);
+
+			myrpt = &rpt_vars[i];
+
+			if(myrpt->remote){ /* Remote base ? */
+				char *loginuser, *loginlevel, *freq, *rxpl, *txpl, *modestr;
+				char offset,powerlevel,rxplon,txplon,remoteon,remmode,reportfmstuff;
+				char offsetc,powerlevelc;
+
+				loginuser = loginlevel = freq = rxpl = txpl = NULL;
+				/* Make a copy of all stat variables while locked */
+				rpt_mutex_lock(&myrpt->lock); /* LOCK */
+				if((remoteon = myrpt->remoteon)){
+					if(!ast_strlen_zero(myrpt->loginuser))
+						loginuser = ast_strdup(myrpt->loginuser);
+					if(!ast_strlen_zero(myrpt->loginlevel))
+						loginlevel = ast_strdup(myrpt->loginlevel);
+					if(!ast_strlen_zero(myrpt->freq))
+						freq = ast_strdup(myrpt->freq);
+					if(!ast_strlen_zero(myrpt->rxpl))
+						rxpl = ast_strdup(myrpt->rxpl);
+					if(!ast_strlen_zero(myrpt->txpl))
+						txpl = ast_strdup(myrpt->txpl);
+					remmode = myrpt->remmode;
+					offset = myrpt->offset;
+					powerlevel = myrpt->powerlevel;
+					rxplon = myrpt->rxplon;
+					txplon = myrpt->txplon;			
+				}
+				rpt_mutex_unlock(&myrpt->lock); /* UNLOCK */
+				astman_append(s, "IsRemoteBase: YES\r\n");
+				astman_append(s, "RemoteOn: %s\r\n",(remoteon) ? "YES": "NO");
+				if(remoteon){
+					if(loginuser){
+						astman_append(s, "LogInUser: %s\r\n", loginuser);
+						ast_free(loginuser);
+					}
+					if(loginlevel){
+						astman_append(s, "LogInLevel: %s\r\n", loginlevel);
+						ast_free(loginlevel);
+					}
+					if(freq){
+						astman_append(s, "Freq: %s\r\n", freq);
+						ast_free(freq);
+					}
+					reportfmstuff = 0;
+					switch(remmode){
+						case REM_MODE_FM:
+							modestr = "FM";	
+							reportfmstuff = 1;
+							break;
+						case REM_MODE_AM:
+							modestr = "AM";
+							break;
+						case REM_MODE_USB:
+							modestr = "USB";
+							break;
+						default:
+							modestr = "LSB";
+							break;
+					}
+					astman_append(s, "RemMode: %s\r\n", modestr);
+					if(reportfmstuff){
+						switch(offset){
+							case REM_SIMPLEX:
+								offsetc = 'S';
+								break;
+							case REM_MINUS:
+								offsetc = '-';
+								break;
+							default:
+								offsetc = '+';
+								break;
+						}
+						astman_append(s, "RemOffset: %c\r\n", offsetc);
+						if(rxplon && rxpl){
+							astman_append(s, "RxPl: %s\r\n",rxpl);
+							free(rxpl);
+						}
+						if(txplon && txpl){
+							astman_append(s, "TxPl: %s\r\n",txpl);
+							free(txpl);
+						}
+					}
+					switch(powerlevel){
+						case REM_LOWPWR:
+							powerlevelc = 'L';
+							break;
+						case REM_MEDPWR:
+							powerlevelc = 'M';
+							break;
+						default:
+							powerlevelc = 'H';
+							break;
+					}
+					astman_append(s,"PowerLevel: %c\r\n", powerlevelc);
+				}
+				astman_append(s, "\r\n");
+				return 0; /* End of remote base status reporting */
+			}	
+
+			/* ELSE Process as a repeater node */
+			/* Make a copy of all stat variables while locked */
+			rpt_mutex_lock(&myrpt->lock); /* LOCK */
+			dailytxtime = myrpt->dailytxtime;
+			totaltxtime = myrpt->totaltxtime;
+			dailykeyups = myrpt->dailykeyups;
+			totalkeyups = myrpt->totalkeyups;
+			dailykerchunks = myrpt->dailykerchunks;
+			totalkerchunks = myrpt->totalkerchunks;
+			dailyexecdcommands = myrpt->dailyexecdcommands;
+			totalexecdcommands = myrpt->totalexecdcommands;
+			timeouts = myrpt->timeouts;
+
+
+			/* Traverse the list of connected nodes */
+			reverse_patch_state = "DOWN";
+			numoflinks = 0;
+			l = myrpt->links.next;
+			while(l && (l != &myrpt->links)){
+				if(numoflinks >= MAX_STAT_LINKS){
+					ast_log(LOG_NOTICE,
+					"maximum number of links exceeds %d in rpt_do_stats()!",MAX_STAT_LINKS);
+					break;
+				}
+				if (l->name[0] == '0'){ /* Skip '0' nodes */
+					reverse_patch_state = "UP";
+					l = l->next;
+					continue;
+				}
+				listoflinks[numoflinks] = ast_strdup(l->name);
+				if(listoflinks[numoflinks] == NULL){
+					break;
+				}
+				else{
+					numoflinks++;
+				}
+				l = l->next;
+			}
+
+			if(myrpt->keyed)
+				input_signal = "YES";
+			else
+				input_signal = "NO";
+			
+			if(myrpt->txkeyed)
+				transmitterkeyed = "YES";
+			else
+				transmitterkeyed = "NO";
+
+			if(myrpt->p.parrotmode)
+				parrot_ena = "ENABLED";
+			else
+				parrot_ena = "DISABLED";
+
+			if(myrpt->p.s[myrpt->p.sysstate_cur].txdisable)
+				sys_ena = "DISABLED";
+			else
+				sys_ena = "ENABLED";
+
+			if(myrpt->p.s[myrpt->p.sysstate_cur].totdisable)
+				tot_ena = "DISABLED";
+			else
+				tot_ena = "ENABLED";
+
+			if(myrpt->p.s[myrpt->p.sysstate_cur].linkfundisable)
+				link_ena = "DISABLED";
+			else
+				link_ena = "ENABLED";
+
+			if(myrpt->p.s[myrpt->p.sysstate_cur].autopatchdisable)
+				patch_ena = "DISABLED";
+			else
+				patch_ena = "ENABLED";
+
+			if(myrpt->p.s[myrpt->p.sysstate_cur].schedulerdisable)
+				sch_ena = "DISABLED";
+			else
+				sch_ena = "ENABLED";
+
+			if(myrpt->p.s[myrpt->p.sysstate_cur].userfundisable)
+				user_funs = "DISABLED";
+			else
+				user_funs = "ENABLED";
+
+			if(myrpt->p.s[myrpt->p.sysstate_cur].alternatetail)
+				tail_type = "ALTERNATE";
+			else
+				tail_type = "STANDARD";
+
+			if(!myrpt->totimer)
+				tot_state = "TIMED OUT!";
+			else if(myrpt->totimer != myrpt->p.totime)
+				tot_state = "ARMED";
+			else
+				tot_state = "RESET";
+
+			if(myrpt->tailid)
+				ider_state = "QUEUED IN TAIL";
+			else if(myrpt->mustid)
+				ider_state = "QUEUED FOR CLEANUP";
+			else
+				ider_state = "CLEAN";
+
+			switch(myrpt->callmode){
+				case 1:
+					patch_state = "DIALING";
+					break;
+				case 2:
+					patch_state = "CONNECTING";
+					break;
+				case 3:
+					patch_state = "UP";
+					break;
+
+				case 4:
+					patch_state = "CALL FAILED";
+					break;
+
+				default:
+					patch_state = "DOWN";
+			}
+
+			if(strlen(myrpt->exten)){
+				called_number = ast_strdup(myrpt->exten);
+			}
+
+			if(strlen(myrpt->lastdtmfcommand)){
+				lastdtmfcommand = ast_strdup(myrpt->lastdtmfcommand);
+			}
+			rpt_mutex_unlock(&myrpt->lock); /* UNLOCK */
+
+			astman_append(s, "IsRemoteBase: NO\r\n");
+			astman_append(s, "NodeState: %d\r\n", myrpt->p.sysstate_cur);
+			astman_append(s, "SignalOnInput: %s\r\n", input_signal);
+			astman_append(s, "TransmitterKeyed: %s\r\n", transmitterkeyed);
+			astman_append(s, "Transmitter: %s\r\n", sys_ena);
+			astman_append(s, "Parrot: %s\r\n", parrot_ena);
+			astman_append(s, "Scheduler: %s\r\n", sch_ena);
+			astman_append(s, "TailLength: %s\r\n", tail_type);
+			astman_append(s, "TimeOutTimer: %s\r\n", tot_ena);
+			astman_append(s, "TimeOutTimerState: %s\r\n", tot_state);
+			astman_append(s, "TimeOutsSinceSystemInitialization: %d\r\n", timeouts);
+			astman_append(s, "IdentifierState: %s\r\n", ider_state);
+			astman_append(s, "KerchunksToday: %d\r\n", dailykerchunks);
+			astman_append(s, "KerchunksSinceSystemInitialization: %d\r\n", totalkerchunks);
+			astman_append(s, "KeyupsToday: %d\r\n", dailykeyups);
+			astman_append(s, "KeyupsSinceSystemInitialization: %d\r\n", totalkeyups);
+			astman_append(s, "DtmfCommandsToday: %d\r\n", dailyexecdcommands);
+			astman_append(s, "DtmfCommandsSinceSystemInitialization: %d\r\n", totalexecdcommands);
+			astman_append(s, "LastDtmfCommandExecuted: %s\r\n", 
+			(lastdtmfcommand && strlen(lastdtmfcommand)) ? lastdtmfcommand : not_applicable);
+			hours = dailytxtime/3600000;
+			dailytxtime %= 3600000;
+			minutes = dailytxtime/60000;
+			dailytxtime %= 60000;
+			seconds = dailytxtime/1000;
+			dailytxtime %= 1000;
+
+			astman_append(s, "TxTimeToday: %02d:%02d:%02d.%d\r\n",
+				hours, minutes, seconds, dailytxtime);
+
+			hours = (int) totaltxtime/3600000;
+			totaltxtime %= 3600000;
+			minutes = (int) totaltxtime/60000;
+			totaltxtime %= 60000;
+			seconds = (int)  totaltxtime/1000;
+			totaltxtime %= 1000;
+
+			astman_append(s, "TxTimeSinceSystemInitialization: %02d:%02d:%02d.%d\r\n",
+				 hours, minutes, seconds, (int) totaltxtime);
+
+  			sprintf(str, "NodesCurrentlyConnectedToUs: ");
+                        if(!numoflinks){
+  	                      strcat(str,"<NONE>");
+                        }
+			else{
+				for(j = 0 ;j < numoflinks; j++){
+					sprintf(str+strlen(str), "%s", listoflinks[j]);
+					if(j < numoflinks - 1)
+						strcat(str,",");
+				}
+			}
+			astman_append(s,"%s\r\n", str);
+
+			astman_append(s, "Autopatch: %s\r\n", patch_ena);
+			astman_append(s, "AutopatchState: %s\r\n", patch_state);
+			astman_append(s, "AutopatchCalledNumber: %s\r\n",
+			(called_number && strlen(called_number)) ? called_number : not_applicable);
+			astman_append(s, "ReversePatchIaxrptConnected: %s\r\n", reverse_patch_state);
+			astman_append(s, "UserLinkingCommands: %s\r\n", link_ena);
+			astman_append(s, "UserFunctions: %s\r\n", user_funs);
+
+			for(j = 0; j < numoflinks; j++){ /* ast_free() all link names */

[... 174 lines stripped ...]



More information about the asterisk-commits mailing list