Merge branch 'develop' into radioberry
This commit is contained in:
		| @@ -20,6 +20,11 @@ | ||||
|   [the js8py library](https://github.com/jketterl/js8py)) | ||||
| - Reorganization of the frontend demodulator code | ||||
| - Improve receiver load time by concatenating javascript assets | ||||
| - Docker images migrated to Debian slim images; This was necessary to allow the use of function multiversioning in | ||||
|   csdr and owrx_connector to allow the images to run on a wider range of CPUs | ||||
| - Docker containers have been updated to include the SDRplay driver version 3 | ||||
| - HackRF support is now based on SoapyHackRF | ||||
| - Removed sdr.hu server listing support since the site has been shut down | ||||
|  | ||||
| **0.18.0** | ||||
| - Support for SoapyRemote | ||||
|   | ||||
							
								
								
									
										70
									
								
								bands.json
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								bands.json
									
									
									
									
									
								
							| @@ -199,5 +199,75 @@ | ||||
|     "name": "3cm", | ||||
|     "lower_bound": 10000000000, | ||||
|     "upper_bound": 10500000000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "120m Broadcast", | ||||
|     "lower_bound": 2300000, | ||||
|     "upper_bound": 2495000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "90m Broadcast", | ||||
|     "lower_bound": 3200000, | ||||
|     "upper_bound": 3400000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "75m Broadcast", | ||||
|     "lower_bound": 3900000, | ||||
|     "upper_bound": 4000000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "60m Broadcast", | ||||
|     "lower_bound": 4750000, | ||||
|     "upper_bound": 4995000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "49m Broadcast", | ||||
|     "lower_bound": 5900000, | ||||
|     "upper_bound": 6200000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "41m Broadcast", | ||||
|     "lower_bound": 7200000, | ||||
|     "upper_bound": 7450000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "31m Broadcast", | ||||
|     "lower_bound": 9400000, | ||||
|     "upper_bound": 9900000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "25m Broadcast", | ||||
|     "lower_bound": 11600000, | ||||
|     "upper_bound": 12100000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "22m Broadcast", | ||||
|     "lower_bound": 13570000, | ||||
|     "upper_bound": 13870000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "19m Broadcast", | ||||
|     "lower_bound": 15100000, | ||||
|     "upper_bound": 15830000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "16m Broadcast", | ||||
|     "lower_bound": 17480000, | ||||
|     "upper_bound": 17900000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "15m Broadcast", | ||||
|     "lower_bound": 18900000, | ||||
|     "upper_bound": 19020000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "13m Broadcast", | ||||
|     "lower_bound": 21450000, | ||||
|     "upper_bound": 21850000 | ||||
|   }, | ||||
|   { | ||||
|     "name": "11m Broadcast", | ||||
|     "lower_bound": 25670000, | ||||
|     "upper_bound": 26100000 | ||||
|   } | ||||
| ] | ||||
| @@ -49,23 +49,16 @@ receiver_asl = 200 | ||||
| receiver_admin = "example@example.com" | ||||
| receiver_gps = {"lat": 47.000000, "lon": 19.000000} | ||||
| photo_title = "Panorama of Budapest from Schönherz Zoltán Dormitory" | ||||
| # photo_desc allows you to put pretty much any HTML you like into the receiver description. | ||||
| # The lines below should give you some examples of what's possible. | ||||
| photo_desc = """ | ||||
| You can add your own background photo and receiver information.<br /> | ||||
| Receiver is operated by: <a href="mailto:%[RX_ADMIN]">%[RX_ADMIN]</a><br/> | ||||
| Device: %[RX_DEVICE]<br /> | ||||
| Antenna: %[RX_ANT]<br /> | ||||
| Receiver is operated by: <a href="mailto:openwebrx@localhost" target="_blank">Receiver Operator</a><br/> | ||||
| Device: Receiver Device<br /> | ||||
| Antenna: Receiver Antenna<br /> | ||||
| Website: <a href="http://localhost" target="_blank">http://localhost</a> | ||||
| """ | ||||
|  | ||||
| # ==== sdr.hu listing ==== | ||||
| # If you want your ham receiver to be listed publicly on sdr.hu, then take the following steps: | ||||
| # 1. Register at: http://sdr.hu/register | ||||
| # 2. You will get an unique key by email. Copy it and paste here: | ||||
| sdrhu_key = "" | ||||
| # 3. Set this setting to True to enable listing: | ||||
| sdrhu_public_listing = False | ||||
| server_hostname = "localhost" | ||||
|  | ||||
| # ==== DSP/RX settings ==== | ||||
| fft_fps = 9 | ||||
| fft_size = 4096  # Should be power of 2 | ||||
|   | ||||
| @@ -241,7 +241,7 @@ class dsp(object): | ||||
|             if self.fft_compression == "adpcm": | ||||
|                 chain += ["csdr compress_fft_adpcm_f_u8 {fft_size}"] | ||||
|             return chain | ||||
|         chain += ["csdr shift_addition_cc --fifo {shift_pipe}"] | ||||
|         chain += ["csdr shift_addfast_cc --fifo {shift_pipe}"] | ||||
|         if self.decimation > 1: | ||||
|             chain += ["csdr fir_decimate_cc {decimation} {ddc_transition_bw} HAMMING"] | ||||
|         chain += ["csdr bandpass_fir_fft_cc --fifo {bpf_pipe} {bpf_transition_bw} HAMMING"] | ||||
| @@ -331,7 +331,7 @@ class dsp(object): | ||||
|             return chain | ||||
|         elif which == "bpsk31" or which == "bpsk63": | ||||
|             return chain + [ | ||||
|                 "csdr shift_addition_cc --fifo {secondary_shift_pipe}", | ||||
|                 "csdr shift_addfast_cc --fifo {secondary_shift_pipe}", | ||||
|                 "csdr bandpass_fir_fft_cc -{secondary_bpf_cutoff} {secondary_bpf_cutoff} {secondary_bpf_cutoff}", | ||||
|                 "csdr simple_agc_cc 0.001 0.5", | ||||
|                 "csdr timing_recovery_cc GARDNER {secondary_samples_per_bits} 0.5 2 --add_q", | ||||
|   | ||||
							
								
								
									
										2
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							| @@ -23,6 +23,8 @@ openwebrx (0.19.0) UNRELEASED; urgency=low | ||||
|     installation of js8call and the js8py library) | ||||
|   * Reorganization of the frontend demodulator code | ||||
|   * Improve receiver load time by concatenating javascript assets | ||||
|   * HackRF support is now based on SoapyHackRF | ||||
|   * Removed sdr.hu server listing support since the site has been shut down | ||||
|  | ||||
|  -- Jakob Ketterl <jakob.ketterl@gmx.de>  Thu, 20 Feb 2020 21:01:00 +0000 | ||||
|  | ||||
|   | ||||
| @@ -1,17 +1,18 @@ | ||||
| FROM alpine:3.10 | ||||
| FROM debian:buster-slim | ||||
|  | ||||
| RUN apk add --no-cache bash | ||||
|  | ||||
| RUN ln -s /usr/local/lib /usr/local/lib64 | ||||
|  | ||||
| ADD docker/scripts/direwolf-1.5.patch / | ||||
| ADD docker/files/js8call/js8call-hamlib.patch / | ||||
| ADD docker/files/wsjtx/*.patch / | ||||
| ADD docker/scripts/install-dependencies.sh / | ||||
| RUN /install-dependencies.sh && \ | ||||
|     rm /install-dependencies.sh | ||||
|     rm /install-dependencies.sh && \ | ||||
|     rm /*.patch | ||||
|  | ||||
| ENTRYPOINT ["/init"] | ||||
|  | ||||
| WORKDIR /opt/openwebrx | ||||
|  | ||||
| VOLUME /etc/openwebrx | ||||
|  | ||||
| ENTRYPOINT [ "/opt/openwebrx/docker/scripts/run.sh" ] | ||||
| CMD [ "/opt/openwebrx/docker/scripts/run.sh" ] | ||||
|  | ||||
| EXPOSE 8073 | ||||
|   | ||||
| @@ -2,11 +2,11 @@ ARG ARCHTAG | ||||
| FROM openwebrx-base:$ARCHTAG | ||||
|  | ||||
| ADD docker/scripts/install-dependencies-*.sh / | ||||
| ADD docker/scripts/install-lib.*.patch / | ||||
| ADD docker/files/sdrplay/install-lib.*.patch / | ||||
|  | ||||
| RUN /install-dependencies-rtlsdr.sh &&\ | ||||
|     /install-dependencies-hackrf.sh &&\ | ||||
|     /install-dependencies-soapysdr.sh &&\ | ||||
|     /install-dependencies-hackrf.sh &&\ | ||||
|     /install-dependencies-sdrplay.sh &&\ | ||||
|     /install-dependencies-airspy.sh &&\ | ||||
|     /install-dependencies-rtlsdr-soapy.sh &&\ | ||||
| @@ -21,4 +21,6 @@ ADD docker/scripts/install-connectors.sh / | ||||
| RUN /install-connectors.sh &&\ | ||||
|     rm /install-connectors.sh | ||||
|  | ||||
| ADD docker/files/services/sdrplay /etc/services.d/sdrplay | ||||
|  | ||||
| ADD . /opt/openwebrx | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| ARG ARCHTAG | ||||
| FROM openwebrx-base:$ARCHTAG | ||||
| FROM openwebrx-soapysdr-base:$ARCHTAG | ||||
|  | ||||
| ADD docker/scripts/install-dependencies-hackrf.sh / | ||||
| RUN /install-dependencies-hackrf.sh &&\ | ||||
|   | ||||
| @@ -2,9 +2,11 @@ ARG ARCHTAG | ||||
| FROM openwebrx-soapysdr-base:$ARCHTAG | ||||
|  | ||||
| ADD docker/scripts/install-dependencies-sdrplay.sh / | ||||
| ADD docker/scripts/install-lib.*.patch / | ||||
| ADD docker/files/sdrplay/install-lib.*.patch / | ||||
| RUN /install-dependencies-sdrplay.sh &&\ | ||||
|     rm /install-dependencies-sdrplay.sh &&\ | ||||
|     rm /install-lib.*.patch | ||||
|  | ||||
| ADD docker/files/services/sdrplay /etc/services.d/sdrplay | ||||
|  | ||||
| ADD . /opt/openwebrx | ||||
|   | ||||
							
								
								
									
										150
									
								
								docker/files/js8call/js8call-hamlib.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								docker/files/js8call/js8call-hamlib.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,150 @@ | ||||
| diff -ur js8call-orig/CMake/Modules/Findhamlib.cmake js8call/CMake/Modules/Findhamlib.cmake | ||||
| --- js8call-orig/CMake/Modules/Findhamlib.cmake	2020-05-28 00:10:13.386429366 +0200 | ||||
| +++ js8call/CMake/Modules/Findhamlib.cmake	2020-05-28 00:10:34.339623106 +0200 | ||||
| @@ -78,4 +78,4 @@ | ||||
|  # Handle the  QUIETLY and REQUIRED  arguments and set  HAMLIB_FOUND to | ||||
|  # TRUE if all listed variables are TRUE | ||||
|  include (FindPackageHandleStandardArgs) | ||||
| -find_package_handle_standard_args (hamlib DEFAULT_MSG hamlib_INCLUDE_DIRS hamlib_LIBRARIES hamlib_LIBRARY_DIRS) | ||||
| +find_package_handle_standard_args (hamlib DEFAULT_MSG hamlib_INCLUDE_DIRS hamlib_LIBRARIES) | ||||
| diff -ur js8call-orig/CMakeLists.txt js8call/CMakeLists.txt | ||||
| --- js8call-orig/CMakeLists.txt	2020-05-28 00:10:13.393095987 +0200 | ||||
| +++ js8call/CMakeLists.txt	2020-05-28 00:12:09.925653037 +0200 | ||||
| @@ -683,7 +683,7 @@ | ||||
|  # | ||||
|  # libhamlib setup | ||||
|  # | ||||
| -set (hamlib_STATIC 1) | ||||
| +set (hamlib_STATIC 0) | ||||
|  find_package (hamlib 3 REQUIRED) | ||||
|  find_program (RIGCTL_EXE rigctl) | ||||
|  find_program (RIGCTLD_EXE rigctld) | ||||
| @@ -1033,55 +1033,6 @@ | ||||
|    target_link_libraries (js8 wsjt_fort wsjt_cxx Qt5::Core) | ||||
|  endif (${OPENMP_FOUND} OR APPLE) | ||||
|   | ||||
| -# build the main application | ||||
| -add_executable (js8call MACOSX_BUNDLE | ||||
| -  ${sqlite3_CSRCS} | ||||
| -  ${wsjtx_CXXSRCS} | ||||
| -  ${wsjtx_GENUISRCS} | ||||
| -  wsjtx.rc | ||||
| -  ${WSJTX_ICON_FILE} | ||||
| -  ${wsjtx_RESOURCES_RCC} | ||||
| -  ) | ||||
| - | ||||
| -if (WSJT_CREATE_WINMAIN) | ||||
| -  set_target_properties (js8call PROPERTIES WIN32_EXECUTABLE ON) | ||||
| -endif (WSJT_CREATE_WINMAIN) | ||||
| - | ||||
| -set_target_properties (js8call PROPERTIES | ||||
| -  MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Darwin/Info.plist.in" | ||||
| -  MACOSX_BUNDLE_INFO_STRING "${WSJTX_DESCRIPTION_SUMMARY}" | ||||
| -  MACOSX_BUNDLE_ICON_FILE "${WSJTX_ICON_FILE}" | ||||
| -  MACOSX_BUNDLE_BUNDLE_VERSION ${wsjtx_VERSION} | ||||
| -  MACOSX_BUNDLE_SHORT_VERSION_STRING "v${wsjtx_VERSION}" | ||||
| -  MACOSX_BUNDLE_LONG_VERSION_STRING "Version ${wsjtx_VERSION}" | ||||
| -  MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}" | ||||
| -  MACOSX_BUNDLE_BUNDLE_EXECUTABLE_NAME "${PROJECT_NAME}" | ||||
| -  MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT}" | ||||
| -  MACOSX_BUNDLE_GUI_IDENTIFIER "org.kn4crd.js8call" | ||||
| -  ) | ||||
| - | ||||
| -target_include_directories (js8call PRIVATE ${FFTW3_INCLUDE_DIRS}) | ||||
| -if (APPLE) | ||||
| -  target_link_libraries (js8call wsjt_fort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES}) | ||||
| -else () | ||||
| -  target_link_libraries (js8call wsjt_fort_omp wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES}) | ||||
| -  if (OpenMP_C_FLAGS) | ||||
| -    set_target_properties (js8call PROPERTIES | ||||
| -      COMPILE_FLAGS "${OpenMP_C_FLAGS}" | ||||
| -      LINK_FLAGS "${OpenMP_C_FLAGS}" | ||||
| -      ) | ||||
| -  endif () | ||||
| -  set_target_properties (js8call PROPERTIES | ||||
| -    Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp | ||||
| -    ) | ||||
| -  if (WIN32) | ||||
| -    set_target_properties (js8call PROPERTIES | ||||
| -      LINK_FLAGS -Wl,--stack,16777216 | ||||
| -      ) | ||||
| -  endif () | ||||
| -endif () | ||||
| -qt5_use_modules (js8call SerialPort) # not sure why the interface link library syntax above doesn't work | ||||
| - | ||||
|  # if (UNIX) | ||||
|  #   if (NOT WSJT_SKIP_MANPAGES) | ||||
|  #     add_subdirectory (manpages) | ||||
| @@ -1097,38 +1048,10 @@ | ||||
|  # | ||||
|  # installation | ||||
|  # | ||||
| -install (TARGETS js8call | ||||
| -  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime | ||||
| -  BUNDLE DESTINATION . COMPONENT runtime | ||||
| -  ) | ||||
| - | ||||
|  install (TARGETS js8 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime | ||||
|    BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime | ||||
|    ) | ||||
|   | ||||
| -install (PROGRAMS | ||||
| -  ${RIGCTL_EXE} | ||||
| -  DESTINATION ${CMAKE_INSTALL_BINDIR} | ||||
| -  #COMPONENT runtime | ||||
| -  RENAME rigctl-local${CMAKE_EXECUTABLE_SUFFIX} | ||||
| -  ) | ||||
| - | ||||
| -install (PROGRAMS | ||||
| -  ${RIGCTLD_EXE} | ||||
| -  DESTINATION ${CMAKE_INSTALL_BINDIR} | ||||
| -  #COMPONENT runtime | ||||
| -  RENAME rigctld-local${CMAKE_EXECUTABLE_SUFFIX} | ||||
| -  ) | ||||
| - | ||||
| -install (FILES | ||||
| -  README | ||||
| -  COPYING | ||||
| -  INSTALL | ||||
| -  INSTALL-WSJTX | ||||
| -  DESTINATION ${CMAKE_INSTALL_DOCDIR} | ||||
| -  #COMPONENT runtime | ||||
| -  ) | ||||
| - | ||||
|  install (FILES | ||||
|    contrib/Ephemeris/JPLEPH | ||||
|    DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME} | ||||
| @@ -1182,32 +1105,6 @@ | ||||
|    "${CMAKE_CURRENT_BINARY_DIR}/wsjtx_config.h" | ||||
|    ) | ||||
|   | ||||
| - | ||||
| -if (NOT WIN32 AND NOT APPLE) | ||||
| -  # install a desktop file so js8call appears in the application start | ||||
| -  # menu with an icon | ||||
| -  install ( | ||||
| -    FILES js8call.desktop | ||||
| -    DESTINATION /usr/share/applications | ||||
| -    #COMPONENT runtime | ||||
| -    ) | ||||
| -  install ( | ||||
| -    FILES icons/Unix/js8call_icon.png | ||||
| -    DESTINATION /usr/share/pixmaps | ||||
| -    #COMPONENT runtime | ||||
| -    ) | ||||
| - | ||||
| -    IF("${CMAKE_INSTALL_PREFIX}" STREQUAL "/opt/js8call") | ||||
| -        execute_process(COMMAND ln -s /opt/js8call/bin/js8call ljs8call) | ||||
| - | ||||
| -        install(FILES | ||||
| -            ${CMAKE_BINARY_DIR}/ljs8call DESTINATION /usr/bin/ RENAME js8call | ||||
| -            #COMPONENT runtime | ||||
| -        ) | ||||
| -    endif() | ||||
| -endif (NOT WIN32 AND NOT APPLE) | ||||
| - | ||||
| - | ||||
|  # | ||||
|  # bundle fixup only done in Release or MinSizeRel configurations | ||||
|  # | ||||
| Only in js8call/: .idea | ||||
							
								
								
									
										23
									
								
								docker/files/sdrplay/install-lib.aarch64.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								docker/files/sdrplay/install-lib.aarch64.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| diff -ur sdrplay-orig/install_lib.sh sdrplay/install_lib.sh | ||||
| --- sdrplay-orig/install_lib.sh	2020-05-24 14:30:06.022483867 +0000 | ||||
| +++ sdrplay/install_lib.sh	2020-05-24 14:30:49.093435726 +0000 | ||||
| @@ -4,19 +4,6 @@ | ||||
|  export MAJVERS="3" | ||||
|   | ||||
|  echo "Installing SDRplay RSP API library ${VERS}..." | ||||
| -read -p "Press RETURN to view the license agreement" ret | ||||
| - | ||||
| -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=`uname -m` | ||||
|   | ||||
							
								
								
									
										40
									
								
								docker/files/sdrplay/install-lib.armv7l.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								docker/files/sdrplay/install-lib.armv7l.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| diff -ur sdrplay-orig/install_lib.sh sdrplay/install_lib.sh | ||||
| --- sdrplay-orig/install_lib.sh	2020-05-24 14:13:04.561271707 +0000 | ||||
| +++ sdrplay/install_lib.sh	2020-05-24 14:16:20.068329040 +0000 | ||||
| @@ -4,19 +4,6 @@ | ||||
|  MAJVERS="3" | ||||
|   | ||||
|  echo "Installing SDRplay RSP API library ${VERS}..." | ||||
| -read -p "Press RETURN to view the license agreement" ret | ||||
| - | ||||
| -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 | ||||
|   | ||||
|  ARCH=`uname -m` | ||||
|   | ||||
| @@ -141,16 +128,6 @@ | ||||
|  echo "SDRplay API ${VERS} Installation Finished" | ||||
|  echo " " | ||||
|   | ||||
| -while true; do | ||||
| -    echo "Would you like to add SDRplay USB IDs to the local database for easier | ||||
| -" | ||||
| -    read -p "identification in applications such as lsusb? [y/n] " yn | ||||
| -    case $yn in | ||||
| -        [Yy]* ) break;; | ||||
| -        [Nn]* ) exit;; | ||||
| -        * ) echo "Please answer y or n";; | ||||
| -    esac | ||||
| -done | ||||
|  sudo cp scripts/sdrplay_usbids.sh ${INSTALLBINDIR}/. | ||||
|  sudo chmod 755 ${INSTALLBINDIR}/sdrplay_usbids.sh | ||||
|  sudo cp scripts/sdrplay_ids.txt ${INSTALLBINDIR}/. | ||||
							
								
								
									
										39
									
								
								docker/files/sdrplay/install-lib.x86_64.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								docker/files/sdrplay/install-lib.x86_64.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| diff -ur sdrplay-orig/install_lib.sh sdrplay/install_lib.sh | ||||
| --- sdrplay-orig/install_lib.sh	2020-05-24 13:56:56.622000041 +0000 | ||||
| +++ sdrplay/install_lib.sh	2020-05-24 13:58:51.837801559 +0000 | ||||
| @@ -4,19 +4,6 @@ | ||||
|  MAJVERS="3" | ||||
|   | ||||
|  echo "Installing SDRplay RSP API library ${VERS}..." | ||||
| -read -p "Press RETURN to view the license agreement" ret | ||||
| - | ||||
| -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 | ||||
|   | ||||
|  ARCH=`uname -m` | ||||
|  OSDIST="Unknown" | ||||
| @@ -157,15 +144,6 @@ | ||||
|  echo " " | ||||
|  echo "SDRplay API ${VERS} Installation Finished" | ||||
|  echo " " | ||||
| -while true; do | ||||
| -    echo "Would you like to add SDRplay USB IDs to the local database for easier" | ||||
| -    read -p "identification in applications such as lsusb? [y/n] " yn | ||||
| -    case $yn in | ||||
| -        [Yy]* ) break;; | ||||
| -        [Nn]* ) exit;; | ||||
| -        * ) echo "Please answer y or n";; | ||||
| -    esac | ||||
| -done | ||||
|  sudo cp scripts/sdrplay_usbids.sh ${INSTALLBINDIR}/. | ||||
|  sudo chmod 755 ${INSTALLBINDIR}/sdrplay_usbids.sh | ||||
|  sudo cp scripts/sdrplay_ids.txt ${INSTALLBINDIR}/. | ||||
							
								
								
									
										2
									
								
								docker/files/services/sdrplay/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								docker/files/services/sdrplay/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| #!/usr/bin/execlineb -P | ||||
| /usr/local/bin/sdrplay_apiService | ||||
							
								
								
									
										43
									
								
								docker/files/wsjtx/wsjtx-hamlib.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								docker/files/wsjtx/wsjtx-hamlib.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| --- CMakeLists.txt	2020-05-25 19:26:41.423517236 +0200 | ||||
| +++ CMakeLists.txt	2020-05-25 19:11:36.116236231 +0200 | ||||
| @@ -79,24 +79,6 @@ | ||||
|   | ||||
|  include (ExternalProject) | ||||
|   | ||||
| - | ||||
| -# | ||||
| -# build and install hamlib locally so it can be referenced by the | ||||
| -# WSJT-X build | ||||
| -# | ||||
| -ExternalProject_Add (hamlib | ||||
| -  GIT_REPOSITORY ${hamlib_repo} | ||||
| -  GIT_TAG ${hamlib_TAG} | ||||
| -  URL ${CMAKE_CURRENT_SOURCE_DIR}/src/hamlib.tgz | ||||
| -  URL_HASH MD5=${hamlib_md5sum} | ||||
| -  UPDATE_COMMAND ./bootstrap | ||||
| -  PATCH_COMMAND ${PATCH_EXECUTABLE} -p1 -N < ${CMAKE_CURRENT_SOURCE_DIR}/hamlib.patch | ||||
| -  CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR> --disable-shared --enable-static --without-cxx-binding ${EXTRA_FLAGS} # LIBUSB_LIBS=${USB_LIBRARY} | ||||
| -  BUILD_COMMAND $(MAKE) all V=1 # $(MAKE) is ExternalProject_Add() magic to do recursive make | ||||
| -  INSTALL_COMMAND $(MAKE) install-strip V=1 DESTDIR="" | ||||
| -  STEP_TARGETS update install | ||||
| -  ) | ||||
| - | ||||
|  # | ||||
|  # custom target to make a hamlib source tarball | ||||
|  # | ||||
| @@ -128,7 +110,6 @@ | ||||
|  # build and optionally install WSJT-X using the hamlib package built | ||||
|  # above | ||||
|  # | ||||
| -ExternalProject_Get_Property (hamlib INSTALL_DIR) | ||||
|  ExternalProject_Add (wsjtx | ||||
|    GIT_REPOSITORY ${wsjtx_repo} | ||||
|    GIT_TAG ${WSJTX_TAG} | ||||
| @@ -152,7 +133,6 @@ | ||||
|    DEPENDEES build | ||||
|    ) | ||||
|   | ||||
| -set_target_properties (hamlib PROPERTIES EXCLUDE_FROM_ALL 1) | ||||
|  set_target_properties (wsjtx PROPERTIES EXCLUDE_FROM_ALL 1) | ||||
|   | ||||
|  add_dependencies (wsjtx-configure hamlib-install) | ||||
							
								
								
									
										156
									
								
								docker/files/wsjtx/wsjtx.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								docker/files/wsjtx/wsjtx.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| diff -ur wsjtx-orig/CMake/Modules/Findhamlib.cmake wsjtx/CMake/Modules/Findhamlib.cmake | ||||
| --- wsjtx-orig/CMake/Modules/Findhamlib.cmake	2020-05-27 22:41:57.774855748 +0200 | ||||
| +++ wsjtx/CMake/Modules/Findhamlib.cmake	2020-05-27 22:42:35.267939882 +0200 | ||||
| @@ -85,4 +85,4 @@ | ||||
|  # Handle the  QUIETLY and REQUIRED  arguments and set  HAMLIB_FOUND to | ||||
|  # TRUE if all listed variables are TRUE | ||||
|  include (FindPackageHandleStandardArgs) | ||||
| -find_package_handle_standard_args (hamlib DEFAULT_MSG hamlib_INCLUDE_DIRS hamlib_LIBRARIES hamlib_LIBRARY_DIRS) | ||||
| +find_package_handle_standard_args (hamlib DEFAULT_MSG hamlib_INCLUDE_DIRS hamlib_LIBRARIES) | ||||
| diff -ur wsjtx-orig/CMakeLists.txt wsjtx/CMakeLists.txt | ||||
| --- wsjtx-orig/CMakeLists.txt	2020-05-27 22:41:57.774855748 +0200 | ||||
| +++ wsjtx/CMakeLists.txt	2020-05-27 22:58:18.905001618 +0200 | ||||
| @@ -869,7 +869,7 @@ | ||||
|  # | ||||
|  # libhamlib setup | ||||
|  # | ||||
| -set (hamlib_STATIC 1) | ||||
| +set (hamlib_STATIC 0) | ||||
|  find_package (hamlib 3 REQUIRED) | ||||
|  find_program (RIGCTL_EXE rigctl) | ||||
|  find_program (RIGCTLD_EXE rigctld) | ||||
| @@ -1326,54 +1326,10 @@ | ||||
|   | ||||
|  endif(WSJT_BUILD_UTILS) | ||||
|   | ||||
| -# build the main application | ||||
| -add_executable (wsjtx MACOSX_BUNDLE | ||||
| -  ${wsjtx_CXXSRCS} | ||||
| -  ${wsjtx_GENUISRCS} | ||||
| -  wsjtx.rc | ||||
| -  ${WSJTX_ICON_FILE} | ||||
| -  ${wsjtx_RESOURCES_RCC} | ||||
| -  ) | ||||
| - | ||||
|  if (WSJT_CREATE_WINMAIN) | ||||
|    set_target_properties (wsjtx PROPERTIES WIN32_EXECUTABLE ON) | ||||
|  endif (WSJT_CREATE_WINMAIN) | ||||
|   | ||||
| -set_target_properties (wsjtx PROPERTIES | ||||
| -  MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Darwin/Info.plist.in" | ||||
| -  MACOSX_BUNDLE_INFO_STRING "${WSJTX_DESCRIPTION_SUMMARY}" | ||||
| -  MACOSX_BUNDLE_ICON_FILE "${WSJTX_ICON_FILE}" | ||||
| -  MACOSX_BUNDLE_BUNDLE_VERSION ${wsjtx_VERSION} | ||||
| -  MACOSX_BUNDLE_SHORT_VERSION_STRING "v${wsjtx_VERSION}" | ||||
| -  MACOSX_BUNDLE_LONG_VERSION_STRING "Version ${wsjtx_VERSION}" | ||||
| -  MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}" | ||||
| -  MACOSX_BUNDLE_BUNDLE_EXECUTABLE_NAME "${PROJECT_NAME}" | ||||
| -  MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT}" | ||||
| -  MACOSX_BUNDLE_GUI_IDENTIFIER "org.k1jt.wsjtx" | ||||
| -  ) | ||||
| - | ||||
| -target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS}) | ||||
| -if (APPLE) | ||||
| -  target_link_libraries (wsjtx wsjt_fort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES}) | ||||
| -else () | ||||
| -  target_link_libraries (wsjtx wsjt_fort_omp wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES}) | ||||
| -  if (OpenMP_C_FLAGS) | ||||
| -    set_target_properties (wsjtx PROPERTIES | ||||
| -      COMPILE_FLAGS "${OpenMP_C_FLAGS}" | ||||
| -      LINK_FLAGS "${OpenMP_C_FLAGS}" | ||||
| -      ) | ||||
| -  endif () | ||||
| -  set_target_properties (wsjtx PROPERTIES | ||||
| -    Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp | ||||
| -    ) | ||||
| -  if (WIN32) | ||||
| -    set_target_properties (wsjtx PROPERTIES | ||||
| -      LINK_FLAGS -Wl,--stack,16777216 | ||||
| -      ) | ||||
| -  endif () | ||||
| -endif () | ||||
| -qt5_use_modules (wsjtx SerialPort) # not sure why the interface link library syntax above doesn't work | ||||
| - | ||||
|  # make a library for WSJT-X UDP servers | ||||
|  # add_library (wsjtx_udp SHARED ${UDP_library_CXXSRCS}) | ||||
|  add_library (wsjtx_udp-static STATIC ${UDP_library_CXXSRCS}) | ||||
| @@ -1417,24 +1373,9 @@ | ||||
|    set_target_properties (message_aggregator PROPERTIES WIN32_EXECUTABLE ON) | ||||
|  endif (WSJT_CREATE_WINMAIN) | ||||
|   | ||||
| -if (UNIX) | ||||
| -  if (NOT WSJT_SKIP_MANPAGES) | ||||
| -    add_subdirectory (manpages) | ||||
| -    add_dependencies (wsjtx manpages) | ||||
| -  endif (NOT WSJT_SKIP_MANPAGES) | ||||
| -  if (NOT APPLE) | ||||
| -    add_subdirectory (debian) | ||||
| -    add_dependencies (wsjtx debian) | ||||
| -  endif (NOT APPLE) | ||||
| -endif (UNIX) | ||||
| - | ||||
|  # | ||||
|  # installation | ||||
|  # | ||||
| -install (TARGETS wsjtx | ||||
| -  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime | ||||
| -  BUNDLE DESTINATION . COMPONENT runtime | ||||
| -  ) | ||||
|   | ||||
|  # install (TARGETS wsjtx_udp EXPORT udp | ||||
|  #   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} | ||||
| @@ -1453,12 +1394,7 @@ | ||||
|  #   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx | ||||
|  #   ) | ||||
|   | ||||
| -install (TARGETS udp_daemon message_aggregator | ||||
| -  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime | ||||
| -  BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime | ||||
| -  ) | ||||
| - | ||||
| -install (TARGETS jt9 wsprd fmtave fcal fmeasure | ||||
| +install (TARGETS jt9 wsprd | ||||
|    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime | ||||
|    BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime | ||||
|    ) | ||||
| @@ -1471,39 +1407,6 @@ | ||||
|    ) | ||||
|  endif(WSJT_BUILD_UTILS)   | ||||
|   | ||||
| -install (PROGRAMS | ||||
| -  ${RIGCTL_EXE} | ||||
| -  DESTINATION ${CMAKE_INSTALL_BINDIR} | ||||
| -  #COMPONENT runtime | ||||
| -  RENAME rigctl-wsjtx${CMAKE_EXECUTABLE_SUFFIX} | ||||
| -  ) | ||||
| - | ||||
| -install (PROGRAMS | ||||
| -  ${RIGCTLD_EXE} | ||||
| -  DESTINATION ${CMAKE_INSTALL_BINDIR} | ||||
| -  #COMPONENT runtime | ||||
| -  RENAME rigctld-wsjtx${CMAKE_EXECUTABLE_SUFFIX} | ||||
| -  ) | ||||
| - | ||||
| -install (PROGRAMS | ||||
| -  ${RIGCTLCOM_EXE} | ||||
| -  DESTINATION ${CMAKE_INSTALL_BINDIR} | ||||
| -  #COMPONENT runtime | ||||
| -  RENAME rigctlcom-wsjtx${CMAKE_EXECUTABLE_SUFFIX} | ||||
| -  ) | ||||
| - | ||||
| -install (FILES | ||||
| -  README | ||||
| -  COPYING | ||||
| -  AUTHORS | ||||
| -  THANKS | ||||
| -  NEWS | ||||
| -  INSTALL | ||||
| -  BUGS | ||||
| -  DESTINATION ${CMAKE_INSTALL_DOCDIR} | ||||
| -  #COMPONENT runtime | ||||
| -  ) | ||||
| - | ||||
|  install (FILES | ||||
|    contrib/Ephemeris/JPLEPH | ||||
|    DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME} | ||||
| Only in wsjtx: .idea | ||||
| @@ -1,241 +0,0 @@ | ||||
| diff --git a/Makefile.linux b/Makefile.linux | ||||
| index 5010833..3f61de9 100644 | ||||
| --- a/Makefile.linux | ||||
| +++ b/Makefile.linux | ||||
| @@ -585,102 +585,102 @@ install : $(APPS) direwolf.conf tocalls.txt symbols-new.txt symbolsX.txt dw-icon | ||||
|  # Applications, not installed with package manager, normally go in /usr/local/bin. | ||||
|  # /usr/bin is used instead when installing from .DEB or .RPM package. | ||||
|  # | ||||
| -	$(INSTALL) -D --mode=755 direwolf $(DESTDIR)/bin/direwolf | ||||
| -	$(INSTALL) -D --mode=755 decode_aprs $(DESTDIR)/bin/decode_aprs | ||||
| -	$(INSTALL) -D --mode=755 text2tt $(DESTDIR)/bin/text2tt | ||||
| -	$(INSTALL) -D --mode=755 tt2text $(DESTDIR)/bin/tt2text | ||||
| -	$(INSTALL) -D --mode=755 ll2utm $(DESTDIR)/bin/ll2utm | ||||
| -	$(INSTALL) -D --mode=755 utm2ll $(DESTDIR)/bin/utm2ll | ||||
| -	$(INSTALL) -D --mode=755 aclients $(DESTDIR)/bin/aclients | ||||
| -	$(INSTALL) -D --mode=755 log2gpx $(DESTDIR)/bin/log2gpx | ||||
| -	$(INSTALL) -D --mode=755 gen_packets $(DESTDIR)/bin/gen_packets | ||||
| -	$(INSTALL) -D --mode=755 atest $(DESTDIR)/bin/atest | ||||
| -	$(INSTALL) -D --mode=755 ttcalc $(DESTDIR)/bin/ttcalc | ||||
| -	$(INSTALL) -D --mode=755 kissutil $(DESTDIR)/bin/kissutil | ||||
| -	$(INSTALL) -D --mode=755 cm108 $(DESTDIR)/bin/cm108 | ||||
| -	$(INSTALL) -D --mode=755 dwespeak.sh $(DESTDIR)/bin/dwspeak.sh | ||||
| +	$(INSTALL) -D -m=755 direwolf $(DESTDIR)/bin/direwolf | ||||
| +	$(INSTALL) -D -m=755 decode_aprs $(DESTDIR)/bin/decode_aprs | ||||
| +	$(INSTALL) -D -m=755 text2tt $(DESTDIR)/bin/text2tt | ||||
| +	$(INSTALL) -D -m=755 tt2text $(DESTDIR)/bin/tt2text | ||||
| +	$(INSTALL) -D -m=755 ll2utm $(DESTDIR)/bin/ll2utm | ||||
| +	$(INSTALL) -D -m=755 utm2ll $(DESTDIR)/bin/utm2ll | ||||
| +	$(INSTALL) -D -m=755 aclients $(DESTDIR)/bin/aclients | ||||
| +	$(INSTALL) -D -m=755 log2gpx $(DESTDIR)/bin/log2gpx | ||||
| +	$(INSTALL) -D -m=755 gen_packets $(DESTDIR)/bin/gen_packets | ||||
| +	$(INSTALL) -D -m=755 atest $(DESTDIR)/bin/atest | ||||
| +	$(INSTALL) -D -m=755 ttcalc $(DESTDIR)/bin/ttcalc | ||||
| +	$(INSTALL) -D -m=755 kissutil $(DESTDIR)/bin/kissutil | ||||
| +	$(INSTALL) -D -m=755 cm108 $(DESTDIR)/bin/cm108 | ||||
| +	$(INSTALL) -D -m=755 dwespeak.sh $(DESTDIR)/bin/dwspeak.sh | ||||
|  # | ||||
|  # Telemetry Toolkit executables.   Other .conf and .txt files will go into doc directory. | ||||
|  # | ||||
| -	$(INSTALL) -D --mode=755 telemetry-toolkit/telem-balloon.pl $(DESTDIR)/bin/telem-balloon.pl | ||||
| -	$(INSTALL) -D --mode=755 telemetry-toolkit/telem-bits.pl $(DESTDIR)/bin/telem-bits.pl | ||||
| -	$(INSTALL) -D --mode=755 telemetry-toolkit/telem-data.pl $(DESTDIR)/bin/telem-data.pl | ||||
| -	$(INSTALL) -D --mode=755 telemetry-toolkit/telem-data91.pl $(DESTDIR)/bin/telem-data91.pl | ||||
| -	$(INSTALL) -D --mode=755 telemetry-toolkit/telem-eqns.pl $(DESTDIR)/bin/telem-eqns.pl | ||||
| -	$(INSTALL) -D --mode=755 telemetry-toolkit/telem-parm.pl $(DESTDIR)/bin/telem-parm.pl | ||||
| -	$(INSTALL) -D --mode=755 telemetry-toolkit/telem-seq.sh $(DESTDIR)/bin/telem-seq.sh | ||||
| -	$(INSTALL) -D --mode=755 telemetry-toolkit/telem-unit.pl $(DESTDIR)/bin/telem-unit.pl | ||||
| -	$(INSTALL) -D --mode=755 telemetry-toolkit/telem-volts.py $(DESTDIR)/bin/telem-volts.py | ||||
| +	$(INSTALL) -D -m=755 telemetry-toolkit/telem-balloon.pl $(DESTDIR)/bin/telem-balloon.pl | ||||
| +	$(INSTALL) -D -m=755 telemetry-toolkit/telem-bits.pl $(DESTDIR)/bin/telem-bits.pl | ||||
| +	$(INSTALL) -D -m=755 telemetry-toolkit/telem-data.pl $(DESTDIR)/bin/telem-data.pl | ||||
| +	$(INSTALL) -D -m=755 telemetry-toolkit/telem-data91.pl $(DESTDIR)/bin/telem-data91.pl | ||||
| +	$(INSTALL) -D -m=755 telemetry-toolkit/telem-eqns.pl $(DESTDIR)/bin/telem-eqns.pl | ||||
| +	$(INSTALL) -D -m=755 telemetry-toolkit/telem-parm.pl $(DESTDIR)/bin/telem-parm.pl | ||||
| +	$(INSTALL) -D -m=755 telemetry-toolkit/telem-seq.sh $(DESTDIR)/bin/telem-seq.sh | ||||
| +	$(INSTALL) -D -m=755 telemetry-toolkit/telem-unit.pl $(DESTDIR)/bin/telem-unit.pl | ||||
| +	$(INSTALL) -D -m=755 telemetry-toolkit/telem-volts.py $(DESTDIR)/bin/telem-volts.py | ||||
|  # | ||||
|  # Misc. data such as "tocall" to system mapping. | ||||
|  # | ||||
| -	$(INSTALL) -D --mode=644 tocalls.txt $(DESTDIR)/share/direwolf/tocalls.txt | ||||
| -	$(INSTALL) -D --mode=644 symbols-new.txt $(DESTDIR)/share/direwolf/symbols-new.txt | ||||
| -	$(INSTALL) -D --mode=644 symbolsX.txt $(DESTDIR)/share/direwolf/symbolsX.txt | ||||
| +	$(INSTALL) -D -m=644 tocalls.txt $(DESTDIR)/share/direwolf/tocalls.txt | ||||
| +	$(INSTALL) -D -m=644 symbols-new.txt $(DESTDIR)/share/direwolf/symbols-new.txt | ||||
| +	$(INSTALL) -D -m=644 symbolsX.txt $(DESTDIR)/share/direwolf/symbolsX.txt | ||||
|  # | ||||
|  # For desktop icon. | ||||
|  # | ||||
| -	$(INSTALL) -D --mode=644 dw-icon.png $(DESTDIR)/share/direwolf/pixmaps/dw-icon.png | ||||
| -	$(INSTALL) -D --mode=644 direwolf.desktop $(DESTDIR)/share/applications/direwolf.desktop | ||||
| +	$(INSTALL) -D -m=644 dw-icon.png $(DESTDIR)/share/direwolf/pixmaps/dw-icon.png | ||||
| +	$(INSTALL) -D -m=644 direwolf.desktop $(DESTDIR)/share/applications/direwolf.desktop | ||||
|  # | ||||
|  # Documentation.  Various plain text files and PDF. | ||||
|  # | ||||
| -	$(INSTALL) -D --mode=644 CHANGES.md $(DESTDIR)/share/doc/direwolf/CHANGES.md | ||||
| -	$(INSTALL) -D --mode=644 LICENSE-dire-wolf.txt $(DESTDIR)/share/doc/direwolf/LICENSE-dire-wolf.txt | ||||
| -	$(INSTALL) -D --mode=644 LICENSE-other.txt $(DESTDIR)/share/doc/direwolf/LICENSE-other.txt | ||||
| +	$(INSTALL) -D -m=644 CHANGES.md $(DESTDIR)/share/doc/direwolf/CHANGES.md | ||||
| +	$(INSTALL) -D -m=644 LICENSE-dire-wolf.txt $(DESTDIR)/share/doc/direwolf/LICENSE-dire-wolf.txt | ||||
| +	$(INSTALL) -D -m=644 LICENSE-other.txt $(DESTDIR)/share/doc/direwolf/LICENSE-other.txt | ||||
|  # | ||||
|  # ./README.md is an overview for the project main page. | ||||
|  # Maybe we could stick it in some other place. | ||||
|  # doc/README.md contains an overview of the PDF file contents and is more useful here. | ||||
|  # | ||||
| -	$(INSTALL) -D --mode=644 doc/README.md $(DESTDIR)/share/doc/direwolf/README.md | ||||
| -	$(INSTALL) -D --mode=644 doc/2400-4800-PSK-for-APRS-Packet-Radio.pdf $(DESTDIR)/share/doc/direwolf/2400-4800-PSK-for-APRS-Packet-Radio.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf $(DESTDIR)/share/doc/direwolf/A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf $(DESTDIR)/share/doc/direwolf/A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/A-Closer-Look-at-the-WA8LMF-TNC-Test-CD.pdf $(DESTDIR)/share/doc/direwolf/A-Closer-Look-at-the-WA8LMF-TNC-Test-CD.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/APRS-Telemetry-Toolkit.pdf $(DESTDIR)/share/doc/direwolf/APRS-Telemetry-Toolkit.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/APRStt-Implementation-Notes.pdf $(DESTDIR)/share/doc/direwolf/APRStt-Implementation-Notes.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/APRStt-interface-for-SARTrack.pdf $(DESTDIR)/share/doc/direwolf/APRStt-interface-for-SARTrack.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/APRStt-Listening-Example.pdf $(DESTDIR)/share/doc/direwolf/APRStt-Listening-Example.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/Bluetooth-KISS-TNC.pdf $(DESTDIR)/share/doc/direwolf/Bluetooth-KISS-TNC.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/Going-beyond-9600-baud.pdf $(DESTDIR)/share/doc/direwolf/Going-beyond-9600-baud.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/Raspberry-Pi-APRS.pdf $(DESTDIR)/share/doc/direwolf/Raspberry-Pi-APRS.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/Raspberry-Pi-APRS-Tracker.pdf $(DESTDIR)/share/doc/direwolf/Raspberry-Pi-APRS-Tracker.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/Raspberry-Pi-SDR-IGate.pdf $(DESTDIR)/share/doc/direwolf/Raspberry-Pi-SDR-IGate.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/Successful-APRS-IGate-Operation.pdf $(DESTDIR)/share/doc/direwolf/Successful-APRS-IGate-Operation.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/User-Guide.pdf $(DESTDIR)/share/doc/direwolf/User-Guide.pdf | ||||
| -	$(INSTALL) -D --mode=644 doc/WA8LMF-TNC-Test-CD-Results.pdf $(DESTDIR)/share/doc/direwolf/WA8LMF-TNC-Test-CD-Results.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/README.md $(DESTDIR)/share/doc/direwolf/README.md | ||||
| +	$(INSTALL) -D -m=644 doc/2400-4800-PSK-for-APRS-Packet-Radio.pdf $(DESTDIR)/share/doc/direwolf/2400-4800-PSK-for-APRS-Packet-Radio.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf $(DESTDIR)/share/doc/direwolf/A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf $(DESTDIR)/share/doc/direwolf/A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/A-Closer-Look-at-the-WA8LMF-TNC-Test-CD.pdf $(DESTDIR)/share/doc/direwolf/A-Closer-Look-at-the-WA8LMF-TNC-Test-CD.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/APRS-Telemetry-Toolkit.pdf $(DESTDIR)/share/doc/direwolf/APRS-Telemetry-Toolkit.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/APRStt-Implementation-Notes.pdf $(DESTDIR)/share/doc/direwolf/APRStt-Implementation-Notes.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/APRStt-interface-for-SARTrack.pdf $(DESTDIR)/share/doc/direwolf/APRStt-interface-for-SARTrack.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/APRStt-Listening-Example.pdf $(DESTDIR)/share/doc/direwolf/APRStt-Listening-Example.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/Bluetooth-KISS-TNC.pdf $(DESTDIR)/share/doc/direwolf/Bluetooth-KISS-TNC.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/Going-beyond-9600-baud.pdf $(DESTDIR)/share/doc/direwolf/Going-beyond-9600-baud.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/Raspberry-Pi-APRS.pdf $(DESTDIR)/share/doc/direwolf/Raspberry-Pi-APRS.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/Raspberry-Pi-APRS-Tracker.pdf $(DESTDIR)/share/doc/direwolf/Raspberry-Pi-APRS-Tracker.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/Raspberry-Pi-SDR-IGate.pdf $(DESTDIR)/share/doc/direwolf/Raspberry-Pi-SDR-IGate.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/Successful-APRS-IGate-Operation.pdf $(DESTDIR)/share/doc/direwolf/Successful-APRS-IGate-Operation.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/User-Guide.pdf $(DESTDIR)/share/doc/direwolf/User-Guide.pdf | ||||
| +	$(INSTALL) -D -m=644 doc/WA8LMF-TNC-Test-CD-Results.pdf $(DESTDIR)/share/doc/direwolf/WA8LMF-TNC-Test-CD-Results.pdf | ||||
|  # | ||||
|  # Various sample config and other files go into examples under the doc directory. | ||||
|  # When building from source, these can be put in home directory with "make install-conf". | ||||
|  # When installed from .DEB or .RPM package, the user will need to copy these to | ||||
|  # the home directory or other desired location. | ||||
|  # | ||||
| -	$(INSTALL) -D --mode=644 direwolf.conf $(DESTDIR)/share/doc/direwolf/examples/direwolf.conf | ||||
| -	$(INSTALL) -D --mode=755 dw-start.sh $(DESTDIR)/share/doc/direwolf/examples/dw-start.sh | ||||
| -	$(INSTALL) -D --mode=644 sdr.conf $(DESTDIR)/share/doc/direwolf/examples/sdr.conf | ||||
| -	$(INSTALL) -D --mode=644 telemetry-toolkit/telem-m0xer-3.txt $(DESTDIR)/share/doc/direwolf/examples/telem-m0xer-3.txt | ||||
| -	$(INSTALL) -D --mode=644 telemetry-toolkit/telem-balloon.conf $(DESTDIR)/share/doc/direwolf/examples/telem-balloon.conf | ||||
| -	$(INSTALL) -D --mode=644 telemetry-toolkit/telem-volts.conf $(DESTDIR)/share/doc/direwolf/examples/telem-volts.conf | ||||
| +	$(INSTALL) -D -m=644 direwolf.conf $(DESTDIR)/share/doc/direwolf/examples/direwolf.conf | ||||
| +	$(INSTALL) -D -m=755 dw-start.sh $(DESTDIR)/share/doc/direwolf/examples/dw-start.sh | ||||
| +	$(INSTALL) -D -m=644 sdr.conf $(DESTDIR)/share/doc/direwolf/examples/sdr.conf | ||||
| +	$(INSTALL) -D -m=644 telemetry-toolkit/telem-m0xer-3.txt $(DESTDIR)/share/doc/direwolf/examples/telem-m0xer-3.txt | ||||
| +	$(INSTALL) -D -m=644 telemetry-toolkit/telem-balloon.conf $(DESTDIR)/share/doc/direwolf/examples/telem-balloon.conf | ||||
| +	$(INSTALL) -D -m=644 telemetry-toolkit/telem-volts.conf $(DESTDIR)/share/doc/direwolf/examples/telem-volts.conf | ||||
|  # | ||||
|  # "man" pages | ||||
|  # | ||||
| -	$(INSTALL) -D --mode=644 man1/aclients.1 $(DESTDIR)/share/man/man1/aclients.1 | ||||
| -	$(INSTALL) -D --mode=644 man1/atest.1 $(DESTDIR)/share/man/man1/atest.1 | ||||
| -	$(INSTALL) -D --mode=644 man1/decode_aprs.1 $(DESTDIR)/share/man/man1/decode_aprs.1 | ||||
| -	$(INSTALL) -D --mode=644 man1/direwolf.1 $(DESTDIR)/share/man/man1/direwolf.1 | ||||
| -	$(INSTALL) -D --mode=644 man1/gen_packets.1 $(DESTDIR)/share/man/man1/gen_packets.1 | ||||
| -	$(INSTALL) -D --mode=644 man1/kissutil.1 $(DESTDIR)/share/man/man1/kissutil.1 | ||||
| -	$(INSTALL) -D --mode=644 man1/ll2utm.1 $(DESTDIR)/share/man/man1/ll2utm.1 | ||||
| -	$(INSTALL) -D --mode=644 man1/log2gpx.1 $(DESTDIR)/share/man/man1/log2gpx.1 | ||||
| -	$(INSTALL) -D --mode=644 man1/text2tt.1 $(DESTDIR)/share/man/man1/text2tt.1 | ||||
| -	$(INSTALL) -D --mode=644 man1/tt2text.1 $(DESTDIR)/share/man/man1/tt2text.1 | ||||
| -	$(INSTALL) -D --mode=644 man1/utm2ll.1 $(DESTDIR)/share/man/man1/utm2ll.1 | ||||
| +	$(INSTALL) -D -m=644 man1/aclients.1 $(DESTDIR)/share/man/man1/aclients.1 | ||||
| +	$(INSTALL) -D -m=644 man1/atest.1 $(DESTDIR)/share/man/man1/atest.1 | ||||
| +	$(INSTALL) -D -m=644 man1/decode_aprs.1 $(DESTDIR)/share/man/man1/decode_aprs.1 | ||||
| +	$(INSTALL) -D -m=644 man1/direwolf.1 $(DESTDIR)/share/man/man1/direwolf.1 | ||||
| +	$(INSTALL) -D -m=644 man1/gen_packets.1 $(DESTDIR)/share/man/man1/gen_packets.1 | ||||
| +	$(INSTALL) -D -m=644 man1/kissutil.1 $(DESTDIR)/share/man/man1/kissutil.1 | ||||
| +	$(INSTALL) -D -m=644 man1/ll2utm.1 $(DESTDIR)/share/man/man1/ll2utm.1 | ||||
| +	$(INSTALL) -D -m=644 man1/log2gpx.1 $(DESTDIR)/share/man/man1/log2gpx.1 | ||||
| +	$(INSTALL) -D -m=644 man1/text2tt.1 $(DESTDIR)/share/man/man1/text2tt.1 | ||||
| +	$(INSTALL) -D -m=644 man1/tt2text.1 $(DESTDIR)/share/man/man1/tt2text.1 | ||||
| +	$(INSTALL) -D -m=644 man1/utm2ll.1 $(DESTDIR)/share/man/man1/utm2ll.1 | ||||
|  # | ||||
|  # Set group and mode of HID devices corresponding to C-Media USB Audio adapters. | ||||
|  # This will allow us to use the CM108/CM119 GPIO pins for PTT. | ||||
|  # | ||||
| -	$(INSTALL) -D --mode=644 99-direwolf-cmedia.rules /etc/udev/rules.d/99-direwolf-cmedia.rules | ||||
| +	$(INSTALL) -D -m=644 99-direwolf-cmedia.rules /etc/udev/rules.d/99-direwolf-cmedia.rules | ||||
|  # | ||||
|  	@echo " " | ||||
|  	@echo "If this is your first install, not an upgrade, type this to put a copy" | ||||
| diff --git a/cdigipeater.c b/cdigipeater.c | ||||
| index 9c40d95..94112e9 100644 | ||||
| --- a/cdigipeater.c | ||||
| +++ b/cdigipeater.c | ||||
| @@ -49,7 +49,7 @@ | ||||
|  #include <stdio.h> | ||||
|  #include <ctype.h>	/* for isdigit, isupper */ | ||||
|  #include "regex.h" | ||||
| -#include <sys/unistd.h> | ||||
| +#include <unistd.h> | ||||
|   | ||||
|  #include "ax25_pad.h" | ||||
|  #include "cdigipeater.h" | ||||
| diff --git a/decode_aprs.c b/decode_aprs.c | ||||
| index 35c186b..a620cb3 100644 | ||||
| --- a/decode_aprs.c | ||||
| +++ b/decode_aprs.c | ||||
| @@ -3872,11 +3872,7 @@ static void decode_tocall (decode_aprs_t *A, char *dest) | ||||
|   * models before getting to the more generic APY. | ||||
|   */ | ||||
|   | ||||
| -#if defined(__WIN32__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__APPLE__) | ||||
|  	    qsort (tocalls, num_tocalls, sizeof(struct tocalls_s), tocall_cmp); | ||||
| -#else | ||||
| -	    qsort (tocalls, num_tocalls, sizeof(struct tocalls_s), (__compar_fn_t)tocall_cmp); | ||||
| -#endif | ||||
|  	  } | ||||
|  	  else { | ||||
|  	    if ( ! A->g_quiet) { | ||||
| diff --git a/digipeater.c b/digipeater.c | ||||
| index 36970d7..5195582 100644 | ||||
| --- a/digipeater.c | ||||
| +++ b/digipeater.c | ||||
| @@ -62,7 +62,7 @@ | ||||
|  #include <stdio.h> | ||||
|  #include <ctype.h>	/* for isdigit, isupper */ | ||||
|  #include "regex.h" | ||||
| -#include <sys/unistd.h> | ||||
| +#include <unistd.h> | ||||
|   | ||||
|  #include "ax25_pad.h" | ||||
|  #include "digipeater.h" | ||||
| diff --git a/direwolf.h b/direwolf.h | ||||
| index 514bcc5..52f5ae9 100644 | ||||
| --- a/direwolf.h | ||||
| +++ b/direwolf.h | ||||
| @@ -274,7 +274,7 @@ char *strtok_r(char *str, const char *delim, char **saveptr); | ||||
|  char *strcasestr(const char *S, const char *FIND); | ||||
|   | ||||
|   | ||||
| -#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__APPLE__) | ||||
| +#if 1 | ||||
|   | ||||
|  // strlcpy and strlcat should be in string.h and the C library. | ||||
|   | ||||
| diff --git a/multi_modem.c b/multi_modem.c | ||||
| index 5d96c79..24261b9 100644 | ||||
| --- a/multi_modem.c | ||||
| +++ b/multi_modem.c | ||||
| @@ -80,7 +80,7 @@ | ||||
|  #include <string.h> | ||||
|  #include <assert.h> | ||||
|  #include <stdio.h> | ||||
| -#include <sys/unistd.h> | ||||
| +#include <unistd.h> | ||||
|   | ||||
|  #include "ax25_pad.h" | ||||
|  #include "textcolor.h" | ||||
| @@ -18,12 +18,14 @@ function cmakebuild() { | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| BUILD_PACKAGES="git cmake make gcc g++ musl-dev" | ||||
|  | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| BUILD_PACKAGES="git cmake make gcc g++" | ||||
|  | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $BUILD_PACKAGES | ||||
|  | ||||
| git clone https://github.com/jketterl/owrx_connector.git | ||||
| cmakebuild owrx_connector 9d72cf1382ed90735632a6d0ef6f820a4758f733 | ||||
| cmakebuild owrx_connector 45ec227b38bb763b0a923a1856740f4ddf74216c | ||||
|  | ||||
| apk del .build-deps | ||||
| apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -18,11 +18,11 @@ function cmakebuild() { | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="libusb" | ||||
| BUILD_PACKAGES="git libusb-dev cmake make gcc musl-dev g++ linux-headers" | ||||
| STATIC_PACKAGES="libusb-1.0-0" | ||||
| BUILD_PACKAGES="git libusb-1.0-0-dev cmake make gcc g++ pkg-config" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| git clone https://github.com/airspy/airspyone_host.git | ||||
| cmakebuild airspyone_host bceca18f9e3a5f89cff78c4d949c71771d92dfd3 | ||||
| @@ -36,4 +36,6 @@ cmakebuild airspyhf 613852a2bb64af42690bf9be2201826af69a9475 | ||||
| git clone https://github.com/pothosware/SoapyAirspyHF.git | ||||
| cmakebuild SoapyAirspyHF 81ca737bb044dd930a9de738bced1e4915491f1b | ||||
|  | ||||
| apk del .build-deps | ||||
| apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -18,11 +18,11 @@ function cmakebuild() { | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="libusb fftw udev" | ||||
| BUILD_PACKAGES="git cmake make patch wget sudo gcc g++ libusb-dev fftw-dev" | ||||
| STATIC_PACKAGES="libusb-1.0-0 libfftw3-3 udev" | ||||
| BUILD_PACKAGES="git cmake make patch wget sudo gcc g++ libusb-1.0-0-dev libfftw3-dev pkg-config" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| git clone https://github.com/mossmann/hackrf.git | ||||
| cd hackrf | ||||
| @@ -31,4 +31,9 @@ cmakebuild host | ||||
| cd .. | ||||
| rm -rf hackrf | ||||
|  | ||||
| apk del .build-deps | ||||
| git clone https://github.com/pothosware/SoapyHackRF.git | ||||
| cmakebuild SoapyHackRF 3c514cecd3dd2fdf4794aebc96c482940c11d7ff | ||||
|  | ||||
| SUDO_FORCE_REMOVE=yes apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -4,21 +4,28 @@ export MAKEFLAGS="-j4" | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="libusb" | ||||
| BUILD_PACKAGES="git libusb-dev cmake make gcc musl-dev g++ linux-headers" | ||||
| STATIC_PACKAGES="libusb-1.0-0 libatomic1" | ||||
| BUILD_PACKAGES="git libusb-1.0-0-dev cmake make gcc g++" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| SIMD_FLAGS="" | ||||
| if [[ 'x86_64' == `uname -m` ]] ; then | ||||
|     SIMD_FLAGS="-DDEFAULT_SIMD_FLAGS=SSE3" | ||||
| fi | ||||
|  | ||||
| git clone https://github.com/myriadrf/LimeSuite.git | ||||
| cd LimeSuite | ||||
| git checkout 0854a51ec06b30b01f19a562149c39461e92f24d | ||||
| mkdir builddir | ||||
| cd builddir | ||||
| cmake .. -DENABLE_EXAMPLES=OFF -DENABLE_DESKTOP=OFF -DENABLE_LIME_UTIL=OFF -DENABLE_QUICKTEST=OFF -DENABLE_OCTAVE=OFF -DENABLE_GUI=OFF -DCMAKE_CXX_STANDARD_LIBRARIES="-latomic" | ||||
| cmake .. -DENABLE_EXAMPLES=OFF -DENABLE_DESKTOP=OFF -DENABLE_LIME_UTIL=OFF -DENABLE_QUICKTEST=OFF -DENABLE_OCTAVE=OFF -DENABLE_GUI=OFF -DCMAKE_CXX_STANDARD_LIBRARIES="-latomic" ${SIMD_FLAGS} | ||||
| make | ||||
| make install | ||||
| cd ../.. | ||||
| rm -rf LimeSuite | ||||
|  | ||||
| apk del .build-deps | ||||
| apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -4,11 +4,11 @@ export MAKEFLAGS="-j4" | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="libusb udev" | ||||
| BUILD_PACKAGES="git make gcc autoconf automake libtool musl-dev libusb-dev shadow vim" | ||||
| STATIC_PACKAGES="libusb-1.0-0 libudev1" | ||||
| BUILD_PACKAGES="git make gcc autoconf automake libtool libusb-1.0-0-dev xxd" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| git clone https://github.com/Microtelecom/libperseus-sdr.git | ||||
| cd libperseus-sdr | ||||
| @@ -21,4 +21,6 @@ ldconfig /etc/ld.so.conf.d | ||||
| cd .. | ||||
| rm -rf libperseus-sdr | ||||
|  | ||||
| apk del .build-deps | ||||
| apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -18,11 +18,11 @@ function cmakebuild() { | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="libusb libxml2" | ||||
| BUILD_PACKAGES="git libusb-dev cmake make gcc musl-dev g++ linux-headers libxml2-dev flex bison" | ||||
| STATIC_PACKAGES="libusb-1.0-0 libxml2" | ||||
| BUILD_PACKAGES="git libusb-1.0-0-dev cmake make gcc g++ libxml2-dev flex bison" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| git clone https://github.com/analogdevicesinc/libiio.git | ||||
| cmakebuild libiio 5f5af2e417129ad8f4e05fc5c1b730f0694dca12 -DCMAKE_INSTALL_PREFIX=/usr/local | ||||
| @@ -33,4 +33,6 @@ cmakebuild libad9361-iio 8ac95f3325c18c2e34cd9cfd49c7b63d69a0a9d2 | ||||
| git clone https://github.com/pothosware/SoapyPlutoSDR.git | ||||
| cmakebuild SoapyPlutoSDR c88b7f5bac1e5785f212f9a7c6ce8fef64eb719e | ||||
|  | ||||
| apk del .build-deps | ||||
| apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -18,11 +18,11 @@ function cmakebuild() { | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="libusb" | ||||
| BUILD_PACKAGES="git libusb-dev cmake make gcc musl-dev g++ linux-headers" | ||||
| STATIC_PACKAGES="libusb-1.0-0" | ||||
| BUILD_PACKAGES="git libusb-1.0-0-dev cmake make gcc g++ pkg-config" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| git clone https://github.com/osmocom/rtl-sdr.git | ||||
| cmakebuild rtl-sdr d794155ba65796a76cd0a436f9709f4601509320 | ||||
| @@ -30,4 +30,6 @@ cmakebuild rtl-sdr d794155ba65796a76cd0a436f9709f4601509320 | ||||
| git clone https://github.com/pothosware/SoapyRTLSDR.git | ||||
| cmakebuild SoapyRTLSDR 8ba18f17d64005e43ff2a4e46611f8c710b05007 | ||||
|  | ||||
| apk del .build-deps | ||||
| apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -18,13 +18,15 @@ function cmakebuild() { | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="libusb" | ||||
| BUILD_PACKAGES="git libusb-dev cmake make gcc musl-dev g++ linux-headers" | ||||
| STATIC_PACKAGES="libusb-1.0.0" | ||||
| BUILD_PACKAGES="git libusb-1.0.0-dev cmake make gcc g++ pkg-config" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| git clone https://github.com/osmocom/rtl-sdr.git | ||||
| cmakebuild rtl-sdr d794155ba65796a76cd0a436f9709f4601509320 | ||||
|  | ||||
| apk del .build-deps | ||||
| apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -18,23 +18,23 @@ function cmakebuild() { | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="libusb udev" | ||||
| BUILD_PACKAGES="git cmake make patch wget sudo gcc g++ libusb-dev" | ||||
| STATIC_PACKAGES="libusb-1.0.0 udev" | ||||
| BUILD_PACKAGES="git cmake make patch wget sudo gcc g++ libusb-1.0-0-dev" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| ARCH=$(uname -m) | ||||
|  | ||||
| case $ARCH in | ||||
|   x86_64) | ||||
|     BINARY=SDRplay_RSP_API-Linux-2.13.1.run | ||||
|     BINARY=SDRplay_RSP_API-Linux-3.07.1.run | ||||
|     ;; | ||||
|   armv*) | ||||
|     BINARY=SDRplay_RSP_API-RPi-2.13.1.run | ||||
|     BINARY=SDRplay_RSP_API-ARM32-3.07.2.run | ||||
|     ;; | ||||
|   aarch64) | ||||
|     BINARY=SDRplay_RSP_API-ARM64-2.13.1.run | ||||
|     BINARY=SDRplay_RSP_API-ARM64-3.07.1.run | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| @@ -48,7 +48,9 @@ cd .. | ||||
| rm -rf sdrplay | ||||
| rm $BINARY | ||||
|  | ||||
| git clone https://github.com/pothosware/SoapySDRPlay.git | ||||
| cmakebuild SoapySDRPlay 14ec39e4ff0dab7ae7fdf1afbbd2d28b49b0ffae | ||||
| git clone https://github.com/SDRplay/SoapySDRPlay.git | ||||
| cmakebuild SoapySDRPlay 1c2728a04db5edf8154d02f5cca87e655152d7c1 | ||||
|  | ||||
| apk del .build-deps | ||||
| SUDO_FORCE_REMOVE=yes apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -18,13 +18,15 @@ function cmakebuild() { | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="avahi" | ||||
| BUILD_PACKAGES="git cmake make gcc musl-dev g++ linux-headers avahi-dev" | ||||
| STATIC_PACKAGES="avahi-daemon libavahi-client3" | ||||
| BUILD_PACKAGES="git cmake make gcc g++ libavahi-client-dev" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| git clone https://github.com/pothosware/SoapyRemote.git | ||||
| cmakebuild SoapyRemote 6d9bd820da470cfe7b27b2e6946af93cfece448f | ||||
|  | ||||
| apk del .build-deps | ||||
| apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -18,13 +18,15 @@ function cmakebuild() { | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="udev" | ||||
| STATIC_PACKAGES="libudev1" | ||||
| BUILD_PACKAGES="git cmake make patch wget sudo gcc g++" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| git clone https://github.com/pothosware/SoapySDR | ||||
| cmakebuild SoapySDR f722f9ce5b629c3c44401a9bf628b3f8e67a9695 | ||||
|  | ||||
| apk del .build-deps | ||||
| SUDO_FORCE_REMOVE=yes apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -18,24 +18,46 @@ function cmakebuild() { | ||||
|  | ||||
| cd /tmp | ||||
|  | ||||
| STATIC_PACKAGES="sox fftw python3 netcat-openbsd libsndfile lapack libusb qt5-qtbase qt5-qtmultimedia qt5-qtserialport qt5-qttools alsa-lib" | ||||
| BUILD_PACKAGES="git libsndfile-dev fftw-dev cmake ca-certificates make gcc musl-dev g++ lapack-dev linux-headers autoconf automake libtool texinfo gfortran libusb-dev qt5-qtbase-dev qt5-qtmultimedia-dev qt5-qtserialport-dev qt5-qttools-dev asciidoctor asciidoc alsa-lib-dev linux-headers" | ||||
| STATIC_PACKAGES="sox libfftw3-bin python3 python3-setuptools netcat-openbsd libsndfile1 liblapack3 libusb-1.0-0 libqt5core5a libreadline7 libgfortran4 libgomp1 libasound2 libudev1 ca-certificates" | ||||
| BUILD_PACKAGES="wget git libsndfile1-dev libfftw3-dev cmake make gcc g++ liblapack-dev autoconf automake libtool texinfo gfortran libusb-1.0-0-dev qtbase5-dev qtmultimedia5-dev qttools5-dev libqt5serialport5-dev qttools5-dev-tools asciidoctor asciidoc libasound2-dev pkg-config libudev-dev libhamlib-dev patch xsltproc" | ||||
|  | ||||
| apk add --no-cache $STATIC_PACKAGES | ||||
| apk add --no-cache --virtual .build-deps $BUILD_PACKAGES | ||||
| apt-get update | ||||
| apt-get -y install auto-apt-proxy | ||||
| apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES | ||||
|  | ||||
| case `uname -m` in | ||||
|     arm*) | ||||
|         PLATFORM=armhf | ||||
|         ;; | ||||
|     aarch64*) | ||||
|         PLATFORM=aarch64 | ||||
|         ;; | ||||
|     x86_64*) | ||||
|         PLATFORM=amd64 | ||||
|         ;; | ||||
| esac | ||||
|  | ||||
| pushd /tmp | ||||
| wget https://github.com/just-containers/s6-overlay/releases/download/v1.21.8.0/s6-overlay-${PLATFORM}.tar.gz | ||||
| tar xzf s6-overlay-${PLATFORM}.tar.gz -C / | ||||
| rm s6-overlay-${PLATFORM}.tar.gz | ||||
| popd | ||||
|  | ||||
| git clone https://github.com/jketterl/js8py.git | ||||
| pushd js8py | ||||
| git checkout 888e62be375316882ad2b2ac8e396c3bf857b6fc | ||||
| python3 setup.py install | ||||
| popd | ||||
| rm -rf js8py | ||||
|  | ||||
| git clone https://git.code.sf.net/p/itpp/git itpp | ||||
| cmakebuild itpp bb5c7e95f40e8fdb5c3f3d01a84bcbaf76f3676d | ||||
|  | ||||
| git clone https://github.com/jketterl/csdr.git | ||||
| cd csdr | ||||
| git checkout fe0b042d9cdc2605a817ca7fdd3a23c48bf07563 | ||||
| git checkout c4d8a8a5590898e8c9e94b88b96a2fdc7cd0493a | ||||
| autoreconf -i | ||||
| ./configure | ||||
| make | ||||
| make install | ||||
| cd .. | ||||
| @@ -50,21 +72,14 @@ cmakebuild digiham 95206501be89b38d0267bf6c29a6898e7c65656f | ||||
| git clone https://github.com/f4exb/dsd.git | ||||
| cmakebuild dsd f6939f9edbbc6f66261833616391a4e59cb2b3d7 | ||||
|  | ||||
| git clone https://github.com/Hamlib/Hamlib.git | ||||
| pushd Hamlib | ||||
| git checkout 301ebb92eaa538dfa75c06821f46715f40dd7673 | ||||
| ./bootstrap | ||||
| ./configure | ||||
| make | ||||
| make install | ||||
| popd | ||||
| rm -rf Hamlib | ||||
|  | ||||
| JS8CALL_VERSION=2.1.1 | ||||
| JS8CALL_DIR=js8call-${JS8CALL_VERSION} | ||||
| JS8CALL_TGZ=${JS8CALL_DIR}.tgz | ||||
| wget http://files.js8call.com/${JS8CALL_VERSION}/${JS8CALL_TGZ} | ||||
| tar xfz ${JS8CALL_TGZ} | ||||
| # patch allows us to build against the packaged hamlib | ||||
| patch -Np1 -d ${JS8CALL_DIR} < /js8call-hamlib.patch | ||||
| rm /js8call-hamlib.patch | ||||
| CMAKE_ARGS="-D CMAKE_CXX_FLAGS=-DJS8_USE_LEGACY_HAMLIB" cmakebuild ${JS8CALL_DIR} | ||||
| rm ${JS8CALL_TGZ} | ||||
|  | ||||
| @@ -72,12 +87,13 @@ WSJT_DIR=wsjtx-2.1.2 | ||||
| WSJT_TGZ=${WSJT_DIR}.tgz | ||||
| wget http://physics.princeton.edu/pulsar/k1jt/${WSJT_TGZ} | ||||
| tar xfz ${WSJT_TGZ} | ||||
| patch -Np0 -d ${WSJT_DIR} < /wsjtx-hamlib.patch | ||||
| mv /wsjtx.patch ${WSJT_DIR} | ||||
| cmakebuild ${WSJT_DIR} | ||||
| rm ${WSJT_TGZ} | ||||
|  | ||||
| git clone --depth 1 -b 1.5 https://github.com/wb2osz/direwolf.git | ||||
| cd direwolf | ||||
| patch -Np1 < /direwolf-1.5.patch | ||||
| make | ||||
| make install | ||||
| cd .. | ||||
| @@ -88,4 +104,6 @@ pushd /opt/aprs-symbols | ||||
| git checkout 5c2abe2658ee4d2563f3c73b90c6f59124839802 | ||||
| popd | ||||
|  | ||||
| apk del .build-deps | ||||
| apt-get -y purge --autoremove $BUILD_PACKAGES | ||||
| apt-get clean | ||||
| rm -rf /var/lib/apt/lists/* | ||||
|   | ||||
| @@ -1,40 +0,0 @@ | ||||
| --- sdrplay/install_lib.sh	2018-06-21 18:47:08.000000000 +0000 | ||||
| +++ sdrplay/install_lib_patched.sh	2019-12-15 01:49:49.477386963 +0000 | ||||
| @@ -3,19 +3,7 @@ | ||||
|   | ||||
|  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}" | ||||
| @@ -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 | ||||
|   | ||||
| @@ -1,40 +0,0 @@ | ||||
| --- sdrplay/install_lib.sh | ||||
| +++ sdrplay/install_lib_patched.sh | ||||
| @@ -3,19 +3,7 @@ | ||||
|   | ||||
|  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 "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..." | ||||
| -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 | ||||
| @@ -1,40 +0,0 @@ | ||||
| --- 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 | ||||
| -    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..." | ||||
|   | ||||
| @@ -1,11 +1,6 @@ | ||||
| @import url("openwebrx-header.css"); | ||||
| @import url("openwebrx-globals.css"); | ||||
|  | ||||
| body { | ||||
|     background-color: #2e2e2e; | ||||
|     color: #DDD; | ||||
| } | ||||
|  | ||||
| .buttons { | ||||
|     text-align: right; | ||||
| } | ||||
|   | ||||
							
								
								
									
										12
									
								
								htdocs/css/bootstrap.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								htdocs/css/bootstrap.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -5,7 +5,3 @@ h1 { | ||||
|     text-align: center; | ||||
|     margin: 50px 0; | ||||
| } | ||||
|  | ||||
| .table { | ||||
|     color: inherit; | ||||
| } | ||||
| @@ -1,10 +1,6 @@ | ||||
| @import url("openwebrx-header.css"); | ||||
| @import url("openwebrx-globals.css"); | ||||
|  | ||||
| body { | ||||
|     background-color: #2e2e2e; | ||||
| } | ||||
|  | ||||
| .login { | ||||
|     position: absolute; | ||||
|     left: 50%; | ||||
| @@ -13,7 +9,6 @@ body { | ||||
|  | ||||
|     width: 500px; | ||||
|  | ||||
|     background-color: #ddd; | ||||
|     padding: 20px; | ||||
|     border-radius: 10px; | ||||
|     border: 1px solid #575757; | ||||
| @@ -25,8 +20,5 @@ body { | ||||
| } | ||||
|  | ||||
| .btn-login { | ||||
|     color: #FFF; | ||||
|     background-color: #2e2e2e; | ||||
|     border-color: #2e2e2e; | ||||
|     height: 50px; | ||||
| } | ||||
| @@ -43,6 +43,15 @@ | ||||
|     right: 0; | ||||
| } | ||||
|  | ||||
| #webrx-tob-container, #webrx-top-container * { | ||||
|     line-height: initial; | ||||
|     box-sizing: initial; | ||||
| } | ||||
|  | ||||
| #webrx-top-container img { | ||||
|     vertical-align: initial; | ||||
| } | ||||
|  | ||||
| #webrx-top-logo | ||||
| { | ||||
|     padding: 12px; | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <HTML><HEAD> | ||||
|     <TITLE>OpenWebRX Feature report</TITLE> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="static/favicon.ico" /> | ||||
|     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> | ||||
|     <link rel="stylesheet" href="static/css/bootstrap.min.css" /> | ||||
|     <link rel="stylesheet" type="text/css" href="static/css/admin.css" /> | ||||
|     <link rel="stylesheet" href="static/css/features.css"> | ||||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/showdown/1.9.0/showdown.min.js"></script> | ||||
|   | ||||
| @@ -3,12 +3,10 @@ | ||||
| <head> | ||||
|     <title>OpenWebRX Settings</title> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="static/favicon.ico" /> | ||||
|     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> | ||||
|     <link rel="stylesheet" href="static/css/bootstrap.min.css" /> | ||||
|     <link rel="stylesheet" type="text/css" href="static/css/admin.css" /> | ||||
|     <script src="static/lib/jquery-3.2.1.min.js"></script> | ||||
|     <script src="static/lib/Header.js"></script> | ||||
|     <script src="https://unpkg.com/location-picker/dist/location-picker.min.js"></script> | ||||
|     <script src="static/settings.js"></script> | ||||
|     <script src="compiled/settings.js"></script> | ||||
|     <meta charset="utf-8"> | ||||
| </head> | ||||
| <body> | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| <div id="webrx-top-container"> | ||||
|     <div id="webrx-top-photo-clip"> | ||||
|         <img src="static/gfx/openwebrx-top-photo.jpg" id="webrx-top-photo"/> | ||||
|         <img src="static/gfx/openwebrx-top-photo.jpg" id="webrx-top-photo" alt="Receiver panorama"/> | ||||
|         <div id="webrx-top-bar" class="webrx-top-bar-parts"> | ||||
|             <a href="https://www.openwebrx.de/" target="_blank"><img src="static/gfx/openwebrx-top-logo.png" id="webrx-top-logo" /></a> | ||||
|             <img id="webrx-rx-avatar" class="openwebrx-photo-trigger" src="static/gfx/openwebrx-avatar.png"/> | ||||
|             <a href="https://www.openwebrx.de/" target="_blank"><img src="static/gfx/openwebrx-top-logo.png" id="webrx-top-logo" alt="OpenWebRX Logo"/></a> | ||||
|             <img id="webrx-rx-avatar" class="openwebrx-photo-trigger" src="static/gfx/openwebrx-avatar.png" alt="Receiver avatar"/> | ||||
|             <div id="webrx-rx-texts"> | ||||
|                 <div id="webrx-rx-title" class="openwebrx-photo-trigger"></div> | ||||
|                 <div id="webrx-rx-desc" class="openwebrx-photo-trigger"></div> | ||||
| @@ -13,10 +13,10 @@ | ||||
|                 <a id="openwebrx-rx-details-arrow-down" class="openwebrx-photo-trigger"><img src="static/gfx/openwebrx-rx-details-arrow.png" /></a> | ||||
|             </div> | ||||
|             <section id="openwebrx-main-buttons"> | ||||
|                 <div class="button" data-toggle-panel="openwebrx-panel-status"><img src="static/gfx/openwebrx-panel-status.png" /><br/>Status</div> | ||||
|                 <div class="button" data-toggle-panel="openwebrx-panel-log"><img  src="static/gfx/openwebrx-panel-log.png" /><br/>Log</div> | ||||
|                 <div class="button" data-toggle-panel="openwebrx-panel-receiver"><img src="static/gfx/openwebrx-panel-receiver.png" /><br/>Receiver</div> | ||||
|                 <a class="button" href="map" target="openwebrx-map"><img src="static/gfx/openwebrx-panel-map.png" /><br/>Map</a> | ||||
|                 <div class="button" data-toggle-panel="openwebrx-panel-status"><img src="static/gfx/openwebrx-panel-status.png" alt="Status"/><br/>Status</div> | ||||
|                 <div class="button" data-toggle-panel="openwebrx-panel-log"><img  src="static/gfx/openwebrx-panel-log.png" alt="Log"/><br/>Log</div> | ||||
|                 <div class="button" data-toggle-panel="openwebrx-panel-receiver"><img src="static/gfx/openwebrx-panel-receiver.png" alt="Receiver"/><br/>Receiver</div> | ||||
|                 <a class="button" href="map" target="openwebrx-map"><img src="static/gfx/openwebrx-panel-map.png" alt="Map"/><br/>Map</a> | ||||
|                 ${settingslink} | ||||
|             </section> | ||||
|         </div> | ||||
|   | ||||
| @@ -222,7 +222,7 @@ DemodulatorPanel.prototype.transformHashParams = function(params) { | ||||
|     var ret = { | ||||
|         mod: params.secondary_mod || params.mod | ||||
|     }; | ||||
|     if (params.offset_frequency) ret.offset_frequency = params.offset_frequency; | ||||
|     if (typeof(params.offset_frequency) !== 'undefined') ret.offset_frequency = params.offset_frequency; | ||||
|     if (typeof(params.sql) !== 'undefined') ret.squelch_level = parseInt(params.sql); | ||||
|     return ret; | ||||
| }; | ||||
|   | ||||
| @@ -6,6 +6,7 @@ function Header(el) { | ||||
|     }); | ||||
|  | ||||
|     this.init_rx_photo(); | ||||
|     this.download_details(); | ||||
| }; | ||||
|  | ||||
| Header.prototype.setDetails = function(details) { | ||||
| @@ -57,6 +58,13 @@ Header.prototype.toggle_rx_photo = function(ev) { | ||||
|     } | ||||
| }; | ||||
|  | ||||
| Header.prototype.download_details = function() { | ||||
|     var self = this; | ||||
|     $.ajax('api/receiverdetails').done(function(data){ | ||||
|         self.setDetails(data); | ||||
|     }); | ||||
| }; | ||||
|  | ||||
| $.fn.header = function() { | ||||
|     if (!this.data('header')) { | ||||
|         this.data('header', new Header(this)); | ||||
|   | ||||
							
								
								
									
										138
									
								
								htdocs/lib/settings/Input.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								htdocs/lib/settings/Input.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | ||||
| function Input(name, value, options) { | ||||
|     this.name = name; | ||||
|     this.value = value; | ||||
|     this.options = options; | ||||
|     this.label = options && options.label || name; | ||||
| }; | ||||
|  | ||||
| Input.prototype.getClasses = function() { | ||||
|     return ['form-control', 'form-control-sm']; | ||||
| } | ||||
|  | ||||
| Input.prototype.bootstrapify = function(input) { | ||||
|     this.getClasses().forEach(input.addClass.bind(input)); | ||||
|     return [ | ||||
|         '<div class="form-group row">', | ||||
|             '<label class="col-form-label col-form-label-sm col-3" for="' + this.name + '">' + this.label + '</label>', | ||||
|             '<div class="col-9">', | ||||
|                 $.map(input, function(el) { | ||||
|                     return el.outerHTML; | ||||
|                 }).join(''), | ||||
|             '</div>', | ||||
|         '</div>' | ||||
|     ].join(''); | ||||
| }; | ||||
|  | ||||
| function TextInput() { | ||||
|     Input.apply(this, arguments); | ||||
| }; | ||||
|  | ||||
| TextInput.prototype = new Input(); | ||||
|  | ||||
| TextInput.prototype.render = function() { | ||||
|     return this.bootstrapify($('<input type="text" name="' + this.name + '" value="' + this.value + '">')); | ||||
| } | ||||
|  | ||||
| function NumberInput() { | ||||
|     Input.apply(this, arguments); | ||||
| }; | ||||
|  | ||||
| NumberInput.prototype = new Input(); | ||||
|  | ||||
| NumberInput.prototype.render = function() { | ||||
|     return this.bootstrapify($('<input type="number" name="' + this.name + '" value="' + this.value + '">')); | ||||
| }; | ||||
|  | ||||
| function SoapyGainInput() { | ||||
|     Input.apply(this, arguments); | ||||
| } | ||||
|  | ||||
| SoapyGainInput.prototype = new Input(); | ||||
|  | ||||
| SoapyGainInput.prototype.getClasses = function() { | ||||
|     return []; | ||||
| }; | ||||
|  | ||||
| SoapyGainInput.prototype.render = function(){ | ||||
|     var markup = $( | ||||
|         '<div class="row form-group">' + | ||||
|             '<div class="col-4">Gain mode</div>' + | ||||
|             '<div class="col-8">' + | ||||
|                 '<select class="form-control form-control-sm">' + | ||||
|                     '<option value="auto">automatic gain</option>' + | ||||
|                     '<option value="single">single gain value</option>' + | ||||
|                     '<option value="separate">separate gain values</option>' + | ||||
|                 '</select>' + | ||||
|             '</div>' + | ||||
|         '</div>' + | ||||
|         '<div class="row option form-group gain-mode-single">' + | ||||
|             '<div class="col-4">Gain</div>' + | ||||
|             '<div class="col-8">' + | ||||
|                 '<input class="form-control form-control-sm" type="number">' + | ||||
|             '</div>' + | ||||
|         '</div>' + | ||||
|         this.options.gains.map(function(g){ | ||||
|             return '<div class="row option form-group gain-mode-separate">' + | ||||
|                 '<div class="col-4">' + g + '</div>' + | ||||
|                 '<div class="col-8">' + | ||||
|                     '<input class="form-control form-control-sm" data-gain="' + g + '" type="number">' + | ||||
|                 '</div>' + | ||||
|             '</div>'; | ||||
|         }).join('') | ||||
|     ); | ||||
|     var el = $(this.bootstrapify(markup)) | ||||
|     var setMode = function(mode){ | ||||
|         el.find('select').val(mode); | ||||
|         el.find('.option').hide(); | ||||
|         el.find('.gain-mode-' + mode).show(); | ||||
|     }; | ||||
|     el.on('change', 'select', function(){ | ||||
|         var mode = $(this).val(); | ||||
|         setMode(mode); | ||||
|     }); | ||||
|     if (typeof(this.value) === 'number') { | ||||
|         setMode('single'); | ||||
|         el.find('.gain-mode-single input').val(this.value); | ||||
|     } else if (typeof(this.value) === 'string') { | ||||
|         if (this.value === 'auto') { | ||||
|             setMode('auto'); | ||||
|         } else { | ||||
|             setMode('separate'); | ||||
|             values = $.extend.apply($, this.value.split(',').map(function(seg){ | ||||
|                 var split = seg.split('='); | ||||
|                 if (split.length < 2) return; | ||||
|                 var res = {}; | ||||
|                 res[split[0]] = parseInt(split[1]); | ||||
|                 return res; | ||||
|             })); | ||||
|             el.find('.gain-mode-separate input').each(function(){ | ||||
|                 var $input = $(this); | ||||
|                 var g = $input.data('gain'); | ||||
|                 $input.val(g in values ? values[g] : 0); | ||||
|             }); | ||||
|         } | ||||
|     } else { | ||||
|         setMode('auto'); | ||||
|     } | ||||
|     return el; | ||||
| }; | ||||
|  | ||||
| function ProfileInput() { | ||||
|     Input.apply(this, arguments); | ||||
| }; | ||||
|  | ||||
| ProfileInput.prototype = new Input(); | ||||
|  | ||||
| ProfileInput.prototype.render = function() { | ||||
|     return $('<div><h3>Profiles</h3></div>'); | ||||
| }; | ||||
|  | ||||
| function SchedulerInput() { | ||||
|     Input.apply(this, arguments); | ||||
| }; | ||||
|  | ||||
| SchedulerInput.prototype = new Input(); | ||||
|  | ||||
| SchedulerInput.prototype.render = function() { | ||||
|     return $('<div><h3>Scheduler</h3></div>'); | ||||
| }; | ||||
							
								
								
									
										252
									
								
								htdocs/lib/settings/SdrDevice.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								htdocs/lib/settings/SdrDevice.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,252 @@ | ||||
| function SdrDevice(el, data) { | ||||
|     this.el = el; | ||||
|     this.data = data; | ||||
|     this.inputs = {}; | ||||
|     this.render(); | ||||
|  | ||||
|     var self = this; | ||||
|     el.on('click', '.fieldselector .btn', function() { | ||||
|         var key = el.find('.fieldselector select').val(); | ||||
|         self.data[key] = self.getInitialValue(key); | ||||
|         self.render(); | ||||
|     }); | ||||
| }; | ||||
|  | ||||
| SdrDevice.create = function(el) { | ||||
|     var data = JSON.parse(decodeURIComponent(el.data('config'))); | ||||
|     var type = data.type; | ||||
|     var constructor = SdrDevice.types[type] || SdrDevice; | ||||
|     return new constructor(el, data); | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.getData = function() { | ||||
|     return $.extend(new Object(), this.getDefaults(), this.data); | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.getDefaults = function() { | ||||
|     var defaults = {} | ||||
|     $.each(this.getMappings(), function(k, v) { | ||||
|         if (!v.includeInDefault) return; | ||||
|         defaults[k] = 'initialValue' in v ? v['initialValue'] : false; | ||||
|     }); | ||||
|     return defaults; | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.getMappings = function() { | ||||
|     return { | ||||
|         "name": { | ||||
|             constructor: TextInput, | ||||
|             inputOptions: { | ||||
|                 label: "Name" | ||||
|             }, | ||||
|             initialValue: "", | ||||
|             includeInDefault: true | ||||
|         }, | ||||
|         "type": { | ||||
|             constructor: TextInput, | ||||
|             inputOptions: { | ||||
|                 label: "Type" | ||||
|             }, | ||||
|             initialValue: '', | ||||
|             includeInDefault: true | ||||
|         }, | ||||
|         "ppm": { | ||||
|             constructor: NumberInput, | ||||
|             inputOptions: { | ||||
|                 label: "PPM" | ||||
|             }, | ||||
|             initialValue: 0 | ||||
|         }, | ||||
|         "profiles": { | ||||
|             constructor: ProfileInput, | ||||
|             inputOptions: { | ||||
|                 label: "Profiles" | ||||
|             }, | ||||
|             initialValue: [], | ||||
|             includeInDefault: true, | ||||
|             position: 100 | ||||
|         }, | ||||
|         "scheduler": { | ||||
|             constructor: SchedulerInput, | ||||
|             inputOptions: { | ||||
|                 label: "Scheduler", | ||||
|             }, | ||||
|             initialValue: {}, | ||||
|             position: 101 | ||||
|         }, | ||||
|         "rf_gain": { | ||||
|             constructor: TextInput, | ||||
|             inputOptions: { | ||||
|                 label: "Gain", | ||||
|             }, | ||||
|             initialValue: 0 | ||||
|         } | ||||
|     }; | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.getMapping = function(key) { | ||||
|     var mappings = this.getMappings(); | ||||
|     return mappings[key]; | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.getInputClass = function(key) { | ||||
|     var mapping = this.getMapping(key); | ||||
|     return mapping && mapping.constructor || TextInput; | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.getInitialValue = function(key) { | ||||
|     var mapping = this.getMapping(key); | ||||
|     return mapping && ('initialValue' in mapping) ? mapping['initialValue'] : false; | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.getPosition = function(key) { | ||||
|     var mapping = this.getMapping(key); | ||||
|     return mapping && mapping.position || 10; | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.getInputOptions = function(key) { | ||||
|     var mapping = this.getMapping(key); | ||||
|     return mapping && mapping.inputOptions || {}; | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.getLabel = function(key) { | ||||
|     var options = this.getInputOptions(key); | ||||
|     return options && options.label || key; | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.render = function() { | ||||
|     var self = this; | ||||
|     self.el.empty(); | ||||
|     var data = this.getData(); | ||||
|     Object.keys(data).sort(function(a, b){ | ||||
|         return self.getPosition(a) - self.getPosition(b); | ||||
|     }).forEach(function(key){ | ||||
|         var value = data[key]; | ||||
|         var inputClass = self.getInputClass(key); | ||||
|         var input = new inputClass(key, value, self.getInputOptions(key)); | ||||
|         self.inputs[key] = input; | ||||
|         self.el.append(input.render()); | ||||
|     }); | ||||
|     self.el.append(this.renderFieldSelector()); | ||||
| }; | ||||
|  | ||||
| SdrDevice.prototype.renderFieldSelector = function() { | ||||
|     var self = this; | ||||
|     return '<div class="fieldselector">' + | ||||
|         '<h3>Add new configuration options<h3>' + | ||||
|         '<div class="form-group row">' + | ||||
|             '<div class="col-3"><select class="form-control form-control-sm">' + | ||||
|                 Object.keys(self.getMappings()).filter(function(m){ | ||||
|                     return !(m in self.data); | ||||
|                 }).map(function(m) { | ||||
|                     return '<option value="' + m + '">' + self.getLabel(m) + '</option>'; | ||||
|                 }).join('') + | ||||
|             '</select></div>' + | ||||
|             '<div class="col-2">' + | ||||
|                 '<div class="btn btn-primary">Add to config</div>' + | ||||
|             '</div>' + | ||||
|         '</div>' + | ||||
|     '</div>'; | ||||
| }; | ||||
|  | ||||
| RtlSdrDevice = function() { | ||||
|     SdrDevice.apply(this, arguments); | ||||
| }; | ||||
|  | ||||
| RtlSdrDevice.prototype = Object.create(SdrDevice.prototype); | ||||
| RtlSdrDevice.prototype.constructor = RtlSdrDevice; | ||||
|  | ||||
| RtlSdrDevice.prototype.getMappings = function() { | ||||
|     var mappings = SdrDevice.prototype.getMappings.apply(this, arguments); | ||||
|     return $.extend(new Object(), mappings, { | ||||
|         "device": { | ||||
|             constructor: TextInput, | ||||
|             inputOptions:{ | ||||
|                 label: "Serial number" | ||||
|             }, | ||||
|             initialValue: "" | ||||
|         } | ||||
|     }); | ||||
| }; | ||||
|  | ||||
| SoapySdrDevice = function() { | ||||
|     SdrDevice.apply(this, arguments); | ||||
| }; | ||||
|  | ||||
| SoapySdrDevice.prototype = Object.create(SdrDevice.prototype); | ||||
| SoapySdrDevice.prototype.constructor = SoapySdrDevice; | ||||
|  | ||||
| SoapySdrDevice.prototype.getMappings = function() { | ||||
|     var mappings = SdrDevice.prototype.getMappings.apply(this, arguments); | ||||
|     return $.extend(new Object(), mappings, { | ||||
|         "device": { | ||||
|             constructor: TextInput, | ||||
|             inputOptions:{ | ||||
|                 label: "Soapy device selector" | ||||
|             }, | ||||
|             initialValue: "" | ||||
|         }, | ||||
|         "rf_gain": { | ||||
|             constructor: SoapyGainInput, | ||||
|             initialValue: 0, | ||||
|             inputOptions: { | ||||
|                 label: "Gain", | ||||
|                 gains: this.getGains() | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
| }; | ||||
|  | ||||
| SoapySdrDevice.prototype.getGains = function() { | ||||
|     return []; | ||||
| }; | ||||
|  | ||||
| SdrplaySdrDevice = function() { | ||||
|     SoapySdrDevice.apply(this, arguments); | ||||
| }; | ||||
|  | ||||
| SdrplaySdrDevice.prototype = Object.create(SoapySdrDevice.prototype); | ||||
| SdrplaySdrDevice.prototype.constructor = SdrplaySdrDevice; | ||||
|  | ||||
| SdrplaySdrDevice.prototype.getGains = function() { | ||||
|     return ['RFGR', 'IFGR']; | ||||
| }; | ||||
|  | ||||
| AirspyHfSdrDevice = function() { | ||||
|     SoapySdrDevice.apply(this, arguments); | ||||
| }; | ||||
|  | ||||
| AirspyHfSdrDevice.prototype = Object.create(SoapySdrDevice.prototype); | ||||
| AirspyHfSdrDevice.prototype.constructor = AirspyHfSdrDevice; | ||||
|  | ||||
| AirspyHfSdrDevice.prototype.getGains = function() { | ||||
|     return ['RF', 'VGA']; | ||||
| }; | ||||
|  | ||||
| HackRfSdrDevice = function() { | ||||
|     SoapySdrDevice.apply(this, arguments); | ||||
| }; | ||||
|  | ||||
| HackRfSdrDevice.prototype = Object.create(SoapySdrDevice.prototype); | ||||
| HackRfSdrDevice.prototype.constructor = HackRfSdrDevice; | ||||
|  | ||||
| HackRfSdrDevice.prototype.getGains = function() { | ||||
|     return ['LNA', 'VGA', 'AMP']; | ||||
| }; | ||||
|  | ||||
| SdrDevice.types = { | ||||
|     'rtl_sdr': RtlSdrDevice, | ||||
|     'sdrplay': SdrplaySdrDevice, | ||||
|     'airspyhf': AirspyHfSdrDevice, | ||||
|     'hackrf': HackRfSdrDevice | ||||
| }; | ||||
|  | ||||
| $.fn.sdrdevice = function() { | ||||
|     return this.map(function(){ | ||||
|         var el = $(this); | ||||
|         if (!el.data('sdrdevice')) { | ||||
|             el.data('sdrdevice', SdrDevice.create(el)); | ||||
|         } | ||||
|         return el.data('sdrdevice'); | ||||
|     }); | ||||
| }; | ||||
| @@ -3,7 +3,7 @@ | ||||
| <head> | ||||
|     <title>OpenWebRX Login</title> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="static/favicon.ico" /> | ||||
|     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> | ||||
|     <link rel="stylesheet" href="static/css/bootstrap.min.css" /> | ||||
|     <link rel="stylesheet" type="text/css" href="static/css/login.css" /> | ||||
|     <script src="static/lib/jquery-3.2.1.min.js"></script> | ||||
|     <script src="static/lib/Header.js"></script> | ||||
| @@ -21,7 +21,7 @@ | ||||
|                 <label for="password">Password</label> | ||||
|                 <input type="password" class="form-control" id="password" name="password" placeholder="Password"> | ||||
|             </div> | ||||
|             <button type="submit" class="btn btn-login">Login</button> | ||||
|             <button type="submit" class="btn btn-secondary btn-login">Login</button> | ||||
|         </form> | ||||
|     </div> | ||||
| </body> | ||||
| @@ -3,11 +3,9 @@ | ||||
| <head> | ||||
|     <title>OpenWebRX Settings</title> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="static/favicon.ico" /> | ||||
|     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> | ||||
|     <link rel="stylesheet" href="static/css/bootstrap.min.css" /> | ||||
|     <link rel="stylesheet" type="text/css" href="static/css/admin.css" /> | ||||
|     <script src="static/lib/jquery-3.2.1.min.js"></script> | ||||
|     <script src="static/lib/Header.js"></script> | ||||
|     <script src="static/settings.js"></script> | ||||
|     <script src="compiled/settings.js"></script> | ||||
|     <meta charset="utf-8"> | ||||
| </head> | ||||
| <body> | ||||
|   | ||||
| @@ -3,11 +3,9 @@ | ||||
| <head> | ||||
|     <title>OpenWebRX Settings</title> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="static/favicon.ico" /> | ||||
|     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> | ||||
|     <link rel="stylesheet" href="static/css/bootstrap.min.css" /> | ||||
|     <link rel="stylesheet" type="text/css" href="static/css/admin.css" /> | ||||
|     <script src="static/lib/jquery-3.2.1.min.js"></script> | ||||
|     <script src="static/lib/Header.js"></script> | ||||
|     <script src="static/settings.js"></script> | ||||
|     <script src="compiled/settings.js"></script> | ||||
|     <meta charset="utf-8"> | ||||
| </head> | ||||
| <body> | ||||
|   | ||||
| @@ -19,5 +19,7 @@ $(function(){ | ||||
|                 $lon.val(pos.lng); | ||||
|             }); | ||||
|         }); | ||||
|     }) | ||||
|     }); | ||||
|  | ||||
|     $(".sdrdevice").sdrdevice(); | ||||
| }); | ||||
| @@ -1,20 +1,19 @@ | ||||
| import logging | ||||
|  | ||||
| logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") | ||||
| logger = logging.getLogger(__name__) | ||||
|  | ||||
| from http.server import HTTPServer | ||||
| from owrx.http import RequestHandler | ||||
| from owrx.config import Config | ||||
| from owrx.feature import FeatureDetector | ||||
| from owrx.sdr import SdrService | ||||
| from socketserver import ThreadingMixIn | ||||
| from owrx.sdrhu import SdrHuUpdater | ||||
| from owrx.service import Services | ||||
| from owrx.websocket import WebSocketConnection | ||||
| from owrx.pskreporter import PskReporter | ||||
| from owrx.version import openwebrx_version | ||||
|  | ||||
| import logging | ||||
|  | ||||
| logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") | ||||
| logger = logging.getLogger(__name__) | ||||
|  | ||||
|  | ||||
| class ThreadedHttpServer(ThreadingMixIn, HTTPServer): | ||||
|     pass | ||||
| @@ -59,10 +58,6 @@ Support and info:       https://groups.io/g/openwebrx | ||||
|     # Get error messages about unknown / unavailable features as soon as possible | ||||
|     SdrService.loadProps() | ||||
|  | ||||
|     if "sdrhu_key" in pm and pm["sdrhu_public_listing"]: | ||||
|         updater = SdrHuUpdater() | ||||
|         updater.start() | ||||
|  | ||||
|     Services.start() | ||||
|  | ||||
|     try: | ||||
|   | ||||
| @@ -25,6 +25,12 @@ class QueueJob(object): | ||||
|     def run(self): | ||||
|         self.decoder.decode(self) | ||||
|  | ||||
|     def unlink(self): | ||||
|         try: | ||||
|             os.unlink(self.file) | ||||
|         except FileNotFoundError: | ||||
|             pass | ||||
|  | ||||
|  | ||||
| class QueueWorker(threading.Thread): | ||||
|     def __init__(self, queue): | ||||
| @@ -40,6 +46,9 @@ class QueueWorker(threading.Thread): | ||||
|             except Exception: | ||||
|                 logger.exception("failed to decode job") | ||||
|                 self.queue.onError() | ||||
|             finally: | ||||
|                 job.unlink() | ||||
|  | ||||
|             self.queue.task_done() | ||||
|  | ||||
|  | ||||
| @@ -159,11 +168,12 @@ class AudioWriter(object): | ||||
|         self.switchingLock.release() | ||||
|  | ||||
|         file.close() | ||||
|         job = QueueJob(self, filename, self.dsp.get_operating_freq()) | ||||
|         try: | ||||
|             DecoderQueue.getSharedInstance().put(QueueJob(self, filename, self.dsp.get_operating_freq())) | ||||
|             DecoderQueue.getSharedInstance().put(job) | ||||
|         except Full: | ||||
|             logger.warning("decoding queue overflow; dropping one file") | ||||
|             os.unlink(filename) | ||||
|             job.unlink() | ||||
|         self._scheduleNextSwitch() | ||||
|  | ||||
|     def decode(self, job: QueueJob): | ||||
| @@ -183,7 +193,6 @@ class AudioWriter(object): | ||||
|         except subprocess.TimeoutExpired: | ||||
|             logger.warning("subprocess (pid=%i}) did not terminate correctly; sending kill signal.", decoder.pid) | ||||
|             decoder.kill() | ||||
|         os.unlink(job.file) | ||||
|  | ||||
|     def start(self): | ||||
|         (self.wavefilename, self.wavefile) = self.getWaveFile() | ||||
|   | ||||
| @@ -26,6 +26,11 @@ class ConfigMigrator(ABC): | ||||
|     def migrate(self, config): | ||||
|         pass | ||||
|  | ||||
|     def renameKey(self, config, old, new): | ||||
|         if old in config and not new in config: | ||||
|             config[new] = config[old] | ||||
|             del config[old] | ||||
|  | ||||
|  | ||||
| class ConfigMigratorVersion1(ConfigMigrator): | ||||
|     def migrate(self, config): | ||||
| @@ -37,6 +42,9 @@ class ConfigMigratorVersion1(ConfigMigrator): | ||||
|             levels = config["waterfall_auto_level_margin"] | ||||
|             config["waterfall_auto_level_margin"] = {"min": levels[0], "max": levels[1]} | ||||
|  | ||||
|         self.renameKey(config, "wsjt_queue_workers", "decoding_queue_workers") | ||||
|         self.renameKey(config, "wsjt_queue_length", "decoding_queue_length") | ||||
|  | ||||
|         config["version"] = 2 | ||||
|         return config | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| from owrx.config import Config | ||||
| from owrx.details import ReceiverDetails | ||||
| from owrx.dsp import DspManager | ||||
| from owrx.cpu import CpuUsageThread | ||||
| from owrx.sdr import SdrService | ||||
| @@ -9,7 +10,6 @@ from owrx.version import openwebrx_version | ||||
| from owrx.bands import Bandplan | ||||
| from owrx.bookmarks import Bookmarks | ||||
| from owrx.map import Map | ||||
| from owrx.locator import Locator | ||||
| from owrx.property import PropertyStack | ||||
| from owrx.modes import Modes, DigitalMode | ||||
| from multiprocessing import Queue | ||||
| @@ -68,18 +68,10 @@ class OpenWebRxClient(Client, metaclass=ABCMeta): | ||||
|     def __init__(self, conn): | ||||
|         super().__init__(conn) | ||||
|  | ||||
|         receiver_details = Config.get().filter( | ||||
|             "receiver_name", | ||||
|             "receiver_location", | ||||
|             "receiver_asl", | ||||
|             "receiver_gps", | ||||
|             "photo_title", | ||||
|             "photo_desc", | ||||
|         ) | ||||
|         receiver_details = ReceiverDetails() | ||||
|  | ||||
|         def send_receiver_info(*args): | ||||
|             receiver_info = receiver_details.__dict__() | ||||
|             receiver_info["locator"] = Locator.fromCoordinates(receiver_info["receiver_gps"]) | ||||
|             self.write_receiver_details(receiver_info) | ||||
|  | ||||
|         # TODO unsubscribe | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| from . import Controller | ||||
| from owrx.feature import FeatureDetector | ||||
| from owrx.details import ReceiverDetails | ||||
| import json | ||||
|  | ||||
|  | ||||
| @@ -7,3 +8,8 @@ class ApiController(Controller): | ||||
|     def indexAction(self): | ||||
|         data = json.dumps(FeatureDetector().feature_report()) | ||||
|         self.send_response(data, content_type="application/json") | ||||
|  | ||||
|     def receiverDetails(self): | ||||
|         receiver_details = ReceiverDetails() | ||||
|         data = json.dumps(receiver_details.__dict__()) | ||||
|         self.send_response(data, content_type="application/json") | ||||
|   | ||||
| @@ -87,6 +87,13 @@ class CompiledAssetsController(Controller): | ||||
|             "lib/Header.js", | ||||
|             "map.js", | ||||
|         ], | ||||
|         "settings.js": [ | ||||
|             "lib/jquery-3.2.1.min.js", | ||||
|             "lib/Header.js", | ||||
|             "lib/settings/Input.js", | ||||
|             "lib/settings/SdrDevice.js", | ||||
|             "settings.js", | ||||
|         ] | ||||
|     } | ||||
|  | ||||
|     def indexAction(self): | ||||
|   | ||||
| @@ -13,6 +13,8 @@ from owrx.form import ( | ||||
|     ServicesCheckboxInput, | ||||
|     Js8ProfileCheckboxInput, | ||||
| ) | ||||
| from urllib.parse import quote | ||||
| import json | ||||
| import logging | ||||
|  | ||||
| logger = logging.getLogger(__name__) | ||||
| @@ -55,18 +57,24 @@ class SdrSettingsController(AdminController): | ||||
|         return variables | ||||
|  | ||||
|     def render_devices(self): | ||||
|         def render_devicde(device_id, config): | ||||
|             return """ | ||||
|                 <div class="card device bg-dark text-white"> | ||||
|                     <div class="card-header"> | ||||
|                         {device_name} | ||||
|                     </div> | ||||
|                     <div class="card-body"> | ||||
|                         device settings go here | ||||
|                     </div> | ||||
|         return "".join(self.render_device(key, value) for key, value in Config.get()["sdrs"].items()) | ||||
|  | ||||
|     def render_device(self, device_id, config): | ||||
|         return """ | ||||
|             <div class="card device bg-dark text-white"> | ||||
|                 <div class="card-header"> | ||||
|                     {device_name} | ||||
|                 </div> | ||||
|             """.format(device_name=config["name"]) | ||||
|         return "".join(render_devicde(key, value) for key, value in Config.get()["sdrs"].items()) | ||||
|                 <div class="card-body"> | ||||
|                     {form} | ||||
|                 </div> | ||||
|             </div> | ||||
|         """.format(device_name=config["name"], form=self.render_form(device_id, config)) | ||||
|  | ||||
|     def render_form(self, device_id, config): | ||||
|         return """ | ||||
|             <form class="sdrdevice" data-config="{formdata}"></form> | ||||
|         """.format(device_id=device_id, formdata=quote(json.dumps(config))) | ||||
|  | ||||
|     def indexAction(self): | ||||
|         self.serve_template("sdrsettings.html", **self.template_variables()) | ||||
| @@ -236,18 +244,6 @@ class GeneralSettingsController(AdminController): | ||||
|                 infotext="This callsign will be used to send spots to pskreporter.info", | ||||
|             ), | ||||
|         ), | ||||
|         Section( | ||||
|             "sdr.hu", | ||||
|             TextInput( | ||||
|                 "sdrhu_key", | ||||
|                 "sdr.hu key", | ||||
|                 infotext='Please obtain your personal key on <a href="https://sdr.hu" target="_blank">sdr.hu</a>', | ||||
|             ), | ||||
|             CheckboxInput( | ||||
|                 "sdrhu_public_listing", "List on sdr.hu", "List my receiver on sdr.hu" | ||||
|             ), | ||||
|             TextInput("server_hostname", "Hostname"), | ||||
|         ), | ||||
|     ] | ||||
|  | ||||
|     def render_sections(self): | ||||
|   | ||||
| @@ -9,26 +9,6 @@ import pkg_resources | ||||
|  | ||||
|  | ||||
| class StatusController(Controller): | ||||
|     def indexAction(self): | ||||
|         pm = Config.get() | ||||
|         # convert to old format | ||||
|         gps = (pm["receiver_gps"]["lat"], pm["receiver_gps"]["lon"]) | ||||
|         avatar_path = pkg_resources.resource_filename("htdocs", "gfx/openwebrx-avatar.png") | ||||
|         # TODO keys that have been left out since they are no longer simple strings: sdr_hw, bands, antenna | ||||
|         vars = { | ||||
|             "status": "active", | ||||
|             "name": pm["receiver_name"], | ||||
|             "op_email": pm["receiver_admin"], | ||||
|             "users": ClientRegistry.getSharedInstance().clientCount(), | ||||
|             "users_max": pm["max_clients"], | ||||
|             "gps": gps, | ||||
|             "asl": pm["receiver_asl"], | ||||
|             "loc": pm["receiver_location"], | ||||
|             "sw_version": openwebrx_version, | ||||
|             "avatar_ctime": os.path.getctime(avatar_path), | ||||
|         } | ||||
|         self.send_response("\n".join(["{key}={value}".format(key=key, value=value) for key, value in vars.items()])) | ||||
|  | ||||
|     def getProfileStats(self, profile): | ||||
|         return { | ||||
|             "name": profile["name"], | ||||
| @@ -45,7 +25,7 @@ class StatusController(Controller): | ||||
|         } | ||||
|         return stats | ||||
|  | ||||
|     def jsonAction(self): | ||||
|     def indexAction(self): | ||||
|         pm = Config.get() | ||||
|  | ||||
|         status = { | ||||
|   | ||||
| @@ -23,7 +23,7 @@ class WebpageController(TemplateController): | ||||
|         settingslink = "" | ||||
|         pm = Config.get() | ||||
|         if "webadmin_enabled" in pm and pm["webadmin_enabled"]: | ||||
|             settingslink = """<a class="button" href="settings" target="openwebrx-settings"><img src="static/gfx/openwebrx-panel-settings.png" /><br/>Settings</a>""" | ||||
|             settingslink = """<a class="button" href="settings" target="openwebrx-settings"><img src="static/gfx/openwebrx-panel-settings.png" alt="Settings"/><br/>Settings</a>""" | ||||
|         header = self.render_template("include/header.include.html", settingslink=settingslink) | ||||
|         return {"header": header} | ||||
|  | ||||
|   | ||||
							
								
								
									
										21
									
								
								owrx/details.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								owrx/details.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| from owrx.config import Config | ||||
| from owrx.locator import Locator | ||||
| from owrx.property import PropertyFilter | ||||
|  | ||||
|  | ||||
| class ReceiverDetails(PropertyFilter): | ||||
|     def __init__(self): | ||||
|         super().__init__( | ||||
|             Config.get(), | ||||
|             "receiver_name", | ||||
|             "receiver_location", | ||||
|             "receiver_asl", | ||||
|             "receiver_gps", | ||||
|             "photo_title", | ||||
|             "photo_desc", | ||||
|         ) | ||||
|  | ||||
|     def __dict__(self): | ||||
|         receiver_info = super().__dict__() | ||||
|         receiver_info["locator"] = Locator.fromCoordinates(receiver_info["receiver_gps"]) | ||||
|         return receiver_info | ||||
| @@ -24,12 +24,12 @@ class FeatureDetector(object): | ||||
|         "rtl_sdr": ["rtl_connector"], | ||||
|         "rtl_sdr_soapy": ["soapy_connector", "soapy_rtl_sdr"], | ||||
|         "sdrplay": ["soapy_connector", "soapy_sdrplay"], | ||||
|         "hackrf": ["hackrf_transfer"], | ||||
|         "hackrf": ["soapy_connector", "soapy_hackrf"], | ||||
|         "perseussdr": ["perseustest"], | ||||
|         "airspy": ["soapy_connector", "soapy_airspy"], | ||||
|         "airspyhf": ["soapy_connector", "soapy_airspyhf"], | ||||
|         "lime_sdr": ["soapy_connector", "soapy_lime_sdr"], | ||||
|         "fifi_sdr": ["alsa"], | ||||
|         "fifi_sdr": ["alsa", "rockprog"], | ||||
|         "pluto_sdr": ["soapy_connector", "soapy_pluto_sdr"], | ||||
|         "soapy_remote": ["soapy_connector", "soapy_remote"], | ||||
|         "uhd": ["soapy_connector", "soapy_uhd"], | ||||
| @@ -128,26 +128,6 @@ class FeatureDetector(object): | ||||
|         """ | ||||
|         return self.command_is_runnable("nc --help") | ||||
|  | ||||
|     def has_hackrf_transfer(self): | ||||
|         """ | ||||
|         To use a HackRF, compile the HackRF host tools from its "stdout" branch: | ||||
|         ``` | ||||
|          git clone https://github.com/mossmann/hackrf/ | ||||
|          cd hackrf | ||||
|          git fetch | ||||
|          git checkout origin/stdout | ||||
|          cd host | ||||
|          mkdir build | ||||
|          cd build | ||||
|          cmake .. -DINSTALL_UDEV_RULES=ON | ||||
|          make | ||||
|          sudo make install | ||||
|         ``` | ||||
|         """ | ||||
|         # TODO i don't have a hackrf, so somebody doublecheck this. | ||||
|         # TODO also check if it has the stdout feature | ||||
|         return self.command_is_runnable("hackrf_transfer --help") | ||||
|  | ||||
|     def has_perseustest(self): | ||||
|         """ | ||||
|         To use a Microtelecom Perseus HF receiver, compile and | ||||
| @@ -273,7 +253,7 @@ class FeatureDetector(object): | ||||
|         """ | ||||
|         The SoapySDR module for sdrplay devices is required for interfacing with SDRPlay devices (RSP1*, RSP2*, RSPDuo) | ||||
|  | ||||
|         You can get it [here](https://github.com/pothosware/SoapySDRPlay/wiki). | ||||
|         You can get it [here](https://github.com/SDRplay/SoapySDRPlay). | ||||
|         """ | ||||
|         return self._has_soapy_driver("sdrplay") | ||||
|  | ||||
| @@ -342,6 +322,14 @@ class FeatureDetector(object): | ||||
|         """ | ||||
|         return self._has_soapy_driver("radioberry") | ||||
|  | ||||
|     def has_soapy_hackrf(self): | ||||
|         """ | ||||
|         The SoapyHackRF allows HackRF to be used with SoapySDR. | ||||
|  | ||||
|         You can get it [here](https://github.com/pothosware/SoapyHackRF/wiki). | ||||
|         """ | ||||
|         return self._has_soapy_driver("hackrf") | ||||
|  | ||||
|     def has_dsd(self): | ||||
|         """ | ||||
|         The digital voice modes NXDN and D-Star can be decoded by the dsd project. Please note that you need the version | ||||
| @@ -396,3 +384,11 @@ class FeatureDetector(object): | ||||
|         on the Alsa library. It is available as a package for most Linux distributions. | ||||
|         """ | ||||
|         return self.command_is_runnable("arecord --help") | ||||
|  | ||||
|     def has_rockprog(self): | ||||
|         """ | ||||
|         The "rockprog" executable is required to send commands to your FiFiSDR. It needs to be installed separately. | ||||
|  | ||||
|         You can find instructions and downloads [here](https://o28.sischa.net/fifisdr/trac/wiki/De%3Arockprog). | ||||
|         """ | ||||
|         return self.command_is_runnable("rockprog") | ||||
|   | ||||
| @@ -89,18 +89,16 @@ class Router(object): | ||||
|     def __init__(self): | ||||
|         self.routes = [ | ||||
|             StaticRoute("/", IndexController), | ||||
|             StaticRoute("/status", StatusController), | ||||
|             StaticRoute("/status.json", StatusController, options={"action": "jsonAction"}), | ||||
|             StaticRoute("/status.json", StatusController), | ||||
|             RegexRoute("/static/(.+)", OwrxAssetsController), | ||||
|             RegexRoute("/compiled/(.+)", CompiledAssetsController), | ||||
|             RegexRoute("/aprs-symbols/(.+)", AprsSymbolsController), | ||||
|             StaticRoute("/ws/", WebSocketController), | ||||
|             RegexRoute("(/favicon.ico)", OwrxAssetsController), | ||||
|             # backwards compatibility for the sdr.hu portal | ||||
|             RegexRoute("(/gfx/openwebrx-avatar.png)", OwrxAssetsController), | ||||
|             StaticRoute("/map", MapController), | ||||
|             StaticRoute("/features", FeatureController), | ||||
|             StaticRoute("/api/features", ApiController), | ||||
|             StaticRoute("/api/receiverdetails", ApiController, options={"action": "receiverDetails"}), | ||||
|             StaticRoute("/metrics", MetricsController), | ||||
|             StaticRoute("/settings", SettingsController), | ||||
|             StaticRoute("/generalsettings", GeneralSettingsController), | ||||
|   | ||||
| @@ -40,6 +40,10 @@ class PropertyManager(ABC): | ||||
|     def __dict__(self): | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def __delitem__(self, key): | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def keys(self): | ||||
|         pass | ||||
| @@ -98,6 +102,9 @@ class PropertyLayer(PropertyManager): | ||||
|     def __dict__(self): | ||||
|         return {k: v for k, v in self.properties.items()} | ||||
|  | ||||
|     def __delitem__(self, key): | ||||
|         return self.properties.__delitem__(key) | ||||
|  | ||||
|     def keys(self): | ||||
|         return self.properties.keys() | ||||
|  | ||||
| @@ -132,6 +139,11 @@ class PropertyFilter(PropertyManager): | ||||
|     def __dict__(self): | ||||
|         return {k: v for k, v in self.pm.__dict__().items() if k in self.props} | ||||
|  | ||||
|     def __delitem__(self, key): | ||||
|         if key not in self.props: | ||||
|             raise KeyError(key) | ||||
|         return self.pm.__delitem__(key) | ||||
|  | ||||
|     def keys(self): | ||||
|         return [k for k in self.pm.keys() if k in self.props] | ||||
|  | ||||
| @@ -226,5 +238,9 @@ class PropertyStack(PropertyManager): | ||||
|     def __dict__(self): | ||||
|         return {k: self.__getitem__(k) for k in self.keys()} | ||||
|  | ||||
|     def __delitem__(self, key): | ||||
|         for layer in self.layers: | ||||
|             layer["props"].__delitem__(key) | ||||
|  | ||||
|     def keys(self): | ||||
|         return set([key for l in self.layers for key in l["props"].keys()]) | ||||
|   | ||||
| @@ -1,43 +0,0 @@ | ||||
| import threading | ||||
| import time | ||||
| from owrx.config import Config | ||||
| from urllib import request, parse | ||||
|  | ||||
| import logging | ||||
|  | ||||
| logger = logging.getLogger(__name__) | ||||
|  | ||||
|  | ||||
| class SdrHuUpdater(threading.Thread): | ||||
|     def __init__(self): | ||||
|         self.doRun = True | ||||
|         super().__init__(daemon=True) | ||||
|  | ||||
|     def update(self): | ||||
|         pm = Config.get().filter("server_hostname", "web_port", "sdrhu_key") | ||||
|         data = parse.urlencode({ | ||||
|             "url": "http://{server_hostname}:{web_port}".format(**pm.__dict__()), | ||||
|             "apikey": pm["sdrhu_key"] | ||||
|         }).encode() | ||||
|  | ||||
|         res = request.urlopen("https://sdr.hu/update", data=data) | ||||
|         if res.getcode() < 200 or res.getcode() >= 300: | ||||
|             logger.warning('sdr.hu update failed with error code %i', res.getcode()) | ||||
|             return 2 | ||||
|  | ||||
|         returned = res.read().decode("utf-8") | ||||
|         if "UPDATE:" not in returned: | ||||
|             logger.warning("Update failed, your receiver cannot be listed on sdr.hu!") | ||||
|             return 2 | ||||
|  | ||||
|         value = returned.split("UPDATE:")[1].split("\n", 1)[0] | ||||
|         if value.startswith("SUCCESS"): | ||||
|             logger.info("Update succeeded!") | ||||
|         else: | ||||
|             logger.warning("Update failed, your receiver cannot be listed on sdr.hu! Reason: %s", value) | ||||
|         return 20 | ||||
|  | ||||
|     def run(self): | ||||
|         while self.doRun: | ||||
|             retrytime_mins = self.update() | ||||
|             time.sleep(60 * retrytime_mins) | ||||
| @@ -265,6 +265,7 @@ class ServiceHandler(object): | ||||
|         d.set_secondary_demodulator(mode) | ||||
|         d.set_audio_compression("none") | ||||
|         d.set_samp_rate(source.getProps()["samp_rate"]) | ||||
|         d.set_temporary_directory(Config.get()['temporary_directory']) | ||||
|         d.set_service() | ||||
|         d.start() | ||||
|         return d | ||||
|   | ||||
| @@ -1,23 +1,11 @@ | ||||
| from .direct import DirectSource | ||||
| from owrx.command import Option | ||||
| import time | ||||
| from .soapy import SoapyConnectorSource | ||||
|  | ||||
|  | ||||
| class HackrfSource(DirectSource): | ||||
|     def getCommandMapper(self): | ||||
|         return super().getCommandMapper().setBase("hackrf_transfer").setMappings( | ||||
|             { | ||||
|                 "samp_rate": Option("-s"), | ||||
|                 "tuner_freq": Option("-f"), | ||||
|                 "rf_gain": Option("-g"), | ||||
|                 "lna_gain": Option("-l"), | ||||
|                 "rf_amp": Option("-a"), | ||||
|                 "ppm": Option("-C"), | ||||
|             } | ||||
|         ).setStatic("-r-") | ||||
| class HackrfSource(SoapyConnectorSource): | ||||
|     def getSoapySettingsMappings(self): | ||||
|         mappings = super().getSoapySettingsMappings() | ||||
|         mappings.update({"bias_tee": "bias_tx"}) | ||||
|         return mappings | ||||
|  | ||||
|     def getFormatConversion(self): | ||||
|         return ["csdr convert_s8_f"] | ||||
|  | ||||
|     def sleepOnRestart(self): | ||||
|         time.sleep(1) | ||||
|     def getDriver(self): | ||||
|         return "hackrf" | ||||
| @@ -1,10 +1,4 @@ | ||||
| from .direct import DirectSource | ||||
| from . import SdrSource | ||||
| import subprocess | ||||
| import threading | ||||
| import os | ||||
| import socket | ||||
| import time | ||||
|  | ||||
| import logging | ||||
|  | ||||
| @@ -29,7 +23,7 @@ class Resampler(DirectSource): | ||||
|     def getCommand(self): | ||||
|         return [ | ||||
|             "nc -v 127.0.0.1 {nc_port}".format(nc_port=self.sdr.getPort()), | ||||
|             "csdr shift_addition_cc {shift}".format(shift=self.shift), | ||||
|             "csdr shift_addfast_cc {shift}".format(shift=self.shift), | ||||
|             "csdr fir_decimate_cc {decimation} {ddc_transition_bw} HAMMING".format( | ||||
|                 decimation=self.decimation, ddc_transition_bw=self.transition_bw | ||||
|             ), | ||||
|   | ||||
							
								
								
									
										40
									
								
								sdrhu.py
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								sdrhu.py
									
									
									
									
									
								
							| @@ -1,40 +0,0 @@ | ||||
| #!/usr/bin/python3 | ||||
| """ | ||||
|  | ||||
|     This file is part of OpenWebRX,  | ||||
|     an open-source SDR receiver software with a web UI. | ||||
|     Copyright (c) 2013-2015 by Andras Retzler <randras@sdr.hu> | ||||
|     Copyright (c) 2019-2020 by Jakob Ketterl <dd5jfk@darc.de> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as | ||||
|     published by the Free Software Foundation, either version 3 of the | ||||
|     License, or (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| """ | ||||
|  | ||||
| from owrx.sdrhu import SdrHuUpdater | ||||
| from owrx.config import Config | ||||
|  | ||||
| import logging | ||||
| logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") | ||||
| logger = logging.getLogger(__name__) | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     pm = Config.get() | ||||
|  | ||||
|     if "sdrhu_public_listing" not in pm or not pm["sdrhu_public_listing"]: | ||||
|         logger.error('Public listing on sdr.hu is not activated. Please check "sdrhu_public_listing" in your config.') | ||||
|         exit(1) | ||||
|     if "sdrhu_key" not in pm or pm["sdrhu_key"] is None or pm["sdrhu_key"] == "": | ||||
|         logger.error('Missing "sdrhu_key" in your config. Aborting') | ||||
|         exit(1) | ||||
|     SdrHuUpdater().update() | ||||
		Reference in New Issue
	
	Block a user
	 Jakob Ketterl
					Jakob Ketterl