Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
杨家三木
qtcpp_demo
提交
55fc0d96
qtcpp_demo
项目概览
杨家三木
/
qtcpp_demo
与 Fork 源项目一致
Fork自
colorEagleStdio / qtcpp_demo
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
qtcpp_demo
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
55fc0d96
编写于
2月 06, 2021
作者:
D
dev
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of git@codechina.csdn.net:coloreaglestdio/qtcpp_demo.git
上级
22052dd1
d8c70031
变更
7
展开全部
隐藏空白更改
内联
并排
Showing
7 changed file
with
1633 addition
and
1624 deletion
+1633
-1624
uhd_cpp/uhd_spectrum/qtgui/bookmarks.cpp
uhd_cpp/uhd_spectrum/qtgui/bookmarks.cpp
+239
-239
uhd_cpp/uhd_spectrum/qtgui/bookmarkstablemodel.cpp
uhd_cpp/uhd_spectrum/qtgui/bookmarkstablemodel.cpp
+151
-151
uhd_cpp/uhd_spectrum/qtgui/bookmarkstaglist.cpp
uhd_cpp/uhd_spectrum/qtgui/bookmarkstaglist.cpp
+218
-218
uhd_cpp/uhd_spectrum/qtgui/freqctrl.cpp
uhd_cpp/uhd_spectrum/qtgui/freqctrl.cpp
+653
-645
uhd_cpp/uhd_spectrum/qtgui/freqctrl.h
uhd_cpp/uhd_spectrum/qtgui/freqctrl.h
+109
-108
uhd_cpp/uhd_spectrum/qtgui/plotter.cpp
uhd_cpp/uhd_spectrum/qtgui/plotter.cpp
+14
-14
uhd_cpp/uhd_spectrum/uhd_device_win32.cpp
uhd_cpp/uhd_spectrum/uhd_device_win32.cpp
+249
-249
未找到文件。
uhd_cpp/uhd_spectrum/qtgui/bookmarks.cpp
浏览文件 @
55fc0d96
/* -*- 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
(
"
\n
Bookmarks: 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
(
"
\n
Bookmarks: 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
(
"
\n
Bookmarks: 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
(
"
\n
Bookmarks: 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
;
}
uhd_cpp/uhd_spectrum/qtgui/bookmarkstablemodel.cpp
浏览文件 @
55fc0d96
/* -*- 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
::
BackgroundColor
Role
)
{
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
::
Background
Role
)
{
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
)
...
...
uhd_cpp/uhd_spectrum/qtgui/bookmarkstaglist.cpp
浏览文件 @
55fc0d96
/* -*- 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
);
}
}
uhd_cpp/uhd_spectrum/qtgui/freqctrl.cpp
浏览文件 @
55fc0d96
此差异已折叠。
点击以展开。
uhd_cpp/uhd_spectrum/qtgui/freqctrl.h
浏览文件 @
55fc0d96
/*
/*
* 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
];
};
uhd_cpp/uhd_spectrum/qtgui/plotter.cpp
浏览文件 @
55fc0d96
...
...
@@ -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
::
Mid
dle
Button
))
{
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
::
Mid
dle
Button
)
{
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
::
Mid
dle
Button
)
{
// 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
();
QPoint
F
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
++
)
{
...
...
uhd_cpp/uhd_spectrum/uhd_device_win32.cpp
浏览文件 @
55fc0d96
#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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录