diff --git a/CMakeLists.txt b/CMakeLists.txt index 40071bf81..dcb1781dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -371,103 +371,169 @@ elseif (WIN32) elseif(ANDROID) set(EXTERNAL_LIBRARY_FOLDER "${CMAKE_SOURCE_DIR}/external/android") + set(Boost_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/ndk_21_boost_1.72.0/include" CACHE INTERNAL "") + set(FFTW3F_FOUND ON CACHE INTERNAL "") - set(FFTW3F_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/fftw-3/include" CACHE INTERNAL "") - set(FFTW3F_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/fftw-3/lib/libfftw3f.a" CACHE INTERNAL "") + set(FFTW3F_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/fftw-3/include" CACHE INTERNAL "") + set(FFTW3F_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/fftw-3/lib/libfftw3f.a" CACHE INTERNAL "") set(OPUS_FOUND ON CACHE INTERNAL "") - set(OPUS_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/libopus/include" CACHE INTERNAL "") - set(OPUS_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/libopus/lib/libopus.a" CACHE INTERNAL "") + set(OPUS_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libopus/include" CACHE INTERNAL "") + set(OPUS_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libopus/lib/libopus.a" CACHE INTERNAL "") set(CODEC2_FOUND ON CACHE INTERNAL "") - set(CODEC2_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/codec2/include" CACHE INTERNAL "") - set(CODEC2_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/codec2/lib/libcodec2.a" CACHE INTERNAL "") + set(CODEC2_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/codec2/include" CACHE INTERNAL "") + set(CODEC2_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/codec2/lib/libcodec2.a" CACHE INTERNAL "") set(APT_FOUND ON CACHE INTERNAL "") - set(APT_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/aptdec/include/apt" CACHE INTERNAL "") - set(APT_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/aptdec/lib/libaptstatic.a" CACHE INTERNAL "") + set(APT_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/aptdec/include/apt" CACHE INTERNAL "") + set(APT_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/aptdec/lib/libaptstatic.a" CACHE INTERNAL "") set(SGP4_FOUND ON CACHE INTERNAL "") - set(SGP4_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/sgp4/include/libsgp4" CACHE INTERNAL "") - set(SGP4_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/sgp4/lib/libsgp4.a" CACHE INTERNAL "") + set(SGP4_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/sgp4/include/libsgp4" CACHE INTERNAL "") + set(SGP4_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/sgp4/lib/libsgp4.a" CACHE INTERNAL "") set(ZLIB_FOUND ON CACHE INTERNAL "") - set(ZLIB_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/zlib/include" CACHE INTERNAL "") - set(ZLIB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/zlib/lib/libz.a" CACHE INTERNAL "") + set(ZLIB_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/zlib/include" CACHE INTERNAL "") + set(ZLIB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/zlib/lib/libz.a" CACHE INTERNAL "") set(FAAD_FOUND ON CACHE INTERNAL "") - set(FAAD_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/faad2/include" CACHE INTERNAL "") - set(FAAD_LIBRARY "${EXTERNAL_LIBRARY_FOLDER}/faad2/lib/liblibfaadstatic.a" CACHE INTERNAL "") + set(FAAD_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/faad2/include" CACHE INTERNAL "") + set(FAAD_LIBRARY "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/faad2/lib/liblibfaadstatic.a" CACHE INTERNAL "") set(DAB_FOUND ON CACHE INTERNAL "") - set(DAB_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/libdab/include/dab_lib" CACHE INTERNAL "") - set(DAB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/libdab/lib/libdab_lib.so" CACHE INTERNAL "") + set(DAB_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libdab/include/dab_lib" CACHE INTERNAL "") + set(DAB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libdab/lib/libdab_lib.so" CACHE INTERNAL "") set(LIBMBE_FOUND ON CACHE INTERNAL "") - set(LIBMBE_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/mbelib/include/" CACHE INTERNAL "") - set(LIBMBE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/mbelib/lib/libmbe.a" CACHE INTERNAL "") + set(LIBMBE_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/mbelib/include/" CACHE INTERNAL "") + set(LIBMBE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/mbelib/lib/libmbe.a" CACHE INTERNAL "") set(LIBDSDCC_FOUND ON CACHE INTERNAL "") - set(LIBDSDCC_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/dsdcc/include/" CACHE INTERNAL "") - set(LIBDSDCC_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/dsdcc/lib/libdsdcc.so" CACHE INTERNAL "") + set(LIBDSDCC_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/dsdcc/include/" CACHE INTERNAL "") + set(LIBDSDCC_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/dsdcc/lib/libdsdcc.so" CACHE INTERNAL "") set(FFMPEG_FOUND ON CACHE INTERNAL "") set(FFMEG_SKIP_CHECK ON CACHE INTERNAL "") - set(FFMPEG_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/include" CACHE INTERNAL "") - set(FFMPEG_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/bin" CACHE INTERNAL "") - set(AVCODEC_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/include" CACHE INTERNAL "") - set(AVCODEC_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libavcodec.so" CACHE INTERNAL "") - set(AVFORMAT_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/include" CACHE INTERNAL "") - set(AVFORMAT_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libavformat.so" CACHE INTERNAL "") - set(AVUTIL_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/include" CACHE INTERNAL "") - set(AVUTIL_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libavutil.so" CACHE INTERNAL "") - set(SWRESAMPLE_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/include" CACHE INTERNAL "") - set(SWRESAMPLE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libswresample.so" CACHE INTERNAL "") - set(SWSCALE_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/include" CACHE INTERNAL "") - set(SWSCALE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libswscale.so" CACHE INTERNAL "") + set(FFMPEG_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/include" CACHE INTERNAL "") + set(FFMPEG_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/bin" CACHE INTERNAL "") + set(AVCODEC_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/include" CACHE INTERNAL "") + set(AVCODEC_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavcodec.so" CACHE INTERNAL "") + set(AVFORMAT_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/include" CACHE INTERNAL "") + set(AVFORMAT_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavformat.so" CACHE INTERNAL "") + set(AVUTIL_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/include" CACHE INTERNAL "") + set(AVUTIL_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavutil.so" CACHE INTERNAL "") + set(SWRESAMPLE_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/include" CACHE INTERNAL "") + set(SWRESAMPLE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libswresample.so" CACHE INTERNAL "") + set(SWSCALE_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/include" CACHE INTERNAL "") + set(SWSCALE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libswscale.so" CACHE INTERNAL "") set(LIBUSB_FOUND ON CACHE INTERNAL "") - set(LIBUSB_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/libusb/include/" CACHE INTERNAL "") - set(LIBUSB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/libusb/lib/libusb1.0.so" CACHE INTERNAL "") + set(LIBUSB_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/include/" CACHE INTERNAL "") + set(LIBUSB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libusb1.0.so" CACHE INTERNAL "") set(LIBAIRSPYHF_FOUND ON CACHE INTERNAL "") - set(LIBAIRSPYHF_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/airspyhf/include/" CACHE INTERNAL "") - set(LIBAIRSPYHF_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/airspyhf/lib/libairspyhf.a" CACHE INTERNAL "") + set(LIBAIRSPYHF_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/airspyhf/include/" CACHE INTERNAL "") + set(LIBAIRSPYHF_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/airspyhf/lib/libairspyhf.a" CACHE INTERNAL "") set(LIBAIRSPY_FOUND ON CACHE INTERNAL "") - set(LIBAIRSPY_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/airspy/include/" CACHE INTERNAL "") - set(LIBAIRSPY_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/airspy/lib/libairspy.a" CACHE INTERNAL "") + set(LIBAIRSPY_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/airspy/include/" CACHE INTERNAL "") + set(LIBAIRSPY_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/airspy/lib/libairspy.a" CACHE INTERNAL "") set(LIBRTLSDR_FOUND ON CACHE INTERNAL "") - set(LIBRTLSDR_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/librtlsdr/include/" CACHE INTERNAL "") - set(LIBRTLSDR_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/librtlsdr/lib/librtlsdr.a" CACHE INTERNAL "") + set(LIBRTLSDR_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/librtlsdr/include/" CACHE INTERNAL "") + set(LIBRTLSDR_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/librtlsdr/lib/librtlsdr.a" CACHE INTERNAL "") set(LIMESUITE_FOUND ON CACHE INTERNAL "") - set(LIMESUITE_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/limesuite/include/" CACHE INTERNAL "") - set(LIMESUITE_LIBRARY "${EXTERNAL_LIBRARY_FOLDER}/limesuite/lib/libLimeSuite.a" CACHE INTERNAL "") + set(LIMESUITE_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/limesuite/include/" CACHE INTERNAL "") + set(LIMESUITE_LIBRARY "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/limesuite/lib/libLimeSuite.a" CACHE INTERNAL "") - set(ANDROID_EXTRA_LIBS - ${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6Charts_arm64-v8a.so - ${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6Concurrent_arm64-v8a.so - ${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6MultimediaWidgets_arm64-v8a.so - ${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6SerialPort_arm64-v8a.so - ${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6TextToSpeech_arm64-v8a.so - ${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libssl_1_1.so - ${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libcrypto_1_1.so - ${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libavcodec.so - ${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libavdevice.so - ${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libavfilter.so - ${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libavformat.so - ${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libavutil.so - ${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libswresample.so - ${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libswscale.so - ${EXTERNAL_LIBRARY_FOLDER}/ffmpeg/lib/libc++_shared.so - ${EXTERNAL_LIBRARY_FOLDER}/libdab/lib/libdab_lib.so - ${EXTERNAL_LIBRARY_FOLDER}/dsdcc/lib/libdsdcc.so - ${EXTERNAL_LIBRARY_FOLDER}/libusb/lib/libunrooted_android.so - ${EXTERNAL_LIBRARY_FOLDER}/libusb/lib/libusb1.0.so - CACHE INTERNAL "" - ) + if (ENABLE_QT6) + set(ANDROID_EXTRA_LIBS + ${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6Charts_arm64-v8a.so + ${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6Concurrent_arm64-v8a.so + ${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6MultimediaWidgets_arm64-v8a.so + ${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6SerialPort_arm64-v8a.so + ${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6TextToSpeech_arm64-v8a.so + ${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libssl_1_1.so + ${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libcrypto_1_1.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavcodec.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavdevice.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavfilter.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavformat.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavutil.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libswresample.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libswscale.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libc++_shared.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libdab/lib/libdab_lib.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/dsdcc/lib/libdsdcc.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libunrooted_android.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libusb1.0.so + CACHE INTERNAL "" + ) + else() + set(ANDROID_EXTRA_LIBS + ${Qt5_DIR}/plugins/sqldrivers/libplugins_sqldrivers_qsqlite_arm64-v8a.so + ${Qt5_DIR}/plugins/geoservices/libplugins_geoservices_qtgeoservices_mapboxgl_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5Sql_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5SerialPort_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5Charts_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5Positioning_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5PositioningQuick_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5Location_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5Concurrent_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5MultimediaWidgets_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5SerialPort_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5TextToSpeech_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5QuickControls2_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5QuickWidgets_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5QuickTemplates2_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5QuickShapes_arm64-v8a.so + ${Qt5_DIR}/lib/libQt5Sql_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5SerialPort_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5Charts_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5Positioning_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5PositioningQuick_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5Location_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5Concurrent_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5MultimediaWidgets_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5SerialPort_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5TextToSpeech_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5QuickControls2_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5QuickWidgets_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5QuickTemplates2_armeabi-v7a.so + ${Qt5_DIR}/lib/libQt5QuickShapes_armeabi-v7a.so + ${Qt5_DIR}/plugins/sqldrivers/libplugins_sqldrivers_qsqlite_armeabi-v7a.so + ${Qt5_DIR}/plugins/geoservices/libplugins_geoservices_qtgeoservices_mapboxgl_armeabi-v7a.so + ${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libssl_1_1.so + ${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libcrypto_1_1.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/ffmpeg/lib/libavcodec.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/ffmpeg/lib/libavdevice.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/ffmpeg/lib/libavfilter.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/ffmpeg/lib/libavformat.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/ffmpeg/lib/libavutil.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/ffmpeg/lib/libswresample.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/ffmpeg/lib/libswscale.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/ffmpeg/lib/libc++_shared.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/libdab/lib/libdab_lib.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/dsdcc/lib/libdsdcc.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/libusb/lib/libunrooted_android.so + ${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/libusb/lib/libusb1.0.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavcodec.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavdevice.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavfilter.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavformat.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavutil.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libswresample.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libswscale.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libc++_shared.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/libdab/lib/libdab_lib.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/dsdcc/lib/libdsdcc.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/libusb/lib/libunrooted_android.so + ${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/libusb/lib/libusb1.0.so + CACHE INTERNAL "" + ) + endif() endif() # When building a bundle on MacOS, we want to keep build paths in the library diff --git a/cmake/Modules/DetectArchitecture.cmake b/cmake/Modules/DetectArchitecture.cmake index 73eecef96..024b3a53f 100644 --- a/cmake/Modules/DetectArchitecture.cmake +++ b/cmake/Modules/DetectArchitecture.cmake @@ -1,220 +1,221 @@ -include_guard(GLOBAL) - -include(CheckCXXCompilerFlag) -include(CheckSymbolExists) -include(CMakePushCheckState) - -# Detect current compilation architecture and create standard definitions -macro(detect_architecture symbol arch) - if (NOT DEFINED ARCHITECTURE) - check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch}) - - if (ARCHITECTURE_${arch}) - set(ARCHITECTURE ${arch}) - set(ARCHITECTURE_${arch} TRUE) - add_compile_definitions(ARCHITECTURE_${arch}) - endif() - endif() -endmacro() - -macro(force_ext_available extension) - message(STATUS "Looking for __${extension}__ - forced found") - set(HAS_${extension} 1 CACHE INTERNAL "") -endmacro() - -function(detect_extensions extension) - unset(HAS_${extension}) - if (ARGC EQUAL 2 AND (${ARGV1})) # force available - force_ext_available(${extension}) - endif() - check_symbol_exists("__${extension}__" "" HAS_${extension}) - if (HAS_${extension}) - add_compile_definitions(USE_${extension}) - endif() -endfunction() - -function(detect_msvc_native_opt) - set(TEST_DIR ${PROJECT_SOURCE_DIR}/cmake/test) - - try_run(RUN_AVX512 COMPILE_AVX512 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx512.cxx" COMPILE_DEFINITIONS /arch:AVX512) - if (COMPILE_AVX512 AND RUN_AVX512 EQUAL 0) - set(ARCH_OPT "AVX512" PARENT_SCOPE) - return() - endif() - try_run(RUN_AVX2 COMPILE_AVX2 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx2.cxx" COMPILE_DEFINITIONS /arch:AVX2) - if (COMPILE_AVX2 AND RUN_AVX2 EQUAL 0) - set(ARCH_OPT "AVX2" PARENT_SCOPE) - return() - endif() - try_run(RUN_AVX COMPILE_AVX "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx.cxx" COMPILE_DEFINITIONS /arch:AVX) - if (COMPILE_AVX AND RUN_AVX EQUAL 0) - set(ARCH_OPT "AVX" PARENT_SCOPE) - return() - endif() - - # Supporting 32-bit x86, what year is it? - set(COMPILE_DEF "") - set(ARCH_OPT "" PARENT_SCOPE) - if (ARCHITECTURE_x86) - set(COMPILE_DEF "/arch:SSE2") - set(ARCH_OPT "SSE2" PARENT_SCOPE) - endif() - - try_run(RUN_SSE42 COMPILE_SSE42 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse42.cxx" COMPILE_DEFINITIONS ${COMPILE_DEF}) - if (COMPILE_SSE42 AND RUN_SSE42 EQUAL 0) - force_ext_available(SSE4_2) - return() - endif() - try_run(RUN_SSE41 COMPILE_SSE41 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse41.cxx" COMPILE_DEFINITIONS ${COMPILE_DEF}) - if (COMPILE_SSE41 AND RUN_SSE41 EQUAL 0) - force_ext_available(SSE4_1) - return() - endif() - try_run(RUN_SSSE3 COMPILE_SSSE3 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_ssse3.cxx" COMPILE_DEFINITIONS ${COMPILE_DEF}) - if (COMPILE_SSSE3 AND RUN_SSSE3 EQUAL 0) - force_ext_available(SSSE3) - return() - endif() - try_run(RUN_SSE3 COMPILE_SSE3 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse3.cxx" COMPILE_DEFINITIONS ${COMPILE_DEF}) - if (COMPILE_SSE3 AND RUN_SSE3 EQUAL 0) - force_ext_available(SSE3) - return() - endif() - try_run(RUN_SSE2 COMPILE_SSE2 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse2.cxx" COMPILE_DEFINITIONS ${COMPILE_DEF}) - if (COMPILE_SSE2 AND RUN_SSE2 EQUAL 0) - force_ext_available(SSE2) - return() - endif() - - if (ARCHITECTURE_x86) - # At this point we might as well... - set(ARCH_OPT "IA32" PARENT_SCOPE) - return() - endif() -endfunction() - -if (MSVC) - detect_architecture("_M_AMD64" x86_64) - detect_architecture("_M_IX86" x86) - detect_architecture("_M_ARM" ARM) - detect_architecture("_M_ARM64" ARM64) -else() - detect_architecture("__x86_64__" x86_64) - detect_architecture("__i386__" x86) - detect_architecture("__arm__" ARM) - detect_architecture("__aarch64__" ARM64) - detect_architecture("__PPC64__" PPC64) -endif() -if (NOT DEFINED ARCHITECTURE) - message(FATAL_ERROR "Not supported. Please add needed architecture detection.") -endif() - -# Note: On x86 MSVC's /arch:SSE2 enables all SSE intrinsics support and is default option. -# On x86_64 MSVC's SSE is supported and enabled, so only AVX selection is needed. - -if (FORCE_SSSE3) - message(WARNING "FORCE_SSSE3 flag is deprecated, please use ARCH_OPT option.") - set(ARCH_OPT "") - if (MSVC) - if (ARCHITECTURE_x86) - set(ARCH_OPT "SSE2") - endif() - force_ext_available(SSSE3) - else() - set(FORCE_OPT "-mssse3") - endif() -endif() - -if (FORCE_SSE41) - message(WARNING "FORCE_SSE41 flag is deprecated, please use ARCH_OPT option.") - set(ARCH_OPT "") - if (MSVC) - if (ARCHITECTURE_x86) - set(ARCH_OPT "SSE2") - else() - force_ext_available(SSE4_1) - endif() - else() - set(FORCE_OPT "-msse4.1") - endif() -endif() - -if (MSVC) - # Glue to make ARCH_OPT more flexible for MSVC - if (ARCH_OPT STREQUAL "native") - # Some compilers simulating MSVC supports the march flag, so use it if we can - check_cxx_compiler_flag("-march=native" MARCH_NATIVE_SUPPORTED) - if (NOT MARCH_NATIVE_SUPPORTED) - detect_msvc_native_opt() - FILE(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/tmp) - endif() - elseif(ARCH_OPT STREQUAL "SSE4_2") - force_ext_available(SSE4_2) - set(ARCH_OPT "") - elseif(ARCH_OPT STREQUAL "SSE4_1") - force_ext_available(SSE4_1) - set(ARCH_OPT "") - elseif(ARCH_OPT STREQUAL "SSSE3") - force_ext_available(SSSE3) - set(ARCH_OPT "") - elseif(ARCH_OPT STREQUAL "SSE3") - force_ext_available(SSE3) - set(ARCH_OPT "") - elseif(ARCH_OPT STREQUAL "SSE2") - force_ext_available(SSE2) - set(ARCH_OPT "") - endif() -endif() - -message(STATUS "Target architecture: ${ARCHITECTURE}-${ARCH_OPT}") - -cmake_push_check_state(RESET) -if (ARCH_OPT) - if(MSVC AND NOT MARCH_NATIVE_SUPPORTED) - set(CMAKE_REQUIRED_FLAGS "/arch:${ARCH_OPT}") - add_compile_options(${CMAKE_REQUIRED_FLAGS}) - elseif (ARCHITECTURE_PPC64) - set(CMAKE_REQUIRED_FLAGS "-mcpu=${ARCH_OPT}") - add_compile_options(-mcpu=${ARCH_OPT}) - else() - set(CMAKE_REQUIRED_FLAGS "-march=${ARCH_OPT}") - add_compile_options(-march=${ARCH_OPT}) - endif() -elseif(FORCE_SSSE3 OR FORCE_SSE41) - if (NOT MSVC) - set(CMAKE_REQUIRED_FLAGS ${FORCE_OPT}) - add_compile_options(${FORCE_OPT}) - endif() -endif() - -check_cxx_compiler_flag("${CMAKE_REQUIRED_FLAGS}" FLAG_SUPPORTED) -if (NOT FLAG_SUPPORTED) - message(FATAL_ERROR "Flag '${CMAKE_REQUIRED_FLAGS}' rejected by compiler. Please adjust ARCH_OPT option.") -endif() - -if (ARCHITECTURE_ARM) - if (MSVC) - force_ext_available(ARM_NEON) - else() - list(APPEND CMAKE_REQUIRED_FLAGS -mfpu=neon) - endif() -endif() - -# Extensions detection for ARM -check_symbol_exists("__ARM_NEON" "" HAS_NEON) -if (HAS_NEON) - message(STATUS "ARM Neon extensions enabled") - add_compile_definitions(USE_NEON) -endif() - -# This is quite basic detection, can be extended if needed -detect_extensions(AVX512F) -detect_extensions(AVX2 HAS_AVX512F) -detect_extensions(AVX HAS_AVX2) -detect_extensions(SSE4_2 HAS_AVX) -detect_extensions(SSE4_1 HAS_SSE4_2) -detect_extensions(SSSE3 HAS_SSE4_1) -detect_extensions(SSE3 HAS_SSSE3) -detect_extensions(SSE2 HAS_SSE3) - -cmake_pop_check_state() +include_guard(GLOBAL) + +include(CheckCXXCompilerFlag) +include(CheckSymbolExists) +include(CMakePushCheckState) + +# Detect current compilation architecture and create standard definitions +macro(detect_architecture symbol arch) + if (NOT DEFINED ARCHITECTURE) + check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch}) + + if (ARCHITECTURE_${arch}) + set(ARCHITECTURE ${arch}) + set(ARCHITECTURE_${arch} TRUE) + add_compile_definitions(ARCHITECTURE_${arch}) + endif() + endif() +endmacro() + +macro(force_ext_available extension) + message(STATUS "Looking for __${extension}__ - forced found") + set(HAS_${extension} 1 CACHE INTERNAL "") +endmacro() + +function(detect_extensions extension) + unset(HAS_${extension}) + if (ARGC EQUAL 2 AND (${ARGV1})) # force available + force_ext_available(${extension}) + endif() + check_symbol_exists("__${extension}__" "" HAS_${extension}) + if (HAS_${extension}) + add_compile_definitions(USE_${extension}) + endif() +endfunction() + +function(detect_msvc_native_opt) + set(TEST_DIR ${PROJECT_SOURCE_DIR}/cmake/test) + + try_run(RUN_AVX512 COMPILE_AVX512 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx512.cxx" COMPILE_DEFINITIONS /arch:AVX512) + if (COMPILE_AVX512 AND RUN_AVX512 EQUAL 0) + set(ARCH_OPT "AVX512" PARENT_SCOPE) + return() + endif() + try_run(RUN_AVX2 COMPILE_AVX2 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx2.cxx" COMPILE_DEFINITIONS /arch:AVX2) + if (COMPILE_AVX2 AND RUN_AVX2 EQUAL 0) + set(ARCH_OPT "AVX2" PARENT_SCOPE) + return() + endif() + try_run(RUN_AVX COMPILE_AVX "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx.cxx" COMPILE_DEFINITIONS /arch:AVX) + if (COMPILE_AVX AND RUN_AVX EQUAL 0) + set(ARCH_OPT "AVX" PARENT_SCOPE) + return() + endif() + + # Supporting 32-bit x86, what year is it? + set(COMPILE_DEF "") + set(ARCH_OPT "" PARENT_SCOPE) + if (ARCHITECTURE_x86) + set(COMPILE_DEF "/arch:SSE2") + set(ARCH_OPT "SSE2" PARENT_SCOPE) + endif() + + try_run(RUN_SSE42 COMPILE_SSE42 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse42.cxx" COMPILE_DEFINITIONS ${COMPILE_DEF}) + if (COMPILE_SSE42 AND RUN_SSE42 EQUAL 0) + force_ext_available(SSE4_2) + return() + endif() + try_run(RUN_SSE41 COMPILE_SSE41 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse41.cxx" COMPILE_DEFINITIONS ${COMPILE_DEF}) + if (COMPILE_SSE41 AND RUN_SSE41 EQUAL 0) + force_ext_available(SSE4_1) + return() + endif() + try_run(RUN_SSSE3 COMPILE_SSSE3 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_ssse3.cxx" COMPILE_DEFINITIONS ${COMPILE_DEF}) + if (COMPILE_SSSE3 AND RUN_SSSE3 EQUAL 0) + force_ext_available(SSSE3) + return() + endif() + try_run(RUN_SSE3 COMPILE_SSE3 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse3.cxx" COMPILE_DEFINITIONS ${COMPILE_DEF}) + if (COMPILE_SSE3 AND RUN_SSE3 EQUAL 0) + force_ext_available(SSE3) + return() + endif() + try_run(RUN_SSE2 COMPILE_SSE2 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse2.cxx" COMPILE_DEFINITIONS ${COMPILE_DEF}) + if (COMPILE_SSE2 AND RUN_SSE2 EQUAL 0) + force_ext_available(SSE2) + return() + endif() + + if (ARCHITECTURE_x86) + # At this point we might as well... + set(ARCH_OPT "IA32" PARENT_SCOPE) + return() + endif() +endfunction() + +if (MSVC) + detect_architecture("_M_AMD64" x86_64) + detect_architecture("_M_IX86" x86) + detect_architecture("_M_ARM" ARM) + detect_architecture("_M_ARM64" ARM64) +else() + detect_architecture("__x86_64__" x86_64) + detect_architecture("__i386__" x86) + detect_architecture("__arm__" ARM) + detect_architecture("__aarch64__" ARM64) + detect_architecture("__PPC64__" PPC64) +endif() +if (NOT DEFINED ARCHITECTURE) + message(FATAL_ERROR "Not supported. Please add needed architecture detection.") +endif() + +# Note: On x86 MSVC's /arch:SSE2 enables all SSE intrinsics support and is default option. +# On x86_64 MSVC's SSE is supported and enabled, so only AVX selection is needed. + +if (FORCE_SSSE3) + message(WARNING "FORCE_SSSE3 flag is deprecated, please use ARCH_OPT option.") + set(ARCH_OPT "") + if (MSVC) + if (ARCHITECTURE_x86) + set(ARCH_OPT "SSE2") + endif() + force_ext_available(SSSE3) + else() + set(FORCE_OPT "-mssse3") + endif() +endif() + +if (FORCE_SSE41) + message(WARNING "FORCE_SSE41 flag is deprecated, please use ARCH_OPT option.") + set(ARCH_OPT "") + if (MSVC) + if (ARCHITECTURE_x86) + set(ARCH_OPT "SSE2") + else() + force_ext_available(SSE4_1) + endif() + else() + set(FORCE_OPT "-msse4.1") + endif() +endif() + +if (MSVC) + # Glue to make ARCH_OPT more flexible for MSVC + if (ARCH_OPT STREQUAL "native") + # Some compilers simulating MSVC supports the march flag, so use it if we can + check_cxx_compiler_flag("-march=native" MARCH_NATIVE_SUPPORTED) + if (NOT MARCH_NATIVE_SUPPORTED) + detect_msvc_native_opt() + FILE(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/tmp) + endif() + elseif(ARCH_OPT STREQUAL "SSE4_2") + force_ext_available(SSE4_2) + set(ARCH_OPT "") + elseif(ARCH_OPT STREQUAL "SSE4_1") + force_ext_available(SSE4_1) + set(ARCH_OPT "") + elseif(ARCH_OPT STREQUAL "SSSE3") + force_ext_available(SSSE3) + set(ARCH_OPT "") + elseif(ARCH_OPT STREQUAL "SSE3") + force_ext_available(SSE3) + set(ARCH_OPT "") + elseif(ARCH_OPT STREQUAL "SSE2") + force_ext_available(SSE2) + set(ARCH_OPT "") + endif() +endif() + +message(STATUS "Target architecture: ${ARCHITECTURE}-${ARCH_OPT}") + +cmake_push_check_state(RESET) +if (ARCH_OPT) + if(MSVC AND NOT MARCH_NATIVE_SUPPORTED) + set(CMAKE_REQUIRED_FLAGS "/arch:${ARCH_OPT}") + add_compile_options(${CMAKE_REQUIRED_FLAGS}) + elseif (ARCHITECTURE_PPC64) + set(CMAKE_REQUIRED_FLAGS "-mcpu=${ARCH_OPT}") + add_compile_options(-mcpu=${ARCH_OPT}) + elseif(ANDROID) + else() + set(CMAKE_REQUIRED_FLAGS "-march=${ARCH_OPT}") + add_compile_options(-march=${ARCH_OPT}) + endif() +elseif(FORCE_SSSE3 OR FORCE_SSE41) + if (NOT MSVC) + set(CMAKE_REQUIRED_FLAGS ${FORCE_OPT}) + add_compile_options(${FORCE_OPT}) + endif() +endif() + +check_cxx_compiler_flag("${CMAKE_REQUIRED_FLAGS}" FLAG_SUPPORTED) +if (NOT FLAG_SUPPORTED) + message(FATAL_ERROR "Flag '${CMAKE_REQUIRED_FLAGS}' rejected by compiler. Please adjust ARCH_OPT option.") +endif() + +if (ARCHITECTURE_ARM) + if (MSVC) + force_ext_available(ARM_NEON) + else() + list(APPEND CMAKE_REQUIRED_FLAGS -mfpu=neon) + endif() +endif() + +# Extensions detection for ARM +check_symbol_exists("__ARM_NEON" "" HAS_NEON) +if (HAS_NEON) + message(STATUS "ARM Neon extensions enabled") + add_compile_definitions(USE_NEON) +endif() + +# This is quite basic detection, can be extended if needed +detect_extensions(AVX512F) +detect_extensions(AVX2 HAS_AVX512F) +detect_extensions(AVX HAS_AVX2) +detect_extensions(SSE4_2 HAS_AVX) +detect_extensions(SSE4_1 HAS_SSE4_2) +detect_extensions(SSSE3 HAS_SSE4_1) +detect_extensions(SSE3 HAS_SSSE3) +detect_extensions(SSE2 HAS_SSE3) + +cmake_pop_check_state() diff --git a/plugins/channelrx/CMakeLists.txt b/plugins/channelrx/CMakeLists.txt index 15aa47fb7..59ae638b4 100644 --- a/plugins/channelrx/CMakeLists.txt +++ b/plugins/channelrx/CMakeLists.txt @@ -128,7 +128,7 @@ if(NOT SERVER_MODE) if(WIN32) add_subdirectory(demoddatv) else() - if(((AVUTIL_VERSION VERSION_GREATER "55.27.99") AND (AVCODEC_VERSION VERSION_GREATER "57.48.101")) OR FFMPEG_EXTERNAL) + if(((AVUTIL_VERSION VERSION_GREATER "55.27.99") AND (AVCODEC_VERSION VERSION_GREATER "57.48.101")) OR FFMPEG_EXTERNAL OR FFMEG_SKIP_CHECK) message(STATUS "Include demoddatv") add_subdirectory(demoddatv) else() diff --git a/plugins/channelrx/demodadsb/adsbdemodgui.ui b/plugins/channelrx/demodadsb/adsbdemodgui.ui index d94013ea2..aa682d8e4 100644 --- a/plugins/channelrx/demodadsb/adsbdemodgui.ui +++ b/plugins/channelrx/demodadsb/adsbdemodgui.ui @@ -6,7 +6,7 @@ 0 0 - 600 + 506 1046 @@ -18,7 +18,7 @@ - 600 + 400 0 @@ -35,13 +35,13 @@ 0 0 - 598 + 500 141 - 598 + 400 0 @@ -758,7 +758,7 @@ 0 140 - 598 + 500 600 @@ -770,7 +770,7 @@ - 598 + 400 0 @@ -810,7 +810,7 @@ - 600 + 400 150 @@ -841,6 +841,9 @@ QAbstractItemView::NoEditTriggers + + QAbstractItemView::SingleSelection + ICAO ID diff --git a/plugins/channelrx/demodapt/aptdemodgui.ui b/plugins/channelrx/demodapt/aptdemodgui.ui index da837aa0a..c18643aec 100644 --- a/plugins/channelrx/demodapt/aptdemodgui.ui +++ b/plugins/channelrx/demodapt/aptdemodgui.ui @@ -6,7 +6,7 @@ 0 0 - 440 + 434 569 @@ -18,7 +18,7 @@ - 440 + 360 0 @@ -792,8 +792,8 @@ - 300 - 350 + 200 + 200 @@ -802,6 +802,11 @@ + + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
RollupContents QWidget @@ -820,11 +825,6 @@
gui/levelmeter.h
1
- - ButtonSwitch - QToolButton -
gui/buttonswitch.h
-
deltaFrequency diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.ui b/plugins/channelrx/demodbfm/bfmdemodgui.ui index 602bbf7c7..ac0269e02 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.ui +++ b/plugins/channelrx/demodbfm/bfmdemodgui.ui @@ -18,7 +18,7 @@ - 450 + 400 0 @@ -48,7 +48,7 @@ - 450 + 400 0 @@ -1883,6 +1883,11 @@ + + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
RollupContents QWidget @@ -1890,9 +1895,10 @@ 1 - ButtonSwitch - QToolButton -
gui/buttonswitch.h
+ ValueDialZ + QWidget +
gui/valuedialz.h
+ 1
LevelMeterSignalDB @@ -1912,12 +1918,6 @@
gui/glspectrumgui.h
1
- - ValueDialZ - QWidget -
gui/valuedialz.h
- 1 -
diff --git a/plugins/channelrx/demoddatv/ldpctool/layered_decoder.h b/plugins/channelrx/demoddatv/ldpctool/layered_decoder.h index 95ce3fc89..f17f696e0 100644 --- a/plugins/channelrx/demoddatv/ldpctool/layered_decoder.h +++ b/plugins/channelrx/demoddatv/ldpctool/layered_decoder.h @@ -18,8 +18,9 @@ namespace ldpctool { class LDPCUtil { public: -#if defined(__APPLE__) +#if defined(__APPLE__) || defined(ANDROID) // Recent versions of MacOS support aligned_alloc, but Mojave doesn't + // Likewise, API level 28 needed for aligned_alloc on Android, but we want to support 23 static void *aligned_malloc(size_t alignment, size_t size) { void *p = nullptr; diff --git a/plugins/channelrx/demodpacket/CMakeLists.txt b/plugins/channelrx/demodpacket/CMakeLists.txt index df95998c0..1b18efcd1 100644 --- a/plugins/channelrx/demodpacket/CMakeLists.txt +++ b/plugins/channelrx/demodpacket/CMakeLists.txt @@ -34,7 +34,7 @@ if(NOT SERVER_MODE) ) set(TARGET_NAME demodpacket) - set(TARGET_LIB "Qt::Widgets" Qt::Quick Qt::QuickWidgets Qt::Positioning) + set(TARGET_LIB "Qt::Widgets") set(TARGET_LIB_GUI "sdrgui") set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR}) else() diff --git a/plugins/channelrx/filesink/filesinkgui.ui b/plugins/channelrx/filesink/filesinkgui.ui index f8b7227c9..e9fc5b051 100644 --- a/plugins/channelrx/filesink/filesinkgui.ui +++ b/plugins/channelrx/filesink/filesinkgui.ui @@ -6,7 +6,7 @@ 0 0 - 552 + 441 458 @@ -18,7 +18,7 @@ - 552 + 400 102 @@ -31,535 +31,531 @@ File Sink - - - - 0 - 0 - 550 - 100 - - - - - 550 - 0 - - - - Settings - - - - 2 - - - 2 - - - 2 - - - 2 - - - + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Settings + + + + 2 + + + 2 + 2 + + 2 + - - - - 16 - 0 - + + + 2 - - Df - - + + + + + 16 + 0 + + + + Df + + + + + + + true + + + + 0 + 0 + + + + + 32 + 16 + + + + + Liberation Mono + 12 + + + + PointingHandCursor + + + Qt::StrongFocus + + + Demod shift frequency from center in Hz + + + + + + + Hz + + + + + + + Qt::Vertical + + + + + + + Dec + + + + + + + + 55 + 16777215 + + + + Decimation factor + + + + 1 + + + + + 2 + + + + + 4 + + + + + 8 + + + + + 16 + + + + + 32 + + + + + 64 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 50 + 0 + + + + Sink rate (kS/s) + + + 0000k + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 32 + 0 + + + + Number of captures (files) in recording session updated at end of file + + + #000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 52 + 0 + + + + Total recording time (HH:MM:SS) + + + 00:00:00 + + + + + + + + 52 + 0 + + + + Total recording size (k: kB, M: MB, G: GB) + + + 999.99M + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + - - - true + + + 10 + + + + Use fixed frequency shift positions for little performance improvement + + + Pos + + + + + + + Center frequency position + + + 2 + + + 1 + + + Qt::Horizontal + + + + + + + + 24 + 0 + + + + Filter chain hash code + + + 000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Vertical + + + + + + + Toggle spectrum squelch recording + + + SQ + + + true + + + + + + + + 24 + 24 + + + + Spectrum squelch level (dB) + + + -120 + + + 0 + + + 1 + + + -50 + + + + + + + Spectrum squelch level (dB) + + + -100 + + + + + + + + 24 + 24 + + + + Pre-recording time (s) + + + 10 + + + 1 + + + + + + + Squelched recoding pre-recording time (s) + + + 10 + + + + + + + + 24 + 24 + + + + Squelched recording post-recording time (s) + + + 10 + + + 1 + + + + + + + Squelched recording post-recording time (s) + + + 10 + + + + + + + Squelched recording enable + + + REC + + + + + + + + + + + + 24 + 16777215 + + + + Start/stop recording + + + + + + + :/record_off.png:/record_off.png + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + Open file + + + + + + + :/preset-load.png:/preset-load.png + + + + + + + true + + + Current recording file + + + ... + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + + + + + 0 + 0 + + + + + 10 + + + - + 0 0 - 32 - 16 + 300 + 300 Liberation Mono - 12 + 8 - - PointingHandCursor - - - Qt::StrongFocus - - - Demod shift frequency from center in Hz - - - - Hz - - - - - - - Qt::Vertical - - - - - - - Dec - - - - - - - - 55 - 16777215 - - - - Decimation factor - - - - 1 - - - - - 2 - - - - - 4 - - - - - 8 - - - - - 16 - - - - - 32 - - - - - 64 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 50 - 0 - - - - Sink rate (kS/s) - - - 0000k - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 32 - 0 - - - - Number of captures (files) in recording session updated at end of file - - - #000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 52 - 0 - - - - Total recording time (HH:MM:SS) - - - 00:00:00 - - - - - - - - 52 - 0 - - - - Total recording size (k: kB, M: MB, G: GB) - - - 999.99M - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + - - - - - 10 - - - - - Use fixed frequency shift positions for little performance improvement - - - Pos - - - - - - - Center frequency position - - - 2 - - - 1 - - - Qt::Horizontal - - - - - - - - 24 - 0 - - - - Filter chain hash code - - - 000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Qt::Vertical - - - - - - - Toggle spectrum squelch recording - - - SQ - - - true - - - - - - - - 24 - 24 - - - - Spectrum squelch level (dB) - - - -120 - - - 0 - - - 1 - - - -50 - - - - - - - Spectrum squelch level (dB) - - - -100 - - - - - - - - 24 - 24 - - - - Pre-recording time (s) - - - 10 - - - 1 - - - - - - - Squelched recoding pre-recording time (s) - - - 10 - - - - - - - - 24 - 24 - - - - Squelched recording post-recording time (s) - - - 10 - - - 1 - - - - - - - Squelched recording post-recording time (s) - - - 10 - - - - - - - Squelched recording enable - - - REC - - - - - - - - - - - - 24 - 16777215 - - - - Start/stop recording - - - - - - - :/record_off.png:/record_off.png - - - - - - - - 24 - 24 - - - - - 24 - 24 - - - - Open file - - - - - - - :/preset-load.png:/preset-load.png - - - - - - - true - - - Current recording file - - - ... - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - - - - 0 - 100 - 541 - 351 - - - - - 0 - 0 - - - - - 10 - - - - - - 0 - 0 - - - - - 300 - 300 - - - - - Liberation Mono - 8 - - - - - - - - - + + + diff --git a/plugins/feature/CMakeLists.txt b/plugins/feature/CMakeLists.txt index d7d11584d..e9abffe2c 100644 --- a/plugins/feature/CMakeLists.txt +++ b/plugins/feature/CMakeLists.txt @@ -4,7 +4,7 @@ if (ENABLE_FEATURE_GS232CONTROLLER AND Qt${QT_DEFAULT_MAJOR_VERSION}SerialPort_F add_subdirectory(gs232controller) endif() -if (ENABLE_FEATURE_MAP AND Qt${QT_DEFAULT_MAJOR_VERSION}Quick_FOUND AND Qt${QT_DEFAULT_MAJOR_VERSION}QuickWidgets_FOUND AND Qt${QT_DEFAULT_MAJOR_VERSION}Positioning_FOUND AND Qt${QT_DEFAULT_MAJOR_VERSION}Location_FOUND AND Qt${QT_DEFAULT_MAJOR_VERSION}WebEngine_FOUND) +if (ENABLE_FEATURE_MAP AND Qt${QT_DEFAULT_MAJOR_VERSION}Quick_FOUND AND Qt${QT_DEFAULT_MAJOR_VERSION}QuickWidgets_FOUND AND Qt${QT_DEFAULT_MAJOR_VERSION}Positioning_FOUND AND Qt${QT_DEFAULT_MAJOR_VERSION}Location_FOUND) add_subdirectory(map) endif() diff --git a/plugins/feature/aprs/aprsgui.ui b/plugins/feature/aprs/aprsgui.ui index 92014f20f..b2870286b 100644 --- a/plugins/feature/aprs/aprsgui.ui +++ b/plugins/feature/aprs/aprsgui.ui @@ -18,7 +18,7 @@ - 462 + 400 0 diff --git a/plugins/feature/map/CMakeLists.txt b/plugins/feature/map/CMakeLists.txt index 8d4e51f92..e2dc77c5b 100644 --- a/plugins/feature/map/CMakeLists.txt +++ b/plugins/feature/map/CMakeLists.txt @@ -22,6 +22,15 @@ set(map_HEADERS webserver.h ) +set(Qt${QT_DEFAULT_MAJOR_VERSION}WebEngine_FOUND FALSE) +if(Qt${QT_DEFAULT_MAJOR_VERSION}WebEngine_FOUND) + add_compile_definitions(QT_WEBENGINE_FOUND) + configure_file(mapguiwebengine.ui mapgui.ui) +else() + configure_file(mapguinowebengine.ui mapgui.ui) +endif() +set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_BINARY_DIR}) + include_directories( ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${Qt${QT_DEFAULT_MAJOR_VERSION}Gui_PRIVATE_INCLUDE_DIRS} @@ -31,7 +40,7 @@ if(NOT SERVER_MODE) set(map_SOURCES ${map_SOURCES} mapgui.cpp - mapgui.ui + ${CMAKE_CURRENT_BINARY_DIR}/mapgui.ui maplocationdialog.cpp maplocationdialog.ui mapmaidenheaddialog.cpp @@ -70,9 +79,14 @@ if(NOT SERVER_MODE) ) set(TARGET_NAME map) - set(TARGET_LIB "Qt::Widgets" Qt::Quick Qt::QuickWidgets Qt::Positioning Qt::Location Qt::WebEngine Qt::WebEngineCore Qt::WebEngineWidgets) set(TARGET_LIB_GUI "sdrgui") set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR}) + + if(Qt${QT_DEFAULT_MAJOR_VERSION}WebEngine_FOUND) + set(TARGET_LIB "Qt::Widgets" Qt::Quick Qt::QuickWidgets Qt::Positioning Qt::Location Qt::WebEngine Qt::WebEngineCore Qt::WebEngineWidgets) + else() + set(TARGET_LIB "Qt::Widgets" Qt::Quick Qt::QuickWidgets Qt::Positioning Qt::Location) + endif() else() set(TARGET_NAME mapsrv) set(TARGET_LIB "") diff --git a/plugins/feature/map/mapgui.cpp b/plugins/feature/map/mapgui.cpp index 4b1925312..1d85a431c 100644 --- a/plugins/feature/map/mapgui.cpp +++ b/plugins/feature/map/mapgui.cpp @@ -24,12 +24,15 @@ #include #include +#ifdef QT_WEBENGINE_FOUND #include #include #include +#endif #include "feature/featureuiset.h" #include "gui/basicfeaturesettingsdialog.h" +#include "gui/dialogpositioner.h" #include "mainwindow.h" #include "device/deviceuiset.h" #include "util/units.h" @@ -201,6 +204,8 @@ MapGUI::MapGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur m_webPort = 0; m_webServer = new WebServer(m_webPort); + ui->map->setAttribute(Qt::WA_AcceptTouchEvents, true); + ui->map->rootContext()->setContextProperty("mapModel", &m_mapModel); // 5.12 doesn't display map items when fully zoomed out #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) @@ -220,9 +225,11 @@ MapGUI::MapGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); +#ifdef QT_WEBENGINE_FOUND QWebEngineSettings *settings = ui->web->settings(); settings->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true); connect(ui->web->page(), &QWebEnginePage::fullScreenRequested, this, &MapGUI::fullScreenRequested); +#endif // Get station position float stationLatitude = MainCore::instance()->getSettings().getLatitude(); @@ -279,6 +286,9 @@ MapGUI::MapGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur ui->map->installEventFilter(this); makeUIConnections(); + new DialogPositioner(&m_beaconDialog, true); + new DialogPositioner(&m_ibpBeaconDialog, true); + new DialogPositioner(&m_radioTimeDialog, true); } MapGUI::~MapGUI() @@ -505,13 +515,17 @@ void MapGUI::mufUpdated(const QJsonDocument& document) //#include //QVariantList list = QGeoJson::importGeoJson(document); m_webServer->addFile("/map/map/muf.geojson", document.toJson()); - m_cesium->showMUF(m_settings.m_displayMUF); + if (m_cesium) { + m_cesium->showMUF(m_settings.m_displayMUF); + } } void MapGUI::foF2Updated(const QJsonDocument& document) { m_webServer->addFile("/map/map/fof2.geojson", document.toJson()); - m_cesium->showfoF2(m_settings.m_displayfoF2); + if (m_cesium) { + m_cesium->showfoF2(m_settings.m_displayfoF2); + } } static QString arrayToString(QJsonArray array) @@ -817,7 +831,7 @@ bool MapGUI::eventFilter(QObject *obj, QEvent *event) } } } - return false; + return FeatureGUI::eventFilter(obj, event); } void MapGUI::supportedMapsChanged() @@ -876,6 +890,7 @@ void MapGUI::on_mapTypes_currentIndexChanged(int index) void MapGUI::applyMap3DSettings(bool reloadMap) { +#ifdef QT_WEBENGINE_FOUND if (m_settings.m_map3DEnabled && ((m_cesium == nullptr) || reloadMap)) { if (m_cesium == nullptr) { @@ -916,10 +931,18 @@ void MapGUI::applyMap3DSettings(bool reloadMap) } m_giro->getMUFPeriodically(m_settings.m_displayMUF ? 15 : 0); m_giro->getfoF2Periodically(m_settings.m_displayfoF2 ? 15 : 0); +#else + ui->displayMUF->setVisible(false); + ui->displayfoF2->setVisible(false); + m_mapModel.allUpdated(); + float stationLatitude = MainCore::instance()->getSettings().getLatitude(); + float stationLongitude = MainCore::instance()->getSettings().getLongitude(); +#endif } void MapGUI::init3DMap() { +#ifdef QT_WEBENGINE_FOUND qDebug() << "MapGUI::init3DMap"; m_cesium->initCZML(); @@ -940,6 +963,7 @@ void MapGUI::init3DMap() m_cesium->showMUF(m_settings.m_displayMUF); m_cesium->showfoF2(m_settings.m_displayfoF2); +#endif } void MapGUI::displaySettings() @@ -977,6 +1001,7 @@ void MapGUI::onMenuDialogCalled(const QPoint &p) dialog.setDefaultTitle(m_displayedName); dialog.move(p); + new DialogPositioner(&dialog, false); dialog.exec(); m_settings.m_title = dialog.getTitle(); @@ -1017,6 +1042,7 @@ void MapGUI::applySettings(bool force) void MapGUI::on_maidenhead_clicked() { MapMaidenheadDialog dialog; + new DialogPositioner(&dialog, true); dialog.exec(); } @@ -1090,6 +1116,7 @@ void MapGUI::geoReply() { // Show dialog allowing user to select from the results MapLocationDialog dialog(qGeoLocs); + new DialogPositioner(&dialog, true); if (dialog.exec() == QDialog::Accepted) { QGeoCoordinate coord = dialog.m_selectedLocation.coordinate(); @@ -1208,6 +1235,7 @@ void MapGUI::on_deleteAll_clicked() void MapGUI::on_displaySettings_clicked() { MapSettingsDialog dialog(&m_settings); + new DialogPositioner(&dialog, true); if (dialog.exec() == QDialog::Accepted) { if (dialog.m_osmURLChanged) { @@ -1293,6 +1321,7 @@ void MapGUI::receivedCesiumEvent(const QJsonObject &obj) } } +#ifdef QT_WEBENGINE_FOUND void MapGUI::fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest) { fullScreenRequest.accept(); @@ -1306,6 +1335,7 @@ void MapGUI::fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest) ui->splitter->addWidget(ui->web); } } +#endif void MapGUI::preferenceChanged(int elementType) { diff --git a/plugins/feature/map/mapgui.h b/plugins/feature/map/mapgui.h index a6dfd005e..2e8a4c3fe 100644 --- a/plugins/feature/map/mapgui.h +++ b/plugins/feature/map/mapgui.h @@ -22,7 +22,9 @@ #include #include #include +#ifdef QT_WEBENGINE_FOUND #include +#endif #include #include @@ -227,9 +229,11 @@ private slots: void on_ibpBeacons_clicked(); void on_radiotime_clicked(); void receivedCesiumEvent(const QJsonObject &obj); - virtual void showEvent(QShowEvent *event); - virtual bool eventFilter(QObject *obj, QEvent *event); + virtual void showEvent(QShowEvent *event) override; + virtual bool eventFilter(QObject *obj, QEvent *event) override; +#ifdef QT_WEBENGINE_FOUND void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest); +#endif void preferenceChanged(int elementType); void giroDataUpdated(const GIRO::GIROStationData& data); void mufUpdated(const QJsonDocument& document); diff --git a/plugins/feature/map/mapguinowebengine.ui b/plugins/feature/map/mapguinowebengine.ui new file mode 100644 index 000000000..93377861c --- /dev/null +++ b/plugins/feature/map/mapguinowebengine.ui @@ -0,0 +1,414 @@ + + + MapGUI + + + + 0 + 0 + 491 + 507 + + + + + 0 + 0 + + + + + 400 + 0 + + + + + Liberation Sans + 9 + + + + Qt::StrongFocus + + + Map + + + + + 0 + 0 + 480 + 41 + + + + + 400 + 0 + + + + Settings + + + + 3 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + Find + + + + + + + + 0 + 0 + + + + + 60 + 0 + + + + Enter name of object to find, latitude and longitude, Maidenhead locator or an address + + + + + + + + 0 + 0 + + + + + 60 + 0 + + + + Select type of map to display + + + + + + + Maidenhead locator conversion + + + + + + + :/mem.png:/mem.png + + + + + + + Display Beacon dialog + + + + + + + :/antenna.png:/antenna.png + + + + + + + Display IBP Beacon dialog + + + IBP + + + + :/map/icons/ibp.png:/map/icons/ibp.png + + + + + + + Display radio time transmitters dialog + + + + + + + :/map/icons/clock.png:/map/icons/clock.png + + + + + + + Display MUF contours + + + ^ + + + + :/map/icons/muf.png:/map/icons/muf.png + + + true + + + true + + + + + + + Display foF2 contours + + + ^ + + + + :/map/icons/fof2.png:/map/icons/fof2.png + + + true + + + true + + + + + + + Display names + + + ^ + + + + :/info.png:/info.png + + + true + + + true + + + + + + + Display ground tracks for selected item + + + ^ + + + + :/logarithmic.png:/logarithmic.png + + + true + + + true + + + + + + + Display all ground tracks + + + ^ + + + + :/map/icons/groundtracks.png:/map/icons/groundtracks.png + + + true + + + true + + + + + + + Delete all items on the map + + + + + + + :/bin.png:/bin.png + + + + + + + Show settings dialog + + + + + + + :/listing.png:/listing.png + + + + + + + + + + + 0 + 60 + 483 + 223 + + + + + 0 + 0 + + + + Map + + + + 3 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Qt::Vertical + + + + + 0 + 0 + + + + + 100 + 100 + + + + Map + + + QQuickWidget::SizeRootObjectToView + + + + + + + + + + + + + + + QQuickWidget + QWidget +
QtQuickWidgets/QQuickWidget
+
+ + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
+ + RollupContents + QWidget +
gui/rollupcontents.h
+ 1 +
+
+ + find + mapTypes + maidenhead + beacons + displayNames + deleteAll + displaySettings + map + + + + + + +
diff --git a/plugins/feature/map/mapgui.ui b/plugins/feature/map/mapguiwebengine.ui similarity index 100% rename from plugins/feature/map/mapgui.ui rename to plugins/feature/map/mapguiwebengine.ui diff --git a/plugins/feature/map/mapsettingsdialog.cpp b/plugins/feature/map/mapsettingsdialog.cpp index 4d81b0f2c..859cc176a 100644 --- a/plugins/feature/map/mapsettingsdialog.cpp +++ b/plugins/feature/map/mapsettingsdialog.cpp @@ -172,6 +172,16 @@ MapSettingsDialog::MapSettingsDialog(MapSettings *settings, QWidget* parent) : on_map3DEnabled_clicked(m_settings->m_map3DEnabled); connect(&m_dlm, &HttpDownloadManagerGUI::downloadComplete, this, &MapSettingsDialog::downloadComplete); +#ifndef QT_WEBENGINE_FOUND + ui->map3DSettings->setVisible(false); + ui->downloadModels->setVisible(false); + ui->mapItemSettings->hideColumn(COL_3D_MODEL); + ui->mapItemSettings->hideColumn(COL_3D_MIN_PIXELS); + ui->mapItemSettings->hideColumn(COL_3D_LABEL); + ui->mapItemSettings->hideColumn(COL_3D_POINT); + ui->mapItemSettings->hideColumn(COL_3D_TRACK); + ui->mapItemSettings->hideColumn(COL_3D_LABEL_SCALE); +#endif } MapSettingsDialog::~MapSettingsDialog() diff --git a/plugins/samplesource/airspyhf/CMakeLists.txt b/plugins/samplesource/airspyhf/CMakeLists.txt index c056e217e..b90183c33 100644 --- a/plugins/samplesource/airspyhf/CMakeLists.txt +++ b/plugins/samplesource/airspyhf/CMakeLists.txt @@ -59,6 +59,7 @@ target_link_libraries(${TARGET_NAME} ${TARGET_LIB_GUI} swagger ${LIBAIRSPYHF_LIBRARIES} + ${LIBUSB_LIBRARIES} ) install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER}) diff --git a/plugins/samplesource/fileinput/fileinput.cpp b/plugins/samplesource/fileinput/fileinput.cpp index 503bd9100..899eb6de4 100644 --- a/plugins/samplesource/fileinput/fileinput.cpp +++ b/plugins/samplesource/fileinput/fileinput.cpp @@ -100,7 +100,17 @@ void FileInput::openFileStream() { //stopInput(); - if (m_ifstream.is_open()) { +#ifdef ANDROID + if (m_inputFile.isOpen()) { + m_inputFile.close(); + } + + m_inputFile.setFileName(m_settings.m_fileName); + m_inputFile.open(QIODevice::ReadOnly | QIODevice::ExistingOnly); + quint64 fileSize = (quint64) m_inputFile.size(); + +#else + if (m_ifstream.is_open()) { m_ifstream.close(); } @@ -110,12 +120,18 @@ void FileInput::openFileStream() m_ifstream.open(m_settings.m_fileName.toStdString().c_str(), std::ios::binary | std::ios::ate); #endif quint64 fileSize = m_ifstream.tellg(); +#endif if (m_settings.m_fileName.endsWith(".wav")) { WavFileRecord::Header header; +#ifdef ANDROID + m_inputFile.seek(0); + bool headerOK = WavFileRecord::readHeader(m_inputFile, header); +#else m_ifstream.seekg(0, std::ios_base::beg); bool headerOK = WavFileRecord::readHeader(m_ifstream, header); +#endif m_sampleRate = header.m_sampleRate; if (header.m_auxiHeader.m_size > 0) { @@ -136,7 +152,12 @@ void FileInput::openFileStream() if (headerOK && (m_sampleRate > 0) && (m_sampleSize > 0)) { - m_recordLengthMuSec = ((fileSize - m_ifstream.tellg()) * 1000000UL) / ((m_sampleSize == 24 ? 8 : 4) * m_sampleRate); +#ifdef ANDROID + qint64 pos = m_inputFile.pos(); +#else + qint64 pos = m_ifstream.tellg(); +#endif + m_recordLengthMuSec = ((fileSize - pos) * 1000000UL) / ((m_sampleSize == 24 ? 8 : 4) * m_sampleRate); } else { @@ -153,8 +174,13 @@ void FileInput::openFileStream() else if (fileSize > sizeof(FileRecord::Header)) { FileRecord::Header header; +#ifdef ANDROID + m_inputFile.seek(0); + bool crcOK = FileRecord::readHeader(m_inputFile, header); +#else m_ifstream.seekg(0,std::ios_base::beg); bool crcOK = FileRecord::readHeader(m_ifstream, header); +#endif m_sampleRate = header.sampleRate; m_centerFrequency = header.centerFrequency; m_startingTimeStamp = header.startTimeStamp; @@ -208,7 +234,11 @@ void FileInput::openFileStream() } if (m_recordLengthMuSec == 0) { +#ifdef ANDROID + m_inputFile.close(); +#else m_ifstream.close(); +#endif } } @@ -216,14 +246,24 @@ void FileInput::seekFileStream(int seekMillis) { QMutexLocker mutexLocker(&m_mutex); - if ((m_ifstream.is_open()) && m_fileInputWorker && !m_fileInputWorker->isRunning()) + if ( +#ifdef ANDROID + m_inputFile.isOpen() +#else + m_ifstream.is_open() +#endif + && m_fileInputWorker && !m_fileInputWorker->isRunning()) { quint64 seekPoint = ((m_recordLengthMuSec * seekMillis) / 1000) * m_sampleRate; seekPoint /= 1000000UL; m_fileInputWorker->setSamplesCount(seekPoint); seekPoint *= (m_sampleSize == 24 ? 8 : 4); // + sizeof(FileRecord::Header) +#ifdef ANDROID + m_inputFile.seek(seekPoint + sizeof(FileRecord::Header)); +#else m_ifstream.clear(); m_ifstream.seekg(seekPoint + sizeof(FileRecord::Header), std::ios::beg); +#endif } } @@ -235,7 +275,11 @@ void FileInput::init() bool FileInput::start() { +#ifdef ANDROID + if (!m_inputFile.isOpen()) +#else if (!m_ifstream.is_open()) +#endif { qWarning("FileInput::start: file not open. not starting"); return false; @@ -244,11 +288,15 @@ bool FileInput::start() QMutexLocker mutexLocker(&m_mutex); qDebug() << "FileInput::start"; +#ifdef ANDROID + m_inputFile.seek(0); +#else if (m_ifstream.tellg() != (std::streampos)0) { m_ifstream.clear(); m_ifstream.seekg(sizeof(FileRecord::Header), std::ios::beg); } +#endif if (!m_sampleFifo.setSize(m_settings.m_accelerationFactor * m_sampleRate * sizeof(Sample))) { @@ -256,7 +304,11 @@ bool FileInput::start() return false; } +#ifdef ANDROID + m_fileInputWorker = new FileInputWorker(&m_inputFile, &m_sampleFifo, m_masterTimer, &m_inputMessageQueue); +#else m_fileInputWorker = new FileInputWorker(&m_ifstream, &m_sampleFifo, m_masterTimer, &m_inputMessageQueue); +#endif m_fileInputWorker->moveToThread(&m_fileInputWorkerThread); m_fileInputWorker->setSampleRateAndSize(m_settings.m_accelerationFactor * m_sampleRate, m_sampleSize); // Fast Forward: 1 corresponds to live. 1/2 is half speed, 2 is double speed startWorker(); diff --git a/plugins/samplesource/fileinput/fileinput.h b/plugins/samplesource/fileinput/fileinput.h index 08e3e9c81..c372edba1 100644 --- a/plugins/samplesource/fileinput/fileinput.h +++ b/plugins/samplesource/fileinput/fileinput.h @@ -28,6 +28,7 @@ #include #include #include +#include #include "dsp/devicesamplesource.h" #include "fileinputsettings.h" @@ -334,7 +335,11 @@ public: DeviceAPI *m_deviceAPI; QMutex m_mutex; FileInputSettings m_settings; +#ifdef ANDROID + QFile m_inputFile; +#else std::ifstream m_ifstream; +#endif FileInputWorker* m_fileInputWorker; QThread m_fileInputWorkerThread; QString m_deviceDescription; diff --git a/plugins/samplesource/fileinput/fileinputgui.cpp b/plugins/samplesource/fileinput/fileinputgui.cpp index 143925a3b..0de5c2e2f 100644 --- a/plugins/samplesource/fileinput/fileinputgui.cpp +++ b/plugins/samplesource/fileinput/fileinputgui.cpp @@ -28,6 +28,7 @@ #include "gui/colormapper.h" #include "gui/glspectrum.h" #include "gui/basicdevicesettingsdialog.h" +#include "gui/dialogpositioner.h" #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -313,7 +314,8 @@ void FileInputGUI::on_showFileDialog_clicked(bool checked) { (void) checked; QString fileName = QFileDialog::getOpenFileName(this, - tr("Open I/Q record file"), ".", tr("SDR I/Q Files (*.sdriq *.wav)"), 0, QFileDialog::DontUseNativeDialog); + tr("Open I/Q record file"), ".", tr("SDR I/Q Files (*.sdriq *.wav)"), 0); + if (fileName != "") { @@ -450,6 +452,7 @@ void FileInputGUI::openDeviceSettingsDialog(const QPoint& p) dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); dialog.move(p); + new DialogPositioner(&dialog, false); dialog.exec(); m_settings.m_useReverseAPI = dialog.useReverseAPI(); diff --git a/plugins/samplesource/fileinput/fileinputworker.cpp b/plugins/samplesource/fileinput/fileinputworker.cpp index f1b61f75d..42a74fbe4 100644 --- a/plugins/samplesource/fileinput/fileinputworker.cpp +++ b/plugins/samplesource/fileinput/fileinputworker.cpp @@ -26,7 +26,12 @@ MESSAGE_CLASS_DEFINITION(FileInputWorker::MsgReportEOF, Message) -FileInputWorker::FileInputWorker(std::ifstream *samplesStream, +FileInputWorker::FileInputWorker( +#ifdef ANDROID + QFile *samplesStream, +#else + std::ifstream *samplesStream, +#endif SampleSinkFifo* sampleFifo, const QTimer& timer, MessageQueue *fileInputMessageQueue, @@ -69,7 +74,11 @@ void FileInputWorker::startWork() { qDebug() << "FileInputThread::startWork: "; +#ifdef ANDROID + if (m_ifstream->isOpen()) +#else if (m_ifstream->is_open()) +#endif { qDebug() << "FileInputThread::startWork: file stream open, starting..."; m_elapsedTimer.start(); @@ -172,6 +181,23 @@ void FileInputWorker::tick() setBuffers(m_chunksize); } + +#ifdef ANDROID + // read samples directly feeding the SampleFifo (no callback) + qint64 bytesRead = m_ifstream->read(reinterpret_cast(m_fileBuf), m_chunksize); + + if (m_ifstream->atEnd()) + { + writeToSampleFifo(m_fileBuf, (qint32) bytesRead); + MsgReportEOF *message = MsgReportEOF::create(); + m_fileInputMessageQueue->push(message); + } + else + { + writeToSampleFifo(m_fileBuf, (qint32) m_chunksize); + m_samplesCount += m_chunksize / (2 * m_samplebytes); + } +#else // read samples directly feeding the SampleFifo (no callback) m_ifstream->read(reinterpret_cast(m_fileBuf), m_chunksize); @@ -186,6 +212,7 @@ void FileInputWorker::tick() writeToSampleFifo(m_fileBuf, (qint32) m_chunksize); m_samplesCount += m_chunksize / (2 * m_samplebytes); } +#endif } } diff --git a/plugins/samplesource/fileinput/fileinputworker.h b/plugins/samplesource/fileinput/fileinputworker.h index c81fc635a..19787b148 100644 --- a/plugins/samplesource/fileinput/fileinputworker.h +++ b/plugins/samplesource/fileinput/fileinputworker.h @@ -50,7 +50,12 @@ public: { } }; - FileInputWorker(std::ifstream *samplesStream, + FileInputWorker( +#ifdef ANDROID + QFile *samplesStream, +#else + std::ifstream *samplesStream, +#endif SampleSinkFifo* sampleFifo, const QTimer& timer, MessageQueue *fileInputMessageQueue, @@ -68,7 +73,11 @@ public: private: volatile bool m_running; +#ifdef ANDROID + QFile *m_ifstream; +#else std::ifstream* m_ifstream; +#endif quint8 *m_fileBuf; quint8 *m_convertBuf; std::size_t m_bufsize; diff --git a/sdrbase/dsp/filerecord.cpp b/sdrbase/dsp/filerecord.cpp index 603e8931c..0b9bcc492 100644 --- a/sdrbase/dsp/filerecord.cpp +++ b/sdrbase/dsp/filerecord.cpp @@ -114,16 +114,31 @@ bool FileRecord::startRecording() stopRecording(); } +#ifdef ANDROID + if (!m_sampleFile.isOpen()) +#else if (!m_sampleFile.is_open()) +#endif { qDebug() << "FileRecord::startRecording"; - m_currentFileName = QString("%1.%2.sdriq").arg(m_fileBase).arg(QDateTime::currentDateTimeUtc().toString("yyyy-MM-ddTHH_mm_ss_zzz")); +#ifdef ANDROID + // FIXME: No idea how to write to a file where the filename doesn't come from the file picker + m_currentFileName = m_fileBase + ".sdriq"; + m_sampleFile.setFileName(m_currentFileName); + if (!m_sampleFile.open(QIODevice::ReadWrite)) + { + qWarning() << "FileRecord::startRecording: failed to open file: " << m_currentFileName << " error " << m_sampleFile.error(); + return false; + } +#else + m_currentFileName = m_fileBase + "." + QDateTime::currentDateTimeUtc().toString("yyyy-MM-ddTHH_mm_ss_zzz") + ".sdriq"; // Don't use QString::arg on Android, as filename can contain %2 m_sampleFile.open(m_currentFileName.toStdString().c_str(), std::ios::binary); if (!m_sampleFile.is_open()) { qWarning() << "FileRecord::startRecording: failed to open file: " << m_currentFileName; return false; } +#endif m_recordOn = true; m_recordStart = true; m_byteCount = 0; @@ -135,17 +150,24 @@ bool FileRecord::stopRecording() { QMutexLocker mutexLocker(&m_mutex); +#ifdef ANDROID + if (m_sampleFile.isOpen()) +#else if (m_sampleFile.is_open()) +#endif { qDebug() << "FileRecord::stopRecording"; m_sampleFile.close(); m_recordOn = false; m_recordStart = false; +#ifdef ANDROID +#else if (m_sampleFile.bad()) { qWarning() << "FileRecord::stopRecording: an error occurred while writing to " << m_currentFileName; return false; } +#endif } return true; } @@ -197,6 +219,14 @@ bool FileRecord::readHeader(std::ifstream& sampleFile, Header& header) return header.crc32 == crc32.checksum(); } +bool FileRecord::readHeader(QFile& sampleFile, Header& header) +{ + sampleFile.read((char *) &header, sizeof(Header)); + boost::crc_32_type crc32; + crc32.process_bytes(&header, 28); + return header.crc32 == crc32.checksum(); +} + void FileRecord::writeHeader(std::ofstream& sampleFile, Header& header) { boost::crc_32_type crc32; @@ -204,3 +234,11 @@ void FileRecord::writeHeader(std::ofstream& sampleFile, Header& header) header.crc32 = crc32.checksum(); sampleFile.write((const char *) &header, sizeof(Header)); } + +void FileRecord::writeHeader(QFile& sampleFile, Header& header) +{ + boost::crc_32_type crc32; + crc32.process_bytes(&header, 28); + header.crc32 = crc32.checksum(); + sampleFile.write((const char *) &header, sizeof(Header)); +} diff --git a/sdrbase/dsp/filerecord.h b/sdrbase/dsp/filerecord.h index 02ba5d706..e2086115c 100644 --- a/sdrbase/dsp/filerecord.h +++ b/sdrbase/dsp/filerecord.h @@ -18,6 +18,8 @@ #ifndef INCLUDE_FILERECORD_H #define INCLUDE_FILERECORD_H +#include + #include #include #include @@ -65,7 +67,9 @@ public: virtual bool isRecording() const { return m_recordOn; } static bool readHeader(std::ifstream& samplefile, Header& header); //!< returns true if CRC checksum is correct else false + static bool readHeader(QFile& samplefile, Header& header); //!< returns true if CRC checksum is correct else false static void writeHeader(std::ofstream& samplefile, Header& header); + static void writeHeader(QFile& samplefile, Header& header); private: QString m_fileBase; @@ -73,7 +77,11 @@ private: quint64 m_centerFrequency; bool m_recordOn; bool m_recordStart; +#ifdef ANDROID + QFile m_sampleFile; +#else std::ofstream m_sampleFile; +#endif QString m_currentFileName; quint64 m_byteCount; qint64 m_msShift; diff --git a/sdrbase/dsp/wavfilerecord.cpp b/sdrbase/dsp/wavfilerecord.cpp index 2cc572f07..2647e69e9 100644 --- a/sdrbase/dsp/wavfilerecord.cpp +++ b/sdrbase/dsp/wavfilerecord.cpp @@ -105,8 +105,8 @@ void WavFileRecord::feed(const SampleVector::const_iterator& begin, const Sample { // Convert from 24-bit to 16-bit int16_t samples[2]; - samples[0] = it->real() >> 8; - samples[1] = it->imag() >> 8; + samples[0] = std::min(32767, std::max(it->real() >> 8, -32768)); + samples[1] = std::min(32767, std::max(it->imag() >> 8, -32768)); m_sampleFile.write(reinterpret_cast(&samples), 4); m_byteCount += 4; } @@ -154,16 +154,31 @@ bool WavFileRecord::startRecording() stopRecording(); } +#ifdef ANDROID + if (!m_sampleFile.isOpen()) +#else if (!m_sampleFile.is_open()) +#endif { qDebug() << "WavFileRecord::startRecording"; - m_currentFileName = QString("%1.%2.wav").arg(m_fileBase).arg(QDateTime::currentDateTimeUtc().toString("yyyy-MM-ddTHH_mm_ss_zzz")); +#ifdef ANDROID + // FIXME: No idea how to write to a file where the filename doesn't come from the file picker + m_currentFileName = m_fileBase + ".wav"; + m_sampleFile.setFileName(m_currentFileName); + if (!m_sampleFile.open(QIODevice::ReadWrite)) + { + qWarning() << "WavFileRecord::startRecording: failed to open file: " << m_currentFileName << " error " << m_sampleFile.error(); + return false; + } +#else + m_currentFileName = m_fileBase + "_" + QDateTime::currentDateTimeUtc().toString("yyyy-MM-ddTHH_mm_ss_zzz") + ".wav"; // Don't use QString::arg on Android, as filename can contain %2 m_sampleFile.open(m_currentFileName.toStdString().c_str(), std::ios::binary); if (!m_sampleFile.is_open()) { qWarning() << "WavFileRecord::startRecording: failed to open file: " << m_currentFileName; return false; } +#endif m_recordOn = true; m_recordStart = true; m_byteCount = 0; @@ -173,25 +188,41 @@ bool WavFileRecord::startRecording() bool WavFileRecord::stopRecording() { +#ifdef ANDROID + if (m_sampleFile.isOpen()) +#else if (m_sampleFile.is_open()) +#endif { qDebug() << "WavFileRecord::stopRecording"; // Fix up chunk sizes +#ifdef ANDROID + long fileSize = (long)m_sampleFile.size(); + m_sampleFile.seek(offsetof(Header, m_riffHeader.m_size)); +#else long fileSize = m_sampleFile.tellp(); m_sampleFile.seekp(offsetof(Header, m_riffHeader.m_size)); +#endif qint32 size = (fileSize - 8); m_sampleFile.write((char *)&size, 4); +#ifdef ANDROID + m_sampleFile.seek(offsetof(Header, m_dataHeader.m_size)); +#else m_sampleFile.seekp(offsetof(Header, m_dataHeader.m_size)); +#endif size = fileSize - sizeof(Header); m_sampleFile.write((char *)&size, 4); m_sampleFile.close(); m_recordOn = false; m_recordStart = false; +#ifdef ANDROID +#else if (m_sampleFile.bad()) { qWarning() << "WavFileRecord::stopRecording: an error occurred while writing to " << m_currentFileName; return false; } +#endif } return true; } @@ -305,35 +336,7 @@ bool WavFileRecord::readHeader(std::ifstream& sampleFile, Header& header) return false; } - if (strncmp(header.m_riffHeader.m_id, "RIFF", 4)) - { - qDebug() << "WavFileRecord::readHeader: No RIFF header"; - return false; - } - if (strncmp(header.m_type, "WAVE", 4)) - { - qDebug() << "WavFileRecord::readHeader: No WAVE header"; - return false; - } - if (strncmp(header.m_fmtHeader.m_id, "fmt ", 4)) - { - qDebug() << "WavFileRecord::readHeader: No fmt header"; - return false; - } - if (header.m_audioFormat != 1) - { - qDebug() << "WavFileRecord::readHeader: Audio format is not PCM"; - return false; - } - if (header.m_numChannels != 2) - { - qDebug() << "WavFileRecord::readHeader: Number of channels is not 2"; - return false; - } - // FileInputWorker can't handle other bits sizes - if (header.m_bitsPerSample != 16) - { - qDebug() << "WavFileRecord::readHeader: Number of bits per sample is not 16"; + if (!checkHeader(header)) { return false; } @@ -365,11 +368,89 @@ bool WavFileRecord::readHeader(std::ifstream& sampleFile, Header& header) return true; } +bool WavFileRecord::readHeader(QFile& sampleFile, Header& header) +{ + memset(&header, 0, sizeof(Header)); + + sampleFile.read((char *) &header, 8+4+8+16); + + if (!checkHeader(header)) { + return false; + } + + Chunk chunkHeader; + bool gotData = false; + while (!gotData) + { + if (sampleFile.read((char *) &chunkHeader, 8) != 8) + { + qDebug() << "WavFileRecord::readHeader: End of file without reading data header"; + return false; + } + + if (!strncmp(chunkHeader.m_id, "auxi", 4)) + { + memcpy(&header.m_auxiHeader, &chunkHeader, sizeof(Chunk)); + if (sampleFile.read((char *) &header.m_auxi, sizeof(Auxi)) != sizeof(Auxi)) { + return false; + } + } + else if (!strncmp(chunkHeader.m_id, "data", 4)) + { + memcpy(&header.m_dataHeader, &chunkHeader, sizeof(Chunk)); + gotData = true; + } + } + + return true; +} + +bool WavFileRecord::checkHeader(Header& header) +{ + if (strncmp(header.m_riffHeader.m_id, "RIFF", 4)) + { + qDebug() << "WavFileRecord::readHeader: No RIFF header"; + return false; + } + if (strncmp(header.m_type, "WAVE", 4)) + { + qDebug() << "WavFileRecord::readHeader: No WAVE header"; + return false; + } + if (strncmp(header.m_fmtHeader.m_id, "fmt ", 4)) + { + qDebug() << "WavFileRecord::readHeader: No fmt header"; + return false; + } + if (header.m_audioFormat != 1) + { + qDebug() << "WavFileRecord::readHeader: Audio format is not PCM"; + return false; + } + if (header.m_numChannels != 2) + { + qDebug() << "WavFileRecord::readHeader: Number of channels is not 2"; + return false; + } + // FileInputWorker can't handle other bits sizes + if (header.m_bitsPerSample != 16) + { + qDebug() << "WavFileRecord::readHeader: Number of bits per sample is not 16"; + return false; + } + return true; +} + void WavFileRecord::writeHeader(std::ofstream& sampleFile, Header& header) { sampleFile.write((const char *) &header, sizeof(Header)); } +void WavFileRecord::writeHeader(QFile& sampleFile, Header& header) +{ + sampleFile.write((const char *) &header, sizeof(Header)); +} + bool WavFileRecord::getCenterFrequency(QString fileName, quint64& centerFrequency) { // Attempt to extract center frequency from filename diff --git a/sdrbase/dsp/wavfilerecord.h b/sdrbase/dsp/wavfilerecord.h index 6e1e49317..9cf2db22b 100644 --- a/sdrbase/dsp/wavfilerecord.h +++ b/sdrbase/dsp/wavfilerecord.h @@ -27,6 +27,7 @@ #include #include +#include #include "dsp/filerecordinterface.h" #include "export.h" @@ -111,7 +112,9 @@ public: virtual bool isRecording() const override { return m_recordOn; } static bool readHeader(std::ifstream& samplefile, Header& header); + static bool readHeader(QFile& samplefile, Header& header); static void writeHeader(std::ofstream& samplefile, Header& header); + static void writeHeader(QFile& samplefile, Header& header); // These functions guess from the filename, not contents static bool getCenterFrequency(QString fileName, quint64& centerFrequency); @@ -123,13 +126,19 @@ private: quint64 m_centerFrequency; bool m_recordOn; bool m_recordStart; +#ifdef ANDROID + QFile m_sampleFile; +#else std::ofstream m_sampleFile; +#endif QString m_currentFileName; quint64 m_byteCount; qint64 m_msShift; int m_nbChannels; void writeHeader(); + + static bool checkHeader(Header& header); }; #endif // INCLUDE_WAV_FILERECORD_H diff --git a/sdrbase/maincore.cpp b/sdrbase/maincore.cpp index 44dc1866f..a5247e298 100644 --- a/sdrbase/maincore.cpp +++ b/sdrbase/maincore.cpp @@ -88,6 +88,12 @@ MainCore *MainCore::instance() void MainCore::setLoggingOptions() { + if (!m_logger) + { + qDebug() << "MainCore::setLoggingOptions: No logger."; + return; + } + m_logger->setConsoleMinMessageLevel(m_settings.getConsoleMinLogLevel()); if (m_settings.getUseLogFile()) @@ -346,11 +352,15 @@ void MainCore::initPosition() if (m_positionSource) { connect(m_positionSource, &QGeoPositionInfoSource::positionUpdated, this, &MainCore::positionUpdated); + connect(m_positionSource, &QGeoPositionInfoSource::updateTimeout, this, &MainCore::positionUpdateTimeout); + connect(m_positionSource, qOverload(&QGeoPositionInfoSource::error), this, &MainCore::positionError); + m_position = m_positionSource->lastKnownPosition(); + m_positionSource->setUpdateInterval(1000); m_positionSource->startUpdates(); } else { - qDebug() << "MainCore::initPosition: No position source."; + qWarning() << "MainCore::initPosition: No position source."; } } @@ -372,3 +382,13 @@ void MainCore::positionUpdated(const QGeoPositionInfo &info) } } } + +void MainCore::positionUpdateTimeout() +{ + qWarning() << "MainCore::positionUpdateTimeout: GPS signal lost"; +} + +void MainCore::positionError(QGeoPositionInfoSource::Error positioningError) +{ + qWarning() << "MainCore::positionError: " << positioningError; +} diff --git a/sdrbase/maincore.h b/sdrbase/maincore.h index e2c86ebd9..d2dfe0576 100644 --- a/sdrbase/maincore.h +++ b/sdrbase/maincore.h @@ -26,6 +26,7 @@ #include #include #include +#include #include "export.h" #include "settings/mainsettings.h" @@ -889,6 +890,8 @@ public: public slots: void positionUpdated(const QGeoPositionInfo &info); + void positionUpdateTimeout(); + void positionError(QGeoPositionInfoSource::Error positioningError); signals: void deviceSetAdded(int index, DeviceAPI *device); diff --git a/sdrbase/util/android.cpp b/sdrbase/util/android.cpp index 2d755ae72..62d74d0a9 100644 --- a/sdrbase/util/android.cpp +++ b/sdrbase/util/android.cpp @@ -189,25 +189,29 @@ void Android::messageHandler(QtMsgType type, const QMessageLogContext& context, } const char * const local = report.toLocal8Bit().constData(); const char * const applicationName = "sdrangel"; + int ret; switch (type) { case QtDebugMsg: - __android_log_write(ANDROID_LOG_DEBUG, applicationName, local); + ret = __android_log_write(ANDROID_LOG_DEBUG, applicationName, local); break; case QtInfoMsg: - __android_log_write(ANDROID_LOG_INFO, applicationName, local); + ret = __android_log_write(ANDROID_LOG_INFO, applicationName, local); break; case QtWarningMsg: - __android_log_write(ANDROID_LOG_WARN, applicationName, local); + ret = __android_log_write(ANDROID_LOG_WARN, applicationName, local); break; case QtCriticalMsg: - __android_log_write(ANDROID_LOG_ERROR, applicationName, local); + ret = __android_log_write(ANDROID_LOG_ERROR, applicationName, local); break; case QtFatalMsg: default: - __android_log_write(ANDROID_LOG_FATAL, applicationName, local); + ret = __android_log_write(ANDROID_LOG_FATAL, applicationName, local); abort(); } + if (ret < 0) { + __android_log_write(ANDROID_LOG_ERROR, applicationName, "Error writing to log"); + } } #endif // ANDROID diff --git a/sdrbase/util/httpdownloadmanager.cpp b/sdrbase/util/httpdownloadmanager.cpp index 41fde655f..341a6423d 100644 --- a/sdrbase/util/httpdownloadmanager.cpp +++ b/sdrbase/util/httpdownloadmanager.cpp @@ -73,7 +73,20 @@ QString HttpDownloadManager::downloadDir() void HttpDownloadManager::sslErrors(const QList &sslErrors) { for (const QSslError &error : sslErrors) - qCritical() << "HttpDownloadManager: SSL error: " << error.errorString(); + { + qCritical() << "HttpDownloadManager: SSL error" << (int)error.error() << ": " << error.errorString(); +#ifdef ANDROID + // On Android 6 (but not on 12), we always seem to get: "The issuer certificate of a locally looked up certificate could not be found" + // which causes downloads to fail, so ignore + if (error.error() == QSslError::UnableToGetLocalIssuerCertificate) + { + QNetworkReply *reply = qobject_cast(sender()); + QList errorsThatCanBeIgnored; + errorsThatCanBeIgnored << QSslError(QSslError::UnableToGetLocalIssuerCertificate, error.certificate()); + reply->ignoreSslErrors(errorsThatCanBeIgnored); + } +#endif + } } bool HttpDownloadManager::isHttpRedirect(QNetworkReply *reply) diff --git a/sdrgui/gui/audiodialog.ui b/sdrgui/gui/audiodialog.ui index 667dd3e72..3c211197e 100644 --- a/sdrgui/gui/audiodialog.ui +++ b/sdrgui/gui/audiodialog.ui @@ -12,7 +12,7 @@ - 460 + 400 460 diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp index b53ed076f..efa2f96af 100644 --- a/sdrgui/mainwindow.cpp +++ b/sdrgui/mainwindow.cpp @@ -3078,6 +3078,7 @@ void MainWindow::orientationChanged(Qt::ScreenOrientation orientation) setTabPosition(Qt::LeftDockWidgetArea, QTabWidget::West); } else { setTabPosition(Qt::LeftDockWidgetArea, QTabWidget::South); + } #else (void) orientation; #endif