# HG changeset patch # User Mychaela Falconia # Date 1465866168 0 # Node ID 971906d7763d4030bcea58aa491afe8a23d78468 # Parent 6a029ad28212a85adb08a0e4e8d66c12b4ebd51d fc-shell tch commands: changed to raw hex file format This "backward" change is needed for two reasons: 1) to support EFR in addition to 06.10 2) to preserve the DSP status words for the downlink diff -r 6a029ad28212 -r 971906d7763d rvinterf/asyncshell/Makefile --- a/rvinterf/asyncshell/Makefile Sat Jun 11 01:52:51 2016 +0000 +++ b/rvinterf/asyncshell/Makefile Tue Jun 14 01:02:48 2016 +0000 @@ -1,8 +1,8 @@ CC= gcc CFLAGS= -O2 -I../include PROG= fc-shell -OBJS= at.o gsm0610.o init.o main.o oneshot.o parse.o pktsort.o poweroff.o \ - rxctl.o sendarb.o sendsp.o tchcmd.o tchplay.o tchrec.o usercmd.o +OBJS= at.o init.o main.o oneshot.o parse.o pktsort.o poweroff.o rxctl.o \ + sendarb.o sendsp.o tchcmd.o tchplay.o tchrec.o usercmd.o LIBS= ../libasync/libasync.a ../libg23/libg23.a INSTBIN=/usr/local/bin diff -r 6a029ad28212 -r 971906d7763d rvinterf/asyncshell/tchplay.c --- a/rvinterf/asyncshell/tchplay.c Sat Jun 11 01:52:51 2016 +0000 +++ b/rvinterf/asyncshell/tchplay.c Tue Jun 14 01:02:48 2016 +0000 @@ -3,6 +3,7 @@ */ #include +#include #include #include #include @@ -15,7 +16,7 @@ extern void async_msg_output(); -static FILE *gsm_data_file; +static FILE *play_file; static int queued_frames; #define QUEUE_LIMIT 3 @@ -27,30 +28,60 @@ printf("%s\n", msg); } +static +decode_hex_digit(ch) +{ + if (isdigit(ch)) + return(ch - '0'); + else if (isupper(ch)) + return(ch - 'A' + 10); + else + return(ch - 'a' + 10); +} + +static +decode_hex_line(line, bytes) + char *line; + u_char *bytes; +{ + int i; + + for (i = 0; i < 33; i++) { + if (!isxdigit(line[0]) || !isxdigit(line[1])) + return(-1); + bytes[i] = (decode_hex_digit(line[0]) << 4) | + decode_hex_digit(line[1]); + line += 2; + } + for (; *line; line++) + if (!isspace(*line)) + return(-1); + return(0); +} + static void fill_uplink(msgout) void (*msgout)(); { - u_char readbytes[33], sendpkt[35]; + char line[80]; + u_char sendpkt[35]; int cc; sendpkt[0] = RVT_TCH_HEADER; sendpkt[1] = TCH_ULBITS_REQ; while (queued_frames < QUEUE_LIMIT) { - cc = fread(readbytes, 1, 33, gsm_data_file); - if (cc < 33) { - if (cc) - msgout("TCH UL: extra bytes at the end of the file"); + if (!fgets(line, sizeof line, play_file)) { msgout("TCH UL: file play finished"); - gsm_data_file = 0; + fclose(play_file); + play_file = 0; return; } - if ((readbytes[0] & 0xF0) != 0xD0) { + if (decode_hex_line(line, sendpkt + 2) < 0) { msgout("TCH UL: bad file input, play aborted"); - gsm_data_file = 0; + fclose(play_file); + play_file = 0; return; } - gsm0610_libgsm_to_tidsp(readbytes, sendpkt + 2); send_pkt_to_target(sendpkt, 35); queued_frames++; } @@ -61,7 +92,7 @@ { if (queued_frames > 0) queued_frames--; - if (gsm_data_file) + if (play_file) fill_uplink(async_msg_output); } @@ -69,12 +100,12 @@ cmd_tch_play_start(filename) char *filename; { - if (gsm_data_file) { + if (play_file) { printf("error: tch play session already in progress\n"); return; } - gsm_data_file = fopen(filename, "r"); - if (!gsm_data_file) { + play_file = fopen(filename, "r"); + if (!play_file) { perror(filename); return; } @@ -86,12 +117,12 @@ static void cmd_tch_play_stop() { - if (!gsm_data_file) { + if (!play_file) { printf("error: no tch play session in progress\n"); return; } - fclose(gsm_data_file); - gsm_data_file = 0; + fclose(play_file); + play_file = 0; printf("TCH UL play from file terminated\n"); } @@ -113,6 +144,6 @@ show_tch_play_status() { printf("TCH UL play from file: %s\n", - gsm_data_file ? "RUNNING" : "not running"); + play_file ? "RUNNING" : "not running"); printf("Outstanding UL frames: %d\n", queued_frames); } diff -r 6a029ad28212 -r 971906d7763d rvinterf/asyncshell/tchrec.c --- a/rvinterf/asyncshell/tchrec.c Sat Jun 11 01:52:51 2016 +0000 +++ b/rvinterf/asyncshell/tchrec.c Tue Jun 14 01:02:48 2016 +0000 @@ -13,18 +13,29 @@ extern u_char rvi_msg[]; extern int rvi_msg_len; -static FILE *gsm_data_file; +static FILE *record_file; static u_long frame_count; void tch_dlbits_handler() { - u_char writebytes[33]; + u_char *ptr; + int i; - if (!gsm_data_file) + if (!record_file) return; - gsm0610_tidsp_to_libgsm(rvi_msg + 9, writebytes); - fwrite(writebytes, 1, 33, gsm_data_file); + /* DSP status words */ + ptr = rvi_msg + 3; + for (i = 0; i < 3; i++) { + fprintf(record_file, "%02X%02X ", ptr[0], ptr[1]); + ptr += 2; + } + /* frame bits */ + for (i = 0; i < 33; i++) { + fprintf(record_file, "%02X", *ptr); + ptr++; + } + putc('\n', record_file); frame_count++; } @@ -32,12 +43,12 @@ cmd_tch_record_start(filename) char *filename; { - if (gsm_data_file) { + if (record_file) { printf("error: tch record session already in progress\n"); return; } - gsm_data_file = fopen(filename, "w"); - if (!gsm_data_file) { + record_file = fopen(filename, "w"); + if (!record_file) { perror(filename); return; } @@ -50,12 +61,12 @@ static void cmd_tch_record_stop() { - if (!gsm_data_file) { + if (!record_file) { printf("error: no tch record session in progress\n"); return; } - fclose(gsm_data_file); - gsm_data_file = 0; + fclose(record_file); + record_file = 0; printf("TCH DL recording stopped, captured %lu speech frames\n", frame_count); send_tch_config_req(0); @@ -79,5 +90,5 @@ show_tch_record_status() { printf("TCH DL recording: %s\n", - gsm_data_file ? "RUNNING" : "not running"); + record_file ? "RUNNING" : "not running"); }