From fcfdb762257f92b4f42261ccc72af47ef2b7d5d8 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Tue, 5 May 2015 23:04:48 -0400 Subject: [PATCH] Addition of a playback form - used to play back a log file onto one or both canbuses. However, not yet completed (but it won't crash) --- SavvyCAN.pro | 14 ++- SavvyCAN.pro.user | 2 +- frameplaybackwindow.cpp | 50 +++++++++ frameplaybackwindow.h | 30 +++++ frameplaybackwindow.ui | 236 ++++++++++++++++++++++++++++++++++++++++ icons.qrc | 10 ++ images/NavBack.png | Bin 0 -> 757 bytes images/NavForward.png | Bin 0 -> 740 bytes images/PauseHS.png | Bin 0 -> 297 bytes images/PlayHS.png | Bin 0 -> 355 bytes images/ReverseHS.png | Bin 0 -> 328 bytes images/StopHS.png | Bin 0 -> 410 bytes mainwindow.cpp | 10 +- mainwindow.h | 3 + 14 files changed, 349 insertions(+), 6 deletions(-) create mode 100644 frameplaybackwindow.cpp create mode 100644 frameplaybackwindow.h create mode 100644 frameplaybackwindow.ui create mode 100644 icons.qrc create mode 100644 images/NavBack.png create mode 100644 images/NavForward.png create mode 100644 images/PauseHS.png create mode 100644 images/PlayHS.png create mode 100644 images/ReverseHS.png create mode 100644 images/StopHS.png diff --git a/SavvyCAN.pro b/SavvyCAN.pro index 1967d8e..30a2789 100644 --- a/SavvyCAN.pro +++ b/SavvyCAN.pro @@ -19,7 +19,8 @@ SOURCES += main.cpp\ qcustomplot.cpp \ graphingwindow.cpp \ frameinfowindow.cpp \ - newgraphdialog.cpp + newgraphdialog.cpp \ + frameplaybackwindow.cpp HEADERS += mainwindow.h \ can_structs.h \ @@ -28,9 +29,16 @@ HEADERS += mainwindow.h \ qcustomplot.h \ graphingwindow.h \ frameinfowindow.h \ - newgraphdialog.h + newgraphdialog.h \ + frameplaybackwindow.h FORMS += mainwindow.ui \ graphingwindow.ui \ frameinfowindow.ui \ - newgraphdialog.ui + newgraphdialog.ui \ + frameplaybackwindow.ui + +DISTFILES += + +RESOURCES += \ + icons.qrc diff --git a/SavvyCAN.pro.user b/SavvyCAN.pro.user index fda9d44..67f93d8 100644 --- a/SavvyCAN.pro.user +++ b/SavvyCAN.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/frameplaybackwindow.cpp b/frameplaybackwindow.cpp new file mode 100644 index 0000000..3a5e070 --- /dev/null +++ b/frameplaybackwindow.cpp @@ -0,0 +1,50 @@ +#include "frameplaybackwindow.h" +#include "ui_frameplaybackwindow.h" + +FramePlaybackWindow::FramePlaybackWindow(QList *frames, QWidget *parent) : + QDialog(parent), + ui(new Ui::FramePlaybackWindow) +{ + ui->setupUi(this); + + modelFrames = frames; + + currentPosition = 0; + + refreshIDList(); + + ui->comboCANBus->addItem(tr("None")); + ui->comboCANBus->addItem(tr("0")); + ui->comboCANBus->addItem(tr("1")); + ui->comboCANBus->addItem(tr("From File")); + + updateFrameLabel(); +} + +FramePlaybackWindow::~FramePlaybackWindow() +{ + delete ui; +} + +void FramePlaybackWindow::refreshIDList() +{ + int id; + for (int i = 0; i < modelFrames->count(); i++) + { + id = modelFrames->at(i).ID; + if (!foundID.contains(id)) + { + foundID.append(id); + QListWidgetItem* item = new QListWidgetItem(QString::number(id, 16).toUpper().rightJustified(4,'0'), ui->listID); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); // set checkable flag + item->setCheckState(Qt::Checked); + } + } + //default is to sort in ascending order + ui->listID->sortItems(); +} + +void FramePlaybackWindow::updateFrameLabel() +{ + ui->lblPosition->setText(QString::number(currentPosition) + tr(" of ") + QString::number(modelFrames->count())); +} diff --git a/frameplaybackwindow.h b/frameplaybackwindow.h new file mode 100644 index 0000000..d18de00 --- /dev/null +++ b/frameplaybackwindow.h @@ -0,0 +1,30 @@ +#ifndef FRAMEPLAYBACKWINDOW_H +#define FRAMEPLAYBACKWINDOW_H + +#include +#include "can_structs.h" + +namespace Ui { +class FramePlaybackWindow; +} + +class FramePlaybackWindow : public QDialog +{ + Q_OBJECT + +public: + explicit FramePlaybackWindow(QList *frames, QWidget *parent = 0); + ~FramePlaybackWindow(); + +private: + Ui::FramePlaybackWindow *ui; + QList foundID; + QList frameCache; + QList *modelFrames; + int currentPosition; + + void refreshIDList(); + void updateFrameLabel(); +}; + +#endif // FRAMEPLAYBACKWINDOW_H diff --git a/frameplaybackwindow.ui b/frameplaybackwindow.ui new file mode 100644 index 0000000..745a428 --- /dev/null +++ b/frameplaybackwindow.ui @@ -0,0 +1,236 @@ + + + FramePlaybackWindow + + + + 0 + 0 + 257 + 606 + + + + Dialog + + + + + + + + + + + + :/icons/images/NavBack.png:/icons/images/NavBack.png + + + + + + + + + + + :/icons/images/PauseHS.png:/icons/images/PauseHS.png + + + + + + + + + + + :/icons/images/ReverseHS.png:/icons/images/ReverseHS.png + + + + + + + + + + + :/icons/images/StopHS.png:/icons/images/StopHS.png + + + + + + + + + + + :/icons/images/PlayHS.png:/icons/images/PlayHS.png + + + + + + + + + + + :/icons/images/NavForward.png:/icons/images/NavForward.png + + + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 25 + + + + + + + + Playback speed (ms): + + + + + + + 1 + + + 1000 + + + 5 + + + + + + + Loop playback + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 10 + 20 + + + + + + + + Current frame: + + + + + + + x of y + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + Send to CANBus + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 40 + + + + + + + + ID Filtering: + + + + + + + + + + + + Select all IDs + + + + + + + Deselect all IDs + + + + + + + + + + + + diff --git a/icons.qrc b/icons.qrc new file mode 100644 index 0000000..cd68926 --- /dev/null +++ b/icons.qrc @@ -0,0 +1,10 @@ + + + images/NavBack.png + images/NavForward.png + images/PauseHS.png + images/PlayHS.png + images/ReverseHS.png + images/StopHS.png + + diff --git a/images/NavBack.png b/images/NavBack.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7da9aecf8303d3e18bcc4e6113c66097440d7d GIT binary patch literal 757 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;dr3q=RCwB)lRHe4Q5c3F+CnK(xfCR}id=*sfdnur3x?vLlOb`0=;DM68wrWV zghXX>QE^})K@&IP;4LH!E(}^6Acjjoph3&EE&bd6{m;b#`o~5m-|-~RbI$kXe0f@H zvgw%)`n8)oz$5<7FfcLGHM8~SVP00yGaYQ#ZbBZ9n;RuvR5}XTNv*P<4zrP1VYt= z!FoKzdMreBaRVclKM)M`*#d8V0at5%MCLa`!Oy`?00+=3M2vDR*@%B*BR)rSStorB z5AnFXl)D2tMHDz4lv9c|f7q54Jik!rV?F+rNOFaXmDlNS904F~Eb?w+%!Vzkh{`l) znxe#v=oo+tz#|VZv_)stO&bPSj(#B+=m$V(g{390R-clP7C#d^90?>yZQ(2Q=fFVD z{Mo!*9wn&+dD?L-Fo7c2OK&l`bl;XFMV$BH2>?<`pwY)8m{?jOOo2VZp_#$!E?_qD z76sgH9HGc{5}(`8lZ8QqRv5}6tt1&OIg}Pv&a-4oytf!RuuJ;5^@bPUhXCk4eT%yd z57-wbNhOF$leo-atVl#e4P^yWWwh|iFo?@EDJ7T+zh-oP5CC6c07F?E2$Pf&#Ds}s z*#j_X|HPsJXS=_?GE~=`k9KL2N|00*b>3!{6RYf7`y{0xtpwr|REwI9mGQN?oLwjy zaJIMBw}p0#m+)5SlT?C~5@eLbP!?iSP%qY&~ n*8n^N9(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;YDq*vRCwB)lgmq#VHC!HbJH1h@Rpax(KHJ$XgN|OgvQK5q?P>v;Z8)O77>Qf zDk$1T6cX4X2&7igLL!7&xTr;qk_MTBHeRanIu~cY`R04S_iLduG*l2h%LC8vJm+wZ z$uJBu@=bePMm__;9e&ps@YLV!|MqLqlmYmry&fQ7FUhB`xSI;Ioh@aV-PAg(`zw5k zZBlA&Lv`w%{%-$l4j^N`;66vYqv61)th1whC8h6YyT!FM??Mq=Cz`Vmvv1n#0s_98 zv(#G(3B>};Z@p$?e*vHSa?T7+TOK_P<%Ad30^S*K7l0Y)*DO)W44u{39ILT|bc3z; zxmY*E&CVA&kUWc-ic$q_A>NSzJZiC*6N-HxoD8B#6@aPGIEsklE^Nv|G(!^6Qyi^w z5KTnJGXNa=9tmwPr_*|3k*U>j0NjO5jC!79GnrAOU{|Po-(Ls7iVnJ=akBUf*G@g* zZ>lY7=DKH+!MD96rNCsEIY^-L&-xsjC!(t)WE!E0!vsKFO|ukz&y|_e1l3&t$}A3g zsxL9rau0x48Kt9p%By4B!W63 zEJrhdm!-7vBatAcr%?0v z(btiIVPjv-@4(4GzCyA`kS_y6l_~>6Lo)-z&;LOBB?CjL0RzLU1O^7H84L{K`IF+0 zx&hVB_jGX#skn7zvLP3fBaiEUz3i3d9|Yzdu8z1-DR^}EjonMx12;?!oOwn?c=p;h z53y|m_1~E)YnU=aM1wCSCDrM_cy;h!NQg_p-n)kjcgI|LVA(}vqxPHE=AV?m)AH&em` ny4udZ`!Myj$^ZX8^BEZw?Iy7=J8=Iw(5Vcbu6{1-oD!M<@=R)V literal 0 HcmV?d00001 diff --git a/images/PlayHS.png b/images/PlayHS.png new file mode 100644 index 0000000000000000000000000000000000000000..96b050f750a2af3e74801b8413b0f26c5f6fd1ca GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>?0v z(btiIVPjv-@4(4GzCyA`kS_y6l_~>6Lo)-z&;LOBB?CjL0RzLU1O^7H84L{K`IF+0 zx&hVR^mK6yskpV}vLV+Y2LaX#^Aoa{mT@h+=(hf$r_NiR3Qm4SGdagMEUuTLGliWd zsVSv}CvCd8zVgaRI$;+QwPi=^B$$uEO*0YUqfm7UsV-;<%yYpD(%Z?;p24;(Fij>{r#+X-+y(o)p_~ zdP4sGeUs&SPqfwi|2cQh5+36x&-34GJn-TF|N2E6{5Cd8nH9S2dg>O#z%cdwQpum+ SPul`L$l&Sf=d#Wzp$PzFT#SMM literal 0 HcmV?d00001 diff --git a/images/StopHS.png b/images/StopHS.png new file mode 100644 index 0000000000000000000000000000000000000000..5580fecce0ca0b0399720c400fcc4e213b16b15a GIT binary patch literal 410 zcmV;L0cHM)P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-5J^NqRCwCdletktK@dcrR1%)ZKtT`(nJ5?vObCDo zAOcds5heX=&)J>%i;ICILk2~A?Y!!qnqIWlxJFB^)ZYVEKh4A2+{_F$rB*|$Qfo!c zP*vu+xu@Os_9Vc}xW8M{7Hg)s!i5`(fhdeYd3<@_u-l$apr))>YlZ;FsS$Ex@H1jY z9QI_%=PT4|h^`s@%oG~EuZ*D)k}!21$@%;dwJITklZML;pBo`nT&V27I&!|4pyFi4 zN62D~-sqh$P7&uLlI1)=&F}&)8=Vte6h`L>!Bb17lyU)}%IFIH;gkN5IQEXd@5m{W zqDNKF1LnE8=hu%-DTS00F+^evq?izqUmt1l|Ht$_09nM~YeKRm(EtDd07*qoM6N<$ Eg22G13IG5A literal 0 HcmV?d00001 diff --git a/mainwindow.cpp b/mainwindow.cpp index 93d194e..9226edf 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -12,11 +12,9 @@ This first order of business is to attempt to gain feature parity (roughly) with can replace it as a cross platform solution. Here are things yet to do -- Support saving frames - Add flow view - ability to see bits change over time - Ability to send frames via playback mechanism (people use this so get it working!) - Ability to use programmatic frame sending interface (only I use it and it's complicated but helpful) - */ @@ -32,6 +30,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->actionFrame_Data_Analysis, SIGNAL(triggered(bool)), this, SLOT(showFrameDataAnalysis())); connect(ui->btnClearFrames, SIGNAL(clicked(bool)), this, SLOT(clearFrames())); connect(ui->actionSave_Log_File, SIGNAL(triggered(bool)), this, SLOT(handleSaveFile())); + connect(ui->action_Playback, SIGNAL(triggered(bool)), this, SLOT(showPlaybackWindow())); model = new CANFrameModel(); ui->canFramesView->setModel(model); @@ -60,6 +59,7 @@ MainWindow::MainWindow(QWidget *parent) : graphingWindow = NULL; frameInfoWindow = NULL; + playbackWindow = NULL; } MainWindow::~MainWindow() @@ -539,6 +539,12 @@ void MainWindow::showFrameDataAnalysis() frameInfoWindow->show(); } +void MainWindow::showPlaybackWindow() +{ + if (!playbackWindow) playbackWindow = new FramePlaybackWindow(model->getListReference()); + playbackWindow->show(); +} + void MainWindow::readSerialData() { QByteArray data = port->readAll(); diff --git a/mainwindow.h b/mainwindow.h index ba4b110..69fc84b 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -7,6 +7,7 @@ #include "can_structs.h" #include "graphingwindow.h" #include "frameinfowindow.h" +#include "frameplaybackwindow.h" namespace Ui { class MainWindow; @@ -40,6 +41,7 @@ private slots: void showGraphingWindow(); void showFrameDataAnalysis(); void clearFrames(); + void showPlaybackWindow(); private: Ui::MainWindow *ui; @@ -51,6 +53,7 @@ private: CANFrame buildFrame; GraphingWindow *graphingWindow; FrameInfoWindow *frameInfoWindow; + FramePlaybackWindow *playbackWindow; void loadCRTDFile(QString); void loadNativeCSVFile(QString); void loadGenericCSVFile(QString);