// // Created by epagris on 2022.05.04.. // #ifndef WFR_APP_MULTISTREAMOSCILLOSCOPE_H #define WFR_APP_MULTISTREAMOSCILLOSCOPE_H #include #include "ICreatable.h" #include "MultiStreamProcessor.h" #include "ChannelBuffer.h" #include "Trigger.h" class MultiStreamOscilloscope : public MultiStreamProcessor, public ICreatable { public: static constexpr size_t DRAW_WINDOW_PERIOD_NS_DEF = 50E+06; // default window length (50ms) static constexpr double VOLT_PER_BIN_DEF = 42.80E-06; // default vertical resolution static constexpr size_t TRIGGER_POS_PERCENT_DEF = 50; // trigger position is defaulted to the screen center public: struct SamplePoint { int64_t t; // time double x; // sample data SamplePoint() { t = 0; x = 0; } }; private: // data acquisition related things std::vector>> mpChBufs; // channel buffers size_t mCaptureLength; // length of drawing sliding window in SAMPLES size_t mFIFOBlockCnt; // number of blocks the FIFO consists of //size_t mFIFOBlockSize; // FIFO block size in bytes std::shared_ptr mpAssemblyBuffer; // buffer for assembling sample points std::shared_ptr mpTriggerBuffer; // buffer for probing against trigger conditions std::vector> mCaptureBuffers; // buffer for last capture std::mutex mCapture_mtx; // mutex for capture cv std::condition_variable mCapture_cv; // condition variable on data capture std::vector mFIFOFull; // stores FIFO fullness indicators, needed for proper triggering and capture private: void clearFIFOFullnessBits(); // clear fullness bits bool isEveryFIFOFull() const; // are the FIFOs full? public: // graphical displaying related things size_t mTriggerPosition_percent; // trigger position on the screen size_t mTriggerProbeBlock_idx; // index of block on which trigger will run size_t mPreTriggerSamples; // samples displayed before the trigger point size_t mCapturePeriod_ns; // (drawing window) screen period public: std::shared_ptr trigger; // trigger settings double verticalScale; // vertical resolution private: struct { bool armed; // indicates wheter trigger is armed or not bool trigd; // indicates if trigger has fired int64_t triggerSampleTag; bool samplesReady; // samples have been transferred to the output buffer } mTrigState; public: void setup(const std::vector &nodes, const AcquisitionFormat &acqFmt) override; bool input(size_t ch, const std::shared_ptr &pTime, const void *pData, size_t size) override; public: MultiStreamOscilloscope(); void setScreenPeriod(size_t ns); // set screen (visible waveform window) time length size_t getScreenPeriod() const; // get --- " ---- void setTriggerPosition(size_t percent); // set trigger position size_t getTriggerPosition() const; // get trigger position std::vector getScreenTimeLimits() const; // get time limits of the screen's edges void triggerNow(); // make the scope trigger regardless conditions void armTrigger(); // arm trigger for next acquisition std::vector> capture(); // wait for captured data TODO to be renamed }; #endif //WFR_APP_MULTISTREAMOSCILLOSCOPE_H