Implemented qt port + e2e

This commit is contained in:
Martino Ferrari
2026-06-26 09:11:10 +02:00
parent 0d7d8f396b
commit 4702d0a217
146 changed files with 57272 additions and 128 deletions
+110
View File
@@ -0,0 +1,110 @@
/**
* @file PlotWidget.h
* @brief Oscilloscope plot panel (custom QPainter), one per grid cell.
*
* Mirrors the ImGui PlotPanel: fixed +/-4 division Y space, wall-clock live X
* window, LTTB decimation, normal/digital/mixed normalization, A/B cursors,
* scroll/drag zoom + pan, zoom history, hi-res WS zoom + history zoom, and a
* trigger-capture view rendered in [-pre, +post].
*/
#pragma once
#include "Model.h"
#include <QWidget>
#include <QString>
#include <vector>
#include <utility>
#include <string>
class QHBoxLayout;
class QToolButton;
class QLabel;
namespace shq {
class Hub;
/** View state shared (synchronised) across all plots; owned by MainWindow. */
struct GlobalView {
double windowSec = 10.0; /* live scroll window width */
bool paused = false; /* global pause */
bool cursorsOn = false;
double cursorA = 0.0;
double cursorB = 0.0;
bool trigView = false; /* trigger bar open → render capture */
};
class PlotCanvas;
class PlotWidget : public QWidget {
Q_OBJECT
public:
PlotWidget(Hub* hub, GlobalView* gv, int plotIdx, QWidget* parent = nullptr);
std::vector<PlotAssignment>& slots() { return slots_; }
void addAssignment(int sourceIdx, int signalIdx);
/** Called by MainWindow when sources/config change so badges refresh. */
void onModelChanged();
/** Called by MainWindow when global pause toggles. */
void onPauseChanged();
/** Reset zoom/live state (e.g. when entering/leaving history mode). */
void setLive(bool live);
bool isLive() const { return live_; }
void setStoredX(double mn, double mx);
double xMin() const { return plotXMin_; }
double xMax() const { return plotXMax_; }
int plotIdx() const { return plotIdx_; }
public Q_SLOTS:
void onZoomReceived(int plotIdx);
void onHistoryZoomReceived(int plotIdx);
void onCaptureReceived();
void tick(); /* ~60 Hz repaint + throttled zoom requests */
private:
friend class PlotCanvas;
void rebuildHeader();
void showBadgeMenu(int slotIdx, const QPoint& globalPos);
void pushZoomHist();
void initPlotX(double tMax);
Hub* hub_;
GlobalView* gv_;
int plotIdx_;
PlotCanvas* canvas_ = nullptr;
QHBoxLayout* headerLay_ = nullptr;
QWidget* header_ = nullptr;
QLabel* cursorLbl_ = nullptr;
std::vector<PlotAssignment> slots_;
bool live_ = true;
bool paused_ = false;
double plotXMin_ = 0.0;
double plotXMax_ = 0.0;
int vMode_ = 0; /* 0 normal 1 digital 2 mixed */
int activeSlot_ = -1;
bool trigZoomed_ = false;
std::vector<std::pair<double,double>> zoomHist_;
/* Paused view snapshot (double buffer). */
struct Snapshot {
bool valid = false;
std::vector<std::string> keys;
std::vector<std::vector<double>> t, v;
} snap_;
/* Throttle timers (ms wall clock). */
double lastLiveZoomMs_ = 0.0;
double rangeChangedMs_ = 0.0;
double lastT0_ = 0.0, lastT1_ = 0.0;
double lastHistPushMs_ = 0.0;
};
} /* namespace shq */