mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-06-15 04:52:33 -04:00
Compare commits
116 Commits
4538d46c5d
...
e22688e462
Author | SHA1 | Date | |
---|---|---|---|
|
e22688e462 | ||
|
fd1d411bf0 | ||
|
2baea0364b | ||
|
b4e2943298 | ||
|
3e909d2016 | ||
|
a4b78fa30e | ||
|
4bef2355dd | ||
|
c6526aae49 | ||
|
a45e4eab0a | ||
|
79deb41ddb | ||
|
98fb7a58d9 | ||
|
d8c733cab7 | ||
|
685d30f15a | ||
|
5cbc9fd834 | ||
|
1f9c7efcab | ||
|
2b0bcb0d09 | ||
|
23eae6fda9 | ||
|
e4e2588164 | ||
|
1fd56fdb42 | ||
|
941e73c561 | ||
|
31c20df7bb | ||
|
8a7d1534d8 | ||
|
5070112c18 | ||
|
7336cda7bc | ||
|
28cc7c3f31 | ||
|
c1d55b9af1 | ||
|
092efb3780 | ||
|
4837d3aba3 | ||
|
5f0fc8fbf7 | ||
|
1625c42e38 | ||
|
9e4dc83e74 | ||
|
0488cc622e | ||
|
306055faea | ||
|
fd9e9959f6 | ||
|
78e7fdc473 | ||
|
64d75baadf | ||
|
deb4feed3b | ||
|
c62f128ca1 | ||
|
159d46ee36 | ||
|
4770e2d281 | ||
|
65a5f98d88 | ||
|
36a33bb8ea | ||
|
f5dc0e3d3d | ||
|
9aacea3d59 | ||
|
87dba4d26e | ||
|
741f1f7c87 | ||
|
b1ef05667e | ||
|
c81ff5060c | ||
|
ea04742685 | ||
|
322296f1af | ||
|
bf74dc53e0 | ||
|
406bb674c5 | ||
|
cd4ad2cc95 | ||
|
98baa03619 | ||
|
625027c35e | ||
|
c7a27bfa07 | ||
|
5821171398 | ||
|
ab28672c95 | ||
|
8742904d7d | ||
|
cc420c3c4b | ||
|
41716632d4 | ||
|
4f822b4daf | ||
|
1034e3aa99 | ||
|
b1a460fca8 | ||
|
31ad607721 | ||
|
2fff671a33 | ||
|
3849b1806f | ||
|
055c03c2b7 | ||
|
79db899dff | ||
|
df42b3019c | ||
|
11a672161d | ||
|
52f3618e56 | ||
|
1b2a549463 | ||
|
6989b76902 | ||
|
e381f0b3e4 | ||
|
bbf65831f7 | ||
|
d57fbc866b | ||
|
7281e238d9 | ||
|
aeab5d9229 | ||
|
07721385f1 | ||
|
e95cf97c42 | ||
|
c3b7fd2784 | ||
|
f49a0ec796 | ||
|
f5a1ef47b5 | ||
|
a7969adfe9 | ||
|
523be287ad | ||
|
59fa653bd8 | ||
|
4c32c19308 | ||
|
ade3eedfa5 | ||
|
cfc0114c87 | ||
|
524bfd447d | ||
|
209e3a9ecb | ||
|
f6425af84d | ||
|
e5003af211 | ||
|
4252592045 | ||
|
710ad0b9e3 | ||
|
fd2959a878 | ||
|
03bb11b869 | ||
|
4cf54cb9a5 | ||
|
ac00e5b46b | ||
|
a99082bda9 | ||
|
c913b20a27 | ||
|
10aae9cfd4 | ||
|
cf0e129165 | ||
|
302f99382a | ||
|
8b5a5b7f70 | ||
|
98abefc68b | ||
|
bace0951bb | ||
|
7939197f9d | ||
|
4f9f1dc602 | ||
|
3da44b79b5 | ||
|
af712de404 | ||
|
c7c0247f81 | ||
|
efa2f75170 | ||
|
1e517a68e8 | ||
|
2d3dc836dd |
10
.github/workflows/sdrangel.yml
vendored
10
.github/workflows/sdrangel.yml
vendored
@ -31,7 +31,7 @@ jobs:
|
||||
generators: Ninja
|
||||
}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
@ -81,7 +81,7 @@ jobs:
|
||||
cmd "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
|
||||
choco install patch
|
||||
mkdir build && cd build
|
||||
cmake .. -G "${{ matrix.config.generators }}" -DCMAKE_BUILD_TYPE=Release -DARCH_OPT=SSE4_2 -DDEBUG_OUTPUT=ON -DENABLE_MIRISDR=OFF -DENABLE_FEATURE_MORSEDECODER=OFF -DBUILD_SERVER=OFF -DCMAKE_PREFIX_PATH="C:\Qt\5.15.2\msvc2019_64;C:\Libraries\boost_1_73_0"
|
||||
cmake .. -G "${{ matrix.config.generators }}" -DCMAKE_BUILD_TYPE=Release -DARCH_OPT=SSE4_2 -DDEBUG_OUTPUT=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DCMAKE_PREFIX_PATH="C:\Qt\5.15.2\msvc2019_64;C:\Libraries\boost_1_73_0"
|
||||
cmake --build . --config Release --target package
|
||||
- name: Check disk space
|
||||
run: Get-PSDrive
|
||||
@ -102,7 +102,7 @@ jobs:
|
||||
build_mac:
|
||||
runs-on: macos-13
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
@ -121,11 +121,11 @@ jobs:
|
||||
rm -f /usr/local/bin/2to3
|
||||
brew install opencv
|
||||
- name: Install brew packages
|
||||
run: brew install nasm boost hidapi libusb fftw faad2 zlib airspy airspyhf hackrf rtl-sdr libbladerf soapysdr qt
|
||||
run: brew install nasm boost hidapi libusb fftw ffmpeg@5 faad2 zlib airspy airspyhf hackrf rtl-sdr libbladerf soapysdr qt subversion
|
||||
- name: Configure SDRangel
|
||||
run: |
|
||||
mkdir build && cd build
|
||||
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_QT6=ON -DCMAKE_BUILD_TYPE=Release -DARCH_OPT=nehalem -DDEBUG_OUTPUT=ON -DENABLE_CHANNELRX_DEMODDATV=OFF -DENABLE_CHANNELTX_MODDATV=OFF -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DENABLE_EXTERNAL_LIBRARIES=AUTO -DBUNDLE=ON -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=TRUE
|
||||
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_QT6=ON -DCMAKE_BUILD_TYPE=Release -DARCH_OPT=nehalem -DDEBUG_OUTPUT=ON -DENABLE_CHANNELRX_DEMODDATV=OFF -DENABLE_CHANNELTX_MODDATV=OFF -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DENABLE_EXTERNAL_LIBRARIES=AUTO -DBUNDLE=ON -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=TRUE -DCMAKE_PREFIX_PATH="/usr/local/opt/ffmpeg@5/"
|
||||
- name: Get filename
|
||||
id: get_filename
|
||||
run: echo "filename=$(grep CPACK_PACKAGE_FILE_NAME build/CMakeCache.txt | cut -d "=" -f2)" >> $GITHUB_OUTPUT
|
||||
|
8
.gitignore
vendored
8
.gitignore
vendored
@ -43,4 +43,10 @@ obj-x86_64-linux-gnu/*
|
||||
|
||||
/rescuesdriq/vendor/
|
||||
/rescuesdriq/Godeps/
|
||||
/.vs
|
||||
/.vs
|
||||
|
||||
# WDSP
|
||||
wdsp/*.o
|
||||
wdsp/*.h
|
||||
wdsp/*.c
|
||||
wdsp/Makefile
|
||||
|
60
CHANGELOG
60
CHANGELOG
@ -1,3 +1,63 @@
|
||||
sdrangel (7.21.4-1) unstable; urgency=medium
|
||||
|
||||
* Code fixes. PR #2184
|
||||
* Do not save the settings twice. PR #2182
|
||||
* FreqScanner: Add HF ATC channels preset. PR #2181
|
||||
* FreqScanner: Add API action to run scan. Add scan results to channel report. PR #2181
|
||||
* FreqScanner: Add scanState to FreqScanner Report. PR #2181
|
||||
* Configurations dialog: Fix slot names. PR #2180
|
||||
* AIS: Validate message length. Fixes #2125. PR #2180
|
||||
* ILS Demod. Save frequency when switching between LOC and G/S. PR #2180
|
||||
* ILS Demod. Set frequency for ident when in G/S mode. Fixes #2177. PR #2180
|
||||
* Heat Map: Handle memory allocation errors. PR #2175
|
||||
* Heat Map: Allow selecting which data to be saved to reduce memory requirements. PR #2175
|
||||
* ILS Demod: Add DDM/SDM/Deviation to channel report. PR #2174
|
||||
|
||||
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Tue, 25 Jun 2024 20:17:52 +0200
|
||||
|
||||
sdrangel (7.21.3-1) unstable; urgency=medium
|
||||
|
||||
* Update sdrangel-windows-libraries to latest revision. PR #2173 fixes #2155
|
||||
* SDRplayV3Input: Add SDRPLAY_RSPdxR2_ID support. PR #2172 fixes #2155
|
||||
* Fix tooltips. PR #2170
|
||||
* Update external/windows to latest sdrangel-windows-libraries. PR #2169
|
||||
* Update SDRplay API to 3.15 on Mac. PR #2169
|
||||
* Fix typo in ILS freq. PR #2168
|
||||
* Remove use of deprecated QRegExp. PR #2160
|
||||
* Fix memleaks. PR #2157
|
||||
|
||||
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Mon, 17 Jun 2024 22:30:17 +0200
|
||||
|
||||
sdrangel (7.21.2-1) unstable; urgency=medium
|
||||
|
||||
* Morse Decoder feature: build for Windows. Issue #2152
|
||||
* Satellite Tracker Settings: add missing help description of Replay tab, PR #2151
|
||||
* Satellite Tracker Settings: update help page for new button. PR #2151
|
||||
* Satellite Tracker Settings: add a button to reset the list of TLE. PR #2151
|
||||
* Move defines to the header so they can be reused elsewhere. PR #2151
|
||||
* Factor out the code that updates the widget containing the list of TLEs. PR #2151
|
||||
* Use https for all addresses. PR #2151
|
||||
* Set CMAKE_PREFIX_PATH to include ffmpeg@5. PR #2149
|
||||
* Github mac CI: Try ffmpeg@5. PR #2149
|
||||
* CUDAvkFFTEngine: Add required include.. PR #2149
|
||||
* Fix memleaks. PR #2133
|
||||
* Remove extra margins from some dialog. PR #2148
|
||||
* SDRPlay v1: fix setting of hardware flavour. Fixes #2127
|
||||
* Audio Input: list plugin as a built in device for multiple times instantiation. Fixes #2143
|
||||
* Do not exit after listing available devices. Fixes #2144
|
||||
* Fix and refactor FindSoapySDR.cmake. PR #2146
|
||||
* Morse Decoder: returm to the original GGMorse library
|
||||
* Fix WFM mod: remove feedback sink. PR #2138
|
||||
* Fix ADSB demod: Message length. PR #2138
|
||||
* Fix Sigmf Record: overwriting sigmf-data or sigmf-meta. PR #2136
|
||||
* Highlight the current workspace and device. PR #2126
|
||||
* Web API: Sort some files by name in the resources file. PR #2124
|
||||
* Web API: Add missing files to resources file. PR #2124
|
||||
* Install subversion for Mac build. PR #2123
|
||||
* Fix ggmorse paths on ma. PR #2123
|
||||
|
||||
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Fri, 06 Jun 2024 20:09:11 +0200
|
||||
|
||||
sdrangel (7.21.1-1) unstable; urgency=medium
|
||||
|
||||
* Morse Decoder feature: Fix for Qt6 and Windows. PR #2122
|
||||
|
@ -20,7 +20,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
# configure version
|
||||
set(sdrangel_VERSION_MAJOR "7")
|
||||
set(sdrangel_VERSION_MINOR "21")
|
||||
set(sdrangel_VERSION_PATCH "1")
|
||||
set(sdrangel_VERSION_PATCH "4")
|
||||
set(sdrangel_VERSION_SUFFIX "")
|
||||
|
||||
# SDRAngel cmake options
|
||||
@ -307,7 +307,7 @@ elseif(APPLE)
|
||||
elseif (WIN32)
|
||||
# check compiler version
|
||||
message(STATUS "MSVC_VERSION is ${MSVC_VERSION}")
|
||||
if(MSVC_VERSION GREATER_EQUAL 1930 AND MSVC_VERSION LESS 1940)
|
||||
if(MSVC_VERSION GREATER_EQUAL 1930)
|
||||
set(VS2022 ON)
|
||||
elseif(MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1930)
|
||||
set(VS2019 ON)
|
||||
@ -859,6 +859,12 @@ if (FFTW3F_FOUND)
|
||||
set(FT8_SUPPORT ON CACHE INTERNAL "")
|
||||
endif()
|
||||
|
||||
if (FFTW3F_FOUND AND LINUX)
|
||||
add_subdirectory(wdsp)
|
||||
add_definitions(-DHAS_WDSP)
|
||||
set(WDSP_SUPPORT ON CACHE INTERNAL "")
|
||||
endif()
|
||||
|
||||
add_subdirectory(sdrbench)
|
||||
|
||||
if (BUILD_GUI)
|
||||
|
@ -199,7 +199,7 @@ static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *lo
|
||||
{
|
||||
// List available physical devices and exit
|
||||
RemoteTCPSinkStarter::listAvailableDevices();
|
||||
exit (EXIT_SUCCESS);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
if (parser.getRemoteTCPSink()) {
|
||||
@ -247,7 +247,9 @@ int main(int argc, char* argv[])
|
||||
|
||||
int res = runQtApplication(argc, argv, logger);
|
||||
|
||||
delete logger;
|
||||
if (logger) {
|
||||
delete logger;
|
||||
}
|
||||
|
||||
qWarning("SDRangel quit.");
|
||||
return res;
|
||||
|
@ -9,44 +9,45 @@ if(NOT SOAPYSDR_FOUND)
|
||||
set(${VERSION} "${CMAKE_MATCH_1}" PARENT_SCOPE)
|
||||
endfunction(_SOAPY_SDR_GET_ABI_VERSION)
|
||||
|
||||
pkg_search_module (LIBSOAPYSDR_PKG soapysdr>=0.4.0 SoapySDR>=0.4.0)
|
||||
pkg_search_module (SOAPYSDR SoapySDR>=0.4.0)
|
||||
|
||||
if(NOT LIBSOAPYSDR_PKG_FOUND OR (DEFINED SOAPYSDR_DIR))
|
||||
if(NOT SOAPYSDR_FOUND OR (DEFINED SOAPYSDR_DIR))
|
||||
|
||||
find_path (SOAPYSDR_INCLUDE_DIR
|
||||
find_path (SOAPYSDR_INCLUDE_DIRS
|
||||
NAMES SoapySDR/Version.h
|
||||
HINTS ${SOAPYSDR_DIR}/include
|
||||
${LIBSOAPYSDR_PKG_INCLUDE_DIRS}
|
||||
PATHS /usr/include
|
||||
/usr/local/include
|
||||
)
|
||||
)
|
||||
|
||||
find_library (SOAPYSDR_LIBRARY
|
||||
find_library (SOAPYSDR_LINK_LIBRARIES
|
||||
NAMES SoapySDR
|
||||
HINTS ${SOAPYSDR_DIR}/lib
|
||||
${SOAPYSDR_DIR}/lib64
|
||||
${CMAKE_INSTALL_PREFIX}/lib
|
||||
${CMAKE_INSTALL_PREFIX}/lib64
|
||||
${LIBSOAPYSDR_PKG_LIBRARY_DIRS}
|
||||
PATHS /usr/local/lib
|
||||
/usr/local/lib64
|
||||
/usr/lib
|
||||
/usr/lib64
|
||||
)
|
||||
)
|
||||
|
||||
if (SOAPYSDR_INCLUDE_DIR AND SOAPYSDR_LIBRARY)
|
||||
if (SOAPYSDR_INCLUDE_DIRS AND SOAPYSDR_LINK_LIBRARIES)
|
||||
set(SOAPYSDR_FOUND TRUE)
|
||||
# get the root of SoapySDR; used on cpack
|
||||
string(REGEX REPLACE "/lib/.*${CMAKE_SHARED_LIBRARY_SUFFIX}" "" SOAPYSDR_ROOT ${SOAPYSDR_LIBRARY})
|
||||
# get the soapy version; to using FindPkgConfig because we can use SOAPYSDR_DIR
|
||||
_SOAPY_SDR_GET_ABI_VERSION(SOAPYSDR_ABI_VERSION ${SOAPYSDR_INCLUDE_DIR})
|
||||
message (STATUS "Found SoapySDR: ${SOAPYSDR_INCLUDE_DIR}, ${SOAPYSDR_LIBRARY}")
|
||||
else()
|
||||
message (STATUS "SoapySDR not found")
|
||||
string(REGEX REPLACE "/lib/.*${CMAKE_SHARED_LIBRARY_SUFFIX}" "" SOAPYSDR_LIBDIR ${SOAPYSDR_LINK_LIBRARIES})
|
||||
# get the soapy version
|
||||
_SOAPY_SDR_GET_ABI_VERSION(SOAPYSDR_VERSION ${SOAPYSDR_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(SOAPYSDR_INCLUDE_DIR SOAPYSDR_LIBRARY SOAPYSDR_ROOT SOAPYSDR_ABI_VERSION)
|
||||
endif(NOT SOAPYSDR_FOUND OR (DEFINED SOAPYSDR_DIR))
|
||||
|
||||
endif(NOT LIBSOAPYSDR_PKG_FOUND OR (DEFINED SOAPYSDR_DIR))
|
||||
if (SOAPYSDR_FOUND)
|
||||
message (STATUS "Found SoapySDR: version ${SOAPYSDR_VERSION}, ${SOAPYSDR_LIBDIR}, ${SOAPYSDR_INCLUDE_DIRS}, ${SOAPYSDR_LINK_LIBRARIES}")
|
||||
else()
|
||||
message (STATUS "SoapySDR not found")
|
||||
endif()
|
||||
|
||||
mark_as_advanced(SOAPYSDR_INCLUDE_DIRS SOAPYSDR_LINK_LIBRARIES SOAPYSDR_LIBDIR SOAPYSDR_VERSION)
|
||||
|
||||
endif(NOT SOAPYSDR_FOUND)
|
||||
|
@ -4,7 +4,7 @@ cd $HOME
|
||||
mkdir -p external && cd external
|
||||
mkdir -p f4exb && cd f4exb
|
||||
|
||||
git clone https://github.com/f4exb/ggmorse.git
|
||||
git clone https://github.com/ggerganov/ggmorse.git
|
||||
|
||||
cd ggmorse
|
||||
mkdir -p build && cd build
|
||||
|
@ -4,4 +4,5 @@ mkdir -p sdrplayapi && cd sdrplayapi
|
||||
|
||||
git clone https://github.com/srcejon/sdrplayapi.git
|
||||
cd sdrplayapi
|
||||
sed -i s/more\ -d/cat/ install_lib.sh
|
||||
sudo yes | bash install_lib.sh
|
||||
|
@ -43,11 +43,11 @@ if(APPLE AND BUNDLE AND BUILD_GUI)
|
||||
# probably libmirsdrapi-rsp.dylib can't be re-distribuited
|
||||
# we remove the file at the end of fixup_bundle
|
||||
if(ENABLE_SOAPYSDR AND SOAPYSDR_FOUND)
|
||||
set(SOAPY_SDR_MOD_PATH "${SOAPYSDR_ROOT}/lib/SoapySDR/modules${SOAPYSDR_ABI_VERSION}")
|
||||
set(SOAPY_SDR_MOD_PATH "${SOAPYSDR_LIBDIR}/lib/SoapySDR/modules${SOAPYSDR_VERSION}")
|
||||
file(GLOB SOAPY_MODS ${SOAPY_SDR_MOD_PATH}/*.so)
|
||||
foreach(SOAPY_MOD_FILE ${SOAPY_MODS})
|
||||
install( FILES "${SOAPY_MOD_FILE}"
|
||||
DESTINATION "../Frameworks/SoapySDR/modules${SOAPYSDR_ABI_VERSION}"
|
||||
DESTINATION "../Frameworks/SoapySDR/modules${SOAPYSDR_VERSION}"
|
||||
COMPONENT Runtime
|
||||
)
|
||||
endforeach()
|
||||
|
60
debian/changelog
vendored
60
debian/changelog
vendored
@ -1,3 +1,63 @@
|
||||
sdrangel (7.21.4-1) unstable; urgency=medium
|
||||
|
||||
* Code fixes. PR #2184
|
||||
* Do not save the settings twice. PR #2182
|
||||
* FreqScanner: Add HF ATC channels preset. PR #2181
|
||||
* FreqScanner: Add API action to run scan. Add scan results to channel report. PR #2181
|
||||
* FreqScanner: Add scanState to FreqScanner Report. PR #2181
|
||||
* Configurations dialog: Fix slot names. PR #2180
|
||||
* AIS: Validate message length. Fixes #2125. PR #2180
|
||||
* ILS Demod. Save frequency when switching between LOC and G/S. PR #2180
|
||||
* ILS Demod. Set frequency for ident when in G/S mode. Fixes #2177. PR #2180
|
||||
* Heat Map: Handle memory allocation errors. PR #2175
|
||||
* Heat Map: Allow selecting which data to be saved to reduce memory requirements. PR #2175
|
||||
* ILS Demod: Add DDM/SDM/Deviation to channel report. PR #2174
|
||||
|
||||
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Tue, 25 Jun 2024 20:17:52 +0200
|
||||
|
||||
sdrangel (7.21.3-1) unstable; urgency=medium
|
||||
|
||||
* Update sdrangel-windows-libraries to latest revision. PR #2173 fixes #2155
|
||||
* SDRplayV3Input: Add SDRPLAY_RSPdxR2_ID support. PR #2172 fixes #2155
|
||||
* Fix tooltips. PR #2170
|
||||
* Update external/windows to latest sdrangel-windows-libraries. PR #2169
|
||||
* Update SDRplay API to 3.15 on Mac. PR #2169
|
||||
* Fix typo in ILS freq. PR #2168
|
||||
* Remove use of deprecated QRegExp. PR #2160
|
||||
* Fix memleaks. PR #2157
|
||||
|
||||
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Mon, 17 Jun 2024 22:30:17 +0200
|
||||
|
||||
sdrangel (7.21.2-1) unstable; urgency=medium
|
||||
|
||||
* Morse Decoder feature: build for Windows. Issue #2152
|
||||
* Satellite Tracker Settings: add missing help description of Replay tab, PR #2151
|
||||
* Satellite Tracker Settings: update help page for new button. PR #2151
|
||||
* Satellite Tracker Settings: add a button to reset the list of TLE. PR #2151
|
||||
* Move defines to the header so they can be reused elsewhere. PR #2151
|
||||
* Factor out the code that updates the widget containing the list of TLEs. PR #2151
|
||||
* Use https for all addresses. PR #2151
|
||||
* Set CMAKE_PREFIX_PATH to include ffmpeg@5. PR #2149
|
||||
* Github mac CI: Try ffmpeg@5. PR #2149
|
||||
* CUDAvkFFTEngine: Add required include.. PR #2149
|
||||
* Fix memleaks. PR #2133
|
||||
* Remove extra margins from some dialog. PR #2148
|
||||
* SDRPlay v1: fix setting of hardware flavour. Fixes #2127
|
||||
* Audio Input: list plugin as a built in device for multiple times instantiation. Fixes #2143
|
||||
* Do not exit after listing available devices. Fixes #2144
|
||||
* Fix and refactor FindSoapySDR.cmake. PR #2146
|
||||
* Morse Decoder: returm to the original GGMorse library
|
||||
* Fix WFM mod: remove feedback sink. PR #2138
|
||||
* Fix ADSB demod: Message length. PR #2138
|
||||
* Fix Sigmf Record: overwriting sigmf-data or sigmf-meta. PR #2136
|
||||
* Highlight the current workspace and device. PR #2126
|
||||
* Web API: Sort some files by name in the resources file. PR #2124
|
||||
* Web API: Add missing files to resources file. PR #2124
|
||||
* Install subversion for Mac build. PR #2123
|
||||
* Fix ggmorse paths on ma. PR #2123
|
||||
|
||||
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Fri, 06 Jun 2024 20:09:11 +0200
|
||||
|
||||
sdrangel (7.21.1-1) unstable; urgency=medium
|
||||
|
||||
* Morse Decoder feature: Fix for Qt6 and Windows. PR #2122
|
||||
|
@ -15,7 +15,7 @@ set(soapysdrdevice_HEADERS
|
||||
)
|
||||
|
||||
include_directories(
|
||||
${SOAPYSDR_INCLUDE_DIR}
|
||||
${SOAPYSDR_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
add_library(soapysdrdevice SHARED
|
||||
@ -26,7 +26,7 @@ set_target_properties(soapysdrdevice
|
||||
PROPERTIES DEFINE_SYMBOL "devices_EXPORTS")
|
||||
|
||||
target_link_libraries(soapysdrdevice
|
||||
${SOAPYSDR_LIBRARY}
|
||||
${SOAPYSDR_LINK_LIBRARIES}
|
||||
sdrbase
|
||||
)
|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 31 KiB |
BIN
doc/img/SatelliteTracker_plugin_settingsdialog4.png
Normal file
BIN
doc/img/SatelliteTracker_plugin_settingsdialog4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
@ -167,4 +167,16 @@
|
||||
# define FT8_API
|
||||
#endif
|
||||
|
||||
/* the 'WDSP_API' controls the import/export of 'wdsp' symbols
|
||||
*/
|
||||
#if !defined(sdrangel_STATIC)
|
||||
# ifdef wdsp_EXPORTS
|
||||
# define WDSP_API __SDR_EXPORT
|
||||
# else
|
||||
# define WDSP_API __SDR_IMPORT
|
||||
# endif
|
||||
#else
|
||||
# define WDSP_API
|
||||
#endif
|
||||
|
||||
#endif /* __SDRANGEL_EXPORT_H */
|
||||
|
16
external/CMakeLists.txt
vendored
16
external/CMakeLists.txt
vendored
@ -859,7 +859,7 @@ if(ENABLE_FEATURE_MORSEDECODER)
|
||||
set(GGMORSE_LIBRARIES "${EXTERNAL_BUILD_LIBRARIES}/lib${LIB_SUFFIX}/libggmorse${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
|
||||
endif()
|
||||
ExternalProject_Add(ggmorse
|
||||
GIT_REPOSITORY https://github.com/f4exb/ggmorse.git
|
||||
GIT_REPOSITORY https://github.com/ggerganov/ggmorse.git
|
||||
PREFIX "${EXTERNAL_BUILD_LIBRARIES}/ggmorse"
|
||||
CMAKE_ARGS ${COMMON_CMAKE_ARGS}
|
||||
-DGGMORSE_BUILD_TESTS=OFF
|
||||
@ -876,10 +876,10 @@ if(ENABLE_FEATURE_MORSEDECODER)
|
||||
if (WIN32)
|
||||
install(FILES "${SDRANGEL_BINARY_BIN_DIR}/ggmorse${CMAKE_SHARED_LIBRARY_SUFFIX}" DESTINATION "${INSTALL_LIB_DIR}")
|
||||
elseif (APPLE)
|
||||
set(GGMORSE_LIBRARIES "${binary_dir}/libsggmorse/libggmorse${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
|
||||
install(DIRECTORY "${binary_dir}/libggmorse" DESTINATION "${INSTALL_LIB_DIR}"
|
||||
set(GGMORSE_LIBRARIES "${binary_dir}/src/libggmorse${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
|
||||
install(DIRECTORY "${binary_dir}/src" DESTINATION "${INSTALL_LIB_DIR}"
|
||||
FILES_MATCHING PATTERN "libggmorse*${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||
set(MACOS_EXTERNAL_LIBS_FIXUP "${MACOS_EXTERNAL_LIBS_FIXUP};${binary_dir}/libggmorse")
|
||||
set(MACOS_EXTERNAL_LIBS_FIXUP "${MACOS_EXTERNAL_LIBS_FIXUP};${binary_dir}/src")
|
||||
endif ()
|
||||
endif()
|
||||
|
||||
@ -1224,7 +1224,7 @@ if (WIN32 OR APPLE)
|
||||
|
||||
if (ENABLE_SOAPYSDR)
|
||||
if (WIN32)
|
||||
set(SOAPYSDR_LIBRARY "${SDRANGEL_BINARY_LIB_DIR}/SoapySDR.lib" CACHE INTERNAL "")
|
||||
set(SOAPYSDR_LINK_LIBRARIES "${SDRANGEL_BINARY_LIB_DIR}/SoapySDR.lib" CACHE INTERNAL "")
|
||||
endif ()
|
||||
ExternalProject_Add(soapysdr
|
||||
GIT_REPOSITORY https://github.com/pothosware/SoapySDR.git
|
||||
@ -1235,7 +1235,7 @@ if (WIN32 OR APPLE)
|
||||
-DENABLE_PYTHON=OFF
|
||||
-DENABLE_PYTHON3=OFF
|
||||
-DENABLE_TESTS=OFF
|
||||
BUILD_BYPRODUCTS "${SOAPYSDR_LIBRARY}"
|
||||
BUILD_BYPRODUCTS "${SOAPYSDR_LINK_LIBRARIES}"
|
||||
BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG> -- SoapySDR
|
||||
INSTALL_COMMAND ""
|
||||
TEST_COMMAND ""
|
||||
@ -1243,12 +1243,12 @@ if (WIN32 OR APPLE)
|
||||
ExternalProject_Get_Property(soapysdr source_dir binary_dir)
|
||||
set_global_cache(SOAPYSDR_FOUND ON)
|
||||
set(SOAPYSDR_EXTERNAL ON CACHE INTERNAL "")
|
||||
set(SOAPYSDR_INCLUDE_DIR "${source_dir}/include" CACHE INTERNAL "")
|
||||
set(SOAPYSDR_INCLUDE_DIRS "${source_dir}/include" CACHE INTERNAL "")
|
||||
if (WIN32)
|
||||
install(FILES "${SDRANGEL_BINARY_BIN_DIR}/SoapySDR${CMAKE_SHARED_LIBRARY_SUFFIX}" DESTINATION "${INSTALL_LIB_DIR}")
|
||||
install(DIRECTORY "${SDRANGEL_BINARY_LIB_DIR}/SoapySDR" DESTINATION "${INSTALL_LIB_DIR}/lib")
|
||||
elseif (APPLE)
|
||||
set(SOAPYSDR_LIBRARY "${binary_dir}/lib/libSoapySDR${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
|
||||
set(SOAPYSDR_LINK_LIBRARIES "${binary_dir}/lib/libSoapySDR${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
|
||||
install(DIRECTORY "${binary_dir}/lib/" DESTINATION "${INSTALL_LIB_DIR}"
|
||||
FILES_MATCHING PATTERN "libSoapySDR*${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||
set(MACOS_EXTERNAL_LIBS_FIXUP "${MACOS_EXTERNAL_LIBS_FIXUP};${binary_dir}/lib/")
|
||||
|
2
external/windows
vendored
2
external/windows
vendored
@ -1 +1 @@
|
||||
Subproject commit da914afa4b7f2453882953ca1bf292bb83093626
|
||||
Subproject commit c55d3980808da97306e2b4feac452323854a39e4
|
@ -34,7 +34,7 @@
|
||||
const PluginDescriptor DOA2Plugin::m_pluginDescriptor = {
|
||||
DOA2::m_channelId,
|
||||
QStringLiteral("DOA 2 sources"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -17,7 +17,6 @@
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QMutexLocker>
|
||||
#include <QDebug>
|
||||
|
||||
#include "doa2streamsink.h"
|
||||
|
@ -34,7 +34,7 @@
|
||||
const PluginDescriptor InterferometerPlugin::m_pluginDescriptor = {
|
||||
Interferometer::m_channelId,
|
||||
QStringLiteral("Interferometer"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -17,7 +17,6 @@
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QMutexLocker>
|
||||
#include <QDebug>
|
||||
|
||||
#include "interferometerstreamsink.h"
|
||||
|
@ -29,7 +29,7 @@
|
||||
const PluginDescriptor ChannelPowerPlugin::m_pluginDescriptor = {
|
||||
ChannelPower::m_channelId,
|
||||
QStringLiteral("Channel Power"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.2"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -35,6 +35,7 @@ ChannelPowerSink::ChannelPowerSink(ChannelPower *channelPower) :
|
||||
|
||||
ChannelPowerSink::~ChannelPowerSink()
|
||||
{
|
||||
delete m_lowpassFFT;
|
||||
}
|
||||
|
||||
void ChannelPowerSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end)
|
||||
|
@ -262,7 +262,7 @@ void ADSBDemodSinkWorker::run()
|
||||
if (m_sink->getMessageQueueToGUI() && ((df == 4) || (df == 5) || (df == 20) || (df == 21)))
|
||||
{
|
||||
ADSBDemodReport::MsgReportADSB *msg = ADSBDemodReport::MsgReportADSB::create(
|
||||
QByteArray((char*)data, sizeof(data)),
|
||||
QByteArray((char*)data, bytes),
|
||||
preambleCorrelation * m_correlationScale,
|
||||
preambleCorrelationOnes / samplesPerChip,
|
||||
rxDateTime(firstIdx, readBuffer),
|
||||
@ -273,7 +273,7 @@ void ADSBDemodSinkWorker::run()
|
||||
if (m_sink->getMessageQueueToWorker())
|
||||
{
|
||||
ADSBDemodReport::MsgReportADSB *msg = ADSBDemodReport::MsgReportADSB::create(
|
||||
QByteArray((char*)data, sizeof(data)),
|
||||
QByteArray((char*)data, bytes),
|
||||
preambleCorrelation * m_correlationScale,
|
||||
preambleCorrelationOnes / samplesPerChip,
|
||||
rxDateTime(firstIdx, readBuffer),
|
||||
|
@ -30,7 +30,7 @@
|
||||
const PluginDescriptor ADSBPlugin::m_pluginDescriptor = {
|
||||
ADSBDemod::m_channelId,
|
||||
QStringLiteral("ADS-B Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.2"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -211,18 +211,20 @@ bool AISDemod::handleMessage(const Message& cmd)
|
||||
|
||||
// Decode the message
|
||||
ais = AISMessage::decode(report.getMessage());
|
||||
if (ais)
|
||||
{
|
||||
m_logStream << report.getDateTime().date().toString() << ","
|
||||
<< report.getDateTime().time().toString() << ","
|
||||
<< report.getMessage().toHex() << ","
|
||||
<< QString("%1").arg(ais->m_mmsi, 9, 10, QChar('0')) << ","
|
||||
<< ais->getType() << ","
|
||||
<< "\"" << ais->toString() << "\"" << ","
|
||||
<< "\"" << ais->toNMEA() << "\"" << ","
|
||||
<< report.getSlot() << ","
|
||||
<< report.getSlots() << "\n";
|
||||
|
||||
m_logStream << report.getDateTime().date().toString() << ","
|
||||
<< report.getDateTime().time().toString() << ","
|
||||
<< report.getMessage().toHex() << ","
|
||||
<< QString("%1").arg(ais->m_mmsi, 9, 10, QChar('0')) << ","
|
||||
<< ais->getType() << ","
|
||||
<< "\"" << ais->toString() << "\"" << ","
|
||||
<< "\"" << ais->toNMEA() << "\"" << ","
|
||||
<< report.getSlot() << ","
|
||||
<< report.getSlots() << "\n";
|
||||
|
||||
delete ais;
|
||||
delete ais;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -24,7 +24,7 @@
|
||||
#include <QDesktopServices>
|
||||
#include <QMessageBox>
|
||||
#include <QAction>
|
||||
#include <QRegExp>
|
||||
#include <QRegularExpression>
|
||||
#include <QClipboard>
|
||||
#include <QFileDialog>
|
||||
#include <QScrollBar>
|
||||
@ -422,6 +422,9 @@ void AISDemodGUI::messageReceived(const QByteArray& message, const QDateTime& da
|
||||
|
||||
// Decode the message
|
||||
ais = AISMessage::decode(message);
|
||||
if (!ais) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Is scroll bar at bottom
|
||||
QScrollBar *sb = ui->messages->verticalScrollBar();
|
||||
@ -636,9 +639,10 @@ void AISDemodGUI::filterRow(int row)
|
||||
bool hidden = false;
|
||||
if (m_settings.m_filterMMSI != "")
|
||||
{
|
||||
QRegExp re(m_settings.m_filterMMSI);
|
||||
QRegularExpression re(QRegularExpression::anchoredPattern(m_settings.m_filterMMSI));
|
||||
QTableWidgetItem *fromItem = ui->messages->item(row, MESSAGE_COL_MMSI);
|
||||
if (!re.exactMatch(fromItem->text()))
|
||||
QRegularExpressionMatch match = re.match(fromItem->text());
|
||||
if (!match.hasMatch())
|
||||
hidden = true;
|
||||
}
|
||||
ui->messages->setRowHidden(row, hidden);
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor AISDemodPlugin::m_pluginDescriptor = {
|
||||
AISDemod::m_channelId,
|
||||
QStringLiteral("AIS Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -6,7 +6,7 @@ This plugin can be used to demodulate AIS (Automatic Identification System) mess
|
||||
|
||||
AIS is broadcast globally on 25kHz channels at 161.975MHz and 162.025MHz, with other frequencies being used regionally or for special purposes. This demodulator is single channel, so if you wish to decode multiple channels simultaneously, you will need to add one AIS demodulator per frequency. As most AIS messages are on 161.975MHz and 162.025MHz, you can set the center frequency as 162MHz, with a sample rate of 100k+Sa/s, with one AIS demod with an input offset -25kHz and another at +25kHz.
|
||||
|
||||
The AIS demodulators can send received messages to the [AIS feature](../../feature/ais/readme.md), which displays a table combining the latest data for vessels amalgamated from multiple demodulators and sends their positions to the [Map Feature](../../feature/map/readme.ais) for display in 2D or 3D.
|
||||
The AIS demodulators can send received messages to the [AIS feature](../../feature/ais/readme.md), which displays a table combining the latest data for vessels amalgamated from multiple demodulators and sends their positions to the [Map Feature](../../feature/map/readme.md) for display in 2D or 3D.
|
||||
|
||||
AIS uses GMSK/FM modulation at a baud rate of 9,600, with a modulation index of 0.5. The demodulator works at a sample rate of 57,600Sa/s.
|
||||
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
#include <QAction>
|
||||
#include <QRegExp>
|
||||
#include <QFileDialog>
|
||||
#include <QFileInfo>
|
||||
#include <QGraphicsScene>
|
||||
|
@ -29,7 +29,7 @@
|
||||
const PluginDescriptor APTDemodPlugin::m_pluginDescriptor = {
|
||||
APTDemod::m_channelId,
|
||||
QStringLiteral("APT Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE and Aptdec authors"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -95,6 +95,7 @@ ChirpChatDemod::ChirpChatDemod(DeviceAPI* deviceAPI) :
|
||||
|
||||
ChirpChatDemod::~ChirpChatDemod()
|
||||
{
|
||||
delete m_networkManager;
|
||||
m_deviceAPI->removeChannelSinkAPI(this);
|
||||
m_deviceAPI->removeChannelSink(this);
|
||||
stop();
|
||||
|
@ -29,7 +29,7 @@
|
||||
const PluginDescriptor ChirpChatPlugin::m_pluginDescriptor = {
|
||||
ChirpChatDemod::m_channelId,
|
||||
QStringLiteral("ChirpChat Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.2"),
|
||||
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
#include <QDebug>
|
||||
#include <QAction>
|
||||
#include <QRegExp>
|
||||
#include <QRegularExpression>
|
||||
|
||||
#include "dabdemodgui.h"
|
||||
|
||||
@ -423,9 +423,10 @@ void DABDemodGUI::filterRow(int row)
|
||||
bool hidden = false;
|
||||
if (m_settings.m_filter != "")
|
||||
{
|
||||
QRegExp re(m_settings.m_filter);
|
||||
QRegularExpression re(m_settings.m_filter);
|
||||
QTableWidgetItem *fromItem = ui->programs->item(row, PROGRAMS_COL_NAME);
|
||||
if (re.indexIn(fromItem->text()) == -1)
|
||||
QRegularExpressionMatch match = re.match(fromItem->text());
|
||||
if (!match.hasMatch())
|
||||
hidden = true;
|
||||
}
|
||||
ui->programs->setRowHidden(row, hidden);
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor DABDemodPlugin::m_pluginDescriptor = {
|
||||
DABDemod::m_channelId,
|
||||
QStringLiteral("DAB Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE. DAB library by Jvan Katwijk"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include <QAction>
|
||||
#include <QClipboard>
|
||||
#include <QFileDialog>
|
||||
#include <QRegExp>
|
||||
#include <QScrollBar>
|
||||
#include <QMenu>
|
||||
#include <QDesktopServices>
|
||||
@ -467,8 +466,9 @@ void DSCDemodGUI::filterRow(int row)
|
||||
if (m_settings.m_filter != "")
|
||||
{
|
||||
QTableWidgetItem *item = ui->messages->item(row, m_settings.m_filterColumn);
|
||||
QRegExp re(m_settings.m_filter);
|
||||
if (!re.exactMatch(item->text())) {
|
||||
QRegularExpression re(m_settings.m_filter);
|
||||
QRegularExpressionMatch match = re.match(item->text());
|
||||
if (!match.hasMatch()) {
|
||||
hidden = true;
|
||||
}
|
||||
}
|
||||
@ -568,7 +568,7 @@ DSCDemodGUI::DSCDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
|
||||
ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
|
||||
ui->channelPowerMeter->setColorTheme(LevelMeterSignalDB::ColorGreenAndBlue);
|
||||
|
||||
ui->messages->setItemDelegateForColumn(MESSAGE_COL_RSSI, new DecimalDelegate(1));
|
||||
ui->messages->setItemDelegateForColumn(MESSAGE_COL_RSSI, new DecimalDelegate(1, ui->messages));
|
||||
|
||||
m_scopeVis = m_dscDemod->getScopeSink();
|
||||
m_scopeVis->setGLScope(ui->glScope);
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor DSCDemodPlugin::m_pluginDescriptor = {
|
||||
DSCDemod::m_channelId,
|
||||
QStringLiteral("DSC Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -31,7 +31,7 @@
|
||||
const PluginDescriptor DSDDemodPlugin::m_pluginDescriptor = {
|
||||
DSDDemod::m_channelId,
|
||||
QStringLiteral("DSD Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -109,6 +109,7 @@
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Liberation Mono</family>
|
||||
<pointsize>9</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
|
@ -20,7 +20,7 @@
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
#include <QAction>
|
||||
#include <QRegExp>
|
||||
#include <QRegularExpression>
|
||||
#include <QFileDialog>
|
||||
#include <QScrollBar>
|
||||
|
||||
@ -345,9 +345,10 @@ void EndOfTrainDemodGUI::filterRow(int row)
|
||||
bool hidden = false;
|
||||
if (m_settings.m_filterFrom != "")
|
||||
{
|
||||
QRegExp re(m_settings.m_filterFrom);
|
||||
QRegularExpression re(QRegularExpression::anchoredPattern(m_settings.m_filterFrom));
|
||||
QTableWidgetItem *fromItem = ui->packets->item(row, PACKETS_COL_ADDRESS);
|
||||
if (!re.exactMatch(fromItem->text()))
|
||||
QRegularExpressionMatch match = re.match(fromItem->text());
|
||||
if (!match.hasMatch())
|
||||
hidden = true;
|
||||
}
|
||||
ui->packets->setRowHidden(row, hidden);
|
||||
|
@ -628,7 +628,7 @@
|
||||
<item>
|
||||
<widget class="QTableWidget" name="packets">
|
||||
<property name="toolTip">
|
||||
<string/>
|
||||
<string>Received packets</string>
|
||||
</property>
|
||||
<property name="editTriggers">
|
||||
<set>QAbstractItemView::NoEditTriggers</set>
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor EndOfTrainDemodPlugin::m_pluginDescriptor = {
|
||||
EndOfTrainDemod::m_channelId,
|
||||
QStringLiteral("End-of-Train Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -255,7 +255,7 @@
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Channel power</string>
|
||||
<string>Level meter (dB) top trace: average, bottom trace: instantaneous peak, tip: peak hold</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -30,7 +30,7 @@
|
||||
const PluginDescriptor FreeDVPlugin::m_pluginDescriptor = {
|
||||
FreeDVDemod::m_channelId,
|
||||
QStringLiteral("FreeDV Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "device/deviceapi.h"
|
||||
#include "settings/serializable.h"
|
||||
#include "util/db.h"
|
||||
#include "util/morse.h"
|
||||
#include "maincore.h"
|
||||
|
||||
MESSAGE_CLASS_DEFINITION(ILSDemod::MsgConfigureILSDemod, Message)
|
||||
@ -46,11 +47,17 @@ const char * const ILSDemod::m_channelIdURI = "sdrangel.channel.ilsdemod";
|
||||
const char * const ILSDemod::m_channelId = "ILSDemod";
|
||||
|
||||
ILSDemod::ILSDemod(DeviceAPI *deviceAPI) :
|
||||
ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSink),
|
||||
m_deviceAPI(deviceAPI),
|
||||
m_running(false),
|
||||
m_spectrumVis(SDR_RX_SCALEF),
|
||||
m_basebandSampleRate(0)
|
||||
ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSink),
|
||||
m_deviceAPI(deviceAPI),
|
||||
m_running(false),
|
||||
m_spectrumVis(SDR_RX_SCALEF),
|
||||
m_basebandSampleRate(0),
|
||||
m_ident(""),
|
||||
m_dm90(NAN),
|
||||
m_dm150(NAN),
|
||||
m_sdm(NAN),
|
||||
m_ddm(NAN),
|
||||
m_angle(NAN)
|
||||
{
|
||||
setObjectName(m_channelId);
|
||||
|
||||
@ -201,6 +208,9 @@ bool ILSDemod::handleMessage(const Message& cmd)
|
||||
m_guiMessageQueue->push(msg);
|
||||
}
|
||||
|
||||
// Save for channel report
|
||||
m_ident = Morse::toString(report.getIdent());
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (ILSDemod::MsgAngleEstimate::match(cmd))
|
||||
@ -246,6 +256,13 @@ bool ILSDemod::handleMessage(const Message& cmd)
|
||||
<< "\n";
|
||||
}
|
||||
|
||||
// Save for channel report
|
||||
m_sdm = report.getSDM();
|
||||
m_ddm = report.getDDM();
|
||||
m_dm90 = report.getModDepth90();
|
||||
m_dm150 = report.getModDepth150();
|
||||
m_angle = report.getAngle();
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (MainCore::MsgChannelDemodQuery::match(cmd))
|
||||
@ -736,6 +753,12 @@ void ILSDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response
|
||||
|
||||
response.getIlsDemodReport()->setChannelPowerDb(CalcDb::dbPower(magsqAvg));
|
||||
response.getIlsDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate());
|
||||
response.getIlsDemodReport()->setIdent(new QString(m_ident));
|
||||
response.getIlsDemodReport()->setDeviation(m_angle);
|
||||
response.getIlsDemodReport()->setSdm(m_sdm);
|
||||
response.getIlsDemodReport()->setDdm(m_ddm);
|
||||
response.getIlsDemodReport()->setDm90(m_dm90);
|
||||
response.getIlsDemodReport()->setDm150(m_dm150);
|
||||
}
|
||||
|
||||
void ILSDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const ILSDemodSettings& settings, bool force)
|
||||
|
@ -205,6 +205,14 @@ private:
|
||||
QNetworkAccessManager *m_networkManager;
|
||||
QNetworkRequest m_networkRequest;
|
||||
|
||||
// Saved values from sink for channel report
|
||||
QString m_ident;
|
||||
Real m_dm90;
|
||||
Real m_dm150;
|
||||
Real m_sdm;
|
||||
Real m_ddm;
|
||||
Real m_angle;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const ILSDemodSettings& settings, bool force = false);
|
||||
void sendSampleRateToDemodAnalyzer();
|
||||
|
@ -63,7 +63,7 @@ MESSAGE_CLASS_DEFINITION(ILSDemodGUI::MsgGSAngle, Message)
|
||||
|
||||
// ICAO Anntex 10 Volume 1 - 3.1.6.1
|
||||
const QStringList ILSDemodGUI::m_locFrequencies = {
|
||||
"108.10", "108.15", "108.30", "108.35", "108.50", "108.55", "180.70", "108.75",
|
||||
"108.10", "108.15", "108.30", "108.35", "108.50", "108.55", "108.70", "108.75",
|
||||
"108.90", "108.95", "109.10", "109.15", "109.30", "109.35", "109.50", "109.55",
|
||||
"109.70", "109.75", "109.90", "109.95", "110.10", "110.15", "110.30", "110.35",
|
||||
"110.50", "110.55", "110.70", "110.75", "110.90", "110.95", "111.10", "111.15",
|
||||
@ -93,6 +93,7 @@ const QList<ILSDemodGUI::ILS> ILSDemodGUI::m_ils = {
|
||||
{"EGLC", "ILSR", "27", 111150000, 272.89, 5.5, 51.504927, 0.064960, 48, 10.7, 1580, 0.0},
|
||||
{"EGSS", "ISX", "22", 110500000, 222.78, 3.0, 51.895165, 0.250051, 352, 14.9, 3430, 0.0},
|
||||
{"EGSS", "ISED", "04", 110500000, 42.78, 3.0, 51.877054, 0.222887, 352, 16.2, 3130, 0.0},
|
||||
{"KGYH", "IGYH", "5", 108300000, 40.00, 3.0, 34.749987, -82.384983,850, 15.84, 2750, -0.6},
|
||||
};
|
||||
|
||||
ILSDemodGUI* ILSDemodGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel)
|
||||
@ -295,6 +296,7 @@ void ILSDemodGUI::on_rfBW_valueChanged(int value)
|
||||
|
||||
void ILSDemodGUI::on_mode_currentIndexChanged(int index)
|
||||
{
|
||||
int freqIdx = ui->frequency->currentIndex();
|
||||
ui->frequency->clear();
|
||||
m_settings.m_mode = (ILSDemodSettings::Mode)index;
|
||||
if (m_settings.m_mode == ILSDemodSettings::LOC)
|
||||
@ -317,6 +319,7 @@ void ILSDemodGUI::on_mode_currentIndexChanged(int index)
|
||||
}
|
||||
closePipes();
|
||||
}
|
||||
ui->frequency->setCurrentIndex(freqIdx);
|
||||
applySettings();
|
||||
}
|
||||
|
||||
@ -410,14 +413,8 @@ void ILSDemodGUI::on_ident_currentIndexChanged(int index)
|
||||
on_runway_editingFinished();
|
||||
int frequency = m_ils[index].m_frequency;
|
||||
QString freqText = QString("%1").arg(frequency / 1000000.0f, 0, 'f', 2);
|
||||
if (m_settings.m_mode == ILSDemodSettings::GS)
|
||||
{
|
||||
int index = m_locFrequencies.indexOf(freqText);
|
||||
if (index >= 0) {
|
||||
freqText = m_gsFrequencies[index];
|
||||
}
|
||||
}
|
||||
ui->frequency->setCurrentText(freqText);
|
||||
int freqIndex = m_locFrequencies.indexOf(freqText);
|
||||
ui->frequency->setCurrentIndex(freqIndex);
|
||||
m_disableDrawILS = false;
|
||||
}
|
||||
drawILSOnMap();
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor ILSDemodPlugin::m_pluginDescriptor = {
|
||||
ILSDemod::m_channelId,
|
||||
QStringLiteral("ILS Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -841,7 +841,7 @@
|
||||
</property>
|
||||
<widget class="QWidget" name="settingsTab">
|
||||
<property name="toolTip">
|
||||
<string>Dgital Settings</string>
|
||||
<string>Digital settings</string>
|
||||
</property>
|
||||
<attribute name="icon">
|
||||
<iconset resource="../../../sdrgui/resources/res.qrc">
|
||||
|
@ -31,7 +31,7 @@
|
||||
const PluginDescriptor M17DemodPlugin::m_pluginDescriptor = {
|
||||
M17Demod::m_channelId,
|
||||
QStringLiteral("M17 Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -525,8 +525,8 @@ NavtexDemodGUI::NavtexDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B
|
||||
ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
|
||||
ui->channelPowerMeter->setColorTheme(LevelMeterSignalDB::ColorGreenAndBlue);
|
||||
|
||||
ui->messages->setItemDelegateForColumn(MESSAGE_COL_ERROR_PERCENT, new DecimalDelegate(1));
|
||||
ui->messages->setItemDelegateForColumn(MESSAGE_COL_RSSI, new DecimalDelegate(1));
|
||||
ui->messages->setItemDelegateForColumn(MESSAGE_COL_ERROR_PERCENT, new DecimalDelegate(1, ui->messages));
|
||||
ui->messages->setItemDelegateForColumn(MESSAGE_COL_RSSI, new DecimalDelegate(1, ui->messages));
|
||||
|
||||
m_scopeVis = m_navtexDemod->getScopeSink();
|
||||
m_scopeVis->setGLScope(ui->glScope);
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor NavtexDemodPlugin::m_pluginDescriptor = {
|
||||
NavtexDemod::m_channelId,
|
||||
QStringLiteral("Navtex Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
#include <QAction>
|
||||
#include <QRegExp>
|
||||
#include <QRegularExpression>
|
||||
#include <QFileDialog>
|
||||
#include <QScrollBar>
|
||||
|
||||
@ -330,16 +330,18 @@ void PacketDemodGUI::filterRow(int row)
|
||||
bool hidden = false;
|
||||
if (m_settings.m_filterFrom != "")
|
||||
{
|
||||
QRegExp re(m_settings.m_filterFrom);
|
||||
QRegularExpression re(QRegularExpression::anchoredPattern(m_settings.m_filterFrom));
|
||||
QTableWidgetItem *fromItem = ui->packets->item(row, PACKET_COL_FROM);
|
||||
if (!re.exactMatch(fromItem->text()))
|
||||
QRegularExpressionMatch match = re.match(fromItem->text());
|
||||
if (!match.hasMatch())
|
||||
hidden = true;
|
||||
}
|
||||
if (m_settings.m_filterTo != "")
|
||||
{
|
||||
QRegExp re(m_settings.m_filterTo);
|
||||
QRegularExpression re(QRegularExpression::anchoredPattern(m_settings.m_filterTo));
|
||||
QTableWidgetItem *toItem = ui->packets->item(row, PACKET_COL_TO);
|
||||
if (!re.exactMatch(toItem->text()))
|
||||
QRegularExpressionMatch match = re.match(toItem->text());
|
||||
if (!match.hasMatch())
|
||||
hidden = true;
|
||||
}
|
||||
if (m_settings.m_filterPID != "")
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor PacketDemodPlugin::m_pluginDescriptor = {
|
||||
PacketDemod::m_channelId,
|
||||
QStringLiteral("Packet Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -20,7 +20,7 @@
|
||||
#include <QDesktopServices>
|
||||
#include <QMessageBox>
|
||||
#include <QAction>
|
||||
#include <QRegExp>
|
||||
#include <QRegularExpression>
|
||||
#include <QClipboard>
|
||||
#include <QFileDialog>
|
||||
#include <QScrollBar>
|
||||
@ -473,9 +473,10 @@ void RadiosondeDemodGUI::filterRow(int row)
|
||||
bool hidden = false;
|
||||
if (m_settings.m_filterSerial != "")
|
||||
{
|
||||
QRegExp re(m_settings.m_filterSerial);
|
||||
QRegularExpression re(QRegularExpression::anchoredPattern(m_settings.m_filterSerial));
|
||||
QTableWidgetItem *fromItem = ui->frames->item(row, FRAME_COL_SERIAL);
|
||||
if (!re.exactMatch(fromItem->text()))
|
||||
QRegularExpressionMatch match = re.match(fromItem->text());
|
||||
if (!match.hasMatch())
|
||||
hidden = true;
|
||||
}
|
||||
ui->frames->setRowHidden(row, hidden);
|
||||
@ -647,16 +648,16 @@ RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI* pluginAPI, DeviceUISet *device
|
||||
TableTapAndHold *tableTapAndHold = new TableTapAndHold(ui->frames);
|
||||
connect(tableTapAndHold, &TableTapAndHold::tapAndHold, this, &RadiosondeDemodGUI::customContextMenuRequested);
|
||||
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_DATE, new DateTimeDelegate("yyyy/MM/dd"));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_TIME, new TimeDelegate());
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_LATITUDE, new DecimalDelegate(5));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_LONGITUDE, new DecimalDelegate(5));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_ALTITUDE, new DecimalDelegate(1));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_SPEED, new DecimalDelegate(1));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_VERTICAL_RATE, new DecimalDelegate(1));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_HEADING, new DecimalDelegate(1));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_GPS_TIME, new DateTimeDelegate("yyyy/MM/dd hh:mm:ss"));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_FREQUENCY, new DecimalDelegate(3));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_DATE, new DateTimeDelegate("yyyy/MM/dd", ui->frames));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_TIME, new TimeDelegate("hh:mm:ss", ui->frames));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_LATITUDE, new DecimalDelegate(5, ui->frames));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_LONGITUDE, new DecimalDelegate(5, ui->frames));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_ALTITUDE, new DecimalDelegate(1, ui->frames));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_SPEED, new DecimalDelegate(1, ui->frames));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_VERTICAL_RATE, new DecimalDelegate(1, ui->frames));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_HEADING, new DecimalDelegate(1, ui->frames));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_GPS_TIME, new DateTimeDelegate("yyyy/MM/dd hh:mm:ss", ui->frames));
|
||||
ui->frames->setItemDelegateForColumn(FRAME_COL_FREQUENCY, new DecimalDelegate(3, ui->frames));
|
||||
|
||||
ui->scopeContainer->setVisible(false);
|
||||
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor RadiosondeDemodPlugin::m_pluginDescriptor = {
|
||||
RadiosondeDemod::m_channelId,
|
||||
QStringLiteral("Radiosonde Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -215,7 +215,7 @@
|
||||
<item>
|
||||
<widget class="QPushButton" name="flipSidebands">
|
||||
<property name="toolTip">
|
||||
<string>Flip sideband in SSB mode (LSB->USB or USB->LSB)</string>
|
||||
<string>Flip sidebands in SSB mode (LSB->USB or USB->LSB)</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor SSBPlugin::m_pluginDescriptor = {
|
||||
SSBDemod::m_channelId,
|
||||
QStringLiteral("SSB Demodulator"),
|
||||
QStringLiteral("7.21.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>VORDemodMCGUI</class>
|
||||
<class>VORDemodGUI</class>
|
||||
<widget class="RollupContents" name="VORDemodGUI">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
|
@ -200,7 +200,7 @@
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>channelPowerMeterUnits</string>
|
||||
<string>Level meter (dB) top trace: average, bottom trace: instantaneous peak, tip: peak hold</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -233,7 +233,6 @@
|
||||
<font>
|
||||
<family>Liberation Mono</family>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>50</weight>
|
||||
<bold>false</bold>
|
||||
</font>
|
||||
</property>
|
||||
|
@ -32,7 +32,7 @@
|
||||
const PluginDescriptor WFMPlugin::m_pluginDescriptor = {
|
||||
WFMDemod::m_channelId,
|
||||
QStringLiteral("WFM Demodulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "SWGWorkspaceInfo.h"
|
||||
#include "SWGFreqScannerSettings.h"
|
||||
#include "SWGChannelReport.h"
|
||||
#include "SWGChannelActions.h"
|
||||
|
||||
#include "device/deviceset.h"
|
||||
#include "dsp/dspengine.h"
|
||||
@ -197,7 +198,9 @@ void FreqScanner::stop()
|
||||
qDebug("FreqScanner::stop");
|
||||
m_running = false;
|
||||
m_thread->exit();
|
||||
#ifndef __EMSCRIPTEN__
|
||||
m_thread->wait();
|
||||
#endif
|
||||
}
|
||||
|
||||
bool FreqScanner::handleMessage(const Message& cmd)
|
||||
@ -342,9 +345,9 @@ void FreqScanner::processScanResults(const QDateTime& fftStartTime, const QList<
|
||||
int binsPerChannel;
|
||||
calcScannerSampleRate(m_settings.m_channelBandwidth, m_basebandSampleRate, m_scannerSampleRate, fftSize, binsPerChannel);
|
||||
|
||||
// Align first frequency so we cover as many channels as possible, while channel guard band
|
||||
// Align first frequency so we cover as many channels as possible, while skipping channel guard band (12.5% either end)
|
||||
// Can we adjust this to avoid DC bin?
|
||||
m_stepStartFrequency = frequencies.front() + m_scannerSampleRate / 2 - m_scannerSampleRate * 0.125f;
|
||||
m_stepStartFrequency = frequencies.front() + m_scannerSampleRate / 2 - (m_scannerSampleRate / 8);
|
||||
m_stepStopFrequency = frequencies.back();
|
||||
|
||||
// If all frequencies fit within usable bandwidth, we can have the first frequency more central
|
||||
@ -373,7 +376,7 @@ void FreqScanner::processScanResults(const QDateTime& fftStartTime, const QList<
|
||||
bool complete = false; // Have all frequencies been scanned?
|
||||
bool freqInRange = false;
|
||||
qint64 nextCenterFrequency = m_centerFrequency;
|
||||
float usableBW = m_scannerSampleRate * 0.75f;
|
||||
int usableBW = (m_scannerSampleRate * 3 / 4) & ~1;
|
||||
do
|
||||
{
|
||||
if (nextCenterFrequency + usableBW / 2 > m_stepStopFrequency)
|
||||
@ -550,7 +553,9 @@ void FreqScanner::processScanResults(const QDateTime& fftStartTime, const QList<
|
||||
setDeviceCenterFrequency(nextCenterFrequency);
|
||||
}
|
||||
|
||||
if (complete) {
|
||||
if (complete)
|
||||
{
|
||||
m_scanResultsForReport = m_scanResults;
|
||||
m_scanResults.clear();
|
||||
}
|
||||
}
|
||||
@ -815,6 +820,47 @@ int FreqScanner::webapiReportGet(
|
||||
return 200;
|
||||
}
|
||||
|
||||
int FreqScanner::webapiActionsPost(
|
||||
const QStringList& channelActionsKeys,
|
||||
SWGSDRangel::SWGChannelActions& query,
|
||||
QString& errorMessage)
|
||||
{
|
||||
SWGSDRangel::SWGFreqScannerActions *swgFreqScannerActions = query.getFreqScannerActions();
|
||||
|
||||
if (swgFreqScannerActions)
|
||||
{
|
||||
if (channelActionsKeys.contains("run"))
|
||||
{
|
||||
bool run = swgFreqScannerActions->getRun() != 0;
|
||||
if (run)
|
||||
{
|
||||
MsgStartScan *start = MsgStartScan::create();
|
||||
if (getMessageQueueToGUI()) {
|
||||
getMessageQueueToGUI()->push(start);
|
||||
} else {
|
||||
getInputMessageQueue()->push(start);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MsgStopScan *stop = MsgStopScan::create();
|
||||
if (getMessageQueueToGUI()) {
|
||||
getMessageQueueToGUI()->push(stop);
|
||||
} else {
|
||||
getInputMessageQueue()->push(stop);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 202;
|
||||
}
|
||||
else
|
||||
{
|
||||
errorMessage = "Missing FreqScannerActions in query";
|
||||
return 400;
|
||||
}
|
||||
}
|
||||
|
||||
void FreqScanner::webapiUpdateChannelSettings(
|
||||
FreqScannerSettings& settings,
|
||||
const QStringList& channelSettingsKeys,
|
||||
@ -984,6 +1030,17 @@ void FreqScanner::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& r
|
||||
void FreqScanner::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
|
||||
{
|
||||
response.getFreqScannerReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate());
|
||||
response.getFreqScannerReport()->setScanState((int) m_state);
|
||||
|
||||
QList<SWGSDRangel::SWGFreqScannerChannelState *> *list = response.getFreqScannerReport()->getChannelState();
|
||||
|
||||
for (int i = 0; i < m_scanResultsForReport.size(); i++)
|
||||
{
|
||||
SWGSDRangel::SWGFreqScannerChannelState *channelState = new SWGSDRangel::SWGFreqScannerChannelState();
|
||||
channelState->setFrequency(m_scanResultsForReport[i].m_frequency);
|
||||
channelState->setPower(m_scanResultsForReport[i].m_power);
|
||||
list->append(channelState);
|
||||
}
|
||||
}
|
||||
|
||||
void FreqScanner::webapiReverseSendSettings(const QStringList& channelSettingsKeys, const FreqScannerSettings& settings, bool force)
|
||||
|
@ -341,6 +341,11 @@ public:
|
||||
SWGSDRangel::SWGChannelReport& response,
|
||||
QString& errorMessage);
|
||||
|
||||
virtual int webapiActionsPost(
|
||||
const QStringList& channelActionsKeys,
|
||||
SWGSDRangel::SWGChannelActions& query,
|
||||
QString& errorMessage);
|
||||
|
||||
static void webapiFormatChannelSettings(
|
||||
SWGSDRangel::SWGChannelSettings& response,
|
||||
const FreqScannerSettings& settings);
|
||||
@ -388,6 +393,7 @@ private:
|
||||
qint64 m_stepStartFrequency;
|
||||
qint64 m_stepStopFrequency;
|
||||
QList<MsgScanResult::ScanResult> m_scanResults;
|
||||
QList<MsgScanResult::ScanResult> m_scanResultsForReport;
|
||||
|
||||
enum State {
|
||||
IDLE,
|
||||
|
@ -91,6 +91,19 @@ void FreqScannerAddRangeDialog::accept()
|
||||
};
|
||||
m_frequencies.append(FRS_GMRSFreqs);
|
||||
}
|
||||
else if (ui->preset->currentText() == "HF ATC")
|
||||
{
|
||||
static const QList<qint64> hfFreqs = {
|
||||
2872000, 2890000, 2899000, 2971000,
|
||||
3016000, 3446000, 3476000, 3491000,
|
||||
4675000, 5598000, 5616000, 5649000,
|
||||
6547000, 6595000, 6622000, 6667000,
|
||||
8831000, 8864000, 8879000, 8891000,
|
||||
8906000, 10021000, 11336000, 13291000,
|
||||
13306000, 17946000
|
||||
};
|
||||
m_frequencies.append(hfFreqs);
|
||||
}
|
||||
else
|
||||
{
|
||||
qint64 start = ui->start->getValue();
|
||||
@ -151,6 +164,10 @@ void FreqScannerAddRangeDialog::on_preset_currentTextChanged(const QString& text
|
||||
{
|
||||
enableManAdjust = false;
|
||||
}
|
||||
else if (text == "HF ATC")
|
||||
{
|
||||
enableManAdjust = false;
|
||||
}
|
||||
ui->start->setEnabled(enableManAdjust);
|
||||
ui->stop->setEnabled(enableManAdjust);
|
||||
ui->step->setEnabled(enableManAdjust);
|
||||
|
@ -198,6 +198,11 @@
|
||||
<string>FRS-GMRS</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>HF ATC</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
@ -232,7 +237,6 @@
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="../../../sdrgui/resources/res.qrc"/>
|
||||
<include location="../demodapt/icons.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
|
@ -204,6 +204,16 @@ bool FreqScannerGUI::handleMessage(const Message& message)
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (FreqScanner::MsgStartScan::match(message))
|
||||
{
|
||||
ui->startStop->doToggle(true);
|
||||
return true;
|
||||
}
|
||||
else if (FreqScanner::MsgStopScan::match(message))
|
||||
{
|
||||
ui->startStop->doToggle(false);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -496,11 +506,11 @@ FreqScannerGUI::FreqScannerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B
|
||||
applyAllSettings();
|
||||
m_resizer.enableChildMouseTracking();
|
||||
|
||||
ui->table->setItemDelegateForColumn(COL_FREQUENCY, new FrequencyDelegate("Auto", 3));
|
||||
ui->table->setItemDelegateForColumn(COL_POWER, new DecimalDelegate(1));
|
||||
ui->table->setItemDelegateForColumn(COL_CHANNEL_BW, new Int64Delegate(0, 10000000));
|
||||
ui->table->setItemDelegateForColumn(COL_TH, new DecimalDelegate(1, -120.0, 0.0));
|
||||
ui->table->setItemDelegateForColumn(COL_SQ, new DecimalDelegate(1, -120.0, 0.0));
|
||||
ui->table->setItemDelegateForColumn(COL_FREQUENCY, new FrequencyDelegate("Auto", 3, true, ui->table));
|
||||
ui->table->setItemDelegateForColumn(COL_POWER, new DecimalDelegate(1, ui->table));
|
||||
ui->table->setItemDelegateForColumn(COL_CHANNEL_BW, new Int64Delegate(0, 10000000, ui->table));
|
||||
ui->table->setItemDelegateForColumn(COL_TH, new DecimalDelegate(1, -120.0, 0.0, ui->table));
|
||||
ui->table->setItemDelegateForColumn(COL_SQ, new DecimalDelegate(1, -120.0, 0.0, ui->table));
|
||||
|
||||
connect(m_deviceUISet->m_spectrum->getSpectrumView(), &GLSpectrumView::updateAnnotations, this, &FreqScannerGUI::updateAnnotations);
|
||||
}
|
||||
@ -609,7 +619,7 @@ void FreqScannerGUI::enterEvent(EnterEventType* event)
|
||||
ChannelGUI::enterEvent(event);
|
||||
}
|
||||
|
||||
void FreqScannerGUI::on_startStop_clicked(bool checked)
|
||||
void FreqScannerGUI::on_startStop_toggled(bool checked)
|
||||
{
|
||||
if (checked)
|
||||
{
|
||||
@ -1080,7 +1090,7 @@ void FreqScannerGUI::makeUIConnections()
|
||||
QObject::connect(ui->priority, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &FreqScannerGUI::on_priority_currentIndexChanged);
|
||||
QObject::connect(ui->measurement, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &FreqScannerGUI::on_measurement_currentIndexChanged);
|
||||
QObject::connect(ui->mode, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &FreqScannerGUI::on_mode_currentIndexChanged);
|
||||
QObject::connect(ui->startStop, &ButtonSwitch::clicked, this, &FreqScannerGUI::on_startStop_clicked);
|
||||
QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &FreqScannerGUI::on_startStop_toggled);
|
||||
QObject::connect(ui->table, &QTableWidget::cellChanged, this, &FreqScannerGUI::on_table_cellChanged);
|
||||
QObject::connect(ui->addSingle, &QToolButton::clicked, this, &FreqScannerGUI::on_addSingle_clicked);
|
||||
QObject::connect(ui->addRange, &QToolButton::clicked, this, &FreqScannerGUI::on_addRange_clicked);
|
||||
|
@ -140,7 +140,7 @@ private slots:
|
||||
void table_sectionResized(int logicalIndex, int oldSize, int newSize);
|
||||
void columnSelectMenu(QPoint pos);
|
||||
void columnSelectMenuChecked(bool checked = false);
|
||||
void on_startStop_clicked(bool checked = false);
|
||||
void on_startStop_toggled(bool checked = false);
|
||||
void on_addSingle_clicked();
|
||||
void on_addRange_clicked();
|
||||
void on_remove_clicked();
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor FreqScannerPlugin::m_pluginDescriptor = {
|
||||
FreqScanner::m_channelId,
|
||||
QStringLiteral("Frequency Scanner"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -117,8 +117,8 @@ void FreqScannerSink::processOneSample(Complex &ci)
|
||||
qint64 diff = frequency - startFrequency;
|
||||
float binBW = m_scannerSampleRate / (float)m_fftSize;
|
||||
|
||||
// Ignore results in uppper and lower 12.5%, as there may be aliasing here from half-band filters
|
||||
if ((diff < m_scannerSampleRate * 0.875f) && (diff >= m_scannerSampleRate * 0.125f))
|
||||
// Ignore results in upper and lower 12.5%, as there may be aliasing here from half-band filters
|
||||
if ((diff >= m_scannerSampleRate / 8) && (diff < m_scannerSampleRate * 7 / 8))
|
||||
{
|
||||
int bin = std::round(diff / binBW);
|
||||
int channelBins;
|
||||
|
@ -140,3 +140,15 @@ Moves the selected rows the the frequency table (14).
|
||||
<h3>21: Clear Active Count</h3>
|
||||
|
||||
Press to reset the value in the Active Count column to 0 for all rows.
|
||||
|
||||
<h2>API</h2>
|
||||
|
||||
Full details of the API can be found in the Swagger documentation. Below are a few examples.
|
||||
|
||||
To run a frequency scan:
|
||||
|
||||
curl -X POST "http://127.0.0.1:8091/sdrangel/deviceset/0/channel/0/actions" -d '{ "channelType": "FreqScanner", "direction": 0, "originatorDeviceSetIndex": 0, "originatorChannelIndex": 0, "FreqScannerActions": { "run": 1 }}'
|
||||
|
||||
To get the results of the last scan:
|
||||
|
||||
curl -X GET "http://127.0.0.1:8091/sdrangel/deviceset/0/channel/0/report"
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
#include <QAction>
|
||||
#include <QRegExp>
|
||||
#include <QClipboard>
|
||||
#include <QBuffer>
|
||||
|
||||
@ -226,9 +225,17 @@ void HeatMapGUI::on_mode_currentIndexChanged(int index)
|
||||
ui->writeImage->setEnabled(!none);
|
||||
ui->writeCSV->setEnabled(!none);
|
||||
ui->readCSV->setEnabled(!none);
|
||||
if (none) {
|
||||
ui->colorMapLabel->setEnabled(!none);
|
||||
ui->colorMap->setEnabled(!none);
|
||||
if (none)
|
||||
{
|
||||
deleteFromMap();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_image.isNull()) {
|
||||
createImage(m_width, m_height);
|
||||
}
|
||||
plotMap();
|
||||
}
|
||||
applySettings();
|
||||
@ -551,6 +558,12 @@ HeatMapGUI::HeatMapGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS
|
||||
m_heatMap = reinterpret_cast<HeatMap*>(rxChannel);
|
||||
m_heatMap->setMessageQueueToGUI(getInputMessageQueue());
|
||||
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
// Disable 256MB limit on image size
|
||||
QImageReader::setAllocationLimit(0);
|
||||
#endif
|
||||
|
||||
connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); // 50 ms
|
||||
|
||||
m_scopeVis = m_heatMap->getScopeSink();
|
||||
@ -708,6 +721,11 @@ void HeatMapGUI::displaySettings()
|
||||
ui->displayPulseAverage->setChecked(m_settings.m_displayPulseAverage);
|
||||
ui->displayPathLoss->setChecked(m_settings.m_displayPathLoss);
|
||||
ui->displayMins->setValue(m_settings.m_displayMins);
|
||||
ui->recordAverage->setChecked(m_settings.m_recordAverage);
|
||||
ui->recordMax->setChecked(m_settings.m_recordMax);
|
||||
ui->recordMin->setChecked(m_settings.m_recordMin);
|
||||
ui->recordPulseAverage->setChecked(m_settings.m_recordPulseAverage);
|
||||
ui->recordPathLoss->setChecked(m_settings.m_recordPathLoss);
|
||||
|
||||
m_scopeVis->setLiveRate(m_settings.m_sampleRate);
|
||||
|
||||
@ -765,7 +783,9 @@ void HeatMapGUI::tick()
|
||||
if (!std::isnan(magAvg))
|
||||
{
|
||||
powDbAvg = CalcDb::dbPower(magAvg * magAvg);
|
||||
m_powerAverage[idx] = powDbAvg;
|
||||
if (m_powerAverage) {
|
||||
m_powerAverage[idx] = powDbAvg;
|
||||
}
|
||||
if (m_tickCount % 4 == 0) {
|
||||
ui->average->setText(QString::number(powDbAvg, 'f', 1));
|
||||
}
|
||||
@ -777,7 +797,9 @@ void HeatMapGUI::tick()
|
||||
if (!std::isnan(magPulseAvg))
|
||||
{
|
||||
powDbPulseAvg = CalcDb::dbPower(magPulseAvg * magPulseAvg);
|
||||
m_powerPulseAverage[idx] = powDbPulseAvg;
|
||||
if (m_powerPulseAverage) {
|
||||
m_powerPulseAverage[idx] = powDbPulseAvg;
|
||||
}
|
||||
if (m_tickCount % 4 == 0) {
|
||||
ui->pulseAverage->setText(QString::number(powDbPulseAvg, 'f', 1));
|
||||
}
|
||||
@ -789,7 +811,9 @@ void HeatMapGUI::tick()
|
||||
if (magMaxPeak != -std::numeric_limits<double>::max())
|
||||
{
|
||||
powDbMaxPeak = CalcDb::dbPower(magMaxPeak * magMaxPeak);
|
||||
m_powerMaxPeak[idx] = powDbMaxPeak;
|
||||
if (m_powerMaxPeak) {
|
||||
m_powerMaxPeak[idx] = powDbMaxPeak;
|
||||
}
|
||||
if (m_tickCount % 4 == 0) {
|
||||
ui->maxPeak->setText(QString::number(powDbMaxPeak, 'f', 1));
|
||||
}
|
||||
@ -801,7 +825,9 @@ void HeatMapGUI::tick()
|
||||
if (magMinPeak != std::numeric_limits<double>::max())
|
||||
{
|
||||
powDbMinPeak = CalcDb::dbPower(magMinPeak * magMinPeak);
|
||||
m_powerMinPeak[idx] = powDbMinPeak;
|
||||
if (m_powerMinPeak) {
|
||||
m_powerMinPeak[idx] = powDbMinPeak;
|
||||
}
|
||||
if (m_tickCount % 4 == 0) {
|
||||
ui->minPeak->setText(QString::number(powDbMinPeak, 'f', 1));
|
||||
}
|
||||
@ -814,7 +840,9 @@ void HeatMapGUI::tick()
|
||||
double range = calcRange(m_latitude, m_longitude);
|
||||
double frequency = m_deviceCenterFrequency + m_settings.m_inputFrequencyOffset;
|
||||
powDbPathLoss = m_settings.m_txPower - calcFreeSpacePathLoss(range, frequency);
|
||||
m_powerPathLoss[idx] = powDbPathLoss;
|
||||
if (m_powerPathLoss) {
|
||||
m_powerPathLoss[idx] = powDbPathLoss;
|
||||
}
|
||||
|
||||
if (m_heatMap->getDeviceAPI()->state(0) == DeviceAPI::StRunning)
|
||||
{
|
||||
@ -823,9 +851,12 @@ void HeatMapGUI::tick()
|
||||
{
|
||||
// Plot newest measurement on map
|
||||
float *power = getCurrentModePowerData();
|
||||
double powDb = power[idx];
|
||||
if (!std::isnan(powDb)) {
|
||||
plotPixel(m_x, m_y, powDb);
|
||||
if (power)
|
||||
{
|
||||
double powDb = power[idx];
|
||||
if (!std::isnan(powDb)) {
|
||||
plotPixel(m_x, m_y, powDb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -882,9 +913,15 @@ void HeatMapGUI::updatePower(double latitude, double longitude, float power)
|
||||
|
||||
void HeatMapGUI::plotMap()
|
||||
{
|
||||
clearImage();
|
||||
plotMap(getCurrentModePowerData());
|
||||
sendToMap();
|
||||
if ((m_settings.m_mode != HeatMapSettings::None) && !m_image.isNull())
|
||||
{
|
||||
clearImage();
|
||||
float *data = getCurrentModePowerData();
|
||||
if (data) {
|
||||
plotMap(data);
|
||||
}
|
||||
sendToMap();
|
||||
}
|
||||
}
|
||||
|
||||
void HeatMapGUI::clearPower()
|
||||
@ -903,7 +940,35 @@ void HeatMapGUI::clearPower(float *power)
|
||||
|
||||
void HeatMapGUI::clearPower(float *power, int size)
|
||||
{
|
||||
std::fill_n(power, size, std::numeric_limits<float>::quiet_NaN());
|
||||
if (power) {
|
||||
std::fill_n(power, size, std::numeric_limits<float>::quiet_NaN());
|
||||
}
|
||||
}
|
||||
|
||||
void HeatMapGUI::createImage(int width, int height)
|
||||
{
|
||||
if (!m_image.isNull()) {
|
||||
m_painter.end();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (m_settings.m_mode != HeatMapSettings::None)
|
||||
{
|
||||
qDebug() << "HeatMapGUI::createImage" << width << "*" << height;
|
||||
m_image = QImage(width, height, QImage::Format_ARGB32);
|
||||
m_painter.begin(&m_image);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_image = QImage();
|
||||
}
|
||||
}
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
m_image = QImage();
|
||||
QMessageBox::critical(this, "Heat Map", QString("Failed to allocate memory (width=%1 height=%2)").arg(m_width).arg(m_height));
|
||||
}
|
||||
}
|
||||
|
||||
void HeatMapGUI::clearImage()
|
||||
@ -929,6 +994,10 @@ void HeatMapGUI::plotMap(float *power)
|
||||
|
||||
void HeatMapGUI::plotPixel(int x, int y, double power)
|
||||
{
|
||||
if (m_image.isNull()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Normalise to [0,1]
|
||||
float powNorm = (power - m_settings.m_minPower) / (m_settings.m_maxPower - m_settings.m_minPower);
|
||||
if (powNorm < 0) {
|
||||
@ -1017,6 +1086,11 @@ void HeatMapGUI::makeUIConnections()
|
||||
QObject::connect(ui->displayPulseAverage, &QCheckBox::clicked, this, &HeatMapGUI::on_displayPulseAverage_clicked);
|
||||
QObject::connect(ui->displayPathLoss, &QCheckBox::clicked, this, &HeatMapGUI::on_displayPathLoss_clicked);
|
||||
QObject::connect(ui->displayMins, QOverload<int>::of(&QSpinBox::valueChanged), this, &HeatMapGUI::on_displayMins_valueChanged);
|
||||
QObject::connect(ui->recordAverage, &QCheckBox::clicked, this, &HeatMapGUI::on_recordAverage_clicked);
|
||||
QObject::connect(ui->recordMax, &QCheckBox::clicked, this, &HeatMapGUI::on_recordMax_clicked);
|
||||
QObject::connect(ui->recordMin, &QCheckBox::clicked, this, &HeatMapGUI::on_recordMin_clicked);
|
||||
QObject::connect(ui->recordPulseAverage, &QCheckBox::clicked, this, &HeatMapGUI::on_recordPulseAverage_clicked);
|
||||
QObject::connect(ui->recordPathLoss, &QCheckBox::clicked, this, &HeatMapGUI::on_recordPathLoss_clicked);
|
||||
}
|
||||
|
||||
void HeatMapGUI::updateAbsoluteCenterFrequency()
|
||||
@ -1171,21 +1245,48 @@ void HeatMapGUI::createMap()
|
||||
m_degreesLonPerPixel = m_resolution / scale / (earthCircumference / 360.0);
|
||||
m_degreesLatPerPixel = m_resolution / (earthCircumference / 360.0);
|
||||
int size = m_width * m_height;
|
||||
m_powerAverage = new float[size];
|
||||
m_powerPulseAverage = new float[size];
|
||||
m_powerMaxPeak = new float[size];
|
||||
m_powerMinPeak = new float[size];
|
||||
m_powerPathLoss = new float[size];
|
||||
try
|
||||
{
|
||||
if (m_settings.m_recordAverage) {
|
||||
m_powerAverage = new float[size];
|
||||
} else {
|
||||
m_powerAverage = nullptr;
|
||||
}
|
||||
if (m_settings.m_recordPulseAverage) {
|
||||
m_powerPulseAverage = new float[size];
|
||||
} else {
|
||||
m_powerPulseAverage = nullptr;
|
||||
}
|
||||
if (m_settings.m_recordMax) {
|
||||
m_powerMaxPeak = new float[size];
|
||||
} else {
|
||||
m_powerMaxPeak = nullptr;
|
||||
}
|
||||
if (m_settings.m_recordMin) {
|
||||
m_powerMinPeak = new float[size];
|
||||
} else {
|
||||
m_powerMinPeak = nullptr;
|
||||
}
|
||||
if (m_settings.m_recordPathLoss) {
|
||||
m_powerPathLoss = new float[size];
|
||||
} else {
|
||||
m_powerPathLoss = nullptr;
|
||||
}
|
||||
|
||||
m_north = m_latitude + m_degreesLatPerPixel * m_height / 2;
|
||||
m_south = m_latitude - m_degreesLatPerPixel * m_height / 2;
|
||||
m_east = m_longitude + m_degreesLonPerPixel * m_width / 2;
|
||||
m_west = m_longitude - m_degreesLonPerPixel * m_width / 2;
|
||||
m_x = m_width / 2;
|
||||
m_y = m_height / 2;
|
||||
m_north = m_latitude + m_degreesLatPerPixel * m_height / 2;
|
||||
m_south = m_latitude - m_degreesLatPerPixel * m_height / 2;
|
||||
m_east = m_longitude + m_degreesLonPerPixel * m_width / 2;
|
||||
m_west = m_longitude - m_degreesLonPerPixel * m_width / 2;
|
||||
m_x = m_width / 2;
|
||||
m_y = m_height / 2;
|
||||
|
||||
m_image = QImage(m_width, m_height, QImage::Format_ARGB32);
|
||||
m_painter.begin(&m_image);
|
||||
createImage(m_width, m_height);
|
||||
}
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
deleteMap();
|
||||
QMessageBox::critical(this, "Heat Map", QString("Failed to allocate memory (width=%1 height=%2)").arg(m_width).arg(m_height));
|
||||
}
|
||||
|
||||
on_clearHeatMap_clicked();
|
||||
}
|
||||
@ -1203,7 +1304,9 @@ void HeatMapGUI::deleteMap()
|
||||
m_powerMinPeak = nullptr;
|
||||
delete[] m_powerPathLoss;
|
||||
m_powerPathLoss = nullptr;
|
||||
m_painter.end();
|
||||
if (!m_image.isNull()) {
|
||||
m_painter.end();
|
||||
}
|
||||
}
|
||||
|
||||
void HeatMapGUI::resizeMap(int x, int y)
|
||||
@ -1245,47 +1348,92 @@ void HeatMapGUI::resizeMap(int x, int y)
|
||||
m_south -= m_blockSize * m_degreesLatPerPixel;
|
||||
}
|
||||
|
||||
float *powerAverage = nullptr;
|
||||
float *powerPulseAverage = nullptr;
|
||||
float *powerMaxPeak = nullptr;
|
||||
float *powerMinPeak = nullptr;
|
||||
float *powerPathLoss = nullptr;
|
||||
|
||||
int newSize = newWidth * newHeight;
|
||||
float *powerAverage = new float[newSize];
|
||||
float *powerPulseAverage = new float[newSize];
|
||||
float *powerMaxPeak = new float[newSize];
|
||||
float *powerMinPeak = new float[newSize];
|
||||
float *powerPathLoss = new float[newSize];
|
||||
clearPower(powerAverage, newSize);
|
||||
clearPower(powerPulseAverage, newSize);
|
||||
clearPower(powerMaxPeak, newSize);
|
||||
clearPower(powerMinPeak, newSize);
|
||||
clearPower(powerPathLoss, newSize);
|
||||
qDebug() << "HeatMapGUI::resizeMap:" << m_width << "*" << m_height << "to" << newWidth << "*" << newHeight;
|
||||
|
||||
// Copy across old data
|
||||
for (int j = 0; j < m_height; j++)
|
||||
try
|
||||
{
|
||||
int srcStart = j * m_width;
|
||||
int srcEnd = (j + 1) * m_width;
|
||||
int destStart = j * newWidth + yOffset + xOffset;
|
||||
//qDebug() << srcStart << srcEnd << destStart;
|
||||
std::copy(m_powerAverage + srcStart, m_powerAverage + srcEnd, powerAverage + destStart);
|
||||
std::copy(m_powerPulseAverage + srcStart, m_powerPulseAverage + srcEnd, powerPulseAverage + destStart);
|
||||
std::copy(m_powerMaxPeak + srcStart, m_powerMaxPeak + srcEnd, powerMaxPeak + destStart);
|
||||
std::copy(m_powerMinPeak + srcStart, m_powerMinPeak + srcEnd, powerMinPeak + destStart);
|
||||
std::copy(m_powerPathLoss + srcStart, m_powerPathLoss + srcEnd, powerPathLoss + destStart);
|
||||
}
|
||||
// Allocate new memory
|
||||
if (m_settings.m_recordAverage) {
|
||||
powerAverage = new float[newSize];
|
||||
}
|
||||
if (m_settings.m_recordPulseAverage) {
|
||||
powerPulseAverage = new float[newSize];
|
||||
}
|
||||
if (m_settings.m_recordMax) {
|
||||
powerMaxPeak = new float[newSize];
|
||||
}
|
||||
if (m_settings.m_recordMin) {
|
||||
powerMinPeak = new float[newSize];
|
||||
}
|
||||
if (m_settings.m_recordPathLoss) {
|
||||
powerPathLoss = new float[newSize];
|
||||
}
|
||||
|
||||
delete[] m_powerAverage;
|
||||
delete[] m_powerPulseAverage;
|
||||
delete[] m_powerMaxPeak;
|
||||
delete[] m_powerMinPeak;
|
||||
m_powerAverage = powerAverage;
|
||||
m_powerPulseAverage = powerPulseAverage;
|
||||
m_powerMaxPeak = powerMaxPeak;
|
||||
m_powerMinPeak = powerMinPeak;
|
||||
m_powerPathLoss = powerPathLoss;
|
||||
m_width = newWidth;
|
||||
m_height = newHeight;
|
||||
m_painter.end();
|
||||
m_image = QImage(m_width, m_height, QImage::Format_ARGB32);
|
||||
m_painter.begin(&m_image);
|
||||
plotMap();
|
||||
clearPower(powerAverage, newSize);
|
||||
clearPower(powerPulseAverage, newSize);
|
||||
clearPower(powerMaxPeak, newSize);
|
||||
clearPower(powerMinPeak, newSize);
|
||||
clearPower(powerPathLoss, newSize);
|
||||
|
||||
// Copy across old data
|
||||
for (int j = 0; j < m_height; j++)
|
||||
{
|
||||
int srcStart = j * m_width;
|
||||
int srcEnd = (j + 1) * m_width;
|
||||
int destStart = j * newWidth + yOffset + xOffset;
|
||||
//qDebug() << srcStart << srcEnd << destStart;
|
||||
if (powerAverage && m_powerAverage) {
|
||||
std::copy(m_powerAverage + srcStart, m_powerAverage + srcEnd, powerAverage + destStart);
|
||||
}
|
||||
if (powerPulseAverage && m_powerPulseAverage) {
|
||||
std::copy(m_powerPulseAverage + srcStart, m_powerPulseAverage + srcEnd, powerPulseAverage + destStart);
|
||||
}
|
||||
if (powerMaxPeak && m_powerMaxPeak) {
|
||||
std::copy(m_powerMaxPeak + srcStart, m_powerMaxPeak + srcEnd, powerMaxPeak + destStart);
|
||||
}
|
||||
if (powerMinPeak && m_powerMinPeak) {
|
||||
std::copy(m_powerMinPeak + srcStart, m_powerMinPeak + srcEnd, powerMinPeak + destStart);
|
||||
}
|
||||
if (powerPathLoss && m_powerPathLoss) {
|
||||
std::copy(m_powerPathLoss + srcStart, m_powerPathLoss + srcEnd, powerPathLoss + destStart);
|
||||
}
|
||||
}
|
||||
|
||||
createImage(newWidth, newHeight);
|
||||
|
||||
m_width = newWidth;
|
||||
m_height = newHeight;
|
||||
|
||||
// Delete old memory
|
||||
delete[] m_powerAverage;
|
||||
delete[] m_powerPulseAverage;
|
||||
delete[] m_powerMaxPeak;
|
||||
delete[] m_powerMinPeak;
|
||||
m_powerAverage = powerAverage;
|
||||
m_powerPulseAverage = powerPulseAverage;
|
||||
m_powerMaxPeak = powerMaxPeak;
|
||||
m_powerMinPeak = powerMinPeak;
|
||||
m_powerPathLoss = powerPathLoss;
|
||||
|
||||
plotMap();
|
||||
}
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
// Detete partially allocated memory
|
||||
delete[] powerAverage;
|
||||
delete[] powerPulseAverage;
|
||||
delete[] powerMaxPeak;
|
||||
delete[] powerMinPeak;
|
||||
delete[] powerPathLoss;
|
||||
QMessageBox::critical(this, "Heat Map", QString("Failed to allocate memory (width=%1 height=%2)").arg(newWidth).arg(newHeight));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1462,3 +1610,37 @@ void HeatMapGUI::on_displayMins_valueChanged(int value)
|
||||
applySettings();
|
||||
}
|
||||
|
||||
void HeatMapGUI::on_recordAverage_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_recordAverage = checked;
|
||||
resizeMap(0, 0);
|
||||
applySettings();
|
||||
}
|
||||
|
||||
void HeatMapGUI::on_recordMax_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_recordMax = checked;
|
||||
resizeMap(0, 0);
|
||||
applySettings();
|
||||
}
|
||||
|
||||
void HeatMapGUI::on_recordMin_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_recordMin = checked;
|
||||
resizeMap(0, 0);
|
||||
applySettings();
|
||||
}
|
||||
|
||||
void HeatMapGUI::on_recordPulseAverage_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_recordPulseAverage = checked;
|
||||
resizeMap(0, 0);
|
||||
applySettings();
|
||||
}
|
||||
|
||||
void HeatMapGUI::on_recordPathLoss_clicked(bool checked)
|
||||
{
|
||||
m_settings.m_recordPathLoss = checked;
|
||||
resizeMap(0, 0);
|
||||
applySettings();
|
||||
}
|
||||
|
@ -142,7 +142,6 @@ private:
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void displaySettings();
|
||||
void messageReceived(const QByteArray& message, const QDateTime& dateTime);
|
||||
bool handleMessage(const Message& message);
|
||||
void makeUIConnections();
|
||||
void updateAbsoluteCenterFrequency();
|
||||
@ -158,6 +157,7 @@ private:
|
||||
void clearPower();
|
||||
void clearPower(float *power);
|
||||
void clearPower(float *power, int size);
|
||||
void createImage(int width, int height);
|
||||
void clearImage();
|
||||
void updatePower(double latitude, double longitude, float power);
|
||||
void plotMap();
|
||||
@ -209,6 +209,11 @@ private slots:
|
||||
void on_displayPulseAverage_clicked(bool checked=false);
|
||||
void on_displayPathLoss_clicked(bool checked=false);
|
||||
void on_displayMins_valueChanged(int value);
|
||||
void on_recordAverage_clicked(bool checked=false);
|
||||
void on_recordMax_clicked(bool checked=false);
|
||||
void on_recordMin_clicked(bool checked=false);
|
||||
void on_recordPulseAverage_clicked(bool checked=false);
|
||||
void on_recordPathLoss_clicked(bool checked=false);
|
||||
void onWidgetRolled(QWidget* widget, bool rollDown);
|
||||
void onMenuDialogCalled(const QPoint& p);
|
||||
void handleInputMessages();
|
||||
|
@ -40,7 +40,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>390</width>
|
||||
<height>191</height>
|
||||
<height>211</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
@ -800,13 +800,127 @@
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line_20">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="recordLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="recordLabel">
|
||||
<property name="text">
|
||||
<string>Record</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="recordAverage">
|
||||
<property name="statusTip">
|
||||
<string>Check to record average power</string>
|
||||
</property>
|
||||
<property name="accessibleName">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Avg</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="recordMax">
|
||||
<property name="statusTip">
|
||||
<string>Check to record max power</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Max</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="recordMin">
|
||||
<property name="statusTip">
|
||||
<string>Check to record min power</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Min</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="recordPulseAverage">
|
||||
<property name="statusTip">
|
||||
<string>Check to record pulse average power</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Pulse</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="recordPathLoss">
|
||||
<property name="statusTip">
|
||||
<string>Check to record path loss</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Path Loss</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_9">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="dataContainer" native="true">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>200</y>
|
||||
<y>220</y>
|
||||
<width>391</width>
|
||||
<height>91</height>
|
||||
</rect>
|
||||
@ -1349,7 +1463,7 @@
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>300</y>
|
||||
<y>320</y>
|
||||
<width>381</width>
|
||||
<height>121</height>
|
||||
</rect>
|
||||
@ -1617,7 +1731,6 @@
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../../../sdrgui/resources/res.qrc"/>
|
||||
<include location="../demodadsb/icons.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor HeatMapPlugin::m_pluginDescriptor = {
|
||||
HeatMap::m_channelId,
|
||||
QStringLiteral("Heat Map"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -50,6 +50,11 @@ void HeatMapSettings::resetToDefaults()
|
||||
m_displayPulseAverage = true;
|
||||
m_displayPathLoss = true;
|
||||
m_displayMins = 2;
|
||||
m_recordAverage = true;
|
||||
m_recordMax = true;
|
||||
m_recordMin = true;
|
||||
m_recordPulseAverage = true;
|
||||
m_recordPathLoss = true;
|
||||
m_rgbColor = QColor(102, 40, 220).rgb();
|
||||
m_title = "Heat Map";
|
||||
m_streamIndex = 0;
|
||||
@ -86,6 +91,11 @@ QByteArray HeatMapSettings::serialize() const
|
||||
s.writeBool(18, m_displayPulseAverage);
|
||||
s.writeBool(19, m_displayPathLoss);
|
||||
s.writeS32(20, m_displayMins);
|
||||
s.writeBool(40, m_recordAverage);
|
||||
s.writeBool(41, m_recordMax);
|
||||
s.writeBool(42, m_recordMin);
|
||||
s.writeBool(43, m_recordPulseAverage);
|
||||
s.writeBool(44, m_recordPathLoss);
|
||||
|
||||
s.writeU32(21, m_rgbColor);
|
||||
s.writeString(22, m_title);
|
||||
@ -148,6 +158,11 @@ bool HeatMapSettings::deserialize(const QByteArray& data)
|
||||
d.readBool(18, &m_displayPulseAverage, true);
|
||||
d.readBool(19, &m_displayPathLoss, true);
|
||||
d.readS32(20, &m_displayMins, 2);
|
||||
d.readBool(40, &m_recordAverage, true);
|
||||
d.readBool(41, &m_recordMax, true);
|
||||
d.readBool(42, &m_recordMin, true);
|
||||
d.readBool(43, &m_recordPulseAverage, true);
|
||||
d.readBool(44, &m_recordPathLoss, true);
|
||||
|
||||
d.readU32(21, &m_rgbColor, QColor(102, 40, 220).rgb());
|
||||
d.readString(22, &m_title, "Heat Map");
|
||||
|
@ -57,6 +57,11 @@ struct HeatMapSettings
|
||||
bool m_displayPulseAverage;
|
||||
bool m_displayPathLoss;
|
||||
int m_displayMins;
|
||||
bool m_recordAverage;
|
||||
bool m_recordMax;
|
||||
bool m_recordMin;
|
||||
bool m_recordPulseAverage;
|
||||
bool m_recordPathLoss;
|
||||
|
||||
quint32 m_rgbColor;
|
||||
QString m_title;
|
||||
|
@ -657,11 +657,11 @@ NoiseFigureGUI::NoiseFigureGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B
|
||||
ui->results->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(ui->results, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customContextMenuRequested(QPoint)));
|
||||
|
||||
ui->results->setItemDelegateForColumn(RESULTS_COL_NF, new DecimalDelegate(2));
|
||||
ui->results->setItemDelegateForColumn(RESULTS_COL_TEMP, new DecimalDelegate(0));
|
||||
ui->results->setItemDelegateForColumn(RESULTS_COL_Y, new DecimalDelegate(2));
|
||||
ui->results->setItemDelegateForColumn(RESULTS_COL_ENR, new DecimalDelegate(2));
|
||||
ui->results->setItemDelegateForColumn(RESULTS_COL_FLOOR, new DecimalDelegate(1));
|
||||
ui->results->setItemDelegateForColumn(RESULTS_COL_NF, new DecimalDelegate(2, ui->results));
|
||||
ui->results->setItemDelegateForColumn(RESULTS_COL_TEMP, new DecimalDelegate(0, ui->results));
|
||||
ui->results->setItemDelegateForColumn(RESULTS_COL_Y, new DecimalDelegate(2, ui->results));
|
||||
ui->results->setItemDelegateForColumn(RESULTS_COL_ENR, new DecimalDelegate(2, ui->results));
|
||||
ui->results->setItemDelegateForColumn(RESULTS_COL_FLOOR, new DecimalDelegate(1, ui->results));
|
||||
|
||||
ui->startStop->setStyleSheet(QString("QToolButton{ background-color: blue; } QToolButton:checked{ background-color: green; }"));
|
||||
|
||||
|
@ -887,7 +887,7 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string/>
|
||||
<string>Chart</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor NoiseFigurePlugin::m_pluginDescriptor = {
|
||||
NoiseFigure::m_channelId,
|
||||
QStringLiteral("Noise Figure"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
#include <QAction>
|
||||
#include <QRegExp>
|
||||
#include <QRegularExpression>
|
||||
#include <QClipboard>
|
||||
#include <QFileDialog>
|
||||
#include <QImage>
|
||||
@ -66,6 +66,9 @@
|
||||
class TimeDeltaDelegate : public QStyledItemDelegate {
|
||||
|
||||
public:
|
||||
TimeDeltaDelegate(QObject *parent = nullptr) :
|
||||
QStyledItemDelegate(parent) {}
|
||||
|
||||
virtual QString displayText(const QVariant &value, const QLocale &locale) const override
|
||||
{
|
||||
(void) locale;
|
||||
@ -97,6 +100,9 @@ private:
|
||||
class HMSDelegate : public QStyledItemDelegate {
|
||||
|
||||
public:
|
||||
HMSDelegate(QObject *parent = nullptr) :
|
||||
QStyledItemDelegate(parent) {}
|
||||
|
||||
virtual QString displayText(const QVariant &value, const QLocale &locale) const override
|
||||
{
|
||||
(void) locale;
|
||||
@ -109,6 +115,9 @@ public:
|
||||
class DMSDelegate : public QStyledItemDelegate {
|
||||
|
||||
public:
|
||||
DMSDelegate(QObject *parent = nullptr) :
|
||||
QStyledItemDelegate(parent) {}
|
||||
|
||||
virtual QString displayText(const QVariant &value, const QLocale &locale) const override
|
||||
{
|
||||
(void) locale;
|
||||
@ -2123,42 +2132,42 @@ RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUI
|
||||
ui->powerTable->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(ui->powerTable, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customContextMenuRequested(QPoint)));
|
||||
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TIME, new TimeDelegate());
|
||||
//ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER, new DecimalDelegate(6));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER_DB, new DecimalDelegate(1));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER_DBM, new DecimalDelegate(1));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSYS, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSYS0, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSOURCE, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TB, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSKY, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_FLUX, new DecimalDelegate(2));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_SIGMA_T, new DecimalDelegate(2));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_SIGMA_S, new DecimalDelegate(1));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_RA, new HMSDelegate());
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_DEC, new DMSDelegate());
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_GAL_LAT, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_GAL_LON, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_AZ, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_EL, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_VBCRS, new DecimalDelegate(1));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_VLSR, new DecimalDelegate(1));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_AIR_TEMP, new DecimalDelegate(1));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_AZ, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_EL, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_AZ_OFF, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_EL_OFF, new DecimalDelegate(0));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TIME, new TimeDelegate("hh:mm:ss", ui->powerTable));
|
||||
//ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER, new DecimalDelegate(6, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER_DB, new DecimalDelegate(1, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER_DBM, new DecimalDelegate(1, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSYS, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSYS0, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSOURCE, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TB, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSKY, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_FLUX, new DecimalDelegate(2, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_SIGMA_T, new DecimalDelegate(2, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_SIGMA_S, new DecimalDelegate(1, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_RA, new HMSDelegate(ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_DEC, new DMSDelegate(ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_GAL_LAT, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_GAL_LON, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_AZ, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_EL, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_VBCRS, new DecimalDelegate(1, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_VLSR, new DecimalDelegate(1, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_AIR_TEMP, new DecimalDelegate(1, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_AZ, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_EL, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_AZ_OFF, new DecimalDelegate(0, ui->powerTable));
|
||||
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_EL_OFF, new DecimalDelegate(0, ui->powerTable));
|
||||
|
||||
resizeSpectrumMarkerTable();
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_FREQ, new DecimalDelegate(6));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_VALUE, new DecimalDelegate(1));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_DELTA_X, new DecimalDelegate(6));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_DELTA_Y, new DecimalDelegate(1));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_VR, new DecimalDelegate(2));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_R, new DecimalDelegate(1));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_D, new DecimalDelegate(1));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_R_MIN, new DecimalDelegate(1));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_V, new DecimalDelegate(1));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_FREQ, new DecimalDelegate(6, ui->spectrumMarkerTable));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_VALUE, new DecimalDelegate(1, ui->spectrumMarkerTable));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_DELTA_X, new DecimalDelegate(6, ui->spectrumMarkerTable));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_DELTA_Y, new DecimalDelegate(1, ui->spectrumMarkerTable));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_VR, new DecimalDelegate(2, ui->spectrumMarkerTable));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_R, new DecimalDelegate(1, ui->spectrumMarkerTable));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_D, new DecimalDelegate(1, ui->spectrumMarkerTable));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_R_MIN, new DecimalDelegate(1, ui->spectrumMarkerTable));
|
||||
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_V, new DecimalDelegate(1, ui->spectrumMarkerTable));
|
||||
|
||||
// Create blank marker table
|
||||
ui->spectrumMarkerTable->setRowCount(SPECTRUM_MARKER_ROWS); // 1 peak and two markers
|
||||
@ -2187,10 +2196,10 @@ RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUI
|
||||
connect(ui->spectrumMarkerTable, &QTableWidget::itemChanged, this, &RadioAstronomyGUI::spectrumMarkerTableItemChanged);
|
||||
|
||||
resizePowerMarkerTable();
|
||||
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_TIME, new TimeDelegate());
|
||||
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_VALUE, new DecimalDelegate(1));
|
||||
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_DELTA_X, new TimeDeltaDelegate());
|
||||
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_DELTA_Y, new DecimalDelegate(1));
|
||||
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_TIME, new TimeDelegate("hh:mm:ss", ui->powerMarkerTable));
|
||||
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_VALUE, new DecimalDelegate(1, ui->powerMarkerTable));
|
||||
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_DELTA_X, new TimeDeltaDelegate(ui->powerMarkerTable));
|
||||
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_DELTA_Y, new DecimalDelegate(1, ui->powerMarkerTable));
|
||||
|
||||
// Create blank marker table
|
||||
ui->powerMarkerTable->setRowCount(POWER_MARKER_ROWS); // 1 peak and two markers
|
||||
@ -2297,6 +2306,7 @@ void RadioAstronomyGUI::customContextMenuRequested(QPoint pos)
|
||||
|
||||
RadioAstronomyGUI::~RadioAstronomyGUI()
|
||||
{
|
||||
delete m_networkManager;
|
||||
delete ui;
|
||||
delete m_calHot;
|
||||
delete m_calCold;
|
||||
@ -6044,10 +6054,11 @@ void RadioAstronomyGUI::networkManagerFinished(QNetworkReply *reply)
|
||||
else
|
||||
{
|
||||
QString answer = reply->readAll();
|
||||
QRegExp re("a href=\\\"download.php([^\"]*)\"");
|
||||
if (re.indexIn(answer) != -1)
|
||||
QRegularExpression re("a href=\\\"download.php([^\"]*)\"");
|
||||
QRegularExpressionMatch match = re.match(answer);
|
||||
if (match.hasMatch())
|
||||
{
|
||||
QString filename = re.capturedTexts()[1];
|
||||
QString filename = match.capturedTexts()[1];
|
||||
qDebug() << "RadioAstronomyGUI: Downloading LAB reference data: " << filename;
|
||||
m_dlm.download(QUrl("https://www.astro.uni-bonn.de/hisurvey/euhou/LABprofile/download.php" + filename), m_filenameLAB);
|
||||
}
|
||||
|
@ -889,7 +889,7 @@ This should be 2.73K when pointing at the sky</string>
|
||||
<item>
|
||||
<widget class="QDoubleSpinBox" name="tempAir">
|
||||
<property name="toolTip">
|
||||
<string>Surface air temperature in degrees celsius</string>
|
||||
<string>Surface air temperature in degrees Celsius</string>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>0</number>
|
||||
@ -2138,7 +2138,7 @@ This should be 2.73K when pointing at the sky</string>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string/>
|
||||
<string>Spectrum chart</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -3768,7 +3768,7 @@ This should be close to the expected difference in power between hot and cold ca
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string/>
|
||||
<string>Power chart</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -4915,7 +4915,7 @@ This should be close to the expected difference in power between hot and cold ca
|
||||
<item>
|
||||
<widget class="QTableWidget" name="powerTable">
|
||||
<property name="toolTip">
|
||||
<string/>
|
||||
<string>Power table</string>
|
||||
</property>
|
||||
<property name="editTriggers">
|
||||
<set>QAbstractItemView::NoEditTriggers</set>
|
||||
|
@ -29,7 +29,7 @@
|
||||
const PluginDescriptor RadioAstronomyPlugin::m_pluginDescriptor = {
|
||||
RadioAstronomy::m_channelId,
|
||||
QStringLiteral("Radio Astronomy"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -593,7 +593,7 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Demodulator status</string>
|
||||
<string>Daylight savings time status</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor RadioClockPlugin::m_pluginDescriptor = {
|
||||
RadioClock::m_channelId,
|
||||
QStringLiteral("Radio Clock"),
|
||||
QStringLiteral("7.20.0-"),
|
||||
QStringLiteral("7.21.3-"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -541,7 +541,7 @@
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="playLoop">
|
||||
<property name="toolTip">
|
||||
<string>Play in a loop</string>
|
||||
<string>Play file in a loop</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
|
@ -32,7 +32,7 @@
|
||||
const PluginDescriptor FileSourcePlugin::m_pluginDescriptor = {
|
||||
FileSource::m_channelId,
|
||||
QStringLiteral("File channel source"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.3"),
|
||||
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -20,7 +20,6 @@
|
||||
|
||||
#include <QTime>
|
||||
#include <QDebug>
|
||||
#include <QMutexLocker>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkReply>
|
||||
#include <QUdpSocket>
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor IEEE_802_15_4_ModPlugin::m_pluginDescriptor = {
|
||||
IEEE_802_15_4_Mod::m_channelId,
|
||||
QStringLiteral("802.15.4 Modulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -49,7 +49,7 @@
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="modulation">
|
||||
<property name="toolTip">
|
||||
<string>Modulaton type.</string>
|
||||
<string>Modulation type</string>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
#include <QTime>
|
||||
#include <QDebug>
|
||||
#include <QMutexLocker>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkDatagram>
|
||||
#include <QNetworkReply>
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor AISModPlugin::m_pluginDescriptor = {
|
||||
AISMod::m_channelId,
|
||||
QStringLiteral("AIS Modulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -20,7 +20,6 @@
|
||||
|
||||
#include <QTime>
|
||||
#include <QDebug>
|
||||
#include <QMutexLocker>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkReply>
|
||||
#include <QUdpSocket>
|
||||
|
@ -32,7 +32,7 @@
|
||||
const PluginDescriptor ChirpChatModPlugin::m_pluginDescriptor = {
|
||||
ChirpChatMod::m_channelId,
|
||||
QStringLiteral("ChirpChat Modulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -24,7 +24,6 @@
|
||||
|
||||
#include <QTime>
|
||||
#include <QDebug>
|
||||
#include <QMutexLocker>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkReply>
|
||||
#include <QBuffer>
|
||||
|
@ -29,7 +29,7 @@
|
||||
const PluginDescriptor DATVModPlugin::m_pluginDescriptor = {
|
||||
DATVMod::m_channelId,
|
||||
QStringLiteral("DATV Modulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE, Edouard Griffiths, F4EXB. DVB-S2 by G4GUO"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -20,7 +20,6 @@
|
||||
|
||||
#include <QTime>
|
||||
#include <QDebug>
|
||||
#include <QMutexLocker>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkDatagram>
|
||||
#include <QNetworkReply>
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor PacketModPlugin::m_pluginDescriptor = {
|
||||
PacketMod::m_channelId,
|
||||
QStringLiteral("Packet Modulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -150,7 +150,7 @@
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="modulation">
|
||||
<property name="toolTip">
|
||||
<string>Modulaton type.</string>
|
||||
<string>Modulation type</string>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
|
@ -17,7 +17,6 @@
|
||||
|
||||
#include <QTime>
|
||||
#include <QDebug>
|
||||
#include <QMutexLocker>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkDatagram>
|
||||
#include <QNetworkReply>
|
||||
|
@ -33,7 +33,7 @@
|
||||
const PluginDescriptor PSK31Plugin::m_pluginDescriptor = {
|
||||
PSK31::m_channelId,
|
||||
QStringLiteral("PSK31 Modulator"),
|
||||
QStringLiteral("7.20.0"),
|
||||
QStringLiteral("7.21.4"),
|
||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -17,7 +17,6 @@
|
||||
|
||||
#include <QTime>
|
||||
#include <QDebug>
|
||||
#include <QMutexLocker>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkDatagram>
|
||||
#include <QNetworkReply>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user