From 3ab8669d062298eaef631c410ba0cd4575ae2721 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 29 Jul 2015 18:34:58 -0400 Subject: [PATCH] Initial IOThread prototype --- CMakeLists.txt | 2 + src/AppFrame.cpp | 3 +- src/CubicSDRDefs.h | 52 -------------- src/IOThread.cpp | 1 + src/IOThread.h | 129 ++++++++++++++++++++++++++++++++++ src/demod/DemodDefs.h | 1 + src/process/VisualProcessor.h | 1 + 7 files changed, 136 insertions(+), 53 deletions(-) create mode 100644 src/IOThread.cpp create mode 100644 src/IOThread.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c164f7..39df351 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -228,6 +228,7 @@ SET (cubicsdr_sources src/AppFrame.cpp src/AppConfig.cpp src/FrequencyDialog.cpp + src/IOThread.cpp src/sdr/SDRThread.cpp src/sdr/SDRPostThread.cpp src/demod/DemodulatorPreThread.cpp @@ -277,6 +278,7 @@ SET (cubicsdr_headers src/AppFrame.h src/AppConfig.h src/FrequencyDialog.h + src/IOThread.h src/sdr/SDRThread.h src/sdr/SDRPostThread.h src/demod/DemodulatorPreThread.h diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 4aefbda..e345bba 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -120,10 +120,11 @@ AppFrame::AppFrame() : spectrumCanvas->attachWaterfallCanvas(waterfallCanvas); vbox->Add(waterfallCanvas, 20, wxEXPAND | wxALL, 0); - +/* vbox->AddSpacer(1); testCanvas = new UITestCanvas(this, attribList); vbox->Add(testCanvas, 20, wxEXPAND | wxALL, 0); +// */ this->SetSizer(vbox); diff --git a/src/CubicSDRDefs.h b/src/CubicSDRDefs.h index ae8ca66..b9191d2 100644 --- a/src/CubicSDRDefs.h +++ b/src/CubicSDRDefs.h @@ -33,55 +33,3 @@ const char filePathSeparator = #define DEFAULT_DEMOD_TYPE 1 #define DEFAULT_DEMOD_BW 200000 -#include -#include -#include - -class ReferenceCounter { -public: - mutable std::mutex m_mutex; - - void setRefCount(int rc) { - refCount.store(rc); - } - - void decRefCount() { - refCount.store(refCount.load()-1); - } - - int getRefCount() { - return refCount.load(); - } -protected: - std::atomic_int refCount; -}; - -template -class ReBuffer { - -public: - BufferType *getBuffer() { - BufferType* buf = NULL; - for (outputBuffersI = outputBuffers.begin(); outputBuffersI != outputBuffers.end(); outputBuffersI++) { - if ((*outputBuffersI)->getRefCount() <= 0) { - return (*outputBuffersI); - } - } - - buf = new BufferType(); - outputBuffers.push_back(buf); - - return buf; - } - - void purge() { - while (!outputBuffers.empty()) { - BufferType *ref = outputBuffers.front(); - outputBuffers.pop_front(); - delete ref; - } - } -private: - std::deque outputBuffers; - typename std::deque::iterator outputBuffersI; -}; diff --git a/src/IOThread.cpp b/src/IOThread.cpp new file mode 100644 index 0000000..5bde1fe --- /dev/null +++ b/src/IOThread.cpp @@ -0,0 +1 @@ +#include "IOThread.h" \ No newline at end of file diff --git a/src/IOThread.h b/src/IOThread.h new file mode 100644 index 0000000..8adb726 --- /dev/null +++ b/src/IOThread.h @@ -0,0 +1,129 @@ +#pragma once + +#include +#include +#include +#include +#include + + +struct map_string_less : public std::binary_function +{ + bool operator()(const std::string& a,const std::string& b) const + { + return a.compare(b) < 0; + } +}; + + +class ReferenceCounter { +public: + mutable std::mutex m_mutex; + + void setRefCount(int rc) { + refCount.store(rc); + } + + void decRefCount() { + refCount.store(refCount.load()-1); + } + + int getRefCount() { + return refCount.load(); + } +protected: + std::atomic_int refCount; +}; + + +template +class ReBuffer { + +public: + BufferType *getBuffer() { + BufferType* buf = NULL; + for (outputBuffersI = outputBuffers.begin(); outputBuffersI != outputBuffers.end(); outputBuffersI++) { + if ((*outputBuffersI)->getRefCount() <= 0) { + return (*outputBuffersI); + } + } + + buf = new BufferType(); + outputBuffers.push_back(buf); + + return buf; + } + + void purge() { + while (!outputBuffers.empty()) { + BufferType *ref = outputBuffers.front(); + outputBuffers.pop_front(); + delete ref; + } + } +private: + std::deque outputBuffers; + typename std::deque::iterator outputBuffersI; +}; + + +class IOThread { +public: + virtual void setup() { + + }; + + virtual void init() { + + }; + + virtual void onBindOutput(std::string name, void* threadQueue) { + + }; + + virtual void onBindInput(std::string name, void* threadQueue) { + + }; + +#ifdef __APPLE__ + virtual void *threadMain() { + return 0; + }; + + static void *pthread_helper(void *context) { + return ((IOThread *) context)->threadMain(); + }; + +#else + virtual void threadMain() { + + }; +#endif + + virtual void terminate() { + + }; + + void setInputQueue(std::string qname, void *threadQueue) { + input_queues[qname] = threadQueue; + this->onBindInput(qname, threadQueue); + }; + + void *getInputQueue(std::string qname) { + return input_queues[qname]; + }; + + void setOutputQueue(std::string qname, void *threadQueue) { + output_queues[qname] = threadQueue; + this->onBindOutput(qname, threadQueue); + }; + + void *getOutputQueue(std::string qname) { + return output_queues[qname]; + }; + + +protected: + std::map input_queues; + std::map output_queues; +}; diff --git a/src/demod/DemodDefs.h b/src/demod/DemodDefs.h index c5381d0..12a8dd4 100644 --- a/src/demod/DemodDefs.h +++ b/src/demod/DemodDefs.h @@ -15,6 +15,7 @@ #define DEMOD_TYPE_DSB 5 #define DEMOD_TYPE_RAW 6 +#include "IOThread.h" class DemodulatorThread; class DemodulatorThreadCommand { diff --git a/src/process/VisualProcessor.h b/src/process/VisualProcessor.h index f7ec6f5..c27dbb1 100644 --- a/src/process/VisualProcessor.h +++ b/src/process/VisualProcessor.h @@ -2,6 +2,7 @@ #include "CubicSDRDefs.h" #include "ThreadQueue.h" +#include "IOThread.h" typedef ThreadQueue VisualDataQueue;