mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-09-02 13:17:48 -04:00
commit
53ce3b2877
102
CMakeLists.txt
102
CMakeLists.txt
@ -7,18 +7,68 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
|
|||||||
SET(CUBICSDR_VERSION_MAJOR "0")
|
SET(CUBICSDR_VERSION_MAJOR "0")
|
||||||
SET(CUBICSDR_VERSION_MINOR "2")
|
SET(CUBICSDR_VERSION_MINOR "2")
|
||||||
SET(CUBICSDR_VERSION_PATCH "0")
|
SET(CUBICSDR_VERSION_PATCH "0")
|
||||||
SET(CUBICSDR_VERSION_REL "")
|
SET(CUBICSDR_VERSION_SUFFIX "")
|
||||||
SET(CUBICSDR_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}${CUBICSDR_VERSION_REL}")
|
SET(CUBICSDR_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}${CUBICSDR_VERSION_SUFFIX}")
|
||||||
|
|
||||||
SET(CPACK_PACKAGE_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}")
|
SET(CPACK_PACKAGE_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}")
|
||||||
SET(CPACK_PACKAGE_VERSION_MAJOR ${CUBICSDR_VERSION_MAJOR})
|
SET(CPACK_PACKAGE_VERSION_MAJOR ${CUBICSDR_VERSION_MAJOR})
|
||||||
SET(CPACK_PACKAGE_VERSION_MINOR ${CUBICSDR_VERSION_MINOR})
|
SET(CPACK_PACKAGE_VERSION_MINOR ${CUBICSDR_VERSION_MINOR})
|
||||||
SET(CPACK_PACKAGE_VERSION_PATCH ${CUBICSDR_VERSION_PATCH})
|
SET(CPACK_PACKAGE_VERSION_PATCH ${CUBICSDR_VERSION_PATCH})
|
||||||
|
|
||||||
SET (VERSION_SUFFIX "" CACHE STRING "Add custom version suffix to CubicSDR application title.")
|
SET (CUSTOM_BUILD OFF CACHE BOOL "Enable custom build options")
|
||||||
|
# Build options for custom deploys, optimization and debugging
|
||||||
|
IF(CUSTOM_BUILD)
|
||||||
|
SET (CUBICSDR_BUILD_TITLE CACHE STRING "Custom Title")
|
||||||
|
# bundle flags
|
||||||
|
SET (CUBICSDR_INSTALL_NAME CACHE "CubicSDR" "Installation Name")
|
||||||
|
SET (CUBICSDR_INSTALL_TITLE CACHE "CubicSDR" "Installation Title")
|
||||||
|
SET (CUBICSDR_HEADER_IMAGE CACHE "" "Image file to display in header")
|
||||||
|
SET (CUBICSDR_HEADER_BG CACHE "000000" "Background Color (HEX) for header")
|
||||||
|
# feature flags
|
||||||
|
SET (CUBICSDR_ENABLE_VIEW_DEMOD ON CACHE BOOL "Enable Second Demodulator Spectrum/Waterfall view.")
|
||||||
|
SET (CUBICSDR_ENABLE_VIEW_SCOPE ON CACHE BOOL "Enable Demodulator Scope/Spectrum view.")
|
||||||
|
SET (CUBICSDR_MODEM_EXCLUDE CACHE "" "Comma-separated list of modems to exclude.")
|
||||||
|
|
||||||
|
IF (NOT CUBICSDR_HEADER_IMAGE STREQUAL "")
|
||||||
|
SET(CUBICSDR_HAS_HEADER_IMAGE TRUE)
|
||||||
|
GET_FILENAME_COMPONENT(CUBICSDR_HEADER_IMAGE_FILE "${CUBICSDR_HEADER_IMAGE}" NAME)
|
||||||
|
GET_FILENAME_COMPONENT(CUBICSDR_HEADER_IMAGE_DIR "${CUBICSDR_HEADER_IMAGE}" PATH)
|
||||||
|
ADD_DEFINITIONS(
|
||||||
|
-DCUBICSDR_HEADER_IMAGE="${CUBICSDR_HEADER_IMAGE_FILE}"
|
||||||
|
-DCUBICSDR_HEADER_BG="${CUBICSDR_HEADER_BG}"
|
||||||
|
)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (NOT CUBICSDR_MODEM_EXCLUDE STREQUAL "")
|
||||||
|
ADD_DEFINITIONS(
|
||||||
|
-DCUBICSDR_MODEM_EXCLUDE="${CUBICSDR_MODEM_EXCLUDE}"
|
||||||
|
)
|
||||||
|
ENDIF()
|
||||||
|
ELSE()
|
||||||
|
SET (CUBICSDR_BUILD_TITLE "CubicSDR v${CUBICSDR_VERSION} by Charles J. Cliffe (@ccliffe) :: www.cubicsdr.com")
|
||||||
|
# bundle flags
|
||||||
|
SET (CUBICSDR_INSTALL_NAME "CubicSDR")
|
||||||
|
SET (CUBICSDR_INSTALL_TITLE "CubicSDR ${CUBICSDR_VERSION} Installer")
|
||||||
|
SET (CUBICSDR_HEADER_IMAGE "")
|
||||||
|
SET (CUBICSDR_HEADER_BG "")
|
||||||
|
# feature flags
|
||||||
|
SET (CUBICSDR_ENABLE_VIEW_DEMOD TRUE)
|
||||||
|
SET (CUBICSDR_ENABLE_VIEW_SCOPE TRUE)
|
||||||
|
SET (CUBICSDR_EXCLUDE_MODEM "")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(CUBICSDR_ENABLE_VIEW_DEMOD)
|
||||||
|
ADD_DEFINITIONS( -DCUBICSDR_ENABLE_VIEW_DEMOD=1 )
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(CUBICSDR_ENABLE_VIEW_SCOPE)
|
||||||
|
ADD_DEFINITIONS( -DCUBICSDR_ENABLE_VIEW_SCOPE=1 )
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
ADD_DEFINITIONS(
|
ADD_DEFINITIONS(
|
||||||
-DCUBICSDR_VERSION="${CUBICSDR_VERSION}${VERSION_SUFFIX}"
|
-DCUBICSDR_INSTALL_NAME="${CUBICSDR_INSTALL_NAME}"
|
||||||
|
-DCUBICSDR_VERSION="${CUBICSDR_VERSION}"
|
||||||
|
-DCUBICSDR_BUILD_TITLE="${CUBICSDR_BUILD_TITLE}"
|
||||||
)
|
)
|
||||||
|
|
||||||
SET (ENABLE_DIGITAL_LAB OFF CACHE BOOL "Enable 'Digital Lab' testing features.")
|
SET (ENABLE_DIGITAL_LAB OFF CACHE BOOL "Enable 'Digital Lab' testing features.")
|
||||||
@ -294,6 +344,7 @@ SET (cubicsdr_sources
|
|||||||
src/visual/SpectrumCanvas.cpp
|
src/visual/SpectrumCanvas.cpp
|
||||||
src/visual/WaterfallCanvas.cpp
|
src/visual/WaterfallCanvas.cpp
|
||||||
src/visual/GainCanvas.cpp
|
src/visual/GainCanvas.cpp
|
||||||
|
src/visual/ImagePanel.cpp
|
||||||
src/process/VisualProcessor.cpp
|
src/process/VisualProcessor.cpp
|
||||||
src/process/ScopeVisualProcessor.cpp
|
src/process/ScopeVisualProcessor.cpp
|
||||||
src/process/SpectrumVisualProcessor.cpp
|
src/process/SpectrumVisualProcessor.cpp
|
||||||
@ -397,6 +448,7 @@ SET (cubicsdr_headers
|
|||||||
src/visual/SpectrumCanvas.h
|
src/visual/SpectrumCanvas.h
|
||||||
src/visual/WaterfallCanvas.h
|
src/visual/WaterfallCanvas.h
|
||||||
src/visual/GainCanvas.h
|
src/visual/GainCanvas.h
|
||||||
|
src/visual/ImagePanel.h
|
||||||
src/process/VisualProcessor.h
|
src/process/VisualProcessor.h
|
||||||
src/process/ScopeVisualProcessor.h
|
src/process/ScopeVisualProcessor.h
|
||||||
src/process/SpectrumVisualProcessor.h
|
src/process/SpectrumVisualProcessor.h
|
||||||
@ -569,6 +621,9 @@ IF (NOT BUNDLE_APP)
|
|||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
configure_files(${PROJECT_SOURCE_DIR}/external/liquid-dsp/msvc/${EX_PLATFORM}/ ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME} "*.dll")
|
configure_files(${PROJECT_SOURCE_DIR}/external/liquid-dsp/msvc/${EX_PLATFORM}/ ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME} "*.dll")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
IF (CUBICSDR_HAS_HEADER_IMAGE)
|
||||||
|
configure_files(${CUBICSDR_HEADER_IMAGE_DIR} ${CMAKE_BINARY_DIR}/${EX_PLATFORM_NAME} ${CUBICSDR_HEADER_IMAGE_FILE})
|
||||||
|
ENDIF()
|
||||||
add_executable(CubicSDR ${cubicsdr_sources} ${cubicsdr_headers} ${RES_FILES})
|
add_executable(CubicSDR ${cubicsdr_sources} ${cubicsdr_headers} ${RES_FILES})
|
||||||
target_link_libraries(CubicSDR ${LIQUID_LIB} ${wxWidgets_LIBRARIES} ${OPENGL_LIBRARIES} ${OTHER_LIBRARIES})
|
target_link_libraries(CubicSDR ${LIQUID_LIB} ${wxWidgets_LIBRARIES} ${OPENGL_LIBRARIES} ${OTHER_LIBRARIES})
|
||||||
ENDIF (NOT BUNDLE_APP)
|
ENDIF (NOT BUNDLE_APP)
|
||||||
@ -583,6 +638,8 @@ IF (MSVC)
|
|||||||
set_target_properties(CubicSDR PROPERTIES LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:WINDOWS")
|
set_target_properties(CubicSDR PROPERTIES LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:WINDOWS")
|
||||||
set_target_properties(CubicSDR PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "_WINDOWS")
|
set_target_properties(CubicSDR PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL "_WINDOWS")
|
||||||
set(CMAKE_CREATE_WIN32_EXE "/SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"")
|
set(CMAKE_CREATE_WIN32_EXE "/SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"")
|
||||||
|
set_target_properties (CubicSDR PROPERTIES OUTPUT_NAME "${CUBICSDR_INSTALL_NAME}")
|
||||||
|
|
||||||
ENDIF(MSVC)
|
ENDIF(MSVC)
|
||||||
|
|
||||||
IF (APPLE)
|
IF (APPLE)
|
||||||
@ -647,7 +704,7 @@ IF (APPLE AND BUNDLE_APP)
|
|||||||
MACOSX_BUNDLE_INFO_STRING "CubicSDR Open-Source Software-Defined Radio Application"
|
MACOSX_BUNDLE_INFO_STRING "CubicSDR Open-Source Software-Defined Radio Application"
|
||||||
MACOSX_BUNDLE_BUNDLE_NAME "CubicSDR"
|
MACOSX_BUNDLE_BUNDLE_NAME "CubicSDR"
|
||||||
MACOSX_BUNDLE_BUNDLE_VERSION "${CUBICSDR_VERSION}"
|
MACOSX_BUNDLE_BUNDLE_VERSION "${CUBICSDR_VERSION}"
|
||||||
MACOSX_BUNDLE_LONG_VERSION_STRING "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}.${CUBICSDR_VERSION_REL}"
|
MACOSX_BUNDLE_LONG_VERSION_STRING "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}${CUBICSDR_VERSION_SUFFIX}"
|
||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}"
|
MACOSX_BUNDLE_SHORT_VERSION_STRING "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}"
|
||||||
MACOSX_BUNDLE_GUI_IDENTIFIER "com.cubicproductions.cubicsdr"
|
MACOSX_BUNDLE_GUI_IDENTIFIER "com.cubicproductions.cubicsdr"
|
||||||
MACOSX_BUNDLE_ICON_FILE "CubicSDR.icns"
|
MACOSX_BUNDLE_ICON_FILE "CubicSDR.icns"
|
||||||
@ -742,6 +799,7 @@ IF (APPLE AND BUNDLE_APP)
|
|||||||
|
|
||||||
include(CPack)
|
include(CPack)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(APPLE AND NOT BUNDLE_APP)
|
IF(APPLE AND NOT BUNDLE_APP)
|
||||||
IF (NOT CMAKE_INSTALL_PREFIX)
|
IF (NOT CMAKE_INSTALL_PREFIX)
|
||||||
SET(CMAKE_INSTALL_PREFIX "/usr/")
|
SET(CMAKE_INSTALL_PREFIX "/usr/")
|
||||||
@ -798,28 +856,35 @@ IF (WIN32 AND NOT BUILD_INSTALLER)
|
|||||||
INSTALL(FILES
|
INSTALL(FILES
|
||||||
${CUBICSDR_FONTS}
|
${CUBICSDR_FONTS}
|
||||||
DESTINATION share/cubicsdr/fonts)
|
DESTINATION share/cubicsdr/fonts)
|
||||||
|
|
||||||
|
IF (CUBICSDR_HAS_HEADER_IMAGE)
|
||||||
|
INSTALL(FILES
|
||||||
|
${CUBICSDR_HEADER_IMAGE}
|
||||||
|
DESTINATION share/cubicsdr/)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF (WIN32 AND BUILD_INSTALLER)
|
IF (WIN32 AND BUILD_INSTALLER)
|
||||||
set(BUNDLE_SOAPY_MODS OFF CACHE BOOL "Bundle local SoapySDR modules")
|
set(BUNDLE_SOAPY_MODS OFF CACHE BOOL "Bundle local SoapySDR modules")
|
||||||
|
|
||||||
set(CPACK_GENERATOR NSIS)
|
set(CPACK_GENERATOR NSIS)
|
||||||
set(CPACK_PACKAGE_NAME "CubicSDR")
|
set(CPACK_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME}")
|
||||||
|
set(CPACK_NSIS_DISPLAY_NAME "${CUBICSDR_INSTALL_TITLE}")
|
||||||
set(CPACK_PACKAGE_VENDOR "cubicsdr.com")
|
set(CPACK_PACKAGE_VENDOR "cubicsdr.com")
|
||||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CubicSDR ${CUBICSDR_VERSION} Installer")
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CUBICSDR_INSTALL_NAME}")
|
||||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CubicSDR")
|
|
||||||
SET(CPACK_NSIS_INSTALLED_ICON_NAME "CubicSDR.ico")
|
SET(CPACK_NSIS_INSTALLED_ICON_NAME "CubicSDR.ico")
|
||||||
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
||||||
set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/icon\\\\NSIS_Header.bmp")
|
set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/icon\\\\NSIS_Header.bmp")
|
||||||
IF(EX_PLATFORM EQUAL 64)
|
IF(EX_PLATFORM EQUAL 64)
|
||||||
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
|
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
|
||||||
SET(CPACK_NSIS_PACKAGE_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY}")
|
SET(CPACK_NSIS_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME}")
|
||||||
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}")
|
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CUBICSDR_INSTALL_NAME} ${CPACK_PACKAGE_VERSION}")
|
||||||
set(CMAKE_CL_64 TRUE) # This gets around a bug in the CPack installer name generation for MinGW 64-bit since 2.8
|
set(CMAKE_CL_64 TRUE) # This gets around a bug in the CPack installer name generation for MinGW 64-bit since 2.8
|
||||||
ELSE(EX_PLATFORM EQUAL 64)
|
ELSE(EX_PLATFORM EQUAL 64)
|
||||||
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
|
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
|
||||||
SET(CPACK_NSIS_PACKAGE_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} (x86)")
|
SET(CPACK_NSIS_PACKAGE_NAME "${CUBICSDR_INSTALL_NAME} (x86)")
|
||||||
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION} (x86)")
|
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CUBICSDR_INSTALL_NAME} ${CPACK_PACKAGE_VERSION} (x86)")
|
||||||
set(CMAKE_CL_64 FALSE)
|
set(CMAKE_CL_64 FALSE)
|
||||||
ENDIF(EX_PLATFORM EQUAL 64)
|
ENDIF(EX_PLATFORM EQUAL 64)
|
||||||
|
|
||||||
@ -834,6 +899,12 @@ IF (WIN32 AND BUILD_INSTALLER)
|
|||||||
install(FILES
|
install(FILES
|
||||||
${CUBICSDR_FONTS}
|
${CUBICSDR_FONTS}
|
||||||
DESTINATION fonts)
|
DESTINATION fonts)
|
||||||
|
|
||||||
|
IF (CUBICSDR_HAS_HEADER_IMAGE)
|
||||||
|
INSTALL(FILES
|
||||||
|
${CUBICSDR_HEADER_IMAGE}
|
||||||
|
DESTINATION .)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(USE_HAMLIB)
|
IF(USE_HAMLIB)
|
||||||
FOREACH(HAMLIB_DLL ${HAMLIB_DLLS})
|
FOREACH(HAMLIB_DLL ${HAMLIB_DLLS})
|
||||||
@ -946,6 +1017,13 @@ IF(UNIX AND NOT APPLE AND NOT BUILD_DEB)
|
|||||||
${CUBICSDR_FONTS}
|
${CUBICSDR_FONTS}
|
||||||
DESTINATION share/cubicsdr/fonts)
|
DESTINATION share/cubicsdr/fonts)
|
||||||
|
|
||||||
|
|
||||||
|
IF (CUBICSDR_HAS_HEADER_IMAGE)
|
||||||
|
INSTALL(FILES
|
||||||
|
${CUBICSDR_HEADER_IMAGE}
|
||||||
|
DESTINATION share/cubicsdr)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/CubicSDR.desktop"
|
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/CubicSDR.desktop"
|
||||||
DESTINATION share/applications)
|
DESTINATION share/applications)
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ long long DeviceConfig::getOffset() {
|
|||||||
return offset.load();
|
return offset.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DeviceConfig::setSampleRate(long srate) {
|
void DeviceConfig::setSampleRate(long srate) {
|
||||||
sampleRate.store(srate);
|
sampleRate.store(srate);
|
||||||
}
|
}
|
||||||
@ -289,6 +288,7 @@ AppConfig::AppConfig() : configName("") {
|
|||||||
centerFreq.store(100000000);
|
centerFreq.store(100000000);
|
||||||
waterfallLinesPerSec.store(DEFAULT_WATERFALL_LPS);
|
waterfallLinesPerSec.store(DEFAULT_WATERFALL_LPS);
|
||||||
spectrumAvgSpeed.store(0.65f);
|
spectrumAvgSpeed.store(0.65f);
|
||||||
|
dbOffset.store(0);
|
||||||
modemPropsCollapsed.store(false);
|
modemPropsCollapsed.store(false);
|
||||||
#ifdef USE_HAMLIB
|
#ifdef USE_HAMLIB
|
||||||
rigEnabled.store(false);
|
rigEnabled.store(false);
|
||||||
@ -425,6 +425,14 @@ float AppConfig::getSpectrumAvgSpeed() {
|
|||||||
return spectrumAvgSpeed.load();
|
return spectrumAvgSpeed.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AppConfig::setDBOffset(int offset) {
|
||||||
|
this->dbOffset.store(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
int AppConfig::getDBOffset() {
|
||||||
|
return dbOffset.load();
|
||||||
|
}
|
||||||
|
|
||||||
void AppConfig::setManualDevices(std::vector<SDRManualDef> manuals) {
|
void AppConfig::setManualDevices(std::vector<SDRManualDef> manuals) {
|
||||||
manualDevices = manuals;
|
manualDevices = manuals;
|
||||||
}
|
}
|
||||||
@ -478,6 +486,7 @@ bool AppConfig::save() {
|
|||||||
*window_node->newChild("waterfall_lps") = waterfallLinesPerSec.load();
|
*window_node->newChild("waterfall_lps") = waterfallLinesPerSec.load();
|
||||||
*window_node->newChild("spectrum_avg") = spectrumAvgSpeed.load();
|
*window_node->newChild("spectrum_avg") = spectrumAvgSpeed.load();
|
||||||
*window_node->newChild("modemprops_collapsed") = modemPropsCollapsed.load();;
|
*window_node->newChild("modemprops_collapsed") = modemPropsCollapsed.load();;
|
||||||
|
*window_node->newChild("db_offset") = dbOffset.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
DataNode *devices_node = cfg.rootNode()->newChild("devices");
|
DataNode *devices_node = cfg.rootNode()->newChild("devices");
|
||||||
@ -628,6 +637,13 @@ bool AppConfig::load() {
|
|||||||
win_node->getNext("modemprops_collapsed")->element()->get(mpc);
|
win_node->getNext("modemprops_collapsed")->element()->get(mpc);
|
||||||
modemPropsCollapsed.store(mpc?true:false);
|
modemPropsCollapsed.store(mpc?true:false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (win_node->hasAnother("db_offset")) {
|
||||||
|
DataNode *offset_node = win_node->getNext("db_offset");
|
||||||
|
int offsetValue = 0;
|
||||||
|
offset_node->element()->get(offsetValue);
|
||||||
|
setDBOffset(offsetValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg.rootNode()->hasAnother("devices")) {
|
if (cfg.rootNode()->hasAnother("devices")) {
|
||||||
|
@ -112,6 +112,9 @@ public:
|
|||||||
void setSpectrumAvgSpeed(float avgSpeed);
|
void setSpectrumAvgSpeed(float avgSpeed);
|
||||||
float getSpectrumAvgSpeed();
|
float getSpectrumAvgSpeed();
|
||||||
|
|
||||||
|
void setDBOffset(int offset);
|
||||||
|
int getDBOffset();
|
||||||
|
|
||||||
void setManualDevices(std::vector<SDRManualDef> manuals);
|
void setManualDevices(std::vector<SDRManualDef> manuals);
|
||||||
std::vector<SDRManualDef> getManualDevices();
|
std::vector<SDRManualDef> getManualDevices();
|
||||||
|
|
||||||
@ -158,6 +161,7 @@ private:
|
|||||||
std::atomic_llong centerFreq;
|
std::atomic_llong centerFreq;
|
||||||
std::atomic_int waterfallLinesPerSec;
|
std::atomic_int waterfallLinesPerSec;
|
||||||
std::atomic<float> spectrumAvgSpeed;
|
std::atomic<float> spectrumAvgSpeed;
|
||||||
|
std::atomic_int dbOffset;
|
||||||
std::vector<SDRManualDef> manualDevices;
|
std::vector<SDRManualDef> manualDevices;
|
||||||
#if USE_HAMLIB
|
#if USE_HAMLIB
|
||||||
std::atomic_int rigModel, rigRate;
|
std::atomic_int rigModel, rigRate;
|
||||||
|
174
src/AppFrame.cpp
174
src/AppFrame.cpp
@ -20,6 +20,7 @@
|
|||||||
#include "DataTree.h"
|
#include "DataTree.h"
|
||||||
#include "ColorTheme.h"
|
#include "ColorTheme.h"
|
||||||
#include "DemodulatorMgr.h"
|
#include "DemodulatorMgr.h"
|
||||||
|
#include "ImagePanel.h"
|
||||||
|
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
@ -43,6 +44,10 @@ wxEND_EVENT_TABLE()
|
|||||||
#include "RigThread.h"
|
#include "RigThread.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* split a string by 'seperator' into a vector of string */
|
||||||
|
std::vector<std::string> str_explode(const std::string &seperator, const std::string &in_str);
|
||||||
|
|
||||||
#define APPFRAME_MODEMPROPS_MINSIZE 20
|
#define APPFRAME_MODEMPROPS_MINSIZE 20
|
||||||
#define APPFRAME_MODEMPROPS_MAXSIZE 240
|
#define APPFRAME_MODEMPROPS_MAXSIZE 240
|
||||||
|
|
||||||
@ -54,7 +59,6 @@ AppFrame::AppFrame() :
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
|
||||||
wxBoxSizer *demodVisuals = new wxBoxSizer(wxVERTICAL);
|
|
||||||
demodTray = new wxBoxSizer(wxHORIZONTAL);
|
demodTray = new wxBoxSizer(wxHORIZONTAL);
|
||||||
wxBoxSizer *demodScopeTray = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer *demodScopeTray = new wxBoxSizer(wxVERTICAL);
|
||||||
wxBoxSizer *demodTunerTray = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *demodTunerTray = new wxBoxSizer(wxHORIZONTAL);
|
||||||
@ -69,6 +73,25 @@ AppFrame::AppFrame() :
|
|||||||
mainSplitter->SetMinimumPaneSize(1);
|
mainSplitter->SetMinimumPaneSize(1);
|
||||||
|
|
||||||
wxPanel *demodPanel = new wxPanel(mainSplitter, wxID_ANY);
|
wxPanel *demodPanel = new wxPanel(mainSplitter, wxID_ANY);
|
||||||
|
|
||||||
|
#ifdef CUBICSDR_HEADER_IMAGE
|
||||||
|
wxFileName exePath = wxFileName(wxStandardPaths::Get().GetExecutablePath());
|
||||||
|
std::string headerPath = exePath.GetPath().ToStdString();
|
||||||
|
headerPath += filePathSeparator + std::string("" CUBICSDR_HEADER_IMAGE);
|
||||||
|
wxInitAllImageHandlers();
|
||||||
|
|
||||||
|
ImagePanel *imgPanel = new ImagePanel(demodPanel, headerPath, wxBITMAP_TYPE_ANY);
|
||||||
|
|
||||||
|
std::string headerBgColor = "" CUBICSDR_HEADER_BG;
|
||||||
|
if (headerBgColor != "") {
|
||||||
|
imgPanel->SetBackgroundColour(wxColour(headerBgColor));
|
||||||
|
}
|
||||||
|
|
||||||
|
imgPanel->SetBestFittingSize(wxSize(200, 0));
|
||||||
|
|
||||||
|
demodTray->Add(imgPanel, 0, wxEXPAND | wxALL, 0);
|
||||||
|
demodTray->AddSpacer(1);
|
||||||
|
#endif
|
||||||
|
|
||||||
gainCanvas = new GainCanvas(demodPanel, attribList);
|
gainCanvas = new GainCanvas(demodPanel, attribList);
|
||||||
|
|
||||||
@ -77,16 +100,24 @@ AppFrame::AppFrame() :
|
|||||||
gainSpacerItem = demodTray->AddSpacer(1);
|
gainSpacerItem = demodTray->AddSpacer(1);
|
||||||
gainSpacerItem->Show(false);
|
gainSpacerItem->Show(false);
|
||||||
|
|
||||||
|
std::string modemListArr[] = { "FM", "FMS", "NBFM", "AM", "LSB", "USB", "DSB", "I/Q" };
|
||||||
|
std::vector<std::string> modemList( modemListArr, modemListArr + 8 );
|
||||||
|
|
||||||
|
#ifdef CUBICSDR_MODEM_EXCLUDE
|
||||||
|
std::string excludeListStr = "" CUBICSDR_MODEM_EXCLUDE;
|
||||||
|
std::vector<std::string> excludeList = str_explode(",",excludeListStr);
|
||||||
|
for (auto ex_i : excludeList) {
|
||||||
|
std::vector<std::string>::iterator found_i = std::find(modemList.begin(),modemList.end(),ex_i);
|
||||||
|
if (found_i != modemList.end()) {
|
||||||
|
modemList.erase(found_i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
demodModeSelector = new ModeSelectorCanvas(demodPanel, attribList);
|
demodModeSelector = new ModeSelectorCanvas(demodPanel, attribList);
|
||||||
demodModeSelector->addChoice("FM");
|
for (auto mt_i : modemList) {
|
||||||
demodModeSelector->addChoice("FMS");
|
demodModeSelector->addChoice(mt_i);
|
||||||
demodModeSelector->addChoice("NBFM");
|
}
|
||||||
demodModeSelector->addChoice("AM");
|
|
||||||
demodModeSelector->addChoice("LSB");
|
|
||||||
demodModeSelector->addChoice("USB");
|
|
||||||
demodModeSelector->addChoice("DSB");
|
|
||||||
demodModeSelector->addChoice("I/Q");
|
|
||||||
demodModeSelector->setSelection("FM");
|
|
||||||
demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation (Hotkey F), Amplitude Modulation (A) and Lower (L), Upper (U), Double Side-Band and more.");
|
demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation (Hotkey F), Amplitude Modulation (A) and Lower (L), Upper (U), Double Side-Band and more.");
|
||||||
demodModeSelector->SetMinSize(wxSize(50,-1));
|
demodModeSelector->SetMinSize(wxSize(50,-1));
|
||||||
demodModeSelector->SetMaxSize(wxSize(50,-1));
|
demodModeSelector->SetMaxSize(wxSize(50,-1));
|
||||||
@ -117,13 +148,19 @@ AppFrame::AppFrame() :
|
|||||||
modemProps->SetMinSize(wxSize(APPFRAME_MODEMPROPS_MAXSIZE,-1));
|
modemProps->SetMinSize(wxSize(APPFRAME_MODEMPROPS_MAXSIZE,-1));
|
||||||
modemProps->SetMaxSize(wxSize(APPFRAME_MODEMPROPS_MAXSIZE,-1));
|
modemProps->SetMaxSize(wxSize(APPFRAME_MODEMPROPS_MAXSIZE,-1));
|
||||||
|
|
||||||
modemProps->Hide();
|
ModemArgInfoList dummyInfo;
|
||||||
|
modemProps->initProperties(dummyInfo, nullptr);
|
||||||
|
modemProps->updateTheme();
|
||||||
|
|
||||||
demodTray->Add(modemProps, 15, wxEXPAND | wxALL, 0);
|
demodTray->Add(modemProps, 15, wxEXPAND | wxALL, 0);
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
demodTray->AddSpacer(1);
|
demodTray->AddSpacer(1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CUBICSDR_ENABLE_VIEW_DEMOD
|
||||||
|
wxBoxSizer *demodVisuals = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
wxGetApp().getDemodSpectrumProcessor()->setup(1024);
|
wxGetApp().getDemodSpectrumProcessor()->setup(1024);
|
||||||
demodSpectrumCanvas = new SpectrumCanvas(demodPanel, attribList);
|
demodSpectrumCanvas = new SpectrumCanvas(demodPanel, attribList);
|
||||||
demodSpectrumCanvas->setView(wxGetApp().getConfig()->getCenterFreq(), 300000);
|
demodSpectrumCanvas->setView(wxGetApp().getConfig()->getCenterFreq(), 300000);
|
||||||
@ -147,7 +184,11 @@ AppFrame::AppFrame() :
|
|||||||
demodTray->Add(demodVisuals, 30, wxEXPAND | wxALL, 0);
|
demodTray->Add(demodVisuals, 30, wxEXPAND | wxALL, 0);
|
||||||
|
|
||||||
demodTray->AddSpacer(1);
|
demodTray->AddSpacer(1);
|
||||||
|
#else
|
||||||
|
demodSpectrumCanvas = nullptr;
|
||||||
|
demodWaterfallCanvas = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
demodSignalMeter = new MeterCanvas(demodPanel, attribList);
|
demodSignalMeter = new MeterCanvas(demodPanel, attribList);
|
||||||
demodSignalMeter->setMax(DEMOD_SIGNAL_MAX);
|
demodSignalMeter->setMax(DEMOD_SIGNAL_MAX);
|
||||||
demodSignalMeter->setMin(DEMOD_SIGNAL_MIN);
|
demodSignalMeter->setMin(DEMOD_SIGNAL_MIN);
|
||||||
@ -160,6 +201,7 @@ AppFrame::AppFrame() :
|
|||||||
|
|
||||||
demodTray->AddSpacer(1);
|
demodTray->AddSpacer(1);
|
||||||
|
|
||||||
|
#if CUBICSDR_ENABLE_VIEW_SCOPE
|
||||||
scopeCanvas = new ScopeCanvas(demodPanel, attribList);
|
scopeCanvas = new ScopeCanvas(demodPanel, attribList);
|
||||||
scopeCanvas->setHelpTip("Audio Visuals, drag left/right to toggle Scope or Spectrum.");
|
scopeCanvas->setHelpTip("Audio Visuals, drag left/right to toggle Scope or Spectrum.");
|
||||||
scopeCanvas->SetMinSize(wxSize(128,-1));
|
scopeCanvas->SetMinSize(wxSize(128,-1));
|
||||||
@ -168,7 +210,10 @@ AppFrame::AppFrame() :
|
|||||||
wxGetApp().getScopeProcessor()->attachOutput(scopeCanvas->getInputQueue());
|
wxGetApp().getScopeProcessor()->attachOutput(scopeCanvas->getInputQueue());
|
||||||
|
|
||||||
demodScopeTray->AddSpacer(1);
|
demodScopeTray->AddSpacer(1);
|
||||||
|
#else
|
||||||
|
scopeCanvas = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
deltaLockButton = new ModeSelectorCanvas(demodPanel, attribList);
|
deltaLockButton = new ModeSelectorCanvas(demodPanel, attribList);
|
||||||
deltaLockButton->addChoice(1, "V");
|
deltaLockButton->addChoice(1, "V");
|
||||||
deltaLockButton->setPadding(-1,-1);
|
deltaLockButton->setPadding(-1,-1);
|
||||||
@ -248,6 +293,7 @@ AppFrame::AppFrame() :
|
|||||||
wxGetApp().getSpectrumProcessor()->setup(2048);
|
wxGetApp().getSpectrumProcessor()->setup(2048);
|
||||||
spectrumCanvas = new SpectrumCanvas(spectrumPanel, attribList);
|
spectrumCanvas = new SpectrumCanvas(spectrumPanel, attribList);
|
||||||
spectrumCanvas->setShowDb(true);
|
spectrumCanvas->setShowDb(true);
|
||||||
|
spectrumCanvas->setUseDBOfs(true);
|
||||||
spectrumCanvas->setScaleFactorEnabled(true);
|
spectrumCanvas->setScaleFactorEnabled(true);
|
||||||
wxGetApp().getSpectrumProcessor()->attachOutput(spectrumCanvas->getVisualDataQueue());
|
wxGetApp().getSpectrumProcessor()->attachOutput(spectrumCanvas->getVisualDataQueue());
|
||||||
|
|
||||||
@ -659,6 +705,7 @@ void AppFrame::updateDeviceParams() {
|
|||||||
|
|
||||||
newSettingsMenu->AppendSeparator();
|
newSettingsMenu->AppendSeparator();
|
||||||
|
|
||||||
|
newSettingsMenu->Append(wxID_SET_DB_OFFSET, "Power Level Offset");
|
||||||
newSettingsMenu->Append(wxID_SET_FREQ_OFFSET, "Frequency Offset");
|
newSettingsMenu->Append(wxID_SET_FREQ_OFFSET, "Frequency Offset");
|
||||||
|
|
||||||
if (devInfo->hasCORR(SOAPY_SDR_RX, 0)) {
|
if (devInfo->hasCORR(SOAPY_SDR_RX, 0)) {
|
||||||
@ -874,6 +921,12 @@ void AppFrame::OnMenu(wxCommandEvent& event) {
|
|||||||
if (ofs != -1) {
|
if (ofs != -1) {
|
||||||
wxGetApp().setOffset(ofs);
|
wxGetApp().setOffset(ofs);
|
||||||
}
|
}
|
||||||
|
} else if (event.GetId() == wxID_SET_DB_OFFSET) {
|
||||||
|
long ofs = wxGetNumberFromUser("Shift the displayed RF power level by this amount.\ni.e. -30 for -30 dB", "Decibels (dB)",
|
||||||
|
"Power Level Offset", wxGetApp().getConfig()->getDBOffset(), -1000, 1000, this);
|
||||||
|
if (ofs != -1) {
|
||||||
|
wxGetApp().getConfig()->setDBOffset(ofs);
|
||||||
|
}
|
||||||
} else if (event.GetId() == wxID_AGC_CONTROL) {
|
} else if (event.GetId() == wxID_AGC_CONTROL) {
|
||||||
if (wxGetApp().getDevice() == NULL) {
|
if (wxGetApp().getDevice() == NULL) {
|
||||||
agcMenuItem->Check(true);
|
agcMenuItem->Check(true);
|
||||||
@ -1220,8 +1273,10 @@ void AppFrame::OnMenu(wxCommandEvent& event) {
|
|||||||
void AppFrame::OnClose(wxCloseEvent& event) {
|
void AppFrame::OnClose(wxCloseEvent& event) {
|
||||||
wxGetApp().closeDeviceSelector();
|
wxGetApp().closeDeviceSelector();
|
||||||
|
|
||||||
wxGetApp().getDemodSpectrumProcessor()->removeOutput(demodSpectrumCanvas->getVisualDataQueue());
|
if (wxGetApp().getDemodSpectrumProcessor()) {
|
||||||
wxGetApp().getDemodSpectrumProcessor()->removeOutput(demodWaterfallCanvas->getVisualDataQueue());
|
wxGetApp().getDemodSpectrumProcessor()->removeOutput(demodSpectrumCanvas->getVisualDataQueue());
|
||||||
|
wxGetApp().getDemodSpectrumProcessor()->removeOutput(demodWaterfallCanvas->getVisualDataQueue());
|
||||||
|
}
|
||||||
wxGetApp().getSpectrumProcessor()->removeOutput(spectrumCanvas->getVisualDataQueue());
|
wxGetApp().getSpectrumProcessor()->removeOutput(spectrumCanvas->getVisualDataQueue());
|
||||||
|
|
||||||
wxGetApp().getConfig()->setWindow(this->GetPosition(), this->GetClientSize());
|
wxGetApp().getConfig()->setWindow(this->GetPosition(), this->GetClientSize());
|
||||||
@ -1252,6 +1307,7 @@ void AppFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event)) {
|
|||||||
new AppFrame();
|
new AppFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void AppFrame::OnThread(wxCommandEvent& event) {
|
void AppFrame::OnThread(wxCommandEvent& event) {
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
@ -1292,7 +1348,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
demodGainMeter->setInputValue(demod->getGain());
|
demodGainMeter->setInputValue(demod->getGain());
|
||||||
wxGetApp().getDemodMgr().setLastGain(demod->getGain());
|
wxGetApp().getDemodMgr().setLastGain(demod->getGain());
|
||||||
int outputDevice = demod->getOutputDevice();
|
int outputDevice = demod->getOutputDevice();
|
||||||
scopeCanvas->setDeviceName(outputDevices[outputDevice].name);
|
if (scopeCanvas) scopeCanvas->setDeviceName(outputDevices[outputDevice].name);
|
||||||
// outputDeviceMenuItems[outputDevice]->Check(true);
|
// outputDeviceMenuItems[outputDevice]->Check(true);
|
||||||
std::string dType = demod->getDemodulatorType();
|
std::string dType = demod->getDemodulatorType();
|
||||||
demodModeSelector->setSelection(dType);
|
demodModeSelector->setSelection(dType);
|
||||||
@ -1304,7 +1360,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
modemPropertiesUpdated.store(true);
|
modemPropertiesUpdated.store(true);
|
||||||
demodTuner->setHalfBand(dType=="USB" || dType=="LSB");
|
demodTuner->setHalfBand(dType=="USB" || dType=="LSB");
|
||||||
}
|
}
|
||||||
if (demodWaterfallCanvas->getDragState() == WaterfallCanvas::WF_DRAG_NONE) {
|
if (!demodWaterfallCanvas || demodWaterfallCanvas->getDragState() == WaterfallCanvas::WF_DRAG_NONE) {
|
||||||
long long centerFreq = demod->getFrequency();
|
long long centerFreq = demod->getFrequency();
|
||||||
unsigned int demodBw = (unsigned int) ceil((float) demod->getBandwidth() * 2.25);
|
unsigned int demodBw = (unsigned int) ceil((float) demod->getBandwidth() * 2.25);
|
||||||
|
|
||||||
@ -1325,7 +1381,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
demodBw = 20000;
|
demodBw = 20000;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (centerFreq != demodWaterfallCanvas->getCenterFrequency()) {
|
if (demodWaterfallCanvas && centerFreq != demodWaterfallCanvas->getCenterFrequency()) {
|
||||||
demodWaterfallCanvas->setCenterFrequency(centerFreq);
|
demodWaterfallCanvas->setCenterFrequency(centerFreq);
|
||||||
demodSpectrumCanvas->setCenterFrequency(centerFreq);
|
demodSpectrumCanvas->setCenterFrequency(centerFreq);
|
||||||
}
|
}
|
||||||
@ -1411,8 +1467,10 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
demodWaterfallCanvas->setBandwidth(demodBw);
|
if (demodWaterfallCanvas) {
|
||||||
demodSpectrumCanvas->setBandwidth(demodBw);
|
demodWaterfallCanvas->setBandwidth(demodBw);
|
||||||
|
demodSpectrumCanvas->setBandwidth(demodBw);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
demodSignalMeter->setLevel(demod->getSignalLevel());
|
demodSignalMeter->setLevel(demod->getSignalLevel());
|
||||||
@ -1468,9 +1526,9 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
demodGainMeter->setLevel(demodGainMeter->getInputValue());
|
demodGainMeter->setLevel(demodGainMeter->getInputValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wxGetApp().getFrequency() != demodWaterfallCanvas->getCenterFrequency()) {
|
if (demodWaterfallCanvas && wxGetApp().getFrequency() != demodWaterfallCanvas->getCenterFrequency()) {
|
||||||
demodWaterfallCanvas->setCenterFrequency(wxGetApp().getFrequency());
|
demodWaterfallCanvas->setCenterFrequency(wxGetApp().getFrequency());
|
||||||
demodSpectrumCanvas->setCenterFrequency(wxGetApp().getFrequency());
|
if (demodSpectrumCanvas) demodSpectrumCanvas->setCenterFrequency(wxGetApp().getFrequency());
|
||||||
}
|
}
|
||||||
if (spectrumCanvas->getViewState() && abs(wxGetApp().getFrequency()-spectrumCanvas->getCenterFrequency()) > (wxGetApp().getSampleRate()/2)) {
|
if (spectrumCanvas->getViewState() && abs(wxGetApp().getFrequency()-spectrumCanvas->getCenterFrequency()) > (wxGetApp().getSampleRate()/2)) {
|
||||||
spectrumCanvas->setCenterFrequency(wxGetApp().getFrequency());
|
spectrumCanvas->setCenterFrequency(wxGetApp().getFrequency());
|
||||||
@ -1487,15 +1545,17 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scopeCanvas->setPPMMode(demodTuner->isAltDown());
|
if (scopeCanvas) {
|
||||||
|
scopeCanvas->setPPMMode(demodTuner->isAltDown());
|
||||||
|
|
||||||
|
scopeCanvas->setShowDb(spectrumCanvas->getShowDb());
|
||||||
|
wxGetApp().getScopeProcessor()->setScopeEnabled(scopeCanvas->scopeVisible());
|
||||||
|
wxGetApp().getScopeProcessor()->setSpectrumEnabled(scopeCanvas->spectrumVisible());
|
||||||
|
wxGetApp().getAudioVisualQueue()->set_max_num_items((scopeCanvas->scopeVisible()?1:0) + (scopeCanvas->spectrumVisible()?1:0));
|
||||||
|
|
||||||
|
wxGetApp().getScopeProcessor()->run();
|
||||||
|
}
|
||||||
|
|
||||||
scopeCanvas->setShowDb(spectrumCanvas->getShowDb());
|
|
||||||
wxGetApp().getScopeProcessor()->setScopeEnabled(scopeCanvas->scopeVisible());
|
|
||||||
wxGetApp().getScopeProcessor()->setSpectrumEnabled(scopeCanvas->spectrumVisible());
|
|
||||||
wxGetApp().getAudioVisualQueue()->set_max_num_items((scopeCanvas->scopeVisible()?1:0) + (scopeCanvas->spectrumVisible()?1:0));
|
|
||||||
|
|
||||||
wxGetApp().getScopeProcessor()->run();
|
|
||||||
|
|
||||||
SpectrumVisualProcessor *proc = wxGetApp().getSpectrumProcessor();
|
SpectrumVisualProcessor *proc = wxGetApp().getSpectrumProcessor();
|
||||||
|
|
||||||
if (spectrumAvgMeter->inputChanged()) {
|
if (spectrumAvgMeter->inputChanged()) {
|
||||||
@ -1513,9 +1573,11 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SpectrumVisualProcessor *dproc = wxGetApp().getDemodSpectrumProcessor();
|
SpectrumVisualProcessor *dproc = wxGetApp().getDemodSpectrumProcessor();
|
||||||
|
|
||||||
dproc->setView(demodWaterfallCanvas->getViewState(), demodWaterfallCanvas->getCenterFrequency(),demodWaterfallCanvas->getBandwidth());
|
|
||||||
|
|
||||||
|
if (dproc) {
|
||||||
|
dproc->setView(demodWaterfallCanvas->getViewState(), demodWaterfallCanvas->getCenterFrequency(),demodWaterfallCanvas->getBandwidth());
|
||||||
|
}
|
||||||
|
|
||||||
SpectrumVisualProcessor *wproc = waterfallDataThread->getProcessor();
|
SpectrumVisualProcessor *wproc = waterfallDataThread->getProcessor();
|
||||||
|
|
||||||
if (waterfallSpeedMeter->inputChanged()) {
|
if (waterfallSpeedMeter->inputChanged()) {
|
||||||
@ -1547,13 +1609,15 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
ModemDigitalOutputConsole *outp = (ModemDigitalOutputConsole *)demod->getOutput();
|
ModemDigitalOutputConsole *outp = (ModemDigitalOutputConsole *)demod->getOutput();
|
||||||
if (!outp->getDialog()) {
|
if (!outp->getDialog()) {
|
||||||
outp->setTitle(demod->getDemodulatorType() + ": " + frequencyToStr(demod->getFrequency()));
|
outp->setTitle(demod->getDemodulatorType() + ": " + frequencyToStr(demod->getFrequency()));
|
||||||
outp->setDialog(new DigitalConsole(this, outp));
|
outp->setDialog(new DigitalConsole(this, outp)) ;
|
||||||
}
|
}
|
||||||
demod->showOutput();
|
demod->showOutput();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else if (!demod) {
|
} else if (!demod && modemPropertiesUpdated.load()) {
|
||||||
modemProps->Hide();
|
ModemArgInfoList dummyInfo;
|
||||||
|
modemProps->initProperties(dummyInfo, nullptr);
|
||||||
|
modemProps->updateTheme();
|
||||||
demodTray->Layout();
|
demodTray->Layout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1574,7 +1638,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
wxGetApp().getSpectrumProcessor()->setPeakHold(peakHoldMode == 1);
|
wxGetApp().getSpectrumProcessor()->setPeakHold(peakHoldMode == 1);
|
||||||
|
|
||||||
//make the peak hold act on the current dmod also, like a zoomed-in version.
|
//make the peak hold act on the current dmod also, like a zoomed-in version.
|
||||||
wxGetApp().getDemodSpectrumProcessor()->setPeakHold(peakHoldMode == 1);
|
if (wxGetApp().getDemodSpectrumProcessor()) wxGetApp().getDemodSpectrumProcessor()->setPeakHold(peakHoldMode == 1);
|
||||||
peakHoldButton->clearModeChanged();
|
peakHoldButton->clearModeChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1588,7 +1652,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (scopeCanvas->HasFocus()) {
|
if (scopeCanvas && scopeCanvas->HasFocus()) {
|
||||||
waterfallCanvas->SetFocus();
|
waterfallCanvas->SetFocus();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1820,7 +1884,7 @@ void AppFrame::setMainWaterfallFFTSize(int fftSize) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AppFrame::setScopeDeviceName(std::string deviceName) {
|
void AppFrame::setScopeDeviceName(std::string deviceName) {
|
||||||
scopeCanvas->setDeviceName(deviceName);
|
if (scopeCanvas) scopeCanvas->setDeviceName(deviceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1832,7 +1896,7 @@ void AppFrame::refreshGainUI() {
|
|||||||
bool AppFrame::isUserDemodBusy() {
|
bool AppFrame::isUserDemodBusy() {
|
||||||
return (modemProps && modemProps->isMouseInView())
|
return (modemProps && modemProps->isMouseInView())
|
||||||
|| (waterfallCanvas->isMouseInView() && waterfallCanvas->isMouseDown())
|
|| (waterfallCanvas->isMouseInView() && waterfallCanvas->isMouseDown())
|
||||||
|| (demodWaterfallCanvas->isMouseInView() && demodWaterfallCanvas->isMouseDown())
|
|| (demodWaterfallCanvas && demodWaterfallCanvas->isMouseInView() && demodWaterfallCanvas->isMouseDown())
|
||||||
|| (wxGetApp().getDemodMgr().getLastActiveDemodulator() &&
|
|| (wxGetApp().getDemodMgr().getLastActiveDemodulator() &&
|
||||||
wxGetApp().getDemodMgr().getActiveDemodulator() &&
|
wxGetApp().getDemodMgr().getActiveDemodulator() &&
|
||||||
wxGetApp().getDemodMgr().getLastActiveDemodulator() != wxGetApp().getDemodMgr().getActiveDemodulator());
|
wxGetApp().getDemodMgr().getLastActiveDemodulator() != wxGetApp().getDemodMgr().getActiveDemodulator());
|
||||||
@ -2082,7 +2146,7 @@ int AppFrame::OnGlobalKeyUp(wxKeyEvent &event) {
|
|||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
wxGetApp().getSpectrumProcessor()->setPeakHold(!wxGetApp().getSpectrumProcessor()->getPeakHold());
|
wxGetApp().getSpectrumProcessor()->setPeakHold(!wxGetApp().getSpectrumProcessor()->getPeakHold());
|
||||||
wxGetApp().getDemodSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold());
|
if (wxGetApp().getDemodSpectrumProcessor()) wxGetApp().getDemodSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold());
|
||||||
peakHoldButton->setSelection(wxGetApp().getSpectrumProcessor()->getPeakHold()?1:0);
|
peakHoldButton->setSelection(wxGetApp().getSpectrumProcessor()->getPeakHold()?1:0);
|
||||||
peakHoldButton->clearModeChanged();
|
peakHoldButton->clearModeChanged();
|
||||||
break;
|
break;
|
||||||
@ -2133,3 +2197,31 @@ void AppFrame::setViewState(long long center_freq) {
|
|||||||
spectrumCanvas->disableView();
|
spectrumCanvas->disableView();
|
||||||
waterfallCanvas->disableView();
|
waterfallCanvas->disableView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* split a string by 'seperator' into a vector of string */
|
||||||
|
std::vector<std::string> str_explode(const std::string &seperator, const std::string &in_str)
|
||||||
|
{
|
||||||
|
std::vector<std::string> vect_out;
|
||||||
|
|
||||||
|
int i = 0, j = 0;
|
||||||
|
int seperator_len = seperator.length();
|
||||||
|
int str_len = in_str.length();
|
||||||
|
|
||||||
|
while(i < str_len)
|
||||||
|
{
|
||||||
|
j = in_str.find_first_of(seperator,i);
|
||||||
|
|
||||||
|
if (j == std::string::npos && i < str_len) j = str_len;
|
||||||
|
|
||||||
|
if (j == std::string::npos) break;
|
||||||
|
|
||||||
|
vect_out.push_back(in_str.substr(i,j-i));
|
||||||
|
|
||||||
|
i = j;
|
||||||
|
|
||||||
|
i+=seperator_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vect_out;
|
||||||
|
}
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#include <wx/panel.h>
|
#include <wx/panel.h>
|
||||||
#include <wx/splitter.h>
|
#include <wx/splitter.h>
|
||||||
#include <wx/sizer.h>
|
#include <wx/sizer.h>
|
||||||
|
#include <wx/bitmap.h>
|
||||||
|
#include <wx/statbmp.h>
|
||||||
|
|
||||||
#include "PrimaryGLContext.h"
|
#include "PrimaryGLContext.h"
|
||||||
|
|
||||||
@ -33,6 +35,7 @@
|
|||||||
#define wxID_AGC_CONTROL 2009
|
#define wxID_AGC_CONTROL 2009
|
||||||
#define wxID_SDR_START_STOP 2010
|
#define wxID_SDR_START_STOP 2010
|
||||||
#define wxID_LOW_PERF 2011
|
#define wxID_LOW_PERF 2011
|
||||||
|
#define wxID_SET_DB_OFFSET 2012
|
||||||
|
|
||||||
#define wxID_MAIN_SPLITTER 2050
|
#define wxID_MAIN_SPLITTER 2050
|
||||||
#define wxID_VIS_SPLITTER 2051
|
#define wxID_VIS_SPLITTER 2051
|
||||||
@ -74,6 +77,7 @@ class AppFrame: public wxFrame {
|
|||||||
public:
|
public:
|
||||||
AppFrame();
|
AppFrame();
|
||||||
~AppFrame();
|
~AppFrame();
|
||||||
|
|
||||||
void OnThread(wxCommandEvent& event);
|
void OnThread(wxCommandEvent& event);
|
||||||
void OnEventInput(wxThreadEvent& event);
|
void OnEventInput(wxThreadEvent& event);
|
||||||
void initDeviceParams(SDRDeviceInfo *devInfo);
|
void initDeviceParams(SDRDeviceInfo *devInfo);
|
||||||
@ -175,7 +179,7 @@ private:
|
|||||||
wxMenuItem *showTipMenuItem;
|
wxMenuItem *showTipMenuItem;
|
||||||
|
|
||||||
bool lowPerfMode;
|
bool lowPerfMode;
|
||||||
|
|
||||||
#ifdef USE_HAMLIB
|
#ifdef USE_HAMLIB
|
||||||
void enableRig();
|
void enableRig();
|
||||||
void disableRig();
|
void disableRig();
|
||||||
|
@ -228,25 +228,16 @@ bool CubicSDR::OnInit() {
|
|||||||
|
|
||||||
// Visual Data
|
// Visual Data
|
||||||
spectrumVisualThread = new SpectrumVisualDataThread();
|
spectrumVisualThread = new SpectrumVisualDataThread();
|
||||||
demodVisualThread = new SpectrumVisualDataThread();
|
|
||||||
|
|
||||||
pipeIQVisualData = new DemodulatorThreadInputQueue();
|
pipeIQVisualData = new DemodulatorThreadInputQueue();
|
||||||
pipeIQVisualData->set_max_num_items(1);
|
pipeIQVisualData->set_max_num_items(1);
|
||||||
|
|
||||||
pipeDemodIQVisualData = new DemodulatorThreadInputQueue();
|
|
||||||
pipeDemodIQVisualData->set_max_num_items(1);
|
|
||||||
|
|
||||||
pipeWaterfallIQVisualData = new DemodulatorThreadInputQueue();
|
pipeWaterfallIQVisualData = new DemodulatorThreadInputQueue();
|
||||||
pipeWaterfallIQVisualData->set_max_num_items(128);
|
pipeWaterfallIQVisualData->set_max_num_items(128);
|
||||||
|
|
||||||
getDemodSpectrumProcessor()->setInput(pipeDemodIQVisualData);
|
|
||||||
getSpectrumProcessor()->setInput(pipeIQVisualData);
|
getSpectrumProcessor()->setInput(pipeIQVisualData);
|
||||||
getSpectrumProcessor()->setHideDC(true);
|
getSpectrumProcessor()->setHideDC(true);
|
||||||
|
|
||||||
pipeAudioVisualData = new DemodulatorThreadOutputQueue();
|
|
||||||
pipeAudioVisualData->set_max_num_items(1);
|
|
||||||
|
|
||||||
scopeProcessor.setInput(pipeAudioVisualData);
|
|
||||||
|
|
||||||
// I/Q Data
|
// I/Q Data
|
||||||
pipeSDRIQData = new SDRThreadIQDataQueue();
|
pipeSDRIQData = new SDRThreadIQDataQueue();
|
||||||
@ -260,12 +251,32 @@ bool CubicSDR::OnInit() {
|
|||||||
|
|
||||||
sdrPostThread->setOutputQueue("IQVisualDataOutput", pipeIQVisualData);
|
sdrPostThread->setOutputQueue("IQVisualDataOutput", pipeIQVisualData);
|
||||||
sdrPostThread->setOutputQueue("IQDataOutput", pipeWaterfallIQVisualData);
|
sdrPostThread->setOutputQueue("IQDataOutput", pipeWaterfallIQVisualData);
|
||||||
sdrPostThread->setOutputQueue("IQActiveDemodVisualDataOutput", pipeDemodIQVisualData);
|
|
||||||
|
|
||||||
t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread);
|
t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread);
|
||||||
t_SpectrumVisual = new std::thread(&SpectrumVisualDataThread::threadMain, spectrumVisualThread);
|
t_SpectrumVisual = new std::thread(&SpectrumVisualDataThread::threadMain, spectrumVisualThread);
|
||||||
|
|
||||||
|
#if CUBICSDR_ENABLE_VIEW_SCOPE
|
||||||
|
pipeAudioVisualData = new DemodulatorThreadOutputQueue();
|
||||||
|
pipeAudioVisualData->set_max_num_items(1);
|
||||||
|
|
||||||
|
scopeProcessor.setInput(pipeAudioVisualData);
|
||||||
|
#else
|
||||||
|
pipeAudioVisualData = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CUBICSDR_ENABLE_VIEW_DEMOD
|
||||||
|
demodVisualThread = new SpectrumVisualDataThread();
|
||||||
|
pipeDemodIQVisualData = new DemodulatorThreadInputQueue();
|
||||||
|
pipeDemodIQVisualData->set_max_num_items(1);
|
||||||
|
if (getDemodSpectrumProcessor()) getDemodSpectrumProcessor()->setInput(pipeDemodIQVisualData);
|
||||||
|
sdrPostThread->setOutputQueue("IQActiveDemodVisualDataOutput", pipeDemodIQVisualData);
|
||||||
t_DemodVisual = new std::thread(&SpectrumVisualDataThread::threadMain, demodVisualThread);
|
t_DemodVisual = new std::thread(&SpectrumVisualDataThread::threadMain, demodVisualThread);
|
||||||
|
#else
|
||||||
|
demodVisualThread = nullptr;
|
||||||
|
pipeDemodIQVisualData = nullptr;
|
||||||
|
t_DemodVisual = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
sdrEnum = new SDREnumerator();
|
sdrEnum = new SDREnumerator();
|
||||||
|
|
||||||
SDREnumerator::setManuals(config.getManualDevices());
|
SDREnumerator::setManuals(config.getManualDevices());
|
||||||
@ -313,16 +324,20 @@ int CubicSDR::OnExit() {
|
|||||||
|
|
||||||
std::cout << "Terminating Visual Processor threads.." << std::endl;
|
std::cout << "Terminating Visual Processor threads.." << std::endl;
|
||||||
spectrumVisualThread->terminate();
|
spectrumVisualThread->terminate();
|
||||||
demodVisualThread->terminate();
|
if (demodVisualThread) {
|
||||||
|
demodVisualThread->terminate();
|
||||||
|
}
|
||||||
|
|
||||||
//Wait nicely
|
//Wait nicely
|
||||||
sdrPostThread->isTerminated(1000);
|
sdrPostThread->isTerminated(1000);
|
||||||
spectrumVisualThread->isTerminated(1000);
|
spectrumVisualThread->isTerminated(1000);
|
||||||
demodVisualThread->isTerminated(1000);
|
if (demodVisualThread) {
|
||||||
|
demodVisualThread->isTerminated(1000);
|
||||||
|
}
|
||||||
|
|
||||||
//Then join the thread themselves
|
//Then join the thread themselves
|
||||||
t_PostSDR->join();
|
t_PostSDR->join();
|
||||||
t_DemodVisual->join();
|
if (t_DemodVisual) t_DemodVisual->join();
|
||||||
t_SpectrumVisual->join();
|
t_SpectrumVisual->join();
|
||||||
|
|
||||||
//Now only we can delete
|
//Now only we can delete
|
||||||
@ -491,7 +506,9 @@ void CubicSDR::setFrequency(long long freq) {
|
|||||||
getSpectrumProcessor()->setPeakHold(getSpectrumProcessor()->getPeakHold());
|
getSpectrumProcessor()->setPeakHold(getSpectrumProcessor()->getPeakHold());
|
||||||
|
|
||||||
//make the peak hold act on the current dmod also, like a zoomed-in version.
|
//make the peak hold act on the current dmod also, like a zoomed-in version.
|
||||||
getDemodSpectrumProcessor()->setPeakHold(getSpectrumProcessor()->getPeakHold());
|
if (getDemodSpectrumProcessor()) {
|
||||||
|
getDemodSpectrumProcessor()->setPeakHold(getSpectrumProcessor()->getPeakHold());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
long long CubicSDR::getOffset() {
|
long long CubicSDR::getOffset() {
|
||||||
@ -652,7 +669,11 @@ SpectrumVisualProcessor *CubicSDR::getSpectrumProcessor() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SpectrumVisualProcessor *CubicSDR::getDemodSpectrumProcessor() {
|
SpectrumVisualProcessor *CubicSDR::getDemodSpectrumProcessor() {
|
||||||
return demodVisualThread->getProcessor();
|
if (demodVisualThread) {
|
||||||
|
return demodVisualThread->getProcessor();
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DemodulatorThreadOutputQueue* CubicSDR::getAudioVisualQueue() {
|
DemodulatorThreadOutputQueue* CubicSDR::getAudioVisualQueue() {
|
||||||
@ -708,6 +729,7 @@ void CubicSDR::removeDemodulator(DemodulatorInstance *demod) {
|
|||||||
}
|
}
|
||||||
demod->setActive(false);
|
demod->setActive(false);
|
||||||
sdrPostThread->removeDemodulator(demod);
|
sdrPostThread->removeDemodulator(demod);
|
||||||
|
wxGetApp().getAppFrame()->notifyUpdateModemProperties();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<SDRDeviceInfo*>* CubicSDR::getDevices() {
|
std::vector<SDRDeviceInfo*>* CubicSDR::getDevices() {
|
||||||
|
@ -94,6 +94,9 @@ public:
|
|||||||
|
|
||||||
void setOffset(long long ofs);
|
void setOffset(long long ofs);
|
||||||
long long getOffset();
|
long long getOffset();
|
||||||
|
|
||||||
|
void setDBOffset(int ofs);
|
||||||
|
int getDBOffset();
|
||||||
|
|
||||||
void setSampleRate(long long rate_in);
|
void setSampleRate(long long rate_in);
|
||||||
long long getSampleRate();
|
long long getSampleRate();
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define CUBICSDR_TITLE "CubicSDR v" CUBICSDR_VERSION " by Charles J. Cliffe (@ccliffe) :: www.cubicsdr.com"
|
#define CUBICSDR_TITLE "" CUBICSDR_BUILD_TITLE
|
||||||
|
|
||||||
#ifndef __BYTE_ORDER
|
#ifndef __BYTE_ORDER
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -106,10 +106,8 @@ void ModemProperties::initProperties(ModemArgInfoList newArgs, DemodulatorInstan
|
|||||||
m_propertyGrid->Clear();
|
m_propertyGrid->Clear();
|
||||||
|
|
||||||
if (!demodInstance) {
|
if (!demodInstance) {
|
||||||
Hide();
|
m_propertyGrid->Append(new wxPropertyCategory("Modem Settings"));
|
||||||
return;
|
return;
|
||||||
} else {
|
|
||||||
Show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_propertyGrid->Append(new wxPropertyCategory(demodInstance->getDemodulatorType() + " Settings"));
|
m_propertyGrid->Append(new wxPropertyCategory(demodInstance->getDemodulatorType() + " Settings"));
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include "CubicSDR.h"
|
#include "CubicSDR.h"
|
||||||
|
|
||||||
SDRDevicesDialog::SDRDevicesDialog( wxWindow* parent ): devFrame( parent ) {
|
SDRDevicesDialog::SDRDevicesDialog( wxWindow* parent ): devFrame( parent, wxID_ANY, wxT(CUBICSDR_INSTALL_NAME " :: SDR Devices")) {
|
||||||
refresh = true;
|
refresh = true;
|
||||||
failed = false;
|
failed = false;
|
||||||
m_refreshButton->Disable();
|
m_refreshButton->Disable();
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
#include "CubicSDR.h"
|
||||||
#include "ColorTheme.h"
|
#include "ColorTheme.h"
|
||||||
#include "CubicSDRDefs.h"
|
#include "CubicSDRDefs.h"
|
||||||
|
|
||||||
@ -10,6 +11,7 @@ SpectrumPanel::SpectrumPanel() {
|
|||||||
floorValue = 0;
|
floorValue = 0;
|
||||||
ceilValue = 1;
|
ceilValue = 1;
|
||||||
showDb = false;
|
showDb = false;
|
||||||
|
useDbOfs = false;
|
||||||
fftSize = DEFAULT_FFT_SIZE;
|
fftSize = DEFAULT_FFT_SIZE;
|
||||||
bandwidth = DEFAULT_DEMOD_BW;
|
bandwidth = DEFAULT_DEMOD_BW;
|
||||||
freq = 0;
|
freq = 0;
|
||||||
@ -83,6 +85,14 @@ bool SpectrumPanel::getShowDb() {
|
|||||||
return showDb;
|
return showDb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SpectrumPanel::setUseDBOffset(bool useOfs) {
|
||||||
|
this->useDbOfs = useOfs;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SpectrumPanel::getUseDBOffset() {
|
||||||
|
return useDbOfs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SpectrumPanel::setPoints(std::vector<float> &points) {
|
void SpectrumPanel::setPoints(std::vector<float> &points) {
|
||||||
this->points.assign(points.begin(), points.end());
|
this->points.assign(points.begin(), points.end());
|
||||||
@ -269,11 +279,11 @@ void SpectrumPanel::drawPanelContents() {
|
|||||||
if (showDb) {
|
if (showDb) {
|
||||||
float dbPanelWidth = (1.0 / viewWidth)*88.0 * GLFont::getScaleFactor();
|
float dbPanelWidth = (1.0 / viewWidth)*88.0 * GLFont::getScaleFactor();
|
||||||
float dbPanelHeight = (1.0/viewHeight)*14.0 * GLFont::getScaleFactor();
|
float dbPanelHeight = (1.0/viewHeight)*14.0 * GLFont::getScaleFactor();
|
||||||
|
float dbOfs = useDbOfs?wxGetApp().getConfig()->getDBOffset():0;
|
||||||
|
|
||||||
std::stringstream ssLabel("");
|
std::stringstream ssLabel("");
|
||||||
if (getCeilValue() != getFloorValue() && fftSize) {
|
if (getCeilValue() != getFloorValue() && fftSize) {
|
||||||
ssLabel << std::fixed << std::setprecision(1) << (20.0 * log10(2.0*(getCeilValue())/(double)fftSize)) << "dB";
|
ssLabel << std::fixed << std::setprecision(1) << (dbOfs + 20.0 * log10(2.0*(getCeilValue())/(double)fftSize)) << "dB";
|
||||||
}
|
}
|
||||||
dbPanelCeil.setText(ssLabel.str(), GLFont::GLFONT_ALIGN_RIGHT);
|
dbPanelCeil.setText(ssLabel.str(), GLFont::GLFONT_ALIGN_RIGHT);
|
||||||
dbPanelCeil.setSize(dbPanelWidth, dbPanelHeight);
|
dbPanelCeil.setSize(dbPanelWidth, dbPanelHeight);
|
||||||
@ -282,7 +292,7 @@ void SpectrumPanel::drawPanelContents() {
|
|||||||
|
|
||||||
ssLabel.str("");
|
ssLabel.str("");
|
||||||
if (getCeilValue() != getFloorValue() && fftSize) {
|
if (getCeilValue() != getFloorValue() && fftSize) {
|
||||||
ssLabel << (20.0 * log10(2.0*(getFloorValue())/(double)fftSize)) << "dB";
|
ssLabel << (dbOfs + 20.0 * log10(2.0*(getFloorValue())/(double)fftSize)) << "dB";
|
||||||
}
|
}
|
||||||
|
|
||||||
dbPanelFloor.setText(ssLabel.str(), GLFont::GLFONT_ALIGN_RIGHT);
|
dbPanelFloor.setText(ssLabel.str(), GLFont::GLFONT_ALIGN_RIGHT);
|
||||||
|
@ -26,7 +26,10 @@ public:
|
|||||||
|
|
||||||
void setShowDb(bool showDb);
|
void setShowDb(bool showDb);
|
||||||
bool getShowDb();
|
bool getShowDb();
|
||||||
|
|
||||||
|
void setUseDBOffset(bool useOfs);
|
||||||
|
bool getUseDBOffset();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void drawPanelContents();
|
void drawPanelContents();
|
||||||
|
|
||||||
@ -40,5 +43,5 @@ private:
|
|||||||
|
|
||||||
GLTextPanel dbPanelCeil;
|
GLTextPanel dbPanelCeil;
|
||||||
GLTextPanel dbPanelFloor;
|
GLTextPanel dbPanelFloor;
|
||||||
bool showDb;
|
bool showDb, useDbOfs;
|
||||||
};
|
};
|
||||||
|
50
src/visual/ImagePanel.cpp
Normal file
50
src/visual/ImagePanel.cpp
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#include "ImagePanel.h"
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(ImagePanel, wxPanel)
|
||||||
|
EVT_PAINT(ImagePanel::paintEvent)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
|
||||||
|
ImagePanel::ImagePanel(wxPanel * parent, wxString file, wxBitmapType format) :
|
||||||
|
wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE) {
|
||||||
|
image.LoadFile(file, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImagePanel::paintEvent(wxPaintEvent & evt) {
|
||||||
|
wxPaintDC dc(this);
|
||||||
|
render(dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ImagePanel::paintNow() {
|
||||||
|
wxClientDC dc(this);
|
||||||
|
render(dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ImagePanel::render(wxDC& dc) {
|
||||||
|
|
||||||
|
double imagew = image.GetWidth();
|
||||||
|
double imageh = image.GetHeight();
|
||||||
|
|
||||||
|
wxSize destSize = dc.GetSize();
|
||||||
|
|
||||||
|
double destw = destSize.GetWidth();
|
||||||
|
double desth = destSize.GetHeight();
|
||||||
|
|
||||||
|
double sf = 1.0, wf, hf;
|
||||||
|
|
||||||
|
wf = destw / imagew;
|
||||||
|
hf = desth / imageh;
|
||||||
|
|
||||||
|
sf = (wf < hf)?wf:hf;
|
||||||
|
|
||||||
|
double resulth = imageh * sf;
|
||||||
|
double resultw = imagew * sf;
|
||||||
|
|
||||||
|
dc.SetUserScale(sf, sf);
|
||||||
|
dc.DrawBitmap( image, (destw/2 - resultw/2)/sf, (desth/2 - resulth/2)/sf, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
16
src/visual/ImagePanel.h
Normal file
16
src/visual/ImagePanel.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include <wx/wx.h>
|
||||||
|
#include <wx/sizer.h>
|
||||||
|
|
||||||
|
class ImagePanel : public wxPanel {
|
||||||
|
wxBitmap image;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ImagePanel(wxPanel* parent, wxString file, wxBitmapType format);
|
||||||
|
|
||||||
|
void paintEvent(wxPaintEvent & evt);
|
||||||
|
void paintNow();
|
||||||
|
|
||||||
|
void render(wxDC& dc);
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
@ -174,6 +174,14 @@ bool SpectrumCanvas::getShowDb() {
|
|||||||
return spectrumPanel.getShowDb();
|
return spectrumPanel.getShowDb();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SpectrumCanvas::setUseDBOfs(bool showDb) {
|
||||||
|
spectrumPanel.setUseDBOffset(showDb);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SpectrumCanvas::getUseDBOfs() {
|
||||||
|
return spectrumPanel.getUseDBOffset();
|
||||||
|
}
|
||||||
|
|
||||||
void SpectrumCanvas::setView(long long center_freq_in, int bandwidth_in) {
|
void SpectrumCanvas::setView(long long center_freq_in, int bandwidth_in) {
|
||||||
bwChange += bandwidth_in-bandwidth;
|
bwChange += bandwidth_in-bandwidth;
|
||||||
#define BW_RESET_TH 400000
|
#define BW_RESET_TH 400000
|
||||||
@ -293,7 +301,9 @@ void SpectrumCanvas::OnMouseRightReleased(wxMouseEvent& event) {
|
|||||||
wxGetApp().getSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold());
|
wxGetApp().getSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold());
|
||||||
|
|
||||||
//make the peak hold act on the current dmod also, like a zoomed-in version.
|
//make the peak hold act on the current dmod also, like a zoomed-in version.
|
||||||
wxGetApp().getDemodSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold());
|
if (wxGetApp().getDemodSpectrumProcessor()) {
|
||||||
|
wxGetApp().getDemodSpectrumProcessor()->setPeakHold(wxGetApp().getSpectrumProcessor()->getPeakHold());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mouseTracker.OnMouseRightReleased(event);
|
mouseTracker.OnMouseRightReleased(event);
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,9 @@ public:
|
|||||||
void setShowDb(bool showDb);
|
void setShowDb(bool showDb);
|
||||||
bool getShowDb();
|
bool getShowDb();
|
||||||
|
|
||||||
|
void setUseDBOfs(bool showDb);
|
||||||
|
bool getUseDBOfs();
|
||||||
|
|
||||||
void setView(long long center_freq_in, int bandwidth_in);
|
void setView(long long center_freq_in, int bandwidth_in);
|
||||||
void disableView();
|
void disableView();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user