66 lines
1.5 KiB
C++
66 lines
1.5 KiB
C++
|
|
#pragma once
|
|
|
|
#include <QObject>
|
|
#include <QtQuick/QQuickPaintedItem>
|
|
#include <QtGui/QPainter>
|
|
|
|
#include <vector>
|
|
#include <atomic>
|
|
|
|
#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<float>& 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<float> buffer_;
|
|
std::atomic<size_t> writeIndex_{0};
|
|
|
|
size_t trigger_ = 0;
|
|
size_t wavelength_ = 400;
|
|
|
|
std::atomic<bool> 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<float> buffer_;
|
|
ScopeBuffer* scopeBuffer_;
|
|
|
|
};
|