#pragma once #include #include #include #include #include #include #include #include #include #include #include "tools/cabana/dbc.h" class ChangeTracker { public: void compute(const QByteArray &dat, double ts, uint32_t freq); void clear(); QVector last_change_t; QVector colors; QVector> bit_change_counts; private: const int periodic_threshold = 10; const int start_alpha = 128; const float fade_time = 2.0; QByteArray prev_dat; }; class LogSlider : public QSlider { Q_OBJECT public: LogSlider(double factor, Qt::Orientation orientation, QWidget *parent = nullptr) : factor(factor), QSlider(orientation, parent) {}; void setRange(double min, double max) { QSlider::setRange(logScale(min), logScale(max)); } int value() const { return invLogScale(QSlider::value()); } void setValue(int value) { QSlider::setValue(logScale(value)); } private: double factor; int logScale(int value) const { return factor * std::log10(value); } int invLogScale(int value) const { return std::pow(10, value / factor); } }; enum { ColorsRole = Qt::UserRole + 1, BytesRole = Qt::UserRole + 2 }; class SegmentTree { public: SegmentTree() = default; void build(const QVector &arr); inline std::pair minmax(int left, int right) const { return get_minmax(1, 0, size - 1, left, right); } private: std::pair get_minmax(int n, int left, int right, int range_left, int range_right) const; void build_tree(const QVector &arr, int n, int left, int right); std::vector> tree; int size = 0; }; class MessageBytesDelegate : public QStyledItemDelegate { Q_OBJECT public: MessageBytesDelegate(QObject *parent); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; QFont fixed_font; int byte_width; }; inline QString toHex(const QByteArray &dat) { return dat.toHex(' ').toUpper(); } QString toHex(uint8_t byte); QColor getColor(const cabana::Signal *sig); class NameValidator : public QRegExpValidator { Q_OBJECT public: NameValidator(QObject *parent=nullptr); QValidator::State validate(QString &input, int &pos) const override; }; namespace utils { QPixmap icon(const QString &id); } QToolButton *toolButton(const QString &icon, const QString &tooltip);