diff --git a/plugins/samplesink/bladerf2output/bladerf2output.cpp b/plugins/samplesink/bladerf2output/bladerf2output.cpp index 38cbe76cb..9e6926bfc 100644 --- a/plugins/samplesink/bladerf2output/bladerf2output.cpp +++ b/plugins/samplesink/bladerf2output/bladerf2output.cpp @@ -316,6 +316,8 @@ bool BladeRF2Output::start() bladeRF2OutputThread->setFifo(requestedChannel, &m_sampleSourceFifo); bladeRF2OutputThread->setLog2Interpolation(requestedChannel, m_settings.m_log2Interp); + applySettings(m_settings, true); // re-apply forcibly to set sample rate with the new number of channels + if (needsStart) { qDebug("BladeRF2Output::start: enabling channel(s) and (re)sart buddy thread"); @@ -332,8 +334,6 @@ bool BladeRF2Output::start() bladeRF2OutputThread->startWork(); } - applySettings(m_settings, true); - qDebug("BladeRF2Output::start: started"); m_running = true; @@ -429,6 +429,13 @@ void BladeRF2Output::stop() ((DeviceBladeRF2Shared*) (*it)->getBuddySharedPtr())->m_sink->setThread(0); } + for (int i = 0; i < nbOriginalChannels-1; i++) // close all inactive channels + { + if (fifos[i] == 0) { + m_deviceShared.m_dev->closeTx(i); + } + } + m_deviceShared.m_dev->closeTx(requestedChannel); // close the last channel if (stillActiveFIFO) { @@ -441,6 +448,8 @@ void BladeRF2Output::stop() bladeRF2OutputThread->setFifo(requestedChannel, 0); // remove FIFO } + applySettings(m_settings, true); // re-apply forcibly to set sample rate with the new number of channels + m_running = false; } @@ -577,16 +586,19 @@ bool BladeRF2Output::handleMessage(const Message& message) if (dev) // The BladeRF device must have been open to do so { int requestedChannel = m_deviceAPI->getItemIndex(); + int nbChannels = getNbChannels(); if (report.getRxElseTx()) // Rx buddy change: check for sample rate change only { - status = bladerf_get_sample_rate(dev, BLADERF_CHANNEL_TX(requestedChannel), &tmp_uint); - - if (status < 0) { - qCritical("BladeRF2Output::handleMessage: MsgReportBuddyChange: bladerf_get_sample_rate error: %s", bladerf_strerror(status)); - } else { - settings.m_devSampleRate = tmp_uint+1; - } + tmp_uint = report.getDevSampleRate(); + settings.m_devSampleRate = tmp_uint / (nbChannels == 0 ? 1 : nbChannels); +// status = bladerf_get_sample_rate(dev, BLADERF_CHANNEL_TX(requestedChannel), &tmp_uint); +// +// if (status < 0) { +// qCritical("BladeRF2Output::handleMessage: MsgReportBuddyChange: bladerf_get_sample_rate error: %s", bladerf_strerror(status)); +// } else { +// settings.m_devSampleRate = tmp_uint / (nbChannels == 0 ? 1 : nbChannels); +// } } else // Tx buddy change: check for: frequency, gain mode and value, bias tee, sample rate, bandwidth { @@ -664,6 +676,7 @@ bool BladeRF2Output::applySettings(const BladeRF2OutputSettings& settings, bool struct bladerf *dev = m_deviceShared.m_dev->getDev(); int requestedChannel = m_deviceAPI->getItemIndex(); + int nbChannels = getNbChannels(); if ((m_settings.m_devSampleRate != settings.m_devSampleRate) || (m_settings.m_log2Interp != settings.m_log2Interp) || force) { @@ -705,7 +718,10 @@ bool BladeRF2Output::applySettings(const BladeRF2OutputSettings& settings, bool if (dev != 0) { unsigned int actualSamplerate; - int status = bladerf_set_sample_rate(dev, BLADERF_CHANNEL_TX(requestedChannel), settings.m_devSampleRate, &actualSamplerate); + + int status = bladerf_set_sample_rate(dev, BLADERF_CHANNEL_TX(requestedChannel), + settings.m_devSampleRate * (nbChannels == 0 ? 1 : nbChannels), + &actualSamplerate); if (status < 0) { @@ -817,7 +833,7 @@ bool BladeRF2Output::applySettings(const BladeRF2OutputSettings& settings, bool settings.m_centerFrequency, settings.m_LOppmTenths, 2, - settings.m_devSampleRate, + settings.m_devSampleRate * (nbChannels == 0 ? 1 : nbChannels), // need to forward actual rate to the Rx side false); (*itSource)->getSampleSourceInputMessageQueue()->push(report); } @@ -849,12 +865,24 @@ bool BladeRF2Output::applySettings(const BladeRF2OutputSettings& settings, bool << " m_bandwidth: " << m_settings.m_bandwidth << " m_log2Interp: " << m_settings.m_log2Interp << " m_devSampleRate: " << m_settings.m_devSampleRate + << " nbChannels: " << nbChannels << " m_globalGain: " << m_settings.m_globalGain << " m_biasTee: " << m_settings.m_biasTee; return true; } +int BladeRF2Output::getNbChannels() +{ + BladeRF2OutputThread *bladeRF2OutputThread = findThread(); + + if (bladeRF2OutputThread) { + return bladeRF2OutputThread->getNbChannels(); + } else { + return 0; + } +} + int BladeRF2Output::webapiSettingsGet( SWGSDRangel::SWGDeviceSettings& response, QString& errorMessage __attribute__((unused))) diff --git a/plugins/samplesink/bladerf2output/bladerf2output.h b/plugins/samplesink/bladerf2output/bladerf2output.h index 5968e6733..9bc83a61a 100644 --- a/plugins/samplesink/bladerf2output/bladerf2output.h +++ b/plugins/samplesink/bladerf2output/bladerf2output.h @@ -152,6 +152,7 @@ private: BladeRF2OutputThread *findThread(); void moveThreadToBuddy(); bool applySettings(const BladeRF2OutputSettings& settings, bool force); + int getNbChannels(); bool setDeviceCenterFrequency(struct bladerf *dev, int requestedChannel, quint64 freq_hz); void webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const BladeRF2OutputSettings& settings); void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response); diff --git a/plugins/samplesink/bladerf2output/bladerf2outputthread.cpp b/plugins/samplesink/bladerf2output/bladerf2outputthread.cpp index 106d1ef91..39df9332e 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputthread.cpp +++ b/plugins/samplesink/bladerf2output/bladerf2outputthread.cpp @@ -75,7 +75,7 @@ void BladeRF2OutputThread::run() int status; if (m_nbChannels > 1) { - status = bladerf_sync_config(m_dev, BLADERF_TX_X2, BLADERF_FORMAT_SC16_Q11, 64, 16384, 32, 1500); + status = bladerf_sync_config(m_dev, BLADERF_TX_X2, BLADERF_FORMAT_SC16_Q11, 128, 16384, 32, 1500); } else { status = bladerf_sync_config(m_dev, BLADERF_TX_X1, BLADERF_FORMAT_SC16_Q11, 64, 8192, 32, 1500); } diff --git a/plugins/samplesource/bladerf2input/bladerf2input.cpp b/plugins/samplesource/bladerf2input/bladerf2input.cpp index 2ce1fbf41..53a25f04c 100644 --- a/plugins/samplesource/bladerf2input/bladerf2input.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2input.cpp @@ -645,12 +645,31 @@ bool BladeRF2Input::handleMessage(const Message& message) } else // Tx buddy change: check for sample rate change only { - status = bladerf_get_sample_rate(dev, BLADERF_CHANNEL_RX(requestedChannel), &tmp_uint); + settings.m_devSampleRate = report.getDevSampleRate(); +// status = bladerf_get_sample_rate(dev, BLADERF_CHANNEL_RX(requestedChannel), &tmp_uint); +// +// if (status < 0) { +// qCritical("BladeRF2Input::handleMessage: MsgReportBuddyChange: bladerf_get_sample_rate error: %s", bladerf_strerror(status)); +// } else { +// settings.m_devSampleRate = tmp_uint; +// } - if (status < 0) { - qCritical("BladeRF2Input::handleMessage: MsgReportBuddyChange: bladerf_get_sample_rate error: %s", bladerf_strerror(status)); - } else { - settings.m_devSampleRate = tmp_uint+1; + qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency( + settings.m_centerFrequency, + 0, + settings.m_log2Decim, + (DeviceSampleSource::fcPos_t) settings.m_fcPos, + settings.m_devSampleRate); + + if (setDeviceCenterFrequency(dev, requestedChannel, deviceCenterFrequency)) + { + if (getMessageQueueToGUI()) + { + int min, max, step; + getGlobalGainRange(min, max, step); + MsgReportGainRange *msg = MsgReportGainRange::create(min, max, step); + getMessageQueueToGUI()->push(msg); + } } }