mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-15 12:51:49 -05:00
PlutoSDRBox: use channels registered at contruction time
This commit is contained in:
parent
b04cc965e1
commit
54222ff016
@ -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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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> ¶ms);
|
void set_params(DeviceType devType, const std::vector<std::string> ¶ms);
|
||||||
bool get_param(DeviceType devType, const std::string ¶m, std::string &value);
|
bool get_param(DeviceType devType, const std::string ¶m, 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);
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user