From 72bc03d23e6fb85d64dee3335eb23db6cba8a330 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 10 Nov 2020 20:50:25 +0000 Subject: [PATCH] working through frame repeater bugs --- README.md | 7 ++++++- tx/Makefile | 11 ++++++----- tx/frame_repeater.c | 23 +++++++++++++---------- tx/rpitx_fsk.cpp | 32 +++++++++++++++++++++++++------- 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index c485911..cadf07f 100644 --- a/README.md +++ b/README.md @@ -242,7 +242,12 @@ $ ./build_rtlsdr.sh ./src/rtl_fsk -g 30 -f 144490000 - -r 10000 -m 2 -a 180000 --code H_256_512_4 -v -u localhost --testframes -m 4 --mask 10000 > /dev/null ``` - +1. Frame Repeater: + ``` + $ cd pirip/lirtlsdr/build_linux + $ ./src/rtl_fsk -g 49 -f 144490000 - -a 200000 -r 10000 --code H_256_512_4 --mask 10000 -q -v | ~/pirip/tx/frame_repeater 256 ~/pirip/fifo | sudo ~/pirip/tx/rpitx_fsk - --code H_256_512_4 -r 10000 -s 10000 -g 21 --fifo ~/pirip/fifo + ``` + # Reading Further 1. [Open IP over VHF/UHF 1](http://www.rowetel.com/?p=7207) - Blog post introducing this project diff --git a/tx/Makefile b/tx/Makefile index b32dab0..a8da50f 100644 --- a/tx/Makefile +++ b/tx/Makefile @@ -2,14 +2,15 @@ all: rpitx_fsk frame_repeater -CODEC2_DIR=../codec2/build_linux/src -CXXFLAGS = -std=c++11 -Wall -g -O2 -Wno-unused-variable -I../codec2/src -CFLAGS = -Wall -g -O2 -Wno-unused-variable -I../codec2/src -LDFLAGS = ../librpitx/src/librpitx.a $(CODEC2_DIR)/libcodec2.so -Wl,-rpath=$(CODEC2_DIR) -lm -lrt -lpthread +CODEC2_DIR=$(HOME)/pirip/codec2/build_linux/src +LIBRTLSDR_DIR=$(HOME)/pirip/librpitx/src/ +CXXFLAGS = -std=c++11 -Wall -g -O2 -Wno-unused-variable -I$(HOME)/pirip/codec2/src +CFLAGS = -Wall -g -O2 -Wno-unused-variable -I$(HOME)/pirip/codec2/src +LDFLAGS = $(LIBRTLSDR_DIR)/librpitx.a $(CODEC2_DIR)/libcodec2.so -Wl,-rpath=$(CODEC2_DIR) -lm -lrt -lpthread CCP = c++ CC = cc -rpitx_fsk : rpitx_fsk.cpp ../librpitx/src/librpitx.a +rpitx_fsk : rpitx_fsk.cpp $(LIBRTLSDR_DIR)/librpitx.a $(CCP) $(CXXFLAGS) -o rpitx_fsk rpitx_fsk.cpp $(LDFLAGS) frame_repeater : frame_repeater.c diff --git a/tx/frame_repeater.c b/tx/frame_repeater.c index 6c2721f..af3fd6b 100644 --- a/tx/frame_repeater.c +++ b/tx/frame_repeater.c @@ -44,31 +44,31 @@ int main(int argc, char *argv[]) { } int data_bits_per_frame = atoi(argv[1]); - fprintf(stderr, "%d\n", data_bits_per_frame); assert((data_bits_per_frame % 8) == 0); int data_bytes_per_frame = data_bits_per_frame/8; + fprintf(stderr, "frame_repeater: %d %d\n", data_bits_per_frame, data_bytes_per_frame); uint8_t data[data_bytes_per_frame]; uint8_t data_buffer[data_bytes_per_frame*MAX_FRAMES]; - fprintf(stderr, "opening FIFO\n"); - int rpitx_fsk_fifo = open(argv[2], O_RDONLY, O_NONBLOCK); + fprintf(stderr, "frame_repeater: opening FIFO\n"); + int rpitx_fsk_fifo = open(argv[2], O_RDONLY | O_NONBLOCK); if (rpitx_fsk_fifo == -1) { - fprintf(stderr, "Error opening %s\n", argv[2]); + fprintf(stderr, "Error opening fifo %s\n", argv[2]); exit(1); } + fprintf(stderr, "frame_repeater: FIFO opened OK ...\n"); /* At regular intervals rtl_fsk sends a status byte then data_bytes_per_frame. If there is no received data then data_buffer will be all zeros. */ - uint8_t rx_status; - fprintf(stderr, "reading status ...\n"); + uint8_t rx_status, prev_rx_status = 0; while(fread(&rx_status, sizeof(uint8_t), 1, stdin)) { - fprintf(stderr, "reading data ...\n"); ret = fread(data, sizeof(uint8_t), data_bytes_per_frame, stdin); assert(ret == data_bytes_per_frame); tx_off_event = 0; // messages from rpitx_fsk in fifo create events + //fprintf(stderr, "about to poll FIFO\n"); char buf[256]; ret = read(rpitx_fsk_fifo, buf, sizeof(buf)); if (ret > 0) { @@ -76,12 +76,13 @@ int main(int argc, char *argv[]) { if (strcmp(buf,"Tx off\n") == 0) tx_off_event = 0; } - fprintf(stderr, "state: %d rx_status: %d tx_off_event: %d\n", state, rx_status, tx_off_event); + if (prev_rx_status != rx_status) + fprintf(stderr, "frame_repeater: state: %d rx_status: 0x%02x tx_off_event: %d\n", state, rx_status, tx_off_event); next_state = state; switch(state) { case IDLE: - if (rx_status & FREEDV_RX_BITS) { + if (rx_status == (FREEDV_RX_SYNC | FREEDV_RX_BITS)) { fprintf(stderr, " Starting to receive a burst\n"); memcpy(data_buffer, data, data_bytes_per_frame); bytes_in = data_bytes_per_frame; @@ -97,7 +98,7 @@ int main(int argc, char *argv[]) { assert(bytes_in <= data_bytes_per_frame*MAX_FRAMES); } if (!(rx_status & FREEDV_RX_SYNC)) { - fprintf(stderr, " Sending received burst\n"); + fprintf(stderr, " Sending received burst of %d bytes\n", bytes_in); /* We've lost RX_SYNC so receive burst finished. So lets Tx data we received. fwrite's shouldn't block due to size of stdout buffer */ @@ -111,6 +112,7 @@ int main(int argc, char *argv[]) { burst_control = 2; memset(data, 0, data_bytes_per_frame); fwrite(&burst_control, sizeof(uint8_t), data_bytes_per_frame, stdout); fwrite(data, sizeof(uint8_t), data_bytes_per_frame, stdout); + fflush(stdout); next_state = WAIT_FOR_TX_OFF; } break; @@ -130,6 +132,7 @@ int main(int argc, char *argv[]) { assert(0); } state = next_state; + prev_rx_status = rx_status; } return 0; diff --git a/tx/rpitx_fsk.cpp b/tx/rpitx_fsk.cpp index a26a732..ce12804 100644 --- a/tx/rpitx_fsk.cpp +++ b/tx/rpitx_fsk.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "../librpitx/src/librpitx.h" #include "ldpc_codes.h" @@ -121,7 +122,8 @@ int main(int argc, char **argv) int sequence_numbers = 0; char ant_switch_gpio[128] = ""; char ant_switch_gpio_path[MAX_CHAR] = ""; - + int rpitx_fsk_fifo = 0; + char usage[] = "usage: %s [-m fskM 2|4] [-f carrierFreqHz] [-r symbRateHz] [-s shiftHz] [-t] [-c] " "[--testframes Nframes] InputOneBitPerCharFile\n" " -c Carrier test mode\n" @@ -132,6 +134,7 @@ int main(int argc, char **argv) " --testframes N Send N testframes per burst\n" " --bursts B Send B bursts of N testframes (default 1)\n" " --seq send packet sequence numbers (breaks testframe BER counting)\n" + " --fifo fifoName send stats messages to fifoName\n" "\n" " Example 1, send 10000 bits of (100 bit) tests frames from external test frame generator\n" " at 1000 bits/s using 2FSK:\n\n" @@ -148,10 +151,11 @@ int main(int argc, char **argv) {"testframes",required_argument, 0, 'u'}, {"bursts", required_argument, 0, 'e'}, {"seq", no_argument, 0, 'q'}, + {"fifo", required_argument, 0, 'i'}, {0, 0, 0, 0} }; - opt = getopt_long(argc,argv,"a:bce:f:g:m:qr:s:tu:",long_opts,&opt_idx); + opt = getopt_long(argc,argv,"a:bce:f:g:i:m:qr:s:tu:",long_opts,&opt_idx); switch (opt) { case 'a': @@ -174,6 +178,14 @@ int main(int argc, char **argv) case 'f': frequency = atof(optarg); break; + case 'i': + rpitx_fsk_fifo = open(optarg, O_WRONLY); + if (rpitx_fsk_fifo == -1) { + fprintf(stderr, "Error opening fifo %s\n", argv[2]); + exit(1); + } + fprintf(stderr, "rpitx_fsk: FIFO opened OK ...\n"); + break; case 'q': sequence_numbers = 1; break; @@ -264,6 +276,7 @@ int main(int argc, char **argv) if (shiftHz == -1) shiftHz = 2*SymbolRate; 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); @@ -340,7 +353,7 @@ int main(int argc, char **argv) BytesRead = fread(data_bits, sizeof(uint8_t), data_bits_per_frame, fin); - fprintf(stderr, "burst_control: %d BytesRead: %d\n", burst_control, BytesRead); + fprintf(stderr, "rpitx_fsk: burst_control: %d BytesRead: %d\n", burst_control, BytesRead); if (BytesRead != data_bits_per_frame) goto finished; @@ -348,18 +361,18 @@ int main(int argc, char **argv) // start of burst if (burst_control == 1) { - fprintf(stderr, "Tx on\n"); + fprintf(stderr, "rpitx_fsk: Tx on\n"); // antenna switch to Tx if (*ant_switch_gpio_path) sys_gpio(ant_switch_gpio_path, "1"); // transmitter carrier on fmmod->clkgpio::enableclk(4); // send preamble - fprintf(stderr, "sending preamble\n"); + fprintf(stderr, "rpitx_fsk: sending preamble\n"); modulate_frame(fmmod, shiftHz, m, preamble_bits, npreamble_bits); } if ((burst_control == 0) || (burst_control == 1)) { - fprintf(stderr, "sending frames\n"); + fprintf(stderr, "rpitx_fsk: sending frames\n"); // send a data frame, note last two bytes in frame replaced with CRC calculate_and_insert_crc(data_bits, data_bits_per_frame); freedv_tx_fsk_ldpc_framer(freedv, tx_frame, data_bits); @@ -376,7 +389,12 @@ int main(int argc, char **argv) fmmod->clkgpio::disableclk(4); // antenna switch to Rx if (*ant_switch_gpio_path) sys_gpio(ant_switch_gpio_path, "0"); - fprintf(stderr, "Tx off\n"); + fprintf(stderr, "rpitx_fsk: Tx off\n"); + char buf[256]; + sprintf(buf, "Tx off\n"); + if (write(rpitx_fsk_fifo, buf, strlen(buf)) ==-1) { + fprintf(stderr, "rpitx_fsk: error writing to FIFO\n"); + } } } else {