From daeb2d5a18b256451d0e376eabc48e9854435f6e Mon Sep 17 00:00:00 2001 From: corne lukken Date: Tue, 26 May 2015 15:23:13 +0200 Subject: [PATCH 01/16] Crated messagebox for no devices --- src/AppFrame.cpp | 6 +++++- src/AppFrame.h | 3 +++ src/CubicSDR.cpp | 8 +++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index c55e61c..7aa8d0d 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -306,7 +306,6 @@ AppFrame::AppFrame() : } AppFrame::~AppFrame() { - } void AppFrame::OnMenu(wxCommandEvent& event) { @@ -688,3 +687,8 @@ bool AppFrame::loadSession(std::string fileName) { return true; } + +void AppFrame::OnMessage(std::string text, std::string title) { + wxMessageDialog *message = new wxMessageDialog(NULL, wxString::Format(text.c_str()), wxString::Format(title.c_str()), wxOK | wxICON_ERROR ); + message->ShowModal(); +} diff --git a/src/AppFrame.h b/src/AppFrame.h index d5bb09a..b60f5c9 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -51,12 +51,15 @@ public: void saveSession(std::string fileName); bool loadSession(std::string fileName); + void OnMessage(std::string message, std::string title); + private: void OnMenu(wxCommandEvent& event); void OnClose(wxCommandEvent& event); void OnNewWindow(wxCommandEvent& event); void OnIdle(wxIdleEvent& event); + ScopeCanvas *scopeCanvas; SpectrumCanvas *spectrumCanvas; WaterfallCanvas *waterfallCanvas; diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index fce7a96..cc208ff 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -87,13 +87,19 @@ bool CubicSDR::OnInit() { std::cout << "Chosen: " << devId << std::endl; sdrThread->setDeviceId(devId); - } + } t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread); t_SDR = new std::thread(&SDRThread::threadMain, sdrThread); appframe = new AppFrame(); + if(devs.size() == 0) { + // appframe->OnMessage("no devices found!", "warning"); + wxMessageDialog *message = new wxMessageDialog(NULL, wxT("no devices found"), wxT("warning"), wxOK | wxICON_ERROR ); + message->ShowModal(); + } + #ifdef __APPLE__ int main_policy; struct sched_param main_param; From 06da0a913c2c2ebaf7f32c0c20a6c316438bdeeb Mon Sep 17 00:00:00 2001 From: corne lukken Date: Tue, 26 May 2015 16:37:15 +0200 Subject: [PATCH 02/16] made OnMessage a bit cleaner, problably shoudl move to /visual --- src/CubicSDR.cpp | 18 +++++++++--------- src/CubicSDR.h | 2 ++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index cc208ff..25fb29f 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -81,25 +81,20 @@ bool CubicSDR::OnInit() { devName.append(" (In Use?)"); } choices.Add(devName); - } - + } int devId = wxGetSingleChoiceIndex(wxT("Devices"), wxT("Choose Input Device"), choices); std::cout << "Chosen: " << devId << std::endl; sdrThread->setDeviceId(devId); - } + } else { + OnMessage("no devices found!", "warning"); + } t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread); t_SDR = new std::thread(&SDRThread::threadMain, sdrThread); appframe = new AppFrame(); - if(devs.size() == 0) { - // appframe->OnMessage("no devices found!", "warning"); - wxMessageDialog *message = new wxMessageDialog(NULL, wxT("no devices found"), wxT("warning"), wxOK | wxICON_ERROR ); - message->ShowModal(); - } - #ifdef __APPLE__ int main_policy; struct sched_param main_param; @@ -293,3 +288,8 @@ void CubicSDR::setFrequencySnap(int snap) { int CubicSDR::getFrequencySnap() { return snap; } + +void CubicSDR::OnMessage(std::string text, std::string title) { + wxMessageDialog *message = new wxMessageDialog(NULL, wxString::Format(text.c_str()), wxString::Format(title.c_str()), wxOK | wxICON_ERROR ); + message->ShowModal(); +} \ No newline at end of file diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 2d84af1..aee8fb2 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -62,6 +62,8 @@ public: void showFrequencyInput(); + void OnMessage(std::string message, std::string title); + private: AppFrame *appframe; AppConfig config; From 4ec97af590331e0cc2a653013d4d76cad4545071 Mon Sep 17 00:00:00 2001 From: corne lukken Date: Tue, 26 May 2015 16:39:17 +0200 Subject: [PATCH 03/16] Remove appframe OnMessage --- src/AppFrame.cpp | 5 ----- src/AppFrame.h | 2 -- 2 files changed, 7 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 7aa8d0d..8d26fff 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -687,8 +687,3 @@ bool AppFrame::loadSession(std::string fileName) { return true; } - -void AppFrame::OnMessage(std::string text, std::string title) { - wxMessageDialog *message = new wxMessageDialog(NULL, wxString::Format(text.c_str()), wxString::Format(title.c_str()), wxOK | wxICON_ERROR ); - message->ShowModal(); -} diff --git a/src/AppFrame.h b/src/AppFrame.h index b60f5c9..cadb4fa 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -51,8 +51,6 @@ public: void saveSession(std::string fileName); bool loadSession(std::string fileName); - void OnMessage(std::string message, std::string title); - private: void OnMenu(wxCommandEvent& event); void OnClose(wxCommandEvent& event); From c8f76addc391699e12876865fe68a6a2992d28f4 Mon Sep 17 00:00:00 2001 From: corne lukken Date: Wed, 27 May 2015 11:08:47 +0200 Subject: [PATCH 04/16] Updated gitignore --- .gitignore | 7 +++++++ src/CubicSDR.cpp | 7 ++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 18333cf..ad82be2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +CMakeCache.txt +CMakeFiles/ +Makefile +cmake_install.cmake +compile_commands.json +nbproject/ +x64/ cmake_build/ cmake_build_msvc/ dist/ diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 25fb29f..51c1434 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -86,10 +86,11 @@ bool CubicSDR::OnInit() { std::cout << "Chosen: " << devId << std::endl; sdrThread->setDeviceId(devId); - } else { - OnMessage("no devices found!", "warning"); } - + else if(devs.size() == 0) { + wxGetApp().OnMessage("No devices found!", "warning"); + } + t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread); t_SDR = new std::thread(&SDRThread::threadMain, sdrThread); From e5bdcb1fc9a85a07dc1b01de4dec6fcc18c6eaa8 Mon Sep 17 00:00:00 2001 From: corne lukken Date: Fri, 29 May 2015 13:45:15 +0200 Subject: [PATCH 05/16] Finished messaging pop-up started implementing advanced modulations --- src/AppFrame.cpp | 15 ++++++++++++++- src/AppFrame.h | 2 ++ src/CubicSDR.cpp | 4 ++-- src/CubicSDR.h | 2 +- src/demod/DemodDefs.h | 10 ++++++++++ 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 8d26fff..9538e00 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -58,9 +58,22 @@ AppFrame::AppFrame() : demodModeSelector->addChoice(DEMOD_TYPE_LSB, "LSB"); demodModeSelector->addChoice(DEMOD_TYPE_USB, "USB"); demodModeSelector->addChoice(DEMOD_TYPE_DSB, "DSB"); - demodModeSelector->setSelection(DEMOD_TYPE_FM); demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation, Amplitude Modulation and Lower, Upper or Double Side-Band."); demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0); + + demodModeSelectoradv = new ModeSelectorCanvas(this, attribList); + demodModeSelectoradv->addChoice(DEMOD_TYPE_ASK, "ASK"); + demodModeSelectoradv->addChoice(DEMOD_TYPE_APSK, "APSK"); + demodModeSelectoradv->addChoice(DEMOD_TYPE_BPSK, "BPSK"); + demodModeSelectoradv->addChoice(DEMOD_TYPE_DPSK, "DPSK"); + demodModeSelectoradv->addChoice(DEMOD_TYPE_PSK, "PSK"); + demodModeSelectoradv->addChoice(DEMOD_TYPE_OOK, "OOK"); + demodModeSelectoradv->addChoice(DEMOD_TYPE_ST, "ST"); + demodModeSelectoradv->addChoice(DEMOD_TYPE_SQAM, "SQAM"); + demodModeSelectoradv->addChoice(DEMOD_TYPE_QAM, "QAM"); + demodModeSelectoradv->addChoice(DEMOD_TYPE_QPSK, "QPSK"); + demodModeSelectoradv->setHelpTip("Choose advanced modulation types."); + demodTray->Add(demodModeSelectoradv, 3, wxEXPAND | wxALL, 0); // demodTray->AddSpacer(2); diff --git a/src/AppFrame.h b/src/AppFrame.h index cadb4fa..39911d1 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -62,6 +62,8 @@ private: SpectrumCanvas *spectrumCanvas; WaterfallCanvas *waterfallCanvas; ModeSelectorCanvas *demodModeSelector; + ModeSelectorCanvas *demodModeSelectoradv; + ModeSelectorCanvas *demodModeSelectoradv2; SpectrumCanvas *demodSpectrumCanvas; WaterfallCanvas *demodWaterfallCanvas; MeterCanvas *demodSignalMeter; diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 51c1434..db696e6 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -88,7 +88,7 @@ bool CubicSDR::OnInit() { sdrThread->setDeviceId(devId); } else if(devs.size() == 0) { - wxGetApp().OnMessage("No devices found!", "warning"); + wxGetApp().showMessage("No devices found!", "warning"); } t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread); @@ -290,7 +290,7 @@ int CubicSDR::getFrequencySnap() { return snap; } -void CubicSDR::OnMessage(std::string text, std::string title) { +void CubicSDR::showMessage(std::string text, std::string title) { wxMessageDialog *message = new wxMessageDialog(NULL, wxString::Format(text.c_str()), wxString::Format(title.c_str()), wxOK | wxICON_ERROR ); message->ShowModal(); } \ No newline at end of file diff --git a/src/CubicSDR.h b/src/CubicSDR.h index aee8fb2..cd98341 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -62,7 +62,7 @@ public: void showFrequencyInput(); - void OnMessage(std::string message, std::string title); + void showMessage(std::string message, std::string title); private: AppFrame *appframe; diff --git a/src/demod/DemodDefs.h b/src/demod/DemodDefs.h index 6282ac0..cc1365f 100644 --- a/src/demod/DemodDefs.h +++ b/src/demod/DemodDefs.h @@ -13,6 +13,16 @@ #define DEMOD_TYPE_LSB 3 #define DEMOD_TYPE_USB 4 #define DEMOD_TYPE_DSB 5 +#define DEMOD_TYPE_ASK 6 +#define DEMOD_TYPE_APSK 7 +#define DEMOD_TYPE_BPSK 8 +#define DEMOD_TYPE_DPSK 9 +#define DEMOD_TYPE_PSK 10 +#define DEMOD_TYPE_OOK 11 +#define DEMOD_TYPE_ST 12 +#define DEMOD_TYPE_SQAM 13 +#define DEMOD_TYPE_QAM 14 +#define DEMOD_TYPE_QPSK 15 class DemodulatorThread; class DemodulatorThreadCommand { From 0a0e7db24249bd9e28b41b8bdd460f19f981372e Mon Sep 17 00:00:00 2001 From: corne lukken Date: Wed, 3 Jun 2015 11:23:16 +0200 Subject: [PATCH 06/16] deModulators selections --- src/AppFrame.cpp | 10 +++++++- src/AppFrame.h | 1 - src/demod/DemodulatorThread.cpp | 12 ++++++++++ src/demod/DemodulatorThread.h | 10 ++++++++ src/visual/PrimaryGLContext.cpp | 41 +++++++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 9538e00..2ecc57c 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -72,6 +72,7 @@ AppFrame::AppFrame() : demodModeSelectoradv->addChoice(DEMOD_TYPE_SQAM, "SQAM"); demodModeSelectoradv->addChoice(DEMOD_TYPE_QAM, "QAM"); demodModeSelectoradv->addChoice(DEMOD_TYPE_QPSK, "QPSK"); + demodModeSelectoradv->setSelection(DEMOD_TYPE_ASK); demodModeSelectoradv->setHelpTip("Choose advanced modulation types."); demodTray->Add(demodModeSelectoradv, 3, wxEXPAND | wxALL, 0); @@ -491,6 +492,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { outputDeviceMenuItems[outputDevice]->Check(true); int dType = demod->getDemodulatorType(); demodModeSelector->setSelection(dType); + demodModeSelectoradv->setSelection(dType); } if (demodWaterfallCanvas->getDragState() == WaterfallCanvas::WF_DRAG_NONE) { long long centerFreq = demod->getFrequency(); @@ -518,8 +520,14 @@ void AppFrame::OnIdle(wxIdleEvent& event) { demodSpectrumCanvas->setCenterFrequency(centerFreq); } int dSelection = demodModeSelector->getSelection(); + int dSelectionadv = demodModeSelectoradv->getSelection(); if (dSelection != -1 && dSelection != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelection); + demodModeSelectoradv->setSelection(-1); + } + else if(dSelectionadv != -1 && dSelectionadv != demod->getDemodulatorType()) { + demod->setDemodulatorType(dSelectionadv); + demodModeSelector->setSelection(-1); } demodWaterfallCanvas->setBandwidth(demodBw); @@ -538,7 +546,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } else { DemodulatorMgr *mgr = &wxGetApp().getDemodMgr(); - int dSelection = demodModeSelector->getSelection(); + int dSelection = demodModeSelectoradv->getSelection(); if (dSelection != -1 && dSelection != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelection); } diff --git a/src/AppFrame.h b/src/AppFrame.h index 39911d1..36b6264 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -63,7 +63,6 @@ private: WaterfallCanvas *waterfallCanvas; ModeSelectorCanvas *demodModeSelector; ModeSelectorCanvas *demodModeSelectoradv; - ModeSelectorCanvas *demodModeSelectoradv2; SpectrumCanvas *demodSpectrumCanvas; WaterfallCanvas *demodWaterfallCanvas; MeterCanvas *demodSignalMeter; diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index a14f8e2..a616987 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -24,6 +24,18 @@ DemodulatorThread::DemodulatorThread(DemodulatorThreadPostInputQueue* iqInputQue demodAM_DSB = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_DSB, 1); demodAM_DSB_CSP = ampmodem_create(0.5, 0.0, LIQUID_AMPMODEM_DSB, 0); demodAM = demodAM_DSB_CSP; + + // advanced demodulators + demodASK = modem_create(LIQUID_MODEM_ASK2); + demodAPSK = modem_create(LIQUID_MODEM_APSK4); + demodBPSK = modem_create(LIQUID_MODEM_BPSK); + demodDPSK = modem_create(LIQUID_MODEM_DPSK4); + demodPSK = modem_create(LIQUID_MODEM_PSK2); + demodOOK = modem_create(LIQUID_MODEM_OOK); + demodSQAM = modem_create(LIQUID_MODEM_SQAM32); + demodST = modem_create(LIQUID_MODEM_V29); + demodQAM = modem_create(LIQUID_MODEM_QAM4); + demodQPSK = modem_create(LIQUID_MODEM_QPSK); } DemodulatorThread::~DemodulatorThread() { diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index f9d013b..0f113a5 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -65,6 +65,16 @@ protected: ampmodem demodAM_DSB; ampmodem demodAM_LSB; ampmodem demodAM_USB; + modem demodASK; + modem demodAPSK; + modem demodBPSK; + modem demodDPSK; + modem demodPSK; + modem demodOOK; + modem demodSQAM; + modem demodST; + modem demodQAM; + modem demodQPSK; agc_crcf iqAutoGain; diff --git a/src/visual/PrimaryGLContext.cpp b/src/visual/PrimaryGLContext.cpp index 74a406a..f50cfdd 100644 --- a/src/visual/PrimaryGLContext.cpp +++ b/src/visual/PrimaryGLContext.cpp @@ -263,6 +263,47 @@ void PrimaryGLContext::DrawDemod(DemodulatorInstance *demod, RGBColor color, lon demodAlign = GLFont::GLFONT_ALIGN_LEFT; uxPos += xOfs; break; + // advanced demodulators start here + case DEMOD_TYPE_ASK: + demodStr = "ASK"; + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + break; + case DEMOD_TYPE_APSK: + demodStr = "APSK"; + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + break; + case DEMOD_TYPE_BPSK: + demodStr = "BPSK"; + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + break; + case DEMOD_TYPE_DPSK: + demodStr = "DPSK"; + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + break; + case DEMOD_TYPE_PSK: + demodStr = "PSK"; + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + break; + case DEMOD_TYPE_OOK: + demodStr = "OOK"; + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + break; + case DEMOD_TYPE_SQAM: + demodStr = "SQAM"; + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + break; + case DEMOD_TYPE_ST: + demodStr = "ST"; + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + break; + case DEMOD_TYPE_QAM: + demodStr = "QAM"; + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + break; + case DEMOD_TYPE_QPSK: + demodStr = "QPSK"; + demodAlign = GLFont::GLFONT_ALIGN_CENTER; + break; } glColor3f(0, 0, 0); From 2ca6786be7d6580e3e643b8f8437bef62a5f351b Mon Sep 17 00:00:00 2001 From: Dantali0n Date: Thu, 4 Jun 2015 22:38:43 +0200 Subject: [PATCH 07/16] Modem demodulations returning bitstreams --- src/AppFrame.cpp | 9 ++++- src/demod/DemodulatorThread.cpp | 59 +++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 2ecc57c..2dde435 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -546,10 +546,17 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } else { DemodulatorMgr *mgr = &wxGetApp().getDemodMgr(); - int dSelection = demodModeSelectoradv->getSelection(); + int dSelection = demodModeSelector->getSelection(); + int dSelectionadv = demodModeSelectoradv->getSelection(); if (dSelection != -1 && dSelection != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelection); + demodModeSelectoradv->setSelection(-1); } + else if(dSelectionadv != -1 && dSelectionadv != mgr->getLastDemodulatorType()) { + mgr->setLastDemodulatorType(dSelectionadv); + demodModeSelector->setSelection(-1); + } + demodGainMeter->setLevel(mgr->getLastGain()); if (demodSignalMeter->inputChanged()) { mgr->setLastSquelchLevel(demodSignalMeter->getInputValue()); diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index a616987..cd69707 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -177,6 +177,8 @@ void DemodulatorThread::threadMain() { freqdem_demodulate_block(demodFM, &agcData[0], bufSize, &demodOutputData[0]); } else { float p; + unsigned int bitstream; + int temp; switch (demodulatorType.load()) { case DEMOD_TYPE_LSB: for (int i = 0; i < bufSize; i++) { // Reject upper band @@ -196,6 +198,63 @@ void DemodulatorThread::threadMain() { ampmodem_demodulate(demodAM, inp->data[i], &demodOutputData[i]); } break; + case DEMOD_TYPE_ASK: + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodASK, inp->data[i], &bitstream); + std::cout << bitstream << std::endl; + } + break; + case DEMOD_TYPE_BPSK: + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodBPSK, inp->data[i], &bitstream); + std::cout << bitstream << std::endl; + } + break; + case DEMOD_TYPE_DPSK: + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodDPSK, inp->data[i], &bitstream); + std::cout << bitstream << std::endl; + } + break; + case DEMOD_TYPE_PSK: + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodPSK, inp->data[i], &bitstream); + std::cout << bitstream << std::endl; + } + break; + case DEMOD_TYPE_OOK: + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodOOK, inp->data[i], &bitstream); + std::cout << bitstream << std::endl; + } + break; + case DEMOD_TYPE_SQAM: + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodSQAM, inp->data[i], &bitstream); + std::cout << bitstream << std::endl; + } + break; + case DEMOD_TYPE_ST: + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodST, inp->data[i], &bitstream); + std::cout << bitstream << std::endl; + } + break; + case DEMOD_TYPE_QAM: + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodQAM, inp->data[i], &bitstream); + std::cout << bitstream << std::endl; + } + break; + case DEMOD_TYPE_QPSK: + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodQPSK, inp->data[i], &bitstream); + // std::cout << bitstream << std::endl; + } + if(modem_get_demodulator_evm(demodQPSK) <= 0.8f) { + std::cout << "Lock!" << std::endl; + } + break; } amOutputCeilMA = amOutputCeilMA + (amOutputCeil - amOutputCeilMA) * 0.025; From 9e1601c4466bf9816468ebeedac7ce76d8ee0fc6 Mon Sep 17 00:00:00 2001 From: Dantali0n Date: Fri, 5 Jun 2015 09:51:46 +0200 Subject: [PATCH 08/16] Working demodulator lock status text --- src/demod/DemodulatorInstance.cpp | 15 +++++++++++++ src/demod/DemodulatorInstance.h | 4 ++++ src/demod/DemodulatorMgr.cpp | 9 ++++++++ src/demod/DemodulatorMgr.h | 4 ++++ src/demod/DemodulatorThread.cpp | 35 ++++++++++++++++++++++++++----- src/demod/DemodulatorThread.h | 6 ++++++ src/visual/PrimaryGLContext.cpp | 6 ++++++ 7 files changed, 74 insertions(+), 5 deletions(-) diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 0f16c68..fffe23c 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -21,6 +21,7 @@ DemodulatorInstance::DemodulatorInstance() : demodulatorThread->setAudioOutputQueue(audioInputQueue); currentDemodType = demodulatorThread->getDemodulatorType(); + currentDemodLock = demodulatorThread->getDemodulatorLock(); } DemodulatorInstance::~DemodulatorInstance() { @@ -50,6 +51,7 @@ void DemodulatorInstance::run() { currentFrequency = demodulatorPreThread->getParams().frequency; currentDemodType = demodulatorThread->getDemodulatorType(); + currentDemodLock = demodulatorThread->getDemodulatorLock(); currentAudioSampleRate = AudioThread::deviceSampleRate[getOutputDevice()]; demodulatorPreThread->getParams().audioSampleRate = currentAudioSampleRate; @@ -264,6 +266,19 @@ int DemodulatorInstance::getDemodulatorType() { return currentDemodType; } +void DemodulatorInstance::setDemodulatorLock(bool demod_lock_in) { + if(demod_lock_in) { + currentDemodLock = true; + } + else { + currentDemodLock = false; + } +} + +int DemodulatorInstance::getDemodulatorLock() { + return currentDemodLock; +} + void DemodulatorInstance::setBandwidth(int bw) { if (!active) { currentBandwidth = bw; diff --git a/src/demod/DemodulatorInstance.h b/src/demod/DemodulatorInstance.h index bbb4841..88042ab 100644 --- a/src/demod/DemodulatorInstance.h +++ b/src/demod/DemodulatorInstance.h @@ -64,6 +64,9 @@ public: void setDemodulatorType(int demod_type_in); int getDemodulatorType(); + + void setDemodulatorLock(bool demod_lock_in); + int getDemodulatorLock(); void setBandwidth(int bw); int getBandwidth(); @@ -98,6 +101,7 @@ private: long long currentFrequency; int currentBandwidth; int currentDemodType; + bool currentDemodLock = false; int currentOutputDevice; int currentAudioSampleRate; bool follow, tracking; diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index 7604d92..ac584e7 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -162,6 +162,7 @@ void DemodulatorMgr::updateLastState() { if (lastActiveDemodulator) { lastBandwidth = lastActiveDemodulator->getBandwidth(); lastDemodType = lastActiveDemodulator->getDemodulatorType(); + lastDemodLock = lastActiveDemodulator->getDemodulatorLock(); lastSquelchEnabled = lastActiveDemodulator->isSquelchEnabled(); lastSquelch = lastActiveDemodulator->getSquelchLevel(); lastGain = lastActiveDemodulator->getGain(); @@ -191,6 +192,14 @@ void DemodulatorMgr::setLastDemodulatorType(int lastDemodType) { this->lastDemodType = lastDemodType; } +bool DemodulatorMgr::getLastDemodulatorLock() const { + return lastDemodLock; +} + +void DemodulatorMgr::setLastDemodulatorLock(bool lastDemodLock) { + this->lastDemodLock = lastDemodLock; +} + float DemodulatorMgr::getLastGain() const { return lastGain; } diff --git a/src/demod/DemodulatorMgr.h b/src/demod/DemodulatorMgr.h index 24baeb1..01a8273 100644 --- a/src/demod/DemodulatorMgr.h +++ b/src/demod/DemodulatorMgr.h @@ -27,6 +27,9 @@ public: int getLastDemodulatorType() const; void setLastDemodulatorType(int lastDemodType); + + bool getLastDemodulatorLock() const; + void setLastDemodulatorLock(bool lastDemodLock); float getLastGain() const; void setLastGain(float lastGain); @@ -52,6 +55,7 @@ private: int lastBandwidth; int lastDemodType; + bool lastDemodLock; bool lastSquelchEnabled; float lastSquelch; float lastGain; diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index cd69707..e79700d 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -178,7 +178,6 @@ void DemodulatorThread::threadMain() { } else { float p; unsigned int bitstream; - int temp; switch (demodulatorType.load()) { case DEMOD_TYPE_LSB: for (int i = 0; i < bufSize; i++) { // Reject upper band @@ -203,57 +202,62 @@ void DemodulatorThread::threadMain() { modem_demodulate(demodASK, inp->data[i], &bitstream); std::cout << bitstream << std::endl; } + updateDemodulatorLock(demodASK); break; case DEMOD_TYPE_BPSK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodBPSK, inp->data[i], &bitstream); std::cout << bitstream << std::endl; } + updateDemodulatorLock(demodBPSK); break; case DEMOD_TYPE_DPSK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodDPSK, inp->data[i], &bitstream); std::cout << bitstream << std::endl; } + updateDemodulatorLock(demodDPSK); break; case DEMOD_TYPE_PSK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodPSK, inp->data[i], &bitstream); std::cout << bitstream << std::endl; } + updateDemodulatorLock(demodPSK); break; case DEMOD_TYPE_OOK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodOOK, inp->data[i], &bitstream); std::cout << bitstream << std::endl; } + updateDemodulatorLock(demodOOK); break; case DEMOD_TYPE_SQAM: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodSQAM, inp->data[i], &bitstream); std::cout << bitstream << std::endl; } + updateDemodulatorLock(demodSQAM); break; case DEMOD_TYPE_ST: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodST, inp->data[i], &bitstream); std::cout << bitstream << std::endl; } + updateDemodulatorLock(demodST); break; case DEMOD_TYPE_QAM: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodQAM, inp->data[i], &bitstream); std::cout << bitstream << std::endl; } + updateDemodulatorLock(demodQAM); break; case DEMOD_TYPE_QPSK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodQPSK, inp->data[i], &bitstream); - // std::cout << bitstream << std::endl; } - if(modem_get_demodulator_evm(demodQPSK) <= 0.8f) { - std::cout << "Lock!" << std::endl; - } + updateDemodulatorLock(demodQPSK); break; } @@ -458,6 +462,10 @@ void DemodulatorThread::threadMain() { demodAM = demodAM_DSB_CSP; ampmodem_reset(demodAM); break; + case DEMOD_TYPE_QPSK: + std::cout << "reset modem qpsk" << std::endl; + modem_reset(demodQPSK); + break; } demodulatorType = newDemodType; } @@ -553,3 +561,20 @@ int DemodulatorThread::getDemodulatorType() { return demodulatorType; } +void DemodulatorThread::setDemodulatorLock(bool demod_lock_in) { + if(demod_lock_in) { + currentDemodLock = true; + } + else { + currentDemodLock = false; + } +} + +int DemodulatorThread::getDemodulatorLock() { + return currentDemodLock; +} + +void DemodulatorThread::updateDemodulatorLock(modem demod) { + modem_get_demodulator_evm(demod) <= 0.8f ? setDemodulatorLock(true) : setDemodulatorLock(false); +} + diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 0f113a5..33055d9 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -37,6 +37,9 @@ public: void setDemodulatorType(int demod_type_in); int getDemodulatorType(); + + void setDemodulatorLock(bool demod_lock_in); + int getDemodulatorLock(); #ifdef __APPLE__ static void *pthread_helper(void *context) { @@ -92,4 +95,7 @@ protected: std::atomic squelchLevel; std::atomic signalLevel; bool squelchEnabled; + + bool currentDemodLock = false; + void updateDemodulatorLock(modem demod); }; diff --git a/src/visual/PrimaryGLContext.cpp b/src/visual/PrimaryGLContext.cpp index f50cfdd..0557768 100644 --- a/src/visual/PrimaryGLContext.cpp +++ b/src/visual/PrimaryGLContext.cpp @@ -305,6 +305,12 @@ void PrimaryGLContext::DrawDemod(DemodulatorInstance *demod, RGBColor color, lon demodAlign = GLFont::GLFONT_ALIGN_CENTER; break; } + + + // add lock to string if we have an lock + if(demod->getDemodulatorLock()) { + demodStr = demodStr + " Lock"; + } glColor3f(0, 0, 0); getFont(PrimaryGLContext::GLFONT_SIZE16).drawString(demodStr, 2.0 * (uxPos - 0.5) + xOfs, -1.0 + hPos - yOfs, 16, demodAlign, From b76eafe8dfa9b23d0d0687a94996db97593d1048 Mon Sep 17 00:00:00 2001 From: Dantali0n Date: Tue, 9 Jun 2015 17:00:05 +0200 Subject: [PATCH 09/16] Fix lock UI update and start on constellation implementation --- src/AppFrame.cpp | 51 +++++++++++++--------- src/AppFrame.h | 3 +- src/demod/DemodulatorInstance.cpp | 11 +---- src/demod/DemodulatorInstance.h | 1 - src/demod/DemodulatorMgr.cpp | 9 ---- src/demod/DemodulatorMgr.h | 4 -- src/demod/DemodulatorThread.cpp | 70 +++++++++++++++---------------- src/demod/DemodulatorThread.h | 4 +- src/visual/PrimaryGLContext.cpp | 1 - 9 files changed, 72 insertions(+), 82 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 2dde435..5ca5ae6 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -61,20 +61,33 @@ AppFrame::AppFrame() : demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation, Amplitude Modulation and Lower, Upper or Double Side-Band."); demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0); - demodModeSelectoradv = new ModeSelectorCanvas(this, attribList); - demodModeSelectoradv->addChoice(DEMOD_TYPE_ASK, "ASK"); - demodModeSelectoradv->addChoice(DEMOD_TYPE_APSK, "APSK"); - demodModeSelectoradv->addChoice(DEMOD_TYPE_BPSK, "BPSK"); - demodModeSelectoradv->addChoice(DEMOD_TYPE_DPSK, "DPSK"); - demodModeSelectoradv->addChoice(DEMOD_TYPE_PSK, "PSK"); - demodModeSelectoradv->addChoice(DEMOD_TYPE_OOK, "OOK"); - demodModeSelectoradv->addChoice(DEMOD_TYPE_ST, "ST"); - demodModeSelectoradv->addChoice(DEMOD_TYPE_SQAM, "SQAM"); - demodModeSelectoradv->addChoice(DEMOD_TYPE_QAM, "QAM"); - demodModeSelectoradv->addChoice(DEMOD_TYPE_QPSK, "QPSK"); - demodModeSelectoradv->setSelection(DEMOD_TYPE_ASK); - demodModeSelectoradv->setHelpTip("Choose advanced modulation types."); - demodTray->Add(demodModeSelectoradv, 3, wxEXPAND | wxALL, 0); + demodModeSelectorAdv = new ModeSelectorCanvas(this, attribList); + demodModeSelectorAdv->addChoice(DEMOD_TYPE_ASK, "ASK"); + demodModeSelectorAdv->addChoice(DEMOD_TYPE_APSK, "APSK"); + demodModeSelectorAdv->addChoice(DEMOD_TYPE_BPSK, "BPSK"); + demodModeSelectorAdv->addChoice(DEMOD_TYPE_DPSK, "DPSK"); + demodModeSelectorAdv->addChoice(DEMOD_TYPE_PSK, "PSK"); + demodModeSelectorAdv->addChoice(DEMOD_TYPE_OOK, "OOK"); + demodModeSelectorAdv->addChoice(DEMOD_TYPE_ST, "ST"); + demodModeSelectorAdv->addChoice(DEMOD_TYPE_SQAM, "SQAM"); + demodModeSelectorAdv->addChoice(DEMOD_TYPE_QAM, "QAM"); + demodModeSelectorAdv->addChoice(DEMOD_TYPE_QPSK, "QPSK"); + demodModeSelectorAdv->setSelection(DEMOD_TYPE_ASK); + demodModeSelectorAdv->setHelpTip("Choose advanced modulation types."); + demodTray->Add(demodModeSelectorAdv, 3, wxEXPAND | wxALL, 0); + + demodModeSelectorCons = new ModeSelectorCanvas(this, attribList); + demodModeSelectorCons->addChoice(1, "auto"); + demodModeSelectorCons->addChoice(2, "2"); + demodModeSelectorCons->addChoice(4, "4"); + demodModeSelectorCons->addChoice(8, "8"); + demodModeSelectorCons->addChoice(16, "16"); + demodModeSelectorCons->addChoice(32, "32"); + demodModeSelectorCons->addChoice(64, "64"); + demodModeSelectorCons->addChoice(128, "128"); + demodModeSelectorCons->addChoice(256, "256"); + demodModeSelectorCons->setHelpTip("Choose number of constallations types."); + demodTray->Add(demodModeSelectorCons, 2, wxEXPAND | wxALL, 0); // demodTray->AddSpacer(2); @@ -492,7 +505,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { outputDeviceMenuItems[outputDevice]->Check(true); int dType = demod->getDemodulatorType(); demodModeSelector->setSelection(dType); - demodModeSelectoradv->setSelection(dType); + demodModeSelectorAdv->setSelection(dType); } if (demodWaterfallCanvas->getDragState() == WaterfallCanvas::WF_DRAG_NONE) { long long centerFreq = demod->getFrequency(); @@ -520,10 +533,10 @@ void AppFrame::OnIdle(wxIdleEvent& event) { demodSpectrumCanvas->setCenterFrequency(centerFreq); } int dSelection = demodModeSelector->getSelection(); - int dSelectionadv = demodModeSelectoradv->getSelection(); + int dSelectionadv = demodModeSelectorAdv->getSelection(); if (dSelection != -1 && dSelection != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelection); - demodModeSelectoradv->setSelection(-1); + demodModeSelectorAdv->setSelection(-1); } else if(dSelectionadv != -1 && dSelectionadv != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelectionadv); @@ -547,10 +560,10 @@ void AppFrame::OnIdle(wxIdleEvent& event) { DemodulatorMgr *mgr = &wxGetApp().getDemodMgr(); int dSelection = demodModeSelector->getSelection(); - int dSelectionadv = demodModeSelectoradv->getSelection(); + int dSelectionadv = demodModeSelectorAdv->getSelection(); if (dSelection != -1 && dSelection != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelection); - demodModeSelectoradv->setSelection(-1); + demodModeSelectorAdv->setSelection(-1); } else if(dSelectionadv != -1 && dSelectionadv != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelectionadv); diff --git a/src/AppFrame.h b/src/AppFrame.h index 36b6264..9f3e07d 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -62,7 +62,8 @@ private: SpectrumCanvas *spectrumCanvas; WaterfallCanvas *waterfallCanvas; ModeSelectorCanvas *demodModeSelector; - ModeSelectorCanvas *demodModeSelectoradv; + ModeSelectorCanvas *demodModeSelectorAdv; + ModeSelectorCanvas *demodModeSelectorCons; SpectrumCanvas *demodSpectrumCanvas; WaterfallCanvas *demodWaterfallCanvas; MeterCanvas *demodSignalMeter; diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index fffe23c..0ae7010 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -21,7 +21,6 @@ DemodulatorInstance::DemodulatorInstance() : demodulatorThread->setAudioOutputQueue(audioInputQueue); currentDemodType = demodulatorThread->getDemodulatorType(); - currentDemodLock = demodulatorThread->getDemodulatorLock(); } DemodulatorInstance::~DemodulatorInstance() { @@ -51,7 +50,6 @@ void DemodulatorInstance::run() { currentFrequency = demodulatorPreThread->getParams().frequency; currentDemodType = demodulatorThread->getDemodulatorType(); - currentDemodLock = demodulatorThread->getDemodulatorLock(); currentAudioSampleRate = AudioThread::deviceSampleRate[getOutputDevice()]; demodulatorPreThread->getParams().audioSampleRate = currentAudioSampleRate; @@ -267,16 +265,11 @@ int DemodulatorInstance::getDemodulatorType() { } void DemodulatorInstance::setDemodulatorLock(bool demod_lock_in) { - if(demod_lock_in) { - currentDemodLock = true; - } - else { - currentDemodLock = false; - } + demodulatorThread->setDemodulatorLock(demod_lock_in); } int DemodulatorInstance::getDemodulatorLock() { - return currentDemodLock; + return demodulatorThread->getDemodulatorLock(); } void DemodulatorInstance::setBandwidth(int bw) { diff --git a/src/demod/DemodulatorInstance.h b/src/demod/DemodulatorInstance.h index 88042ab..fdc935f 100644 --- a/src/demod/DemodulatorInstance.h +++ b/src/demod/DemodulatorInstance.h @@ -101,7 +101,6 @@ private: long long currentFrequency; int currentBandwidth; int currentDemodType; - bool currentDemodLock = false; int currentOutputDevice; int currentAudioSampleRate; bool follow, tracking; diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index ac584e7..7604d92 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -162,7 +162,6 @@ void DemodulatorMgr::updateLastState() { if (lastActiveDemodulator) { lastBandwidth = lastActiveDemodulator->getBandwidth(); lastDemodType = lastActiveDemodulator->getDemodulatorType(); - lastDemodLock = lastActiveDemodulator->getDemodulatorLock(); lastSquelchEnabled = lastActiveDemodulator->isSquelchEnabled(); lastSquelch = lastActiveDemodulator->getSquelchLevel(); lastGain = lastActiveDemodulator->getGain(); @@ -192,14 +191,6 @@ void DemodulatorMgr::setLastDemodulatorType(int lastDemodType) { this->lastDemodType = lastDemodType; } -bool DemodulatorMgr::getLastDemodulatorLock() const { - return lastDemodLock; -} - -void DemodulatorMgr::setLastDemodulatorLock(bool lastDemodLock) { - this->lastDemodLock = lastDemodLock; -} - float DemodulatorMgr::getLastGain() const { return lastGain; } diff --git a/src/demod/DemodulatorMgr.h b/src/demod/DemodulatorMgr.h index 01a8273..24baeb1 100644 --- a/src/demod/DemodulatorMgr.h +++ b/src/demod/DemodulatorMgr.h @@ -27,9 +27,6 @@ public: int getLastDemodulatorType() const; void setLastDemodulatorType(int lastDemodType); - - bool getLastDemodulatorLock() const; - void setLastDemodulatorLock(bool lastDemodLock); float getLastGain() const; void setLastGain(float lastGain); @@ -55,7 +52,6 @@ private: int lastBandwidth; int lastDemodType; - bool lastDemodLock; bool lastSquelchEnabled; float lastSquelch; float lastGain; diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index e79700d..2405578 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -26,17 +26,19 @@ DemodulatorThread::DemodulatorThread(DemodulatorThreadPostInputQueue* iqInputQue demodAM = demodAM_DSB_CSP; // advanced demodulators - demodASK = modem_create(LIQUID_MODEM_ASK2); - demodAPSK = modem_create(LIQUID_MODEM_APSK4); + demodASK = modem_create(LIQUID_MODEM_ASK256); + demodAPSK = modem_create(LIQUID_MODEM_APSK256); demodBPSK = modem_create(LIQUID_MODEM_BPSK); - demodDPSK = modem_create(LIQUID_MODEM_DPSK4); - demodPSK = modem_create(LIQUID_MODEM_PSK2); + demodDPSK = modem_create(LIQUID_MODEM_DPSK256); + demodPSK = modem_create(LIQUID_MODEM_PSK256); demodOOK = modem_create(LIQUID_MODEM_OOK); - demodSQAM = modem_create(LIQUID_MODEM_SQAM32); + demodSQAM = modem_create(LIQUID_MODEM_SQAM128); demodST = modem_create(LIQUID_MODEM_V29); - demodQAM = modem_create(LIQUID_MODEM_QAM4); + demodQAM = modem_create(LIQUID_MODEM_QAM256); demodQPSK = modem_create(LIQUID_MODEM_QPSK); - + + currentDemodLock = false; + } DemodulatorThread::~DemodulatorThread() { } @@ -200,64 +202,65 @@ void DemodulatorThread::threadMain() { case DEMOD_TYPE_ASK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodASK, inp->data[i], &bitstream); - std::cout << bitstream << std::endl; + // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodASK); + updateDemodulatorLock(demodASK, 0.8f); break; case DEMOD_TYPE_BPSK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodBPSK, inp->data[i], &bitstream); - std::cout << bitstream << std::endl; + // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodBPSK); + updateDemodulatorLock(demodBPSK, 0.8f); break; case DEMOD_TYPE_DPSK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodDPSK, inp->data[i], &bitstream); - std::cout << bitstream << std::endl; + // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodDPSK); + updateDemodulatorLock(demodDPSK, 0.8f); break; case DEMOD_TYPE_PSK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodPSK, inp->data[i], &bitstream); - std::cout << bitstream << std::endl; + // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodPSK); + updateDemodulatorLock(demodPSK, 0.8f); break; case DEMOD_TYPE_OOK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodOOK, inp->data[i], &bitstream); - std::cout << bitstream << std::endl; + // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodOOK); + updateDemodulatorLock(demodOOK, 0.8f); break; case DEMOD_TYPE_SQAM: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodSQAM, inp->data[i], &bitstream); - std::cout << bitstream << std::endl; + // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodSQAM); + updateDemodulatorLock(demodSQAM, 0.8f); break; case DEMOD_TYPE_ST: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodST, inp->data[i], &bitstream); - std::cout << bitstream << std::endl; + // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodST); + updateDemodulatorLock(demodST, 0.8f); break; case DEMOD_TYPE_QAM: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodQAM, inp->data[i], &bitstream); - std::cout << bitstream << std::endl; + // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodQAM); + updateDemodulatorLock(demodQAM, 0.5f); break; case DEMOD_TYPE_QPSK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodQPSK, inp->data[i], &bitstream); + // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodQPSK); + updateDemodulatorLock(demodQPSK, 0.8f); break; } @@ -462,10 +465,10 @@ void DemodulatorThread::threadMain() { demodAM = demodAM_DSB_CSP; ampmodem_reset(demodAM); break; - case DEMOD_TYPE_QPSK: - std::cout << "reset modem qpsk" << std::endl; - modem_reset(demodQPSK); - break; +// case DEMOD_TYPE_QPSK: +// std::cout << "reset modem qpsk" << std::endl; +// modem_reset(demodQPSK); +// break; } demodulatorType = newDemodType; } @@ -562,19 +565,14 @@ int DemodulatorThread::getDemodulatorType() { } void DemodulatorThread::setDemodulatorLock(bool demod_lock_in) { - if(demod_lock_in) { - currentDemodLock = true; - } - else { - currentDemodLock = false; - } + demod_lock_in ? currentDemodLock = true : currentDemodLock = false; } int DemodulatorThread::getDemodulatorLock() { return currentDemodLock; } -void DemodulatorThread::updateDemodulatorLock(modem demod) { - modem_get_demodulator_evm(demod) <= 0.8f ? setDemodulatorLock(true) : setDemodulatorLock(false); +void DemodulatorThread::updateDemodulatorLock(modem demod, float sensitivity) { + modem_get_demodulator_evm(demod) <= sensitivity ? setDemodulatorLock(true) : setDemodulatorLock(false); } diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 33055d9..80576ff 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -96,6 +96,6 @@ protected: std::atomic signalLevel; bool squelchEnabled; - bool currentDemodLock = false; - void updateDemodulatorLock(modem demod); + bool currentDemodLock; + void updateDemodulatorLock(modem demod, float sensitivity); }; diff --git a/src/visual/PrimaryGLContext.cpp b/src/visual/PrimaryGLContext.cpp index 0557768..a1a88f5 100644 --- a/src/visual/PrimaryGLContext.cpp +++ b/src/visual/PrimaryGLContext.cpp @@ -306,7 +306,6 @@ void PrimaryGLContext::DrawDemod(DemodulatorInstance *demod, RGBColor color, lon break; } - // add lock to string if we have an lock if(demod->getDemodulatorLock()) { demodStr = demodStr + " Lock"; From f71d04eb754dd7efc22c1ff9d9e42c6add804763 Mon Sep 17 00:00:00 2001 From: Dantali0n Date: Wed, 10 Jun 2015 10:50:14 +0200 Subject: [PATCH 10/16] Propagate Constelattion setting to demodulator, not working properly yet. --- src/AppFrame.cpp | 9 +++++++++ src/demod/DemodulatorInstance.cpp | 10 ++++++++++ src/demod/DemodulatorInstance.h | 4 ++++ src/demod/DemodulatorMgr.cpp | 10 ++++++++++ src/demod/DemodulatorMgr.h | 5 +++++ src/demod/DemodulatorThread.cpp | 29 +++++++++++++++++++++++++++-- src/demod/DemodulatorThread.h | 16 +++++++++++++++- src/visual/PrimaryGLContext.cpp | 5 ++++- 8 files changed, 84 insertions(+), 4 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 5ca5ae6..72bfcd8 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -504,8 +504,10 @@ void AppFrame::OnIdle(wxIdleEvent& event) { scopeCanvas->setDeviceName(outputDevices[outputDevice].name); outputDeviceMenuItems[outputDevice]->Check(true); int dType = demod->getDemodulatorType(); + int dCons = demod->getDemodulatorCons(); demodModeSelector->setSelection(dType); demodModeSelectorAdv->setSelection(dType); + demodModeSelectorCons->setSelection(dCons); } if (demodWaterfallCanvas->getDragState() == WaterfallCanvas::WF_DRAG_NONE) { long long centerFreq = demod->getFrequency(); @@ -534,12 +536,16 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } int dSelection = demodModeSelector->getSelection(); int dSelectionadv = demodModeSelectorAdv->getSelection(); + // basic demodulators if (dSelection != -1 && dSelection != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelection); demodModeSelectorAdv->setSelection(-1); } + // advanced demodulators else if(dSelectionadv != -1 && dSelectionadv != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelectionadv); + demod->setDemodulatorCons(demodModeSelectorCons->getSelection()); + // std::cout << "updating demodulator" << std::endl; demodModeSelector->setSelection(-1); } @@ -561,12 +567,15 @@ void AppFrame::OnIdle(wxIdleEvent& event) { int dSelection = demodModeSelector->getSelection(); int dSelectionadv = demodModeSelectorAdv->getSelection(); + // basic demodulators if (dSelection != -1 && dSelection != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelection); demodModeSelectorAdv->setSelection(-1); } + // advanced demodulators else if(dSelectionadv != -1 && dSelectionadv != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelectionadv); + mgr->setLastDemodulatorCons(demodModeSelectorCons->getSelection()); demodModeSelector->setSelection(-1); } diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 0ae7010..dc33d8d 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -21,6 +21,7 @@ DemodulatorInstance::DemodulatorInstance() : demodulatorThread->setAudioOutputQueue(audioInputQueue); currentDemodType = demodulatorThread->getDemodulatorType(); + currentDemodCons = demodulatorThread->getDemodulatorCons(); } DemodulatorInstance::~DemodulatorInstance() { @@ -50,6 +51,7 @@ void DemodulatorInstance::run() { currentFrequency = demodulatorPreThread->getParams().frequency; currentDemodType = demodulatorThread->getDemodulatorType(); + currentDemodCons = demodulatorThread->getDemodulatorCons(); currentAudioSampleRate = AudioThread::deviceSampleRate[getOutputDevice()]; demodulatorPreThread->getParams().audioSampleRate = currentAudioSampleRate; @@ -272,6 +274,14 @@ int DemodulatorInstance::getDemodulatorLock() { return demodulatorThread->getDemodulatorLock(); } +void DemodulatorInstance::setDemodulatorCons(int demod_cons_in) { + demodulatorThread->setDemodulatorCons(demod_cons_in); +} + +int DemodulatorInstance::getDemodulatorCons() { + return demodulatorThread->getDemodulatorCons(); +} + void DemodulatorInstance::setBandwidth(int bw) { if (!active) { currentBandwidth = bw; diff --git a/src/demod/DemodulatorInstance.h b/src/demod/DemodulatorInstance.h index fdc935f..ef5e79c 100644 --- a/src/demod/DemodulatorInstance.h +++ b/src/demod/DemodulatorInstance.h @@ -67,6 +67,9 @@ public: void setDemodulatorLock(bool demod_lock_in); int getDemodulatorLock(); + + void setDemodulatorCons(int demod_cons_in); + int getDemodulatorCons(); void setBandwidth(int bw); int getBandwidth(); @@ -101,6 +104,7 @@ private: long long currentFrequency; int currentBandwidth; int currentDemodType; + int currentDemodCons; int currentOutputDevice; int currentAudioSampleRate; bool follow, tracking; diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index 7604d92..48fe242 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -162,6 +162,8 @@ void DemodulatorMgr::updateLastState() { if (lastActiveDemodulator) { lastBandwidth = lastActiveDemodulator->getBandwidth(); lastDemodType = lastActiveDemodulator->getDemodulatorType(); + lastDemodLock = lastActiveDemodulator->getDemodulatorLock(); + lastDemodCons = lastActiveDemodulator->getDemodulatorCons(); lastSquelchEnabled = lastActiveDemodulator->isSquelchEnabled(); lastSquelch = lastActiveDemodulator->getSquelchLevel(); lastGain = lastActiveDemodulator->getGain(); @@ -191,6 +193,14 @@ void DemodulatorMgr::setLastDemodulatorType(int lastDemodType) { this->lastDemodType = lastDemodType; } +int DemodulatorMgr::getLastDemodulatorCons() const { + return lastDemodCons; +} + +void DemodulatorMgr::setLastDemodulatorCons(int lastDemodCons) { + this->lastDemodCons = lastDemodCons; +} + float DemodulatorMgr::getLastGain() const { return lastGain; } diff --git a/src/demod/DemodulatorMgr.h b/src/demod/DemodulatorMgr.h index 24baeb1..0dcd3f0 100644 --- a/src/demod/DemodulatorMgr.h +++ b/src/demod/DemodulatorMgr.h @@ -27,6 +27,9 @@ public: int getLastDemodulatorType() const; void setLastDemodulatorType(int lastDemodType); + + int getLastDemodulatorCons() const; + void setLastDemodulatorCons(int lastDemodCons); float getLastGain() const; void setLastGain(float lastGain); @@ -52,6 +55,8 @@ private: int lastBandwidth; int lastDemodType; + bool lastDemodLock; + int lastDemodCons; bool lastSquelchEnabled; float lastSquelch; float lastGain; diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 2405578..279808b 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -26,7 +26,20 @@ DemodulatorThread::DemodulatorThread(DemodulatorThreadPostInputQueue* iqInputQue demodAM = demodAM_DSB_CSP; // advanced demodulators - demodASK = modem_create(LIQUID_MODEM_ASK256); + // This could properly be done easier. + + demodulatorCons = 2; + + demodASK = modem_create(LIQUID_MODEM_ASK2); + demodASK2 = modem_create(LIQUID_MODEM_ASK2); + demodASK4 = modem_create(LIQUID_MODEM_ASK4); + demodASK8 = modem_create(LIQUID_MODEM_ASK8); + demodASK16 = modem_create(LIQUID_MODEM_ASK16); + demodASK32 = modem_create(LIQUID_MODEM_ASK32); + demodASK64 = modem_create(LIQUID_MODEM_ASK64); + demodASK128 = modem_create(LIQUID_MODEM_ASK128); + demodASK256 = modem_create(LIQUID_MODEM_ASK256); + demodAPSK = modem_create(LIQUID_MODEM_APSK256); demodBPSK = modem_create(LIQUID_MODEM_BPSK); demodDPSK = modem_create(LIQUID_MODEM_DPSK256); @@ -200,11 +213,14 @@ void DemodulatorThread::threadMain() { } break; case DEMOD_TYPE_ASK: + if(demodulatorCons == 2) { + demodASK = demodASK2; + } for (int i = 0; i < bufSize; i++) { modem_demodulate(demodASK, inp->data[i], &bitstream); // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodASK, 0.8f); + updateDemodulatorLock(demodASK, 0.5f); break; case DEMOD_TYPE_BPSK: for (int i = 0; i < bufSize; i++) { @@ -572,6 +588,15 @@ int DemodulatorThread::getDemodulatorLock() { return currentDemodLock; } +void DemodulatorThread::setDemodulatorCons(int demod_cons_in) { + std::cout << "Updating constellations" << std::endl; + demodulatorCons = demod_cons_in; +} + +int DemodulatorThread::getDemodulatorCons() { + return demodulatorCons; +} + void DemodulatorThread::updateDemodulatorLock(modem demod, float sensitivity) { modem_get_demodulator_evm(demod) <= sensitivity ? setDemodulatorLock(true) : setDemodulatorLock(false); } diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index 80576ff..f5da17c 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -40,6 +40,9 @@ public: void setDemodulatorLock(bool demod_lock_in); int getDemodulatorLock(); + + void setDemodulatorCons(int demod_cons_in); + int getDemodulatorCons(); #ifdef __APPLE__ static void *pthread_helper(void *context) { @@ -68,7 +71,17 @@ protected: ampmodem demodAM_DSB; ampmodem demodAM_LSB; ampmodem demodAM_USB; - modem demodASK; + + modem demodASK; + modem demodASK2; + modem demodASK4; + modem demodASK8; + modem demodASK16; + modem demodASK32; + modem demodASK64; + modem demodASK128; + modem demodASK256; + modem demodAPSK; modem demodBPSK; modem demodDPSK; @@ -88,6 +101,7 @@ protected: std::atomic stereo; std::atomic terminated; std::atomic demodulatorType; + std::atomic demodulatorCons; int audioSampleRate; DemodulatorThreadCommandQueue* threadQueueNotify; diff --git a/src/visual/PrimaryGLContext.cpp b/src/visual/PrimaryGLContext.cpp index a1a88f5..b4c93a9 100644 --- a/src/visual/PrimaryGLContext.cpp +++ b/src/visual/PrimaryGLContext.cpp @@ -309,7 +309,10 @@ void PrimaryGLContext::DrawDemod(DemodulatorInstance *demod, RGBColor color, lon // add lock to string if we have an lock if(demod->getDemodulatorLock()) { demodStr = demodStr + " Lock"; - } + } + // else { + // demodStr = demodStr + " UnLock"; + // } glColor3f(0, 0, 0); getFont(PrimaryGLContext::GLFONT_SIZE16).drawString(demodStr, 2.0 * (uxPos - 0.5) + xOfs, -1.0 + hPos - yOfs, 16, demodAlign, From 951a1ee9c6cba44e0471fdffa3c80a9e51dfecbc Mon Sep 17 00:00:00 2001 From: Dantali0n Date: Wed, 10 Jun 2015 19:39:08 +0200 Subject: [PATCH 11/16] Requested Constellations & actual Constellations are now separated. --- src/AppFrame.cpp | 23 ++- src/demod/DemodulatorMgr.cpp | 1 - src/demod/DemodulatorThread.cpp | 315 ++++++++++++++++++++++++++++++-- src/demod/DemodulatorThread.h | 43 +++++ src/visual/PrimaryGLContext.cpp | 4 + 5 files changed, 368 insertions(+), 18 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 72bfcd8..87baae5 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -536,19 +536,24 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } int dSelection = demodModeSelector->getSelection(); int dSelectionadv = demodModeSelectorAdv->getSelection(); + int dSelectionCons = demodModeSelectorCons->getSelection(); + // basic demodulators if (dSelection != -1 && dSelection != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelection); demodModeSelectorAdv->setSelection(-1); } // advanced demodulators - else if(dSelectionadv != -1 && dSelectionadv != demod->getDemodulatorType()) { - demod->setDemodulatorType(dSelectionadv); - demod->setDemodulatorCons(demodModeSelectorCons->getSelection()); - // std::cout << "updating demodulator" << std::endl; - demodModeSelector->setSelection(-1); + else if (dSelectionadv != -1 && dSelectionadv != demod->getDemodulatorType()) { + demod->setDemodulatorType(dSelectionadv); + demodModeSelector->setSelection(-1); } + // set constellations + if (dSelectionCons != demod->getDemodulatorCons()) { + demod->setDemodulatorCons(dSelectionCons); + } + demodWaterfallCanvas->setBandwidth(demodBw); demodSpectrumCanvas->setBandwidth(demodBw); } @@ -567,6 +572,8 @@ void AppFrame::OnIdle(wxIdleEvent& event) { int dSelection = demodModeSelector->getSelection(); int dSelectionadv = demodModeSelectorAdv->getSelection(); + int dSelectionCons = demodModeSelectorCons->getSelection(); + // basic demodulators if (dSelection != -1 && dSelection != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelection); @@ -575,9 +582,13 @@ void AppFrame::OnIdle(wxIdleEvent& event) { // advanced demodulators else if(dSelectionadv != -1 && dSelectionadv != mgr->getLastDemodulatorType()) { mgr->setLastDemodulatorType(dSelectionadv); - mgr->setLastDemodulatorCons(demodModeSelectorCons->getSelection()); demodModeSelector->setSelection(-1); } + + // set constellations + if (dSelectionCons != mgr->getLastDemodulatorCons()) { + mgr->setLastDemodulatorCons(dSelectionCons); + } demodGainMeter->setLevel(mgr->getLastGain()); if (demodSignalMeter->inputChanged()) { diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index 48fe242..efc6c28 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -17,7 +17,6 @@ DemodulatorMgr::~DemodulatorMgr() { DemodulatorInstance *DemodulatorMgr::newThread() { DemodulatorInstance *newDemod = new DemodulatorInstance; - demods.push_back(newDemod); std::stringstream label; diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 279808b..8b83990 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -26,11 +26,13 @@ DemodulatorThread::DemodulatorThread(DemodulatorThreadPostInputQueue* iqInputQue demodAM = demodAM_DSB_CSP; // advanced demodulators - // This could properly be done easier. + // needs refactoring + // should look into dynamicly creating modems, so only the required type exists. demodulatorCons = 2; - - demodASK = modem_create(LIQUID_MODEM_ASK2); + currentDemodCons = 0; + + demodASK = demodASK2; demodASK2 = modem_create(LIQUID_MODEM_ASK2); demodASK4 = modem_create(LIQUID_MODEM_ASK4); demodASK8 = modem_create(LIQUID_MODEM_ASK8); @@ -39,15 +41,55 @@ DemodulatorThread::DemodulatorThread(DemodulatorThreadPostInputQueue* iqInputQue demodASK64 = modem_create(LIQUID_MODEM_ASK64); demodASK128 = modem_create(LIQUID_MODEM_ASK128); demodASK256 = modem_create(LIQUID_MODEM_ASK256); + + demodAPSK = demodAPSK4; + demodAPSK4 = modem_create(LIQUID_MODEM_APSK4); + demodAPSK8 = modem_create(LIQUID_MODEM_APSK8); + demodAPSK16 = modem_create(LIQUID_MODEM_APSK16); + demodAPSK32 = modem_create(LIQUID_MODEM_APSK32); + demodAPSK64 = modem_create(LIQUID_MODEM_APSK64); + demodAPSK128 = modem_create(LIQUID_MODEM_APSK128); + demodAPSK256 = modem_create(LIQUID_MODEM_APSK256); - demodAPSK = modem_create(LIQUID_MODEM_APSK256); demodBPSK = modem_create(LIQUID_MODEM_BPSK); - demodDPSK = modem_create(LIQUID_MODEM_DPSK256); - demodPSK = modem_create(LIQUID_MODEM_PSK256); + + demodDPSK = demodDPSK2; + demodDPSK2 = modem_create(LIQUID_MODEM_DPSK2); + demodDPSK4 = modem_create(LIQUID_MODEM_DPSK4); + demodDPSK8 = modem_create(LIQUID_MODEM_DPSK8); + demodDPSK16 = modem_create(LIQUID_MODEM_DPSK16); + demodDPSK32 = modem_create(LIQUID_MODEM_DPSK32); + demodDPSK64 = modem_create(LIQUID_MODEM_DPSK64); + demodDPSK128 = modem_create(LIQUID_MODEM_DPSK128); + demodDPSK256 = modem_create(LIQUID_MODEM_DPSK256); + + demodPSK = demodPSK2; + demodPSK2 = modem_create(LIQUID_MODEM_PSK2); + demodPSK4 = modem_create(LIQUID_MODEM_PSK4); + demodPSK8 = modem_create(LIQUID_MODEM_PSK8); + demodPSK16 = modem_create(LIQUID_MODEM_PSK16); + demodPSK32 = modem_create(LIQUID_MODEM_PSK32); + demodPSK64 = modem_create(LIQUID_MODEM_PSK64); + demodPSK128 = modem_create(LIQUID_MODEM_PSK128); + demodPSK256 = modem_create(LIQUID_MODEM_PSK256); + demodOOK = modem_create(LIQUID_MODEM_OOK); - demodSQAM = modem_create(LIQUID_MODEM_SQAM128); + + demodSQAM = demodSQAM32; + demodSQAM32 = modem_create(LIQUID_MODEM_SQAM32); + demodSQAM128 = modem_create(LIQUID_MODEM_SQAM128); + demodST = modem_create(LIQUID_MODEM_V29); - demodQAM = modem_create(LIQUID_MODEM_QAM256); + + demodQAM = demodQAM4; + demodQAM4 = modem_create(LIQUID_MODEM_QAM4); + demodQAM8 = modem_create(LIQUID_MODEM_QAM8); + demodQAM16 = modem_create(LIQUID_MODEM_QAM16); + demodQAM32 = modem_create(LIQUID_MODEM_QAM32); + demodQAM64 = modem_create(LIQUID_MODEM_QAM64); + demodQAM128 = modem_create(LIQUID_MODEM_QAM128); + demodQAM256 = modem_create(LIQUID_MODEM_QAM256); + demodQPSK = modem_create(LIQUID_MODEM_QPSK); currentDemodLock = false; @@ -188,19 +230,25 @@ void DemodulatorThread::threadMain() { currentSignalLevel = agc_crcf_get_signal_level(iqAutoGain); } + // Reset demodulator Constellations & Lock + updateDemodulatorCons(0); + if (demodulatorType == DEMOD_TYPE_FM) { + currentDemodLock = false; freqdem_demodulate_block(demodFM, &agcData[0], bufSize, &demodOutputData[0]); } else { float p; unsigned int bitstream; switch (demodulatorType.load()) { case DEMOD_TYPE_LSB: + currentDemodLock = false; for (int i = 0; i < bufSize; i++) { // Reject upper band resamp2_cccf_filter_execute(ssbFilt,inp->data[i],&x,&y); ampmodem_demodulate(demodAM, x, &demodOutputData[i]); } break; case DEMOD_TYPE_USB: + currentDemodLock = false; for (int i = 0; i < bufSize; i++) { // Reject lower band resamp2_cccf_filter_execute(ssbFilt,inp->data[i],&x,&y); ampmodem_demodulate(demodAM, y, &demodOutputData[i]); @@ -208,20 +256,105 @@ void DemodulatorThread::threadMain() { break; case DEMOD_TYPE_AM: case DEMOD_TYPE_DSB: + currentDemodLock = false; for (int i = 0; i < bufSize; i++) { ampmodem_demodulate(demodAM, inp->data[i], &demodOutputData[i]); } break; + // advanced demodulators + // tneeds refactoring case DEMOD_TYPE_ASK: - if(demodulatorCons == 2) { + + switch (demodulatorCons) { + case 2: demodASK = demodASK2; + updateDemodulatorCons(2); + break; + case 4: + demodASK = demodASK4; + updateDemodulatorCons(4); + break; + case 8: + demodASK = demodASK8; + updateDemodulatorCons(8); + break; + case 16: + demodASK = demodASK16; + updateDemodulatorCons(16); + break; + case 32: + demodASK = demodASK32; + updateDemodulatorCons(32); + break; + case 64: + demodASK = demodASK64; + updateDemodulatorCons(64); + break; + case 128: + demodASK = demodASK128; + updateDemodulatorCons(128); + break; + case 256: + demodASK = demodASK256; + updateDemodulatorCons(256); + break; + default: + demodASK = demodASK2; + break; } + for (int i = 0; i < bufSize; i++) { modem_demodulate(demodASK, inp->data[i], &bitstream); // std::cout << bitstream << std::endl; } updateDemodulatorLock(demodASK, 0.5f); break; + case DEMOD_TYPE_APSK: + + switch (demodulatorCons) { + case 2: + demodAPSK = demodAPSK4; + updateDemodulatorCons(4); + break; + case 4: + demodAPSK = demodAPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodAPSK = demodAPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodAPSK = demodAPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodAPSK = demodAPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodAPSK = demodAPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodAPSK = demodAPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodAPSK = demodAPSK256; + updateDemodulatorCons(256); + break; + default: + demodAPSK = demodAPSK4; + break; + } + + for (int i = 0; i < bufSize; i++) { + modem_demodulate(demodAPSK, inp->data[i], &bitstream); + // std::cout << bitstream << std::endl; + } + updateDemodulatorLock(demodAPSK, 0.5f); + break; case DEMOD_TYPE_BPSK: for (int i = 0; i < bufSize; i++) { modem_demodulate(demodBPSK, inp->data[i], &bitstream); @@ -230,6 +363,45 @@ void DemodulatorThread::threadMain() { updateDemodulatorLock(demodBPSK, 0.8f); break; case DEMOD_TYPE_DPSK: + + switch (demodulatorCons) { + case 2: + demodDPSK = demodDPSK2; + updateDemodulatorCons(2); + break; + case 4: + demodDPSK = demodDPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodDPSK = demodDPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodDPSK = demodDPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodDPSK = demodDPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodDPSK = demodDPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodDPSK = demodDPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodDPSK = demodDPSK256; + updateDemodulatorCons(256); + break; + default: + demodDPSK = demodDPSK2; + break; + } + for (int i = 0; i < bufSize; i++) { modem_demodulate(demodDPSK, inp->data[i], &bitstream); // std::cout << bitstream << std::endl; @@ -237,6 +409,45 @@ void DemodulatorThread::threadMain() { updateDemodulatorLock(demodDPSK, 0.8f); break; case DEMOD_TYPE_PSK: + + switch (demodulatorCons) { + case 2: + demodPSK = demodPSK2; + updateDemodulatorCons(2); + break; + case 4: + demodPSK = demodPSK4; + updateDemodulatorCons(4); + break; + case 8: + demodPSK = demodPSK8; + updateDemodulatorCons(8); + break; + case 16: + demodPSK = demodPSK16; + updateDemodulatorCons(16); + break; + case 32: + demodPSK = demodPSK32; + updateDemodulatorCons(32); + break; + case 64: + demodPSK = demodPSK64; + updateDemodulatorCons(64); + break; + case 128: + demodPSK = demodPSK128; + updateDemodulatorCons(128); + break; + case 256: + demodPSK = demodPSK256; + updateDemodulatorCons(256); + break; + default: + demodPSK = demodPSK2; + break; + } + for (int i = 0; i < bufSize; i++) { modem_demodulate(demodPSK, inp->data[i], &bitstream); // std::cout << bitstream << std::endl; @@ -251,6 +462,45 @@ void DemodulatorThread::threadMain() { updateDemodulatorLock(demodOOK, 0.8f); break; case DEMOD_TYPE_SQAM: + + switch (demodulatorCons) { + case 2: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 4: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 8: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 16: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 32: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 64: + demodSQAM = demodSQAM32; + updateDemodulatorCons(32); + break; + case 128: + demodSQAM = demodSQAM128; + updateDemodulatorCons(128); + break; + case 256: + demodSQAM = demodSQAM128; + updateDemodulatorCons(128); + break; + default: + demodSQAM = demodSQAM32; + break; + } + for (int i = 0; i < bufSize; i++) { modem_demodulate(demodSQAM, inp->data[i], &bitstream); // std::cout << bitstream << std::endl; @@ -265,6 +515,45 @@ void DemodulatorThread::threadMain() { updateDemodulatorLock(demodST, 0.8f); break; case DEMOD_TYPE_QAM: + + switch (demodulatorCons) { + case 2: + demodQAM = demodQAM4; + updateDemodulatorCons(4); + break; + case 4: + demodQAM = demodQAM4; + updateDemodulatorCons(4); + break; + case 8: + demodQAM = demodQAM8; + updateDemodulatorCons(8); + break; + case 16: + demodQAM = demodQAM16; + updateDemodulatorCons(16); + break; + case 32: + demodQAM = demodQAM32; + updateDemodulatorCons(32); + break; + case 64: + demodQAM = demodQAM64; + updateDemodulatorCons(64); + break; + case 128: + demodQAM = demodQAM128; + updateDemodulatorCons(128); + break; + case 256: + demodQAM = demodQAM256; + updateDemodulatorCons(256); + break; + default: + demodQAM = demodQAM4; + break; + } + for (int i = 0; i < bufSize; i++) { modem_demodulate(demodQAM, inp->data[i], &bitstream); // std::cout << bitstream << std::endl; @@ -589,15 +878,19 @@ int DemodulatorThread::getDemodulatorLock() { } void DemodulatorThread::setDemodulatorCons(int demod_cons_in) { - std::cout << "Updating constellations" << std::endl; demodulatorCons = demod_cons_in; } int DemodulatorThread::getDemodulatorCons() { - return demodulatorCons; + return currentDemodCons; } void DemodulatorThread::updateDemodulatorLock(modem demod, float sensitivity) { modem_get_demodulator_evm(demod) <= sensitivity ? setDemodulatorLock(true) : setDemodulatorLock(false); } +void DemodulatorThread::updateDemodulatorCons(int Cons) { + if (currentDemodCons != Cons) { + currentDemodCons = Cons; + } +} diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index f5da17c..db50f35 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -83,13 +83,53 @@ protected: modem demodASK256; modem demodAPSK; + modem demodAPSK4; + modem demodAPSK8; + modem demodAPSK16; + modem demodAPSK32; + modem demodAPSK64; + modem demodAPSK128; + modem demodAPSK256; + modem demodBPSK; + modem demodDPSK; + modem demodDPSK2; + modem demodDPSK4; + modem demodDPSK8; + modem demodDPSK16; + modem demodDPSK32; + modem demodDPSK64; + modem demodDPSK128; + modem demodDPSK256; + modem demodPSK; + modem demodPSK2; + modem demodPSK4; + modem demodPSK8; + modem demodPSK16; + modem demodPSK32; + modem demodPSK64; + modem demodPSK128; + modem demodPSK256; + modem demodOOK; + modem demodSQAM; + modem demodSQAM32; + modem demodSQAM128; + modem demodST; + modem demodQAM; + modem demodQAM4; + modem demodQAM8; + modem demodQAM16; + modem demodQAM32; + modem demodQAM64; + modem demodQAM128; + modem demodQAM256; + modem demodQPSK; agc_crcf iqAutoGain; @@ -111,5 +151,8 @@ protected: bool squelchEnabled; bool currentDemodLock; + int currentDemodCons; + + void updateDemodulatorCons(int Cons); void updateDemodulatorLock(modem demod, float sensitivity); }; diff --git a/src/visual/PrimaryGLContext.cpp b/src/visual/PrimaryGLContext.cpp index b4c93a9..834ecec 100644 --- a/src/visual/PrimaryGLContext.cpp +++ b/src/visual/PrimaryGLContext.cpp @@ -305,6 +305,10 @@ void PrimaryGLContext::DrawDemod(DemodulatorInstance *demod, RGBColor color, lon demodAlign = GLFont::GLFONT_ALIGN_CENTER; break; } + + if (demod->getDemodulatorCons() != NULL && demod->getDemodulatorCons() > 0) { + demodStr = demodStr + std::to_string(demod->getDemodulatorCons()); + } // add lock to string if we have an lock if(demod->getDemodulatorLock()) { From 96c05cd53206465b79ebada3ed8e3f2bf0ea86c4 Mon Sep 17 00:00:00 2001 From: Dantali0n Date: Wed, 10 Jun 2015 20:48:05 +0200 Subject: [PATCH 12/16] Console window and output for windows --- src/CubicSDR.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index db696e6..1b1ee9c 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -1,7 +1,6 @@ #define OPENGL #include "CubicSDRDefs.h" - #include "wx/wxprec.h" #ifndef WX_PRECOMP @@ -21,6 +20,19 @@ IMPLEMENT_APP(CubicSDR) +// console output buffer for windows +#ifdef _WIN64_ +class outbuf : public std::streambuf { + public: + outbuf() { + setp(0, 0); + } + virtual int_type overflow(int_type c = traits_type::eof()) { + return fputc(c, stdout) == EOF ? traits_type::eof() : c; + } +}; +#endif + bool CubicSDR::OnInit() { #ifdef _OSX_APP_ CFBundleRef mainBundle = CFBundleGetMainBundle(); @@ -38,6 +50,17 @@ bool CubicSDR::OnInit() { return false; } + // console output for windows + #ifdef _WIN64_ + if (AllocConsole()) { + freopen("CONOUT$", "w", stdout); + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); + } + outbuf ob; + std::streambuf *sb = std::cout.rdbuf(&ob); + std::cout.rdbuf(sb); + #endif + wxApp::SetAppName("CubicSDR"); config.load(); From cac5d0b9ea106dd17b7922e9c0df3d21f889c6b5 Mon Sep 17 00:00:00 2001 From: Dantali0n Date: Thu, 18 Jun 2015 22:07:53 +0200 Subject: [PATCH 13/16] digital output 'buffer' and fix ifdef --- src/CubicSDR.cpp | 4 +- src/demod/DemodulatorThread.cpp | 109 +++++++++++++++++++++++--------- src/demod/DemodulatorThread.h | 2 + 3 files changed, 84 insertions(+), 31 deletions(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 1b1ee9c..d0a77c1 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -21,7 +21,7 @@ IMPLEMENT_APP(CubicSDR) // console output buffer for windows -#ifdef _WIN64_ +#ifdef _WINDOWS class outbuf : public std::streambuf { public: outbuf() { @@ -51,7 +51,7 @@ bool CubicSDR::OnInit() { } // console output for windows - #ifdef _WIN64_ + #ifdef _WINDOWS if (AllocConsole()) { freopen("CONOUT$", "w", stdout); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 8b83990..de1664b 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -233,12 +233,14 @@ void DemodulatorThread::threadMain() { // Reset demodulator Constellations & Lock updateDemodulatorCons(0); + // create digital output buffer + demodOutputDataDigital = new unsigned int[bufSize]; + if (demodulatorType == DEMOD_TYPE_FM) { currentDemodLock = false; freqdem_demodulate_block(demodFM, &agcData[0], bufSize, &demodOutputData[0]); } else { float p; - unsigned int bitstream; switch (demodulatorType.load()) { case DEMOD_TYPE_LSB: currentDemodLock = false; @@ -262,7 +264,7 @@ void DemodulatorThread::threadMain() { } break; // advanced demodulators - // tneeds refactoring + // needs refactoring case DEMOD_TYPE_ASK: switch (demodulatorCons) { @@ -304,10 +306,12 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodASK, inp->data[i], &bitstream); + + + modem_demodulate(demodASK, inp->data[i], &demodOutputDataDigital[i]); // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodASK, 0.5f); + updateDemodulatorLock(demodASK, 0.005f); break; case DEMOD_TYPE_APSK: @@ -350,17 +354,21 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodAPSK, inp->data[i], &bitstream); + + + modem_demodulate(demodAPSK, inp->data[i], &demodOutputDataDigital[i]); // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodAPSK, 0.5f); + updateDemodulatorLock(demodAPSK, 0.005f); break; case DEMOD_TYPE_BPSK: for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodBPSK, inp->data[i], &bitstream); + + + modem_demodulate(demodBPSK, inp->data[i], &demodOutputDataDigital[i]); // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodBPSK, 0.8f); + updateDemodulatorLock(demodBPSK, 0.005f); break; case DEMOD_TYPE_DPSK: @@ -403,10 +411,12 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodDPSK, inp->data[i], &bitstream); + + + modem_demodulate(demodDPSK, inp->data[i], &demodOutputDataDigital[i]); // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodDPSK, 0.8f); + updateDemodulatorLock(demodDPSK, 0.005f); break; case DEMOD_TYPE_PSK: @@ -449,17 +459,21 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodPSK, inp->data[i], &bitstream); + + + modem_demodulate(demodPSK, inp->data[i], &demodOutputDataDigital[i]); // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodPSK, 0.8f); + updateDemodulatorLock(demodPSK, 0.005f); break; case DEMOD_TYPE_OOK: for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodOOK, inp->data[i], &bitstream); + + + modem_demodulate(demodOOK, inp->data[i], &demodOutputDataDigital[i]); // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodOOK, 0.8f); + updateDemodulatorLock(demodOOK, 0.005f); break; case DEMOD_TYPE_SQAM: @@ -502,17 +516,21 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodSQAM, inp->data[i], &bitstream); + + + modem_demodulate(demodSQAM, inp->data[i], &demodOutputDataDigital[i]); // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodSQAM, 0.8f); + updateDemodulatorLock(demodSQAM, 0.005f); break; case DEMOD_TYPE_ST: for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodST, inp->data[i], &bitstream); + + + modem_demodulate(demodST, inp->data[i], &demodOutputDataDigital[i]); // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodST, 0.8f); + updateDemodulatorLock(demodST, 0.005f); break; case DEMOD_TYPE_QAM: @@ -555,17 +573,21 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodQAM, inp->data[i], &bitstream); + + + modem_demodulate(demodQAM, inp->data[i], &demodOutputDataDigital[i]); // std::cout << bitstream << std::endl; } - updateDemodulatorLock(demodQAM, 0.5f); + updateDemodulatorLock(demodQAM, 0.5f); break; case DEMOD_TYPE_QPSK: for (int i = 0; i < bufSize; i++) { - modem_demodulate(demodQPSK, inp->data[i], &bitstream); + + + modem_demodulate(demodQPSK, inp->data[i], &demodOutputDataDigital[i]); // std::cout << bitstream << std::endl; - } - updateDemodulatorLock(demodQPSK, 0.8f); + } + updateDemodulatorLock(demodQPSK, 0.8f); break; } @@ -578,7 +600,7 @@ void DemodulatorThread::threadMain() { if (demodOutputData[i] > amOutputCeil) { amOutputCeil = demodOutputData[i]; } - } + } float gain = 0.5 / amOutputCeilMAA; @@ -597,6 +619,9 @@ void DemodulatorThread::threadMain() { unsigned int numAudioWritten; msresamp_rrrf_execute(audioResampler, &demodOutputData[0], bufSize, &resampledOutputData[0], &numAudioWritten); + // destroy the digital buffer + delete[] demodOutputDataDigital; + if (stereo) { if (demodStereoData.size() != bufSize) { if (demodStereoData.capacity() < bufSize) { @@ -770,10 +795,36 @@ void DemodulatorThread::threadMain() { demodAM = demodAM_DSB_CSP; ampmodem_reset(demodAM); break; -// case DEMOD_TYPE_QPSK: -// std::cout << "reset modem qpsk" << std::endl; -// modem_reset(demodQPSK); -// break; + case DEMOD_TYPE_ASK: + modem_reset(demodASK); + break; + case DEMOD_TYPE_APSK: + modem_reset(demodAPSK); + break; + case DEMOD_TYPE_BPSK: + modem_reset(demodBPSK); + break; + case DEMOD_TYPE_DPSK: + modem_reset(demodDPSK); + break; + case DEMOD_TYPE_PSK: + modem_reset(demodPSK); + break; + case DEMOD_TYPE_OOK: + modem_reset(demodOOK); + break; + case DEMOD_TYPE_SQAM: + modem_reset(demodSQAM); + break; + case DEMOD_TYPE_ST: + modem_reset(demodST); + break; + case DEMOD_TYPE_QAM: + modem_reset(demodQAM); + break; + case DEMOD_TYPE_QPSK: + modem_reset(demodQPSK); + break; } demodulatorType = newDemodType; } @@ -886,7 +937,7 @@ int DemodulatorThread::getDemodulatorCons() { } void DemodulatorThread::updateDemodulatorLock(modem demod, float sensitivity) { - modem_get_demodulator_evm(demod) <= sensitivity ? setDemodulatorLock(true) : setDemodulatorLock(false); + modem_get_demodulator_evm(demod) <= sensitivity ? setDemodulatorLock(true) : setDemodulatorLock(false); } void DemodulatorThread::updateDemodulatorCons(int Cons) { diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index db50f35..e35bd5f 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -61,6 +61,8 @@ protected: std::vector resampledOutputData; std::vector resampledStereoData; + unsigned int *demodOutputDataDigital; + DemodulatorThreadPostInputQueue* iqInputQueue; DemodulatorThreadOutputQueue* audioVisOutputQueue; AudioThreadInputQueue *audioOutputQueue; From 74255606df0d6236195e530c8e95b4893b6a0c04 Mon Sep 17 00:00:00 2001 From: Dantali0n Date: Mon, 29 Jun 2015 21:55:21 +0200 Subject: [PATCH 14/16] Implementing digital data buffer with vectors --- src/demod/DemodulatorThread.cpp | 53 ++++++++++++++++++++++++++++----- src/demod/DemodulatorThread.h | 6 +++- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index de1664b..a082c8e 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -218,6 +218,22 @@ void DemodulatorThread::threadMain() { demodOutputData.resize(bufSize); } + if (demodOutputDataDigital.size() != bufSize) { + if (demodOutputDataDigital.capacity() < bufSize) { + demodOutputDataDigital.reserve(bufSize); + } + demodOutputDataDigital.resize(bufSize); + } + + /* + if (demodOutputDataDigitalTest.size() != bufSize) { + if (demodOutputDataDigitalTest.capacity() < bufSize) { + demodOutputDataDigitalTest.reserve(bufSize); + } + demodOutputDataDigitalTest.resize(bufSize); + } + */ + int audio_out_size = ceil((double) (bufSize) * audio_resample_ratio) + 512; agc_crcf_execute_block(iqAutoGain, &(inp->data[0]), bufSize, &agcData[0]); @@ -234,7 +250,10 @@ void DemodulatorThread::threadMain() { updateDemodulatorCons(0); // create digital output buffer - demodOutputDataDigital = new unsigned int[bufSize]; + //demodOutputDataDigital = new unsigned int[bufSize]; + //demodOutputDataDigitalTest = new unsigned int[bufSize]; + //demodOutputSoftbits = new unsigned char[bufSize]; + //demodOutputSoftbitsTest = new unsigned char[bufSize]; if (demodulatorType == DEMOD_TYPE_FM) { currentDemodLock = false; @@ -581,12 +600,14 @@ void DemodulatorThread::threadMain() { updateDemodulatorLock(demodQAM, 0.5f); break; case DEMOD_TYPE_QPSK: - for (int i = 0; i < bufSize; i++) { + freqdem_demodulate_block(demodFM, &agcData[0], bufSize, &demodOutputData[0]); - + for (int i = 0; i < bufSize; i++) { + //modem_demodulate(demodQPSK, inp->data[i], &demodOutputDataDigitalTest[i]); modem_demodulate(demodQPSK, inp->data[i], &demodOutputDataDigital[i]); - // std::cout << bitstream << std::endl; - } + } + + // std::cout << bitstream << std::endl; updateDemodulatorLock(demodQPSK, 0.8f); break; } @@ -618,9 +639,27 @@ void DemodulatorThread::threadMain() { unsigned int numAudioWritten; msresamp_rrrf_execute(audioResampler, &demodOutputData[0], bufSize, &resampledOutputData[0], &numAudioWritten); + + /* + if (demodulatorType.load() == DEMOD_TYPE_QPSK) { + if (!std::equal(demodOutputDataDigitalTest, demodOutputDataDigitalTest + sizeof demodOutputDataDigitalTest / sizeof *demodOutputDataDigitalTest, demodOutputDataDigital)) { + if (!std::equal(demodOutputSoftbitsTest, demodOutputSoftbitsTest + sizeof demodOutputSoftbitsTest / sizeof *demodOutputSoftbitsTest, demodOutputSoftbits)) { + std::cout << "Data not equal?!" << std::endl; + for (int i = 0; i < bufSize; i++) { + std::cout << std::to_string(demodOutputDataDigitalTest[i]) + std::to_string(demodOutputDataDigital[i]) << std::endl; + std::cout << std::to_string(demodOutputSoftbitsTest[i]) + std::to_string(demodOutputSoftbits[i]) << std::endl; + } + terminated = true; + } + } - // destroy the digital buffer - delete[] demodOutputDataDigital; + // destroy the digital buffer + delete[] demodOutputDataDigital; + delete[] demodOutputDataDigitalTest; + delete[] demodOutputSoftbits; + delete[] demodOutputSoftbitsTest; + } + */ if (stereo) { if (demodStereoData.size() != bufSize) { diff --git a/src/demod/DemodulatorThread.h b/src/demod/DemodulatorThread.h index e35bd5f..fb43ee7 100644 --- a/src/demod/DemodulatorThread.h +++ b/src/demod/DemodulatorThread.h @@ -61,7 +61,11 @@ protected: std::vector resampledOutputData; std::vector resampledStereoData; - unsigned int *demodOutputDataDigital; + std::vector demodOutputDataDigital; + //std::vector demodOutputDataDigitalTest; + + //std::vector demodOutputSoftbits; + //std::vector demodOutputSoftbitsTest; DemodulatorThreadPostInputQueue* iqInputQueue; DemodulatorThreadOutputQueue* audioVisOutputQueue; From fe37d50bd9f2ad30bb32b704c25c5ee58797fabb Mon Sep 17 00:00:00 2001 From: Dantali0n Date: Fri, 3 Jul 2015 11:29:52 +0200 Subject: [PATCH 15/16] Finished digital data buffer with vectors --- src/demod/DemodulatorThread.cpp | 127 ++++++++------------------------ 1 file changed, 31 insertions(+), 96 deletions(-) diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index a082c8e..00ac69d 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -26,8 +26,6 @@ DemodulatorThread::DemodulatorThread(DemodulatorThreadPostInputQueue* iqInputQue demodAM = demodAM_DSB_CSP; // advanced demodulators - // needs refactoring - // should look into dynamicly creating modems, so only the required type exists. demodulatorCons = 2; currentDemodCons = 0; @@ -211,12 +209,12 @@ void DemodulatorThread::threadMain() { double audio_resample_ratio = inp->audioResampleRatio; - if (demodOutputData.size() != bufSize) { - if (demodOutputData.capacity() < bufSize) { - demodOutputData.reserve(bufSize); - } - demodOutputData.resize(bufSize); - } + if (demodOutputData.size() != bufSize) { + if (demodOutputData.capacity() < bufSize) { + demodOutputData.reserve(bufSize); + } + demodOutputData.resize(bufSize); + } if (demodOutputDataDigital.size() != bufSize) { if (demodOutputDataDigital.capacity() < bufSize) { @@ -225,15 +223,6 @@ void DemodulatorThread::threadMain() { demodOutputDataDigital.resize(bufSize); } - /* - if (demodOutputDataDigitalTest.size() != bufSize) { - if (demodOutputDataDigitalTest.capacity() < bufSize) { - demodOutputDataDigitalTest.reserve(bufSize); - } - demodOutputDataDigitalTest.resize(bufSize); - } - */ - int audio_out_size = ceil((double) (bufSize) * audio_resample_ratio) + 512; agc_crcf_execute_block(iqAutoGain, &(inp->data[0]), bufSize, &agcData[0]); @@ -249,12 +238,6 @@ void DemodulatorThread::threadMain() { // Reset demodulator Constellations & Lock updateDemodulatorCons(0); - // create digital output buffer - //demodOutputDataDigital = new unsigned int[bufSize]; - //demodOutputDataDigitalTest = new unsigned int[bufSize]; - //demodOutputSoftbits = new unsigned char[bufSize]; - //demodOutputSoftbitsTest = new unsigned char[bufSize]; - if (demodulatorType == DEMOD_TYPE_FM) { currentDemodLock = false; freqdem_demodulate_block(demodFM, &agcData[0], bufSize, &demodOutputData[0]); @@ -283,7 +266,6 @@ void DemodulatorThread::threadMain() { } break; // advanced demodulators - // needs refactoring case DEMOD_TYPE_ASK: switch (demodulatorCons) { @@ -325,10 +307,7 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - - modem_demodulate(demodASK, inp->data[i], &demodOutputDataDigital[i]); - // std::cout << bitstream << std::endl; } updateDemodulatorLock(demodASK, 0.005f); break; @@ -373,19 +352,13 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - - - modem_demodulate(demodAPSK, inp->data[i], &demodOutputDataDigital[i]); - // std::cout << bitstream << std::endl; + modem_demodulate(demodAPSK, inp->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodAPSK, 0.005f); break; case DEMOD_TYPE_BPSK: for (int i = 0; i < bufSize; i++) { - - - modem_demodulate(demodBPSK, inp->data[i], &demodOutputDataDigital[i]); - // std::cout << bitstream << std::endl; + modem_demodulate(demodBPSK, inp->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodBPSK, 0.005f); break; @@ -430,10 +403,7 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - - - modem_demodulate(demodDPSK, inp->data[i], &demodOutputDataDigital[i]); - // std::cout << bitstream << std::endl; + modem_demodulate(demodDPSK, inp->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodDPSK, 0.005f); break; @@ -478,19 +448,13 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - - - modem_demodulate(demodPSK, inp->data[i], &demodOutputDataDigital[i]); - // std::cout << bitstream << std::endl; + modem_demodulate(demodPSK, inp->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodPSK, 0.005f); break; case DEMOD_TYPE_OOK: for (int i = 0; i < bufSize; i++) { - - - modem_demodulate(demodOOK, inp->data[i], &demodOutputDataDigital[i]); - // std::cout << bitstream << std::endl; + modem_demodulate(demodOOK, inp->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodOOK, 0.005f); break; @@ -535,19 +499,13 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - - - modem_demodulate(demodSQAM, inp->data[i], &demodOutputDataDigital[i]); - // std::cout << bitstream << std::endl; + modem_demodulate(demodSQAM, inp->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodSQAM, 0.005f); break; case DEMOD_TYPE_ST: for (int i = 0; i < bufSize; i++) { - - - modem_demodulate(demodST, inp->data[i], &demodOutputDataDigital[i]); - // std::cout << bitstream << std::endl; + modem_demodulate(demodST, inp->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodST, 0.005f); break; @@ -592,22 +550,14 @@ void DemodulatorThread::threadMain() { } for (int i = 0; i < bufSize; i++) { - - - modem_demodulate(demodQAM, inp->data[i], &demodOutputDataDigital[i]); - // std::cout << bitstream << std::endl; + modem_demodulate(demodQAM, inp->data[i], &demodOutputDataDigital[i]); } updateDemodulatorLock(demodQAM, 0.5f); break; case DEMOD_TYPE_QPSK: - freqdem_demodulate_block(demodFM, &agcData[0], bufSize, &demodOutputData[0]); - for (int i = 0; i < bufSize; i++) { - //modem_demodulate(demodQPSK, inp->data[i], &demodOutputDataDigitalTest[i]); modem_demodulate(demodQPSK, inp->data[i], &demodOutputDataDigital[i]); - } - - // std::cout << bitstream << std::endl; + } updateDemodulatorLock(demodQPSK, 0.8f); break; } @@ -639,27 +589,6 @@ void DemodulatorThread::threadMain() { unsigned int numAudioWritten; msresamp_rrrf_execute(audioResampler, &demodOutputData[0], bufSize, &resampledOutputData[0], &numAudioWritten); - - /* - if (demodulatorType.load() == DEMOD_TYPE_QPSK) { - if (!std::equal(demodOutputDataDigitalTest, demodOutputDataDigitalTest + sizeof demodOutputDataDigitalTest / sizeof *demodOutputDataDigitalTest, demodOutputDataDigital)) { - if (!std::equal(demodOutputSoftbitsTest, demodOutputSoftbitsTest + sizeof demodOutputSoftbitsTest / sizeof *demodOutputSoftbitsTest, demodOutputSoftbits)) { - std::cout << "Data not equal?!" << std::endl; - for (int i = 0; i < bufSize; i++) { - std::cout << std::to_string(demodOutputDataDigitalTest[i]) + std::to_string(demodOutputDataDigital[i]) << std::endl; - std::cout << std::to_string(demodOutputSoftbitsTest[i]) + std::to_string(demodOutputSoftbits[i]) << std::endl; - } - terminated = true; - } - } - - // destroy the digital buffer - delete[] demodOutputDataDigital; - delete[] demodOutputDataDigitalTest; - delete[] demodOutputSoftbits; - delete[] demodOutputSoftbitsTest; - } - */ if (stereo) { if (demodStereoData.size() != bufSize) { @@ -835,42 +764,48 @@ void DemodulatorThread::threadMain() { ampmodem_reset(demodAM); break; case DEMOD_TYPE_ASK: - modem_reset(demodASK); + //modem_reset(demodASK); break; case DEMOD_TYPE_APSK: - modem_reset(demodAPSK); + //modem_reset(demodAPSK); break; case DEMOD_TYPE_BPSK: - modem_reset(demodBPSK); + //modem_reset(demodBPSK); break; case DEMOD_TYPE_DPSK: - modem_reset(demodDPSK); + //modem_reset(demodDPSK); break; case DEMOD_TYPE_PSK: - modem_reset(demodPSK); + //modem_reset(demodPSK); break; case DEMOD_TYPE_OOK: - modem_reset(demodOOK); + //modem_reset(demodOOK); break; case DEMOD_TYPE_SQAM: - modem_reset(demodSQAM); + //modem_reset(demodSQAM); break; case DEMOD_TYPE_ST: - modem_reset(demodST); + //modem_reset(demodST); break; case DEMOD_TYPE_QAM: - modem_reset(demodQAM); + //modem_reset(demodQAM); break; case DEMOD_TYPE_QPSK: - modem_reset(demodQPSK); + //modem_reset(demodQPSK); break; + default: + // empty default to prevent exceptions + break; } demodulatorType = newDemodType; } } + demodOutputDataDigital.empty(); + inp->decRefCount(); } + // end while !terminated if (audioResampler != NULL) { msresamp_rrrf_destroy(audioResampler); From 6b3467e5c8ec697f4da192a321865ae863f96485 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 15 Nov 2015 13:52:54 -0500 Subject: [PATCH 16/16] Add ENABLE_DIGITAL_LAB def --- CMakeLists.txt | 8 +++++++- src/AppFrame.cpp | 25 +++++++++++++++++++++---- src/AppFrame.h | 2 ++ src/CubicSDR.cpp | 6 +++++- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c3ce07b..18d7fea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,8 +17,14 @@ ADD_DEFINITIONS( -DCUBICSDR_VERSION="${CUBICSDR_VERSION}-${VERSION_SUFFIX}" ) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") +SET (ENABLE_DIGITAL_LAB OFF CACHE BOOL "Enable 'Digital Lab' testing features.") +IF(ENABLE_DIGITAL_LAB) +ADD_DEFINITIONS( + -DENABLE_DIGITAL_LAB=1 +) +ENDIF() +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") macro(configure_files srcDir destDir globStr) message(STATUS "Copying ${srcDir}/${globStr} to directory ${destDir}") diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 79ee1ef..51f86ef 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -77,6 +77,7 @@ AppFrame::AppFrame() : demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation, Amplitude Modulation and Lower, Upper or Double Side-Band."); demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0); +#ifdef ENABLE_DIGITAL_LAB demodModeSelectorAdv = new ModeSelectorCanvas(this, attribList); demodModeSelectorAdv->addChoice(DEMOD_TYPE_ASK, "ASK"); demodModeSelectorAdv->addChoice(DEMOD_TYPE_APSK, "APSK"); @@ -103,7 +104,8 @@ AppFrame::AppFrame() : demodModeSelectorCons->addChoice(256, "256"); demodModeSelectorCons->setHelpTip("Choose number of constallations types."); demodTray->Add(demodModeSelectorCons, 2, wxEXPAND | wxALL, 0); - +#endif + wxGetApp().getDemodSpectrumProcessor()->setup(1024); demodSpectrumCanvas = new SpectrumCanvas(demodPanel, attribList); demodSpectrumCanvas->setView(wxGetApp().getConfig()->getCenterFreq(), 300000); @@ -854,10 +856,12 @@ void AppFrame::OnIdle(wxIdleEvent& event) { scopeCanvas->setDeviceName(outputDevices[outputDevice].name); outputDeviceMenuItems[outputDevice]->Check(true); int dType = demod->getDemodulatorType(); - int dCons = demod->getDemodulatorCons(); demodModeSelector->setSelection(dType); +#ifdef ENABLE_DIGITAL_LAB + int dCons = demod->getDemodulatorCons(); demodModeSelectorAdv->setSelection(dType); demodModeSelectorCons->setSelection(dCons); +#endif demodMuteButton->setSelection(demod->isMuted()?1:-1); } if (demodWaterfallCanvas->getDragState() == WaterfallCanvas::WF_DRAG_NONE) { @@ -886,6 +890,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { demodSpectrumCanvas->setCenterFrequency(centerFreq); } int dSelection = demodModeSelector->getSelection(); +#ifdef ENABLE_DIGITAL_LAB int dSelectionadv = demodModeSelectorAdv->getSelection(); int dSelectionCons = demodModeSelectorCons->getSelection(); @@ -893,7 +898,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { if (dSelection != -1 && dSelection != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelection); demodModeSelectorAdv->setSelection(-1); - } + } // advanced demodulators else if (dSelectionadv != -1 && dSelectionadv != demod->getDemodulatorType()) { demod->setDemodulatorType(dSelectionadv); @@ -904,6 +909,12 @@ void AppFrame::OnIdle(wxIdleEvent& event) { if (dSelectionCons != demod->getDemodulatorCons()) { demod->setDemodulatorCons(dSelectionCons); } +#else + // basic demodulators + if (dSelection != -1 && dSelection != demod->getDemodulatorType()) { + demod->setDemodulatorType(dSelection); + } +#endif int muteMode = demodMuteButton->getSelection(); if (demodMuteButton->modeChanged()) { @@ -941,6 +952,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { DemodulatorMgr *mgr = &wxGetApp().getDemodMgr(); int dSelection = demodModeSelector->getSelection(); +#ifdef ENABLE_DIGITAL_LAB int dSelectionadv = demodModeSelectorAdv->getSelection(); int dSelectionCons = demodModeSelectorCons->getSelection(); @@ -959,7 +971,12 @@ void AppFrame::OnIdle(wxIdleEvent& event) { if (dSelectionCons != mgr->getLastDemodulatorCons()) { mgr->setLastDemodulatorCons(dSelectionCons); } - +#else + // basic demodulators + if (dSelection != -1 && dSelection != mgr->getLastDemodulatorType()) { + mgr->setLastDemodulatorType(dSelection); + } +#endif demodGainMeter->setLevel(mgr->getLastGain()); if (demodSignalMeter->inputChanged()) { mgr->setLastSquelchLevel(demodSignalMeter->getInputValue()); diff --git a/src/AppFrame.h b/src/AppFrame.h index d41c679..694d8c7 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -79,8 +79,10 @@ private: SpectrumCanvas *spectrumCanvas; WaterfallCanvas *waterfallCanvas; ModeSelectorCanvas *demodModeSelector; +#ifdef ENABLE_DIGITAL_LAB ModeSelectorCanvas *demodModeSelectorAdv; ModeSelectorCanvas *demodModeSelectorCons; +#endif SpectrumCanvas *demodSpectrumCanvas; WaterfallCanvas *demodWaterfallCanvas; MeterCanvas *demodSignalMeter; diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 3be8344..3081026 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -20,6 +20,7 @@ IMPLEMENT_APP(CubicSDR) +#ifdef ENABLE_DIGITAL_LAB // console output buffer for windows #ifdef _WINDOWS class outbuf : public std::streambuf { @@ -32,6 +33,7 @@ class outbuf : public std::streambuf { } }; #endif +#endif #ifdef MINGW_PATCH FILE _iob[] = { *stdin, *stdout, *stderr }; @@ -147,6 +149,7 @@ bool CubicSDR::OnInit() { return false; } +#ifdef ENABLE_DIGITAL_LAB // console output for windows #ifdef _WINDOWS if (AllocConsole()) { @@ -157,7 +160,8 @@ bool CubicSDR::OnInit() { std::streambuf *sb = std::cout.rdbuf(&ob); std::cout.rdbuf(sb); #endif - +#endif + wxApp::SetAppName("CubicSDR"); frequency = wxGetApp().getConfig()->getCenterFreq();