提交 d8c70031 编写于 作者: 丁劲犇's avatar 丁劲犇 😸

Qt6 deprecated issues.

上级 fb12c783
/* -*- c++ -*- */ /* -*- c++ -*- */
/* /*
* Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt * Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt
* http://gqrx.dk/ * http://gqrx.dk/
...@@ -30,310 +30,310 @@ ...@@ -30,310 +30,310 @@
#include "bookmarks.h" #include "bookmarks.h"
#include <stdio.h> #include <stdio.h>
#include <wchar.h> #include <wchar.h>
#include <algorithm>
const QColor TagInfo::DefaultColor(Qt::lightGray); const QColor TagInfo::DefaultColor(Qt::lightGray);
const QString TagInfo::strUntagged("Untagged"); const QString TagInfo::strUntagged("Untagged");
Bookmarks* Bookmarks::m_pThis = 0; Bookmarks* Bookmarks::m_pThis = 0;
Bookmarks::Bookmarks() Bookmarks::Bookmarks()
{ {
TagInfo tag(TagInfo::strUntagged); TagInfo tag(TagInfo::strUntagged);
m_TagList.append(tag); m_TagList.append(tag);
} }
void Bookmarks::create() void Bookmarks::create()
{ {
m_pThis = new Bookmarks; m_pThis = new Bookmarks;
} }
Bookmarks& Bookmarks::Get() Bookmarks& Bookmarks::Get()
{ {
return *m_pThis; return *m_pThis;
} }
void Bookmarks::setConfigDir(const QString& cfg_dir) void Bookmarks::setConfigDir(const QString& cfg_dir)
{ {
m_bookmarksFile = cfg_dir + "/bookmarks.csv"; m_bookmarksFile = cfg_dir + "/bookmarks.csv";
printf("BookmarksFile is %s\n", m_bookmarksFile.toStdString().c_str()); printf("BookmarksFile is %s\n", m_bookmarksFile.toStdString().c_str());
} }
void Bookmarks::add(BookmarkInfo &info) void Bookmarks::add(BookmarkInfo &info)
{ {
m_BookmarkList.append(info); m_BookmarkList.append(info);
std::stable_sort(m_BookmarkList.begin(),m_BookmarkList.end()); std::stable_sort(m_BookmarkList.begin(),m_BookmarkList.end());
save(); save();
emit( BookmarksChanged() ); emit( BookmarksChanged() );
} }
void Bookmarks::remove(int index) void Bookmarks::remove(int index)
{ {
m_BookmarkList.removeAt(index); m_BookmarkList.removeAt(index);
save(); save();
emit BookmarksChanged(); emit BookmarksChanged();
} }
bool Bookmarks::load() bool Bookmarks::load()
{ {
QFile file(m_bookmarksFile); QFile file(m_bookmarksFile);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{ {
m_BookmarkList.clear(); m_BookmarkList.clear();
m_TagList.clear(); m_TagList.clear();
// always create the "Untagged" entry. // always create the "Untagged" entry.
findOrAddTag(TagInfo::strUntagged); findOrAddTag(TagInfo::strUntagged);
// Read Tags, until first empty line. // Read Tags, until first empty line.
while (!file.atEnd()) while (!file.atEnd())
{ {
QString line = QString::fromUtf8(file.readLine().trimmed()); QString line = QString::fromUtf8(file.readLine().trimmed());
if(line.isEmpty()) if(line.isEmpty())
break; break;
if(line.startsWith("#")) if(line.startsWith("#"))
continue; continue;
QStringList strings = line.split(";"); QStringList strings = line.split(";");
if(strings.count() == 2) if(strings.count() == 2)
{ {
TagInfo &info = findOrAddTag(strings[0]); TagInfo &info = findOrAddTag(strings[0]);
info.color = QColor(strings[1].trimmed()); info.color = QColor(strings[1].trimmed());
} }
else else
{ {
printf("\nBookmarks: Ignoring Line:\n %s\n", line.toLatin1().data()); printf("\nBookmarks: Ignoring Line:\n %s\n", line.toLatin1().data());
} }
} }
std::sort(m_TagList.begin(),m_TagList.end()); std::sort(m_TagList.begin(),m_TagList.end());
// Read Bookmarks, after first empty line. // Read Bookmarks, after first empty line.
while (!file.atEnd()) while (!file.atEnd())
{ {
QString line = QString::fromUtf8(file.readLine().trimmed()); QString line = QString::fromUtf8(file.readLine().trimmed());
if(line.isEmpty() || line.startsWith("#")) if(line.isEmpty() || line.startsWith("#"))
continue; continue;
QStringList strings = line.split(";"); QStringList strings = line.split(";");
if(strings.count() == 5) if(strings.count() == 5)
{ {
BookmarkInfo info; BookmarkInfo info;
info.frequency = strings[0].toLongLong(); info.frequency = strings[0].toLongLong();
info.name = strings[1].trimmed(); info.name = strings[1].trimmed();
info.modulation = strings[2].trimmed(); info.modulation = strings[2].trimmed();
info.bandwidth = strings[3].toInt(); info.bandwidth = strings[3].toInt();
// Multiple Tags may be separated by comma. // Multiple Tags may be separated by comma.
QString strTags = strings[4]; QString strTags = strings[4];
QStringList TagList = strTags.split(","); QStringList TagList = strTags.split(",");
for(int iTag=0; iTag<TagList.size(); ++iTag) for(int iTag=0; iTag<TagList.size(); ++iTag)
{ {
info.tags.append(&findOrAddTag(TagList[iTag].trimmed())); info.tags.append(&findOrAddTag(TagList[iTag].trimmed()));
} }
m_BookmarkList.append(info); m_BookmarkList.append(info);
} }
else else
{ {
printf("\nBookmarks: Ignoring Line:\n %s\n", line.toLatin1().data()); printf("\nBookmarks: Ignoring Line:\n %s\n", line.toLatin1().data());
} }
} }
file.close(); file.close();
std::stable_sort(m_BookmarkList.begin(),m_BookmarkList.end()); std::stable_sort(m_BookmarkList.begin(),m_BookmarkList.end());
emit BookmarksChanged(); emit BookmarksChanged();
return true; return true;
} }
return false; return false;
} }
//FIXME: Commas in names //FIXME: Commas in names
bool Bookmarks::save() bool Bookmarks::save()
{ {
QFile file(m_bookmarksFile); QFile file(m_bookmarksFile);
if(file.open(QFile::WriteOnly | QFile::Truncate | QIODevice::Text)) if(file.open(QFile::WriteOnly | QFile::Truncate | QIODevice::Text))
{ {
QTextStream stream(&file); QTextStream stream(&file);
stream << QString("# Tag name").leftJustified(20) + "; " + stream << QString("# Tag name").leftJustified(20) + "; " +
QString(" color") << endl; QString(" color") << Qt::endl;
QSet<TagInfo*> usedTags; QSet<TagInfo*> usedTags;
for (int iBookmark = 0; iBookmark < m_BookmarkList.size(); iBookmark++) for (int iBookmark = 0; iBookmark < m_BookmarkList.size(); iBookmark++)
{ {
BookmarkInfo& info = m_BookmarkList[iBookmark]; BookmarkInfo& info = m_BookmarkList[iBookmark];
for(int iTag = 0; iTag < info.tags.size(); ++iTag) for(int iTag = 0; iTag < info.tags.size(); ++iTag)
{ {
TagInfo& tag = *info.tags[iTag]; TagInfo& tag = *info.tags[iTag];
usedTags.insert(&tag); usedTags.insert(&tag);
} }
} }
for (QSet<TagInfo*>::iterator i = usedTags.begin(); i != usedTags.end(); i++) for (QSet<TagInfo*>::iterator i = usedTags.begin(); i != usedTags.end(); i++)
{ {
TagInfo& info = **i; TagInfo& info = **i;
stream << info.name.leftJustified(20) + "; " + info.color.name() << endl; stream << info.name.leftJustified(20) + "; " + info.color.name() << Qt::endl;
} }
stream << endl; stream << Qt::endl;
stream << QString("# Frequency").leftJustified(12) + "; " + stream << QString("# Frequency").leftJustified(12) + "; " +
QString("Name").leftJustified(25)+ "; " + QString("Name").leftJustified(25)+ "; " +
QString("Modulation").leftJustified(20) + "; " + QString("Modulation").leftJustified(20) + "; " +
QString("Bandwidth").rightJustified(10) + "; " + QString("Bandwidth").rightJustified(10) + "; " +
QString("Tags") << endl; QString("Tags") << Qt::endl;
for (int i = 0; i < m_BookmarkList.size(); i++) for (int i = 0; i < m_BookmarkList.size(); i++)
{ {
BookmarkInfo& info = m_BookmarkList[i]; BookmarkInfo& info = m_BookmarkList[i];
QString line = QString::number(info.frequency).rightJustified(12) + QString line = QString::number(info.frequency).rightJustified(12) +
"; " + info.name.leftJustified(25) + "; " + "; " + info.name.leftJustified(25) + "; " +
info.modulation.leftJustified(20)+ "; " + info.modulation.leftJustified(20)+ "; " +
QString::number(info.bandwidth).rightJustified(10) + "; "; QString::number(info.bandwidth).rightJustified(10) + "; ";
for(int iTag = 0; iTag<info.tags.size(); ++iTag) for(int iTag = 0; iTag<info.tags.size(); ++iTag)
{ {
TagInfo& tag = *info.tags[iTag]; TagInfo& tag = *info.tags[iTag];
if(iTag!=0) if(iTag!=0)
{ {
line.append(","); line.append(",");
} }
line.append(tag.name); line.append(tag.name);
} }
stream << line << endl; stream << line << Qt::endl;
} }
file.close(); file.close();
return true; return true;
} }
return false; return false;
} }
QList<BookmarkInfo> Bookmarks::getBookmarksInRange(qint64 low, qint64 high) QList<BookmarkInfo> Bookmarks::getBookmarksInRange(qint64 low, qint64 high)
{ {
BookmarkInfo info; BookmarkInfo info;
info.frequency=low; info.frequency=low;
QList<BookmarkInfo>::const_iterator lb = qLowerBound(m_BookmarkList, info); QList<BookmarkInfo>::const_iterator lb = std::lower_bound(m_BookmarkList.begin(), m_BookmarkList.end(),info);
info.frequency=high; info.frequency=high;
QList<BookmarkInfo>::const_iterator ub = qUpperBound(m_BookmarkList, info); QList<BookmarkInfo>::const_iterator ub = std::upper_bound(m_BookmarkList.begin(), m_BookmarkList.end(),info);
QList<BookmarkInfo> found; QList<BookmarkInfo> found;
while (lb != ub) while (lb != ub)
{ {
const BookmarkInfo& info = *lb; const BookmarkInfo& info = *lb;
//if(info.IsActive()) //if(info.IsActive())
{ {
found.append(info); found.append(info);
} }
lb++; lb++;
} }
return found; return found;
} }
TagInfo &Bookmarks::findOrAddTag(QString tagName) TagInfo &Bookmarks::findOrAddTag(QString tagName)
{ {
tagName = tagName.trimmed(); tagName = tagName.trimmed();
if (tagName.isEmpty()) if (tagName.isEmpty())
tagName=TagInfo::strUntagged; tagName=TagInfo::strUntagged;
int idx = getTagIndex(tagName); int idx = getTagIndex(tagName);
if (idx != -1) if (idx != -1)
return m_TagList[idx]; return m_TagList[idx];
TagInfo info; TagInfo info;
info.name=tagName; info.name=tagName;
m_TagList.append(info); m_TagList.append(info);
emit TagListChanged(); emit TagListChanged();
return m_TagList.last(); return m_TagList.last();
} }
bool Bookmarks::removeTag(QString tagName) bool Bookmarks::removeTag(QString tagName)
{ {
tagName = tagName.trimmed(); tagName = tagName.trimmed();
// Do not delete "Untagged" tag. // Do not delete "Untagged" tag.
if(tagName.compare(TagInfo::strUntagged, tagName)==0) if(tagName.compare(TagInfo::strUntagged, tagName)==0)
return false; return false;
int idx = getTagIndex(tagName); int idx = getTagIndex(tagName);
if (idx == -1) if (idx == -1)
return false; return false;
// Delete Tag from all Bookmarks that use it. // Delete Tag from all Bookmarks that use it.
TagInfo* pTagToDelete = &m_TagList[idx]; TagInfo* pTagToDelete = &m_TagList[idx];
for(int i=0; i<m_BookmarkList.size(); ++i) for(int i=0; i<m_BookmarkList.size(); ++i)
{ {
BookmarkInfo& bmi = m_BookmarkList[i]; BookmarkInfo& bmi = m_BookmarkList[i];
for(int t=0; t<bmi.tags.size(); ++t) for(int t=0; t<bmi.tags.size(); ++t)
{ {
TagInfo* pTag = bmi.tags[t]; TagInfo* pTag = bmi.tags[t];
if(pTag == pTagToDelete) if(pTag == pTagToDelete)
{ {
if(bmi.tags.size()>1) bmi.tags.removeAt(t); if(bmi.tags.size()>1) bmi.tags.removeAt(t);
else bmi.tags[0] = &findOrAddTag(TagInfo::strUntagged); else bmi.tags[0] = &findOrAddTag(TagInfo::strUntagged);
} }
} }
} }
// Delete Tag. // Delete Tag.
m_TagList.removeAt(idx); m_TagList.removeAt(idx);
emit BookmarksChanged(); emit BookmarksChanged();
emit TagListChanged(); emit TagListChanged();
return true; return true;
} }
bool Bookmarks::setTagChecked(QString tagName, bool bChecked) bool Bookmarks::setTagChecked(QString tagName, bool bChecked)
{ {
int idx = getTagIndex(tagName); int idx = getTagIndex(tagName);
if (idx == -1) return false; if (idx == -1) return false;
m_TagList[idx].active = bChecked; m_TagList[idx].active = bChecked;
emit BookmarksChanged(); emit BookmarksChanged();
emit TagListChanged(); emit TagListChanged();
return true; return true;
} }
int Bookmarks::getTagIndex(QString tagName) int Bookmarks::getTagIndex(QString tagName)
{ {
tagName = tagName.trimmed(); tagName = tagName.trimmed();
for (int i = 0; i < m_TagList.size(); i++) for (int i = 0; i < m_TagList.size(); i++)
{ {
if (m_TagList[i].name == tagName) if (m_TagList[i].name == tagName)
return i; return i;
} }
return -1; return -1;
} }
const QColor BookmarkInfo::GetColor() const const QColor BookmarkInfo::GetColor() const
{ {
for(int iTag=0; iTag<tags.size(); ++iTag) for(int iTag=0; iTag<tags.size(); ++iTag)
{ {
TagInfo& tag = *tags[iTag]; TagInfo& tag = *tags[iTag];
if(tag.active) if(tag.active)
{ {
return tag.color; return tag.color;
} }
} }
return TagInfo::DefaultColor; return TagInfo::DefaultColor;
} }
bool BookmarkInfo::IsActive() const bool BookmarkInfo::IsActive() const
{ {
bool bActive = false; bool bActive = false;
for(int iTag=0; iTag<tags.size(); ++iTag) for(int iTag=0; iTag<tags.size(); ++iTag)
{ {
TagInfo& tag = *tags[iTag]; TagInfo& tag = *tags[iTag];
if(tag.active) if(tag.active)
{ {
bActive = true; bActive = true;
break; break;
} }
} }
return bActive; return bActive;
} }
/* -*- c++ -*- */ /* -*- c++ -*- */
/* /*
* Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt * Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt
* http://gqrx.dk/ * http://gqrx.dk/
...@@ -27,188 +27,188 @@ ...@@ -27,188 +27,188 @@
BookmarksTableModel::BookmarksTableModel(QObject *parent) : BookmarksTableModel::BookmarksTableModel(QObject *parent) :
QAbstractTableModel(parent) QAbstractTableModel(parent)
{ {
} }
int BookmarksTableModel::rowCount ( const QModelIndex & /*parent*/ ) const int BookmarksTableModel::rowCount ( const QModelIndex & /*parent*/ ) const
{ {
return m_Bookmarks.size(); return m_Bookmarks.size();
} }
int BookmarksTableModel::columnCount ( const QModelIndex & /*parent*/ ) const int BookmarksTableModel::columnCount ( const QModelIndex & /*parent*/ ) const
{ {
return 5; return 5;
} }
QVariant BookmarksTableModel::headerData ( int section, Qt::Orientation orientation, int role ) const QVariant BookmarksTableModel::headerData ( int section, Qt::Orientation orientation, int role ) const
{ {
if(orientation == Qt::Horizontal && role == Qt::DisplayRole) if(orientation == Qt::Horizontal && role == Qt::DisplayRole)
{ {
switch(section) switch(section)
{ {
case COL_FREQUENCY: case COL_FREQUENCY:
return QString("Frequency"); return QString("Frequency");
break; break;
case COL_NAME: case COL_NAME:
return QString("Name"); return QString("Name");
break; break;
case COL_MODULATION: case COL_MODULATION:
return QString("Modulation"); return QString("Modulation");
break; break;
case COL_BANDWIDTH: case COL_BANDWIDTH:
return QString("Bandwidth"); return QString("Bandwidth");
break; break;
case COL_TAGS: case COL_TAGS:
return QString("Tag"); return QString("Tag");
break; break;
} }
} }
if(orientation == Qt::Vertical && role == Qt::DisplayRole) if(orientation == Qt::Vertical && role == Qt::DisplayRole)
{ {
return section; return section;
} }
return QVariant(); return QVariant();
} }
QVariant BookmarksTableModel::data ( const QModelIndex & index, int role ) const QVariant BookmarksTableModel::data ( const QModelIndex & index, int role ) const
{ {
BookmarkInfo& info = *m_Bookmarks[index.row()]; BookmarkInfo& info = *m_Bookmarks[index.row()];
if(role==Qt::BackgroundColorRole) if(role==Qt::BackgroundRole)
{ {
QColor bg(info.GetColor()); QColor bg(info.GetColor());
bg.setAlpha(0x60); bg.setAlpha(0x60);
return bg; return bg;
} }
else if(role == Qt::DisplayRole || role==Qt::EditRole) else if(role == Qt::DisplayRole || role==Qt::EditRole)
{ {
switch(index.column()) switch(index.column())
{ {
case COL_FREQUENCY: case COL_FREQUENCY:
return info.frequency; return info.frequency;
case COL_NAME: case COL_NAME:
return (role==Qt::EditRole)?QString(info.name):info.name; return (role==Qt::EditRole)?QString(info.name):info.name;
case COL_MODULATION: case COL_MODULATION:
return info.modulation; return info.modulation;
case COL_BANDWIDTH: case COL_BANDWIDTH:
return (info.bandwidth==0)?QVariant(""):QVariant(info.bandwidth); return (info.bandwidth==0)?QVariant(""):QVariant(info.bandwidth);
case COL_TAGS: case COL_TAGS:
QString strTags; QString strTags;
for(int iTag=0; iTag<info.tags.size(); ++iTag) for(int iTag=0; iTag<info.tags.size(); ++iTag)
{ {
if(iTag!=0) if(iTag!=0)
{ {
strTags.append(","); strTags.append(",");
} }
TagInfo& tag = *info.tags[iTag]; TagInfo& tag = *info.tags[iTag];
strTags.append(tag.name); strTags.append(tag.name);
} }
return strTags; return strTags;
} }
} }
return QVariant(); return QVariant();
} }
bool BookmarksTableModel::setData(const QModelIndex &index, const QVariant &value, int role) bool BookmarksTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{ {
if(role==Qt::EditRole) if(role==Qt::EditRole)
{ {
BookmarkInfo &info = *m_Bookmarks[index.row()]; BookmarkInfo &info = *m_Bookmarks[index.row()];
switch(index.column()) switch(index.column())
{ {
case COL_FREQUENCY: case COL_FREQUENCY:
{ {
info.frequency = value.toLongLong(); info.frequency = value.toLongLong();
emit dataChanged(index, index); emit dataChanged(index, index);
} }
break; break;
case COL_NAME: case COL_NAME:
{ {
info.name = value.toString(); info.name = value.toString();
emit dataChanged(index, index); emit dataChanged(index, index);
return true; return true;
} }
break; break;
case COL_MODULATION: case COL_MODULATION:
break; break;
case COL_BANDWIDTH: case COL_BANDWIDTH:
{ {
info.bandwidth = value.toInt(); info.bandwidth = value.toInt();
emit dataChanged(index, index); emit dataChanged(index, index);
} }
break; break;
case COL_TAGS: case COL_TAGS:
{ {
info.tags.clear(); info.tags.clear();
QString strValue = value.toString(); QString strValue = value.toString();
QStringList strList = strValue.split(","); QStringList strList = strValue.split(",");
for(int i=0; i<strList.size(); ++i) for(int i=0; i<strList.size(); ++i)
{ {
QString strTag = strList[i].trimmed(); QString strTag = strList[i].trimmed();
info.tags.append( &Bookmarks::Get().findOrAddTag(strTag) ); info.tags.append( &Bookmarks::Get().findOrAddTag(strTag) );
} }
emit dataChanged(index, index); emit dataChanged(index, index);
return true; return true;
} }
break; break;
} }
return true; // return true means success return true; // return true means success
} }
return false; return false;
} }
Qt::ItemFlags BookmarksTableModel::flags ( const QModelIndex& index ) const Qt::ItemFlags BookmarksTableModel::flags ( const QModelIndex& index ) const
{ {
Qt::ItemFlags flags = 0; Qt::ItemFlags flags = Qt::NoItemFlags;
switch(index.column()) switch(index.column())
{ {
case COL_FREQUENCY: case COL_FREQUENCY:
case COL_NAME: case COL_NAME:
case COL_BANDWIDTH: case COL_BANDWIDTH:
case COL_MODULATION: case COL_MODULATION:
flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
break; break;
case COL_TAGS: case COL_TAGS:
flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
break; break;
} }
return flags; return flags;
} }
void BookmarksTableModel::update() void BookmarksTableModel::update()
{ {
int iRow = 0; int iRow = 0;
m_Bookmarks.clear(); m_Bookmarks.clear();
for(int iBookmark=0; iBookmark<Bookmarks::Get().size(); iBookmark++) for(int iBookmark=0; iBookmark<Bookmarks::Get().size(); iBookmark++)
{ {
BookmarkInfo& info = Bookmarks::Get().getBookmark(iBookmark); BookmarkInfo& info = Bookmarks::Get().getBookmark(iBookmark);
bool bActive = false; bool bActive = false;
for(int iTag=0; iTag<info.tags.size(); ++iTag) for(int iTag=0; iTag<info.tags.size(); ++iTag)
{ {
TagInfo& tag = *info.tags[iTag]; TagInfo& tag = *info.tags[iTag];
if(tag.active) if(tag.active)
{ {
bActive = true; bActive = true;
break; break;
} }
} }
if(bActive) if(bActive)
{ {
m_mapRowToBookmarksIndex[iRow]=iBookmark; m_mapRowToBookmarksIndex[iRow]=iBookmark;
m_Bookmarks.append(&info); m_Bookmarks.append(&info);
++iRow; ++iRow;
} }
} }
emit layoutChanged(); emit layoutChanged();
} }
BookmarkInfo *BookmarksTableModel::getBookmarkAtRow(int row) BookmarkInfo *BookmarksTableModel::getBookmarkAtRow(int row)
{ {
return m_Bookmarks[row]; return m_Bookmarks[row];
} }
int BookmarksTableModel::GetBookmarksIndexForRow(int iRow) int BookmarksTableModel::GetBookmarksIndexForRow(int iRow)
......
/* -*- c++ -*- */ /* -*- c++ -*- */
/* /*
* Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt * Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt
* http://gqrx.dk/ * http://gqrx.dk/
...@@ -28,289 +28,289 @@ ...@@ -28,289 +28,289 @@
#include <QHeaderView> #include <QHeaderView>
BookmarksTagList::BookmarksTagList(QWidget *parent, bool bShowUntagged ) BookmarksTagList::BookmarksTagList(QWidget *parent, bool bShowUntagged )
: QTableWidget(parent) : QTableWidget(parent)
, m_bUpdating(false) , m_bUpdating(false)
, m_bShowUntagged(bShowUntagged) , m_bShowUntagged(bShowUntagged)
{ {
connect(this, SIGNAL(cellClicked(int,int)), connect(this, SIGNAL(cellClicked(int,int)),
this, SLOT(on_cellClicked(int,int))); this, SLOT(on_cellClicked(int,int)));
// right click menu // right click menu
setContextMenuPolicy(Qt::CustomContextMenu); setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), connect(this, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(ShowContextMenu(const QPoint&))); this, SLOT(ShowContextMenu(const QPoint&)));
horizontalHeader()->setVisible(false); horizontalHeader()->setVisible(false);
verticalHeader()->setVisible(false); verticalHeader()->setVisible(false);
setColumnCount(2); setColumnCount(2);
setColumnWidth(0, 20); setColumnWidth(0, 20);
horizontalHeader()->setStretchLastSection(true); horizontalHeader()->setStretchLastSection(true);
setSelectionMode(QAbstractItemView::SingleSelection); setSelectionMode(QAbstractItemView::SingleSelection);
setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionBehavior(QAbstractItemView::SelectRows);
setSortingEnabled(true); setSortingEnabled(true);
} }
void BookmarksTagList::on_cellClicked(int row, int column) void BookmarksTagList::on_cellClicked(int row, int column)
{ {
if(column==0) if(column==0)
{ {
changeColor(row, column); changeColor(row, column);
} }
if(column==1) if(column==1)
{ {
toggleCheckedState(row, column); toggleCheckedState(row, column);
} }
} }
void BookmarksTagList::changeColor(int row, int /*column*/) void BookmarksTagList::changeColor(int row, int /*column*/)
{ {
TagInfo &info = Bookmarks::Get().findOrAddTag(item(row, 1)->text()); TagInfo &info = Bookmarks::Get().findOrAddTag(item(row, 1)->text());
QColor color = QColorDialog::getColor(info.color, this); QColor color = QColorDialog::getColor(info.color, this);
if(!color.isValid()) if(!color.isValid())
return; return;
info.color=color; info.color=color;
updateTags(); updateTags();
Bookmarks::Get().save(); Bookmarks::Get().save();
} }
void BookmarksTagList::toggleCheckedState(int row, int column) void BookmarksTagList::toggleCheckedState(int row, int column)
{ {
QTableWidgetItem* p = item(row,column); QTableWidgetItem* p = item(row,column);
if(p->checkState()==Qt::Unchecked) if(p->checkState()==Qt::Unchecked)
{ {
p->setCheckState(Qt::Checked); p->setCheckState(Qt::Checked);
} }
else else
{ {
p->setCheckState(Qt::Unchecked); p->setCheckState(Qt::Unchecked);
} }
} }
void BookmarksTagList::updateTags() void BookmarksTagList::updateTags()
{ {
m_bUpdating = true; m_bUpdating = true;
// Remember which items were unchecked. // Remember which items were unchecked.
QStringList unchecked; QStringList unchecked;
for(int i=0; i<rowCount(); i++) for(int i=0; i<rowCount(); i++)
{ {
if(item(i,1)->checkState()==Qt::Unchecked) if(item(i,1)->checkState()==Qt::Unchecked)
unchecked.append(item(i,1)->text()); unchecked.append(item(i,1)->text());
} }
// Get current List of Tags. // Get current List of Tags.
QList<TagInfo> newTags = Bookmarks::Get().getTagList(); QList<TagInfo> newTags = Bookmarks::Get().getTagList();
if(!m_bShowUntagged) if(!m_bShowUntagged)
{ {
for(int i=0; i<newTags.size(); ++i) for(int i=0; i<newTags.size(); ++i)
{ {
TagInfo& taginfo = newTags[i]; TagInfo& taginfo = newTags[i];
if(taginfo.name.compare(TagInfo::strUntagged)==0) if(taginfo.name.compare(TagInfo::strUntagged)==0)
{ {
newTags.removeAt(i); newTags.removeAt(i);
break; break;
} }
} }
} }
// Rebuild List in GUI. // Rebuild List in GUI.
clear(); clear();
setSortingEnabled(false); setSortingEnabled(false);
setRowCount(0); setRowCount(0);
for(int i=0; i<newTags.count(); i++) for(int i=0; i<newTags.count(); i++)
{ {
AddTag(newTags[i].name, AddTag(newTags[i].name,
( unchecked.contains(newTags[i].name) ? Qt::Unchecked : Qt::Checked ), ( unchecked.contains(newTags[i].name) ? Qt::Unchecked : Qt::Checked ),
newTags[i].color); newTags[i].color);
} }
setSortingEnabled(true); setSortingEnabled(true);
m_bUpdating = false; m_bUpdating = false;
} }
void BookmarksTagList::setSelectedTagsAsString(const QString& strTags) void BookmarksTagList::setSelectedTagsAsString(const QString& strTags)
{ {
QStringList list = strTags.split(","); QStringList list = strTags.split(",");
int iRows = rowCount(); int iRows = rowCount();
for(int i=0; i<iRows; ++i) for(int i=0; i<iRows; ++i)
{ {
QTableWidgetItem* pItem = item(i,1); QTableWidgetItem* pItem = item(i,1);
QString name = pItem->text(); QString name = pItem->text();
bool bChecked = list.contains(name); bool bChecked = list.contains(name);
pItem->setCheckState(bChecked ? Qt::Checked : Qt::Unchecked); pItem->setCheckState(bChecked ? Qt::Checked : Qt::Unchecked);
} }
setSortingEnabled(true); setSortingEnabled(true);
} }
void BookmarksTagList::setSelectedTags(QList<TagInfo*> tags) void BookmarksTagList::setSelectedTags(QList<TagInfo*> tags)
{ {
int iRows = rowCount(); int iRows = rowCount();
for(int i=0; i<iRows; ++i) for(int i=0; i<iRows; ++i)
{ {
QTableWidgetItem* pItem = item(i,1); QTableWidgetItem* pItem = item(i,1);
QString name = pItem->text(); QString name = pItem->text();
bool bChecked = false; bool bChecked = false;
for(QList<TagInfo*>::const_iterator it=tags.begin(), itend=tags.end(); it!=itend; ++it) for(QList<TagInfo*>::const_iterator it=tags.begin(), itend=tags.end(); it!=itend; ++it)
{ {
TagInfo* pTag = *it; TagInfo* pTag = *it;
if(pTag->name == name) bChecked = true; if(pTag->name == name) bChecked = true;
} }
pItem->setCheckState(bChecked ? Qt::Checked : Qt::Unchecked); pItem->setCheckState(bChecked ? Qt::Checked : Qt::Unchecked);
} }
setSortingEnabled(true); setSortingEnabled(true);
} }
QString BookmarksTagList::getSelectedTagsAsString() QString BookmarksTagList::getSelectedTagsAsString()
{ {
QString strResult; QString strResult;
int iRows = rowCount(); int iRows = rowCount();
bool bFirst = true; bool bFirst = true;
for(int i=0; i<iRows; ++i) for(int i=0; i<iRows; ++i)
{ {
QTableWidgetItem* pItem = item(i,1); QTableWidgetItem* pItem = item(i,1);
if(pItem->checkState() == Qt::Checked) if(pItem->checkState() == Qt::Checked)
{ {
if(!bFirst) strResult += ", "; if(!bFirst) strResult += ", ";
strResult += pItem->text(); strResult += pItem->text();
bFirst = false; bFirst = false;
} }
} }
return strResult; return strResult;
} }
void BookmarksTagList::ShowContextMenu(const QPoint& pos) void BookmarksTagList::ShowContextMenu(const QPoint& pos)
{ {
QMenu* menu=new QMenu(this); QMenu* menu=new QMenu(this);
// Rename currently does not work. // Rename currently does not work.
// The problem is that after the tag name is changed in GUI // The problem is that after the tag name is changed in GUI
// you can not find the right TagInfo because you dont know // you can not find the right TagInfo because you dont know
// the old tag name. // the old tag name.
#if 0 #if 0
// MenuItem "Rename" // MenuItem "Rename"
{ {
QAction* actionRename = new QAction("Rename", this); QAction* actionRename = new QAction("Rename", this);
menu->addAction(actionRename); menu->addAction(actionRename);
connect(actionRename, SIGNAL(triggered()), this, SLOT(RenameSelectedTag())); connect(actionRename, SIGNAL(triggered()), this, SLOT(RenameSelectedTag()));
} }
#endif #endif
// MenuItem "Create new Tag" // MenuItem "Create new Tag"
{ {
QAction* actionNewTag = new QAction("Create new Tag", this); QAction* actionNewTag = new QAction("Create new Tag", this);
menu->addAction(actionNewTag); menu->addAction(actionNewTag);
connect(actionNewTag, SIGNAL(triggered()), this, SLOT(AddNewTag())); connect(actionNewTag, SIGNAL(triggered()), this, SLOT(AddNewTag()));
} }
// Menu "Delete Tag" // Menu "Delete Tag"
{ {
QAction* actionDeleteTag = new QAction("Delete Tag", this); QAction* actionDeleteTag = new QAction("Delete Tag", this);
menu->addAction(actionDeleteTag); menu->addAction(actionDeleteTag);
connect(actionDeleteTag, SIGNAL(triggered()), this, SLOT(DeleteSelectedTag())); connect(actionDeleteTag, SIGNAL(triggered()), this, SLOT(DeleteSelectedTag()));
} }
// Menu "Select All" // Menu "Select All"
{ {
QAction* action = new QAction("Select All", this); QAction* action = new QAction("Select All", this);
menu->addAction(action); menu->addAction(action);
connect(action, SIGNAL(triggered()), this, SLOT(SelectAll())); connect(action, SIGNAL(triggered()), this, SLOT(SelectAll()));
} }
// Menu "Deselect All" // Menu "Deselect All"
{ {
QAction* action = new QAction("Deselect All", this); QAction* action = new QAction("Deselect All", this);
menu->addAction(action); menu->addAction(action);
connect(action, SIGNAL(triggered()), this, SLOT(DeselectAll())); connect(action, SIGNAL(triggered()), this, SLOT(DeselectAll()));
} }
menu->popup(viewport()->mapToGlobal(pos)); menu->popup(viewport()->mapToGlobal(pos));
} }
#if 0 #if 0
bool BookmarksTagList::RenameSelectedTag() bool BookmarksTagList::RenameSelectedTag()
{ {
QModelIndexList selected = selectionModel()->selectedRows(); QModelIndexList selected = selectionModel()->selectedRows();
if(selected.empty()) if(selected.empty())
{ {
return true; return true;
} }
int iRow = selected.first().row(); int iRow = selected.first().row();
QTableWidgetItem* pItem = item(iRow,1);bUpdating QTableWidgetItem* pItem = item(iRow,1);bUpdating
editItem(pItem); editItem(pItem);
//Bookmarks::Get().save(); //Bookmarks::Get().save();
return true; return true;
} }
#endif #endif
void BookmarksTagList::AddNewTag() void BookmarksTagList::AddNewTag()
{ {
AddTag("*new*"); AddTag("*new*");
scrollToBottom(); scrollToBottom();
editItem(item(rowCount()-1, 1)); editItem(item(rowCount()-1, 1));
} }
void BookmarksTagList::AddTag(QString name, Qt::CheckState checkstate, QColor color) void BookmarksTagList::AddTag(QString name, Qt::CheckState checkstate, QColor color)
{ {
int i = rowCount(); int i = rowCount();
setRowCount(i+1); setRowCount(i+1);
// Column 1 // Column 1
QTableWidgetItem *item = new QTableWidgetItem(name); QTableWidgetItem *item = new QTableWidgetItem(name);
item->setCheckState(checkstate); item->setCheckState(checkstate);
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
setItem(i, 1, item); setItem(i, 1, item);
// Column 0 // Column 0
item = new QTableWidgetItem(); item = new QTableWidgetItem();
item->setFlags(Qt::ItemIsEnabled); item->setFlags(Qt::ItemIsEnabled);
item->setBackgroundColor(color); item->setBackground(color);
setItem(i, 0, item); setItem(i, 0, item);
} }
void BookmarksTagList::DeleteSelectedTag() void BookmarksTagList::DeleteSelectedTag()
{ {
QModelIndexList selected = selectionModel()->selectedRows(); QModelIndexList selected = selectionModel()->selectedRows();
if(selected.empty()) if(selected.empty())
{ {
return; return;
} }
int iRow = selected.first().row(); int iRow = selected.first().row();
QTableWidgetItem* pItem = item(iRow,1); QTableWidgetItem* pItem = item(iRow,1);
QString strTagName = pItem->text(); QString strTagName = pItem->text();
DeleteTag(strTagName); DeleteTag(strTagName);
return; return;
} }
void BookmarksTagList::DeleteTag(const QString& name) void BookmarksTagList::DeleteTag(const QString& name)
{ {
Bookmarks::Get().removeTag(name); Bookmarks::Get().removeTag(name);
updateTags(); updateTags();
} }
void BookmarksTagList::SelectAll() void BookmarksTagList::SelectAll()
{ {
int iRows = rowCount(); int iRows = rowCount();
for(int i=0; i<iRows; ++i) for(int i=0; i<iRows; ++i)
{ {
QTableWidgetItem* pItem = item(i,1); QTableWidgetItem* pItem = item(i,1);
QString name = pItem->text(); QString name = pItem->text();
pItem->setCheckState(Qt::Checked); pItem->setCheckState(Qt::Checked);
} }
} }
void BookmarksTagList::DeselectAll() void BookmarksTagList::DeselectAll()
{ {
int iRows = rowCount(); int iRows = rowCount();
for(int i=0; i<iRows; ++i) for(int i=0; i<iRows; ++i)
{ {
QTableWidgetItem* pItem = item(i,1); QTableWidgetItem* pItem = item(i,1);
QString name = pItem->text(); QString name = pItem->text();
pItem->setCheckState(Qt::Unchecked); pItem->setCheckState(Qt::Unchecked);
} }
} }
/* /*
* Frequency controller widget (originally from CuteSDR) * Frequency controller widget (originally from CuteSDR)
*/ */
#pragma once #pragma once
...@@ -8,15 +8,15 @@ ...@@ -8,15 +8,15 @@
#include <QtGui> #include <QtGui>
enum FctlUnit { enum FctlUnit {
FCTL_UNIT_NONE, // Freq displayed without unit: 14.236.000 FCTL_UNIT_NONE, // Freq displayed without unit: 14.236.000
FCTL_UNIT_HZ, FCTL_UNIT_HZ,
FCTL_UNIT_KHZ, FCTL_UNIT_KHZ,
FCTL_UNIT_MHZ, FCTL_UNIT_MHZ,
FCTL_UNIT_GHZ, FCTL_UNIT_GHZ,
FCTL_UNIT_SEC, FCTL_UNIT_SEC,
FCTL_UNIT_MSEC, FCTL_UNIT_MSEC,
FCTL_UNIT_USEC, FCTL_UNIT_USEC,
FCTL_UNIT_NSEC FCTL_UNIT_NSEC
}; };
#define FCTL_MAX_DIGITS 12 #define FCTL_MAX_DIGITS 12
...@@ -24,112 +24,113 @@ enum FctlUnit { ...@@ -24,112 +24,113 @@ enum FctlUnit {
class CFreqCtrl : public QFrame class CFreqCtrl : public QFrame
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit CFreqCtrl(QWidget *parent = 0); explicit CFreqCtrl(QWidget *parent = 0);
~CFreqCtrl(); ~CFreqCtrl();
QSize minimumSizeHint() const; QSize minimumSizeHint() const;
QSize sizeHint() const; QSize sizeHint() const;
// Use NumDigits=0 for auto // Use NumDigits=0 for auto
void setup(int NumDigits, qint64 Minf, qint64 Maxf, int MinStep, void setup(int NumDigits, qint64 Minf, qint64 Maxf, int MinStep,
FctlUnit unit); FctlUnit unit);
void setUnit(FctlUnit unit); void setUnit(FctlUnit unit);
void setDigitColor(QColor col); void setDigitColor(QColor col);
void setBgColor(QColor col); void setBgColor(QColor col);
void setUnitsColor(QColor col); void setUnitsColor(QColor col);
void setHighlightColor(QColor col); void setHighlightColor(QColor col);
qint64 getFrequency() const qint64 getFrequency() const
{ {
return m_freq; return m_freq;
} }
void setResetLowerDigits(bool reset) void setResetLowerDigits(bool reset)
{ {
m_ResetLowerDigits = reset; m_ResetLowerDigits = reset;
} }
signals: signals:
void newFrequency(qint64 freq); // emitted when frequency has changed void newFrequency(qint64 freq); // emitted when frequency has changed
public slots: public slots:
void setFrequency(qint64 freq); void setFrequency(qint64 freq);
protected: protected:
void paintEvent(QPaintEvent *); void paintEvent(QPaintEvent *);
void resizeEvent(QResizeEvent *); void resizeEvent(QResizeEvent *);
void mouseMoveEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *);
void mousePressEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *);
void wheelEvent(QWheelEvent *); void wheelEvent(QWheelEvent *);
void leaveEvent(QEvent *); void leaveEvent(QEvent *);
void keyPressEvent(QKeyEvent *); void keyPressEvent(QKeyEvent *);
private: private:
void updateCtrl(bool all); void updateCtrl(bool all);
void drawBkGround(QPainter &Painter); void drawBkGround(QPainter &Painter);
void drawDigits(QPainter &Painter); void drawDigits(QPainter &Painter);
void incDigit(); void incDigit();
void decDigit(); void decDigit();
void incFreq(); void incFreq();
void decFreq(); void decFreq();
void clearFreq(); void clearFreq();
void cursorHome(); void cursorHome();
void cursorEnd(); void cursorEnd();
void moveCursorLeft(); void moveCursorLeft();
void moveCursorRight(); void moveCursorRight();
bool inRect(QRect &rect, QPoint &point); bool inRect(QRect &rect, QPoint &point);
bool inRect(QRect &rect, QPointF &point);
bool m_UpdateAll;
bool m_ExternalKeyActive; bool m_UpdateAll;
bool m_LRMouseFreqSel; /* Use left/right mouse buttons. If FALSE click area determines up/down. */ bool m_ExternalKeyActive;
bool m_LRMouseFreqSel; /* Use left/right mouse buttons. If FALSE click area determines up/down. */
bool m_ResetLowerDigits; /* If TRUE digits below the active one will be reset to 0
* when the active digit is incremented or decremented. */ bool m_ResetLowerDigits; /* If TRUE digits below the active one will be reset to 0
* when the active digit is incremented or decremented. */
int m_FirstEditableDigit;
int m_LastLeadZeroPos; int m_FirstEditableDigit;
int m_LeadZeroPos; int m_LastLeadZeroPos;
int m_NumDigits; int m_LeadZeroPos;
int m_NumDigitsForUnit; // number of digits allocated for unit (kHz, MHz, ...) int m_NumDigits;
int m_DigStart; int m_NumDigitsForUnit; // number of digits allocated for unit (kHz, MHz, ...)
int m_ActiveEditDigit; int m_DigStart;
int m_LastEditDigit; int m_ActiveEditDigit;
int m_DecPos; int m_LastEditDigit;
int m_NumSeps; int m_DecPos;
int m_NumSeps;
qint64 m_MinStep;
qint64 m_freq; qint64 m_MinStep;
qint64 m_Oldfreq; qint64 m_freq;
qint64 m_MinFreq; qint64 m_Oldfreq;
qint64 m_MaxFreq; qint64 m_MinFreq;
qint64 m_MaxFreq;
QColor m_DigitColor;
QColor m_BkColor; QColor m_DigitColor;
QColor m_InactiveColor; QColor m_BkColor;
QColor m_UnitsColor; QColor m_InactiveColor;
QColor m_HighlightColor; QColor m_UnitsColor;
QColor m_HighlightColor;
QPixmap m_Pixmap;
QSize m_Size; QPixmap m_Pixmap;
FctlUnit m_Unit; QSize m_Size;
FctlUnit m_Unit;
QRect m_rectCtrl; // main control rectangle
QRect m_UnitsRect; // rectangle where Units text goes QRect m_rectCtrl; // main control rectangle
QRect m_SepRect[FCTL_MAX_DIGITS]; // separation rectangles for commas, decimal point, etc. QRect m_UnitsRect; // rectangle where Units text goes
QRect m_SepRect[FCTL_MAX_DIGITS]; // separation rectangles for commas, decimal point, etc.
QString m_UnitString;
QString m_UnitString;
QFont m_DigitFont;
QFont m_UnitsFont; QFont m_DigitFont;
QFont m_UnitsFont;
struct DigStuct {
qint64 weight; // decimal weight of this digit struct DigStuct {
qint64 incval; // value this digit increments or decrements qint64 weight; // decimal weight of this digit
QRect dQRect; // Digit bounding rectangle qint64 incval; // value this digit increments or decrements
int val; // value of this digit(0-9) QRect dQRect; // Digit bounding rectangle
bool modified; // set if this digit has been modified int val; // value of this digit(0-9)
bool editmode; // set if this digit is selected for editing bool modified; // set if this digit has been modified
} m_DigitInfo[FCTL_MAX_DIGITS]; bool editmode; // set if this digit is selected for editing
} m_DigitInfo[FCTL_MAX_DIGITS];
}; };
...@@ -404,13 +404,13 @@ void CPlotter::mouseMoveEvent(QMouseEvent* event) ...@@ -404,13 +404,13 @@ void CPlotter::mouseMoveEvent(QMouseEvent* event)
} }
else if (XAXIS == m_CursorCaptured) else if (XAXIS == m_CursorCaptured)
{ {
if (event->buttons() & (Qt::LeftButton | Qt::MidButton)) if (event->buttons() & (Qt::LeftButton | Qt::MiddleButton))
{ {
setCursor(QCursor(Qt::ClosedHandCursor)); setCursor(QCursor(Qt::ClosedHandCursor));
// pan viewable range or move center frequency // pan viewable range or move center frequency
int delta_px = m_Xzero - pt.x(); int delta_px = m_Xzero - pt.x();
qint64 delta_hz = delta_px * m_Span / m_OverlayPixmap.width(); qint64 delta_hz = delta_px * m_Span / m_OverlayPixmap.width();
if (event->buttons() & Qt::MidButton) if (event->buttons() & Qt::MiddleButton)
{ {
m_CenterFreq += delta_hz; m_CenterFreq += delta_hz;
m_DemodCenterFreq += delta_hz; m_DemodCenterFreq += delta_hz;
...@@ -709,7 +709,7 @@ void CPlotter::mousePressEvent(QMouseEvent * event) ...@@ -709,7 +709,7 @@ void CPlotter::mousePressEvent(QMouseEvent * event)
m_GrabPosition = 1; m_GrabPosition = 1;
drawOverlay(); drawOverlay();
} }
else if (event->buttons() == Qt::MidButton) else if (event->buttons() == Qt::MiddleButton)
{ {
// set center freq // set center freq
m_CenterFreq = roundFreq(freqFromX(pt.x()), m_ClickResolution); m_CenterFreq = roundFreq(freqFromX(pt.x()), m_ClickResolution);
...@@ -827,10 +827,10 @@ void CPlotter::zoomOnXAxis(double level) ...@@ -827,10 +827,10 @@ void CPlotter::zoomOnXAxis(double level)
// Called when a mouse wheel is turned // Called when a mouse wheel is turned
void CPlotter::wheelEvent(QWheelEvent * event) void CPlotter::wheelEvent(QWheelEvent * event)
{ {
QPoint pt = event->pos(); QPointF pt = event->position();
pt.setX(pt.x() / pixRatio()+.5); pt.setX(pt.x() / pixRatio()+.5);
pt.setY(pt.y() / pixRatio()+.5); pt.setY(pt.y() / pixRatio()+.5);
int numDegrees = event->delta() / 8; int numDegrees = (event->angleDelta().x() + event->angleDelta().y()) / 8;
int numSteps = numDegrees / 15; /** FIXME: Only used for direction **/ int numSteps = numDegrees / 15; /** FIXME: Only used for direction **/
/** FIXME: zooming could use some optimisation **/ /** FIXME: zooming could use some optimisation **/
...@@ -838,7 +838,7 @@ void CPlotter::wheelEvent(QWheelEvent * event) ...@@ -838,7 +838,7 @@ void CPlotter::wheelEvent(QWheelEvent * event)
{ {
// Vertical zoom. Wheel down: zoom out, wheel up: zoom in // Vertical zoom. Wheel down: zoom out, wheel up: zoom in
// During zoom we try to keep the point (dB or kHz) under the cursor fixed // During zoom we try to keep the point (dB or kHz) under the cursor fixed
double zoom_fac = event->delta() < 0 ? 1.1 : 0.9; double zoom_fac = numDegrees < 0 ? 1.1 : 0.9;
double ratio = (double)pt.y() / (double)m_OverlayPixmap.height(); double ratio = (double)pt.y() / (double)m_OverlayPixmap.height();
double db_range = m_PandMaxdB - m_PandMindB; double db_range = m_PandMaxdB - m_PandMindB;
double y_range = (double)m_OverlayPixmap.height(); double y_range = (double)m_OverlayPixmap.height();
...@@ -857,7 +857,7 @@ void CPlotter::wheelEvent(QWheelEvent * event) ...@@ -857,7 +857,7 @@ void CPlotter::wheelEvent(QWheelEvent * event)
} }
else if (m_CursorCaptured == XAXIS) else if (m_CursorCaptured == XAXIS)
{ {
zoomStepX(event->delta() < 0 ? 1.1 : 0.9, pt.x()); zoomStepX(numDegrees < 0 ? 1.1 : 0.9, pt.x());
} }
else if (event->modifiers() & Qt::ControlModifier) else if (event->modifiers() & Qt::ControlModifier)
{ {
...@@ -1351,7 +1351,7 @@ void CPlotter::drawOverlay() ...@@ -1351,7 +1351,7 @@ void CPlotter::drawOverlay()
QFontMetrics metrics(m_Font); QFontMetrics metrics(m_Font);
QPainter painter(&m_OverlayPixmap); QPainter painter(&m_OverlayPixmap);
painter.initFrom(this); painter.begin(this);
painter.setFont(m_Font); painter.setFont(m_Font);
// solid background // solid background
...@@ -1362,7 +1362,7 @@ void CPlotter::drawOverlay() ...@@ -1362,7 +1362,7 @@ void CPlotter::drawOverlay()
#define VER_MARGIN 5 #define VER_MARGIN 5
// X and Y axis areas // X and Y axis areas
m_YAxisWidth = metrics.width("XXXX") + 2 * HOR_MARGIN; m_YAxisWidth = metrics.horizontalAdvance("XXXX") + 2 * HOR_MARGIN;
m_XAxisYCenter = h - metrics.height()/2; m_XAxisYCenter = h - metrics.height()/2;
int xAxisHeight = metrics.height() + 2 * VER_MARGIN; int xAxisHeight = metrics.height() + 2 * VER_MARGIN;
int xAxisTop = h - xAxisHeight; int xAxisTop = h - xAxisHeight;
...@@ -1384,7 +1384,7 @@ void CPlotter::drawOverlay() ...@@ -1384,7 +1384,7 @@ void CPlotter::drawOverlay()
x = xFromFreq(bookmarks[i].frequency); x = xFromFreq(bookmarks[i].frequency);
#if defined(_WIN16) || defined(_WIN32) || defined(_WIN64) #if defined(_WIN16) || defined(_WIN32) || defined(_WIN64)
int nameWidth = fm.width(bookmarks[i].name); int nameWidth = fm.horizontalAdvance(bookmarks[i].name);
#else #else
int nameWidth = fm.boundingRect(bookmarks[i].name).width(); int nameWidth = fm.boundingRect(bookmarks[i].name).width();
#endif #endif
...@@ -1397,7 +1397,7 @@ void CPlotter::drawOverlay() ...@@ -1397,7 +1397,7 @@ void CPlotter::drawOverlay()
level = 0; level = 0;
tagEnd[level] = x + nameWidth + slant - 1; tagEnd[level] = x + nameWidth + slant - 1;
m_BookmarkTags.append(qMakePair<QRect, qint64>(QRect(x, level * levelHeight, nameWidth + slant, fontHeight), bookmarks[i].frequency)); m_BookmarkTags.append(qMakePair(QRect(x, level * levelHeight, nameWidth + slant, fontHeight), bookmarks[i].frequency));
QColor color = QColor(bookmarks[i].GetColor()); QColor color = QColor(bookmarks[i].GetColor());
color.setAlpha(0x60); color.setAlpha(0x60);
...@@ -1437,7 +1437,7 @@ void CPlotter::drawOverlay() ...@@ -1437,7 +1437,7 @@ void CPlotter::drawOverlay()
QString label; QString label;
label.setNum(double((StartFreq + m_Span) / m_FreqUnits), 'f', m_FreqDigits); label.setNum(double((StartFreq + m_Span) / m_FreqUnits), 'f', m_FreqDigits);
calcDivSize(StartFreq, StartFreq + m_Span, calcDivSize(StartFreq, StartFreq + m_Span,
qMin(w/(metrics.width(label) + metrics.width("O")), HORZ_DIVS_MAX), qMin(w/(metrics.horizontalAdvance(label) + metrics.horizontalAdvance("O")), HORZ_DIVS_MAX),
m_StartFreqAdj, m_FreqPerDiv, m_HorDivs); m_StartFreqAdj, m_FreqPerDiv, m_HorDivs);
pixperdiv = (double)w * (double) m_FreqPerDiv / (double) m_Span; pixperdiv = (double)w * (double) m_FreqPerDiv / (double) m_Span;
adjoffset = pixperdiv * double (m_StartFreqAdj - StartFreq) / (double) m_FreqPerDiv; adjoffset = pixperdiv * double (m_StartFreqAdj - StartFreq) / (double) m_FreqPerDiv;
...@@ -1455,7 +1455,7 @@ void CPlotter::drawOverlay() ...@@ -1455,7 +1455,7 @@ void CPlotter::drawOverlay()
painter.setPen(QColor(PLOTTER_TEXT_COLOR)); painter.setPen(QColor(PLOTTER_TEXT_COLOR));
for (int i = 0; i <= m_HorDivs; i++) for (int i = 0; i <= m_HorDivs; i++)
{ {
int tw = metrics.width(m_HDivText[i]); int tw = metrics.horizontalAdvance(m_HDivText[i]);
x = (int)((double)i*pixperdiv + adjoffset); x = (int)((double)i*pixperdiv + adjoffset);
if (x > m_YAxisWidth) if (x > m_YAxisWidth)
{ {
...@@ -1494,7 +1494,7 @@ void CPlotter::drawOverlay() ...@@ -1494,7 +1494,7 @@ void CPlotter::drawOverlay()
// draw amplitude values (y axis) // draw amplitude values (y axis)
int dB = m_PandMaxdB; int dB = m_PandMaxdB;
m_YAxisWidth = metrics.width("-120 "); m_YAxisWidth = metrics.horizontalAdvance("-120 ");
painter.setPen(QColor(PLOTTER_TEXT_COLOR)); painter.setPen(QColor(PLOTTER_TEXT_COLOR));
for (int i = 0; i < m_VerDivs; i++) for (int i = 0; i < m_VerDivs; i++)
{ {
......
#include "uhd_device_win32.h" #include "uhd_device_win32.h"
#include <QThread> #include <QThread>
#include <QDebug> #include <QDebug>
#include <QCoreApplication> #include <QCoreApplication>
...@@ -9,26 +9,26 @@ using std::shared_ptr; ...@@ -9,26 +9,26 @@ using std::shared_ptr;
#define UHD_DO(X) \ #define UHD_DO(X) \
{\ {\
uhd_error e = (X);\ uhd_error e = (X);\
char buf_errs[512];\ char buf_errs[512];\
if (e) { snprintf(buf_errs,sizeof(buf_errs),"Error in %s line %d, NO %d.",__FILE__,__LINE__,e);\ if (e) { snprintf(buf_errs,sizeof(buf_errs),"Error in %s line %d, NO %d.",__FILE__,__LINE__,e);\
std::string ev = __FILE__;\ std::string ev = __FILE__;\
ev += ":";\ ev += ":";\
ev += buf_errs;\ ev += buf_errs;\
return_code = 1;\ return_code = 1;\
fputs(buf_errs,stderr);\ fputs(buf_errs,stderr);\
}\ }\
}; };
uhd_io_thread::uhd_io_thread (std::function<void (void)> runner,QObject * p) uhd_io_thread::uhd_io_thread (std::function<void (void)> runner,QObject * p)
:QThread(p) :QThread(p)
,m_runner(runner) ,m_runner(runner)
{ {
} }
uhd_io_thread::uhd_io_thread (QObject * p) uhd_io_thread::uhd_io_thread (QObject * p)
:QThread(p) :QThread(p)
{ {
...@@ -36,126 +36,126 @@ uhd_io_thread::uhd_io_thread (QObject * p) ...@@ -36,126 +36,126 @@ uhd_io_thread::uhd_io_thread (QObject * p)
void uhd_io_thread::run() void uhd_io_thread::run()
{ {
if (m_runner) if (m_runner)
m_runner(); m_runner();
} }
uhd_device::uhd_device() uhd_device::uhd_device()
:stop_signal_called(false) :stop_signal_called(false)
,streaming(false) ,streaming(false)
,rx_count(0) ,rx_count(0)
{ {
m_buffer_tmFrag = new double [bufsz]; m_buffer_tmFrag = new double [bufsz];
m_buffer_tmSec = new long long [bufsz]; m_buffer_tmSec = new long long [bufsz];
m_buffer_iq_all = new short [bufsz * m_spb_size * 2]; m_buffer_iq_all = new short [bufsz * m_spb_size * 2];
m_buffer_iq = new short * [bufsz]; m_buffer_iq = new short * [bufsz];
m_buf_iqsize = new size_t [bufsz]; m_buf_iqsize = new size_t [bufsz];
for (int i=0;i<bufsz;++i) for (int i=0;i<bufsz;++i)
{ {
m_buffer_tmFrag[i] = 0; m_buffer_tmFrag[i] = 0;
m_buffer_tmSec[i] = 0; m_buffer_tmSec[i] = 0;
m_buffer_iq[i] = &m_buffer_iq_all[i * m_spb_size * 2]; m_buffer_iq[i] = &m_buffer_iq_all[i * m_spb_size * 2];
m_buf_iqsize[i] = 0; m_buf_iqsize[i] = 0;
} }
} }
uhd_device::uhd_device(const std::string &args) uhd_device::uhd_device(const std::string &args)
:stop_signal_called(false) :stop_signal_called(false)
,streaming(false) ,streaming(false)
,m_dev_args (args) ,m_dev_args (args)
,rx_count(0) ,rx_count(0)
{ {
m_buffer_tmFrag = new double [bufsz]; m_buffer_tmFrag = new double [bufsz];
m_buffer_tmSec = new long long [bufsz]; m_buffer_tmSec = new long long [bufsz];
m_buffer_iq_all = new short [bufsz * m_spb_size * 2]; m_buffer_iq_all = new short [bufsz * m_spb_size * 2];
m_buffer_iq = new short * [bufsz]; m_buffer_iq = new short * [bufsz];
m_buf_iqsize = new size_t [bufsz]; m_buf_iqsize = new size_t [bufsz];
for (int i=0;i<bufsz;++i) for (int i=0;i<bufsz;++i)
{ {
m_buffer_tmFrag[i] = 0; m_buffer_tmFrag[i] = 0;
m_buffer_tmSec[i] = 0; m_buffer_tmSec[i] = 0;
m_buffer_iq[i] = &m_buffer_iq_all[i * m_spb_size * 2]; m_buffer_iq[i] = &m_buffer_iq_all[i * m_spb_size * 2];
m_buf_iqsize[i] = 0; m_buf_iqsize[i] = 0;
} }
} }
uhd_device::~uhd_device() uhd_device::~uhd_device()
{ {
stop_signal_called = true; stop_signal_called = true;
while (streaming) while (streaming)
{ {
QThread::msleep(100); QThread::msleep(100);
} }
delete[] m_buffer_tmFrag; delete[] m_buffer_tmFrag;
delete[] m_buffer_tmSec; delete[] m_buffer_tmSec;
delete[] m_buffer_iq_all ; delete[] m_buffer_iq_all ;
delete[] m_buffer_iq; delete[] m_buffer_iq;
delete[] m_buf_iqsize; delete[] m_buf_iqsize;
} }
void uhd_device::setDevArgs(const std::string &args) void uhd_device::setDevArgs(const std::string &args)
{ {
this->m_dev_args = args; this->m_dev_args = args;
} }
std::string uhd_device::devArgs() const std::string uhd_device::devArgs() const
{ {
return m_dev_args; return m_dev_args;
} }
bool uhd_device::open_device() bool uhd_device::open_device()
{ {
string ref = "internal"; string ref = "internal";
std::atomic<bool> finished(false); std::atomic<bool> finished(false);
std::thread thr([&]()->void{ std::thread thr([&]()->void{
try{ try{
UHD_DO(uhd_usrp_make(&usrp, m_dev_args.c_str())); UHD_DO(uhd_usrp_make(&usrp, m_dev_args.c_str()));
} }
catch(std::string er) catch(std::string er)
{ {
fputs(er.c_str(),stderr); fputs(er.c_str(),stderr);
} }
finished = true; finished = true;
}); });
while (!finished) while (!finished)
{ {
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
QThread::msleep(20); QThread::msleep(20);
} }
thr.join(); thr.join();
if (!usrp) if (!usrp)
return false; return false;
try{ try{
uhd_usrp_set_clock_source(usrp,ref.c_str(),0); uhd_usrp_set_clock_source(usrp,ref.c_str(),0);
} }
catch(std::string er) catch(std::string er)
{ {
fputs(er.c_str(),stderr); fputs(er.c_str(),stderr);
} }
//if (rx_op.subdev.size()) //if (rx_op.subdev.size())
// usrp->set_rx_subdev_spec(rx_op.subdev,multi_usrp::ALL_MBOARDS); // usrp->set_rx_subdev_spec(rx_op.subdev,multi_usrp::ALL_MBOARDS);
stop_signal_called = false; stop_signal_called = false;
return usrp?true:false; return usrp?true:false;
} }
bool uhd_device::close_device() bool uhd_device::close_device()
{ {
stop_signal_called = true; stop_signal_called = true;
while (streaming) while (streaming)
{ {
QThread::msleep(1000); QThread::msleep(1000);
} }
if (usrp) if (usrp)
uhd_usrp_free(&usrp); uhd_usrp_free(&usrp);
usrp = 0; usrp = 0;
return true; return true;
} }
/*! /*!
...@@ -163,173 +163,173 @@ bool uhd_device::close_device() ...@@ -163,173 +163,173 @@ bool uhd_device::close_device()
*/ */
void uhd_device::run_IO() void uhd_device::run_IO()
{ {
//设置接收通道,母板号为0(multi-usrp支持级联) //设置接收通道,母板号为0(multi-usrp支持级联)
//UHD_DO(uhd_usrp_set_rx_subdev_spec(usrp,0,0)); //UHD_DO(uhd_usrp_set_rx_subdev_spec(usrp,0,0));
//创建流对象实例 //创建流对象实例
char rx_cpu_format[] = "sc16"; char rx_cpu_format[] = "sc16";
char rx_otw_format[] = "sc16"; char rx_otw_format[] = "sc16";
char rx_args[] = ""; char rx_args[] = "";
const size_t rx_channel_count = 1; const size_t rx_channel_count = 1;
//接收信号。MIMO时,可以指定0,1 //接收信号。MIMO时,可以指定0,1
size_t rx_channel[] = {(size_t)m_channel}; size_t rx_channel[] = {(size_t)m_channel};
uhd_stream_args_t rx_stream_args = { uhd_stream_args_t rx_stream_args = {
/*.cpu_format = */rx_cpu_format, /*.cpu_format = */rx_cpu_format,
/*.otw_format = */rx_otw_format, /*.otw_format = */rx_otw_format,
/*.args = */rx_args, /*.args = */rx_args,
/*.channel_list = */rx_channel, /*.channel_list = */rx_channel,
/*.n_channels = */rx_channel_count /*.n_channels = */rx_channel_count
}; };
uhd_rx_streamer_handle rx_streamer = 0; uhd_rx_streamer_handle rx_streamer = 0;
uhd_rx_metadata_handle rx_meta = 0; uhd_rx_metadata_handle rx_meta = 0;
rx_count = 0; rx_count = 0;
//接收线程 //接收线程
auto thcall_rx = [&]()->void{ auto thcall_rx = [&]()->void{
// Create RX streamer // Create RX streamer
UHD_DO(uhd_rx_streamer_make(&rx_streamer)); UHD_DO(uhd_rx_streamer_make(&rx_streamer));
// Create RX metadata // Create RX metadata
UHD_DO(uhd_rx_metadata_make(&rx_meta)); UHD_DO(uhd_rx_metadata_make(&rx_meta));
uhd_stream_cmd_t rx_stream_cmd = { uhd_stream_cmd_t rx_stream_cmd = {
/*.stream_mode = */UHD_STREAM_MODE_START_CONTINUOUS, /*.stream_mode = */UHD_STREAM_MODE_START_CONTINUOUS,
/*.num_samps = */0, /*.num_samps = */0,
/*.stream_now = */true, /*.stream_now = */true,
/*.time_spec_full_secs = */0, /*.time_spec_full_secs = */0,
/*.time_spec_frac_secs = */0 /*.time_spec_frac_secs = */0
}; };
streaming = true; streaming = true;
rx_stream_args.channel_list = rx_channel; rx_stream_args.channel_list = rx_channel;
UHD_DO(uhd_usrp_get_rx_stream(usrp, &rx_stream_args, rx_streamer)); UHD_DO(uhd_usrp_get_rx_stream(usrp, &rx_stream_args, rx_streamer));
// Set up buffer // Set up buffer
UHD_DO(uhd_rx_streamer_max_num_samps(rx_streamer, &m_spb_size)); UHD_DO(uhd_rx_streamer_max_num_samps(rx_streamer, &m_spb_size));
fprintf(stderr, "Buffer size in samples: %zu\n", m_spb_size); fprintf(stderr, "Buffer size in samples: %zu\n", m_spb_size);
try { try {
UHD_DO(uhd_rx_streamer_issue_stream_cmd(rx_streamer, &rx_stream_cmd)); UHD_DO(uhd_rx_streamer_issue_stream_cmd(rx_streamer, &rx_stream_cmd));
while (!stop_signal_called) while (!stop_signal_called)
{ {
const int off = rx_count % bufsz; const int off = rx_count % bufsz;
UHD_DO(uhd_rx_streamer_recv(rx_streamer,(void **) &(m_buffer_iq[off]), m_spb_size, &rx_meta, 10, true, &m_buf_iqsize[off])); UHD_DO(uhd_rx_streamer_recv(rx_streamer,(void **) &(m_buffer_iq[off]), m_spb_size, &rx_meta, 10, true, &m_buf_iqsize[off]));
++rx_count; ++rx_count;
//md_rx可以读取时戳 //md_rx可以读取时戳
UHD_DO(uhd_rx_metadata_time_spec(rx_meta,&m_buffer_tmSec[off],&m_buffer_tmFrag[off])); UHD_DO(uhd_rx_metadata_time_spec(rx_meta,&m_buffer_tmSec[off],&m_buffer_tmFrag[off]));
uhd_rx_metadata_error_code_t error_code; uhd_rx_metadata_error_code_t error_code;
UHD_DO(uhd_rx_metadata_error_code(rx_meta, &error_code)); UHD_DO(uhd_rx_metadata_error_code(rx_meta, &error_code));
if(error_code != UHD_RX_METADATA_ERROR_CODE_NONE){ if(error_code != UHD_RX_METADATA_ERROR_CODE_NONE){
fprintf(stderr, "Warning: Error code 0x%x was returned during streaming.\n", error_code); fprintf(stderr, "Warning: Error code 0x%x was returned during streaming.\n", error_code);
uhd_usrp_last_error(usrp, error_string, 512); uhd_usrp_last_error(usrp, error_string, 512);
fputs(error_string,stderr); fputs(error_string,stderr);
UHD_DO(uhd_rx_streamer_issue_stream_cmd(rx_streamer, &rx_stream_cmd)); UHD_DO(uhd_rx_streamer_issue_stream_cmd(rx_streamer, &rx_stream_cmd));
} }
} }
} catch (...) { } catch (...) {
stop_signal_called = true; stop_signal_called = true;
} }
rx_stream_cmd.stream_now = false; rx_stream_cmd.stream_now = false;
UHD_DO(uhd_rx_streamer_issue_stream_cmd(rx_streamer, &rx_stream_cmd)); UHD_DO(uhd_rx_streamer_issue_stream_cmd(rx_streamer, &rx_stream_cmd));
streaming = false; streaming = false;
}; };
//启动线程 //启动线程
uhd_io_thread * rx_thread = new uhd_io_thread(thcall_rx,0); uhd_io_thread * rx_thread = new uhd_io_thread(thcall_rx,0);
rx_thread->start(QThread::TimeCriticalPriority); rx_thread->start(QThread::TimeCriticalPriority);
//主线程不断打印状态 //主线程不断打印状态
while (!stop_signal_called) while (!stop_signal_called)
{ {
//cerr<<"RX" << rx_count<<"\r"; //cerr<<"RX" << rx_count<<"\r";
std::this_thread::sleep_for(std::chrono::milliseconds(400)); std::this_thread::sleep_for(std::chrono::milliseconds(400));
} }
if (rx_streamer) uhd_rx_streamer_free(&rx_streamer); if (rx_streamer) uhd_rx_streamer_free(&rx_streamer);
if (rx_meta) uhd_rx_metadata_free(&rx_meta); if (rx_meta) uhd_rx_metadata_free(&rx_meta);
//退出 //退出
rx_thread->wait(); rx_thread->wait();
rx_thread->deleteLater(); rx_thread->deleteLater();
} }
quint64 uhd_device::set_center_freq(const quint64 freq_in_hz) quint64 uhd_device::set_center_freq(const quint64 freq_in_hz)
{ {
if (!usrp) if (!usrp)
return freq_in_hz; return freq_in_hz;
double srate = 0; double srate = 0;
UHD_DO(uhd_usrp_get_rx_rate(usrp, m_channel, &srate)); UHD_DO(uhd_usrp_get_rx_rate(usrp, m_channel, &srate));
fprintf(stderr, "Setting RX frequency: %f MHz...\n", freq_in_hz/1e6); fprintf(stderr, "Setting RX frequency: %f MHz...\n", freq_in_hz/1e6);
uhd_tune_result_t rx_tune_result; uhd_tune_result_t rx_tune_result;
uhd_tune_request_t rx_tune_request = uhd_tune_request_t rx_tune_request =
{ {
/*.target_freq =*/ (double)freq_in_hz, /*.target_freq =*/ (double)freq_in_hz,
/*.rf_freq_policy =*/ UHD_TUNE_REQUEST_POLICY_AUTO, /*.rf_freq_policy =*/ UHD_TUNE_REQUEST_POLICY_AUTO,
/*.rf_freq =*/ 0, /*.rf_freq =*/ 0,
/*.dsp_freq_policy = */UHD_TUNE_REQUEST_POLICY_MANUAL, /*.dsp_freq_policy = */UHD_TUNE_REQUEST_POLICY_AUTO,
/*.dsp_freq =*/ srate/2, /*.dsp_freq =*/ 0,
/*.args =*/ 0 /*.args =*/ 0
}; };
UHD_DO(uhd_usrp_set_rx_freq(usrp, &rx_tune_request, m_channel, &rx_tune_result)); UHD_DO(uhd_usrp_set_rx_freq(usrp, &rx_tune_request, m_channel, &rx_tune_result));
double freq = 0; double freq = 0;
UHD_DO(uhd_usrp_get_rx_freq(usrp, m_channel, &freq)); UHD_DO(uhd_usrp_get_rx_freq(usrp, m_channel, &freq));
fprintf(stderr, "Actual RX frequency: %f MHz...\n", freq / 1e6); fprintf(stderr, "Actual RX frequency: %f MHz...\n", freq / 1e6);
return (quint64)(freq +.5); return (quint64)(freq +.5);
} }
double uhd_device::set_sample_rate(const double sprate) double uhd_device::set_sample_rate(const double sprate)
{ {
if (usrp) if (usrp)
{ {
double srate = sprate; double srate = sprate;
double bw = sprate; double bw = sprate;
if (bw >56e6) if (bw >56e6)
bw = 56e6; bw = 56e6;
if (bw <200000) if (bw <200000)
bw = 200000; bw = 200000;
fprintf(stderr, "Setting RX Rate: %f...\n", sprate); fprintf(stderr, "Setting RX Rate: %f...\n", sprate);
UHD_DO(uhd_usrp_set_rx_rate(usrp, sprate, m_channel)); UHD_DO(uhd_usrp_set_rx_rate(usrp, sprate, m_channel));
// See what rate actually is // See what rate actually is
UHD_DO(uhd_usrp_get_rx_rate(usrp, m_channel, &srate)); UHD_DO(uhd_usrp_get_rx_rate(usrp, m_channel, &srate));
fprintf(stderr, "Actual RX Rate: %f...\n", srate); fprintf(stderr, "Actual RX Rate: %f...\n", srate);
fprintf(stderr, "Setting RX Bandwidth: %f MHz...\n", bw/1e6); fprintf(stderr, "Setting RX Bandwidth: %f MHz...\n", bw/1e6);
UHD_DO(uhd_usrp_set_rx_bandwidth(usrp, bw, m_channel)); UHD_DO(uhd_usrp_set_rx_bandwidth(usrp, bw, m_channel));
//Band //Band
UHD_DO(uhd_usrp_get_rx_bandwidth(usrp, m_channel, &bw)); UHD_DO(uhd_usrp_get_rx_bandwidth(usrp, m_channel, &bw));
fprintf(stderr, "Actual RX Bandwidth: %f MHz...\n", bw / 1e6); fprintf(stderr, "Actual RX Bandwidth: %f MHz...\n", bw / 1e6);
return srate; return srate;
} }
return sprate; return sprate;
} }
void uhd_device::set_rx_atn(const std::string & atn) void uhd_device::set_rx_atn(const std::string & atn)
{ {
if (usrp) if (usrp)
uhd_usrp_set_rx_antenna(usrp,atn.c_str(),m_channel); uhd_usrp_set_rx_antenna(usrp,atn.c_str(),m_channel);
} }
double uhd_device::set_rx_gain(double gain) double uhd_device::set_rx_gain(double gain)
{ {
if (!usrp) if (!usrp)
return gain; return gain;
// Set gain // Set gain
fprintf(stderr, "Setting RX Gain: %f dB...\n",(float) gain); fprintf(stderr, "Setting RX Gain: %f dB...\n",(float) gain);
UHD_DO(uhd_usrp_set_rx_gain(usrp, gain,m_channel,"")); UHD_DO(uhd_usrp_set_rx_gain(usrp, gain,m_channel,""));
// See what gain actually is // See what gain actually is
UHD_DO(uhd_usrp_get_rx_gain(usrp, m_channel,"", &gain)); UHD_DO(uhd_usrp_get_rx_gain(usrp, m_channel,"", &gain));
fprintf(stderr, "Actual RX Gain: %lf...\n", gain); fprintf(stderr, "Actual RX Gain: %lf...\n", gain);
return gain; return gain;
} }
double uhd_device::set_rx_bandwidth(double bw) double uhd_device::set_rx_bandwidth(double bw)
{ {
if (usrp) if (usrp)
{ {
fprintf(stderr, "Setting RX Bandwidth: %f MHz...\n", bw/1e6); fprintf(stderr, "Setting RX Bandwidth: %f MHz...\n", bw/1e6);
UHD_DO(uhd_usrp_set_rx_bandwidth(usrp, bw, m_channel)); UHD_DO(uhd_usrp_set_rx_bandwidth(usrp, bw, m_channel));
//Band //Band
UHD_DO(uhd_usrp_get_rx_bandwidth(usrp, m_channel, &bw)); UHD_DO(uhd_usrp_get_rx_bandwidth(usrp, m_channel, &bw));
fprintf(stderr, "Actual RX Bandwidth: %f MHz...\n", bw / 1e6); fprintf(stderr, "Actual RX Bandwidth: %f MHz...\n", bw / 1e6);
} }
return bw; return bw;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册