From fe8771b8eca9a6c193877260faca60c8c19e62f3 Mon Sep 17 00:00:00 2001 From: pabr Date: Tue, 27 Mar 2018 12:29:37 +0200 Subject: [PATCH] Allow non-blocking stdin for leandvbtx real-time mode. --- ChangeLog.md | 4 ++++ src/apps/leandvbtx.cc | 13 +++++++++++++ src/leansdr/generic.h | 14 ++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index b394c81..ee2bc12 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,4 +1,8 @@ HEAD + * leandvbtx: Added real-time mode (-fill). + * leansdrserv: Network access to leansdr command pipelines. + * leaniio{rx,tx}: PlutoSDR support via libiio. + * leanmlmrx: Multi-channel FM demodulator. * leandvb: Spectrum output, JSON syntax. * leandvb, leandvbtx: DVB-S with non-standard constellations (with --viterbi). * leandvb: Support all DVB-S code rates with --viterbi. diff --git a/src/apps/leandvbtx.cc b/src/apps/leandvbtx.cc index 2e99765..6607ccc 100644 --- a/src/apps/leandvbtx.cc +++ b/src/apps/leandvbtx.cc @@ -50,12 +50,14 @@ struct config { float rolloff; float rrc_rej; enum { OUTPUT_F32, OUTPUT_S16 } output_format; + bool fill; bool verbose, debug; config() : constellation(cstln_lut<256>::QPSK), fec(FEC12), amp(1.0), agc(false), interp(2), decim(1), rolloff(0.35), rrc_rej(10), output_format(OUTPUT_F32), + fill(false), verbose(false), debug(false) { } }; @@ -167,6 +169,14 @@ void run(config &cfg) { fail("Output format not implemented"); } + if ( cfg.fill ) { + if ( cfg.verbose ) fprintf(stderr, "Realtime mode\n"); + tspacket blank; + memset(blank.data, 0, 188); + blank.data[0] = 0x47; + r_stdin.set_realtime(blank); + } + sch.run(); sch.shutdown(); if ( sch.verbose ) sch.dump(); @@ -192,6 +202,7 @@ void usage(const char *name, FILE *f, int c, const char *info=NULL) { " --agc Better regulation of output power\n" " --f32 Output 32-bit floats, range +-1.0 (default)\n" " --s16 Output 16-bit ints\n" + " --fill Insert blank packets\n" " -v Output debugging info at startup and exit\n" " -d Output debugging info during operation\n" " --version Display version and exit\n" @@ -272,6 +283,8 @@ int main(int argc, char *argv[]) { cfg.output_format = config::OUTPUT_F32; else if ( ! strcmp(argv[i], "--s16") ) cfg.output_format = config::OUTPUT_S16; + else if ( ! strcmp(argv[i], "--fill") ) + cfg.fill = true; else usage(argv[0], stderr, 1, argv[i]); } diff --git a/src/leansdr/generic.h b/src/leansdr/generic.h index 2a4329f..8a94f99 100644 --- a/src/leansdr/generic.h +++ b/src/leansdr/generic.h @@ -3,6 +3,8 @@ #include #include +#include +#include #include "leansdr/math.h" @@ -20,6 +22,7 @@ struct file_reader : runnable { file_reader(scheduler *sch, int _fdin, pipebuf &_out) : runnable(sch, _out.name), loop(false), + filler(NULL), fdin(_fdin), out(_out) { } @@ -29,6 +32,11 @@ struct file_reader : runnable { again: ssize_t nr = read(fdin, out.wr(), size); + if ( nr<0 && errno==EWOULDBLOCK && filler ) { + if ( sch->debug ) fprintf(stderr, "U"); + out.write(*filler); + return; + } if ( nr < 0 ) fatal("read"); if ( ! nr ) { if ( ! loop ) return; @@ -52,7 +60,13 @@ struct file_reader : runnable { out.written(nr / sizeof(T)); } bool loop; + void set_realtime(T &_filler) { + int flags = fcntl(fdin, F_GETFL); + if ( fcntl(fdin, F_SETFL, flags|O_NONBLOCK) ) fatal("fcntl"); + filler = new T(_filler); + } private: + T *filler; int fdin; pipewriter out; };