New custom model that somewhat speeds up loading of canbus frame but it's still dog slow.
This commit is contained in:
+4
-2
@@ -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
|
||||
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by QtCreator 3.4.0, 2015-04-26T23:13:45. -->
|
||||
<!-- Written by QtCreator 3.4.0, 2015-04-27T17:16:33. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>EnvironmentId</variable>
|
||||
@@ -226,11 +226,11 @@
|
||||
</valuelist>
|
||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">ReverseCAN</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">SavvyCAN</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Collin/Documents/ReverseCAN/ReverseCAN.pro</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Collin/Documents/SavvyCAN/SavvyCAN.pro</value>
|
||||
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
|
||||
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">ReverseCAN.pro</value>
|
||||
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">SavvyCAN.pro</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">false</value>
|
||||
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
#ifndef CANFRAMEMODEL_H
|
||||
#define CANFRAMEMODEL_H
|
||||
|
||||
#include <QAbstractTableModel>
|
||||
#include <QList>
|
||||
#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<CANFrame> frames;
|
||||
};
|
||||
|
||||
|
||||
#endif // CANFRAMEMODEL_H
|
||||
|
||||
+5
-41
@@ -3,43 +3,25 @@
|
||||
#include "can_structs.h"
|
||||
#include <QDateTime>
|
||||
#include <QFileDialog>
|
||||
#include <QStandardItemModel>
|
||||
#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)
|
||||
|
||||
+3
-3
@@ -2,7 +2,7 @@
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QStandardItemModel>
|
||||
#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
|
||||
|
||||
+6
-3
@@ -38,6 +38,9 @@
|
||||
<property name="alternatingRowColors">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menuBar">
|
||||
@@ -82,7 +85,7 @@
|
||||
<enum>TopToolBarArea</enum>
|
||||
</attribute>
|
||||
<attribute name="toolBarBreak">
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusBar"/>
|
||||
@@ -142,8 +145,8 @@
|
||||
<slot>handleLoadFile()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>244</x>
|
||||
<y>50</y>
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>507</x>
|
||||
|
||||
Reference in New Issue
Block a user