Porównaj commity
180 Commity
Autor | SHA1 | Data |
---|---|---|
Roeland Jansen | 85178de1d5 | |
Roeland Jansen | c7e8e90928 | |
Phil Taylor | 9db9be5dec | |
Phil Taylor | 637e94dfd8 | |
Elliott Liggett | b68874d328 | |
AsciiWolf | e5c6e2030a | |
AsciiWolf | 9be0acdf2e | |
Roeland Jansen | 1805861274 | |
Phil Taylor | b4c079f7f4 | |
Phil Taylor | 80d6614ca7 | |
Phil Taylor | 7df55bc41f | |
Roeland Jansen | 54b00b9022 | |
Roeland Jansen | 0c072f4665 | |
M0VSE | 6fc63df321 | |
M0VSE | d5e4a67ac1 | |
Roeland Jansen | c7e53f6a4d | |
Roeland Jansen | 375acead89 | |
Phil Taylor | e274271820 | |
Phil Taylor | 34655f6348 | |
Phil Taylor | 8ad74ac7f6 | |
Phil Taylor | 5d897c127a | |
Phil Taylor | 3c90a9363b | |
Phil Taylor | c392874b3b | |
Phil Taylor | 7b101d5ad4 | |
Phil Taylor | 6a2e2024ef | |
Phil Taylor | d941c831f3 | |
Phil Taylor | f35ac25ad3 | |
Phil Taylor | 58f38c1735 | |
Phil Taylor | 59bc2077e4 | |
Phil Taylor | 8b786c1821 | |
Phil Taylor | 5ded2a0e79 | |
M0VSE | c9300f4d86 | |
Roeland Jansen | 1549819ad6 | |
M0VSE | 4874d70215 | |
Phil Taylor | d5f0e0f63c | |
Phil Taylor | 1da3696ba2 | |
Phil Taylor | 289170e22d | |
Phil Taylor | ae0271c7f9 | |
Phil Taylor | a0f3f7de07 | |
Phil Taylor | 0304ac67f6 | |
Phil Taylor | 468cd2de0d | |
Phil Taylor | 592c583d19 | |
Phil Taylor | cadf835d95 | |
Phil Taylor | 75288b5e78 | |
Phil Taylor | 6fd0d4e763 | |
Phil Taylor | 03c45663dc | |
Phil Taylor | ac58289188 | |
Phil Taylor | d7ba3d9d9a | |
Phil Taylor | d1688a99c5 | |
Phil Taylor | a74f68d9d4 | |
Phil Taylor | f663550da7 | |
M0VSE | 9d63c5cb71 | |
Phil Taylor | eb65ae0b1c | |
Phil Taylor | 898d5960d8 | |
Phil Taylor | a461babf73 | |
Phil Taylor | 792fac11d6 | |
Phil Taylor | f3a25fade4 | |
Roeland Jansen | 3fa14ebc37 | |
Roeland Jansen | 6049e1dee6 | |
Roeland Jansen | e8ca39ca18 | |
Phil Taylor | 48a9710c11 | |
Phil Taylor | 5328838c73 | |
Phil Taylor | 87a261be12 | |
Phil Taylor | b738a38cbe | |
Phil Taylor | b2af4c898e | |
Phil Taylor | cf4e872e4f | |
Phil Taylor | 37c30404d8 | |
Phil Taylor | 5b9a5baaa1 | |
Roeland Jansen | fc0bd2232d | |
Phil Taylor | 2186a74490 | |
Phil Taylor | b9288175bd | |
Phil Taylor | 7901ceba79 | |
Phil Taylor | e49eb2878e | |
Phil Taylor | c8b97e8952 | |
Phil Taylor | a6b1bce69e | |
Phil Taylor | e6644cdc11 | |
Phil Taylor | fe0fc0a5bb | |
Phil Taylor | 5fb9588c4a | |
Phil Taylor | 62f923d8ad | |
Phil Taylor | 9f97df0ea5 | |
Phil Taylor | ed1e8c3a8e | |
Phil Taylor | acec37ea17 | |
Phil Taylor | 428ea9156c | |
Phil Taylor | 18254cad10 | |
Phil Taylor | 67685dc100 | |
Phil Taylor | 71fd70f78b | |
Phil Taylor | f9ca8e7e84 | |
Phil Taylor | acaed4601e | |
Phil Taylor | 1177fa3419 | |
Phil Taylor | 97ed3f6f42 | |
Phil Taylor | e594efdbbc | |
Phil Taylor | 3ce35500b9 | |
Phil Taylor | 9eb89a9cb1 | |
Phil Taylor | fd6d132fd3 | |
Phil Taylor | 6f1d4e24b7 | |
Phil Taylor | 8b7377f096 | |
Roeland Jansen | ce9e3e9f2c | |
Phil Taylor | dd4770a85f | |
Phil Taylor | 32e662237b | |
Phil Taylor | 3582c95c58 | |
Phil Taylor | da71bb3bc3 | |
Phil Taylor | 0397b4b68a | |
Phil Taylor | feac83b997 | |
Phil Taylor | 9afc661c4c | |
Phil Taylor | 6de14df1da | |
Phil Taylor | 7e89e9f457 | |
Phil Taylor | 3cb54f9cd7 | |
Phil Taylor | 80838e4f82 | |
Phil Taylor | 54c75d5def | |
Phil Taylor | 8b59efbf33 | |
Phil Taylor | 9db0698927 | |
Phil Taylor | 251239e445 | |
Phil Taylor | a3a82cd442 | |
Phil Taylor | 3461a0e5e5 | |
Phil Taylor | 3429786e10 | |
Phil Taylor | c2e9100a40 | |
Phil Taylor | c8a29bb400 | |
Phil Taylor | fa47bfb4bc | |
Phil Taylor | 82425b445e | |
Phil Taylor | 7aa7546660 | |
Phil Taylor | 4e61a455b5 | |
Phil Taylor | cad3bb9418 | |
Phil Taylor | 1f1800f046 | |
Phil Taylor | 5ed380c03d | |
Phil Taylor | a8951813f5 | |
Roeland Jansen | 6e5e22a672 | |
Elliott Liggett | bbbfe38e0b | |
Roeland Jansen | 6a76efa368 | |
Phil Taylor | 17a6547264 | |
Phil Taylor | 1515e135e5 | |
Phil Taylor | 0ff2551026 | |
Phil Taylor | cb339edc1f | |
Phil Taylor | f4a86ac02e | |
Phil Taylor | b783f8057a | |
Phil Taylor | 1064038138 | |
Phil Taylor | dda3c8ee9d | |
Phil Taylor | 63b8a356e8 | |
Phil Taylor | 4fc37290e5 | |
Phil Taylor | 72e8bc6fa6 | |
Phil Taylor | 8a28a89760 | |
Phil Taylor | 5298949f3a | |
Phil Taylor | 1e217bc5b8 | |
Phil Taylor | fbea7f1a13 | |
Dawid Szymanski - SQ6EMM/SN6M | 32639c5394 | |
Roeland Jansen | b373685fd3 | |
Roeland Jansen | ea1fefc219 | |
Phil Taylor | 3d2c16201b | |
Roeland Jansen | 6e0ebcdd5a | |
Roeland Jansen | 2488d62f2e | |
Phil Taylor | 40f49c56e7 | |
Phil Taylor | 529d101540 | |
Phil Taylor | 14a4b25e97 | |
Phil Taylor | 78fa248963 | |
Phil Taylor | 7de515b70d | |
Phil Taylor | 76694361b5 | |
Phil Taylor | 0e28f288ff | |
Phil Taylor | b619be3e2a | |
Phil Taylor | 64c0007c78 | |
Phil Taylor | b566a760ed | |
Phil Taylor | 69afce7712 | |
Phil Taylor | 5654fa524e | |
Phil Taylor | 3d053c3c96 | |
Phil Taylor | 872c8aee30 | |
Phil Taylor | e2d6101a53 | |
Phil Taylor | b35e1af185 | |
Phil Taylor | a60cb39483 | |
Phil Taylor | 6464f28159 | |
Phil Taylor | 7b7d21d3a7 | |
Roeland Jansen | 16eb4591eb | |
Roeland Jansen | eae5b93f0e | |
Phil Taylor | 02c1dcdb8b | |
Phil Taylor | f4e772e1c7 | |
Phil Taylor | 4a3f8692b5 | |
Phil Taylor | 2ec62b6c80 | |
Phil Taylor | 01e01321d3 | |
Phil Taylor | f0c8842c05 | |
Phil Taylor | 979dffc176 | |
Phil Taylor | 2128e6fc10 | |
Phil Taylor | fd86efa4b9 | |
Phil Taylor | 27ac972f4a |
|
@ -0,0 +1,109 @@
|
|||
|
||||
|
||||
|
||||
|
||||
## this is a merged list of CI-V addresses, type of interface(s), rates and all.
|
||||
|
||||
It has been merged from many sources but the most important ones are these:
|
||||
|
||||
1) https://www.docksideradio.com/Icom%20Radio%20Hex%20Addresses.htm
|
||||
2) http://www.plicht.de/ci-v/civ-bus-adressing/
|
||||
3) https://www.icomjapan.com/support/manual/
|
||||
|
||||
|
||||
|
||||
first of all a list that appears not to be a known CI-V address in use:
|
||||
|
||||
| model | addr |
|
||||
| ----- | ---- |
|
||||
|? | 0x06 |
|
||||
|? | 0x36 |
|
||||
|? | 0x54 |
|
||||
|? | 0x7E |
|
||||
|? | 0x82 |
|
||||
|? | 0x84 |
|
||||
|? | 0x8A |
|
||||
|? | 0x90 |
|
||||
|? | 0x92 |
|
||||
|? | 0x9E |
|
||||
|? | 0xA0 |
|
||||
|? | 0xA8 |
|
||||
|? | 0xAA |
|
||||
|
||||
|
||||
|
||||
and here the list of known CI-V addresses
|
||||
|
||||
|
||||
|
||||
| model | addr | year | interface | rate |
|
||||
| ------------ | ---- | ---- | -------------------------------------- | ---- |
|
||||
| IC-1271 | 0x24 | 1987 | TTL | auto |
|
||||
| IC-1275 | 0x18 | 1989 | TTL | auto |
|
||||
| IC-271 | 0x20 | 1983 | TTL | auto |
|
||||
| IC-275 | 0x10 | 1987 | TTL | auto |
|
||||
| IC-375 | 0x12 | 198? | TTL | auto |
|
||||
| IC-471 | 0x22 | 1984 | TTL | auto |
|
||||
| IC-475 | 0x14 | 1987 | TTL | auto |
|
||||
| IC-575 | 0x16 | 1988 | TTL | auto |
|
||||
| IC-7000 | 0x70 | 2005 | TTL | auto |
|
||||
| IC-703 | 0x68 | 2003 | TTL | auto |
|
||||
| IC-705 | 0xA4 | 2020 | USB, Bluetooth, Wifi | auto |
|
||||
| IC-706 | 0x48 | 1995 | TTL | auto |
|
||||
| IC-706MkII | 0x4E | 1997 | TTL | auto |
|
||||
| IC-706MkII-G | 0x58 | 1998 | TTL | auto |
|
||||
| IC-707 | 0x3E | 1993 | TTL | auto |
|
||||
| IC-7100 | 0x88 | 2012 | TTL | auto |
|
||||
| IC-718 | 0x5E | 2001 | TTL | auto |
|
||||
| IC-7200 | 0x76 | 2007 | TTL | auto |
|
||||
| IC-725 | 0x28 | 1988 | TTL | 1200 |
|
||||
| IC-726 | 0x30 | 1989 | TTL | auto |
|
||||
| IC-728 | 0x38 | 1992 | TTL | 1200 |
|
||||
| IC-729 | 0x3A | 1992 | TTL | 9600 |
|
||||
| IC-7300 | 0x94 | 2016 | TTL, USB | auto |
|
||||
| IC-735 | 0x04 | 1985 | TTL | 1200 |
|
||||
| IC-736 | 0x40 | 1994 | TTL | 9600 |
|
||||
| IC-737 | 0x3C | 1993 | TTL | 9600 |
|
||||
| IC-738 | 0x44 | 1994 | TTL | 9600 |
|
||||
| IC-7410 | 0x80 | 2011 | TTL, USB | auto |
|
||||
| IC-746 | 0x56 | 1998 | TTL | auto |
|
||||
| IC-746Pro | 0x66 | 2001 | TTL | auto |
|
||||
| IC-751A | 0x1C | 1985 | TTL | 1200 |
|
||||
| IC-756 | 0x50 | 1997 | TTL | auto |
|
||||
| IC-756Pro | 0x5C | 2000 | TTL | auto |
|
||||
| IC-756ProII | 0x64 | 2001 | TTL | auto |
|
||||
| IC-756ProIII | 0x6E | 2004 | TTL | auto |
|
||||
| IC-7600 | 0x7A | 2009 | TTL, USB | auto |
|
||||
| IC-7610 | 0x98 | 2017 | TTL, USB, Ethernet | auto |
|
||||
| IC-761 | 0x1E | 1987 | TTL | 1200 |
|
||||
| IC-765 | 0x2C | 1989 | TTL | 1200 |
|
||||
| IC-7700 | 0x74 | 2007 | TTL, RS-232C 9 pin, Ethernet | auto |
|
||||
| IC-775 | 0x46 | 1995 | TTL | auto |
|
||||
| IC-7800 | 0x6A | 2004 | TTL, RS-232C 9 pin, Ethernet | auto |
|
||||
| IC-78 | 0x62 | 2000 | TTL | auto |
|
||||
| IC-781 | 0x26 | 1987 | TTL | 1200 |
|
||||
| IC-785x | 0x8E | 2015 | TTL, USB, Ethernet | auto |
|
||||
| IC-820 | 0x42 | 1994 | TTL | auto |
|
||||
| IC-821 | 0x4C | 1996 | TTL | auto |
|
||||
| IC-905 | 0xAC | 2023 | USB, Ethernet | auto |
|
||||
| IC-9100 | 0x7C | 2010 | TTL, USB | auto |
|
||||
| IC-910 | 0x60 | 2001 | TTL | auto |
|
||||
| IC-9700 | 0xA2 | 2019 | TTL, USB, Ethernet | auto |
|
||||
| IC-970 | 0x2E | 1990 | TTL | auto |
|
||||
| IC-R10 | 0x52 | 1996 | TTL | auto |
|
||||
| IC-R20 | 0x6C | 2004 | TTL | auto |
|
||||
| IC-R30 | 0x9C | 2018 | TTL, Bluetooth | auto |
|
||||
| IC-R7000 | 0x08 | 1986 | TTL | auto |
|
||||
| IC-R7100 | 0x34 | 1991 | TTL | auto |
|
||||
| IC-R71 | 0x1A | 1984 | TTL | auto |
|
||||
| IC-R72 | 0x32 | 1992 | TTL | auto |
|
||||
| IC-R75 | 0x5A | 1999 | TTL, RS-232C 9 pin | auto |
|
||||
| IC-R8500 | 0x4A | 1996 | TTL, RS-232C 25 pin | auto |
|
||||
| IC-R8600 | 0x96 | 2017 | TTL, USB, Ethernet | auto |
|
||||
| IC-R9000 | 0x2A | 1989 | TTL | auto |
|
||||
| IC-R9500 | 0x72 | 2007 | TTL, RS-232C 9 pin, Ethernet | auto |
|
||||
| IC-RX7 | 0x78 | 2007 | TTL | auto |
|
||||
| ID-4100 | 0x9A | 2017 | TTL, Bluetooth | auto |
|
||||
| ID-5100 | 0x8C | 2014 | TTL, Bluetooth | auto |
|
||||
| ID-51 | 0x86 | 2012 | TTL | auto |
|
||||
| ID-52 | 0xA6 | 2021 | TTL, Bluetooth | auto |
|
26
INSTALL.md
|
@ -18,6 +18,7 @@ sudo apt-get install libeigen3-dev
|
|||
sudo apt-get install portaudio19-dev
|
||||
sudo apt-get install librtaudio-dev
|
||||
sudo apt-get install libhidapi-dev libqt5gamepad5-dev
|
||||
sudo apt-get install libudev-dev
|
||||
~~~
|
||||
Now you need to install qcustomplot. There are two versions that are commonly found in linux distros: 1.3 and 2.0. Either will work fine. If you are not sure which version your linux install comes with, simply run both commands. One will work and the other will fail, and that's fine!
|
||||
|
||||
|
@ -79,8 +80,7 @@ install wfview on suse 15.3 & up, sles 15.x or tumbleweed; this was done on a cl
|
|||
we need to add packages to be able to build the stuff.
|
||||
|
||||
- sudo zypper in --type pattern devel_basis
|
||||
- sudo zypper in libQt5Widgets-devel libqt5-qtbase-common-devel libqt5-qtserialport-devel libQt5SerialPort5 qcustomplot-devel libqcustomplot2 libQt5PrintSupport-devel libqt5-qtmultimedia-devel lv2-devel libopus-devel eigen3-devel libQt5Xml-devel portaudio-devel rtaudio-devel libqt5-qtgamepad-dev
|
||||
libQt5Gamepad5
|
||||
- sudo zypper in libQt5Widgets-devel libqt5-qtbase-common-devel libqt5-qtserialport-devel libQt5SerialPort5 qcustomplot-devel libqcustomplot2 libQt5PrintSupport-devel libqt5-qtmultimedia-devel lv2-devel libopus-devel eigen3-devel libQt5Xml-devel portaudio-devel rtaudio-devel libqt5-qtgamepad-devel libQt5Gamepad5
|
||||
|
||||
optional (mainly for development specifics): get and install qt5:
|
||||
|
||||
|
@ -129,6 +129,28 @@ When done, create a build area, clone the repo, build and install:
|
|||
|
||||
wfview is now installed in /usr/local/bin
|
||||
|
||||
|
||||
Fedora 36:
|
||||
|
||||
2023-04-11/Knud OZ1DGN
|
||||
|
||||
|
||||
Precondition:
|
||||
|
||||
F36 KDE plasma desktop
|
||||
wfview 1.61 prebuild binary
|
||||
|
||||
Install following packages:
|
||||
sudo dnf install qcustomplot-qt5 qt5-qtmultimedia qt5-qtserialport rtaudio portaudio hidapi qt5-qtgamepad
|
||||
|
||||
sudo ln -s /usr/lib64/libqcustomplot-qt5.so.2 /usr/lib64/libqcustomplot.so.2
|
||||
|
||||
Move /usr/share/wfview to /usr/local/share:
|
||||
|
||||
sudo mv /usr/share/wfview/stylesheets/* /usr/local/share/wfview
|
||||
|
||||
|
||||
|
||||
# How to configure your RC-28 knob under Linux
|
||||
|
||||
To use RC-28 knob you need to add udev rules, please execute as root:
|
||||
|
|
74
WHATSNEW
|
@ -1,71 +1,13 @@
|
|||
|
||||
The following highlights are in this 1.51-release ince v1.50:
|
||||
The following highlights are in this 1.6x-release since v1.60:
|
||||
|
||||
+1.60 released
|
||||
+1.61 many small fixes for several platforms
|
||||
+1.62 cw side tone added
|
||||
performance fix for 9700
|
||||
+1.63 started adding IC-905 (obviously untested)
|
||||
started multi-usb
|
||||
|
||||
+ 1.51
|
||||
Fix for squished screen
|
||||
Only request passband when there is a scope available
|
||||
Change default passband colors.
|
||||
Fix passband colorswatch
|
||||
Ignore second VFO scope data (for now)
|
||||
Silently ignore server audio issues if server is not enabled.
|
||||
Always use 8bit encoding for audio device names
|
||||
Make multimedia-plugins message only for Linux
|
||||
Add PSK modes to IC-7610 and to passband.
|
||||
Add passband for FM mode
|
||||
Added click-drag tuning. Needs refinement but it's a start.
|
||||
colorpicker: Move to 3 columns
|
||||
passband indicator
|
||||
Remove logging of audio device realm
|
||||
+ 1.52 added cluster spotting including color picker suport
|
||||
optional SQLITE in memory for spots (disabled)
|
||||
+ 1.53 modified band buttons to look more alike the layout on the rigs
|
||||
audio selction combobox shows full devicenames
|
||||
Fixed color preset zero issue.
|
||||
Fixed unusual set of conditions in which manual CI-V address would fail
|
||||
to identify the connected radio.
|
||||
Fixed broken RTS preference. Added preliminary (and untested) support
|
||||
for the IC-703, 737, 738, and 756.
|
||||
added libs for suse builds; it also builds on leap 15.5
|
||||
Add skimmer support (setting not saved)
|
||||
Add AR Cluster support
|
||||
+1.54 Various wfserver fixes
|
||||
logging using termbin edge case fix
|
||||
+1.55 Compiles with QT5 and 6 now
|
||||
Many audio-fixes
|
||||
Fix wfserver device detection
|
||||
Prevent memory leak on exit
|
||||
Dawid Szymanski - SQ6EMM/SN6M 'standardHFfix'; fixed missing 160m band
|
||||
Support hotplug audio on QT6+
|
||||
Remove Exception from RT audio as it doesn't exist in newer versions of RTAudio
|
||||
Tidy-up device enumeration for Qt audio
|
||||
Log enumeration of audio devices
|
||||
Fix codec selection issue in both QT5 and 6
|
||||
Make sure compilation with QT5 still works
|
||||
+1.56 Rename in/out Formats to avoid confusion
|
||||
Fix all audio formats and some compile warnings!
|
||||
Add function to handle connect/disconnect
|
||||
Add option of popup alert
|
||||
Change serial port signal for QT6.
|
||||
Various audio fixes (needs checking with Qt5)
|
||||
Fix portaudio
|
||||
Fix for QTAudio when using QT6 and above.
|
||||
+1.57 Merged current shuttle code in. Note that it does
|
||||
not work yet and is commented out in the build process
|
||||
Fix invalid filter width being sent to rig by rigctld.
|
||||
Ability to drag the passband for a variable filter width
|
||||
Added preference for automatic sideband.
|
||||
+1.58 PTT on now is default
|
||||
PBT is shown on the passband, see "Show more" button
|
||||
filterwidth can be adjusted . see "Show more" button
|
||||
capability to send predefined cw for righs that support it.
|
||||
Fixed up many key shortcuts, added HJKL key shortcuts.
|
||||
+1.59 rc28-shuttle control added
|
||||
many repeater/split functionality
|
||||
added "Swap VFOs" command to the USB controller, which seems to work.
|
||||
Added "scope out of range" notification.
|
||||
many fixes
|
||||
added a known limitations and issues file.
|
||||
|
||||
Notes:
|
||||
|
||||
- We know about high CPU usage on RPi.
|
||||
|
|
|
@ -15,8 +15,7 @@ aboutbox::aboutbox(QWidget *parent) :
|
|||
ui->topText->setText("wfview version " + QString(WFVIEW_VERSION));
|
||||
|
||||
QString head = QString("<html><head></head><body>");
|
||||
QString copyright = QString("Copyright 2017-2022 Elliott H. Liggett, W6EL. All rights reserved.<br/>wfview source code is <a href=\"https://gitlab.com/eliggett/wfview/-/blob/master/LICENSE\">licensed</a> under the GNU GPLv3.");
|
||||
QString nacode = QString("<br/><br/>Networking, audio, rigctl server, and much more written by Phil Taylor, M0VSE");
|
||||
QString copyright = QString("Copyright 2017-2023 Elliott H. Liggett, W6EL and Phil E. Taylor, M0VSE. All rights reserved.<br/>wfview source code is <a href=\"https://gitlab.com/eliggett/wfview/-/blob/master/LICENSE\">licensed</a> under the GNU GPLv3.");
|
||||
QString scm = QString("<br/><br/>Source code and issues managed by Roeland Jansen, PA3MET");
|
||||
QString doctest = QString("<br/><br/>Testing and development mentorship from Jim Nijkamp, PA8E.");
|
||||
|
||||
|
@ -86,7 +85,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.");
|
|||
|
||||
// String it all together:
|
||||
|
||||
QString aboutText = head + copyright + "\n" + nacode + "\n" + scm + "\n" + doctest + dedication + wfviewcommunityack;
|
||||
QString aboutText = head + copyright + "\n" + "\n" + scm + "\n" + doctest + dedication + wfviewcommunityack;
|
||||
aboutText.append(website + "\n" + donate + "\n"+ docs + support + contact +"\n");
|
||||
aboutText.append("\n" + ssCredit + "\n" + rsCredit + "\n");
|
||||
|
||||
|
|
|
@ -113,13 +113,11 @@ bool audioConverter::convert(audioPacket audio)
|
|||
QByteArray outPacket(nSamples * sizeof(float) * inFormat.channelCount(), (char)0xff); // Preset the output buffer size.
|
||||
float* out = (float*)outPacket.data();
|
||||
|
||||
//if (audio.seq > lastAudioSequence + 1) {
|
||||
// nSamples = opus_decode_float(opusDecoder, Q_NULLPTR, 0, out, nSamples, 1);
|
||||
//}
|
||||
//else {
|
||||
nSamples = opus_decode_float(opusDecoder, in, audio.data.size(), out, nSamples, 0);
|
||||
//}
|
||||
//lastAudioSequence = audio.seq;
|
||||
int ret = opus_decode_float(opusDecoder, in, audio.data.size(), out, nSamples, 0);
|
||||
if (ret != nSamples)
|
||||
{
|
||||
qDebug(logAudio()) << "opus_decode_float: returned:" << ret << "samples, expected:" << nSamples;
|
||||
}
|
||||
audio.data.clear();
|
||||
audio.data = outPacket; // Replace incoming data with converted.
|
||||
}
|
||||
|
|
|
@ -103,6 +103,8 @@ void commHandler::sendDataOut(const QByteArray &writeData)
|
|||
|
||||
qint64 bytesWritten;
|
||||
|
||||
previousSent = writeData;
|
||||
|
||||
if(PTTviaRTS)
|
||||
{
|
||||
// Size: 1 2 3 4 5 6 7 8
|
||||
|
@ -126,7 +128,7 @@ void commHandler::sendDataOut(const QByteArray &writeData)
|
|||
printHex(pttreturncmd, false, true);
|
||||
emit haveDataFromPort(pttreturncmd);
|
||||
|
||||
|
||||
|
||||
mutex.unlock();
|
||||
return;
|
||||
} else if(writeData.endsWith(QByteArrayLiteral("\x1C\x00\x01\xFD")))
|
||||
|
@ -170,6 +172,15 @@ void commHandler::receiveDataIn()
|
|||
port->startTransaction();
|
||||
inPortData = port->readAll();
|
||||
|
||||
if (inPortData.startsWith("\xFC\xFC\xFC\xFC\xFC"))
|
||||
{
|
||||
// Colission detected by remote end, re-send previous command.
|
||||
qInfo(logSerial()) << "Collision detected by remote, resending previous command";
|
||||
port->commitTransaction();
|
||||
sendDataOut(previousSent);
|
||||
return;
|
||||
}
|
||||
|
||||
if(inPortData.size() == 1)
|
||||
{
|
||||
// Generally for baud <= 9600
|
||||
|
@ -185,7 +196,6 @@ void commHandler::receiveDataIn()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
if (inPortData.startsWith("\xFE\xFE"))
|
||||
{
|
||||
if(inPortData.contains("\xFC"))
|
||||
|
@ -210,7 +220,6 @@ void commHandler::receiveDataIn()
|
|||
//printHex(inPortData, false, true);
|
||||
while (pos > -1 && fdPos > -1) {
|
||||
combined++;
|
||||
spectrumDivisionNumber = 0;
|
||||
spectrumDivisionNumber = inPortData[pos + 3] & 0x0f;
|
||||
spectrumDivisionNumber += ((inPortData[pos + 3] & 0xf0) >> 4) * 10;
|
||||
|
||||
|
@ -226,8 +235,8 @@ void commHandler::receiveDataIn()
|
|||
|
||||
}
|
||||
else if (spectrumDivisionNumber > lastSpectrum && spectrumDivisionNumber <= spectrumDivisionMax) {
|
||||
spectrumData.insert(spectrumData.length(), inPortData.mid(pos + 4, fdPos-5));
|
||||
//qDebug() << "Added spectrum seq:" << spectrumDivisionNumber << "len" << fdPos-5;
|
||||
spectrumData.insert(spectrumData.length(), inPortData.mid(pos + 5, fdPos-5));
|
||||
//qInfo() << "Added spectrum seq:" << spectrumDivisionNumber << "len" << fdPos-5<< "Spec" << spectrumData.length();
|
||||
//printHex(inPortData.mid((pos+4),fdPos - (pos+5)), false, true);
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -57,6 +57,7 @@ private:
|
|||
//QDataStream stream;
|
||||
QByteArray outPortData;
|
||||
QByteArray inPortData;
|
||||
QByteArray previousSent;
|
||||
|
||||
//QDataStream outStream;
|
||||
//QDataStream inStream;
|
||||
|
|
1083
controllersetup.cpp
|
@ -6,6 +6,7 @@
|
|||
#include <QGraphicsScene>
|
||||
#include <QGraphicsTextItem>
|
||||
#include <QGraphicsPixmapItem>
|
||||
#include <QGraphicsRectItem>
|
||||
#include <QPoint>
|
||||
#include <QGraphicsSceneMouseEvent>
|
||||
#include <QVector>
|
||||
|
@ -14,13 +15,99 @@
|
|||
#include <QLabel>
|
||||
#include <QGraphicsProxyWidget>
|
||||
#include <QAbstractItemView>
|
||||
#include <QHBoxLayout>
|
||||
#include <QGridLayout>
|
||||
#include <QPushButton>
|
||||
#include <QScopedPointer>
|
||||
#include <QCheckBox>
|
||||
#include <QFileDialog>
|
||||
#include <QMessageBox>
|
||||
#include <QLayoutItem>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QObject>
|
||||
#include <QColorDialog>
|
||||
#include <QWidget>
|
||||
#include <QSpinBox>
|
||||
#include <QCheckBox>
|
||||
|
||||
#include "usbcontroller.h"
|
||||
|
||||
|
||||
class controllerScene : public QGraphicsScene
|
||||
{
|
||||
Q_OBJECT
|
||||
QGraphicsLineItem* item = Q_NULLPTR;
|
||||
|
||||
signals:
|
||||
void showMenu(controllerScene* scene, QPoint p);
|
||||
void buttonAction(bool pressed, QPoint p);
|
||||
protected:
|
||||
void mousePressEvent(QGraphicsSceneMouseEvent* event) {
|
||||
|
||||
if (event->button() == Qt::RightButton)
|
||||
{
|
||||
emit showMenu(this, event->scenePos().toPoint());
|
||||
}
|
||||
else if (event->button() == Qt::LeftButton)
|
||||
{
|
||||
// Simulate a button press
|
||||
emit buttonAction(true,event->scenePos().toPoint());
|
||||
}
|
||||
else
|
||||
{
|
||||
QGraphicsScene::mousePressEvent(event);
|
||||
}
|
||||
}
|
||||
void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) {
|
||||
|
||||
if (event->button() == Qt::LeftButton)
|
||||
{
|
||||
// Simulate a button release
|
||||
emit buttonAction(false,event->scenePos().toPoint());
|
||||
}
|
||||
else
|
||||
{
|
||||
QGraphicsScene::mouseReleaseEvent(event);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct tabContent {
|
||||
QWidget* tab;
|
||||
QVBoxLayout* mainLayout;
|
||||
QHBoxLayout* topLayout;
|
||||
QWidget* widget;
|
||||
QVBoxLayout* layout;
|
||||
QCheckBox* disabled;
|
||||
QLabel* message;
|
||||
QGraphicsView* view;
|
||||
QLabel* pageLabel;
|
||||
QSpinBox* page;
|
||||
QHBoxLayout* sensLayout;
|
||||
QLabel* sensLabel;
|
||||
QSlider* sens;
|
||||
QImage* image;
|
||||
QGraphicsItem* bgImage = Q_NULLPTR;
|
||||
controllerScene* scene = Q_NULLPTR;
|
||||
QGridLayout* grid;
|
||||
QLabel* brightLabel;
|
||||
QComboBox* brightness;
|
||||
QLabel* speedLabel;
|
||||
QComboBox* speed;
|
||||
QLabel* orientLabel;
|
||||
QComboBox* orientation;
|
||||
QLabel* colorLabel;
|
||||
QPushButton* color;
|
||||
QLabel* timeoutLabel;
|
||||
QSpinBox* timeout;
|
||||
QLabel* pagesLabel;
|
||||
QSpinBox* pages;
|
||||
QLabel* helpText;
|
||||
};
|
||||
|
||||
|
||||
|
||||
namespace Ui {
|
||||
class controllerSetup;
|
||||
|
@ -35,68 +122,102 @@ public:
|
|||
~controllerSetup();
|
||||
|
||||
signals:
|
||||
|
||||
void started();
|
||||
void sendRequest(USBDEVICE* dev, usbFeatureType request, int val=0, QString text="", QImage* img=Q_NULLPTR, QColor* color=Q_NULLPTR);
|
||||
void programDisable(USBDEVICE* dev, bool disable);
|
||||
void programPages(USBDEVICE* dev, int pages);
|
||||
void backup(USBDEVICE* dev, QString path);
|
||||
void restore(USBDEVICE *dev, QString path);
|
||||
|
||||
public slots:
|
||||
void newDevice(unsigned char devType, QVector<BUTTON>* but, QVector<COMMAND>* cmd);
|
||||
void mousePressed(QPoint p);
|
||||
void init(usbDevMap* dev, QVector<BUTTON>* but, QVector<KNOB>* kb, QVector<COMMAND>* cmd, QMutex* mut);
|
||||
void newDevice(USBDEVICE* dev);
|
||||
void removeDevice(USBDEVICE* dev);
|
||||
void showMenu(controllerScene *scene,QPoint p);
|
||||
void onEventIndexChanged(int index);
|
||||
void offEventIndexChanged(int index);
|
||||
void knobEventIndexChanged(int index);
|
||||
void ledNumberChanged(int index);
|
||||
void sensitivityMoved(USBDEVICE* dev, int val);
|
||||
void brightnessChanged(USBDEVICE* dev, int index);
|
||||
void orientationChanged(USBDEVICE* dev, int index);
|
||||
void speedChanged(USBDEVICE* dev, int index);
|
||||
void colorPicker(USBDEVICE* dev, QPushButton* btn, QColor color);
|
||||
void buttonOnColorClicked();
|
||||
void buttonOffColorClicked();
|
||||
void buttonIconClicked();
|
||||
void latchStateChanged(int state);
|
||||
|
||||
void timeoutChanged(USBDEVICE* dev, int val);
|
||||
void pageChanged(USBDEVICE* dev, int val);
|
||||
void pagesChanged(USBDEVICE* dev, int val);
|
||||
void disableClicked(USBDEVICE* dev, bool clicked, QWidget* widget);
|
||||
void setConnected(USBDEVICE* dev);
|
||||
void hideEvent(QHideEvent *event);
|
||||
void on_tabWidget_currentChanged(int index);
|
||||
void on_backupButton_clicked();
|
||||
void on_restoreButton_clicked();
|
||||
|
||||
private:
|
||||
|
||||
usbDeviceType usbDevice = usbNone;
|
||||
usbDeviceType type = usbNone;
|
||||
Ui::controllerSetup* ui;
|
||||
QGraphicsScene* scene;
|
||||
QGraphicsTextItem* textItem;
|
||||
QGraphicsItem* bgImage = Q_NULLPTR;
|
||||
QLabel* imgLabel;
|
||||
unsigned char currentDevice = 0;
|
||||
QVector<BUTTON>* buttons;
|
||||
QVector<KNOB>* knobs;
|
||||
QVector<COMMAND>* commands;
|
||||
BUTTON* currentButton=Q_NULLPTR;
|
||||
QComboBox onEvent;
|
||||
QComboBox offEvent;
|
||||
QGraphicsProxyWidget* onEventProxy=Q_NULLPTR;
|
||||
QGraphicsProxyWidget* offEventProxy=Q_NULLPTR;
|
||||
usbDevMap* devices;
|
||||
|
||||
BUTTON* currentButton = Q_NULLPTR;
|
||||
KNOB* currentKnob = Q_NULLPTR;
|
||||
|
||||
// Update Dialog
|
||||
QDialog * updateDialog = Q_NULLPTR;
|
||||
QComboBox* onEvent;
|
||||
QComboBox* offEvent;
|
||||
QComboBox* knobEvent;
|
||||
QLabel* onLabel;
|
||||
QLabel* offLabel;
|
||||
QLabel* knobLabel;
|
||||
QPushButton* buttonOnColor;
|
||||
QPushButton* buttonOffColor;
|
||||
QCheckBox *buttonLatch;
|
||||
QPushButton* buttonIcon;
|
||||
QLabel* iconLabel;
|
||||
QSpinBox* ledNumber;
|
||||
|
||||
QString deviceName;
|
||||
QMutex* mutex;
|
||||
QColor initialColor = Qt::white;
|
||||
|
||||
};
|
||||
QLabel* noControllersText;
|
||||
|
||||
int numTabs=0;
|
||||
QMap<QString,tabContent*> tabs;
|
||||
|
||||
|
||||
class controllerScene : public QGraphicsScene
|
||||
{
|
||||
Q_OBJECT
|
||||
QGraphicsLineItem* item = Q_NULLPTR;
|
||||
|
||||
signals:
|
||||
void mousePressed(QPoint p);
|
||||
protected:
|
||||
void mousePressEvent(QGraphicsSceneMouseEvent* event) {
|
||||
|
||||
if (event->button() == Qt::RightButton)
|
||||
{
|
||||
emit mousePressed(event->scenePos().toPoint());
|
||||
}
|
||||
else
|
||||
{
|
||||
QGraphicsScene::mousePressEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
// Below are used for each tab:
|
||||
/*
|
||||
void mouseMoveEvent(QGraphicsSceneMouseEvent* event) {
|
||||
|
||||
}
|
||||
|
||||
void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) {
|
||||
|
||||
}
|
||||
*/
|
||||
QList<QWidget *> tabs;
|
||||
QList<QVBoxLayout *> layouts;
|
||||
QList<QWidget *> widgets;
|
||||
QList<QGraphicsView *> graphicsViews;
|
||||
QList<QGraphicsScene*> scenes;
|
||||
QList<QGraphicsItem*> bgImages;
|
||||
QList<QSlider *>sensitivitys;
|
||||
|
||||
// Just used for QuickKeys device
|
||||
QList<QComboBox *>brightCombos;
|
||||
QList<QComboBox *>speedCombos;
|
||||
QList<QComboBox *>orientCombos;
|
||||
QList<QPushButton *>colorButtons;
|
||||
QList<QSpinBox *>timeoutSpins;
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>302</width>
|
||||
<height>343</height>
|
||||
<width>788</width>
|
||||
<height>646</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
@ -15,30 +15,26 @@
|
|||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGraphicsView" name="graphicsView"/>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="tabPosition">
|
||||
<enum>QTabWidget::North</enum>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab">
|
||||
<attribute name="title">
|
||||
<string>Tab 1</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_2">
|
||||
<attribute name="title">
|
||||
<string>Tab 2</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string><html><head/><body><p align="center"><span style=" font-weight:700;">Button configuration: </span>Right-click on each button to configure it.</p><p align="center">Top selection is command to send when button is pressed and bottom is (optional) command to send when button is released.</p></body></html></string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<item row="2" column="0">
|
||||
<layout class="QHBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
|
@ -55,6 +51,20 @@
|
|||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="backupButton">
|
||||
<property name="text">
|
||||
<string>Backup</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="restoreButton">
|
||||
<property name="text">
|
||||
<string>Restore</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
|
|
248
cwsender.cpp
|
@ -1,6 +1,8 @@
|
|||
#include "cwsender.h"
|
||||
#include "ui_cwsender.h"
|
||||
|
||||
#include "logcategories.h"
|
||||
|
||||
cwSender::cwSender(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::cwSender)
|
||||
|
@ -15,37 +17,86 @@ cwSender::cwSender(QWidget *parent) :
|
|||
ui->textToSendEdit->setFocus();
|
||||
ui->statusbar->setToolTipDuration(3000);
|
||||
this->setToolTipDuration(3000);
|
||||
connect(ui->textToSendEdit->lineEdit(), &QLineEdit::textEdited, this, &cwSender::textChanged);
|
||||
}
|
||||
|
||||
cwSender::~cwSender()
|
||||
{
|
||||
qDebug(logCW()) << "Running CW Sender destructor.";
|
||||
|
||||
if (toneThread != Q_NULLPTR) {
|
||||
toneThread->quit();
|
||||
toneThread->wait();
|
||||
toneThread = Q_NULLPTR;
|
||||
tone = Q_NULLPTR;
|
||||
/* Finally disconnect all connections */
|
||||
for (auto conn: connections)
|
||||
{
|
||||
disconnect(conn);
|
||||
}
|
||||
connections.clear();
|
||||
}
|
||||
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void cwSender::showEvent(QShowEvent *event)
|
||||
{
|
||||
emit getCWSettings();
|
||||
(void)event;
|
||||
emit getCWSettings();
|
||||
QMainWindow::showEvent(event);
|
||||
}
|
||||
|
||||
void cwSender::handleKeySpeed(unsigned char wpm)
|
||||
{
|
||||
//qDebug(logCW()) << "Told that current WPM is" << wpm;
|
||||
if((wpm >= 6) && (wpm <=48))
|
||||
if (wpm != ui->wpmSpin->value() && (wpm >= ui->wpmSpin->minimum()) && (wpm <= ui->wpmSpin->maximum()))
|
||||
{
|
||||
//qDebug(logCW()) << "Setting WPM UI control to" << wpm;
|
||||
ui->wpmSpin->blockSignals(true);
|
||||
ui->wpmSpin->setValue(wpm);
|
||||
QMetaObject::invokeMethod(ui->wpmSpin, "setValue", Qt::QueuedConnection, Q_ARG(int, wpm));
|
||||
ui->wpmSpin->blockSignals(false);
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5,10,0))
|
||||
QMetaObject::invokeMethod(tone, [=]() {
|
||||
tone->setSpeed(wpm);
|
||||
}, Qt::QueuedConnection);
|
||||
#else
|
||||
emit setKeySpeed(ratio);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void cwSender::handleDashRatio(unsigned char ratio)
|
||||
{
|
||||
double calc = double(ratio/10);
|
||||
if (calc != ui->dashSpin->value() && (calc >= ui->dashSpin->minimum()) && (ratio <= ui->dashSpin->maximum()))
|
||||
{
|
||||
ui->dashSpin->blockSignals(true);
|
||||
QMetaObject::invokeMethod(ui->dashSpin, "setValue", Qt::QueuedConnection, Q_ARG(double, calc));
|
||||
ui->dashSpin->blockSignals(false);
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5,10,0))
|
||||
QMetaObject::invokeMethod(tone, [=]() {
|
||||
tone->setRatio(ratio);
|
||||
}, Qt::QueuedConnection);
|
||||
#else
|
||||
emit setDashRatio(ratio);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void cwSender::handlePitch(unsigned char pitch) {
|
||||
quint16 cwPitch = round((((600.0 / 255.0) * pitch) + 300) / 5.0) * 5.0;
|
||||
ui->pitchSpin->blockSignals(true);
|
||||
ui->pitchSpin->setValue(cwPitch);
|
||||
ui->pitchSpin->blockSignals(false);
|
||||
int cwPitch = round((((600.0 / 255.0) * pitch) + 300) / 5.0) * 5.0;
|
||||
if (cwPitch != ui->pitchSpin->value() && cwPitch >= ui->pitchSpin->minimum() && cwPitch <= ui->pitchSpin->maximum())
|
||||
{
|
||||
ui->pitchSpin->blockSignals(true);
|
||||
QMetaObject::invokeMethod(ui->pitchSpin, "setValue", Qt::QueuedConnection, Q_ARG(int, cwPitch));
|
||||
ui->pitchSpin->blockSignals(false);
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5,10,0))
|
||||
QMetaObject::invokeMethod(tone, [=]() {
|
||||
tone->setFrequency(pitch);
|
||||
}, Qt::QueuedConnection);
|
||||
#else
|
||||
emit setPitch(tone);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void cwSender::handleBreakInMode(unsigned char b)
|
||||
|
@ -68,24 +119,56 @@ void cwSender::handleCurrentModeUpdate(mode_kind mode)
|
|||
}
|
||||
}
|
||||
|
||||
void cwSender::textChanged(QString text)
|
||||
{
|
||||
if (ui->sendImmediateChk->isChecked() && text.size() && text.back() == ' ')
|
||||
{
|
||||
int toSend = text.mid(0, 30).size();
|
||||
if (toSend > 0) {
|
||||
ui->textToSendEdit->clearEditText();
|
||||
ui->transcriptText->moveCursor(QTextCursor::End);
|
||||
ui->transcriptText->insertPlainText(text.mid(0, 30).toUpper());
|
||||
ui->transcriptText->moveCursor(QTextCursor::End);
|
||||
|
||||
emit sendCW(text.mid(0, 30));
|
||||
}
|
||||
if( (currentMode != modeCW) && (currentMode != modeCW_R) )
|
||||
{
|
||||
ui->statusbar->showMessage("Note: Mode needs to be set to CW or CW-R to send CW.", 3000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cwSender::on_sendBtn_clicked()
|
||||
{
|
||||
if( (ui->textToSendEdit->currentText().length() > 0) &&
|
||||
(ui->textToSendEdit->currentText().length() <= 30) )
|
||||
{
|
||||
emit sendCW(ui->textToSendEdit->currentText());
|
||||
ui->transcriptText->appendPlainText(ui->textToSendEdit->currentText());
|
||||
ui->textToSendEdit->addItem(ui->textToSendEdit->currentText());
|
||||
if (ui->textToSendEdit->count() > 5) {
|
||||
ui->textToSendEdit->removeItem(0);
|
||||
QString text = ui->textToSendEdit->currentText();
|
||||
|
||||
ui->transcriptText->moveCursor(QTextCursor::End);
|
||||
ui->transcriptText->insertPlainText(ui->textToSendEdit->currentText().toUpper()+"\n");
|
||||
ui->transcriptText->moveCursor(QTextCursor::End);
|
||||
if (!ui->sendImmediateChk->isChecked())
|
||||
{
|
||||
ui->textToSendEdit->addItem(ui->textToSendEdit->currentText());
|
||||
if (ui->textToSendEdit->count() > 5) {
|
||||
ui->textToSendEdit->removeItem(0);
|
||||
}
|
||||
ui->textToSendEdit->setCurrentIndex(-1);
|
||||
} else {
|
||||
ui->textToSendEdit->clearEditText();
|
||||
ui->textToSendEdit->clear();
|
||||
}
|
||||
ui->textToSendEdit->setCurrentIndex(-1);
|
||||
|
||||
ui->textToSendEdit->setFocus();
|
||||
ui->statusbar->showMessage("Sending CW", 3000);
|
||||
|
||||
emit sendCW(text);
|
||||
}
|
||||
if( (currentMode==modeCW) || (currentMode==modeCW_R) )
|
||||
|
||||
if( (currentMode != modeCW) && (currentMode != modeCW_R) )
|
||||
{
|
||||
} else {
|
||||
ui->statusbar->showMessage("Note: Mode needs to be set to CW or CW-R to send CW.", 3000);
|
||||
}
|
||||
}
|
||||
|
@ -114,12 +197,16 @@ void cwSender::on_wpmSpin_valueChanged(int wpm)
|
|||
emit setKeySpeed((unsigned char)wpm);
|
||||
}
|
||||
|
||||
void cwSender::on_dashSpin_valueChanged(double ratio)
|
||||
{
|
||||
emit setDashRatio((unsigned char)double(ratio * 10));
|
||||
}
|
||||
|
||||
void cwSender::on_pitchSpin_valueChanged(int arg1)
|
||||
{
|
||||
// quint16 cwPitch = round((((600.0 / 255.0) * pitch) + 300) / 5.0) * 5.0;
|
||||
unsigned char pitch = 0;
|
||||
pitch = ceil((arg1 - 300) * (255.0 / 600.0));
|
||||
qDebug() << "Setting pitch" << pitch;
|
||||
emit setPitch(pitch);
|
||||
}
|
||||
|
||||
|
@ -173,6 +260,56 @@ void cwSender::on_macro10btn_clicked()
|
|||
processMacroButton(10, ui->macro10btn);
|
||||
}
|
||||
|
||||
void cwSender::on_sidetoneEnableChk_clicked(bool clicked)
|
||||
{
|
||||
ui->sidetoneLevelSlider->setEnabled(clicked);
|
||||
if (clicked && toneThread == Q_NULLPTR)
|
||||
{
|
||||
toneThread = new QThread(this);
|
||||
toneThread->setObjectName("sidetone()");
|
||||
|
||||
tone = new cwSidetone(sidetoneLevel, ui->wpmSpin->value(),ui->pitchSpin->value(),ui->dashSpin->value(),this);
|
||||
tone->moveToThread(toneThread);
|
||||
toneThread->start();
|
||||
|
||||
connections.append(connect(toneThread, &QThread::finished,
|
||||
[=]() { tone->deleteLater(); }));
|
||||
connections.append(connect(this, &cwSender::sendCW,
|
||||
[=](const QString& text) { tone->send(text); ui->sidetoneEnableChk->setEnabled(false); }));
|
||||
connections.append(connect(this, &cwSender::setKeySpeed,
|
||||
[=](const unsigned char& wpm) { tone->setSpeed(wpm); }));
|
||||
connections.append(connect(this, &cwSender::setDashRatio,
|
||||
[=](const unsigned char& ratio) { tone->setRatio(ratio); }));
|
||||
connections.append(connect(this, &cwSender::setPitch,
|
||||
[=](const unsigned char& pitch) { tone->setFrequency(pitch); }));
|
||||
connections.append(connect(this, &cwSender::setLevel,
|
||||
[=](const unsigned char& level) { tone->setLevel(level); }));
|
||||
connections.append(connect(this, &cwSender::stopCW,
|
||||
[=]() { tone->stopSending(); }));
|
||||
connections.append(connect(tone, &cwSidetone::finished,
|
||||
[=]() { ui->sidetoneEnableChk->setEnabled(true); }));
|
||||
|
||||
} else if (!clicked && toneThread != Q_NULLPTR) {
|
||||
/* disconnect all connections */
|
||||
toneThread->quit();
|
||||
toneThread->wait();
|
||||
toneThread = Q_NULLPTR;
|
||||
tone = Q_NULLPTR;
|
||||
for (auto conn: connections)
|
||||
{
|
||||
disconnect(conn);
|
||||
}
|
||||
connections.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void cwSender::on_sidetoneLevelSlider_valueChanged(int val)
|
||||
{
|
||||
sidetoneLevel = val;
|
||||
emit setLevel(val);
|
||||
}
|
||||
|
||||
|
||||
void cwSender::processMacroButton(int buttonNumber, QPushButton *btn)
|
||||
{
|
||||
if(ui->macroEditChk->isChecked())
|
||||
|
@ -189,19 +326,33 @@ void cwSender::runMacroButton(int buttonNumber)
|
|||
if(macroText[buttonNumber].isEmpty())
|
||||
return;
|
||||
QString outText;
|
||||
if(macroText[buttonNumber].contains("\%1"))
|
||||
if(macroText[buttonNumber].contains("%1"))
|
||||
{
|
||||
outText = macroText[buttonNumber].arg(sequenceNumber, 3, 10, QChar('0'));
|
||||
sequenceNumber++;
|
||||
ui->sequenceSpin->blockSignals(true);
|
||||
ui->sequenceSpin->setValue(sequenceNumber);
|
||||
QMetaObject::invokeMethod(ui->sequenceSpin, "setValue", Qt::QueuedConnection, Q_ARG(int, sequenceNumber));
|
||||
ui->sequenceSpin->blockSignals(false);
|
||||
} else {
|
||||
outText = macroText[buttonNumber];
|
||||
}
|
||||
emit sendCW(outText);
|
||||
ui->transcriptText->appendPlainText(outText);
|
||||
|
||||
if (ui->cutNumbersChk->isChecked())
|
||||
{
|
||||
outText.replace("0", "T");
|
||||
outText.replace("9", "N");
|
||||
}
|
||||
|
||||
ui->transcriptText->moveCursor(QTextCursor::End);
|
||||
ui->transcriptText->insertPlainText(outText.toUpper()+"\n");
|
||||
ui->transcriptText->moveCursor(QTextCursor::End);
|
||||
|
||||
for (int i = 0; i < outText.size(); i = i + 30) {
|
||||
emit sendCW(outText.mid(i,30));
|
||||
}
|
||||
|
||||
ui->textToSendEdit->setFocus();
|
||||
|
||||
|
||||
if( (currentMode==modeCW) || (currentMode==modeCW_R) )
|
||||
{
|
||||
|
@ -215,22 +366,22 @@ void cwSender::editMacroButton(int buttonNumber, QPushButton* btn)
|
|||
{
|
||||
bool ok;
|
||||
QString promptFirst = QString("Please enter the text for macro %1,\n"
|
||||
"up to 30 characters.\n").arg(buttonNumber);
|
||||
QString promptSecond = QString("You may use \"\%1\" to insert a sequence number.");
|
||||
"up to 60 characters.\n").arg(buttonNumber);
|
||||
QString promptSecond = QString("You may use \"%1\" to insert a sequence number.");
|
||||
QString prompt = promptFirst+promptSecond;
|
||||
|
||||
QString newMacroText = QInputDialog::getText(this, "Macro Edit",
|
||||
prompt,
|
||||
QLineEdit::Normal, macroText[buttonNumber], &ok);
|
||||
QLineEdit::Normal, macroText[buttonNumber], &ok).toUpper();
|
||||
if(!ok)
|
||||
return;
|
||||
|
||||
if(newMacroText.length() > 30)
|
||||
if (newMacroText.length() > 60)
|
||||
{
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(QString("The text entered was too long \n"
|
||||
"(max length is 30 characters).\n"
|
||||
"Your input was %1 characters.").arg(newMacroText.length()));
|
||||
"(max length is 60 characters).\n"
|
||||
"Your input was %1 characters.").arg(newMacroText.length()));
|
||||
msgBox.exec();
|
||||
this->raise();
|
||||
return;
|
||||
|
@ -264,6 +415,47 @@ void cwSender::on_sequenceSpin_valueChanged(int newSeq)
|
|||
ui->textToSendEdit->setFocus();
|
||||
}
|
||||
|
||||
bool cwSender::getCutNumbers()
|
||||
{
|
||||
return ui->cutNumbersChk->isChecked();
|
||||
}
|
||||
|
||||
bool cwSender::getSendImmediate()
|
||||
{
|
||||
return ui->sendImmediateChk->isChecked();
|
||||
}
|
||||
|
||||
bool cwSender::getSidetoneEnable()
|
||||
{
|
||||
return ui->sidetoneEnableChk->isChecked();
|
||||
}
|
||||
|
||||
int cwSender::getSidetoneLevel()
|
||||
{
|
||||
return ui->sidetoneLevelSlider->value();
|
||||
}
|
||||
|
||||
void cwSender::setCutNumbers(bool val)
|
||||
{
|
||||
ui->cutNumbersChk->setChecked(val);
|
||||
}
|
||||
|
||||
void cwSender::setSendImmediate(bool val)
|
||||
{
|
||||
ui->sendImmediateChk->setChecked(val);
|
||||
}
|
||||
|
||||
void cwSender::setSidetoneEnable(bool val)
|
||||
{
|
||||
ui->sidetoneEnableChk->setChecked(val);
|
||||
on_sidetoneEnableChk_clicked(val);
|
||||
}
|
||||
|
||||
void cwSender::setSidetoneLevel(int val)
|
||||
{
|
||||
QMetaObject::invokeMethod(ui->sidetoneLevelSlider, "setValue", Qt::QueuedConnection, Q_ARG(int, val));
|
||||
}
|
||||
|
||||
QStringList cwSender::getMacroText()
|
||||
{
|
||||
// This is for preference saving:
|
||||
|
|
36
cwsender.h
|
@ -6,11 +6,11 @@
|
|||
#include <QFont>
|
||||
#include <QInputDialog>
|
||||
#include <QMessageBox>
|
||||
#include <QThread>
|
||||
#include <QList>
|
||||
#include <math.h>
|
||||
#include "cwsidetone.h"
|
||||
#include "wfviewtypes.h"
|
||||
#include "logcategories.h"
|
||||
|
||||
|
||||
|
||||
namespace Ui {
|
||||
class cwSender;
|
||||
|
@ -25,16 +25,32 @@ public:
|
|||
~cwSender();
|
||||
QStringList getMacroText();
|
||||
void setMacroText(QStringList macros);
|
||||
void setCutNumbers(bool val);
|
||||
void setSendImmediate(bool val);
|
||||
void setSidetoneEnable(bool val);
|
||||
void setSidetoneLevel(int val);
|
||||
bool getCutNumbers();
|
||||
bool getSendImmediate();
|
||||
bool getSidetoneEnable();
|
||||
int getSidetoneLevel();
|
||||
|
||||
signals:
|
||||
void sendCW(QString cwMessage);
|
||||
void stopCW();
|
||||
void setKeySpeed(unsigned char wpm);
|
||||
void setDashRatio(unsigned char ratio);
|
||||
void setPitch(unsigned char pitch);
|
||||
void setLevel(int level);
|
||||
void setBreakInMode(unsigned char b);
|
||||
void getCWSettings();
|
||||
void sidetone(QString text);
|
||||
void pitchChanged(int val);
|
||||
void dashChanged(int val);
|
||||
void wpmChanged(int val);
|
||||
|
||||
public slots:
|
||||
void handleKeySpeed(unsigned char wpm);
|
||||
void handleDashRatio(unsigned char ratio);
|
||||
void handlePitch(unsigned char pitch);
|
||||
void handleBreakInMode(unsigned char b);
|
||||
void handleCurrentModeUpdate(mode_kind mode);
|
||||
|
@ -47,10 +63,14 @@ private slots:
|
|||
|
||||
//void on_textToSendEdit_returnPressed();
|
||||
|
||||
void textChanged(QString text);
|
||||
|
||||
void on_breakinCombo_activated(int index);
|
||||
|
||||
void on_wpmSpin_valueChanged(int arg1);
|
||||
|
||||
void on_dashSpin_valueChanged(double arg1);
|
||||
|
||||
void on_pitchSpin_valueChanged(int arg1);
|
||||
|
||||
void on_macro1btn_clicked();
|
||||
|
@ -75,15 +95,25 @@ private slots:
|
|||
|
||||
void on_sequenceSpin_valueChanged(int arg1);
|
||||
|
||||
void on_sidetoneEnableChk_clicked(bool clicked);
|
||||
|
||||
void on_sidetoneLevelSlider_valueChanged(int val);
|
||||
|
||||
private:
|
||||
Ui::cwSender *ui;
|
||||
QString macroText[11];
|
||||
int sequenceNumber = 1;
|
||||
int lastSentPos = 0;
|
||||
mode_kind currentMode;
|
||||
int sidetoneLevel=0;
|
||||
void processMacroButton(int buttonNumber, QPushButton *btn);
|
||||
void runMacroButton(int buttonNumber);
|
||||
void editMacroButton(int buttonNumber, QPushButton *btn);
|
||||
void setMacroButtonText(QString btnText, QPushButton *btn);
|
||||
cwSidetone* tone=Q_NULLPTR;
|
||||
QThread* toneThread = Q_NULLPTR;
|
||||
bool sidetoneWasEnabled=false;
|
||||
QList<QMetaObject::Connection> connections;
|
||||
};
|
||||
|
||||
#endif // CWSENDER_H
|
||||
|
|
307
cwsender.ui
|
@ -6,7 +6,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>886</width>
|
||||
<width>835</width>
|
||||
<height>451</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -177,7 +177,140 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<item row="1" column="1">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QPushButton" name="stopBtn">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>100</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Stop sending CW</string>
|
||||
</property>
|
||||
<property name="autoFillBackground">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Stop</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Local Sidetone Level</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSlider" name="sidetoneLevelSlider">
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="sidetoneEnableChk">
|
||||
<property name="text">
|
||||
<string>Enable</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="sendBtn">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>100</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Send</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Return</string>
|
||||
</property>
|
||||
<property name="default">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="textToSendEdit">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Type here to send text as CW</string>
|
||||
</property>
|
||||
<property name="inputMethodHints">
|
||||
<set>Qt::ImhUppercaseOnly</set>
|
||||
</property>
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="currentText">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="insertPolicy">
|
||||
<enum>QComboBox::InsertAtTop</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="3" colspan="2">
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SetMinimumSize</enum>
|
||||
|
@ -210,42 +343,20 @@
|
|||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="label">
|
||||
<item row="1" column="2">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>WPM:</string>
|
||||
<string>PITCH (Hz):</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QSpinBox" name="wpmSpin">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Set the Words Per Minute</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>48</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>20</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Break In</string>
|
||||
<string>WPM:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
|
@ -274,99 +385,77 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>PITCH (Hz):</string>
|
||||
<string>Break In</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="spacerLabel">
|
||||
<property name="text">
|
||||
<string/>
|
||||
<item row="3" column="3">
|
||||
<widget class="QDoubleSpinBox" name="dashSpin">
|
||||
<property name="decimals">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>2.800000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>4.500000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>3.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
<item row="1" column="3">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Dash Ratio</string>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QSpinBox" name="wpmSpin">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
<property name="toolTip">
|
||||
<string>Set the Words Per Minute</string>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
<property name="minimum">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="sendBtn">
|
||||
<property name="text">
|
||||
<string>Send</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Return</string>
|
||||
</property>
|
||||
<property name="default">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="stopBtn">
|
||||
<property name="toolTip">
|
||||
<string>Stop sending CW</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Stop</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="textToSendEdit">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Type here to send text as CW</string>
|
||||
</property>
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="currentText">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="insertPolicy">
|
||||
<enum>QComboBox::InsertAtTop</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<property name="maximum">
|
||||
<number>48</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>20</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="4">
|
||||
<widget class="QCheckBox" name="cutNumbersChk">
|
||||
<property name="text">
|
||||
<string>Cut Num</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="4">
|
||||
<widget class="QCheckBox" name="sendImmediateChk">
|
||||
<property name="text">
|
||||
<string>Send Immed</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
|
|
|
@ -0,0 +1,308 @@
|
|||
#include "cwsidetone.h"
|
||||
|
||||
#include "logcategories.h"
|
||||
|
||||
cwSidetone::cwSidetone(int level, int speed, int freq, double ratio, QWidget* parent) :
|
||||
parent(parent),
|
||||
volume(level),
|
||||
speed(speed),
|
||||
frequency(freq),
|
||||
ratio(ratio)
|
||||
{
|
||||
|
||||
/*
|
||||
* Characters to match Icom table
|
||||
* Unknown characters will return '?'
|
||||
*/
|
||||
cwTable.clear();
|
||||
cwTable['0'] = "-----";
|
||||
cwTable['1'] = ".----";
|
||||
cwTable['2'] = "..---";
|
||||
cwTable['3'] = "...--";
|
||||
cwTable['4'] = "....-";
|
||||
cwTable['5'] = ".....";
|
||||
cwTable['6'] = "-....";
|
||||
cwTable['7'] = "--...";
|
||||
cwTable['8'] = "---..";
|
||||
cwTable['9'] = "----.";
|
||||
|
||||
cwTable['A'] = ".-";
|
||||
cwTable['B'] = "-...";
|
||||
cwTable['C'] = "-.-.";
|
||||
cwTable['D'] = "-..";
|
||||
cwTable['E'] = ".";
|
||||
cwTable['F'] = "..-.";
|
||||
cwTable['G'] = "--.";
|
||||
cwTable['H'] = "....";
|
||||
cwTable['I'] = "..";
|
||||
cwTable['J'] = ".---";
|
||||
cwTable['K'] = "-.-";
|
||||
cwTable['L'] = ".-..";
|
||||
cwTable['M'] = "--";
|
||||
cwTable['N'] = "-.";
|
||||
cwTable['O'] = "---";
|
||||
cwTable['P'] = ".--.";
|
||||
cwTable['Q'] = "--.-";
|
||||
cwTable['R'] = ".-.";
|
||||
cwTable['S'] = "...";
|
||||
cwTable['T'] = "-";
|
||||
cwTable['U'] = "..-";
|
||||
cwTable['V'] = "...-";
|
||||
cwTable['W'] = ".--";
|
||||
cwTable['X'] = "-..-";
|
||||
cwTable['Y'] = "-.--";
|
||||
cwTable['Z'] = "--..";
|
||||
|
||||
cwTable['/'] = "-..-.";
|
||||
cwTable['?'] = "..--..";
|
||||
cwTable['.'] = ".-.-.-";
|
||||
cwTable['-'] = "-....-";
|
||||
cwTable[','] = "--..--";
|
||||
cwTable[':'] = "---...";
|
||||
cwTable['\''] = ".----.";
|
||||
cwTable['('] = "-.--.-";
|
||||
cwTable[')'] = "-.--.-";
|
||||
cwTable['='] = "-...-";
|
||||
cwTable['+'] = ".-.-.";
|
||||
cwTable['"'] = ".-..-.";
|
||||
|
||||
cwTable[' '] = " ";
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
cwSidetone::~cwSidetone()
|
||||
{
|
||||
qInfo(logCW()) << "cwSidetone() finished";
|
||||
this->stop();
|
||||
output->stop();
|
||||
}
|
||||
|
||||
void cwSidetone::init()
|
||||
{
|
||||
format.setSampleRate(44100);
|
||||
format.setChannelCount(1);
|
||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
format.setCodec("audio/pcm");
|
||||
format.setSampleSize(16);
|
||||
format.setByteOrder(QAudioFormat::LittleEndian);
|
||||
format.setSampleType(QAudioFormat::SignedInt);
|
||||
QAudioDeviceInfo device(QAudioDeviceInfo::defaultOutputDevice());
|
||||
#else
|
||||
format.setSampleFormat(QAudioFormat::Int16);
|
||||
QAudioDevice device = QMediaDevices::defaultAudioOutput();
|
||||
#endif
|
||||
if (!device.isNull()) {
|
||||
if (!device.isFormatSupported(format)) {
|
||||
qWarning(logCW()) << "Default format not supported, using preferred";
|
||||
format = device.preferredFormat();
|
||||
}
|
||||
|
||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
output.reset(new QAudioOutput(device,format));
|
||||
#else
|
||||
output.reset(new QAudioSink(device,format));
|
||||
#endif
|
||||
|
||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
qInfo(logCW()) << QString("Sidetone Output: %0 (volume: %1 rate: %2 size: %3 type: %4)")
|
||||
.arg(device.deviceName()).arg(volume).arg(format.sampleRate()).arg(format.sampleSize()).arg(format.sampleType());
|
||||
#else
|
||||
qInfo(logCW()) << QString("Sidetone Output: %0 (volume: %1 rate: %2 type: %3")
|
||||
.arg(device.description()).arg(volume).arg(format.sampleRate()).arg(format.sampleFormat());
|
||||
#endif
|
||||
}
|
||||
this->start(); // Start QIODevice
|
||||
}
|
||||
|
||||
void cwSidetone::send(QString text)
|
||||
{
|
||||
text=text.simplified();
|
||||
|
||||
for (int pos=0; pos < text.size(); pos++)
|
||||
{
|
||||
QChar ch = text.at(pos).toUpper();
|
||||
QString currentChar;
|
||||
if (ch == NULL)
|
||||
{
|
||||
currentChar = cwTable[' '];
|
||||
}
|
||||
else if (this->cwTable.contains(ch))
|
||||
{
|
||||
currentChar = cwTable[ch];
|
||||
}
|
||||
else
|
||||
{
|
||||
currentChar=cwTable['?'];
|
||||
}
|
||||
generateMorse(currentChar);
|
||||
}
|
||||
|
||||
if (output->state() == QAudio::StoppedState)
|
||||
{
|
||||
output->start(this);
|
||||
}
|
||||
else if (output->state() == QAudio::IdleState) {
|
||||
output->suspend();
|
||||
output->resume();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void cwSidetone::start()
|
||||
{
|
||||
open(QIODevice::ReadOnly);
|
||||
}
|
||||
|
||||
void cwSidetone::stop()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
qint64 cwSidetone::readData(char *data, qint64 len)
|
||||
{
|
||||
QMutexLocker locker(&mutex);
|
||||
const qint64 total = qMin(((qint64)buffer.size()), len);
|
||||
memcpy(data, buffer.constData(), total);
|
||||
buffer.remove(0,total);
|
||||
if (buffer.size() == 0) {
|
||||
emit finished();
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
qint64 cwSidetone::writeData(const char *data, qint64 len)
|
||||
{
|
||||
Q_UNUSED(data);
|
||||
Q_UNUSED(len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
qint64 cwSidetone::bytesAvailable() const
|
||||
{
|
||||
return buffer.size() + QIODevice::bytesAvailable();
|
||||
}
|
||||
|
||||
void cwSidetone::generateMorse(QString morse)
|
||||
{
|
||||
|
||||
int dit = int(double(SIDETONE_MULTIPLIER / this->speed * SIDETONE_MULTIPLIER));
|
||||
int dah = int(double(dit * this->ratio));
|
||||
|
||||
|
||||
QMutexLocker locker(&mutex);
|
||||
for (int i=0;i<morse.size();i++)
|
||||
{
|
||||
QChar c = morse.at(i);
|
||||
if (c == '-')
|
||||
{
|
||||
buffer.append(generateData(dah,this->frequency));
|
||||
}
|
||||
else if (c == '.')
|
||||
{
|
||||
buffer.append(generateData(dit,this->frequency));
|
||||
}
|
||||
else // Space char
|
||||
{
|
||||
buffer.append(generateData(dit,0));
|
||||
}
|
||||
|
||||
if (i<morse.size()-1)
|
||||
{
|
||||
buffer.append(generateData(dit,0));
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer.append(generateData(dit*3,0)); // inter-character space
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
QByteArray cwSidetone::generateData(qint64 len, qint64 freq)
|
||||
{
|
||||
QByteArray data;
|
||||
|
||||
const int channels = format.channelCount();
|
||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
const int channelBytes = format.sampleSize() / 8;
|
||||
#else
|
||||
const int channelBytes = format.bytesPerSample();
|
||||
#endif
|
||||
|
||||
const int sampleRate = format.sampleRate();
|
||||
//qint64 length = (sampleRate * channels * channelBytes) * len / 100000;
|
||||
qint64 length = format.bytesForDuration(len);
|
||||
const int sampleBytes = channels * channelBytes;
|
||||
|
||||
length -= length % sampleBytes;
|
||||
Q_UNUSED(sampleBytes) // suppress warning in release builds
|
||||
|
||||
data.resize(length);
|
||||
unsigned char *ptr = reinterpret_cast<unsigned char *>(data.data());
|
||||
int sampleIndex = 0;
|
||||
|
||||
while (length) {
|
||||
const qreal x = (qSin(2 * M_PI * freq * qreal(sampleIndex % sampleRate) / sampleRate)) * qreal(volume/100.0);
|
||||
for (int i=0; i<channels; ++i) {
|
||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
if (format.sampleSize() == 8 && format.sampleType() == QAudioFormat::UnSignedInt)
|
||||
*reinterpret_cast<quint8 *>(ptr) = static_cast<quint8>((1.0 + x) / 2 * 255);
|
||||
else if (format.sampleSize() == 16 && format.sampleType() == QAudioFormat::SignedInt)
|
||||
*reinterpret_cast<qint16 *>(ptr) = static_cast<qint16>(x * std::numeric_limits<qint16>::max());
|
||||
else if (format.sampleSize() == 32 && format.sampleType() == QAudioFormat::SignedInt)
|
||||
*reinterpret_cast<qint32 *>(ptr) = static_cast<qint32>(x * std::numeric_limits<qint32>::max());
|
||||
else if (format.sampleType() == QAudioFormat::Float)
|
||||
*reinterpret_cast<float *>(ptr) = x;
|
||||
else
|
||||
qWarning(logCW()) << QString("Unsupported sample size: %0 type: %1").arg(format.sampleSize()).arg(format.sampleType());
|
||||
#else
|
||||
if (format.sampleFormat() == QAudioFormat::UInt8)
|
||||
*reinterpret_cast<quint8 *>(ptr) = static_cast<quint8>((1.0 + x) / 2 * 255);
|
||||
else if (format.sampleFormat() == QAudioFormat::Int16)
|
||||
*reinterpret_cast<qint16 *>(ptr) = static_cast<qint16>(x * std::numeric_limits<qint16>::max());
|
||||
else if (format.sampleFormat() == QAudioFormat::Int32)
|
||||
*reinterpret_cast<qint32 *>(ptr) = static_cast<qint32>(x * std::numeric_limits<qint32>::max());
|
||||
else if (format.sampleFormat() == QAudioFormat::Float)
|
||||
*reinterpret_cast<float *>(ptr) = x;
|
||||
else
|
||||
qWarning(logCW()) << QString("Unsupported sample format: %0").arg(format.sampleFormat());
|
||||
#endif
|
||||
|
||||
ptr += channelBytes;
|
||||
length -= channelBytes;
|
||||
}
|
||||
++sampleIndex;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void cwSidetone::setSpeed(unsigned char speed)
|
||||
{
|
||||
this->speed = (int)speed;
|
||||
}
|
||||
|
||||
void cwSidetone::setFrequency(unsigned char frequency)
|
||||
{
|
||||
this->frequency = round((((600.0 / 255.0) * frequency) + 300) / 5.0) * 5.0;
|
||||
}
|
||||
|
||||
void cwSidetone::setRatio(unsigned char ratio)
|
||||
{
|
||||
this->ratio = (double)ratio/10.0;
|
||||
}
|
||||
|
||||
void cwSidetone::setLevel(int level) {
|
||||
volume = level;
|
||||
}
|
||||
|
||||
void cwSidetone::stopSending() {
|
||||
QMutexLocker locker(&mutex);
|
||||
buffer.clear();
|
||||
emit finished();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
#ifndef CWSIDETONE_H
|
||||
#define CWSIDETONE_H
|
||||
|
||||
#include <QApplication>
|
||||
#include <QAudioOutput>
|
||||
#include <QMap>
|
||||
#include <QScopedPointer>
|
||||
#include <QtMath>
|
||||
#include <QMutex>
|
||||
#include <QMutexLocker>
|
||||
|
||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
#include <QAudioDeviceInfo>
|
||||
#include <QAudioOutput>
|
||||
#else
|
||||
#include <QAudioDevice>
|
||||
#include <QAudioSink>
|
||||
#include <QMediaDevices>
|
||||
#endif
|
||||
|
||||
//#define SIDETONE_MULTIPLIER 386.0
|
||||
#define SIDETONE_MULTIPLIER 1095.46
|
||||
|
||||
class cwSidetone : public QIODevice
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit cwSidetone(int level, int speed, int freq, double ratio, QWidget *parent = 0);
|
||||
~cwSidetone();
|
||||
|
||||
void start();
|
||||
void stop();
|
||||
|
||||
qint64 readData(char *data, qint64 maxlen) override;
|
||||
qint64 writeData(const char *data, qint64 len) override;
|
||||
qint64 bytesAvailable() const override;
|
||||
qint64 size() const override { return buffer.size(); }
|
||||
|
||||
signals:
|
||||
void finished();
|
||||
public slots:
|
||||
void send(QString text);
|
||||
void setSpeed(unsigned char speed);
|
||||
void setFrequency(unsigned char frequency);
|
||||
void setRatio(unsigned char ratio);
|
||||
void setLevel(int level);
|
||||
void stopSending();
|
||||
private:
|
||||
void init();
|
||||
|
||||
void generateMorse(QString morse);
|
||||
QByteArray generateData(qint64 len, qint64 freq);
|
||||
QByteArray buffer;
|
||||
QMap< QChar, QString> cwTable;
|
||||
QWidget* parent;
|
||||
int volume;
|
||||
int speed;
|
||||
int frequency;
|
||||
double ratio;
|
||||
QAudioFormat format;
|
||||
QMutex mutex;
|
||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
QScopedPointer<QAudioOutput> output;
|
||||
#else
|
||||
QScopedPointer<QAudioSink> output;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // CWSIDETONE_H
|
|
@ -493,7 +493,7 @@ void meter::drawScalePo(QPainter *qp)
|
|||
|
||||
// Here, P is now 60 watts:
|
||||
// Higher scale:
|
||||
i = i - (int)(10*dnPerWatt); // back one tick first. Otherwise i starts at 178.
|
||||
//i = i - (int)(10*dnPerWatt); // back one tick first. Otherwise i starts at 178. **Not used?**
|
||||
//qDebug() << "meter i: " << i;
|
||||
dnPerWatt = (213-143.0f) / 50.0f; // 1.4 dn per watt
|
||||
// P=5 here.
|
||||
|
|
|
@ -177,10 +177,12 @@ typedef union token_packet {
|
|||
union {
|
||||
struct {
|
||||
quint16 authstartid; // 0x20
|
||||
char unusedg[5]; // 0x22
|
||||
char unusedg2[2]; // 0x22
|
||||
quint16 resetcap; // 0x24
|
||||
char unusedg1; // 0x26
|
||||
quint16 commoncap; // 0x27
|
||||
char unusedh; // 0x29
|
||||
quint8 macaddress[6]; // 0x2a
|
||||
quint8 macaddress[6]; // 0x2a
|
||||
};
|
||||
quint8 guid[GUIDLEN]; // 0x20
|
||||
};
|
||||
|
@ -397,6 +399,49 @@ typedef union capabilities_packet {
|
|||
} *capabilities_packet_t;
|
||||
|
||||
|
||||
typedef union streamdeck_image_header {
|
||||
struct
|
||||
{
|
||||
quint8 cmd;
|
||||
quint8 suffix;
|
||||
quint8 button;
|
||||
quint8 isLast;
|
||||
quint16 length;
|
||||
quint16 index;
|
||||
};
|
||||
char packet[8];
|
||||
} *streamdeck_image_header_t;
|
||||
|
||||
typedef union streamdeck_v1_image_header {
|
||||
struct
|
||||
{
|
||||
quint8 cmd;
|
||||
quint8 suffix;
|
||||
quint16 index;
|
||||
quint8 isLast;
|
||||
quint8 button;
|
||||
quint8 unused[10];
|
||||
};
|
||||
char packet[16];
|
||||
} *streamdeck_v1_image_header_t;
|
||||
|
||||
typedef union streamdeck_lcd_header {
|
||||
struct
|
||||
{
|
||||
quint8 cmd;
|
||||
quint8 suffix;
|
||||
quint16 x;
|
||||
quint16 y;
|
||||
quint16 width;
|
||||
quint16 height;
|
||||
quint8 isLast;
|
||||
quint16 index;
|
||||
quint16 length;
|
||||
quint8 unused;
|
||||
};
|
||||
char packet[16];
|
||||
} *streamdeck_lcd_header_t;
|
||||
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
|
|
10
prefs.h
|
@ -2,9 +2,11 @@
|
|||
#define PREFS_H
|
||||
|
||||
#include <QString>
|
||||
|
||||
#include <QColor>
|
||||
#include <QMap>
|
||||
#include "wfviewtypes.h"
|
||||
|
||||
|
||||
struct preferences {
|
||||
// Program:
|
||||
QString version;
|
||||
|
@ -15,6 +17,7 @@ struct preferences {
|
|||
// Interface:
|
||||
bool useFullScreen;
|
||||
bool useSystemTheme;
|
||||
int wfEnable;
|
||||
bool drawPeaks;
|
||||
underlay_t underlayMode = underlayNone;
|
||||
int underlayBufferSize = 64;
|
||||
|
@ -62,8 +65,9 @@ struct preferences {
|
|||
QString clusterTcpServerName;
|
||||
QString clusterTcpUserName;
|
||||
QString clusterTcpPassword;
|
||||
int clusterTimeout; // used?
|
||||
bool clusterSkimmerSpotsEnable; // where is this used?
|
||||
int clusterTimeout;
|
||||
bool clusterSkimmerSpotsEnable;
|
||||
|
||||
};
|
||||
|
||||
#endif // PREFS_H
|
||||
|
|
|
@ -445,7 +445,7 @@ void repeaterSetup::showEvent(QShowEvent *event)
|
|||
emit getSplitModeEnabled();
|
||||
if(rig.hasRepeaterModes)
|
||||
emit getRptDuplexOffset();
|
||||
|
||||
QMainWindow::showEvent(event);
|
||||
(void)event;
|
||||
}
|
||||
|
||||
|
@ -688,6 +688,7 @@ void repeaterSetup::on_splitPlusButton_clicked()
|
|||
txfreqhz = currentMainFrequency.Hz + hzOffset;
|
||||
f.Hz = txfreqhz;
|
||||
f.VFO = inactiveVFO;
|
||||
f.MHzDouble = f.Hz/1E6;
|
||||
txString = QString::number(f.Hz / double(1E6), 'f', 6);
|
||||
ui->splitTransmitFreqEdit->setText(txString);
|
||||
usedPlusSplit = true;
|
||||
|
@ -707,6 +708,7 @@ void repeaterSetup::on_splitMinusBtn_clicked()
|
|||
txfreqhz = currentMainFrequency.Hz - hzOffset;
|
||||
f.Hz = txfreqhz;
|
||||
f.VFO = inactiveVFO;
|
||||
f.MHzDouble = f.Hz/1E6;
|
||||
txString = QString::number(f.Hz / double(1E6), 'f', 6);
|
||||
ui->splitTransmitFreqEdit->setText(txString);
|
||||
usedPlusSplit = false;
|
||||
|
@ -723,6 +725,7 @@ void repeaterSetup::on_splitTxFreqSetBtn_clicked()
|
|||
{
|
||||
f.Hz = fHz;
|
||||
f.VFO = inactiveVFO;
|
||||
f.MHzDouble = f.Hz/1E6;
|
||||
emit setTransmitFrequency(f);
|
||||
emit setTransmitMode(modeTransmitVFO);
|
||||
}
|
||||
|
@ -812,6 +815,8 @@ void repeaterSetup::on_rptrOffsetSetBtn_clicked()
|
|||
{
|
||||
freqt f;
|
||||
f.Hz = getFreqHzFromMHzString(ui->rptrOffsetEdit->text());
|
||||
f.MHzDouble = f.Hz/1E6;
|
||||
f.VFO=activeVFO;
|
||||
if(f.Hz != 0)
|
||||
{
|
||||
emit setRptDuplexOffset(f);
|
||||
|
|
|
@ -710,7 +710,7 @@ static int update_filter(SpeexResamplerState* st)
|
|||
/* Adding buffer_size to filt_len won't overflow here because filt_len
|
||||
could be multiplied by sizeof(spx_word16_t) above. */
|
||||
min_alloc_size = st->filt_len - 1 + st->buffer_size;
|
||||
if (min_alloc_size > st->mem_alloc_size)
|
||||
if (min_alloc_size > st->mem_alloc_size && st->nb_channels>0)
|
||||
{
|
||||
spx_word16_t* mem;
|
||||
if (INT_MAX / sizeof(spx_word16_t) / st->nb_channels < min_alloc_size)
|
||||
|
|
Po Szerokość: | Wysokość: | Rozmiar: 321 KiB |
|
@ -1,10 +1,11 @@
|
|||
#!/bin/bash
|
||||
echo "This script copies the following items into your system:"
|
||||
echo ""
|
||||
echo "icon: wfview.png to /usr/share/pixmaps/"
|
||||
echo "icon: unix_icons/wfview.png to /usr/share/icons/hicolor/256x256/apps/"
|
||||
echo "wfview application to /usr/local/bin/"
|
||||
echo "wfview.desktop to /usr/share/applications/"
|
||||
echo "qdarkstyle stylesheet to /usr/share/wfview/stylesheets"
|
||||
echo "org.wfview.wfview.metainfo.xml metadata file to /usr/share/metainfo/"
|
||||
echo "qdarkstyle stylesheet to /usr/share/wfview/stylesheets/"
|
||||
|
||||
echo ""
|
||||
echo "This script MUST be run from the build directory. Do not run it from the source directory!"
|
||||
|
@ -30,7 +31,8 @@ echo ""
|
|||
|
||||
cp wfview /usr/local/bin/wfview
|
||||
cp wfview.desktop /usr/share/applications/
|
||||
cp wfview.png /usr/share/pixmaps/
|
||||
cp unix_icons/wfview.png /usr/share/icons/hicolor/256x256/apps/
|
||||
cp org.wfview.wfview.metainfo.xml /usr/share/metainfo/
|
||||
mkdir -p /usr/share/wfview/stylesheets
|
||||
cp -r qdarkstyle /usr/share/wfview/stylesheets/
|
||||
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<component type="desktop-application">
|
||||
<id>org.wfview.wfview</id>
|
||||
<launchable type="desktop-id">wfview.desktop</launchable>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-3.0-or-later</project_license>
|
||||
<name>wfview</name>
|
||||
<developer_name>Elliott H. Liggett</developer_name>
|
||||
<summary>Open Source interface for Icom transceivers</summary>
|
||||
<description>
|
||||
<p>
|
||||
wfview is a program developed by amateur radio enthusiasts to control modern Icom ham radios. It provides the user with controls
|
||||
that may be comfortably operated from a keyboard, mouse, or touch screen interface. wfview is free and open source software.
|
||||
</p>
|
||||
<p>
|
||||
wfview has been developed with an eye towards compatibility. Even though our target platform consists of modern-era transceivers,
|
||||
wfview’s command dictionary is focused on commands with the most compatibility. Many of Icom’s transceivers from the last 20 years
|
||||
will work to some degree with wfview, and we are always adding more.
|
||||
</p>
|
||||
</description>
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image type="source">https://wfview.org/wp-content/uploads/2021/11/7300-remote-screenshot.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<url type="homepage">https://wfview.org</url>
|
||||
<url type="bugtracker">https://gitlab.com/eliggett/wfview/-/issues</url>
|
||||
<content_rating type="oars-1.1"/>
|
||||
</component>
|
Po Szerokość: | Wysokość: | Rozmiar: 113 KiB |
|
@ -4,6 +4,13 @@
|
|||
<file>shuttlexpress.png</file>
|
||||
<file>shuttlepro.png</file>
|
||||
<file>rc28.png</file>
|
||||
<file>ecoder.png</file>
|
||||
<file>quickkeys.png</file>
|
||||
<file>xbox.png</file>
|
||||
<file>streamdeck.png</file>
|
||||
<file>streamdeckmini.png</file>
|
||||
<file>streamdeckxl.png</file>
|
||||
<file>streamdeckpedal.png</file>
|
||||
<file>streamdeckplus.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
Po Szerokość: | Wysokość: | Rozmiar: 179 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 331 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 396 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 217 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 412 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 53 KiB |
|
@ -18,5 +18,7 @@
|
|||
<true/>
|
||||
<key>com.apple.security.network.server</key>
|
||||
<true/>
|
||||
<key>com.apple.security.device.usb</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
271
rigcommander.cpp
|
@ -872,6 +872,18 @@ void rigCommander::setDataMode(bool dataOn, unsigned char filter)
|
|||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::getFrequency(unsigned char vfo)
|
||||
{
|
||||
if (rigCaps.hasVFOAB || rigCaps.hasVFOMS)
|
||||
{
|
||||
QByteArray payload("\x25");
|
||||
payload.append(vfo);
|
||||
prepDataAndSend(payload);
|
||||
} else {
|
||||
getFrequency();
|
||||
}
|
||||
}
|
||||
|
||||
void rigCommander::getFrequency()
|
||||
{
|
||||
// figure out frequency and then respond with haveFrequency();
|
||||
|
@ -1014,6 +1026,72 @@ void rigCommander::setCwPitch(unsigned char pitch)
|
|||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::getDashRatio()
|
||||
{
|
||||
QByteArray payload;
|
||||
switch (rigCaps.model)
|
||||
{
|
||||
case model705:
|
||||
payload.setRawData("\x1A\x05\x02\x52", 4);
|
||||
break;
|
||||
case model9700:
|
||||
payload.setRawData("\x1A\x05\x02\x24", 4);
|
||||
break;
|
||||
case model7100:
|
||||
payload.setRawData("\x1A\x05\x01\x35", 4);
|
||||
break;
|
||||
case model7300:
|
||||
payload.setRawData("\x1A\x05\x01\x61", 4);
|
||||
break;
|
||||
case model7610:
|
||||
payload.setRawData("\x1A\x05\x02\x28", 4);
|
||||
break;
|
||||
case model7700:
|
||||
payload.setRawData("\x1A\x05\x01\x34", 4);
|
||||
break;
|
||||
case model7850:
|
||||
payload.setRawData("\x1A\x05\x02\x51", 4);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::setDashRatio(unsigned char ratio)
|
||||
{
|
||||
QByteArray payload;
|
||||
switch (rigCaps.model)
|
||||
{
|
||||
case model705:
|
||||
payload.setRawData("\x1A\x05\x02\x52", 4);
|
||||
break;
|
||||
case model9700:
|
||||
payload.setRawData("\x1A\x05\x02\x24", 4);
|
||||
break;
|
||||
case model7100:
|
||||
payload.setRawData("\x1A\x05\x01\x35", 4);
|
||||
break;
|
||||
case model7300:
|
||||
payload.setRawData("\x1A\x05\x01\x61", 4);
|
||||
break;
|
||||
case model7610:
|
||||
payload.setRawData("\x1A\x05\x02\x28", 4);
|
||||
break;
|
||||
case model7700:
|
||||
payload.setRawData("\x1A\x05\x01\x34", 4);
|
||||
break;
|
||||
case model7850:
|
||||
payload.setRawData("\x1A\x05\x02\x51", 4);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
payload.append(bcdEncodeInt(ratio).at(1)); // Discard first byte
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::getPskTone()
|
||||
{
|
||||
QByteArray payload;
|
||||
|
@ -1609,11 +1687,9 @@ void rigCommander::parseCommand()
|
|||
parseFrequency();
|
||||
break;
|
||||
case '\x25':
|
||||
if((int)payloadIn[1] == 0)
|
||||
{
|
||||
emit haveFrequency(parseFrequency(payloadIn, 5));
|
||||
}
|
||||
break;
|
||||
// Parse both VFOs
|
||||
emit haveFrequency(parseFrequency(payloadIn, 5));
|
||||
break;
|
||||
case '\x01':
|
||||
//qInfo(logRig()) << "Have mode data";
|
||||
this->parseMode();
|
||||
|
@ -1778,6 +1854,11 @@ void rigCommander::parseLevels()
|
|||
emit haveTPBFOuter(level);
|
||||
state.set(PBTOUT, level, false);
|
||||
break;
|
||||
case '\x06':
|
||||
// NR Level
|
||||
emit haveNRLevel(level);
|
||||
state.set(NR, level, false);
|
||||
break;
|
||||
case '\x09':
|
||||
// CW Pitch
|
||||
emit haveCwPitch(level);
|
||||
|
@ -1796,7 +1877,7 @@ void rigCommander::parseLevels()
|
|||
case '\x0C':
|
||||
state.set(KEYSPD, level, false);
|
||||
//qInfo(logRig()) << "Have received key speed in RC, raw level: " << level << ", WPM: " << (level/6.071)+6 << ", rounded: " << round((level/6.071)+6);
|
||||
emit haveKeySpeed(round((level/6.071)+6));
|
||||
emit haveKeySpeed(round((level / 6.071) + 6));
|
||||
break;
|
||||
case '\x0D':
|
||||
// Notch filder setting - ignore for now
|
||||
|
@ -1808,12 +1889,12 @@ void rigCommander::parseLevels()
|
|||
state.set(COMPLEVEL, level, false);
|
||||
break;
|
||||
case '\x12':
|
||||
// NB level - ignore for now
|
||||
emit haveNB((bool)level);
|
||||
state.set(NB, level, false);
|
||||
break;
|
||||
case '\x15':
|
||||
// monitor level
|
||||
emit haveMonitorLevel(level);
|
||||
emit haveMonitorGain(level);
|
||||
state.set(MONITORLEVEL, level, false);
|
||||
break;
|
||||
case '\x16':
|
||||
|
@ -2333,9 +2414,9 @@ void rigCommander::setCompLevel(unsigned char compLevel)
|
|||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::setMonitorLevel(unsigned char monitorLevel)
|
||||
void rigCommander::setMonitorGain(unsigned char monitorLevel)
|
||||
{
|
||||
QByteArray payload("\x14\x0E");
|
||||
QByteArray payload("\x14\x15");
|
||||
payload.append(bcdEncodeInt(monitorLevel));
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
@ -2354,6 +2435,22 @@ void rigCommander::setAntiVoxGain(unsigned char gain)
|
|||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::setNBLevel(unsigned char level)
|
||||
{
|
||||
if (rigCaps.hasNB) {
|
||||
QByteArray payload(rigCaps.nbCommand);
|
||||
payload.append(bcdEncodeInt(level));
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
}
|
||||
|
||||
void rigCommander::setNRLevel(unsigned char level)
|
||||
{
|
||||
QByteArray payload("\x14\x06");
|
||||
payload.append(bcdEncodeInt(level));
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
|
||||
void rigCommander::getRfGain()
|
||||
{
|
||||
|
@ -2363,8 +2460,13 @@ void rigCommander::getRfGain()
|
|||
|
||||
void rigCommander::getAfGain()
|
||||
{
|
||||
QByteArray payload("\x14\x01");
|
||||
prepDataAndSend(payload);
|
||||
if (udp == Q_NULLPTR) {
|
||||
QByteArray payload("\x14\x01");
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
else {
|
||||
emit haveAfGain(localVolume);
|
||||
}
|
||||
}
|
||||
|
||||
void rigCommander::getIFShift()
|
||||
|
@ -2409,7 +2511,7 @@ void rigCommander::getCompLevel()
|
|||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::getMonitorLevel()
|
||||
void rigCommander::getMonitorGain()
|
||||
{
|
||||
QByteArray payload("\x14\x15");
|
||||
prepDataAndSend(payload);
|
||||
|
@ -2427,6 +2529,19 @@ void rigCommander::getAntiVoxGain()
|
|||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::getNBLevel()
|
||||
{
|
||||
if (rigCaps.hasNB) {
|
||||
prepDataAndSend(rigCaps.nbCommand);
|
||||
}
|
||||
}
|
||||
|
||||
void rigCommander::getNRLevel()
|
||||
{
|
||||
QByteArray payload("\x14\x06");
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::getLevels()
|
||||
{
|
||||
// Function to grab all levels
|
||||
|
@ -2436,7 +2551,7 @@ void rigCommander::getLevels()
|
|||
getTxLevel(); // 0x0A
|
||||
getMicGain(); // 0x0B
|
||||
getCompLevel(); // 0x0E
|
||||
// getMonitorLevel(); // 0x15
|
||||
// getMonitorGain(); // 0x15
|
||||
// getVoxGain(); // 0x16
|
||||
// getAntiVoxGain(); // 0x17
|
||||
}
|
||||
|
@ -2960,9 +3075,11 @@ void rigCommander::parseRegister16()
|
|||
state.set(PREAMP, (quint8)payloadIn.at(2), false);
|
||||
break;
|
||||
case '\x22':
|
||||
emit haveNB(payloadIn.at(2) != 0);
|
||||
state.set(NBFUNC, payloadIn.at(2) != 0, false);
|
||||
break;
|
||||
case '\x40':
|
||||
emit haveNR(payloadIn.at(2) != 0);
|
||||
state.set(NRFUNC, payloadIn.at(2) != 0, false);
|
||||
break;
|
||||
case '\x41': // Auto notch
|
||||
|
@ -2989,12 +3106,15 @@ void rigCommander::parseRegister16()
|
|||
emit haveRptAccessMode(ra);
|
||||
break;
|
||||
case '\x44':
|
||||
emit haveComp(payloadIn.at(2) != 0);
|
||||
state.set(COMPFUNC, payloadIn.at(2) != 0, false);
|
||||
break;
|
||||
case '\x45':
|
||||
emit haveMonitor(payloadIn.at(2) != 0);
|
||||
state.set(MONFUNC, payloadIn.at(2) != 0, false);
|
||||
break;
|
||||
case '\x46':
|
||||
emit haveVox(payloadIn.at(2) != 0);
|
||||
state.set(VOXFUNC, payloadIn.at(2) != 0, false);
|
||||
break;
|
||||
case '\x47':
|
||||
|
@ -3038,6 +3158,10 @@ void rigCommander::parseBandStackReg()
|
|||
freqt freqs = parseFrequency(payloadIn, 7);
|
||||
//float freq = (float)freqs.MHzDouble;
|
||||
|
||||
// The Band Stacking command returns the regCode in the position that VFO is expected.
|
||||
// As BSR is always on the active VFO, just set that.
|
||||
freqs.VFO = selVFO_t::activeVFO;
|
||||
|
||||
bool dataOn = (payloadIn[11] & 0x10) >> 4; // not sure...
|
||||
char mode = payloadIn[9];
|
||||
char filter = payloadIn[10];
|
||||
|
@ -3198,6 +3322,8 @@ void rigCommander::parseDetailedRegisters1A05()
|
|||
case 90:
|
||||
emit haveLANGain(level);
|
||||
break;
|
||||
case 228:
|
||||
emit haveDashRatio(inputRaw);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -3416,6 +3542,10 @@ void rigCommander::determineRigCaps()
|
|||
bandType bandDef4m = bandType(band4m, 70000000, 70500000, modeUSB);
|
||||
bandType bandDef70cm = bandType(band70cm, 420000000, 450000000, modeUSB);
|
||||
bandType bandDef23cm = bandType(band23cm, 1240000000, 1400000000, modeUSB);
|
||||
bandType bandDef13cm = bandType(band13cm, 2300000000, 2450000000, modeUSB);
|
||||
//bandType bandDef9cm = bandType(band9cm, 3300000000, 3500000000, modeUSB);
|
||||
bandType bandDef6cm = bandType(band6cm, 5650000000, 5925000000, modeUSB);
|
||||
bandType bandDef3cm = bandType(band3cm, 10000000000, 10500000000, modeUSB);
|
||||
|
||||
bandType bandDefAir(bandAir, 108000000, 137000000, modeAM);
|
||||
bandType bandDefWFM(bandWFM, 88000000, 108000000, modeWFM);
|
||||
|
@ -3611,6 +3741,55 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.hasQuickSplitCommand = true;
|
||||
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x43");
|
||||
break;
|
||||
case model905:
|
||||
rigCaps.modelName = QString("IC-905");
|
||||
rigCaps.rigctlModel = 0;
|
||||
rigCaps.hasSpectrum = true;
|
||||
rigCaps.spectSeqMax = 11;
|
||||
rigCaps.spectAmpMax = 160;
|
||||
rigCaps.spectLenMax = 475;
|
||||
rigCaps.inputs.append(inputLAN);
|
||||
rigCaps.inputs.append(inputUSB);
|
||||
rigCaps.hasLan = true;
|
||||
rigCaps.hasEthernet = true;
|
||||
rigCaps.hasWiFi = false;
|
||||
rigCaps.hasDD = true;
|
||||
rigCaps.hasDV = true;
|
||||
rigCaps.hasCTCSS = true;
|
||||
rigCaps.hasDTCS = true;
|
||||
rigCaps.hasRepeaterModes = true;
|
||||
rigCaps.hasTBPF = true;
|
||||
rigCaps.attenuators.push_back('\x10');
|
||||
rigCaps.preamps.push_back('\x01');
|
||||
rigCaps.bands = standardVU;
|
||||
rigCaps.bands.push_back(bandDef23cm);
|
||||
rigCaps.bands.push_back(bandDef13cm);
|
||||
rigCaps.bands.push_back(bandDef6cm);
|
||||
rigCaps.bands.push_back(bandDef3cm);
|
||||
rigCaps.bsr[band2m] = 0x01;
|
||||
rigCaps.bsr[band70cm] = 0x02;
|
||||
rigCaps.bsr[band23cm] = 0x03;
|
||||
rigCaps.bsr[band13cm] = 0x04;
|
||||
rigCaps.bsr[band6cm] = 0x05;
|
||||
rigCaps.bsr[band3cm] = 0x06;
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV"),
|
||||
createMode(modeDD, 0x22, "DD"),
|
||||
createMode(modeATV, 0x23, "ATV")
|
||||
});
|
||||
|
||||
rigCaps.scopeCenterSpans.insert(rigCaps.scopeCenterSpans.end(), {createScopeCenter(cs1M, "±1M"),
|
||||
createScopeCenter(cs2p5M, "±2.5M"),
|
||||
createScopeCenter(cs5M, "±5M"),
|
||||
createScopeCenter(cs10M, "±10M"),
|
||||
createScopeCenter(cs25M, "±25M")});
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x42");
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
rigCaps.hasAdvancedRptrToneCmds = true;
|
||||
rigCaps.hasQuickSplitCommand = true;
|
||||
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x46");
|
||||
break;
|
||||
case model910h:
|
||||
rigCaps.modelName = QString("IC-910H");
|
||||
rigCaps.rigctlModel = 3044;
|
||||
|
@ -4523,6 +4702,7 @@ void rigCommander::parseFrequency()
|
|||
// payloadIn[01] = ; // . XX KHz
|
||||
|
||||
// printHex(payloadIn, false, true);
|
||||
|
||||
frequencyMhz = 0.0;
|
||||
if (payloadIn.length() == 7)
|
||||
{
|
||||
|
@ -4593,6 +4773,8 @@ freqt rigCommander::parseFrequencyRptOffset(QByteArray data)
|
|||
f.Hz += (data[1] & 0x0f) * 100; // 100 Hz
|
||||
f.Hz += ((data[1] & 0xf0) >> 4) * 1000; // 1 KHz
|
||||
|
||||
f.MHzDouble=f.Hz/1E6;
|
||||
f.VFO = activeVFO;
|
||||
return f;
|
||||
}
|
||||
|
||||
|
@ -4612,40 +4794,25 @@ freqt rigCommander::parseFrequency(QByteArray data, unsigned char lastPosition)
|
|||
// NOTE: This function was written on the IC-7300, which has no need for 100 MHz and 1 GHz.
|
||||
// Therefore, this function has to go to position +1 to retrieve those numbers for the IC-9700.
|
||||
|
||||
// TODO: 64-bit value is incorrect, multiplying by wrong numbers.
|
||||
|
||||
float freq = 0.0;
|
||||
|
||||
freqt freqs;
|
||||
freqs.MHzDouble = 0;
|
||||
freqs.Hz = 0;
|
||||
|
||||
// MHz:
|
||||
freq += 100*(data[lastPosition+1] & 0x0f);
|
||||
freq += (1000*((data[lastPosition+1] & 0xf0) >> 4));
|
||||
|
||||
freq += data[lastPosition] & 0x0f;
|
||||
freq += 10*((data[lastPosition] & 0xf0) >> 4);
|
||||
|
||||
freqs.Hz += (data[lastPosition] & 0x0f) * 1E6;
|
||||
freqs.Hz += ((data[lastPosition] & 0xf0) >> 4) * 1E6 * 10; // 10 MHz
|
||||
|
||||
// Does Frequency contain 100 MHz/1 GHz data?
|
||||
if(data.length() >= lastPosition+1)
|
||||
{
|
||||
freqs.Hz += (data[lastPosition+1] & 0x0f) * 1E6 * 100; // 100 MHz
|
||||
freqs.Hz += ((data[lastPosition+1] & 0xf0) >> 4) * 1E6 * 1000; // 1000 MHz
|
||||
}
|
||||
|
||||
// Does Frequency contain VFO data? (\x25 command)
|
||||
if (lastPosition-4 >= 0 && (quint8)data[lastPosition-4] < 0x02)
|
||||
{
|
||||
freqs.VFO=(selVFO_t)(quint8)data[lastPosition-4];
|
||||
}
|
||||
|
||||
// Hz:
|
||||
freq += ((data[lastPosition-1] & 0xf0) >>4)/10.0 ;
|
||||
freq += (data[lastPosition-1] & 0x0f) / 100.0;
|
||||
|
||||
freq += ((data[lastPosition-2] & 0xf0) >> 4) / 1000.0;
|
||||
freq += (data[lastPosition-2] & 0x0f) / 10000.0;
|
||||
|
||||
freq += ((data[lastPosition-3] & 0xf0) >> 4) / 100000.0;
|
||||
freq += (data[lastPosition-3] & 0x0f) / 1000000.0;
|
||||
freqs.Hz += (data[lastPosition] & 0x0f) * 1E6;
|
||||
freqs.Hz += ((data[lastPosition] & 0xf0) >> 4) * 1E6 * 10; // 10 MHz
|
||||
|
||||
freqs.Hz += (data[lastPosition-1] & 0x0f) * 10E3; // 10 KHz
|
||||
freqs.Hz += ((data[lastPosition-1] & 0xf0) >> 4) * 100E3; // 100 KHz
|
||||
|
@ -4826,26 +4993,26 @@ void rigCommander::setAntenna(unsigned char ant, bool rx)
|
|||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::setNb(bool enabled) {
|
||||
void rigCommander::setNB(bool enabled) {
|
||||
QByteArray payload("\x16\x22");
|
||||
payload.append((unsigned char)enabled);
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::getNb()
|
||||
void rigCommander::getNB()
|
||||
{
|
||||
QByteArray payload;
|
||||
payload.setRawData("\x16\x22", 2);
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::setNr(bool enabled) {
|
||||
void rigCommander::setNR(bool enabled) {
|
||||
QByteArray payload("\x16\x40");
|
||||
payload.append((unsigned char)enabled);
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::getNr()
|
||||
void rigCommander::getNR()
|
||||
{
|
||||
QByteArray payload;
|
||||
payload.setRawData("\x16\x40", 2);
|
||||
|
@ -5221,9 +5388,9 @@ void rigCommander::stateUpdated()
|
|||
break;
|
||||
case MONITORLEVEL:
|
||||
if (i.value()._valid) {
|
||||
setMonitorLevel(state.getChar(MONITORLEVEL));
|
||||
setMonitorGain(state.getChar(MONITORLEVEL));
|
||||
}
|
||||
getMonitorLevel();
|
||||
getMonitorGain();
|
||||
break;
|
||||
case VOXGAIN:
|
||||
if (i.value()._valid) {
|
||||
|
@ -5239,15 +5406,15 @@ void rigCommander::stateUpdated()
|
|||
break;
|
||||
case NBFUNC:
|
||||
if (i.value()._valid) {
|
||||
setNb(state.getBool(NBFUNC));
|
||||
setNB(state.getBool(NBFUNC));
|
||||
}
|
||||
getNb();
|
||||
getNB();
|
||||
break;
|
||||
case NRFUNC:
|
||||
if (i.value()._valid) {
|
||||
setNr(state.getBool(NRFUNC));
|
||||
setNR(state.getBool(NRFUNC));
|
||||
}
|
||||
getNr();
|
||||
getNR();
|
||||
break;
|
||||
case ANFFUNC:
|
||||
if (i.value()._valid) {
|
||||
|
@ -5467,6 +5634,16 @@ void rigCommander::stateUpdated()
|
|||
}
|
||||
getDialLock();
|
||||
break;
|
||||
|
||||
case ANN:
|
||||
case APO:
|
||||
case BACKLIGHT:
|
||||
case BEEP:
|
||||
case TIME:
|
||||
case BAT:
|
||||
case KEYLIGHT:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
++i;
|
||||
|
|
|
@ -70,6 +70,7 @@ public slots:
|
|||
|
||||
// Frequency, Mode, BSR:
|
||||
void setFrequency(unsigned char vfo, freqt freq);
|
||||
void getFrequency(unsigned char vfo);
|
||||
void getFrequency();
|
||||
void selectVFO(vfo_t vfo);
|
||||
void equalizeVFOsAB();
|
||||
|
@ -103,10 +104,10 @@ public slots:
|
|||
void setAttenuator(unsigned char att);
|
||||
void setPreamp(unsigned char pre);
|
||||
void setAntenna(unsigned char ant, bool rx);
|
||||
void setNb(bool enabled);
|
||||
void getNb();
|
||||
void setNr(bool enabled);
|
||||
void getNr();
|
||||
void setNB(bool enabled);
|
||||
void getNB();
|
||||
void setNR(bool enabled);
|
||||
void getNR();
|
||||
void setAutoNotch(bool enabled);
|
||||
void getAutoNotch();
|
||||
void setToneEnabled(bool enabled);
|
||||
|
@ -127,8 +128,11 @@ public slots:
|
|||
void getManualNotch();
|
||||
|
||||
void getPassband();
|
||||
void getCwPitch();
|
||||
void getNBLevel();
|
||||
void getNRLevel(); void getCwPitch();
|
||||
void setCwPitch(unsigned char pitch);
|
||||
void getDashRatio();
|
||||
void setDashRatio(unsigned char ratio);
|
||||
void getPskTone();
|
||||
void setPskTone(unsigned char tone);
|
||||
void getRttyMark();
|
||||
|
@ -164,7 +168,7 @@ public slots:
|
|||
void getTxLevel();
|
||||
void getMicGain();
|
||||
void getCompLevel();
|
||||
void getMonitorLevel();
|
||||
void getMonitorGain();
|
||||
void getVoxGain();
|
||||
void getAntiVoxGain();
|
||||
void getUSBGain();
|
||||
|
@ -190,13 +194,15 @@ public slots:
|
|||
void setACCGain(unsigned char gain);
|
||||
void setACCGain(unsigned char gain, unsigned char ab);
|
||||
void setCompLevel(unsigned char compLevel);
|
||||
void setMonitorLevel(unsigned char monitorLevel);
|
||||
void setMonitorGain(unsigned char monitorLevel);
|
||||
void setVoxGain(unsigned char gain);
|
||||
void setAntiVoxGain(unsigned char gain);
|
||||
void setModInput(rigInput input, bool dataOn);
|
||||
void setModInputLevel(rigInput input, unsigned char level);
|
||||
void setAfMute(bool muteOn);
|
||||
void setDialLock(bool lockOn);
|
||||
void setNBLevel(unsigned char level);
|
||||
void setNRLevel(unsigned char level);
|
||||
|
||||
// NB, NR, IP+:
|
||||
void setIPP(bool enabled);
|
||||
|
@ -328,9 +334,16 @@ signals:
|
|||
void haveTxPower(unsigned char level);
|
||||
void haveMicGain(unsigned char level);
|
||||
void haveCompLevel(unsigned char level);
|
||||
void haveMonitorLevel(unsigned char level);
|
||||
void haveMonitorGain(unsigned char level);
|
||||
void haveVoxGain(unsigned char gain);
|
||||
void haveAntiVoxGain(unsigned char gain);
|
||||
void haveNBLevel(unsigned char level);
|
||||
void haveNRLevel(unsigned char level);
|
||||
void haveVox(bool en);
|
||||
void haveMonitor(bool en);
|
||||
void haveComp(bool en);
|
||||
void haveNB(bool en);
|
||||
void haveNR(bool en);
|
||||
|
||||
// Modulation source and gain:
|
||||
void haveModInput(rigInput input, bool isData);
|
||||
|
@ -363,6 +376,7 @@ signals:
|
|||
// CW:
|
||||
void haveKeySpeed(unsigned char wpm);
|
||||
void haveCWBreakMode(unsigned char bmode);
|
||||
void haveDashRatio(unsigned char ratio);
|
||||
|
||||
|
||||
// Rig State
|
||||
|
|
1708
rigctld.cpp
|
@ -360,7 +360,7 @@ signals:
|
|||
void setMicGain(quint8);
|
||||
void setCompLevel(quint8);
|
||||
void setTxPower(quint8);
|
||||
void setMonitorLevel(quint8);
|
||||
void setMonitorGain(quint8);
|
||||
void setVoxGain(quint8);
|
||||
void setAntiVoxGain(quint8);
|
||||
void setSpectrumRefLevel(int);
|
||||
|
@ -403,6 +403,9 @@ private:
|
|||
rigstate* rigState = Q_NULLPTR;
|
||||
rigCtlD* parent;
|
||||
bool chkVfoEecuted=false;
|
||||
unsigned long crcTable[256];
|
||||
unsigned long doCrc(unsigned char* p, size_t n);
|
||||
void genCrc(unsigned long crcTable[]);
|
||||
QString getMode(quint8 mode, bool datamode);
|
||||
quint8 getMode(QString modeString);
|
||||
QString getFilter(quint8 mode, quint8 filter);
|
||||
|
@ -410,6 +413,9 @@ private:
|
|||
quint64 getRadioModes(QString mode = "");
|
||||
QString getAntName(quint8 ant);
|
||||
quint8 antFromName(QString name);
|
||||
quint8 vfoFromName(QString vfo);
|
||||
QString getVfoName(quint8 vfo);
|
||||
|
||||
int getCalibratedValue(quint8 meter,cal_table_t cal);
|
||||
};
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@ enum model_kind {
|
|||
model756pro = 0x5C,
|
||||
model756proii = 0x64,
|
||||
model756proiii = 0x6E,
|
||||
model905 = 0xAC,
|
||||
model910h = 0x60,
|
||||
model9100 = 0x7C,
|
||||
modelUnknown = 0xFF
|
||||
|
@ -55,7 +56,12 @@ enum rigInput{ inputMic=0,
|
|||
inputUnknown=0xff
|
||||
};
|
||||
|
||||
enum availableBands { band23cm=0,
|
||||
enum availableBands {
|
||||
band3cm = 0,
|
||||
band6cm,
|
||||
band9cm,
|
||||
band13cm,
|
||||
band23cm,
|
||||
band70cm,
|
||||
band2m,
|
||||
bandAir,
|
||||
|
@ -87,7 +93,10 @@ enum centerSpansType {
|
|||
cs250k = 6,
|
||||
cs500k = 7,
|
||||
cs1M = 8,
|
||||
cs2p5M = 9
|
||||
cs2p5M = 9,
|
||||
cs5M = 10,
|
||||
cs10M = 11,
|
||||
cs25M = 12,
|
||||
};
|
||||
|
||||
struct centerSpanData {
|
||||
|
@ -96,14 +105,14 @@ struct centerSpanData {
|
|||
};
|
||||
|
||||
struct bandType {
|
||||
bandType(availableBands band, quint32 lowFreq, quint32 highFreq, mode_kind defaultMode) :
|
||||
bandType(availableBands band, quint64 lowFreq, quint64 highFreq, mode_kind defaultMode) :
|
||||
band(band), lowFreq(lowFreq), highFreq(highFreq), defaultMode(defaultMode) {}
|
||||
|
||||
bandType() {}
|
||||
|
||||
availableBands band;
|
||||
quint32 lowFreq;
|
||||
quint32 highFreq;
|
||||
quint64 lowFreq;
|
||||
quint64 highFreq;
|
||||
mode_kind defaultMode;
|
||||
};
|
||||
|
||||
|
@ -128,6 +137,9 @@ struct rigCapabilities {
|
|||
quint16 spectAmpMax;
|
||||
quint16 spectLenMax;
|
||||
|
||||
bool hasNB = false;
|
||||
QByteArray nbCommand;
|
||||
|
||||
bool hasDD;
|
||||
bool hasDV;
|
||||
bool hasATU;
|
||||
|
@ -161,7 +173,7 @@ struct rigCapabilities {
|
|||
std::vector <unsigned char> antennas;
|
||||
std::vector <centerSpanData> scopeCenterSpans;
|
||||
std::vector <bandType> bands;
|
||||
unsigned char bsr[20] = {0};
|
||||
unsigned char bsr[24] = {0};
|
||||
|
||||
std::vector <mode_info> modes;
|
||||
|
||||
|
|
|
@ -16,7 +16,8 @@ enum stateTypes { VFOAFREQ, VFOBFREQ, CURRENTVFO, PTT, MODE, FILTER, PASSBAND, D
|
|||
PREAMP, AGC, ATTENUATOR, MODINPUT, AFGAIN, RFGAIN, SQUELCH, RFPOWER, MICGAIN, COMPLEVEL, MONITORLEVEL, BAL, KEYSPD,
|
||||
VOXGAIN, ANTIVOXGAIN, CWPITCH, NOTCHF, IF, PBTIN, PBTOUT, APF, NR, NB, NBDEPTH, NBWIDTH, RIGINPUT, POWERONOFF, RITVALUE,
|
||||
FAGCFUNC, NBFUNC, COMPFUNC, VOXFUNC, TONEFUNC, TSQLFUNC, SBKINFUNC, FBKINFUNC, ANFFUNC, NRFUNC, AIPFUNC, APFFUNC, MONFUNC, MNFUNC,RFFUNC,
|
||||
AROFUNC, MUTEFUNC, VSCFUNC, REVFUNC, SQLFUNC, ABMFUNC, BCFUNC, MBCFUNC, RITFUNC, AFCFUNC, SATMODEFUNC, SCOPEFUNC,
|
||||
AROFUNC, MUTEFUNC, VSCFUNC, REVFUNC, SQLFUNC, ABMFUNC, BCFUNC, MBCFUNC, RITFUNC, AFCFUNC, SATMODEFUNC, SCOPEFUNC,
|
||||
ANN, APO, BACKLIGHT, BEEP, TIME, BAT, KEYLIGHT,
|
||||
RESUMEFUNC, TBURSTFUNC, TUNERFUNC, LOCKFUNC, SMETER, POWERMETER, SWRMETER, ALCMETER, COMPMETER, VOLTAGEMETER, CURRENTMETER,
|
||||
};
|
||||
|
||||
|
|
|
@ -440,6 +440,7 @@ void servermain::setDefPrefs()
|
|||
udpDefPrefs.username = QString("");
|
||||
udpDefPrefs.password = QString("");
|
||||
udpDefPrefs.clientName = QHostInfo::localHostName();
|
||||
|
||||
}
|
||||
|
||||
void servermain::loadSettings()
|
||||
|
|
|
@ -683,6 +683,7 @@ void udpHandler::sendToken(uint8_t magic)
|
|||
p.requestreply = 0x01;
|
||||
p.innerseq = qToBigEndian(authSeq++);
|
||||
p.tokrequest = tokRequest;
|
||||
p.resetcap = qToBigEndian((quint16)0x0798);
|
||||
p.token = token;
|
||||
|
||||
sendTrackedPacket(QByteArray::fromRawData((const char *)p.packet, sizeof(p)));
|
||||
|
|
|
@ -382,31 +382,32 @@ void udpServer::controlReceived()
|
|||
qCritical(logAudio()) << "Unsupported Transmit Audio Handler selected!";
|
||||
}
|
||||
|
||||
//radio->txaudio = new audioHandler();
|
||||
radio->txAudioThread = new QThread(this);
|
||||
radio->txAudioThread->setObjectName("txAudio()");
|
||||
|
||||
if (radio->txaudio != Q_NULLPTR) {
|
||||
radio->txAudioThread = new QThread(this);
|
||||
radio->txAudioThread->setObjectName("txAudio()");
|
||||
|
||||
|
||||
radio->txaudio->moveToThread(radio->txAudioThread);
|
||||
radio->txaudio->moveToThread(radio->txAudioThread);
|
||||
|
||||
radio->txAudioThread->start(QThread::TimeCriticalPriority);
|
||||
radio->txAudioThread->start(QThread::TimeCriticalPriority);
|
||||
|
||||
connect(this, SIGNAL(setupTxAudio(audioSetup)), radio->txaudio, SLOT(init(audioSetup)));
|
||||
connect(radio->txAudioThread, SIGNAL(finished()), radio->txaudio, SLOT(deleteLater()));
|
||||
connect(this, SIGNAL(setupTxAudio(audioSetup)), radio->txaudio, SLOT(init(audioSetup)));
|
||||
connect(radio->txAudioThread, SIGNAL(finished()), radio->txaudio, SLOT(deleteLater()));
|
||||
|
||||
// Not sure how we make this work in QT5.9?
|
||||
// Not sure how we make this work in QT5.9?
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5,10,0))
|
||||
QMetaObject::invokeMethod(radio->txaudio, [=]() {
|
||||
radio->txaudio->init(radio->txAudioSetup);
|
||||
}, Qt::QueuedConnection);
|
||||
QMetaObject::invokeMethod(radio->txaudio, [=]() {
|
||||
radio->txaudio->init(radio->txAudioSetup);
|
||||
}, Qt::QueuedConnection);
|
||||
#else
|
||||
emit setupTxAudio(radio->txAudioSetup);
|
||||
#warning "QT 5.9 is not fully supported multiple rigs will NOT work!"
|
||||
emit setupTxAudio(radio->txAudioSetup);
|
||||
#warning "QT 5.9 is not fully supported multiple rigs will NOT work!"
|
||||
#endif
|
||||
hasTxAudio = datagram.senderAddress();
|
||||
|
||||
connect(this, SIGNAL(haveAudioData(audioPacket)), radio->txaudio, SLOT(incomingAudio(audioPacket)));
|
||||
hasTxAudio = datagram.senderAddress();
|
||||
|
||||
connect(this, SIGNAL(haveAudioData(audioPacket)), radio->txaudio, SLOT(incomingAudio(audioPacket)));
|
||||
}
|
||||
}
|
||||
if ((!memcmp(radio->guid, current->guid, GUIDLEN) || config->rigs.size() == 1) && radio->rxaudio == Q_NULLPTR && !config->lan)
|
||||
{
|
||||
|
@ -431,27 +432,30 @@ void udpServer::controlReceived()
|
|||
qCritical(logAudio()) << "Unsupported Receive Audio Handler selected!";
|
||||
}
|
||||
|
||||
if (radio->rxaudio != Q_NULLPTR)
|
||||
{
|
||||
|
||||
radio->rxAudioThread = new QThread(this);
|
||||
radio->rxAudioThread->setObjectName("rxAudio()");
|
||||
radio->rxAudioThread = new QThread(this);
|
||||
radio->rxAudioThread->setObjectName("rxAudio()");
|
||||
|
||||
radio->rxaudio->moveToThread(radio->rxAudioThread);
|
||||
radio->rxaudio->moveToThread(radio->rxAudioThread);
|
||||
|
||||
radio->rxAudioThread->start(QThread::TimeCriticalPriority);
|
||||
radio->rxAudioThread->start(QThread::TimeCriticalPriority);
|
||||
|
||||
connect(radio->rxAudioThread, SIGNAL(finished()), radio->rxaudio, SLOT(deleteLater()));
|
||||
connect(radio->rxaudio, SIGNAL(haveAudioData(audioPacket)), this, SLOT(receiveAudioData(audioPacket)));
|
||||
connect(radio->rxAudioThread, SIGNAL(finished()), radio->rxaudio, SLOT(deleteLater()));
|
||||
connect(radio->rxaudio, SIGNAL(haveAudioData(audioPacket)), this, SLOT(receiveAudioData(audioPacket)));
|
||||
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5,10,0))
|
||||
QMetaObject::invokeMethod(radio->rxaudio, [=]() {
|
||||
radio->rxaudio->init(radio->rxAudioSetup);
|
||||
}, Qt::QueuedConnection);
|
||||
QMetaObject::invokeMethod(radio->rxaudio, [=]() {
|
||||
radio->rxaudio->init(radio->rxAudioSetup);
|
||||
}, Qt::QueuedConnection);
|
||||
#else
|
||||
//#warning "QT 5.9 is not fully supported multiple rigs will NOT work!"
|
||||
connect(this, SIGNAL(setupRxAudio(audioSetup)), radio->rxaudio, SLOT(init(audioSetup)));
|
||||
setupRxAudio(radio->rxAudioSetup);
|
||||
//#warning "QT 5.9 is not fully supported multiple rigs will NOT work!"
|
||||
connect(this, SIGNAL(setupRxAudio(audioSetup)), radio->rxaudio, SLOT(init(audioSetup)));
|
||||
setupRxAudio(radio->rxAudioSetup);
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
2249
usbcontroller.cpp
260
usbcontroller.h
|
@ -8,23 +8,55 @@
|
|||
#include <QDateTime>
|
||||
#include <QRect>
|
||||
#include <QGraphicsTextItem>
|
||||
#include <QSpinBox>
|
||||
#include <QColor>
|
||||
#include <QVector>
|
||||
#include <QList>
|
||||
#include <QMap>
|
||||
#include <QMutex>
|
||||
#include <QIODevice>
|
||||
#include <QtEndian>
|
||||
#include <QUuid>
|
||||
#include <QLabel>
|
||||
#include <QImage>
|
||||
#include <QPainter>
|
||||
#include <QImageWriter>
|
||||
#include <QBuffer>
|
||||
#include <QSettings>
|
||||
#include <QMessageBox>
|
||||
#include <memory>
|
||||
|
||||
|
||||
#if defined(USB_CONTROLLER) && QT_VERSION < QT_VERSION_CHECK(6,0,0)
|
||||
#include <QGamepad>
|
||||
#endif
|
||||
|
||||
#if defined(USB_CONTROLLER)
|
||||
#ifndef Q_OS_WIN
|
||||
#include "hidapi/hidapi.h"
|
||||
#else
|
||||
#include "hidapi.h"
|
||||
#endif
|
||||
#ifndef Q_OS_WIN
|
||||
#include "hidapi/hidapi.h"
|
||||
#else
|
||||
#include "hidapi.h"
|
||||
#endif
|
||||
|
||||
#ifdef HID_API_VERSION_MAJOR
|
||||
#ifndef HID_API_MAKE_VERSION
|
||||
#define HID_API_MAKE_VERSION(mj, mn, p) (((mj) << 24) | ((mn) << 8) | (p))
|
||||
#endif
|
||||
#ifndef HID_API_VERSION
|
||||
#define HID_API_VERSION HID_API_MAKE_VERSION(HID_API_VERSION_MAJOR, HID_API_VERSION_MINOR, HID_API_VERSION_PATCH)
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) && HID_API_VERSION >= HID_API_MAKE_VERSION(0, 12, 0)
|
||||
#include <hidapi/hidapi_darwin.h>
|
||||
#endif
|
||||
|
||||
#if defined(USING_HIDAPI_LIBUSB) && HID_API_VERSION >= HID_API_MAKE_VERSION(0, 12, 0)
|
||||
#include <hidapi_libusb.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef Q_OS_WIN
|
||||
//Headers needed for sleeping.
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
|
@ -33,24 +65,100 @@
|
|||
|
||||
using namespace std;
|
||||
|
||||
|
||||
#define HIDDATALENGTH 64
|
||||
#define MAX_STR 255
|
||||
|
||||
struct USBTYPE {
|
||||
USBTYPE() {}
|
||||
USBTYPE(usbDeviceType model,quint32 manufacturerId, quint32 productId , quint32 usage, quint32 usagePage, int buttons, int cols, int knobs, int leds, int maxPayload, int iconSize) :
|
||||
model(model), manufacturerId(manufacturerId), productId(productId), usage(usage), usagePage(usagePage), buttons(buttons), cols(cols), knobs(knobs), leds(leds), maxPayload(maxPayload), iconSize(iconSize) {}
|
||||
|
||||
usbDeviceType model = usbNone;
|
||||
quint32 manufacturerId=0;
|
||||
quint32 productId=0;
|
||||
quint32 usage=0;
|
||||
quint32 usagePage=0;
|
||||
int buttons=0; // How many buttons
|
||||
int cols=0; // How many columns of buttons
|
||||
int knobs=0; // How many knobs
|
||||
int leds=0; // how many leds
|
||||
int maxPayload=0; // Max allowed payload
|
||||
int iconSize=0;
|
||||
};
|
||||
|
||||
|
||||
struct KNOBVALUE {
|
||||
int value=0;
|
||||
int previous=0;
|
||||
quint8 send=0;
|
||||
qint64 lastChanged=0;
|
||||
QString name="";
|
||||
};
|
||||
|
||||
struct USBDEVICE {
|
||||
USBDEVICE() {}
|
||||
USBDEVICE(USBTYPE type) : type(type) {}
|
||||
USBTYPE type;
|
||||
bool detected = false;
|
||||
bool remove = false;
|
||||
bool connected = false;
|
||||
bool uiCreated = false;
|
||||
bool disabled = false;
|
||||
quint8 speed=2;
|
||||
quint8 timeout=30;
|
||||
quint8 brightness=2;
|
||||
quint8 orientation=0;
|
||||
QColor color=Qt::darkGray;
|
||||
cmds lcd=cmdNone;
|
||||
|
||||
hid_device* handle = NULL;
|
||||
QString product = "";
|
||||
QString manufacturer = "";
|
||||
QString serial = "<none>";
|
||||
QString deviceId = "";
|
||||
QString path = "";
|
||||
int sensitivity = 1;
|
||||
unsigned char jogpos=0;
|
||||
unsigned char shutpos=0;
|
||||
unsigned char shutMult = 0;
|
||||
int jogCounter = 0;
|
||||
quint32 buttons = 0;
|
||||
quint32 knobs = 0;
|
||||
QList<KNOBVALUE> knobValues;
|
||||
|
||||
QTime lastusbController = QTime::currentTime();
|
||||
QByteArray lastData = QByteArray(8,0x0);
|
||||
unsigned char lastDialPos=0;
|
||||
QUuid uuid;
|
||||
QLabel *message;
|
||||
int pages=1;
|
||||
int currentPage=0;
|
||||
QGraphicsScene* scene = Q_NULLPTR;
|
||||
QSpinBox* pageSpin = Q_NULLPTR;
|
||||
QImage image;
|
||||
quint8 ledStatus=0x07;
|
||||
};
|
||||
|
||||
struct COMMAND {
|
||||
COMMAND() {}
|
||||
|
||||
COMMAND(int index, QString text, int command, char suffix) :
|
||||
index(index), text(text), command(command), suffix(suffix) {}
|
||||
COMMAND(int index, QString text, int command, availableBands band) :
|
||||
index(index), text(text), command(command), band(band) {}
|
||||
COMMAND(int index, QString text, int command, mode_kind mode) :
|
||||
index(index), text(text), command(command), mode(mode) {}
|
||||
COMMAND(int index, QString text, usbCommandType cmdType, int command, int value) :
|
||||
index(index), text(text), cmdType(cmdType), command(command), value(value) {}
|
||||
COMMAND(int index, QString text, usbCommandType cmdType, int command, unsigned char suffix) :
|
||||
index(index), text(text), cmdType(cmdType), command(command), suffix(suffix) {}
|
||||
COMMAND(int index, QString text, usbCommandType cmdType, int command, int getCommand, unsigned char suffix) :
|
||||
index(index), text(text), cmdType(cmdType), command(command), getCommand(getCommand), suffix(suffix) {}
|
||||
COMMAND(int index, QString text, usbCommandType cmdType, int command, availableBands band) :
|
||||
index(index), text(text), cmdType(cmdType), command(command), band(band) {}
|
||||
COMMAND(int index, QString text, usbCommandType cmdType, int command, mode_kind mode) :
|
||||
index(index), text(text), cmdType(cmdType), command(command), mode(mode) {}
|
||||
|
||||
int index=0;
|
||||
QString text;
|
||||
usbCommandType cmdType = commandButton;
|
||||
int command=0;
|
||||
int getCommand=0;
|
||||
unsigned char suffix=0x0;
|
||||
int value=0;
|
||||
availableBands band=bandGen;
|
||||
mode_kind mode=modeLSB;
|
||||
};
|
||||
|
@ -58,25 +166,59 @@ struct COMMAND {
|
|||
struct BUTTON {
|
||||
BUTTON() {}
|
||||
|
||||
BUTTON(quint8 dev, int num, QRect pos, const QColor textColour, COMMAND* on, COMMAND* off) :
|
||||
dev(dev), num(num), name(""), pos(pos), textColour(textColour), onCommand(on), offCommand(off) {}
|
||||
BUTTON(quint8 dev, QString name, QRect pos, const QColor textColour, COMMAND* on, COMMAND* off) :
|
||||
dev(dev), num(-1), name(name), pos(pos), textColour(textColour), onCommand(on), offCommand(off) {}
|
||||
BUTTON(usbDeviceType dev, int num, QRect pos, const QColor textColour, COMMAND* on, COMMAND* off, bool graphics=false, int led=0) :
|
||||
dev(dev), num(num), name(""), pos(pos), textColour(textColour), onCommand(on), offCommand(off), on(onCommand->text), off(offCommand->text), graphics(graphics), led(led){}
|
||||
BUTTON(usbDeviceType dev, QString name, QRect pos, const QColor textColour, COMMAND* on, COMMAND* off) :
|
||||
dev(dev), num(-1), name(name), pos(pos), textColour(textColour), onCommand(on), offCommand(off), on(onCommand->text), off(offCommand->text) {}
|
||||
|
||||
quint8 dev;
|
||||
usbDeviceType dev;
|
||||
USBDEVICE* parent = Q_NULLPTR;
|
||||
int page=1;
|
||||
int num;
|
||||
QString name;
|
||||
QRect pos;
|
||||
QColor textColour;
|
||||
int onEvent = 0;
|
||||
int offEvent = 0;
|
||||
const COMMAND* onCommand=Q_NULLPTR;
|
||||
const COMMAND* offCommand=Q_NULLPTR;
|
||||
QGraphicsTextItem* onText;
|
||||
QGraphicsTextItem* offText;
|
||||
|
||||
const COMMAND* onCommand = Q_NULLPTR;
|
||||
const COMMAND* offCommand = Q_NULLPTR;
|
||||
QGraphicsRectItem* bgRect = Q_NULLPTR;
|
||||
QGraphicsTextItem* text = Q_NULLPTR;
|
||||
QString on;
|
||||
QString off;
|
||||
QString path;
|
||||
QColor backgroundOn = Qt::lightGray;
|
||||
QColor backgroundOff = Qt::blue;
|
||||
QString iconName = "";
|
||||
QImage* icon = Q_NULLPTR;
|
||||
bool toggle = false;
|
||||
bool isOn = false;
|
||||
bool graphics = false;
|
||||
int led = 0;
|
||||
};
|
||||
|
||||
|
||||
struct KNOB {
|
||||
KNOB() {}
|
||||
|
||||
KNOB(usbDeviceType dev, int num, QRect pos, const QColor textColour, COMMAND* command) :
|
||||
dev(dev), num(num), name(""), pos(pos), textColour(textColour), command(command), cmd(command->text) {}
|
||||
|
||||
usbDeviceType dev;
|
||||
USBDEVICE* parent = Q_NULLPTR;
|
||||
int page=1;
|
||||
int num;
|
||||
QString name;
|
||||
QRect pos;
|
||||
QColor textColour;
|
||||
const COMMAND* command = Q_NULLPTR;
|
||||
QGraphicsTextItem* text = Q_NULLPTR;
|
||||
QString cmd;
|
||||
QString path;
|
||||
};
|
||||
|
||||
|
||||
typedef QMap<QString,USBDEVICE> usbDevMap;
|
||||
|
||||
|
||||
#if defined(USB_CONTROLLER)
|
||||
class usbController : public QObject
|
||||
{
|
||||
|
@ -85,15 +227,21 @@ class usbController : public QObject
|
|||
public:
|
||||
usbController();
|
||||
~usbController();
|
||||
bool hotPlugEvent(const QByteArray & eventType, void * message, long * result);
|
||||
|
||||
public slots:
|
||||
void init();
|
||||
void init(QMutex* mut,usbDevMap* prefs ,QVector<BUTTON>* buts,QVector<KNOB>* knobs);
|
||||
void run();
|
||||
void runTimer();
|
||||
void ledControl(bool on, unsigned char num);
|
||||
void receiveCommands(QVector<COMMAND>*);
|
||||
void receiveButtons(QVector<BUTTON>*);
|
||||
void getVersion();
|
||||
void receivePTTStatus(bool on);
|
||||
void receiveLevel(cmds cmd, unsigned char level);
|
||||
void programPages(USBDEVICE* dev, int pages);
|
||||
void programDisable(USBDEVICE* dev, bool disabled);
|
||||
|
||||
void sendRequest(USBDEVICE *dev, usbFeatureType feature, int val=0, QString text="", QImage* img=Q_NULLPTR, QColor* color=Q_NULLPTR);
|
||||
void sendToLCD(QImage *img);
|
||||
void backupController(USBDEVICE* dev, QString file);
|
||||
void restoreController(USBDEVICE* dev, QString file);
|
||||
|
||||
signals:
|
||||
void jogPlus();
|
||||
|
@ -102,33 +250,53 @@ signals:
|
|||
void doShuttle(bool plus, quint8 level);
|
||||
void setBand(int band);
|
||||
void button(const COMMAND* cmd);
|
||||
void newDevice(unsigned char devType, QVector<BUTTON>* but,QVector<COMMAND>* cmd);
|
||||
void initUI(usbDevMap* devs, QVector<BUTTON>* but, QVector<KNOB>* kb, QVector<COMMAND>* cmd, QMutex* mut);
|
||||
void newDevice(USBDEVICE* dev);
|
||||
void removeDevice(USBDEVICE* dev);
|
||||
void setConnected(USBDEVICE* dev);
|
||||
void changePage(USBDEVICE* dev, int page);
|
||||
|
||||
private:
|
||||
hid_device* handle;
|
||||
void loadButtons();
|
||||
void loadKnobs();
|
||||
void loadCommands();
|
||||
|
||||
|
||||
int hidStatus = 1;
|
||||
bool isOpen=false;
|
||||
unsigned int buttons=0;
|
||||
unsigned char jogpos=0;
|
||||
unsigned char shutpos=0;
|
||||
unsigned char shutMult = 0;
|
||||
int jogCounter = 0;
|
||||
QTime lastusbController = QTime::currentTime();
|
||||
QByteArray lastData = QByteArray(8,0x0);
|
||||
unsigned char lastDialPos=0;
|
||||
int devicesConnected=0;
|
||||
QVector<BUTTON>* buttonList;
|
||||
QVector<COMMAND>* commands = Q_NULLPTR;
|
||||
QString product="";
|
||||
QString manufacturer="";
|
||||
QString serial="<none>";
|
||||
QVector<KNOB>* knobList;
|
||||
|
||||
QVector<BUTTON> defaultButtons;
|
||||
QVector<KNOB> defaultKnobs;
|
||||
QVector<USBTYPE> knownDevices;
|
||||
QVector<COMMAND> commands;
|
||||
usbDevMap* devices;
|
||||
|
||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
QGamepad* gamepad=Q_NULLPTR;
|
||||
#endif
|
||||
void buttonState(QString but, bool val);
|
||||
void buttonState(QString but, double val);
|
||||
usbDeviceType usbDevice = usbNone;
|
||||
QColor currentColour;
|
||||
|
||||
QMutex* mutex=Q_NULLPTR;
|
||||
COMMAND sendCommand;
|
||||
|
||||
QTimer* dataTimer = Q_NULLPTR;
|
||||
protected:
|
||||
};
|
||||
|
||||
|
||||
class usbControllerDev : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
964
wfmain.cpp
102
wfmain.h
|
@ -19,6 +19,7 @@
|
|||
#include <QMutexLocker>
|
||||
#include <QColorDialog>
|
||||
#include <QColor>
|
||||
#include <QMap>
|
||||
|
||||
#include "logcategories.h"
|
||||
#include "wfviewtypes.h"
|
||||
|
@ -62,6 +63,18 @@
|
|||
#include "rtaudio/RtAudio.h"
|
||||
#endif
|
||||
|
||||
#ifdef USB_CONTROLLER
|
||||
#ifdef Q_OS_WIN
|
||||
#include <windows.h>
|
||||
#include <dbt.h>
|
||||
#define USB_HOTPLUG
|
||||
#elif defined(Q_OS_LINUX)
|
||||
#include <QSocketNotifier>
|
||||
#include <libudev.h>
|
||||
#define USB_HOTPLUG
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define numColorPresetsTotal (5)
|
||||
|
||||
namespace Ui {
|
||||
|
@ -78,7 +91,20 @@ public:
|
|||
static void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg);
|
||||
void handleLogText(QString text);
|
||||
|
||||
#ifdef USB_HOTPLUG
|
||||
#if defined(Q_OS_WIN)
|
||||
protected:
|
||||
virtual bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result);
|
||||
#elif defined(Q_OS_LINUX)
|
||||
private slots:
|
||||
void uDevEvent();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
signals:
|
||||
// Signal levels received to other parts of wfview
|
||||
void sendLevel(cmds cmd, unsigned char level);
|
||||
void usbHotplug();
|
||||
// Basic to rig:
|
||||
void setCIVAddr(unsigned char newRigCIVAddr);
|
||||
void setRigID(unsigned char rigID);
|
||||
|
@ -90,6 +116,7 @@ signals:
|
|||
|
||||
// Frequency, mode, band:
|
||||
void getFrequency();
|
||||
void getFrequency(unsigned char);
|
||||
void setFrequency(unsigned char vfo, freqt freq);
|
||||
void getMode();
|
||||
void setMode(unsigned char modeIndex, unsigned char modeFilter);
|
||||
|
@ -140,7 +167,21 @@ signals:
|
|||
void getModInputLevel(rigInput input);
|
||||
void getMeters(meterKind meter);
|
||||
void getPassband();
|
||||
void getVoxGain();
|
||||
void getAntiVoxGain();
|
||||
void getMonitorGain();
|
||||
void getNBLevel();
|
||||
void getNRLevel();
|
||||
void getCompLevel();
|
||||
void getCwPitch();
|
||||
|
||||
void getVox();
|
||||
void getMonitor();
|
||||
void getCompressor();
|
||||
void getNB();
|
||||
void getNR();
|
||||
|
||||
void getDashRatio();
|
||||
void getPskTone();
|
||||
void getRttyMark();
|
||||
|
||||
|
@ -158,9 +199,18 @@ signals:
|
|||
void setMicGain(unsigned char);
|
||||
void setCompLevel(unsigned char);
|
||||
void setTxPower(unsigned char);
|
||||
void setMonitorLevel(unsigned char);
|
||||
void setMonitorGain(unsigned char);
|
||||
void setVoxGain(unsigned char);
|
||||
void setAntiVoxGain(unsigned char);
|
||||
void setNBLevel(unsigned char level);
|
||||
void setNRLevel(unsigned char level);
|
||||
|
||||
void setVox(bool en);
|
||||
void setMonitor(bool en);
|
||||
void setCompressor(bool en);
|
||||
void setNB(bool en);
|
||||
void setNR(bool en);
|
||||
|
||||
void setSpectrumRefLevel(int);
|
||||
|
||||
void setModLevel(rigInput input, unsigned char level);
|
||||
|
@ -169,6 +219,7 @@ signals:
|
|||
void setACCBGain(unsigned char level);
|
||||
void setUSBGain(unsigned char level);
|
||||
void setLANGain(unsigned char level);
|
||||
|
||||
void setPassband(quint16 pass);
|
||||
|
||||
// PTT, ATU, ATT, Antenna, Preamp:
|
||||
|
@ -190,6 +241,7 @@ signals:
|
|||
void getKeySpeed();
|
||||
void setKeySpeed(unsigned char wpm);
|
||||
void setCwPitch(unsigned char pitch);
|
||||
void setDashRatio(unsigned char ratio);
|
||||
void setCWBreakMode(unsigned char breakMode);
|
||||
void getCWBreakMode();
|
||||
|
||||
|
@ -223,8 +275,7 @@ signals:
|
|||
void openShuttle();
|
||||
void requestRigState();
|
||||
void stateUpdated();
|
||||
void sendUsbControllerCommands(QVector<COMMAND>* cmds);
|
||||
void sendUsbControllerButtons(QVector<BUTTON>* buts);
|
||||
void initUsbController(QMutex* mutex,usbDevMap* devs ,QVector<BUTTON>* buts,QVector<KNOB>* knobs);
|
||||
void setClusterUdpPort(int port);
|
||||
void setClusterEnableUdp(bool udp);
|
||||
void setClusterEnableTcp(bool tcp);
|
||||
|
@ -235,6 +286,7 @@ signals:
|
|||
void setClusterTimeout(int timeout);
|
||||
void setClusterSkimmerSpots(bool enable);
|
||||
void setFrequencyRange(double low, double high);
|
||||
void sendControllerRequest(USBDEVICE* dev, usbFeatureType request, int val=0, QString text="", QImage* img=Q_NULLPTR, QColor* color=Q_NULLPTR);
|
||||
|
||||
private slots:
|
||||
void setAudioDevicesUI();
|
||||
|
@ -294,9 +346,17 @@ private slots:
|
|||
void receiveModInput(rigInput input, bool dataOn);
|
||||
//void receiveDuplexMode(duplexMode dm);
|
||||
void receivePassband(quint16 pass);
|
||||
void receiveMonitorGain(unsigned char pass);
|
||||
void receiveNBLevel(unsigned char pass);
|
||||
void receiveNRLevel(unsigned char pass);
|
||||
void receiveCwPitch(unsigned char pitch);
|
||||
void receiveTPBFInner(unsigned char level);
|
||||
void receiveTPBFOuter(unsigned char level);
|
||||
void receiveVox(bool en);
|
||||
void receiveMonitor(bool en);
|
||||
void receiveComp(bool en);
|
||||
void receiveNB(bool en);
|
||||
void receiveNR(bool en);
|
||||
|
||||
// Levels:
|
||||
void receiveRfGain(unsigned char level);
|
||||
|
@ -312,7 +372,6 @@ private slots:
|
|||
void receiveTxPower(unsigned char power);
|
||||
void receiveMicGain(unsigned char gain);
|
||||
void receiveCompLevel(unsigned char compLevel);
|
||||
void receiveMonitorGain(unsigned char monitorGain);
|
||||
void receiveVoxGain(unsigned char voxGain);
|
||||
void receiveAntiVoxGain(unsigned char antiVoxGain);
|
||||
void receiveSpectrumRefLevel(int level);
|
||||
|
@ -350,6 +409,7 @@ private slots:
|
|||
void receiveBaudRate(quint32 baudrate);
|
||||
void radioSelection(QList<radio_cap_packet> radios);
|
||||
|
||||
|
||||
// Added for RC28/Shuttle support
|
||||
void pttToggle(bool);
|
||||
void stepUp();
|
||||
|
@ -397,8 +457,7 @@ private slots:
|
|||
void on_fEnterBtn_clicked();
|
||||
void on_usbControllerBtn_clicked();
|
||||
|
||||
void on_usbButtonsResetBtn_clicked();
|
||||
void on_usbCommandsResetBtn_clicked();
|
||||
void on_usbControllersResetBtn_clicked();
|
||||
|
||||
void on_enableUsbChk_clicked(bool checked);
|
||||
|
||||
|
@ -492,7 +551,7 @@ private slots:
|
|||
|
||||
void on_vspCombo_currentIndexChanged(int value);
|
||||
|
||||
void on_scopeEnableWFBtn_clicked(bool checked);
|
||||
void on_scopeEnableWFBtn_stateChanged(int state);
|
||||
|
||||
void on_sqlSlider_valueChanged(int value);
|
||||
|
||||
|
@ -686,6 +745,10 @@ private slots:
|
|||
|
||||
void on_colorEditPassband_editingFinished();
|
||||
|
||||
void on_colorSetBtnPBT_clicked();
|
||||
|
||||
void on_colorEditPBT_editingFinished();
|
||||
|
||||
void on_colorSetBtnMeterLevel_clicked();
|
||||
|
||||
void on_colorEditMeterLevel_editingFinished();
|
||||
|
@ -914,6 +977,7 @@ private:
|
|||
double oldLowerFreq;
|
||||
double oldUpperFreq;
|
||||
freqt freq;
|
||||
freqt freqb;
|
||||
float tsKnobMHz;
|
||||
|
||||
unsigned char setModeVal=0;
|
||||
|
@ -1061,9 +1125,6 @@ private:
|
|||
|
||||
void updateUsbButtons();
|
||||
|
||||
void resetUsbButtons();
|
||||
void resetUsbCommands();
|
||||
|
||||
int oldFreqDialVal;
|
||||
|
||||
rigCapabilities rigCaps;
|
||||
|
@ -1090,7 +1151,7 @@ private:
|
|||
satelliteSetup *sat;
|
||||
transceiverAdjustments *trxadj;
|
||||
cwSender *cw;
|
||||
controllerSetup* shut;
|
||||
controllerSetup* usbWindow = Q_NULLPTR;
|
||||
aboutbox *abtBox;
|
||||
selectRadio *selRad;
|
||||
loggingWindow *logWindow;
|
||||
|
@ -1138,9 +1199,18 @@ private:
|
|||
#if defined (USB_CONTROLLER)
|
||||
usbController *usbControllerDev = Q_NULLPTR;
|
||||
QThread *usbControllerThread = Q_NULLPTR;
|
||||
QString usbDeviceName;
|
||||
QVector<COMMAND> usbCommands;
|
||||
QString typeName;
|
||||
QVector<BUTTON> usbButtons;
|
||||
QVector<KNOB> usbKnobs;
|
||||
usbDevMap usbDevices;
|
||||
QMutex usbMutex;
|
||||
qint64 lastUsbNotify=0;
|
||||
|
||||
#if defined (Q_OS_LINUX)
|
||||
struct udev* uDev = nullptr;
|
||||
struct udev_monitor* uDevMonitor = nullptr;
|
||||
QSocketNotifier* uDevNotifier = nullptr;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
dxClusterClient* cluster = Q_NULLPTR;
|
||||
|
@ -1152,6 +1222,7 @@ private:
|
|||
QMutex clusterMutex;
|
||||
QColor clusterColor;
|
||||
audioDevices* audioDev = Q_NULLPTR;
|
||||
QImage lcdImage;
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(struct rigCapabilities)
|
||||
|
@ -1175,15 +1246,18 @@ Q_DECLARE_METATYPE(QList<radio_cap_packet>)
|
|||
Q_DECLARE_METATYPE(QList<spotData>)
|
||||
Q_DECLARE_METATYPE(rigstate*)
|
||||
Q_DECLARE_METATYPE(QVector <BUTTON>*)
|
||||
Q_DECLARE_METATYPE(struct BUTTON*)
|
||||
Q_DECLARE_METATYPE(QVector <KNOB>*)
|
||||
Q_DECLARE_METATYPE(QVector <COMMAND>*)
|
||||
Q_DECLARE_METATYPE(const COMMAND*)
|
||||
Q_DECLARE_METATYPE(const USBDEVICE*)
|
||||
Q_DECLARE_METATYPE(codecType)
|
||||
Q_DECLARE_METATYPE(errorType)
|
||||
Q_DECLARE_METATYPE(enum duplexMode)
|
||||
Q_DECLARE_METATYPE(enum rptAccessTxRx)
|
||||
Q_DECLARE_METATYPE(struct rptrTone_t)
|
||||
Q_DECLARE_METATYPE(struct rptrAccessData_t)
|
||||
Q_DECLARE_METATYPE(enum usbFeatureType)
|
||||
Q_DECLARE_METATYPE(enum cmds)
|
||||
|
||||
//void (*wfmain::logthistext)(QString text) = NULL;
|
||||
|
||||
|
|
754
wfmain.ui
|
@ -159,12 +159,18 @@
|
|||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="scopeEnableWFBtn">
|
||||
<property name="toolTip">
|
||||
<string>Checked=WF enable, Unchecked=WF disable, Partial=Enable WF but no local display</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Enable WF</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="tristate">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
@ -1821,7 +1827,6 @@
|
|||
<font>
|
||||
<family>DejaVu Sans Mono</family>
|
||||
<pointsize>14</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
|
@ -3444,8 +3449,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>570</width>
|
||||
<height>224</height>
|
||||
<width>579</width>
|
||||
<height>254</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
|
@ -3470,8 +3475,8 @@
|
|||
<property name="horizontalSpacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="0" column="3">
|
||||
<widget class="QLedLabel" name="colorSwatchGrid" native="true">
|
||||
<item row="2" column="11">
|
||||
<widget class="QLedLabel" name="colorSwatchWfBackground" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
|
@ -3480,10 +3485,46 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnText">
|
||||
<item row="1" column="3">
|
||||
<widget class="QLedLabel" name="colorSwatchAxis" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="10">
|
||||
<widget class="QLineEdit" name="colorEditMeterScale">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Text</string>
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLineEdit" name="colorEditAxis">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterText">
|
||||
<property name="text">
|
||||
<string>Meter Text</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -3494,20 +3535,59 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnWfAxis">
|
||||
<item row="2" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnText">
|
||||
<property name="text">
|
||||
<string>Waterfall Axis</string>
|
||||
<string>Text</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnAxis">
|
||||
<item row="2" column="2">
|
||||
<widget class="QLineEdit" name="colorEditText">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Axis</string>
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QLedLabel" name="colorSwatchGrid" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="11">
|
||||
<widget class="QLedLabel" name="colorSwatchMeterScale" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="4">
|
||||
<spacer name="horizontalSpacer_34">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<widget class="QLedLabel" name="colorSwatchText" native="true">
|
||||
<property name="minimumSize">
|
||||
|
@ -3518,6 +3598,19 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="8">
|
||||
<spacer name="horizontalSpacer_35">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="10">
|
||||
<widget class="QLineEdit" name="colorEditWfBackground">
|
||||
<property name="maximumSize">
|
||||
|
@ -3531,6 +3624,133 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterScale">
|
||||
<property name="text">
|
||||
<string>Meter Scale</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLineEdit" name="colorEditGrid">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Color text format is #AARRGGBB, where AA is the "alpha" channel, and value "00" is totally transparent, and "ff" is totally opaque.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="11">
|
||||
<widget class="QLedLabel" name="colorSwatchMeterText" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnwfBackground">
|
||||
<property name="text">
|
||||
<string>Waterfall Back</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnAxis">
|
||||
<property name="text">
|
||||
<string>Axis</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="10">
|
||||
<widget class="QLineEdit" name="colorEditMeterText">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnPlotBackground">
|
||||
<property name="text">
|
||||
<string>Plot Background</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="2">
|
||||
<widget class="QLineEdit" name="colorEditPlotBackground">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnSpecLine">
|
||||
<property name="text">
|
||||
<string>Spectrum Line</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnSpecFill">
|
||||
<property name="text">
|
||||
<string>Spectrum Fill</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnUnderlayLine">
|
||||
<property name="text">
|
||||
<string>Underlay Line</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="2">
|
||||
<widget class="QLineEdit" name="colorEditSpecLine">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="2">
|
||||
<widget class="QLineEdit" name="colorEditSpecFill">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="2">
|
||||
<widget class="QLineEdit" name="colorEditUnderlayLine">
|
||||
<property name="maximumSize">
|
||||
|
@ -3544,10 +3764,13 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnPlotBackground">
|
||||
<property name="text">
|
||||
<string>Plot Background</string>
|
||||
<item row="3" column="3">
|
||||
<widget class="QLedLabel" name="colorSwatchPlotBackground" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -3561,69 +3784,6 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="10">
|
||||
<widget class="QLineEdit" name="colorEditWfText">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnSpecLine">
|
||||
<property name="text">
|
||||
<string>Spectrum Line</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="3">
|
||||
<widget class="QLedLabel" name="colorSwatchPlotBackground" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLineEdit" name="colorEditAxis">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnwfBackground">
|
||||
<property name="text">
|
||||
<string>Waterfall Back</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="10">
|
||||
<widget class="QLineEdit" name="colorEditWfAxis">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="3">
|
||||
<widget class="QLedLabel" name="colorSwatchSpecFill" native="true">
|
||||
<property name="minimumSize">
|
||||
|
@ -3634,125 +3794,6 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="2">
|
||||
<widget class="QLineEdit" name="colorEditSpecFill">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="2">
|
||||
<widget class="QLineEdit" name="colorEditPlotBackground">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="2">
|
||||
<widget class="QLineEdit" name="colorEditSpecLine">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnSpecFill">
|
||||
<property name="text">
|
||||
<string>Spectrum Fill</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnWfGrid">
|
||||
<property name="text">
|
||||
<string>Waterfall Grid</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QLineEdit" name="colorEditText">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="10">
|
||||
<widget class="QLineEdit" name="colorEditWfGrid">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnUnderlayLine">
|
||||
<property name="text">
|
||||
<string>Underlay Line</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QLedLabel" name="colorSwatchAxis" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnWfText">
|
||||
<property name="text">
|
||||
<string>Waterfall Text</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLineEdit" name="colorEditGrid">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Color text format is #AARRGGBB, where AA is the "alpha" channel, and value "00" is totally transparent, and "ff" is totally opaque.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="3">
|
||||
<widget class="QLedLabel" name="colorSwatchUnderlayLine" native="true">
|
||||
<property name="minimumSize">
|
||||
|
@ -3763,64 +3804,15 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="8">
|
||||
<spacer name="horizontalSpacer_35">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="4">
|
||||
<spacer name="horizontalSpacer_34">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="11">
|
||||
<widget class="QLedLabel" name="colorSwatchWfBackground" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
<item row="8" column="0">
|
||||
<widget class="QPushButton" name="colorSetBtnUnderlayFill">
|
||||
<property name="text">
|
||||
<string>Underlay Fill</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="11">
|
||||
<widget class="QLedLabel" name="colorSwatchWfText" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="11">
|
||||
<widget class="QLedLabel" name="colorSwatchMeterText" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="10">
|
||||
<widget class="QLineEdit" name="colorEditMeterText">
|
||||
<item row="8" column="2">
|
||||
<widget class="QLineEdit" name="colorEditUnderlayFill">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
|
@ -3832,15 +3824,8 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterText">
|
||||
<property name="text">
|
||||
<string>Meter Text</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="11">
|
||||
<widget class="QLedLabel" name="colorSwatchMeterScale" native="true">
|
||||
<item row="8" column="3">
|
||||
<widget class="QLedLabel" name="colorSwatchUnderlayFill" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
|
@ -3849,8 +3834,15 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="10">
|
||||
<widget class="QLineEdit" name="colorEditMeterScale">
|
||||
<item row="0" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnTuningLine">
|
||||
<property name="text">
|
||||
<string>Tuning Line</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="6">
|
||||
<widget class="QLineEdit" name="colorEditTuningLine">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
|
@ -3862,15 +3854,8 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterScale">
|
||||
<property name="text">
|
||||
<string>Meter Scale</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchMeterPeakScale" native="true">
|
||||
<item row="0" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchTuningLine" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
|
@ -3879,8 +3864,15 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="6">
|
||||
<widget class="QLineEdit" name="colorEditMeterPeakScale">
|
||||
<item row="1" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnPassband">
|
||||
<property name="text">
|
||||
<string>Passband</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="6">
|
||||
<widget class="QLineEdit" name="colorEditPassband">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
|
@ -3892,22 +3884,25 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterPeakScale">
|
||||
<property name="text">
|
||||
<string>Meter High Scale</string>
|
||||
<item row="1" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchPassband" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterPeakLevel">
|
||||
<item row="2" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnPBT">
|
||||
<property name="text">
|
||||
<string>Meter Peak Level</string>
|
||||
<string>PBT Indicator</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="6">
|
||||
<widget class="QLineEdit" name="colorEditMeterPeakLevel">
|
||||
<item row="2" column="6">
|
||||
<widget class="QLineEdit" name="colorEditPBT">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
|
@ -3919,8 +3914,8 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchMeterPeakLevel" native="true">
|
||||
<item row="2" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchPBT" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
|
@ -3929,36 +3924,6 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchMeterAverage" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="6">
|
||||
<widget class="QLineEdit" name="colorEditMeterAvg">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterAvg">
|
||||
<property name="text">
|
||||
<string>Meter Average</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterLevel">
|
||||
<property name="text">
|
||||
|
@ -3989,15 +3954,15 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnPassband">
|
||||
<item row="4" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterAvg">
|
||||
<property name="text">
|
||||
<string>Passband</string>
|
||||
<string>Meter Average</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="6">
|
||||
<widget class="QLineEdit" name="colorEditPassband">
|
||||
<item row="4" column="6">
|
||||
<widget class="QLineEdit" name="colorEditMeterAvg">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
|
@ -4009,8 +3974,8 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchPassband" native="true">
|
||||
<item row="4" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchMeterAverage" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
|
@ -4019,15 +3984,15 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnTuningLine">
|
||||
<item row="5" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterPeakLevel">
|
||||
<property name="text">
|
||||
<string>Tuning Line</string>
|
||||
<string>Meter Peak Level</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="6">
|
||||
<widget class="QLineEdit" name="colorEditTuningLine">
|
||||
<item row="5" column="6">
|
||||
<widget class="QLineEdit" name="colorEditMeterPeakLevel">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
|
@ -4039,8 +4004,8 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchTuningLine" native="true">
|
||||
<item row="5" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchMeterPeakLevel" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
|
@ -4049,18 +4014,15 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchUnderlayFill" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
<item row="6" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnMeterPeakScale">
|
||||
<property name="text">
|
||||
<string>Meter High Scale</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="6">
|
||||
<widget class="QLineEdit" name="colorEditUnderlayFill">
|
||||
<item row="6" column="6">
|
||||
<widget class="QLineEdit" name="colorEditMeterPeakScale">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
|
@ -4072,10 +4034,63 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="5">
|
||||
<widget class="QPushButton" name="colorSetBtnUnderlayFill">
|
||||
<item row="6" column="7">
|
||||
<widget class="QLedLabel" name="colorSwatchMeterPeakScale" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnWfGrid">
|
||||
<property name="text">
|
||||
<string>Underlay Fill</string>
|
||||
<string>Waterfall Grid</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="10">
|
||||
<widget class="QLineEdit" name="colorEditWfGrid">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="11">
|
||||
<widget class="QLedLabel" name="colorSwatchWfGrid" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnWfAxis">
|
||||
<property name="text">
|
||||
<string>Waterfall Axis</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="10">
|
||||
<widget class="QLineEdit" name="colorEditWfAxis">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -4089,8 +4104,28 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="11">
|
||||
<widget class="QLedLabel" name="colorSwatchWfGrid" native="true">
|
||||
<item row="5" column="9">
|
||||
<widget class="QPushButton" name="colorSetBtnWfText">
|
||||
<property name="text">
|
||||
<string>Waterfall Text</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="10">
|
||||
<widget class="QLineEdit" name="colorEditWfText">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>90</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>#AARRGGBB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="11">
|
||||
<widget class="QLedLabel" name="colorSwatchWfText" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>10</width>
|
||||
|
@ -4949,6 +4984,13 @@
|
|||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_52">
|
||||
<property name="text">
|
||||
<string>Only change this if you are absolutely sure you need it (connecting to N1MM+ or similar)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_28">
|
||||
<property name="orientation">
|
||||
|
@ -4979,7 +5021,7 @@
|
|||
<string/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Setup USB Controller</string>
|
||||
<string>Setup USB Controllers</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -4997,23 +5039,16 @@
|
|||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="usbButtonsResetBtn">
|
||||
<widget class="QPushButton" name="usbControllersResetBtn">
|
||||
<property name="text">
|
||||
<string>Reset Buttons</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="usbCommandsResetBtn">
|
||||
<property name="text">
|
||||
<string>Reset Commands</string>
|
||||
<string>Reset Controllers</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="usbResetLbl">
|
||||
<property name="text">
|
||||
<string>Only reset buttons/commands if you have issues. </string>
|
||||
<string>Reset all USB controllers to defaults (delete all knobs/buttons)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -5455,7 +5490,6 @@
|
|||
<widget class="QPushButton" name="exitBtn">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>50</weight>
|
||||
<bold>false</bold>
|
||||
</font>
|
||||
</property>
|
||||
|
@ -5475,7 +5509,7 @@
|
|||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1042</width>
|
||||
<height>21</height>
|
||||
<height>22</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
|
@ -5503,7 +5537,7 @@
|
|||
<connections/>
|
||||
<buttongroups>
|
||||
<buttongroup name="buttonGroup"/>
|
||||
<buttongroup name="underlayButtonGroup"/>
|
||||
<buttongroup name="pollingButtonGroup"/>
|
||||
<buttongroup name="underlayButtonGroup"/>
|
||||
</buttongroups>
|
||||
</ui>
|
||||
|
|
|
@ -13,7 +13,7 @@ TEMPLATE = app
|
|||
|
||||
CONFIG += console
|
||||
|
||||
DEFINES += WFVIEW_VERSION=\\\"1.60\\\"
|
||||
DEFINES += WFVIEW_VERSION=\\\"1.65\\\"
|
||||
|
||||
DEFINES += BUILD_WFSERVER
|
||||
|
||||
|
|
|
@ -112,7 +112,7 @@
|
|||
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="QtSettings">
|
||||
<QtInstall>msvc2019_64_v62</QtInstall>
|
||||
<QtInstall>msvc2016_64_v640</QtInstall>
|
||||
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
|
@ -120,7 +120,7 @@
|
|||
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
|
||||
<QtInstall>msvc2019_64_v62</QtInstall>
|
||||
<QtInstall>msvc2016_64_v640</QtInstall>
|
||||
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
|
||||
</PropertyGroup>
|
||||
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')">
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="QtSettings">
|
||||
<QtLastBackgroundBuild>2022-08-21T18:45:22.2052009Z</QtLastBackgroundBuild>
|
||||
<QtLastBackgroundBuild>2023-02-14T19:04:12.9338871Z</QtLastBackgroundBuild>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="QtSettings">
|
||||
<QtLastBackgroundBuild>2022-08-21T18:45:22.2052009Z</QtLastBackgroundBuild>
|
||||
<QtLastBackgroundBuild>2023-02-14T19:04:11.6802165Z</QtLastBackgroundBuild>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
|
||||
<QtLastBackgroundBuild>2023-01-02T19:56:38.8798452Z</QtLastBackgroundBuild>
|
||||
<QtLastBackgroundBuild>2023-02-14T19:04:14.0213664Z</QtLastBackgroundBuild>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="QtSettings">
|
||||
<QtLastBackgroundBuild>2022-04-13T11:33:53.0745117Z</QtLastBackgroundBuild>
|
||||
<QtLastBackgroundBuild>2023-02-14T19:04:13.5068223Z</QtLastBackgroundBuild>
|
||||
</PropertyGroup>
|
||||
</Project>
|
44
wfview.pro
|
@ -12,16 +12,16 @@ QT += core gui serialport network multimedia xml
|
|||
#Uncomment The following line to enable USB controllers (Shuttle/RC-28 etc.)
|
||||
DEFINES += USB_CONTROLLER
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
|
||||
|
||||
contains(DEFINES,USB_CONTROLLER){
|
||||
lessThan(QT_MAJOR_VERSION, 6): QT += gamepad printsupport
|
||||
lessThan(QT_MAJOR_VERSION, 6): QT += gamepad
|
||||
}
|
||||
|
||||
TARGET = wfview
|
||||
TEMPLATE = app
|
||||
|
||||
DEFINES += WFVIEW_VERSION=\\\"1.60\\\"
|
||||
DEFINES += WFVIEW_VERSION=\\\"1.65\\\"
|
||||
|
||||
DEFINES += BUILD_WFVIEW
|
||||
|
||||
|
@ -51,7 +51,7 @@ macx:DEFINES += __MACOSX_CORE__
|
|||
!linux:HEADERS += ../rtaudio/RTAUdio.h
|
||||
!linux:INCLUDEPATH += ../rtaudio
|
||||
|
||||
linux:LIBS += -lpulse -lpulse-simple -lrtaudio -lpthread
|
||||
linux:LIBS += -lpulse -lpulse-simple -lrtaudio -lpthread -ludev
|
||||
|
||||
win32:INCLUDEPATH += ../portaudio/include
|
||||
!win32:LIBS += -lportaudio
|
||||
|
@ -116,17 +116,22 @@ unix:target.path = $$PREFIX/bin
|
|||
INSTALLS += target
|
||||
|
||||
# Why doesn't this seem to do anything?
|
||||
unix:DISTFILES += resources/wfview.png \
|
||||
unix:DISTFILES += resources/unix_icons/wfview.png \
|
||||
resources/install.sh
|
||||
unix:DISTFILES += resources/wfview.desktop
|
||||
unix:DISTFILES += resources/org.wfview.wfview.metainfo.xml
|
||||
|
||||
unix:applications.files = resources/wfview.desktop
|
||||
unix:applications.path = $$PREFIX/share/applications
|
||||
INSTALLS += applications
|
||||
|
||||
unix:pixmaps.files = resources/wfview.png
|
||||
unix:pixmaps.path = $$PREFIX/share/pixmaps
|
||||
INSTALLS += pixmaps
|
||||
unix:icons.files = resources/unix_icons/wfview.png
|
||||
unix:icons.path = $$PREFIX/share/icons/hicolor/256x256/apps
|
||||
INSTALLS += icons
|
||||
|
||||
unix:metainfo.files = resources/org.wfview.wfview.metainfo.xml
|
||||
unix:metainfo.path = $$PREFIX/share/metainfo
|
||||
INSTALLS += metainfo
|
||||
|
||||
unix:stylesheets.files = qdarkstyle
|
||||
unix:stylesheets.path = $$PREFIX/share/wfview
|
||||
|
@ -138,8 +143,11 @@ macx:LIBS += -framework CoreAudio -framework CoreFoundation -lpthread -lopus
|
|||
# CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT
|
||||
|
||||
CONFIG(debug, release|debug) {
|
||||
!win32: QCPLIB = qcustomplotd
|
||||
win32: QCPLIB = qcustomplotd2
|
||||
linux:LIBS += $$system("/sbin/ldconfig -p | awk '/libQCustomPlotd.so/ {print \"-lQCustomPlotd\"}'")
|
||||
linux:LIBS += $$system("/sbin/ldconfig -p | awk '/libqcustomplotd2.so/ {print \"-lqcustomplotd2\"}'")
|
||||
linux:LIBS += $$system("/sbin/ldconfig -p | awk '/libqcustomplotd.so/ {print \"-lqcustomplotd\"}'")
|
||||
macos:LIBS += -lqcustomplotd
|
||||
win32:LIBS += -lqcustomplotd2
|
||||
win32 {
|
||||
contains(QMAKE_TARGET.arch, x86_64) {
|
||||
LIBS += -L../opus/win32/VS2015/x64/DebugDLL/
|
||||
|
@ -166,8 +174,11 @@ CONFIG(debug, release|debug) {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
!win32: QCPLIB = qcustomplot
|
||||
win32: QCPLIB = qcustomplot2
|
||||
linux:LIBS += $$system("/sbin/ldconfig -p | awk '/libQCustomPlot.so/ {print \"-lQCustomPlot\"}'")
|
||||
linux:LIBS += $$system("/sbin/ldconfig -p | awk '/libqcustomplot2.so/ {print \"-lqcustomplot2\"}'")
|
||||
linux:LIBS += $$system("/sbin/ldconfig -p | awk '/libqcustomplot.so/ {print \"-lqcustomplot\"}'")
|
||||
macos:LIBS += -lqcustomplot
|
||||
win32:LIBS += -lqcustomplot2
|
||||
win32 {
|
||||
contains(QMAKE_TARGET.arch, x86_64) {
|
||||
LIBS += -L../opus/win32/VS2015/x64/ReleaseDLL/
|
||||
|
@ -196,14 +207,13 @@ CONFIG(debug, release|debug) {
|
|||
}
|
||||
|
||||
contains(DEFINES,USB_CONTROLLER){
|
||||
linux:LIBS += -L./ -l$$QCPLIB -lhidapi-libusb
|
||||
linux:LIBS += -L./ -lhidapi-libusb
|
||||
macx:LIBS += -lhidapi
|
||||
win32:INCLUDEPATH += ../hidapi/hidapi
|
||||
}
|
||||
|
||||
!win32:LIBS += -L./ -l$$QCPLIB -lopus
|
||||
win32:LIBS += -l$$QCPLIB -lopus -lole32
|
||||
|
||||
!win32:LIBS += -L./ -lopus
|
||||
win32:LIBS += -lopus -lole32 -luser32
|
||||
|
||||
#macx:SOURCES += ../qcustomplot/qcustomplot.cpp
|
||||
#macx:HEADERS += ../qcustomplot/qcustomplot.h
|
||||
|
@ -218,6 +228,7 @@ INCLUDEPATH += resampler
|
|||
|
||||
SOURCES += main.cpp\
|
||||
cwsender.cpp \
|
||||
cwsidetone.cpp \
|
||||
loggingwindow.cpp \
|
||||
wfmain.cpp \
|
||||
commhandler.cpp \
|
||||
|
@ -256,6 +267,7 @@ HEADERS += wfmain.h \
|
|||
colorprefs.h \
|
||||
commhandler.h \
|
||||
cwsender.h \
|
||||
cwsidetone.h \
|
||||
loggingwindow.h \
|
||||
prefs.h \
|
||||
printhex.h \
|
||||
|
|
|
@ -111,7 +111,7 @@
|
|||
<OutDir>$(SolutionDir)wfview-release\</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<QtInstall>msvc2019_64_v62</QtInstall>
|
||||
<QtInstall>msvc2016_64_v632</QtInstall>
|
||||
<QtModules>core;gui;network;widgets;multimedia;printsupport;serialport;xml</QtModules>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="QtSettings">
|
||||
|
@ -119,7 +119,7 @@
|
|||
<QtModules>core;gui;network;widgets;multimedia;printsupport;serialport;xml</QtModules>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<QtInstall>msvc2019_64_v62</QtInstall>
|
||||
<QtInstall>msvc2016_64_v632</QtInstall>
|
||||
<QtModules>core;gui;network;widgets;multimedia;printsupport;serialport;xml</QtModules>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="QtSettings">
|
||||
|
@ -131,7 +131,7 @@
|
|||
</ImportGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>.;..\rtaudio;..\portaudio\include;..\qcustomplot;..\opus\include;..\eigen;..\r8brain-free-src;resampler;release;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>.;.\hidapi\hidapi;..\rtaudio;..\portaudio\include;..\qcustomplot;..\opus\include;..\eigen;..\r8brain-free-src;resampler;release;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalOptions>-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -permissive- -Zc:__cplusplus -Zc:externConstexpr -utf-8 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions)</AdditionalOptions>
|
||||
<AssemblerListingLocation>release\</AssemblerListingLocation>
|
||||
<BrowseInformation>false</BrowseInformation>
|
||||
|
@ -152,8 +152,8 @@
|
|||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>..\portaudio\msvc\X64\Release\portaudio_x64.lib;..\qcustomplot\x64\qcustomplot2.lib;..\opus\win32\VS2015\x64\Release\opus.lib;$(QTDIR)\lib\Qt6Multimedia.lib;$(QTDIR)\lib\Qt6PrintSupport.lib;$(QTDIR)\lib\Qt6Widgets.lib;$(QTDIR)\lib\Qt6Gui.lib;$(QTDIR)\lib\Qt6SerialPort.lib;$(QTDIR)\lib\Qt6Network.lib;$(QTDIR)\lib\Qt6Core.lib;$(QTDIR)\lib\Qt6EntryPoint.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>..\opus\win32\VS2015\x64\Release;..\qcustomplot\x64;..\portaudio\msvc\X64\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>..\hidapi\windows\x64\Release\hidapi.lib;..\portaudio\msvc\X64\Release\portaudio_x64.lib;..\qcustomplot\x64\qcustomplot2.lib;..\opus\win32\VS2015\x64\Release\opus.lib;$(QTDIR)\lib\Qt6Multimedia.lib;$(QTDIR)\lib\Qt6PrintSupport.lib;$(QTDIR)\lib\Qt6Widgets.lib;$(QTDIR)\lib\Qt6Gui.lib;$(QTDIR)\lib\Qt6SerialPort.lib;$(QTDIR)\lib\Qt6Network.lib;$(QTDIR)\lib\Qt6Core.lib;$(QTDIR)\lib\Qt6EntryPoint.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>..\hidapi\windows\x64\Release;..\opus\win32\VS2015\x64\Release;..\qcustomplot\x64;..\portaudio\msvc\X64\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalOptions>"/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
|
||||
<DataExecutionPrevention>true</DataExecutionPrevention>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
|
@ -275,7 +275,7 @@ cmd /c copy /y ..\portaudio\msvc\Win32\Release\portaudio_x86.dll wfview-release\
|
|||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>.;..\rtaudio;..\portaudio\include;..\qcustomplot;..\opus\include;..\eigen;..\r8brain-free-src;resampler;debug;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>.;.\hidapi\hidapi;..\rtaudio;..\portaudio\include;..\qcustomplot;..\opus\include;..\eigen;..\r8brain-free-src;resampler;debug;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalOptions>-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -permissive- -Zc:__cplusplus -Zc:externConstexpr -utf-8 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions)</AdditionalOptions>
|
||||
<AssemblerListingLocation>debug\</AssemblerListingLocation>
|
||||
<BrowseInformation>false</BrowseInformation>
|
||||
|
@ -295,8 +295,8 @@ cmd /c copy /y ..\portaudio\msvc\Win32\Release\portaudio_x86.dll wfview-release\
|
|||
<LanguageStandard_C>stdc17</LanguageStandard_C>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>..\portaudio\msvc\X64\Debug\portaudio_x64.lib;..\qcustomplot\x64\qcustomplotd2.lib;..\opus\win32\VS2015\x64\Debug\opus.lib;$(QTDIR)\lib\Qt6Multimediad.lib;$(QTDIR)\lib\Qt6PrintSupportd.lib;$(QTDIR)\lib\Qt6Widgetsd.lib;$(QTDIR)\lib\Qt6Guid.lib;$(QTDIR)\lib\Qt6SerialPortd.lib;$(QTDIR)\lib\Qt6Networkd.lib;$(QTDIR)\lib\Qt6Cored.lib;$(QTDIR)\lib\Qt6EntryPointd.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>..\opus\win32\VS2015\x64\Debug;..\qcustomplot\x64;..\portaudio\msvc\X64\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>..\hidapi\windows\x64\Debug\hidapi.lib;..\portaudio\msvc\X64\Debug\portaudio_x64.lib;..\qcustomplot\x64\qcustomplotd2.lib;..\opus\win32\VS2015\x64\Debug\opus.lib;$(QTDIR)\lib\Qt6Multimediad.lib;$(QTDIR)\lib\Qt6PrintSupportd.lib;$(QTDIR)\lib\Qt6Widgetsd.lib;$(QTDIR)\lib\Qt6Guid.lib;$(QTDIR)\lib\Qt6SerialPortd.lib;$(QTDIR)\lib\Qt6Networkd.lib;$(QTDIR)\lib\Qt6Cored.lib;$(QTDIR)\lib\Qt6EntryPointd.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>..\hidapi\windows\x64\Debug;..\opus\win32\VS2015\x64\Debug;..\qcustomplot\x64;..\portaudio\msvc\X64\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalOptions>"/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
|
||||
<DataExecutionPrevention>true</DataExecutionPrevention>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
|
@ -415,6 +415,7 @@ cmd /c copy /y ..\portaudio\msvc\Win32\Debug\portaudio_x86.dll wfview-debug</Com
|
|||
<ClCompile Include="cluster.cpp" />
|
||||
<ClCompile Include="commhandler.cpp" />
|
||||
<ClCompile Include="controllersetup.cpp" />
|
||||
<ClCompile Include="cwsender.cpp" />
|
||||
<ClCompile Include="freqmemory.cpp" />
|
||||
<ClCompile Include="logcategories.cpp" />
|
||||
<ClCompile Include="loggingwindow.cpp" />
|
||||
|
@ -443,6 +444,7 @@ cmd /c copy /y ..\portaudio\msvc\Win32\Debug\portaudio_x86.dll wfview-debug</Com
|
|||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\rtaudio\RTAUdio.h" />
|
||||
<ClInclude Include="wfviewtypes.h" />
|
||||
<QtMoc Include="usbcontroller.h" />
|
||||
<QtMoc Include="aboutbox.h">
|
||||
</QtMoc>
|
||||
|
@ -450,6 +452,7 @@ cmd /c copy /y ..\portaudio\msvc\Win32\Debug\portaudio_x86.dll wfview-debug</Com
|
|||
<QtMoc Include="loggingwindow.h" />
|
||||
<QtMoc Include="cluster.h" />
|
||||
<QtMoc Include="controllersetup.h" />
|
||||
<QtMoc Include="cwsender.h" />
|
||||
<ClInclude Include="resampler\arch.h" />
|
||||
<QtMoc Include="audioconverter.h">
|
||||
</QtMoc>
|
||||
|
@ -538,6 +541,7 @@ cmd /c copy /y ..\portaudio\msvc\Win32\Debug\portaudio_x86.dll wfview-debug</Com
|
|||
<QtUic Include="calibrationwindow.ui">
|
||||
</QtUic>
|
||||
<QtUic Include="controllersetup.ui" />
|
||||
<QtUic Include="cwsender.ui" />
|
||||
<QtUic Include="loggingwindow.ui" />
|
||||
<QtUic Include="repeatersetup.ui">
|
||||
</QtUic>
|
||||
|
|
|
@ -149,6 +149,9 @@
|
|||
<ClCompile Include="controllersetup.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="cwsender.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\rtaudio\RTAUdio.h">
|
||||
|
@ -262,6 +265,9 @@
|
|||
<QtMoc Include="wfmain.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</QtMoc>
|
||||
<ClInclude Include="wfviewtypes.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<CustomBuild Include="debug\moc_predefs.h.cbt">
|
||||
|
@ -299,6 +305,9 @@
|
|||
<QtUic Include="wfmain.ui">
|
||||
<Filter>Form Files</Filter>
|
||||
</QtUic>
|
||||
<QtUic Include="cwsender.ui">
|
||||
<Filter>Form Files</Filter>
|
||||
</QtUic>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="qdarkstyle\rc\Hmovetoolbar.png">
|
||||
|
@ -441,5 +450,8 @@
|
|||
<QtMoc Include="controllersetup.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="cwsender.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</QtMoc>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -45,10 +45,10 @@
|
|||
<QtLastBackgroundBuild>2022-08-21T18:58:23.4329764Z</QtLastBackgroundBuild>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="QtSettings">
|
||||
<QtLastBackgroundBuild>2023-01-29T11:49:00.1257696Z</QtLastBackgroundBuild>
|
||||
<QtLastBackgroundBuild>2023-02-14T19:04:15.5036128Z</QtLastBackgroundBuild>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="QtSettings">
|
||||
<QtLastBackgroundBuild>2023-01-29T11:48:59.4191765Z</QtLastBackgroundBuild>
|
||||
<QtLastBackgroundBuild>2023-02-14T19:04:14.6701614Z</QtLastBackgroundBuild>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<QtLastBackgroundBuild>2022-08-22T10:47:49.1255783Z</QtLastBackgroundBuild>
|
||||
|
@ -60,9 +60,9 @@
|
|||
<QtLastBackgroundBuild>2022-08-20T19:06:43.4553894Z</QtLastBackgroundBuild>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
|
||||
<QtLastBackgroundBuild>2023-01-29T11:49:01.5629425Z</QtLastBackgroundBuild>
|
||||
<QtLastBackgroundBuild>2023-02-14T19:04:16.6120542Z</QtLastBackgroundBuild>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="QtSettings">
|
||||
<QtLastBackgroundBuild>2023-01-29T11:49:00.7644018Z</QtLastBackgroundBuild>
|
||||
<QtLastBackgroundBuild>2023-02-14T19:04:16.0046827Z</QtLastBackgroundBuild>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -48,6 +48,7 @@ enum mode_kind {
|
|||
modeLSB_D=0x80,
|
||||
modeUSB_D=0x81,
|
||||
modeDV=0x17,
|
||||
modeATV=0x23,
|
||||
modeDD=0x27,
|
||||
modeWFM,
|
||||
modeS_AMD,
|
||||
|
@ -147,16 +148,19 @@ struct timekind {
|
|||
};
|
||||
|
||||
enum cmds {
|
||||
cmdNone, cmdGetRigID, cmdGetRigCIV, cmdGetFreq, cmdSetFreq, cmdGetMode, cmdSetMode,
|
||||
cmdNone, cmdGetRigID, cmdGetRigCIV, cmdGetFreq, cmdGetFreqB, cmdSetFreq, cmdGetMode, cmdSetMode,
|
||||
cmdGetDataMode, cmdSetModeFilter, cmdSetDataModeOn, cmdSetDataModeOff, cmdGetRitEnabled, cmdGetRitValue,
|
||||
cmdSpecOn, cmdSpecOff, cmdDispEnable, cmdDispDisable, cmdGetRxGain, cmdSetRxRfGain, cmdGetAfGain, cmdSetAfGain,
|
||||
cmdGetSql, cmdSetSql, cmdGetIFShift, cmdSetIFShift, cmdGetTPBFInner, cmdSetTPBFInner,
|
||||
cmdGetTPBFOuter, cmdSetTPBFOuter, cmdGetPassband, cmdSetPassband,
|
||||
cmdGetSql, cmdSetSql, cmdGetIFShift, cmdSetIFShift, cmdGetNRLevel, cmdSetNRLevel, cmdGetTPBFInner, cmdSetTPBFInner,
|
||||
cmdGetTPBFOuter, cmdSetTPBFOuter, cmdGetPassband, cmdSetPassband, cmdGetNBLevel, cmdSetNBLevel,
|
||||
cmdGetCompLevel, cmdSetCompLevel,
|
||||
cmdGetMonitorGain, cmdSetMonitorGain, cmdGetVoxGain, cmdSetVoxGain, cmdGetAntiVoxGain, cmdSetAntiVoxGain,
|
||||
cmdGetCwPitch, cmdGetPskTone, cmdGetRttyMark, cmdSetCwPitch, cmdSetPskTone, cmdSetRttyMark,
|
||||
cmdGetVox,cmdSetVox, cmdGetMonitor,cmdSetMonitor, cmdGetComp, cmdSetComp, cmdGetNB, cmdSetNB, cmdGetNR, cmdSetNR,
|
||||
cmdSetATU, cmdStartATU, cmdGetATUStatus,
|
||||
cmdGetSpectrumMode, cmdGetSpectrumSpan, cmdScopeCenterMode, cmdScopeFixedMode,
|
||||
cmdGetPTT, cmdSetPTT,cmdPTTToggle,
|
||||
cmdGetTxPower, cmdSetTxPower, cmdGetMicGain, cmdSetMicGain, cmdSetModLevel,
|
||||
cmdGetTxPower, cmdSetTxPower, cmdGetMicGain, cmdSetMicGain, cmdGetModLevel, cmdSetModLevel,
|
||||
cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput,
|
||||
cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed,
|
||||
cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter,
|
||||
|
@ -166,10 +170,12 @@ enum cmds {
|
|||
cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset,
|
||||
cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS, cmdSetQuickSplit,
|
||||
cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna,
|
||||
cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW,
|
||||
cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW, cmdGetDashRatio, cmdSetDashRatio,
|
||||
cmdSetTime, cmdSetDate, cmdSetUTCOffset,
|
||||
// Below Only used for USB Controller at the moment.
|
||||
cmdSetBandUp, cmdSetBandDown, cmdSetModeUp, cmdSetModeDown, cmdSetStepUp, cmdSetStepDown, cmdSetSpanUp, cmdSetSpanDown, cmdIFFilterUp, cmdIFFilterDown
|
||||
cmdSetBandUp, cmdSetBandDown, cmdSetModeUp, cmdSetModeDown, cmdSetStepUp, cmdSetStepDown,
|
||||
cmdSetSpanUp, cmdSetSpanDown, cmdIFFilterUp, cmdIFFilterDown, cmdPageDown, cmdPageUp,
|
||||
cmdLCDWaterfall, cmdLCDSpectrum, cmdLCDNothing, cmdSeparator
|
||||
};
|
||||
|
||||
struct commandtype {
|
||||
|
@ -194,6 +200,15 @@ enum codecType { LPCM, PCMU, OPUS };
|
|||
|
||||
enum passbandActions {passbandStatic, pbtInnerMove, pbtOuterMove, pbtMoving, passbandResizing};
|
||||
|
||||
enum usbDeviceType { usbNone = 0, shuttleXpress, shuttlePro2, RC28, xBoxGamepad, unknownGamepad };
|
||||
enum usbDeviceType { usbNone = 0, shuttleXpress, shuttlePro2,
|
||||
RC28, xBoxGamepad, unknownGamepad, eCoderPlus, QuickKeys,
|
||||
StreamDeckMini,StreamDeckMiniV2,StreamDeckOriginal,StreamDeckOriginalV2,
|
||||
StreamDeckOriginalMK2,StreamDeckXL,StreamDeckXLV2,StreamDeckPedal, StreamDeckPlus,
|
||||
XKeysXK3
|
||||
};
|
||||
|
||||
enum usbCommandType{ commandButton, commandKnob, commandAny };
|
||||
enum usbFeatureType { featureReset,featureResetKeys, featureEventsA, featureEventsB, featureFirmware, featureSerial, featureButton, featureSensitivity, featureBrightness,
|
||||
featureOrientation, featureSpeed, featureColor, featureOverlay, featureTimeout, featureLCD, featureGraph, featureLEDControl };
|
||||
|
||||
#endif // WFVIEWTYPES_H
|
||||
|
|