PlutoSDRBox: use channels registered at contruction time

This commit is contained in:
f4exb 2021-04-25 22:28:40 +02:00
parent b04cc965e1
commit 54222ff016
3 changed files with 96 additions and 78 deletions

View File

@ -36,16 +36,12 @@ DevicePlutoSDRBox::DevicePlutoSDRBox(const std::string& uri) :
m_lpfFIRlog2Decim(0), m_lpfFIRlog2Decim(0),
m_lpfFIRRxGain(0), m_lpfFIRRxGain(0),
m_lpfFIRTxGain(0), m_lpfFIRTxGain(0),
m_ctx(0), m_ctx(nullptr),
m_devPhy(0), m_devPhy(nullptr),
m_devRx(0), m_devRx(nullptr),
m_devTx(0), m_devTx(nullptr),
m_chnRx0i(0), m_rxBuf(nullptr),
m_chnRx0q(0), m_txBuf(nullptr),
m_chnTx0i(0),
m_chnTx0q(0),
m_rxBuf(0),
m_txBuf(0),
m_xoInitial(0), m_xoInitial(0),
m_temp(0.0f) m_temp(0.0f)
{ {
@ -64,16 +60,40 @@ DevicePlutoSDRBox::DevicePlutoSDRBox(const std::string& uri) :
m_valid = m_ctx && m_devPhy && m_devRx && m_devTx; m_valid = m_ctx && m_devPhy && m_devRx && m_devTx;
if (m_valid) { if (m_valid)
{
std::regex channelIdReg("voltage([0-9]+)");
getXO(); getXO();
// int nb_channels = iio_device_get_channels_count(m_devRx); int nbRxChannels = iio_device_get_channels_count(m_devRx);
// for (int i = 0; i < nb_channels; i++) {
// iio_channel_disable(iio_device_get_channel(m_devRx, i)); for (int i = 0; i < nbRxChannels; i++)
// } {
// nb_channels = iio_device_get_channels_count(m_devTx); iio_channel *chn = iio_device_get_channel(m_devRx, i);
// for (int i = 0; i < nb_channels; i++) { std::string channelId(iio_channel_get_id(chn));
// iio_channel_disable(iio_device_get_channel(m_devTx, i));
// } if (std::regex_match(channelId, channelIdReg))
{
m_rxChannelIds.append(QString(channelId.c_str()));
m_rxChannels.append(chn);
qDebug("DevicePlutoSDRBox::DevicePlutoSDRBox: Rx: %s", channelId.c_str());
}
}
int nbTxChannels = iio_device_get_channels_count(m_devTx);
for (int i = 0; i < nbTxChannels; i++)
{
iio_channel *chn = iio_device_get_channel(m_devTx, i);
std::string channelId(iio_channel_get_id(chn));
if (std::regex_match(channelId, channelIdReg))
{
m_txChannelIds.append(QString(channelId.c_str()));
m_txChannels.append(chn);
qDebug("DevicePlutoSDRBox::DevicePlutoSDRBox: Tx: %s", channelId.c_str());
}
}
} }
} }
@ -259,14 +279,11 @@ bool DevicePlutoSDRBox::openRx()
{ {
if (!m_valid) { return false; } if (!m_valid) { return false; }
if (!m_chnRx0i) { if (m_rxChannels.size() > 0)
m_chnRx0i = iio_device_find_channel(m_devRx, "voltage0", false); {
} iio_channel_enable(m_rxChannels.at(0));
if (m_chnRx0i) { const struct iio_data_format *df = iio_channel_get_data_format(m_rxChannels.at(0));
iio_channel_enable(m_chnRx0i);
const struct iio_data_format *df = iio_channel_get_data_format(m_chnRx0i);
qDebug("DevicePlutoSDRBox::openRx channel I: length: %u bits: %u shift: %u signed: %s be: %s with_scale: %s scale: %lf repeat: %u", qDebug("DevicePlutoSDRBox::openRx channel I: length: %u bits: %u shift: %u signed: %s be: %s with_scale: %s scale: %lf repeat: %u",
df->length, df->length,
df->bits, df->bits,
@ -276,19 +293,18 @@ bool DevicePlutoSDRBox::openRx()
df->with_scale? "true" : "false", df->with_scale? "true" : "false",
df->scale, df->scale,
df->repeat); df->repeat);
} else { }
else
{
std::cerr << "DevicePlutoSDRBox::openRx: failed" << std::endl; std::cerr << "DevicePlutoSDRBox::openRx: failed" << std::endl;
return false; return false;
} }
if (!m_chnRx0q) { if (m_rxChannels.size() > 1)
m_chnRx0q = iio_device_find_channel(m_devRx, "voltage1", false); {
} iio_channel_enable(m_rxChannels.at(1));
if (m_chnRx0q) { const struct iio_data_format* df = iio_channel_get_data_format(m_rxChannels.at(1));
iio_channel_enable(m_chnRx0q);
const struct iio_data_format* df = iio_channel_get_data_format(m_chnRx0q);
qDebug("DevicePlutoSDRBox::openRx channel Q: length: %u bits: %u shift: %u signed: %s be: %s with_scale: %s scale: %lf repeat: %u", qDebug("DevicePlutoSDRBox::openRx channel Q: length: %u bits: %u shift: %u signed: %s be: %s with_scale: %s scale: %lf repeat: %u",
df->length, df->length,
df->bits, df->bits,
@ -300,7 +316,8 @@ bool DevicePlutoSDRBox::openRx()
df->repeat); df->repeat);
return true; return true;
} }
else { else
{
std::cerr << "DevicePlutoSDRBox::openRx: failed" << std::endl; std::cerr << "DevicePlutoSDRBox::openRx: failed" << std::endl;
return false; return false;
} }
@ -310,13 +327,10 @@ bool DevicePlutoSDRBox::openTx()
{ {
if (!m_valid) { return false; } if (!m_valid) { return false; }
if (!m_chnTx0i) { if (m_txChannels.size() > 0)
m_chnTx0i = iio_device_find_channel(m_devTx, "voltage0", true); {
} iio_channel_enable(m_txChannels.at(0));
const struct iio_data_format *df = iio_channel_get_data_format(m_txChannels.at(0));
if (m_chnTx0i) {
iio_channel_enable(m_chnTx0i);
const struct iio_data_format *df = iio_channel_get_data_format(m_chnTx0i);
qDebug("DevicePlutoSDRBox::openTx: channel I: length: %u bits: %u shift: %u signed: %s be: %s with_scale: %s scale: %lf repeat: %u", qDebug("DevicePlutoSDRBox::openTx: channel I: length: %u bits: %u shift: %u signed: %s be: %s with_scale: %s scale: %lf repeat: %u",
df->length, df->length,
df->bits, df->bits,
@ -326,18 +340,17 @@ bool DevicePlutoSDRBox::openTx()
df->with_scale? "true" : "false", df->with_scale? "true" : "false",
df->scale, df->scale,
df->repeat); df->repeat);
} else { }
else
{
std::cerr << "DevicePlutoSDRBox::openTx: failed to open I channel" << std::endl; std::cerr << "DevicePlutoSDRBox::openTx: failed to open I channel" << std::endl;
return false; return false;
} }
if (!m_chnTx0q) { if (m_txChannels.size() > 1)
m_chnTx0q = iio_device_find_channel(m_devTx, "voltage1", true); {
} iio_channel_enable(m_txChannels.at(1));
const struct iio_data_format *df = iio_channel_get_data_format(m_txChannels.at(1));
if (m_chnTx0q) {
iio_channel_enable(m_chnTx0q);
const struct iio_data_format *df = iio_channel_get_data_format(m_chnTx0q);
qDebug("DevicePlutoSDRBox::openTx: channel Q: length: %u bits: %u shift: %u signed: %s be: %s with_scale: %s scale: %lf repeat: %u", qDebug("DevicePlutoSDRBox::openTx: channel Q: length: %u bits: %u shift: %u signed: %s be: %s with_scale: %s scale: %lf repeat: %u",
df->length, df->length,
df->bits, df->bits,
@ -348,7 +361,9 @@ bool DevicePlutoSDRBox::openTx()
df->scale, df->scale,
df->repeat); df->repeat);
return true; return true;
} else { }
else
{
std::cerr << "DevicePlutoSDRBox::openTx: failed to open Q channel" << std::endl; std::cerr << "DevicePlutoSDRBox::openTx: failed to open Q channel" << std::endl;
return false; return false;
} }
@ -356,14 +371,14 @@ bool DevicePlutoSDRBox::openTx()
void DevicePlutoSDRBox::closeRx() void DevicePlutoSDRBox::closeRx()
{ {
if (m_chnRx0i) { iio_channel_disable(m_chnRx0i); } if (m_rxChannels.size() > 0) { iio_channel_disable(m_rxChannels.at(0)); }
if (m_chnRx0q) { iio_channel_disable(m_chnRx0q); } if (m_rxChannels.size() > 1) { iio_channel_disable(m_rxChannels.at(1)); }
} }
void DevicePlutoSDRBox::closeTx() void DevicePlutoSDRBox::closeTx()
{ {
if (m_chnTx0i) { iio_channel_disable(m_chnTx0i); } if (m_txChannels.size() > 0) { iio_channel_disable(m_txChannels.at(0)); }
if (m_chnTx0q) { iio_channel_disable(m_chnTx0q); } if (m_txChannels.size() > 1) { iio_channel_disable(m_txChannels.at(1)); }
} }
struct iio_buffer *DevicePlutoSDRBox::createRxBuffer(unsigned int size, bool cyclic) struct iio_buffer *DevicePlutoSDRBox::createRxBuffer(unsigned int size, bool cyclic)
@ -454,16 +469,16 @@ char* DevicePlutoSDRBox::rxBufferEnd()
if (m_rxBuf) { if (m_rxBuf) {
return (char *) iio_buffer_end(m_rxBuf); return (char *) iio_buffer_end(m_rxBuf);
} else { } else {
return 0; return nullptr;
} }
} }
char* DevicePlutoSDRBox::rxBufferFirst() char* DevicePlutoSDRBox::rxBufferFirst()
{ {
if (m_rxBuf) { if (m_rxBuf) {
return (char *) iio_buffer_first(m_rxBuf, m_chnRx0i); return (char *) iio_buffer_first(m_rxBuf, m_rxChannels.at(0));
} else { } else {
return 0; return nullptr;
} }
} }
@ -481,26 +496,26 @@ char* DevicePlutoSDRBox::txBufferEnd()
if (m_txBuf) { if (m_txBuf) {
return (char *) iio_buffer_end(m_txBuf); return (char *) iio_buffer_end(m_txBuf);
} else { } else {
return 0; return nullptr;
} }
} }
char* DevicePlutoSDRBox::txBufferFirst() char* DevicePlutoSDRBox::txBufferFirst()
{ {
if (m_txBuf) { if (m_txBuf) {
return (char *) iio_buffer_first(m_txBuf, m_chnTx0i); return (char *) iio_buffer_first(m_txBuf, m_txChannels.at(0));
} else { } else {
return 0; return nullptr;
} }
} }
void DevicePlutoSDRBox::txChannelConvert(int16_t *dst, int16_t *src) void DevicePlutoSDRBox::txChannelConvert(int16_t *dst, int16_t *src)
{ {
if (m_chnTx0i) { if (m_txChannels.size() > 0) {
iio_channel_convert_inverse(m_chnTx0i, &dst[0], &src[0]); iio_channel_convert_inverse(m_txChannels.at(0), &dst[0], &src[0]);
} }
if (m_chnTx0q) { if (m_txChannels.size() > 1) {
iio_channel_convert_inverse(m_chnTx0q, &dst[1], &src[1]); iio_channel_convert_inverse(m_txChannels.at(1), &dst[1], &src[1]);
} }
} }

View File

@ -21,8 +21,11 @@
#include <sstream> #include <sstream>
#include <stdint.h> #include <stdint.h>
#include <sys/types.h> #include <sys/types.h>
#include "deviceplutosdrscan.h"
#include <QList>
#include <QString>
#include "deviceplutosdrscan.h"
#include "export.h" #include "export.h"
#if defined(_MSC_VER) #if defined(_MSC_VER)
@ -30,6 +33,8 @@
typedef SSIZE_T ssize_t; typedef SSIZE_T ssize_t;
#endif #endif
struct iio_channel;
class DEVICES_API DevicePlutoSDRBox class DEVICES_API DevicePlutoSDRBox
{ {
public: public:
@ -75,19 +80,18 @@ public:
void set_params(DeviceType devType, const std::vector<std::string> &params); void set_params(DeviceType devType, const std::vector<std::string> &params);
bool get_param(DeviceType devType, const std::string &param, std::string &value); bool get_param(DeviceType devType, const std::string &param, std::string &value);
bool openRx(); bool openRx(); //!< Open first Rx (Rx0)
bool openTx(); bool openTx(); //!< Open first Tx (Tx0)
void closeRx(); void closeRx(); //!< Close first Rx (Rx0)
void closeTx(); void closeTx(); //!< Close first Tx (Tx0)
int getNbRx() const { return m_rxChannels.size() / 2; }
int getNbTx() const { return m_txChannels.size() / 2; }
struct iio_buffer *createRxBuffer(unsigned int size, bool cyclic); struct iio_buffer *createRxBuffer(unsigned int size, bool cyclic);
struct iio_buffer *createTxBuffer(unsigned int size, bool cyclic); struct iio_buffer *createTxBuffer(unsigned int size, bool cyclic);
void deleteRxBuffer(); void deleteRxBuffer();
void deleteTxBuffer(); void deleteTxBuffer();
ssize_t getRxSampleSize(); ssize_t getRxSampleSize();
ssize_t getTxSampleSize(); ssize_t getTxSampleSize();
struct iio_channel *getRxChannel0() { return m_chnRx0i; }
struct iio_channel *getTxChannel0I() { return m_chnTx0i; }
struct iio_channel *getTxChannel0Q() { return m_chnTx0q; }
ssize_t rxBufferRefill(); ssize_t rxBufferRefill();
ssize_t txBufferPush(); ssize_t txBufferPush();
std::ptrdiff_t rxBufferStep(); std::ptrdiff_t rxBufferStep();
@ -119,15 +123,15 @@ private:
struct iio_device *m_devPhy; struct iio_device *m_devPhy;
struct iio_device *m_devRx; struct iio_device *m_devRx;
struct iio_device *m_devTx; struct iio_device *m_devTx;
struct iio_channel *m_chnRx0i;
struct iio_channel* m_chnRx0q;
struct iio_channel *m_chnTx0i;
struct iio_channel *m_chnTx0q;
struct iio_buffer *m_rxBuf; struct iio_buffer *m_rxBuf;
struct iio_buffer *m_txBuf; struct iio_buffer *m_txBuf;
bool m_valid; bool m_valid;
int64_t m_xoInitial; int64_t m_xoInitial;
float m_temp; float m_temp;
QList<QString> m_rxChannelIds;
QList<iio_channel*> m_rxChannels;
QList<QString> m_txChannelIds;
QList<iio_channel*> m_txChannels;
bool parseSampleRates(const std::string& rateStr, SampleRates& sampleRates); bool parseSampleRates(const std::string& rateStr, SampleRates& sampleRates);
void setFilter(const std::string& filterConfigStr); void setFilter(const std::string& filterConfigStr);

View File

@ -113,7 +113,6 @@ void PlutoSDRInputThread::run()
{ {
m_buf[ihs++] = *((int16_t *) p_dat); m_buf[ihs++] = *((int16_t *) p_dat);
m_buf[ihs++] = *(((int16_t *) p_dat) + 1); m_buf[ihs++] = *(((int16_t *) p_dat) + 1);
// iio_channel_convert(m_plutoBox->getRxChannel0(), (void *) &m_bufConv[ihs], (const void *) &m_buf[ihs]);
} }
if (m_iqOrder) { if (m_iqOrder) {