diff --git a/script/frame_repeater b/script/frame_repeater index effcf5c..7285116 100755 --- a/script/frame_repeater +++ b/script/frame_repeater @@ -1,4 +1,4 @@ -#!/bin/bash -x +#!/bin/bash # frame repeater service # TODO @@ -18,20 +18,50 @@ PIDFILE=/var/run/${NAME}.pid LOGFILE=/var/log/${NAME}.log PATH=${PIRIP_PATH}/tx:${PIRIP_PATH}/librtlsdr/build_rtlsdr/src:${PATH} +function tx_burst_rpitx { + num_bursts=$1 + pause_between_bursts=$2 + tmp=$(mktemp) + for (( i=1; i<=$num_bursts; i++ )) + do + printf "%d Tx burst %d from RPiTx...\n" `date +%s` ${i} 1>&2 + rpitx_fsk /dev/zero --code H_256_512_4 -r ${RS} -s ${RS} --testframes 1 -g 21 -m 2 + sleep $pause_between_bursts + done +} + +function start_rx { + rtl_fsk -g 49 -f 144490000 - -a 200000 -r ${RS} --code H_256_512_4 --mask ${RS} -L $1 > /dev/null & + echo $!>${PIDFILE} +} + +function stop_service { + echo "service stopping - bye!" 1>&2 + parent=$(cat ${PIDFILE}) + kill ${parent} + rm ${PIDFILE} +} + case "$1" in start) ( rtl_fsk -g 49 -f 144490000 - -a 200000 -r ${RS} --code ${CODE} --mask ${RS} --filter ${TERM_ADDR} -q -b | \ frame_repeater ${DATA_BITS_PER_FRAME} ${TERM_ADDR} | \ - rpitx_fsk - --code ${CODE} -r ${RS} -s ${RS} -g ${TR_SWITCH_GPIO} -- ) >>${LOGFILE} 2>&1 & - RETVAL=$? + rpitx_fsk - --code ${CODE} -r ${RS} -s ${RS} -g ${TR_SWITCH_GPIO} --packed -- ) >>${LOGFILE} 2>&1 & echo $!>${PIDFILE} - [ $RETVAL = 0 ] && echo -ne '\t\t\t\t\t[ \033[32mOK\033[0m ]\n' + ;; + start_verbose) + # run in the foreground and log to stderr instead of a logfile + rtl_fsk -g 49 -f 144490000 - -a 200000 -r ${RS} --code ${CODE} --mask ${RS} --filter ${TERM_ADDR} -q -b -v | \ + frame_repeater ${DATA_BITS_PER_FRAME} ${TERM_ADDR} | \ + rpitx_fsk - --code ${CODE} -r ${RS} -s ${RS} -g ${TR_SWITCH_GPIO} --packed -- + ;; + start_loopback) + # Send packets from Pi to RTLSDR on this machine (no filtering of packets) + verbose=1 + start_rx && sleep 1 && tx_burst_rpitx 1 1 && stop_service ;; stop) - parent=$(cat ${PIDFILE}) - children=$(ps -o pid= --ppid ${parent}) - kill ${children} - rm ${PIDFILE} + stop_service ;; restart) $0 stop @@ -46,7 +76,11 @@ case "$1" in fi ;; *) - echo "Usage: $0 {start|stop|status|restart}" + echo "Usage: $0 {start|stop|status|restart}" + echo "" + echo "start - start frame repeater service, logfile is ${LOGFILE}" + echo "start_verbose - start frame repeater in foreground, no logfile" + echo "start_loopback - local loopback test, tx/rx a single packet" esac exit 0 diff --git a/script/ping b/script/ping index 82e76a6..b9a1d72 100755 --- a/script/ping +++ b/script/ping @@ -18,22 +18,35 @@ PIDFILE=/var/run/${NAME}.pid LOGFILE=/var/log/${NAME}.log PATH=${PIRIP_PATH}/tx:${PIRIP_PATH}/librtlsdr/build_rtlsdr/src:${PATH} PATH=${PIRIP_PATH}/codec2/build_linux/misc:${PIRIP_PATH}/codec2/build_linux/src:${PATH} +PAUSE=10 function tx_burst_hackrf { num_bursts=$1 pause_between_bursts=$2 tmp=$(mktemp) - freedv_data_raw_tx --source 0x1 -c --testframes 3 --burst 1 --Fs 100000 --Rs ${RS} --tone1 ${RS} --shift ${RS} -a 30000 FSK_LDPC /dev/zero - 2>/dev/null | tlininterp - - 40 -d -f > ${tmp} - for (( i=1; i<=$num_bursts; i++ )) - do - printf "%d Tx burst %d from HackRF...\n" `date +%s` ${i} 1>&2 - hackrf_transfer -t ${tmp} -s 4E6 -f 143.5E6 2>/dev/null 1>/dev/null + if [ -z ${verbose+x} ]; then + # quiet version + freedv_data_raw_tx --source 0x1 -c --testframes 3 --burst 1 --Fs 100000 --Rs ${RS} --tone1 ${RS} --shift ${RS} -a 30000 FSK_LDPC /dev/zero - 2>/dev/null | tlininterp - - 40 -d -f > ${tmp} + for (( i=1; i<=$num_bursts; i++ )) + do + printf "%d Tx burst %d from HackRF...\n" `date +%s` ${i} 1>&2 + hackrf_transfer -t ${tmp} -s 4E6 -f 143.5E6 2>/dev/null 1>/dev/null sleep $pause_between_bursts - done + done + else + # verbose version + freedv_data_raw_tx --source 0x1 -c --testframes 3 --burst 1 --Fs 100000 --Rs ${RS} --tone1 ${RS} --shift ${RS} -a 30000 FSK_LDPC /dev/zero - | tlininterp - - 40 -d -f > ${tmp} + for (( i=1; i<=$num_bursts; i++ )) + do + printf "%d Tx burst %d from HackRF...\n" `date +%s` ${i} 1>&2 + hackrf_transfer -t ${tmp} -s 4E6 -f 143.5E6 + sleep $pause_between_bursts + done + fi } function start_rx { - rtl_fsk -g 49 -f 144490000 - -a 200000 -r 10000 --code H_256_512_4 --mask 10000 -L > /dev/null & + rtl_fsk -g 49 -f 144490000 - -a 200000 -r 10000 --code H_256_512_4 --mask 10000 -L $1 > /dev/null & echo $!>${PIDFILE} } @@ -46,7 +59,17 @@ function stop_service { case "$1" in start) - ( start_rx && sleep 1 && tx_burst_hackrf 3 10 && stop_service) 2>>${LOGFILE} & + ( start_rx "--filter ${TERM_ADDR}" && sleep 1 && tx_burst_hackrf $2 ${PAUSE} && stop_service) 2>>${LOGFILE} & + ;; + start_verbose) + # Show all tool outputs and log output to stderr rather than logfile + verbose=1 + start_rx "--filter ${TERM_ADDR}" && sleep 1 && tx_burst_hackrf 1 1 && stop_service + ;; + start_loopback) + # Send packets from HackRF to RTLSDR on this machine (no filtering of packets) + verbose=1 + start_rx && sleep 1 && tx_burst_hackrf 1 1 && stop_service ;; stop) stop_service @@ -65,6 +88,10 @@ case "$1" in ;; *) echo "Usage: $0 {start|stop|status|restart}" + echo "" + echo "start numPings - send numPing test frames to frame repeater, one every ${PAUSE} seconds, logfile is ${LOGFILE}" + echo "start_verbose - send single test frame in foreground, no logfile" + echo "start_loopback - local loopback test, Tx/Rx a single packet" esac exit 0 diff --git a/tx/rpitx_fsk.cpp b/tx/rpitx_fsk.cpp index 65b7844..4cbe7a2 100644 --- a/tx/rpitx_fsk.cpp +++ b/tx/rpitx_fsk.cpp @@ -41,12 +41,17 @@ void freedv_unpack(unsigned char *bits, unsigned char *bytes, int nbits); bool running=true; static int terminate_calls = 0; +ngfmdmasync *fmmod = NULL; static void terminate(int num) { terminate_calls++; running=false; fprintf(stderr,"Caught signal %d - Terminating\n", num); - if (terminate_calls >= 5) exit(1); + if (terminate_calls >= 5) { + // make sure TX is off if we have to abort + if (fmmod) delete fmmod; + exit(1); + } } @@ -109,7 +114,6 @@ int main(int argc, char **argv) int m = 2; int log2m; float shiftHz = -1; - ngfmdmasync *fmmod = NULL; struct freedv *freedv = NULL; struct freedv_advanced adv; int fsk_ldpc = 0; @@ -217,7 +221,7 @@ int main(int argc, char **argv) } testframes = 1; Nframes = atoi(optarg); - fprintf(stderr, "Sending %d testframes...\n", Nframes); + fprintf(stderr, "rpitx_fsk: Sending %d testframe(s)...\n", Nframes); break; case 'g': strcpy(ant_switch_gpio, optarg); @@ -266,7 +270,7 @@ int main(int argc, char **argv) assert(freedv != NULL); data_bits_per_frame = freedv_get_bits_per_modem_frame(freedv); bits_per_frame = freedv_tx_fsk_ldpc_bits_per_frame(freedv); - fprintf(stderr, "FSK LDPC mode code: %s data_bits_per_frame: %d\n", adv.codename, data_bits_per_frame); + fprintf(stderr, "rpitx_fsk: FSK LDPC mode code: %s data_bits_per_frame: %d\n", adv.codename, data_bits_per_frame); /* set up preamble */ /* TODO: this should be a freeDV API function */ @@ -290,8 +294,8 @@ int main(int argc, char **argv) //fmmod = new ngfmdmasync(frequency,SymbolRate,14,FIFO_SIZE); //fmmod->clkgpio::disableclk(4); - fprintf(stderr, "Frequency: %4.1f MHz Rs: %4.1f kHz Shift: %4.1f kHz M: %d \n", frequency/1E6, SymbolRate/1E3, shiftHz/1E3, m); - fprintf(stderr, "data_bits_per_frame: %d bits_per_frame: %d\n", data_bits_per_frame, bits_per_frame); + fprintf(stderr, "rpitx_fsk: Frequency: %4.1f MHz Rs: %4.1f kHz Shift: %4.1f kHz M: %d \n", frequency/1E6, SymbolRate/1E3, shiftHz/1E3, m); + fprintf(stderr, "rpitx_fsk: data_bits_per_frame: %d bits_per_frame: %d\n", data_bits_per_frame, bits_per_frame); if ((carrier_test == 0) && (one_zero_test == 0)) { // FSK Tx -------------------------------------------------------------------- @@ -343,7 +347,7 @@ int main(int argc, char **argv) float tdelay = (float)bufferSamples/SymbolRate; usleep((int)(tdelay*1E6)); - printf("End of this burst\n"); + printf("rpitx_fsk: End of this burst\n"); // transmitter carrier off between bursts delete fmmod;