From 27571bd63a425696d5d8115d177a25050c001026 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 13 Jan 2019 14:12:09 +0000 Subject: [PATCH 01/47] add docker packaging --- Dockerfile | 14 ++++++++++ docker/install-dependencies.sh | 49 ++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 Dockerfile create mode 100755 docker/install-dependencies.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1a94979 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM raspbian/stretch + +RUN apt-get update &&\ + apt-get -y install sox libfftw3-dev python rtl-sdr netcat libitpp-dev libsndfile1-dev + +ADD docker/install-dependencies.sh / +RUN /install-dependencies.sh + +ADD . /openwebrx + +WORKDIR /openwebrx + +CMD python openwebrx.py +EXPOSE 8073 diff --git a/docker/install-dependencies.sh b/docker/install-dependencies.sh new file mode 100755 index 0000000..1cb6c15 --- /dev/null +++ b/docker/install-dependencies.sh @@ -0,0 +1,49 @@ +#!/bin/bash +set -euo pipefail + +cd /tmp + +BUILD_PACKAGES="git build-essential cmake" + +apt-get -y install $BUILD_PACKAGES + +git clone https://github.com/simonyiszk/csdr.git +cd csdr +make +make install +cd .. +rm -rf csdr + +git clone https://github.com/szechyjs/mbelib.git +cd mbelib +mkdir build +cd build +cmake .. +make +make install +cd ../.. +rm -rf mbelib + +git clone https://github.com/jketterl/digiham.git +cd digiham +mkdir build +cd build +cmake .. +make +make install +cd ../.. +rm -rf digiham + +git clone https://github.com/szechyjs/dsd.git +cd dsd +mkdir build +cd build +cmake .. +make +make install +cd ../.. +rm -rf dsd + +apt-get -y purge $BUILD_PACKAGES +apt-get -y autoremove + From 51b9d1289abe055da4972ab6033b9cfb396e6cbe Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 13 Jan 2019 15:54:36 +0000 Subject: [PATCH 02/47] reduce size --- Dockerfile | 5 +---- docker/install-dependencies.sh | 10 ++++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1a94979..dce099f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,5 @@ FROM raspbian/stretch -RUN apt-get update &&\ - apt-get -y install sox libfftw3-dev python rtl-sdr netcat libitpp-dev libsndfile1-dev - ADD docker/install-dependencies.sh / RUN /install-dependencies.sh @@ -10,5 +7,5 @@ ADD . /openwebrx WORKDIR /openwebrx -CMD python openwebrx.py +CMD python2.7 openwebrx.py EXPOSE 8073 diff --git a/docker/install-dependencies.sh b/docker/install-dependencies.sh index 1cb6c15..350b56f 100755 --- a/docker/install-dependencies.sh +++ b/docker/install-dependencies.sh @@ -1,11 +1,13 @@ #!/bin/bash -set -euo pipefail +set -euxo pipefail cd /tmp +STATIC_PACKAGES="sox libfftw3-dev python2.7 rtl-sdr netcat libitpp-dev libsndfile1-dev" BUILD_PACKAGES="git build-essential cmake" -apt-get -y install $BUILD_PACKAGES +apt-get update +apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES git clone https://github.com/simonyiszk/csdr.git cd csdr @@ -44,6 +46,6 @@ make install cd ../.. rm -rf dsd -apt-get -y purge $BUILD_PACKAGES -apt-get -y autoremove +apt-get remove --purge --autoremove -y $BUILD_PACKAGES +rm -rf /var/lib/apt/lists/* From 4f6a9249e81e1f6372f8e84c58ca099acbab6b1f Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 13 Jan 2019 21:04:29 +0000 Subject: [PATCH 03/47] add sdrplay support --- Dockerfile | 4 +- docker/install-dependencies.sh | 84 +++++++++++++++++++++++----------- docker/install-lib.patch | 22 +++++++++ docker/run.sh | 23 ++++++++++ 4 files changed, 105 insertions(+), 28 deletions(-) create mode 100644 docker/install-lib.patch create mode 100755 docker/run.sh diff --git a/Dockerfile b/Dockerfile index dce099f..c4ec602 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,5 +7,7 @@ ADD . /openwebrx WORKDIR /openwebrx -CMD python2.7 openwebrx.py +VOLUME /config + +ENTRYPOINT [ "/openwebrx/docker/run.sh" ] EXPOSE 8073 diff --git a/docker/install-dependencies.sh b/docker/install-dependencies.sh index 350b56f..5cc356d 100755 --- a/docker/install-dependencies.sh +++ b/docker/install-dependencies.sh @@ -1,14 +1,65 @@ #!/bin/bash set -euxo pipefail +function cmakebuild() { + cd $1 + mkdir build + cd build + cmake .. + make + sudo make install + cd ../.. + rm -rf $1 +} + cd /tmp -STATIC_PACKAGES="sox libfftw3-dev python2.7 rtl-sdr netcat libitpp-dev libsndfile1-dev" -BUILD_PACKAGES="git build-essential cmake" +STATIC_PACKAGES="sox libfftw3-dev python2.7 rtl-sdr netcat libitpp-dev libsndfile1-dev libusb-dev" +BUILD_PACKAGES="git build-essential cmake patch" apt-get update apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES +wget http://www.sdrplay.com/software/SDRplay_RSP_API-RPi-2.13.1.run +sh SDRplay_RSP_API-RPi-2.13.1.run --noexec --target sdrplay +patch -Np0 <<'EOF' +--- sdrplay/install_lib.sh 2018-06-20 23:57:02.000000000 +0000 ++++ sdrplay/install_lib_patched.sh 2019-01-13 17:52:56.723838354 +0000 +@@ -2,18 +2,6 @@ + + echo "Installing SDRplay RSP API library 2.13..." + +-more sdrplay_license.txt +- +-while true; do +- echo "Press y and RETURN to accept the license agreement and continue with" +- read -p "the installation, or press n and RETURN to exit the installer [y/n] " yn +- case $yn in +- [Yy]* ) break;; +- [Nn]* ) exit;; +- * ) echo "Please answer y or n";; +- esac +-done +- + export ARCH=`arch` + export VERS="2.13" + +EOF +cd sdrplay +./install_lib.sh +cd .. +rm -rf sdrplay +rm SDRplay_RSP_API-RPi-2.13.1.run + +git clone https://github.com/pothosware/SoapySDR +cmakebuild SoapySDR + +git clone https://github.com/pothosware/SoapySDRPlay.git +cmakebuild SoapySDRPlay + +git clone https://github.com/rxseger/rx_tools +cmakebuild rx_tools + git clone https://github.com/simonyiszk/csdr.git cd csdr make @@ -17,34 +68,13 @@ cd .. rm -rf csdr git clone https://github.com/szechyjs/mbelib.git -cd mbelib -mkdir build -cd build -cmake .. -make -make install -cd ../.. -rm -rf mbelib - +cmakebuild mbelib + git clone https://github.com/jketterl/digiham.git -cd digiham -mkdir build -cd build -cmake .. -make -make install -cd ../.. -rm -rf digiham +cmakebuild digiham git clone https://github.com/szechyjs/dsd.git -cd dsd -mkdir build -cd build -cmake .. -make -make install -cd ../.. -rm -rf dsd +cmakebuild dsd apt-get remove --purge --autoremove -y $BUILD_PACKAGES rm -rf /var/lib/apt/lists/* diff --git a/docker/install-lib.patch b/docker/install-lib.patch new file mode 100644 index 0000000..b0c507c --- /dev/null +++ b/docker/install-lib.patch @@ -0,0 +1,22 @@ +--- sdrplay/install_lib.sh 2018-06-20 23:57:02.000000000 +0000 ++++ sdrplay/install_lib_patched.sh 2019-01-13 17:52:56.723838354 +0000 +@@ -2,18 +2,6 @@ + + echo "Installing SDRplay RSP API library 2.13..." + +-more sdrplay_license.txt +- +-while true; do +- echo "Press y and RETURN to accept the license agreement and continue with" +- read -p "the installation, or press n and RETURN to exit the installer [y/n] " yn +- case $yn in +- [Yy]* ) break;; +- [Nn]* ) exit;; +- * ) echo "Please answer y or n";; +- esac +-done +- + export ARCH=`arch` + export VERS="2.13" + + diff --git a/docker/run.sh b/docker/run.sh new file mode 100755 index 0000000..e878d2b --- /dev/null +++ b/docker/run.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -euo pipefail + +if [[ ! -f /config/config_webrx.py ]] ; then + cp config_webrx.py /config +fi + +rm config_webrx.py +ln -s /config/config_webrx.py . + + +_term() { + echo "Caught signal!" + kill -TERM "$child" 2>/dev/null +} + +trap _term SIGTERM SIGINT + +python2.7 openwebrx.py $@ & + +child=$! +wait "$child" + From 075fee46b714b6fe2cb82acc476381891e7adca0 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 21 Jan 2019 16:38:46 +0000 Subject: [PATCH 04/47] use the dsd version with stdout support --- docker/install-dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/install-dependencies.sh b/docker/install-dependencies.sh index 5cc356d..79db05d 100755 --- a/docker/install-dependencies.sh +++ b/docker/install-dependencies.sh @@ -73,7 +73,7 @@ cmakebuild mbelib git clone https://github.com/jketterl/digiham.git cmakebuild digiham -git clone https://github.com/szechyjs/dsd.git +git clone https://github.com/f4exb/dsd.git cmakebuild dsd apt-get remove --purge --autoremove -y $BUILD_PACKAGES From 896fd0c178af03401ce655dee2b505a796e3a8f2 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 21 Jan 2019 16:40:36 +0000 Subject: [PATCH 05/47] add docker build and push scripts --- build.sh | 2 ++ push.sh | 2 ++ 2 files changed, 4 insertions(+) create mode 100755 build.sh create mode 100755 push.sh diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..1977aac --- /dev/null +++ b/build.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker build -t jketterl/openwebrx:latest . diff --git a/push.sh b/push.sh new file mode 100755 index 0000000..a2548af --- /dev/null +++ b/push.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker push jketterl/openwebrx From a60521420b294fba8c3c89e15e67477a2549749e Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 21 Jan 2019 17:02:58 +0000 Subject: [PATCH 06/47] prepare separate images based on the used sdr device --- build.sh | 4 +++- Dockerfile => docker/Dockerfiles/Dockerfile-base | 4 ++-- docker/Dockerfiles/Dockerfile-rtlsdr | 5 +++++ docker/Dockerfiles/Dockerfile-sdrplay | 5 +++++ docker/scripts/install-dependencies-rtlsdr.sh | 2 ++ docker/scripts/install-dependencies-sdrplay.sh | 2 ++ docker/{ => scripts}/install-dependencies.sh | 0 docker/{ => scripts}/install-lib.patch | 0 docker/{ => scripts}/run.sh | 0 push.sh | 2 +- 10 files changed, 20 insertions(+), 4 deletions(-) rename Dockerfile => docker/Dockerfiles/Dockerfile-base (55%) create mode 100644 docker/Dockerfiles/Dockerfile-rtlsdr create mode 100644 docker/Dockerfiles/Dockerfile-sdrplay create mode 100755 docker/scripts/install-dependencies-rtlsdr.sh create mode 100755 docker/scripts/install-dependencies-sdrplay.sh rename docker/{ => scripts}/install-dependencies.sh (100%) rename docker/{ => scripts}/install-lib.patch (100%) rename docker/{ => scripts}/run.sh (100%) diff --git a/build.sh b/build.sh index 1977aac..fdfb3c7 100755 --- a/build.sh +++ b/build.sh @@ -1,2 +1,4 @@ #!/bin/bash -docker build -t jketterl/openwebrx:latest . +docker build -t openwebrx-base -f docker/Dockerfiles/Dockerfile-base . +docker build -t jketterl/openwebrx-rtlsdr -t jketterl/openwebrx -f docker/Dockerfiles/Dockerfile-rtlsdr . +docker build -t jketterl/openwebrs-sdrplay -f docker/Dockerfiles/Dockerfile-sdrplay . diff --git a/Dockerfile b/docker/Dockerfiles/Dockerfile-base similarity index 55% rename from Dockerfile rename to docker/Dockerfiles/Dockerfile-base index c4ec602..54dfbdf 100644 --- a/Dockerfile +++ b/docker/Dockerfiles/Dockerfile-base @@ -1,6 +1,6 @@ FROM raspbian/stretch -ADD docker/install-dependencies.sh / +ADD docker/scripts/install-dependencies.sh / RUN /install-dependencies.sh ADD . /openwebrx @@ -9,5 +9,5 @@ WORKDIR /openwebrx VOLUME /config -ENTRYPOINT [ "/openwebrx/docker/run.sh" ] +ENTRYPOINT [ "/openwebrx/docker/scripts/run.sh" ] EXPOSE 8073 diff --git a/docker/Dockerfiles/Dockerfile-rtlsdr b/docker/Dockerfiles/Dockerfile-rtlsdr new file mode 100644 index 0000000..5daba32 --- /dev/null +++ b/docker/Dockerfiles/Dockerfile-rtlsdr @@ -0,0 +1,5 @@ +FROM openwebrx-base + +ADD docker/scripts/install-dependencies-rtlsdr.sh / +RUN /install-dependencies-rtlsdr.sh + diff --git a/docker/Dockerfiles/Dockerfile-sdrplay b/docker/Dockerfiles/Dockerfile-sdrplay new file mode 100644 index 0000000..c38f9d1 --- /dev/null +++ b/docker/Dockerfiles/Dockerfile-sdrplay @@ -0,0 +1,5 @@ +FROM openwebrx-base + +ADD docker/scripts/install-dependencies-sdrplay.sh / +RUN /install-dependencies-sdrplay.sh + diff --git a/docker/scripts/install-dependencies-rtlsdr.sh b/docker/scripts/install-dependencies-rtlsdr.sh new file mode 100755 index 0000000..13f4793 --- /dev/null +++ b/docker/scripts/install-dependencies-rtlsdr.sh @@ -0,0 +1,2 @@ +#!/bin/sh + diff --git a/docker/scripts/install-dependencies-sdrplay.sh b/docker/scripts/install-dependencies-sdrplay.sh new file mode 100755 index 0000000..05a7907 --- /dev/null +++ b/docker/scripts/install-dependencies-sdrplay.sh @@ -0,0 +1,2 @@ +#!/bin/bash + diff --git a/docker/install-dependencies.sh b/docker/scripts/install-dependencies.sh similarity index 100% rename from docker/install-dependencies.sh rename to docker/scripts/install-dependencies.sh diff --git a/docker/install-lib.patch b/docker/scripts/install-lib.patch similarity index 100% rename from docker/install-lib.patch rename to docker/scripts/install-lib.patch diff --git a/docker/run.sh b/docker/scripts/run.sh similarity index 100% rename from docker/run.sh rename to docker/scripts/run.sh diff --git a/push.sh b/push.sh index a2548af..6853b70 100755 --- a/push.sh +++ b/push.sh @@ -1,2 +1,2 @@ #!/bin/bash -docker push jketterl/openwebrx +docker push jketterl/openwebrx jketterl/openwebrx-rtlsdr jketterl/openwebrx-sdrplay From a712d5ca3e01d1e55a887751d52d5d8986406896 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 21 Jan 2019 17:44:35 +0000 Subject: [PATCH 07/47] split into separate docker builds --- build.sh | 1 + docker/scripts/install-dependencies-rtlsdr.sh | 9 ++- .../scripts/install-dependencies-sdrplay.sh | 63 +++++++++++++++++++ docker/scripts/install-dependencies.sh | 44 +------------ push.sh | 1 + 5 files changed, 75 insertions(+), 43 deletions(-) diff --git a/build.sh b/build.sh index fdfb3c7..caf047b 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euxo pipefail docker build -t openwebrx-base -f docker/Dockerfiles/Dockerfile-base . docker build -t jketterl/openwebrx-rtlsdr -t jketterl/openwebrx -f docker/Dockerfiles/Dockerfile-rtlsdr . docker build -t jketterl/openwebrs-sdrplay -f docker/Dockerfiles/Dockerfile-sdrplay . diff --git a/docker/scripts/install-dependencies-rtlsdr.sh b/docker/scripts/install-dependencies-rtlsdr.sh index 13f4793..1417bac 100755 --- a/docker/scripts/install-dependencies-rtlsdr.sh +++ b/docker/scripts/install-dependencies-rtlsdr.sh @@ -1,2 +1,9 @@ -#!/bin/sh +#!/bin/bash +set -euxo pipefail + +apt-get update +apt-get -y install --no-install-recommends rtl-sdr + +apt-get autoremove --purge -y +rm -rf /var/lib/apt/lists/* diff --git a/docker/scripts/install-dependencies-sdrplay.sh b/docker/scripts/install-dependencies-sdrplay.sh index 05a7907..9dbdac7 100755 --- a/docker/scripts/install-dependencies-sdrplay.sh +++ b/docker/scripts/install-dependencies-sdrplay.sh @@ -1,2 +1,65 @@ #!/bin/bash +set -euxo pipefail + +function cmakebuild() { + cd $1 + mkdir build + cd build + cmake .. + make + sudo make install + cd ../.. + rm -rf $1 +} + +cd /tmp + +STATIC_PACKAGES="libusb-1.0.0-dev" +BUILD_PACKAGES="git build-essential cmake patch" + +apt-get update +apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES + +wget http://www.sdrplay.com/software/SDRplay_RSP_API-RPi-2.13.1.run +sh SDRplay_RSP_API-RPi-2.13.1.run --noexec --target sdrplay +patch -Np0 <<'EOF' +--- sdrplay/install_lib.sh 2018-06-20 23:57:02.000000000 +0000 ++++ sdrplay/install_lib_patched.sh 2019-01-13 17:52:56.723838354 +0000 +@@ -2,18 +2,6 @@ + + echo "Installing SDRplay RSP API library 2.13..." + +-more sdrplay_license.txt +- +-while true; do +- echo "Press y and RETURN to accept the license agreement and continue with" +- read -p "the installation, or press n and RETURN to exit the installer [y/n] " yn +- case $yn in +- [Yy]* ) break;; +- [Nn]* ) exit;; +- * ) echo "Please answer y or n";; +- esac +-done +- + export ARCH=`arch` + export VERS="2.13" + +EOF +cd sdrplay +./install_lib.sh +cd .. +rm -rf sdrplay +rm SDRplay_RSP_API-RPi-2.13.1.run + +git clone https://github.com/pothosware/SoapySDR +cmakebuild SoapySDR + +git clone https://github.com/pothosware/SoapySDRPlay.git +cmakebuild SoapySDRPlay + +git clone https://github.com/rxseger/rx_tools +cmakebuild rx_tools + +apt-get remove --purge --autoremove -y $BUILD_PACKAGES +rm -rf /var/lib/apt/lists/* diff --git a/docker/scripts/install-dependencies.sh b/docker/scripts/install-dependencies.sh index 79db05d..7962ca2 100755 --- a/docker/scripts/install-dependencies.sh +++ b/docker/scripts/install-dependencies.sh @@ -14,52 +14,12 @@ function cmakebuild() { cd /tmp -STATIC_PACKAGES="sox libfftw3-dev python2.7 rtl-sdr netcat libitpp-dev libsndfile1-dev libusb-dev" -BUILD_PACKAGES="git build-essential cmake patch" +STATIC_PACKAGES="sox libfftw3-dev python2.7 netcat libitpp-dev libsndfile1-dev" +BUILD_PACKAGES="git build-essential cmake" apt-get update apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES -wget http://www.sdrplay.com/software/SDRplay_RSP_API-RPi-2.13.1.run -sh SDRplay_RSP_API-RPi-2.13.1.run --noexec --target sdrplay -patch -Np0 <<'EOF' ---- sdrplay/install_lib.sh 2018-06-20 23:57:02.000000000 +0000 -+++ sdrplay/install_lib_patched.sh 2019-01-13 17:52:56.723838354 +0000 -@@ -2,18 +2,6 @@ - - echo "Installing SDRplay RSP API library 2.13..." - --more sdrplay_license.txt -- --while true; do -- echo "Press y and RETURN to accept the license agreement and continue with" -- read -p "the installation, or press n and RETURN to exit the installer [y/n] " yn -- case $yn in -- [Yy]* ) break;; -- [Nn]* ) exit;; -- * ) echo "Please answer y or n";; -- esac --done -- - export ARCH=`arch` - export VERS="2.13" - -EOF -cd sdrplay -./install_lib.sh -cd .. -rm -rf sdrplay -rm SDRplay_RSP_API-RPi-2.13.1.run - -git clone https://github.com/pothosware/SoapySDR -cmakebuild SoapySDR - -git clone https://github.com/pothosware/SoapySDRPlay.git -cmakebuild SoapySDRPlay - -git clone https://github.com/rxseger/rx_tools -cmakebuild rx_tools - git clone https://github.com/simonyiszk/csdr.git cd csdr make diff --git a/push.sh b/push.sh index 6853b70..c39ff2e 100755 --- a/push.sh +++ b/push.sh @@ -1,2 +1,3 @@ #!/bin/bash +set -euxo pipefail docker push jketterl/openwebrx jketterl/openwebrx-rtlsdr jketterl/openwebrx-sdrplay From b2b04dc65f438fc9cfc67b86d2a7ef9d1f6ec4fe Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 21 Jan 2019 17:47:05 +0000 Subject: [PATCH 08/47] fix typo --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index caf047b..9525b88 100755 --- a/build.sh +++ b/build.sh @@ -2,4 +2,4 @@ set -euxo pipefail docker build -t openwebrx-base -f docker/Dockerfiles/Dockerfile-base . docker build -t jketterl/openwebrx-rtlsdr -t jketterl/openwebrx -f docker/Dockerfiles/Dockerfile-rtlsdr . -docker build -t jketterl/openwebrs-sdrplay -f docker/Dockerfiles/Dockerfile-sdrplay . +docker build -t jketterl/openwebrx-sdrplay -f docker/Dockerfiles/Dockerfile-sdrplay . From 28f84c518808b7cc68c35859ec378e0291ef2643 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 21 Jan 2019 22:53:59 +0000 Subject: [PATCH 09/47] pushes need to be separate --- push.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/push.sh b/push.sh index c39ff2e..345b566 100755 --- a/push.sh +++ b/push.sh @@ -1,3 +1,5 @@ #!/bin/bash set -euxo pipefail -docker push jketterl/openwebrx jketterl/openwebrx-rtlsdr jketterl/openwebrx-sdrplay +docker push jketterl/openwebrx +docker push jketterl/openwebrx-rtlsdr +docker push jketterl/openwebrx-sdrplay From 74930ba25395d4d490ca8b25edec4f40c043dc7a Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 22 Jan 2019 11:35:48 +0100 Subject: [PATCH 10/47] some compatibility --- docker/scripts/install-dependencies-sdrplay.sh | 6 +++--- docker/scripts/install-dependencies.sh | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docker/scripts/install-dependencies-sdrplay.sh b/docker/scripts/install-dependencies-sdrplay.sh index 9dbdac7..77ef381 100755 --- a/docker/scripts/install-dependencies-sdrplay.sh +++ b/docker/scripts/install-dependencies-sdrplay.sh @@ -6,8 +6,8 @@ function cmakebuild() { mkdir build cd build cmake .. - make - sudo make install + make + make install cd ../.. rm -rf $1 } @@ -15,7 +15,7 @@ function cmakebuild() { cd /tmp STATIC_PACKAGES="libusb-1.0.0-dev" -BUILD_PACKAGES="git build-essential cmake patch" +BUILD_PACKAGES="git build-essential cmake patch ca-certificates wget sudo udev" apt-get update apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES diff --git a/docker/scripts/install-dependencies.sh b/docker/scripts/install-dependencies.sh index 7962ca2..ac0149d 100755 --- a/docker/scripts/install-dependencies.sh +++ b/docker/scripts/install-dependencies.sh @@ -6,8 +6,8 @@ function cmakebuild() { mkdir build cd build cmake .. - make - sudo make install + make + make install cd ../.. rm -rf $1 } @@ -15,7 +15,7 @@ function cmakebuild() { cd /tmp STATIC_PACKAGES="sox libfftw3-dev python2.7 netcat libitpp-dev libsndfile1-dev" -BUILD_PACKAGES="git build-essential cmake" +BUILD_PACKAGES="git build-essential cmake ca-certificates" apt-get update apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES From dea09d8eaaa4064bf7b753a7c15602a6cdbf272e Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 22 Jan 2019 12:52:03 +0100 Subject: [PATCH 11/47] multi-platform build --- build.sh | 25 ++++++++++++++++--- docker/Dockerfiles/Dockerfile-base | 3 ++- .../scripts/install-dependencies-sdrplay.sh | 17 ++++++++++--- push.sh | 12 ++++++--- 4 files changed, 46 insertions(+), 11 deletions(-) diff --git a/build.sh b/build.sh index 9525b88..7d85499 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,24 @@ #!/bin/bash set -euxo pipefail -docker build -t openwebrx-base -f docker/Dockerfiles/Dockerfile-base . -docker build -t jketterl/openwebrx-rtlsdr -t jketterl/openwebrx -f docker/Dockerfiles/Dockerfile-rtlsdr . -docker build -t jketterl/openwebrx-sdrplay -f docker/Dockerfiles/Dockerfile-sdrplay . + +ARCH=$(uname -m) + +case $ARCH in + x86_64) + BASE_IMAGE=debian:stretch + ;; + armv*) + BASE_IMAGE=raspbian/stretch +esac + +TAGS=$ARCH + +docker build --build-arg BASE_IMAGE=$BASE_IMAGE -t openwebrx-base:$ARCH -f docker/Dockerfiles/Dockerfile-base . +docker build -t jketterl/openwebrx-rtlsdr:$ARCH -t jketterl/openwebrx:$ARCH -f docker/Dockerfiles/Dockerfile-rtlsdr . +docker build -t jketterl/openwebrx-sdrplay:$ARCH -f docker/Dockerfiles/Dockerfile-sdrplay . + +if [ "$ARCH" == "armv7l" ]; then + for image in openwebrx openwebrx-rtlsdr openwebrx-sdrplay; do + docker tag jketterl/$image:$ARCH jketterl/$image:latest + done +fi diff --git a/docker/Dockerfiles/Dockerfile-base b/docker/Dockerfiles/Dockerfile-base index 54dfbdf..3f30eb5 100644 --- a/docker/Dockerfiles/Dockerfile-base +++ b/docker/Dockerfiles/Dockerfile-base @@ -1,4 +1,5 @@ -FROM raspbian/stretch +ARG BASE_IMAGE +FROM $BASE_IMAGE ADD docker/scripts/install-dependencies.sh / RUN /install-dependencies.sh diff --git a/docker/scripts/install-dependencies-sdrplay.sh b/docker/scripts/install-dependencies-sdrplay.sh index 77ef381..4961057 100755 --- a/docker/scripts/install-dependencies-sdrplay.sh +++ b/docker/scripts/install-dependencies-sdrplay.sh @@ -20,8 +20,17 @@ BUILD_PACKAGES="git build-essential cmake patch ca-certificates wget sudo udev" apt-get update apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES -wget http://www.sdrplay.com/software/SDRplay_RSP_API-RPi-2.13.1.run -sh SDRplay_RSP_API-RPi-2.13.1.run --noexec --target sdrplay +case $(arch) in + x86_64) + BINARY=SDRplay_RSP_API-Linux-2.13.1.run + ;; + armv*) + BINARY=SDRplay_RSP_API-RPi-2.13.1.run + ;; +esac + +wget http://www.sdrplay.com/software/$BINARY +sh $BINARY --noexec --target sdrplay patch -Np0 <<'EOF' --- sdrplay/install_lib.sh 2018-06-20 23:57:02.000000000 +0000 +++ sdrplay/install_lib_patched.sh 2019-01-13 17:52:56.723838354 +0000 @@ -49,7 +58,7 @@ cd sdrplay ./install_lib.sh cd .. rm -rf sdrplay -rm SDRplay_RSP_API-RPi-2.13.1.run +rm $BINARY git clone https://github.com/pothosware/SoapySDR cmakebuild SoapySDR @@ -60,6 +69,6 @@ cmakebuild SoapySDRPlay git clone https://github.com/rxseger/rx_tools cmakebuild rx_tools -apt-get remove --purge --autoremove -y $BUILD_PACKAGES +SUDO_FORCE_REMOVE=yes apt-get remove --purge --autoremove -y $BUILD_PACKAGES rm -rf /var/lib/apt/lists/* diff --git a/push.sh b/push.sh index 345b566..318e059 100755 --- a/push.sh +++ b/push.sh @@ -1,5 +1,11 @@ #!/bin/bash set -euxo pipefail -docker push jketterl/openwebrx -docker push jketterl/openwebrx-rtlsdr -docker push jketterl/openwebrx-sdrplay + +ARCH=$(uname -m) + +for image in openwebrx openwebrx-rtlsdr openwebrx-sdrplay; do + docker push jketterl/$image:$ARCH + if [ "$ARCH" == "armv7l" ]; then + docker push jketterl/$image:latest + fi +done From 8d10fc573f76df937f7c4d4cdbfd242eb5439334 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 22 Jan 2019 14:52:53 +0000 Subject: [PATCH 12/47] move stuff to alpine to reduce image size (sdrplay not woking yet) --- build.sh | 6 +-- docker/Dockerfiles/Dockerfile-base | 2 + docker/Dockerfiles/Dockerfile-rtlsdr | 3 +- docker/Dockerfiles/Dockerfile-sdrplay | 3 +- docker/scripts/install-dependencies-rtlsdr.sh | 25 +++++++-- .../scripts/install-dependencies-sdrplay.sh | 12 ++--- docker/scripts/install-dependencies.sh | 51 ++++++++++++++++--- 7 files changed, 79 insertions(+), 23 deletions(-) diff --git a/build.sh b/build.sh index 7d85499..79fdda1 100755 --- a/build.sh +++ b/build.sh @@ -8,14 +8,14 @@ case $ARCH in BASE_IMAGE=debian:stretch ;; armv*) - BASE_IMAGE=raspbian/stretch + BASE_IMAGE=arm32v6/alpine esac TAGS=$ARCH docker build --build-arg BASE_IMAGE=$BASE_IMAGE -t openwebrx-base:$ARCH -f docker/Dockerfiles/Dockerfile-base . -docker build -t jketterl/openwebrx-rtlsdr:$ARCH -t jketterl/openwebrx:$ARCH -f docker/Dockerfiles/Dockerfile-rtlsdr . -docker build -t jketterl/openwebrx-sdrplay:$ARCH -f docker/Dockerfiles/Dockerfile-sdrplay . +docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-rtlsdr:$ARCH -t jketterl/openwebrx:$ARCH -f docker/Dockerfiles/Dockerfile-rtlsdr . +docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-sdrplay:$ARCH -f docker/Dockerfiles/Dockerfile-sdrplay . if [ "$ARCH" == "armv7l" ]; then for image in openwebrx openwebrx-rtlsdr openwebrx-sdrplay; do diff --git a/docker/Dockerfiles/Dockerfile-base b/docker/Dockerfiles/Dockerfile-base index 3f30eb5..f58d41e 100644 --- a/docker/Dockerfiles/Dockerfile-base +++ b/docker/Dockerfiles/Dockerfile-base @@ -1,6 +1,8 @@ ARG BASE_IMAGE FROM $BASE_IMAGE +RUN apk add --no-cache bash + ADD docker/scripts/install-dependencies.sh / RUN /install-dependencies.sh diff --git a/docker/Dockerfiles/Dockerfile-rtlsdr b/docker/Dockerfiles/Dockerfile-rtlsdr index 5daba32..3e14ab0 100644 --- a/docker/Dockerfiles/Dockerfile-rtlsdr +++ b/docker/Dockerfiles/Dockerfile-rtlsdr @@ -1,4 +1,5 @@ -FROM openwebrx-base +ARG ARCH +FROM openwebrx-base:$ARCH ADD docker/scripts/install-dependencies-rtlsdr.sh / RUN /install-dependencies-rtlsdr.sh diff --git a/docker/Dockerfiles/Dockerfile-sdrplay b/docker/Dockerfiles/Dockerfile-sdrplay index c38f9d1..1e11c8a 100644 --- a/docker/Dockerfiles/Dockerfile-sdrplay +++ b/docker/Dockerfiles/Dockerfile-sdrplay @@ -1,4 +1,5 @@ -FROM openwebrx-base +ARG ARCH +FROM openwebrx-base:$ARCH ADD docker/scripts/install-dependencies-sdrplay.sh / RUN /install-dependencies-sdrplay.sh diff --git a/docker/scripts/install-dependencies-rtlsdr.sh b/docker/scripts/install-dependencies-rtlsdr.sh index 1417bac..09f8676 100755 --- a/docker/scripts/install-dependencies-rtlsdr.sh +++ b/docker/scripts/install-dependencies-rtlsdr.sh @@ -1,9 +1,26 @@ #!/bin/bash set -euxo pipefail -apt-get update -apt-get -y install --no-install-recommends rtl-sdr +function cmakebuild() { + cd $1 + mkdir build + cd build + cmake .. + make + make install + cd ../.. + rm -rf $1 +} -apt-get autoremove --purge -y -rm -rf /var/lib/apt/lists/* +cd /tmp +STATIC_PACKAGES="libusb" +BUILD_PACKAGES="git libusb-dev cmake make gcc musl-dev g++ linux-headers" + +apk add --no-cache $STATIC_PACKAGES +apk add --no-cache --virtual .build-deps $BUILD_PACKAGES + +git clone https://github.com/osmocom/rtl-sdr.git +cmakebuild rtl-sdr + +apk del .build-deps diff --git a/docker/scripts/install-dependencies-sdrplay.sh b/docker/scripts/install-dependencies-sdrplay.sh index 4961057..c6c003c 100755 --- a/docker/scripts/install-dependencies-sdrplay.sh +++ b/docker/scripts/install-dependencies-sdrplay.sh @@ -14,11 +14,11 @@ function cmakebuild() { cd /tmp -STATIC_PACKAGES="libusb-1.0.0-dev" -BUILD_PACKAGES="git build-essential cmake patch ca-certificates wget sudo udev" +STATIC_PACKAGES="libusb" +BUILD_PACKAGES="git cmake make patch wget sudo udev gcc g++ libusb-dev" -apt-get update -apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES +apk add --no-cache $STATIC_PACKAGES +apk add --no-cache --virtual .build-deps $BUILD_PACKAGES case $(arch) in x86_64) @@ -69,6 +69,4 @@ cmakebuild SoapySDRPlay git clone https://github.com/rxseger/rx_tools cmakebuild rx_tools -SUDO_FORCE_REMOVE=yes apt-get remove --purge --autoremove -y $BUILD_PACKAGES -rm -rf /var/lib/apt/lists/* - +apk del .build-deps diff --git a/docker/scripts/install-dependencies.sh b/docker/scripts/install-dependencies.sh index ac0149d..b3049d3 100755 --- a/docker/scripts/install-dependencies.sh +++ b/docker/scripts/install-dependencies.sh @@ -14,14 +14,53 @@ function cmakebuild() { cd /tmp -STATIC_PACKAGES="sox libfftw3-dev python2.7 netcat libitpp-dev libsndfile1-dev" -BUILD_PACKAGES="git build-essential cmake ca-certificates" +STATIC_PACKAGES="sox fftw python2 netcat-openbsd libsndfile lapack" +BUILD_PACKAGES="git libsndfile-dev fftw-dev cmake ca-certificates make gcc musl-dev g++ lapack-dev linux-headers" -apt-get update -apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES +apk add --no-cache $STATIC_PACKAGES +apk add --no-cache --virtual .build-deps $BUILD_PACKAGES + +git clone https://git.code.sf.net/p/itpp/git itpp +cmakebuild itpp git clone https://github.com/simonyiszk/csdr.git cd csdr +patch -Np1 <<'EOF' +--- a/csdr.c ++++ b/csdr.c +@@ -38,6 +38,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include ++#include + #include + #include + #include +diff --git a/ddcd_old.h b/ddcd_old.h +index af4cfb5..b70092b 100644 +--- a/ddcd_old.h ++++ b/ddcd_old.h +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + + typedef struct client_s + { +diff --git a/nmux.h b/nmux.h +index 038bc51..079e416 100644 +--- a/nmux.h ++++ b/nmux.h +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + #include "tsmpool.h" + + #define MSG_START "nmux: " +EOF make make install cd .. @@ -36,6 +75,4 @@ cmakebuild digiham git clone https://github.com/f4exb/dsd.git cmakebuild dsd -apt-get remove --purge --autoremove -y $BUILD_PACKAGES -rm -rf /var/lib/apt/lists/* - +apk del .build-deps From 9953c7d1e14b541231690682795d54014dd10775 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 22 Jan 2019 17:25:46 +0100 Subject: [PATCH 13/47] fix the sdrplay driver installation --- build.sh | 2 +- .../scripts/install-dependencies-sdrplay.sh | 37 ++++++++++++++----- docker/scripts/install-lib.patch | 28 +++++++++++--- 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/build.sh b/build.sh index 79fdda1..4d03ffa 100755 --- a/build.sh +++ b/build.sh @@ -5,7 +5,7 @@ ARCH=$(uname -m) case $ARCH in x86_64) - BASE_IMAGE=debian:stretch + BASE_IMAGE=alpine ;; armv*) BASE_IMAGE=arm32v6/alpine diff --git a/docker/scripts/install-dependencies-sdrplay.sh b/docker/scripts/install-dependencies-sdrplay.sh index c6c003c..bdad22f 100755 --- a/docker/scripts/install-dependencies-sdrplay.sh +++ b/docker/scripts/install-dependencies-sdrplay.sh @@ -20,7 +20,7 @@ BUILD_PACKAGES="git cmake make patch wget sudo udev gcc g++ libusb-dev" apk add --no-cache $STATIC_PACKAGES apk add --no-cache --virtual .build-deps $BUILD_PACKAGES -case $(arch) in +case $(uname -m) in x86_64) BINARY=SDRplay_RSP_API-Linux-2.13.1.run ;; @@ -31,13 +31,13 @@ esac wget http://www.sdrplay.com/software/$BINARY sh $BINARY --noexec --target sdrplay -patch -Np0 <<'EOF' ---- sdrplay/install_lib.sh 2018-06-20 23:57:02.000000000 +0000 -+++ sdrplay/install_lib_patched.sh 2019-01-13 17:52:56.723838354 +0000 -@@ -2,18 +2,6 @@ - +patch --verbose -Np0 <<'EOF' +--- sdrplay/install_lib.sh 2018-06-21 01:57:02.000000000 +0200 ++++ sdrplay/install_lib_patched.sh 2019-01-22 17:21:06.445804136 +0100 +@@ -2,19 +2,7 @@ + echo "Installing SDRplay RSP API library 2.13..." - + -more sdrplay_license.txt - -while true; do @@ -50,9 +50,28 @@ patch -Np0 <<'EOF' - esac -done - - export ARCH=`arch` +-export ARCH=`arch` ++export ARCH=`uname -m` export VERS="2.13" - + + echo "Architecture: ${ARCH}" +@@ -60,16 +48,6 @@ + echo " " + exit 1 + fi +- +-if /sbin/ldconfig -p | /bin/fgrep -q libusb-1.0; then +- echo "Libusb found, continuing..." +-else +- echo " " +- echo "ERROR: Libusb cannot be found. Please install libusb and then run" +- echo "the installer again. Libusb can be installed from http://libusb.info" +- echo " " +- exit 1 +-fi + + #echo "Installing SoapySDRPlay..." + EOF cd sdrplay ./install_lib.sh diff --git a/docker/scripts/install-lib.patch b/docker/scripts/install-lib.patch index b0c507c..588f14e 100644 --- a/docker/scripts/install-lib.patch +++ b/docker/scripts/install-lib.patch @@ -1,6 +1,6 @@ ---- sdrplay/install_lib.sh 2018-06-20 23:57:02.000000000 +0000 -+++ sdrplay/install_lib_patched.sh 2019-01-13 17:52:56.723838354 +0000 -@@ -2,18 +2,6 @@ +--- sdrplay/install_lib.sh 2018-06-21 01:57:02.000000000 +0200 ++++ sdrplay/install_lib_patched.sh 2019-01-22 17:21:06.445804136 +0100 +@@ -2,19 +2,7 @@ echo "Installing SDRplay RSP API library 2.13..." @@ -16,7 +16,25 @@ - esac -done - - export ARCH=`arch` +-export ARCH=`arch` ++export ARCH=`uname -m` export VERS="2.13" - + echo "Architecture: ${ARCH}" +@@ -60,16 +48,6 @@ + echo " " + exit 1 + fi +- +-if /sbin/ldconfig -p | /bin/fgrep -q libusb-1.0; then +- echo "Libusb found, continuing..." +-else +- echo " " +- echo "ERROR: Libusb cannot be found. Please install libusb and then run" +- echo "the installer again. Libusb can be installed from http://libusb.info" +- echo " " +- exit 1 +-fi + + #echo "Installing SoapySDRPlay..." + From a2766bcc2ef1f0b5cf2f44f6ef3f08c4b459df57 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 22 Jan 2019 17:44:58 +0100 Subject: [PATCH 14/47] separate patch for raspberry --- docker/Dockerfiles/Dockerfile-sdrplay | 1 + .../scripts/install-dependencies-sdrplay.sh | 46 ++----------------- docker/scripts/install-lib.armv7l.patch | 38 +++++++++++++++ ...all-lib.patch => install-lib.x86_64.patch} | 0 4 files changed, 43 insertions(+), 42 deletions(-) create mode 100644 docker/scripts/install-lib.armv7l.patch rename docker/scripts/{install-lib.patch => install-lib.x86_64.patch} (100%) diff --git a/docker/Dockerfiles/Dockerfile-sdrplay b/docker/Dockerfiles/Dockerfile-sdrplay index 1e11c8a..cd5e37e 100644 --- a/docker/Dockerfiles/Dockerfile-sdrplay +++ b/docker/Dockerfiles/Dockerfile-sdrplay @@ -2,5 +2,6 @@ ARG ARCH FROM openwebrx-base:$ARCH ADD docker/scripts/install-dependencies-sdrplay.sh / +ADD docker/scripts/install-lib.*.patch / RUN /install-dependencies-sdrplay.sh diff --git a/docker/scripts/install-dependencies-sdrplay.sh b/docker/scripts/install-dependencies-sdrplay.sh index bdad22f..888510b 100755 --- a/docker/scripts/install-dependencies-sdrplay.sh +++ b/docker/scripts/install-dependencies-sdrplay.sh @@ -20,7 +20,9 @@ BUILD_PACKAGES="git cmake make patch wget sudo udev gcc g++ libusb-dev" apk add --no-cache $STATIC_PACKAGES apk add --no-cache --virtual .build-deps $BUILD_PACKAGES -case $(uname -m) in +ARCH=$(uname -m) + +case $ARCH in x86_64) BINARY=SDRplay_RSP_API-Linux-2.13.1.run ;; @@ -31,48 +33,8 @@ esac wget http://www.sdrplay.com/software/$BINARY sh $BINARY --noexec --target sdrplay -patch --verbose -Np0 <<'EOF' ---- sdrplay/install_lib.sh 2018-06-21 01:57:02.000000000 +0200 -+++ sdrplay/install_lib_patched.sh 2019-01-22 17:21:06.445804136 +0100 -@@ -2,19 +2,7 @@ +patch --verbose -Np0 < /install-lib.$ARCH.patch - echo "Installing SDRplay RSP API library 2.13..." - --more sdrplay_license.txt -- --while true; do -- echo "Press y and RETURN to accept the license agreement and continue with" -- read -p "the installation, or press n and RETURN to exit the installer [y/n] " yn -- case $yn in -- [Yy]* ) break;; -- [Nn]* ) exit;; -- * ) echo "Please answer y or n";; -- esac --done -- --export ARCH=`arch` -+export ARCH=`uname -m` - export VERS="2.13" - - echo "Architecture: ${ARCH}" -@@ -60,16 +48,6 @@ - echo " " - exit 1 - fi -- --if /sbin/ldconfig -p | /bin/fgrep -q libusb-1.0; then -- echo "Libusb found, continuing..." --else -- echo " " -- echo "ERROR: Libusb cannot be found. Please install libusb and then run" -- echo "the installer again. Libusb can be installed from http://libusb.info" -- echo " " -- exit 1 --fi - - #echo "Installing SoapySDRPlay..." - -EOF cd sdrplay ./install_lib.sh cd .. diff --git a/docker/scripts/install-lib.armv7l.patch b/docker/scripts/install-lib.armv7l.patch new file mode 100644 index 0000000..39d99d1 --- /dev/null +++ b/docker/scripts/install-lib.armv7l.patch @@ -0,0 +1,38 @@ +--- sdrplay/install_lib.sh 2018-06-21 20:47:08.000000000 +0200 ++++ sdrplay/install_lib_patched.sh 2019-01-22 17:35:57.761927708 +0100 +@@ -3,18 +3,6 @@ + + echo "Installing SDRplay RSP API library 2.13..." + +-more sdrplay_license.txt +- +-while true; do +- echo "Press y and RETURN to accept the license agreement and continue with" +- read -p "the installation, or press n and RETURN to exit the installer [y/n] " yn +- case $yn in +- [Yy]* ) break;; +- [Nn]* ) exit;; +- * ) echo "Please answer y or n";; +- esac +-done +- + export ARCH=`arch` + export VERS="2.13" + +@@ -63,16 +51,6 @@ + echo " " + exit 1 + fi +- +-if /sbin/ldconfig -p | /bin/fgrep -q libusb-1.0; then +- echo "Libusb found, continuing..." +-else +- echo " " +- echo "ERROR: Libusb cannot be found. Please install libusb and then run" +- echo "the installer again. Libusb can be installed from http://libusb.info" +- echo " " +- exit 1 +-fi + + sudo ldconfig + diff --git a/docker/scripts/install-lib.patch b/docker/scripts/install-lib.x86_64.patch similarity index 100% rename from docker/scripts/install-lib.patch rename to docker/scripts/install-lib.x86_64.patch From d5b5fc379875ad72595dbefce96e554c66a7272a Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 22 Jan 2019 18:27:25 +0000 Subject: [PATCH 15/47] fix the arch command --- docker/scripts/install-lib.armv7l.patch | 30 +++++++++++++------------ 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/docker/scripts/install-lib.armv7l.patch b/docker/scripts/install-lib.armv7l.patch index 39d99d1..0306c2b 100644 --- a/docker/scripts/install-lib.armv7l.patch +++ b/docker/scripts/install-lib.armv7l.patch @@ -1,6 +1,6 @@ ---- sdrplay/install_lib.sh 2018-06-21 20:47:08.000000000 +0200 -+++ sdrplay/install_lib_patched.sh 2019-01-22 17:35:57.761927708 +0100 -@@ -3,18 +3,6 @@ +--- sdrplay/install_lib.sh ++++ sdrplay/install_lib_patched.sh +@@ -3,19 +3,7 @@ echo "Installing SDRplay RSP API library 2.13..." @@ -16,13 +16,18 @@ - esac -done - - export ARCH=`arch` +-export ARCH=`arch` ++export ARCH=`uname -m` export VERS="2.13" -@@ -63,16 +51,6 @@ - echo " " - exit 1 - fi + echo "Architecture: ${ARCH}" +@@ -60,16 +48,6 @@ + echo "ERROR: udev rules directory not found, add udev support and run the" + echo "installer again. udev support can be added by running..." + echo "sudo apt-get install libudev-dev" +- echo " " +- exit 1 +-fi - -if /sbin/ldconfig -p | /bin/fgrep -q libusb-1.0; then - echo "Libusb found, continuing..." @@ -30,9 +35,6 @@ - echo " " - echo "ERROR: Libusb cannot be found. Please install libusb and then run" - echo "the installer again. Libusb can be installed from http://libusb.info" -- echo " " -- exit 1 --fi - - sudo ldconfig - + echo " " + exit 1 + fi From 8c0a8185497a677763598cb581ca9e723ecbb838 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 24 Jan 2019 16:46:16 +0100 Subject: [PATCH 16/47] split soapysdr from the sdrplay build --- build.sh | 1 + docker/Dockerfiles/Dockerfile-sdrplay | 2 +- docker/Dockerfiles/Dockerfile-soapysdr | 6 +++++ .../scripts/install-dependencies-sdrplay.sh | 6 ----- .../scripts/install-dependencies-soapysdr.sh | 27 +++++++++++++++++++ 5 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 docker/Dockerfiles/Dockerfile-soapysdr create mode 100755 docker/scripts/install-dependencies-soapysdr.sh diff --git a/build.sh b/build.sh index 4d03ffa..58d65b9 100755 --- a/build.sh +++ b/build.sh @@ -15,6 +15,7 @@ TAGS=$ARCH docker build --build-arg BASE_IMAGE=$BASE_IMAGE -t openwebrx-base:$ARCH -f docker/Dockerfiles/Dockerfile-base . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-rtlsdr:$ARCH -t jketterl/openwebrx:$ARCH -f docker/Dockerfiles/Dockerfile-rtlsdr . +docker build --build-arg ARCH=$ARCH -t openwebrx-soapysdr-base:$ARCH -f docker/Dockerfiles/Dockerfile-soapysdr . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-sdrplay:$ARCH -f docker/Dockerfiles/Dockerfile-sdrplay . if [ "$ARCH" == "armv7l" ]; then diff --git a/docker/Dockerfiles/Dockerfile-sdrplay b/docker/Dockerfiles/Dockerfile-sdrplay index cd5e37e..f9f2f1e 100644 --- a/docker/Dockerfiles/Dockerfile-sdrplay +++ b/docker/Dockerfiles/Dockerfile-sdrplay @@ -1,5 +1,5 @@ ARG ARCH -FROM openwebrx-base:$ARCH +FROM openwebrx-soapysdr-base:$ARCH ADD docker/scripts/install-dependencies-sdrplay.sh / ADD docker/scripts/install-lib.*.patch / diff --git a/docker/Dockerfiles/Dockerfile-soapysdr b/docker/Dockerfiles/Dockerfile-soapysdr new file mode 100644 index 0000000..1150442 --- /dev/null +++ b/docker/Dockerfiles/Dockerfile-soapysdr @@ -0,0 +1,6 @@ +ARG ARCH +FROM openwebrx-base:$ARCH + +ADD docker/scripts/install-dependencies-soapysdr.sh / +RUN /install-dependencies-soapysdr.sh + diff --git a/docker/scripts/install-dependencies-sdrplay.sh b/docker/scripts/install-dependencies-sdrplay.sh index 888510b..3ac29cc 100755 --- a/docker/scripts/install-dependencies-sdrplay.sh +++ b/docker/scripts/install-dependencies-sdrplay.sh @@ -41,13 +41,7 @@ cd .. rm -rf sdrplay rm $BINARY -git clone https://github.com/pothosware/SoapySDR -cmakebuild SoapySDR - git clone https://github.com/pothosware/SoapySDRPlay.git cmakebuild SoapySDRPlay -git clone https://github.com/rxseger/rx_tools -cmakebuild rx_tools - apk del .build-deps diff --git a/docker/scripts/install-dependencies-soapysdr.sh b/docker/scripts/install-dependencies-soapysdr.sh new file mode 100755 index 0000000..9e598c7 --- /dev/null +++ b/docker/scripts/install-dependencies-soapysdr.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -euxo pipefail + +function cmakebuild() { + cd $1 + mkdir build + cd build + cmake .. + make + make install + cd ../.. + rm -rf $1 +} + +cd /tmp + +BUILD_PACKAGES="git cmake make patch wget sudo udev gcc g++" + +apk add --no-cache --virtual .build-deps $BUILD_PACKAGES + +git clone https://github.com/pothosware/SoapySDR +cmakebuild SoapySDR + +git clone https://github.com/rxseger/rx_tools +cmakebuild rx_tools + +apk del .build-deps From 7bec9eaa87c47eb982ce17c45d40b46bec534f5b Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 24 Jan 2019 17:07:12 +0100 Subject: [PATCH 17/47] don't build/push the latest tag, that's a manifest now --- build.sh | 6 ------ push.sh | 3 --- 2 files changed, 9 deletions(-) diff --git a/build.sh b/build.sh index 58d65b9..a184419 100755 --- a/build.sh +++ b/build.sh @@ -17,9 +17,3 @@ docker build --build-arg BASE_IMAGE=$BASE_IMAGE -t openwebrx-base:$ARCH -f docke docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-rtlsdr:$ARCH -t jketterl/openwebrx:$ARCH -f docker/Dockerfiles/Dockerfile-rtlsdr . docker build --build-arg ARCH=$ARCH -t openwebrx-soapysdr-base:$ARCH -f docker/Dockerfiles/Dockerfile-soapysdr . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-sdrplay:$ARCH -f docker/Dockerfiles/Dockerfile-sdrplay . - -if [ "$ARCH" == "armv7l" ]; then - for image in openwebrx openwebrx-rtlsdr openwebrx-sdrplay; do - docker tag jketterl/$image:$ARCH jketterl/$image:latest - done -fi diff --git a/push.sh b/push.sh index 318e059..93ea599 100755 --- a/push.sh +++ b/push.sh @@ -5,7 +5,4 @@ ARCH=$(uname -m) for image in openwebrx openwebrx-rtlsdr openwebrx-sdrplay; do docker push jketterl/$image:$ARCH - if [ "$ARCH" == "armv7l" ]; then - docker push jketterl/$image:latest - fi done From 6294797466ca48c780302b5a578bb76519f506ea Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 24 Jan 2019 17:24:15 +0100 Subject: [PATCH 18/47] add hackrf support --- build.sh | 1 + docker/Dockerfiles/Dockerfile-hackrf | 6 ++++ docker/scripts/install-dependencies-hackrf.sh | 32 +++++++++++++++++++ push.sh | 2 +- 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 docker/Dockerfiles/Dockerfile-hackrf create mode 100755 docker/scripts/install-dependencies-hackrf.sh diff --git a/build.sh b/build.sh index a184419..4a86a03 100755 --- a/build.sh +++ b/build.sh @@ -17,3 +17,4 @@ docker build --build-arg BASE_IMAGE=$BASE_IMAGE -t openwebrx-base:$ARCH -f docke docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-rtlsdr:$ARCH -t jketterl/openwebrx:$ARCH -f docker/Dockerfiles/Dockerfile-rtlsdr . docker build --build-arg ARCH=$ARCH -t openwebrx-soapysdr-base:$ARCH -f docker/Dockerfiles/Dockerfile-soapysdr . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-sdrplay:$ARCH -f docker/Dockerfiles/Dockerfile-sdrplay . +docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-hackrf:$ARCH -f docker/Dockerfiles/Dockerfile-hackrf . diff --git a/docker/Dockerfiles/Dockerfile-hackrf b/docker/Dockerfiles/Dockerfile-hackrf new file mode 100644 index 0000000..55a7530 --- /dev/null +++ b/docker/Dockerfiles/Dockerfile-hackrf @@ -0,0 +1,6 @@ +ARG ARCH +FROM openwebrx-soapysdr-base:$ARCH + +ADD docker/scripts/install-dependencies-hackrf.sh / +RUN /install-dependencies-hackrf.sh + diff --git a/docker/scripts/install-dependencies-hackrf.sh b/docker/scripts/install-dependencies-hackrf.sh new file mode 100755 index 0000000..3ca1c75 --- /dev/null +++ b/docker/scripts/install-dependencies-hackrf.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -euxo pipefail + +function cmakebuild() { + cd $1 + mkdir build + cd build + cmake .. + make + make install + cd ../.. + rm -rf $1 +} + +cd /tmp + +STATIC_PACKAGES="libusb fftw" +BUILD_PACKAGES="git cmake make patch wget sudo udev gcc g++ libusb-dev fftw-dev" + +apk add --no-cache $STATIC_PACKAGES +apk add --no-cache --virtual .build-deps $BUILD_PACKAGES + +git clone https://github.com/mossmann/hackrf.git +cd hackrf +cmakebuild host +cd .. +rm -rf hackrf + +git clone https://github.com/pothosware/SoapyHackRF.git +cmakebuild SoapyHackRF + +apk del .build-deps diff --git a/push.sh b/push.sh index 93ea599..6844705 100755 --- a/push.sh +++ b/push.sh @@ -3,6 +3,6 @@ set -euxo pipefail ARCH=$(uname -m) -for image in openwebrx openwebrx-rtlsdr openwebrx-sdrplay; do +for image in openwebrx openwebrx-rtlsdr openwebrx-sdrplay openwebrx-hackrf; do docker push jketterl/$image:$ARCH done From 0ab14f63cb7dbe2f7634ffa57bc545623ef379ba Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 16 May 2019 23:45:24 +0200 Subject: [PATCH 19/47] add new logo --- htdocs/gfx/openwebrx-avatar.png | Bin 2721 -> 12935 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/htdocs/gfx/openwebrx-avatar.png b/htdocs/gfx/openwebrx-avatar.png index 7e9736fdbfdd8272afcd27ef3b5819fd8df7d99f..2ae083fc25a91d78dfa5d64e9123fdae530b6306 100644 GIT binary patch literal 12935 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 literal 2721 zcmcguc|4SB8-8XIvNe|MF-BR+mI{+?Vwk~~H0Bh_c91Mlrjwmf2QjiGzLQ-f$(Ail zs5t6aOC@A0jLuAskY&W2*P!$DZNKlY@BRJW-@Dw;{an{`-PiNJcZ`)Kj-N-82LQlt zhQ|^BfI+t~z|9F=&iLIu3tc!!MrK5A=m_Cf}5JJpL_bWo+JP~GG^GL#DI)XLnB_qj}pzFX&vJJ z)~EeTN~V1hYg}_1YRXmT^UAH#UaGDJPP}%QHnjTridd^|aD~Qa91@YDbVXDd+raOj z?*^@S> zEBz>ok@^NnFdJxhhvn>K1J6Y1gHSdNvUbMySJ7+=`N{LhZUM5vH%2&)%%7^p?8$$xH2+W9jh5Zx$ToxA?34oZreHBAI9p&TppctgDr{0hR~8~=ZjW95V>mNlmBH}7q43yT z1vbi0*|w#-H1bun3qbGEO=77L^AWEvm&nKLiS=xa&tv*F1&j>*y7c}?l97mhQ^=RW z^6Oyy)%g455LSEcop-04(MqWOc?8y{R!{0=8=BP=J-cGTN;PNXOSchXGKu#}7c}Dw zq;;1W!6T{aVFNExx_Qe?0kT3^@M5+0yV-)$HC@GrtbEjBHc@EA-KXdl^F!W69nSx4 z2mjaY{r?YQEYF9!T>Uzm=^H7tO*I~j6Hm(}ld`GmO+oIYsT0%~tm|TYt#LxcE^bVG zwHUAFj9Fm_)5i-tdR*4q>zD3=9}wi`3=*M;_=ei}$R;tuK6BP}AE| zm&NHJulI*+OaZ+3Wbw=1-W%c(+LZ0fv{K9E&fp{Rf*tYzy>O5F!nm|86p`A!`(|TfV|`!6viyE{PIF5OcBp*^ zcz^=26>!W+4$Og?a90x`LfQi)1VO6}9J!ypMMYe=0F=+!5V~^tsezUSfCfpnpcM-( zGn3oX)U~G#Bo~tAa?hx>cXa%1>VTaj>>ODqexfBtn15)=#EzwcsXLQODB5FfZJmqr zu;pm3graXNT>QTL{yJ(TEpl)3{Cri4dBNduNuhoONXXI;R=~weC(--Lv?td1yjdue zrna`Cy}iArfq_g=N~$r?v$eBJ9v*h63!FRKJKbvzu-Hi&t)RHrLPjqD0Sz$%dUuKY zprXnf8yg>cVg-2rcT(wVb7eLosSC08b~wJUkpz=TC1fMG&H2U3onoX^^P7R-tIK~eifBb{}cV> z)Crwim8&{`;bPHG!OB%3ETjzK2gXz?XS16#|+1Y7UMEtE)S(y$)6s>wx-^L~U zR_)bil#nL`!#kfnt8mIN<;jgJZ(1&@v?a)W>&{Ml{P=N?%eW-WDy|ZgrP9bW7$R_3c{HE@(J_ER`e9c96&iB$91CF7kbD@{iuEXR$!Z6eR9q|H)!6^0D)DcsHVJ z>(PIntC&BRtC{XaLG`~oDWX`d$bG$_M&+9QrfinEHC{ahs^VopV8n~bx512`BG{TJm^_1$+Ym2fmu2E`4JWv{lYDQ1AY{!WvF2PM*l;Pwe=BZaV5D( VS=<_r)`!|jU}j>8Ej4nw@+Xs9HFy93 From aa7212c64272de7ac4c9a820dd792b425a3df8fe Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 7 Jun 2019 01:14:09 +0200 Subject: [PATCH 20/47] handle OSErrors, too --- owrx/websocket.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/owrx/websocket.py b/owrx/websocket.py index d0385b8..b8ea3a7 100644 --- a/owrx/websocket.py +++ b/owrx/websocket.py @@ -78,7 +78,9 @@ class WebSocketConnection(object): self.handler.wfile.write(header) self.handler.wfile.flush() except ValueError: - logger.exception("while writing close frame:") + logger.exception("ValueError while writing close frame:") + except OSError: + logger.exception("OSError while writing close frame:") try: self.handler.finish() From e422ca4d9b09d5300cc1c9a03131b8bdd6c4c287 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 7 Jun 2019 15:44:11 +0200 Subject: [PATCH 21/47] add airspy support (untested for now) --- config_webrx.py | 2 +- owrx/feature.py | 6 +++++- owrx/source.py | 7 +++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index 3bd92c6..a3ea8c0 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -93,7 +93,7 @@ Note: if you experience audio underruns while CPU usage is 100%, you can: # Check here: https://github.com/simonyiszk/openwebrx/wiki#guides-for-receiver-hardware-support # ################################################################################################# -# Currently supported types of sdr receivers: "rtl_sdr", "sdrplay", "hackrf" +# Currently supported types of sdr receivers: "rtl_sdr", "sdrplay", "hackrf", "airspy" sdrs = { "rtlsdr": { diff --git a/owrx/feature.py b/owrx/feature.py index 83f9232..bdfcee2 100644 --- a/owrx/feature.py +++ b/owrx/feature.py @@ -12,7 +12,8 @@ class FeatureDetector(object): "core": [ "csdr", "nmux" ], "rtl_sdr": [ "rtl_sdr" ], "sdrplay": [ "rx_tools" ], - "hackrf": [ "hackrf_transfer" ] + "hackrf": [ "hackrf_transfer" ], + "airspy": [ "airspy_rx" ] } def is_available(self, feature): @@ -63,3 +64,6 @@ class FeatureDetector(object): # TODO i don't have a hackrf, so somebody doublecheck this. # TODO also check if it has the stdout feature return os.system("hackrf_transfer --help 2> /dev/null") != 32512 + + def has_airspy_rx(self): + return os.system("airspy_rx --help 2> /dev/null") != 32512 diff --git a/owrx/source.py b/owrx/source.py index 3efc7d4..d331c71 100644 --- a/owrx/source.py +++ b/owrx/source.py @@ -130,6 +130,7 @@ class SdrSource(object): start_sdr_command = self.command.format( samp_rate = props["samp_rate"], center_freq = props["center_freq"], + center_freq_mhz = props["center_freq"]/1e6, ppm = props["ppm"], rf_gain = props["rf_gain"], lna_gain = props["lna_gain"], @@ -249,6 +250,12 @@ class SdrplaySource(SdrSource): def sleepOnRestart(self): time.sleep(1) +class AirspySource(SdrSource): + def __init__(self, props, port): + super().__init__(props, port) + self.command = "airspy_rx -f{center_freq_mhz} -r /dev/stdout -a{samp_rate} -g {rf_gain}" + self.format_conversion = "csdr convert_s16_f" + class SpectrumThread(threading.Thread): def __init__(self, sdrSource): self.doRun = True From e8a1a40dc0e191d648193b1547151ac720a4d2ce Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 7 Jun 2019 20:10:03 +0200 Subject: [PATCH 22/47] try to handle overflowing connections --- owrx/websocket.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/owrx/websocket.py b/owrx/websocket.py index b8ea3a7..a247b2a 100644 --- a/owrx/websocket.py +++ b/owrx/websocket.py @@ -38,12 +38,16 @@ class WebSocketConnection(object): # string-type messages are sent as text frames if (type(data) == str): header = self.get_header(len(data), 1) - self.handler.wfile.write(header + data.encode('utf-8')) - self.handler.wfile.flush() + data_to_send = header + data.encode('utf-8') # anything else as binary else: header = self.get_header(len(data), 2) - self.handler.wfile.write(header + data) + data_to_send = header + data + written = self.handler.wfile.write(data_to_send) + if (written != len(data_to_send)): + logger.error("incomplete write! closing socket!") + self.close() + else: self.handler.wfile.flush() def read_loop(self): From b6e59e9b11ea2eb4c56b6bd824a449b7da5d8162 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 7 Jun 2019 20:23:31 +0200 Subject: [PATCH 23/47] allow avatar to be downloaded on its old url --- owrx/http.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/owrx/http.py b/owrx/http.py index 7012f0e..ca7d357 100644 --- a/owrx/http.py +++ b/owrx/http.py @@ -18,7 +18,9 @@ class Router(object): {"route": "/status", "controller": StatusController}, {"regex": "/static/(.+)", "controller": AssetsController}, {"route": "/ws/", "controller": WebSocketController}, - {"regex": "(/favicon.ico)", "controller": AssetsController} + {"regex": "(/favicon.ico)", "controller": AssetsController}, + # backwards compatibility for the sdr.hu portal + {"regex": "/(gfx/openwebrx-avatar.png)", "controller": AssetsController} ] def find_controller(self, path): for m in Router.mappings: From a9d5fcf82a9827830608f97d3d5d5454569d8c1d Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 7 Jun 2019 20:23:58 +0200 Subject: [PATCH 24/47] use fixed buf sizes to avoid cut-off audio --- csdr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csdr.py b/csdr.py index 28443f3..f04bc6e 100755 --- a/csdr.py +++ b/csdr.py @@ -116,7 +116,7 @@ class dsp(object): chain += "dmr_decoder --fifo {meta_pipe} | mbe_synthesizer -f -u {unvoiced_quality} | " elif which == "ysf": chain += "ysf_decoder --fifo {meta_pipe} | mbe_synthesizer -y -f -u {unvoiced_quality} | " - chain += "digitalvoice_filter -f | csdr agc_ff 160000 0.8 1 0.0000001 0.0005 | csdr convert_f_s16 | sox -t raw -r 8000 -e signed-integer -b 16 -c 1 --buffer 32 - -t raw -r {output_rate} -e signed-integer -b 16 -c 1 - " + chain += "digitalvoice_filter -f | CSDR_FIXED_BUFSIZE=32 csdr agc_ff 160000 0.8 1 0.0000001 0.0005 | CSDR_FIXED_BUFSIZE=32 csdr convert_f_s16 | sox -t raw -r 8000 -e signed-integer -b 16 -c 1 --buffer 32 - -t raw -r {output_rate} -e signed-integer -b 16 -c 1 - " elif which == "am": chain += "csdr amdemod_cf | csdr fastdcblock_ff | " chain += last_decimation_block From f9c14addcccf6af3f54c68a6a1b0422b5e78f9ee Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 8 Jun 2019 09:23:39 +0200 Subject: [PATCH 25/47] apply audio filtering and agc to dsd too --- csdr.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/csdr.py b/csdr.py index f04bc6e..01c43ec 100755 --- a/csdr.py +++ b/csdr.py @@ -107,8 +107,8 @@ class dsp(object): chain += "dsd -fd" elif which == "nxdn": chain += "dsd -fi" - chain += " -i - -o - -u {unvoiced_quality} -g 10 | " - chain += "digitalvoice_filter | sox -V -v 0.95 -t raw -r 8000 -e signed-integer -b 16 -c 1 --buffer 32 - -t raw -r {output_rate} -e signed-integer -b 16 -c 1 - " + chain += " -i - -o - -u {unvoiced_quality} -g -1 | CSDR_FIXED_BUFSIZE=32 csdr convert_s16_f | " + max_gain = 5 # digiham modes else: chain += "rrc_filter | csdr convert_f_s16 | gfsk_demodulator | " @@ -116,7 +116,11 @@ class dsp(object): chain += "dmr_decoder --fifo {meta_pipe} | mbe_synthesizer -f -u {unvoiced_quality} | " elif which == "ysf": chain += "ysf_decoder --fifo {meta_pipe} | mbe_synthesizer -y -f -u {unvoiced_quality} | " - chain += "digitalvoice_filter -f | CSDR_FIXED_BUFSIZE=32 csdr agc_ff 160000 0.8 1 0.0000001 0.0005 | CSDR_FIXED_BUFSIZE=32 csdr convert_f_s16 | sox -t raw -r 8000 -e signed-integer -b 16 -c 1 --buffer 32 - -t raw -r {output_rate} -e signed-integer -b 16 -c 1 - " + max_gain = 0.0005 + chain += "digitalvoice_filter -f | " + chain += "CSDR_FIXED_BUFSIZE=32 csdr agc_ff 160000 0.8 1 0.0000001 {max_gain} | ".format(max_gain=max_gain) + chain += "CSDR_FIXED_BUFSIZE=32 csdr convert_f_s16 | " + chain += "sox -t raw -r 8000 -e signed-integer -b 16 -c 1 --buffer 32 - -t raw -r {output_rate} -e signed-integer -b 16 -c 1 - " elif which == "am": chain += "csdr amdemod_cf | csdr fastdcblock_ff | " chain += last_decimation_block From b852fcc167c166f959fa6a2fb2de7178722a5147 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 8 Jun 2019 18:17:04 +0200 Subject: [PATCH 26/47] sox can accept float input, no need to convert --- csdr.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/csdr.py b/csdr.py index 01c43ec..a4c932a 100755 --- a/csdr.py +++ b/csdr.py @@ -119,8 +119,7 @@ class dsp(object): max_gain = 0.0005 chain += "digitalvoice_filter -f | " chain += "CSDR_FIXED_BUFSIZE=32 csdr agc_ff 160000 0.8 1 0.0000001 {max_gain} | ".format(max_gain=max_gain) - chain += "CSDR_FIXED_BUFSIZE=32 csdr convert_f_s16 | " - chain += "sox -t raw -r 8000 -e signed-integer -b 16 -c 1 --buffer 32 - -t raw -r {output_rate} -e signed-integer -b 16 -c 1 - " + chain += "sox -t raw -r 8000 -e floating-point -b 32 -c 1 --buffer 32 - -t raw -r {output_rate} -e signed-integer -b 16 -c 1 - " elif which == "am": chain += "csdr amdemod_cf | csdr fastdcblock_ff | " chain += last_decimation_block From cde3ff703a0ece27ddcbf90f2ee5c84f6363539f Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 8 Jun 2019 18:47:17 +0200 Subject: [PATCH 27/47] gfsk decoder now supports floating point input, so we can stop converting --- csdr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csdr.py b/csdr.py index a4c932a..b7d1ebd 100755 --- a/csdr.py +++ b/csdr.py @@ -111,7 +111,7 @@ class dsp(object): max_gain = 5 # digiham modes else: - chain += "rrc_filter | csdr convert_f_s16 | gfsk_demodulator | " + chain += "rrc_filter | gfsk_demodulator | " if which == "dmr": chain += "dmr_decoder --fifo {meta_pipe} | mbe_synthesizer -f -u {unvoiced_quality} | " elif which == "ysf": From 94516ef341807fccb4c999aef746b8968928ea98 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 8 Jun 2019 23:36:16 +0200 Subject: [PATCH 28/47] implement https detection (thanks Denys Vitali) --- htdocs/openwebrx.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index 3808f92..40f95c2 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1812,7 +1812,12 @@ String.prototype.startswith=function(str){ return this.indexOf(str) == 0; }; //h function open_websocket() { - ws_url="ws://"+(window.location.origin.split("://")[1])+"/ws/"; //guess automatically -> now default behaviour + var protocol = 'ws'; + if (window.location.toString().startsWith('https://')) { + protocol = 'wss'; + } + + ws_url = protocol + "://" + (window.location.origin.split("://")[1]) + "/ws/"; //guess automatically -> now default behaviour if (!("WebSocket" in window)) divlog("Your browser does not support WebSocket, which is required for WebRX to run. Please upgrade to a HTML5 compatible browser."); ws = new WebSocket(ws_url); From 2010a384110e7a14dfe75230e91dd662856031c2 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 9 Jun 2019 15:15:27 +0200 Subject: [PATCH 29/47] add new nicer dmr status display --- htdocs/gfx/openwebrx-user.png | Bin 0 -> 2466 bytes htdocs/index.html | 18 +++++++++++++ htdocs/openwebrx.css | 48 ++++++++++++++++++++++++++++++++++ htdocs/openwebrx.js | 44 +++++++++++++++---------------- 4 files changed, 87 insertions(+), 23 deletions(-) create mode 100644 htdocs/gfx/openwebrx-user.png diff --git a/htdocs/gfx/openwebrx-user.png b/htdocs/gfx/openwebrx-user.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2969742d49eea92b5a829900f596fdf1c82c5c GIT binary patch literal 2466 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 literal 0 HcmV?d00001 diff --git a/htdocs/index.html b/htdocs/index.html index da3c800..255d325 100644 --- a/htdocs/index.html +++ b/htdocs/index.html @@ -170,6 +170,24 @@
+
+
+
+
Timeslot 1
+
+
+
+
+
+
+
Timeslot 2
+
+
+
+
+
+
+
diff --git a/htdocs/openwebrx.css b/htdocs/openwebrx.css index 4736bf3..9c4e0d8 100644 --- a/htdocs/openwebrx.css +++ b/htdocs/openwebrx.css @@ -928,3 +928,51 @@ img.openwebrx-mirror-img border-color: Red; } +#openwebrx-panel-metadata-dmr { + background: none; + padding: 0; +} + +.openwebrx-dmr-panel { + height: 200px; + + outline: 1px solid #111; + border-top: 1px solid #555; + padding: 10px; + background: #333; +} + +.openwebrx-dmr-timeslot-panel { + width: 133px; + height: 194px; + float: left; + margin-right: 10px; + + padding:2px 0; + color: #333; + background: #575757; + border: 1px solid #000; + border-right: 1px solid #353535; + border-bottom: 1px solid #353535; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 2px; +} + +.openwebrx-dmr-timeslot-panel.active { + background-color: #95bbdf; +} + +.openwebrx-dmr-timeslot-panel:last-child { + margin-right: 0; +} + +.openwebrx-dmr-timeslot-panel.active .openwebrx-dmr-user-image { + background-image: url("gfx/openwebrx-user.png"); + width:133px; + height:133px; +} + +.openwebrx-dmr-timeslot-panel { + text-align: center; +} diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index 40f95c2..b1e47be 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -620,6 +620,9 @@ function demodulator_analog_replace(subtype, for_digital) demodulator_add(new demodulator_default_analog(temp_offset,subtype)); demodulator_buttons_update(); clear_metadata(); + if (subtype == "dmr") { + toggle_panel("openwebrx-panel-metadata-dmr", true); + } } function demodulator_set_offset_frequency(which,to_what) @@ -1316,28 +1319,22 @@ function update_metadata(meta) { if (meta.protocol) switch (meta.protocol) { case 'DMR': if (meta.slot) { - var html = 'Timeslot: ' + meta.slot; - if (meta.type) html += ' Typ: ' + meta.type; - if (meta.additional && meta.additional.callsign) { - html += ' Source: ' + meta.additional.callsign; - if (meta.additional.fname) { - html += ' (' + meta.additional.fname + ')'; - } - } else if (meta.source) { - html += ' Source: ' + meta.source; + el = $(".openwebrx-dmr-panel .openwebrx-dmr-timeslot-panel").get(meta.slot); + var id = ""; + var name = ""; + var talkgroup = ""; + if (meta.type && meta.type != "data") { + id = (meta.additional && meta.additional.callsign) || meta.source || ""; + name = (meta.additional && meta.additional.fname) || ""; + talkgroup = meta.target || ""; + $(el).addClass("active"); + } else { + $(el).removeClass("active"); } - if (meta.target) html += ' Target: ' + meta.target; - update = function(_, el) { - var slotEl = el.getElementsByClassName('slot-' + meta.slot); - if (!slotEl.length) { - slotEl = document.createElement('div'); - slotEl.className = 'slot-' + meta.slot; - el.appendChild(slotEl); - } else { - slotEl = slotEl[0]; - } - slotEl.innerHTML = html; - }; + $(el).find(".openwebrx-dmr-id").text(id); + $(el).find(".openwebrx-dmr-name").text(name); + $(el).find(".openwebrx-dmr-talkgroup").text(talkgroup); + } break; case 'YSF': @@ -1351,15 +1348,16 @@ function update_metadata(meta) { update = function(_, el) { el.innerHTML = html; } + $('.openwebrx-panel[data-panel-name="metadata"]').each(update); + toggle_panel("openwebrx-panel-metadata", true); break; } - $('.openwebrx-panel[data-panel-name="metadata"]').each(update); - toggle_panel("openwebrx-panel-metadata", true); } function clear_metadata() { toggle_panel("openwebrx-panel-metadata", false); + toggle_panel("openwebrx-panel-metadata-dmr", false); } function add_problem(what) From 761ca1132df0ecf66fd7c53acb8b5bd577ceead4 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 9 Jun 2019 17:39:15 +0200 Subject: [PATCH 30/47] nicer user display panel for YSF, too --- htdocs/index.html | 39 +++++++++++++++++------------ htdocs/openwebrx.css | 14 +++++------ htdocs/openwebrx.js | 58 ++++++++++++++++++++++++++------------------ 3 files changed, 65 insertions(+), 46 deletions(-) diff --git a/htdocs/index.html b/htdocs/index.html index 255d325..44b414d 100644 --- a/htdocs/index.html +++ b/htdocs/index.html @@ -168,23 +168,32 @@ -
-
-
-
-
-
Timeslot 1
-
-
-
-
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
Timeslot 1
+
+
+
+
+
+
Timeslot 2
-
-
-
-
+
+
+
+
diff --git a/htdocs/openwebrx.css b/htdocs/openwebrx.css index 9c4e0d8..0654e52 100644 --- a/htdocs/openwebrx.css +++ b/htdocs/openwebrx.css @@ -928,12 +928,12 @@ img.openwebrx-mirror-img border-color: Red; } -#openwebrx-panel-metadata-dmr { +.openwebrx-meta-panel { background: none; padding: 0; } -.openwebrx-dmr-panel { +.openwebrx-meta-frame { height: 200px; outline: 1px solid #111; @@ -942,7 +942,7 @@ img.openwebrx-mirror-img background: #333; } -.openwebrx-dmr-timeslot-panel { +.openwebrx-meta-slot { width: 133px; height: 194px; float: left; @@ -959,20 +959,20 @@ img.openwebrx-mirror-img border-radius: 2px; } -.openwebrx-dmr-timeslot-panel.active { +.openwebrx-meta-slot.active { background-color: #95bbdf; } -.openwebrx-dmr-timeslot-panel:last-child { +.openwebrx-meta-slot:last-child { margin-right: 0; } -.openwebrx-dmr-timeslot-panel.active .openwebrx-dmr-user-image { +.openwebrx-meta-slot.active .openwebrx-meta-user-image { background-image: url("gfx/openwebrx-user.png"); width:133px; height:133px; } -.openwebrx-dmr-timeslot-panel { +.openwebrx-meta-slot { text-align: center; } diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index b1e47be..83b2bc1 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -620,9 +620,7 @@ function demodulator_analog_replace(subtype, for_digital) demodulator_add(new demodulator_default_analog(temp_offset,subtype)); demodulator_buttons_update(); clear_metadata(); - if (subtype == "dmr") { - toggle_panel("openwebrx-panel-metadata-dmr", true); - } + toggle_panel("openwebrx-panel-metadata-" + subtype, true); } function demodulator_set_offset_frequency(which,to_what) @@ -1313,51 +1311,62 @@ function on_ws_recv(evt) } function update_metadata(meta) { - var update = function(_, el) { - el.innerHTML = ""; - }; if (meta.protocol) switch (meta.protocol) { case 'DMR': if (meta.slot) { - el = $(".openwebrx-dmr-panel .openwebrx-dmr-timeslot-panel").get(meta.slot); + var el = $("#openwebrx-panel-metadata-dmr .openwebrx-dmr-timeslot-panel").get(meta.slot); var id = ""; var name = ""; - var talkgroup = ""; + var target = ""; if (meta.type && meta.type != "data") { id = (meta.additional && meta.additional.callsign) || meta.source || ""; name = (meta.additional && meta.additional.fname) || ""; - talkgroup = meta.target || ""; + if (meta.type == "group") target = "Talkgroup: "; + if (meta.type == "direct") tareget = "Direct: "; + target += meta.target || ""; $(el).addClass("active"); } else { $(el).removeClass("active"); } $(el).find(".openwebrx-dmr-id").text(id); $(el).find(".openwebrx-dmr-name").text(name); - $(el).find(".openwebrx-dmr-talkgroup").text(talkgroup); + $(el).find(".openwebrx-dmr-target").text(target); } break; case 'YSF': - var strings = []; - if (meta.mode) strings.push("Mode: " + meta.mode); - if (meta.source) strings.push("Source: " + meta.source); - if (meta.target) strings.push("Destination: " + meta.target); - if (meta.up) strings.push("Up: " + meta.up); - if (meta.down) strings.push("Down: " + meta.down); - var html = strings.join(' '); - update = function(_, el) { - el.innerHTML = html; + var el = $("#openwebrx-panel-metadata-ysf"); + + var mode = " " + var source = ""; + var up = ""; + var down = ""; + if (meta.mode && meta.mode != "") { + mode = "Mode: " + meta.mode; + source = meta.source || ""; + up = meta.up ? "Up: " + meta.up : ""; + down = meta.down ? "Down: " + meta.down : ""; + $(el).find(".openwebrx-meta-slot").addClass("active"); + } else { + $(el).find(".openwebrx-meta-slot").removeClass("active"); } - $('.openwebrx-panel[data-panel-name="metadata"]').each(update); - toggle_panel("openwebrx-panel-metadata", true); + $(el).find(".openwebrx-ysf-mode").text(mode); + $(el).find(".openwebrx-ysf-source").text(source); + $(el).find(".openwebrx-ysf-up").text(up); + $(el).find(".openwebrx-ysf-down").text(down); + break; + } } function clear_metadata() { - toggle_panel("openwebrx-panel-metadata", false); - toggle_panel("openwebrx-panel-metadata-dmr", false); + $(".openwebrx-meta-panel").each(function(_, p){ + toggle_panel(p.id, false); + }); + $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); + $(".openwebrx-meta-panel .active").removeClass("active"); } function add_problem(what) @@ -2407,6 +2416,7 @@ function pop_bottommost_panel(from) function toggle_panel(what, on) { var item=e(what); + if (!item) return; if(typeof on !== "undefined") { if(item.openwebrxHidden && !on) return; @@ -2470,7 +2480,7 @@ function place_panels(function_apply) for(i=0;i= 0) { if(c.openwebrxHidden) { From e1d54bdf1df7c9f1ee1b90cfd7c918d41a4d19bf Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 9 Jun 2019 17:49:14 +0200 Subject: [PATCH 31/47] fix typo --- htdocs/openwebrx.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index 83b2bc1..67893a2 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1322,7 +1322,7 @@ function update_metadata(meta) { id = (meta.additional && meta.additional.callsign) || meta.source || ""; name = (meta.additional && meta.additional.fname) || ""; if (meta.type == "group") target = "Talkgroup: "; - if (meta.type == "direct") tareget = "Direct: "; + if (meta.type == "direct") target = "Direct: "; target += meta.target || ""; $(el).addClass("active"); } else { From 2053a6b16b37358ee99bb980859a3215245a0680 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 9 Jun 2019 19:12:37 +0200 Subject: [PATCH 32/47] more clean-up stuff --- htdocs/openwebrx.js | 3 ++- owrx/meta.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index 67893a2..e304950 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1356,7 +1356,8 @@ function update_metadata(meta) { $(el).find(".openwebrx-ysf-down").text(down); break; - + } else { + $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); } } diff --git a/owrx/meta.py b/owrx/meta.py index e215d89..ec4966a 100644 --- a/owrx/meta.py +++ b/owrx/meta.py @@ -64,11 +64,13 @@ class MetaParser(object): enrichers = { "DMR": DmrMetaEnricher() } + def __init__(self, handler): self.handler = handler + def parse(self, meta): fields = meta.split(";") - meta = {v[0] : "".join(v[1:]) for v in map(lambda x: x.split(":"), fields)} + meta = {v[0]: "".join(v[1:]) for v in map(lambda x: x.split(":"), fields) if v[0] != ""} if "protocol" in meta: protocol = meta["protocol"] From c7d969c96e30fe51390c03cbd3d17a57c35ededd Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 9 Jun 2019 22:27:35 +0200 Subject: [PATCH 33/47] polishing up the imaging --- htdocs/gfx/openwebrx-directcall.png | Bin 0 -> 5445 bytes htdocs/gfx/openwebrx-groupcall.png | Bin 0 -> 8055 bytes htdocs/gfx/openwebrx-user.png | Bin 2466 -> 0 bytes htdocs/openwebrx.css | 6 +++++- htdocs/openwebrx.js | 8 ++++++-- 5 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 htdocs/gfx/openwebrx-directcall.png create mode 100644 htdocs/gfx/openwebrx-groupcall.png delete mode 100644 htdocs/gfx/openwebrx-user.png diff --git a/htdocs/gfx/openwebrx-directcall.png b/htdocs/gfx/openwebrx-directcall.png new file mode 100644 index 0000000000000000000000000000000000000000..2d74713b60003cb919a8253fd04994f2d1d446be GIT binary patch literal 5445 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
  • hz?&?Z2Wo-mLWr4J%MzcF^TvriPu9 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 V)UUa{ZiDBqfF@c`wO-je>VKC$;k5t& literal 0 HcmV?d00001 diff --git a/htdocs/gfx/openwebrx-user.png b/htdocs/gfx/openwebrx-user.png deleted file mode 100644 index 4c2969742d49eea92b5a829900f596fdf1c82c5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2466 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 diff --git a/htdocs/openwebrx.css b/htdocs/openwebrx.css index 0654e52..38ecf2b 100644 --- a/htdocs/openwebrx.css +++ b/htdocs/openwebrx.css @@ -968,11 +968,15 @@ img.openwebrx-mirror-img } .openwebrx-meta-slot.active .openwebrx-meta-user-image { - background-image: url("gfx/openwebrx-user.png"); + background-image: url("gfx/openwebrx-directcall.png"); width:133px; height:133px; } +.openwebrx-meta-slot.active .openwebrx-meta-user-image.group { + background-image: url("gfx/openwebrx-groupcall.png"); +} + .openwebrx-meta-slot { text-align: center; } diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index e304950..f61b845 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1318,10 +1318,14 @@ function update_metadata(meta) { var id = ""; var name = ""; var target = ""; + var group = false; if (meta.type && meta.type != "data") { id = (meta.additional && meta.additional.callsign) || meta.source || ""; name = (meta.additional && meta.additional.fname) || ""; - if (meta.type == "group") target = "Talkgroup: "; + if (meta.type == "group") { + target = "Talkgroup: "; + group = true; + } if (meta.type == "direct") target = "Direct: "; target += meta.target || ""; $(el).addClass("active"); @@ -1331,7 +1335,7 @@ function update_metadata(meta) { $(el).find(".openwebrx-dmr-id").text(id); $(el).find(".openwebrx-dmr-name").text(name); $(el).find(".openwebrx-dmr-target").text(target); - + $(el).find(".openwebrx-meta-user-image")[group ? "addClass" : "removeClass"]("group"); } break; case 'YSF': From 3a89f520286c280292353e723996836b213c2886 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 10 Jun 2019 21:30:46 +0200 Subject: [PATCH 34/47] better sync on the client side --- htdocs/openwebrx.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index f61b845..486e3ce 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1336,6 +1336,9 @@ function update_metadata(meta) { $(el).find(".openwebrx-dmr-name").text(name); $(el).find(".openwebrx-dmr-target").text(target); $(el).find(".openwebrx-meta-user-image")[group ? "addClass" : "removeClass"]("group"); + } else { + $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); + $(".openwebrx-meta-panel").removeClass("active"); } break; case 'YSF': @@ -1362,6 +1365,7 @@ function update_metadata(meta) { break; } else { $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); + $(".openwebrx-meta-panel").removeClass("active"); } } @@ -1371,7 +1375,7 @@ function clear_metadata() { toggle_panel(p.id, false); }); $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); - $(".openwebrx-meta-panel .active").removeClass("active"); + $(".openwebrx-meta-panel").removeClass("active"); } function add_problem(what) From adf62bc2ca9cc2425e79d76a99eb8c49e15a7f85 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 15 Jun 2019 12:30:04 +0200 Subject: [PATCH 35/47] sync indicator --- htdocs/gfx/openwebrx-groupcall.png | Bin 8055 -> 8286 bytes htdocs/index.html | 4 ++-- htdocs/openwebrx.css | 11 +++++++++++ htdocs/openwebrx.js | 10 +++++----- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/htdocs/gfx/openwebrx-groupcall.png b/htdocs/gfx/openwebrx-groupcall.png index 88afbe9d91a904c4acbdeccba737302e0ac5e6a0..5d61a4c770458e4b381d2cc62e0ca594300b5ead 100644 GIT binary patch delta 7838 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 delta 7605 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 diff --git a/htdocs/index.html b/htdocs/index.html index 44b414d..8bf1001 100644 --- a/htdocs/index.html +++ b/htdocs/index.html @@ -182,14 +182,14 @@
    -
    Timeslot 1
    +
    Timeslot 1
    -
    Timeslot 2
    +
    Timeslot 2
    diff --git a/htdocs/openwebrx.css b/htdocs/openwebrx.css index 38ecf2b..92b9f37 100644 --- a/htdocs/openwebrx.css +++ b/htdocs/openwebrx.css @@ -963,6 +963,17 @@ img.openwebrx-mirror-img background-color: #95bbdf; } +.openwebrx-meta-slot.sync .openwebrx-dmr-slot:before { + content:""; + display: inline-block; + margin: 0 5px; + width: 12px; + height: 12px; + background-color: #ABFF00; + border-radius: 50%; + box-shadow: rgba(0, 0, 0, 0.2) 0 -1px 7px 1px, inset #304701 0 -1px 9px, #89FF00 0 2px 12px; +} + .openwebrx-meta-slot:last-child { margin-right: 0; } diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index 486e3ce..8a8345b 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1319,7 +1319,8 @@ function update_metadata(meta) { var name = ""; var target = ""; var group = false; - if (meta.type && meta.type != "data") { + $(el)[meta.sync ? "addClass" : "removeClass"]("sync"); + if (meta.sync && meta.sync == "voice") { id = (meta.additional && meta.additional.callsign) || meta.source || ""; name = (meta.additional && meta.additional.fname) || ""; if (meta.type == "group") { @@ -1338,7 +1339,7 @@ function update_metadata(meta) { $(el).find(".openwebrx-meta-user-image")[group ? "addClass" : "removeClass"]("group"); } else { $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); - $(".openwebrx-meta-panel").removeClass("active"); + $(".openwebrx-meta-panel").removeClass("active").removeClass("sync"); } break; case 'YSF': @@ -1365,7 +1366,7 @@ function update_metadata(meta) { break; } else { $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); - $(".openwebrx-meta-panel").removeClass("active"); + $(".openwebrx-meta-panel").removeClass("active").removeClass("sync"); } } @@ -1374,8 +1375,7 @@ function clear_metadata() { $(".openwebrx-meta-panel").each(function(_, p){ toggle_panel(p.id, false); }); - $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); - $(".openwebrx-meta-panel").removeClass("active"); + update_metadata({}); } function add_problem(what) From efa0c060fe15804cdab60eb32bea0cda3ebae905 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 15 Jun 2019 13:29:59 +0200 Subject: [PATCH 36/47] implement digiham version check --- owrx/feature.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/owrx/feature.py b/owrx/feature.py index a430c0d..38d3fa7 100644 --- a/owrx/feature.py +++ b/owrx/feature.py @@ -2,6 +2,8 @@ import os import subprocess from functools import reduce from operator import and_ +import re +from distutils.version import LooseVersion import logging logger = logging.getLogger(__name__) @@ -18,7 +20,7 @@ class FeatureDetector(object): "hackrf": [ "hackrf_transfer" ], "airspy": [ "airspy_rx" ], "digital_voice_digiham": [ "digiham", "sox" ], - "digital_voice_dsd": [ "dsd", "sox" ] + "digital_voice_dsd": [ "dsd", "sox", "digiham" ] } def feature_availability(self): @@ -82,19 +84,31 @@ class FeatureDetector(object): def command_exists(self, command): return os.system("which {0}".format(command)) == 0 + """ + To use DMR and YSF, the digiham package is required. You can find the package and installation instructions here: + https://github.com/jketterl/digiham + + Please note: there is close interaction between digiham and openwebrx, so older versions will probably not work. + If you have an older verison of digiham installed, please update it along with openwebrx. + As of now, we require version 0.2 of digiham. + """ def has_digiham(self): - # the digiham tools expect to be fed via stdin, they will block until their stdin is closed. - def check_with_stdin(command): + required_version = LooseVersion("0.2") + + digiham_version_regex = re.compile('^digiham version (.*)$') + def check_digiham_version(command): try: - process = subprocess.Popen(command, stdin=subprocess.PIPE) - process.communicate("") - return process.wait() == 0 + process = subprocess.Popen([command, "--version"], stdout=subprocess.PIPE) + version = LooseVersion(digiham_version_regex.match(process.stdout.readline().decode())[1]) + process.wait(1) + return version >= required_version except FileNotFoundError: return False return reduce(and_, map( - check_with_stdin, - ["rrc_filter", "ysf_decoder", "dmr_decoder", "mbe_synthesizer", "gfsk_demodulator"] + check_digiham_version, + ["rrc_filter", "ysf_decoder", "dmr_decoder", "mbe_synthesizer", "gfsk_demodulator", + "digitalvoice_filter"] ), True) From 7362e48cf3fd8730ec4e102f7e8c9badf7595e9e Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 15 Jun 2019 14:48:57 +0200 Subject: [PATCH 37/47] style more like openwebrx --- htdocs/index.html | 2 +- htdocs/openwebrx.css | 42 ++++++++++++++---------------------------- 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/htdocs/index.html b/htdocs/index.html index 8bf1001..90ac89c 100644 --- a/htdocs/index.html +++ b/htdocs/index.html @@ -168,7 +168,7 @@
    -
    +
    diff --git a/htdocs/openwebrx.css b/htdocs/openwebrx.css index 92b9f37..ac90bc6 100644 --- a/htdocs/openwebrx.css +++ b/htdocs/openwebrx.css @@ -928,35 +928,20 @@ img.openwebrx-mirror-img border-color: Red; } -.openwebrx-meta-panel { - background: none; - padding: 0; -} - -.openwebrx-meta-frame { - height: 200px; - - outline: 1px solid #111; - border-top: 1px solid #555; - padding: 10px; - background: #333; -} - .openwebrx-meta-slot { - width: 133px; - height: 194px; + width: 145px; + height: 196px; float: left; margin-right: 10px; - padding:2px 0; + background-color: #676767; + padding: 2px 0; color: #333; - background: #575757; - border: 1px solid #000; - border-right: 1px solid #353535; - border-bottom: 1px solid #353535; -webkit-border-radius: 5px; -moz-border-radius: 5px; - border-radius: 2px; + border-radius: 5px; + + text-align: center; } .openwebrx-meta-slot.active { @@ -978,16 +963,17 @@ img.openwebrx-mirror-img margin-right: 0; } +.openwebrx-meta-slot .openwebrx-meta-user-image { + width:100%; + height:133px; + background-position: center; + background-repeat: no-repeat; +} + .openwebrx-meta-slot.active .openwebrx-meta-user-image { background-image: url("gfx/openwebrx-directcall.png"); - width:133px; - height:133px; } .openwebrx-meta-slot.active .openwebrx-meta-user-image.group { background-image: url("gfx/openwebrx-groupcall.png"); } - -.openwebrx-meta-slot { - text-align: center; -} From 8af8f93434b2b280adc6b7c0720eadd6252de4ba Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 15 Jun 2019 19:10:33 +0200 Subject: [PATCH 38/47] implement dmr timeslot muting --- csdr.py | 26 +++++++++++++++-------- htdocs/gfx/openwebrx-mute.png | Bin 0 -> 3002 bytes htdocs/openwebrx.css | 27 ++++++++++++++++++++++- htdocs/openwebrx.js | 39 +++++++++++++++++++++++++++------- 4 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 htdocs/gfx/openwebrx-mute.png diff --git a/csdr.py b/csdr.py index b7d1ebd..0ef0250 100755 --- a/csdr.py +++ b/csdr.py @@ -67,7 +67,8 @@ class dsp(object): self.secondary_fft_size = 1024 self.secondary_process_fft = None self.secondary_process_demod = None - self.pipe_names=["bpf_pipe", "shift_pipe", "squelch_pipe", "smeter_pipe", "meta_pipe", "iqtee_pipe", "iqtee2_pipe"] + self.pipe_names=["bpf_pipe", "shift_pipe", "squelch_pipe", "smeter_pipe", "meta_pipe", "iqtee_pipe", + "iqtee2_pipe", "dmr_control_pipe"] self.secondary_pipe_names=["secondary_shift_pipe"] self.secondary_offset_freq = 1000 self.unvoiced_quality = 1 @@ -113,7 +114,7 @@ class dsp(object): else: chain += "rrc_filter | gfsk_demodulator | " if which == "dmr": - chain += "dmr_decoder --fifo {meta_pipe} | mbe_synthesizer -f -u {unvoiced_quality} | " + chain += "dmr_decoder --fifo {meta_pipe} --control-fifo {dmr_control_pipe} | mbe_synthesizer -f -u {unvoiced_quality} | " elif which == "ysf": chain += "ysf_decoder --fifo {meta_pipe} | mbe_synthesizer -y -f -u {unvoiced_quality} | " max_gain = 0.0005 @@ -352,7 +353,7 @@ class dsp(object): actual_squelch = 0 if self.isDigitalVoice() else self.squelch_level if self.running: self.modification_lock.acquire() - self.squelch_pipe_file.write( "%g\n"%(float(actual_squelch)) ) + self.squelch_pipe_file.write("%g\n"%(float(actual_squelch))) self.squelch_pipe_file.flush() self.modification_lock.release() @@ -363,6 +364,11 @@ class dsp(object): def get_unvoiced_quality(self): return self.unvoiced_quality + def set_dmr_filter(self, filter): + if self.dmr_control_pipe_file: + self.dmr_control_pipe_file.write("{0}\n".format(filter)) + self.dmr_control_pipe_file.flush() + def mkfifo(self,path): try: os.unlink(path) @@ -410,7 +416,7 @@ class dsp(object): flowcontrol=int(self.samp_rate*2), start_bufsize=self.base_bufsize*self.decimation, nc_port=self.nc_port, squelch_pipe=self.squelch_pipe, smeter_pipe=self.smeter_pipe, meta_pipe=self.meta_pipe, iqtee_pipe=self.iqtee_pipe, iqtee2_pipe=self.iqtee2_pipe, output_rate = self.get_output_rate(), smeter_report_every = int(self.if_samp_rate()/6000), - unvoiced_quality = self.get_unvoiced_quality()) + unvoiced_quality = self.get_unvoiced_quality(), dmr_control_pipe = self.dmr_control_pipe) logger.debug("[openwebrx-dsp-plugin:csdr] Command = %s", command) my_env=os.environ.copy() @@ -430,13 +436,12 @@ class dsp(object): self.output.add_output("audio", partial(self.process.stdout.read, int(self.get_fft_bytes_to_read()) if self.demodulator == "fft" else 256)) # open control pipes for csdr - if self.bpf_pipe != None: - self.bpf_pipe_file=open(self.bpf_pipe,"w") + if self.bpf_pipe: + self.bpf_pipe_file = open(self.bpf_pipe, "w") if self.shift_pipe: - self.shift_pipe_file=open(self.shift_pipe,"w") + self.shift_pipe_file = open(self.shift_pipe, "w") if self.squelch_pipe: - self.squelch_pipe_file=open(self.squelch_pipe,"w") - + self.squelch_pipe_file = open(self.squelch_pipe, "w") self.start_secondary_demodulator() self.modification_lock.release() @@ -468,6 +473,9 @@ class dsp(object): return raw.rstrip("\n") self.output.add_output("meta", read_meta) + if self.dmr_control_pipe: + self.dmr_control_pipe_file = open(self.dmr_control_pipe, "w") + def stop(self): self.modification_lock.acquire() self.running = False diff --git a/htdocs/gfx/openwebrx-mute.png b/htdocs/gfx/openwebrx-mute.png new file mode 100644 index 0000000000000000000000000000000000000000..23da7bbf190917a5797c682e86742e590d9a9143 GIT binary patch literal 3002 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 Z`p#&uy>eZzBMwv@2(Yj*Z!+~t`7bcFYg_;T literal 0 HcmV?d00001 diff --git a/htdocs/openwebrx.css b/htdocs/openwebrx.css index ac90bc6..3ed6deb 100644 --- a/htdocs/openwebrx.css +++ b/htdocs/openwebrx.css @@ -937,11 +937,32 @@ img.openwebrx-mirror-img background-color: #676767; padding: 2px 0; color: #333; + + text-align: center; + position: relative; +} + +.openwebrx-meta-slot, .openwebrx-meta-slot.muted:before { -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; +} - text-align: center; +.openwebrx-meta-slot.muted:before { + display: block; + content: ""; + background-image: url("gfx/openwebrx-mute.png"); + width:100%; + height:133px; + background-position: center; + background-repeat: no-repeat; + + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: rgba(0,0,0,.3); } .openwebrx-meta-slot.active { @@ -977,3 +998,7 @@ img.openwebrx-mirror-img .openwebrx-meta-slot.active .openwebrx-meta-user-image.group { background-image: url("gfx/openwebrx-groupcall.png"); } + +.openwebrx-dmr-timeslot-panel * { + cursor: pointer; +} diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index 8a8345b..debd351 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -619,7 +619,7 @@ function demodulator_analog_replace(subtype, for_digital) } demodulator_add(new demodulator_default_analog(temp_offset,subtype)); demodulator_buttons_update(); - clear_metadata(); + hide_digitalvoice_panels(); toggle_panel("openwebrx-panel-metadata-" + subtype, true); } @@ -1338,8 +1338,7 @@ function update_metadata(meta) { $(el).find(".openwebrx-dmr-target").text(target); $(el).find(".openwebrx-meta-user-image")[group ? "addClass" : "removeClass"]("group"); } else { - $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); - $(".openwebrx-meta-panel").removeClass("active").removeClass("sync"); + clear_metadata(); } break; case 'YSF': @@ -1365,17 +1364,22 @@ function update_metadata(meta) { break; } else { - $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); - $(".openwebrx-meta-panel").removeClass("active").removeClass("sync"); + clear_metadata(); } } -function clear_metadata() { +function hide_digitalvoice_panels() { $(".openwebrx-meta-panel").each(function(_, p){ toggle_panel(p.id, false); }); - update_metadata({}); + clear_metadata(); +} + +function clear_metadata() { + $(".openwebrx-meta-panel .openwebrx-meta-autoclear").text(""); + $(".openwebrx-meta-slot").removeClass("active").removeClass("sync"); + $(".openwebrx-dmr-timeslot-panel").removeClass("muted"); } function add_problem(what) @@ -2327,7 +2331,7 @@ function openwebrx_init() init_rx_photo(); open_websocket(); secondary_demod_init(); - clear_metadata(); + digimodes_init(); place_panels(first_show_panel); window.setTimeout(function(){window.setInterval(debug_audio,1000);},1000); window.addEventListener("resize",openwebrx_resize); @@ -2338,6 +2342,25 @@ function openwebrx_init() } +function digimodes_init() { + hide_digitalvoice_panels(); + + // initialze DMR timeslot muting + $('.openwebrx-dmr-timeslot-panel').click(function(e) { + $(e.currentTarget).toggleClass("muted"); + update_dmr_timeslot_filtering(); + }); +} + +function update_dmr_timeslot_filtering() { + var filter = $('.openwebrx-dmr-timeslot-panel').map(function(index, el){ + return (!$(el).hasClass("muted")) << index; + }).toArray().reduce(function(acc, v){ + return acc | v; + }, 0); + webrx_set_param("dmr_filter", filter); +} + function iosPlayButtonClick() { //On iOS, we can only start audio from a click or touch event. From 4e9ef892766aeb0a48f24ee53edc581efdd1054a Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 15 Jun 2019 19:26:59 +0200 Subject: [PATCH 39/47] use the old api for python < 3.6 --- owrx/feature.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owrx/feature.py b/owrx/feature.py index 38d3fa7..38b8e27 100644 --- a/owrx/feature.py +++ b/owrx/feature.py @@ -99,7 +99,7 @@ class FeatureDetector(object): def check_digiham_version(command): try: process = subprocess.Popen([command, "--version"], stdout=subprocess.PIPE) - version = LooseVersion(digiham_version_regex.match(process.stdout.readline().decode())[1]) + version = LooseVersion(digiham_version_regex.match(process.stdout.readline().decode()).group(1)) process.wait(1) return version >= required_version except FileNotFoundError: From 3b04465106aa70def20890ce6dd349d629986429 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 15 Jun 2019 19:50:09 +0200 Subject: [PATCH 40/47] pointer on the overlay, too --- htdocs/openwebrx.css | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/openwebrx.css b/htdocs/openwebrx.css index 3ed6deb..13a1059 100644 --- a/htdocs/openwebrx.css +++ b/htdocs/openwebrx.css @@ -956,6 +956,7 @@ img.openwebrx-mirror-img height:133px; background-position: center; background-repeat: no-repeat; + cursor: pointer; position: absolute; width: 100%; From 231e4e72d9305565425c464dfb478485aebefeda Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 15 Jun 2019 21:47:28 +0200 Subject: [PATCH 41/47] add missing property binding --- owrx/source.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/owrx/source.py b/owrx/source.py index b02ef28..7d62388 100644 --- a/owrx/source.py +++ b/owrx/source.py @@ -349,7 +349,8 @@ class DspManager(csdr.output): self.localProps = self.sdrSource.getProps().collect( "audio_compression", "fft_compression", "digimodes_fft_size", "csdr_dynamic_bufsize", - "csdr_print_bufsizes", "csdr_through", "digimodes_enable", "samp_rate", "digital_voice_unvoiced_quality" + "csdr_print_bufsizes", "csdr_through", "digimodes_enable", "samp_rate", "digital_voice_unvoiced_quality", + "dmr_filter" ).defaults(PropertyManager.getSharedInstance()) self.dsp = csdr.dsp(self) @@ -376,7 +377,8 @@ class DspManager(csdr.output): self.localProps.getProperty("low_cut").wire(set_low_cut), self.localProps.getProperty("high_cut").wire(set_high_cut), self.localProps.getProperty("mod").wire(self.dsp.set_demodulator), - self.localProps.getProperty("digital_voice_unvoiced_quality").wire(self.dsp.set_unvoiced_quality) + self.localProps.getProperty("digital_voice_unvoiced_quality").wire(self.dsp.set_unvoiced_quality), + self.localProps.getProperty("dmr_filter").wire(self.dsp.set_dmr_filter) ] self.dsp.set_offset_freq(0) From 96468f9258d10e880b6b8d5a85ebde823bf4f806 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Wed, 19 Jun 2019 23:16:57 +0200 Subject: [PATCH 42/47] add a basic clickable pin that opens google maps for now --- htdocs/gfx/google_maps_pin.svg | 77 ++++++++++++++++++++++++++++++++++ htdocs/openwebrx.css | 10 +++++ htdocs/openwebrx.js | 5 ++- 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 htdocs/gfx/google_maps_pin.svg diff --git a/htdocs/gfx/google_maps_pin.svg b/htdocs/gfx/google_maps_pin.svg new file mode 100644 index 0000000..2c54fe1 --- /dev/null +++ b/htdocs/gfx/google_maps_pin.svg @@ -0,0 +1,77 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/htdocs/openwebrx.css b/htdocs/openwebrx.css index 13a1059..5624d79 100644 --- a/htdocs/openwebrx.css +++ b/htdocs/openwebrx.css @@ -1003,3 +1003,13 @@ img.openwebrx-mirror-img .openwebrx-dmr-timeslot-panel * { cursor: pointer; } + +.openwebrx-maps-pin { + background-image: url("gfx/google_maps_pin.svg"); + background-position: center; + background-repeat: no-repeat; + width: 15px; + height: 15px; + background-size: contain; + display: inline-block; +} diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index debd351..27cc8fc 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1351,6 +1351,9 @@ function update_metadata(meta) { if (meta.mode && meta.mode != "") { mode = "Mode: " + meta.mode; source = meta.source || ""; + if (meta.lat && meta.lon) { + source = "" + source; + } up = meta.up ? "Up: " + meta.up : ""; down = meta.down ? "Down: " + meta.down : ""; $(el).find(".openwebrx-meta-slot").addClass("active"); @@ -1358,7 +1361,7 @@ function update_metadata(meta) { $(el).find(".openwebrx-meta-slot").removeClass("active"); } $(el).find(".openwebrx-ysf-mode").text(mode); - $(el).find(".openwebrx-ysf-source").text(source); + $(el).find(".openwebrx-ysf-source").html(source); $(el).find(".openwebrx-ysf-up").text(up); $(el).find(".openwebrx-ysf-down").text(down); From a8b2e21a5a7d9a4aee4c361b8b765d4646ba1f3f Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 20 Jun 2019 14:46:04 +0200 Subject: [PATCH 43/47] update to python 3 --- docker/scripts/install-dependencies.sh | 2 +- docker/scripts/run.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/scripts/install-dependencies.sh b/docker/scripts/install-dependencies.sh index b3049d3..48136b2 100755 --- a/docker/scripts/install-dependencies.sh +++ b/docker/scripts/install-dependencies.sh @@ -14,7 +14,7 @@ function cmakebuild() { cd /tmp -STATIC_PACKAGES="sox fftw python2 netcat-openbsd libsndfile lapack" +STATIC_PACKAGES="sox fftw python3 netcat-openbsd libsndfile lapack" BUILD_PACKAGES="git libsndfile-dev fftw-dev cmake ca-certificates make gcc musl-dev g++ lapack-dev linux-headers" apk add --no-cache $STATIC_PACKAGES diff --git a/docker/scripts/run.sh b/docker/scripts/run.sh index e878d2b..a9034c5 100755 --- a/docker/scripts/run.sh +++ b/docker/scripts/run.sh @@ -16,7 +16,7 @@ _term() { trap _term SIGTERM SIGINT -python2.7 openwebrx.py $@ & +python3 openwebrx.py $@ & child=$! wait "$child" From a66b540254e108d92a79729eddd998e1f5fdbb6d Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 20 Jun 2019 14:46:22 +0200 Subject: [PATCH 44/47] remove rtl-sdr as default (new full package coming up) --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 4a86a03..f4c425e 100755 --- a/build.sh +++ b/build.sh @@ -14,7 +14,7 @@ esac TAGS=$ARCH docker build --build-arg BASE_IMAGE=$BASE_IMAGE -t openwebrx-base:$ARCH -f docker/Dockerfiles/Dockerfile-base . -docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-rtlsdr:$ARCH -t jketterl/openwebrx:$ARCH -f docker/Dockerfiles/Dockerfile-rtlsdr . +docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-rtlsdr:$ARCH -f docker/Dockerfiles/Dockerfile-rtlsdr . docker build --build-arg ARCH=$ARCH -t openwebrx-soapysdr-base:$ARCH -f docker/Dockerfiles/Dockerfile-soapysdr . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-sdrplay:$ARCH -f docker/Dockerfiles/Dockerfile-sdrplay . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-hackrf:$ARCH -f docker/Dockerfiles/Dockerfile-hackrf . From f16a5f92e65a43fe14ec6dd6afb78601f3e22e7d Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 20 Jun 2019 14:47:03 +0200 Subject: [PATCH 45/47] hackrf does not depend on soapy the way it's implemented now --- docker/Dockerfiles/Dockerfile-hackrf | 2 +- docker/scripts/install-dependencies-hackrf.sh | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/docker/Dockerfiles/Dockerfile-hackrf b/docker/Dockerfiles/Dockerfile-hackrf index 55a7530..6afbc4a 100644 --- a/docker/Dockerfiles/Dockerfile-hackrf +++ b/docker/Dockerfiles/Dockerfile-hackrf @@ -1,5 +1,5 @@ ARG ARCH -FROM openwebrx-soapysdr-base:$ARCH +FROM openwebrx-base:$ARCH ADD docker/scripts/install-dependencies-hackrf.sh / RUN /install-dependencies-hackrf.sh diff --git a/docker/scripts/install-dependencies-hackrf.sh b/docker/scripts/install-dependencies-hackrf.sh index 3ca1c75..1a460cc 100755 --- a/docker/scripts/install-dependencies-hackrf.sh +++ b/docker/scripts/install-dependencies-hackrf.sh @@ -26,7 +26,4 @@ cmakebuild host cd .. rm -rf hackrf -git clone https://github.com/pothosware/SoapyHackRF.git -cmakebuild SoapyHackRF - apk del .build-deps From 84ddcbb74d98275d4b9dfaa921f9a892c278ceac Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 20 Jun 2019 14:56:52 +0200 Subject: [PATCH 46/47] add a full build for multi-sdr support --- build.sh | 1 + docker/Dockerfiles/Dockerfile-full | 10 ++++++++++ push.sh | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 docker/Dockerfiles/Dockerfile-full diff --git a/build.sh b/build.sh index f4c425e..2f006e4 100755 --- a/build.sh +++ b/build.sh @@ -18,3 +18,4 @@ docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-rtlsdr:$ARCH -f docker docker build --build-arg ARCH=$ARCH -t openwebrx-soapysdr-base:$ARCH -f docker/Dockerfiles/Dockerfile-soapysdr . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-sdrplay:$ARCH -f docker/Dockerfiles/Dockerfile-sdrplay . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-hackrf:$ARCH -f docker/Dockerfiles/Dockerfile-hackrf . +docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-full:$ARCH -t jketterl/openwebrx:$ARCH -f docker/Dockerfiles/Dockerfile-full . diff --git a/docker/Dockerfiles/Dockerfile-full b/docker/Dockerfiles/Dockerfile-full new file mode 100644 index 0000000..a71a0a4 --- /dev/null +++ b/docker/Dockerfiles/Dockerfile-full @@ -0,0 +1,10 @@ +ARG ARCH +FROM openwebrx-base:$ARCH + +ADD docker/scripts/install-dependencies-*.sh / +ADD docker/scripts/install-lib.*.patch / + +RUN /install-dependencies-rtlsdr.sh +RUN /install-dependencies-hackrf.sh +RUN /install-dependencies-soapysdr.sh +RUN /install-dependencies-sdrplay.sh diff --git a/push.sh b/push.sh index 6844705..ac5d132 100755 --- a/push.sh +++ b/push.sh @@ -3,6 +3,6 @@ set -euxo pipefail ARCH=$(uname -m) -for image in openwebrx openwebrx-rtlsdr openwebrx-sdrplay openwebrx-hackrf; do +for image in openwebrx-rtlsdr openwebrx-sdrplay openwebrx-hackrf openwebrx-full openwebrx; do docker push jketterl/$image:$ARCH done From 08edcd44ef43be64954bb14e752b6853a219b53e Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 20 Jun 2019 15:37:21 +0200 Subject: [PATCH 47/47] add an airspy image --- build.sh | 1 + docker/Dockerfiles/Dockerfile-airspy | 6 +++++ docker/Dockerfiles/Dockerfile-full | 1 + docker/scripts/install-dependencies-airspy.sh | 26 +++++++++++++++++++ push.sh | 2 +- 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 docker/Dockerfiles/Dockerfile-airspy create mode 100755 docker/scripts/install-dependencies-airspy.sh diff --git a/build.sh b/build.sh index 2f006e4..1aa044a 100755 --- a/build.sh +++ b/build.sh @@ -18,4 +18,5 @@ docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-rtlsdr:$ARCH -f docker docker build --build-arg ARCH=$ARCH -t openwebrx-soapysdr-base:$ARCH -f docker/Dockerfiles/Dockerfile-soapysdr . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-sdrplay:$ARCH -f docker/Dockerfiles/Dockerfile-sdrplay . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-hackrf:$ARCH -f docker/Dockerfiles/Dockerfile-hackrf . +docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-airspy:$ARCH -f docker/Dockerfiles/Dockerfile-airspy . docker build --build-arg ARCH=$ARCH -t jketterl/openwebrx-full:$ARCH -t jketterl/openwebrx:$ARCH -f docker/Dockerfiles/Dockerfile-full . diff --git a/docker/Dockerfiles/Dockerfile-airspy b/docker/Dockerfiles/Dockerfile-airspy new file mode 100644 index 0000000..09425b6 --- /dev/null +++ b/docker/Dockerfiles/Dockerfile-airspy @@ -0,0 +1,6 @@ +ARG ARCH +FROM openwebrx-base:$ARCH + +ADD docker/scripts/install-dependencies-airspy.sh / +RUN /install-dependencies-airspy.sh + diff --git a/docker/Dockerfiles/Dockerfile-full b/docker/Dockerfiles/Dockerfile-full index a71a0a4..e502515 100644 --- a/docker/Dockerfiles/Dockerfile-full +++ b/docker/Dockerfiles/Dockerfile-full @@ -8,3 +8,4 @@ RUN /install-dependencies-rtlsdr.sh RUN /install-dependencies-hackrf.sh RUN /install-dependencies-soapysdr.sh RUN /install-dependencies-sdrplay.sh +RUN /install-dependencies-airspy.sh diff --git a/docker/scripts/install-dependencies-airspy.sh b/docker/scripts/install-dependencies-airspy.sh new file mode 100755 index 0000000..e4fcac6 --- /dev/null +++ b/docker/scripts/install-dependencies-airspy.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -euxo pipefail + +function cmakebuild() { + cd $1 + mkdir build + cd build + cmake .. + make + make install + cd ../.. + rm -rf $1 +} + +cd /tmp + +STATIC_PACKAGES="libusb" +BUILD_PACKAGES="git libusb-dev cmake make gcc musl-dev g++ linux-headers" + +apk add --no-cache $STATIC_PACKAGES +apk add --no-cache --virtual .build-deps $BUILD_PACKAGES + +git clone https://github.com/airspy/airspyone_host.git +cmakebuild airspyone_host + +apk del .build-deps diff --git a/push.sh b/push.sh index ac5d132..0288c81 100755 --- a/push.sh +++ b/push.sh @@ -3,6 +3,6 @@ set -euxo pipefail ARCH=$(uname -m) -for image in openwebrx-rtlsdr openwebrx-sdrplay openwebrx-hackrf openwebrx-full openwebrx; do +for image in openwebrx-rtlsdr openwebrx-sdrplay openwebrx-hackrf openwebrx-airspy openwebrx-full openwebrx; do docker push jketterl/$image:$ARCH done