Set PPM via Tuning bar by holding ALT

This commit is contained in:
Charles J. Cliffe 2015-04-22 22:54:48 -04:00
parent 3241106bf7
commit a3a33eb3fe
11 changed files with 109 additions and 15 deletions

View File

@ -323,6 +323,7 @@ void AppFrame::OnMenu(wxCommandEvent& event) {
long ofs = wxGetNumberFromUser("Frequency correction for device in PPM.\ni.e. -51 for -51 PPM", "Parts per million (PPM)", long ofs = wxGetNumberFromUser("Frequency correction for device in PPM.\ni.e. -51 for -51 PPM", "Parts per million (PPM)",
"Frequency Correction", wxGetApp().getPPM(), -1000, 1000, this); "Frequency Correction", wxGetApp().getPPM(), -1000, 1000, this);
wxGetApp().setPPM(ofs); wxGetApp().setPPM(ofs);
wxGetApp().saveConfig();
} else if (event.GetId() == wxID_SAVE) { } else if (event.GetId() == wxID_SAVE) {
if (!currentSessionFile.empty()) { if (!currentSessionFile.empty()) {
saveSession(currentSessionFile); saveSession(currentSessionFile);
@ -531,6 +532,8 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
waterfallCanvas->SetFocus(); waterfallCanvas->SetFocus();
} }
scopeCanvas->setPPMMode(demodTuner->isAltDown());
event.Skip(); event.Skip();
} }

View File

@ -239,6 +239,10 @@ AppConfig *CubicSDR::getConfig() {
return &config; return &config;
} }
void CubicSDR::saveConfig() {
config.save();
}
void CubicSDR::setPPM(int ppm_in) { void CubicSDR::setPPM(int ppm_in) {
if (sdrThread->getDeviceId() < 0) { if (sdrThread->getDeviceId() < 0) {
return; return;

View File

@ -51,6 +51,7 @@ public:
void removeDemodulator(DemodulatorInstance *demod); void removeDemodulator(DemodulatorInstance *demod);
AppConfig *getConfig(); AppConfig *getConfig();
void saveConfig();
void setPPM(int ppm_in); void setPPM(int ppm_in);
int getPPM(); int getPPM();

View File

@ -81,6 +81,18 @@ MouseTracker *InteractiveCanvas::getMouseTracker() {
return &mouseTracker; return &mouseTracker;
} }
bool InteractiveCanvas::isAltDown() {
return altDown;
}
bool InteractiveCanvas::isCtrlDown() {
return ctrlDown;
}
bool InteractiveCanvas::isShiftDown() {
return shiftDown;
}
void InteractiveCanvas::OnKeyUp(wxKeyEvent& event) { void InteractiveCanvas::OnKeyUp(wxKeyEvent& event) {
shiftDown = event.ShiftDown(); shiftDown = event.ShiftDown();
altDown = event.AltDown(); altDown = event.AltDown();
@ -88,8 +100,6 @@ void InteractiveCanvas::OnKeyUp(wxKeyEvent& event) {
} }
void InteractiveCanvas::OnKeyDown(wxKeyEvent& event) { void InteractiveCanvas::OnKeyDown(wxKeyEvent& event) {
float angle = 5.0;
shiftDown = event.ShiftDown(); shiftDown = event.ShiftDown();
altDown = event.AltDown(); altDown = event.AltDown();
ctrlDown = event.ControlDown(); ctrlDown = event.ControlDown();
@ -125,10 +135,18 @@ void InteractiveCanvas::OnMouseReleased(wxMouseEvent& event) {
void InteractiveCanvas::OnMouseLeftWindow(wxMouseEvent& event) { void InteractiveCanvas::OnMouseLeftWindow(wxMouseEvent& event) {
mouseTracker.OnMouseLeftWindow(event); mouseTracker.OnMouseLeftWindow(event);
shiftDown = false;
altDown = false;
ctrlDown = false;
} }
void InteractiveCanvas::OnMouseEnterWindow(wxMouseEvent& event) { void InteractiveCanvas::OnMouseEnterWindow(wxMouseEvent& event) {
mouseTracker.OnMouseEnterWindow(event); mouseTracker.OnMouseEnterWindow(event);
shiftDown = event.ShiftDown();
altDown = event.AltDown();
ctrlDown = event.ControlDown();
} }
void InteractiveCanvas::setStatusText(std::string statusText) { void InteractiveCanvas::setStatusText(std::string statusText) {

View File

@ -25,6 +25,10 @@ public:
MouseTracker *getMouseTracker(); MouseTracker *getMouseTracker();
bool isAltDown();
bool isCtrlDown();
bool isShiftDown();
protected: protected:
void OnKeyDown(wxKeyEvent& event); void OnKeyDown(wxKeyEvent& event);
void OnKeyUp(wxKeyEvent& event); void OnKeyUp(wxKeyEvent& event);

View File

@ -21,7 +21,7 @@ wxEND_EVENT_TABLE()
ScopeCanvas::ScopeCanvas(wxWindow *parent, int *attribList) : ScopeCanvas::ScopeCanvas(wxWindow *parent, int *attribList) :
wxGLCanvas(parent, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize, wxGLCanvas(parent, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize,
wxFULL_REPAINT_ON_RESIZE), parent(parent), stereo(false) { wxFULL_REPAINT_ON_RESIZE), parent(parent), stereo(false), ppmMode(false) {
glContext = new ScopeContext(this, &wxGetApp().GetContext(this)); glContext = new ScopeContext(this, &wxGetApp().GetContext(this));
} }
@ -43,6 +43,14 @@ void ScopeCanvas::setDeviceName(std::string device_name) {
deviceName.append(" "); deviceName.append(" ");
} }
void ScopeCanvas::setPPMMode(bool ppmMode) {
this->ppmMode = ppmMode;
}
bool ScopeCanvas::getPPMMode() {
return ppmMode;
}
void ScopeCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { void ScopeCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
wxPaintDC dc(this); wxPaintDC dc(this);
#ifdef __APPLE__ // force half-rate? #ifdef __APPLE__ // force half-rate?
@ -75,7 +83,7 @@ void ScopeCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
glViewport(0, 0, ClientSize.x, ClientSize.y); glViewport(0, 0, ClientSize.x, ClientSize.y);
glContext->DrawBegin(); glContext->DrawBegin();
glContext->Plot(waveform_points, stereo); glContext->Plot(waveform_points, stereo, ppmMode);
if (!deviceName.empty()) { if (!deviceName.empty()) {
glContext->DrawDeviceName(deviceName); glContext->DrawDeviceName(deviceName);
} }

View File

@ -19,6 +19,9 @@ public:
void setWaveformPoints(std::vector<float> &waveform_points_in); void setWaveformPoints(std::vector<float> &waveform_points_in);
void setStereo(bool state); void setStereo(bool state);
void setDeviceName(std::string device_name); void setDeviceName(std::string device_name);
void setPPMMode(bool ppmMode);
bool getPPMMode();
private: private:
void OnPaint(wxPaintEvent& event); void OnPaint(wxPaintEvent& event);
@ -29,6 +32,7 @@ private:
ScopeContext *glContext; ScopeContext *glContext;
std::string deviceName; std::string deviceName;
bool stereo; bool stereo;
bool ppmMode;
// event table // event table
wxDECLARE_EVENT_TABLE(); wxDECLARE_EVENT_TABLE();
}; };

View File

@ -23,7 +23,7 @@ void ScopeContext::DrawBegin() {
glDisable (GL_TEXTURE_2D); glDisable (GL_TEXTURE_2D);
} }
void ScopeContext::Plot(std::vector<float> &points, bool stereo) { void ScopeContext::Plot(std::vector<float> &points, bool stereo, bool ppmMode) {
if (stereo) { if (stereo) {
glBegin(GL_QUADS); glBegin(GL_QUADS);
glColor3f(ThemeMgr::mgr.currentTheme->scopeBackground.r, ThemeMgr::mgr.currentTheme->scopeBackground.g, ThemeMgr::mgr.currentTheme->scopeBackground.b); glColor3f(ThemeMgr::mgr.currentTheme->scopeBackground.r, ThemeMgr::mgr.currentTheme->scopeBackground.g, ThemeMgr::mgr.currentTheme->scopeBackground.b);
@ -81,7 +81,7 @@ void ScopeContext::Plot(std::vector<float> &points, bool stereo) {
glColor3f(0.65, 0.65, 0.65); glColor3f(0.65, 0.65, 0.65);
getFont(PrimaryGLContext::GLFONT_SIZE12).drawString("Frequency", -0.66, -1.0+hPos, 12, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER); getFont(PrimaryGLContext::GLFONT_SIZE12).drawString(ppmMode?"Device PPM":"Frequency", -0.66, -1.0+hPos, 12, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER);
getFont(PrimaryGLContext::GLFONT_SIZE12).drawString("Bandwidth", 0.0, -1.0+hPos, 12, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER); getFont(PrimaryGLContext::GLFONT_SIZE12).drawString("Bandwidth", 0.0, -1.0+hPos, 12, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER);
getFont(PrimaryGLContext::GLFONT_SIZE12).drawString("Center Frequency", 0.66, -1.0+hPos, 12, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER); getFont(PrimaryGLContext::GLFONT_SIZE12).drawString("Center Frequency", 0.66, -1.0+hPos, 12, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER);

View File

@ -12,7 +12,7 @@ public:
ScopeContext(ScopeCanvas *canvas, wxGLContext *sharedContext); ScopeContext(ScopeCanvas *canvas, wxGLContext *sharedContext);
void DrawBegin(); void DrawBegin();
void Plot(std::vector<float> &points, bool stereo=false); void Plot(std::vector<float> &points, bool stereo=false, bool ppmMode=false);
void DrawDeviceName(std::string deviceName); void DrawDeviceName(std::string deviceName);
void DrawDivider(); void DrawDivider();
void DrawEnd(); void DrawEnd();

View File

@ -23,6 +23,8 @@ EVT_LEFT_UP(TuningCanvas::OnMouseReleased)
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_UP(TuningCanvas::OnKeyUp)
wxEND_EVENT_TABLE() wxEND_EVENT_TABLE()
TuningCanvas::TuningCanvas(wxWindow *parent, int *attribList) : TuningCanvas::TuningCanvas(wxWindow *parent, int *attribList) :
@ -44,6 +46,8 @@ TuningCanvas::TuningCanvas(wxWindow *parent, int *attribList) :
centerDP = -1.0 + (2.0 / 3.0) * 2.0; centerDP = -1.0 + (2.0 / 3.0) * 2.0;
centerW = (1.0 / 3.0) * 2.0; centerW = (1.0 / 3.0) * 2.0;
currentPPM = lastPPM = 0;
} }
TuningCanvas::~TuningCanvas() { TuningCanvas::~TuningCanvas() {
@ -110,10 +114,17 @@ void TuningCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
break; break;
case TUNING_HOVER_NONE: case TUNING_HOVER_NONE:
break; break;
} case TUNING_HOVER_PPM:
glContext->DrawTunerBarIndexed(hoverIndex, hoverIndex, 11, freqDP, freqW, clr, 0.25, top, bottom); // freq
break;
}
} }
glContext->DrawTuner(freq, 11, freqDP, freqW); if (altDown) {
glContext->DrawTuner(currentPPM, 11, freqDP, freqW);
} else {
glContext->DrawTuner(freq, 11, freqDP, freqW);
}
glContext->DrawTuner(bw, 7, bwDP, bwW); glContext->DrawTuner(bw, 7, bwDP, bwW);
glContext->DrawTuner(center, 11, centerDP, centerW); glContext->DrawTuner(center, 11, centerDP, centerW);
@ -179,6 +190,25 @@ void TuningCanvas::StepTuner(ActiveState state, int exponent, bool up) {
wxGetApp().setFrequency(ctr); wxGetApp().setFrequency(ctr);
} }
if (state == TUNING_HOVER_PPM) {
if (shiftDown) {
bool carried = (long long)((currentPPM) / (exp * 10)) != (long long)((currentPPM + amount) / (exp * 10)) || (bottom && currentPPM < exp);
currentPPM += carried?(9*-amount):amount;
} else {
currentPPM += amount;
}
if (currentPPM > 2000) {
currentPPM = 2000;
}
if (currentPPM < -2000) {
currentPPM = -2000;
}
wxGetApp().setPPM(currentPPM);
}
} }
void TuningCanvas::OnIdle(wxIdleEvent &event) { void TuningCanvas::OnIdle(wxIdleEvent &event) {
@ -215,7 +245,7 @@ void TuningCanvas::OnMouseMoved(wxMouseEvent& event) {
index = glContext->GetTunerDigitIndex(mouseTracker.getMouseX(), 11, freqDP, freqW); // freq index = glContext->GetTunerDigitIndex(mouseTracker.getMouseX(), 11, freqDP, freqW); // freq
if (index > 0) { if (index > 0) {
hoverIndex = index; hoverIndex = index;
hoverState = TUNING_HOVER_FREQ; hoverState = altDown?TUNING_HOVER_PPM:TUNING_HOVER_FREQ;
} }
if (!index) { if (!index) {
@ -240,15 +270,18 @@ void TuningCanvas::OnMouseMoved(wxMouseEvent& event) {
} else { } else {
switch (hoverState) { switch (hoverState) {
case TUNING_HOVER_FREQ: case TUNING_HOVER_FREQ:
setStatusText("Click or drag a digit to change frequency. Hold shift to disable carry."); setStatusText("Click or drag a digit to change frequency. Hold ALT to change PPM. Hold SHIFT to disable carry.");
break; break;
case TUNING_HOVER_BW: case TUNING_HOVER_BW:
setStatusText("Click or drag a digit to change bandwidth. Hold shift to disable carry."); setStatusText("Click or drag a digit to change bandwidth. Hold SHIFT to disable carry.");
break; break;
case TUNING_HOVER_CENTER: case TUNING_HOVER_CENTER:
setStatusText("Click or drag a digit to change center frequency. Hold shift to disable carry."); setStatusText("Click or drag a digit to change center frequency. Hold SHIFT to disable carry.");
break; break;
} case TUNING_HOVER_PPM:
setStatusText("Click or drag a digit to change device PPM offset. Hold SHIFT to disable carry.");
break;
}
} }
@ -305,6 +338,10 @@ void TuningCanvas::OnMouseLeftWindow(wxMouseEvent& event) {
SetCursor(wxCURSOR_CROSS); SetCursor(wxCURSOR_CROSS);
hoverIndex = 0; hoverIndex = 0;
hoverState = TUNING_HOVER_NONE; hoverState = TUNING_HOVER_NONE;
if (currentPPM != lastPPM) {
wxGetApp().saveConfig();
}
} }
void TuningCanvas::OnMouseEnterWindow(wxMouseEvent& event) { void TuningCanvas::OnMouseEnterWindow(wxMouseEvent& event) {
@ -312,8 +349,17 @@ void TuningCanvas::OnMouseEnterWindow(wxMouseEvent& event) {
SetCursor(wxCURSOR_ARROW); SetCursor(wxCURSOR_ARROW);
hoverIndex = 0; hoverIndex = 0;
hoverState = TUNING_HOVER_NONE; hoverState = TUNING_HOVER_NONE;
lastPPM = currentPPM = wxGetApp().getPPM();
} }
void TuningCanvas::setHelpTip(std::string tip) { void TuningCanvas::setHelpTip(std::string tip) {
helpTip = tip; helpTip = tip;
} }
void TuningCanvas::OnKeyDown(wxKeyEvent& event) {
InteractiveCanvas::OnKeyDown(event);
}
void TuningCanvas::OnKeyUp(wxKeyEvent& event) {
InteractiveCanvas::OnKeyUp(event);
}

View File

@ -16,7 +16,7 @@
class TuningCanvas: public InteractiveCanvas { class TuningCanvas: public InteractiveCanvas {
public: public:
enum ActiveState { enum ActiveState {
TUNING_HOVER_NONE, TUNING_HOVER_FREQ, TUNING_HOVER_BW, TUNING_HOVER_CENTER TUNING_HOVER_NONE, TUNING_HOVER_FREQ, TUNING_HOVER_BW, TUNING_HOVER_PPM, TUNING_HOVER_CENTER
}; };
TuningCanvas(wxWindow *parent, int *attribList = NULL); TuningCanvas(wxWindow *parent, int *attribList = NULL);
~TuningCanvas(); ~TuningCanvas();
@ -33,6 +33,9 @@ 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 StepTuner(ActiveState state, int factor, bool up = true); void StepTuner(ActiveState state, int factor, bool up = true);
TuningContext *glContext; TuningContext *glContext;
@ -58,6 +61,9 @@ private:
bool top; bool top;
bool bottom; bool bottom;
int currentPPM;
int lastPPM;
// //
wxDECLARE_EVENT_TABLE(); wxDECLARE_EVENT_TABLE();
}; };