#ifndef CANFRAMEMODEL_H #define CANFRAMEMODEL_H #include #include #include #include #include #include "can_structs.h" #include "dbc/dbchandler.h" #include "connections/canconnection.h" enum class Column { TimeStamp = 0, ///< The timestamp when the frame was transmitted or received FrameId = 1, ///< The frames CAN identifier (Standard: 11 or Extended: 29 bit) Extended = 2, ///< True if the frames CAN identifier is 29 bit Remote = 3, ///< True if the frames is a remote frame Direction = 4, ///< Whether the frame was transmitted or received Bus = 5, ///< The bus where the frame was transmitted or received Length = 6, ///< The frames payload data length ASCII = 7, ///< The payload interpreted as ASCII characters Data = 8, ///< The frames payload data NUM_COLUMN }; class CANFrameModel: public QAbstractTableModel { Q_OBJECT public: CANFrameModel(QObject *parent = 0); virtual ~CANFrameModel(); int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; int columnCount(const QModelIndex &) const; int totalFrameCount(); void sendRefresh(); void sendRefresh(int); int sendBulkRefresh(); void clearFrames(); void setInterpetMode(bool); void setOverwriteMode(bool); void setHexMode(bool); void setSysTimeMode(bool); void setFilterState(unsigned int ID, bool state); void setAllFilters(bool state); void setSecondsMode(bool); void setTimeFormat(QString); void loadFilterFile(QString filename); void saveFilterFile(QString filename); void normalizeTiming(); void recalcOverwrite(); bool needsFilterRefresh(); void insertFrames(const QVector &newFrames); void sortByColumn(int column); int getIndexFromTimeID(unsigned int ID, double timestamp); const QVector *getListReference() const; //thou shalt not modify these frames externally! const QVector *getFilteredListReference() const; //Thus saith the Lord, NO. const QMap *getFiltersReference() const; //this neither public slots: void addFrame(const CANFrame&, bool); void addFrames(const CANConnection*, const QVector&); signals: void updatedFiltersList(); private: void qSortCANFrameAsc(QVector* frames, Column column, int lowerBound, int upperBound); void qSortCANFrameDesc(QVector* frames, Column column, int lowerBound, int upperBound); uint64_t getCANFrameVal(int row, Column col); QVector frames; QVector filteredFrames; QMap filters; DBCHandler *dbcHandler; QMutex mutex; bool interpretFrames; //should we use the dbcHandler? bool overwriteDups; //should we display all frames or only the newest for each ID? QString timeFormat; bool useHexMode; bool timeSeconds; bool useSystemTime; bool needFilterRefresh; uint64_t timeOffset; int lastUpdateNumFrames; uint32_t preallocSize; bool sortDirAsc; }; #endif // CANFRAMEMODEL_H