From a456194daf89daa421d82eee218883894be0a88e Mon Sep 17 00:00:00 2001 From: drowe67 Date: Wed, 24 Oct 2012 08:14:35 +0000 Subject: [PATCH] first pass at a working scatter plot - haven't tested on real modem signals yet git-svn-id: https://svn.code.sf.net/p/freetel/code@803 01035d8c-6547-0410-b346-abe4f91aad63 --- fdmdv2/src/Makefile | 28 +++---- fdmdv2/src/fdmdv2_defines.h | 7 +- fdmdv2/src/fdmdv2_main.cpp | 30 +++++--- fdmdv2/src/fdmdv2_plot_scalar.cpp | 6 -- fdmdv2/src/fdmdv2_plot_scatter.cpp | 85 ++++++++++------------ fdmdv2/src/fdmdv2_plot_scatter.h | 6 +- fdmdv2/src/fdmdv2_plot_spectrum.cpp | 3 +- fdmdv2/src/fdmdv2_plot_waterfall_linux.cpp | 3 - 8 files changed, 79 insertions(+), 89 deletions(-) diff --git a/fdmdv2/src/Makefile b/fdmdv2/src/Makefile index e32c5412..64374d49 100644 --- a/fdmdv2/src/Makefile +++ b/fdmdv2/src/Makefile @@ -42,11 +42,11 @@ CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /p/Radio/fdmdv2/missing --run aclocal-1.11 -AMTAR = ${SHELL} /p/Radio/fdmdv2/missing --run tar -AUTOCONF = ${SHELL} /p/Radio/fdmdv2/missing --run autoconf -AUTOHEADER = ${SHELL} /p/Radio/fdmdv2/missing --run autoheader -AUTOMAKE = ${SHELL} /p/Radio/fdmdv2/missing --run automake-1.11 +ACLOCAL = ${SHELL} /home/david/fdmdv2/missing --run aclocal-1.11 +AMTAR = ${SHELL} /home/david/fdmdv2/missing --run tar +AUTOCONF = ${SHELL} /home/david/fdmdv2/missing --run autoconf +AUTOHEADER = ${SHELL} /home/david/fdmdv2/missing --run autoheader +AUTOMAKE = ${SHELL} /home/david/fdmdv2/missing --run automake-1.11 AWK = gawk CC = gcc CCDEPMODE = depmode=none @@ -60,9 +60,9 @@ ECHO_C = ECHO_N = -n ECHO_T = EGREP = /bin/grep -E -EXEEXT = .exe +EXEEXT = GREP = /bin/grep -INSTALL = /bin/install -c +INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} @@ -106,7 +106,7 @@ LIBS = -lsndfile-1 \ -lwsock32 LTLIBOBJS = -MAKEINFO = ${SHELL} /p/Radio/fdmdv2/missing --run makeinfo +MAKEINFO = ${SHELL} /home/david/fdmdv2/missing --run makeinfo MKDIR_P = /bin/mkdir -p OBJEXT = o PACKAGE = fdmdv2 @@ -118,13 +118,13 @@ PACKAGE_URL = PACKAGE_VERSION = 0.2 PATH_SEPARATOR = : SET_MAKE = -SHELL = /bin/sh +SHELL = /bin/bash STRIP = VERSION = 0.2 -abs_builddir = /p/Radio/fdmdv2/src -abs_srcdir = /p/Radio/fdmdv2/src -abs_top_builddir = /p/Radio/fdmdv2 -abs_top_srcdir = /p/Radio/fdmdv2 +abs_builddir = /home/david/fdmdv2/src +abs_srcdir = /home/david/fdmdv2/src +abs_top_builddir = /home/david/fdmdv2 +abs_top_srcdir = /home/david/fdmdv2 ac_ct_CC = gcc am__include = include am__leading_dot = . @@ -143,7 +143,7 @@ host_alias = htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info -install_sh = ${SHELL} /p/Radio/fdmdv2/install-sh +install_sh = ${SHELL} /home/david/fdmdv2/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale diff --git a/fdmdv2/src/fdmdv2_defines.h b/fdmdv2/src/fdmdv2_defines.h index 9b5cac7d..258789e4 100644 --- a/fdmdv2/src/fdmdv2_defines.h +++ b/fdmdv2/src/fdmdv2_defines.h @@ -40,12 +40,15 @@ #define MAX_F_HZ 4000 // max freq on Waterfall and Spectrum #define STEP_F_HZ 500 // freq step on Waterfall and Spectrum graticule #define WATERFALL_SECS_Y 5 // number of seconds respresented by y axis of waterfall -#define DT 0.1 // time between Waterfall updates +#define DT 0.1 // time between real time graphing updates #define FS 8000 // FDMDV modem sample rate // Scatter diagram -#define SCATTER_MEM (FDMDV_NSYM)*50 +#define SCATTER_MEM_SECS 2 +// (symbols/frame)/(graphics update period) = symbols/s sent to scatter memory +// memory (symbols) = secs of memory * symbols/sec +#define SCATTER_MEM_SYMS ((int)(SCATTER_MEM_SECS*(FDMDV_NSYM/DT))) #define SCATTER_X_MAX 3.0 #define SCATTER_Y_MAX 3.0 diff --git a/fdmdv2/src/fdmdv2_main.cpp b/fdmdv2/src/fdmdv2_main.cpp index 29af342a..9dc2ab0e 100644 --- a/fdmdv2/src/fdmdv2_main.cpp +++ b/fdmdv2/src/fdmdv2_main.cpp @@ -32,6 +32,14 @@ #define wxUSE_PCX 1 #define wxUSE_LIBTIFF 1 +//---------------------------------------------------------- +// Global Codec2 & modem states - just one reqd for tx & rx +//---------------------------------------------------------- +struct CODEC2 *g_pCodec2; +struct FDMDV *g_pFDMDV; + +struct FDMDV_STATS g_stats; + // initialize the application IMPLEMENT_APP(MainApp); @@ -270,6 +278,10 @@ void MainFrame::OnTimer(wxTimerEvent &evt) m_panelWaterfall->Refresh(); m_panelSpectrum->m_newdata = true; m_panelSpectrum->Refresh(); + + m_panelScatter->add_new_samples(g_stats.rx_symbols); + m_panelScatter->m_newdata = true; + m_panelScatter->Refresh(); } #endif @@ -814,11 +826,6 @@ wxString MainFrame::LoadUserImage(wxImage& image) } */ -//---------------------------------------------------------- -// Global Codec2 thingys - just one reqd for tx & rx -//---------------------------------------------------------- -struct CODEC2 *g_pCodec2; -struct FDMDV *g_pFDMDV; //------------------------------------------------------------------------- // OnTogBtnOnOff() @@ -1337,7 +1344,6 @@ int MainFrame::rxCallback( CODEC2 *c2 // Codec 2 states ) { - struct FDMDV_STATS stats; int sync_bit; float rx_fdm[FDMDV_MAX_SAMPLES_PER_FRAME]; int rx_bits[FDMDV_BITS_PER_FRAME]; @@ -1387,14 +1393,14 @@ int MainFrame::rxCallback( // compute rx spectrum & get demod stats, and update GUI plot data fdmdv_get_rx_spectrum(g_pFDMDV, rx_spec, rx_fdm, nin_prev); - fdmdv_get_demod_stats(g_pFDMDV, &stats); + fdmdv_get_demod_stats(g_pFDMDV, &g_stats); + // Average Data - // averageData(rx_spec); for(i = 0; i < FDMDV_NSPEC; i++) { - // m_rxPa->m_av_mag[i] = (1.0 - BETA) * m_rxPa->m_av_mag[i] + BETA * rx_spec[i]; g_avmag[i] = (1.0 - BETA) * g_avmag[i] + BETA * rx_spec[i]; } + // // State machine to: // @@ -1420,7 +1426,7 @@ int MainFrame::rxCallback( *n_output_buf += N8; } assert(*n_output_buf <= (2 * codec2_samples_per_frame(c2))); - if((stats.fest_coarse_fine == 1) && (stats.snr_est > 3.0)) + if((g_stats.fest_coarse_fine == 1) && (g_stats.snr_est > 3.0)) { next_state = 1; } @@ -1437,7 +1443,7 @@ int MainFrame::rxCallback( { next_state = 1; } - if(stats.fest_coarse_fine == 0) + if(g_stats.fest_coarse_fine == 0) { next_state = 0; } @@ -1445,7 +1451,7 @@ int MainFrame::rxCallback( case 2: next_state = 1; - if(stats.fest_coarse_fine == 0) + if(g_stats.fest_coarse_fine == 0) { next_state = 0; } diff --git a/fdmdv2/src/fdmdv2_plot_scalar.cpp b/fdmdv2/src/fdmdv2_plot_scalar.cpp index 3f0cc88b..c4d3eb21 100644 --- a/fdmdv2/src/fdmdv2_plot_scalar.cpp +++ b/fdmdv2/src/fdmdv2_plot_scalar.cpp @@ -49,8 +49,6 @@ PlotScalar::PlotScalar(wxFrame* parent): PlotPanel(parent) //align(FL_ALIGN_TOP); //labelsize(10); -// m_x_max = x_max_; -// m_y_max = y_max_; m_mem = new float[m_x_max]; for(i = 0; i < m_x_max; i++) @@ -201,8 +199,6 @@ void PlotScalar::OnPaint(wxPaintEvent& event) //---------------------------------------------------------------- void PlotScalar::OnSize(wxSizeEvent& event) { -// wxAutoBufferedPaintDC dc(this); -// draw(dc); } //---------------------------------------------------------------- @@ -210,6 +206,4 @@ void PlotScalar::OnSize(wxSizeEvent& event) //---------------------------------------------------------------- void PlotScalar::OnShow(wxShowEvent& event) { -// wxAutoBufferedPaintDC dc(this); - // draw(dc); } diff --git a/fdmdv2/src/fdmdv2_plot_scatter.cpp b/fdmdv2/src/fdmdv2_plot_scatter.cpp index 71b4a6c2..ce79af0e 100644 --- a/fdmdv2/src/fdmdv2_plot_scatter.cpp +++ b/fdmdv2/src/fdmdv2_plot_scatter.cpp @@ -44,78 +44,67 @@ PlotScatter::PlotScatter(wxFrame* parent) : PlotPanel(parent) { int i; - //align(FL_ALIGN_TOP); - //labelsize(10); - - for(i=0; i < SCATTER_MEM; i++) + for(i=0; i < SCATTER_MEM_SYMS; i++) { m_mem[i].real = 0.0; m_mem[i].imag = 0.0; } - m_prev_w = 0; - m_prev_h = 0; - m_prev_x = 0; - m_prev_y = 0; } //---------------------------------------------------------------- // draw() //---------------------------------------------------------------- -void PlotScatter::draw(wxAutoBufferedPaintDC& dc) +void PlotScatter::draw(wxAutoBufferedPaintDC& dc) { float x_scale; float y_scale; - int i; - int j; - int x1; - int y1; + int i,j; + int x; + int y; - //Fl_Box::draw(); + m_rCtrl = GetClientRect(); + m_rGrid = m_rCtrl; + m_rGrid = m_rGrid.Deflate(PLOT_BORDER + (XLEFT_OFFSET/2), (PLOT_BORDER + (YBOTTOM_OFFSET/2))); - /* detect resizing of window */ - if((m_rCtrl.GetHeight() != m_prev_h) || (m_rCtrl.GetWidth() != m_prev_w) || (m_x != m_prev_x) || (m_y != m_prev_y)) - { - //fl_color(FL_BLACK); - //fl_rectf(x(),y(),w(),h()); - m_prev_h = m_rCtrl.GetHeight(); - m_prev_w = m_rCtrl.GetWidth(); - m_prev_x = m_x; - m_prev_y = m_y; - } + // black background - //fl_push_clip(x(),y(),w(),h()); + m_rPlot = wxRect(PLOT_BORDER + XLEFT_OFFSET, PLOT_BORDER, m_rGrid.GetWidth(), m_rGrid.GetHeight()); + wxBrush ltGraphBkgBrush = wxBrush(BLACK_COLOR); + dc.SetBrush(ltGraphBkgBrush); + dc.SetPen(wxPen(BLACK_COLOR, 0)); + dc.DrawRectangle(m_rPlot); + x_scale = (float)m_rGrid.GetWidth()/SCATTER_X_MAX; + y_scale = (float)m_rGrid.GetHeight()/SCATTER_Y_MAX; - x_scale = m_rCtrl.GetWidth()/SCATTER_X_MAX; - y_scale = m_rCtrl.GetHeight()/SCATTER_Y_MAX; + wxPen pen; + pen.SetColour(LIGHT_GREEN_COLOR); + pen.SetWidth(1); + dc.SetPen(pen); - // erase last samples - //fl_color(FL_BLACK); + // shift memory - for(i=0; i