From ea7cbb867554197e1c1397a71c3b770068c05c76 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Wed, 16 Aug 2017 18:50:37 +0200 Subject: [PATCH] SDR: Add option to enable TX timestamps on UHD devices (disabled by default) --- src/common/main_common.c | 13 ++++++++++++- src/common/sdr.c | 6 ++++-- src/common/sdr.h | 2 +- src/common/soapy.c | 2 +- src/common/uhd.c | 23 +++++++++++++++++------ src/common/uhd.h | 2 +- 6 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/common/main_common.c b/src/common/main_common.c index 734fa31..cb57aa5 100644 --- a/src/common/main_common.c +++ b/src/common/main_common.c @@ -79,6 +79,7 @@ const char *write_iq_rx_wave = NULL; const char *read_iq_tx_wave = NULL; const char *read_iq_rx_wave = NULL; int sdr_swap_links = 0; +int sdr_uhd_tx_timestamps = 0; void print_help_common(const char *arg0, const char *ext_usage) { @@ -183,6 +184,10 @@ void print_help_common(const char *arg0, const char *ext_usage) printf(" Replace transmitted IQ data by given wave file.\n"); printf(" --sdr-swap-links\n"); printf(" Swap RX and TX frequencies for loopback tests over the air.r\n"); +#ifdef HAVE_UHD + printf(" --sdr-uhd-tx-timestamps\n"); + printf(" Use TX timestamps on UHD device. (May not work with some devices!)\n"); +#endif #endif printf("\nNetwork specific options:\n"); } @@ -225,6 +230,7 @@ void print_hotkeys_common(void) #define OPT_READ_IQ_RX_WAVE 1114 #define OPT_READ_IQ_TX_WAVE 1115 #define OPT_SDR_SWAP_LINKS 1116 +#define OPT_SDR_UHD_TX_TS 1117 static struct option long_options_common[] = { {"help", 0, 0, 'h'}, @@ -266,6 +272,7 @@ static struct option long_options_common[] = { {"read-iq-rx-wave", 1, 0, OPT_READ_IQ_RX_WAVE}, {"read-iq-tx-wave", 1, 0, OPT_READ_IQ_TX_WAVE}, {"sdr-swap-links", 0, 0, OPT_SDR_SWAP_LINKS}, + {"sdr-uhd-tx-timestamps", 0, 0, OPT_SDR_UHD_TX_TS}, {0, 0, 0, 0} }; @@ -497,6 +504,10 @@ void opt_switch_common(int c, char *arg0, int *skip_args) sdr_swap_links = 1; *skip_args += 1; break; + case OPT_SDR_UHD_TX_TS: + sdr_uhd_tx_timestamps = 1; + *skip_args += 1; + break; default: exit (0); } @@ -580,7 +591,7 @@ void main_common(int *quit, int latency, int interval, void (*myhandler)(void), sdr_samplerate = samplerate; if (sdr_bandwidth == 0.0) sdr_bandwidth = sdr_samplerate; - rc = sdr_init(sdr_uhd, sdr_soapy, sdr_channel, sdr_device_args, sdr_stream_args, sdr_tune_args, sdr_tx_antenna, sdr_rx_antenna, sdr_tx_gain, sdr_rx_gain, sdr_samplerate, sdr_bandwidth, write_iq_tx_wave, write_iq_rx_wave, read_iq_tx_wave, read_iq_rx_wave, latspl, sdr_swap_links); + rc = sdr_init(sdr_uhd, sdr_soapy, sdr_channel, sdr_device_args, sdr_stream_args, sdr_tune_args, sdr_tx_antenna, sdr_rx_antenna, sdr_tx_gain, sdr_rx_gain, sdr_samplerate, sdr_bandwidth, write_iq_tx_wave, write_iq_rx_wave, read_iq_tx_wave, read_iq_rx_wave, latspl, sdr_swap_links, sdr_uhd_tx_timestamps); if (rc < 0) return; #endif diff --git a/src/common/sdr.c b/src/common/sdr.c index 94362be..3560466 100644 --- a/src/common/sdr.c +++ b/src/common/sdr.c @@ -85,8 +85,9 @@ static int sdr_latspl; static int sdr_threads; static sdr_thread_t sdr_thread_read, sdr_thread_write; static int sdr_swap_links; +static int sdr_uhd_tx_timestamps; -int sdr_init(int sdr_uhd, int sdr_soapy, int channel, const char *device_args, const char *stream_args, const char *tune_args, const char *tx_antenna, const char *rx_antenna, double tx_gain, double rx_gain, int samplerate, double bandwidth, const char *write_iq_tx_wave, const char *write_iq_rx_wave, const char *read_iq_tx_wave, const char *read_iq_rx_wave, int latspl, int swap_links) +int sdr_init(int sdr_uhd, int sdr_soapy, int channel, const char *device_args, const char *stream_args, const char *tune_args, const char *tx_antenna, const char *rx_antenna, double tx_gain, double rx_gain, int samplerate, double bandwidth, const char *write_iq_tx_wave, const char *write_iq_rx_wave, const char *read_iq_tx_wave, const char *read_iq_rx_wave, int latspl, int swap_links, int uhd_tx_timestamps) { PDEBUG(DSDR, DEBUG_DEBUG, "Init SDR\n"); @@ -110,6 +111,7 @@ int sdr_init(int sdr_uhd, int sdr_soapy, int channel, const char *device_args, c sdr_oversample = 1; sdr_latspl = latspl; sdr_swap_links = swap_links; + sdr_uhd_tx_timestamps = uhd_tx_timestamps; return 0; } @@ -326,7 +328,7 @@ void *sdr_open(const char __attribute__((__unused__)) *audiodev, double *tx_freq #ifdef HAVE_UHD if (sdr_use_uhd) { - rc = uhd_open(sdr_channel, sdr_device_args, sdr_stream_args, sdr_tune_args, sdr_tx_antenna, sdr_rx_antenna, tx_center_frequency, rx_center_frequency, sdr_samplerate, sdr_tx_gain, sdr_rx_gain, sdr_bandwidth); + rc = uhd_open(sdr_channel, sdr_device_args, sdr_stream_args, sdr_tune_args, sdr_tx_antenna, sdr_rx_antenna, tx_center_frequency, rx_center_frequency, sdr_samplerate, sdr_tx_gain, sdr_rx_gain, sdr_bandwidth, sdr_uhd_tx_timestamps); if (rc) goto error; } diff --git a/src/common/sdr.h b/src/common/sdr.h index 1e2a982..12a3e02 100644 --- a/src/common/sdr.h +++ b/src/common/sdr.h @@ -1,5 +1,5 @@ -int sdr_init(int sdr_uhd, int sdr_soapy, int channel, const char *device_args, const char *stream_args, const char *tune_args, const char *tx_antenna, const char *rx_antenna, double tx_gain, double rx_gain, int samplerate, double bandwidth, const char *write_iq_tx_wave, const char *write_iq_rx_wave, const char *read_iq_tx_wave, const char *read_iq_rx_wave, int latspl, int swap_links); +int sdr_init(int sdr_uhd, int sdr_soapy, int channel, const char *device_args, const char *stream_args, const char *tune_args, const char *tx_antenna, const char *rx_antenna, double tx_gain, double rx_gain, int samplerate, double bandwidth, const char *write_iq_tx_wave, const char *write_iq_rx_wave, const char *read_iq_tx_wave, const char *read_iq_rx_wave, int latspl, int swap_links, int uhd_tx_timestamps); int sdr_start(void *inst); void *sdr_open(const char *audiodev, double *tx_frequency, double *rx_frequency, int channels, double paging_frequency, int samplerate, double bandwidth, double sample_deviation); void sdr_close(void *inst); diff --git a/src/common/soapy.c b/src/common/soapy.c index 8a25e4c..e5d10de 100644 --- a/src/common/soapy.c +++ b/src/common/soapy.c @@ -388,7 +388,7 @@ int soapy_send(float *buff, int num) buffs_ptr[0] = buff; count = SoapySDRDevice_writeStream(sdr, txStream, buffs_ptr, chunk, &flags, 0, 1000000); if (count <= 0) { - PDEBUG(DUHD, DEBUG_ERROR, "Failed to write to TX streamr (error=%d)\n", count); + PDEBUG(DUHD, DEBUG_ERROR, "Failed to write to TX streamer (error=%d)\n", count); break; } diff --git a/src/common/uhd.c b/src/common/uhd.c index cc9a060..e79b1f7 100644 --- a/src/common/uhd.c +++ b/src/common/uhd.c @@ -27,6 +27,9 @@ #include "uhd.h" #include "debug.h" +/* use to TX time stamp */ +//#define TX_TIMESTAMP + static uhd_usrp_handle usrp = NULL; static uhd_tx_streamer_handle tx_streamer = NULL; static uhd_rx_streamer_handle rx_streamer = NULL; @@ -42,14 +45,16 @@ static time_t rx_time_secs = 0; static double rx_time_fract_sec = 0.0; static time_t tx_time_secs = 0; static double tx_time_fract_sec = 0.0; +static int tx_timestamps; -int uhd_open(size_t channel, const char *_device_args, const char *_stream_args, const char *_tune_args, const char *tx_antenna, const char *rx_antenna, double tx_frequency, double rx_frequency, double rate, double tx_gain, double rx_gain, double bandwidth) +int uhd_open(size_t channel, const char *_device_args, const char *_stream_args, const char *_tune_args, const char *tx_antenna, const char *rx_antenna, double tx_frequency, double rx_frequency, double rate, double tx_gain, double rx_gain, double bandwidth, int _tx_timestamps) { uhd_error error; double got_frequency, got_rate, got_gain, got_bandwidth; char got_antenna[64]; samplerate = rate; + tx_timestamps = _tx_timestamps; PDEBUG(DUHD, DEBUG_INFO, "Using device args \"%s\"\n", _device_args); PDEBUG(DUHD, DEBUG_INFO, "Using stream args \"%s\"\n", _stream_args); @@ -472,7 +477,10 @@ int uhd_send(float *buff, int num) if (chunk > (int)tx_samps_per_buff) chunk = (int)tx_samps_per_buff; /* create tx metadata */ - error = uhd_tx_metadata_make(&tx_metadata, true, tx_time_secs, tx_time_fract_sec, true, false); + if (tx_timestamps) + error = uhd_tx_metadata_make(&tx_metadata, true, tx_time_secs, tx_time_fract_sec, false, false); + else + error = uhd_tx_metadata_make(&tx_metadata, false, 0, 0.0, false, false); if (error) PDEBUG(DUHD, DEBUG_ERROR, "Failed to create TX metadata\n"); buffs_ptr[0] = buff; @@ -551,10 +559,13 @@ int uhd_get_tosend(int latspl) /* if we have not yet sent any data, we set initial tx time stamp */ if (tx_time_secs == 0 && tx_time_fract_sec == 0.0) { tx_time_secs = rx_time_secs; - tx_time_fract_sec = rx_time_fract_sec + (double)latspl / samplerate; - if (tx_time_fract_sec >= 1.0) { - tx_time_fract_sec -= 1.0; - tx_time_secs++; + tx_time_fract_sec = rx_time_fract_sec; + if (tx_timestamps) { + tx_time_fract_sec += (double)latspl / samplerate; + if (tx_time_fract_sec >= 1.0) { + tx_time_fract_sec -= 1.0; + tx_time_secs++; + } } } diff --git a/src/common/uhd.h b/src/common/uhd.h index 95891ae..60eb94f 100644 --- a/src/common/uhd.h +++ b/src/common/uhd.h @@ -1,5 +1,5 @@ -int uhd_open(size_t channel, const char *_device_args, const char *_stream_args, const char *_tune_args, const char *tx_antenna, const char *rx_antenna, double tx_frequency, double rx_frequency, double rate, double tx_gain, double rx_gain, double bandwidth); +int uhd_open(size_t channel, const char *_device_args, const char *_stream_args, const char *_tune_args, const char *tx_antenna, const char *rx_antenna, double tx_frequency, double rx_frequency, double rate, double tx_gain, double rx_gain, double bandwidth, int _tx_timestamps); int uhd_start(void); void uhd_close(void); int uhd_send(float *buff, int num);