From ecebf013f011e82072249e76c12bbab30969e9bd Mon Sep 17 00:00:00 2001 From: Nick Moriarty Date: Thu, 16 Apr 2015 19:51:14 +0100 Subject: [PATCH] Add ability to output a carrier while waiting for data Added --tx-carrier, which continues to output a tone while a blocking source waits for more data on stdin. --- src/minimodem.1.in | 4 ++ src/minimodem.c | 107 +++++++++++++++++++++++++++++++++------------ 2 files changed, 83 insertions(+), 28 deletions(-) diff --git a/src/minimodem.1.in b/src/minimodem.1.in index 90a7c1f..dc4f6b0 100644 --- a/src/minimodem.1.in +++ b/src/minimodem.1.in @@ -187,6 +187,10 @@ Filter the received text output, replacing any "non-printable" bytes with a '.' character. (This option applies to \-\-rx mode only). .TP +.B \-\-tx-carrier +When transmitting from a blocking source, keep a carrier going while waiting +for more data. +.TP .B \-\-benchmarks Run and report internal performance tests (all other flags are ignored). .TP diff --git a/src/minimodem.c b/src/minimodem.c index 5d0ccc8..0896395 100644 --- a/src/minimodem.c +++ b/src/minimodem.c @@ -31,6 +31,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include "config.h" @@ -119,12 +120,12 @@ static void fsk_transmit_stdin( int bfsk_msb_first, unsigned int bfsk_do_tx_sync_bytes, unsigned int bfsk_sync_byte, - databits_encoder encode + databits_encoder encode, + int txcarrier ) { size_t sample_rate = simpleaudio_get_rate(sa_out); size_t bit_nsamples = sample_rate / data_rate + 0.5; - int c; tx_sa_out = sa_out; tx_bfsk_mark_f = bfsk_mark_f; @@ -141,44 +142,85 @@ static void fsk_transmit_stdin( {0, 0} // it_value }; - if ( tx_interactive ) + int block_input = !( tx_interactive && txcarrier ); + if ( block_input ) signal(SIGALRM, tx_stop_transmit_sighandler); + // Set up for select() should we need it + int fd = fileno(stdin); + fd_set fdset; + tx_transmitting = 0; - while ( (c = getchar()) != EOF ) + int end_of_file = 0; + unsigned char buf; + int n_read = 0; + int idle = 0; + while ( !end_of_file ) { - if ( tx_interactive ) + FD_ZERO(&fdset); + FD_SET(fd, &fdset); + struct timeval tv_zero = { 0, 0 }; + if( block_input || select(fd+1, &fdset, NULL, NULL, &tv_zero) ) + { + n_read = read(fd, &buf, sizeof(buf)); + if( n_read <= 0 ) //Includes EOF (0) and errors (-1) + { + end_of_file = 1; + continue; //Do nothing else + } + idle = 0; + } + else + idle = 1; + + // Cause any running timer to immediately trigger + if ( block_input ) setitimer(ITIMER_REAL, &itv_zero, NULL); - // fprintf(stderr, "", c); - unsigned int nwords; - unsigned int bits[2]; - unsigned int j; - nwords = encode(bits, c); - - if ( !tx_transmitting ) + if( !idle ) { - tx_transmitting = 1; - /* emit leader tone (mark) */ - for ( j=0; j", c); + unsigned int nwords; + unsigned int bits[2]; + unsigned int j; + nwords = encode(bits, buf); + + if ( !tx_transmitting ) + { + tx_transmitting = 1; + /* emit leader tone (mark) */ + for ( j=0; j