mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-05-23 18:52:28 -04:00
BladeRF2: fixed MO mode by multiplying sample rate by the number of Tx channels
This commit is contained in:
parent
d770da9590
commit
2323d21a43
@ -316,6 +316,8 @@ bool BladeRF2Output::start()
|
|||||||
bladeRF2OutputThread->setFifo(requestedChannel, &m_sampleSourceFifo);
|
bladeRF2OutputThread->setFifo(requestedChannel, &m_sampleSourceFifo);
|
||||||
bladeRF2OutputThread->setLog2Interpolation(requestedChannel, m_settings.m_log2Interp);
|
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)
|
if (needsStart)
|
||||||
{
|
{
|
||||||
qDebug("BladeRF2Output::start: enabling channel(s) and (re)sart buddy thread");
|
qDebug("BladeRF2Output::start: enabling channel(s) and (re)sart buddy thread");
|
||||||
@ -332,8 +334,6 @@ bool BladeRF2Output::start()
|
|||||||
bladeRF2OutputThread->startWork();
|
bladeRF2OutputThread->startWork();
|
||||||
}
|
}
|
||||||
|
|
||||||
applySettings(m_settings, true);
|
|
||||||
|
|
||||||
qDebug("BladeRF2Output::start: started");
|
qDebug("BladeRF2Output::start: started");
|
||||||
m_running = true;
|
m_running = true;
|
||||||
|
|
||||||
@ -429,6 +429,13 @@ void BladeRF2Output::stop()
|
|||||||
((DeviceBladeRF2Shared*) (*it)->getBuddySharedPtr())->m_sink->setThread(0);
|
((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
|
m_deviceShared.m_dev->closeTx(requestedChannel); // close the last channel
|
||||||
|
|
||||||
if (stillActiveFIFO) {
|
if (stillActiveFIFO) {
|
||||||
@ -441,6 +448,8 @@ void BladeRF2Output::stop()
|
|||||||
bladeRF2OutputThread->setFifo(requestedChannel, 0); // remove FIFO
|
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;
|
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
|
if (dev) // The BladeRF device must have been open to do so
|
||||||
{
|
{
|
||||||
int requestedChannel = m_deviceAPI->getItemIndex();
|
int requestedChannel = m_deviceAPI->getItemIndex();
|
||||||
|
int nbChannels = getNbChannels();
|
||||||
|
|
||||||
if (report.getRxElseTx()) // Rx buddy change: check for sample rate change only
|
if (report.getRxElseTx()) // Rx buddy change: check for sample rate change only
|
||||||
{
|
{
|
||||||
status = bladerf_get_sample_rate(dev, BLADERF_CHANNEL_TX(requestedChannel), &tmp_uint);
|
tmp_uint = report.getDevSampleRate();
|
||||||
|
settings.m_devSampleRate = tmp_uint / (nbChannels == 0 ? 1 : nbChannels);
|
||||||
if (status < 0) {
|
// status = bladerf_get_sample_rate(dev, BLADERF_CHANNEL_TX(requestedChannel), &tmp_uint);
|
||||||
qCritical("BladeRF2Output::handleMessage: MsgReportBuddyChange: bladerf_get_sample_rate error: %s", bladerf_strerror(status));
|
//
|
||||||
} else {
|
// if (status < 0) {
|
||||||
settings.m_devSampleRate = tmp_uint+1;
|
// 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
|
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();
|
struct bladerf *dev = m_deviceShared.m_dev->getDev();
|
||||||
int requestedChannel = m_deviceAPI->getItemIndex();
|
int requestedChannel = m_deviceAPI->getItemIndex();
|
||||||
|
int nbChannels = getNbChannels();
|
||||||
|
|
||||||
if ((m_settings.m_devSampleRate != settings.m_devSampleRate) || (m_settings.m_log2Interp != settings.m_log2Interp) || force)
|
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)
|
if (dev != 0)
|
||||||
{
|
{
|
||||||
unsigned int actualSamplerate;
|
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)
|
if (status < 0)
|
||||||
{
|
{
|
||||||
@ -817,7 +833,7 @@ bool BladeRF2Output::applySettings(const BladeRF2OutputSettings& settings, bool
|
|||||||
settings.m_centerFrequency,
|
settings.m_centerFrequency,
|
||||||
settings.m_LOppmTenths,
|
settings.m_LOppmTenths,
|
||||||
2,
|
2,
|
||||||
settings.m_devSampleRate,
|
settings.m_devSampleRate * (nbChannels == 0 ? 1 : nbChannels), // need to forward actual rate to the Rx side
|
||||||
false);
|
false);
|
||||||
(*itSource)->getSampleSourceInputMessageQueue()->push(report);
|
(*itSource)->getSampleSourceInputMessageQueue()->push(report);
|
||||||
}
|
}
|
||||||
@ -849,12 +865,24 @@ bool BladeRF2Output::applySettings(const BladeRF2OutputSettings& settings, bool
|
|||||||
<< " m_bandwidth: " << m_settings.m_bandwidth
|
<< " m_bandwidth: " << m_settings.m_bandwidth
|
||||||
<< " m_log2Interp: " << m_settings.m_log2Interp
|
<< " m_log2Interp: " << m_settings.m_log2Interp
|
||||||
<< " m_devSampleRate: " << m_settings.m_devSampleRate
|
<< " m_devSampleRate: " << m_settings.m_devSampleRate
|
||||||
|
<< " nbChannels: " << nbChannels
|
||||||
<< " m_globalGain: " << m_settings.m_globalGain
|
<< " m_globalGain: " << m_settings.m_globalGain
|
||||||
<< " m_biasTee: " << m_settings.m_biasTee;
|
<< " m_biasTee: " << m_settings.m_biasTee;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int BladeRF2Output::getNbChannels()
|
||||||
|
{
|
||||||
|
BladeRF2OutputThread *bladeRF2OutputThread = findThread();
|
||||||
|
|
||||||
|
if (bladeRF2OutputThread) {
|
||||||
|
return bladeRF2OutputThread->getNbChannels();
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int BladeRF2Output::webapiSettingsGet(
|
int BladeRF2Output::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGDeviceSettings& response,
|
SWGSDRangel::SWGDeviceSettings& response,
|
||||||
QString& errorMessage __attribute__((unused)))
|
QString& errorMessage __attribute__((unused)))
|
||||||
|
@ -152,6 +152,7 @@ private:
|
|||||||
BladeRF2OutputThread *findThread();
|
BladeRF2OutputThread *findThread();
|
||||||
void moveThreadToBuddy();
|
void moveThreadToBuddy();
|
||||||
bool applySettings(const BladeRF2OutputSettings& settings, bool force);
|
bool applySettings(const BladeRF2OutputSettings& settings, bool force);
|
||||||
|
int getNbChannels();
|
||||||
bool setDeviceCenterFrequency(struct bladerf *dev, int requestedChannel, quint64 freq_hz);
|
bool setDeviceCenterFrequency(struct bladerf *dev, int requestedChannel, quint64 freq_hz);
|
||||||
void webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const BladeRF2OutputSettings& settings);
|
void webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const BladeRF2OutputSettings& settings);
|
||||||
void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response);
|
void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response);
|
||||||
|
@ -75,7 +75,7 @@ void BladeRF2OutputThread::run()
|
|||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (m_nbChannels > 1) {
|
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 {
|
} else {
|
||||||
status = bladerf_sync_config(m_dev, BLADERF_TX_X1, BLADERF_FORMAT_SC16_Q11, 64, 8192, 32, 1500);
|
status = bladerf_sync_config(m_dev, BLADERF_TX_X1, BLADERF_FORMAT_SC16_Q11, 64, 8192, 32, 1500);
|
||||||
}
|
}
|
||||||
|
@ -645,12 +645,31 @@ bool BladeRF2Input::handleMessage(const Message& message)
|
|||||||
}
|
}
|
||||||
else // Tx buddy change: check for sample rate change only
|
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) {
|
qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency(
|
||||||
qCritical("BladeRF2Input::handleMessage: MsgReportBuddyChange: bladerf_get_sample_rate error: %s", bladerf_strerror(status));
|
settings.m_centerFrequency,
|
||||||
} else {
|
0,
|
||||||
settings.m_devSampleRate = tmp_uint+1;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user