mirror of https://github.com/drowe67/pirip.git
working through frame repeater bugs
parent
d463c27c4e
commit
72bc03d23e
|
@ -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
|
||||
|
|
11
tx/Makefile
11
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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,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 {
|
||||
|
|
Loading…
Reference in New Issue