Merge pull request #279 from cjcliffe/keyboard_updates

Keyboard Improvements
This commit is contained in:
Charles J. Cliffe 2016-02-09 01:28:57 -05:00
commit ee8c17114e
17 changed files with 390 additions and 46 deletions

View File

@ -198,6 +198,7 @@ AppConfig::AppConfig() : configName("") {
winW.store(0); winW.store(0);
winH.store(0); winH.store(0);
winMax.store(false); winMax.store(false);
showTips.store(true);
themeId.store(0); themeId.store(0);
snap.store(1); snap.store(1);
centerFreq.store(100000000); centerFreq.store(100000000);
@ -253,6 +254,14 @@ bool AppConfig::getWindowMaximized() {
return winMax.load(); return winMax.load();
} }
void AppConfig::setShowTips(bool show) {
showTips.store(show);
}
bool AppConfig::getShowTips() {
return showTips.load();
}
wxRect *AppConfig::getWindow() { wxRect *AppConfig::getWindow() {
wxRect *r = NULL; wxRect *r = NULL;
if (winH.load() && winW.load()) { if (winH.load() && winW.load()) {
@ -347,6 +356,7 @@ bool AppConfig::save() {
*window_node->newChild("h") = winH.load(); *window_node->newChild("h") = winH.load();
*window_node->newChild("max") = winMax.load(); *window_node->newChild("max") = winMax.load();
*window_node->newChild("tips") = showTips.load();
*window_node->newChild("theme") = themeId.load(); *window_node->newChild("theme") = themeId.load();
*window_node->newChild("snap") = snap.load(); *window_node->newChild("snap") = snap.load();
*window_node->newChild("center_freq") = centerFreq.load(); *window_node->newChild("center_freq") = centerFreq.load();
@ -426,7 +436,7 @@ bool AppConfig::load() {
if (cfg.rootNode()->hasAnother("window")) { if (cfg.rootNode()->hasAnother("window")) {
int x,y,w,h; int x,y,w,h;
int max; int max,tips;
DataNode *win_node = cfg.rootNode()->getNext("window"); DataNode *win_node = cfg.rootNode()->getNext("window");
@ -447,6 +457,11 @@ bool AppConfig::load() {
winMax.store(max?true:false); winMax.store(max?true:false);
} }
if (win_node->hasAnother("tips")) {
win_node->getNext("tips")->element()->get(tips);
showTips.store(tips?true:false);
}
if (win_node->hasAnother("theme")) { if (win_node->hasAnother("theme")) {
int theme; int theme;
win_node->getNext("theme")->element()->get(theme); win_node->getNext("theme")->element()->get(theme);

View File

@ -70,6 +70,9 @@ public:
void setWindowMaximized(bool max); void setWindowMaximized(bool max);
bool getWindowMaximized(); bool getWindowMaximized();
void setShowTips(bool show);
bool getShowTips();
void setTheme(int themeId); void setTheme(int themeId);
int getTheme(); int getTheme();
@ -109,7 +112,7 @@ private:
std::string configName; std::string configName;
std::map<std::string, DeviceConfig *> deviceConfig; std::map<std::string, DeviceConfig *> deviceConfig;
std::atomic_int winX,winY,winW,winH; std::atomic_int winX,winY,winW,winH;
std::atomic_bool winMax; std::atomic_bool winMax, showTips;
std::atomic_int themeId; std::atomic_int themeId;
std::atomic_llong snap; std::atomic_llong snap;
std::atomic_llong centerFreq; std::atomic_llong centerFreq;

View File

@ -78,7 +78,7 @@ AppFrame::AppFrame() :
demodModeSelector->addChoice("DSB"); demodModeSelector->addChoice("DSB");
demodModeSelector->addChoice("I/Q"); demodModeSelector->addChoice("I/Q");
demodModeSelector->setSelection("FM"); demodModeSelector->setSelection("FM");
demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation, Amplitude Modulation and Lower, Upper or Double Side-Band."); 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(40,-1)); demodModeSelector->SetMinSize(wxSize(40,-1));
demodModeSelector->SetMaxSize(wxSize(40,-1)); demodModeSelector->SetMaxSize(wxSize(40,-1));
demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0); demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0);
@ -287,9 +287,6 @@ AppFrame::AppFrame() :
this->SetSizer(vbox); this->SetSizer(vbox);
// waterfallCanvas->SetFocusFromKbd();
waterfallCanvas->SetFocus();
// SetIcon(wxICON(sample)); // SetIcon(wxICON(sample));
// Make a menubar // Make a menubar
@ -555,6 +552,10 @@ void AppFrame::updateDeviceParams() {
// Build settings menu // Build settings menu
wxMenu *newSettingsMenu = new wxMenu; wxMenu *newSettingsMenu = new wxMenu;
showTipMenuItem = newSettingsMenu->AppendCheckItem(wxID_SET_TIPS, "Show Hover Tips");
if (wxGetApp().getConfig()->getShowTips()) {
showTipMenuItem->Check();
}
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)) {
newSettingsMenu->Append(wxID_SET_PPM, "Device PPM"); newSettingsMenu->Append(wxID_SET_PPM, "Device PPM");
@ -676,6 +677,12 @@ void AppFrame::OnMenu(wxCommandEvent& event) {
activeDemodulator->setOutputDevice(event.GetId() - wxID_RT_AUDIO_DEVICE); activeDemodulator->setOutputDevice(event.GetId() - wxID_RT_AUDIO_DEVICE);
activeDemodulator = NULL; activeDemodulator = NULL;
} }
} else if (event.GetId() == wxID_SET_TIPS ) {
if (wxGetApp().getConfig()->getShowTips()) {
wxGetApp().getConfig()->setShowTips(false);
} else {
wxGetApp().getConfig()->setShowTips(true);
}
} else if (event.GetId() == wxID_SET_FREQ_OFFSET) { } else if (event.GetId() == wxID_SET_FREQ_OFFSET) {
long ofs = wxGetNumberFromUser("Shift the displayed frequency by this amount.\ni.e. -125000000 for -125 MHz", "Frequency (Hz)", long ofs = wxGetNumberFromUser("Shift the displayed frequency by this amount.\ni.e. -125000000 for -125 MHz", "Frequency (Hz)",
"Frequency Offset", wxGetApp().getOffset(), -2000000000, 2000000000, this); "Frequency Offset", wxGetApp().getOffset(), -2000000000, 2000000000, this);
@ -1196,16 +1203,6 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
} }
} }
if (demodTuner->getMouseTracker()->mouseInView()) {
if (!demodTuner->HasFocus()) {
demodTuner->SetFocus();
}
} else if (!wxGetApp().isDeviceSelectorOpen() && (!modemProps || !modemProps->isMouseInView())) {
if (!waterfallCanvas->HasFocus()) {
waterfallCanvas->SetFocus();
}
}
scopeCanvas->setPPMMode(demodTuner->isAltDown()); scopeCanvas->setPPMMode(demodTuner->isAltDown());
scopeCanvas->setShowDb(spectrumCanvas->getShowDb()); scopeCanvas->setShowDb(spectrumCanvas->getShowDb());
@ -1276,6 +1273,8 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
if (!this->IsActive()) { if (!this->IsActive()) {
std::this_thread::sleep_for(std::chrono::milliseconds(25)); std::this_thread::sleep_for(std::chrono::milliseconds(25));
} else {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
} }
event.RequestMore(); event.RequestMore();
@ -1540,3 +1539,151 @@ void AppFrame::setMainWaterfallFFTSize(int fftSize) {
waterfallDataThread->getProcessor()->setFFTSize(fftSize); waterfallDataThread->getProcessor()->setFFTSize(fftSize);
waterfallCanvas->setFFTSize(fftSize); waterfallCanvas->setFFTSize(fftSize);
} }
void AppFrame::refreshGainUI() {
gainCanvas->updateGainUI();
gainCanvas->Refresh();
}
FrequencyDialog::FrequencyDialogTarget AppFrame::getFrequencyDialogTarget() {
FrequencyDialog::FrequencyDialogTarget target = FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_DEFAULT;
if (waterfallSpeedMeter->getMouseTracker()->mouseInView()) {
target = FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_WATERFALL_LPS;
}
else if (spectrumAvgMeter->getMouseTracker()->mouseInView()) {
target = FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_SPECTRUM_AVG;
}
else if (demodTuner->getMouseTracker()->mouseInView()) {
switch (demodTuner->getHoverState()) {
case TuningCanvas::ActiveState::TUNING_HOVER_BW:
target = FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_BANDWIDTH;
break;
case TuningCanvas::ActiveState::TUNING_HOVER_FREQ:
target = FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_FREQ;
break;
case TuningCanvas::ActiveState::TUNING_HOVER_CENTER:
default:
target = FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_DEFAULT;
break;
}
}
else if (gainCanvas->getMouseTracker()->mouseInView()) {
target = FrequencyDialog::FrequencyDialogTarget::FDIALOG_TARGET_GAIN;
}
return target;
}
int AppFrame::OnGlobalKeyDown(wxKeyEvent &event) {
if (!this->IsActive()) {
return -1;
}
switch (event.GetKeyCode()) {
case WXK_UP:
case WXK_NUMPAD_UP:
case WXK_DOWN:
case WXK_NUMPAD_DOWN:
case WXK_LEFT:
case WXK_NUMPAD_LEFT:
case WXK_RIGHT:
case WXK_NUMPAD_RIGHT:
waterfallCanvas->OnKeyDown(event);
return 1;
case 'A':
case 'F':
case 'L':
case 'U':
return 1;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
wxGetApp().showFrequencyInput(getFrequencyDialogTarget(), std::to_string(event.GetKeyCode() - '0'));
return 1;
break;
default:
break;
}
if (demodTuner->getMouseTracker()->mouseInView()) {
demodTuner->OnKeyDown(event);
} else if (waterfallCanvas->getMouseTracker()->mouseInView()) {
waterfallCanvas->OnKeyDown(event);
}
return 1;
}
int AppFrame::OnGlobalKeyUp(wxKeyEvent &event) {
if (!this->IsActive()) {
return -1;
}
switch (event.GetKeyCode()) {
case WXK_SPACE:
if (!demodTuner->getMouseTracker()->mouseInView()) {
wxGetApp().showFrequencyInput(getFrequencyDialogTarget());
return 1;
}
break;
case WXK_UP:
case WXK_NUMPAD_UP:
case WXK_DOWN:
case WXK_NUMPAD_DOWN:
case WXK_LEFT:
case WXK_NUMPAD_LEFT:
case WXK_RIGHT:
case WXK_NUMPAD_RIGHT:
waterfallCanvas->OnKeyUp(event);
return 1;
case 'A':
demodModeSelector->setSelection("AM");
break;
case 'F':
if (demodModeSelector->getSelectionLabel() == "FM") {
demodModeSelector->setSelection("FMS");
} else {
demodModeSelector->setSelection("FM");
}
break;
case 'L':
demodModeSelector->setSelection("LSB");
break;
case 'U':
demodModeSelector->setSelection("USB");
break;
default:
break;
}
if (demodTuner->getMouseTracker()->mouseInView()) {
demodTuner->OnKeyUp(event);
} else if (waterfallCanvas->getMouseTracker()->mouseInView()) {
waterfallCanvas->OnKeyUp(event);
}
// TODO: Catch key-ups outside of original target
return 1;
}
void AppFrame::setWaterfallLinesPerSecond(int lps) {
waterfallSpeedMeter->setUserInputValue(sqrt(lps));
}
void AppFrame::setSpectrumAvgSpeed(double avg) {
spectrumAvgMeter->setUserInputValue(avg);
}

View File

@ -18,6 +18,7 @@
#include "SDRDeviceInfo.h" #include "SDRDeviceInfo.h"
#include "ModemProperties.h" #include "ModemProperties.h"
//#include "UITestCanvas.h" //#include "UITestCanvas.h"
#include "FrequencyDialog.h"
#include <map> #include <map>
@ -25,6 +26,7 @@
#define wxID_SET_FREQ_OFFSET 2001 #define wxID_SET_FREQ_OFFSET 2001
#define wxID_RESET 2002 #define wxID_RESET 2002
#define wxID_SET_PPM 2003 #define wxID_SET_PPM 2003
#define wxID_SET_TIPS 2004
#define wxID_SDR_DEVICES 2008 #define wxID_SDR_DEVICES 2008
#define wxID_AGC_CONTROL 2009 #define wxID_AGC_CONTROL 2009
@ -75,6 +77,15 @@ public:
void updateModemProperties(ModemArgInfoList args); void updateModemProperties(ModemArgInfoList args);
void setMainWaterfallFFTSize(int fftSize); void setMainWaterfallFFTSize(int fftSize);
int OnGlobalKeyDown(wxKeyEvent &event);
int OnGlobalKeyUp(wxKeyEvent &event);
void setWaterfallLinesPerSecond(int lps);
void setSpectrumAvgSpeed(double avg);
FrequencyDialog::FrequencyDialogTarget getFrequencyDialogTarget();
void refreshGainUI();
private: private:
void OnMenu(wxCommandEvent& event); void OnMenu(wxCommandEvent& event);
void OnClose(wxCloseEvent& event); void OnClose(wxCloseEvent& event);
@ -132,6 +143,7 @@ private:
ModemProperties *modemProps; ModemProperties *modemProps;
std::atomic_bool modemPropertiesUpdated; std::atomic_bool modemPropertiesUpdated;
ModemArgInfoList newModemArgs; ModemArgInfoList newModemArgs;
wxMenuItem *showTipMenuItem;
#ifdef USE_HAMLIB #ifdef USE_HAMLIB
wxMenu *rigMenu; wxMenu *rigMenu;

View File

@ -134,6 +134,7 @@ CubicSDR::CubicSDR() : appframe(NULL), m_glContext(NULL), frequency(0), offset(0
sdrThread(NULL), sdrPostThread(NULL), spectrumVisualThread(NULL), demodVisualThread(NULL), pipeSDRIQData(NULL), pipeIQVisualData(NULL), pipeAudioVisualData(NULL), t_SDR(NULL), t_PostSDR(NULL) { sdrThread(NULL), sdrPostThread(NULL), spectrumVisualThread(NULL), demodVisualThread(NULL), pipeSDRIQData(NULL), pipeIQVisualData(NULL), pipeAudioVisualData(NULL), t_SDR(NULL), t_PostSDR(NULL) {
sampleRateInitialized.store(false); sampleRateInitialized.store(false);
agcMode.store(true); agcMode.store(true);
fdlgTarget = FrequencyDialog::FDIALOG_TARGET_DEFAULT;
} }
bool CubicSDR::OnInit() { bool CubicSDR::OnInit() {
@ -649,11 +650,13 @@ int CubicSDR::getPPM() {
return ppm; return ppm;
} }
void CubicSDR::showFrequencyInput(FrequencyDialog::FrequencyDialogTarget targetMode, wxString initString) {
void CubicSDR::showFrequencyInput(FrequencyDialog::FrequencyDialogTarget targetMode) {
const wxString demodTitle("Set Demodulator Frequency"); const wxString demodTitle("Set Demodulator Frequency");
const wxString freqTitle("Set Center Frequency"); const wxString freqTitle("Set Center Frequency");
const wxString bwTitle("Set Demodulator Bandwidth"); const wxString bwTitle("Modem Bandwidth (150Hz - 500KHz)");
const wxString lpsTitle("Lines-Per-Second (1-1024)");
const wxString avgTitle("Average Rate (0.1 - 0.99)");
const wxString gainTitle("Gain Entry: "+wxGetApp().getActiveGainEntry());
wxString title; wxString title;
@ -664,11 +667,23 @@ void CubicSDR::showFrequencyInput(FrequencyDialog::FrequencyDialogTarget targetM
case FrequencyDialog::FDIALOG_TARGET_BANDWIDTH: case FrequencyDialog::FDIALOG_TARGET_BANDWIDTH:
title = bwTitle; title = bwTitle;
break; break;
case FrequencyDialog::FDIALOG_TARGET_WATERFALL_LPS:
title = lpsTitle;
break;
case FrequencyDialog::FDIALOG_TARGET_SPECTRUM_AVG:
title = avgTitle;
break;
case FrequencyDialog::FDIALOG_TARGET_GAIN:
title = gainTitle;
if (wxGetApp().getActiveGainEntry() == "") {
return;
}
break;
default: default:
break; break;
} }
FrequencyDialog fdialog(appframe, -1, title, demodMgr.getActiveDemodulator(), wxPoint(-100,-100), wxSize(320, 75 ), wxDEFAULT_DIALOG_STYLE, targetMode); FrequencyDialog fdialog(appframe, -1, title, demodMgr.getActiveDemodulator(), wxPoint(-100,-100), wxSize(350, 75), wxDEFAULT_DIALOG_STYLE, targetMode, initString);
fdialog.ShowModal(); fdialog.ShowModal();
} }
@ -749,6 +764,30 @@ std::string CubicSDR::getModulePath() {
return modulePath; return modulePath;
} }
void CubicSDR::setActiveGainEntry(std::string gainName) {
activeGain = gainName;
}
std::string CubicSDR::getActiveGainEntry() {
return activeGain;
}
int CubicSDR::FilterEvent(wxEvent& event) {
if (!appframe) {
return -1;
}
if (event.GetEventType() == wxEVT_KEY_DOWN) {
return appframe->OnGlobalKeyDown((wxKeyEvent&)event);
}
if (event.GetEventType() == wxEVT_KEY_UP) {
return appframe->OnGlobalKeyUp((wxKeyEvent&)event);
}
return -1; // process normally
}
#ifdef USE_HAMLIB #ifdef USE_HAMLIB
RigThread *CubicSDR::getRigThread() { RigThread *CubicSDR::getRigThread() {
return rigThread; return rigThread;

View File

@ -125,7 +125,7 @@ public:
void setPPM(int ppm_in); void setPPM(int ppm_in);
int getPPM(); int getPPM();
void showFrequencyInput(FrequencyDialog::FrequencyDialogTarget targetMode = FrequencyDialog::FDIALOG_TARGET_DEFAULT); void showFrequencyInput(FrequencyDialog::FrequencyDialogTarget targetMode = FrequencyDialog::FDIALOG_TARGET_DEFAULT, wxString initString = "");
AppFrame *getAppFrame(); AppFrame *getAppFrame();
bool areDevicesReady(); bool areDevicesReady();
@ -153,6 +153,9 @@ public:
bool getUseLocalMod(); bool getUseLocalMod();
std::string getModulePath(); std::string getModulePath();
void setActiveGainEntry(std::string gainName);
std::string getActiveGainEntry();
#ifdef USE_HAMLIB #ifdef USE_HAMLIB
RigThread *getRigThread(); RigThread *getRigThread();
void initRig(int rigModel, std::string rigPort, int rigSerialRate); void initRig(int rigModel, std::string rigPort, int rigSerialRate);
@ -161,6 +164,8 @@ public:
#endif #endif
private: private:
int FilterEvent(wxEvent& event);
AppFrame *appframe; AppFrame *appframe;
AppConfig config; AppConfig config;
PrimaryGLContext *m_glContext; PrimaryGLContext *m_glContext;
@ -205,6 +210,8 @@ private:
std::mutex notify_busy; std::mutex notify_busy;
std::atomic_bool frequency_locked; std::atomic_bool frequency_locked;
std::atomic_llong lock_freq; std::atomic_llong lock_freq;
FrequencyDialog::FrequencyDialogTarget fdlgTarget;
std::string activeGain;
#ifdef USE_HAMLIB #ifdef USE_HAMLIB
RigThread *rigThread; RigThread *rigThread;
std::thread *t_Rig; std::thread *t_Rig;

View File

@ -6,14 +6,16 @@
wxBEGIN_EVENT_TABLE(FrequencyDialog, wxDialog) wxBEGIN_EVENT_TABLE(FrequencyDialog, wxDialog)
EVT_CHAR_HOOK(FrequencyDialog::OnChar) EVT_CHAR_HOOK(FrequencyDialog::OnChar)
EVT_SHOW(FrequencyDialog::OnShow)
wxEND_EVENT_TABLE() wxEND_EVENT_TABLE()
FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxString & title, DemodulatorInstance *demod, const wxPoint & position, FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxString & title, DemodulatorInstance *demod, const wxPoint & position,
const wxSize & size, long style, FrequencyDialogTarget targetMode) : const wxSize & size, long style, FrequencyDialogTarget targetMode, wxString initString) :
wxDialog(parent, id, title, position, size, style) { wxDialog(parent, id, title, position, size, style) {
wxString freqStr; wxString freqStr;
activeDemod = demod; activeDemod = demod;
this->targetMode = targetMode; this->targetMode = targetMode;
this->initialString = initString;
if (targetMode == FDIALOG_TARGET_DEFAULT) { if (targetMode == FDIALOG_TARGET_DEFAULT) {
if (activeDemod) { if (activeDemod) {
@ -32,28 +34,53 @@ FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxStrin
} }
} }
if (targetMode == FDIALOG_TARGET_WATERFALL_LPS) {
freqStr = std::to_string(wxGetApp().getAppFrame()->getWaterfallDataThread()->getLinesPerSecond());
}
if (targetMode == FDIALOG_TARGET_SPECTRUM_AVG) {
freqStr = std::to_string(wxGetApp().getSpectrumProcessor()->getFFTAverageRate());
}
if (targetMode == FDIALOG_TARGET_GAIN) {
if (wxGetApp().getActiveGainEntry() != "") {
freqStr = std::to_string((int)wxGetApp().getGain(wxGetApp().getActiveGainEntry()));
}
}
dialogText = new wxTextCtrl(this, wxID_FREQ_INPUT, freqStr, wxPoint(6, 1), wxSize(size.GetWidth() - 20, size.GetHeight() - 70), dialogText = new wxTextCtrl(this, wxID_FREQ_INPUT, freqStr, wxPoint(6, 1), wxSize(size.GetWidth() - 20, size.GetHeight() - 70),
wxTE_PROCESS_ENTER); wxTE_PROCESS_ENTER);
dialogText->SetFont(wxFont(20, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); dialogText->SetFont(wxFont(20, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD));
Centre(); Centre();
if (initString != "" && initString.length() == 1) {
dialogText->SetValue(initString);
dialogText->SetSelection(2, 2);
dialogText->SetFocus();
} else {
if (initString != "") {
dialogText->SetValue(initString);
}
dialogText->SetSelection(-1, -1); dialogText->SetSelection(-1, -1);
} }
}
void FrequencyDialog::OnChar(wxKeyEvent& event) { void FrequencyDialog::OnChar(wxKeyEvent& event) {
int c = event.GetKeyCode(); int c = event.GetKeyCode();
long long freq; long long freq;
double dblval;
std::string lastDemodType = activeDemod?activeDemod->getDemodulatorType():wxGetApp().getDemodMgr().getLastDemodulatorType(); std::string lastDemodType = activeDemod?activeDemod->getDemodulatorType():wxGetApp().getDemodMgr().getLastDemodulatorType();
std::string strValue = dialogText->GetValue().ToStdString();
switch (c) { switch (c) {
case WXK_RETURN: case WXK_RETURN:
case WXK_NUMPAD_ENTER: case WXK_NUMPAD_ENTER:
// Do Stuff // Do Stuff
freq = strToFrequency(dialogText->GetValue().ToStdString());
if (targetMode == FDIALOG_TARGET_DEFAULT) { if (targetMode == FDIALOG_TARGET_DEFAULT) {
freq = strToFrequency(strValue);
if (activeDemod) { if (activeDemod) {
activeDemod->setTracking(true); activeDemod->setTracking(true);
activeDemod->setFollow(true); activeDemod->setFollow(true);
@ -64,6 +91,7 @@ void FrequencyDialog::OnChar(wxKeyEvent& event) {
} }
} }
if (targetMode == FDIALOG_TARGET_BANDWIDTH) { if (targetMode == FDIALOG_TARGET_BANDWIDTH) {
freq = strToFrequency(strValue);
if (lastDemodType == "USB" || lastDemodType == "LSB") { if (lastDemodType == "USB" || lastDemodType == "LSB") {
freq *= 2; freq *= 2;
} }
@ -73,6 +101,59 @@ void FrequencyDialog::OnChar(wxKeyEvent& event) {
wxGetApp().getDemodMgr().setLastBandwidth(freq); wxGetApp().getDemodMgr().setLastBandwidth(freq);
} }
} }
if (targetMode == FDIALOG_TARGET_WATERFALL_LPS) {
try {
freq = std::stoi(strValue);
} catch (exception e) {
Close();
break;
}
if (freq > 1024) {
freq = 1024;
}
if (freq < 1) {
freq = 1;
}
wxGetApp().getAppFrame()->setWaterfallLinesPerSecond(freq);
}
if (targetMode == FDIALOG_TARGET_SPECTRUM_AVG) {
try {
dblval = std::stod(strValue);
} catch (exception e) {
Close();
break;
}
if (dblval > 0.99) {
dblval = 0.99;
}
if (dblval < 0.1) {
dblval = 0.1;
}
wxGetApp().getAppFrame()->setSpectrumAvgSpeed(dblval);
}
if (targetMode == FDIALOG_TARGET_GAIN) {
try {
freq = std::stoi(strValue);
} catch (exception e) {
break;
}
SDRDeviceInfo *devInfo = wxGetApp().getDevice();
std::string gainName = wxGetApp().getActiveGainEntry();
if (gainName == "") {
break;
}
SDRRangeMap gains = devInfo->getGains(SOAPY_SDR_RX, 0);
if (freq > gains[gainName].maximum()) {
freq = gains[gainName].maximum();
}
if (freq < gains[gainName].minimum()) {
freq = gains[gainName].minimum();
}
wxGetApp().setGain(gainName, freq);
wxGetApp().getAppFrame()->refreshGainUI();
}
Close(); Close();
break; break;
case WXK_ESCAPE: case WXK_ESCAPE:
@ -104,3 +185,11 @@ void FrequencyDialog::OnChar(wxKeyEvent& event) {
event.Skip(); event.Skip();
} }
} }
void FrequencyDialog::OnShow(wxShowEvent &event) {
if (initialString.length() == 1) {
dialogText->SetFocus();
dialogText->SetSelection(2, 2);
}
event.Skip();
}

View File

@ -11,13 +11,22 @@
class FrequencyDialog: public wxDialog class FrequencyDialog: public wxDialog
{ {
public: public:
typedef enum FrequencyDialogTarget { FDIALOG_TARGET_DEFAULT, FDIALOG_TARGET_CENTERFREQ, FDIALOG_TARGET_FREQ, FDIALOG_TARGET_BANDWIDTH } FrequencyDialogTarget; typedef enum FrequencyDialogTarget {
FDIALOG_TARGET_DEFAULT,
FDIALOG_TARGET_CENTERFREQ,
FDIALOG_TARGET_FREQ,
FDIALOG_TARGET_BANDWIDTH,
FDIALOG_TARGET_WATERFALL_LPS,
FDIALOG_TARGET_SPECTRUM_AVG,
FDIALOG_TARGET_GAIN
} FrequencyDialogTarget;
FrequencyDialog ( wxWindow * parent, wxWindowID id, const wxString & title, FrequencyDialog ( wxWindow * parent, wxWindowID id, const wxString & title,
DemodulatorInstance *demod = NULL, DemodulatorInstance *demod = NULL,
const wxPoint & pos = wxDefaultPosition, const wxPoint & pos = wxDefaultPosition,
const wxSize & size = wxDefaultSize, const wxSize & size = wxDefaultSize,
long style = wxDEFAULT_DIALOG_STYLE, long style = wxDEFAULT_DIALOG_STYLE,
FrequencyDialogTarget targetMode = FDIALOG_TARGET_DEFAULT); FrequencyDialogTarget targetMode = FDIALOG_TARGET_DEFAULT,
wxString initString = "");
wxTextCtrl * dialogText; wxTextCtrl * dialogText;
@ -25,6 +34,8 @@ private:
DemodulatorInstance *activeDemod; DemodulatorInstance *activeDemod;
void OnEnter ( wxCommandEvent &event ); void OnEnter ( wxCommandEvent &event );
void OnChar ( wxKeyEvent &event ); void OnChar ( wxKeyEvent &event );
void OnShow(wxShowEvent &event);
FrequencyDialogTarget targetMode; FrequencyDialogTarget targetMode;
std::string initialString;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };

View File

@ -132,6 +132,9 @@ void GainCanvas::OnMouseMoved(wxMouseEvent& event) {
int i = 0; int i = 0;
for (std::vector<GainInfo *>::iterator gi = gainInfo.begin(); gi != gainInfo.end(); gi++) { for (std::vector<GainInfo *>::iterator gi = gainInfo.begin(); gi != gainInfo.end(); gi++) {
(*gi)->highlightPanel.visible = (i==panelHit); (*gi)->highlightPanel.visible = (i==panelHit);
if (i==panelHit) {
wxGetApp().setActiveGainEntry((*gi)->name);
}
i++; i++;
} }

View File

@ -19,7 +19,7 @@
InteractiveCanvas::InteractiveCanvas(wxWindow *parent, int *attribList) : InteractiveCanvas::InteractiveCanvas(wxWindow *parent, int *attribList) :
wxGLCanvas(parent, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize, wxGLCanvas(parent, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize,
wxFULL_REPAINT_ON_RESIZE| wxWANTS_CHARS), parent(parent), shiftDown(false), altDown(false), ctrlDown(false), centerFreq(0), bandwidth(0), lastBandwidth(0), isView( wxFULL_REPAINT_ON_RESIZE), parent(parent), shiftDown(false), altDown(false), ctrlDown(false), centerFreq(0), bandwidth(0), lastBandwidth(0), isView(
false) { false) {
mouseTracker.setTarget(this); mouseTracker.setTarget(this);
} }
@ -157,6 +157,17 @@ void InteractiveCanvas::OnMouseEnterWindow(wxMouseEvent& event) {
void InteractiveCanvas::setStatusText(std::string statusText) { void InteractiveCanvas::setStatusText(std::string statusText) {
wxGetApp().getAppFrame()->GetStatusBar()->SetStatusText(statusText); wxGetApp().getAppFrame()->GetStatusBar()->SetStatusText(statusText);
if (wxGetApp().getConfig()->getShowTips()) {
if (statusText != lastToolTip) {
wxToolTip::Enable(false);
this->SetToolTip(statusText);
lastToolTip = statusText;
wxToolTip::SetDelay(1000);
wxToolTip::Enable(true);
}
} else {
this->SetToolTip("");
}
} }
void InteractiveCanvas::setStatusText(std::string statusText, int value) { void InteractiveCanvas::setStatusText(std::string statusText, int value) {

View File

@ -58,5 +58,6 @@ protected:
unsigned int lastBandwidth; unsigned int lastBandwidth;
bool isView; bool isView;
std::string lastToolTip;
}; };

View File

@ -52,6 +52,11 @@ void MeterCanvas::setMin(float min_in) {
Refresh(); Refresh();
} }
void MeterCanvas::setUserInputValue(float slider_in) {
userInputValue = slider_in;
Refresh();
}
void MeterCanvas::setInputValue(float slider_in) { void MeterCanvas::setInputValue(float slider_in) {
userInputValue = inputValue = slider_in; userInputValue = inputValue = slider_in;
Refresh(); Refresh();

View File

@ -24,6 +24,7 @@ public:
void setMax(float max_in); void setMax(float max_in);
void setMin(float max_in); void setMin(float max_in);
void setUserInputValue(float slider_in);
void setInputValue(float slider_in); void setInputValue(float slider_in);
bool inputChanged(); bool inputChanged();
float getInputValue(); float getInputValue();

View File

@ -26,8 +26,8 @@ EVT_RIGHT_UP(TuningCanvas::OnMouseRightReleased)
EVT_LEAVE_WINDOW(TuningCanvas::OnMouseLeftWindow) EVT_LEAVE_WINDOW(TuningCanvas::OnMouseLeftWindow)
EVT_ENTER_WINDOW(TuningCanvas::OnMouseEnterWindow) EVT_ENTER_WINDOW(TuningCanvas::OnMouseEnterWindow)
EVT_MOUSEWHEEL(TuningCanvas::OnMouseWheelMoved) EVT_MOUSEWHEEL(TuningCanvas::OnMouseWheelMoved)
EVT_KEY_DOWN(TuningCanvas::OnKeyDown) //EVT_KEY_DOWN(TuningCanvas::OnKeyDown)
EVT_KEY_UP(TuningCanvas::OnKeyUp) //EVT_KEY_UP(TuningCanvas::OnKeyUp)
wxEND_EVENT_TABLE() wxEND_EVENT_TABLE()
TuningCanvas::TuningCanvas(wxWindow *parent, int *attribList) : TuningCanvas::TuningCanvas(wxWindow *parent, int *attribList) :
@ -303,13 +303,13 @@ void TuningCanvas::OnMouseMoved(wxMouseEvent& event) {
} else { } else {
switch (hoverState) { switch (hoverState) {
case TUNING_HOVER_FREQ: case TUNING_HOVER_FREQ:
setStatusText("Click, wheel or drag a digit to change frequency; SPACE for direct input. Right click to set/clear snap. Hold ALT to change PPM. Hold SHIFT to disable carry."); setStatusText("Click, wheel or drag a digit to change frequency; SPACE or numeric key for direct input. Right click to set/clear snap. Hold ALT to change PPM. Hold SHIFT to disable carry.");
break; break;
case TUNING_HOVER_BW: case TUNING_HOVER_BW:
setStatusText("Click, wheel or drag a digit to change bandwidth; SPACE for direct input. Hold SHIFT to disable carry."); setStatusText("Click, wheel or drag a digit to change bandwidth; SPACE or numeric key for direct input. Hold SHIFT to disable carry.");
break; break;
case TUNING_HOVER_CENTER: case TUNING_HOVER_CENTER:
setStatusText("Click, wheel or drag a digit to change center frequency; SPACE for direct input. Hold SHIFT to disable carry."); setStatusText("Click, wheel or drag a digit to change center frequency; SPACE or numeric key for direct input. Hold SHIFT to disable carry.");
break; break;
case TUNING_HOVER_PPM: case TUNING_HOVER_PPM:
setStatusText("Click, wheel or drag a digit to change device PPM offset. Hold SHIFT to disable carry."); setStatusText("Click, wheel or drag a digit to change device PPM offset. Hold SHIFT to disable carry.");
@ -428,3 +428,7 @@ void TuningCanvas::OnKeyDown(wxKeyEvent& event) {
void TuningCanvas::OnKeyUp(wxKeyEvent& event) { void TuningCanvas::OnKeyUp(wxKeyEvent& event) {
InteractiveCanvas::OnKeyUp(event); InteractiveCanvas::OnKeyUp(event);
} }
TuningCanvas::ActiveState TuningCanvas::getHoverState() {
return hoverState;
}

View File

@ -25,6 +25,10 @@ public:
bool changed(); bool changed();
void setHalfBand(bool hb); void setHalfBand(bool hb);
void OnKeyDown(wxKeyEvent& event);
void OnKeyUp(wxKeyEvent& event);
ActiveState getHoverState();
private: private:
void OnPaint(wxPaintEvent& event); void OnPaint(wxPaintEvent& event);
@ -36,8 +40,6 @@ private:
void OnMouseReleased(wxMouseEvent& event); void OnMouseReleased(wxMouseEvent& event);
void OnMouseEnterWindow(wxMouseEvent& event); void OnMouseEnterWindow(wxMouseEvent& event);
void OnMouseLeftWindow(wxMouseEvent& event); void OnMouseLeftWindow(wxMouseEvent& event);
void OnKeyDown(wxKeyEvent& event);
void OnKeyUp(wxKeyEvent& event);
void OnMouseRightDown(wxMouseEvent& event); void OnMouseRightDown(wxMouseEvent& event);
void OnMouseRightReleased(wxMouseEvent& event); void OnMouseRightReleased(wxMouseEvent& event);

View File

@ -19,8 +19,6 @@
wxBEGIN_EVENT_TABLE(WaterfallCanvas, wxGLCanvas) wxBEGIN_EVENT_TABLE(WaterfallCanvas, wxGLCanvas)
EVT_PAINT(WaterfallCanvas::OnPaint) EVT_PAINT(WaterfallCanvas::OnPaint)
EVT_KEY_DOWN(WaterfallCanvas::OnKeyDown)
EVT_KEY_UP(WaterfallCanvas::OnKeyUp)
EVT_IDLE(WaterfallCanvas::OnIdle) EVT_IDLE(WaterfallCanvas::OnIdle)
EVT_MOTION(WaterfallCanvas::OnMouseMoved) EVT_MOTION(WaterfallCanvas::OnMouseMoved)
EVT_LEFT_DOWN(WaterfallCanvas::OnMouseDown) EVT_LEFT_DOWN(WaterfallCanvas::OnMouseDown)
@ -345,7 +343,6 @@ void WaterfallCanvas::OnKeyUp(wxKeyEvent& event) {
altDown = event.AltDown(); altDown = event.AltDown();
ctrlDown = event.ControlDown(); ctrlDown = event.ControlDown();
switch (event.GetKeyCode()) { switch (event.GetKeyCode()) {
case 'A':
case WXK_UP: case WXK_UP:
case WXK_NUMPAD_UP: case WXK_NUMPAD_UP:
scaleMove = 0.0; scaleMove = 0.0;
@ -354,7 +351,6 @@ void WaterfallCanvas::OnKeyUp(wxKeyEvent& event) {
mouseZoom = 0.95; mouseZoom = 0.95;
} }
break; break;
case 'Z':
case WXK_DOWN: case WXK_DOWN:
case WXK_NUMPAD_DOWN: case WXK_NUMPAD_DOWN:
scaleMove = 0.0; scaleMove = 0.0;
@ -381,7 +377,6 @@ void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) {
long long freq = originalFreq; long long freq = originalFreq;
switch (event.GetKeyCode()) { switch (event.GetKeyCode()) {
case 'A':
case WXK_UP: case WXK_UP:
case WXK_NUMPAD_UP: case WXK_NUMPAD_UP:
if (!shiftDown) { if (!shiftDown) {
@ -391,7 +386,6 @@ void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) {
scaleMove = 1.0; scaleMove = 1.0;
} }
break; break;
case 'Z':
case WXK_DOWN: case WXK_DOWN:
case WXK_NUMPAD_DOWN: case WXK_NUMPAD_DOWN:
if (!shiftDown) { if (!shiftDown) {
@ -601,20 +595,20 @@ void WaterfallCanvas::OnMouseMoved(wxMouseEvent& event) {
mouseTracker.setVertDragLock(true); mouseTracker.setVertDragLock(true);
mouseTracker.setHorizDragLock(false); mouseTracker.setHorizDragLock(false);
setStatusText("Click and drag to change demodulator bandwidth. SPACE for direct frequency input. M for mute, D to delete, C to center."); setStatusText("Click and drag to change demodulator bandwidth. SPACE or numeric key for direct frequency input. M for mute, D to delete, C to center.");
} else { } else {
SetCursor(wxCURSOR_SIZING); SetCursor(wxCURSOR_SIZING);
nextDragState = WF_DRAG_FREQUENCY; nextDragState = WF_DRAG_FREQUENCY;
mouseTracker.setVertDragLock(true); mouseTracker.setVertDragLock(true);
mouseTracker.setHorizDragLock(false); mouseTracker.setHorizDragLock(false);
setStatusText("Click and drag to change demodulator frequency; SPACE for direct input. M for mute, D to delete, C to center."); setStatusText("Click and drag to change demodulator frequency; SPACE or numeric key for direct input. M for mute, D to delete, C to center.");
} }
} else { } else {
SetCursor(wxCURSOR_CROSS); SetCursor(wxCURSOR_CROSS);
nextDragState = WF_DRAG_NONE; nextDragState = WF_DRAG_NONE;
if (shiftDown) { if (shiftDown) {
setStatusText("Click to create a new demodulator or hold ALT to drag range, SPACE for direct center frequency input."); setStatusText("Click to create a new demodulator or hold ALT to drag range, SPACE or numeric key for direct center frequency input.");
} else { } else {
setStatusText( setStatusText(
"Click to move active demodulator frequency or hold ALT to drag range; hold SHIFT to create new. Right drag or wheel to Zoom. Arrow keys to navigate/zoom, C to center."); "Click to move active demodulator frequency or hold ALT to drag range; hold SHIFT to create new. Right drag or wheel to Zoom. Arrow keys to navigate/zoom, C to center.");

View File

@ -33,11 +33,11 @@ public:
void setLinesPerSecond(int lps); void setLinesPerSecond(int lps);
void setMinBandwidth(int min); void setMinBandwidth(int min);
private:
void OnPaint(wxPaintEvent& event);
void OnKeyDown(wxKeyEvent& event); void OnKeyDown(wxKeyEvent& event);
void OnKeyUp(wxKeyEvent& event); void OnKeyUp(wxKeyEvent& event);
private:
void OnPaint(wxPaintEvent& event);
void OnIdle(wxIdleEvent &event); void OnIdle(wxIdleEvent &event);
void OnMouseMoved(wxMouseEvent& event); void OnMouseMoved(wxMouseEvent& event);