mirror of
https://github.com/AlexandreRouma/SDRPlusPlus.git
synced 2025-03-26 17:45:28 +01:00
bunch of bugfix and new features
This commit is contained in:
parent
c4bac3b298
commit
1c373e9cdb
8
.github/workflows/build_all.yml
vendored
8
.github/workflows/build_all.yml
vendored
@ -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"
|
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
|
- 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
|
- 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 .
|
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
|
- name: Prepare CMake
|
||||||
working-directory: ${{runner.workspace}}/build
|
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
|
- name: Build
|
||||||
working-directory: ${{runner.workspace}}/build
|
working-directory: ${{runner.workspace}}/build
|
||||||
@ -87,7 +87,7 @@ jobs:
|
|||||||
run: brew update
|
run: brew update
|
||||||
|
|
||||||
- name: Install dependencies
|
- 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
|
- 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 ../../
|
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
|
- name: Prepare CMake
|
||||||
working-directory: ${{runner.workspace}}/build
|
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
|
- name: Build
|
||||||
working-directory: ${{runner.workspace}}/build
|
working-directory: ${{runner.workspace}}/build
|
||||||
|
@ -80,7 +80,11 @@ int sdrpp_main(int argc, char* argv[]) {
|
|||||||
bool serverMode = (bool)core::args["server"];
|
bool serverMode = (bool)core::args["server"];
|
||||||
|
|
||||||
#ifdef _WIN32
|
#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(); }
|
if (!core::args["con"].b() && !serverMode) { FreeConsole(); }
|
||||||
|
|
||||||
|
// Set error mode to avoid abnoxious popups
|
||||||
|
SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Check root directory
|
// Check root directory
|
||||||
@ -168,8 +172,12 @@ int sdrpp_main(int argc, char* argv[]) {
|
|||||||
defConfig["moduleInstances"]["File Source"]["enabled"] = true;
|
defConfig["moduleInstances"]["File Source"]["enabled"] = true;
|
||||||
defConfig["moduleInstances"]["HackRF Source"]["module"] = "hackrf_source";
|
defConfig["moduleInstances"]["HackRF Source"]["module"] = "hackrf_source";
|
||||||
defConfig["moduleInstances"]["HackRF Source"]["enabled"] = true;
|
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"]["module"] = "limesdr_source";
|
||||||
defConfig["moduleInstances"]["LimeSDR Source"]["enabled"] = true;
|
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"]["module"] = "rfspace_source";
|
||||||
defConfig["moduleInstances"]["RFspace Source"]["enabled"] = true;
|
defConfig["moduleInstances"]["RFspace Source"]["enabled"] = true;
|
||||||
defConfig["moduleInstances"]["RTL-SDR Source"]["module"] = "rtl_sdr_source";
|
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"]["SoapySDR Source"]["enabled"] = true;
|
||||||
defConfig["moduleInstances"]["SpyServer Source"]["module"] = "spyserver_source";
|
defConfig["moduleInstances"]["SpyServer Source"]["module"] = "spyserver_source";
|
||||||
defConfig["moduleInstances"]["SpyServer Source"]["enabled"] = true;
|
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"]["Audio Sink"] = "audio_sink";
|
||||||
defConfig["moduleInstances"]["Network Sink"] = "network_sink";
|
defConfig["moduleInstances"]["Network Sink"] = "network_sink";
|
||||||
|
@ -37,7 +37,7 @@ namespace dsp::compression {
|
|||||||
if (pcmType == PCMType::PCM_TYPE_F32) {
|
if (pcmType == PCMType::PCM_TYPE_F32) {
|
||||||
*scaler = 0;
|
*scaler = 0;
|
||||||
memcpy(dataBuf, in, count * sizeof(complex_t));
|
memcpy(dataBuf, in, count * sizeof(complex_t));
|
||||||
return count;
|
return 8 + (count * sizeof(complex_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find maximum value
|
// Find maximum value
|
||||||
|
@ -171,4 +171,4 @@ namespace dsp::multirate {
|
|||||||
double _outSamplerate;
|
double _outSamplerate;
|
||||||
Mode mode;
|
Mode mode;
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -6,6 +6,8 @@
|
|||||||
template <class K, class T>
|
template <class K, class T>
|
||||||
class OptionList {
|
class OptionList {
|
||||||
public:
|
public:
|
||||||
|
OptionList() { updateText(); }
|
||||||
|
|
||||||
void define(K key, std::string name, T value) {
|
void define(K key, std::string name, T value) {
|
||||||
if (keyExists(key)) { throw std::runtime_error("Key already exists"); }
|
if (keyExists(key)) { throw std::runtime_error("Key already exists"); }
|
||||||
if (nameExists(name)) { throw std::runtime_error("Name already exists"); }
|
if (nameExists(name)) { throw std::runtime_error("Name already exists"); }
|
||||||
|
@ -6,7 +6,7 @@ cd /root
|
|||||||
apt update
|
apt update
|
||||||
apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk2-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \
|
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 \
|
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
|
# Install SDRPlay libraries
|
||||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
||||||
@ -18,7 +18,7 @@ cp inc/* /usr/include/
|
|||||||
cd SDRPlusPlus
|
cd SDRPlusPlus
|
||||||
mkdir build
|
mkdir build
|
||||||
cd 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
|
make VERBOSE=1 -j2
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
|
@ -6,7 +6,7 @@ cd /root
|
|||||||
apt update
|
apt update
|
||||||
apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk1-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \
|
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 \
|
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
|
# Install SDRPlay libraries
|
||||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
||||||
@ -18,7 +18,7 @@ cp inc/* /usr/include/
|
|||||||
cd SDRPlusPlus
|
cd SDRPlusPlus
|
||||||
mkdir build
|
mkdir build
|
||||||
cd 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
|
make VERBOSE=1 -j2
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
|
@ -6,7 +6,7 @@ cd /root
|
|||||||
apt update
|
apt update
|
||||||
apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk2-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \
|
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 \
|
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
|
# Install SDRPlay libraries
|
||||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
||||||
@ -18,7 +18,7 @@ cp inc/* /usr/include/
|
|||||||
cd SDRPlusPlus
|
cd SDRPlusPlus
|
||||||
mkdir build
|
mkdir build
|
||||||
cd 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
|
make VERBOSE=1 -j2
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
|
@ -12,7 +12,7 @@ apt update
|
|||||||
# Install dependencies and tools
|
# Install dependencies and tools
|
||||||
apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk1-dev libzstd-dev libsoapysdr-dev libairspy-dev \
|
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 \
|
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
|
# Install SDRPlay libraries
|
||||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
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
|
cd SDRPlusPlus
|
||||||
mkdir build
|
mkdir build
|
||||||
cd 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
|
make VERBOSE=1 -j2
|
||||||
|
|
||||||
# Generate package
|
# Generate package
|
||||||
|
@ -6,7 +6,7 @@ cd /root
|
|||||||
apt update
|
apt update
|
||||||
apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk2-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \
|
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 \
|
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
|
# Install SDRPlay libraries
|
||||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
||||||
@ -18,7 +18,7 @@ cp inc/* /usr/include/
|
|||||||
cd SDRPlusPlus
|
cd SDRPlusPlus
|
||||||
mkdir build
|
mkdir build
|
||||||
cd 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
|
make VERBOSE=1 -j2
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
|
@ -6,7 +6,7 @@ cd /root
|
|||||||
apt update
|
apt update
|
||||||
apt install -y build-essential cmake git libfftw3-dev libglfw3-dev libvolk2-dev libzstd-dev libsoapysdr-dev libairspyhf-dev libairspy-dev \
|
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 \
|
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
|
# Install SDRPlay libraries
|
||||||
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
wget https://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run
|
||||||
@ -18,7 +18,7 @@ cp inc/* /usr/include/
|
|||||||
cd SDRPlusPlus
|
cd SDRPlusPlus
|
||||||
mkdir build
|
mkdir build
|
||||||
cd 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
|
make VERBOSE=1 -j2
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
|
@ -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/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/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/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
|
# Sink modules
|
||||||
bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/sink_modules/portaudio_sink/audio_sink.dylib
|
bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/sink_modules/portaudio_sink/audio_sink.dylib
|
||||||
|
@ -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/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
|
# Copy sink modules
|
||||||
|
13
readme.md
13
readme.md
@ -21,6 +21,14 @@ SDR++ is a cross-platform and open source SDR software with the aim of being blo
|
|||||||
|
|
||||||
# Installing
|
# 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
|
## Windows
|
||||||
|
|
||||||
Download the latest release from [the Releases page](https://github.com/AlexandreRouma/SDRPlusPlus/releases) and extract to the directory of your choice.
|
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:
|
An example install command would be:
|
||||||
|
|
||||||
```sh
|
```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
|
### 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 | ✅ | ✅ | ✅ |
|
| sdrpp_server_source | Working | - | OPT_BUILD_SDRPP_SERVER_SOURCE | ✅ | ✅ | ✅ |
|
||||||
| soapy_source | Working | soapysdr | OPT_BUILD_SOAPY_SOURCE | ✅ | ✅ | ✅ |
|
| soapy_source | Working | soapysdr | OPT_BUILD_SOAPY_SOURCE | ✅ | ✅ | ✅ |
|
||||||
| spyserver_source | Working | - | OPT_BUILD_SPYSERVER_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
|
## Sinks
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ else ()
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_link_libraries(hermes_source PRIVATE wsock32 ws2_32)
|
target_link_libraries(hermes_source PRIVATE wsock32 ws2_32 iphlpapi)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Install directives
|
# Install directives
|
||||||
|
@ -20,11 +20,15 @@ namespace hermes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Client::start() {
|
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() {
|
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) {
|
void Client::setSamplerate(HermesLiteSamplerate samplerate) {
|
||||||
@ -32,13 +36,44 @@ namespace hermes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Client::setFrequency(double freq) {
|
void Client::setFrequency(double freq) {
|
||||||
|
this->freq = freq;
|
||||||
writeReg(HL_REG_TX1_NCO_FREQ, freq);
|
writeReg(HL_REG_TX1_NCO_FREQ, freq);
|
||||||
|
autoeFilters(freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::setGain(int gain) {
|
void Client::setGain(int gain) {
|
||||||
writeReg(HL_REG_RX_LNA, gain | (1 << 6));
|
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) {
|
void Client::sendMetisUSB(uint8_t endpoint, void* frame0, void* frame1) {
|
||||||
// Build packet
|
// Build packet
|
||||||
uint32_t seq = usbSeq++;
|
uint32_t seq = usbSeq++;
|
||||||
@ -79,6 +114,8 @@ namespace hermes {
|
|||||||
|
|
||||||
sendMetisUSB(2, frame);
|
sendMetisUSB(2, frame);
|
||||||
|
|
||||||
|
// TODO: Wait for response
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,6 +133,15 @@ namespace hermes {
|
|||||||
sendMetisUSB(2, frame);
|
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() {
|
void Client::worker() {
|
||||||
uint8_t rbuf[2048];
|
uint8_t rbuf[2048];
|
||||||
MetisUSBPacket* pkt = (MetisUSBPacket*)rbuf;
|
MetisUSBPacket* pkt = (MetisUSBPacket*)rbuf;
|
||||||
@ -147,7 +193,7 @@ namespace hermes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Info> discover() {
|
std::vector<Info> discover() {
|
||||||
auto sock = net::openudp("192.168.0.255", 1024);
|
auto sock = net::openudp("0.0.0.0", 1024);
|
||||||
|
|
||||||
// Build discovery packet
|
// Build discovery packet
|
||||||
uint8_t discoveryPkt[64];
|
uint8_t discoveryPkt[64];
|
||||||
@ -155,18 +201,23 @@ namespace hermes {
|
|||||||
*(uint16_t*)&discoveryPkt[0] = htons(HERMES_METIS_SIGNATURE);
|
*(uint16_t*)&discoveryPkt[0] = htons(HERMES_METIS_SIGNATURE);
|
||||||
discoveryPkt[2] = METIS_PKT_DISCOVER;
|
discoveryPkt[2] = METIS_PKT_DISCOVER;
|
||||||
|
|
||||||
|
// Get interface list
|
||||||
|
auto ifaces = net::listInterfaces();
|
||||||
|
|
||||||
// Send the packet 5 times to make sure it's received
|
// Send the packet 5 times to make sure it's received
|
||||||
for (int i = 0; i < HERMES_DISCOVER_REPEAT; i++) {
|
for (const auto& [name, iface] : ifaces) {
|
||||||
sock->send(discoveryPkt, sizeof(discoveryPkt));
|
net::Address baddr(iface.broadcast, 1024);
|
||||||
|
for (int i = 0; i < HERMES_METIS_REPEAT; i++) {
|
||||||
|
sock->send(discoveryPkt, sizeof(discoveryPkt), &baddr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Info> devices;
|
std::vector<Info> devices;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
// Wait for a response
|
// Wait for a response
|
||||||
net::Address addr;
|
net::Address addr;
|
||||||
uint8_t resp[1024];
|
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
|
// Give up if timeout or error
|
||||||
if (len <= 0) { break; }
|
if (len <= 0) { break; }
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
#define HERMES_DISCOVER_REPEAT 5
|
#define HERMES_METIS_REPEAT 5
|
||||||
#define HERMES_DISCOVER_TIMEOUT 1000
|
#define HERMES_METIS_TIMEOUT 1000
|
||||||
#define HERMES_METIS_SIGNATURE 0xEFFE
|
#define HERMES_METIS_SIGNATURE 0xEFFE
|
||||||
#define HERMES_HPSDR_USB_SYNC 0x7F
|
#define HERMES_HPSDR_USB_SYNC 0x7F
|
||||||
|
|
||||||
@ -80,6 +80,11 @@ namespace hermes {
|
|||||||
HL_SAMP_RATE_384KHZ = 3
|
HL_SAMP_RATE_384KHZ = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum I2CPort {
|
||||||
|
I2C_PORT_1 = 0,
|
||||||
|
I2C_PORT_2
|
||||||
|
};
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
struct HPSDRUSBHeader {
|
struct HPSDRUSBHeader {
|
||||||
uint8_t sync[3];
|
uint8_t sync[3];
|
||||||
@ -130,6 +135,7 @@ namespace hermes {
|
|||||||
void setSamplerate(HermesLiteSamplerate samplerate);
|
void setSamplerate(HermesLiteSamplerate samplerate);
|
||||||
void setFrequency(double freq);
|
void setFrequency(double freq);
|
||||||
void setGain(int gain);
|
void setGain(int gain);
|
||||||
|
void autoeFilters(double freq);
|
||||||
|
|
||||||
dsp::stream<dsp::complex_t> out;
|
dsp::stream<dsp::complex_t> out;
|
||||||
|
|
||||||
@ -140,13 +146,19 @@ namespace hermes {
|
|||||||
uint32_t readReg(uint8_t addr);
|
uint32_t readReg(uint8_t addr);
|
||||||
void writeReg(uint8_t addr, uint32_t val);
|
void writeReg(uint8_t addr, uint32_t val);
|
||||||
|
|
||||||
|
void writeI2C(I2CPort port, uint8_t addr, uint8_t reg, uint8_t data);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void worker();
|
void worker();
|
||||||
|
|
||||||
bool open = true;
|
bool open = true;
|
||||||
|
double freq = 0;
|
||||||
|
|
||||||
std::thread workerThread;
|
std::thread workerThread;
|
||||||
std::shared_ptr<net::Socket> sock;
|
std::shared_ptr<net::Socket> sock;
|
||||||
uint32_t usbSeq = 0;
|
uint32_t usbSeq = 0;
|
||||||
|
uint8_t lastFilt = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,15 +48,6 @@ public:
|
|||||||
handler.stopHandler = stop;
|
handler.stopHandler = stop;
|
||||||
handler.tuneHandler = tune;
|
handler.tuneHandler = tune;
|
||||||
handler.stream = &stream;
|
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);
|
sigpath::sourceManager.registerSource("Hermes", &handler);
|
||||||
}
|
}
|
||||||
@ -132,6 +123,20 @@ private:
|
|||||||
|
|
||||||
static void menuSelected(void* ctx) {
|
static void menuSelected(void* ctx) {
|
||||||
HermesSourceModule* _this = (HermesSourceModule*)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);
|
core::setInputSampleRate(_this->sampleRate);
|
||||||
spdlog::info("HermesSourceModule '{0}': Menu Select!", _this->name);
|
spdlog::info("HermesSourceModule '{0}': Menu Select!", _this->name);
|
||||||
}
|
}
|
||||||
@ -257,6 +262,8 @@ private:
|
|||||||
int srId = 0;
|
int srId = 0;
|
||||||
int gain = 0;
|
int gain = 0;
|
||||||
|
|
||||||
|
bool firstSelect = true;
|
||||||
|
|
||||||
std::shared_ptr<hermes::Client> dev;
|
std::shared_ptr<hermes::Client> dev;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <codecvt>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define WOULD_BLOCK (WSAGetLastError() == WSAEWOULDBLOCK)
|
#define WOULD_BLOCK (WSAGetLastError() == WSAEWOULDBLOCK)
|
||||||
@ -246,6 +247,60 @@ namespace net {
|
|||||||
|
|
||||||
// === Creation functions ===
|
// === Creation functions ===
|
||||||
|
|
||||||
|
std::map<std::string, InterfaceInfo> listInterfaces() {
|
||||||
|
// Init library if needed
|
||||||
|
init();
|
||||||
|
|
||||||
|
std::map<std::string, InterfaceInfo> 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<std::codecvt_utf8<wchar_t>> 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<Listener> listen(const Address& addr) {
|
std::shared_ptr<Listener> listen(const Address& addr) {
|
||||||
// Init library if needed
|
// Init library if needed
|
||||||
init();
|
init();
|
||||||
|
@ -2,10 +2,12 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <WinSock2.h>
|
#include <WinSock2.h>
|
||||||
#include <WS2tcpip.h>
|
#include <WS2tcpip.h>
|
||||||
|
#include <iphlpapi.h>
|
||||||
#else
|
#else
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
@ -16,6 +18,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <ifaddrs.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace net {
|
namespace net {
|
||||||
@ -30,6 +33,12 @@ namespace net {
|
|||||||
class Socket;
|
class Socket;
|
||||||
class Listener;
|
class Listener;
|
||||||
|
|
||||||
|
struct InterfaceInfo {
|
||||||
|
IP_t address;
|
||||||
|
IP_t netmask;
|
||||||
|
IP_t broadcast;
|
||||||
|
};
|
||||||
|
|
||||||
class Address {
|
class Address {
|
||||||
friend Socket;
|
friend Socket;
|
||||||
friend Listener;
|
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<std::string, InterfaceInfo> listInterfaces();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create TCP listener.
|
* Create TCP listener.
|
||||||
* @param addr Address to listen on.
|
* @param addr Address to listen on.
|
||||||
|
@ -115,11 +115,9 @@ private:
|
|||||||
if (!_this->client) { return; }
|
if (!_this->client) { return; }
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Set configuration here
|
// Set configuration
|
||||||
if (_this->client) {
|
_this->client->setFrequency(_this->freq);
|
||||||
_this->client->setFrequency(_this->freq);
|
_this->client->start();
|
||||||
_this->client->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
_this->running = true;
|
_this->running = true;
|
||||||
spdlog::info("SDRPPServerSourceModule '{0}': Start!", _this->name);
|
spdlog::info("SDRPPServerSourceModule '{0}': Start!", _this->name);
|
||||||
|
@ -30,8 +30,6 @@ public:
|
|||||||
this->name = name;
|
this->name = name;
|
||||||
|
|
||||||
sampleRate = 8000000.0;
|
sampleRate = 8000000.0;
|
||||||
// TODO: REMOVE
|
|
||||||
samplerates.define(8000000, "8MHz", 8000000.0);
|
|
||||||
|
|
||||||
handler.ctx = this;
|
handler.ctx = this;
|
||||||
handler.selectHandler = menuSelected;
|
handler.selectHandler = menuSelected;
|
||||||
@ -42,15 +40,6 @@ public:
|
|||||||
handler.tuneHandler = tune;
|
handler.tuneHandler = tune;
|
||||||
handler.stream = &stream;
|
handler.stream = &stream;
|
||||||
|
|
||||||
// List devices
|
|
||||||
refresh();
|
|
||||||
|
|
||||||
// Select device
|
|
||||||
config.acquire();
|
|
||||||
selectedSer = config.conf["device"];
|
|
||||||
config.release();
|
|
||||||
select(selectedSer);
|
|
||||||
|
|
||||||
sigpath::sourceManager.registerSource("USRP", &handler);
|
sigpath::sourceManager.registerSource("USRP", &handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,6 +201,20 @@ private:
|
|||||||
|
|
||||||
static void menuSelected(void* ctx) {
|
static void menuSelected(void* ctx) {
|
||||||
USRPSourceModule* _this = (USRPSourceModule*)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);
|
core::setInputSampleRate(_this->sampleRate);
|
||||||
spdlog::info("USRPSourceModule '{0}': Menu Select!", _this->name);
|
spdlog::info("USRPSourceModule '{0}': Menu Select!", _this->name);
|
||||||
}
|
}
|
||||||
@ -406,6 +409,8 @@ private:
|
|||||||
uhd::usrp::multi_usrp::sptr dev;
|
uhd::usrp::multi_usrp::sptr dev;
|
||||||
uhd::rx_streamer::sptr streamer;
|
uhd::rx_streamer::sptr streamer;
|
||||||
|
|
||||||
|
bool firstSelect = true;
|
||||||
|
|
||||||
std::thread workerThread;
|
std::thread workerThread;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user