first pass at a working scatter plot - haven't tested on real modem signals yet
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 24 Oct 2012 08:14:35 +0000 (08:14 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 24 Oct 2012 08:14:35 +0000 (08:14 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@803 01035d8c-6547-0410-b346-abe4f91aad63

fdmdv2/src/Makefile
fdmdv2/src/fdmdv2_defines.h
fdmdv2/src/fdmdv2_main.cpp
fdmdv2/src/fdmdv2_plot_scalar.cpp
fdmdv2/src/fdmdv2_plot_scatter.cpp
fdmdv2/src/fdmdv2_plot_scatter.h
fdmdv2/src/fdmdv2_plot_spectrum.cpp
fdmdv2/src/fdmdv2_plot_waterfall_linux.cpp

index e32c54126085edcd983f3e7ae27e2295e6a31589..64374d498fa97a588f1dcaba15e85d98904dcda7 100644 (file)
@@ -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
index 9b5cac7d2364df333d489074569477023baf4be7..258789e45fe60072ff809d219922509ebb17f553 100644 (file)
 #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
 
index 29af342aeaf1076f1fd5db12d3ea9fc66b8630ab..9dc2ab0e2b525d4838e2b3cca9b32d76c2c28c95 100644 (file)
 #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;
                 }
index 3f0cc88b0b280f06ea8afc612f46b6504f51ff41..c4d3eb217b0756786284a7dca77d8b4b012fce99 100644 (file)
@@ -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);
 }
index 71b4a6c23f49e56d44d022f5262402c318d86c12..ce79af0e0de4d4c7dd27ab5f602c171794cbb904 100644 (file)
@@ -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<FDMDV_NSYM; i++)
+    for(i = 0; i < SCATTER_MEM_SYMS-FDMDV_NSYM; i++)
     {
-        x1 = x_scale * m_mem[i].real + m_x + m_rCtrl.GetWidth()/2;
-        y1 = y_scale * m_mem[i].imag + m_y + m_rCtrl.GetHeight()/2;
-        dc.DrawPoint(x1, y1);
-        //fl_point(x1, y1);
         m_mem[i] = m_mem[i+FDMDV_NSYM];
     }
 
-    // shift memory
-    for(i = FDMDV_NSYM; i < SCATTER_MEM-FDMDV_NSYM; i++)
+    // new samples
+
+    for(j=0; i < SCATTER_MEM_SYMS; i++,j++)
     {
-        m_mem[i] = m_mem[i+FDMDV_NSYM];
+        m_mem[i] = m_new_samples[j];
     }
 
-    // draw new samples
-    //fl_color(FL_GREEN);
-    for(i = SCATTER_MEM-FDMDV_NSYM, j = 0; i < SCATTER_MEM; i++,j++)
+    // draw all samples
+
+    for(i = 0; i < SCATTER_MEM_SYMS; i++)
     {
-        x1 = x_scale * m_new_samples[j].real + m_x + m_rCtrl.GetWidth()/2;
-        y1 = y_scale * m_new_samples[j].imag + m_y + m_rCtrl.GetHeight()/2;
-        //fl_point(x1, y1);
-        m_mem[i] = m_new_samples[j];
+        x = x_scale * m_mem[i].real + m_rGrid.GetWidth()/2;
+        y = y_scale * m_mem[i].imag + m_rGrid.GetHeight()/2;
+       x += PLOT_BORDER + XLEFT_OFFSET;
+       y += PLOT_BORDER;
+       dc.DrawPoint(x, y);
     }
-   // fl_pop_clip();
 }
 
 //----------------------------------------------------------------
@@ -128,6 +117,8 @@ void PlotScatter::add_new_samples(COMP samples[])
     for(i = 0; i < FDMDV_NSYM; i++)
     {
         m_new_samples[i] = samples[i];
+        //m_new_samples[i].real = 1 - 2*(i%2) + 0.1*(float)rand()/RAND_MAX;
+        //m_new_samples[i].imag = 1 - 2*(i%2) + 0.1*(float)rand()/RAND_MAX;
     }
 }
 
@@ -145,8 +136,7 @@ void PlotScatter::OnPaint(wxPaintEvent& event)
 //----------------------------------------------------------------
 void PlotScatter::OnSize(wxSizeEvent& event)
 {
-//    wxAutoBufferedPaintDC dc(this);
-//    draw(dc);
+    // todo: clear screen
 }
 
 //----------------------------------------------------------------
@@ -154,6 +144,5 @@ void PlotScatter::OnSize(wxSizeEvent& event)
 //----------------------------------------------------------------
 void PlotScatter::OnShow(wxShowEvent& event)
 {
-//    paintNow();
 }
 
index 26793ea938c302710cbf300d34a700e008b7f718..a52ce7a864a3bfbe5b1d608b635de2635c37602f 100644 (file)
 class PlotScatter : public PlotPanel
 {
     public:
-       PlotScatter(wxFrame* parent);
+        PlotScatter(wxFrame* parent);
         ~PlotScatter(){};
+       void add_new_samples(COMP samples[]);
 
     protected:
-        COMP m_mem[SCATTER_MEM];
+        COMP m_mem[SCATTER_MEM_SYMS];
         COMP m_new_samples[FDMDV_NSYM];
 
         void draw(wxAutoBufferedPaintDC&  dc);
-        void add_new_samples(COMP samples[]);
         void OnPaint(wxPaintEvent& event);
         void OnSize(wxSizeEvent& event);
         void OnShow(wxShowEvent& event);
index 2fcc0a13d3fc42a987d2634965caf240596f3a46..85ff28c2a549359161312c5a00ffd2918e378ea1 100644 (file)
@@ -96,7 +96,8 @@ void PlotSpectrum::draw(wxAutoBufferedPaintDC& dc)
 
     // m_rGrid is coords of inner window we actually plot to.  We deflate it a bit
     // to leave room for axis labels.  We need to work this out every time we draw
-    // as window may have been resized
+    // as OnSize() may not be called before OnPaint(), for example when a new tab
+    // is selected
 
     m_rGrid  = m_rCtrl;
     m_rGrid = m_rGrid.Deflate(PLOT_BORDER + (XLEFT_OFFSET/2), (PLOT_BORDER + (YBOTTOM_OFFSET/2)));
index d068bd54efd445e2144f8e18695ba311a3f2f0c1..c75e6e47ff31bef73f38fd07f05da576d68258b8 100644 (file)
@@ -69,8 +69,6 @@ PlotWaterfall::PlotWaterfall(wxFrame* parent): PlotPanel(parent)
 // we plot in and allocate a bit map of the correct size
 
 void PlotWaterfall::OnSize(wxSizeEvent& event) {
-    printf("PlotWaterfall::OnSize\n");
-
     // resize bit map
 
     delete m_pBmp;
@@ -103,7 +101,6 @@ void PlotWaterfall::OnSize(wxSizeEvent& event) {
 //----------------------------------------------------------------
 void PlotWaterfall::OnPaint(wxPaintEvent & evt)
 {
-    printf("PlotWaterfall::OnPaint\n");
     wxAutoBufferedPaintDC dc(this);
     draw(dc);
 }