commit
5eef39e1ca
|
@ -651,6 +651,11 @@ On Linux, using the Alsa loopback module:
|
||||||
- Transmit Tab - To Radio select -> Loopback: Loopback PCM (hw:1,1)
|
- Transmit Tab - To Radio select -> Loopback: Loopback PCM (hw:1,1)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
1. The space-bar can be used to toggle PTT.
|
||||||
|
1. You can left click on the main window to adjust tuning, the vertical red line on the frequency scale will show the current centre frequency. FreeDV will automatically track any drift once it syncs.
|
||||||
|
|
||||||
## Glossary
|
## Glossary
|
||||||
|
|
||||||
Term | Notes
|
Term | Notes
|
||||||
|
|
|
@ -49,6 +49,7 @@ struct MODEM_STATS g_stats;
|
||||||
float g_pwr_scale;
|
float g_pwr_scale;
|
||||||
int g_clip;
|
int g_clip;
|
||||||
int g_freedv_verbose;
|
int g_freedv_verbose;
|
||||||
|
bool g_queueResync;
|
||||||
|
|
||||||
// test Frames
|
// test Frames
|
||||||
int g_testFrames;
|
int g_testFrames;
|
||||||
|
@ -379,7 +380,7 @@ MainFrame::MainFrame(wxString plugInName, wxWindow *parent) : TopFrame(plugInNam
|
||||||
{
|
{
|
||||||
// Add Waterfall Plot window
|
// Add Waterfall Plot window
|
||||||
m_panelWaterfall = new PlotWaterfall((wxFrame*) m_auiNbookCtrl, false, 0);
|
m_panelWaterfall = new PlotWaterfall((wxFrame*) m_auiNbookCtrl, false, 0);
|
||||||
m_panelWaterfall->SetToolTip(_("Left click to tune, Right click to toggle mono/colour"));
|
m_panelWaterfall->SetToolTip(_("Left click to tune"));
|
||||||
m_auiNbookCtrl->AddPage(m_panelWaterfall, _("Waterfall"), true, wxNullBitmap);
|
m_auiNbookCtrl->AddPage(m_panelWaterfall, _("Waterfall"), true, wxNullBitmap);
|
||||||
}
|
}
|
||||||
if(wxGetApp().m_show_spect)
|
if(wxGetApp().m_show_spect)
|
||||||
|
@ -1334,7 +1335,7 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
|
||||||
|
|
||||||
if (g_State) {
|
if (g_State) {
|
||||||
|
|
||||||
sprintf(clockoffset, "ClkOff: %5d", (int)round(g_stats.clock_offset*1E6));
|
sprintf(clockoffset, "ClkOff: %+-d", (int)round(g_stats.clock_offset*1E6) % 10000);
|
||||||
wxString clockoffset_string(clockoffset); m_textClockOffset->SetLabel(clockoffset_string);
|
wxString clockoffset_string(clockoffset); m_textClockOffset->SetLabel(clockoffset_string);
|
||||||
|
|
||||||
// update error pattern plots if supported
|
// update error pattern plots if supported
|
||||||
|
@ -1986,8 +1987,9 @@ void MainFrame::OnReSync(wxCommandEvent& event)
|
||||||
if (m_RxRunning) {
|
if (m_RxRunning) {
|
||||||
fprintf(stderr,"OnReSync\n");
|
fprintf(stderr,"OnReSync\n");
|
||||||
if (g_mode != -1) {
|
if (g_mode != -1) {
|
||||||
freedv_set_sync(g_pfreedv, FREEDV_SYNC_UNSYNC);
|
// Resync must be triggered from the TX/RX thread, so pushing the button queues it until
|
||||||
g_resyncs++;
|
// the next execution of the TX/RX loop.
|
||||||
|
g_queueResync = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2829,6 +2831,8 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)
|
||||||
if (startStop.IsSameAs("Start"))
|
if (startStop.IsSameAs("Start"))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Start .....\n");
|
fprintf(stderr, "Start .....\n");
|
||||||
|
g_queueResync = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Start Running -------------------------------------------------
|
// Start Running -------------------------------------------------
|
||||||
//
|
//
|
||||||
|
@ -4039,6 +4043,14 @@ void txRxProcessing()
|
||||||
// RX side processing --------------------------------------------
|
// RX side processing --------------------------------------------
|
||||||
//
|
//
|
||||||
|
|
||||||
|
if (g_queueResync)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Unsyncing per user request.\n");
|
||||||
|
g_queueResync = false;
|
||||||
|
freedv_set_sync(g_pfreedv, FREEDV_SYNC_UNSYNC);
|
||||||
|
g_resyncs++;
|
||||||
|
}
|
||||||
|
|
||||||
// while we have enough input samples available ...
|
// while we have enough input samples available ...
|
||||||
|
|
||||||
// attempt to read one processing buffer of receive samples
|
// attempt to read one processing buffer of receive samples
|
||||||
|
|
|
@ -118,14 +118,15 @@ void PlotScatter::draw(wxAutoBufferedPaintDC& dc)
|
||||||
// automatically scale, first measure the maximum value
|
// automatically scale, first measure the maximum value
|
||||||
|
|
||||||
float max_xy = 1E-12;
|
float max_xy = 1E-12;
|
||||||
float real,imag;
|
float real,imag,mag;
|
||||||
for(i=0; i< scatterMemSyms; i++) {
|
for(i=0; i< scatterMemSyms; i++) {
|
||||||
real = fabs(m_mem[i].real);
|
real = fabs(m_mem[i].real);
|
||||||
imag = fabs(m_mem[i].imag);
|
imag = fabs(m_mem[i].imag);
|
||||||
if (real > max_xy)
|
mag = sqrt(pow(real,2) + pow(imag, 2));
|
||||||
max_xy = real;
|
if (mag > max_xy)
|
||||||
if (imag > max_xy)
|
{
|
||||||
max_xy = imag;
|
max_xy = mag;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// smooth it out and set a lower limit to prevent divide by 0 issues
|
// smooth it out and set a lower limit to prevent divide by 0 issues
|
||||||
|
@ -150,9 +151,13 @@ void PlotScatter::draw(wxAutoBufferedPaintDC& dc)
|
||||||
y = y_scale * m_mem[i].imag + m_rGrid.GetHeight()/2;
|
y = y_scale * m_mem[i].imag + m_rGrid.GetHeight()/2;
|
||||||
x += PLOT_BORDER + XLEFT_OFFSET;
|
x += PLOT_BORDER + XLEFT_OFFSET;
|
||||||
y += PLOT_BORDER;
|
y += PLOT_BORDER;
|
||||||
pen.SetColour(DARK_GREEN_COLOR);
|
|
||||||
dc.SetPen(pen);
|
if (pointsInBounds_(x, y))
|
||||||
dc.DrawPoint(x, y);
|
{
|
||||||
|
pen.SetColour(DARK_GREEN_COLOR);
|
||||||
|
dc.SetPen(pen);
|
||||||
|
dc.DrawPoint(x, y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,8 +211,12 @@ void PlotScatter::draw(wxAutoBufferedPaintDC& dc)
|
||||||
//printf("%4d,%4d ", x, y);
|
//printf("%4d,%4d ", x, y);
|
||||||
x += PLOT_BORDER + XLEFT_OFFSET;
|
x += PLOT_BORDER + XLEFT_OFFSET;
|
||||||
y += PLOT_BORDER;
|
y += PLOT_BORDER;
|
||||||
if (j)
|
|
||||||
dc.DrawLine(x, y, prev_x, prev_y);
|
if (pointsInBounds_(x,y) && pointsInBounds_(prev_x, prev_y))
|
||||||
|
{
|
||||||
|
if (j)
|
||||||
|
dc.DrawLine(x, y, prev_x, prev_y);
|
||||||
|
}
|
||||||
prev_x = x; prev_y = y;
|
prev_x = x; prev_y = y;
|
||||||
}
|
}
|
||||||
//printf("\n");
|
//printf("\n");
|
||||||
|
@ -286,3 +295,17 @@ void PlotScatter::OnSize(wxSizeEvent& event)
|
||||||
void PlotScatter::OnShow(wxShowEvent& event)
|
void PlotScatter::OnShow(wxShowEvent& event)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------
|
||||||
|
// Ensures that points stay within the bounding box.
|
||||||
|
//----------------------------------------------------------------
|
||||||
|
bool PlotScatter::pointsInBounds_(int x, int y)
|
||||||
|
{
|
||||||
|
bool inBounds = true;
|
||||||
|
inBounds = !(x <= (PLOT_BORDER + XLEFT_OFFSET));
|
||||||
|
inBounds = inBounds && !(x >= m_rGrid.GetWidth());
|
||||||
|
inBounds = inBounds && !(y <= PLOT_BORDER);
|
||||||
|
inBounds = inBounds && !(y >= m_rGrid.GetHeight());
|
||||||
|
|
||||||
|
return inBounds;
|
||||||
|
}
|
||||||
|
|
|
@ -60,6 +60,8 @@ class PlotScatter : public PlotPanel
|
||||||
int Ncol;
|
int Ncol;
|
||||||
int scatterMemSyms;
|
int scatterMemSyms;
|
||||||
float m_filter_max_xy, m_filter_max_y;
|
float m_filter_max_xy, m_filter_max_y;
|
||||||
|
|
||||||
|
bool pointsInBounds_(int x, int y);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__FDMDV2_PLOT_SCATTER__
|
#endif //__FDMDV2_PLOT_SCATTER__
|
||||||
|
|
|
@ -173,6 +173,7 @@ TopFrame::TopFrame(wxString plugInName, wxWindow* parent, wxWindowID id, const w
|
||||||
m_textResyncs = new wxStaticText(this, wxID_ANY, wxT("Resyncs: 0"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
|
m_textResyncs = new wxStaticText(this, wxID_ANY, wxT("Resyncs: 0"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
|
||||||
sbSizer_ber->Add(m_textResyncs, 0, wxALIGN_LEFT, 1);
|
sbSizer_ber->Add(m_textResyncs, 0, wxALIGN_LEFT, 1);
|
||||||
m_textClockOffset = new wxStaticText(this, wxID_ANY, wxT("ClkOff: 0"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
|
m_textClockOffset = new wxStaticText(this, wxID_ANY, wxT("ClkOff: 0"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
|
||||||
|
m_textClockOffset->SetMinSize(wxSize(125,-1));
|
||||||
sbSizer_ber->Add(m_textClockOffset, 0, wxALIGN_LEFT, 1);
|
sbSizer_ber->Add(m_textClockOffset, 0, wxALIGN_LEFT, 1);
|
||||||
m_textFreqOffset = new wxStaticText(this, wxID_ANY, wxT("FreqOff: 0"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
|
m_textFreqOffset = new wxStaticText(this, wxID_ANY, wxT("FreqOff: 0"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
|
||||||
sbSizer_ber->Add(m_textFreqOffset, 0, wxALIGN_LEFT, 1);
|
sbSizer_ber->Add(m_textFreqOffset, 0, wxALIGN_LEFT, 1);
|
||||||
|
|
Loading…
Reference in New Issue