Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv14369

Modified Files:
        app_rpt.c 
Log Message:
Better improved HF interface


Index: app_rpt.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_rpt.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- app_rpt.c   8 Sep 2005 17:29:49 -0000       1.40
+++ app_rpt.c   11 Sep 2005 22:08:44 -0000      1.41
@@ -3,7 +3,7 @@
  * Asterisk -- A telephony toolkit for Linux.
  *
  * Radio Repeater / Remote Base program 
- *  version 0.29 09/04/05
+ *  version 0.30 09/11/05
  * 
  * See http://www.zapatatelephony.org/app_rpt.html
  *
@@ -180,7 +180,7 @@
 #include "asterisk/say.h"
 #include "asterisk/localtime.h"
 
-static  char *tdesc = "Radio Repeater / Remote Base  version 0.29  09/04/2005";
+static  char *tdesc = "Radio Repeater / Remote Base  version 0.30  09/11/2005";
 
 static char *app = "Rpt";
 
@@ -2663,8 +2663,10 @@
 /* Check for valid rbi frequency */
 /* Hard coded limits now, configurable later, maybe? */
 
-static int check_freq_rbi(int m, int d)
+static int check_freq_rbi(int m, int d, int *defmode)
 {
+       int dflmd = REM_MODE_FM;
+
        if(m == 50){ /* 6 meters */
                if(d < 10100)
                        return -1;
@@ -2690,6 +2692,11 @@
        }
        else
                return -1;
+       
+       if(defmode)
+               *defmode = dflmd;       
+
+
        return 0;
 }
 
@@ -2717,6 +2724,29 @@
 }
        
 /*
+* Split ctcss frequency into hertz and decimal
+*/
+ 
+static int split_ctcss_freq(char *hertz, char *decimal, char *freq)
+{
+       char freq_copy[MAXREMSTR];
+       char *decp;
+
+       decp = strchr(strncpy(freq_copy, freq, MAXREMSTR),'.');
+       if(decp){
+               *decp++ = 0;
+               strncpy(hertz, freq_copy, MAXREMSTR);
+               strncpy(decimal, decp, strlen(decp));
+               decimal[strlen(decp)] = '\0';
+               return 0;
+       }
+       else
+               return -1;
+}
+
+
+
+/*
 * FT-897 I/O handlers
 */
 
@@ -2724,64 +2754,94 @@
 /* Hard coded limits now, configurable later, maybe? */
 
 
-static int check_freq_ft897(int m, int d)
+static int check_freq_ft897(int m, int d, int *defmode)
 {
+       int dflmd = REM_MODE_FM;
 
        if(m == 1){ /* 160 meters */
+               dflmd = REM_MODE_LSB; 
                if(d < 80001)
                        return -1;
        }
        else if(m == 3){ /* 80 meters */
+               dflmd = REM_MODE_LSB;
                if(d < 75001)
                        return -1;
        }
        else if(m == 7){ /* 40 meters */
-               if((d < 71501) || (d > 72999))
+               dflmd = REM_MODE_LSB;
+               if((d < 15001) || (d > 29999))
                        return -1;
        }
        else if(m == 14){ /* 20 meters */
+               dflmd = REM_MODE_USB;
                if((d < 15001) || (d > 34999))
                        return -1;
        }
        else if(m == 18){ /* 17 meters */
-               if((d < 11001) || (d > 11679))
+               dflmd = REM_MODE_USB;
+               if((d < 11001) || (d > 16797))
                        return -1;
        }
        else if(m == 21){ /* 15 meters */
+               dflmd = REM_MODE_USB;
                if((d < 20001) || (d > 44999))
                        return -1;
        }
        else if(m == 24){ /* 12 meters */
+               dflmd = REM_MODE_USB;
                if((d < 93001) || (d > 98999))
                        return -1;
        }
        else if(m == 28){ /* 10 meters */
+               dflmd = REM_MODE_USB;
                if(d < 30001)
                        return -1;
        }
        else if(m == 29){ 
+               if(d >= 51000)
+                       dflmd = REM_MODE_FM;
+               else
+                       dflmd = REM_MODE_USB;
                if(d > 69999)
                        return -1;
        }
        else if(m == 50){ /* 6 meters */
                if(d < 10100)
                        return -1;
+               if(d >= 30000)
+                       dflmd = REM_MODE_FM;
+               else
+                       dflmd = REM_MODE_USB;
+
        }
        else if((m >= 51) && ( m < 54)){
-               ;
+               dflmd = REM_MODE_FM;
        }
        else if(m == 144){ /* 2 meters */
                if(d < 10100)
                        return -1;
+               if(d >= 30000)
+                       dflmd = REM_MODE_FM;
+               else
+                       dflmd = REM_MODE_USB;
        }
        else if((m >= 145) && (m < 148)){
-               ;
+               dflmd = REM_MODE_FM;
        }
        else if((m >= 430) && (m < 450)){ /* 70 centimeters */
+               if(m  < 438)
+                       dflmd = REM_MODE_USB;
+               else
+                       dflmd = REM_MODE_FM;
                ;
        }
        else
                return -1;
+
+       if(defmode)
+               *defmode = dflmd;
+
        return 0;
 }
 
@@ -2923,28 +2983,27 @@
 static int set_ctcss_freq_ft897(struct rpt *myrpt, char *txtone, char *rxtone)
 {
        unsigned char cmdstr[5];
-       char hertz[MAXREMSTR],decimals[MAXREMSTR];
+       char hertz[MAXREMSTR],decimal[MAXREMSTR];
        int h,d;        
 
-
        memset(cmdstr, 0, 5);
 
-       if(split_freq(hertz, decimals, txtone))
+       if(split_ctcss_freq(hertz, decimal, txtone))
                return -1; 
 
        h = atoi(hertz);
-       d = atoi(decimals);
+       d = atoi(decimal);
        
        cmdstr[0] = ((h / 100) << 4) + (h % 100)/ 10;
        cmdstr[1] = ((h % 10) << 4) + (d % 10);
        
        if(rxtone){
        
-               if(split_freq(hertz, decimals, rxtone))
+               if(split_ctcss_freq(hertz, decimal, rxtone))
                        return -1; 
 
                h = atoi(hertz);
-               d = atoi(decimals);
+               d = atoi(decimal);
        
                cmdstr[2] = ((h / 100) << 4) + (h % 100)/ 10;
                cmdstr[3] = ((h % 10) << 4) + (d % 10);
@@ -3048,7 +3107,7 @@
                d -= 100000;
        }
 
-       if(check_freq_ft897(m, d)){
+       if(check_freq_ft897(m, d, NULL)){
                if(debug)
                        printf("Bump freq invalid\n");
                return -1;
@@ -3090,12 +3149,12 @@
 * Dispatch to correct frequency checker
 */
 
-static int check_freq(struct rpt *myrpt, int m, int d)
+static int check_freq(struct rpt *myrpt, int m, int d, int *defmode)
 {
        if(!strcmp(myrpt->remote, remote_rig_ft897))
-               return check_freq_ft897(m, d);
+               return check_freq_ft897(m, d, defmode);
        else if(!strcmp(myrpt->remote, remote_rig_rbi))
-               return check_freq_rbi(m, d);
+               return check_freq_rbi(m, d, defmode);
        else
                return -1;
 }
@@ -3203,6 +3262,70 @@
 }
 
 
+static int rmt_telem_start(struct rpt *myrpt, struct ast_channel *chan, int 
delay)
+{
+                       myrpt->remotetx = 0;
+                       ast_indicate(myrpt->txchannel,AST_CONTROL_RADIO_UNKEY);
+                       if (!myrpt->remoterx)
+                               ast_indicate(chan,AST_CONTROL_RADIO_KEY);
+                       if (ast_safe_sleep(chan, delay) == -1)
+                                       return -1;
+                       return 0;
+}
+
+
+static int rmt_telem_finish(struct rpt *myrpt, struct ast_channel *chan)
+{
+
+struct zt_params par;
+
+       if (ioctl(myrpt->txchannel->fds[0],ZT_GET_PARAMS,&par) == -1)
+       {
+               return -1;
+
+       }
+       if (!par.rxisoffhook)
+       {
+               ast_indicate(myrpt->remchannel,AST_CONTROL_RADIO_UNKEY);
+               myrpt->remoterx = 0;
+       }
+       else
+       {
+               myrpt->remoterx = 1;
+       }
+       return 0;
+}
+
+
+static int rmt_sayfile(struct rpt *myrpt, struct ast_channel *chan, int delay, 
char *filename)
+{
+       int res;
+
+       res = rmt_telem_start(myrpt, chan, delay);
+
+       if(!res)
+               res = sayfile(chan, filename);
+       
+       if(!res)
+               res = rmt_telem_finish(myrpt, chan);
+       return res;
+}
+
+static int rmt_saycharstr(struct rpt *myrpt, struct ast_channel *chan, int 
delay, char *charstr)
+{
+       int res;
+
+       res = rmt_telem_start(myrpt, chan, delay);
+
+       if(!res)
+               res = saycharstr(chan, charstr);
+       
+       if(!res)
+               res = rmt_telem_finish(myrpt, chan);
+       return res;
+}
+
+
 
 /*
 * Remote base function
@@ -3211,7 +3334,7 @@
 static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int 
command_source)
 {
        char *s,*s1,*s2,*val;
-       int i,j,ht,k,l,ls2,m,d,res,offset,offsave;
+       int i,j,ht,k,l,ls2,m,d,res,offset,offsave, modesave, defmode;
        char multimode = 0;
        char oc;
        char tmp[20], freq[20] = "", savestr[20] = "";
@@ -3338,13 +3461,13 @@
                case 2:  /* set freq and offset */
           
                        
-                       for(i = 0, j = 0, k = 0, l = 0 ; digitbuf[i] ; i++){ /* 
look for N+*N+*N or N+*N+* depending on mode */
+                       for(i = 0, j = 0, k = 0, l = 0 ; digitbuf[i] ; i++){ /* 
look for M+*K+*O or M+*H+* depending on mode */
                                if(digitbuf[i] == '*'){
                                        j++;
                                        continue;
                                }
                                if((digitbuf[i] < '0') || (digitbuf[i] > '9'))
-                                       return DC_ERROR;
+                                       goto invalid_freq;
                                else{
                                        if(j == 0)
                                                l++; /* # of digits before 
first * */
@@ -3356,26 +3479,26 @@
                        i = strlen(digitbuf) - 1;
                        if(multimode){
                                if((j > 2) || (l > 3) || (k > 6))
-                                       return DC_ERROR; /* &[EMAIL PROTECTED] 
*/
+                                       goto invalid_freq; /* &[EMAIL 
PROTECTED] */
                        }
                        else{
                                if((j > 2) || (l > 4) || (k > 3))
-                                       return DC_ERROR; /* &[EMAIL PROTECTED] 
*/
+                                       goto invalid_freq; /* &[EMAIL 
PROTECTED] */
                        }
 
-                       /* For FM modulation mode, we require M+*K+*O, for 
other modulation modes M+*K+* will suffice */
+                       /* Wait for M+*K+* */
 
-                       if((j < 2) || ((myrpt->remmode == REM_MODE_FM) && 
(digitbuf[i] == '*')))
+                       if(j < 2)
                                break; /* Not yet */
 
+                       /* We have a frequency */
+
                        strncpy(tmp, digitbuf ,sizeof(tmp) - 1);
                        
                        s = tmp;
                        s1 = strsep(&s, "*"); /* Pick off MHz */
                        s2 = strsep(&s,"*"); /* Pick off KHz and Hz */
-                       oc = *s; /* Pick off offset */
                        ls2 = strlen(s2);       
-
                        
                        switch(ls2){ /* Allow partial entry of khz and hz 
digits for laziness support */
                                case 1:
@@ -3391,7 +3514,7 @@
                                case 3:
                                        if(!multimode){
                                                if((s2[2] != '0')&&(s2[2] != 
'5'))
-                                                       return DC_ERROR;
+                                                       goto invalid_freq;
                                        }
                                        ht = 0;
                                        k = atoi(s2);
@@ -3407,13 +3530,13 @@
                                        break;
                                        
                                default:
-                                       return DC_ERROR;
-                                       
+                                       goto invalid_freq;
                        }
-                               
 
+                       /* Check frequency for validity and establish a default 
mode */
                        
                        snprintf(freq, sizeof(freq), "%s.%03d%02d",s1, k, ht);
+
                        if(debug)
                                printf("New frequency: %s\n", freq);            
        
@@ -3421,50 +3544,62 @@
                        m = atoi(mhz);
                        d = atoi(decimals);
 
-                        if(check_freq(myrpt, m, d)) /* Check to see if 
frequency entered is legit */
-                                return DC_ERROR;
+                        if(check_freq(myrpt, m, d, &defmode)) /* Check to see 
if frequency entered is legit */
+                                goto invalid_freq;
 
-                       if((myrpt->remmode == REM_MODE_FM) && (m < 29)) /* FM 
not allowed below 29 MHZ */
-                               return DC_ERROR;
 
-                       offset = REM_SIMPLEX;
+                       if((defmode == REM_MODE_FM) && (digitbuf[i] == '*')) /* 
If FM, user must enter and additional offset digit */
+                               break; /* Not yet */
+
+
+                       offset = REM_SIMPLEX; /* Assume simplex */
+
+                       if(defmode == REM_MODE_FM){
+                               oc = *s; /* Pick off offset */
                        
-                       if (oc){
-                               switch(oc){
-                                       case '1':
-                                               offset = REM_MINUS;
-                                               break;
+                               if (oc){
+                                       switch(oc){
+                                               case '1':
+                                                       offset = REM_MINUS;
+                                                       break;
                                                
-                                       case '2':
-                                       case 0:
-                                               offset = REM_SIMPLEX;
+                                               case '2':
+                                                       offset = REM_SIMPLEX;
                                                break;
                                                
-                                       case '3':
-                                               offset = REM_PLUS;
-                                               break;
+                                               case '3':
+                                                       offset = REM_PLUS;
+                                                       break;
                                                
-                                       default:
-       
-                                               return DC_ERROR;
+                                               default:
+                                                       goto invalid_freq;
+                                       } 
                                } 
-                       } 
-                       
+                       }       
                        offsave = myrpt->offset;
+                       modesave = myrpt->remmode;
                        strncpy(savestr, myrpt->freq, sizeof(savestr) - 1);
                        strncpy(myrpt->freq, freq, sizeof(myrpt->freq) - 1);
-                       
                        myrpt->offset = offset;
-       
+                       myrpt->remmode = defmode;
+
                        if (setrem(myrpt) == -1){
                                myrpt->offset = offsave;
+                               myrpt->remmode = modesave;
                                strncpy(myrpt->freq, savestr, 
sizeof(myrpt->freq) - 1);
-                               return DC_ERROR;
+                               goto invalid_freq;
                        }
 
                        return DC_COMPLETE;
+
+
+                       invalid_freq:
+       
+                       rmt_sayfile(myrpt, mychannel, 1000, "rpt/invalid-freq");
+
+                       return DC_ERROR; 
                
-               case 3: /* set tx PL tone */
+               case 3: /* set rx PL tone */
                        
                        for(i = 0, j = 0, k = 0, l = 0 ; digitbuf[i] ; i++){ /* 
look for N+*N */
                                if(digitbuf[i] == '*'){
@@ -3493,18 +3628,18 @@
                        s = strchr(tmp,'*');
                        if(s)
                                *s = '.';
-                       strncpy(savestr, myrpt->txpl, sizeof(savestr) - 1);
-                       strncpy(myrpt->txpl, tmp, sizeof(myrpt->txpl) - 1);
+                       strncpy(savestr, myrpt->rxpl, sizeof(savestr) - 1);
+                       strncpy(myrpt->rxpl, tmp, sizeof(myrpt->rxpl) - 1);
                        
                        if (setrem(myrpt) == -1){
-                               strncpy(myrpt->txpl, savestr, 
sizeof(myrpt->txpl) - 1);
+                               strncpy(myrpt->rxpl, savestr, 
sizeof(myrpt->rxpl) - 1);
                                return DC_ERROR;
                        }
                
                
                        return DC_COMPLETE;
                
-               case 4: /* set rx PL tone */
+               case 4: /* set tx PL tone */
                        
                        for(i = 0, j = 0, k = 0, l = 0 ; digitbuf[i] ; i++){ /* 
look for N+*N */
                                if(digitbuf[i] == '*'){
@@ -3533,11 +3668,11 @@
                        s = strchr(tmp,'*');
                        if(s)
                                *s = '.';
-                       strncpy(savestr, myrpt->rxpl, sizeof(savestr) - 1);
-                       strncpy(myrpt->rxpl, tmp, sizeof(myrpt->rxpl) - 1);
+                       strncpy(savestr, myrpt->txpl, sizeof(savestr) - 1);
+                       strncpy(myrpt->txpl, tmp, sizeof(myrpt->txpl) - 1);
                        
                        if (setrem(myrpt) == -1){
-                               strncpy(myrpt->rxpl, savestr, 
sizeof(myrpt->rxpl) - 1);
+                               strncpy(myrpt->txpl, savestr, 
sizeof(myrpt->txpl) - 1);
                                return DC_ERROR;
                        }
                
@@ -3559,23 +3694,29 @@
                                        if(m < 29) /* No FM allowed below 
29MHz! */
                                                return DC_ERROR;
                                        myrpt->remmode = REM_MODE_FM;
+                                       res = rmt_saycharstr(myrpt, mychannel, 
1000,"FM");
                                        break;
 
                                case '2':
                                        myrpt->remmode = REM_MODE_USB;
-                                       break;
+                                       res = rmt_saycharstr(myrpt, mychannel, 
1000,"USB");
+                                       break;  
 
                                case '3':
                                        myrpt->remmode = REM_MODE_LSB;
+                                       res = rmt_saycharstr(myrpt, mychannel, 
1000,"LSB");
                                        break;
                                
                                case '4':
                                        myrpt->remmode = REM_MODE_AM;
+                                       res = rmt_saycharstr(myrpt, mychannel, 
1000,"AM");
                                        break;
                
                                default:
                                        return DC_ERROR;
                        }
+                       if(res)
+                               return DC_ERROR;
 
                        if(setrem(myrpt))
                                return DC_ERROR;
@@ -3588,39 +3729,68 @@
                case 104: 
                case 105: 
                case 106:
- 
+                       res = rmt_telem_start(myrpt, mychannel, 1000);
                        switch(myatoi(param)){ /* Quick commands requiring a 
setrem call */
                                case 100: /* RX PL Off */
                                        myrpt->rxplon = 0;
+                                       if(!res)
+                                               res = sayfile(mychannel, 
"rpt/rxpl");
+                                       if(!res)
+                                               sayfile(mychannel, "rpt/off");
                                        break;
                                        
                                case 101: /* RX PL On */
                                        myrpt->rxplon = 1;
+                                       if(!res)
+                                               res = sayfile(mychannel, 
"rpt/rxpl");
+                                       if(!res)
+                                               sayfile(mychannel, "rpt/on");
                                        break;
+
                                        
                                case 102: /* TX PL Off */
                                        myrpt->txplon = 0;
+                                       if(!res)
+                                               res = sayfile(mychannel, 
"rpt/txpl");
+                                       if(!res)
+                                               sayfile(mychannel, "rpt/off");
                                        break;
                                        
                                case 103: /* TX PL On */
                                        myrpt->txplon = 1;
+                                       if(!res)
+                                               res = sayfile(mychannel, 
"rpt/txpl");
+                                       if(!res)
+                                               sayfile(mychannel, "rpt/on");
                                        break;
                                        
                                case 104: /* Low Power */
                                        myrpt->powerlevel = REM_LOWPWR;
+                                       if(!res)
+                                               res = sayfile(mychannel, 
"rpt/lopwr");
                                        break;
                                        
                                case 105: /* Medium Power */
                                        myrpt->powerlevel = REM_MEDPWR;
+                                       if(!res)
+                                               res = sayfile(mychannel, 
"rpt/medpwr");
                                        break;
                                        
                                case 106: /* Hi Power */
                                        myrpt->powerlevel = REM_HIPWR;
+                                       if(!res)
+                                               res = sayfile(mychannel, 
"rpt/hipwr");
                                        break;
                        
                                default:
+                                       if(!res)
+                                               rmt_telem_finish(myrpt, 
mychannel);
                                        return DC_ERROR;
                        }
+                       if(!res)
+                               res = rmt_telem_finish(myrpt, mychannel);
+                       if(res)
+                               return DC_ERROR;
 
                        if (setrem(myrpt) == -1) 
                                return DC_ERROR;
@@ -3726,9 +3896,7 @@
                                        }
                                        break;
                        }
-                       if (!myrpt->remoterx){
-                               ast_indicate(mychannel,AST_CONTROL_RADIO_UNKEY);
-                       }
+                       rmt_telem_finish(myrpt,mychannel);
                        return DC_COMPLETE;
 
 
@@ -3738,15 +3906,7 @@
 
                case 5: /* Long Status */
                case 140: /* Short Status */
-                       myrpt->remotetx = 0;
-                       ast_indicate(myrpt->txchannel,AST_CONTROL_RADIO_UNKEY);
-                       if (!myrpt->remoterx){
-                               ast_indicate(mychannel,AST_CONTROL_RADIO_KEY);
-                       }
-                       
-                       if (ast_safe_sleep(mychannel,1000) == -1)
-                                       return DC_ERROR;
-
+                       res = rmt_telem_start(myrpt, mychannel, 1000);
 
                        res = sayfile(mychannel,"rpt/node");
                        if(!res)
@@ -3768,10 +3928,7 @@
                                res = saycharstr(mychannel, decimals);
                
                        if(res){        
-                               if (!myrpt->remoterx){
-               
-                                       
ast_indicate(mychannel,AST_CONTROL_RADIO_UNKEY);
-                               }
+                               rmt_telem_finish(myrpt,mychannel);
                                return DC_ERROR;
                        }
                        if(myrpt->remmode == REM_MODE_FM){ /* Mode FM? */
@@ -3816,17 +3973,17 @@
                        }
 
                        if (res == -1){
-               
-                               if (!myrpt->remoterx){
-               
-                                       
ast_indicate(mychannel,AST_CONTROL_RADIO_UNKEY);
-                               }
+                               rmt_telem_finish(myrpt,mychannel);
                                return DC_ERROR;
                        }
 
-                       if(myatoi(param) == 140) /* Short status? */
+                       if(myatoi(param) == 140){ /* Short status? */
+                               if(!res)
+                                       res = rmt_telem_finish(myrpt, 
mychannel);
+                               if(res)
+                                       return DC_ERROR;
                                return DC_COMPLETE;
-
+                       }
 
                        switch(myrpt->powerlevel){
 
@@ -3850,17 +4007,17 @@
                                (sayfile(mychannel,"rpt/txpl") == -1) ||
                                (sayfile(mychannel,((myrpt->txplon) ? "rpt/on" 
: "rpt/off")) == -1) ||
                                (sayfile(mychannel,"rpt/rxpl") == -1) ||
-                               (sayfile(mychannel,((myrpt->rxplon) ? "rpt/on" 
: "rpt/off")) == -1)){
-                               if (!myrpt->remoterx){
-                                       
ast_indicate(mychannel,AST_CONTROL_RADIO_UNKEY);
+                               (sayfile(mychannel,((myrpt->rxplon) ? "rpt/on" 
: "rpt/off")) == -1))
+                               {
+                                       rmt_telem_finish(myrpt,mychannel);
+                                       return DC_ERROR;
                                }
+                       if(!res)
+                               res = rmt_telem_finish(myrpt,mychannel);
+                       if(res)
                                return DC_ERROR;
-                       }
-                       if (!myrpt->remoterx){
-                               ast_indicate(mychannel,AST_CONTROL_RADIO_UNKEY);
-                       }
+
                        return DC_COMPLETE;
-                       
                default:
                        return DC_ERROR;
        }
@@ -3986,10 +4143,7 @@
        }
        if (ast_safe_sleep(myrpt->remchannel,1000) == -1) return -1;
        res = telem_lookup(myrpt->remchannel, myrpt->name, "functcomplete");
-       if (!myrpt->remoterx)
-       {
-               ast_indicate(myrpt->remchannel,AST_CONTROL_RADIO_UNKEY);
-       }
+       rmt_telem_finish(myrpt,myrpt->remchannel);
        return res;
 }
 
@@ -4415,7 +4569,7 @@
                {
                        myrpt->tounkeyed = 1;
                }
-               if ((!totx) && (!myrpt->totimer) && myrpt->tounkeyed && 
myrpt->localtx)
+               if ((!totx) && (!myrpt->totimer) && myrpt->tounkeyed && 
myrpt->keyed)
                {
                        myrpt->totimer = myrpt->totime;
                        myrpt->tounkeyed = 0;
@@ -4797,13 +4951,13 @@
                                /* if RX key */
                                if (f->subclass == AST_CONTROL_RADIO_KEY)
                                {
-                                       if (debug) printf("@@@@ rx key1 
%s\n",myrpt->name);
+                                       if (debug) printf("@@@@ rx key\n");
                                        myrpt->keyed = 1;
                                }
                                /* if RX un-key */
                                if (f->subclass == AST_CONTROL_RADIO_UNKEY)
                                {
-                                       if (debug) printf("@@@@ rx un-key1 
%s\n",myrpt->name);
+                                       if (debug) printf("@@@@ rx un-key\n");
                                        if(myrpt->keyed) {
                                                rpt_telemetry(myrpt,UNKEY,NULL);
                                        }
@@ -4963,13 +5117,13 @@
                                        /* if RX key */
                                        if (f->subclass == 
AST_CONTROL_RADIO_KEY)
                                        {
-                                               if (debug) printf("@@@@ rx 
key2, %s\n",l->name);
+                                               if (debug) printf("@@@@ rx 
key\n");
                                                l->lastrx = 1;
                                        }
                                        /* if RX un-key */
                                        if (f->subclass == 
AST_CONTROL_RADIO_UNKEY)
                                        {
-                                               if (debug) printf("@@@@ rx 
un-key2, %s\n",l->name);
+                                               if (debug) printf("@@@@ rx 
un-key\n");
                                                l->lastrx = 0;
                                        }
                                        if (f->subclass == AST_CONTROL_HANGUP)
@@ -5306,6 +5460,7 @@
        struct ast_channel *cs[20];
        struct  rpt_link *l;
        ZT_CONFINFO ci;  /* conference info */
+       ZT_PARAMS par;
        int ms,elap;
 
        if (!data || ast_strlen_zero((char *)data)) {
@@ -5528,6 +5683,15 @@
        if (chan->_state != AST_STATE_UP) {
                ast_answer(chan);
        }
+
+       if (ioctl(myrpt->txchannel->fds[0],ZT_GET_PARAMS,&par) != -1)
+       {
+               if (par.rxisoffhook)
+               {
+                       ast_indicate(chan,AST_CONTROL_RADIO_KEY);
+                       myrpt->remoterx = 1;
+               }
+       }
        n = 0;
        cs[n++] = chan;
        cs[n++] = myrpt->rxchannel;
@@ -5574,14 +5738,11 @@
                                ast_indicate(chan, AST_CONTROL_RADIO_KEY);
                        if(play_tone(chan, 800, 6000, 8192) == -1)
                                break;
-                       if(myrpt->remoterx == 0)
-                               ast_indicate(chan, AST_CONTROL_RADIO_UNKEY);
+
+                       rmt_telem_finish(myrpt,chan);
                        set_mode_ft897(myrpt, 0x88);
                        setrem(myrpt);
                }
-                               
-                       
-                       
        
                if (myrpt->hfscanmode){
                        myrpt->scantimer -= elap;
@@ -5656,10 +5817,7 @@
                                {
                                        saynum(myrpt->remchannel, 
myrpt->hfscanstatus );
                                }       
-                               if (!myrpt->remoterx)
-                               {
-                                       
ast_indicate(myrpt->remchannel,AST_CONTROL_RADIO_UNKEY);
-                               }
+                               rmt_telem_finish(myrpt,myrpt->remchannel);
                                myrpt->hfscanstatus = 0;
                        }
                        ast_frfree(f);

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to