From bacd2631bc59d0954c4a8c06472077b3bcb80e27 Mon Sep 17 00:00:00 2001 From: wittend99 Date: Wed, 10 Oct 2012 03:31:50 +0000 Subject: [PATCH] Killer bug. Data point array not initialized? git-svn-id: https://svn.code.sf.net/p/freetel/code@740 01035d8c-6547-0410-b346-abe4f91aad63 --- fdmdv2/build/fdmdv2.mk | 2 +- .../portaudiocpp/CallbackInterface.hxx | 30 +- .../include/portaudiocpp/CallbackStream.hxx | 3 - fdmdv2/src/fdmdv2_defines.h | 6 +- fdmdv2/src/fdmdv2_main.cpp | 834 +++++++++--------- fdmdv2/src/fdmdv2_main.h | 34 +- fdmdv2/src/fdmdv2_pa_wrapper.cpp | 11 +- fdmdv2/src/fdmdv2_pa_wrapper.h | 6 +- fdmdv2/src/fdmdv2_plot_spectrum.cpp | 5 +- fdmdv2/src/fdmdv2_plot_waterfall.cpp | 47 +- 10 files changed, 519 insertions(+), 459 deletions(-) diff --git a/fdmdv2/build/fdmdv2.mk b/fdmdv2/build/fdmdv2.mk index ffac947d..2b96faaa 100644 --- a/fdmdv2/build/fdmdv2.mk +++ b/fdmdv2/build/fdmdv2.mk @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=OFA-Staff -Date :=10/7/2012 +Date :=10/9/2012 CodeLitePath :="C:\bin\CodeLite" LinkerName :=g++ SharedObjectLinkerName :=g++ -shared -fPIC diff --git a/fdmdv2/extern/include/portaudiocpp/CallbackInterface.hxx b/fdmdv2/extern/include/portaudiocpp/CallbackInterface.hxx index c9236cdd..18d473b2 100644 --- a/fdmdv2/extern/include/portaudiocpp/CallbackInterface.hxx +++ b/fdmdv2/extern/include/portaudiocpp/CallbackInterface.hxx @@ -2,15 +2,12 @@ #define INCLUDED_PORTAUDIO_CALLBACKINTERFACE_HXX // --------------------------------------------------------------------------------------- - #include "portaudio.h" // --------------------------------------------------------------------------------------- - namespace portaudio { // ----------------------------------------------------------------------------------- - ////// /// @brief Interface for an object that's callable as a PortAudioCpp callback object (ie that implements the /// paCallbackFun method). @@ -19,27 +16,32 @@ namespace portaudio { public: virtual ~CallbackInterface() {} - - virtual int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) = 0; + virtual int paCallbackFun( + const void *inputBuffer, + void *outputBuffer, + unsigned long numFrames, + const PaStreamCallbackTimeInfo *timeInfo, + PaStreamCallbackFlags statusFlags + ) = 0; }; // ----------------------------------------------------------------------------------- - namespace impl { extern "C" { - int callbackInterfaceToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, - void *userData); + int callbackInterfaceToPaCallbackAdapter( + const void *inputBuffer, + void *outputBuffer, + unsigned long numFrames, + const PaStreamCallbackTimeInfo *timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData + ); } // extern "C" } - // ----------------------------------------------------------------------------------- - -} // namespace portaudio - +} // namespace portaudio // --------------------------------------------------------------------------------------- #endif // INCLUDED_PORTAUDIO_CALLBACKINTERFACE_HXX diff --git a/fdmdv2/extern/include/portaudiocpp/CallbackStream.hxx b/fdmdv2/extern/include/portaudiocpp/CallbackStream.hxx index 8ee6d4c4..810b900c 100644 --- a/fdmdv2/extern/include/portaudiocpp/CallbackStream.hxx +++ b/fdmdv2/extern/include/portaudiocpp/CallbackStream.hxx @@ -2,13 +2,10 @@ #define INCLUDED_PORTAUDIO_CALLBACKSTREAM_HXX // --------------------------------------------------------------------------------------- - #include "portaudio.h" - #include "portaudiocpp/Stream.hxx" // --------------------------------------------------------------------------------------- - // Declaration(s): namespace portaudio { diff --git a/fdmdv2/src/fdmdv2_defines.h b/fdmdv2/src/fdmdv2_defines.h index f4fd7bc5..d336686c 100644 --- a/fdmdv2/src/fdmdv2_defines.h +++ b/fdmdv2/src/fdmdv2_defines.h @@ -46,11 +46,11 @@ #define MIN_DB -40.0 #define MAX_DB 0.0 -#define BETA 0.1 // constant for time averageing spectrum data +#define BETA 0.1 // constant for time averageing spectrum data #define MIN_HZ 0 #define MAX_HZ 4000 -#define WATERFALL_SECS_Y 5 // number of seconds respresented by y axis of waterfall -#define DT 0.02 // time between samples +#define WATERFALL_SECS_Y 5 // number of seconds respresented by y axis of waterfall +#define DT 0.02 // time between samples #define FS 8000 // FDMDV modem sample rate #define SCATTER_MEM (FDMDV_NSYM)*50 diff --git a/fdmdv2/src/fdmdv2_main.cpp b/fdmdv2/src/fdmdv2_main.cpp index 1bbc085f..98d7dcdc 100644 --- a/fdmdv2/src/fdmdv2_main.cpp +++ b/fdmdv2/src/fdmdv2_main.cpp @@ -103,7 +103,6 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent) tools->Append(m_menuItemToolsConfigDelete); - // Add Waterfall Plot window m_panelWaterfall = new PlotWaterfall((wxFrame*) m_auiNbookCtrl); m_auiNbookCtrl->AddPage(m_panelWaterfall, _("Waterfall"), true, wxNullBitmap); @@ -119,8 +118,8 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent) // m_auiNbookCtrl->AddPage(m_panelWaterfall, _("Scalar"), true, wxNullBitmap); // Add generic plot window - m_panelDefaultA = new PlotPanel((wxFrame*) m_auiNbookCtrl); - m_auiNbookCtrl->AddPage(m_panelDefaultA, _("Test A"), true, wxNullBitmap); +// m_panelDefaultA = new PlotPanel((wxFrame*) m_auiNbookCtrl); +// m_auiNbookCtrl->AddPage(m_panelDefaultA, _("Test A"), true, wxNullBitmap); wxConfigBase *pConfig = wxConfigBase::Get(); @@ -171,6 +170,8 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent) // m_plotTimer.Start(500, wxTIMER_CONTINUOUS); // m_panelWaterfall->m_newdata = true; m_panelWaterfall->Refresh(); +#else + Connect(wxEVT_IDLE, wxIdleEventHandler(MainFrame::OnIdle), NULL, this); #endif //_USE_TIMER } @@ -213,17 +214,22 @@ MainFrame::~MainFrame() m_togBtnAnalog->Disconnect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnAnalogClickUI), NULL, this); m_togBtnALC->Disconnect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnALCClickUI), NULL, this); m_btnTogTX->Disconnect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnTXClickUI), NULL, this); + #ifdef _USE_TIMER if(m_plotTimer.IsRunning()) { m_plotTimer.Stop(); Unbind(wxEVT_TIMER, &MainFrame::OnTimer, this); } +#else + Disconnect(wxEVT_IDLE, wxIdleEventHandler(MainFrame::OnIdle), NULL, this); #endif //_USE_TIMER + delete wxConfigBase::Set((wxConfigBase *) NULL); } #ifdef _USE_TIMER + //---------------------------------------------------------------- // OnTimer() //---------------------------------------------------------------- @@ -236,6 +242,24 @@ void MainFrame::OnTimer(wxTimerEvent &evt) // m_panelDefaultA->m_newdata = true; // m_panelDefaultA->Refresh(); } + +#else + +//---------------------------------------------------------------- +// OnIdle() +//---------------------------------------------------------------- +void MainFrame::OnIdle(wxIdleEvent& event) +{ + if(m_panelWaterfall->m_newdata) + { + m_panelWaterfall->Refresh(); + } + if(m_panelSpectrum->m_newdata) + { + m_panelSpectrum->Refresh(); + } +} + #endif // _USE_TIMER //------------------------------------------------------------------------- @@ -330,12 +354,10 @@ void MainFrame::OnCheckSQClick(wxCommandEvent& event) if(!m_SquelchActive) { m_SquelchActive = true; - //wxMessageBox(wxT("Squelch On!"), wxT("Squelch On"), wxOK); } else { m_SquelchActive = false; - //wxMessageBox(wxT("Squelch Off!"), wxT("Squelch Off"), wxOK); } } @@ -354,7 +376,6 @@ void MainFrame::OnTogBtnTXClick(wxCommandEvent& event) //------------------------------------------------------------------------- void MainFrame::OnTogBtnRxID(wxCommandEvent& event) { -// wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnRxID"), wxOK); event.Skip(); } @@ -363,7 +384,6 @@ void MainFrame::OnTogBtnRxID(wxCommandEvent& event) //------------------------------------------------------------------------- void MainFrame::OnTogBtnTxID(wxCommandEvent& event) { -// wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnTxID"), wxOK); event.Skip(); } @@ -372,7 +392,6 @@ void MainFrame::OnTogBtnTxID(wxCommandEvent& event) //------------------------------------------------------------------------- void MainFrame::OnTogBtnSplitClick(wxCommandEvent& event) { -// wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnSplitClick"), wxOK); event.Skip(); } @@ -381,7 +400,6 @@ void MainFrame::OnTogBtnSplitClick(wxCommandEvent& event) //------------------------------------------------------------------------- void MainFrame::OnTogBtnAnalogClick (wxCommandEvent& event) { -// wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnAnalogClick"), wxOK); event.Skip(); } @@ -394,45 +412,6 @@ void MainFrame::OnTogBtnALCClick(wxCommandEvent& event) event.Skip(); } - -//------------------------------------------------------------------------- -// OnTogBtnOnOff() -//------------------------------------------------------------------------- -void MainFrame::OnTogBtnOnOff(wxCommandEvent& event) -{ - if((!m_TxRunning) || (!m_RxRunning)) - { - m_togBtnSplit->Enable(); - m_togRxID->Enable(); - m_togTxID->Enable(); - m_togBtnAnalog->Enable(); - m_togBtnALC->Enable(); - m_btnTogTX->Enable(); - -#ifdef _USE_TIMER - m_plotTimer.Start(500, wxTIMER_CONTINUOUS); -#endif // _USE_TIMER - startRxStream(); - startTxStream(); - m_togBtnOnOff->SetLabel(wxT("Stop")); - } - else - { - m_togBtnSplit->Disable(); - m_togRxID->Disable(); - m_togTxID->Disable(); - m_togBtnAnalog->Disable(); - m_togBtnALC->Disable(); - m_btnTogTX->Disable(); -#ifdef _USE_TIMER - m_plotTimer.Stop(); -#endif // _USE_TIMER - stopRxStream(); - stopTxStream(); - m_togBtnOnOff->SetLabel(wxT("Start")); - } -} - //------------------------------------------------------------------------- // OnTogBtnSplitClickUI() //------------------------------------------------------------------------- @@ -448,7 +427,6 @@ void MainFrame::OnTogBtnSplitClickUI(wxUpdateUIEvent& event) void MainFrame::OnTogBtnAnalogClickUI(wxUpdateUIEvent& event) { wxUnusedVar(event); -// event.Enable(false); } //------------------------------------------------------------------------- @@ -457,7 +435,6 @@ void MainFrame::OnTogBtnAnalogClickUI(wxUpdateUIEvent& event) void MainFrame::OnTogBtnALCClickUI(wxUpdateUIEvent& event) { wxUnusedVar(event); -// event.Enable(false); } //------------------------------------------------------------------------- @@ -465,7 +442,7 @@ void MainFrame::OnTogBtnALCClickUI(wxUpdateUIEvent& event) //------------------------------------------------------------------------- void MainFrame::OnTogBtnRxIDUI(wxUpdateUIEvent& event) { -// event.Enable(false); + wxUnusedVar(event); } //------------------------------------------------------------------------- @@ -474,7 +451,6 @@ void MainFrame::OnTogBtnRxIDUI(wxUpdateUIEvent& event) void MainFrame::OnTogBtnTxIDUI(wxUpdateUIEvent& event) { wxUnusedVar(event); -// event.Enable(false); } //------------------------------------------------------------------------- @@ -483,310 +459,74 @@ void MainFrame::OnTogBtnTxIDUI(wxUpdateUIEvent& event) void MainFrame::OnTogBtnTXClickUI(wxUpdateUIEvent& event) { wxUnusedVar(event); -// event.Enable(false); } //------------------------------------------------------------------------- -// OnTogBtnOnOffUI() +// OnOpenUpdateUI() //------------------------------------------------------------------------- -void MainFrame::OnTogBtnOnOffUI(wxUpdateUIEvent& event) +void MainFrame::OnOpenUpdateUI(wxUpdateUIEvent& event) { wxUnusedVar(event); -// event.Enable(true); } //------------------------------------------------------------------------- -// startRxStream() +// OnSaveUpdateUI() //------------------------------------------------------------------------- -void MainFrame::startRxStream() +void MainFrame::OnSaveUpdateUI(wxUpdateUIEvent& event) { - if(!m_RxRunning) - { - m_RxRunning = true; - m_rxPa = new PortAudioWrap(); - -#ifdef _DUMMY_DATA - for(int i = 0; i < FDMDV_NSPEC; i++) - { - m_rxPa->m_av_mag[i] = sin(((double)i / M_PI)) * 100.0; - } -#else - for(int i = 0; i < FDMDV_NSPEC; i++) - { - m_rxPa->m_av_mag[i] = -40.0; - } -#endif // _DUMMY_DATA - -// m_fdmdv2 = fdmdv_create(); -// m_RXCodec2 = codec2_create(CODEC2_MODE_1400); - //output_buf = (short*)malloc(2*sizeof(short)*codec2_samples_per_frame(codec2)); -/* - for(int i = 0; i < MEM8; i++) - { - cbData.in8k[i] = 0.0; - } - for(int i = 0; i < FDMDV_OS_TAPS; i++) - { - cbData.in48k[i] = 0.0; - } -*/ - m_rxDevIn = m_rxPa->getDefaultInputDevice(); // default input device - if(m_rxDevIn == paNoDevice) - { - wxMessageBox(wxT("Rx Error: No default input device."), wxT("Error"), wxOK); - return; - } - m_rxErr = m_rxPa->setInputDevice(m_rxDevIn); - m_rxErr = m_rxPa->setInputChannelCount(2); // stereo input - m_rxErr = m_rxPa->setInputSampleFormat(PA_SAMPLE_TYPE); - m_rxErr = m_rxPa->setInputLatency(m_rxPa->getInputDefaultLowLatency()); - m_rxPa->setInputHostApiStreamInfo(NULL); - - m_rxDevOut = m_rxPa->getDefaultOutputDevice(); // default output device - if (m_rxDevOut == paNoDevice) - { - wxMessageBox(wxT("Rx Error: No default output device."), wxT("Error"), wxOK); - return; - } - m_rxErr = m_rxPa->setOutputDevice(m_rxDevOut); - m_rxErr = m_rxPa->setOutputChannelCount(2); // stereo input - m_rxErr = m_rxPa->setOutputSampleFormat(PA_SAMPLE_TYPE); - - m_rxErr = m_rxPa->setOutputLatency(m_rxPa->getOutputDefaultLowLatency()); - m_rxPa->setOutputHostApiStreamInfo(NULL); - - m_rxErr = m_rxPa->setFramesPerBuffer(FRAMES_PER_BUFFER); - m_rxErr = m_rxPa->setSampleRate(SAMPLE_RATE); - m_rxErr = m_rxPa->setStreamFlags(0); -// m_rxCB = rxCallback; - m_rxErr = m_rxPa->setCallback(rxCallback); - m_rxErr = m_rxPa->streamOpen(); - - if(m_rxErr != paNoError) - { - wxMessageBox(wxT("Rx Stream Open/Setup error."), wxT("Error"), wxOK); - return; - } - m_rxErr = m_rxPa->streamStart(); - if(m_rxErr != paNoError) - { - wxMessageBox(wxT("Rx Stream Start Error."), wxT("Error"), wxOK); - return; - } - } +// wxUnusedVar(event); + event.Enable(false); } //------------------------------------------------------------------------- -// stopRxStream() +// OnClose() //------------------------------------------------------------------------- -void MainFrame::stopRxStream() +void MainFrame::OnClose(wxCommandEvent& event) { + wxUnusedVar(event); + if(m_RxRunning) { - m_RxRunning = false; - m_rxPa->stop(); - m_rxPa->streamClose(); + stopRxStream(); } -/* - if(m_rxPa->isActive()) - { - m_rxPa->stop(); - m_rxPa->streamClose(); - } - if(m_rxPa->isOpen()) + if(m_TxRunning) + { + stopTxStream(); + } + + if(m_sound != NULL) + { + if(m_sound->IsOk()) { - m_rxPa->streamClose(); + m_sound->Stop(); + m_sound = NULL; } - m_TxRunning = false; -*/ + } + Close(); } //------------------------------------------------------------------------- -// abortRxStream() +// OnCloseUpdateUI() //------------------------------------------------------------------------- -void MainFrame::abortRxStream() +void MainFrame::OnCloseUpdateUI(wxUpdateUIEvent& event) { - if(m_RxRunning) - { - m_RxRunning = false; - m_rxPa->abort(); - } + event.Enable(false); } //------------------------------------------------------------------------- -// startTxStream() +// OnExit() //------------------------------------------------------------------------- -void MainFrame::startTxStream() +void MainFrame::OnExit(wxCommandEvent& event) { - if(!m_TxRunning) - { - m_TxRunning = true; - m_txPa = new PortAudioWrap(); - - m_txDevIn = m_txPa->getDefaultInputDevice(); // default input device - if(m_txDevIn == paNoDevice) - { - wxMessageBox(wxT("Tx Error: No default input device."), wxT("Error"), wxOK); - return; - } - m_txErr = m_txPa->setInputDevice(m_txDevIn); - m_txErr = m_txPa->setInputChannelCount(2); // stereo input - m_txErr = m_txPa->setInputSampleFormat(PA_SAMPLE_TYPE); - m_txErr = m_txPa->setInputLatency(m_txPa->getInputDefaultLowLatency()); - m_txPa->setInputHostApiStreamInfo(NULL); - - m_txDevOut = m_txPa->getDefaultOutputDevice(); // default output device - if (m_txDevOut == paNoDevice) - { - wxMessageBox(wxT("Tx Error: No default output device."), wxT("Error"), wxOK); - return; - } - m_txErr = m_txPa->setOutputDevice(m_txDevOut); - m_txErr = m_txPa->setOutputChannelCount(2); // stereo input - m_txErr = m_txPa->setOutputSampleFormat(PA_SAMPLE_TYPE); - - m_txErr = m_txPa->setOutputLatency(m_txPa->getOutputDefaultLowLatency()); - m_txPa->setOutputHostApiStreamInfo(NULL); - - m_txErr = m_txPa->setFramesPerBuffer(FRAMES_PER_BUFFER); - m_txErr = m_txPa->setSampleRate(SAMPLE_RATE); - m_txErr = m_txPa->setStreamFlags(0); - m_txErr = m_txPa->setCallback(txCallback); - m_txErr = m_txPa->streamOpen(); - - if(m_txErr != paNoError) - { - wxMessageBox(wxT("Tx Stream Open/Setup error."), wxT("Error"), wxOK); - return; - } - m_txErr = m_txPa->streamStart(); - if(m_txErr != paNoError) - { - wxMessageBox(wxT("Tx Stream Start Error."), wxT("Error"), wxOK); - return; - } - } + OnClose(event); } //------------------------------------------------------------------------- -// stopTxStream() +// OnCopy() //------------------------------------------------------------------------- -void MainFrame::stopTxStream() +void MainFrame::OnCopy(wxCommandEvent& event) { - if(m_TxRunning) - { - m_TxRunning = false; - m_txPa->stop(); - m_txPa->streamClose(); - } -/* - if(m_txPa->isActive()) - { - m_txPa->stop(); - } - if(m_txPa->isOpen()) - { - m_txPa->streamClose(); - } - m_TxRunning = false; -*/ -} - -//------------------------------------------------------------------------- -// abortTxStream() -//------------------------------------------------------------------------- -void MainFrame::abortTxStream() -{ - if(m_TxRunning) - { - m_TxRunning = false; - m_txPa->abort(); - } -} - -//------------------------------------------------------------------------- -// OnOpen() -//------------------------------------------------------------------------- -void MainFrame::OnOpen(wxCommandEvent& event) -{ - wxUnusedVar(event); -} - -//------------------------------------------------------------------------- -// OnOpenUpdateUI() -//------------------------------------------------------------------------- -void MainFrame::OnOpenUpdateUI(wxUpdateUIEvent& event) -{ - wxUnusedVar(event); -// wxMessageBox("Got Click!", "OnOpenUpdateUI", wxOK); -// event.Skip(); -} - -//------------------------------------------------------------------------- -// OnSaveUpdateUI() -//------------------------------------------------------------------------- -void MainFrame::OnSaveUpdateUI(wxUpdateUIEvent& event) -{ -// wxUnusedVar(event); -// wxMessageBox("Got Click!", "OnSaveUpdateUI", wxOK); -// event.Skip(); - event.Enable(false); -} - -//------------------------------------------------------------------------- -// OnClose() -//------------------------------------------------------------------------- -void MainFrame::OnClose(wxCommandEvent& event) -{ - wxUnusedVar(event); - - if(m_RxRunning) - { - stopRxStream(); - } - if(m_TxRunning) - { - stopTxStream(); - } - - if(m_sound != NULL) - { - if(m_sound->IsOk()) - { - m_sound->Stop(); - m_sound = NULL; - } - } - Close(); -} - -//------------------------------------------------------------------------- -// OnCloseUpdateUI() -//------------------------------------------------------------------------- -void MainFrame::OnCloseUpdateUI(wxUpdateUIEvent& event) -{ -// wxUnusedVar(event); - event.Enable(false); -} - -//------------------------------------------------------------------------- -// OnExit() -//------------------------------------------------------------------------- -void MainFrame::OnExit(wxCommandEvent& event) -{ - //wxUnusedVar(event); - OnClose(event); -// wxMessageBox("Got Click!", "OnExit", wxOK); -// event.Skip(); -} - -//------------------------------------------------------------------------- -// OnCopy() -//------------------------------------------------------------------------- -void MainFrame::OnCopy(wxCommandEvent& event) -{ -// wxMessageBox("Got Click!", "OnCopy", wxOK); - event.Skip(); + event.Skip(); } //------------------------------------------------------------------------- @@ -794,7 +534,6 @@ void MainFrame::OnCopy(wxCommandEvent& event) //------------------------------------------------------------------------- void MainFrame::OnCopyUpdateUI(wxUpdateUIEvent& event) { -// wxUnusedVar(event); event.Enable(false); } @@ -803,7 +542,6 @@ void MainFrame::OnCopyUpdateUI(wxUpdateUIEvent& event) //------------------------------------------------------------------------- void MainFrame::OnCut(wxCommandEvent& event) { -// wxMessageBox("Got Click!", "OnCut", wxOK); event.Skip(); } @@ -821,7 +559,6 @@ void MainFrame::OnCutUpdateUI(wxUpdateUIEvent& event) //------------------------------------------------------------------------- void MainFrame::OnPaste(wxCommandEvent& event) { -// wxMessageBox("Got Click!", "OnPaste", wxOK); event.Skip(); } @@ -830,7 +567,6 @@ void MainFrame::OnPaste(wxCommandEvent& event) //------------------------------------------------------------------------- void MainFrame::OnPasteUpdateUI(wxUpdateUIEvent& event) { -// wxUnusedVar(event); event.Enable(false); } @@ -968,7 +704,6 @@ void MainFrame::OnHelpCheckUpdates(wxCommandEvent& event) //------------------------------------------------------------------------- void MainFrame::OnHelpCheckUpdatesUI(wxUpdateUIEvent& event) { -// wxUnusedVar(event); event.Enable(false); } @@ -1008,37 +743,322 @@ wxString MainFrame::LoadUserImage(wxImage& image) } //------------------------------------------------------------------------- -// txCallback() +// OnTogBtnOnOffUI() //------------------------------------------------------------------------- -int MainFrame::txCallback( - const void *inBuffer, - void *outBuffer, - unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo *outTime, - PaStreamCallbackFlags statusFlags, - void *userData - ) +void MainFrame::OnTogBtnOnOffUI(wxUpdateUIEvent& event) { - float *out = (float *) outBuffer; - float *in = (float *) inBuffer; - float leftIn; - float rightIn; - unsigned int i; + wxUnusedVar(event); +} - if(inBuffer == NULL) +//------------------------------------------------------------------------- +// OnTogBtnOnOff() +//------------------------------------------------------------------------- +void MainFrame::OnTogBtnOnOff(wxCommandEvent& event) +{ + if((!m_TxRunning) || (!m_RxRunning)) { - return 0; + m_togBtnSplit->Enable(); + m_togRxID->Enable(); + m_togTxID->Enable(); + m_togBtnAnalog->Enable(); + m_togBtnALC->Enable(); + m_btnTogTX->Enable(); + +#ifdef _USE_TIMER + m_plotTimer.Start(500, wxTIMER_CONTINUOUS); +#endif // _USE_TIMER + startRxStream(); +// startTxStream(); + m_togBtnOnOff->SetLabel(wxT("Stop")); } - // Read input buffer, process data, and fill output buffer. - for(i = 0; i < framesPerBuffer; i++) + else { - leftIn = *in++; // Get interleaved samples from input buffer. - rightIn = *in++; - *out++ = leftIn * rightIn; // ring modulation - *out++ = 0.5f * (leftIn + rightIn); // mixing + m_togBtnSplit->Disable(); + m_togRxID->Disable(); + m_togTxID->Disable(); + m_togBtnAnalog->Disable(); + m_togBtnALC->Disable(); + m_btnTogTX->Disable(); +#ifdef _USE_TIMER + m_plotTimer.Stop(); +#endif // _USE_TIMER + stopRxStream(); +// stopTxStream(); + m_togBtnOnOff->SetLabel(wxT("Start")); } - return paContinue; // 0; -} +} + +//---------------------------------------------------------- +// Audio stream processing loop states (globals). +//---------------------------------------------------------- +/* +float Ts = 0.0; +short input_buf[2*FDMDV_NOM_SAMPLES_PER_FRAME]; +short *output_buf; +int n_input_buf = 0; +int nin = FDMDV_NOM_SAMPLES_PER_FRAME; +int n_output_buf = 0; +int codec_bits[2*FDMDV_BITS_PER_FRAME]; +int state = 0; +*/ + +int g_nRxIn = FDMDV_NOM_SAMPLES_PER_FRAME; +float g_Ts = 0.0; + +short g_RxInBuf[2 * FDMDV_NOM_SAMPLES_PER_FRAME]; +short *g_pRxOutBuf; +int g_nInputBuf = 0; + +short g_TxInBuf[2 * FDMDV_NOM_SAMPLES_PER_FRAME]; +short *g_pTxOutBuf; +int g_nOutputBuf = 0; + + +int g_CodecBits[2 * FDMDV_BITS_PER_FRAME]; +int g_State = 0; + +float g_avmag[FDMDV_NSPEC]; + +//---------------------------------------------------------- +// Global Codec2 thingys. +//---------------------------------------------------------- +struct CODEC2 *g_pRxCodec2; +struct CODEC2 *g_pTxCodec2; +struct FDMDV *g_pRxFDMDV; +struct FDMDV *g_pTxFDMDV; + +//------------------------------------------------------------------------- +// startRxStream() +//------------------------------------------------------------------------- +void MainFrame::startRxStream() +{ + if(!m_RxRunning) + { + m_RxRunning = true; + m_rxPa = new PortAudioWrap(); + +#ifdef _DUMMY_DATA + for(int i = 0; i < FDMDV_NSPEC; i++) + { +// m_rxPa->m_av_mag[i] = sin(((double)i / M_PI)) * 100.0; + g_avmag[i] = sin(((double)i / M_PI)) * 100.0; + } +#else + for(int i = 0; i < FDMDV_NSPEC; i++) + { +// m_rxPa->m_av_mag[i] = -40.0; + g_avmag[i] = -40.0; + } +#endif // _DUMMY_DATA + + g_pRxFDMDV = fdmdv_create(); + g_pRxCodec2 = codec2_create(CODEC2_MODE_1400); + g_pRxOutBuf = (short*)malloc(2 * sizeof(short) * codec2_samples_per_frame(g_pRxCodec2)); + + m_rxDevIn = m_rxPa->getDefaultInputDevice(); // default input device + if(m_rxDevIn == paNoDevice) + { + wxMessageBox(wxT("Rx Error: No default input device."), wxT("Error"), wxOK); + return; + } + m_rxErr = m_rxPa->setInputDevice(m_rxDevIn); + m_rxErr = m_rxPa->setInputChannelCount(2); // stereo input + m_rxErr = m_rxPa->setInputSampleFormat(PA_SAMPLE_TYPE); + m_rxErr = m_rxPa->setInputLatency(m_rxPa->getInputDefaultLowLatency()); + m_rxPa->setInputHostApiStreamInfo(NULL); + + m_rxDevOut = m_rxPa->getDefaultOutputDevice(); // default output device + if (m_rxDevOut == paNoDevice) + { + wxMessageBox(wxT("Rx Error: No default output device."), wxT("Error"), wxOK); + return; + } + m_rxErr = m_rxPa->setOutputDevice(m_rxDevOut); + m_rxErr = m_rxPa->setOutputChannelCount(2); // stereo input + m_rxErr = m_rxPa->setOutputSampleFormat(PA_SAMPLE_TYPE); + + m_rxErr = m_rxPa->setOutputLatency(m_rxPa->getOutputDefaultLowLatency()); + m_rxPa->setOutputHostApiStreamInfo(NULL); + + m_rxErr = m_rxPa->setFramesPerBuffer(FRAMES_PER_BUFFER); + m_rxErr = m_rxPa->setSampleRate(SAMPLE_RATE); + m_rxErr = m_rxPa->setStreamFlags(0); + + m_rxUserdata = new paCallBackData; + m_rxUserdata->pWFPanel = m_panelWaterfall; + m_rxUserdata->pSPPanel = m_panelSpectrum; + + for(int i = 0; i < MEM8; i++) + { + m_rxUserdata->in8k[i] = 0.0; + } + for(int i = 0; i < FDMDV_OS_TAPS; i++) + { + m_rxUserdata->in48k[i] = 0.0; + } + + m_rxPa->setUserData(m_rxUserdata); + m_rxErr = m_rxPa->setCallback(rxCallback); + m_rxErr = m_rxPa->streamOpen(); + + if(m_rxErr != paNoError) + { + wxMessageBox(wxT("Rx Stream Open/Setup error."), wxT("Error"), wxOK); + return; + } + m_rxErr = m_rxPa->streamStart(); + if(m_rxErr != paNoError) + { + wxMessageBox(wxT("Rx Stream Start Error."), wxT("Error"), wxOK); + return; + } + } +} + +//------------------------------------------------------------------------- +// stopRxStream() +//------------------------------------------------------------------------- +void MainFrame::stopRxStream() +{ + if(m_RxRunning) + { + m_RxRunning = false; + m_rxPa->stop(); + m_rxPa->streamClose(); + fdmdv_destroy(g_pTxFDMDV); + codec2_destroy(g_pTxCodec2); +// delete g_RxInBuf; + delete m_rxUserdata; + } +/* + if(m_rxPa->isActive()) + { + m_rxPa->stop(); + m_rxPa->streamClose(); + } + if(m_rxPa->isOpen()) + { + m_rxPa->streamClose(); + } + m_TxRunning = false; +*/ +} + +//------------------------------------------------------------------------- +// abortRxStream() +//------------------------------------------------------------------------- +void MainFrame::abortRxStream() +{ + if(m_RxRunning) + { + m_RxRunning = false; + m_rxPa->abort(); + } +} + +//------------------------------------------------------------------------- +// startTxStream() +//------------------------------------------------------------------------- +void MainFrame::startTxStream() +{ + if(!m_TxRunning) + { + m_TxRunning = true; + m_txPa = new PortAudioWrap(); + + m_txDevIn = m_txPa->getDefaultInputDevice(); // default input device + if(m_txDevIn == paNoDevice) + { + wxMessageBox(wxT("Tx Error: No default input device."), wxT("Error"), wxOK); + return; + } + + g_pTxFDMDV = fdmdv_create(); + g_pTxCodec2 = codec2_create(CODEC2_MODE_1400); + g_pTxOutBuf = (short*)malloc(2*sizeof(short)*codec2_samples_per_frame(g_pTxCodec2)); + + m_txErr = m_txPa->setInputDevice(m_txDevIn); + m_txErr = m_txPa->setInputChannelCount(2); // stereo input + m_txErr = m_txPa->setInputSampleFormat(PA_SAMPLE_TYPE); + m_txErr = m_txPa->setInputLatency(m_txPa->getInputDefaultLowLatency()); + m_txPa->setInputHostApiStreamInfo(NULL); + + m_txDevOut = m_txPa->getDefaultOutputDevice(); // default output device + if (m_txDevOut == paNoDevice) + { + wxMessageBox(wxT("Tx Error: No default output device."), wxT("Error"), wxOK); + return; + } + m_txErr = m_txPa->setOutputDevice(m_txDevOut); + m_txErr = m_txPa->setOutputChannelCount(2); // stereo input + m_txErr = m_txPa->setOutputSampleFormat(PA_SAMPLE_TYPE); + + m_txErr = m_txPa->setOutputLatency(m_txPa->getOutputDefaultLowLatency()); + m_txPa->setOutputHostApiStreamInfo(NULL); + + m_txErr = m_txPa->setFramesPerBuffer(FRAMES_PER_BUFFER); + m_txErr = m_txPa->setSampleRate(SAMPLE_RATE); + m_txErr = m_txPa->setStreamFlags(0); + m_txErr = m_txPa->setCallback(txCallback); + m_txErr = m_txPa->streamOpen(); + + if(m_txErr != paNoError) + { + wxMessageBox(wxT("Tx Stream Open/Setup error."), wxT("Error"), wxOK); + return; + } + m_txErr = m_txPa->streamStart(); + if(m_txErr != paNoError) + { + wxMessageBox(wxT("Tx Stream Start Error."), wxT("Error"), wxOK); + return; + } + } +} + +//------------------------------------------------------------------------- +// stopTxStream() +//------------------------------------------------------------------------- +void MainFrame::stopTxStream() +{ + if(m_TxRunning) + { + m_TxRunning = false; + m_txPa->stop(); + m_txPa->streamClose(); + } +/* + if(m_txPa->isActive()) + { + m_txPa->stop(); + } + if(m_txPa->isOpen()) + { + m_txPa->streamClose(); + } + m_TxRunning = false; +*/ +} + +//------------------------------------------------------------------------- +// abortTxStream() +//------------------------------------------------------------------------- +void MainFrame::abortTxStream() +{ + if(m_TxRunning) + { + m_TxRunning = false; + m_txPa->abort(); + } +} + +//------------------------------------------------------------------------- +// OnOpen() +//------------------------------------------------------------------------- +void MainFrame::OnOpen(wxCommandEvent& event) +{ + wxUnusedVar(event); +} //---------------------------------------------------------------- // update average of each spectrum point @@ -1049,23 +1069,11 @@ void MainFrame::averageData(float mag_dB[]) for(i = 0; i < FDMDV_NSPEC; i++) { - m_rxPa->m_av_mag[i] = (1.0 - BETA) * m_rxPa->m_av_mag[i] + BETA * mag_dB[i]; +// m_rxPa->m_av_mag[i] = (1.0 - BETA) * m_rxPa->m_av_mag[i] + BETA * mag_dB[i]; + g_avmag[i] = (1.0 - BETA) * g_avmag[i] + BETA * mag_dB[i]; } } -// Main processing loop states ------------------ -float Ts = 0.0; -short input_buf[2*FDMDV_NOM_SAMPLES_PER_FRAME]; -int n_input_buf = 0; -int nin = FDMDV_NOM_SAMPLES_PER_FRAME; -short *output_buf; -int n_output_buf = 0; -int codec_bits[2*FDMDV_BITS_PER_FRAME]; -int state = 0; -struct CODEC2 *g_RXCodec2; -struct CODEC2 *g_TXCodec2; -struct FDMDV *g_pFDMDV_state; - //------------------------------------------------------------------------- // rxCallback() //------------------------------------------------------------------------- @@ -1078,7 +1086,7 @@ int MainFrame::rxCallback( void *userData ) { - paCallBackData *cbData = (paCallBackData*)userData; + paCallBackData *cbData = (paCallBackData*)userData; unsigned int i; short *rptr = (short*)inputBuffer; short *wptr = (short*)outputBuffer; @@ -1094,7 +1102,6 @@ int MainFrame::rxCallback( assert(inputBuffer != NULL); // Convert input model samples from 48 to 8 kHz - // just use left channel for(i = 0; i < framesPerBuffer; i++, rptr += 2) { @@ -1107,16 +1114,20 @@ int MainFrame::rxCallback( in48k[i] = in48k[i + framesPerBuffer]; } // run demod, decoder and update GUI info - for(i = 0; i < N8; i++) + unsigned int j = N8; + //for(i = 0; i < N8; i++) + for(i = 0; i < j; i++) { - input_buf[n_input_buf + i] = (short)out8k[i]; + g_RxInBuf[g_nInputBuf + i] = (short)out8k[i]; } - n_input_buf += FDMDV_NOM_SAMPLES_PER_FRAME; - per_frame_rx_processing(output_buf, &n_output_buf, codec_bits, input_buf, &n_input_buf, &nin, &state, g_RXCodec2); + g_nInputBuf += FDMDV_NOM_SAMPLES_PER_FRAME; + per_frame_rx_processing(g_pRxOutBuf, &g_nInputBuf, g_CodecBits, g_RxInBuf, &g_nOutputBuf, &g_nRxIn, &g_State, g_pRxCodec2); + cbData->pWFPanel->m_newdata = true; + cbData->pSPPanel->m_newdata = true; // if demod out of sync copy input audio from A/D to aid in tuning - if (n_output_buf >= N8) + if (g_nOutputBuf >= N8) { - if(state == 0) + if(g_State == 0) { for(i = 0; i < N8; i++) { @@ -1127,16 +1138,16 @@ int MainFrame::rxCallback( { for(i = 0; i < N8; i++) { - in8k[MEM8+i] = output_buf[i]; // decoded spech + in8k[MEM8+i] = g_pRxOutBuf[i]; // decoded spech } } - n_output_buf -= N8; + g_nOutputBuf -= N8; } - assert(n_output_buf >= 0); + assert(g_nOutputBuf >= 0); // shift speech samples in output buffer - for(i = 0; i < (unsigned int)n_output_buf; i++) + for(i = 0; i < (unsigned int)g_nOutputBuf; i++) { - output_buf[i] = output_buf[i + N8]; + g_pRxOutBuf[i] = g_pRxOutBuf[i + N8]; } // Convert output speech to 48 kHz sample rate // upsample and update filter memory @@ -1163,15 +1174,15 @@ int MainFrame::rxCallback( // per_frame_rx_processing() //---------------------------------------------------------------- void MainFrame::per_frame_rx_processing( - short output_buf[], // output buf of decoded speech samples - int *n_output_buf, // how many samples currently in output_buf[] - int codec_bits[], // current frame of bits for decoder - short input_buf[], // input buf of modem samples input to demod - int *n_input_buf, // how many samples currently in input_buf[] - int *nin, // amount of samples demod needs for next call - int *state, // used to collect codec_bits[] halves - CODEC2 *c2 // Codec 2 states - ) + short output_buf[], // output buf of decoded speech samples + int *n_output_buf, // how many samples currently in output_buf[] + int codec_bits[], // current frame of bits for decoder + short input_buf[], // input buf of modem samples input to demod + int *n_input_buf, // how many samples currently in input_buf[] + int *nin, // amount of samples demod needs for next call + int *state, // used to collect codec_bits[] halves + CODEC2 *c2 // Codec 2 states + ) { struct FDMDV_STATS stats; int sync_bit; @@ -1211,7 +1222,7 @@ int MainFrame::rxCallback( rx_fdm[i] = (float)input_buf[i] / FDMDV_SCALE; } nin_prev = *nin; - fdmdv_demod(g_pFDMDV_state, rx_bits, &sync_bit, rx_fdm, nin); + fdmdv_demod(g_pRxFDMDV, rx_bits, &sync_bit, rx_fdm, nin); *n_input_buf -= nin_prev; assert(*n_input_buf >= 0); @@ -1222,15 +1233,15 @@ int MainFrame::rxCallback( } // compute rx spectrum & get demod stats, and update GUI plot data - fdmdv_get_rx_spectrum(g_pFDMDV_state, rx_spec, rx_fdm, nin_prev); - fdmdv_get_demod_stats(g_pFDMDV_state, &stats); -// averageData(rx_spec); - //m_panelWaterfall->; - //m_panelScalar; -// m_panelScatter->add_new_samples(stats.rx_symbols); -// aTimingEst->add_new_sample(stats.rx_timing); -// aFreqEst->add_new_sample(stats.foff); -// aSNR->add_new_sample(stats.snr_est); + fdmdv_get_rx_spectrum(g_pRxFDMDV, rx_spec, rx_fdm, nin_prev); + fdmdv_get_demod_stats(g_pRxFDMDV, &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: // @@ -1318,6 +1329,39 @@ int MainFrame::rxCallback( } } +//------------------------------------------------------------------------- +// txCallback() +//------------------------------------------------------------------------- +int MainFrame::txCallback( + const void *inBuffer, + void *outBuffer, + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo *outTime, + PaStreamCallbackFlags statusFlags, + void *userData + ) +{ + float *out = (float *) outBuffer; + float *in = (float *) inBuffer; + float leftIn; + float rightIn; + unsigned int i; + + if(inBuffer == NULL) + { + return 0; + } + // Read input buffer, process data, and fill output buffer. + for(i = 0; i < framesPerBuffer; i++) + { + leftIn = *in++; // Get interleaved samples from input buffer. + rightIn = *in++; + *out++ = leftIn * rightIn; // ring modulation + *out++ = 0.5f * (leftIn + rightIn); // mixing + } + return paContinue; // 0; +} + //------------------------------------------------------------------------- // OnSave() //------------------------------------------------------------------------- diff --git a/fdmdv2/src/fdmdv2_main.h b/fdmdv2/src/fdmdv2_main.h index faf3af14..a6ab6d4b 100644 --- a/fdmdv2/src/fdmdv2_main.h +++ b/fdmdv2/src/fdmdv2_main.h @@ -55,17 +55,11 @@ enum { ID_TIMER_SPECTRUM, ID_TIMER_SCATTER, ID_TIMER_SCALAR - }; + }; #define EXCHANGE_DATA_IN 0 #define EXCHANGE_DATA_OUT 1 -typedef struct -{ - float in48k[FDMDV_OS_TAPS + N48]; - float in8k[MEM8 + N8]; -} paCallBackData; - //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= // Class MainApp // @@ -115,6 +109,18 @@ class MainApp : public wxApp // declare global static function wxGetApp() DECLARE_APP(MainApp) +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= +// paCallBackData +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= +typedef struct +{ + PlotSpectrum *pSPPanel; + PlotWaterfall *pWFPanel; +// float *mag_dB; + float in48k[FDMDV_OS_TAPS + N48]; + float in8k[MEM8 + N8]; +} paCallBackData; + //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= // Class MainFrame // @@ -131,7 +137,7 @@ class MainFrame : public TopFrame MainFrame(wxWindow *parent); virtual ~MainFrame(); - PlotPanel* m_panelDefaultA; +// PlotPanel* m_panelDefaultA; PlotSpectrum* m_panelSpectrum; PlotWaterfall* m_panelWaterfall; PlotScatter* m_panelScatter; @@ -139,9 +145,10 @@ class MainFrame : public TopFrame bool m_SquelchActive; bool m_RxRunning; bool m_TxRunning; - FDMDV *m_fdmdv2; PortAudioWrap *m_rxPa; - PortAudioWrap *m_txPa; + PortAudioWrap *m_txPa; + paCallBackData *m_rxUserdata; + paCallBackData *m_txUserdata; PaDeviceIndex m_rxDevIn; PaDeviceIndex m_rxDevOut; PaDeviceIndex m_txDevIn; @@ -249,9 +256,12 @@ class MainFrame : public TopFrame void OnClose( wxCloseEvent& event ); void OnSize( wxSizeEvent& event ); void OnUpdateUI( wxUpdateUIEvent& event ); - void OnTimer(wxTimerEvent &evt); - void OnDeleteConfig(wxCommandEvent&); +#ifdef _USE_TIMER + void OnTimer(wxTimerEvent &evt); +#else + void OnIdle(wxIdleEvent &evt); +#endif wxString LoadUserImage(wxImage& image); diff --git a/fdmdv2/src/fdmdv2_pa_wrapper.cpp b/fdmdv2/src/fdmdv2_pa_wrapper.cpp index ca45d79b..f4627f9d 100644 --- a/fdmdv2/src/fdmdv2_pa_wrapper.cpp +++ b/fdmdv2/src/fdmdv2_pa_wrapper.cpp @@ -38,7 +38,7 @@ PortAudioWrap::PortAudioWrap() m_pTimeInfo = 0; m_newdata = false; - loadData(); +// loadData(); } //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= @@ -325,12 +325,7 @@ PaError PortAudioWrap::setCallback(PaStreamCallback *callback) return paNoError; } -typedef struct -{ - float in48k[FDMDV_OS_TAPS + N48]; - float in8k[MEM8 + N8]; -} paCallBackData; - +/* //---------------------------------------------------------------- // loadData() : create Dummy Data //---------------------------------------------------------------- @@ -342,4 +337,4 @@ void PortAudioWrap::loadData() m_av_mag[i] = i; } } - +*/ diff --git a/fdmdv2/src/fdmdv2_pa_wrapper.h b/fdmdv2/src/fdmdv2_pa_wrapper.h index 2f00db63..f3b393b4 100644 --- a/fdmdv2/src/fdmdv2_pa_wrapper.h +++ b/fdmdv2/src/fdmdv2_pa_wrapper.h @@ -28,7 +28,7 @@ #include "codec2.h" #include "portaudio.h" -#define PA_SAMPLE_TYPE paFloat32 //paInt16 +#define PA_SAMPLE_TYPE paInt16 //paFloat32 #define FRAMES_PER_BUFFER (64) typedef float SAMPLE; @@ -39,7 +39,7 @@ class PortAudioWrap PortAudioWrap(); ~PortAudioWrap(); - float m_av_mag[FDMDV_NSPEC]; +// float m_av_mag[FDMDV_NSPEC]; private: PaStream *m_pStream; @@ -113,5 +113,5 @@ class PortAudioWrap bool isOpen() const; bool isStopped() const; bool isActive() const; - void loadData(); +// void loadData(); }; diff --git a/fdmdv2/src/fdmdv2_plot_spectrum.cpp b/fdmdv2/src/fdmdv2_plot_spectrum.cpp index d672cfae..177391c7 100644 --- a/fdmdv2/src/fdmdv2_plot_spectrum.cpp +++ b/fdmdv2/src/fdmdv2_plot_spectrum.cpp @@ -28,6 +28,8 @@ #include "fdmdv2_main.h" #include "fdmdv2_plot_spectrum.h" +extern float *g_avmag; + BEGIN_EVENT_TABLE(PlotSpectrum, PlotPanel) EVT_MOTION (PlotSpectrum::OnMouseMove) EVT_LEFT_DOWN (PlotSpectrum::OnMouseDown) @@ -108,7 +110,8 @@ void PlotSpectrum::draw(wxAutoBufferedPaintDC& pDC) pen.SetWidth(1); m_mDC.SetPen(pen); - float *pData = m_pTopFrame->m_rxPa->m_av_mag; +// float *pData = m_pTopFrame->m_rxPa->m_av_mag; + float *pData = g_avmag; for(int x = 1; x < w; x++) { // m_mDC.DrawPoint(x, (int)pData[x]); diff --git a/fdmdv2/src/fdmdv2_plot_waterfall.cpp b/fdmdv2/src/fdmdv2_plot_waterfall.cpp index d2157bfb..444c2d46 100644 --- a/fdmdv2/src/fdmdv2_plot_waterfall.cpp +++ b/fdmdv2/src/fdmdv2_plot_waterfall.cpp @@ -38,6 +38,9 @@ block. */ + +extern float *g_avmag; + BEGIN_EVENT_TABLE(PlotWaterfall, PlotPanel) EVT_PAINT (PlotWaterfall::OnPaint) EVT_MOTION (PlotWaterfall::OnMouseMove) @@ -163,22 +166,23 @@ void PlotWaterfall::draw(wxAutoBufferedPaintDC& pDC) pDC.Clear(); // m_mDC.Clear(); m_rPlot = wxRect(PLOT_BORDER + XLEFT_OFFSET, PLOT_BORDER, m_rGrid.GetWidth(), m_rGrid.GetHeight()); - if(m_firstPass) - { - m_firstPass = false; - m_mDC.FloodFill(0, 0, VERY_LTGREY_COLOR); +// if(m_firstPass) +// { +// m_firstPass = false; +// m_mDC.FloodFill(0, 0, VERY_LTGREY_COLOR); // Draw a filled rectangle with aborder - wxBrush ltGraphBkgBrush = wxBrush(DARK_BLUE_COLOR); - m_mDC.SetBrush(ltGraphBkgBrush); - m_mDC.SetPen(wxPen(BLACK_COLOR, 0)); - m_mDC.DrawRectangle(m_rPlot); +// wxBrush ltGraphBkgBrush = wxBrush(DARK_BLUE_COLOR); +// m_mDC.SetBrush(ltGraphBkgBrush); +// m_mDC.SetPen(wxPen(BLACK_COLOR, 0)); +// m_mDC.DrawRectangle(m_rPlot); -// pDC.SetBrush(ltGraphBkgBrush); -// pDC.SetPen(wxPen(BLACK_COLOR, 0)); -// pDC.DrawRectangle(m_rPlot); - drawGraticule(pDC); - } +// } + wxBrush ltGraphBkgBrush = wxBrush(DARK_BLUE_COLOR); + pDC.SetBrush(ltGraphBkgBrush); + pDC.SetPen(wxPen(BLACK_COLOR, 0)); + pDC.DrawRectangle(m_rPlot); + drawGraticule(pDC); if(m_newdata) { m_newdata = false; @@ -224,9 +228,13 @@ void PlotWaterfall::drawData() //wxMemoryDC& pDC) wxNativePixelData::Iterator rowStart = p; for(int x = 0; x < (w - 1); ++x, ++p) { - p.Red() = m_pTopFrame->m_rxPa->m_av_mag[x]; - p.Green() = m_pTopFrame->m_rxPa->m_av_mag[x]; - p.Blue() = m_pTopFrame->m_rxPa->m_av_mag[x]; +// p.Red() = m_pTopFrame->m_rxPa->m_av_mag[x]; +// p.Green() = m_pTopFrame->m_rxPa->m_av_mag[x]; +// p.Blue() = m_pTopFrame->m_rxPa->m_av_mag[x]; + + p.Red() = g_avmag[x]; + p.Green() = g_avmag[x]; + p.Blue() = g_avmag[x]; } p = rowStart; p.OffsetY(*m_pPix, 1); @@ -315,12 +323,12 @@ void PlotWaterfall::plotPixelData(wxAutoBufferedPaintDC& dc) wxNativePixelData data(*m_pBmp); if(!data) { - // ... raw access to bitmap data unavailable, do something else ... + wxMessageBox(wxT("Unable to access Bitmap Data"), wxT("Error")); return; } if(data.GetWidth() < 20 || data.GetHeight() < 20) { - // ... complain: the bitmap it too small ... + wxMessageBox(wxT("Bitmap is too small to use"), wxT("Warning")); return; } wxNativePixelData::Iterator p(data); @@ -330,7 +338,8 @@ void PlotWaterfall::plotPixelData(wxAutoBufferedPaintDC& dc) { index = px * spec_index_per_px; // intensity = intensity_per_dB * (m_av_mag[index] - MIN_DB); - intensity = intensity_per_dB * (((MainFrame *)GetParent())->m_rxPa->m_av_mag[index] - MIN_DB); + intensity = intensity_per_dB * (g_avmag[index] - MIN_DB); +// intensity = intensity_per_dB * (((MainFrame *)GetParent())->m_rxPa->m_av_mag[index] - MIN_DB); // intensity = intensity_per_dB * (((MainFrame *)GetParent())->m_av_mag[index] - MIN_DB); if(intensity > 255) { -- 2.25.1