提交 55fc0d96 编写于 作者: D dev

Merge branch 'master' of git@codechina.csdn.net:coloreaglestdio/qtcpp_demo.git

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