From 04ee1534ade9427c86ae57d80860eed7b183569a Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 4 May 2015 19:44:03 -0400 Subject: [PATCH 1/7] Prototype frequency input dialog --- CMakeLists.txt | 2 ++ src/CubicSDR.cpp | 12 ++++++++++-- src/CubicSDR.h | 4 ++++ src/FrequencyDialog.cpp | 21 +++++++++++++++++++++ src/FrequencyDialog.h | 25 +++++++++++++++++++++++++ src/visual/WaterfallCanvas.cpp | 17 +++++------------ 6 files changed, 67 insertions(+), 14 deletions(-) create mode 100644 src/FrequencyDialog.cpp create mode 100644 src/FrequencyDialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cd4d4dd..9038704 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -227,6 +227,7 @@ SET (cubicsdr_sources src/CubicSDR.cpp src/AppFrame.cpp src/AppConfig.cpp + src/FrequencyDialog.cpp src/sdr/SDRThread.cpp src/sdr/SDRPostThread.cpp src/demod/DemodulatorPreThread.cpp @@ -269,6 +270,7 @@ SET (cubicsdr_headers src/CubicSDR.h src/AppFrame.h src/AppConfig.h + src/FrequencyDialog.h src/sdr/SDRThread.h src/sdr/SDRPostThread.h src/demod/DemodulatorPreThread.h diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index be24cd5..56cf539 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -13,7 +13,7 @@ #endif #include "CubicSDR.h" -#include "AppFrame.h" +#include "FrequencyDialog.h" #ifdef _OSX_APP_ #include "CoreFoundation/CoreFoundation.h" @@ -92,7 +92,7 @@ bool CubicSDR::OnInit() { t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread); t_SDR = new std::thread(&SDRThread::threadMain, sdrThread); - AppFrame *appframe = new AppFrame(); + appframe = new AppFrame(); #ifdef __APPLE__ int main_policy; @@ -271,3 +271,11 @@ int CubicSDR::getPPM() { return ppm; } + +void CubicSDR::showFrequencyInput() { + FrequencyDialog fdialog(appframe, -1, _("Set Frequency"), wxPoint(-100,-100), wxSize(320, 75 )); + + if ( fdialog.ShowModal() != wxID_OK ) { + } else { + } +} diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 38975c3..dfc7e33 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -15,6 +15,7 @@ #include "AudioThread.h" #include "DemodulatorMgr.h" #include "AppConfig.h" +#include "AppFrame.h" #define NUM_DEMODULATORS 1 @@ -56,7 +57,10 @@ public: void setPPM(int ppm_in); int getPPM(); + void showFrequencyInput(); + private: + AppFrame *appframe; AppConfig config; PrimaryGLContext *m_glContext; std::vector devs; diff --git a/src/FrequencyDialog.cpp b/src/FrequencyDialog.cpp new file mode 100644 index 0000000..314559c --- /dev/null +++ b/src/FrequencyDialog.cpp @@ -0,0 +1,21 @@ +#include "FrequencyDialog.h" + +wxBEGIN_EVENT_TABLE(FrequencyDialog, wxDialog) wxEND_EVENT_TABLE() + +FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxString & title, const wxPoint & position, const wxSize & size, long style) : + wxDialog(parent, id, title, position, size, style) { + wxString freqStr = "105.7Mhz"; + + dialogText = new wxTextCtrl(this, -1, freqStr, wxPoint(6, 1), wxSize(size.GetWidth() - 20, size.GetHeight() - 70), wxTE_PROCESS_ENTER); + dialogText->SetFont(wxFont(20, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); + Connect(wxEVT_TEXT_ENTER, wxCommandEventHandler(FrequencyDialog::OnEnter)); + + SetEscapeId(wxID_CANCEL); + + Centre(); +} + +void FrequencyDialog::OnEnter(wxCommandEvent &event) { + std::cout << dialogText->GetValue().ToStdString() << std::endl; + Close(); +} diff --git a/src/FrequencyDialog.h b/src/FrequencyDialog.h new file mode 100644 index 0000000..37a83ff --- /dev/null +++ b/src/FrequencyDialog.h @@ -0,0 +1,25 @@ +#pragma once + +#include "wx/dialog.h" +#include "wx/textctrl.h" +#include "wx/string.h" +#include "wx/button.h" + + +class FrequencyDialog: public wxDialog +{ +public: + + FrequencyDialog ( wxWindow * parent, wxWindowID id, const wxString & title, + const wxPoint & pos = wxDefaultPosition, + const wxSize & size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE ); + + wxTextCtrl * dialogText; + +private: + + void OnEnter ( wxCommandEvent &event ); + + DECLARE_EVENT_TABLE() +}; diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index 77cbdb9..657766d 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -299,16 +299,6 @@ void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) { wxGetApp().getDemodMgr().deleteThread(activeDemod); break; case 'S': - if (!activeDemod) { - break; - } - if (activeDemod->isSquelchEnabled()) { - activeDemod->setSquelchEnabled(false); - } else { - activeDemod->squelchAuto(); - } - break; - case WXK_SPACE: if (!activeDemod) { break; } @@ -318,6 +308,9 @@ void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) { activeDemod->setStereo(true); } break; + case WXK_SPACE: + wxGetApp().showFrequencyInput(); + break; default: event.Skip(); return; @@ -720,14 +713,14 @@ void WaterfallCanvas::OnMouseMoved(wxMouseEvent& event) { mouseTracker.setVertDragLock(true); mouseTracker.setHorizDragLock(false); - setStatusText("Click and drag to change demodulator bandwidth. D to delete, SPACE for stereo."); + setStatusText("Click and drag to change demodulator bandwidth. D to delete, S for stereo."); } else { SetCursor(wxCURSOR_SIZING); nextDragState = WF_DRAG_FREQUENCY; mouseTracker.setVertDragLock(true); mouseTracker.setHorizDragLock(false); - setStatusText("Click and drag to change demodulator frequency. D to delete, SPACE for stereo."); + setStatusText("Click and drag to change demodulator frequency. D to delete, S for stereo."); } } else { SetCursor(wxCURSOR_CROSS); From 78afaaf93de81c24e551b7f12a2bf26a6b95fffb Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 4 May 2015 23:03:55 -0400 Subject: [PATCH 2/7] Default select-all for OSX --- src/FrequencyDialog.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/FrequencyDialog.cpp b/src/FrequencyDialog.cpp index 314559c..ce3c5d1 100644 --- a/src/FrequencyDialog.cpp +++ b/src/FrequencyDialog.cpp @@ -13,6 +13,8 @@ FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxStrin SetEscapeId(wxID_CANCEL); Centre(); + + dialogText->SetSelection(-1, -1); } void FrequencyDialog::OnEnter(wxCommandEvent &event) { From ad21e0c91aedec7524c795726357921cf379eadf Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sat, 9 May 2015 23:13:35 -0400 Subject: [PATCH 3/7] Esc/Enter trap, input filtering, clipboard filtering --- src/FrequencyDialog.cpp | 57 ++++++++++++++++++++++++++++++++++------- src/FrequencyDialog.h | 3 +++ 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/FrequencyDialog.cpp b/src/FrequencyDialog.cpp index ce3c5d1..01d2fd2 100644 --- a/src/FrequencyDialog.cpp +++ b/src/FrequencyDialog.cpp @@ -1,23 +1,62 @@ #include "FrequencyDialog.h" -wxBEGIN_EVENT_TABLE(FrequencyDialog, wxDialog) wxEND_EVENT_TABLE() +#include "wx/clipbrd.h" + +wxBEGIN_EVENT_TABLE(FrequencyDialog, wxDialog) +EVT_CHAR_HOOK(FrequencyDialog::OnChar) +wxEND_EVENT_TABLE() FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxString & title, const wxPoint & position, const wxSize & size, long style) : - wxDialog(parent, id, title, position, size, style) { +wxDialog(parent, id, title, position, size, style) { wxString freqStr = "105.7Mhz"; - dialogText = new wxTextCtrl(this, -1, freqStr, wxPoint(6, 1), wxSize(size.GetWidth() - 20, size.GetHeight() - 70), wxTE_PROCESS_ENTER); + dialogText = new wxTextCtrl(this, wxID_FREQ_INPUT, freqStr, wxPoint(6, 1), wxSize(size.GetWidth() - 20, size.GetHeight() - 70), wxTE_PROCESS_ENTER); dialogText->SetFont(wxFont(20, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); - Connect(wxEVT_TEXT_ENTER, wxCommandEventHandler(FrequencyDialog::OnEnter)); - - SetEscapeId(wxID_CANCEL); Centre(); dialogText->SetSelection(-1, -1); } -void FrequencyDialog::OnEnter(wxCommandEvent &event) { - std::cout << dialogText->GetValue().ToStdString() << std::endl; - Close(); +std::string& FrequencyDialog::filterChars(std::string& s, const std::string& allowed) { + s.erase(remove_if(s.begin(), s.end(), [&allowed](const char& c) { + return allowed.find(c) == std::string::npos; + }), s.end()); + return s; +} + +void FrequencyDialog::OnChar(wxKeyEvent& event) { + wxChar c = event.GetKeyCode(); + + switch (c) { + case WXK_RETURN: + case WXK_NUMPAD_ENTER: + // Do Stuff + + Close(); + break; + case WXK_ESCAPE: + Close(); + break; + } + + std::string allowed("0123456789.MKGHZmkghz"); + + if (allowed.find_first_of(c) != std::string::npos || c == WXK_BACK) { + event.DoAllowNextEvent(); + } else if (event.ControlDown() && c == 'V') { + // Alter clipboard contents to remove unwanted chars + wxTheClipboard->Open(); + wxTextDataObject data; + wxTheClipboard->GetData(data); + std::string clipText = data.GetText().ToStdString(); + std::string pasteText = filterChars(clipText,std::string(allowed)); + wxTheClipboard->SetData(new wxTextDataObject(pasteText)); + wxTheClipboard->Close(); + event.Skip(); + } else if (c == WXK_RIGHT || c == WXK_LEFT || event.ControlDown()) { + event.Skip(); + } else { + std::cout << (int) c << std::endl; + } } diff --git a/src/FrequencyDialog.h b/src/FrequencyDialog.h index 37a83ff..b496a53 100644 --- a/src/FrequencyDialog.h +++ b/src/FrequencyDialog.h @@ -5,6 +5,7 @@ #include "wx/string.h" #include "wx/button.h" +#define wxID_FREQ_INPUT 3001 class FrequencyDialog: public wxDialog { @@ -20,6 +21,8 @@ public: private: void OnEnter ( wxCommandEvent &event ); + void OnChar ( wxKeyEvent &event ); + std::string& filterChars(std::string& s, const std::string& allowed); DECLARE_EVENT_TABLE() }; From dc71da1dcdd2d9578d7d739e7e8b3b5c8a87bde3 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 10 May 2015 01:07:48 -0400 Subject: [PATCH 4/7] freq<->str translation, center frequency change test --- src/FrequencyDialog.cpp | 73 +++++++++++++++++++++++++++++++++++++++-- src/FrequencyDialog.h | 4 ++- 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/FrequencyDialog.cpp b/src/FrequencyDialog.cpp index 01d2fd2..397e317 100644 --- a/src/FrequencyDialog.cpp +++ b/src/FrequencyDialog.cpp @@ -1,6 +1,9 @@ #include "FrequencyDialog.h" #include "wx/clipbrd.h" +#include +#include +#include "CubicSDR.h" wxBEGIN_EVENT_TABLE(FrequencyDialog, wxDialog) EVT_CHAR_HOOK(FrequencyDialog::OnChar) @@ -8,7 +11,7 @@ wxEND_EVENT_TABLE() FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxString & title, const wxPoint & position, const wxSize & size, long style) : wxDialog(parent, id, title, position, size, style) { - wxString freqStr = "105.7Mhz"; + wxString freqStr = frequencyToStr(wxGetApp().getFrequency()); dialogText = new wxTextCtrl(this, wxID_FREQ_INPUT, freqStr, wxPoint(6, 1), wxSize(size.GetWidth() - 20, size.GetHeight() - 70), wxTE_PROCESS_ENTER); dialogText->SetFont(wxFont(20, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); @@ -25,14 +28,78 @@ std::string& FrequencyDialog::filterChars(std::string& s, const std::string& all return s; } +std::string FrequencyDialog::frequencyToStr(long long freq) { + long double freqTemp; + + freqTemp = freq; + std::string suffix(""); + std::stringstream freqStr; + + if (freqTemp >= 1.0e9) { + freqTemp /= 1.0e9; + freqStr << std::setprecision(10); + suffix = std::string("GHz"); + } else if (freqTemp >= 1.0e6) { + freqTemp /= 1.0e6; + freqStr << std::setprecision(7); + suffix = std::string("MHz"); + } else if (freqTemp >= 1.0e3) { + freqTemp /= 1.0e3; + freqStr << std::setprecision(4); + suffix = std::string("KHz"); + } + + freqStr << freqTemp; + freqStr << suffix; + + return freqStr.str(); +} + +long long FrequencyDialog::strToFrequency(std::string freqStr) { + std::string filterStr = filterChars(freqStr,std::string("0123456789.MKGmkg")); + + int numLen = filterStr.find_first_not_of("0123456789."); + + if (numLen == std::string::npos) { + numLen = freqStr.length(); + } + + std::string numPartStr = freqStr.substr(0,numLen); + std::string suffixStr = freqStr.substr(numLen); + + std::stringstream numPartStream; + numPartStream.str(numPartStr); + + long double freqTemp = 0; + + numPartStream >> freqTemp; + + if (suffixStr.length()) { + if (suffixStr.find_first_of("Gg") != std::string::npos) { + freqTemp *= 1.0e9; + } else if (suffixStr.find_first_of("Mm") != std::string::npos) { + freqTemp *= 1.0e6; + } else if (suffixStr.find_first_of("Kk") != std::string::npos) { + freqTemp *= 1.0e3; + } + } else if (numPartStr.find_first_of(".") != std::string::npos) { + freqTemp *= 1.0e6; + } + + return (long long)freqTemp; +} + void FrequencyDialog::OnChar(wxKeyEvent& event) { wxChar c = event.GetKeyCode(); + long long freq; switch (c) { case WXK_RETURN: case WXK_NUMPAD_ENTER: // Do Stuff - + freq = strToFrequency(dialogText->GetValue().ToStdString()); + wxGetApp().setFrequency(freq); + std::cout << freq << std::endl; Close(); break; case WXK_ESCAPE: @@ -50,7 +117,7 @@ void FrequencyDialog::OnChar(wxKeyEvent& event) { wxTextDataObject data; wxTheClipboard->GetData(data); std::string clipText = data.GetText().ToStdString(); - std::string pasteText = filterChars(clipText,std::string(allowed)); + std::string pasteText = filterChars(clipText, std::string(allowed)); wxTheClipboard->SetData(new wxTextDataObject(pasteText)); wxTheClipboard->Close(); event.Skip(); diff --git a/src/FrequencyDialog.h b/src/FrequencyDialog.h index b496a53..98b6b45 100644 --- a/src/FrequencyDialog.h +++ b/src/FrequencyDialog.h @@ -18,11 +18,13 @@ public: wxTextCtrl * dialogText; + long long strToFrequency(std::string freqStr); + std::string frequencyToStr(long long freq); + private: void OnEnter ( wxCommandEvent &event ); void OnChar ( wxKeyEvent &event ); std::string& filterChars(std::string& s, const std::string& allowed); - DECLARE_EVENT_TABLE() }; From 4f9c623fec25cb84dc78ff04d0984ac6c4d93b56 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 10 May 2015 01:39:10 -0400 Subject: [PATCH 5/7] demod frequency input --- src/CubicSDR.cpp | 8 +++----- src/FrequencyDialog.cpp | 29 ++++++++++++++++++++--------- src/FrequencyDialog.h | 4 +++- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 56cf539..f7bab6d 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -273,9 +273,7 @@ int CubicSDR::getPPM() { void CubicSDR::showFrequencyInput() { - FrequencyDialog fdialog(appframe, -1, _("Set Frequency"), wxPoint(-100,-100), wxSize(320, 75 )); - - if ( fdialog.ShowModal() != wxID_OK ) { - } else { - } + FrequencyDialog fdialog(appframe, -1, demodMgr.getActiveDemodulator()?_("Set Demodulator Frequency"):_("Set Frequency"), demodMgr.getActiveDemodulator(), wxPoint(-100,-100), wxSize(320, 75 )); + fdialog.ShowModal(); } + diff --git a/src/FrequencyDialog.cpp b/src/FrequencyDialog.cpp index 397e317..6561058 100644 --- a/src/FrequencyDialog.cpp +++ b/src/FrequencyDialog.cpp @@ -9,9 +9,16 @@ wxBEGIN_EVENT_TABLE(FrequencyDialog, wxDialog) EVT_CHAR_HOOK(FrequencyDialog::OnChar) wxEND_EVENT_TABLE() -FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxString & title, const wxPoint & position, const wxSize & size, long style) : +FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxString & title, DemodulatorInstance *demod, const wxPoint & position, const wxSize & size, long style) : wxDialog(parent, id, title, position, size, style) { - wxString freqStr = frequencyToStr(wxGetApp().getFrequency()); + wxString freqStr; + activeDemod = demod; + + if (activeDemod) { + freqStr = frequencyToStr(activeDemod->getFrequency()); + } else { + freqStr = frequencyToStr(wxGetApp().getFrequency()); + } dialogText = new wxTextCtrl(this, wxID_FREQ_INPUT, freqStr, wxPoint(6, 1), wxSize(size.GetWidth() - 20, size.GetHeight() - 70), wxTE_PROCESS_ENTER); dialogText->SetFont(wxFont(20, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); @@ -56,7 +63,7 @@ std::string FrequencyDialog::frequencyToStr(long long freq) { } long long FrequencyDialog::strToFrequency(std::string freqStr) { - std::string filterStr = filterChars(freqStr,std::string("0123456789.MKGmkg")); + std::string filterStr = filterChars(freqStr, std::string("0123456789.MKGmkg")); int numLen = filterStr.find_first_not_of("0123456789."); @@ -64,7 +71,7 @@ long long FrequencyDialog::strToFrequency(std::string freqStr) { numLen = freqStr.length(); } - std::string numPartStr = freqStr.substr(0,numLen); + std::string numPartStr = freqStr.substr(0, numLen); std::string suffixStr = freqStr.substr(numLen); std::stringstream numPartStream; @@ -86,7 +93,7 @@ long long FrequencyDialog::strToFrequency(std::string freqStr) { freqTemp *= 1.0e6; } - return (long long)freqTemp; + return (long long) freqTemp; } void FrequencyDialog::OnChar(wxKeyEvent& event) { @@ -98,8 +105,14 @@ void FrequencyDialog::OnChar(wxKeyEvent& event) { case WXK_NUMPAD_ENTER: // Do Stuff freq = strToFrequency(dialogText->GetValue().ToStdString()); - wxGetApp().setFrequency(freq); - std::cout << freq << std::endl; + if (activeDemod) { + activeDemod->setTracking(true); + activeDemod->setFollow(true); + activeDemod->setFrequency(freq); + activeDemod->updateLabel(freq); + } else { + wxGetApp().setFrequency(freq); + } Close(); break; case WXK_ESCAPE: @@ -123,7 +136,5 @@ void FrequencyDialog::OnChar(wxKeyEvent& event) { event.Skip(); } else if (c == WXK_RIGHT || c == WXK_LEFT || event.ControlDown()) { event.Skip(); - } else { - std::cout << (int) c << std::endl; } } diff --git a/src/FrequencyDialog.h b/src/FrequencyDialog.h index 98b6b45..42ad7b0 100644 --- a/src/FrequencyDialog.h +++ b/src/FrequencyDialog.h @@ -4,6 +4,7 @@ #include "wx/textctrl.h" #include "wx/string.h" #include "wx/button.h" +#include "DemodulatorInstance.h" #define wxID_FREQ_INPUT 3001 @@ -12,6 +13,7 @@ class FrequencyDialog: public wxDialog public: FrequencyDialog ( wxWindow * parent, wxWindowID id, const wxString & title, + DemodulatorInstance *demod = NULL, const wxPoint & pos = wxDefaultPosition, const wxSize & size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); @@ -22,7 +24,7 @@ public: std::string frequencyToStr(long long freq); private: - + DemodulatorInstance *activeDemod; void OnEnter ( wxCommandEvent &event ); void OnChar ( wxKeyEvent &event ); std::string& filterChars(std::string& s, const std::string& allowed); From fc21d96c125da890e0f9806a8ba00a71e3edcd36 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 10 May 2015 02:30:50 -0400 Subject: [PATCH 6/7] help tip updates, tuning bar support --- src/visual/TuningCanvas.cpp | 18 +++++++++++++++--- src/visual/WaterfallCanvas.cpp | 10 +++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/visual/TuningCanvas.cpp b/src/visual/TuningCanvas.cpp index d65bbaa..216f5e0 100644 --- a/src/visual/TuningCanvas.cpp +++ b/src/visual/TuningCanvas.cpp @@ -271,21 +271,28 @@ void TuningCanvas::OnMouseMoved(wxMouseEvent& event) { } else { switch (hoverState) { case TUNING_HOVER_FREQ: - setStatusText("Click, wheel or drag a digit to change frequency. Hold ALT to change PPM. Hold SHIFT to disable carry."); + setStatusText("Click, wheel or drag a digit to change frequency; SPACE for direct input. Hold ALT to change PPM. Hold SHIFT to disable carry."); break; case TUNING_HOVER_BW: setStatusText("Click, wheel or drag a digit to change bandwidth. Hold SHIFT to disable carry."); break; case TUNING_HOVER_CENTER: - setStatusText("Click, wheel or drag a digit to change center frequency. Hold SHIFT to disable carry."); + setStatusText("Click, wheel or drag a digit to change center frequency; SPACE for direct input. Hold SHIFT to disable carry."); break; case TUNING_HOVER_PPM: setStatusText("Click, wheel or drag a digit to change device PPM offset. Hold SHIFT to disable carry."); break; + case TUNING_HOVER_NONE: + setStatusText(""); + break; } } - + if (hoverState == TUNING_HOVER_BW || hoverState == TUNING_HOVER_FREQ) { + wxGetApp().getDemodMgr().setActiveDemodulator(wxGetApp().getDemodMgr().getLastActiveDemodulator()); + } else { + wxGetApp().getDemodMgr().setActiveDemodulator(NULL); + } } void TuningCanvas::OnMouseDown(wxMouseEvent& event) { @@ -339,6 +346,7 @@ void TuningCanvas::OnMouseLeftWindow(wxMouseEvent& event) { SetCursor(wxCURSOR_CROSS); hoverIndex = 0; hoverState = TUNING_HOVER_NONE; + wxGetApp().getDemodMgr().setActiveDemodulator(wxGetApp().getDemodMgr().getLastActiveDemodulator()); if (currentPPM != lastPPM) { wxGetApp().saveConfig(); @@ -359,6 +367,10 @@ void TuningCanvas::setHelpTip(std::string tip) { void TuningCanvas::OnKeyDown(wxKeyEvent& event) { InteractiveCanvas::OnKeyDown(event); + + if (event.GetKeyCode() == WXK_SPACE && hoverState == TUNING_HOVER_CENTER || hoverState == TUNING_HOVER_FREQ) { + wxGetApp().showFrequencyInput(); + } } void TuningCanvas::OnKeyUp(wxKeyEvent& event) { diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index 657766d..abbc52e 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -141,7 +141,7 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { ColorTheme *currentTheme = ThemeMgr::mgr.currentTheme; int last_type = wxGetApp().getDemodMgr().getLastDemodulatorType(); - if (mouseTracker.mouseInView()) { + if (mouseTracker.mouseInView() || wxGetApp().getDemodMgr().getActiveDemodulator()) { hoverAlpha += (1.0f-hoverAlpha)*0.1f; if (hoverAlpha > 1.5f) { hoverAlpha = 1.5f; @@ -713,23 +713,23 @@ void WaterfallCanvas::OnMouseMoved(wxMouseEvent& event) { mouseTracker.setVertDragLock(true); mouseTracker.setHorizDragLock(false); - setStatusText("Click and drag to change demodulator bandwidth. D to delete, S for stereo."); + setStatusText("Click and drag to change demodulator bandwidth. SPACE for direct frequency input. D to delete, S for stereo."); } else { SetCursor(wxCURSOR_SIZING); nextDragState = WF_DRAG_FREQUENCY; mouseTracker.setVertDragLock(true); mouseTracker.setHorizDragLock(false); - setStatusText("Click and drag to change demodulator frequency. D to delete, S for stereo."); + setStatusText("Click and drag to change demodulator frequency; SPACE for direct input. D to delete, S for stereo."); } } else { SetCursor(wxCURSOR_CROSS); nextDragState = WF_DRAG_NONE; if (shiftDown) { - setStatusText("Click to create a new demodulator or hold ALT to drag range."); + setStatusText("Click to create a new demodulator or hold ALT to drag range, SPACE for direct center frequency input."); } else { setStatusText( - "Click to move active demodulator frequency or hold ALT to drag range; hold SHIFT to create new. Right drag or A / Z to Zoom. Arrow keys (+SHIFT) to move center frequency."); + "Click to move active demodulator frequency or hold ALT to drag range; hold SHIFT to create new. Right drag or A / Z to Zoom. Arrow keys (+SHIFT) to move center frequency; SPACE for direct input."); } } From 010481d74f67ed1e218df0b405046da8ef1e56cb Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 10 May 2015 20:00:48 -0400 Subject: [PATCH 7/7] Cleanup and fixes --- src/CubicSDR.cpp | 2 +- src/FrequencyDialog.cpp | 14 ++++++++------ src/visual/TuningCanvas.cpp | 4 ++-- src/visual/WaterfallCanvas.cpp | 2 ++ 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index f7bab6d..7d5fb54 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -273,7 +273,7 @@ int CubicSDR::getPPM() { void CubicSDR::showFrequencyInput() { - FrequencyDialog fdialog(appframe, -1, demodMgr.getActiveDemodulator()?_("Set Demodulator Frequency"):_("Set Frequency"), demodMgr.getActiveDemodulator(), wxPoint(-100,-100), wxSize(320, 75 )); + FrequencyDialog fdialog(appframe, -1, demodMgr.getActiveDemodulator()?_("Set Demodulator Frequency"):_("Set Center Frequency"), demodMgr.getActiveDemodulator(), wxPoint(-100,-100), wxSize(320, 75 )); fdialog.ShowModal(); } diff --git a/src/FrequencyDialog.cpp b/src/FrequencyDialog.cpp index 6561058..30b9309 100644 --- a/src/FrequencyDialog.cpp +++ b/src/FrequencyDialog.cpp @@ -5,12 +5,12 @@ #include #include "CubicSDR.h" -wxBEGIN_EVENT_TABLE(FrequencyDialog, wxDialog) -EVT_CHAR_HOOK(FrequencyDialog::OnChar) +wxBEGIN_EVENT_TABLE(FrequencyDialog, wxDialog) EVT_CHAR_HOOK(FrequencyDialog::OnChar) wxEND_EVENT_TABLE() -FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxString & title, DemodulatorInstance *demod, const wxPoint & position, const wxSize & size, long style) : -wxDialog(parent, id, title, position, size, style) { +FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxString & title, DemodulatorInstance *demod, const wxPoint & position, + const wxSize & size, long style) : + wxDialog(parent, id, title, position, size, style) { wxString freqStr; activeDemod = demod; @@ -20,7 +20,8 @@ wxDialog(parent, id, title, position, size, style) { freqStr = frequencyToStr(wxGetApp().getFrequency()); } - dialogText = new wxTextCtrl(this, wxID_FREQ_INPUT, freqStr, wxPoint(6, 1), wxSize(size.GetWidth() - 20, size.GetHeight() - 70), wxTE_PROCESS_ENTER); + dialogText = new wxTextCtrl(this, wxID_FREQ_INPUT, freqStr, wxPoint(6, 1), wxSize(size.GetWidth() - 20, size.GetHeight() - 70), + wxTE_PROCESS_ENTER); dialogText->SetFont(wxFont(20, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); Centre(); @@ -122,7 +123,8 @@ void FrequencyDialog::OnChar(wxKeyEvent& event) { std::string allowed("0123456789.MKGHZmkghz"); - if (allowed.find_first_of(c) != std::string::npos || c == WXK_BACK) { + if (allowed.find_first_of(c) != std::string::npos || c == WXK_DELETE || c == WXK_BACK || c == WXK_NUMPAD_DECIMAL + || (c >= WXK_NUMPAD0 && c <= WXK_NUMPAD9)) { event.DoAllowNextEvent(); } else if (event.ControlDown() && c == 'V') { // Alter clipboard contents to remove unwanted chars diff --git a/src/visual/TuningCanvas.cpp b/src/visual/TuningCanvas.cpp index 216f5e0..e6322d7 100644 --- a/src/visual/TuningCanvas.cpp +++ b/src/visual/TuningCanvas.cpp @@ -346,7 +346,7 @@ void TuningCanvas::OnMouseLeftWindow(wxMouseEvent& event) { SetCursor(wxCURSOR_CROSS); hoverIndex = 0; hoverState = TUNING_HOVER_NONE; - wxGetApp().getDemodMgr().setActiveDemodulator(wxGetApp().getDemodMgr().getLastActiveDemodulator()); + wxGetApp().getDemodMgr().setActiveDemodulator(NULL); if (currentPPM != lastPPM) { wxGetApp().saveConfig(); @@ -368,7 +368,7 @@ void TuningCanvas::setHelpTip(std::string tip) { void TuningCanvas::OnKeyDown(wxKeyEvent& event) { InteractiveCanvas::OnKeyDown(event); - if (event.GetKeyCode() == WXK_SPACE && hoverState == TUNING_HOVER_CENTER || hoverState == TUNING_HOVER_FREQ) { + if (event.GetKeyCode() == WXK_SPACE && (hoverState == TUNING_HOVER_CENTER || hoverState == TUNING_HOVER_FREQ)) { wxGetApp().showFrequencyInput(); } } diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index abbc52e..b00fb84 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -193,6 +193,8 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { } } + glContext->setHoverAlpha(0); + for (int i = 0, iMax = demods.size(); i < iMax; i++) { if (activeDemodulator == demods[i] || lastActiveDemodulator == demods[i]) { continue;