diff --git a/udsscanwindow.cpp b/udsscanwindow.cpp index a64f423..7398477 100644 --- a/udsscanwindow.cpp +++ b/udsscanwindow.cpp @@ -13,9 +13,10 @@ UDSScanWindow::UDSScanWindow(const QVector *frames, QWidget *parent) : currentlyRunning = false; waitTimer = new QTimer; - waitTimer->setInterval(300); + waitTimer->setInterval(100); connect(MainWindow::getReference(), SIGNAL(framesUpdated(int)), this, SLOT(updatedFrames(int))); + connect(MainWindow::getReference(), SIGNAL(frameUpdateRapid(int)), this, SLOT(rapidFrames(int))); connect(ui->btnScan, &QPushButton::clicked, this, &UDSScanWindow::scanUDS); connect(waitTimer, &QTimer::timeout, this, &UDSScanWindow::timeOut); @@ -56,7 +57,7 @@ void UDSScanWindow::scanUDS() if (buses < 1) buses = 1; //start out by sending tester present to every address to see if anyone replies - for (id = startID; id < endID; id++) + for (id = startID; id <= endID; id++) { frame.ID = id; frame.len = 8; @@ -113,15 +114,9 @@ void UDSScanWindow::scanUDS() sendNextMsg(); } +//Updates here are sent about every 1/4 second. That's fine for most windows but not this one. void UDSScanWindow::updatedFrames(int numFrames) { - CANFrame thisFrame; - QString result; - int id; - int offset = ui->spinReplyOffset->value(); - CANFrame sentFrame; - bool gotReply = false; - if (numFrames == -1) //all frames deleted. We don't care { } @@ -130,61 +125,73 @@ void UDSScanWindow::updatedFrames(int numFrames) } else //just got some new frames. See if they are relevant. { - if (numFrames > modelFrames->count()) return; + } +} - int numSending = sendingFrames.length(); - if (numSending == 0) return; +//Updates here are nearly once per millisecond if there is heavy traffic. That's more like it! +void UDSScanWindow::rapidFrames(int numFrames) +{ + CANFrame thisFrame; + QString result; + int id; + int offset = ui->spinReplyOffset->value(); + CANFrame sentFrame; + bool gotReply = false; + + if (numFrames > modelFrames->count()) return; + + int numSending = sendingFrames.length(); + if (numSending == 0) return; + if (currIdx >= numSending) return; + sentFrame = sendingFrames[currIdx]; + + for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++) + { if (currIdx >= numSending) return; - sentFrame = sendingFrames[currIdx]; + thisFrame = modelFrames->at(i); + id = thisFrame.ID; - for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++) + if ((id == (sentFrame.ID + offset)) || ui->cbAllowAdaptiveOffset->isChecked()) { - if (currIdx >= numSending) return; - thisFrame = modelFrames->at(i); - id = thisFrame.ID; - - if ((id == (sentFrame.ID + offset)) || ui->cbAllowAdaptiveOffset->isChecked()) + int temp = thisFrame.data[0] >> 4; + if (temp == 0) //single frame reply (maybe) { - int temp = thisFrame.data[0] >> 4; - if (temp == 0) //single frame reply (maybe) + if (thisFrame.data[1] == 0x40 + sendingFrames[currIdx].data[1]) { - if (thisFrame.data[1] == 0x40 + sendingFrames[currIdx].data[1]) - { - result = "Request on bus " + QString::number(sentFrame.bus) + " ID: " + QString::number(sentFrame.ID, 16) + " got response to mode " - + QString::number(sentFrame.data[1], 16) - + " " + QString::number(sentFrame.data[2], 16) + " with affirmation from ID " + QString::number(id, 16) - + " on bus " + QString::number(thisFrame.bus) + "."; - gotReply = true; - } - else if ( thisFrame.data[1] == 0x7F) - { - result = "Request on bus " + QString::number(sentFrame.bus) + " ID: " + QString::number(sentFrame.ID, 16) + " got response to mode " - + QString::number(sentFrame.data[1], 16) - + " " + QString::number(sentFrame.data[2], 16) + " with an error from ID " + QString::number(id, 16) - + " on bus " + QString::number(thisFrame.bus) + "."; - gotReply = true; - } + result = "Request on bus " + QString::number(sentFrame.bus) + " ID: " + QString::number(sentFrame.ID, 16) + " got response to mode " + + QString::number(sentFrame.data[1], 16) + + " " + QString::number(sentFrame.data[2], 16) + " with affirmation from ID " + QString::number(id, 16) + + " on bus " + QString::number(thisFrame.bus) + "."; + gotReply = true; } - - if (temp == 1) //start of a multiframe reply + else if ( thisFrame.data[1] == 0x7F) { - if (thisFrame.data[2] == 0x40 + sendingFrames[currIdx].data[1]) - { - result = "Request on bus " + QString::number(sentFrame.bus) + " ID: " + QString::number(sentFrame.ID, 16) + " got response to mode " - + QString::number(sentFrame.data[1], 16) - + " " + QString::number(sentFrame.data[2], 16) + " with affirmation from ID " + QString::number(id, 16) - + " on bus " + QString::number(thisFrame.bus) + "."; - gotReply = true; - } - //error replies are never multiframe so the check doesn't have to be done here. + result = "Request on bus " + QString::number(sentFrame.bus) + " ID: " + QString::number(sentFrame.ID, 16) + " got response to mode " + + QString::number(sentFrame.data[1], 16) + + " " + QString::number(sentFrame.data[2], 16) + " with an error from ID " + QString::number(id, 16) + + " on bus " + QString::number(thisFrame.bus) + "."; + gotReply = true; } } + + if (temp == 1) //start of a multiframe reply + { + if (thisFrame.data[2] == 0x40 + sendingFrames[currIdx].data[1]) + { + result = "Request on bus " + QString::number(sentFrame.bus) + " ID: " + QString::number(sentFrame.ID, 16) + " got response to mode " + + QString::number(sentFrame.data[1], 16) + + " " + QString::number(sentFrame.data[2], 16) + " with affirmation from ID " + QString::number(id, 16) + + " on bus " + QString::number(thisFrame.bus) + "."; + gotReply = true; + } + //error replies are never multiframe so the check doesn't have to be done here. + } } - if (gotReply) - { - ui->listResults->addItem(result); - sendNextMsg(); - } + } + if (gotReply) + { + ui->listResults->addItem(result); + sendNextMsg(); } } diff --git a/udsscanwindow.h b/udsscanwindow.h index 0b17737..1066198 100644 --- a/udsscanwindow.h +++ b/udsscanwindow.h @@ -22,6 +22,7 @@ signals: private slots: void updatedFrames(int numFrames); + void rapidFrames(int numFrames); void scanUDS(); void timeOut();