mirror of https://github.com/commaai/openpilot.git
93 lines
3.3 KiB
C++
93 lines
3.3 KiB
C++
#pragma once
|
|
|
|
#include <tuple>
|
|
#include <vector>
|
|
|
|
#include <QList>
|
|
#include <QSet>
|
|
#include <QStyledItemDelegate>
|
|
#include <QTableView>
|
|
|
|
#include "tools/cabana/dbc/dbcmanager.h"
|
|
#include "tools/cabana/streams/abstractstream.h"
|
|
|
|
class BinaryItemDelegate : public QStyledItemDelegate {
|
|
public:
|
|
BinaryItemDelegate(QObject *parent);
|
|
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
|
|
bool hasSignal(const QModelIndex &index, int dx, int dy, const cabana::Signal *sig) const;
|
|
void drawSignalCell(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex &index, const cabana::Signal *sig) const;
|
|
|
|
QFont small_font, hex_font;
|
|
std::array<QStaticText, 256> hex_text_table;
|
|
std::array<QStaticText, 2> bin_text_table;
|
|
};
|
|
|
|
class BinaryViewModel : public QAbstractTableModel {
|
|
public:
|
|
BinaryViewModel(QObject *parent) : QAbstractTableModel(parent) {}
|
|
void refresh();
|
|
void updateState();
|
|
void updateItem(int row, int col, uint8_t val, const QColor &color);
|
|
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override { return row_count; }
|
|
int columnCount(const QModelIndex &parent = QModelIndex()) const override { return column_count; }
|
|
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override {
|
|
return createIndex(row, column, (void *)&items[row * column_count + column]);
|
|
}
|
|
Qt::ItemFlags flags(const QModelIndex &index) const override {
|
|
return (index.column() == column_count - 1) ? Qt::ItemIsEnabled : Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
|
}
|
|
|
|
struct Item {
|
|
QColor bg_color = QColor(102, 86, 169, 255);
|
|
bool is_msb = false;
|
|
bool is_lsb = false;
|
|
uint8_t val;
|
|
QList<const cabana::Signal *> sigs;
|
|
bool valid = false;
|
|
};
|
|
std::vector<Item> items;
|
|
|
|
MessageId msg_id;
|
|
int row_count = 0;
|
|
const int column_count = 9;
|
|
};
|
|
|
|
class BinaryView : public QTableView {
|
|
Q_OBJECT
|
|
|
|
public:
|
|
BinaryView(QWidget *parent = nullptr);
|
|
void setMessage(const MessageId &message_id);
|
|
void highlight(const cabana::Signal *sig);
|
|
QSet<const cabana::Signal*> getOverlappingSignals() const;
|
|
inline void updateState() { model->updateState(); }
|
|
QSize minimumSizeHint() const override;
|
|
|
|
signals:
|
|
void signalClicked(const cabana::Signal *sig);
|
|
void signalHovered(const cabana::Signal *sig);
|
|
void editSignal(const cabana::Signal *origin_s, cabana::Signal &s);
|
|
void showChart(const MessageId &id, const cabana::Signal *sig, bool show, bool merge);
|
|
|
|
private:
|
|
void addShortcuts();
|
|
void refresh();
|
|
std::tuple<int, int, bool> getSelection(QModelIndex index);
|
|
void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags flags) override;
|
|
void mousePressEvent(QMouseEvent *event) override;
|
|
void mouseMoveEvent(QMouseEvent *event) override;
|
|
void mouseReleaseEvent(QMouseEvent *event) override;
|
|
void leaveEvent(QEvent *event) override;
|
|
void highlightPosition(const QPoint &pt);
|
|
|
|
QModelIndex anchor_index;
|
|
BinaryViewModel *model;
|
|
BinaryItemDelegate *delegate;
|
|
const cabana::Signal *resize_sig = nullptr;
|
|
const cabana::Signal *hovered_sig = nullptr;
|
|
friend class BinaryItemDelegate;
|
|
};
|