// Copyright (c) Charles J. Cliffe // SPDX-License-Identifier: GPL-2.0+ #pragma once #include #include #include #include #include #include #include "PrimaryGLContext.h" #include "ScopeCanvas.h" #include "SpectrumCanvas.h" #include "WaterfallCanvas.h" #include "MeterCanvas.h" #include "TuningCanvas.h" #include "ModeSelectorCanvas.h" #include "GainCanvas.h" #include "FFTVisualDataThread.h" #include "SDRDeviceInfo.h" #include "ModemProperties.h" //#include "UITestCanvas.h" #include "FrequencyDialog.h" #include "BookmarkView.h" #include "AboutDialog.h" #include "DemodulatorInstance.h" #include "DemodulatorThread.h" #include #define wxID_RT_AUDIO_DEVICE 1000 #define wxID_SET_FREQ_OFFSET 2001 #define wxID_RESET 2002 #define wxID_SET_PPM 2003 #define wxID_SET_TIPS 2004 #define wxID_SET_IQSWAP 2005 #define wxID_SDR_DEVICES 2008 #define wxID_AGC_CONTROL 2009 #define wxID_SDR_START_STOP 2010 #define wxID_LOW_PERF 2011 #define wxID_SET_DB_OFFSET 2012 #define wxID_ABOUT_CUBICSDR 2013 #define wxID_OPEN_BOOKMARK 2020 #define wxID_SAVE_BOOKMARK 2021 #define wxID_SAVEAS_BOOKMARK 2022 #define wxID_MAIN_SPLITTER 2050 #define wxID_VIS_SPLITTER 2051 #define wxID_BM_SPLITTER 2052 #define wxID_THEME_DEFAULT 2100 #define wxID_THEME_SHARP 2101 #define wxID_THEME_BW 2102 #define wxID_THEME_RAD 2103 #define wxID_THEME_TOUCH 2104 #define wxID_THEME_HD 2105 #define wxID_THEME_RADAR 2106 #define wxID_DISPLAY_BOOKMARKS 2107 #define wxID_BANDWIDTH_BASE 2150 #define wxID_BANDWIDTH_MANUAL_DIALOG 2199 #define wxID_BANDWIDTH_MANUAL 2200 #define wxID_DISPLAY_BASE 2250 #define wxID_SETTINGS_BASE 2300 #define wxID_ANTENNA_CURRENT 2500 #define wxID_ANTENNA_CURRENT_TX 2501 #define wxID_ANTENNAS_BASE 2502 #define wxID_DEVICE_ID 3500 #define wxID_AUDIO_BANDWIDTH_BASE 9000 #define wxID_AUDIO_DEVICE_MULTIPLIER 50 #ifdef USE_HAMLIB #define wxID_RIG_TOGGLE 11900 #define wxID_RIG_PORT 11901 #define wxID_RIG_SDR_IF 11902 #define wxID_RIG_CONTROL 11903 #define wxID_RIG_FOLLOW 11904 #define wxID_RIG_CENTERLOCK 11905 #define wxID_RIG_FOLLOW_MODEM 11906 #define wxID_RIG_SERIAL_BASE 11950 #define wxID_RIG_MODEL_BASE 12000 #endif #ifdef USE_HAMLIB class PortSelectorDialog; #endif // Define a new frame type class AppFrame: public wxFrame { public: AppFrame(); ~AppFrame(); void initDeviceParams(SDRDeviceInfo *devInfo); void updateDeviceParams(); void saveSession(std::string fileName); bool loadSession(std::string fileName); FFTVisualDataThread *getWaterfallDataThread(); void notifyUpdateModemProperties(); void setMainWaterfallFFTSize(int fftSize); void setScopeDeviceName(std::string deviceName); void gkNudgeLeft(DemodulatorInstancePtr demod, int snap); void gkNudgeRight(DemodulatorInstancePtr demod, int snap); int OnGlobalKeyDown(wxKeyEvent &event); int OnGlobalKeyUp(wxKeyEvent &event); void setWaterfallLinesPerSecond(int lps); void setSpectrumAvgSpeed(double avg); FrequencyDialog::FrequencyDialogTarget getFrequencyDialogTarget(); void refreshGainUI(); void setViewState(long long center_freq, int bandwidth); void setViewState(); long long getViewCenterFreq(); int getViewBandwidth(); bool isUserDemodBusy(); BookmarkView *getBookmarkView(); void disableSave(bool state); //call this in case the main UI is not //the origin of device changes / sample rate by operator, //and must be notified back to update its UI elements //(ex: SDR Devices dialog changing the configuration) void notifyDeviceChanged(); #ifdef _WIN32 bool canFocus(); #endif //set tooltip to window void setStatusText(wxWindow* window, std::string statusText); void setStatusText(std::string statusText, int value); #ifdef USE_HAMLIB void setRigControlPort(std::string portName); void dismissRigControlPortDialog(); #endif private: void OnMenu(wxCommandEvent& event); void OnClose(wxCloseEvent& event); void OnNewWindow(wxCommandEvent& event); void OnIdle(wxIdleEvent& event); void OnDoubleClickSash(wxSplitterEvent& event); void OnUnSplit(wxSplitterEvent& event); void OnAboutDialogClose(wxCommandEvent& event); //actionXXXX manage menu actions, return true if the event has been //treated. bool actionOnMenuAbout(wxCommandEvent& event); bool actionOnMenuReset(wxCommandEvent& event); bool actionOnMenuSettings(wxCommandEvent& event); bool actionOnMenuAGC(wxCommandEvent& event); bool actionOnMenuSampleRate(wxCommandEvent& event); bool actionOnMenuAudioSampleRate(wxCommandEvent& event); bool actionOnMenuDisplay(wxCommandEvent& event); bool actionOnMenuLoadSave(wxCommandEvent& event); bool actionOnMenuRig(wxCommandEvent& event); wxString getSettingsLabel(const std::string& settingsName, const std::string& settingsValue, const std::string& settingsSuffix = ""); ScopeCanvas *scopeCanvas; SpectrumCanvas *spectrumCanvas; WaterfallCanvas *waterfallCanvas; ModeSelectorCanvas *demodModeSelector; #ifdef ENABLE_DIGITAL_LAB ModeSelectorCanvas *demodModeSelectorAdv; #endif SpectrumCanvas *demodSpectrumCanvas; WaterfallCanvas *demodWaterfallCanvas; MeterCanvas *demodSignalMeter; MeterCanvas *demodGainMeter; TuningCanvas *demodTuner; // UITestCanvas *testCanvas; MeterCanvas *spectrumAvgMeter; MeterCanvas *waterfallSpeedMeter; ModeSelectorCanvas *demodMuteButton, *peakHoldButton, *soloModeButton, *deltaLockButton; GainCanvas *gainCanvas; wxSizerItem *gainSizerItem, *gainSpacerItem; wxSplitterWindow *mainVisSplitter, *mainSplitter, *bookmarkSplitter; wxBoxSizer *demodTray; BookmarkView *bookmarkView; //Use a raw pointer here to prevent a dangling reference DemodulatorInstance* activeDemodulator; std::vector devices; std::map inputDevices; std::map outputDevices; std::map outputDeviceMenuItems; std::map sampleRateMenuItems; std::map antennaMenuItems; //depending on context, maps the item id to wxMenuItem*, //OR the submenu item id to its parent wxMenuItem*. std::map settingsMenuItems; std::map audioSampleRateMenuItems; std::map directSamplingMenuItems; wxMenuBar *menuBar; wxMenu *sampleRateMenu = nullptr; wxMenu *displayMenu = nullptr; wxMenuItem *agcMenuItem = nullptr; wxMenuItem *iqSwapMenuItem = nullptr; wxMenuItem *lowPerfMenuItem = nullptr; wxMenu *settingsMenu = nullptr; SoapySDR::ArgInfoList settingArgs; int settingsIdMax; std::vector sampleRates; long manualSampleRate = -1; std::vector antennaNames; std::string currentTXantennaName; std::string currentSessionFile; std::string currentBookmarkFile; FFTVisualDataThread *waterfallDataThread; std::thread *t_FFTData; SDRDeviceInfo *devInfo; std::atomic_bool deviceChanged; ModemProperties *modemProps; std::atomic_bool modemPropertiesUpdated; wxMenuItem *showTipMenuItem; bool lowPerfMode; wxMenuItem *hideBookmarksItem; bool saveDisabled; AboutDialog *aboutDlg; std::string lastToolTip; #ifdef USE_HAMLIB void enableRig(); void disableRig(); wxMenu *rigMenu; wxMenuItem *rigEnableMenuItem; wxMenuItem *rigPortMenuItem; wxMenuItem *rigControlMenuItem; wxMenuItem *rigFollowMenuItem; wxMenuItem *rigCenterLockMenuItem; wxMenuItem *rigFollowModemMenuItem; std::map rigSerialMenuItems; std::map rigModelMenuItems; int rigModel; int rigSerialRate; long long rigSDRIF; std::vector rigSerialRates; std::string rigPort; int numRigs; PortSelectorDialog *rigPortDialog; #endif wxDECLARE_EVENT_TABLE(); };