diff --git a/SavvyCAN.pro b/SavvyCAN.pro index ed41d60..be34fac 100644 --- a/SavvyCAN.pro +++ b/SavvyCAN.pro @@ -13,9 +13,11 @@ TEMPLATE = app SOURCES += main.cpp\ - mainwindow.cpp + mainwindow.cpp \ + canframemodel.cpp HEADERS += mainwindow.h \ - can_structs.h + can_structs.h \ + canframemodel.h FORMS += mainwindow.ui diff --git a/SavvyCAN.pro.user b/SavvyCAN.pro.user index 90673d2..047ed8b 100644 --- a/SavvyCAN.pro.user +++ b/SavvyCAN.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -226,11 +226,11 @@ 2 - ReverseCAN + SavvyCAN - Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Collin/Documents/ReverseCAN/ReverseCAN.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Collin/Documents/SavvyCAN/SavvyCAN.pro - ReverseCAN.pro + SavvyCAN.pro false false diff --git a/canframemodel.cpp b/canframemodel.cpp new file mode 100644 index 0000000..f1fc62b --- /dev/null +++ b/canframemodel.cpp @@ -0,0 +1,111 @@ +#include "canframemodel.h" + +int CANFrameModel::rowCount(const QModelIndex &parent) const +{ + return frames.count(); +} + +int CANFrameModel::columnCount(const QModelIndex &index) const +{ + return 6; +} + +CANFrameModel::CANFrameModel(QObject *parent) + : QAbstractTableModel(parent) +{ + frames.reserve(100000); //ask for at least 100,000 entries. This gives good performance up to this limit +} + +QVariant CANFrameModel::data(const QModelIndex &index, int role) const +{ + QString tempString; + if (!index.isValid()) + return QVariant(); + + if (index.row() >= frames.count()) + return QVariant(); + + if (role == Qt::DisplayRole) { + CANFrame thisFrame = frames.at(index.row()); + switch (index.column()) + { + case 0: //timestamp + + return QString::number(thisFrame.timestamp); + break; + case 1: //id + return QString::number(thisFrame.ID, 16); + break; + case 2: //ext + return QString::number(thisFrame.extended); + break; + case 3: //bus + return QString::number(thisFrame.bus); + break; + case 4: //len + return QString::number(thisFrame.len); + break; + case 5: //data + for (int i = 0; i < thisFrame.len; i++) + { + tempString.append(QString::number(thisFrame.data[i], 16)); + tempString.append(" "); + } + return tempString; + break; + default: + return QVariant(); + } + } + else + return QVariant(); +} + +QVariant CANFrameModel::headerData(int section, Qt::Orientation orientation, + int role) const +{ + if (role != Qt::DisplayRole) + return QVariant(); + + if (orientation == Qt::Horizontal) + { + switch (section) + { + case 0: + return QString(tr("Timestamp")); + break; + case 1: + return QString(tr("ID")); + break; + case 2: + return QString(tr("Ext")); + break; + case 3: + return QString(tr("Bus")); + break; + case 4: + return QString(tr("Len")); + break; + case 5: + return QString(tr("Data")); + break; + } + } + + else + return QString::number(section); +} + +void CANFrameModel::addFrame(CANFrame &frame) +{ + beginInsertRows(QModelIndex(), frames.count() + 1, frames.count() + 1); + frames.append(frame); + endInsertRows(); +} + +void CANFrameModel::clearFrames() +{ + beginRemoveRows(QModelIndex(), 0, frames.count()); + frames.clear(); + endRemoveRows(); +} diff --git a/canframemodel.h b/canframemodel.h new file mode 100644 index 0000000..b630be0 --- /dev/null +++ b/canframemodel.h @@ -0,0 +1,31 @@ +#ifndef CANFRAMEMODEL_H +#define CANFRAMEMODEL_H + +#include +#include +#include "can_structs.h" + +class CANFrameModel: public QAbstractTableModel +{ + Q_OBJECT + +public: + CANFrameModel(QObject *parent = 0); + + 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 CANFrameModel::columnCount(const QModelIndex &) const; + + void addFrame(CANFrame &frame); + void clearFrames(); + + +private: + QList frames; +}; + + +#endif // CANFRAMEMODEL_H + diff --git a/mainwindow.cpp b/mainwindow.cpp index f9523fb..b174a22 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -3,43 +3,25 @@ #include "can_structs.h" #include #include -#include +#include "canframemodel.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); - model = new QStandardItemModel(); + model = new CANFrameModel(); ui->canFramesView->setModel(model); QStringList headers; headers << "Timestamp" << "ID" << "Ext" << "Bus" << "Len" << "Data"; - model->setHorizontalHeaderLabels(headers); + //model->setHorizontalHeaderLabels(headers); ui->canFramesView->setColumnWidth(0, 110); ui->canFramesView->setColumnWidth(1, 70); ui->canFramesView->setColumnWidth(2, 40); ui->canFramesView->setColumnWidth(3, 40); ui->canFramesView->setColumnWidth(4, 40); ui->canFramesView->setColumnWidth(5, 300); - - /* - for (int row = 0; row < 4000; row++) - { - QStandardItem *item = new QStandardItem(QString("10000ms")); - model->setItem(row, 0, item); - item = new QStandardItem(QString("0x107")); - model->setItem(row, 1, item); - item = new QStandardItem(QString("F")); - model->setItem(row, 2, item); - item = new QStandardItem(QString("1")); - model->setItem(row, 3, item); - item = new QStandardItem(QString("8")); - model->setItem(row, 4, item); - item = new QStandardItem(QString("0x10 0xE0 0x10 0x30 0x40 0x50 0xFF 0x23")); - model->setItem(row, 5, item); - } - */ } MainWindow::~MainWindow() @@ -47,27 +29,9 @@ MainWindow::~MainWindow() delete ui; } -void MainWindow::addFrameToDisplay(CANFrame frame) +void MainWindow::addFrameToDisplay(CANFrame &frame) { - int row = model->rowCount(); - QStandardItem *item = new QStandardItem(QString::number(frame.timestamp)); - model->setItem(row, 0, item); - item = new QStandardItem(QString::number(frame.ID, 16)); - model->setItem(row, 1, item); - item = new QStandardItem(QString::number(frame.extended)); - model->setItem(row, 2, item); - item = new QStandardItem(QString::number(frame.bus)); - model->setItem(row, 3, item); - item = new QStandardItem(QString::number(frame.len)); - model->setItem(row, 4, item); - QString tempString; - for (int i = 0; i < frame.len; i++) - { - tempString.append(QString::number(frame.data[i], 16)); - tempString.append(" "); - } - item = new QStandardItem(tempString); - model->setItem(row, 5, item); + model->addFrame(frame); } void MainWindow::loadCRTDFile(QString filename) diff --git a/mainwindow.h b/mainwindow.h index 6b87173..eb0279a 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -2,7 +2,7 @@ #define MAINWINDOW_H #include -#include +#include "canframemodel.h" #include "can_structs.h" namespace Ui { @@ -22,13 +22,13 @@ private slots: private: Ui::MainWindow *ui; - QStandardItemModel *model; + CANFrameModel *model; void loadCRTDFile(QString); void loadNativeCSVFile(QString); void loadGenericCSVFile(QString); void loadLogFile(QString); void loadMicrochipFile(QString); - void addFrameToDisplay(CANFrame); + void addFrameToDisplay(CANFrame &); }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index e7ff48e..a8573a8 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -38,6 +38,9 @@ true + + false + @@ -82,7 +85,7 @@ TopToolBarArea - true + false @@ -142,8 +145,8 @@ handleLoadFile() - 244 - 50 + -1 + -1 507