1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-07-28 19:52:26 -04:00

Compare commits

..

No commits in common. "master" and "v7.22.0" have entirely different histories.

13662 changed files with 14391 additions and 89207 deletions

View File

@ -20,118 +20,118 @@ environment:
# -DBUILD_SERVER=OFF \ # -DBUILD_SERVER=OFF \
# -DCMAKE_PREFIX_PATH=C:\\Qt\\5.15.2\\msvc2019_64;C:\\Libraries\\boost_1_73_0" # -DCMAKE_PREFIX_PATH=C:\\Qt\\5.15.2\\msvc2019_64;C:\\Libraries\\boost_1_73_0"
# CMAKE_GENERATOR: Ninja # CMAKE_GENERATOR: Ninja
# - TARGET: ubuntu2204prod - TARGET: ubuntu2204prod
# APPVEYOR_BUILD_WORKER_CLOUD: nasrock Docker APPVEYOR_BUILD_WORKER_CLOUD: nasrock Docker
# APPVEYOR_BUILD_WORKER_IMAGE: Linux APPVEYOR_BUILD_WORKER_IMAGE: Linux
# CC: "gcc-11" CC: "gcc-11"
# CXX: "g++-11" CXX: "g++-11"
# CMAKE_CUSTOM_OPTIONS: "-DCMAKE_BUILD_TYPE=Release \ CMAKE_CUSTOM_OPTIONS: "-DCMAKE_BUILD_TYPE=Release \
# -DARCH_OPT=nehalem \ -DARCH_OPT=nehalem \
# -DDEBUG_OUTPUT=ON \ -DDEBUG_OUTPUT=ON \
# -DENABLE_EXTERNAL_LIBRARIES=AUTO \ -DENABLE_EXTERNAL_LIBRARIES=AUTO \
# -DBUILD_SERVER=OFF" -DBUILD_SERVER=OFF"
- TARGET: ubuntu2204docker - TARGET: ubuntu2204docker
APPVEYOR_BUILD_WORKER_CLOUD: nasrock APPVEYOR_BUILD_WORKER_CLOUD: nasrock
APPVEYOR_BUILD_WORKER_IMAGE: Linux APPVEYOR_BUILD_WORKER_IMAGE: Linux
APPVEYOR_CONSOLE_DISABLE_PTY: true APPVEYOR_CONSOLE_DISABLE_PTY: true
for: for:
# # - matrix: # - matrix:
# # only: # only:
# # - TARGET: 'vs2019gui' # - TARGET: 'vs2019gui'
# # cache: # cache:
# # - C:\ProgramData\chocolatey\bin # - C:\ProgramData\chocolatey\bin
# # - C:\ProgramData\chocolatey\lib # - C:\ProgramData\chocolatey\lib
# # build_script: # build_script:
# # - call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" # - call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
# # # Install GNU patch as applying patches with git fails in BladeRF tree # # Install GNU patch as applying patches with git fails in BladeRF tree
# # - choco install patch # - choco install patch
# # - git submodule update --init --recursive # - git submodule update --init --recursive
# # - mkdir build && cd build # - mkdir build && cd build
# # - cmake .. -G "%CMAKE_GENERATOR%" %CMAKE_CUSTOM_OPTIONS% # - cmake .. -G "%CMAKE_GENERATOR%" %CMAKE_CUSTOM_OPTIONS%
# # - cmake --build . --config Release --target package # - cmake --build . --config Release --target package
# # artifacts: # push installer executable # artifacts: # push installer executable
# # path: build\*.exe # path: build\*.exe
# # name: installer # name: installer
# # deploy: # deploy:
# # release: sdrangel-v$(appveyor_build_version) # release: sdrangel-v$(appveyor_build_version)
# # description: 'SDRangel Windows' # description: 'SDRangel Windows'
# # provider: GitHub # provider: GitHub
# # auth_token: # auth_token:
# # secure: kyU5TaXRoily6q/QLRLqal2xCFGWEdnb8AJIu7FknsUQyj1wjRGmqC2My+Wfszod # secure: kyU5TaXRoily6q/QLRLqal2xCFGWEdnb8AJIu7FknsUQyj1wjRGmqC2My+Wfszod
# # artifact: installer, portable # artifact: installer, portable
# # draft: false # draft: false
# # prerelease: false # prerelease: false
# # tag: $(APPVEYOR_REPO_TAG_NAME) # will not work until tag is pushed # tag: $(APPVEYOR_REPO_TAG_NAME) # will not work until tag is pushed
# # on: # on:
# # APPVEYOR_REPO_TAG: true # deploy on tag push only # APPVEYOR_REPO_TAG: true # deploy on tag push only
# # branch: master # release from master branch only # branch: master # release from master branch only
# - matrix: - matrix:
# only: only:
# - TARGET: ubuntu2204prod - TARGET: ubuntu2204prod
# clone_folder: /home/appveyor/projects clone_folder: /home/appveyor/projects
# cache: cache:
# - $HOME/external/ - $HOME/external/
# install: install:
# - sh: sudo apt-get update - sh: sudo apt-get update
# - sh: echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections - sh: echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections
# # not sdrplay with soapysdr; libairspyhf-dev is too old (no lna) # not sdrplay with soapysdr; libairspyhf-dev is too old (no lna)
# - sh: | - sh: |
# sudo apt-get -y install build-essential cmake git xxd \ sudo apt-get -y install build-essential cmake git xxd \
# devscripts fakeroot debhelper libfftw3-dev qtbase5-dev libopengl-dev libqt5opengl5-dev \ devscripts fakeroot debhelper libfftw3-dev qtbase5-dev libopengl-dev libqt5opengl5-dev \
# qttools5-dev qttools5-dev-tools qtmultimedia5-dev libqt5multimedia5-plugins libqt5websockets5-dev \ qttools5-dev qttools5-dev-tools qtmultimedia5-dev libqt5multimedia5-plugins libqt5websockets5-dev \
# libqt5quick5 qtwebengine5-dev qtbase5-private-dev \ libqt5quick5 qtwebengine5-dev qtbase5-private-dev \
# qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick-window2 qml-module-qtquick-dialogs \ qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick-window2 qml-module-qtquick-dialogs \
# qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qtgraphicaleffects \ qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qtgraphicaleffects \
# libqt5serialport5-dev qtdeclarative5-dev qtpositioning5-dev qtlocation5-dev \ libqt5serialport5-dev qtdeclarative5-dev qtpositioning5-dev qtlocation5-dev \
# libqt5charts5-dev libqt5texttospeech5-dev libqt5gamepad5-dev libqt5svg5-dev libfaad-dev libflac-dev zlib1g-dev \ libqt5charts5-dev libqt5texttospeech5-dev libqt5gamepad5-dev libqt5svg5-dev libfaad-dev zlib1g-dev \
# libusb-1.0-0-dev libhidapi-dev libboost-all-dev libasound2-dev libopencv-dev libopencv-imgcodecs-dev \ libusb-1.0-0-dev libhidapi-dev libboost-all-dev libasound2-dev libopencv-dev libopencv-imgcodecs-dev \
# libxml2-dev bison flex ffmpeg libpostproc-dev libavcodec-dev libavformat-dev \ libxml2-dev bison flex ffmpeg libpostproc-dev libavcodec-dev libavformat-dev \
# libopus-dev libcodec2-dev libairspy-dev libhackrf-dev \ libopus-dev libcodec2-dev libairspy-dev libhackrf-dev \
# libbladerf-dev libsoapysdr-dev libiio-dev libuhd-dev libhamlib-dev \ libbladerf-dev libsoapysdr-dev libiio-dev libuhd-dev libhamlib-dev \
# python3-mako python3-cheetah python3-numpy \ python3-mako python3-cheetah python3-numpy \
# autoconf automake libtool ninja-build libclang1-11 autoconf automake libtool ninja-build libclang1-11
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_cm256cc.sh; fi - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_cm256cc.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_mbelib.sh; fi - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_mbelib.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_serialdv.sh; fi - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_serialdv.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_dsdcc.sh; fi - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_dsdcc.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_perseus-sdr.sh; fi - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_perseus-sdr.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_xtrx-sdr.sh; fi - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_xtrx-sdr.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_airspyhf.sh; fi - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_airspyhf.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_rtlsdr.sh; fi - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_rtlsdr.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_limesuite.sh; fi - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_limesuite.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_ggmorse.sh; fi - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_ggmorse.sh; fi
# - sh: bash cmake/ci/build_sdrplay.sh - sh: bash cmake/ci/build_sdrplay.sh
# before_build: before_build:
# - sh: bash -c export - sh: bash -c export
# - sh: bash -c pwd - sh: bash -c pwd
# build_script: build_script:
# - sh: ./cmake/ci/build_sdrangel.sh - sh: ./cmake/ci/build_sdrangel.sh
# test_script: test_script:
# # debian build path # debian build path
# - sh: ./obj-x86_64-linux-gnu/sdrangelbench - sh: ./obj-x86_64-linux-gnu/sdrangelbench
# after_build: after_build:
# - sh: mkdir sdrangel-${APPVEYOR_BUILD_VERSION} - sh: mkdir sdrangel-${APPVEYOR_BUILD_VERSION}
# - sh: cp ../*.deb ../*.build ../*.buildinfo ../*.changes sdrangel-${APPVEYOR_BUILD_VERSION} - sh: cp ../*.deb ../*.build ../*.buildinfo ../*.changes sdrangel-${APPVEYOR_BUILD_VERSION}
# - sh: tar -czf sdrangel-${APPVEYOR_BUILD_VERSION}.tar.gz sdrangel-${APPVEYOR_BUILD_VERSION} - sh: tar -czf sdrangel-${APPVEYOR_BUILD_VERSION}.tar.gz sdrangel-${APPVEYOR_BUILD_VERSION}
# artifacts: artifacts:
# - path: sdrangel-${APPVEYOR_BUILD_VERSION}.tar.gz - path: sdrangel-${APPVEYOR_BUILD_VERSION}.tar.gz
# name: package2204 name: package2204
# # deploy: # deploy:
# # release: sdrangel-v$(appveyor_build_version) # release: sdrangel-v$(appveyor_build_version)
# # description: 'SDRangel Ubuntu 22.04' # description: 'SDRangel Ubuntu 22.04'
# # provider: GitHub # provider: GitHub
# # auth_token: # auth_token:
# # secure: kyU5TaXRoily6q/QLRLqal2xCFGWEdnb8AJIu7FknsUQyj1wjRGmqC2My+Wfszod # secure: kyU5TaXRoily6q/QLRLqal2xCFGWEdnb8AJIu7FknsUQyj1wjRGmqC2My+Wfszod
# # artifact: archive # artifact: archive
# # draft: false # draft: false
# # prerelease: false # prerelease: false
# # on: # on:
# # APPVEYOR_REPO_TAG: true # deploy on tag push only # APPVEYOR_REPO_TAG: true # deploy on tag push only
# # branch: master # release from master branch only # branch: master # release from master branch only
# deploy: deploy:
# provider: Environment provider: Environment
# name: f4exb name: f4exb
- matrix: - matrix:
only: only:
- TARGET: ubuntu2204docker - TARGET: ubuntu2204docker

View File

@ -1,62 +0,0 @@
name: SDRangel Linux release build
on:
push:
branches:
- linux_github_release
tags:
- 'v*'
jobs:
build_deb:
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, ubuntu-24.04]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get -y install build-essential cmake git xxd \
devscripts fakeroot debhelper libfftw3-dev qtbase5-dev libopengl-dev libqt5opengl5-dev \
qttools5-dev qttools5-dev-tools qtmultimedia5-dev libqt5multimedia5-plugins libqt5websockets5-dev \
libqt5quick5 qtwebengine5-dev qtbase5-private-dev \
qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick-window2 qml-module-qtquick-dialogs \
qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qtgraphicaleffects \
libqt5serialport5-dev qtdeclarative5-dev qtpositioning5-dev qtlocation5-dev \
libqt5charts5-dev libqt5texttospeech5-dev libqt5gamepad5-dev libqt5svg5-dev libfaad-dev libflac-dev zlib1g-dev \
libusb-1.0-0-dev libhidapi-dev libboost-all-dev libasound2-dev libopencv-dev libopencv-imgcodecs-dev \
libxml2-dev bison flex ffmpeg libpostproc-dev libavcodec-dev libavformat-dev \
libopus-dev libcodec2-dev libairspy-dev libhackrf-dev \
libbladerf-dev libsoapysdr-dev libiio-dev libuhd-dev libhamlib-dev \
python3-mako python3-cheetah python3-numpy \
autoconf automake libtool ninja-build
bash cmake/ci/build_sdrplay.sh
- name: Build SDRangel
run: |
debuild -i -us -uc -b
- name: Get version
id: get_version
run: |
if [[ "${{github.ref_name}}" == "linux_github_release" ]]; then
echo "version=$(echo ${{github.sha}} | cut -c1-7)" >> $GITHUB_OUTPUT
else
echo "version=$(echo ${{github.ref_name}} | cut -c2-)" >> $GITHUB_OUTPUT
fi
- name: Rename
run: mv ../sdrangel_*_amd64.deb sdrangel_${{ steps.get_version.outputs.version }}_${{ matrix.os }}_amd64.deb
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel_${{ steps.get_version.outputs.version }}_${{ matrix.os }}_amd64.deb
path: sdrangel_${{ steps.get_version.outputs.version }}_${{ matrix.os }}_amd64.deb
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: sdrangel_${{ steps.get_version.outputs.version }}_${{ matrix.os }}_amd64.deb

View File

@ -1,161 +0,0 @@
name: SDRangel Mac release build
on:
push:
branches:
- mac_ci
tags:
- 'v*'
jobs:
build_mac_x64:
runs-on: macos-13
env:
MACOSX_DEPLOYMENT_TARGET: 12.0
steps:
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Update brew
run: brew update
- name: Install brew packages
run: brew install nasm subversion
- name: Install SDRplay API
run: |
wget https://www.sdrplay.com/software/SDRplayAPI-macos-installer-universal-3.15.0.pkg
sudo installer -pkg SDRplayAPI-macos-installer-universal-3.15.0.pkg -target /
- name: Install python
run: |
wget https://www.python.org/ftp/python/3.12.7/python-3.12.7-macos11.pkg
sudo installer -pkg python-3.12.7-macos11.pkg -target /
- name: Install python packages for UHD
run: |
/usr/local/bin/python3.12 -m pip install numpy mako requests Cheetah3 setuptools
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '6.9.1'
host: 'mac'
arch: 'clang_64'
modules: 'qtcharts qtscxml qt5compat qtlocation qtmultimedia qtpositioning qtserialport qtspeech qtwebsockets qtwebengine qtshadertools qtwebchannel'
- 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_USRP=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DENABLE_EXTERNAL_LIBRARIES=ON -DBUNDLE=ON -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=TRUE -DPYTHON_EXECUTABLE=/usr/local/bin/python3.12
- name: Build SDRangel on Mac
run: |
cd build
make -j4
- name: Create dmg
run: |
cd build
RETRIES=5
COUNT=1
set +e
while [ $COUNT -lt $RETRIES ]; do
make package
if [ $? -eq 0 ]; then
RETRIES=0
break
fi
let COUNT=$COUNT+1
done
shell: bash
continue-on-error: true
- name: Get version
id: get_version
run: |
if [[ "${{github.ref_name}}" == "mac_ci" ]]; then
echo "version=$(echo ${{github.sha}} | cut -c1-7)" >> $GITHUB_OUTPUT
else
echo "version=$(echo ${{github.ref_name}} | cut -c2-)" >> $GITHUB_OUTPUT
fi
- name: Get filename
id: get_filename
run: echo "filename=$(grep CPACK_PACKAGE_FILE_NAME build/CMakeCache.txt | cut -d "=" -f2)" >> $GITHUB_OUTPUT
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-macx64.dmg
path: ${{ github.workspace }}/build/${{ steps.get_filename.outputs.filename }}.dmg
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: ${{ github.workspace }}/build/${{ steps.get_filename.outputs.filename }}.dmg
build_mac_arm64:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Update brew
run: brew update
- name: Install brew packages
run: brew install nasm subversion
- name: Install SDRplay API
run: |
wget https://www.sdrplay.com/software/SDRplayAPI-macos-installer-universal-3.15.0.pkg
sudo installer -pkg SDRplayAPI-macos-installer-universal-3.15.0.pkg -target /
- name: Install python
run: |
wget https://www.python.org/ftp/python/3.12.7/python-3.12.7-macos11.pkg
sudo installer -pkg python-3.12.7-macos11.pkg -target /
- name: Install python packages for UHD
run: |
/usr/local/bin/python3.12 -m pip install numpy mako requests Cheetah3 setuptools
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '6.9.1'
host: 'mac'
arch: 'clang_64'
modules: 'qtcharts qtscxml qt5compat qtlocation qtmultimedia qtpositioning qtserialport qtspeech qtwebsockets qtwebengine qtshadertools qtwebchannel'
- name: Configure SDRangel
run: |
mkdir build && cd build
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_QT6=ON -DCMAKE_BUILD_TYPE=Release -DDEBUG_OUTPUT=ON -DENABLE_USRP=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DENABLE_EXTERNAL_LIBRARIES=ON -DBUNDLE=ON -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=TRUE -DPYTHON_EXECUTABLE=/usr/local/bin/python3.12
- name: Build SDRangel on Mac
run: |
cd build
make -j3
- name: Create dmg
run: |
cd build
RETRIES=5
COUNT=1
set +e
while [ $COUNT -lt $RETRIES ]; do
make package
if [ $? -eq 0 ]; then
RETRIES=0
break
fi
let COUNT=$COUNT+1
done
shell: bash
continue-on-error: true
- name: Get version
id: get_version
run: |
if [[ "${{github.ref_name}}" == "mac_ci" ]]; then
echo "version=$(echo ${{github.sha}} | cut -c1-7)" >> $GITHUB_OUTPUT
else
echo "version=$(echo ${{github.ref_name}} | cut -c2-)" >> $GITHUB_OUTPUT
fi
- name: Get filename
id: get_filename
run: echo "filename=$(grep CPACK_PACKAGE_FILE_NAME build/CMakeCache.txt | cut -d "=" -f2)" >> $GITHUB_OUTPUT
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-macarm64.dmg
path: ${{ github.workspace }}/build/${{ steps.get_filename.outputs.filename }}.dmg
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: ${{ github.workspace }}/build/${{ steps.get_filename.outputs.filename }}.dmg

View File

@ -24,7 +24,7 @@ jobs:
WIN_ARCH: "x64", WIN_ARCH: "x64",
os: windows-latest, os: windows-latest,
QT_INST_DIR: "C:/", QT_INST_DIR: "C:/",
QTDIR: "C:/Qt/6.7.3/msvc2019_64", QTDIR: "C:/Qt/5.15.2/msvc2019_64",
QT_ARCH: win64_msvc2019_64, QT_ARCH: win64_msvc2019_64,
boost_dl: "${{ github.workspace }}\\downloads\\boost", boost_dl: "${{ github.workspace }}\\downloads\\boost",
lib_dir: "C:\\Libraries", lib_dir: "C:\\Libraries",
@ -41,9 +41,6 @@ jobs:
echo github.event_name: ${{ github.event_name }} echo github.event_name: ${{ github.event_name }}
echo github.ref: ${{ github.ref }} echo github.ref: ${{ github.ref }}
echo github.workspace: ${{ github.workspace }} echo github.workspace: ${{ github.workspace }}
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install basic dependencies on Windows - name: Install basic dependencies on Windows
if: startsWith(matrix.config.os, 'windows') if: startsWith(matrix.config.os, 'windows')
run: | run: |
@ -72,20 +69,19 @@ jobs:
rm -rf boost_*/* download.tar.bz2 download.tar rm -rf boost_*/* download.tar.bz2 download.tar
shell: bash shell: bash
- name: Install Qt - name: Install Qt
uses: jurplel/install-qt-action@v4 uses: jurplel/install-qt-action@v3
with: with:
version: '6.7.3'
dir: ${{matrix.config.QT_INST_DIR}} dir: ${{matrix.config.QT_INST_DIR}}
arch: ${{matrix.config.QT_ARCH}} arch: ${{matrix.config.QT_ARCH}}
setup-python: false setup-python: false
modules: 'qtcharts qtscxml qt5compat qtlocation qtmultimedia qtpositioning qtserialport qtspeech qtwebsockets qtwebengine qtshadertools qtwebchannel' modules: 'qtcharts qtwebengine'
- name: build sdrangel on Windows - name: build sdrangel on Windows
if: startsWith(matrix.config.os, 'windows') if: startsWith(matrix.config.os, 'windows')
run: | run: |
cmd "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" cmd "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
choco install patch choco install patch
mkdir build && cd build mkdir build && cd build
cmake .. -G "${{ matrix.config.generators }}" -DCMAKE_BUILD_TYPE=Release -DENABLE_QT6=ON -DARCH_OPT=SSE4_2 -DDEBUG_OUTPUT=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DCMAKE_PREFIX_PATH="C:\Qt\6.7.3\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 cmake --build . --config Release --target package
- name: Check disk space - name: Check disk space
run: Get-PSDrive run: Get-PSDrive
@ -93,13 +89,18 @@ jobs:
id: get_version id: get_version
run: echo "version=$(grep sdrangel_VERSION build/CMakeCache.txt | cut -d "=" -f2)" >> $env:GITHUB_OUTPUT run: echo "version=$(grep sdrangel_VERSION build/CMakeCache.txt | cut -d "=" -f2)" >> $env:GITHUB_OUTPUT
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v3
with: with:
name: sdrangel-${{ steps.get_version.outputs.version }}-win64.exe name: sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
path: ${{ github.workspace }}/build/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe path: ${{ github.workspace }}/build/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v0.1.13
with:
files: ${{ github.workspace }}/build/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
build_mac: build_mac:
runs-on: macos-14 runs-on: macos-13
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
@ -124,7 +125,10 @@ jobs:
- name: Configure SDRangel - name: Configure SDRangel
run: | run: |
mkdir build && cd build mkdir build && cd build
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_QT6=ON -DCMAKE_BUILD_TYPE=Release -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/" 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
- name: Build SDRangel on Mac - name: Build SDRangel on Mac
run: | run: |
cd build cd build

View File

@ -1,44 +0,0 @@
# See: https://github.com/snapcore/action-build
name: SDRangel snap release build
on:
push:
branches:
- snap
tags:
- 'v*'
jobs:
build_snap:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Get version
id: get_version
run: |
if [[ "${{github.ref_name}}" == "snap" ]]; then
echo "version=${{github.sha}}" >> $GITHUB_OUTPUT
else
echo "version=$(echo ${{github.ref_name}} | cut -c2-)" >> $GITHUB_OUTPUT
fi
- uses: snapcore/action-build@v1
id: build
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-amd64.snap
path: ${{ steps.build.outputs.snap }}
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: ${{ steps.build.outputs.snap }}
- uses: snapcore/action-publish@v1
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
with:
snap: ${{ steps.build.outputs.snap }}
release: stable

View File

@ -1,119 +0,0 @@
name: SDRangel Windows release build and signing
on:
push:
branches:
- master
tags:
- 'v*'
jobs:
build:
name: ${{ matrix.config.name }}
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: false
matrix:
config:
- {
name: "Windows-x64",
WIN_ARCH: "x64",
os: windows-latest,
QT_INST_DIR: "C:/",
QTDIR: "C:/Qt/6.7.3/msvc2019_64",
QT_ARCH: win64_msvc2019_64,
boost_dl: "${{ github.workspace }}\\downloads\\boost",
lib_dir: "C:\\Libraries",
generators: Ninja
}
steps:
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Print env
run: |
echo github.event.action: ${{ github.event.action }}
echo github.event_name: ${{ github.event_name }}
echo github.ref: ${{ github.ref }}
echo github.workspace: ${{ github.workspace }}
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install basic dependencies on Windows
if: startsWith(matrix.config.os, 'windows')
run: |
choco install ninja cmake
ninja --version
cmake --version
- name: Install MSVC on Windows
if: startsWith(matrix.config.os, 'windows')
uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64
- name: Install Boost
env:
BOOST_ROOT: ${{ matrix.config.boost_dl }}
BOOST_DEST: ${{ matrix.config.lib_dir }}
BOOST_URL: https://archives.boost.io/release/1.73.0/source/boost_1_73_0.tar.bz2
run: |
mkdir -p $BOOST_ROOT
mkdir -p $BOOST_DEST
curl --progress-bar --location --output $BOOST_ROOT/download.tar.bz2 $BOOST_URL
7z -o$BOOST_ROOT x $BOOST_ROOT/download.tar.bz2 -y -bd
7z -o$BOOST_ROOT x $BOOST_ROOT/download.tar -y -bd
cd $BOOST_ROOT && cp -r boost_* $BOOST_DEST
ls -l $BOOST_DEST
ls -l "C:\\"
rm -rf boost_*/* download.tar.bz2 download.tar
shell: bash
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '6.7.3'
dir: ${{matrix.config.QT_INST_DIR}}
arch: ${{matrix.config.QT_ARCH}}
setup-python: 'false'
modules: 'qtcharts qtscxml qt5compat qtlocation qtmultimedia qtpositioning qtserialport qtspeech qtwebsockets qtwebengine qtshadertools qtwebchannel'
- name: build sdrangel on Windows
if: startsWith(matrix.config.os, 'windows')
run: |
cmd "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
choco install patch
mkdir build && cd build
cmake .. -G "${{ matrix.config.generators }}" -DCMAKE_BUILD_TYPE=Release -DENABLE_QT6=ON -DARCH_OPT=SSE4_2 -DDEBUG_OUTPUT=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DCMAKE_PREFIX_PATH="C:\Qt\6.7.3\msvc2019_64;C:\Libraries\boost_1_73_0"
cmake --build . --config Release --target package
- name: Check disk space
run: Get-PSDrive
- name: Get version
id: get_version
run: echo "version=$(grep sdrangel_VERSION build/CMakeCache.txt | cut -d "=" -f2)" >> $env:GITHUB_OUTPUT
- name: Upload unsigned artifact
id: upload-unsigned-artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
path: ${{ github.workspace }}/build/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
- name: Sign Code
id: sign_code
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: '553b8f53-adf0-4fe5-be3d-283504a21a51'
project-slug: 'sdrangel'
signing-policy-slug: 'release-signing'
github-artifact-id: '${{ steps.upload-unsigned-artifact.outputs.artifact-id }}'
wait-for-completion: true
output-artifact-directory: 'build\signed'
wait-for-completion-timeout-in-seconds: 3600
- name: Upload signed artifact
id: upload-signed-artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-win64-signed.exe
path: ${{ github.workspace }}/build/signed/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: ${{ github.workspace }}/build/signed/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe

127
CHANGELOG
View File

@ -1,130 +1,3 @@
sdrangel (7.22.8-1) unstable; urgency=medium
* See Github release
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Wed, 02 Jul 2025 17:00:39 +0200
sdrangel (7.22.7-1) unstable; urgency=medium
* See Github release
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 04 May 2025 17:58:14 +0200
sdrangel (7.22.6-1) unstable; urgency=medium
* See Github release
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 02 Feb 2025 18:08:11 +0100
sdrangel (7.22.5-1) unstable; urgency=medium
* Windows: upload signed releases rather than unsigned releases to Github releases page. PR #2347
* Windows: fixed signed releases. PR #2344
* FT8 Demod: limit upper bandwidth to 5.8 kHz. Fixes #2339
* Stop device while changing channel set. Fixes #2332. PR #2342
* ADSB: Update URL of OpenSkyNetwork Aircraft database. PR #2341
* Don't stop source if being deleted. For #2315. PR #2340
* Send DSPSignalNotification in audio mods for #2336. PR #2340
* Radiosonde: limit precision of floating point numbers sent to SondeHub. PR #2338
* Windows signed releases: use relative path. Increase timeout to 30 minutes. PR #2335
* ADSB: Include adsbdemodsettings.h PR #2334
* Use release signing certificate for Windows installer. PR #2331
* Fix memory leak and race condition relating to DSP*Engines. Part of #2159 PR #2330
* FreeDV: Fix memory allocation/free issues. Part of #2315. PR #2330
* Wav Files: Add support for meta-data. PR #2328
* DemodAnalyzer: Ensure sample rate is set in worker. Fixes #2309. PR #2328
^ SDRplayv3: Mac: link with libsdrplay_api.so.3 rather than libsdrplay_api.so.3.15. PR #2327
* ADS-B: Fix memory use after delete. For #1734 and part of #2315 PR #2326
* Fixed Appveyor Docker image build
* Fix output-artifact-directory and unzip file. PR #2323
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Thu, 05 Dec 2024 01:07:27 +0100
sdrangel (7.22.4-1) unstable; urgency=medium
* Use macos-12 for Mac x86 build. PR #2321
* Workaround for "hdiutil: create failed - Resource busy"
* Pager: Add alpha and numeric columns. Implements #2319. PR #2320
* Added qtwebchannel dependecy to fix missing 3d Map and Sky Map from Windows release. PR #2316
* Removed .deb package build from Appveyor
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Mom, 11 Nov 2024 08:42:03 +0100
sdrangel (7.22.3-1) unstable; urgency=medium
* Add deb dependencies for pipewire. PR #2314
* Added compilation options for WebAssembly. PR #2313
* ADS-B: Use settings keys. PR #2310
* AIS Demod: Remove spacing around messages. PR #2310
* Freuqency Scanner: Add multiplex mode. PR #2310
* Build snap, MAC, Windows and Ubuntu .deb with Github actions. Various PRs
* Server: Use Sink/MIMO signals rather than Source. Part of #2294. PR #2304
* Updated some Python scripts to Python3. PR #2298
* RemoteTCPSink: Does use IQ only setting for RTL0. PR #2301
* Server: wait for set sample source/sink/MIMO to complete before loading the device settings. Fixes #2294
* Fix spectrum peak measurement for SSB spectra. Fixes #2282. PR #2299
* Upgrade C++ standard to c++17
* Fixes for Android . PR #2288
* Add qtshadertools. PR #2287
* Add more Qt modules and set ENABLE_QT6=ON. PR #2287
* Update Qt optional packages for 6.8 , PR #2287
* Use Qt 6.8 for Windows build. PR #2287
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sat, 09 Nov 2024 17:30:44 +0100
sdrangel (7.22.2-1) unstable; urgency=medium
* ChirpChat: increased preamble symbols limit from 20 to 32. Fixes #2284
* RTLSDR: Apply driver settings in RTLSDRThread Add sync read for WebAssembly. PR #2281
* SSB demod: fixed GUI and returned to previous threading model. Fixes #2273
* HeatMap: Catch memory allocation failures... For #2083 PR #2277
* Add default-qt6-windows cmake config. PR #2276
* Add pager notifications. Add option to ignore duplicates. Support plotting pager messages on the map. PR #2276
* Don't load defaults if loading a preset. PR #2274
* DeviceGUI::closeEvent - Don't automatically delete the GUI,.. PR #2274
* MainWindow: Add FSMs to avoid blocking on the GUI thread... PR #2274
* Fix replay buffer when FixReal is qint16. PR #2270
* snap: Try to get version number from latest tag. PR #2270
* Add libflac to snap. Set ARCH_OPT to nehalem. PR #2270
* Fix flac on Mac. PR #2270
* RemoteTCP: Update docs. PR #2270
* Map: Fix Kiwi list. Add SDRangel wss support. PR #2270
* RemoteTCPSink: Report server init errors via GUI. Send protocol to public list. PR #2270
* RemoteTCPInput: Add wss protocol support. PR #2270
* Fix DeviceAPI::deserialize. Fixes #2266. PR #2267
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 20 Oct 2024 08:26:38 +0200
sdrangel (7.22.1-1) unstable; urgency=medium
* wdsprx: Fix path to help file.
* Removed SyncMessenger from DSPDeviceSourceEngine. Part of #2159
* Fixed threading model for DSPDeviceSourceEngine. Part of #2159
* Removed SyncMessenger from DSPDeviceMIMOEngine. Part of #2159
* RTLSDR: make sure start and stop are effective once only. PArt of #2159
* Fixed threading model for DSPDeviceMIMOEngine plus other fixes. Part of #2159
* Removed SyncMessenger from DSPDeviceSinkEngine. Part of #2159
* SSBMod, AMMod, NFMMod: revised thread processing
* Fixed threading model for DSPDeviceSinkEngine plus other fixes. Part of #2159
* DeviceSet and DeviceUISet: use delete channel API instead of destroy method...
* BladeRF2Output: removed applySettings from stop method
* All device plugins: make sure start and stop are effective once only. PArt of #2159
* Removed the destroy method from ChannelGUI interface
* DeviceGUI: removed destroy method. Part of #2159
* Fix SopaySDR library search when system cmake package present. PR #2245
* Append prefix to plugin name when running on Android. PR #2245
* Fix compilation with newer ffmpeg libavutil. PR #2245
* Fix compilation for Android with Qt6. PR #2245
* Bump Cmake minimal version to 3.17
* Use new find_package(CUDA Toolkit). PR #2250
* Update CMakeLists.txt to allow static libraries to be built, as well as shared... PR #2252
* Allow plugins to be compiled as static libs, part 2. PR #2254
* Use opencv4 with VS2022. PR #2257
* Frequency Scanner: initialize pointer to FrequencyScanner. Fixes #2262
* Update channel list upon Morse Decoder and Demod Analyzer GUI creation. Fixes #2263
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 06 Oct 2024 08:39:11 +0200
sdrangel (7.22.0-1) unstable; urgency=medium sdrangel (7.22.0-1) unstable; urgency=medium
* New Rx channel based on WDSP. Issue #2156 * New Rx channel based on WDSP. Issue #2156

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.17.0) cmake_minimum_required(VERSION 3.13.0)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL") set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
@ -11,7 +11,7 @@ endif()
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
# disable only when needed # disable only when needed
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)
@ -20,7 +20,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# configure version # configure version
set(sdrangel_VERSION_MAJOR "7") set(sdrangel_VERSION_MAJOR "7")
set(sdrangel_VERSION_MINOR "22") set(sdrangel_VERSION_MINOR "22")
set(sdrangel_VERSION_PATCH "8") set(sdrangel_VERSION_PATCH "0")
set(sdrangel_VERSION_SUFFIX "") set(sdrangel_VERSION_SUFFIX "")
# SDRAngel cmake options # SDRAngel cmake options
@ -30,7 +30,6 @@ option(SANITIZE_MEMORY "Activate detection of leaked memory (LeakSanitizer)" OFF
option(RX_SAMPLE_24BIT "Internal 24 bit Rx DSP" ON) option(RX_SAMPLE_24BIT "Internal 24 bit Rx DSP" ON)
option(BUILD_SERVER "Build Server" ON) option(BUILD_SERVER "Build Server" ON)
option(BUILD_GUI "Build GUI" ON) option(BUILD_GUI "Build GUI" ON)
option(BUILD_BENCH "Build benchmark" ON)
option(HIDE_CONSOLE "Hide console when running GUI on Windows" ON) option(HIDE_CONSOLE "Hide console when running GUI on Windows" ON)
option(BUNDLE "Enable distribution bundle" OFF) option(BUNDLE "Enable distribution bundle" OFF)
set(ARCH_OPT "native" CACHE STRING "Specify instruction set to use. Will be passed directly as `-march` or `/arch:` argument on supported compilers. \ set(ARCH_OPT "native" CACHE STRING "Specify instruction set to use. Will be passed directly as `-march` or `/arch:` argument on supported compilers. \
@ -38,10 +37,8 @@ set(ARCH_OPT "native" CACHE STRING "Specify instruction set to use. Will be pass
option(ENABLE_QT6 "Build with Qt6 rather than Qt5" OFF) option(ENABLE_QT6 "Build with Qt6 rather than Qt5" OFF)
option(ENABLE_PROFILER "Enable runtime profiler" OFF) option(ENABLE_PROFILER "Enable runtime profiler" OFF)
set(VKFFT_BACKEND 1 CACHE STRING "vkFFT Backend: 0 - Vulkan, 1 - CUDA") set(VKFFT_BACKEND 1 CACHE STRING "vkFFT Backend: 0 - Vulkan, 1 - CUDA")
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
# Sampling devices enablers # Sampling devices enablers
option(ENABLE_AARONIARTSA "Enable AaroniaRTSA support" ON)
option(ENABLE_AIRSPY "Enable AirSpy support" ON) option(ENABLE_AIRSPY "Enable AirSpy support" ON)
option(ENABLE_AIRSPYHF "Enable AirSpyHF support" ON) option(ENABLE_AIRSPYHF "Enable AirSpyHF support" ON)
option(ENABLE_BLADERF "Enable bladeRF support" ON) option(ENABLE_BLADERF "Enable bladeRF support" ON)
@ -49,7 +46,6 @@ option(ENABLE_FUNCUBE "Enable FUNcube support" ON)
option(ENABLE_HACKRF "Enable HackRF support" ON) option(ENABLE_HACKRF "Enable HackRF support" ON)
option(ENABLE_IIO "Enable liniio support like PlutoSDR" ON) option(ENABLE_IIO "Enable liniio support like PlutoSDR" ON)
option(ENABLE_LIMESUITE "Enable limesuite support" ON) option(ENABLE_LIMESUITE "Enable limesuite support" ON)
option(ENABLE_METIS "Enable Metis support" ON)
option(ENABLE_MIRISDR "Enable LibMiri for old SDRPlay" ON) option(ENABLE_MIRISDR "Enable LibMiri for old SDRPlay" ON)
option(ENABLE_PERSEUS "Enable perseus support" ON) option(ENABLE_PERSEUS "Enable perseus support" ON)
option(ENABLE_RTLSDR "Enable rtl-sdr support" ON) option(ENABLE_RTLSDR "Enable rtl-sdr support" ON)
@ -186,7 +182,7 @@ if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git/")
endif() endif()
find_program(CCACHE "ccache") find_program(CCACHE "ccache")
if(CCACHE AND NOT EMSCRIPTEN) if(CCACHE)
message(STATUS "Using ccache ${CCACHE}") message(STATUS "Using ccache ${CCACHE}")
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE}) set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE}) set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
@ -194,7 +190,7 @@ if(CCACHE AND NOT EMSCRIPTEN)
set(CMAKE_OBJCXX_COMPILER_LAUNCHER ${CCACHE}) set(CMAKE_OBJCXX_COMPILER_LAUNCHER ${CCACHE})
endif() endif()
set(ENV{CCACHE_SLOPPINESS} pch_defines,time_macros) set(ENV{CCACHE_SLOPPINESS} pch_defines,time_macros)
endif() endif(CCACHE)
set(sdrangel_VERSION "${sdrangel_VERSION_MAJOR}.${sdrangel_VERSION_MINOR}.${sdrangel_VERSION_PATCH}${sdrangel_VERSION_SUFFIX}" CACHE INTERNAL "") set(sdrangel_VERSION "${sdrangel_VERSION_MAJOR}.${sdrangel_VERSION_MINOR}.${sdrangel_VERSION_PATCH}${sdrangel_VERSION_SUFFIX}" CACHE INTERNAL "")
message(STATUS "${APPLICATION_NAME} Version: ${sdrangel_VERSION}") message(STATUS "${APPLICATION_NAME} Version: ${sdrangel_VERSION}")
@ -273,15 +269,6 @@ else()
endif() endif()
set(INSTALL_PLUGINS_DIR "${INSTALL_LIB_DIR}/plugins") set(INSTALL_PLUGINS_DIR "${INSTALL_LIB_DIR}/plugins")
set(INSTALL_PLUGINSSRV_DIR "${INSTALL_LIB_DIR}/pluginssrv") set(INSTALL_PLUGINSSRV_DIR "${INSTALL_LIB_DIR}/pluginssrv")
if(ANDROID)
set(PLUGINS_PREFIX "sdrangel_plugins_")
set(PLUGINSSRV_PREFIX "sdrangel_pluginssrv_")
set(ANDROID_PACKAGE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/android/qt6 CACHE INTERNAL "")
else()
set(PLUGINS_PREFIX "")
set(PLUGINSSRV_PREFIX "")
endif()
set(EXTERNAL_BUILD_LIBRARIES "${CMAKE_BINARY_DIR}/external") set(EXTERNAL_BUILD_LIBRARIES "${CMAKE_BINARY_DIR}/external")
# custom libraries # custom libraries
@ -348,7 +335,7 @@ elseif (WIN32)
set(LIBUSB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/libusb/MS64/dll/libusb-1.0.lib" CACHE INTERNAL "") set(LIBUSB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/libusb/MS64/dll/libusb-1.0.lib" CACHE INTERNAL "")
set(LIBUSB_DLL_DIR "${EXTERNAL_LIBRARY_FOLDER}/libusb/MS64/dll" CACHE INTERNAL "") set(LIBUSB_DLL_DIR "${EXTERNAL_LIBRARY_FOLDER}/libusb/MS64/dll" CACHE INTERNAL "")
if(VS2022 OR VS2019) if(VS2019)
set(OpenCV_DIR "${EXTERNAL_LIBRARY_FOLDER}/opencv4" CACHE INTERNAL "") set(OpenCV_DIR "${EXTERNAL_LIBRARY_FOLDER}/opencv4" CACHE INTERNAL "")
else() else()
set(OpenCV_DIR "${EXTERNAL_LIBRARY_FOLDER}/opencv" CACHE INTERNAL "") set(OpenCV_DIR "${EXTERNAL_LIBRARY_FOLDER}/opencv" CACHE INTERNAL "")
@ -429,7 +416,7 @@ elseif (WIN32)
elseif(ANDROID) elseif(ANDROID)
set(EXTERNAL_LIBRARY_FOLDER "${CMAKE_SOURCE_DIR}/external/android") set(EXTERNAL_LIBRARY_FOLDER "${CMAKE_SOURCE_DIR}/external/android")
set(Boost_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/ndk_26b_boost_1.83.0/include" CACHE INTERNAL "") set(Boost_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/ndk_21_boost_1.72.0/include" CACHE INTERNAL "")
set(FFTW3F_FOUND ON CACHE INTERNAL "") set(FFTW3F_FOUND ON CACHE INTERNAL "")
set(FFTW3F_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/fftw-3/include" CACHE INTERNAL "") set(FFTW3F_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/fftw-3/include" CACHE INTERNAL "")
@ -486,14 +473,6 @@ elseif(ANDROID)
set(SWSCALE_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/include" CACHE INTERNAL "") set(SWSCALE_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/include" CACHE INTERNAL "")
set(SWSCALE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libswscale.so" CACHE INTERNAL "") set(SWSCALE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libswscale.so" CACHE INTERNAL "")
set(GGMORSE_FOUND ON CACHE INTERNAL "")
set(GGMORSE_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ggmorse/include/" CACHE INTERNAL "")
set(GGMORSE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ggmorse/lib/static/libggmorse.a" CACHE INTERNAL "")
set(FLAC_FOUND ON CACHE INTERNAL "")
set(FLAC_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/flac/include/" CACHE INTERNAL "")
set(FLAC_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/flac/lib/libFLAC.so" CACHE INTERNAL "")
set(LIBUSB_FOUND ON CACHE INTERNAL "") set(LIBUSB_FOUND ON CACHE INTERNAL "")
set(LIBUSB_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/include/" CACHE INTERNAL "") set(LIBUSB_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/include/" CACHE INTERNAL "")
set(LIBUSB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libusb1.0.so" CACHE INTERNAL "") set(LIBUSB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libusb1.0.so" CACHE INTERNAL "")
@ -516,6 +495,11 @@ elseif(ANDROID)
if (ENABLE_QT6) if (ENABLE_QT6)
set(ANDROID_EXTRA_LIBS set(ANDROID_EXTRA_LIBS
${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6Charts_arm64-v8a.so
${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6Concurrent_arm64-v8a.so
${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6MultimediaWidgets_arm64-v8a.so
${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6SerialPort_arm64-v8a.so
${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6TextToSpeech_arm64-v8a.so
${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libssl_1_1.so ${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libssl_1_1.so
${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libcrypto_1_1.so ${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libcrypto_1_1.so
${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavcodec.so ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavcodec.so
@ -530,7 +514,6 @@ elseif(ANDROID)
${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/dsdcc/lib/libdsdcc.so ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/dsdcc/lib/libdsdcc.so
${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libunrooted_android.so ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libunrooted_android.so
${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libusb1.0.so ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libusb1.0.so
${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/flac/lib/libFLAC.so
CACHE INTERNAL "" CACHE INTERNAL ""
) )
else() else()
@ -581,7 +564,6 @@ elseif(ANDROID)
${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/dsdcc/lib/libdsdcc.so ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/dsdcc/lib/libdsdcc.so
${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/libusb/lib/libunrooted_android.so ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/libusb/lib/libunrooted_android.so
${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/libusb/lib/libusb1.0.so ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/libusb/lib/libusb1.0.so
${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/flac/lib/libFLAC.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavcodec.so ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavcodec.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavdevice.so ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavdevice.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavfilter.so ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavfilter.so
@ -594,11 +576,9 @@ elseif(ANDROID)
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/dsdcc/lib/libdsdcc.so ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/dsdcc/lib/libdsdcc.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/libusb/lib/libunrooted_android.so ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/libusb/lib/libunrooted_android.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/libusb/lib/libusb1.0.so ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/libusb/lib/libusb1.0.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/flac/lib/libFLAC.so
CACHE INTERNAL "" CACHE INTERNAL ""
) )
endif() endif()
add_compile_definitions(ANDROID)
endif() endif()
# When building a bundle on MacOS, we want to keep build paths in the library # When building a bundle on MacOS, we want to keep build paths in the library
@ -657,7 +637,8 @@ if(ENABLE_QT6)
MultimediaWidgets MultimediaWidgets
Positioning Positioning
Charts Charts
SerialPort) SerialPort
Core5Compat)
else() else()
find_package(Qt5 5.15 find_package(Qt5 5.15
REQUIRED COMPONENTS REQUIRED COMPONENTS
@ -678,15 +659,13 @@ if (BUILD_GUI)
if (ENABLE_QT6) if (ENABLE_QT6)
find_package(Qt6 find_package(Qt6
REQUIRED COMPONENTS REQUIRED COMPONENTS
Location
OpenGL OpenGL
OpenGLWidgets OpenGLWidgets
Quick Quick
QuickWidgets QuickWidgets
TextToSpeech TextToSpeech
Svg Svg
SvgWidgets SvgWidgets)
StateMachine)
else() else()
find_package(Qt5 find_package(Qt5
REQUIRED COMPONENTS REQUIRED COMPONENTS
@ -711,7 +690,6 @@ if (BUILD_GUI)
QuickWidgets QuickWidgets
Svg Svg
SvgWidgets SvgWidgets
StateMachine
OPTIONAL_COMPONENTS OPTIONAL_COMPONENTS
WebEngineQuick WebEngineQuick
WebEngineCore WebEngineCore
@ -736,27 +714,8 @@ if (BUILD_GUI)
endif() endif()
endif() endif()
# List of static plugins to link with - This is appended to by each pluging CMakeLists.txt
set_property(GLOBAL PROPERTY STATIC_PLUGINS_PROPERTY "")
if(Qt${QT_DEFAULT_MAJOR_VERSION}Positioning_FOUND)
add_compile_definitions(QT_POSITIONING_FOUND)
endif()
if(Qt${QT_DEFAULT_MAJOR_VERSION}Location_FOUND)
add_compile_definitions(QT_LOCATION_FOUND)
endif()
if(Qt${QT_DEFAULT_MAJOR_VERSION}Charts_FOUND)
add_compile_definitions(QT_CHARTS_FOUND)
endif()
if(Qt${QT_DEFAULT_MAJOR_VERSION}TextToSpeech_FOUND)
add_compile_definitions(QT_TEXTTOSPEECH_FOUND)
endif()
if(BUILD_SHARED_LIBS)
add_compile_definitions(BUILD_SHARED_LIBS)
endif()
# other requirements # other requirements
if(NOT ANDROID AND NOT EMSCRIPTEN) if(NOT ANDROID)
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
endif() endif()
@ -907,9 +866,7 @@ if (FFTW3F_FOUND)
set(WDSP_SUPPORT ON CACHE INTERNAL "") set(WDSP_SUPPORT ON CACHE INTERNAL "")
endif() endif()
if (BUILD_BENCH)
add_subdirectory(sdrbench) add_subdirectory(sdrbench)
endif()
if (BUILD_GUI) if (BUILD_GUI)
add_subdirectory(sdrgui) add_subdirectory(sdrgui)
@ -980,7 +937,6 @@ else()
endif() endif()
############ build sdrangel benchmark ################ ############ build sdrangel benchmark ################
if (BUILD_BENCH)
set(sdrangelbench_SOURCES set(sdrangelbench_SOURCES
appbench/main.cpp appbench/main.cpp
) )
@ -994,7 +950,6 @@ target_link_libraries(sdrangelbench
sdrbench sdrbench
logging logging
) )
endif()
############ build sdrangel gui ################ ############ build sdrangel gui ################
if (BUILD_GUI) if (BUILD_GUI)
@ -1088,9 +1043,7 @@ if (BUILD_SERVER)
endif() endif()
############ install ################## ############ install ##################
if (BUILD_BENCH)
install(TARGETS sdrangelbench DESTINATION ${INSTALL_BIN_DIR}) install(TARGETS sdrangelbench DESTINATION ${INSTALL_BIN_DIR})
endif()
if (BUILD_GUI) if (BUILD_GUI)
install(TARGETS ${CMAKE_PROJECT_NAME} DESTINATION ${INSTALL_BIN_DIR}) install(TARGETS ${CMAKE_PROJECT_NAME} DESTINATION ${INSTALL_BIN_DIR})
endif() endif()

View File

@ -80,15 +80,6 @@
"cacheVariables": { "cacheVariables": {
"ENABLE_QT6": "ON" "ENABLE_QT6": "ON"
} }
},
{
"name": "default-qt6-windows",
"inherits": "default-windows",
"binaryDir": "${sourceDir}/build-qt6",
"cacheVariables": {
"ENABLE_QT6": "ON",
"CMAKE_PREFIX_PATH": "C:/Qt/6.7.3/msvc2022_64;C:/Applications/boost_1_81_0"
}
} }
], ],
"buildPresets": [ "buildPresets": [
@ -103,10 +94,6 @@
{ {
"name": "default-qt6", "name": "default-qt6",
"configurePreset": "default-qt6" "configurePreset": "default-qt6"
},
{
"name": "default-qt6-windows",
"configurePreset": "default-qt6-windows"
} }
] ]
} }

View File

@ -22,6 +22,7 @@
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include <QApplication> #include <QApplication>
#include <QTextCodec>
#include <QProxyStyle> #include <QProxyStyle>
#include <QStyleFactory> #include <QStyleFactory>
#include <QFontDatabase> #include <QFontDatabase>
@ -47,6 +48,10 @@
static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *logger) static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *logger)
{ {
/*
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
*/
QCoreApplication::setOrganizationName(COMPANY); QCoreApplication::setOrganizationName(COMPANY);
QCoreApplication::setApplicationName(APPLICATION_NAME); QCoreApplication::setApplicationName(APPLICATION_NAME);
QCoreApplication::setApplicationVersion(SDRANGEL_VERSION); QCoreApplication::setApplicationVersion(SDRANGEL_VERSION);
@ -188,9 +193,7 @@ static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *lo
logger = nullptr; logger = nullptr;
} }
MainWindow w(logger, parser); MainWindow w(logger, parser);
w.show();
if (parser.getListDevices()) if (parser.getListDevices())
{ {
@ -199,6 +202,12 @@ static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *lo
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
if (parser.getRemoteTCPSink()) {
RemoteTCPSinkStarter::start(parser);
}
w.show();
return a.exec(); return a.exec();
} }

View File

@ -19,11 +19,7 @@ if(WIN32)
endif() endif()
if(NOT MSVC) if(NOT MSVC)
add_compile_options(-Wall -Wextra -Wvla -ffast-math -fno-finite-math-only -ftree-vectorize) add_compile_options(-Wall -Wextra -Wvla -Woverloaded-virtual -Wno-inconsistent-missing-override -ffast-math -fno-finite-math-only -ftree-vectorize)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Woverloaded-virtual>)
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
add_compile_options(-Wno-inconsistent-missing-override)
endif()
else() else()
# Disable some warnings, so more useful warnings aren't hidden in the noise # Disable some warnings, so more useful warnings aren't hidden in the noise
# 4996 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. # 4996 'fopen': This function or variable may be unsafe. Consider using fopen_s instead.

View File

@ -1,31 +0,0 @@
IF(NOT FLAC_FOUND)
INCLUDE(FindPkgConfig)
PKG_CHECK_MODULES(PC_FLAC flac)
FIND_PATH(
FLAC_INCLUDE_DIR
NAMES FLAC/stream_encoder.h
HINTS ${PC_FLAC_INCLUDE_DIRS}
PATHS /usr/local/include
/usr/include
)
FIND_LIBRARY(
FLAC_LIBRARY
NAMES FLAC
libFLAC
HINTS ${FLAC_DIR}/lib
${PC_FLAC_LIBRARY_DIRS}
PATHS /usr/local/lib
/usr/lib
/usr/lib64
)
message(STATUS "FLAC LIBRARY " ${FLAC_LIBRARY})
message(STATUS "FLAC INCLUDE DIR " ${FLAC_INCLUDE_DIR})
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(FLAC DEFAULT_MSG FLAC_LIBRARY FLAC_INCLUDE_DIR)
MARK_AS_ADVANCED(FLAC_LIBRARY FLAC_INCLUDE_DIR)
ENDIF(NOT FLAC_FOUND)

View File

@ -36,7 +36,7 @@ if(APPLE AND BUNDLE AND BUILD_GUI)
set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/cmake/cpack/sdrangel_icon.icns") set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/cmake/cpack/sdrangel_icon.icns")
set(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/Info.plist") set(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/Info.plist")
set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/cmake/cpack/sdrangel_icon.icns") set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/cmake/cpack/sdrangel_icon.icns")
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}_mac-${CPACK_MACOS_PACKAGE_ARCHITECTURE}_${CMAKE_SYSTEM_PROCESSOR}" CACHE INTERNAL "") set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_MACOS_PACKAGE_ARCHITECTURE}_${CMAKE_SYSTEM_PROCESSOR}" CACHE INTERNAL "")
set(CPACK_PRE_BUILD_SCRIPTS "${PROJECT_BINARY_DIR}/deploy_mac.cmake") set(CPACK_PRE_BUILD_SCRIPTS "${PROJECT_BINARY_DIR}/deploy_mac.cmake")
# copy SoapySDR Modules # copy SoapySDR Modules

View File

@ -8,8 +8,7 @@
# Copy executable that will be run when icon in /Applications is clicked # Copy executable that will be run when icon in /Applications is clicked
message ("Copying default executable to SDRangel.app/Contents/MacOS/SDRangel") message ("Copying default executable to SDRangel.app/Contents/MacOS/SDRangel")
execute_process (COMMAND mkdir ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/SDRangel.app/Contents/MacOS/) execute_process (COMMAND mkdir ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/SDRangel.app/Contents/MacOS/)
execute_process (COMMAND pwd) execute_process (COMMAND cp /opt/build/sdrangel/build/sdrangel ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/SDRangel.app/Contents/MacOS/SDRangel)
execute_process (COMMAND cp sdrangel ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/SDRangel.app/Contents/MacOS/SDRangel)
# Add RPATHS to libraries so macdeployqt can find out and copy all dependencies # Add RPATHS to libraries so macdeployqt can find out and copy all dependencies

127
debian/changelog vendored
View File

@ -1,130 +1,3 @@
sdrangel (7.22.8-1) unstable; urgency=medium
* See Github release
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Wed, 02 Jul 2025 17:00:39 +0200
sdrangel (7.22.7-1) unstable; urgency=medium
* See Github release
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 04 May 2025 17:58:14 +0200
sdrangel (7.22.6-1) unstable; urgency=medium
* See Github release
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 02 Feb 2025 18:08:11 +0100
sdrangel (7.22.5-1) unstable; urgency=medium
* Windows: upload signed releases rather than unsigned releases to Github releases page. PR #2347
* Windows: fixed signed releases. PR #2344
* FT8 Demod: limit upper bandwidth to 5.8 kHz. Fixes #2339
* Stop device while changing channel set. Fixes #2332. PR #2342
* ADSB: Update URL of OpenSkyNetwork Aircraft database. PR #2341
* Don't stop source if being deleted. For #2315. PR #2340
* Send DSPSignalNotification in audio mods for #2336. PR #2340
* Radiosonde: limit precision of floating point numbers sent to SondeHub. PR #2338
* Windows signed releases: use relative path. Increase timeout to 30 minutes. PR #2335
* ADSB: Include adsbdemodsettings.h PR #2334
* Use release signing certificate for Windows installer. PR #2331
* Fix memory leak and race condition relating to DSP*Engines. Part of #2159 PR #2330
* FreeDV: Fix memory allocation/free issues. Part of #2315. PR #2330
* Wav Files: Add support for meta-data. PR #2328
* DemodAnalyzer: Ensure sample rate is set in worker. Fixes #2309. PR #2328
^ SDRplayv3: Mac: link with libsdrplay_api.so.3 rather than libsdrplay_api.so.3.15. PR #2327
* ADS-B: Fix memory use after delete. For #1734 and part of #2315 PR #2326
* Fixed Appveyor Docker image build
* Fix output-artifact-directory and unzip file. PR #2323
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Thu, 05 Dec 2024 01:07:27 +0100
sdrangel (7.22.4-1) unstable; urgency=medium
* Use macos-12 for Mac x86 build. PR #2321
* Workaround for "hdiutil: create failed - Resource busy"
* Pager: Add alpha and numeric columns. Implements #2319. PR #2320
* Added qtwebchannel dependecy to fix missing 3d Map and Sky Map from Windows release. PR #2316
* Removed .deb package build from Appveyor
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Mom, 11 Nov 2024 08:42:03 +0100
sdrangel (7.22.3-1) unstable; urgency=medium
* Add deb dependencies for pipewire. PR #2314
* Added compilation options for WebAssembly. PR #2313
* ADS-B: Use settings keys. PR #2310
* AIS Demod: Remove spacing around messages. PR #2310
* Freuqency Scanner: Add multiplex mode. PR #2310
* Build snap, MAC, Windows and Ubuntu .deb with Github actions. Various PRs
* Server: Use Sink/MIMO signals rather than Source. Part of #2294. PR #2304
* Updated some Python scripts to Python3. PR #2298
* RemoteTCPSink: Does use IQ only setting for RTL0. PR #2301
* Server: wait for set sample source/sink/MIMO to complete before loading the device settings. Fixes #2294
* Fix spectrum peak measurement for SSB spectra. Fixes #2282. PR #2299
* Upgrade C++ standard to c++17
* Fixes for Android . PR #2288
* Add qtshadertools. PR #2287
* Add more Qt modules and set ENABLE_QT6=ON. PR #2287
* Update Qt optional packages for 6.8 , PR #2287
* Use Qt 6.8 for Windows build. PR #2287
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sat, 09 Nov 2024 17:30:44 +0100
sdrangel (7.22.2-1) unstable; urgency=medium
* ChirpChat: increased preamble symbols limit from 20 to 32. Fixes #2284
* RTLSDR: Apply driver settings in RTLSDRThread Add sync read for WebAssembly. PR #2281
* SSB demod: fixed GUI and returned to previous threading model. Fixes #2273
* HeatMap: Catch memory allocation failures... For #2083 PR #2277
* Add default-qt6-windows cmake config. PR #2276
* Add pager notifications. Add option to ignore duplicates. Support plotting pager messages on the map. PR #2276
* Don't load defaults if loading a preset. PR #2274
* DeviceGUI::closeEvent - Don't automatically delete the GUI,.. PR #2274
* MainWindow: Add FSMs to avoid blocking on the GUI thread... PR #2274
* Fix replay buffer when FixReal is qint16. PR #2270
* snap: Try to get version number from latest tag. PR #2270
* Add libflac to snap. Set ARCH_OPT to nehalem. PR #2270
* Fix flac on Mac. PR #2270
* RemoteTCP: Update docs. PR #2270
* Map: Fix Kiwi list. Add SDRangel wss support. PR #2270
* RemoteTCPSink: Report server init errors via GUI. Send protocol to public list. PR #2270
* RemoteTCPInput: Add wss protocol support. PR #2270
* Fix DeviceAPI::deserialize. Fixes #2266. PR #2267
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 20 Oct 2024 08:26:38 +0200
sdrangel (7.22.1-1) unstable; urgency=medium
* wdsprx: Fix path to help file.
* Removed SyncMessenger from DSPDeviceSourceEngine. Part of #2159
* Fixed threading model for DSPDeviceSourceEngine. Part of #2159
* Removed SyncMessenger from DSPDeviceMIMOEngine. Part of #2159
* RTLSDR: make sure start and stop are effective once only. PArt of #2159
* Fixed threading model for DSPDeviceMIMOEngine plus other fixes. Part of #2159
* Removed SyncMessenger from DSPDeviceSinkEngine. Part of #2159
* SSBMod, AMMod, NFMMod: revised thread processing
* Fixed threading model for DSPDeviceSinkEngine plus other fixes. Part of #2159
* DeviceSet and DeviceUISet: use delete channel API instead of destroy method...
* BladeRF2Output: removed applySettings from stop method
* All device plugins: make sure start and stop are effective once only. PArt of #2159
* Removed the destroy method from ChannelGUI interface
* DeviceGUI: removed destroy method. Part of #2159
* Fix SopaySDR library search when system cmake package present. PR #2245
* Append prefix to plugin name when running on Android. PR #2245
* Fix compilation with newer ffmpeg libavutil. PR #2245
* Fix compilation for Android with Qt6. PR #2245
* Bump Cmake minimal version to 3.17
* Use new find_package(CUDA Toolkit). PR #2250
* Update CMakeLists.txt to allow static libraries to be built, as well as shared... PR #2252
* Allow plugins to be compiled as static libs, part 2. PR #2254
* Use opencv4 with VS2022. PR #2257
* Frequency Scanner: initialize pointer to FrequencyScanner. Fixes #2262
* Update channel list upon Morse Decoder and Demod Analyzer GUI creation. Fixes #2263
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 06 Oct 2024 08:39:11 +0200
sdrangel (7.22.0-1) unstable; urgency=medium sdrangel (7.22.0-1) unstable; urgency=medium
* New Rx channel based on WDSP. Issue #2156 * New Rx channel based on WDSP. Issue #2156

8
debian/control vendored
View File

@ -42,12 +42,9 @@ Build-Depends: debhelper (>= 9),
libopencv-imgcodecs-dev, libopencv-imgcodecs-dev,
libxml2-dev, libxml2-dev,
bison, bison,
cmake,
flex, flex,
ffmpeg, ffmpeg,
ninja-build,
libfaad-dev, libfaad-dev,
libflac-dev,
libavcodec-dev, libavcodec-dev,
libavformat-dev, libavformat-dev,
libopus-dev, libopus-dev,
@ -65,13 +62,12 @@ Architecture: any
Depends: ${shlibs:Depends}, Depends: ${shlibs:Depends},
${misc:Depends}, ${misc:Depends},
libasound2, libasound2,
libgl1, libgl1-mesa-glx,
libglx-mesa0,
libqt5multimedia5-plugins, libqt5multimedia5-plugins,
libqt5gamepad5, libqt5gamepad5,
libqt5svg5, libqt5svg5,
qtspeech5-speechd-plugin, qtspeech5-speechd-plugin,
pulseaudio | pipewire-pulse, pulseaudio,
ffmpeg, ffmpeg,
gstreamer1.0-libav, gstreamer1.0-libav,
qml-module-qtlocation, qml-module-qtlocation,

View File

@ -40,6 +40,4 @@ if(ENABLE_USRP AND UHD_FOUND)
add_subdirectory(usrp) add_subdirectory(usrp)
endif() endif()
if(ENABLE_METIS) add_subdirectory(metis)
add_subdirectory(metis)
endif()

View File

@ -27,14 +27,9 @@ set_target_properties(soapysdrdevice
target_link_libraries(soapysdrdevice target_link_libraries(soapysdrdevice
${SOAPYSDR_LINK_LIBRARIES} ${SOAPYSDR_LINK_LIBRARIES}
${SOAPYSDR_LIBRARIES}
sdrbase sdrbase
) )
target_link_directories(soapysdrdevice PRIVATE
${SOAPYSDR_LIBRARY_DIRS}
)
if(SOAPYSDR_EXTERNAL AND NOT LINUX) if(SOAPYSDR_EXTERNAL AND NOT LINUX)
add_dependencies(soapysdrdevice soapysdr) add_dependencies(soapysdrdevice soapysdr)
endif() endif()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 640 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 844 KiB

After

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 819 KiB

After

Width:  |  Height:  |  Size: 570 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 372 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 603 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 859 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 547 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 426 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 473 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 745 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

View File

@ -11,9 +11,9 @@
set(CODEC2_TAG "v1.0.3") set(CODEC2_TAG "v1.0.3")
set(CM256CC_TAG c0e92b92aca3d1d36c990b642b937c64d363c559) set(CM256CC_TAG c0e92b92aca3d1d36c990b642b937c64d363c559)
set(MBELIB_TAG fe83b32c6a60cdd7bce8cecf3c7a0b9ec87a7667) set(MBELIB_TAG fe83b32c6a60cdd7bce8cecf3c7a0b9ec87a7667)
set(SERIALDV_TAG "v1.1.5") set(SERIALDV_TAG "v1.1.4")
set(DSDCC_TAG "v1.9.5") set(DSDCC_TAG "v1.9.5")
set(LIMESUITE_TAG b39cb61ed03d74c35a2de757d495e901acbb6404) set(LIMESUITE_TAG 70e3859a55d8d5353963a5318013c8454594769f)
set(BLADERF_TAG "2021.02") set(BLADERF_TAG "2021.02")
set(LIBIIO_TAG 826563e41b5ce9890b75506f672017de8d76d52d) set(LIBIIO_TAG 826563e41b5ce9890b75506f672017de8d76d52d)
set(AIRSPYHF_TAG "1af81c0ca18944b8c9897c3c98dc0a991815b686") set(AIRSPYHF_TAG "1af81c0ca18944b8c9897c3c98dc0a991815b686")
@ -29,11 +29,17 @@ set(SOAPYSDR_SDRPLAY_TAG "soapy-sdrplay-0.2.0")
set(SOAPYSDR_AUDIO_TAG "soapy-audio-0.1.1") set(SOAPYSDR_AUDIO_TAG "soapy-audio-0.1.1")
set(SOAPYSDR_REMOTE_TAG "soapy-remote-0.5.1") set(SOAPYSDR_REMOTE_TAG "soapy-remote-0.5.1")
set(AIRSPY_TAG "37c768ce9997b32e7328eb48972a7fda0a1f8554") set(AIRSPY_TAG "37c768ce9997b32e7328eb48972a7fda0a1f8554")
set(HACKRF_TAG "v2024.02.1") set(HACKRF_TAG "v2022.09.1")
set(LIBXML2_TAG "v2.10.4") set(LIBXML2_TAG "v2.10.4")
set(UHD_TAG "v4.7.0.0") set(UHD_TAG "v4.6.0.0")
set(BOOST_TAG "1.86.0") if (APPLE AND (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL x86_64))
set(BOOST_TAG2 "1_86_0") # UHD fails to load with 1.80+
set(BOOST_TAG "1.78.0")
set(BOOST_TAG2 "1_78_0")
else()
set(BOOST_TAG "1.83.0")
set(BOOST_TAG2 "1_83_0")
endif()
# For some external project macros # For some external project macros
include(ExternalProject) include(ExternalProject)
@ -54,7 +60,6 @@ if (WIN32)
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG=${SDRANGEL_BINARY_LIB_DIR} -DCMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG=${SDRANGEL_BINARY_LIB_DIR}
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE=${SDRANGEL_BINARY_LIB_DIR} -DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE=${SDRANGEL_BINARY_LIB_DIR}
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO=${SDRANGEL_BINARY_LIB_DIR} -DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO=${SDRANGEL_BINARY_LIB_DIR}
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
) )
elseif (LINUX) elseif (LINUX)
set(COMMON_CMAKE_ARGS set(COMMON_CMAKE_ARGS
@ -421,7 +426,6 @@ if (NOT FFMPEG_FOUND AND NOT USE_PRECOMPILED_LIBS)
if (NOT X265_FOUND OR X265_EXTERNAL) if (NOT X265_FOUND OR X265_EXTERNAL)
ExternalProject_Add(x265 ExternalProject_Add(x265
GIT_REPOSITORY https://bitbucket.org/multicoreware/x265_git.git GIT_REPOSITORY https://bitbucket.org/multicoreware/x265_git.git
GIT_TAG 4.1
PREFIX "${EXTERNAL_BUILD_LIBRARIES}/x265" PREFIX "${EXTERNAL_BUILD_LIBRARIES}/x265"
SOURCE_SUBDIR "source" SOURCE_SUBDIR "source"
CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
@ -542,7 +546,7 @@ endif (NOT FFMPEG_FOUND AND NOT USE_PRECOMPILED_LIBS)
if (NOT OpenCV_FOUND AND NOT USE_PRECOMPILED_LIBS AND ENABLE_CHANNELTX_MODATV) if (NOT OpenCV_FOUND AND NOT USE_PRECOMPILED_LIBS AND ENABLE_CHANNELTX_MODATV)
ExternalProject_Add(opencv ExternalProject_Add(opencv
GIT_REPOSITORY https://github.com/opencv/opencv.git GIT_REPOSITORY https://github.com/opencv/opencv.git
GIT_TAG 4.10.0 GIT_TAG 4.5.5
DEPENDS "${FFMPEG_DEPENDS}" DEPENDS "${FFMPEG_DEPENDS}"
PREFIX "${EXTERNAL_BUILD_LIBRARIES}/opencv" PREFIX "${EXTERNAL_BUILD_LIBRARIES}/opencv"
CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DWITH_FFMPEG=ON -DCMAKE_PREFIX_PATH=${FFMPEG_INSTALL_DIR} CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DWITH_FFMPEG=ON -DCMAKE_PREFIX_PATH=${FFMPEG_INSTALL_DIR}
@ -847,38 +851,6 @@ if(ENABLE_FEATURE_SATELLITETRACKER OR ENABLE_CHANNELRX_DEMODAPT)
endif () endif ()
endif () endif ()
if(ENABLE_CHANNELRX_REMOTETCPSINK)
if (WIN32)
set(FLAC_LIBRARIES "${SDRANGEL_BINARY_LIB_DIR}/FLAC.lib" CACHE INTERNAL "")
elseif (LINUX)
set(FLAC_LIBRARIES "${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac-build/src/libFLAC/libFLAC${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
elseif (APPLE)
set(FLAC_LIBRARIES "${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac-build/src/libFLAC/libFLAC${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
elseif (EMSCRIPTEN)
set(FLAC_LIBRARIES "${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac-build/src/libFLAC/libFLAC.a" CACHE INTERNAL "")
endif()
ExternalProject_Add(flac
GIT_REPOSITORY https://github.com/xiph/flac.git
PREFIX "${EXTERNAL_BUILD_LIBRARIES}/flac"
CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DINSTALL_MANPAGES=OFF -DBUILD_SHARED_LIBS=ON -DWITH_FORTIFY_SOURCE=OFF -DWITH_STACK_PROTECTOR=PFF -DBUILD_PROGRAMS=OFF -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF -DWITH_OGG=OFF -DBUILD_DOCS=OFF
BUILD_BYPRODUCTS "${FLAC_LIBRARIES}"
INSTALL_COMMAND ""
TEST_COMMAND ""
)
ExternalProject_Get_Property(flac source_dir binary_dir)
set_global(FLAC_DEPENDS flac)
set_global_cache(FLAC_FOUND ON)
set(FLAC_EXTERNAL ON CACHE INTERNAL "")
set(FLAC_INCLUDE_DIR "${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac/include" CACHE INTERNAL "")
if (WIN32)
install(FILES "${SDRANGEL_BINARY_BIN_DIR}/FLAC${CMAKE_SHARED_LIBRARY_SUFFIX}" DESTINATION "${INSTALL_LIB_DIR}")
elseif (APPLE)
install(DIRECTORY "${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac-build/src/libFLAC" DESTINATION "${INSTALL_LIB_DIR}"
FILES_MATCHING PATTERN "libFLAC*${CMAKE_SHARED_LIBRARY_SUFFIX}")
set(MACOS_EXTERNAL_LIBS_FIXUP "${MACOS_EXTERNAL_LIBS_FIXUP};${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac-build/src/libFLAC")
endif ()
endif ()
# For Morse Decoder feature # For Morse Decoder feature
if(ENABLE_FEATURE_MORSEDECODER) if(ENABLE_FEATURE_MORSEDECODER)
if (WIN32) if (WIN32)
@ -1574,8 +1546,6 @@ if (WIN32 OR APPLE)
-DLIBUSB_LIBRARIES=${LIBUSB_LIBRARIES} -DLIBUSB_LIBRARIES=${LIBUSB_LIBRARIES}
-DLIBUSB_INCLUDE_DIR=${LIBUSB_INCLUDE_DIR} -DLIBUSB_INCLUDE_DIR=${LIBUSB_INCLUDE_DIR}
${UHD_PYTHON_ARGS} ${UHD_PYTHON_ARGS}
-DPython3_FIND_FRAMEWORK=NEVER
-DENABLE_PYTHON_API=OFF
-DCMAKE_INSTALL_NAME_DIR=<INSTALL_DIR>/lib -DCMAKE_INSTALL_NAME_DIR=<INSTALL_DIR>/lib
TEST_COMMAND "" TEST_COMMAND ""
) )

2
external/windows vendored

@ -1 +1 @@
Subproject commit eddef8183524e5aaef978088427d4b22a5afb393 Subproject commit c55d3980808da97306e2b4feac452323854a39e4

View File

@ -39,14 +39,10 @@ include_directories(
${CMAKE_SOURCE_DIR}/sdrbase ${CMAKE_SOURCE_DIR}/sdrbase
) )
add_library(ft8 add_library(ft8 SHARED
${ft8_SOURCES} ${ft8_SOURCES}
) )
if(DEFINED FFTW3F_DEPENDS)
add_dependencies(ft8 "${FFTW3F_DEPENDS}")
endif()
target_link_libraries(ft8 target_link_libraries(ft8
Boost::disable_autolinking Boost::disable_autolinking
${FFTW3F_LIBRARIES} ${FFTW3F_LIBRARIES}

View File

@ -85,9 +85,8 @@ struct FT8_API cdecode
// total transmission time is 12.64 seconds // total transmission time is 12.64 seconds
// tunable parameters // tunable parameters
class FT8_API FT8Params struct FT8_API FT8Params
{ {
public:
int nthreads; // number of parallel threads, for multi-core int nthreads; // number of parallel threads, for multi-core
int npasses_one; // number of spectral subtraction passes int npasses_one; // number of spectral subtraction passes
int npasses_two; // number of spectral subtraction passes int npasses_two; // number of spectral subtraction passes

View File

@ -82,7 +82,7 @@ std::string Packing::unpackcall(int x)
if (x <= 1002) if (x <= 1002)
{ {
snprintf(tmp, sizeof(tmp), "CQ %d", x - 3); sprintf(tmp, "CQ %d", x - 3);
return std::string(tmp); return std::string(tmp);
} }
@ -96,7 +96,7 @@ std::string Packing::unpackcall(int x)
int ci3 = x / 27; int ci3 = x / 27;
x %= 27; x %= 27;
int ci4 = x; int ci4 = x;
snprintf(tmp, sizeof(tmp), "CQ %c%c%c%c", c4[ci1], c4[ci2], c4[ci3], c4[ci4]); sprintf(tmp, "CQ %c%c%c%c", c4[ci1], c4[ci2], c4[ci3], c4[ci4]);
return std::string(tmp); return std::string(tmp);
} }
@ -193,9 +193,9 @@ std::string Packing::unpackgrid15(int ng, int ir)
char tmp[16]; char tmp[16];
if (db >= 0) { if (db >= 0) {
snprintf(tmp, sizeof(tmp), "%s+%02d", ir ? "R" : "", db); sprintf(tmp, "%s+%02d", ir ? "R" : "", db);
} else { } else {
snprintf(tmp, sizeof(tmp), "%s-%02d", ir ? "R" : "", 0 - db); sprintf(tmp, "%s-%02d", ir ? "R" : "", 0 - db);
} }
return std::string(tmp); return std::string(tmp);
@ -396,7 +396,7 @@ std::string Packing::unpack_5(int a77[], std::string& call1str, std::string& cal
i += 3; i += 3;
int qsonb = un64(a77, i, 11); int qsonb = un64(a77, i, 11);
char report[16]; char report[16];
snprintf(report, sizeof(report), "%d%04d", rst, qsonb); sprintf(report, "%d%04d", rst, qsonb);
i += 11; i += 11;
// g25 // g25
int ng = un64(a77, i, 25); int ng = un64(a77, i, 25);
@ -467,9 +467,9 @@ std::string Packing::unpack_0_1(int a77[], std::string& call1str, std::string& c
char tmp[32]; char tmp[32];
if (r >= 0) { if (r >= 0) {
snprintf(tmp, sizeof(tmp), "+%02d", r); sprintf(tmp, "+%02d", r);
} else { } else {
snprintf(tmp, sizeof(tmp), "-%02d", -r); sprintf(tmp, "-%02d", -r);
} }
locstr = std::string(tmp); locstr = std::string(tmp);
@ -553,7 +553,7 @@ std::string Packing::unpack_3(int a77[], std::string& call1str, std::string& cal
else else
{ {
char tmp[32]; char tmp[32];
snprintf(tmp, sizeof(tmp), "%04d", serial); sprintf(tmp, "%04d", serial);
serialstr = std::string(tmp); serialstr = std::string(tmp);
} }
@ -571,7 +571,7 @@ std::string Packing::unpack_3(int a77[], std::string& call1str, std::string& cal
} }
{ {
char tmp[16]; char tmp[16];
snprintf(tmp, sizeof(tmp), "%d ", rst); sprintf(tmp, "%d ", rst);
msg += std::string(tmp); msg += std::string(tmp);
} }
@ -634,7 +634,7 @@ std::string Packing::unpack_0_3(int a77[], int n3, std::string& call1str, std::s
{ {
char tmp[16]; char tmp[16];
snprintf(tmp, sizeof(tmp), "%d%c ", n_transmitters + 1, clss + 'A'); sprintf(tmp, "%d%c ", n_transmitters + 1, clss + 'A');
msg += std::string(tmp); msg += std::string(tmp);
} }
@ -658,9 +658,9 @@ std::string Packing::unpack(int a77[], std::string& call1, std::string& call2, s
char tmp[64]; char tmp[64];
if (i3 == 0) { if (i3 == 0) {
snprintf(tmp, sizeof(tmp), "%d.%d", i3, n3); sprintf(tmp, "%d.%d", i3, n3);
} else { } else {
snprintf(tmp, sizeof(tmp), "%d", i3); sprintf(tmp, "%d", i3);
} }
type = std::string(tmp); type = std::string(tmp);
@ -714,7 +714,7 @@ std::string Packing::unpack(int a77[], std::string& call1, std::string& call2, s
} }
call1 = "UNK"; call1 = "UNK";
snprintf(tmp, sizeof(tmp), "UNK i3=%d n3=%d", i3, n3); sprintf(tmp, "UNK i3=%d n3=%d", i3, n3);
return std::string(tmp); return std::string(tmp);
} }

View File

@ -4,6 +4,6 @@ PLUGINS=$(git diff --name-only ${1}..${2} | grep plugins/ | cut -d'/' -f2,3 | so
for plugin in $PLUGINS for plugin in $PLUGINS
do do
FILE=$(find $BASEDIR/plugins/$plugin -name "*plugin.cpp") FILE=$(find $BASEDIR/plugins/$plugin -name "*plugin.cpp")
echo $FILE sed -i -E "s/QStringLiteral\(\"7\.(.*)\"\)/QStringLiteral\(\"7\.22\.0\"\)/" $FILE
sed -i -E "s/QStringLiteral\(\"7\.(.*)\"\)/QStringLiteral\(\"7\.22\.7\"\)/" $FILE
done done

View File

@ -35,7 +35,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/exports ${CMAKE_SOURCE_DIR}/exports
) )
add_library(httpserver add_library(httpserver SHARED
${httpserver_SOURCES} ${httpserver_SOURCES}
) )

View File

@ -94,7 +94,7 @@ void HttpConnectionHandlerPool::cleanup()
if (++idleCounter > maxIdleHandlers) if (++idleCounter > maxIdleHandlers)
{ {
pool.removeOne(handler); pool.removeOne(handler);
qDebug("HttpConnectionHandlerPool: Removed connection handler (%p), pool size is now %i",handler,(int)pool.size()); qDebug("HttpConnectionHandlerPool: Removed connection handler (%p), pool size is now %i",handler,pool.size());
delete handler; delete handler;
break; // remove only one handler in each interval break; // remove only one handler in each interval
} }

View File

@ -35,7 +35,7 @@ StaticFileController::StaticFileController(QSettings* settings, QObject* parent)
maxCachedFileSize=settings->value("maxCachedFileSize","65536").toInt(); maxCachedFileSize=settings->value("maxCachedFileSize","65536").toInt();
cache.setMaxCost(settings->value("cacheSize","1000000").toInt()); cache.setMaxCost(settings->value("cacheSize","1000000").toInt());
cacheTimeout=settings->value("cacheTime","60000").toInt(); cacheTimeout=settings->value("cacheTime","60000").toInt();
qDebug("StaticFileController: cache timeout=%i, size=%i",cacheTimeout,(int)cache.maxCost()); qDebug("StaticFileController: cache timeout=%i, size=%i",cacheTimeout,cache.maxCost());
} }
StaticFileController::StaticFileController(const HttpDocrootSettings& settings, QObject* parent) StaticFileController::StaticFileController(const HttpDocrootSettings& settings, QObject* parent)
@ -56,7 +56,7 @@ StaticFileController::StaticFileController(const HttpDocrootSettings& settings,
maxCachedFileSize=settings.maxCachedFileSize; maxCachedFileSize=settings.maxCachedFileSize;
cache.setMaxCost(settings.cacheSize); cache.setMaxCost(settings.cacheSize);
cacheTimeout=settings.cacheTime; cacheTimeout=settings.cacheTime;
qDebug("StaticFileController: cache timeout=%i, size=%i",cacheTimeout,(int)cache.maxCost()); qDebug("StaticFileController: cache timeout=%i, size=%i",cacheTimeout,cache.maxCost());
} }
void StaticFileController::service(HttpRequest& request, HttpResponse& response) void StaticFileController::service(HttpRequest& request, HttpResponse& response)

View File

@ -21,7 +21,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/exports ${CMAKE_SOURCE_DIR}/exports
) )
add_library(logging add_library(logging SHARED
${logging_SOURCES} ${logging_SOURCES}
) )

View File

@ -47,7 +47,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/exports ${CMAKE_SOURCE_DIR}/exports
) )
add_library(modemm17 add_library(modemm17 SHARED
${modemm17_SOURCES} ${modemm17_SOURCES}
) )

View File

@ -239,7 +239,7 @@ constexpr T to_int(uint8_t v)
{ {
constexpr auto MAX_LOCAL_INPUT = (1 << (n - 1)); constexpr auto MAX_LOCAL_INPUT = (1 << (n - 1));
constexpr auto NEGATIVE_OFFSET = std::numeric_limits<typename std::make_unsigned<T>::type>::max() - (MAX_LOCAL_INPUT - 1); constexpr auto NEGATIVE_OFFSET = std::numeric_limits<typename std::make_unsigned<T>::type>::max() - (MAX_LOCAL_INPUT - 1);
T r = v & (1 << (n - 1)) ? (T)NEGATIVE_OFFSET : 0; T r = v & (1 << (n - 1)) ? NEGATIVE_OFFSET : 0;
return r + (v & (MAX_LOCAL_INPUT - 1)); return r + (v & (MAX_LOCAL_INPUT - 1));
} }

View File

@ -17,18 +17,10 @@ if (NOT SERVER_MODE)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINS_DIR}") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINS_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINS_DIR}") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINS_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINS_DIR}") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINS_DIR}")
if(WIN32 AND Qt6_FOUND) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINS_DIR}")
# https://bugreports.qt.io/browse/QTBUG-124589 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINS_RUNTIME_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINS_RUNTIME_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINS_RUNTIME_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINS_RUNTIME_DIR}")
else()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINS_DIR}")
endif()
else() else()
if(WIN32) if(WIN32)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BUILD_PLUGINSSRV_RUNTIME_DIR}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BUILD_PLUGINSSRV_RUNTIME_DIR}")
@ -40,17 +32,10 @@ else()
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINSSRV_DIR}") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINSSRV_DIR}") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINSSRV_DIR}") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINSSRV_DIR}")
if(WIN32 AND Qt6_FOUND) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINSSRV_RUNTIME_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINSSRV_RUNTIME_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINSSRV_RUNTIME_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINSSRV_RUNTIME_DIR}")
else()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINSSRV_DIR}")
endif()
endif() endif()
if (ENABLE_CHANNELMIMO) if (ENABLE_CHANNELMIMO)

View File

@ -34,28 +34,22 @@ if (NOT SERVER_MODE)
beamsteeringcwmodgui.h beamsteeringcwmodgui.h
) )
set(TARGET_NAME ${PLUGINS_PREFIX}beamsteeringcwmod) set(TARGET_NAME beamsteeringcwmod)
set(TARGET_LIB "Qt::Widgets") set(TARGET_LIB "Qt::Widgets")
set(TARGET_LIB_GUI "sdrgui") set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else() else()
set(TARGET_NAME ${PLUGINSSRV_PREFIX}beamsteeringcwmodsrv) set(TARGET_NAME beamsteeringcwmodsrv)
set(TARGET_LIB "") set(TARGET_LIB "")
set(TARGET_LIB_GUI "") set(TARGET_LIB_GUI "")
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
endif() endif()
if(NOT Qt6_FOUND) add_library(${TARGET_NAME} SHARED
add_library(${TARGET_NAME} ${beamsteeringcwmod_SOURCES}) ${beamsteeringcwmod_SOURCES}
else() )
qt_add_plugin(${TARGET_NAME} CLASS_NAME BeamSteeringCWModPlugin ${beamsteeringcwmod_SOURCES})
endif()
if(NOT BUILD_SHARED_LIBS) target_link_libraries(${TARGET_NAME}
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core Qt::Core
${TARGET_LIB} ${TARGET_LIB}
sdrbase sdrbase

View File

@ -46,6 +46,7 @@ BeamSteeringCWMod::BeamSteeringCWMod(DeviceAPI *deviceAPI) :
m_thread(nullptr), m_thread(nullptr),
m_basebandSource(nullptr), m_basebandSource(nullptr),
m_running(false), m_running(false),
m_guiMessageQueue(nullptr),
m_frequencyOffset(0), m_frequencyOffset(0),
m_basebandSampleRate(48000) m_basebandSampleRate(48000)
{ {
@ -61,7 +62,7 @@ BeamSteeringCWMod::BeamSteeringCWMod(DeviceAPI *deviceAPI) :
this, this,
&BeamSteeringCWMod::networkManagerFinished &BeamSteeringCWMod::networkManagerFinished
); );
BeamSteeringCWMod::startSources(); startSources();
} }
BeamSteeringCWMod::~BeamSteeringCWMod() BeamSteeringCWMod::~BeamSteeringCWMod()
@ -76,7 +77,7 @@ BeamSteeringCWMod::~BeamSteeringCWMod()
m_deviceAPI->removeChannelSinkAPI(this); m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeMIMOChannel(this); m_deviceAPI->removeMIMOChannel(this);
BeamSteeringCWMod::stopSources(); stopSources();
} }
void BeamSteeringCWMod::setDeviceAPI(DeviceAPI *deviceAPI) void BeamSteeringCWMod::setDeviceAPI(DeviceAPI *deviceAPI)
@ -193,7 +194,7 @@ void BeamSteeringCWMod::applySettings(const BeamSteeringCWModSettings& settings,
QList<ObjectPipe*> pipes; QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (!pipes.empty()) { if (pipes.size() > 0) {
sendChannelSettings(pipes, reverseAPIKeys, settings, force); sendChannelSettings(pipes, reverseAPIKeys, settings, force);
} }
@ -204,7 +205,7 @@ void BeamSteeringCWMod::handleInputMessages()
{ {
Message* message; Message* message;
while ((message = m_inputMessageQueue.pop()) != nullptr) while ((message = m_inputMessageQueue.pop()) != 0)
{ {
if (handleMessage(*message)) if (handleMessage(*message))
{ {
@ -217,14 +218,14 @@ bool BeamSteeringCWMod::handleMessage(const Message& cmd)
{ {
if (MsgConfigureBeamSteeringCWMod::match(cmd)) if (MsgConfigureBeamSteeringCWMod::match(cmd))
{ {
auto& cfg = (const MsgConfigureBeamSteeringCWMod&) cmd; MsgConfigureBeamSteeringCWMod& cfg = (MsgConfigureBeamSteeringCWMod&) cmd;
qDebug() << "BeamSteeringCWMod::handleMessage: MsgConfigureBeamSteeringCWMod"; qDebug() << "BeamSteeringCWMod::handleMessage: MsgConfigureBeamSteeringCWMod";
applySettings(cfg.getSettings(), cfg.getForce()); applySettings(cfg.getSettings(), cfg.getForce());
return true; return true;
} }
else if (DSPMIMOSignalNotification::match(cmd)) else if (DSPMIMOSignalNotification::match(cmd))
{ {
auto& notif = (const DSPMIMOSignalNotification&) cmd; DSPMIMOSignalNotification& notif = (DSPMIMOSignalNotification&) cmd;
qDebug() << "BeamSteeringCWMod::handleMessage: DSPMIMOSignalNotification:" qDebug() << "BeamSteeringCWMod::handleMessage: DSPMIMOSignalNotification:"
<< " basebandSampleRate: " << notif.getSampleRate() << " basebandSampleRate: " << notif.getSampleRate()
@ -300,7 +301,7 @@ void BeamSteeringCWMod::validateFilterChainHash(BeamSteeringCWModSettings& setti
void BeamSteeringCWMod::calculateFrequencyOffset() void BeamSteeringCWMod::calculateFrequencyOffset()
{ {
double shiftFactor = HBFilterChainConverter::getShiftFactor(m_settings.m_log2Interp, m_settings.m_filterChainHash); double shiftFactor = HBFilterChainConverter::getShiftFactor(m_settings.m_log2Interp, m_settings.m_filterChainHash);
m_frequencyOffset = (int64_t) (m_basebandSampleRate * shiftFactor); m_frequencyOffset = m_basebandSampleRate * shiftFactor;
} }
int BeamSteeringCWMod::webapiSettingsGet( int BeamSteeringCWMod::webapiSettingsGet(
@ -379,13 +380,13 @@ void BeamSteeringCWMod::webapiUpdateChannelSettings(
settings.m_reverseAPIAddress = *response.getBeamSteeringCwModSettings()->getReverseApiAddress(); settings.m_reverseAPIAddress = *response.getBeamSteeringCwModSettings()->getReverseApiAddress();
} }
if (channelSettingsKeys.contains("reverseAPIPort")) { if (channelSettingsKeys.contains("reverseAPIPort")) {
settings.m_reverseAPIPort = (uint16_t) response.getBeamSteeringCwModSettings()->getReverseApiPort(); settings.m_reverseAPIPort = response.getBeamSteeringCwModSettings()->getReverseApiPort();
} }
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) { if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getBeamSteeringCwModSettings()->getReverseApiDeviceIndex(); settings.m_reverseAPIDeviceIndex = response.getBeamSteeringCwModSettings()->getReverseApiDeviceIndex();
} }
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) { if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
settings.m_reverseAPIChannelIndex = (uint16_t) response.getBeamSteeringCwModSettings()->getReverseApiChannelIndex(); settings.m_reverseAPIChannelIndex = response.getBeamSteeringCwModSettings()->getReverseApiChannelIndex();
} }
if (settings.m_channelMarker && channelSettingsKeys.contains("channelMarker")) { if (settings.m_channelMarker && channelSettingsKeys.contains("channelMarker")) {
settings.m_channelMarker->updateFrom(channelSettingsKeys, response.getBeamSteeringCwModSettings()->getChannelMarker()); settings.m_channelMarker->updateFrom(channelSettingsKeys, response.getBeamSteeringCwModSettings()->getChannelMarker());
@ -428,7 +429,7 @@ void BeamSteeringCWMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSetti
} }
else else
{ {
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker(); SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker); settings.m_channelMarker->formatTo(swgChannelMarker);
response.getBeamSteeringCwModSettings()->setChannelMarker(swgChannelMarker); response.getBeamSteeringCwModSettings()->setChannelMarker(swgChannelMarker);
} }
@ -442,16 +443,16 @@ void BeamSteeringCWMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSetti
} }
else else
{ {
auto *swgRollupState = new SWGSDRangel::SWGRollupState(); SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState); settings.m_rollupState->formatTo(swgRollupState);
response.getBeamSteeringCwModSettings()->setRollupState(swgRollupState); response.getBeamSteeringCwModSettings()->setRollupState(swgRollupState);
} }
} }
} }
void BeamSteeringCWMod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force) void BeamSteeringCWMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force)
{ {
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings") QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
@ -462,8 +463,8 @@ void BeamSteeringCWMod::webapiReverseSendSettings(const QList<QString>& channelS
m_networkRequest.setUrl(QUrl(channelSettingsURL)); m_networkRequest.setUrl(QUrl(channelSettingsURL));
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
auto *buffer = new QBuffer(); QBuffer *buffer = new QBuffer();
buffer->open(QBuffer::ReadWrite); buffer->open((QBuffer::ReadWrite));
buffer->write(swgChannelSettings->asJson().toUtf8()); buffer->write(swgChannelSettings->asJson().toUtf8());
buffer->seek(0); buffer->seek(0);
@ -476,9 +477,9 @@ void BeamSteeringCWMod::webapiReverseSendSettings(const QList<QString>& channelS
void BeamSteeringCWMod::sendChannelSettings( void BeamSteeringCWMod::sendChannelSettings(
const QList<ObjectPipe*>& pipes, const QList<ObjectPipe*>& pipes,
const QList<QString>& channelSettingsKeys, QList<QString>& channelSettingsKeys,
const BeamSteeringCWModSettings& settings, const BeamSteeringCWModSettings& settings,
bool force) const bool force)
{ {
for (const auto& pipe : pipes) for (const auto& pipe : pipes)
{ {
@ -486,7 +487,7 @@ void BeamSteeringCWMod::sendChannelSettings(
if (messageQueue) if (messageQueue)
{ {
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create( MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create(
this, this,
@ -500,11 +501,11 @@ void BeamSteeringCWMod::sendChannelSettings(
} }
void BeamSteeringCWMod::webapiFormatChannelSettings( void BeamSteeringCWMod::webapiFormatChannelSettings(
const QList<QString>& channelSettingsKeys, QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings, SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const BeamSteeringCWModSettings& settings, const BeamSteeringCWModSettings& settings,
bool force bool force
) const )
{ {
swgChannelSettings->setDirection(2); // MIMO sink swgChannelSettings->setDirection(2); // MIMO sink
swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet()); swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet());
@ -533,20 +534,20 @@ void BeamSteeringCWMod::webapiFormatChannelSettings(
if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force)) if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force))
{ {
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker(); SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker); settings.m_channelMarker->formatTo(swgChannelMarker);
swgBeamSteeringCWSettings->setChannelMarker(swgChannelMarker); swgBeamSteeringCWSettings->setChannelMarker(swgChannelMarker);
} }
if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force)) if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force))
{ {
auto *swgRollupState = new SWGSDRangel::SWGRollupState(); SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState); settings.m_rollupState->formatTo(swgRollupState);
swgBeamSteeringCWSettings->setRollupState(swgRollupState); swgBeamSteeringCWSettings->setRollupState(swgRollupState);
} }
} }
void BeamSteeringCWMod::networkManagerFinished(QNetworkReply *reply) const void BeamSteeringCWMod::networkManagerFinished(QNetworkReply *reply)
{ {
QNetworkReply::NetworkError replyError = reply->error(); QNetworkReply::NetworkError replyError = reply->error();

View File

@ -86,64 +86,67 @@ public:
qint64 m_centerFrequency; qint64 m_centerFrequency;
}; };
explicit BeamSteeringCWMod(DeviceAPI *deviceAPI); BeamSteeringCWMod(DeviceAPI *deviceAPI);
~BeamSteeringCWMod() final; virtual ~BeamSteeringCWMod();
void destroy() final { delete this; } virtual void destroy() { delete this; }
void setDeviceAPI(DeviceAPI *deviceAPI) final; virtual void setDeviceAPI(DeviceAPI *deviceAPI);
DeviceAPI *getDeviceAPI() final { return m_deviceAPI; } virtual DeviceAPI *getDeviceAPI() { return m_deviceAPI; }
void startSinks() final { /* Not used for MIMO */ } virtual void startSinks() {}
void stopSinks() final { /* Not used for MIMO */ } virtual void stopSinks() {}
void startSources( /* Not used for MIMO */ ) final; //!< thread start() virtual void startSources(); //!< thread start()
void stopSources( /* Not used for MIMO */ ) final; //!< thread exit() and wait() virtual void stopSources(); //!< thread exit() and wait()
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex) final; virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex);
void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex) final; virtual void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex);
void pushMessage(Message *msg) final { m_inputMessageQueue.push(msg); } virtual void pushMessage(Message *msg) { m_inputMessageQueue.push(msg); }
QString getMIMOName() final { return objectName(); } virtual QString getMIMOName() { return objectName(); }
void getIdentifier(QString& id) final { id = objectName(); } virtual void getIdentifier(QString& id) { id = objectName(); }
QString getIdentifier() const final { return objectName(); } virtual QString getIdentifier() const { return objectName(); }
void getTitle(QString& title) final { title = "BeamSteeringCWMod"; } virtual void getTitle(QString& title) { title = "BeamSteeringCWMod"; }
qint64 getCenterFrequency() const final { return m_frequencyOffset; } virtual qint64 getCenterFrequency() const { return m_frequencyOffset; }
void setCenterFrequency(qint64) final { /* Not used for MIMO */ } virtual void setCenterFrequency(qint64) {}
uint32_t getBasebandSampleRate() const { return m_basebandSampleRate; } uint32_t getBasebandSampleRate() const { return m_basebandSampleRate; }
QByteArray serialize() const final; virtual QByteArray serialize() const;
bool deserialize(const QByteArray& data) final; virtual bool deserialize(const QByteArray& data);
int getNbSinkStreams() const final { return 0; } virtual int getNbSinkStreams() const { return 0; }
int getNbSourceStreams() const final { return 2; } virtual int getNbSourceStreams() const { return 2; }
int getStreamIndex() const final { return -1; } virtual int getStreamIndex() const { return -1; }
qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const final virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
{ {
(void) streamIndex; (void) streamIndex;
(void) sinkElseSource; (void) sinkElseSource;
return m_frequencyOffset; return m_frequencyOffset;
} }
int webapiSettingsGet( virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
SWGSDRangel::SWGChannelSettings& response, MessageQueue *getMessageQueueToGUI() { return m_guiMessageQueue; }
QString& errorMessage) final;
int webapiSettingsPutPatch( virtual int webapiSettingsGet(
bool force, SWGSDRangel::SWGChannelSettings& response,
const QStringList& channelSettingsKeys, QString& errorMessage);
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final;
int webapiWorkspaceGet( virtual int webapiSettingsPutPatch(
SWGSDRangel::SWGWorkspaceInfo& query, bool force,
QString& errorMessage) final; const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage);
virtual int webapiWorkspaceGet(
SWGSDRangel::SWGWorkspaceInfo& query,
QString& errorMessage);
static void webapiFormatChannelSettings( static void webapiFormatChannelSettings(
SWGSDRangel::SWGChannelSettings& response, SWGSDRangel::SWGChannelSettings& response,
const BeamSteeringCWModSettings& settings); const BeamSteeringCWModSettings& settings);
static void webapiUpdateChannelSettings( static void webapiUpdateChannelSettings(
BeamSteeringCWModSettings& settings, BeamSteeringCWModSettings& settings,
const QStringList& channelSettingsKeys, const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response); SWGSDRangel::SWGChannelSettings& response);
static const char* const m_channelIdURI; static const char* const m_channelIdURI;
static const char* const m_channelId; static const char* const m_channelId;
@ -155,35 +158,39 @@ private:
BeamSteeringCWModBaseband* m_basebandSource; BeamSteeringCWModBaseband* m_basebandSource;
QMutex m_mutex; QMutex m_mutex;
bool m_running; bool m_running;
BasebandSampleSink* m_spectrumSink;
BasebandSampleSink* m_scopeSink;
BeamSteeringCWModSettings m_settings; BeamSteeringCWModSettings m_settings;
MessageQueue *m_guiMessageQueue; //!< Input message queue to the GUI
QNetworkAccessManager *m_networkManager; QNetworkAccessManager *m_networkManager;
QNetworkRequest m_networkRequest; QNetworkRequest m_networkRequest;
int64_t m_frequencyOffset; int64_t m_frequencyOffset;
uint32_t m_basebandSampleRate; uint32_t m_basebandSampleRate;
int m_count0, m_count1;
bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed virtual bool handleMessage(const Message& cmd); //!< Processing of a message. Returns true if message has actually been processed
void applySettings(const BeamSteeringCWModSettings& settings, bool force = false); void applySettings(const BeamSteeringCWModSettings& settings, bool force = false);
static void validateFilterChainHash(BeamSteeringCWModSettings& settings); static void validateFilterChainHash(BeamSteeringCWModSettings& settings);
void calculateFrequencyOffset(); void calculateFrequencyOffset();
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force); void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force);
void sendChannelSettings( void sendChannelSettings(
const QList<ObjectPipe*>& pipes, const QList<ObjectPipe*>& pipes,
const QList<QString>& channelSettingsKeys, QList<QString>& channelSettingsKeys,
const BeamSteeringCWModSettings& settings, const BeamSteeringCWModSettings& settings,
bool force bool force
) const; );
void webapiFormatChannelSettings( void webapiFormatChannelSettings(
const QList<QString>& channelSettingsKeys, QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings, SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const BeamSteeringCWModSettings& settings, const BeamSteeringCWModSettings& settings,
bool force bool force
) const; );
private slots: private slots:
void handleInputMessages(); void handleInputMessages();
void networkManagerFinished(QNetworkReply *reply) const; void networkManagerFinished(QNetworkReply *reply);
}; };
#endif // INCLUDE_BEAMSTEERINGCWSOURCE_H #endif // INCLUDE_BEAMSTEERINGCWSOURCE_H

View File

@ -30,10 +30,15 @@
BeamSteeringCWModGUI* BeamSteeringCWModGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel) BeamSteeringCWModGUI* BeamSteeringCWModGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel)
{ {
auto* gui = new BeamSteeringCWModGUI(pluginAPI, deviceUISet, mimoChannel); BeamSteeringCWModGUI* gui = new BeamSteeringCWModGUI(pluginAPI, deviceUISet, mimoChannel);
return gui; return gui;
} }
void BeamSteeringCWModGUI::destroy()
{
delete this;
}
void BeamSteeringCWModGUI::resetToDefaults() void BeamSteeringCWModGUI::resetToDefaults()
{ {
m_settings.resetToDefaults(); m_settings.resetToDefaults();
@ -62,7 +67,7 @@ bool BeamSteeringCWModGUI::handleMessage(const Message& message)
{ {
if (BeamSteeringCWMod::MsgBasebandNotification::match(message)) if (BeamSteeringCWMod::MsgBasebandNotification::match(message))
{ {
auto& notif = (const BeamSteeringCWMod::MsgBasebandNotification&) message; BeamSteeringCWMod::MsgBasebandNotification& notif = (BeamSteeringCWMod::MsgBasebandNotification&) message;
m_basebandSampleRate = notif.getSampleRate(); m_basebandSampleRate = notif.getSampleRate();
m_centerFrequency = notif.getCenterFrequency(); m_centerFrequency = notif.getCenterFrequency();
displayRateAndShift(); displayRateAndShift();
@ -71,7 +76,7 @@ bool BeamSteeringCWModGUI::handleMessage(const Message& message)
} }
else if (BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod::match(message)) else if (BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod::match(message))
{ {
auto& cfg = (const BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod&) message; const BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod& cfg = (BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod&) message;
m_settings = cfg.getSettings(); m_settings = cfg.getSettings();
blockApplySettings(true); blockApplySettings(true);
m_channelMarker.updateSettings(static_cast<const ChannelMarker*>(m_settings.m_channelMarker)); m_channelMarker.updateSettings(static_cast<const ChannelMarker*>(m_settings.m_channelMarker));
@ -104,7 +109,7 @@ BeamSteeringCWModGUI::BeamSteeringCWModGUI(PluginAPI* pluginAPI, DeviceUISet *de
connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
m_bsCWSource = (BeamSteeringCWMod*) mimoChannel; m_bsCWSource = (BeamSteeringCWMod*) mimoChannel;
m_bsCWSource->setMessageQueueToGUI(BeamSteeringCWModGUI::getInputMessageQueue()); m_bsCWSource->setMessageQueueToGUI(getInputMessageQueue());
m_basebandSampleRate = m_bsCWSource->getBasebandSampleRate(); m_basebandSampleRate = m_bsCWSource->getBasebandSampleRate();
connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
@ -123,7 +128,7 @@ BeamSteeringCWModGUI::BeamSteeringCWModGUI(PluginAPI* pluginAPI, DeviceUISet *de
m_deviceUISet->addChannelMarker(&m_channelMarker); m_deviceUISet->addChannelMarker(&m_channelMarker);
connect(BeamSteeringCWModGUI::getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages())); connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
displaySettings(); displaySettings();
makeUIConnections(); makeUIConnections();
@ -178,13 +183,13 @@ void BeamSteeringCWModGUI::displaySettings()
void BeamSteeringCWModGUI::displayRateAndShift() void BeamSteeringCWModGUI::displayRateAndShift()
{ {
auto shift = (int) (m_shiftFrequencyFactor * m_basebandSampleRate); int shift = m_shiftFrequencyFactor * m_basebandSampleRate;
double channelSampleRate = ((double) m_basebandSampleRate) / (1<<m_settings.m_log2Interp); double channelSampleRate = ((double) m_basebandSampleRate) / (1<<m_settings.m_log2Interp);
QLocale loc; QLocale loc;
ui->offsetFrequencyText->setText(tr("%1 Hz").arg(loc.toString(shift))); ui->offsetFrequencyText->setText(tr("%1 Hz").arg(loc.toString(shift)));
ui->channelRateText->setText(tr("%1k").arg(QString::number(channelSampleRate / 1000.0, 'g', 5))); ui->channelRateText->setText(tr("%1k").arg(QString::number(channelSampleRate / 1000.0, 'g', 5)));
m_channelMarker.setCenterFrequency(shift); m_channelMarker.setCenterFrequency(shift);
m_channelMarker.setBandwidth((int) channelSampleRate); m_channelMarker.setBandwidth(channelSampleRate);
} }
void BeamSteeringCWModGUI::leaveEvent(QEvent*) void BeamSteeringCWModGUI::leaveEvent(QEvent*)
@ -201,7 +206,7 @@ void BeamSteeringCWModGUI::handleSourceMessages()
{ {
Message* message; Message* message;
while ((message = getInputMessageQueue()->pop()) != nullptr) while ((message = getInputMessageQueue()->pop()) != 0)
{ {
if (handleMessage(*message)) if (handleMessage(*message))
{ {
@ -210,7 +215,7 @@ void BeamSteeringCWModGUI::handleSourceMessages()
} }
} }
void BeamSteeringCWModGUI::onWidgetRolled(const QWidget* widget, bool rollDown) void BeamSteeringCWModGUI::onWidgetRolled(QWidget* widget, bool rollDown)
{ {
(void) widget; (void) widget;
(void) rollDown; (void) rollDown;
@ -221,7 +226,7 @@ void BeamSteeringCWModGUI::onWidgetRolled(const QWidget* widget, bool rollDown)
void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p) void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p)
{ {
if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings) if (m_contextMenuType == ContextMenuChannelSettings)
{ {
BasicChannelSettingsDialog dialog(&m_channelMarker, this); BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI); dialog.setUseReverseAPI(m_settings.m_useReverseAPI);
@ -311,7 +316,7 @@ void BeamSteeringCWModGUI::tick()
} }
} }
void BeamSteeringCWModGUI::makeUIConnections() const void BeamSteeringCWModGUI::makeUIConnections()
{ {
QObject::connect(ui->channelOutput, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &BeamSteeringCWModGUI::on_channelOutput_currentIndexChanged); QObject::connect(ui->channelOutput, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &BeamSteeringCWModGUI::on_channelOutput_currentIndexChanged);
QObject::connect(ui->interpolationFactor, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &BeamSteeringCWModGUI::on_interpolationFactor_currentIndexChanged); QObject::connect(ui->interpolationFactor, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &BeamSteeringCWModGUI::on_interpolationFactor_currentIndexChanged);
@ -321,5 +326,5 @@ void BeamSteeringCWModGUI::makeUIConnections() const
void BeamSteeringCWModGUI::updateAbsoluteCenterFrequency() void BeamSteeringCWModGUI::updateAbsoluteCenterFrequency()
{ {
setStatusFrequency(m_centerFrequency + (qint64) (m_shiftFrequencyFactor * m_basebandSampleRate)); setStatusFrequency(m_centerFrequency + m_shiftFrequencyFactor * m_basebandSampleRate);
} }

View File

@ -47,21 +47,22 @@ class BeamSteeringCWModGUI : public ChannelGUI {
public: public:
static BeamSteeringCWModGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel); static BeamSteeringCWModGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel);
void resetToDefaults() final; virtual void destroy();
QByteArray serialize() const final; virtual void resetToDefaults();
bool deserialize(const QByteArray& data) final; QByteArray serialize() const;
MessageQueue *getInputMessageQueue() final { return &m_inputMessageQueue; } bool deserialize(const QByteArray& data);
void setWorkspaceIndex(int index) final { m_settings.m_workspaceIndex = index; }; virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
int getWorkspaceIndex() const final { return m_settings.m_workspaceIndex; }; virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; };
void setGeometryBytes(const QByteArray& blob) final { m_settings.m_geometryBytes = blob; }; virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; };
QByteArray getGeometryBytes() const final { return m_settings.m_geometryBytes; }; virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; };
QString getTitle() const final { return m_settings.m_title; }; virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; };
QColor getTitleColor() const final { return m_settings.m_rgbColor; }; virtual QString getTitle() const { return m_settings.m_title; };
void zetHidden(bool hidden) final { m_settings.m_hidden = hidden; } virtual QColor getTitleColor() const { return m_settings.m_rgbColor; };
bool getHidden() const final { return m_settings.m_hidden; } virtual void zetHidden(bool hidden) { m_settings.m_hidden = hidden; }
ChannelMarker& getChannelMarker() final { return m_channelMarker; } virtual bool getHidden() const { return m_settings.m_hidden; }
int getStreamIndex() const final { return -1; } virtual ChannelMarker& getChannelMarker() { return m_channelMarker; }
void setStreamIndex(int streamIndex) final { (void) streamIndex; } virtual int getStreamIndex() const { return -1; }
virtual void setStreamIndex(int streamIndex) { (void) streamIndex; }
private: private:
Ui::BeamSteeringCWModGUI* ui; Ui::BeamSteeringCWModGUI* ui;
@ -81,18 +82,18 @@ private:
uint32_t m_tickCount; uint32_t m_tickCount;
explicit BeamSteeringCWModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel, QWidget* parent = nullptr); explicit BeamSteeringCWModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel, QWidget* parent = nullptr);
~BeamSteeringCWModGUI() final; virtual ~BeamSteeringCWModGUI();
void blockApplySettings(bool block); void blockApplySettings(bool block);
void applySettings(bool force = false); void applySettings(bool force = false);
void displaySettings(); void displaySettings();
void displayRateAndShift(); void displayRateAndShift();
bool handleMessage(const Message& message); bool handleMessage(const Message& message);
void makeUIConnections() const; void makeUIConnections();
void updateAbsoluteCenterFrequency(); void updateAbsoluteCenterFrequency();
void leaveEvent(QEvent*) final; void leaveEvent(QEvent*);
void enterEvent(EnterEventType*) final; void enterEvent(EnterEventType*);
void applyInterpolation(); void applyInterpolation();
void applyPosition(); void applyPosition();
@ -103,7 +104,7 @@ private slots:
void on_interpolationFactor_currentIndexChanged(int index); void on_interpolationFactor_currentIndexChanged(int index);
void on_position_valueChanged(int value); void on_position_valueChanged(int value);
void on_steeringDegrees_valueChanged(int value); void on_steeringDegrees_valueChanged(int value);
void onWidgetRolled(const QWidget* widget, bool rollDown); void onWidgetRolled(QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p); void onMenuDialogCalled(const QPoint& p);
void tick(); void tick();
}; };

View File

@ -33,7 +33,7 @@
const PluginDescriptor BeamSteeringCWModPlugin::m_pluginDescriptor = { const PluginDescriptor BeamSteeringCWModPlugin::m_pluginDescriptor = {
BeamSteeringCWMod::m_channelId, BeamSteeringCWMod::m_channelId,
QStringLiteral("BeamSteeringCWMod"), QStringLiteral("BeamSteeringCWMod"),
QStringLiteral("7.22.1"), QStringLiteral("7.20.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -38,28 +38,22 @@ if (NOT SERVER_MODE)
doa2compass.cpp doa2compass.cpp
) )
set(TARGET_NAME ${PLUGINS_PREFIX}doa2) set(TARGET_NAME doa2)
set(TARGET_LIB "Qt::Widgets") set(TARGET_LIB "Qt::Widgets")
set(TARGET_LIB_GUI "sdrgui") set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else() else()
set(TARGET_NAME ${PLUGINSSRV_PREFIX}doa2srv) set(TARGET_NAME doa2srv)
set(TARGET_LIB "") set(TARGET_LIB "")
set(TARGET_LIB_GUI "") set(TARGET_LIB_GUI "")
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
endif() endif()
if(NOT Qt6_FOUND) add_library(${TARGET_NAME} SHARED
add_library(${TARGET_NAME} ${doa2_SOURCES}) ${doa2_SOURCES}
else() )
qt_add_plugin(${TARGET_NAME} CLASS_NAME DOA2Plugin ${doa2_SOURCES})
endif()
if(NOT BUILD_SHARED_LIBS) target_link_libraries(${TARGET_NAME}
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core Qt::Core
${TARGET_LIB} ${TARGET_LIB}
sdrbase sdrbase

View File

@ -48,6 +48,7 @@ DOA2::DOA2(DeviceAPI *deviceAPI) :
m_thread(nullptr), m_thread(nullptr),
m_basebandSink(nullptr), m_basebandSink(nullptr),
m_running(false), m_running(false),
m_guiMessageQueue(nullptr),
m_frequencyOffset(0), m_frequencyOffset(0),
m_deviceSampleRate(48000), m_deviceSampleRate(48000),
m_deviceCenterFrequency(435000000) m_deviceCenterFrequency(435000000)
@ -64,7 +65,7 @@ DOA2::DOA2(DeviceAPI *deviceAPI) :
this, this,
&DOA2::networkManagerFinished &DOA2::networkManagerFinished
); );
DOA2::startSinks(); startSinks();
} }
DOA2::~DOA2() DOA2::~DOA2()
@ -79,7 +80,7 @@ DOA2::~DOA2()
m_deviceAPI->removeChannelSinkAPI(this); m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeMIMOChannel(this); m_deviceAPI->removeMIMOChannel(this);
DOA2::stopSinks(); stopSinks();
} }
void DOA2::setDeviceAPI(DeviceAPI *deviceAPI) void DOA2::setDeviceAPI(DeviceAPI *deviceAPI)
@ -202,7 +203,7 @@ void DOA2::applySettings(const DOA2Settings& settings, bool force)
reverseAPIKeys.append("squelchdB"); reverseAPIKeys.append("squelchdB");
if (m_running) { if (m_running) {
m_basebandSink->setMagThreshold((float) CalcDb::powerFromdB(settings.m_squelchdB)); m_basebandSink->setMagThreshold(CalcDb::powerFromdB(settings.m_squelchdB));
} }
} }
@ -216,7 +217,7 @@ void DOA2::applySettings(const DOA2Settings& settings, bool force)
} }
if (m_running && ((m_settings.m_log2Decim != settings.m_log2Decim) if (m_running && ((m_settings.m_log2Decim != settings.m_log2Decim)
|| (m_settings.m_filterChainHash != settings.m_filterChainHash) || force)) || (m_settings.m_filterChainHash != settings.m_filterChainHash) || force))
{ {
DOA2Baseband::MsgConfigureChannelizer *msg = DOA2Baseband::MsgConfigureChannelizer::create( DOA2Baseband::MsgConfigureChannelizer *msg = DOA2Baseband::MsgConfigureChannelizer::create(
settings.m_log2Decim, settings.m_filterChainHash); settings.m_log2Decim, settings.m_filterChainHash);
@ -237,7 +238,7 @@ void DOA2::applySettings(const DOA2Settings& settings, bool force)
QList<ObjectPipe*> pipes; QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (!pipes.empty()) { if (pipes.size() > 0) {
sendChannelSettings(pipes, reverseAPIKeys, settings, force); sendChannelSettings(pipes, reverseAPIKeys, settings, force);
} }
@ -248,7 +249,7 @@ void DOA2::handleInputMessages()
{ {
Message* message; Message* message;
while ((message = m_inputMessageQueue.pop()) != nullptr) while ((message = m_inputMessageQueue.pop()) != 0)
{ {
if (handleMessage(*message)) if (handleMessage(*message))
{ {
@ -261,14 +262,14 @@ bool DOA2::handleMessage(const Message& cmd)
{ {
if (MsgConfigureDOA2::match(cmd)) if (MsgConfigureDOA2::match(cmd))
{ {
auto& cfg = (const MsgConfigureDOA2&) cmd; MsgConfigureDOA2& cfg = (MsgConfigureDOA2&) cmd;
qDebug() << "DOA2::handleMessage: MsgConfigureDOA2"; qDebug() << "DOA2::handleMessage: MsgConfigureDOA2";
applySettings(cfg.getSettings(), cfg.getForce()); applySettings(cfg.getSettings(), cfg.getForce());
return true; return true;
} }
else if (DSPMIMOSignalNotification::match(cmd)) else if (DSPMIMOSignalNotification::match(cmd))
{ {
auto& notif = (const DSPMIMOSignalNotification&) cmd; DSPMIMOSignalNotification& notif = (DSPMIMOSignalNotification&) cmd;
qDebug() << "DOA2::handleMessage: DSPMIMOSignalNotification:" qDebug() << "DOA2::handleMessage: DSPMIMOSignalNotification:"
<< " inputSampleRate: " << notif.getSampleRate() << " inputSampleRate: " << notif.getSampleRate()
@ -346,7 +347,7 @@ void DOA2::validateFilterChainHash(DOA2Settings& settings)
void DOA2::calculateFrequencyOffset() void DOA2::calculateFrequencyOffset()
{ {
double shiftFactor = HBFilterChainConverter::getShiftFactor(m_settings.m_log2Decim, m_settings.m_filterChainHash); double shiftFactor = HBFilterChainConverter::getShiftFactor(m_settings.m_log2Decim, m_settings.m_filterChainHash);
m_frequencyOffset = (int64_t) (m_deviceSampleRate * shiftFactor); m_frequencyOffset = m_deviceSampleRate * shiftFactor;
} }
void DOA2::applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash) void DOA2::applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash)
@ -359,12 +360,12 @@ void DOA2::applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash)
m_basebandSink->getInputMessageQueue()->push(msg); m_basebandSink->getInputMessageQueue()->push(msg);
} }
double DOA2::getPhi() const float DOA2::getPhi() const
{ {
return m_basebandSink ? m_basebandSink->getPhi() : 0.0; return m_basebandSink ? m_basebandSink->getPhi() : 0.0f;
} }
double DOA2::getPositiveDOA() const float DOA2::getPositiveDOA() const
{ {
return std::acos(getPhi()/M_PI)*(180/M_PI); return std::acos(getPhi()/M_PI)*(180/M_PI);
} }
@ -468,13 +469,13 @@ void DOA2::webapiUpdateChannelSettings(
settings.m_reverseAPIAddress = *response.getDoa2Settings()->getReverseApiAddress(); settings.m_reverseAPIAddress = *response.getDoa2Settings()->getReverseApiAddress();
} }
if (channelSettingsKeys.contains("reverseAPIPort")) { if (channelSettingsKeys.contains("reverseAPIPort")) {
settings.m_reverseAPIPort = (uint16_t) response.getDoa2Settings()->getReverseApiPort(); settings.m_reverseAPIPort = response.getDoa2Settings()->getReverseApiPort();
} }
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) { if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getDoa2Settings()->getReverseApiDeviceIndex(); settings.m_reverseAPIDeviceIndex = response.getDoa2Settings()->getReverseApiDeviceIndex();
} }
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) { if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
settings.m_reverseAPIChannelIndex = (uint16_t) response.getDoa2Settings()->getReverseApiChannelIndex(); settings.m_reverseAPIChannelIndex = response.getDoa2Settings()->getReverseApiChannelIndex();
} }
if (settings.m_scopeGUI && channelSettingsKeys.contains("scopeConfig")) { if (settings.m_scopeGUI && channelSettingsKeys.contains("scopeConfig")) {
settings.m_scopeGUI->updateFrom(channelSettingsKeys, response.getDoa2Settings()->getScopeConfig()); settings.m_scopeGUI->updateFrom(channelSettingsKeys, response.getDoa2Settings()->getScopeConfig());
@ -524,7 +525,7 @@ void DOA2::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response
} }
else else
{ {
auto *swgGLScope = new SWGSDRangel::SWGGLScope(); SWGSDRangel::SWGGLScope *swgGLScope = new SWGSDRangel::SWGGLScope();
settings.m_scopeGUI->formatTo(swgGLScope); settings.m_scopeGUI->formatTo(swgGLScope);
response.getDoa2Settings()->setScopeConfig(swgGLScope); response.getDoa2Settings()->setScopeConfig(swgGLScope);
} }
@ -538,7 +539,7 @@ void DOA2::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response
} }
else else
{ {
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker(); SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker); settings.m_channelMarker->formatTo(swgChannelMarker);
response.getDoa2Settings()->setChannelMarker(swgChannelMarker); response.getDoa2Settings()->setChannelMarker(swgChannelMarker);
} }
@ -552,39 +553,39 @@ void DOA2::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response
} }
else else
{ {
auto *swgRollupState = new SWGSDRangel::SWGRollupState(); SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState); settings.m_rollupState->formatTo(swgRollupState);
response.getDoa2Settings()->setRollupState(swgRollupState); response.getDoa2Settings()->setRollupState(swgRollupState);
} }
} }
} }
void DOA2::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const void DOA2::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
{ {
double phi = normalizeAngle(getPhi() * (180.0/M_PI), 180.0); float phi = normalizeAngle(getPhi() * (180/M_PI), 180.0f);
response.getDoa2Report()->setPhi((qint32) phi); response.getDoa2Report()->setPhi(phi);
double hwl = 1.5e8 / (double) (m_deviceCenterFrequency + m_frequencyOffset); float hwl = 1.5e8 / (m_deviceCenterFrequency + m_frequencyOffset);
double cosTheta = (getPhi()/M_PI) * ((hwl * 1000.0) / m_settings.m_basebandDistance); float cosTheta = (getPhi()/M_PI) * ((hwl * 1000.0) / m_settings.m_basebandDistance);
double blindAngle = (m_settings.m_basebandDistance > hwl * 1000.0) ? float blindAngle = (m_settings.m_basebandDistance > hwl * 1000.0) ?
std::acos((hwl * 1000.0) / m_settings.m_basebandDistance) * (180/M_PI) : std::acos((hwl * 1000.0) / m_settings.m_basebandDistance) * (180/M_PI) :
0; 0;
response.getDoa2Report()->setBlindAngle((int) blindAngle); response.getDoa2Report()->setBlindAngle((int) blindAngle);
double doaAngle = std::acos(cosTheta < -1.0 ? -1.0 : cosTheta > 1.0 ? 1.0 : cosTheta) * (180.0/M_PI); float doaAngle = std::acos(cosTheta < -1.0 ? -1.0 : cosTheta > 1.0 ? 1.0 : cosTheta) * (180/M_PI);
qDebug("DOA2::webapiFormatChannelReport: phi: %f cosT: %f DOAngle: %f", getPhi(), cosTheta, doaAngle); qDebug("DOA2::webapiFormatChannelReport: phi: %f cosT: %f DOAngle: %f", getPhi(), cosTheta, doaAngle);
double posAngle = normalizeAngle(m_settings.m_antennaAz - doaAngle, 360.0); // DOA angles are trigonometric but displayed angles are clockwise float posAngle = normalizeAngle(m_settings.m_antennaAz - doaAngle, 360.0f); // DOA angles are trigonometric but displayed angles are clockwise
double negAngle = normalizeAngle(m_settings.m_antennaAz + doaAngle, 360.0); float negAngle = normalizeAngle(m_settings.m_antennaAz + doaAngle, 360.0f);
response.getDoa2Report()->setPosAz((qint32) posAngle); response.getDoa2Report()->setPosAz(posAngle);
response.getDoa2Report()->setNegAz((qint32) negAngle); response.getDoa2Report()->setNegAz(negAngle);
response.getDoa2Report()->setFftSize(m_fftSize); response.getDoa2Report()->setFftSize(m_fftSize);
int channelSampleRate = m_deviceSampleRate / (1<<m_settings.m_log2Decim); int channelSampleRate = m_deviceSampleRate / (1<<m_settings.m_log2Decim);
response.getDoa2Report()->setChannelSampleRate(channelSampleRate); response.getDoa2Report()->setChannelSampleRate(channelSampleRate);
} }
void DOA2::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DOA2Settings& settings, bool force) void DOA2::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DOA2Settings& settings, bool force)
{ {
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings") QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
@ -595,8 +596,8 @@ void DOA2::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys,
m_networkRequest.setUrl(QUrl(channelSettingsURL)); m_networkRequest.setUrl(QUrl(channelSettingsURL));
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
auto *buffer = new QBuffer(); QBuffer *buffer = new QBuffer();
buffer->open(QBuffer::ReadWrite); buffer->open((QBuffer::ReadWrite));
buffer->write(swgChannelSettings->asJson().toUtf8()); buffer->write(swgChannelSettings->asJson().toUtf8());
buffer->seek(0); buffer->seek(0);
@ -609,9 +610,9 @@ void DOA2::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys,
void DOA2::sendChannelSettings( void DOA2::sendChannelSettings(
const QList<ObjectPipe*>& pipes, const QList<ObjectPipe*>& pipes,
const QList<QString>& channelSettingsKeys, QList<QString>& channelSettingsKeys,
const DOA2Settings& settings, const DOA2Settings& settings,
bool force) const bool force)
{ {
for (const auto& pipe : pipes) for (const auto& pipe : pipes)
{ {
@ -619,7 +620,7 @@ void DOA2::sendChannelSettings(
if (messageQueue) if (messageQueue)
{ {
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create( MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create(
this, this,
@ -633,11 +634,11 @@ void DOA2::sendChannelSettings(
} }
void DOA2::webapiFormatChannelSettings( void DOA2::webapiFormatChannelSettings(
const QList<QString>& channelSettingsKeys, QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings, SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const DOA2Settings& settings, const DOA2Settings& settings,
bool force bool force
) const )
{ {
swgChannelSettings->setDirection(2); // MIMO sink swgChannelSettings->setDirection(2); // MIMO sink
swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet()); swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet());
@ -676,26 +677,29 @@ void DOA2::webapiFormatChannelSettings(
swgDOA2Settings->setFftAveragingValue(DOA2Settings::getAveragingValue(settings.m_fftAveragingIndex)); swgDOA2Settings->setFftAveragingValue(DOA2Settings::getAveragingValue(settings.m_fftAveragingIndex));
} }
if ((settings.m_scopeGUI) && (channelSettingsKeys.contains("scopeConfig") || force)) { if (settings.m_scopeGUI)
settings.m_scopeGUI->formatTo(swgDOA2Settings->getScopeConfig()); {
if (channelSettingsKeys.contains("scopeConfig") || force) {
settings.m_scopeGUI->formatTo(swgDOA2Settings->getScopeConfig());
}
} }
if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force)) if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force))
{ {
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker(); SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker); settings.m_channelMarker->formatTo(swgChannelMarker);
swgDOA2Settings->setChannelMarker(swgChannelMarker); swgDOA2Settings->setChannelMarker(swgChannelMarker);
} }
if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force)) if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force))
{ {
auto *swgRollupState = new SWGSDRangel::SWGRollupState(); SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState); settings.m_rollupState->formatTo(swgRollupState);
swgDOA2Settings->setRollupState(swgRollupState); swgDOA2Settings->setRollupState(swgRollupState);
} }
} }
void DOA2::networkManagerFinished(QNetworkReply *reply) const void DOA2::networkManagerFinished(QNetworkReply *reply)
{ {
QNetworkReply::NetworkError replyError = reply->error(); QNetworkReply::NetworkError replyError = reply->error();
@ -716,7 +720,7 @@ void DOA2::networkManagerFinished(QNetworkReply *reply) const
reply->deleteLater(); reply->deleteLater();
} }
double DOA2::normalizeAngle(double angle, double max) float DOA2::normalizeAngle(float angle, float max)
{ {
if (angle < 0) { return max + angle; } if (angle < 0) { return max + angle; }
if (angle > max) { return angle - max; } if (angle > max) { return angle - max; }

View File

@ -86,73 +86,76 @@ public:
qint64 m_centerFrequency; qint64 m_centerFrequency;
}; };
explicit DOA2(DeviceAPI *deviceAPI); DOA2(DeviceAPI *deviceAPI);
~DOA2() final; virtual ~DOA2();
void destroy() final { delete this; } virtual void destroy() { delete this; }
void setDeviceAPI(DeviceAPI *deviceAPI) final; virtual void setDeviceAPI(DeviceAPI *deviceAPI);
DeviceAPI *getDeviceAPI() final { return m_deviceAPI; } virtual DeviceAPI *getDeviceAPI() { return m_deviceAPI; }
void startSinks() final; //!< thread start() virtual void startSinks(); //!< thread start()
void stopSinks() final; //!< thread exit() and wait() virtual void stopSinks(); //!< thread exit() and wait()
void startSources() final { /* Not for MIMO */ } virtual void startSources() {}
void stopSources() final { /* Not for MIMO */ } virtual void stopSources() {}
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex) final; virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex);
void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex) final; virtual void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex);
void pushMessage(Message *msg) final { m_inputMessageQueue.push(msg); } virtual void pushMessage(Message *msg) { m_inputMessageQueue.push(msg); }
QString getMIMOName() final { return objectName(); } virtual QString getMIMOName() { return objectName(); }
void getIdentifier(QString& id) final { id = objectName(); } virtual void getIdentifier(QString& id) { id = objectName(); }
QString getIdentifier() const final { return objectName(); } virtual QString getIdentifier() const { return objectName(); }
void getTitle(QString& title) final { title = "DOA 2 sources"; } virtual void getTitle(QString& title) { title = "DOA 2 sources"; }
qint64 getCenterFrequency() const final { return m_frequencyOffset; } virtual qint64 getCenterFrequency() const { return m_frequencyOffset; }
void setCenterFrequency(qint64) final { /* Not for MIMO */ } virtual void setCenterFrequency(qint64) {}
uint32_t getDeviceSampleRate() const { return m_deviceSampleRate; } uint32_t getDeviceSampleRate() const { return m_deviceSampleRate; }
QByteArray serialize() const final; virtual QByteArray serialize() const;
bool deserialize(const QByteArray& data) final; virtual bool deserialize(const QByteArray& data);
int getNbSinkStreams() const final { return 2; } virtual int getNbSinkStreams() const { return 2; }
int getNbSourceStreams() const final { return 0; } virtual int getNbSourceStreams() const { return 0; }
int getStreamIndex() const final { return -1; } virtual int getStreamIndex() const { return -1; }
qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const final virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
{ {
(void) streamIndex; (void) streamIndex;
(void) sinkElseSource; (void) sinkElseSource;
return m_frequencyOffset; return m_frequencyOffset;
} }
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
MessageQueue *getMessageQueueToGUI() { return m_guiMessageQueue; }
ScopeVis *getScopeVis() { return &m_scopeSink; } ScopeVis *getScopeVis() { return &m_scopeSink; }
void applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash); void applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash);
double getPhi() const; float getPhi() const;
double getPositiveDOA() const; float getPositiveDOA() const;
int webapiSettingsGet( virtual int webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response, SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final; QString& errorMessage);
int webapiSettingsPutPatch( virtual int webapiSettingsPutPatch(
bool force, bool force,
const QStringList& channelSettingsKeys, const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response, SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final; QString& errorMessage);
int webapiReportGet( virtual int webapiReportGet(
SWGSDRangel::SWGChannelReport& response, SWGSDRangel::SWGChannelReport& response,
QString& errorMessage) final; QString& errorMessage);
int webapiWorkspaceGet( virtual int webapiWorkspaceGet(
SWGSDRangel::SWGWorkspaceInfo& query, SWGSDRangel::SWGWorkspaceInfo& query,
QString& errorMessage) final; QString& errorMessage);
static void webapiFormatChannelSettings( static void webapiFormatChannelSettings(
SWGSDRangel::SWGChannelSettings& response, SWGSDRangel::SWGChannelSettings& response,
const DOA2Settings& settings); const DOA2Settings& settings);
static void webapiUpdateChannelSettings( static void webapiUpdateChannelSettings(
DOA2Settings& settings, DOA2Settings& settings,
const QStringList& channelSettingsKeys, const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response); SWGSDRangel::SWGChannelSettings& response);
static const char* const m_channelIdURI; static const char* const m_channelIdURI;
static const char* const m_channelId; static const char* const m_channelId;
@ -166,6 +169,7 @@ private:
QMutex m_mutex; QMutex m_mutex;
bool m_running; bool m_running;
DOA2Settings m_settings; DOA2Settings m_settings;
MessageQueue *m_guiMessageQueue; //!< Input message queue to the GUI
QNetworkAccessManager *m_networkManager; QNetworkAccessManager *m_networkManager;
QNetworkRequest m_networkRequest; QNetworkRequest m_networkRequest;
@ -173,30 +177,31 @@ private:
int64_t m_frequencyOffset; int64_t m_frequencyOffset;
uint32_t m_deviceSampleRate; uint32_t m_deviceSampleRate;
qint64 m_deviceCenterFrequency; qint64 m_deviceCenterFrequency;
int m_count0, m_count1;
bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed virtual bool handleMessage(const Message& cmd); //!< Processing of a message. Returns true if message has actually been processed
void applySettings(const DOA2Settings& settings, bool force = false); void applySettings(const DOA2Settings& settings, bool force = false);
static void validateFilterChainHash(DOA2Settings& settings); static void validateFilterChainHash(DOA2Settings& settings);
void calculateFrequencyOffset(); void calculateFrequencyOffset();
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const; void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DOA2Settings& settings, bool force); void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DOA2Settings& settings, bool force);
void sendChannelSettings( void sendChannelSettings(
const QList<ObjectPipe*>& pipes, const QList<ObjectPipe*>& pipes,
const QList<QString>& channelSettingsKeys, QList<QString>& channelSettingsKeys,
const DOA2Settings& settings, const DOA2Settings& settings,
bool force bool force
) const; );
void webapiFormatChannelSettings( void webapiFormatChannelSettings(
const QList<QString>& channelSettingsKeys, QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings, SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const DOA2Settings& settings, const DOA2Settings& settings,
bool force bool force
) const; );
static double normalizeAngle(double angle, double max); static float normalizeAngle(float angle, float max);
private slots: private slots:
void handleInputMessages(); void handleInputMessages();
void networkManagerFinished(QNetworkReply *reply) const; void networkManagerFinished(QNetworkReply *reply);
}; };
#endif // INCLUDE_DOA2_H #endif // INCLUDE_DOA2_H

View File

@ -73,7 +73,7 @@ public:
private: private:
DOA2Settings::CorrelationType m_correlationType; DOA2Settings::CorrelationType m_correlationType;
explicit MsgConfigureCorrelation(DOA2Settings::CorrelationType correlationType) : MsgConfigureCorrelation(DOA2Settings::CorrelationType correlationType) :
Message(), Message(),
m_correlationType(correlationType) m_correlationType(correlationType)
{} {}
@ -103,8 +103,8 @@ public:
{ } { }
}; };
explicit DOA2Baseband(int fftSize); DOA2Baseband(int fftSize);
~DOA2Baseband() final; ~DOA2Baseband();
void reset(); void reset();
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication
@ -114,7 +114,7 @@ public:
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int streamIndex); void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int streamIndex);
void setBasebandSampleRate(unsigned int sampleRate); void setBasebandSampleRate(unsigned int sampleRate);
double getPhi() const { return m_phi; } float getPhi() const { return m_phi; }
void setMagThreshold(float threshold) { m_magThreshold = threshold * SDR_RX_SCALED * SDR_RX_SCALED; } void setMagThreshold(float threshold) { m_magThreshold = threshold * SDR_RX_SCALED * SDR_RX_SCALED; }
void setFFTAveraging(int nbFFT); void setFFTAveraging(int nbFFT);
@ -128,9 +128,9 @@ private:
DOA2Settings::CorrelationType m_correlationType; DOA2Settings::CorrelationType m_correlationType;
int m_fftSize; int m_fftSize;
int m_samplesCount; //!< Number of samples processed by DOA int m_samplesCount; //!< Number of samples processed by DOA
double m_magSum; //!< Squared magnitudes accumulator float m_magSum; //!< Squared magnitudes accumulator
double m_wphSum; //!< Phase difference accumulator (averaging weighted by squared magnitude) float m_wphSum; //!< Phase difference accumulator (averaging weighted by squared magnitude)
double m_phi; //!< Resulting calculated phase difference float m_phi; //!< Resulting calculated phase difference
double m_magThreshold; //!< Squared magnitude scaled threshold double m_magThreshold; //!< Squared magnitude scaled threshold
int m_fftAvg; //!< Average over a certain number of FFTs int m_fftAvg; //!< Average over a certain number of FFTs
int m_fftAvgCount; //!< FFT averaging counter int m_fftAvgCount; //!< FFT averaging counter

View File

@ -264,7 +264,7 @@ bool DOA2Correlator::performFFTProd(
m_fft[0]->out() + m_fftSize, m_fft[0]->out() + m_fftSize,
m_dataj, m_dataj,
m_invFFT->in(), m_invFFT->in(),
[](std::complex<float>& a, const std::complex<float>& b) -> std::complex<float> { [this](std::complex<float>& a, const std::complex<float>& b) -> std::complex<float> {
return (a*b); return (a*b);
} }
); );

View File

@ -33,10 +33,15 @@
DOA2GUI* DOA2GUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *channelMIMO) DOA2GUI* DOA2GUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *channelMIMO)
{ {
auto* gui = new DOA2GUI(pluginAPI, deviceUISet, channelMIMO); DOA2GUI* gui = new DOA2GUI(pluginAPI, deviceUISet, channelMIMO);
return gui; return gui;
} }
void DOA2GUI::destroy()
{
delete this;
}
void DOA2GUI::resetToDefaults() void DOA2GUI::resetToDefaults()
{ {
m_settings.resetToDefaults(); m_settings.resetToDefaults();
@ -73,7 +78,7 @@ bool DOA2GUI::handleMessage(const Message& message)
{ {
if (DOA2::MsgBasebandNotification::match(message)) if (DOA2::MsgBasebandNotification::match(message))
{ {
auto& notif = (const DOA2::MsgBasebandNotification&) message; DOA2::MsgBasebandNotification& notif = (DOA2::MsgBasebandNotification&) message;
m_sampleRate = notif.getSampleRate(); m_sampleRate = notif.getSampleRate();
m_centerFrequency = notif.getCenterFrequency(); m_centerFrequency = notif.getCenterFrequency();
displayRateAndShift(); displayRateAndShift();
@ -83,7 +88,7 @@ bool DOA2GUI::handleMessage(const Message& message)
} }
else if (DOA2::MsgConfigureDOA2::match(message)) else if (DOA2::MsgConfigureDOA2::match(message))
{ {
auto& notif = (const DOA2::MsgConfigureDOA2&) message; const DOA2::MsgConfigureDOA2& notif = (const DOA2::MsgConfigureDOA2&) message;
m_settings = notif.getSettings(); m_settings = notif.getSettings();
ui->scopeGUI->updateSettings(); ui->scopeGUI->updateSettings();
m_channelMarker.updateSettings(static_cast<const ChannelMarker*>(m_settings.m_channelMarker)); m_channelMarker.updateSettings(static_cast<const ChannelMarker*>(m_settings.m_channelMarker));
@ -117,7 +122,7 @@ DOA2GUI::DOA2GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *ch
m_doa2 = (DOA2*) channelMIMO; m_doa2 = (DOA2*) channelMIMO;
m_scopeVis = m_doa2->getScopeVis(); m_scopeVis = m_doa2->getScopeVis();
m_scopeVis->setGLScope(ui->glScope); m_scopeVis->setGLScope(ui->glScope);
m_doa2->setMessageQueueToGUI(DOA2GUI::getInputMessageQueue()); m_doa2->setMessageQueueToGUI(getInputMessageQueue());
m_sampleRate = m_doa2->getDeviceSampleRate(); m_sampleRate = m_doa2->getDeviceSampleRate();
ui->glScope->setTraceModulo(DOA2::m_fftSize); ui->glScope->setTraceModulo(DOA2::m_fftSize);
@ -145,7 +150,7 @@ DOA2GUI::DOA2GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *ch
ui->scopeGUI->traceLengthChange(); ui->scopeGUI->traceLengthChange();
ui->compass->setBlindAngleBorder(true); ui->compass->setBlindAngleBorder(true);
connect(DOA2GUI::getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages())); connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
displaySettings(); displaySettings();
makeUIConnections(); makeUIConnections();
@ -216,20 +221,20 @@ void DOA2GUI::displaySettings()
void DOA2GUI::displayRateAndShift() void DOA2GUI::displayRateAndShift()
{ {
auto shift = (int) (m_shiftFrequencyFactor * m_sampleRate); int shift = m_shiftFrequencyFactor * m_sampleRate;
double channelSampleRate = ((double) m_sampleRate) / (1<<m_settings.m_log2Decim); double channelSampleRate = ((double) m_sampleRate) / (1<<m_settings.m_log2Decim);
QLocale loc; QLocale loc;
ui->offsetFrequencyText->setText(tr("%1 Hz").arg(loc.toString(shift))); ui->offsetFrequencyText->setText(tr("%1 Hz").arg(loc.toString(shift)));
ui->channelRateText->setText(tr("%1k").arg(QString::number(channelSampleRate / 1000.0, 'g', 5))); ui->channelRateText->setText(tr("%1k").arg(QString::number(channelSampleRate / 1000.0, 'g', 5)));
m_channelMarker.setCenterFrequency(shift); m_channelMarker.setCenterFrequency(shift);
m_channelMarker.setBandwidth((int) channelSampleRate); m_channelMarker.setBandwidth(channelSampleRate);
m_scopeVis->setLiveRate((int) channelSampleRate); m_scopeVis->setLiveRate(channelSampleRate);
} }
void DOA2GUI::setFFTAveragingTooltip() void DOA2GUI::setFFTAveragingTooltip()
{ {
float channelSampleRate = ((float) m_sampleRate) / ((float) (1<<m_settings.m_log2Decim)); float channelSampleRate = ((float) m_sampleRate) / (1<<m_settings.m_log2Decim);
float averagingTime = ((float) DOA2::m_fftSize * (float) DOA2Settings::getAveragingValue(m_settings.m_fftAveragingIndex)) / float averagingTime = (DOA2::m_fftSize * DOA2Settings::getAveragingValue(m_settings.m_fftAveragingIndex)) /
channelSampleRate; channelSampleRate;
QString s; QString s;
setNumberStr(averagingTime, 2, s); setNumberStr(averagingTime, 2, s);
@ -269,7 +274,7 @@ void DOA2GUI::handleSourceMessages()
{ {
Message* message; Message* message;
while ((message = getInputMessageQueue()->pop()) != nullptr) while ((message = getInputMessageQueue()->pop()) != 0)
{ {
if (handleMessage(*message)) if (handleMessage(*message))
{ {
@ -278,7 +283,7 @@ void DOA2GUI::handleSourceMessages()
} }
} }
void DOA2GUI::onWidgetRolled(const QWidget* widget, bool rollDown) void DOA2GUI::onWidgetRolled(QWidget* widget, bool rollDown)
{ {
(void) widget; (void) widget;
(void) rollDown; (void) rollDown;
@ -289,7 +294,7 @@ void DOA2GUI::onWidgetRolled(const QWidget* widget, bool rollDown)
void DOA2GUI::onMenuDialogCalled(const QPoint &p) void DOA2GUI::onMenuDialogCalled(const QPoint &p)
{ {
if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings) if (m_contextMenuType == ContextMenuChannelSettings)
{ {
BasicChannelSettingsDialog dialog(&m_channelMarker, this); BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI); dialog.setUseReverseAPI(m_settings.m_useReverseAPI);
@ -429,7 +434,7 @@ void DOA2GUI::tick()
} }
} }
void DOA2GUI::makeUIConnections() const void DOA2GUI::makeUIConnections()
{ {
QObject::connect(ui->decimationFactor, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &DOA2GUI::on_decimationFactor_currentIndexChanged); QObject::connect(ui->decimationFactor, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &DOA2GUI::on_decimationFactor_currentIndexChanged);
QObject::connect(ui->position, &QSlider::valueChanged, this, &DOA2GUI::on_position_valueChanged); QObject::connect(ui->position, &QSlider::valueChanged, this, &DOA2GUI::on_position_valueChanged);
@ -444,9 +449,9 @@ void DOA2GUI::makeUIConnections() const
void DOA2GUI::updateAbsoluteCenterFrequency() void DOA2GUI::updateAbsoluteCenterFrequency()
{ {
auto cf = (qint64) ((double) m_centerFrequency + m_shiftFrequencyFactor * m_sampleRate); qint64 cf = m_centerFrequency + m_shiftFrequencyFactor * m_sampleRate;
setStatusFrequency(cf); setStatusFrequency(cf);
m_hwl = 1.5e+8 / (double) cf; m_hwl = 1.5e+8 / cf;
ui->halfWLText->setText(tr("%1").arg(m_hwl*1000, 5, 'f', 0)); ui->halfWLText->setText(tr("%1").arg(m_hwl*1000, 5, 'f', 0));
updateScopeFScale(); updateScopeFScale();
} }
@ -465,14 +470,14 @@ void DOA2GUI::updateScopeFScale()
void DOA2GUI::updateDOA() void DOA2GUI::updateDOA()
{ {
double cosTheta = (m_doa2->getPhi()/M_PI) * ((m_hwl * 1000.0) / m_settings.m_basebandDistance); float cosTheta = (m_doa2->getPhi()/M_PI) * ((m_hwl * 1000.0) / m_settings.m_basebandDistance);
double blindAngle = (m_settings.m_basebandDistance > m_hwl * 1000.0) ? float blindAngle = (m_settings.m_basebandDistance > m_hwl * 1000.0) ?
std::acos((m_hwl * 1000.0) / m_settings.m_basebandDistance) * (180/M_PI) : std::acos((m_hwl * 1000.0) / m_settings.m_basebandDistance) * (180/M_PI) :
0; 0;
ui->compass->setBlindAngle(blindAngle); ui->compass->setBlindAngle(blindAngle);
double doaAngle = std::acos(cosTheta < -1.0 ? -1.0 : cosTheta > 1.0 ? 1.0 : cosTheta) * (180/M_PI); float doaAngle = std::acos(cosTheta < -1.0 ? -1.0 : cosTheta > 1.0 ? 1.0 : cosTheta) * (180/M_PI);
double posAngle = ui->antAz->value() - doaAngle; // DOA angles are trigonometric but displayed angles are clockwise float posAngle = ui->antAz->value() - doaAngle; // DOA angles are trigonometric but displayed angles are clockwise
double negAngle = ui->antAz->value() + doaAngle; float negAngle = ui->antAz->value() + doaAngle;
ui->compass->setAzPos(posAngle); ui->compass->setAzPos(posAngle);
ui->compass->setAzNeg(negAngle); ui->compass->setAzNeg(negAngle);
ui->posText->setText(tr("%1").arg(ui->compass->getAzPos(), 3, 'f', 0, QLatin1Char('0'))); ui->posText->setText(tr("%1").arg(ui->compass->getAzPos(), 3, 'f', 0, QLatin1Char('0')));

View File

@ -46,21 +46,22 @@ class DOA2GUI : public ChannelGUI {
public: public:
static DOA2GUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel); static DOA2GUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel);
void resetToDefaults() final; virtual void destroy();
QByteArray serialize() const final; virtual void resetToDefaults();
bool deserialize(const QByteArray& data) final; virtual QByteArray serialize() const;
MessageQueue* getInputMessageQueue() final; virtual bool deserialize(const QByteArray& data);
void setWorkspaceIndex(int index) final { m_settings.m_workspaceIndex = index; }; virtual MessageQueue* getInputMessageQueue();
int getWorkspaceIndex() const final { return m_settings.m_workspaceIndex; }; virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; };
void setGeometryBytes(const QByteArray& blob) final { m_settings.m_geometryBytes = blob; }; virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; };
QByteArray getGeometryBytes() const final { return m_settings.m_geometryBytes; }; virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; };
QString getTitle() const final { return m_settings.m_title; }; virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; };
QColor getTitleColor() const final { return m_settings.m_rgbColor; }; virtual QString getTitle() const { return m_settings.m_title; };
void zetHidden(bool hidden) final { m_settings.m_hidden = hidden; } virtual QColor getTitleColor() const { return m_settings.m_rgbColor; };
bool getHidden() const final { return m_settings.m_hidden; } virtual void zetHidden(bool hidden) { m_settings.m_hidden = hidden; }
ChannelMarker& getChannelMarker() final { return m_channelMarker; } virtual bool getHidden() const { return m_settings.m_hidden; }
int getStreamIndex() const final { return -1; } virtual ChannelMarker& getChannelMarker() { return m_channelMarker; }
void setStreamIndex(int streamIndex) final { (void) streamIndex; } virtual int getStreamIndex() const { return -1; }
virtual void setStreamIndex(int streamIndex) { (void) streamIndex; }
private: private:
Ui::DOA2GUI* ui; Ui::DOA2GUI* ui;
@ -81,7 +82,7 @@ private:
double m_hwl; //!< Half wavelength at center frequency double m_hwl; //!< Half wavelength at center frequency
explicit DOA2GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *rxChannel, QWidget* parent = nullptr); explicit DOA2GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *rxChannel, QWidget* parent = nullptr);
~DOA2GUI() final; virtual ~DOA2GUI();
void blockApplySettings(bool block); void blockApplySettings(bool block);
void applySettings(bool force = false); void applySettings(bool force = false);
@ -92,13 +93,13 @@ private:
void setFFTAveragingTooltip(); void setFFTAveragingTooltip();
static void setNumberStr(float v, int decimalPlaces, QString& s); static void setNumberStr(float v, int decimalPlaces, QString& s);
bool handleMessage(const Message& message); bool handleMessage(const Message& message);
void makeUIConnections() const; void makeUIConnections();
void updateAbsoluteCenterFrequency(); void updateAbsoluteCenterFrequency();
void updateScopeFScale(); void updateScopeFScale();
void updateDOA(); void updateDOA();
void leaveEvent(QEvent*) final; void leaveEvent(QEvent*);
void enterEvent(EnterEventType*) final; void enterEvent(EnterEventType*);
private slots: private slots:
void handleSourceMessages(); void handleSourceMessages();
@ -111,7 +112,7 @@ private slots:
void on_squelch_valueChanged(int value); void on_squelch_valueChanged(int value);
void on_fftAveraging_currentIndexChanged(int index); void on_fftAveraging_currentIndexChanged(int index);
void on_centerPosition_clicked(); void on_centerPosition_clicked();
void onWidgetRolled(const QWidget* widget, bool rollDown); void onWidgetRolled(QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p); void onMenuDialogCalled(const QPoint& p);
void tick(); void tick();
}; };

View File

@ -34,7 +34,7 @@
const PluginDescriptor DOA2Plugin::m_pluginDescriptor = { const PluginDescriptor DOA2Plugin::m_pluginDescriptor = {
DOA2::m_channelId, DOA2::m_channelId,
QStringLiteral("DOA 2 sources"), QStringLiteral("DOA 2 sources"),
QStringLiteral("7.22.1"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -44,6 +44,9 @@ private:
int m_dataSize; int m_dataSize;
int m_bufferSize; int m_bufferSize;
int m_dataStart; int m_dataStart;
uint32_t m_log2Decim;
uint32_t m_filterChainHash;
}; };

View File

@ -36,28 +36,22 @@ if (NOT SERVER_MODE)
interferometergui.h interferometergui.h
) )
set(TARGET_NAME ${PLUGINS_PREFIX}interferometer) set(TARGET_NAME interferometer)
set(TARGET_LIB "Qt::Widgets") set(TARGET_LIB "Qt::Widgets")
set(TARGET_LIB_GUI "sdrgui") set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else() else()
set(TARGET_NAME ${PLUGINSSRV_PREFIX}interferometersrv) set(TARGET_NAME interferometersrv)
set(TARGET_LIB "") set(TARGET_LIB "")
set(TARGET_LIB_GUI "") set(TARGET_LIB_GUI "")
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
endif() endif()
if(NOT Qt6_FOUND) add_library(${TARGET_NAME} SHARED
add_library(${TARGET_NAME} ${interferometer_SOURCES}) ${interferometer_SOURCES}
else() )
qt_add_plugin(${TARGET_NAME} CLASS_NAME InterferometerPlugin ${interferometer_SOURCES})
endif()
if(NOT BUILD_SHARED_LIBS) target_link_libraries(${TARGET_NAME}
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core Qt::Core
${TARGET_LIB} ${TARGET_LIB}
sdrbase sdrbase

View File

@ -83,7 +83,7 @@ Interferometer::Interferometer(DeviceAPI *deviceAPI) :
&Interferometer::updateDeviceSetList &Interferometer::updateDeviceSetList
); );
updateDeviceSetList(); updateDeviceSetList();
Interferometer::startSinks(); startSinks();
} }
Interferometer::~Interferometer() Interferometer::~Interferometer()
@ -98,7 +98,7 @@ Interferometer::~Interferometer()
m_deviceAPI->removeChannelSinkAPI(this); m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeMIMOChannel(this); m_deviceAPI->removeMIMOChannel(this);
Interferometer::stopSinks(); stopSinks();
} }
void Interferometer::setDeviceAPI(DeviceAPI *deviceAPI) void Interferometer::setDeviceAPI(DeviceAPI *deviceAPI)
@ -229,7 +229,7 @@ void Interferometer::applySettings(const InterferometerSettings& settings, const
QList<ObjectPipe*> pipes; QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (!pipes.empty()) { if (pipes.size() > 0) {
sendChannelSettings(pipes, settingsKeys, settings, force); sendChannelSettings(pipes, settingsKeys, settings, force);
} }
@ -254,7 +254,7 @@ void Interferometer::handleInputMessages()
{ {
Message* message; Message* message;
while ((message = m_inputMessageQueue.pop()) != nullptr) while ((message = m_inputMessageQueue.pop()) != 0)
{ {
if (handleMessage(*message)) if (handleMessage(*message))
{ {
@ -267,14 +267,14 @@ bool Interferometer::handleMessage(const Message& cmd)
{ {
if (MsgConfigureInterferometer::match(cmd)) if (MsgConfigureInterferometer::match(cmd))
{ {
auto& cfg = (const MsgConfigureInterferometer&) cmd; MsgConfigureInterferometer& cfg = (MsgConfigureInterferometer&) cmd;
qDebug() << "Interferometer::handleMessage: MsgConfigureInterferometer"; qDebug() << "Interferometer::handleMessage: MsgConfigureInterferometer";
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce()); applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
return true; return true;
} }
else if (DSPMIMOSignalNotification::match(cmd)) else if (DSPMIMOSignalNotification::match(cmd))
{ {
auto& notif = (const DSPMIMOSignalNotification&) cmd; DSPMIMOSignalNotification& notif = (DSPMIMOSignalNotification&) cmd;
qDebug() << "Interferometer::handleMessage: DSPMIMOSignalNotification:" qDebug() << "Interferometer::handleMessage: DSPMIMOSignalNotification:"
<< " inputSampleRate: " << notif.getSampleRate() << " inputSampleRate: " << notif.getSampleRate()
@ -355,7 +355,7 @@ void Interferometer::validateFilterChainHash(InterferometerSettings& settings)
void Interferometer::calculateFrequencyOffset(uint32_t log2Decim, uint32_t filterChainHash) void Interferometer::calculateFrequencyOffset(uint32_t log2Decim, uint32_t filterChainHash)
{ {
double shiftFactor = HBFilterChainConverter::getShiftFactor(log2Decim, filterChainHash); double shiftFactor = HBFilterChainConverter::getShiftFactor(log2Decim, filterChainHash);
m_frequencyOffset = (int64_t) (m_deviceSampleRate * shiftFactor); m_frequencyOffset = m_deviceSampleRate * shiftFactor;
} }
void Interferometer::applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash) void Interferometer::applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash)
@ -383,7 +383,7 @@ void Interferometer::updateDeviceSetList()
if (deviceSourceEngine) if (deviceSourceEngine)
{ {
const DeviceSampleSource *deviceSource = deviceSourceEngine->getSource(); DeviceSampleSource *deviceSource = deviceSourceEngine->getSource();
if (deviceSource->getDeviceDescription() == "LocalInput") { if (deviceSource->getDeviceDescription() == "LocalInput") {
m_localInputDeviceIndexes.append(deviceSetIndex); m_localInputDeviceIndexes.append(deviceSetIndex);
@ -401,7 +401,7 @@ void Interferometer::updateDeviceSetList()
InterferometerSettings settings = m_settings; InterferometerSettings settings = m_settings;
int newIndexInList; int newIndexInList;
if (!m_localInputDeviceIndexes.empty()) // there are some local input devices if (m_localInputDeviceIndexes.size() != 0) // there are some local input devices
{ {
if (m_settings.m_localDeviceIndex < 0) { // not set before if (m_settings.m_localDeviceIndex < 0) { // not set before
newIndexInList = 0; // set to first device in list newIndexInList = 0; // set to first device in list
@ -574,13 +574,13 @@ void Interferometer::webapiUpdateChannelSettings(
settings.m_reverseAPIAddress = *response.getInterferometerSettings()->getReverseApiAddress(); settings.m_reverseAPIAddress = *response.getInterferometerSettings()->getReverseApiAddress();
} }
if (channelSettingsKeys.contains("reverseAPIPort")) { if (channelSettingsKeys.contains("reverseAPIPort")) {
settings.m_reverseAPIPort = (uint16_t) response.getInterferometerSettings()->getReverseApiPort(); settings.m_reverseAPIPort = response.getInterferometerSettings()->getReverseApiPort();
} }
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) { if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getInterferometerSettings()->getReverseApiDeviceIndex(); settings.m_reverseAPIDeviceIndex = response.getInterferometerSettings()->getReverseApiDeviceIndex();
} }
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) { if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
settings.m_reverseAPIChannelIndex = (uint16_t) response.getInterferometerSettings()->getReverseApiChannelIndex(); settings.m_reverseAPIChannelIndex = response.getInterferometerSettings()->getReverseApiChannelIndex();
} }
if (settings.m_spectrumGUI && channelSettingsKeys.contains("spectrumConfig")) { if (settings.m_spectrumGUI && channelSettingsKeys.contains("spectrumConfig")) {
settings.m_spectrumGUI->updateFrom(channelSettingsKeys, response.getInterferometerSettings()->getSpectrumConfig()); settings.m_spectrumGUI->updateFrom(channelSettingsKeys, response.getInterferometerSettings()->getSpectrumConfig());
@ -632,7 +632,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
} }
else else
{ {
auto *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum(); SWGSDRangel::SWGGLSpectrum *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
settings.m_spectrumGUI->formatTo(swgGLSpectrum); settings.m_spectrumGUI->formatTo(swgGLSpectrum);
response.getInterferometerSettings()->setSpectrumConfig(swgGLSpectrum); response.getInterferometerSettings()->setSpectrumConfig(swgGLSpectrum);
} }
@ -646,7 +646,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
} }
else else
{ {
auto *swgGLScope = new SWGSDRangel::SWGGLScope(); SWGSDRangel::SWGGLScope *swgGLScope = new SWGSDRangel::SWGGLScope();
settings.m_scopeGUI->formatTo(swgGLScope); settings.m_scopeGUI->formatTo(swgGLScope);
response.getInterferometerSettings()->setScopeConfig(swgGLScope); response.getInterferometerSettings()->setScopeConfig(swgGLScope);
} }
@ -660,7 +660,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
} }
else else
{ {
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker(); SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker); settings.m_channelMarker->formatTo(swgChannelMarker);
response.getInterferometerSettings()->setChannelMarker(swgChannelMarker); response.getInterferometerSettings()->setChannelMarker(swgChannelMarker);
} }
@ -674,7 +674,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
} }
else else
{ {
auto *swgRollupState = new SWGSDRangel::SWGRollupState(); SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState); settings.m_rollupState->formatTo(swgRollupState);
response.getInterferometerSettings()->setRollupState(swgRollupState); response.getInterferometerSettings()->setRollupState(swgRollupState);
} }
@ -683,7 +683,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
void Interferometer::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const InterferometerSettings& settings, bool force) void Interferometer::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const InterferometerSettings& settings, bool force)
{ {
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings") QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
@ -694,8 +694,8 @@ void Interferometer::webapiReverseSendSettings(const QList<QString>& channelSett
m_networkRequest.setUrl(QUrl(channelSettingsURL)); m_networkRequest.setUrl(QUrl(channelSettingsURL));
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
auto *buffer = new QBuffer(); QBuffer *buffer = new QBuffer();
buffer->open(QBuffer::ReadWrite); buffer->open((QBuffer::ReadWrite));
buffer->write(swgChannelSettings->asJson().toUtf8()); buffer->write(swgChannelSettings->asJson().toUtf8());
buffer->seek(0); buffer->seek(0);
@ -710,7 +710,7 @@ void Interferometer::sendChannelSettings(
const QList<ObjectPipe*>& pipes, const QList<ObjectPipe*>& pipes,
const QList<QString>& channelSettingsKeys, const QList<QString>& channelSettingsKeys,
const InterferometerSettings& settings, const InterferometerSettings& settings,
bool force) const bool force)
{ {
for (const auto& pipe : pipes) for (const auto& pipe : pipes)
{ {
@ -718,7 +718,7 @@ void Interferometer::sendChannelSettings(
if (messageQueue) if (messageQueue)
{ {
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create( MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create(
this, this,
@ -736,7 +736,7 @@ void Interferometer::webapiFormatChannelSettings(
SWGSDRangel::SWGChannelSettings *swgChannelSettings, SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const InterferometerSettings& settings, const InterferometerSettings& settings,
bool force bool force
) const )
{ {
swgChannelSettings->setDirection(2); // MIMO sink swgChannelSettings->setDirection(2); // MIMO sink
swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet()); swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet());
@ -774,34 +774,34 @@ void Interferometer::webapiFormatChannelSettings(
if (settings.m_spectrumGUI && (channelSettingsKeys.contains("spectrumConfig") || force)) if (settings.m_spectrumGUI && (channelSettingsKeys.contains("spectrumConfig") || force))
{ {
auto *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum(); SWGSDRangel::SWGGLSpectrum *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
settings.m_spectrumGUI->formatTo(swgGLSpectrum); settings.m_spectrumGUI->formatTo(swgGLSpectrum);
swgInterferometerSettings->setSpectrumConfig(swgGLSpectrum); swgInterferometerSettings->setSpectrumConfig(swgGLSpectrum);
} }
if (settings.m_scopeGUI && (channelSettingsKeys.contains("scopeConfig") || force)) if (settings.m_scopeGUI && (channelSettingsKeys.contains("scopeConfig") || force))
{ {
auto *swgGLScope = new SWGSDRangel::SWGGLScope(); SWGSDRangel::SWGGLScope *swgGLScope = new SWGSDRangel::SWGGLScope();
settings.m_scopeGUI->formatTo(swgGLScope); settings.m_scopeGUI->formatTo(swgGLScope);
swgInterferometerSettings->setScopeConfig(swgGLScope); swgInterferometerSettings->setScopeConfig(swgGLScope);
} }
if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force)) if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force))
{ {
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker(); SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker); settings.m_channelMarker->formatTo(swgChannelMarker);
swgInterferometerSettings->setChannelMarker(swgChannelMarker); swgInterferometerSettings->setChannelMarker(swgChannelMarker);
} }
if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force)) if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force))
{ {
auto *swgRollupState = new SWGSDRangel::SWGRollupState(); SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState); settings.m_rollupState->formatTo(swgRollupState);
swgInterferometerSettings->setRollupState(swgRollupState); swgInterferometerSettings->setRollupState(swgRollupState);
} }
} }
void Interferometer::networkManagerFinished(QNetworkReply *reply) const void Interferometer::networkManagerFinished(QNetworkReply *reply)
{ {
QNetworkReply::NetworkError replyError = reply->error(); QNetworkReply::NetworkError replyError = reply->error();

View File

@ -108,69 +108,72 @@ public:
{ } { }
}; };
explicit Interferometer(DeviceAPI *deviceAPI); Interferometer(DeviceAPI *deviceAPI);
~Interferometer() final; virtual ~Interferometer();
void destroy() final { delete this; } virtual void destroy() { delete this; }
void setDeviceAPI(DeviceAPI *deviceAPI) final; virtual void setDeviceAPI(DeviceAPI *deviceAPI);
DeviceAPI *getDeviceAPI() final { return m_deviceAPI; } virtual DeviceAPI *getDeviceAPI() { return m_deviceAPI; }
void startSinks() final; //!< thread start() virtual void startSinks(); //!< thread start()
void stopSinks() final; //!< thread exit() and wait() virtual void stopSinks(); //!< thread exit() and wait()
void startSources() final { /* not for MIMMO*/ } virtual void startSources() {}
void stopSources() final { /* not for MIMMO*/ } virtual void stopSources() {}
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex) final; virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex);
void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex) final; virtual void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex);
void pushMessage(Message *msg) final { m_inputMessageQueue.push(msg); } virtual void pushMessage(Message *msg) { m_inputMessageQueue.push(msg); }
QString getMIMOName() final { return objectName(); } virtual QString getMIMOName() { return objectName(); }
void getIdentifier(QString& id) final { id = objectName(); } virtual void getIdentifier(QString& id) { id = objectName(); }
QString getIdentifier() const final { return objectName(); } virtual QString getIdentifier() const { return objectName(); }
void getTitle(QString& title) final { title = "Interferometer"; } virtual void getTitle(QString& title) { title = "Interferometer"; }
qint64 getCenterFrequency() const final { return m_frequencyOffset; } virtual qint64 getCenterFrequency() const { return m_frequencyOffset; }
void setCenterFrequency(qint64) final { /* not for MIMMO*/ } virtual void setCenterFrequency(qint64) {}
uint32_t getDeviceSampleRate() const { return m_deviceSampleRate; } uint32_t getDeviceSampleRate() const { return m_deviceSampleRate; }
QByteArray serialize() const final; virtual QByteArray serialize() const;
bool deserialize(const QByteArray& data) final; virtual bool deserialize(const QByteArray& data);
int getNbSinkStreams() const final { return 2; } virtual int getNbSinkStreams() const { return 2; }
int getNbSourceStreams() const final { return 0; } virtual int getNbSourceStreams() const { return 0; }
int getStreamIndex() const final { return -1; } virtual int getStreamIndex() const { return -1; }
qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const final virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
{ {
(void) streamIndex; (void) streamIndex;
(void) sinkElseSource; (void) sinkElseSource;
return m_frequencyOffset; return m_frequencyOffset;
} }
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
MessageQueue *getMessageQueueToGUI() { return m_guiMessageQueue; }
SpectrumVis *getSpectrumVis() { return &m_spectrumVis; } SpectrumVis *getSpectrumVis() { return &m_spectrumVis; }
ScopeVis *getScopeVis() { return &m_scopeSink; } ScopeVis *getScopeVis() { return &m_scopeSink; }
void applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash); void applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash);
const QList<int>& getDeviceSetList() { return m_localInputDeviceIndexes; } const QList<int>& getDeviceSetList() { return m_localInputDeviceIndexes; }
int webapiSettingsGet( virtual int webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response, SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final; QString& errorMessage);
int webapiSettingsPutPatch( virtual int webapiSettingsPutPatch(
bool force, bool force,
const QStringList& channelSettingsKeys, const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response, SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final; QString& errorMessage);
int webapiWorkspaceGet( virtual int webapiWorkspaceGet(
SWGSDRangel::SWGWorkspaceInfo& query, SWGSDRangel::SWGWorkspaceInfo& query,
QString& errorMessage) final; QString& errorMessage);
static void webapiFormatChannelSettings( static void webapiFormatChannelSettings(
SWGSDRangel::SWGChannelSettings& response, SWGSDRangel::SWGChannelSettings& response,
const InterferometerSettings& settings); const InterferometerSettings& settings);
static void webapiUpdateChannelSettings( static void webapiUpdateChannelSettings(
InterferometerSettings& settings, InterferometerSettings& settings,
const QStringList& channelSettingsKeys, const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response); SWGSDRangel::SWGChannelSettings& response);
static const char* const m_channelIdURI; static const char* const m_channelIdURI;
static const char* const m_channelId; static const char* const m_channelId;
@ -193,10 +196,11 @@ private:
uint64_t m_centerFrequency; uint64_t m_centerFrequency;
int64_t m_frequencyOffset; int64_t m_frequencyOffset;
uint32_t m_deviceSampleRate; uint32_t m_deviceSampleRate;
int m_count0, m_count1;
QList<int> m_localInputDeviceIndexes; QList<int> m_localInputDeviceIndexes;
bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed virtual bool handleMessage(const Message& cmd); //!< Processing of a message. Returns true if message has actually been processed
void applySettings(const InterferometerSettings& settings, const QList<QString>& settingsKeys, bool force = false); void applySettings(const InterferometerSettings& settings, const QList<QString>& settingsKeys, bool force = false);
static void validateFilterChainHash(InterferometerSettings& settings); static void validateFilterChainHash(InterferometerSettings& settings);
void calculateFrequencyOffset(uint32_t log2Decim, uint32_t filterChainHash); void calculateFrequencyOffset(uint32_t log2Decim, uint32_t filterChainHash);
@ -209,17 +213,17 @@ private:
const QList<QString>& channelSettingsKeys, const QList<QString>& channelSettingsKeys,
const InterferometerSettings& settings, const InterferometerSettings& settings,
bool force bool force
) const; );
void webapiFormatChannelSettings( void webapiFormatChannelSettings(
const QList<QString>& channelSettingsKeys, const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings, SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const InterferometerSettings& settings, const InterferometerSettings& settings,
bool force bool force
) const; );
private slots: private slots:
void handleInputMessages(); void handleInputMessages();
void networkManagerFinished(QNetworkReply *reply) const; void networkManagerFinished(QNetworkReply *reply);
}; };
#endif // INCLUDE_INTERFEROMETER_H #endif // INCLUDE_INTERFEROMETER_H

View File

@ -555,7 +555,7 @@ bool InterferometerCorrelator::performFFTProd(
m_fft2[0]->out() + m_fftSize, m_fft2[0]->out() + m_fftSize,
m_dataj, m_dataj,
m_invFFT2->in(), m_invFFT2->in(),
[](std::complex<float>& a, const std::complex<float>& b) -> std::complex<float> { [this](std::complex<float>& a, const std::complex<float>& b) -> std::complex<float> {
return (a*b); return (a*b);
} }
); );

View File

@ -32,10 +32,15 @@
InterferometerGUI* InterferometerGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *channelMIMO) InterferometerGUI* InterferometerGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *channelMIMO)
{ {
auto* gui = new InterferometerGUI(pluginAPI, deviceUISet, channelMIMO); InterferometerGUI* gui = new InterferometerGUI(pluginAPI, deviceUISet, channelMIMO);
return gui; return gui;
} }
void InterferometerGUI::destroy()
{
delete this;
}
void InterferometerGUI::resetToDefaults() void InterferometerGUI::resetToDefaults()
{ {
m_settings.resetToDefaults(); m_settings.resetToDefaults();
@ -72,7 +77,7 @@ bool InterferometerGUI::handleMessage(const Message& message)
{ {
if (Interferometer::MsgBasebandNotification::match(message)) if (Interferometer::MsgBasebandNotification::match(message))
{ {
auto& notif = (const Interferometer::MsgBasebandNotification&) message; Interferometer::MsgBasebandNotification& notif = (Interferometer::MsgBasebandNotification&) message;
m_sampleRate = notif.getSampleRate(); m_sampleRate = notif.getSampleRate();
m_centerFrequency = notif.getCenterFrequency(); m_centerFrequency = notif.getCenterFrequency();
displayRateAndShift(); displayRateAndShift();
@ -81,7 +86,7 @@ bool InterferometerGUI::handleMessage(const Message& message)
} }
else if (Interferometer::MsgConfigureInterferometer::match(message)) else if (Interferometer::MsgConfigureInterferometer::match(message))
{ {
auto& cfg = (const Interferometer::MsgConfigureInterferometer&) message; const Interferometer::MsgConfigureInterferometer& cfg = (const Interferometer::MsgConfigureInterferometer&) message;
if (cfg.getForce()) { if (cfg.getForce()) {
m_settings = cfg.getSettings(); m_settings = cfg.getSettings();
@ -97,8 +102,7 @@ bool InterferometerGUI::handleMessage(const Message& message)
} }
else if (Interferometer::MsgReportDevices::match(message)) else if (Interferometer::MsgReportDevices::match(message))
{ {
auto& msg = const_cast<Message&>(message); Interferometer::MsgReportDevices& report = (Interferometer::MsgReportDevices&) message;
auto& report = (Interferometer::MsgReportDevices&) msg;
updateDeviceSetList(report.getDeviceSetIndexes()); updateDeviceSetList(report.getDeviceSetIndexes());
return true; return true;
} }
@ -131,7 +135,7 @@ InterferometerGUI::InterferometerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUI
m_spectrumVis->setGLSpectrum(ui->glSpectrum); m_spectrumVis->setGLSpectrum(ui->glSpectrum);
m_scopeVis = m_interferometer->getScopeVis(); m_scopeVis = m_interferometer->getScopeVis();
m_scopeVis->setGLScope(ui->glScope); m_scopeVis->setGLScope(ui->glScope);
m_interferometer->setMessageQueueToGUI(InterferometerGUI::getInputMessageQueue()); m_interferometer->setMessageQueueToGUI(getInputMessageQueue());
m_sampleRate = m_interferometer->getDeviceSampleRate(); m_sampleRate = m_interferometer->getDeviceSampleRate();
ui->spectrumGUI->setBuddies(m_spectrumVis, ui->glSpectrum); ui->spectrumGUI->setBuddies(m_spectrumVis, ui->glSpectrum);
@ -171,7 +175,7 @@ InterferometerGUI::InterferometerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUI
m_scopeVis->setTraceChunkSize(Interferometer::m_fftSize); // Set scope trace length unit to FFT size m_scopeVis->setTraceChunkSize(Interferometer::m_fftSize); // Set scope trace length unit to FFT size
ui->scopeGUI->traceLengthChange(); ui->scopeGUI->traceLengthChange();
connect(InterferometerGUI::getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages())); connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
updateDeviceSetList(m_interferometer->getDeviceSetList()); updateDeviceSetList(m_interferometer->getDeviceSetList());
displaySettings(); displaySettings();
@ -239,15 +243,15 @@ void InterferometerGUI::displaySettings()
void InterferometerGUI::displayRateAndShift() void InterferometerGUI::displayRateAndShift()
{ {
auto shift = (int) (m_shiftFrequencyFactor * m_sampleRate); int shift = m_shiftFrequencyFactor * m_sampleRate;
double channelSampleRate = ((double) m_sampleRate) / (1<<m_settings.m_log2Decim); double channelSampleRate = ((double) m_sampleRate) / (1<<m_settings.m_log2Decim);
QLocale loc; QLocale loc;
ui->offsetFrequencyText->setText(tr("%1 Hz").arg(loc.toString(shift))); ui->offsetFrequencyText->setText(tr("%1 Hz").arg(loc.toString(shift)));
ui->channelRateText->setText(tr("%1k").arg(QString::number(channelSampleRate / 1000.0, 'g', 5))); ui->channelRateText->setText(tr("%1k").arg(QString::number(channelSampleRate / 1000.0, 'g', 5)));
m_channelMarker.setCenterFrequency(shift); m_channelMarker.setCenterFrequency(shift);
m_channelMarker.setBandwidth((int) channelSampleRate); m_channelMarker.setBandwidth(channelSampleRate);
ui->glSpectrum->setSampleRate((int) channelSampleRate); ui->glSpectrum->setSampleRate(channelSampleRate);
m_scopeVis->setLiveRate((int) channelSampleRate); m_scopeVis->setLiveRate(channelSampleRate);
} }
void InterferometerGUI::leaveEvent(QEvent*) void InterferometerGUI::leaveEvent(QEvent*)
@ -264,7 +268,7 @@ void InterferometerGUI::handleSourceMessages()
{ {
Message* message; Message* message;
while ((message = getInputMessageQueue()->pop()) != nullptr) while ((message = getInputMessageQueue()->pop()) != 0)
{ {
if (handleMessage(*message)) if (handleMessage(*message))
{ {
@ -273,7 +277,7 @@ void InterferometerGUI::handleSourceMessages()
} }
} }
void InterferometerGUI::onWidgetRolled(const QWidget* widget, bool rollDown) void InterferometerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
{ {
(void) widget; (void) widget;
(void) rollDown; (void) rollDown;
@ -284,7 +288,7 @@ void InterferometerGUI::onWidgetRolled(const QWidget* widget, bool rollDown)
void InterferometerGUI::onMenuDialogCalled(const QPoint &p) void InterferometerGUI::onMenuDialogCalled(const QPoint &p)
{ {
if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings) if (m_contextMenuType == ContextMenuChannelSettings)
{ {
BasicChannelSettingsDialog dialog(&m_channelMarker, this); BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI); dialog.setUseReverseAPI(m_settings.m_useReverseAPI);
@ -326,7 +330,7 @@ void InterferometerGUI::onMenuDialogCalled(const QPoint &p)
void InterferometerGUI::updateDeviceSetList(const QList<int>& deviceSetIndexes) void InterferometerGUI::updateDeviceSetList(const QList<int>& deviceSetIndexes)
{ {
auto it = deviceSetIndexes.begin(); QList<int>::const_iterator it = deviceSetIndexes.begin();
ui->localDevice->blockSignals(true); ui->localDevice->blockSignals(true);
@ -339,7 +343,7 @@ void InterferometerGUI::updateDeviceSetList(const QList<int>& deviceSetIndexes)
ui->localDevice->blockSignals(false); ui->localDevice->blockSignals(false);
} }
int InterferometerGUI::getLocalDeviceIndexInCombo(int localDeviceIndex) const int InterferometerGUI::getLocalDeviceIndexInCombo(int localDeviceIndex)
{ {
int index = 0; int index = 0;
@ -453,7 +457,7 @@ void InterferometerGUI::tick()
} }
} }
void InterferometerGUI::makeUIConnections() const void InterferometerGUI::makeUIConnections()
{ {
QObject::connect(ui->decimationFactor, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &InterferometerGUI::on_decimationFactor_currentIndexChanged); QObject::connect(ui->decimationFactor, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &InterferometerGUI::on_decimationFactor_currentIndexChanged);
QObject::connect(ui->position, &QSlider::valueChanged, this, &InterferometerGUI::on_position_valueChanged); QObject::connect(ui->position, &QSlider::valueChanged, this, &InterferometerGUI::on_position_valueChanged);
@ -468,5 +472,5 @@ void InterferometerGUI::makeUIConnections() const
void InterferometerGUI::updateAbsoluteCenterFrequency() void InterferometerGUI::updateAbsoluteCenterFrequency()
{ {
setStatusFrequency((qint64) ((double) m_centerFrequency + m_shiftFrequencyFactor * m_sampleRate)); setStatusFrequency(m_centerFrequency + m_shiftFrequencyFactor * m_sampleRate);
} }

View File

@ -46,21 +46,22 @@ class InterferometerGUI : public ChannelGUI {
public: public:
static InterferometerGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel); static InterferometerGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel);
void resetToDefaults() final; virtual void destroy();
QByteArray serialize() const final; virtual void resetToDefaults();
bool deserialize(const QByteArray& data) final; virtual QByteArray serialize() const;
MessageQueue* getInputMessageQueue() final; virtual bool deserialize(const QByteArray& data);
void setWorkspaceIndex(int index) final { m_settings.m_workspaceIndex = index; }; virtual MessageQueue* getInputMessageQueue();
int getWorkspaceIndex() const final { return m_settings.m_workspaceIndex; }; virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; };
void setGeometryBytes(const QByteArray& blob) final { m_settings.m_geometryBytes = blob; }; virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; };
QByteArray getGeometryBytes() const final { return m_settings.m_geometryBytes; }; virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; };
QString getTitle() const final { return m_settings.m_title; }; virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; };
QColor getTitleColor() const final { return m_settings.m_rgbColor; }; virtual QString getTitle() const { return m_settings.m_title; };
void zetHidden(bool hidden) final { m_settings.m_hidden = hidden; } virtual QColor getTitleColor() const { return m_settings.m_rgbColor; };
bool getHidden() const final { return m_settings.m_hidden; } virtual void zetHidden(bool hidden) { m_settings.m_hidden = hidden; }
ChannelMarker& getChannelMarker() final { return m_channelMarker; } virtual bool getHidden() const { return m_settings.m_hidden; }
int getStreamIndex() const final { return -1; } virtual ChannelMarker& getChannelMarker() { return m_channelMarker; }
void setStreamIndex(int streamIndex) final { (void) streamIndex; } virtual int getStreamIndex() const { return -1; }
virtual void setStreamIndex(int streamIndex) { (void) streamIndex; }
private: private:
Ui::InterferometerGUI* ui; Ui::InterferometerGUI* ui;
@ -82,7 +83,7 @@ private:
uint32_t m_tickCount; uint32_t m_tickCount;
explicit InterferometerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *rxChannel, QWidget* parent = nullptr); explicit InterferometerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *rxChannel, QWidget* parent = nullptr);
~InterferometerGUI() final; virtual ~InterferometerGUI();
void blockApplySettings(bool block); void blockApplySettings(bool block);
void applySettings(bool force = false); void applySettings(bool force = false);
@ -91,13 +92,13 @@ private:
void displaySettings(); void displaySettings();
void displayRateAndShift(); void displayRateAndShift();
bool handleMessage(const Message& message); bool handleMessage(const Message& message);
void makeUIConnections() const; void makeUIConnections();
void updateAbsoluteCenterFrequency(); void updateAbsoluteCenterFrequency();
void updateDeviceSetList(const QList<int>& deviceSetIndexes); void updateDeviceSetList(const QList<int>& deviceSetIndexes);
int getLocalDeviceIndexInCombo(int localDeviceIndex) const; int getLocalDeviceIndexInCombo(int localDeviceIndex);
void leaveEvent(QEvent*) final; void leaveEvent(QEvent*);
void enterEvent(EnterEventType*) final; void enterEvent(EnterEventType*);
private slots: private slots:
void handleSourceMessages(); void handleSourceMessages();
@ -110,7 +111,7 @@ private slots:
void on_correlationType_currentIndexChanged(int index); void on_correlationType_currentIndexChanged(int index);
void on_localDevice_currentIndexChanged(int index); void on_localDevice_currentIndexChanged(int index);
void on_localDevicePlay_toggled(bool checked); void on_localDevicePlay_toggled(bool checked);
void onWidgetRolled(const QWidget* widget, bool rollDown); void onWidgetRolled(QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p); void onMenuDialogCalled(const QPoint& p);
void tick(); void tick();
}; };

View File

@ -34,7 +34,7 @@
const PluginDescriptor InterferometerPlugin::m_pluginDescriptor = { const PluginDescriptor InterferometerPlugin::m_pluginDescriptor = {
Interferometer::m_channelId, Interferometer::m_channelId,
QStringLiteral("Interferometer"), QStringLiteral("Interferometer"),
QStringLiteral("7.22.1"), QStringLiteral("7.21.4"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -44,6 +44,9 @@ private:
int m_dataSize; int m_dataSize;
int m_bufferSize; int m_bufferSize;
int m_dataStart; int m_dataStart;
uint32_t m_log2Decim;
uint32_t m_filterChainHash;
}; };

View File

@ -211,26 +211,6 @@ else()
message(STATUS "Not building wdsprx (ENABLE_CHANNELRX_WDSPRX=${ENABLE_CHANNELRX_WDSPRX} WDSP_SUPPORT=${WDSP_SUPPORT})") message(STATUS "Not building wdsprx (ENABLE_CHANNELRX_WDSPRX=${ENABLE_CHANNELRX_WDSPRX} WDSP_SUPPORT=${WDSP_SUPPORT})")
endif() endif()
# need ffmpeg 3.1 that correstonds to
# libavutil 55.27.100
# libavcodec 57.48.101
# libavformat 57.40.101
find_package(FFmpeg COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE)
if (ENABLE_CHANNELRX_DEMODDATV AND FFMPEG_FOUND)
if(WIN32)
add_subdirectory(demoddatv)
else()
if(((AVUTIL_VERSION VERSION_GREATER "55.27.99") AND (AVCODEC_VERSION VERSION_GREATER "57.48.101")) OR FFMPEG_EXTERNAL OR FFMPEG_SKIP_CHECK)
message(STATUS "Include demoddatv")
add_subdirectory(demoddatv)
else()
message(STATUS "FFmpeg too old to compile demoddatv; needs at least avutil: 55.27.100, avcodec/avformat: 57.48.101")
endif()
endif()
else()
message(STATUS "Not building demoddatv (ENABLE_CHANNELRX_DEMODDATV=${ENABLE_CHANNELRX_DEMODDATV} FFMPEG_FOUND=${FFMPEG_FOUND})")
endif()
if(NOT SERVER_MODE) if(NOT SERVER_MODE)
if (ENABLE_CHANNELRX_HEATMAP) if (ENABLE_CHANNELRX_HEATMAP)
@ -250,4 +230,25 @@ if(NOT SERVER_MODE)
else() else()
message(STATUS "Not building demodatv (ENABLE_CHANNELRX_DEMODATV=${ENABLE_CHANNELRX_DEMODATV})") message(STATUS "Not building demodatv (ENABLE_CHANNELRX_DEMODATV=${ENABLE_CHANNELRX_DEMODATV})")
endif() endif()
# need ffmpeg 3.1 that correstonds to
# libavutil 55.27.100
# libavcodec 57.48.101
# libavformat 57.40.101
find_package(FFmpeg COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE)
if (ENABLE_CHANNELRX_DEMODDATV AND FFMPEG_FOUND)
if(WIN32)
add_subdirectory(demoddatv)
else()
if(((AVUTIL_VERSION VERSION_GREATER "55.27.99") AND (AVCODEC_VERSION VERSION_GREATER "57.48.101")) OR FFMPEG_EXTERNAL OR FFMPEG_SKIP_CHECK)
message(STATUS "Include demoddatv")
add_subdirectory(demoddatv)
else()
message(STATUS "FFmpeg too old to compile demoddatv; needs at least avutil: 55.27.100, avcodec/avformat: 57.48.101")
endif()
endif()
else()
message(STATUS "Not building demoddatv (ENABLE_CHANNELRX_DEMODDATV=${ENABLE_CHANNELRX_DEMODDATV} FFMPEG_FOUND=${FFMPEG_FOUND})")
endif()
endif() endif()

View File

@ -26,20 +26,14 @@ include_directories(
${Boost_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}
) )
set(TARGET_NAME ${PLUGINS_PREFIX}chanalyzer) set(TARGET_NAME chanalyzer)
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
if(NOT Qt6_FOUND) add_library(${TARGET_NAME} SHARED
add_library(${TARGET_NAME} ${chanalyzer_SOURCES}) ${chanalyzer_SOURCES}
else() )
qt_add_plugin(${TARGET_NAME} CLASS_NAME ChannelAnalyzerPlugin ${chanalyzer_SOURCES})
endif()
if(NOT BUILD_SHARED_LIBS) target_link_libraries(${TARGET_NAME}
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core Qt::Core
Qt::Widgets Qt::Widgets
sdrbase sdrbase

View File

@ -88,7 +88,7 @@ ChannelAnalyzer::~ChannelAnalyzer()
delete m_networkManager; delete m_networkManager;
m_deviceAPI->removeChannelSinkAPI(this); m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this, true); m_deviceAPI->removeChannelSink(this);
if (m_basebandSink->isRunning()) { if (m_basebandSink->isRunning()) {
stop(); stop();
@ -103,7 +103,7 @@ void ChannelAnalyzer::setDeviceAPI(DeviceAPI *deviceAPI)
if (deviceAPI != m_deviceAPI) if (deviceAPI != m_deviceAPI)
{ {
m_deviceAPI->removeChannelSinkAPI(this); m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this, false); m_deviceAPI->removeChannelSink(this);
m_deviceAPI = deviceAPI; m_deviceAPI = deviceAPI;
m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this); m_deviceAPI->addChannelSinkAPI(this);

View File

@ -474,7 +474,7 @@ void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
void ChannelAnalyzerGUI::onMenuDialogCalled(const QPoint& p) void ChannelAnalyzerGUI::onMenuDialogCalled(const QPoint& p)
{ {
if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings) if (m_contextMenuType == ContextMenuChannelSettings)
{ {
BasicChannelSettingsDialog dialog(&m_channelMarker, this); BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI); dialog.setUseReverseAPI(m_settings.m_useReverseAPI);

View File

@ -27,7 +27,7 @@
const PluginDescriptor ChannelAnalyzerPlugin::m_pluginDescriptor = { const PluginDescriptor ChannelAnalyzerPlugin::m_pluginDescriptor = {
ChannelAnalyzer::m_channelId, ChannelAnalyzer::m_channelId,
QStringLiteral("Channel Analyzer"), QStringLiteral("Channel Analyzer"),
QStringLiteral("7.22.5"), QStringLiteral("7.20.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,28 +33,22 @@ if(NOT SERVER_MODE)
channelpowergui.h channelpowergui.h
) )
set(TARGET_NAME ${PLUGINS_PREFIX}channelpower) set(TARGET_NAME channelpower)
set(TARGET_LIB "Qt::Widgets") set(TARGET_LIB "Qt::Widgets")
set(TARGET_LIB_GUI "sdrgui") set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else() else()
set(TARGET_NAME ${PLUGINSSRV_PREFIX}channelpowersrv) set(TARGET_NAME channelpowersrv)
set(TARGET_LIB "") set(TARGET_LIB "")
set(TARGET_LIB_GUI "") set(TARGET_LIB_GUI "")
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
endif() endif()
if(NOT Qt6_FOUND) add_library(${TARGET_NAME} SHARED
add_library(${TARGET_NAME} ${channelpower_SOURCES}) ${channelpower_SOURCES}
else() )
qt_add_plugin(${TARGET_NAME} CLASS_NAME ChannelPowerPlugin ${channelpower_SOURCES})
endif()
if(NOT BUILD_SHARED_LIBS) target_link_libraries(${TARGET_NAME}
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core Qt::Core
${TARGET_LIB} ${TARGET_LIB}
sdrbase sdrbase

View File

@ -49,7 +49,7 @@ ChannelPower::ChannelPower(DeviceAPI *deviceAPI) :
{ {
setObjectName(m_channelId); setObjectName(m_channelId);
m_basebandSink = new ChannelPowerBaseband(); m_basebandSink = new ChannelPowerBaseband(this);
m_basebandSink->setChannel(this); m_basebandSink->setChannel(this);
m_basebandSink->moveToThread(&m_thread); m_basebandSink->moveToThread(&m_thread);
@ -84,7 +84,7 @@ ChannelPower::~ChannelPower()
); );
delete m_networkManager; delete m_networkManager;
m_deviceAPI->removeChannelSinkAPI(this); m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this, true); m_deviceAPI->removeChannelSink(this);
if (m_basebandSink->isRunning()) { if (m_basebandSink->isRunning()) {
stop(); stop();
@ -98,7 +98,7 @@ void ChannelPower::setDeviceAPI(DeviceAPI *deviceAPI)
if (deviceAPI != m_deviceAPI) if (deviceAPI != m_deviceAPI)
{ {
m_deviceAPI->removeChannelSinkAPI(this); m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this, false); m_deviceAPI->removeChannelSink(this);
m_deviceAPI = deviceAPI; m_deviceAPI = deviceAPI;
m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this); m_deviceAPI->addChannelSinkAPI(this);

View File

@ -138,6 +138,11 @@ public:
m_basebandSink->resetMagLevels(); m_basebandSink->resetMagLevels();
} }
/* void setMessageQueueToGUI(MessageQueue* queue) override {
ChannelAPI::setMessageQueueToGUI(queue);
m_basebandSink->setMessageQueueToGUI(queue);
}*/
uint32_t getNumberOfDeviceStreams() const; uint32_t getNumberOfDeviceStreams() const;
static const char * const m_channelIdURI; static const char * const m_channelIdURI;

View File

@ -25,7 +25,8 @@
MESSAGE_CLASS_DEFINITION(ChannelPowerBaseband::MsgConfigureChannelPowerBaseband, Message) MESSAGE_CLASS_DEFINITION(ChannelPowerBaseband::MsgConfigureChannelPowerBaseband, Message)
ChannelPowerBaseband::ChannelPowerBaseband() : ChannelPowerBaseband::ChannelPowerBaseband(ChannelPower *channelPower) :
m_sink(channelPower),
m_running(false) m_running(false)
{ {
qDebug("ChannelPowerBaseband::ChannelPowerBaseband"); qDebug("ChannelPowerBaseband::ChannelPowerBaseband");

View File

@ -62,7 +62,7 @@ public:
{ } { }
}; };
ChannelPowerBaseband(); ChannelPowerBaseband(ChannelPower *channelPower);
~ChannelPowerBaseband(); ~ChannelPowerBaseband();
void reset(); void reset();
void startWork(); void startWork();

View File

@ -200,7 +200,7 @@ void ChannelPowerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
void ChannelPowerGUI::onMenuDialogCalled(const QPoint &p) void ChannelPowerGUI::onMenuDialogCalled(const QPoint &p)
{ {
if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings) if (m_contextMenuType == ContextMenuChannelSettings)
{ {
BasicChannelSettingsDialog dialog(&m_channelMarker, this); BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI); dialog.setUseReverseAPI(m_settings.m_useReverseAPI);

View File

@ -29,7 +29,7 @@
const PluginDescriptor ChannelPowerPlugin::m_pluginDescriptor = { const PluginDescriptor ChannelPowerPlugin::m_pluginDescriptor = {
ChannelPower::m_channelId, ChannelPower::m_channelId,
QStringLiteral("Channel Power"), QStringLiteral("Channel Power"),
QStringLiteral("7.22.5"), QStringLiteral("7.21.2"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -20,7 +20,8 @@
#include "channelpowersink.h" #include "channelpowersink.h"
ChannelPowerSink::ChannelPowerSink() : ChannelPowerSink::ChannelPowerSink(ChannelPower *channelPower) :
m_channelPower(channelPower),
m_channelSampleRate(10000), m_channelSampleRate(10000),
m_channelFrequencyOffset(0), m_channelFrequencyOffset(0),
m_lowpassFFT(nullptr), m_lowpassFFT(nullptr),
@ -40,6 +41,7 @@ ChannelPowerSink::~ChannelPowerSink()
void ChannelPowerSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end) void ChannelPowerSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end)
{ {
QMutexLocker mutexLocker(&m_mutex); QMutexLocker mutexLocker(&m_mutex);
Complex ci;
for (SampleVector::const_iterator it = begin; it != end; ++it) for (SampleVector::const_iterator it = begin; it != end; ++it)
{ {

View File

@ -32,7 +32,7 @@ class ChannelPower;
class ChannelPowerSink : public ChannelSampleSink { class ChannelPowerSink : public ChannelSampleSink {
public: public:
ChannelPowerSink(); ChannelPowerSink(ChannelPower *channelPower);
~ChannelPowerSink(); ~ChannelPowerSink();
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
@ -65,6 +65,7 @@ public:
private: private:
ChannelPower *m_channelPower;
ChannelPowerSettings m_settings; ChannelPowerSettings m_settings;
ChannelAPI *m_channel; ChannelAPI *m_channel;
int m_channelSampleRate; int m_channelSampleRate;

View File

@ -28,6 +28,7 @@ set(adsb_HEADERS
include_directories( include_directories(
${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
${Boost_INCLUDE_DIRS}
) )
if(NOT SERVER_MODE) if(NOT SERVER_MODE)
@ -42,11 +43,10 @@ if(NOT SERVER_MODE)
adsbdemodnotificationdialog.cpp adsbdemodnotificationdialog.cpp
adsbdemodnotificationdialog.ui adsbdemodnotificationdialog.ui
adsbosmtemplateserver.cpp adsbosmtemplateserver.cpp
adsbdemodmap.qrc
adsbdemodicons.qrc
airlinelogos.qrc airlinelogos.qrc
flags.qrc flags.qrc
sideviews.qrc map.qrc
icons.qrc
) )
set(adsb_HEADERS set(adsb_HEADERS
${adsb_HEADERS} ${adsb_HEADERS}
@ -59,34 +59,27 @@ if(NOT SERVER_MODE)
osndb.h osndb.h
) )
set(TARGET_NAME ${PLUGINS_PREFIX}demodadsb) set(TARGET_NAME demodadsb)
set(TARGET_LIB Qt::Widgets Qt::Quick Qt::QuickWidgets Qt::Positioning Qt::Charts) set(TARGET_LIB Qt::Widgets Qt::Quick Qt::QuickWidgets Qt::Positioning Qt::Location Qt::TextToSpeech)
if(Qt${QT_DEFAULT_MAJOR_VERSION}Location_FOUND)
list(APPEND TARGET_LIB Qt::Location)
endif()
if(Qt${QT_DEFAULT_MAJOR_VERSION}TextToSpeech_FOUND)
list(APPEND TARGET_LIB Qt::TextToSpeech)
endif()
set(TARGET_LIB_GUI "sdrgui") set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else() else()
set(TARGET_NAME ${PLUGINSSRV_PREFIX}demodadsbsrv) set(TARGET_NAME demodadsbsrv)
set(TARGET_LIB "") set(TARGET_LIB "")
set(TARGET_LIB_GUI "") set(TARGET_LIB_GUI "")
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR}) set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
endif() endif()
if(NOT Qt6_FOUND) add_library(${TARGET_NAME} SHARED
add_library(${TARGET_NAME} ${adsb_SOURCES}) ${adsb_SOURCES}
else() )
qt_add_plugin(${TARGET_NAME} CLASS_NAME ADSBPlugin ${adsb_SOURCES})
if (NOT WIN32)
link_directories(${Boost_LIBRARY_DIRS})
endif() endif()
if(NOT BUILD_SHARED_LIBS) target_link_libraries(${TARGET_NAME}
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME}) Boost::disable_autolinking
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core Qt::Core
${TARGET_LIB} ${TARGET_LIB}
sdrbase sdrbase

View File

@ -17,6 +17,10 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // // along with this program. If not, see <http://www.gnu.org/licenses/>. //
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#define BOOST_CHRONO_HEADER_ONLY
#include <boost/chrono/chrono.hpp>
#include <stdio.h>
#include <complex.h> #include <complex.h>
#include <QTime> #include <QTime>
@ -45,7 +49,6 @@
MESSAGE_CLASS_DEFINITION(ADSBDemod::MsgConfigureADSBDemod, Message) MESSAGE_CLASS_DEFINITION(ADSBDemod::MsgConfigureADSBDemod, Message)
MESSAGE_CLASS_DEFINITION(ADSBDemod::MsgAircraftReport, Message) MESSAGE_CLASS_DEFINITION(ADSBDemod::MsgAircraftReport, Message)
MESSAGE_CLASS_DEFINITION(ADSBDemod::MsgResetStats, Message)
const char* const ADSBDemod::m_channelIdURI = "sdrangel.channel.adsbdemod"; const char* const ADSBDemod::m_channelIdURI = "sdrangel.channel.adsbdemod";
const char* const ADSBDemod::m_channelId = "ADSBDemod"; const char* const ADSBDemod::m_channelId = "ADSBDemod";
@ -68,7 +71,7 @@ ADSBDemod::ADSBDemod(DeviceAPI *devieAPI) :
m_worker = new ADSBDemodWorker(); m_worker = new ADSBDemodWorker();
m_basebandSink->setMessageQueueToWorker(m_worker->getInputMessageQueue()); m_basebandSink->setMessageQueueToWorker(m_worker->getInputMessageQueue());
applySettings(m_settings, QStringList(), true); applySettings(m_settings, true);
m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this); m_deviceAPI->addChannelSinkAPI(this);
@ -101,9 +104,9 @@ ADSBDemod::~ADSBDemod()
); );
delete m_networkManager; delete m_networkManager;
m_deviceAPI->removeChannelSinkAPI(this); m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this, true); m_deviceAPI->removeChannelSink(this);
delete m_basebandSink; // This results in a call to ADSBDemod::stop(), so need to delete before worker and thread
delete m_worker; delete m_worker;
delete m_basebandSink;
delete m_thread; delete m_thread;
} }
@ -112,7 +115,7 @@ void ADSBDemod::setDeviceAPI(DeviceAPI *deviceAPI)
if (deviceAPI != m_deviceAPI) if (deviceAPI != m_deviceAPI)
{ {
m_deviceAPI->removeChannelSinkAPI(this); m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this, false); m_deviceAPI->removeChannelSink(this);
m_deviceAPI = deviceAPI; m_deviceAPI = deviceAPI;
m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this); m_deviceAPI->addChannelSinkAPI(this);
@ -144,7 +147,7 @@ void ADSBDemod::start()
m_basebandSink->startWork(); m_basebandSink->startWork();
m_thread->start(); m_thread->start();
ADSBDemodWorker::MsgConfigureADSBDemodWorker *msg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(m_settings, QStringList(), true); ADSBDemodWorker::MsgConfigureADSBDemodWorker *msg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(m_settings, true);
m_worker->getInputMessageQueue()->push(msg); m_worker->getInputMessageQueue()->push(msg);
} }
@ -154,9 +157,7 @@ void ADSBDemod::stop()
m_basebandSink->stopWork(); m_basebandSink->stopWork();
m_worker->stopWork(); m_worker->stopWork();
m_thread->exit(); m_thread->exit();
#ifndef __EMSCRIPTEN__
m_thread->wait(); m_thread->wait();
#endif
} }
bool ADSBDemod::handleMessage(const Message& cmd) bool ADSBDemod::handleMessage(const Message& cmd)
@ -166,7 +167,7 @@ bool ADSBDemod::handleMessage(const Message& cmd)
MsgConfigureADSBDemod& cfg = (MsgConfigureADSBDemod&) cmd; MsgConfigureADSBDemod& cfg = (MsgConfigureADSBDemod&) cmd;
qDebug() << "ADSBDemod::handleMessage: MsgConfigureADSBDemod"; qDebug() << "ADSBDemod::handleMessage: MsgConfigureADSBDemod";
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce()); applySettings(cfg.getSettings(), cfg.getForce());
return true; return true;
} }
@ -191,25 +192,118 @@ bool ADSBDemod::handleMessage(const Message& cmd)
m_aircraftReport = msg.getReport(); m_aircraftReport = msg.getReport();
return true; return true;
} }
else if (MsgResetStats::match(cmd))
{
MsgResetStats& msg = (MsgResetStats&) cmd;
MsgResetStats* rep = new MsgResetStats(msg);
m_basebandSink->getInputMessageQueue()->push(rep);
return true;
}
else else
{ {
return false; return false;
} }
} }
void ADSBDemod::applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force) void ADSBDemod::applySettings(const ADSBDemodSettings& settings, bool force)
{ {
qDebug() << "ADSBDemod::applySettings:" qDebug() << "ADSBDemod::applySettings:"
<< settings.getDebugString(settingsKeys, force) << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
<< " m_rfBandwidth: " << settings.m_rfBandwidth
<< " m_streamIndex: " << settings.m_streamIndex
<< " m_useReverseAPI: " << settings.m_useReverseAPI
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
<< " force: " << force; << " force: " << force;
QList<QString> reverseAPIKeys;
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) {
reverseAPIKeys.append("inputFrequencyOffset");
}
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
reverseAPIKeys.append("rfBandwidth");
}
if ((settings.m_correlationThreshold != m_settings.m_correlationThreshold) || force) {
reverseAPIKeys.append("correlationThreshold");
}
if ((settings.m_samplesPerBit != m_settings.m_samplesPerBit) || force) {
reverseAPIKeys.append("samplesPerBit");
}
if ((settings.m_correlateFullPreamble != m_settings.m_correlateFullPreamble) || force) {
reverseAPIKeys.append("correlateFullPreamble");
}
if ((settings.m_demodModeS != m_settings.m_demodModeS) || force) {
reverseAPIKeys.append("demodModeS");
}
if ((settings.m_interpolatorPhaseSteps != m_settings.m_interpolatorPhaseSteps) || force) {
reverseAPIKeys.append("interpolatorPhaseSteps");
}
if ((settings.m_interpolatorTapsPerPhase != m_settings.m_interpolatorTapsPerPhase) || force) {
reverseAPIKeys.append("interpolatorTapsPerPhase");
}
if ((settings.m_removeTimeout != m_settings.m_removeTimeout) || force) {
reverseAPIKeys.append("removeTimeout");
}
if ((settings.m_feedEnabled != m_settings.m_feedEnabled) || force) {
reverseAPIKeys.append("feedEnabled");
}
if ((settings.m_exportClientEnabled != m_settings.m_exportClientEnabled) || force) {
reverseAPIKeys.append("exportClientEnabled");
}
if ((settings.m_exportClientHost != m_settings.m_exportClientHost) || force) {
reverseAPIKeys.append("exportClientHost");
}
if ((settings.m_exportClientPort != m_settings.m_exportClientPort) || force) {
reverseAPIKeys.append("exportClientPort");
}
if ((settings.m_exportClientFormat != m_settings.m_exportClientFormat) || force) {
reverseAPIKeys.append("exportClientFormat");
}
if ((settings.m_exportServerEnabled != m_settings.m_exportServerEnabled) || force) {
reverseAPIKeys.append("exportServerEnabled");
}
if ((settings.m_exportServerPort != m_settings.m_exportServerPort) || force) {
reverseAPIKeys.append("exportServerPort");
}
if ((settings.m_importEnabled != m_settings.m_importEnabled) || force) {
reverseAPIKeys.append("importEnabled");
}
if ((settings.m_importHost != m_settings.m_importHost) || force) {
reverseAPIKeys.append("importHost");
}
if ((settings.m_importUsername != m_settings.m_importUsername) || force) {
reverseAPIKeys.append("importUsername");
}
if ((settings.m_importPassword != m_settings.m_importPassword) || force) {
reverseAPIKeys.append("importPassword");
}
if ((settings.m_importParameters != m_settings.m_importParameters) || force) {
reverseAPIKeys.append("importParameters");
}
if ((settings.m_importPeriod != m_settings.m_importPeriod) || force) {
reverseAPIKeys.append("importPeriod");
}
if ((settings.m_importMinLatitude != m_settings.m_importMinLatitude) || force) {
reverseAPIKeys.append("importMinLatitude");
}
if ((settings.m_importMaxLatitude != m_settings.m_importMaxLatitude) || force) {
reverseAPIKeys.append("importMaxLatitude");
}
if ((settings.m_importMinLongitude != m_settings.m_importMinLongitude) || force) {
reverseAPIKeys.append("importMinLongitude");
}
if ((settings.m_importMaxLongitude != m_settings.m_importMaxLongitude) || force) {
reverseAPIKeys.append("importMaxLongitude");
}
if ((settings.m_logFilename != m_settings.m_logFilename) || force) {
reverseAPIKeys.append("logFilename");
}
if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) {
reverseAPIKeys.append("logEnabled");
}
if ((settings.m_title != m_settings.m_title) || force) {
reverseAPIKeys.append("title");
}
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
reverseAPIKeys.append("rfBandwidth");
}
if (m_settings.m_streamIndex != settings.m_streamIndex) if (m_settings.m_streamIndex != settings.m_streamIndex)
{ {
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
@ -221,40 +315,38 @@ void ADSBDemod::applySettings(const ADSBDemodSettings& settings, const QStringLi
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
emit streamIndexChanged(settings.m_streamIndex); emit streamIndexChanged(settings.m_streamIndex);
} }
reverseAPIKeys.append("streamIndex");
} }
ADSBDemodBaseband::MsgConfigureADSBDemodBaseband *msg = ADSBDemodBaseband::MsgConfigureADSBDemodBaseband::create(settings, settingsKeys, force); ADSBDemodBaseband::MsgConfigureADSBDemodBaseband *msg = ADSBDemodBaseband::MsgConfigureADSBDemodBaseband::create(settings, force);
m_basebandSink->getInputMessageQueue()->push(msg); m_basebandSink->getInputMessageQueue()->push(msg);
ADSBDemodWorker::MsgConfigureADSBDemodWorker *workerMsg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(settings, settingsKeys, force); ADSBDemodWorker::MsgConfigureADSBDemodWorker *workerMsg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(settings, force);
m_worker->getInputMessageQueue()->push(workerMsg); m_worker->getInputMessageQueue()->push(workerMsg);
if (settings.m_useReverseAPI) if (settings.m_useReverseAPI)
{ {
bool fullUpdate = (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) || bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
settingsKeys.contains("reverseAPIAddress") || (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
settingsKeys.contains("reverseAPIPort") || (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
settingsKeys.contains("reverseAPIDeviceIndex") || (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
settingsKeys.contains("reverseAPIChannelIndex"); (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
} }
if (force) { m_settings = settings;
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
} }
void ADSBDemod::setCenterFrequency(qint64 frequency) void ADSBDemod::setCenterFrequency(qint64 frequency)
{ {
ADSBDemodSettings settings = m_settings; ADSBDemodSettings settings = m_settings;
settings.m_inputFrequencyOffset = frequency; settings.m_inputFrequencyOffset = frequency;
applySettings(settings, {"inputFrequencyOffset"}, false); applySettings(settings);
if (m_guiMessageQueue) // forward to GUI if any if (m_guiMessageQueue) // forward to GUI if any
{ {
MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, {"inputFrequencyOffset"}, false); MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, false);
m_guiMessageQueue->push(msgToGUI); m_guiMessageQueue->push(msgToGUI);
} }
} }
@ -274,7 +366,7 @@ bool ADSBDemod::deserialize(const QByteArray& data)
success = false; success = false;
} }
MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(m_settings, QStringList(), true); MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(m_settings, true);
m_inputMessageQueue.push(msg); m_inputMessageQueue.push(msg);
return success; return success;
@ -310,12 +402,12 @@ int ADSBDemod::webapiSettingsPutPatch(
ADSBDemodSettings settings = m_settings; ADSBDemodSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response); webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(settings, channelSettingsKeys, force); MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(settings, force);
m_inputMessageQueue.push(msg); m_inputMessageQueue.push(msg);
if (m_guiMessageQueue) // forward to GUI if any if (m_guiMessageQueue) // forward to GUI if any
{ {
MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, channelSettingsKeys, force); MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, force);
m_guiMessageQueue->push(msgToGUI); m_guiMessageQueue->push(msgToGUI);
} }
@ -341,6 +433,9 @@ void ADSBDemod::webapiUpdateChannelSettings(
if (channelSettingsKeys.contains("samplesPerBit")) { if (channelSettingsKeys.contains("samplesPerBit")) {
settings.m_samplesPerBit = response.getAdsbDemodSettings()->getSamplesPerBit(); settings.m_samplesPerBit = response.getAdsbDemodSettings()->getSamplesPerBit();
} }
if (channelSettingsKeys.contains("correlateFullPreamble")) {
settings.m_correlateFullPreamble = response.getAdsbDemodSettings()->getCorrelateFullPreamble() != 0;
}
if (channelSettingsKeys.contains("demodModeS")) { if (channelSettingsKeys.contains("demodModeS")) {
settings.m_demodModeS = response.getAdsbDemodSettings()->getDemodModeS() != 0; settings.m_demodModeS = response.getAdsbDemodSettings()->getDemodModeS() != 0;
} }
@ -459,6 +554,7 @@ void ADSBDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& res
response.getAdsbDemodSettings()->setRfBandwidth(settings.m_rfBandwidth); response.getAdsbDemodSettings()->setRfBandwidth(settings.m_rfBandwidth);
response.getAdsbDemodSettings()->setCorrelationThreshold(settings.m_correlationThreshold); response.getAdsbDemodSettings()->setCorrelationThreshold(settings.m_correlationThreshold);
response.getAdsbDemodSettings()->setSamplesPerBit(settings.m_samplesPerBit); response.getAdsbDemodSettings()->setSamplesPerBit(settings.m_samplesPerBit);
response.getAdsbDemodSettings()->setCorrelateFullPreamble(settings.m_correlateFullPreamble ? 1 : 0);
response.getAdsbDemodSettings()->setDemodModeS(settings.m_demodModeS ? 1 : 0); response.getAdsbDemodSettings()->setDemodModeS(settings.m_demodModeS ? 1 : 0);
response.getAdsbDemodSettings()->setInterpolatorPhaseSteps(settings.m_interpolatorPhaseSteps); response.getAdsbDemodSettings()->setInterpolatorPhaseSteps(settings.m_interpolatorPhaseSteps);
response.getAdsbDemodSettings()->setInterpolatorTapsPerPhase(settings.m_interpolatorTapsPerPhase); response.getAdsbDemodSettings()->setInterpolatorTapsPerPhase(settings.m_interpolatorTapsPerPhase);
@ -563,7 +659,7 @@ void ADSBDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons
} }
} }
void ADSBDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const ADSBDemodSettings& settings, bool force) void ADSBDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const ADSBDemodSettings& settings, bool force)
{ {
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
swgChannelSettings->setDirection(0); // single sink (Rx) swgChannelSettings->setDirection(0); // single sink (Rx)
@ -587,6 +683,9 @@ void ADSBDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsK
if (channelSettingsKeys.contains("samplesPerBit") || force) { if (channelSettingsKeys.contains("samplesPerBit") || force) {
swgADSBDemodSettings->setSamplesPerBit(settings.m_samplesPerBit); swgADSBDemodSettings->setSamplesPerBit(settings.m_samplesPerBit);
} }
if (channelSettingsKeys.contains("correlateFullPreamble") || force) {
swgADSBDemodSettings->setCorrelateFullPreamble(settings.m_correlateFullPreamble ? 1 : 0);
}
if (channelSettingsKeys.contains("demodModeS") || force) { if (channelSettingsKeys.contains("demodModeS") || force) {
swgADSBDemodSettings->setDemodModeS(settings.m_demodModeS ? 1 : 0); swgADSBDemodSettings->setDemodModeS(settings.m_demodModeS ? 1 : 0);
} }

Some files were not shown because too many files have changed in this diff Show More