SigDigger
SigDigger copied to clipboard
Nicer panoramic spectrum zoom
Needs to be paired with changes to SuWidgets, and some changes I made to suscan also help
One known issue at this moment: when you stop the scanner and then zoom into the last frequency range fed into the waterfall by the scanner (pointed to by m_partialFftData in the waterfall), the data seen may be corrupted. I think this is a use-after-free due to the lifecycle of PSD data from the scanner class; need to confirm.
I am afraid this is crashing SigDigger in my machine during startup:
Thread 1 "SigDigger" received signal SIGSEGV, Segmentation fault.
0x00007ffff7f44a12 in AbstractWaterfall::setFftPlotColor (this=0x6900630069006c, color=...) at AbstractWaterfall.cpp:1674
1674 m_FftColor = color;
(gdb) bt
#0 0x00007ffff7f44a12 in AbstractWaterfall::setFftPlotColor(QColor) (this=0x6900630069006c, color=...) at AbstractWaterfall.cpp:1674
#1 0x000055555579cbb5 in SigDigger::PanoramicDialog::setColors(SigDigger::ColorConfig const&) ()
#2 0x00005555557907db in SigDigger::UIMediator::applyConfig() ()
#3 0x000055555564a638 in SigDigger::Application::run(Suscan::Object const&) ()
#4 0x0000555555657aae in SigDigger::Loader::handleDone() ()
#5 0x00007ffff6130a7c in QObject::event(QEvent*) (this=0x7fffffffdb80, e=0x7fff94bfc3f0) at /home/qt/work/qt/qtbase/src/corelib/kernel/qobject.cpp:1365
#6 0x00007ffff7254a62 in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=<optimized out>, receiver=0x7fffffffdb80, e=0x7fff94bfc3f0) at /home/qt/work/qt/qtbase/src/widgets/kernel/qapplication.cpp:3409
#7 0x00007ffff60e301a in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x7fffffffdb80, event=0x7fff94bfc3f0) at /home/qt/work/qt/qtbase/src/corelib/kernel/qcoreapplication.cpp:1067
#8 0x00007ffff60e5f7c in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) (receiver=0x0, event_type=0, data=0x555556010270) at /home/qt/work/qt/qtbase/src/corelib/kernel/qcoreapplication.cpp:1834
#9 0x00007ffff634a5d3 in postEventSourceDispatch(GSource*, GSourceFunc, gpointer) (s=0x555556011540) at /home/qt/work/qt/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:279
#10 0x00007ffff47dc7a9 in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#11 0x00007ffff47dca38 in () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#12 0x00007ffff47dcacc in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#13 0x00007ffff6349fdf in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x5555560afe40, flags=...) at /home/qt/work/qt/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:429
#14 0x0000555555657b41 in SigDigger::Loader::showMessage(QString const&) ()
#15 0x0000555555657e9a in SigDigger::Loader::handleChange(QString const&) ()
#16 0x00007ffff6130a7c in QObject::event(QEvent*) (this=0x7fffffffdb80, e=0x7fff9490bdb0) at /home/qt/work/qt/qtbase/src/corelib/kernel/qobject.cpp:1365
#17 0x00007ffff7254a62 in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=<optimized out>, receiver=0x7fffffffdb80, e=0x7fff9490bdb0) at /home/qt/work/qt/qtbase/src/widgets/kernel/qapplication.cpp:3409
#18 0x00007ffff60e301a in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x7fffffffdb80, event=0x7fff9490bdb0) at /home/qt/work/qt/qtbase/src/corelib/kernel/qcoreapplication.cpp:1067
#19 0x00007ffff60e5f7c in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) (receiver=0x0, event_type=0, data=0x555556010270) at /home/qt/work/qt/qtbase/src/corelib/kernel/qcoreapplication.cpp:1834
#20 0x00007ffff634a5d3 in postEventSourceDispatch(GSource*, GSourceFunc, gpointer) (s=0x555556011540) at /home/qt/work/qt/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:279
#21 0x00007ffff47dc7a9 in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#22 0x00007ffff47dca38 in () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#23 0x00007ffff47dcacc in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#24 0x00007ffff6349fdf in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x5555560afe40, flags=...) at /home/qt/work/qt/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:429
#25 0x0000555555657b41 in SigDigger::Loader::showMessage(QString const&) ()
#26 0x0000555555657e9a in SigDigger::Loader::handleChange(QString const&) ()
#27 0x00007ffff6130a7c in QObject::event(QEvent*) (this=0x7fffffffdb80, e=0x7fff948e3350) at /home/qt/work/qt/qtbase/src/corelib/kernel/qobject.cpp:1365
#28 0x00007ffff7254a62 in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=<optimized out>, receiver=0x7fffffffdb80, e=0x7fff948e3350) at /home/qt/work/qt/qtbase/src/widgets/kernel/qapplication.cpp:3409
#29 0x00007ffff60e301a in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x7fffffffdb80, event=0x7fff948e3350) at /home/qt/work/qt/qtbase/src/corelib/kernel/qcoreapplication.cpp:1067
#30 0x00007ffff60e5f7c in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) (receiver=0x0, event_type=0, data=0x555556010270) at /home/qt/work/qt/qtbase/src/corelib/kernel/qcoreapplication.cpp:1834
#31 0x00007ffff634a5d3 in postEventSourceDispatch(GSource*, GSourceFunc, gpointer) (s=0x555556011540) at /home/qt/work/qt/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:279
#32 0x00007ffff47dc7a9 in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#33 0x00007ffff47dca38 in () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#34 0x00007ffff47dcacc in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#35 0x00007ffff6349f5a in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x5555560afe40, flags=...) at /home/qt/work/qt/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:429
#36 0x00007ffff60ef0bb in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (this=this@entry=0x7fffffffda50, flags=..., flags@entry=...) at /home/qt/work/qt/qtbase/src/corelib/global/qflags.h:69
#37 0x00007ffff60eb00b in QCoreApplication::exec() () at /home/qt/work/qt/qtbase/src/corelib/global/qflags.h:109
#38 0x0000555555646bb5 in main ()
(gdb)
It seems that PanoramicDialog::waterfall was not being initialized to nullptr in construction. I am leveraging this crash to do some style cleanup in the class (prefix private members by m_, remove this-> unless it is necessary etc). I hope to fix it in no time.
Fixed, now I am seeing the panoramic spectrum just fine. It is almost like magic, being able to zoom in and out with OpenGL enabled here and also with the peace of mind of having a dedicated API to update partial portions of the FFT. Awesome! It will take a while for me to review all these changes, but this looks good so far.
Great, glad you like it. Thanks for catching the waterfall pointer initialization issue, I’ll add a commit for that. I also started fixing that UAF I mentioned last night, I’ll upload a fix for that once ready.
Nah don't worry about the waterfall pointer. I prefixed everything by m_ in the same commit. I have a copy of your feature branch under SigDigger to keep working at home.
El jue., 16 may. 2024 14:20, Sultan Qasim Khan @.***> escribió:
Great, glad you like it. Thanks for catching the waterfall pointer initialization issue, I’ll add a commit for that. I also started fixing that UAF I mentioned last night, I’ll upload a fix for that once ready.
— Reply to this email directly, view it on GitHub https://github.com/BatchDrake/SigDigger/pull/245#issuecomment-2115102599, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAEVETY6SIE47BPUYLQUC4TZCSQB7AVCNFSM6AAAAABHY7DL6KVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMJVGEYDENJZHE . You are receiving this because you commented.Message ID: @.***>
Ah, I see. I'll rebase on your https://github.com/BatchDrake/SigDigger/commits/sultanqasim-develop/ branch.
Building on top of your commit, I fixed the use-after-free issue and a couple other bugs.
You will also need https://github.com/BatchDrake/suscan/pull/87 to support the last commit about non-hopping startup
Just tested it now, it currently works wonderfully. The only thing that is a bit bothersome is that, as soon as I stop the capture, I get these message box. I believe the analyzer is not properly signaling its graceful finalization to the GUI. This one may be on me, so I will investigate it later.
Just tested it now, it currently works wonderfully. The only thing that is a bit bothersome is that, as soon as I stop the capture, I get these message box. I believe the analyzer is not properly signaling its graceful finalization to the GUI. This one may be on me, so I will investigate it later.
Ah, I hadn't seen that message when testing on Mac but maybe the Linux timing is a little different.
I attempted to build the PR by modifying blsd to build the sultanqasim-develop branch, however, the following occurred on 22.04 w/ GCC 11 (probably what's causing the error?).
CWD: /usr/src/blsd-dir/build-root/SigDigger
Audio/AudioFileSaver.cpp: In member function ‘virtual bool SigDigger::AudioFileWriter::prepare()’:
Audio/AudioFileSaver.cpp:60:12: warning: enumeration value ‘RAW’ not handled in switch [-Wswitch]
60 | switch (this->params.modulation) {
| ^
Misc/SigDiggerHelpers.cpp: In static member function ‘static void SigDigger::SigDiggerHelpers::openSaveCoherentSamplesDialog(QWidget*, const std::complex<float>*, const std::complex<float>*, size_t, qreal, int, int, Suscan::MultitaskController*)’:
Misc/SigDiggerHelpers.cpp:249:11: warning: unused parameter ‘fs’ [-Wunused-parameter]
249 | qreal fs,
| ~~~~~~^~
Panoramic/Scanner.cpp: In member function ‘void SigDigger::SpectrumView::feedLinearMode(const float*, const float*, uint64_t, double, double, bool)’:
Panoramic/Scanner.cpp:170:21: error: ‘clamp’ is not a member of ‘std’
170 | startBin = std::clamp(startBin, 0, static_cast<int>(psdSize - 1));
| ^~~~~
Panoramic/Scanner.cpp:171:19: error: ‘clamp’ is not a member of ‘std’
171 | endBin = std::clamp(endBin, startBin + 1, static_cast<int>(psdSize));
| ^~~~~
Panoramic/Scanner.cpp: In member function ‘void SigDigger::SpectrumView::feedHistogramMode(const float*, uint64_t, double, double)’:
Panoramic/Scanner.cpp:206:12: error: ‘clamp’ is not a member of ‘std’
206 | j = std::clamp(
| ^~~~~
make: *** [Makefile:54240: Scanner.o] Error 1
make: *** Waiting for unfinished jobs....
--------------8<----------------------------------------
I thought I'd get away with just modifying dist-utils.sh and blsd to build the specific SigDigger branch as it seems everything else either made it to master or to develop. I should probably just wait till it's merged, but thought I'd give it a spin and provide some feedback.
My mistake, I don't think I was actually puling the correct branch. It build and I believe I'm running the newer panoramic setup.
Just a note, if I zoom in with say a 90Mhz - 100Mhz range and then try to zoom out with the scroll wheel, it doesn't actually seem to scroll out to where it first started. I have to hit stop then start to get the full range back in view within the fft/waterfall window. Also selected MHz doesn't seem to match what I'm selecting. I'm probably getting ahead of things that are still being worked out and/or doing something wrong on my end.
Probably, since changes for this feature span SigDigger, Susan and SuWidgets. I haven't finished the review yet.
El jue., 23 may. 2024 5:24, alphafox02 @.***> escribió:
Just a note, if I zoom in with say a 90Mhz - 100Mhz range and then try to zoom out with the scroll wheel, it doesn't actually seem to scroll out to where it first started. I have to hit stop then start to get the full range back in view within the fft/waterfall window. Also selected MHz doesn't seem to match what I'm selecting. I'm probably getting ahead of things that are still being worked out and/or doing something wrong on my end.
— Reply to this email directly, view it on GitHub https://github.com/BatchDrake/SigDigger/pull/245#issuecomment-2126159543, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAEVET6TKTYT7WC7GAICM3LZDVOOZAVCNFSM6AAAAABHY7DL6KVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMRWGE2TSNJUGM . You are receiving this because you commented.Message ID: @.***>
Just a note, if I zoom in with say a 90Mhz - 100Mhz range and then try to zoom out with the scroll wheel, it doesn't actually seem to scroll out to where it first started. I have to hit stop then start to get the full range back in view within the fft/waterfall window. Also selected MHz doesn't seem to match what I'm selecting. I'm probably getting ahead of things that are still being worked out and/or doing something wrong on my end.
Seems strange; are you sure you have the right branches built? BatchDrake’s development branches of SuScan/SuWidgets/Sigutils + this branch of SigDigger should work. I’ll message you a video of how it should be behaving.
I changed the following just now and pointed the relevant section of blsd to it. It was late last night, so when I did build it successfully I had actually reverted to it building the standard version and didn't realize it. https://raw.githubusercontent.com/alphafox02/SigDigger/sultanqasim-develop/Scripts/dist-common.sh
# The latest sigutils is now on master
try "Cloning sigutils (${BRANCH})..." git clone --recurse-submodules -b master https://github.com/BatchDrake/sigutils
try "Cloning suscan (${BRANCH})..." git clone --recurse-submodules -b "$BRANCH" https://github.com/BatchDrake/suscan
try "Cloning SuWidgets (${BRANCH})..." git clone --recurse-submodules -b "$BRANCH" https://github.com/BatchDrake/SuWidgets
try "Cloning SigDigger (${BRANCH})..." git clone --recurse-submodules -b sultanqasim-develop https://github.com/BatchDrake/SigDigger
try "Creating builddirs..." mkdir -p sigutils/build suscan/build
Now that I'm back to building the correct branch(s?), I get the
[ FAILED ] Building SigDigger...
--------------8<----------------------------------------
Try: make -j 8
CWD: /usr/src/blsd-dir/build-root/SigDigger
Audio/AudioFileSaver.cpp: In member function ‘virtual bool SigDigger::AudioFileWriter::prepare()’:
Audio/AudioFileSaver.cpp:60:12: warning: enumeration value ‘RAW’ not handled in switch [-Wswitch]
60 | switch (this->params.modulation) {
| ^
Misc/SigDiggerHelpers.cpp: In static member function ‘static void SigDigger::SigDiggerHelpers::openSaveCoherentSamplesDialog(QWidget*, const std::complex<float>*, const std::complex<float>*, size_t, qreal, int, int, Suscan::MultitaskController*)’:
Misc/SigDiggerHelpers.cpp:249:11: warning: unused parameter ‘fs’ [-Wunused-parameter]
249 | qreal fs,
| ~~~~~~^~
Panoramic/Scanner.cpp: In member function ‘void SigDigger::SpectrumView::feedLinearMode(const float*, const float*, uint64_t, double, double, bool)’:
Panoramic/Scanner.cpp:170:21: error: ‘clamp’ is not a member of ‘std’
170 | startBin = std::clamp(startBin, 0, static_cast<int>(psdSize - 1));
| ^~~~~
Panoramic/Scanner.cpp:171:19: error: ‘clamp’ is not a member of ‘std’
171 | endBin = std::clamp(endBin, startBin + 1, static_cast<int>(psdSize));
| ^~~~~
Panoramic/Scanner.cpp: In member function ‘void SigDigger::SpectrumView::feedHistogramMode(const float*, uint64_t, double, double)’:
Panoramic/Scanner.cpp:206:12: error: ‘clamp’ is not a member of ‘std’
206 | j = std::clamp(
| ^~~~~
make: *** [Makefile:54240: Scanner.o] Error 1
make: *** Waiting for unfinished jobs....
In member function ‘void QVector<T>::append(const T&) [with T = Suscan::LoggerMessage]’:
cc1plus: warning: writing 16 bytes into a region of size 0 [-Wstringop-overflow=]
In file included from ../../../../include/x86_64-linux-gnu/qt5/QtCore/qbytearray.h:46,
from ../../../../include/x86_64-linux-gnu/qt5/QtCore/qstring.h:50,
from ../../../../include/x86_64-linux-gnu/qt5/QtCore/qobject.h:47,
from ../../../../include/x86_64-linux-gnu/qt5/QtWidgets/qwidget.h:45,
from ../../../../include/x86_64-linux-gnu/qt5/QtWidgets/qdialog.h:44,
from ../../../../include/x86_64-linux-gnu/qt5/QtWidgets/QDialog:1,
from include/LogDialog.h:22,
from Components/LogDialog.cpp:20:
../../../../include/x86_64-linux-gnu/qt5/QtCore/qarraydata.h:129:8: note: at offset [40, 64] into destination object ‘QTypedArrayData<Suscan::LoggerMessage>::<anonymous>’ of size 24
129 | struct QTypedArrayData
| ^~~~~~~~~~~~~~~
cc1plus: warning: writing 16 bytes into a region of size 0 [-Wstringop-overflow=]
../../../../include/x86_64-linux-gnu/qt5/QtCore/qarraydata.h:129:8: note: at offset [72, 96] into destination object ‘QTypedArrayData<Suscan::LoggerMessage>::<anonymous>’ of size 24
cc1plus: warning: writing 16 bytes into a region of size 0 [-Wstringop-overflow=]
../../../../include/x86_64-linux-gnu/qt5/QtCore/qarraydata.h:129:8: note: at offset [112, 136] into destination object ‘QTypedArrayData<Suscan::LoggerMessage>::<anonymous>’ of size 24
--------------8<----------------------------------------
Searching seems to point to the
error: ‘clamp’ is not a member of ‘std’
being related to it being C++17 exclusive and to "compile in that mode".
I was able to reproduce the error stopping the scanner on Linux. I'll look into this when I have a moment.
Deleting the analyzer on stop should make the stopping work like before from suscan's perspective, and there was no need to keep it around anyway, since we just needed the spectrum views in the scanner. Now stopping it works properly on Linux.
Probably, since changes for this feature span SigDigger, Susan and SuWidgets. I haven't finished the review yet. El jue., 23 may. 2024 5:24, alphafox02 @.> escribió: … Just a note, if I zoom in with say a 90Mhz - 100Mhz range and then try to zoom out with the scroll wheel, it doesn't actually seem to scroll out to where it first started. I have to hit stop then start to get the full range back in view within the fft/waterfall window. Also selected MHz doesn't seem to match what I'm selecting. I'm probably getting ahead of things that are still being worked out and/or doing something wrong on my end. — Reply to this email directly, view it on GitHub <#245 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAEVET6TKTYT7WC7GAICM3LZDVOOZAVCNFSM6AAAAABHY7DL6KVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMRWGE2TSNJUGM . You are receiving this because you commented.Message ID: @.>
I’m going to try the change suggested here to the .pro file
https://forum.qt.io/topic/84269/can-i-use-clang-with-std-c-17-in-qmake
Modifying the SigDigger.pro to CONFIG += c++1z allows me to build this PR. May need to account for this need on 22.04 or other systems.
Modifying the SigDigger.pro to CONFIG += c++1z allows me to build this PR. May need to account for this need on 22.04 or other systems.
Hopefully my last patch will fix build for you
I also put up an unrelated change to fix build on Fedora
Sorry about my flip-flopping force pushes regarding the last commit around how to handle frequency range updates in non-hopping mode. After some initial thought I removed the logic to base the spectrum view range on the sample rate altogether, but later decided to bring it back because there is one situation where it could be useful: looking at what happened on channels outside the zoomed view when zooming back out or panning in the OpenGL waterfall.
Anyway, this is working well for me on Linux and Mac and should be ready to be merged. Also have a look at my latest SuWidgets pull request; I have a couple bug fixes there.
With the change to the SigDigger.pro it builds without issue on 22.04 now with stock qt5. Just built it by changing blsd to pull dist-common from my fork of your SigDigger and all lines putting to develop on your repos. Hope that makes sense.
Hi,
I have just tested the changes. Some issues (some of them may be yours, some mine):
- Clicking and unclicking "full device range" does not seem to affect the sweep range.
- If we select a radio for which a sane RTT does not exist, the current RTT does not change. This is an issue if we select an USRP (2 ms) and, immediately after, something else.
- For large RTTs (e.g. 100 ms), the waterfall becomes unresponsive. This is because it does not have information on how fast the spectrum updates are expected to come, or it thinks that it is in "fast mode", i.e. FFT updates are fast enough to refresh on each mouse interaction. See
slow()inAbstractWaterfall.h. - Opening the panoramic spectrum dialog reverts always to the first device in the list (although I believe this was an old bug)
- At some point I got spectrum updates (i.e. I could see the curve) but no waterfall updates. I thought this had to do with the waterfall's timespan, but since it is fixed to 30 s I doubt it. I cannot replicate it any longer.
- There are artifacts when I zoom in and out with the mouse quickly. Some gaps are not filled with previous values, but with the lowest possible value. This is not physical (see below):
Thanks for your testing,
- For the "full device range" checkbox, I don't recall seeing the issue you described, but I'll check again.
- For radios for which no suggested RTT is available, are you suggested I add a slow-ish default (say 20 ms?). Keep in mind with changes I made to suscan, the RTT is now about how many milliseconds worth of samples in addition to the measured retuning time should be discarded. I made that change because different frequency jumps can take different amounts of time to retune, and some driver versions tune faster than others. The "RTT" is now mainly influenced by buffer sizes and latency rather than tuning time. Thus, the RTT label is a bit of a misnomer now; maybe I should rename it but I'm not sure of an elegant name for what it actually represents now.
- Good point about using slow mode for slow RTTs, I can add some logic to account for that.
- Defaulting to the first device in the list is unchanged behaviour, though I can look into saving the device selection for that.
- I'm not sure what caused that bug you described. However, while experimenting with the new RFNM SDR I just got, I encountered a couple instances of the opposite (with the regular non-panoramic main spectrum) where the waterfall was updating but the line graph stayed blank. I'll look into causes of that, though it's probably a widget bug unrelated to the panoramic spectrum functionality.
- The artifacts of low values on fast zoom out are due to the operation of the
Scannerclass and associated spectrum views. Essentially, theScanneronly keeps track of the spectrum at the current (zoomed) sweep range, and only the waterfall widget knows the previous values for the frequencies outside the current sweep range. Thus, when zooming out (flipping the spectrum view and feeding the old narrower view into the new wider one), the edges of the new wider frequency range get initialized to the minimum value until replaced by new data. In other words, it's working as designed albeit not beautiful. Perhaps filling the edges with the value from the edge of the old narrow spectrum view when zooming out would be less ugly, but I'll let you suggest what approach you want to take with that.
One other thing: because I changed the meaning of "RTT", it would be good to redetermine the default/optimal "RTT" values for the various SDRs. I did this for the RTL-SDR and USRP, though the same should also be done for the other listed SDRs that I don't have personally.
I figured out the full device range issue: it was because the frequency spin box wasn't emitting valueChanged when its value was changed through a call to setValue. Fix added to my latest SuWidgets PR.
