Additional coding on discrete state window.

This commit is contained in:
Collin Kidder
2016-02-22 21:05:43 -05:00
parent 56dbb32589
commit 6e0000dcad
3 changed files with 390 additions and 119 deletions
+156 -7
View File
@@ -14,9 +14,47 @@ DiscreteStateWindow::DiscreteStateWindow(const QVector<CANFrame> *frames, QWidge
timer = new QTimer(); timer = new QTimer();
timer->setInterval(100); timer->setInterval(100);
isRealtime = ui->rbRealtime->isChecked();
typeChanged();
connect(ui->btnStart, SIGNAL(clicked(bool)), this, SLOT(handleStartButton())); connect(ui->btnStart, SIGNAL(clicked(bool)), this, SLOT(handleStartButton()));
connect(timer, SIGNAL(timeout()), this, SLOT(handleTick())); connect(timer, SIGNAL(timeout()), this, SLOT(handleTick()));
connect(MainWindow::getReference(), SIGNAL(framesUpdated(int)), this, SLOT(updatedFrames(int))); connect(MainWindow::getReference(), SIGNAL(framesUpdated(int)), this, SLOT(updatedFrames(int)));
connect(ui->rbLogged, SIGNAL(clicked(bool)), this, SLOT(typeChanged()));
connect(ui->rbRealtime, SIGNAL(clicked(bool)), this, SLOT(typeChanged()));
connect(ui->btnAll, &QAbstractButton::clicked,
[=]()
{
for (int i = 0; i < ui->listID->count(); i++)
{
QListWidgetItem *item = ui->listID->item(i);
item->setCheckState(Qt::Checked);
idFilters[Utility::ParseStringToNum(item->text())] = true;
}
});
connect(ui->btnNone, &QAbstractButton::clicked,
[=]()
{
for (int i = 0; i < ui->listID->count(); i++)
{
QListWidgetItem *item = ui->listID->item(i);
item->setCheckState(Qt::Unchecked);
idFilters[Utility::ParseStringToNum(item->text())] = false;
}
});
connect(ui->listID, &QListWidget::itemChanged,
[=](QListWidgetItem *item)
{
bool isChecked = false;
int id = Utility::ParseStringToNum(item->text());
if (item->checkState() == Qt::Checked) isChecked = true;
idFilters[id] = isChecked;
});
refreshFilterList();
} }
DiscreteStateWindow::~DiscreteStateWindow() DiscreteStateWindow::~DiscreteStateWindow()
@@ -33,14 +71,45 @@ DiscreteStateWindow::~DiscreteStateWindow()
delete ui; delete ui;
} }
void DiscreteStateWindow::typeChanged()
{
if (ui->rbLogged->isChecked())
{
ui->spinFreq->setEnabled(false);
ui->spinIterations->setEnabled(false);
ui->lblStatus->setEnabled(false);
ui->spinMaxBits->setEnabled(true);
ui->spinMinBits->setEnabled(true);
ui->listID->setEnabled(true);
ui->btnAll->setEnabled(true);
ui->btnNone->setEnabled(true);
isRealtime = false;
}
else
{
ui->spinFreq->setEnabled(true);
ui->spinIterations->setEnabled(true);
ui->lblStatus->setEnabled(true);
ui->spinMaxBits->setEnabled(false);
ui->spinMinBits->setEnabled(false);
ui->listID->setEnabled(false);
ui->btnAll->setEnabled(false);
ui->btnNone->setEnabled(false);
isRealtime = true;
}
}
void DiscreteStateWindow::updatedFrames(int numFrames) void DiscreteStateWindow::updatedFrames(int numFrames)
{ {
CANFrame thisFrame; CANFrame thisFrame;
if (numFrames == -1) //all frames deleted. Kill the display if (numFrames == -1) //all frames deleted. Kill the display
{ {
ui->listID->clear();
idFilters.clear();
} }
else if (numFrames == -2) //all new set of frames. Reset else if (numFrames == -2) //all new set of frames. Reset
{ {
refreshFilterList();
} }
else //just got some new frames. See if they are relevant. else //just got some new frames. See if they are relevant.
{ {
@@ -48,12 +117,43 @@ void DiscreteStateWindow::updatedFrames(int numFrames)
for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++) for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++)
{ {
thisFrame = modelFrames->at(i); thisFrame = modelFrames->at(i);
if (!idFilters.contains(thisFrame.ID))
{
idFilters.insert(thisFrame.ID, true);
QListWidgetItem* listItem = new QListWidgetItem(Utility::formatNumber(thisFrame.ID), ui->listID);
listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag
listItem->setCheckState(Qt::Checked); //default all filters to be set active
}
if (operatingState == DWStates::IDLE) stateFrames[0]->append(thisFrame); if (operatingState == DWStates::IDLE) stateFrames[0]->append(thisFrame);
else stateFrames[currToggleState + 1]->append(thisFrame); else stateFrames[currToggleState + 1]->append(thisFrame);
} }
} }
} }
void DiscreteStateWindow::refreshFilterList()
{
int id;
idFilters.clear();
ui->listID->clear();
for (int i = 0; i < modelFrames->length(); i++)
{
id = modelFrames->at(i).ID;
if (!idFilters.contains(id))
{
idFilters.insert(id, true);
QListWidgetItem* listItem = new QListWidgetItem(Utility::formatNumber(id), ui->listID);
listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag
listItem->setCheckState(Qt::Checked); //default all filters to be set active
}
}
ui->listID->sortItems();
}
void DiscreteStateWindow::showEvent(QShowEvent* event) void DiscreteStateWindow::showEvent(QShowEvent* event)
{ {
QDialog::showEvent(event); QDialog::showEvent(event);
@@ -97,7 +197,7 @@ void DiscreteStateWindow::updateStateLabel()
switch(operatingState) switch(operatingState)
{ {
case DWStates::IDLE: case DWStates::IDLE:
ui->lblStatus->setText("WAIT"); ui->lblStatus->setText("IDLE");
pal = ui->lblStatus->palette(); pal = ui->lblStatus->palette();
pal.setColor(QPalette::WindowText, Qt::red); pal.setColor(QPalette::WindowText, Qt::red);
ui->lblStatus->setPalette(pal); ui->lblStatus->setPalette(pal);
@@ -109,7 +209,7 @@ void DiscreteStateWindow::updateStateLabel()
ui->lblStatus->setPalette(pal); ui->lblStatus->setPalette(pal);
break; break;
case DWStates::COUNTDOWN_WAITING: case DWStates::COUNTDOWN_WAITING:
ui->lblStatus->setText("Return to resting state"); ui->lblStatus->setText("Wait....");
pal = ui->lblStatus->palette(); pal = ui->lblStatus->palette();
pal.setColor(QPalette::WindowText, Qt::red); pal.setColor(QPalette::WindowText, Qt::red);
ui->lblStatus->setPalette(pal); ui->lblStatus->setPalette(pal);
@@ -120,11 +220,19 @@ void DiscreteStateWindow::updateStateLabel()
pal.setColor(QPalette::WindowText, Qt::green); pal.setColor(QPalette::WindowText, Qt::green);
ui->lblStatus->setPalette(pal); ui->lblStatus->setPalette(pal);
break; break;
case DWStates::DONE:
ui->lblStatus->setText("DONE");
pal = ui->lblStatus->palette();
pal.setColor(QPalette::WindowText, Qt::green);
ui->lblStatus->setPalette(pal);
break;
} }
} }
void DiscreteStateWindow::handleStartButton() void DiscreteStateWindow::handleStartButton()
{ {
if (isRealtime)
{
operatingState = DWStates::COUNTDOWN_SIGNAL; operatingState = DWStates::COUNTDOWN_SIGNAL;
ticksPerStateChange = ticksUntilStateChange = ui->spinFreq->value() * 10; ticksPerStateChange = ticksUntilStateChange = ui->spinFreq->value() * 10;
@@ -134,10 +242,10 @@ void DiscreteStateWindow::handleStartButton()
currToggleState = 0; currToggleState = 0;
currIteration = 0; currIteration = 0;
for (int i = 0; i < stateFrames.count(); i++) for (int i = stateFrames.count() - 1; i > 0; i--)
{ {
stateFrames[i]->clear(); stateFrames[i]->clear();
delete(stateFrames[i]); stateFrames.removeAt(i);
} }
for (int j = 0; j <= numToggleStates; j++) for (int j = 0; j <= numToggleStates; j++)
@@ -146,6 +254,11 @@ void DiscreteStateWindow::handleStartButton()
} }
timer->start(); timer->start();
}
else
{
calculateResults();
}
} }
void DiscreteStateWindow::handleTick() void DiscreteStateWindow::handleTick()
@@ -168,11 +281,11 @@ void DiscreteStateWindow::handleTick()
{ {
ticksUntilStateChange = ticksPerStateChange; ticksUntilStateChange = ticksPerStateChange;
currIteration++; currIteration++;
if (currIteration == numIterations) if (currIteration > numIterations)
{ {
operatingState = DWStates::IDLE; operatingState = DWStates::IDLE;
timer->stop(); timer->stop();
//call to calculate our findings here. calculateResults();
} }
else operatingState = DWStates::COUNTDOWN_SIGNAL; else operatingState = DWStates::COUNTDOWN_SIGNAL;
} }
@@ -184,7 +297,7 @@ void DiscreteStateWindow::handleTick()
ticksUntilStateChange = ticksPerStateChange; ticksUntilStateChange = ticksPerStateChange;
operatingState = DWStates::COUNTDOWN_WAITING; operatingState = DWStates::COUNTDOWN_WAITING;
currToggleState++; currToggleState++;
if (currToggleState == numToggleStates) currToggleState = 0; if (currToggleState > numToggleStates) currToggleState = 0;
} }
break; break;
} }
@@ -193,5 +306,41 @@ void DiscreteStateWindow::handleTick()
void DiscreteStateWindow::calculateResults() void DiscreteStateWindow::calculateResults()
{ {
int minBits, maxBits;
if (isRealtime)
{
}
else //use already loaded frames from main cache
{
//basic overview: run through all ID filters and see if it is enabled.
//If so add it to a giant list of messages by ID where each ID has its own
//list of messages
//Then, for each ID start a loop that runs from largest bits to smallest bits for scan
//For each value run through the algorithm for all messages. At the end list any matches
//the simplest approach seems to be to grab that number of bits and then record every
//unique value. IF the # of unique values is the same as the number of states then
//we've got a match.It should be noted that the # of states must be at least 2 - the idle
//state is 1 and then a second state at the minimum. Turn signals might be 3 states then
minBits = ui->spinMinBits->value();
maxBits = ui->spinMaxBits->value();
QHash<int, bool>::const_iterator it;
QList<CANFrame> frameCache;
for (it = idFilters.begin(); it != idFilters.end(); ++it)
{
if (it.value())
{
frameCache.clear();
for (int i = 0; i < modelFrames->count(); i++)
{
if (modelFrames->at(i).ID == it.key()) frameCache.append(modelFrames->at(i));
}
for (int bits = maxBits; bits >= minBits; bits--)
{
QList<int> values;
}
}
}
}
} }
+6 -1
View File
@@ -15,7 +15,8 @@ enum DiscreteWindowState
IDLE, IDLE,
COUNTDOWN_SIGNAL, COUNTDOWN_SIGNAL,
COUNTDOWN_WAITING, COUNTDOWN_WAITING,
GETTING_SIGNAL GETTING_SIGNAL,
DONE
}; };
} }
@@ -33,6 +34,7 @@ private slots:
void updatedFrames(int); void updatedFrames(int);
void handleStartButton(); void handleStartButton();
void handleTick(); void handleTick();
void typeChanged();
private: private:
Ui::DiscreteStateWindow *ui; Ui::DiscreteStateWindow *ui;
@@ -46,7 +48,10 @@ private:
int currToggleState; int currToggleState;
int numIterations; int numIterations;
int currIteration; int currIteration;
bool isRealtime;
QHash<int, bool> idFilters;
void refreshFilterList();
void closeEvent(QCloseEvent *event); void closeEvent(QCloseEvent *event);
void readSettings(); void readSettings();
void writeSettings(); void writeSettings();
+143 -26
View File
@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>749</width>
<height>300</height> <height>795</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -31,22 +31,59 @@
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item row="0" column="1" alignment="Qt::AlignHCenter"> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Number of States:</string> <string>Number of States:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0" alignment="Qt::AlignHCenter"> <item>
<widget class="QSpinBox" name="spinStates">
<property name="minimum">
<number>2</number>
</property>
<property name="maximum">
<number>64</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QRadioButton" name="rbRealtime">
<property name="text">
<string>Realtime</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbLogged">
<property name="text">
<string>From logged data</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4" stretch="2,2">
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>Toggle Frequency (Seconds)</string> <string>Toggle Frequency (Seconds)</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item>
<widget class="QSpinBox" name="spinFreq"> <widget class="QSpinBox" name="spinFreq">
<property name="minimum"> <property name="minimum">
<number>1</number> <number>1</number>
@@ -59,24 +96,14 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item>
<widget class="QSpinBox" name="spinStates">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>20</number>
</property>
</widget>
</item>
<item row="0" column="2" alignment="Qt::AlignHCenter">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Iterations</string> <string>Iterations</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="2"> <item>
<widget class="QSpinBox" name="spinIterations"> <widget class="QSpinBox" name="spinIterations">
<property name="minimum"> <property name="minimum">
<number>1</number> <number>1</number>
@@ -86,16 +113,20 @@
</property> </property>
</widget> </widget>
</item> </item>
</layout> <item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="btnStart">
<property name="text">
<string>Go for it</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignHCenter">
<widget class="QLabel" name="lblStatus"> <widget class="QLabel" name="lblStatus">
<property name="palette"> <property name="palette">
<palette> <palette>
@@ -148,6 +179,92 @@
</widget> </widget>
</item> </item>
</layout> </layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>Min Bits</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinMinBits">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>8</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Max Bits</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinMaxBits">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>8</number>
</property>
<property name="value">
<number>8</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_7">
<property name="text">
<string>IDs to Scan</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="listID"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QPushButton" name="btnAll">
<property name="text">
<string>All</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnNone">
<property name="text">
<string>None</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout"/>
</item>
<item>
<widget class="QPushButton" name="btnStart">
<property name="text">
<string>Go for it</string>
</property>
</widget>
</item>
</layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>