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
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}
-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
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 = .
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
#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
#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);
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
}
*/
-//----------------------------------------------------------
-// Global Codec2 thingys - just one reqd for tx & rx
-//----------------------------------------------------------
-struct CODEC2 *g_pCodec2;
-struct FDMDV *g_pFDMDV;
//-------------------------------------------------------------------------
// OnTogBtnOnOff()
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];
// 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:
//
*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;
}
{
next_state = 1;
}
- if(stats.fest_coarse_fine == 0)
+ if(g_stats.fest_coarse_fine == 0)
{
next_state = 0;
}
case 2:
next_state = 1;
- if(stats.fest_coarse_fine == 0)
+ if(g_stats.fest_coarse_fine == 0)
{
next_state = 0;
}
//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++)
//----------------------------------------------------------------
void PlotScalar::OnSize(wxSizeEvent& event)
{
-// wxAutoBufferedPaintDC dc(this);
-// draw(dc);
}
//----------------------------------------------------------------
//----------------------------------------------------------------
void PlotScalar::OnShow(wxShowEvent& event)
{
-// wxAutoBufferedPaintDC dc(this);
- // draw(dc);
}
{
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();
}
//----------------------------------------------------------------
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;
}
}
//----------------------------------------------------------------
void PlotScatter::OnSize(wxSizeEvent& event)
{
-// wxAutoBufferedPaintDC dc(this);
-// draw(dc);
+ // todo: clear screen
}
//----------------------------------------------------------------
//----------------------------------------------------------------
void PlotScatter::OnShow(wxShowEvent& event)
{
-// paintNow();
}
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);
// 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)));
// 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;
//----------------------------------------------------------------
void PlotWaterfall::OnPaint(wxPaintEvent & evt)
{
- printf("PlotWaterfall::OnPaint\n");
wxAutoBufferedPaintDC dc(this);
draw(dc);
}