From 1c373e9cdb24186266aeea4f6cf95a7e6a02e9c9 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Sat, 12 Nov 2022 02:19:53 +0100 Subject: [PATCH] bunch of bugfix and new features --- .github/workflows/build_all.yml | 8 +-- core/src/core.cpp | 10 ++- .../compression/sample_stream_compressor.h | 2 +- core/src/dsp/multirate/rational_resampler.h | 2 +- core/src/utils/optionlist.h | 2 + docker_builds/debian_bullseye/do_build.sh | 4 +- docker_builds/debian_buster/do_build.sh | 4 +- docker_builds/debian_sid/do_build.sh | 4 +- docker_builds/ubuntu_bionic/do_build.sh | 4 +- docker_builds/ubuntu_focal/do_build.sh | 4 +- docker_builds/ubuntu_jammy/do_build.sh | 4 +- make_macos_bundle.sh | 2 +- make_windows_package.ps1 | 2 +- readme.md | 13 +++- source_modules/hermes_source/CMakeLists.txt | 2 +- source_modules/hermes_source/src/hermes.cpp | 65 +++++++++++++++++-- source_modules/hermes_source/src/hermes.h | 16 ++++- source_modules/hermes_source/src/main.cpp | 25 ++++--- source_modules/hermes_source/src/net.cpp | 55 ++++++++++++++++ source_modules/hermes_source/src/net.h | 15 +++++ .../sdrpp_server_source/src/main.cpp | 8 +-- source_modules/usrp_source/src/main.cpp | 27 ++++---- 22 files changed, 219 insertions(+), 59 deletions(-) diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index b7ceefd9..c63a2c39 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -51,14 +51,14 @@ jobs: run: mkdir "C:/Program Files/codec2" ; mkdir "C:/Program Files/codec2/include" ; mkdir "C:/Program Files/codec2/include/codec2" ; mkdir "C:/Program Files/codec2/lib" ; cd "codec2" ; xcopy "src" "C:/Program Files/codec2/include" ; cd "build" ; xcopy "src" "C:/Program Files/codec2/lib" ; xcopy "codec2" "C:/Program Files/codec2/include/codec2" - name: Install vcpkg dependencies - run: vcpkg install fftw3:x64-windows glfw3:x64-windows portaudio:x64-windows zstd:x64-windows boost:x64-windows boost-config:x64-windows + run: vcpkg install fftw3:x64-windows glfw3:x64-windows portaudio:x64-windows zstd:x64-windows - name: Install rtaudio run: git clone https://github.com/thestk/rtaudio ; cd rtaudio ; git checkout 2f2fca4502d506abc50f6d4473b2836d24cfb1e3 ; mkdir build ; cd build ; cmake .. ; cmake --build . --config Release ; cmake --install . - name: Prepare CMake working-directory: ${{runner.workspace}}/build - run: cmake "$Env:GITHUB_WORKSPACE" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_USRP_SOURCE=ON + run: cmake "$Env:GITHUB_WORKSPACE" "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake" -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON - name: Build working-directory: ${{runner.workspace}}/build @@ -87,7 +87,7 @@ jobs: run: brew update - name: Install dependencies - run: brew install libusb fftw glfw airspy airspyhf portaudio hackrf rtl-sdr libbladerf codec2 uhd zstd && pip3 install mako + run: brew install libusb fftw glfw airspy airspyhf portaudio hackrf rtl-sdr libbladerf codec2 zstd && pip3 install mako - name: Install volk run: git clone --recursive https://github.com/gnuradio/volk && cd volk && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j3 && sudo make install && cd ../../ @@ -106,7 +106,7 @@ jobs: - name: Prepare CMake working-directory: ${{runner.workspace}}/build - run: cmake $GITHUB_WORKSPACE -DOPT_BUILD_PLUTOSDR_SOURCE=ON -DOPT_BUILD_SOAPY_SOURCE=OFF -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_AUDIO_SINK=OFF -DOPT_BUILD_PORTAUDIO_SINK=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_USRP_SOURCE=ON -DUSE_BUNDLE_DEFAULTS=ON -DCMAKE_BUILD_TYPE=Release + run: cmake $GITHUB_WORKSPACE -DOPT_BUILD_PLUTOSDR_SOURCE=ON -DOPT_BUILD_SOAPY_SOURCE=OFF -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_AUDIO_SINK=OFF -DOPT_BUILD_PORTAUDIO_SINK=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DUSE_BUNDLE_DEFAULTS=ON -DCMAKE_BUILD_TYPE=Release - name: Build working-directory: ${{runner.workspace}}/build diff --git a/core/src/core.cpp b/core/src/core.cpp index cb0fd371..bb5b8d28 100644 --- a/core/src/core.cpp +++ b/core/src/core.cpp @@ -80,7 +80,11 @@ int sdrpp_main(int argc, char* argv[]) { bool serverMode = (bool)core::args["server"]; #ifdef _WIN32 + // Free console if the user hasn't asked for a console and not in server mode if (!core::args["con"].b() && !serverMode) { FreeConsole(); } + + // Set error mode to avoid abnoxious popups + SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS); #endif // Check root directory @@ -168,8 +172,12 @@ int sdrpp_main(int argc, char* argv[]) { defConfig["moduleInstances"]["File Source"]["enabled"] = true; defConfig["moduleInstances"]["HackRF Source"]["module"] = "hackrf_source"; defConfig["moduleInstances"]["HackRF Source"]["enabled"] = true; + defConfig["moduleInstances"]["Hermes Source"]["module"] = "hermes_source"; + defConfig["moduleInstances"]["Hermes Source"]["enabled"] = true; defConfig["moduleInstances"]["LimeSDR Source"]["module"] = "limesdr_source"; defConfig["moduleInstances"]["LimeSDR Source"]["enabled"] = true; + defConfig["moduleInstances"]["PlutoSDR Source"]["module"] = "plutosdr_source"; + defConfig["moduleInstances"]["PlutoSDR Source"]["enabled"] = true; defConfig["moduleInstances"]["RFspace Source"]["module"] = "rfspace_source"; defConfig["moduleInstances"]["RFspace Source"]["enabled"] = true; defConfig["moduleInstances"]["RTL-SDR Source"]["module"] = "rtl_sdr_source"; @@ -184,8 +192,6 @@ int sdrpp_main(int argc, char* argv[]) { defConfig["moduleInstances"]["SoapySDR Source"]["enabled"] = true; defConfig["moduleInstances"]["SpyServer Source"]["module"] = "spyserver_source"; defConfig["moduleInstances"]["SpyServer Source"]["enabled"] = true; - defConfig["moduleInstances"]["PlutoSDR Source"]["module"] = "plutosdr_source"; - defConfig["moduleInstances"]["PlutoSDR Source"]["enabled"] = true; defConfig["moduleInstances"]["Audio Sink"] = "audio_sink"; defConfig["moduleInstances"]["Network Sink"] = "network_sink"; diff --git a/core/src/dsp/compression/sample_stream_compressor.h b/core/src/dsp/compression/sample_stream_compressor.h index 1eeb1070..69b5cbbf 100644 --- a/core/src/dsp/compression/sample_stream_compressor.h +++ b/core/src/dsp/compression/sample_stream_compressor.h @@ -37,7 +37,7 @@ namespace dsp::compression { if (pcmType == PCMType::PCM_TYPE_F32) { *scaler = 0; memcpy(dataBuf, in, count * sizeof(complex_t)); - return count; + return 8 + (count * sizeof(complex_t)); } // Find maximum value diff --git a/core/src/dsp/multirate/rational_resampler.h b/core/src/dsp/multirate/rational_resampler.h index f23fb9c9..c8235652 100644 --- a/core/src/dsp/multirate/rational_resampler.h +++ b/core/src/dsp/multirate/rational_resampler.h @@ -171,4 +171,4 @@ namespace dsp::multirate { double _outSamplerate; Mode mode; }; -} +} \ No newline at end of file diff --git a/core/src/utils/optionlist.h b/core/src/utils/optionlist.h index 97f71da3..424649e6 100644 --- a/core/src/utils/optionlist.h +++ b/core/src/utils/optionlist.h @@ -6,6 +6,8 @@ template class OptionList { public: + OptionList() { updateText(); } + void define(K key, std::string name, T value) { if (keyExists(key)) { throw std::runtime_error("Key already exists"); } if (nameExists(name)) { throw std::runtime_error("Name already exists"); } diff --git a/docker_builds/debian_bullseye/do_build.sh b/docker_builds/debian_bullseye/do_build.sh index fbbc385d..05a0a32e 100644 --- a/docker_builds/debian_bullseye/do_build.sh +++ b/docker_builds/debian_bullseye/do_build.sh @@ -6,7 +6,7 @@ cd /root apt update apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk2-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget portaudio19-dev \ - libcodec2-dev libuhd-dev + libcodec2-dev # Install SDRPlay libraries wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run @@ -18,7 +18,7 @@ cp inc/* /usr/include/ cd SDRPlusPlus mkdir build cd build -cmake .. -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_USRP_SOURCE=ON +cmake .. -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON make VERBOSE=1 -j2 cd .. diff --git a/docker_builds/debian_buster/do_build.sh b/docker_builds/debian_buster/do_build.sh index 5f5dfc34..cbefd63f 100644 --- a/docker_builds/debian_buster/do_build.sh +++ b/docker_builds/debian_buster/do_build.sh @@ -6,7 +6,7 @@ cd /root apt update apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk1-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget portaudio19-dev \ - libcodec2-dev libuhd-dev + libcodec2-dev # Install SDRPlay libraries wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run @@ -18,7 +18,7 @@ cp inc/* /usr/include/ cd SDRPlusPlus mkdir build cd build -cmake .. -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_BLADERF_SOURCE=OFF -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_USRP_SOURCE=ON +cmake .. -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_BLADERF_SOURCE=OFF -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON make VERBOSE=1 -j2 cd .. diff --git a/docker_builds/debian_sid/do_build.sh b/docker_builds/debian_sid/do_build.sh index fbbc385d..05a0a32e 100644 --- a/docker_builds/debian_sid/do_build.sh +++ b/docker_builds/debian_sid/do_build.sh @@ -6,7 +6,7 @@ cd /root apt update apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk2-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget portaudio19-dev \ - libcodec2-dev libuhd-dev + libcodec2-dev # Install SDRPlay libraries wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run @@ -18,7 +18,7 @@ cp inc/* /usr/include/ cd SDRPlusPlus mkdir build cd build -cmake .. -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_USRP_SOURCE=ON +cmake .. -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON make VERBOSE=1 -j2 cd .. diff --git a/docker_builds/ubuntu_bionic/do_build.sh b/docker_builds/ubuntu_bionic/do_build.sh index f06098b4..2145328a 100644 --- a/docker_builds/ubuntu_bionic/do_build.sh +++ b/docker_builds/ubuntu_bionic/do_build.sh @@ -12,7 +12,7 @@ apt update # Install dependencies and tools apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk1-dev libzstd-dev libsoapysdr-dev libairspy-dev \ libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget portaudio19-dev \ - libcodec2-dev libudev-dev libuhd-dev + libcodec2-dev libudev-dev # Install SDRPlay libraries wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run @@ -56,7 +56,7 @@ echo 'Cflags: -I/usr/include/codec2' >> /usr/share/pkgconfig/codec2.pc cd SDRPlusPlus mkdir build cd build -cmake .. -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_BLADERF_SOURCE=OFF -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_OVERRIDE_STD_FILESYSTEM=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_USRP_SOURCE=ON +cmake .. -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_BLADERF_SOURCE=OFF -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_OVERRIDE_STD_FILESYSTEM=ON -DOPT_BUILD_M17_DECODER=ON make VERBOSE=1 -j2 # Generate package diff --git a/docker_builds/ubuntu_focal/do_build.sh b/docker_builds/ubuntu_focal/do_build.sh index fbbc385d..05a0a32e 100644 --- a/docker_builds/ubuntu_focal/do_build.sh +++ b/docker_builds/ubuntu_focal/do_build.sh @@ -6,7 +6,7 @@ cd /root apt update apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk2-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget portaudio19-dev \ - libcodec2-dev libuhd-dev + libcodec2-dev # Install SDRPlay libraries wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run @@ -18,7 +18,7 @@ cp inc/* /usr/include/ cd SDRPlusPlus mkdir build cd build -cmake .. -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_USRP_SOURCE=ON +cmake .. -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON make VERBOSE=1 -j2 cd .. diff --git a/docker_builds/ubuntu_jammy/do_build.sh b/docker_builds/ubuntu_jammy/do_build.sh index fbbc385d..05a0a32e 100644 --- a/docker_builds/ubuntu_jammy/do_build.sh +++ b/docker_builds/ubuntu_jammy/do_build.sh @@ -6,7 +6,7 @@ cd /root apt update apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk2-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \ libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev libbladerf-dev liblimesuite-dev p7zip-full wget portaudio19-dev \ - libcodec2-dev libuhd-dev + libcodec2-dev # Install SDRPlay libraries wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run @@ -18,7 +18,7 @@ cp inc/* /usr/include/ cd SDRPlusPlus mkdir build cd build -cmake .. -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DOPT_BUILD_USRP_SOURCE=ON +cmake .. -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_LIMESDR_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON make VERBOSE=1 -j2 cd .. diff --git a/make_macos_bundle.sh b/make_macos_bundle.sh index 0af22060..0acc0053 100644 --- a/make_macos_bundle.sh +++ b/make_macos_bundle.sh @@ -46,7 +46,7 @@ bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/sdrpp_server_source/sdrpp_server_source.dylib bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/soapy_source/soapy_source.dylib bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/spyserver_source/spyserver_source.dylib -bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/usrp_source/usrp_source.dylib +# bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/usrp_source/usrp_source.dylib # Sink modules bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/sink_modules/portaudio_sink/audio_sink.dylib diff --git a/make_windows_package.ps1 b/make_windows_package.ps1 index 28aa3c97..15954df6 100644 --- a/make_windows_package.ps1 +++ b/make_windows_package.ps1 @@ -50,7 +50,7 @@ cp $build_dir/source_modules/soapy_source/Release/soapy_source.dll sdrpp_windows cp $build_dir/source_modules/spyserver_source/Release/spyserver_source.dll sdrpp_windows_x64/modules/ -cp $build_dir/source_modules/usrp_source/Release/usrp_source.dll sdrpp_windows_x64/modules/ +# cp $build_dir/source_modules/usrp_source/Release/usrp_source.dll sdrpp_windows_x64/modules/ # Copy sink modules diff --git a/readme.md b/readme.md index 8ca6411b..55a5e00a 100644 --- a/readme.md +++ b/readme.md @@ -21,6 +21,14 @@ SDR++ is a cross-platform and open source SDR software with the aim of being blo # Installing +## Nightly Builds + +Nightly builds contain the very latest features and bugfixes. They are usually just stable as [normal releases](https://github.com/AlexandreRouma/SDRPlusPlus/releases) but are available basically minutes to hours after a change has been pushed to the code. + +You can download them [here](https://www.sdrpp.org/nightly). It'll redirect you to the latest nightly on GitHub, scroll down to "Artifacts" and click on the version for your OS. + +GitHub currently requires an account for the files to be downloadable so make sure you are logged in. + ## Windows Download the latest release from [the Releases page](https://github.com/AlexandreRouma/SDRPlusPlus/releases) and extract to the directory of your choice. @@ -277,7 +285,8 @@ Make sure to install portaudio as it'll be needed later. An example install command would be: ```sh -brew install libusb fftw glfw airspy airspyhf portaudio hackrf rtl-sdr libbladerf codec2 && pip3 install mako zstd +brew install libusb fftw glfw airspy airspyhf portaudio hackrf rtl-sdr libbladerf codec2 zstd +pip3 install mako ``` ### Install volk @@ -331,7 +340,7 @@ Modules in beta are still included in releases for the most part but not enabled | sdrpp_server_source | Working | - | OPT_BUILD_SDRPP_SERVER_SOURCE | ✅ | ✅ | ✅ | | soapy_source | Working | soapysdr | OPT_BUILD_SOAPY_SOURCE | ✅ | ✅ | ✅ | | spyserver_source | Working | - | OPT_BUILD_SPYSERVER_SOURCE | ✅ | ✅ | ✅ | -| usrp_source | Beta | libuhd | OPT_BUILD_USRP_SOURCE | ⛔ | ✅ | ⛔ | +| usrp_source | Beta | libuhd | OPT_BUILD_USRP_SOURCE | ⛔ | ⛔ | ⛔ | ## Sinks diff --git a/source_modules/hermes_source/CMakeLists.txt b/source_modules/hermes_source/CMakeLists.txt index f1fca269..86bc5560 100644 --- a/source_modules/hermes_source/CMakeLists.txt +++ b/source_modules/hermes_source/CMakeLists.txt @@ -18,7 +18,7 @@ else () endif () if(WIN32) - target_link_libraries(hermes_source PRIVATE wsock32 ws2_32) + target_link_libraries(hermes_source PRIVATE wsock32 ws2_32 iphlpapi) endif() # Install directives diff --git a/source_modules/hermes_source/src/hermes.cpp b/source_modules/hermes_source/src/hermes.cpp index b251bb9a..eb670d36 100644 --- a/source_modules/hermes_source/src/hermes.cpp +++ b/source_modules/hermes_source/src/hermes.cpp @@ -20,11 +20,15 @@ namespace hermes { } void Client::start() { - sendMetisControl((MetisControl)(METIS_CTRL_IQ | METIS_CTRL_NO_WD)); + for (int i = 0; i < HERMES_METIS_REPEAT; i++) { + sendMetisControl((MetisControl)(METIS_CTRL_IQ | METIS_CTRL_NO_WD)); + } } void Client::stop() { - sendMetisControl(METIS_CTRL_NONE); + for (int i = 0; i < HERMES_METIS_REPEAT; i++) { + sendMetisControl(METIS_CTRL_NONE); + } } void Client::setSamplerate(HermesLiteSamplerate samplerate) { @@ -32,13 +36,44 @@ namespace hermes { } void Client::setFrequency(double freq) { + this->freq = freq; writeReg(HL_REG_TX1_NCO_FREQ, freq); + autoeFilters(freq); } void Client::setGain(int gain) { writeReg(HL_REG_RX_LNA, gain | (1 << 6)); } + void Client::autoeFilters(double freq) { + uint8_t filt = (freq >= 3000000.0) ? (1 << 6) : 0; + + if (freq <= 2000000.0) { + filt |= (1 << 0); + } + else if (freq <= 4000000.0) { + filt |= (1 << 1); + } + else if (freq <= 7300000.0) { + filt |= (1 << 2); + } + else if (freq <= 14350000.0) { + filt |= (1 << 3); + } + else if (freq <= 21450000.0) { + filt |= (1 << 4); + } + else if (freq <= 29700000.0) { + filt |= (1 << 5); + } + + // Write only if the config actually changed + if (filt != lastFilt) { + lastFilt = filt; + writeI2C(I2C_PORT_2, 0x20, 0x0A, filt); + } + } + void Client::sendMetisUSB(uint8_t endpoint, void* frame0, void* frame1) { // Build packet uint32_t seq = usbSeq++; @@ -79,6 +114,8 @@ namespace hermes { sendMetisUSB(2, frame); + // TODO: Wait for response + return 0; } @@ -96,6 +133,15 @@ namespace hermes { sendMetisUSB(2, frame); } + void Client::writeI2C(I2CPort port, uint8_t addr, uint8_t reg, uint8_t data) { + uint32_t wdata = data; + wdata |= reg << 8; + wdata |= (addr & 0x7F) << 16; + wdata |= 1 << 23; + wdata |= 0x06 << 24; + writeReg(HL_REG_I2C_1 + port, wdata); + } + void Client::worker() { uint8_t rbuf[2048]; MetisUSBPacket* pkt = (MetisUSBPacket*)rbuf; @@ -147,7 +193,7 @@ namespace hermes { } std::vector discover() { - auto sock = net::openudp("192.168.0.255", 1024); + auto sock = net::openudp("0.0.0.0", 1024); // Build discovery packet uint8_t discoveryPkt[64]; @@ -155,18 +201,23 @@ namespace hermes { *(uint16_t*)&discoveryPkt[0] = htons(HERMES_METIS_SIGNATURE); discoveryPkt[2] = METIS_PKT_DISCOVER; + // Get interface list + auto ifaces = net::listInterfaces(); + // Send the packet 5 times to make sure it's received - for (int i = 0; i < HERMES_DISCOVER_REPEAT; i++) { - sock->send(discoveryPkt, sizeof(discoveryPkt)); + for (const auto& [name, iface] : ifaces) { + net::Address baddr(iface.broadcast, 1024); + for (int i = 0; i < HERMES_METIS_REPEAT; i++) { + sock->send(discoveryPkt, sizeof(discoveryPkt), &baddr); + } } std::vector devices; - while (true) { // Wait for a response net::Address addr; uint8_t resp[1024]; - int len = sock->recv(resp, sizeof(resp), false, HERMES_DISCOVER_TIMEOUT, &addr); + int len = sock->recv(resp, sizeof(resp), false, HERMES_METIS_TIMEOUT, &addr); // Give up if timeout or error if (len <= 0) { break; } diff --git a/source_modules/hermes_source/src/hermes.h b/source_modules/hermes_source/src/hermes.h index 998271f2..cba1e213 100644 --- a/source_modules/hermes_source/src/hermes.h +++ b/source_modules/hermes_source/src/hermes.h @@ -7,8 +7,8 @@ #include #include -#define HERMES_DISCOVER_REPEAT 5 -#define HERMES_DISCOVER_TIMEOUT 1000 +#define HERMES_METIS_REPEAT 5 +#define HERMES_METIS_TIMEOUT 1000 #define HERMES_METIS_SIGNATURE 0xEFFE #define HERMES_HPSDR_USB_SYNC 0x7F @@ -80,6 +80,11 @@ namespace hermes { HL_SAMP_RATE_384KHZ = 3 }; + enum I2CPort { + I2C_PORT_1 = 0, + I2C_PORT_2 + }; + #pragma pack(push, 1) struct HPSDRUSBHeader { uint8_t sync[3]; @@ -130,6 +135,7 @@ namespace hermes { void setSamplerate(HermesLiteSamplerate samplerate); void setFrequency(double freq); void setGain(int gain); + void autoeFilters(double freq); dsp::stream out; @@ -140,13 +146,19 @@ namespace hermes { uint32_t readReg(uint8_t addr); void writeReg(uint8_t addr, uint32_t val); + void writeI2C(I2CPort port, uint8_t addr, uint8_t reg, uint8_t data); + + + void worker(); bool open = true; + double freq = 0; std::thread workerThread; std::shared_ptr sock; uint32_t usbSeq = 0; + uint8_t lastFilt = 0; }; diff --git a/source_modules/hermes_source/src/main.cpp b/source_modules/hermes_source/src/main.cpp index a66ce5f5..321a8326 100644 --- a/source_modules/hermes_source/src/main.cpp +++ b/source_modules/hermes_source/src/main.cpp @@ -48,15 +48,6 @@ public: handler.stopHandler = stop; handler.tuneHandler = tune; handler.stream = &stream; - - // TODO: Move the refresh and first select to the select event instead - refresh(); - - // Select device - config.acquire(); - selectedMac = config.conf["device"]; - config.release(); - selectMac(selectedMac); sigpath::sourceManager.registerSource("Hermes", &handler); } @@ -132,6 +123,20 @@ private: static void menuSelected(void* ctx) { HermesSourceModule* _this = (HermesSourceModule*)ctx; + + if (_this->firstSelect) { + _this->firstSelect = false; + + // Refresh + _this->refresh(); + + // Select device + config.acquire(); + _this->selectedMac = config.conf["device"]; + config.release(); + _this->selectMac(_this->selectedMac); + } + core::setInputSampleRate(_this->sampleRate); spdlog::info("HermesSourceModule '{0}': Menu Select!", _this->name); } @@ -257,6 +262,8 @@ private: int srId = 0; int gain = 0; + bool firstSelect = true; + std::shared_ptr dev; }; diff --git a/source_modules/hermes_source/src/net.cpp b/source_modules/hermes_source/src/net.cpp index 3e92f435..8f62f511 100644 --- a/source_modules/hermes_source/src/net.cpp +++ b/source_modules/hermes_source/src/net.cpp @@ -1,5 +1,6 @@ #include "net.h" #include +#include #ifdef _WIN32 #define WOULD_BLOCK (WSAGetLastError() == WSAEWOULDBLOCK) @@ -246,6 +247,60 @@ namespace net { // === Creation functions === + std::map listInterfaces() { + // Init library if needed + init(); + + std::map ifaces; +#ifdef _WIN32 + // Pre-allocate buffer + ULONG size = sizeof(IP_ADAPTER_ADDRESSES); + PIP_ADAPTER_ADDRESSES addresses = (PIP_ADAPTER_ADDRESSES)malloc(size); + + // Reallocate to real size + if (GetAdaptersAddresses(AF_INET, 0, NULL, addresses, &size) == ERROR_BUFFER_OVERFLOW) { + addresses = (PIP_ADAPTER_ADDRESSES)realloc(addresses, size); + if (GetAdaptersAddresses(AF_INET, 0, NULL, addresses, &size)) { + throw std::exception("Could not list network interfaces"); + } + } + + // Save data + std::wstring_convert> utfConv; + for (auto iface = addresses; iface; iface = iface->Next) { + InterfaceInfo info; + auto ip = iface->FirstUnicastAddress; + if (!ip || ip->Address.lpSockaddr->sa_family != AF_INET) { continue; } + info.address = ntohl(*(uint32_t*)&ip->Address.lpSockaddr->sa_data[2]); + info.netmask = ~((1 << (32 - ip->OnLinkPrefixLength)) - 1); + info.broadcast = info.address | (~info.netmask); + ifaces[utfConv.to_bytes(iface->FriendlyName)] = info; + } + + // Free tables + free(addresses); +#else + // Get iface list + struct ifaddrs* addresses = NULL; + getifaddrs(&addresses); + + // Save data + for (auto iface = addresses; iface; iface = iface->ifa_next) { + if (iface->ifa_addr->sa_family != AF_INET) { continue; } + InterfaceInfo info; + info.address = ntohl(*(uint32_t*)&iface->ifa_addr->sa_data[2]); + info.netmask = ntohl(*(uint32_t*)&iface->ifa_netmask->sa_data[2]); + info.broadcast = info.address | (~info.netmask); + ifaces[iface->ifa_name] = info; + } + + // Free iface list + freeifaddrs(addresses); +#endif + + return ifaces; + } + std::shared_ptr listen(const Address& addr) { // Init library if needed init(); diff --git a/source_modules/hermes_source/src/net.h b/source_modules/hermes_source/src/net.h index 69b47187..a35a6fbb 100644 --- a/source_modules/hermes_source/src/net.h +++ b/source_modules/hermes_source/src/net.h @@ -2,10 +2,12 @@ #include #include #include +#include #ifdef _WIN32 #include #include +#include #else #include #include @@ -16,6 +18,7 @@ #include #include #include +#include #endif namespace net { @@ -30,6 +33,12 @@ namespace net { class Socket; class Listener; + struct InterfaceInfo { + IP_t address; + IP_t netmask; + IP_t broadcast; + }; + class Address { friend Socket; friend Listener; @@ -198,6 +207,12 @@ namespace net { }; + /** + * Get a list of the network interface. + * @return List of network interfaces and their addresses. + */ + std::map listInterfaces(); + /** * Create TCP listener. * @param addr Address to listen on. diff --git a/source_modules/sdrpp_server_source/src/main.cpp b/source_modules/sdrpp_server_source/src/main.cpp index 3f1d5da6..e8c212d8 100644 --- a/source_modules/sdrpp_server_source/src/main.cpp +++ b/source_modules/sdrpp_server_source/src/main.cpp @@ -115,11 +115,9 @@ private: if (!_this->client) { return; } } - // TODO: Set configuration here - if (_this->client) { - _this->client->setFrequency(_this->freq); - _this->client->start(); - } + // Set configuration + _this->client->setFrequency(_this->freq); + _this->client->start(); _this->running = true; spdlog::info("SDRPPServerSourceModule '{0}': Start!", _this->name); diff --git a/source_modules/usrp_source/src/main.cpp b/source_modules/usrp_source/src/main.cpp index 4127a8ce..43310cd7 100644 --- a/source_modules/usrp_source/src/main.cpp +++ b/source_modules/usrp_source/src/main.cpp @@ -30,8 +30,6 @@ public: this->name = name; sampleRate = 8000000.0; - // TODO: REMOVE - samplerates.define(8000000, "8MHz", 8000000.0); handler.ctx = this; handler.selectHandler = menuSelected; @@ -42,15 +40,6 @@ public: handler.tuneHandler = tune; handler.stream = &stream; - // List devices - refresh(); - - // Select device - config.acquire(); - selectedSer = config.conf["device"]; - config.release(); - select(selectedSer); - sigpath::sourceManager.registerSource("USRP", &handler); } @@ -212,6 +201,20 @@ private: static void menuSelected(void* ctx) { USRPSourceModule* _this = (USRPSourceModule*)ctx; + + if (_this->firstSelect) { + _this->firstSelect = false; + + // List devices + _this->refresh(); + + // Select device + config.acquire(); + _this->selectedSer = config.conf["device"]; + config.release(); + _this->select(_this->selectedSer); + } + core::setInputSampleRate(_this->sampleRate); spdlog::info("USRPSourceModule '{0}': Menu Select!", _this->name); } @@ -406,6 +409,8 @@ private: uhd::usrp::multi_usrp::sptr dev; uhd::rx_streamer::sptr streamer; + bool firstSelect = true; + std::thread workerThread; };