diff --git a/src/libsdr/soapy.c b/src/libsdr/soapy.c index 3306af1..7145ed9 100644 --- a/src/libsdr/soapy.c +++ b/src/libsdr/soapy.c @@ -31,6 +31,7 @@ extern int sdr_rx_overflow; static SoapySDRDevice *sdr = NULL; +static SoapySDRDevice *sdr2 = NULL; SoapySDRStream *rxStream = NULL; SoapySDRStream *txStream = NULL; static int tx_samps_per_buff, rx_samps_per_buff; @@ -95,10 +96,11 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg SoapySDRKwargs_set(&tune_args, "OFFSET", val); } - /* create SoapySDR device */ + /* create SoapySDR devices */ sdr = SoapySDRDevice_make(&device_args); - if (!sdr) { - PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to create SoapySDR\n"); + sdr2 = SoapySDRDevice_make(&device_args); //Two HackRF setup for full duplex :) + if (!sdr && !sdr2) { + PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to create double HackRF Setup\n"); soapy_close(); return -EIO; } @@ -265,7 +267,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg if (tx_frequency) { /* get number of channels and check if requested channel is in range */ - num_channels = SoapySDRDevice_getNumChannels(sdr, SOAPY_SDR_TX); + num_channels = SoapySDRDevice_getNumChannels(sdr2, SOAPY_SDR_TX); PDEBUG(DSOAPY, DEBUG_DEBUG, "We have %d TX channel, selecting channel #%d\n", (int)num_channels, (int)channel); if (channel >= num_channels) { PDEBUG(DSOAPY, DEBUG_ERROR, "Requested channel #%d (capable of TX) does not exist. Please select channel %d..%d!\n", (int)channel, 0, (int)num_channels - 1); @@ -279,7 +281,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg char **antennas; size_t antennas_length; int i; - antennas = SoapySDRDevice_listAntennas(sdr, SOAPY_SDR_TX, channel, &antennas_length); + antennas = SoapySDRDevice_listAntennas(sdr2, SOAPY_SDR_TX, channel, &antennas_length); if (!antennas) { PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to request list of TX antennas!\n"); soapy_close(); @@ -287,18 +289,18 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg } for (i = 0; i < (int)antennas_length; i++) PDEBUG(DSOAPY, DEBUG_NOTICE, "TX Antenna: '%s'\n", antennas[i]); - got_antenna = SoapySDRDevice_getAntenna(sdr, SOAPY_SDR_TX, channel); + got_antenna = SoapySDRDevice_getAntenna(sdr2, SOAPY_SDR_TX, channel); PDEBUG(DSOAPY, DEBUG_NOTICE, "Default TX Antenna: '%s'\n", got_antenna); soapy_close(); return 1; } - if (SoapySDRDevice_setAntenna(sdr, SOAPY_SDR_TX, channel, tx_antenna) != 0) { + if (SoapySDRDevice_setAntenna(sdr2, SOAPY_SDR_TX, channel, tx_antenna) != 0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX antenna to '%s'\n", tx_antenna); soapy_close(); return -EIO; } - got_antenna = SoapySDRDevice_getAntenna(sdr, SOAPY_SDR_TX, channel); + got_antenna = SoapySDRDevice_getAntenna(sdr2, SOAPY_SDR_TX, channel); if (!!strcasecmp(tx_antenna, got_antenna)) { PDEBUG(DSOAPY, DEBUG_NOTICE, "Given TX antenna '%s' was accepted, but driver claims to use '%s'\n", tx_antenna, got_antenna); soapy_close(); @@ -307,14 +309,14 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg } /* set rate */ - if (SoapySDRDevice_setSampleRate(sdr, SOAPY_SDR_TX, channel, rate) != 0) { + if (SoapySDRDevice_setSampleRate(sdr2, SOAPY_SDR_TX, channel, rate) != 0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX rate to %.0f Hz\n", rate); soapy_close(); return -EIO; } /* see what rate actually is */ - got_rate = SoapySDRDevice_getSampleRate(sdr, SOAPY_SDR_TX, channel); + got_rate = SoapySDRDevice_getSampleRate(sdr2, SOAPY_SDR_TX, channel); if (fabs(got_rate - rate) > 1.0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Given TX rate %.3f Hz is not supported, try %.3f Hz\n", rate, got_rate); soapy_close(); @@ -323,14 +325,14 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg if (tx_gain) { /* set gain */ - if (SoapySDRDevice_setGain(sdr, SOAPY_SDR_TX, channel, tx_gain) != 0) { + if (SoapySDRDevice_setGain(sdr2, SOAPY_SDR_TX, channel, tx_gain) != 0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX gain to %.0f\n", tx_gain); soapy_close(); return -EIO; } /* see what gain actually is */ - got_gain = SoapySDRDevice_getGain(sdr, SOAPY_SDR_TX, channel); + got_gain = SoapySDRDevice_getGain(sdr2, SOAPY_SDR_TX, channel); if (fabs(got_gain - tx_gain) > 0.001) { PDEBUG(DSOAPY, DEBUG_NOTICE, "Given TX gain %.3f is not supported, we use %.3f\n", tx_gain, got_gain); tx_gain = got_gain; @@ -338,14 +340,14 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg } /* set frequency */ - if (SoapySDRDevice_setFrequency(sdr, SOAPY_SDR_TX, channel, tx_frequency, &tune_args) != 0) { + if (SoapySDRDevice_setFrequency(sdr2, SOAPY_SDR_TX, channel, tx_frequency, &tune_args) != 0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX frequency to %.0f Hz\n", tx_frequency); soapy_close(); return -EIO; } /* see what frequency actually is */ - got_frequency = SoapySDRDevice_getFrequency(sdr, SOAPY_SDR_TX, channel); + got_frequency = SoapySDRDevice_getFrequency(sdr2, SOAPY_SDR_TX, channel); if (fabs(got_frequency - tx_frequency) > 100.0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Given TX frequency %.0f Hz is not supported, try %.0f Hz\n", tx_frequency, got_frequency); soapy_close(); @@ -353,14 +355,14 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg } /* set bandwidth */ - if (SoapySDRDevice_setBandwidth(sdr, SOAPY_SDR_TX, channel, bandwidth) != 0) { + if (SoapySDRDevice_setBandwidth(sdr2, SOAPY_SDR_TX, channel, bandwidth) != 0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX bandwidth to %.0f Hz\n", bandwidth); soapy_close(); return -EIO; } /* see what bandwidth actually is */ - got_bandwidth = SoapySDRDevice_getBandwidth(sdr, SOAPY_SDR_TX, channel); + got_bandwidth = SoapySDRDevice_getBandwidth(sdr2, SOAPY_SDR_TX, channel); if (fabs(got_bandwidth - bandwidth) > 100.0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Given TX bandwidth %.0f Hz is not supported, try %.0f Hz\n", bandwidth, got_bandwidth); soapy_close(); @@ -368,14 +370,14 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg } /* set up streamer */ - if (SoapySDRDevice_setupStream(sdr, &txStream, SOAPY_SDR_TX, SOAPY_SDR_CF32, &channel, 1, &stream_args) != 0) { + if (SoapySDRDevice_setupStream(sdr2, &txStream, SOAPY_SDR_TX, SOAPY_SDR_CF32, &channel, 1, &stream_args) != 0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX streamer args\n"); soapy_close(); return -EIO; } /* get buffer sizes */ - tx_samps_per_buff = SoapySDRDevice_getStreamMTU(sdr, txStream); + tx_samps_per_buff = SoapySDRDevice_getStreamMTU(sdr2, txStream); if (tx_samps_per_buff == 0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to get TX streamer sample buffer\n"); soapy_close(); @@ -396,7 +398,7 @@ int soapy_start(void) } /* enable tx stream */ - if (SoapySDRDevice_activateStream(sdr, txStream, 0, 0, 0) != 0) { + if (SoapySDRDevice_activateStream(sdr2, txStream, 0, 0, 0) != 0) { PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to issue TX stream command\n"); return -EIO; } @@ -407,8 +409,8 @@ void soapy_close(void) { PDEBUG(DSOAPY, DEBUG_DEBUG, "Clean up SoapySDR\n"); if (txStream) { - SoapySDRDevice_deactivateStream(sdr, txStream, 0, 0); - SoapySDRDevice_closeStream(sdr, txStream); + SoapySDRDevice_deactivateStream(sdr2, txStream, 0, 0); + SoapySDRDevice_closeStream(sdr2, txStream); txStream = NULL; } if (rxStream) { @@ -418,7 +420,9 @@ void soapy_close(void) } if (sdr) { SoapySDRDevice_unmake(sdr); + SoapySDRDevice_unmake(sdr2); sdr = NULL; + sdr2 = NULL; } } @@ -435,7 +439,7 @@ int soapy_send(float *buff, int num) chunk = tx_samps_per_buff; /* create tx metadata */ buffs_ptr[0] = buff; - count = SoapySDRDevice_writeStream(sdr, txStream, buffs_ptr, chunk, &flags, 0, 1000000); + count = SoapySDRDevice_writeStream(sdr2, txStream, buffs_ptr, chunk, &flags, 0, 1000000); if (count <= 0) { PDEBUG(DUHD, DEBUG_ERROR, "Failed to write to TX streamer (error=%d)\n", count); break;