From 6e0000dcadb2a9aecb284d03eec0608033c325ea Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Mon, 22 Feb 2016 21:05:43 -0500 Subject: [PATCH] Additional coding on discrete state window. --- discretestatewindow.cpp | 193 ++++++++++++++++++++++--- discretestatewindow.h | 7 +- discretestatewindow.ui | 309 +++++++++++++++++++++++++++------------- 3 files changed, 390 insertions(+), 119 deletions(-) diff --git a/discretestatewindow.cpp b/discretestatewindow.cpp index d5b5f80..473402e 100644 --- a/discretestatewindow.cpp +++ b/discretestatewindow.cpp @@ -14,9 +14,47 @@ DiscreteStateWindow::DiscreteStateWindow(const QVector *frames, QWidge timer = new QTimer(); timer->setInterval(100); + isRealtime = ui->rbRealtime->isChecked(); + typeChanged(); + connect(ui->btnStart, SIGNAL(clicked(bool)), this, SLOT(handleStartButton())); connect(timer, SIGNAL(timeout()), this, SLOT(handleTick())); 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() @@ -33,14 +71,45 @@ DiscreteStateWindow::~DiscreteStateWindow() 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) { CANFrame thisFrame; if (numFrames == -1) //all frames deleted. Kill the display { + ui->listID->clear(); + idFilters.clear(); } else if (numFrames == -2) //all new set of frames. Reset { + refreshFilterList(); } 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++) { 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); 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) { QDialog::showEvent(event); @@ -97,7 +197,7 @@ void DiscreteStateWindow::updateStateLabel() switch(operatingState) { case DWStates::IDLE: - ui->lblStatus->setText("WAIT"); + ui->lblStatus->setText("IDLE"); pal = ui->lblStatus->palette(); pal.setColor(QPalette::WindowText, Qt::red); ui->lblStatus->setPalette(pal); @@ -109,7 +209,7 @@ void DiscreteStateWindow::updateStateLabel() ui->lblStatus->setPalette(pal); break; case DWStates::COUNTDOWN_WAITING: - ui->lblStatus->setText("Return to resting state"); + ui->lblStatus->setText("Wait...."); pal = ui->lblStatus->palette(); pal.setColor(QPalette::WindowText, Qt::red); ui->lblStatus->setPalette(pal); @@ -120,32 +220,45 @@ void DiscreteStateWindow::updateStateLabel() pal.setColor(QPalette::WindowText, Qt::green); ui->lblStatus->setPalette(pal); 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() { - operatingState = DWStates::COUNTDOWN_SIGNAL; - - ticksPerStateChange = ticksUntilStateChange = ui->spinFreq->value() * 10; - numToggleStates = ui->spinStates->value(); - numIterations = ui->spinIterations->value(); - - currToggleState = 0; - currIteration = 0; - - for (int i = 0; i < stateFrames.count(); i++) + if (isRealtime) { - stateFrames[i]->clear(); - delete(stateFrames[i]); - } + operatingState = DWStates::COUNTDOWN_SIGNAL; - for (int j = 0; j <= numToggleStates; j++) + ticksPerStateChange = ticksUntilStateChange = ui->spinFreq->value() * 10; + numToggleStates = ui->spinStates->value(); + numIterations = ui->spinIterations->value(); + + currToggleState = 0; + currIteration = 0; + + for (int i = stateFrames.count() - 1; i > 0; i--) + { + stateFrames[i]->clear(); + stateFrames.removeAt(i); + } + + for (int j = 0; j <= numToggleStates; j++) + { + stateFrames.append(new QVector()); + } + + timer->start(); + } + else { - stateFrames.append(new QVector()); + calculateResults(); } - - timer->start(); } void DiscreteStateWindow::handleTick() @@ -168,11 +281,11 @@ void DiscreteStateWindow::handleTick() { ticksUntilStateChange = ticksPerStateChange; currIteration++; - if (currIteration == numIterations) + if (currIteration > numIterations) { operatingState = DWStates::IDLE; timer->stop(); - //call to calculate our findings here. + calculateResults(); } else operatingState = DWStates::COUNTDOWN_SIGNAL; } @@ -184,7 +297,7 @@ void DiscreteStateWindow::handleTick() ticksUntilStateChange = ticksPerStateChange; operatingState = DWStates::COUNTDOWN_WAITING; currToggleState++; - if (currToggleState == numToggleStates) currToggleState = 0; + if (currToggleState > numToggleStates) currToggleState = 0; } break; } @@ -193,5 +306,41 @@ void DiscreteStateWindow::handleTick() 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::const_iterator it; + QList 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 values; + } + } + } + } } diff --git a/discretestatewindow.h b/discretestatewindow.h index 311f7be..e027cca 100644 --- a/discretestatewindow.h +++ b/discretestatewindow.h @@ -15,7 +15,8 @@ enum DiscreteWindowState IDLE, COUNTDOWN_SIGNAL, COUNTDOWN_WAITING, - GETTING_SIGNAL + GETTING_SIGNAL, + DONE }; } @@ -33,6 +34,7 @@ private slots: void updatedFrames(int); void handleStartButton(); void handleTick(); + void typeChanged(); private: Ui::DiscreteStateWindow *ui; @@ -46,7 +48,10 @@ private: int currToggleState; int numIterations; int currIteration; + bool isRealtime; + QHash idFilters; + void refreshFilterList(); void closeEvent(QCloseEvent *event); void readSettings(); void writeSettings(); diff --git a/discretestatewindow.ui b/discretestatewindow.ui index ed01b92..dd61278 100644 --- a/discretestatewindow.ui +++ b/discretestatewindow.ui @@ -6,8 +6,8 @@ 0 0 - 400 - 300 + 749 + 795 @@ -31,63 +31,232 @@ - - + + Number of States: - - - - Toggle Frequency (Seconds) - - - - - - - 1 - - - 30 - - - 2 - - - - + - 1 + 2 - 20 - - - - - - - Iterations - - - - - - - 1 - - - 10 + 64 + + + + + + Realtime + + + true + + + + + + + From logged data + + + + + + + + + + + + + Toggle Frequency (Seconds) + + + + + + + 1 + + + 30 + + + 2 + + + + + + + Iterations + + + + + + + 1 + + + 10 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 120 + 120 + 120 + + + + + + + + + Nirmala UI + 26 + 75 + true + + + + WAIT + + + + + + + + + + + Min Bits + + + + + + + 1 + + + 8 + + + 1 + + + + + + + Max Bits + + + + + + + 1 + + + 8 + + + 8 + + + + + + + IDs to Scan + + + + + + + + + + + + All + + + + + + + None + + + + + + + + + + + + @@ -95,58 +264,6 @@ - - - - - - - - - 255 - 0 - 0 - - - - - - - - - 255 - 0 - 0 - - - - - - - - - 120 - 120 - 120 - - - - - - - - - Nirmala UI - 26 - 75 - true - - - - WAIT - - -