diff --git a/apps/app_rpt.c b/apps/app_rpt.c index 56fe1b57a62b23afd50fee7f99d1a423745ef093..fa012b864b43f3821f720c9100ba69f3f6f93ed8 100755 --- a/apps/app_rpt.c +++ b/apps/app_rpt.c @@ -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 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #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 @@ int band,txoffset = 0,txpower = 0,txpl; /* 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 @@ static int check_freq_rbi(int m, int d) } else return -1; + + if(defmode) + *defmode = dflmd; + + return 0; } @@ -2716,6 +2723,29 @@ static int split_freq(char *mhz, char *decimals, char *freq) } +/* +* 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 @@ static int split_freq(char *mhz, char *decimals, char *freq) /* 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_mode_ft897(struct rpt *myrpt, char txplon, char rxplon) 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 @@ static int multimode_bump_freq_ft897(struct rpt *myrpt, int interval) 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 @@ static int closerem(struct rpt *myrpt) * 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 service_scan(struct rpt *myrpt) } +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 service_scan(struct rpt *myrpt) 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c i = strlen(digitbuf) - 1; if(multimode){ if((j > 2) || (l > 3) || (k > 6)) - return DC_ERROR; /* &^@#! */ + goto invalid_freq; /* &^@#! */ } else{ if((j > 2) || (l > 4) || (k > 3)) - return DC_ERROR; /* &^@#! */ + goto invalid_freq; /* &^@#! */ } - /* 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c } break; } - if (!myrpt->remoterx){ - ast_indicate(mychannel,AST_CONTROL_RADIO_UNKEY); - } + rmt_telem_finish(myrpt,mychannel); return DC_COMPLETE; @@ -3738,15 +3906,7 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c } 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 @@ static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int c (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 @@ int seq,res; } 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 @@ char cmd[MAXDTMF+1] = ""; { 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 @@ char cmd[MAXDTMF+1] = ""; /* 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 @@ char cmd[MAXDTMF+1] = ""; /* 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 @@ static int rpt_exec(struct ast_channel *chan, void *data) 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 @@ static int rpt_exec(struct ast_channel *chan, void *data) 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 @@ static int rpt_exec(struct ast_channel *chan, void *data) 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 @@ static int rpt_exec(struct ast_channel *chan, void *data) { 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);