forked from cellular-infrastructure/osmocom-analog
SDR: Add option to enable TX timestamps on UHD devices (disabled by default)
This commit is contained in:
parent
8489914bf0
commit
ea7cbb8675
|
@ -79,6 +79,7 @@ const char *write_iq_rx_wave = NULL;
|
||||||
const char *read_iq_tx_wave = NULL;
|
const char *read_iq_tx_wave = NULL;
|
||||||
const char *read_iq_rx_wave = NULL;
|
const char *read_iq_rx_wave = NULL;
|
||||||
int sdr_swap_links = 0;
|
int sdr_swap_links = 0;
|
||||||
|
int sdr_uhd_tx_timestamps = 0;
|
||||||
|
|
||||||
void print_help_common(const char *arg0, const char *ext_usage)
|
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(" Replace transmitted IQ data by given wave file.\n");
|
||||||
printf(" --sdr-swap-links\n");
|
printf(" --sdr-swap-links\n");
|
||||||
printf(" Swap RX and TX frequencies for loopback tests over the air.r\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
|
#endif
|
||||||
printf("\nNetwork specific options:\n");
|
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_RX_WAVE 1114
|
||||||
#define OPT_READ_IQ_TX_WAVE 1115
|
#define OPT_READ_IQ_TX_WAVE 1115
|
||||||
#define OPT_SDR_SWAP_LINKS 1116
|
#define OPT_SDR_SWAP_LINKS 1116
|
||||||
|
#define OPT_SDR_UHD_TX_TS 1117
|
||||||
|
|
||||||
static struct option long_options_common[] = {
|
static struct option long_options_common[] = {
|
||||||
{"help", 0, 0, 'h'},
|
{"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-rx-wave", 1, 0, OPT_READ_IQ_RX_WAVE},
|
||||||
{"read-iq-tx-wave", 1, 0, OPT_READ_IQ_TX_WAVE},
|
{"read-iq-tx-wave", 1, 0, OPT_READ_IQ_TX_WAVE},
|
||||||
{"sdr-swap-links", 0, 0, OPT_SDR_SWAP_LINKS},
|
{"sdr-swap-links", 0, 0, OPT_SDR_SWAP_LINKS},
|
||||||
|
{"sdr-uhd-tx-timestamps", 0, 0, OPT_SDR_UHD_TX_TS},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -497,6 +504,10 @@ void opt_switch_common(int c, char *arg0, int *skip_args)
|
||||||
sdr_swap_links = 1;
|
sdr_swap_links = 1;
|
||||||
*skip_args += 1;
|
*skip_args += 1;
|
||||||
break;
|
break;
|
||||||
|
case OPT_SDR_UHD_TX_TS:
|
||||||
|
sdr_uhd_tx_timestamps = 1;
|
||||||
|
*skip_args += 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
|
@ -580,7 +591,7 @@ void main_common(int *quit, int latency, int interval, void (*myhandler)(void),
|
||||||
sdr_samplerate = samplerate;
|
sdr_samplerate = samplerate;
|
||||||
if (sdr_bandwidth == 0.0)
|
if (sdr_bandwidth == 0.0)
|
||||||
sdr_bandwidth = sdr_samplerate;
|
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)
|
if (rc < 0)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -85,8 +85,9 @@ static int sdr_latspl;
|
||||||
static int sdr_threads;
|
static int sdr_threads;
|
||||||
static sdr_thread_t sdr_thread_read, sdr_thread_write;
|
static sdr_thread_t sdr_thread_read, sdr_thread_write;
|
||||||
static int sdr_swap_links;
|
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");
|
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_oversample = 1;
|
||||||
sdr_latspl = latspl;
|
sdr_latspl = latspl;
|
||||||
sdr_swap_links = swap_links;
|
sdr_swap_links = swap_links;
|
||||||
|
sdr_uhd_tx_timestamps = uhd_tx_timestamps;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -326,7 +328,7 @@ void *sdr_open(const char __attribute__((__unused__)) *audiodev, double *tx_freq
|
||||||
|
|
||||||
#ifdef HAVE_UHD
|
#ifdef HAVE_UHD
|
||||||
if (sdr_use_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)
|
if (rc)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
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_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);
|
void sdr_close(void *inst);
|
||||||
|
|
|
@ -388,7 +388,7 @@ int soapy_send(float *buff, int num)
|
||||||
buffs_ptr[0] = buff;
|
buffs_ptr[0] = buff;
|
||||||
count = SoapySDRDevice_writeStream(sdr, txStream, buffs_ptr, chunk, &flags, 0, 1000000);
|
count = SoapySDRDevice_writeStream(sdr, txStream, buffs_ptr, chunk, &flags, 0, 1000000);
|
||||||
if (count <= 0) {
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
#include "uhd.h"
|
#include "uhd.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
/* use to TX time stamp */
|
||||||
|
//#define TX_TIMESTAMP
|
||||||
|
|
||||||
static uhd_usrp_handle usrp = NULL;
|
static uhd_usrp_handle usrp = NULL;
|
||||||
static uhd_tx_streamer_handle tx_streamer = NULL;
|
static uhd_tx_streamer_handle tx_streamer = NULL;
|
||||||
static uhd_rx_streamer_handle rx_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 double rx_time_fract_sec = 0.0;
|
||||||
static time_t tx_time_secs = 0;
|
static time_t tx_time_secs = 0;
|
||||||
static double tx_time_fract_sec = 0.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;
|
uhd_error error;
|
||||||
double got_frequency, got_rate, got_gain, got_bandwidth;
|
double got_frequency, got_rate, got_gain, got_bandwidth;
|
||||||
char got_antenna[64];
|
char got_antenna[64];
|
||||||
|
|
||||||
samplerate = rate;
|
samplerate = rate;
|
||||||
|
tx_timestamps = _tx_timestamps;
|
||||||
|
|
||||||
PDEBUG(DUHD, DEBUG_INFO, "Using device args \"%s\"\n", _device_args);
|
PDEBUG(DUHD, DEBUG_INFO, "Using device args \"%s\"\n", _device_args);
|
||||||
PDEBUG(DUHD, DEBUG_INFO, "Using stream args \"%s\"\n", _stream_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)
|
if (chunk > (int)tx_samps_per_buff)
|
||||||
chunk = (int)tx_samps_per_buff;
|
chunk = (int)tx_samps_per_buff;
|
||||||
/* create tx metadata */
|
/* 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)
|
if (error)
|
||||||
PDEBUG(DUHD, DEBUG_ERROR, "Failed to create TX metadata\n");
|
PDEBUG(DUHD, DEBUG_ERROR, "Failed to create TX metadata\n");
|
||||||
buffs_ptr[0] = buff;
|
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 we have not yet sent any data, we set initial tx time stamp */
|
||||||
if (tx_time_secs == 0 && tx_time_fract_sec == 0.0) {
|
if (tx_time_secs == 0 && tx_time_fract_sec == 0.0) {
|
||||||
tx_time_secs = rx_time_secs;
|
tx_time_secs = rx_time_secs;
|
||||||
tx_time_fract_sec = rx_time_fract_sec + (double)latspl / samplerate;
|
tx_time_fract_sec = rx_time_fract_sec;
|
||||||
if (tx_time_fract_sec >= 1.0) {
|
if (tx_timestamps) {
|
||||||
tx_time_fract_sec -= 1.0;
|
tx_time_fract_sec += (double)latspl / samplerate;
|
||||||
tx_time_secs++;
|
if (tx_time_fract_sec >= 1.0) {
|
||||||
|
tx_time_fract_sec -= 1.0;
|
||||||
|
tx_time_secs++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
int uhd_start(void);
|
||||||
void uhd_close(void);
|
void uhd_close(void);
|
||||||
int uhd_send(float *buff, int num);
|
int uhd_send(float *buff, int num);
|
||||||
|
|
Loading…
Reference in New Issue