#pragma once #include #include #include #include #include #include "config/ConfigService.hpp" #include "LoggerService.hpp" class ScopeBuffer : public QObject { Q_OBJECT // needed to attach to a qml component public: explicit ScopeBuffer(QObject* parent = nullptr); ScopeBuffer(ConfigService* config, LoggerService* logger, size_t size); ~ScopeBuffer() = default; void push(float sample); void read(std::vector& out); void setTrigger(size_t trigger) { trigger_ = trigger; } void setWavelength(size_t wavelength) { wavelength_ = wavelength; } size_t trigger() { return trigger_; } size_t wavelength() { return wavelength_; } void spinlock(bool lock) { spinlock_.store(lock, std::memory_order_relaxed); } bool spinlock() { return spinlock_.load(std::memory_order_relaxed); } size_t size() { return buffer_.size(); } private: ConfigService* config_; LoggerService* logger_; std::vector buffer_; std::atomic writeIndex_{0}; size_t trigger_ = 0; size_t wavelength_ = 400; std::atomic spinlock_ = false; }; class Scope : public QQuickPaintedItem { Q_OBJECT Q_PROPERTY(ScopeBuffer* buffer WRITE setBuffer) public: explicit Scope(QQuickItem* parent = nullptr); void paint(QPainter* painter) override; void setBuffer(ScopeBuffer* scopeBuffer); std::vector buffer_; ScopeBuffer* scopeBuffer_; };