1 #ifndef __fftviewer_frFFTviewer__
2 #define __fftviewer_frFFTviewer__
3 
4 /**
5 @file
6 Subclass of frFFTviewer, which is generated by wxFormBuilder.
7 */
8 #include <thread>
9 #include <atomic>
10 #include <vector>
11 #include "fftviewer_wxgui.h"
12 #include "lime/LimeSuite.h"
13 #include <wx/timer.h>
14 #include <mutex>
15 //// end generated include
16 
17 /** Implementing frFFTviewer */
18 class fftviewer_frFFTviewer : public frFFTviewer
19 {
20 protected:
21     std::atomic<bool> enableTransmitter;
22     std::atomic<int> windowFunctionID;
23     std::atomic<bool> captureSamples;
24     std::atomic<int> averageCount;
25     std::atomic<bool> updateGUI;
26     std::atomic<bool> enableFFT;
27     std::string captureFilename;
28     // Handlers for frFFTviewer events.
29     void OnWindowFunctionChanged( wxCommandEvent& event );
30     void OnbtnStartStop( wxCommandEvent& event );
31     void OnChannelVisibilityChange(wxCommandEvent& event);
32     void OnStreamChange(wxCommandEvent& event);
33     void OnEnTx( wxCommandEvent& event);
34     void OnEnPwr(wxCommandEvent& event);
35     void OnFmtChange(wxCommandEvent& event);
36     void OnAvgChange(wxSpinEvent& event);
37     void OnAvgChangeEnter(wxCommandEvent& event);
38     void OnWindowFunctionChange(wxCommandEvent& event);
39     static void StreamingLoop(fftviewer_frFFTviewer* pthis, const unsigned int fftSize, const int channelsCount, const uint32_t format);
40 
41     void OnUpdateStats(wxTimerEvent& event);
42     void OnUpdatePlots(wxThreadEvent& event);
43 public:
44     /** Constructor */
45     fftviewer_frFFTviewer( wxWindow* parent );
46     ~fftviewer_frFFTviewer();
47 //// end generated class members
48     void Initialize(lms_device_t* pDataPort);
49     void SetNyquistFrequency();
50 
51     void StartStreaming();
52     void StopStreaming();
53     void OnbtnCaptureClick(wxCommandEvent& event);
54 
55 protected:
56     static const int cMaxChCount = 2;
57     struct DataToGUI
58     {
59         std::vector<float> samplesI[cMaxChCount];
60         std::vector<float> samplesQ[cMaxChCount];
61         std::vector<float> fftBins[cMaxChCount];
62         float nyquist_Hz;
63         float rxDataRate_Bps;
64         float txDataRate_Bps;
65 
66         DataToGUI& operator=(DataToGUI& src)
67         {
68             for (int ch = 0; ch < cMaxChCount; ++ch)
69             {
70                 this->samplesI[ch].swap(src.samplesI[ch]);
71                 this->samplesQ[ch].swap(src.samplesQ[ch]);
72                 this->fftBins[ch].swap(src.fftBins[ch]);
73                 this->nyquist_Hz = src.nyquist_Hz;
74                 this->rxDataRate_Bps = src.rxDataRate_Bps;
75                 this->txDataRate_Bps = src.txDataRate_Bps;
76             }
77             return *this;
78         }
79     }streamData;
80 
81     std::vector<float> fftFreqAxis;
82     std::vector<float> timeXAxis;
83     std::atomic<bool> mStreamRunning;
84     std::atomic<bool> stopProcessing;
85     std::thread threadProcessing;
86     wxString printDataRate(float dataRate);
87 
88     lms_stream_t rxStreams[cMaxChCount];
89     lms_stream_t txStreams[cMaxChCount];
90 
91     lms_device_t* lmsControl;
92     wxTimer* mGUIupdater;
93     unsigned lmsIndex;
94 };
95 
96 #endif // __fftviewer_frFFTviewer__
97