working through frame repeater bugs

pull/3/head
David Rowe 2020-11-10 20:50:25 +00:00
parent d463c27c4e
commit 72bc03d23e
4 changed files with 50 additions and 23 deletions

View File

@ -242,6 +242,11 @@ $ ./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

View File

@ -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

View File

@ -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;

View File

@ -22,6 +22,7 @@
#include <signal.h>
#include <getopt.h>
#include <unistd.h>
#include <fcntl.h>
#include "../librpitx/src/librpitx.h"
#include "ldpc_codes.h"
@ -121,6 +122,7 @@ 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"
@ -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 {