Merge pull request #537 from qurrent-llc/fix_customsendcrash

Fix custom frame sender crashing
This commit is contained in:
Collin Kidder
2022-11-29 18:45:39 -05:00
committed by GitHub
16 changed files with 208 additions and 124 deletions
+84 -54
View File
@@ -236,11 +236,11 @@ void CANFrameModel::setAllFilters(bool state)
* quicksort on the columns and interpret the columns numerically. But, correct or not, this implementation is quite fast * quicksort on the columns and interpret the columns numerically. But, correct or not, this implementation is quite fast
* and sorts the columns properly. * and sorts the columns properly.
*/ */
uint64_t CANFrameModel::getCANFrameVal(int row, Column col) uint64_t CANFrameModel::getCANFrameVal(QVector<CANFrame> *frames, int row, Column col)
{ {
uint64_t temp = 0; uint64_t temp = 0;
if (row >= frames.count()) return 0; if (row >= frames->count()) return 0;
CANFrame frame = frames[row]; CANFrame frame = frames->at(row);
switch (col) switch (col)
{ {
case Column::TimeStamp: case Column::TimeStamp:
@@ -279,18 +279,18 @@ void CANFrameModel::qSortCANFrameAsc(QVector<CANFrame> *frames, Column column, i
qDebug() << "Lower " << lowerBound << " Upper" << upperBound; qDebug() << "Lower " << lowerBound << " Upper" << upperBound;
if (lowerBound < upperBound) if (lowerBound < upperBound)
{ {
uint64_t piv = getCANFrameVal(lowerBound + (upperBound - lowerBound) / 2, column); uint64_t piv = getCANFrameVal(frames, lowerBound + (upperBound - lowerBound) / 2, column);
i = lowerBound - 1; i = lowerBound - 1;
j = upperBound + 1; j = upperBound + 1;
for (;;){ for (;;){
do { do {
i++; i++;
} while ((i < upperBound) && getCANFrameVal(i, column) < piv); } while ((i < upperBound) && getCANFrameVal(frames, i, column) < piv);
do do
{ {
j--; j--;
} while ((j > lowerBound) && getCANFrameVal(j, column) > piv); } while ((j > lowerBound) && getCANFrameVal(frames, j, column) > piv);
if (i < j) { if (i < j) {
CANFrame temp = frames->at(i); CANFrame temp = frames->at(i);
frames->replace(i, frames->at(j)); frames->replace(i, frames->at(j));
@@ -310,18 +310,18 @@ void CANFrameModel::qSortCANFrameDesc(QVector<CANFrame> *frames, Column column,
qDebug() << "Lower " << lowerBound << " Upper" << upperBound; qDebug() << "Lower " << lowerBound << " Upper" << upperBound;
if (lowerBound < upperBound) if (lowerBound < upperBound)
{ {
uint64_t piv = getCANFrameVal(lowerBound + (upperBound - lowerBound) / 2, column); uint64_t piv = getCANFrameVal(frames, lowerBound + (upperBound - lowerBound) / 2, column);
i = lowerBound - 1; i = lowerBound - 1;
j = upperBound + 1; j = upperBound + 1;
for (;;){ for (;;){
do { do {
i++; i++;
} while ((i < upperBound) && getCANFrameVal(i, column) > piv); } while ((i < upperBound) && getCANFrameVal(frames, i, column) > piv);
do do
{ {
j--; j--;
} while ((j > lowerBound) && getCANFrameVal(j, column) < piv); } while ((j > lowerBound) && getCANFrameVal(frames, j, column) < piv);
if (i < j) { if (i < j) {
CANFrame temp = frames->at(i); CANFrame temp = frames->at(i);
frames->replace(i, frames->at(j)); frames->replace(i, frames->at(j));
@@ -338,11 +338,13 @@ void CANFrameModel::qSortCANFrameDesc(QVector<CANFrame> *frames, Column column,
void CANFrameModel::sortByColumn(int column) void CANFrameModel::sortByColumn(int column)
{ {
sortDirAsc = !sortDirAsc; sortDirAsc = !sortDirAsc;
//beginResetModel(); if (sortDirAsc) qSortCANFrameAsc(&filteredFrames, Column(column), 0, filteredFrames.count()-1);
if (sortDirAsc) qSortCANFrameAsc(&frames, Column(column), 0, frames.count()-1); else qSortCANFrameDesc(&filteredFrames, Column(column), 0, filteredFrames.count()-1);
else qSortCANFrameDesc(&frames, Column(column), 0, frames.count()-1);
//endResetModel(); mutex.lock();
sendRefresh(); beginResetModel();
endResetModel();
mutex.unlock();
} }
//End of custom sorting code //End of custom sorting code
@@ -365,34 +367,38 @@ void CANFrameModel::recalcOverwrite()
idAugmented = frame.frameId(); idAugmented = frame.frameId();
idAugmented = idAugmented + (frame.bus << 29ull); idAugmented = idAugmented + (frame.bus << 29ull);
if (!overWriteFrames.contains(idAugmented)) if (filters[frame.frameId()] && busFilters[frame.bus])
{ {
frame.timedelta = 0; if (!overWriteFrames.contains(idAugmented))
frame.frameCount = 1; {
overWriteFrames.insert(idAugmented, frame); frame.timedelta = 0;
} frame.frameCount = 1;
else overWriteFrames.insert(idAugmented, frame);
{ }
frame.timedelta = frame.timeStamp().microSeconds() - overWriteFrames[idAugmented].timeStamp().microSeconds(); else
frame.frameCount = overWriteFrames[idAugmented].frameCount + 1; {
overWriteFrames[idAugmented] = frame; frame.timedelta = frame.timeStamp().microSeconds() - overWriteFrames[idAugmented].timeStamp().microSeconds();
frame.frameCount = overWriteFrames[idAugmented].frameCount + 1;
overWriteFrames[idAugmented] = frame;
}
} }
} }
//Then replace the old list of frames with just the unique list //Then replace the old list of frames with just the unique list
frames.clear(); //frames.clear();
frames.append(overWriteFrames.values().toVector()); //frames.append(overWriteFrames.values().toVector());
frames.reserve(preallocSize); //frames.reserve(preallocSize);
filteredFrames.clear(); filteredFrames.clear();
filteredFrames.append(overWriteFrames.values().toVector());
filteredFrames.reserve(preallocSize); filteredFrames.reserve(preallocSize);
for (int i = 0; i < frames.count(); i++) /*for (int i = 0; i < frames.count(); i++)
{ {
if (filters[frames[i].frameId()] && busFilters[frames[i].bus]) if (filters[frames[i].frameId()] && busFilters[frames[i].bus])
{ {
filteredFrames.append(frames[i]); filteredFrames.append(frames[i]);
} }
} }*/
endResetModel(); endResetModel();
mutex.unlock(); mutex.unlock();
@@ -705,20 +711,32 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false)
else //yes, overwrite dups else //yes, overwrite dups
{ {
bool found = false; bool found = false;
for (int i = 0; i < frames.count(); i++) // for (int i = 0; i < frames.count(); i++)
// {
// if ( (frames[i].frameId() == tempFrame.frameId()) && (frames[i].bus == tempFrame.bus) )
// {
// tempFrame.frameCount = frames[i].frameCount + 1;
// tempFrame.timedelta = tempFrame.timeStamp().microSeconds() - frames[i].timeStamp().microSeconds();
// frames.replace(i, tempFrame);
// found = true;
// break;
// }
// }
for (int i = 0; i < filteredFrames.count(); i++)
{ {
if ( (frames[i].frameId() == tempFrame.frameId()) && (frames[i].bus == tempFrame.bus) ) if ( (filteredFrames[i].frameId() == tempFrame.frameId()) && (filteredFrames[i].bus == tempFrame.bus) )
{ {
tempFrame.frameCount = frames[i].frameCount + 1; tempFrame.frameCount = filteredFrames[i].frameCount + 1;
tempFrame.timedelta = tempFrame.timeStamp().microSeconds() - frames[i].timeStamp().microSeconds(); tempFrame.timedelta = tempFrame.timeStamp().microSeconds() - filteredFrames[i].timeStamp().microSeconds();
frames.replace(i, tempFrame); filteredFrames.replace(i, tempFrame);
found = true; found = true;
break; break;
} }
} }
frames.append(tempFrame);
if (!found) if (!found)
{ {
frames.append(tempFrame); //frames.append(tempFrame);
if (filters[tempFrame.frameId()] && busFilters[tempFrame.bus]) if (filters[tempFrame.frameId()] && busFilters[tempFrame.bus])
{ {
if (autoRefresh) beginInsertRows(QModelIndex(), filteredFrames.count(), filteredFrames.count()); if (autoRefresh) beginInsertRows(QModelIndex(), filteredFrames.count(), filteredFrames.count());
@@ -750,16 +768,20 @@ void CANFrameModel::addFrames(const CANConnection*, const QVector<CANFrame>& pFr
{ {
if(frames.length() > frames.capacity() * 0.99) if(frames.length() > frames.capacity() * 0.99)
{ {
mutex.lock();
qDebug() << "Frames count: " << frames.length() << " of " << frames.capacity() << " capacity, removing first " << (int)(frames.capacity() * 0.05) << " frames"; qDebug() << "Frames count: " << frames.length() << " of " << frames.capacity() << " capacity, removing first " << (int)(frames.capacity() * 0.05) << " frames";
frames.remove(0, (int)(frames.capacity() * 0.05)); frames.remove(0, (int)(frames.capacity() * 0.05));
qDebug() << "Frames removed, new count: " << frames.length(); qDebug() << "Frames removed, new count: " << frames.length();
mutex.unlock();
} }
if(filteredFrames.length() > filteredFrames.capacity() * 0.99) if(filteredFrames.length() > filteredFrames.capacity() * 0.99)
{ {
mutex.lock();
qDebug() << "filteredFrames count: " << filteredFrames.length() << " of " << filteredFrames.capacity() << " capacity, removing first " << (int)(filteredFrames.capacity() * 0.05) << " frames"; qDebug() << "filteredFrames count: " << filteredFrames.length() << " of " << filteredFrames.capacity() << " capacity, removing first " << (int)(filteredFrames.capacity() * 0.05) << " frames";
filteredFrames.remove(0, (int)(filteredFrames.capacity() * 0.05)); filteredFrames.remove(0, (int)(filteredFrames.capacity() * 0.05));
qDebug() << "filteredFrames removed, new count: " << filteredFrames.length(); qDebug() << "filteredFrames removed, new count: " << filteredFrames.length();
mutex.unlock();
} }
foreach(const CANFrame& frame, pFrames) foreach(const CANFrame& frame, pFrames)
@@ -775,25 +797,33 @@ void CANFrameModel::addFrames(const CANConnection*, const QVector<CANFrame>& pFr
void CANFrameModel::sendRefresh() void CANFrameModel::sendRefresh()
{ {
qDebug() << "Sending mass refresh"; qDebug() << "Sending mass refresh";
QVector<CANFrame> tempContainer;
int count = frames.count();
for (int i = 0; i < count; i++)
{
if (filters[frames[i].frameId()] && busFilters[frames[i].bus])
{
tempContainer.append(frames[i]);
}
}
mutex.lock();
beginResetModel();
filteredFrames.clear();
filteredFrames.append(tempContainer);
filteredFrames.reserve(preallocSize);
lastUpdateNumFrames = 0; if(overwriteDups)
endResetModel(); {
mutex.unlock(); recalcOverwrite();
}
else
{
QVector<CANFrame> tempContainer;
int count = frames.count();
for (int i = 0; i < count; i++)
{
if (filters[frames[i].frameId()] && busFilters[frames[i].bus])
{
tempContainer.append(frames[i]);
}
}
mutex.lock();
beginResetModel();
filteredFrames.clear();
filteredFrames.append(tempContainer);
filteredFrames.reserve(preallocSize);
lastUpdateNumFrames = 0;
endResetModel();
mutex.unlock();
}
} }
void CANFrameModel::sendRefresh(int pos) void CANFrameModel::sendRefresh(int pos)
@@ -811,7 +841,7 @@ int CANFrameModel::sendBulkRefresh()
if (lastUpdateNumFrames <= 0) return 0; if (lastUpdateNumFrames <= 0) return 0;
if (lastUpdateNumFrames == 0 && !overwriteDups) return 0; if (lastUpdateNumFrames == 0 && !overwriteDups) return 0;
if (filteredFrames.count() == 0) return 0; //if (filteredFrames.count() == 0) return 0;
//qDebug() << "Bulk refresh of " << lastUpdateNumFrames; //qDebug() << "Bulk refresh of " << lastUpdateNumFrames;
+1 -1
View File
@@ -78,7 +78,7 @@ signals:
private: private:
void qSortCANFrameAsc(QVector<CANFrame>* frames, Column column, int lowerBound, int upperBound); void qSortCANFrameAsc(QVector<CANFrame>* frames, Column column, int lowerBound, int upperBound);
void qSortCANFrameDesc(QVector<CANFrame>* frames, Column column, int lowerBound, int upperBound); void qSortCANFrameDesc(QVector<CANFrame>* frames, Column column, int lowerBound, int upperBound);
uint64_t getCANFrameVal(int row, Column col); uint64_t getCANFrameVal(QVector<CANFrame> *frames, int row, Column col);
bool any_filters_are_configured(void); bool any_filters_are_configured(void);
bool any_busfilters_are_configured(void); bool any_busfilters_are_configured(void);
+1 -5
View File
@@ -204,7 +204,6 @@ bool CANConManager::sendFrame(const CANFrame& pFrame)
{ {
int busBase = 0; int busBase = 0;
CANFrame workingFrame = pFrame; CANFrame workingFrame = pFrame;
CANFrame *txFrame;
if (mConns.count() == 0) if (mConns.count() == 0)
{ {
@@ -228,10 +227,7 @@ bool CANConManager::sendFrame(const CANFrame& pFrame)
workingFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, mElapsedTimer.nsecsElapsed() / 1000)); workingFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, mElapsedTimer.nsecsElapsed() / 1000));
//workingFrame.timestamp -= mTimestampBasis; //workingFrame.timestamp -= mTimestampBasis;
} }
txFrame = conn->getQueue().get();
QCoreApplication::processEvents();
*txFrame = workingFrame;
conn->getQueue().queue();
return conn->sendFrame(workingFrame); return conn->sendFrame(workingFrame);
} }
busBase += conn->getNumBuses(); busBase += conn->getNumBuses();
+5
View File
@@ -173,6 +173,11 @@ bool CANConnection::sendFrame(const CANFrame& pFrame)
return ret; return ret;
} }
CANFrame *txFrame;
txFrame = getQueue().get();
*txFrame = pFrame;
getQueue().queue();
return piSendFrame(pFrame); return piSendFrame(pFrame);
} }
+3 -5
View File
@@ -426,14 +426,12 @@ void ConnectionWindow::currentTabChanged(int newIdx)
void ConnectionWindow::currentRowChanged(const QModelIndex &current, const QModelIndex &previous) void ConnectionWindow::currentRowChanged(const QModelIndex &current, const QModelIndex &previous)
{ {
Q_UNUSED(previous);
int selIdx = current.row(); int selIdx = current.row();
CANConnection* prevConn = connModel->getAtIdx(previous.row());
disconnect(connModel->getAtIdx(previous.row()), SIGNAL(debugOutput(QString)), nullptr, nullptr); if(prevConn != nullptr)
disconnect(prevConn, SIGNAL(debugOutput(QString)), nullptr, nullptr);
disconnect(this, SIGNAL(sendDebugData(QByteArray)), nullptr, nullptr); disconnect(this, SIGNAL(sendDebugData(QByteArray)), nullptr, nullptr);
/* set parameters */ /* set parameters */
if (selIdx == -1) { if (selIdx == -1) {
ui->groupBus->setEnabled(false); ui->groupBus->setEnabled(false);
+8 -7
View File
@@ -64,7 +64,7 @@ void SocketCANd::sendBytesToTCP(const QByteArray &bytes, int busNum)
byt = (unsigned char)byt; byt = (unsigned char)byt;
buildDebug = buildDebug % QString::number(byt, 16) % " "; buildDebug = buildDebug % QString::number(byt, 16) % " ";
} }
sendDebug(buildDebug); //sendDebug(buildDebug);
if (tcpClient[busNum]) tcpClient[busNum]->write(bytes); if (tcpClient[busNum]) tcpClient[busNum]->write(bytes);
} }
@@ -77,9 +77,9 @@ void SocketCANd::sendStringToTCP(const char* data, int busNum)
return; return;
} }
QString buildDebug; //QString buildDebug;
buildDebug = "Send data to " + hostIP.toString() + ":" + QString::number(hostPort) + " -> " + data; //buildDebug = "Send data to " + hostIP.toString() + ":" + QString::number(hostPort) + " -> " + data;
sendDebug(buildDebug); //sendDebug(buildDebug);
//qInfo() << buildDebug; //qInfo() << buildDebug;
if (tcpClient[busNum]) tcpClient[busNum]->write(data); if (tcpClient[busNum]) tcpClient[busNum]->write(data);
@@ -295,6 +295,7 @@ QString SocketCANd::decodeFrames(QString data, int busNum)
framelength = frameParsed[3].length() * 0.5; framelength = frameParsed[3].length() * 0.5;
} }
QByteArray buildData;
buildData.resize(framelength); buildData.resize(framelength);
int c; int c;
@@ -366,15 +367,15 @@ void SocketCANd::invokeReadTCPData()
void SocketCANd::readTCPData(int busNum) void SocketCANd::readTCPData(int busNum)
{ {
QByteArray data; QString data;
if (tcpClient[busNum]) data = tcpClient[busNum]->readAll(); if (tcpClient[busNum])
data = QString(tcpClient[busNum]->readAll());
//sendDebug("Got data from TCP. Len = " % QString::number(data.length())); //sendDebug("Got data from TCP. Len = " % QString::number(data.length()));
//qDebug() << "Received datagramm: " << data; //qDebug() << "Received datagramm: " << data;
procRXData(data, busNum); procRXData(data, busNum);
} }
void SocketCANd::procRXData(QString data, int busNum) void SocketCANd::procRXData(QString data, int busNum)
{ {
if (data != "") if (data != "")
-1
View File
@@ -73,7 +73,6 @@ protected:
int hostPort; int hostPort;
QList<QString> hostCanIDs; QList<QString> hostCanIDs;
int framesRapid; int framesRapid;
QByteArray buildData;
QVarLengthArray<MODE> rx_state; QVarLengthArray<MODE> rx_state;
CANFrame buildFrame; CANFrame buildFrame;
QVarLengthArray<QString> unprocessedData; QVarLengthArray<QString> unprocessedData;
+64 -40
View File
@@ -181,8 +181,8 @@ void FrameSenderWindow::processIncomingFrame(CANFrame *frame)
for (int trig = 0; trig < sendingData[sd].triggers.count(); trig++) for (int trig = 0; trig < sendingData[sd].triggers.count(); trig++)
{ {
Trigger *thisTrigger = &sendingData[sd].triggers[trig]; Trigger *thisTrigger = &sendingData[sd].triggers[trig];
qDebug() << "Trigger ID: " << thisTrigger->ID; //qDebug() << "Trigger ID: " << thisTrigger->ID;
qDebug() << "Frame ID: " << frame->frameId(); //qDebug() << "Frame ID: " << frame->frameId();
if (thisTrigger->ID > 0 && (uint32_t)thisTrigger->ID == frame->frameId()) if (thisTrigger->ID > 0 && (uint32_t)thisTrigger->ID == frame->frameId())
{ {
if (thisTrigger->bus == frame->bus || thisTrigger->bus == -1) if (thisTrigger->bus == frame->bus || thisTrigger->bus == -1)
@@ -290,6 +290,8 @@ void FrameSenderWindow::loadGrid()
} }
} }
createBlankRow();
setupGrid(); setupGrid();
} }
@@ -424,44 +426,54 @@ void FrameSenderWindow::handleTick()
{ {
FrameSendData *sendData; FrameSendData *sendData;
Trigger *trigger; Trigger *trigger;
int elapsed = elapsedTimer.restart(); if(mutex.tryLock())
if (elapsed == 0) elapsed = 1;
//Modifier modifier;
for (int i = 0; i < sendingData.count(); i++)
{ {
sendData = &sendingData[i]; int elapsed = elapsedTimer.restart();
if (!sendData->enabled) if (elapsed == 0) elapsed = 1;
//Modifier modifier;
for (int i = 0; i < sendingData.count(); i++)
{ {
if (sendData->triggers.count() > 0) sendData = &sendingData[i];
if (!sendData->enabled)
{ {
for (int j = 0; j < sendData->triggers.count(); j++) //resetting currCount when line is disabled if (sendData->triggers.count() > 0)
{ {
sendData->triggers[j].currCount = 0; for (int j = 0; j < sendData->triggers.count(); j++) //resetting currCount when line is disabled
{
sendData->triggers[j].currCount = 0;
}
}
continue; //abort any processing on this if it is not enabled.
}
if (sendData->triggers.count() == 0) break;
for (int j = 0; j < sendData->triggers.count(); j++)
{
trigger = &sendData->triggers[j];
if (trigger->currCount >= trigger->maxCount) continue; //don't process if we've sent max frames we were supposed to
if (!trigger->readyCount) continue; //don't tick if not ready to tick
//is it time to fire?
trigger->msCounter += elapsed; //gives proper tracking even if timer doesn't fire as fast as it should
if (trigger->msCounter >= trigger->milliseconds)
{
trigger->msCounter = 0;
sendData->count++;
trigger->currCount++;
doModifiers(i);
updateGridRow(i);
//qDebug() << "About to try to send a frame";
CANConManager::getInstance()->sendFrame(sendingData[i]);
if (trigger->ID > 0) trigger->readyCount = false; //reset flag if this is a timed ID trigger
} }
} }
continue; //abort any processing on this if it is not enabled.
}
if (sendData->triggers.count() == 0) return;
for (int j = 0; j < sendData->triggers.count(); j++)
{
trigger = &sendData->triggers[j];
if (trigger->currCount >= trigger->maxCount) continue; //don't process if we've sent max frames we were supposed to
if (!trigger->readyCount) continue; //don't tick if not ready to tick
//is it time to fire?
trigger->msCounter += elapsed; //gives proper tracking even if timer doesn't fire as fast as it should
if (trigger->msCounter >= trigger->milliseconds)
{
trigger->msCounter = 0;
sendData->count++;
trigger->currCount++;
doModifiers(i);
updateGridRow(i);
qDebug() << "About to try to send a frame";
CANConManager::getInstance()->sendFrame(sendingData[i]);
if (trigger->ID > 0) trigger->readyCount = false; //reset flag if this is a timed ID trigger
}
} }
mutex.unlock();
} }
else
{
qDebug() << "framesenderwindow::handleTick() couldn't get mutex, elapsed is: " << elapsedTimer.elapsed();
}
} }
/// <summary> /// <summary>
@@ -479,7 +491,7 @@ void FrameSenderWindow::doModifiers(int idx)
if (sendData->modifiers.count() == 0) return; //if no modifiers just leave right now if (sendData->modifiers.count() == 0) return; //if no modifiers just leave right now
qDebug() << "Executing mods"; //qDebug() << "Executing mods";
for (int i = 0; i < sendData->modifiers.count(); i++) for (int i = 0; i < sendData->modifiers.count(); i++)
{ {
@@ -648,10 +660,10 @@ void FrameSenderWindow::processModifierText(int line)
{ {
thisOp.operation = parseOperation(operation); thisOp.operation = parseOperation(operation);
QString secondOp = Utility::grabAlphaNumeric(mods[i]); QString secondOp = Utility::grabAlphaNumeric(mods[i]);
if (mods[i][0] == '~') if (secondOp.length() > 0 && secondOp[0] == '~')
{ {
thisOp.second.notOper = true; thisOp.second.notOper = true;
mods[i] = mods[i].remove(0, 1); //remove the ~ character secondOp = secondOp.remove(0, 1); //remove the ~ character
} }
else thisOp.second.notOper = false; else thisOp.second.notOper = false;
thisOp.second.bus = sendingData[line].bus; thisOp.second.bus = sendingData[line].bus;
@@ -797,7 +809,7 @@ ModifierOperationType FrameSenderWindow::parseOperation(QString op)
/// <param name="idx"></param> /// <param name="idx"></param>
void FrameSenderWindow::updateGridRow(int idx) void FrameSenderWindow::updateGridRow(int idx)
{ {
qDebug() << "updateGridRow"; //qDebug() << "updateGridRow";
inhibitChanged = true; inhibitChanged = true;
FrameSendData *temp = &sendingData[idx]; FrameSendData *temp = &sendingData[idx];
@@ -807,16 +819,28 @@ void FrameSenderWindow::updateGridRow(int idx)
const unsigned char *data = reinterpret_cast<const unsigned char *>(temp->payload().constData()); const unsigned char *data = reinterpret_cast<const unsigned char *>(temp->payload().constData());
int dataLen = temp->payload().length(); int dataLen = temp->payload().length();
if (item == nullptr) item = new QTableWidgetItem(); if (item == nullptr)
item->setText(QString::number(temp->count)); {
if (temp->frameType() != QCanBusFrame::RemoteRequestFrame) { item = new QTableWidgetItem();
item->setText(QString::number(temp->count));
ui->tableSender->setItem(gridLine, 9, item);
}
else
{
item->setText(QString::number(temp->count));
}
if (temp->frameType() != QCanBusFrame::RemoteRequestFrame)
{
for (int i = 0; i < dataLen; i++) for (int i = 0; i < dataLen; i++)
{ {
dataString.append(Utility::formatNumber(data[i])); dataString.append(Utility::formatNumber(data[i]));
dataString.append(" "); dataString.append(" ");
} }
ui->tableSender->item(gridLine, 6)->setText(dataString); ui->tableSender->item(gridLine, 6)->setText(dataString);
} else { }
else
{
ui->tableSender->item(gridLine, 6)->setText(""); ui->tableSender->item(gridLine, 6)->setText("");
} }
inhibitChanged = false; inhibitChanged = false;
+2
View File
@@ -5,6 +5,7 @@
#include <QTimer> #include <QTimer>
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QTime> #include <QTime>
#include <QMutex>
#include "can_structs.h" #include "can_structs.h"
#include "can_trigger_structs.h" #include "can_trigger_structs.h"
@@ -38,6 +39,7 @@ private:
QTimer *intervalTimer; QTimer *intervalTimer;
QElapsedTimer elapsedTimer; QElapsedTimer elapsedTimer;
bool inhibitChanged = false; bool inhibitChanged = false;
QMutex mutex;
void createBlankRow(); void createBlankRow();
void doModifiers(int); void doModifiers(int);
+6
View File
@@ -24,6 +24,12 @@ public:
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
#ifdef QT_DEBUG
//uncomment for verbose debug data in application output
//qputenv("QT_FATAL_WARNINGS", "1");
//qSetMessagePattern("Type: %{type}\nProduct Name: %{appname}\nFile: %{file}\nLine: %{line}\nMethod: %{function}\nThreadID: %{threadid}\nThreadPtr: %{qthreadptr}\nMessage: %{message}");
#endif
SavvyCANApplication a(argc, argv); SavvyCANApplication a(argc, argv);
//Add a local path for Qt extensions, to allow for per-application extensions. //Add a local path for Qt extensions, to allow for per-application extensions.
+27 -6
View File
@@ -442,6 +442,8 @@ void MainWindow::headerClicked(int logicalIndex)
{ {
//ui->canFramesView->sortByColumn(logicalIndex); //ui->canFramesView->sortByColumn(logicalIndex);
model->sortByColumn(logicalIndex); model->sortByColumn(logicalIndex);
manageRowExpansion();
} }
void MainWindow::expandAllRows() void MainWindow::expandAllRows()
@@ -462,9 +464,17 @@ void MainWindow::expandAllRows()
if (goAhead) if (goAhead)
{ {
ui->canFramesView->resizeRowsToContents(); ui->canFramesView->resizeRowsToContents();
rowExpansionActive = true;
} }
} }
void MainWindow::manageRowExpansion()
{
if(rowExpansionActive && model->getInterpretMode())
ui->canFramesView->resizeRowsToContents();
}
void MainWindow::collapseAllRows() void MainWindow::collapseAllRows()
{ {
bool goAhead = false; bool goAhead = false;
@@ -483,6 +493,8 @@ void MainWindow::collapseAllRows()
if (goAhead) if (goAhead)
{ {
for (int i = 0; i < numRows; i++) ui->canFramesView->setRowHeight(i, normalRowHeight); for (int i = 0; i < numRows; i++) ui->canFramesView->setRowHeight(i, normalRowHeight);
rowExpansionActive = false;
} }
} }
@@ -622,6 +634,7 @@ void MainWindow::overwriteToggled(bool state)
} }
else else
{ {
rowExpansionActive = false;
model->setOverwriteMode(false); model->setOverwriteMode(false);
} }
} }
@@ -680,6 +693,8 @@ void MainWindow::filterListItemChanged(QListWidgetItem *item)
if (item->checkState() == Qt::Checked) isSet = true; if (item->checkState() == Qt::Checked) isSet = true;
model->setFilterState(ID, isSet); model->setFilterState(ID, isSet);
manageRowExpansion();
} }
void MainWindow::busFilterListItemChanged(QListWidgetItem *item) void MainWindow::busFilterListItemChanged(QListWidgetItem *item)
@@ -693,6 +708,8 @@ void MainWindow::busFilterListItemChanged(QListWidgetItem *item)
if (item->checkState() == Qt::Checked) isSet = true; if (item->checkState() == Qt::Checked) isSet = true;
model->setBusFilterState(ID, isSet); model->setBusFilterState(ID, isSet);
manageRowExpansion();
} }
void MainWindow::filterSetAll() void MainWindow::filterSetAll()
@@ -704,6 +721,8 @@ void MainWindow::filterSetAll()
} }
inhibitFilterUpdate = false; inhibitFilterUpdate = false;
model->setAllFilters(true); model->setAllFilters(true);
manageRowExpansion();
} }
void MainWindow::filterClearAll() void MainWindow::filterClearAll()
@@ -739,12 +758,14 @@ void MainWindow::tickGUIUpdate()
framesPerSec = 0; framesPerSec = 0;
ui->lbNumFrames->setText(QString::number(model->rowCount())); ui->lbNumFrames->setText(QString::number(model->rowCount()));
if (rxFrames > 0 && /*allowCapture && */ ui->cbAutoScroll->isChecked()) ui->canFramesView->scrollToBottom(); if (rxFrames > 0 && /*allowCapture && */ ui->cbAutoScroll->isChecked())
ui->canFramesView->scrollToBottom();
ui->lbFPS->setText(QString::number(framesPerSec)); ui->lbFPS->setText(QString::number(framesPerSec));
if (rxFrames > 0) if (rxFrames > 0)
{ {
bDirty = true; bDirty = true;
emit framesUpdated(rxFrames); //anyone care that frames were updated? emit framesUpdated(rxFrames); //anyone care that frames were updated?
manageRowExpansion();
} }
if (model->needsFilterRefresh()) updateFilterList(); if (model->needsFilterRefresh()) updateFilterList();
@@ -795,7 +816,7 @@ void MainWindow::addFrameToDisplay(CANFrame &frame, bool autoRefresh = false)
//A sub-window is sending us a center on timestamp and ID signal //A sub-window is sending us a center on timestamp and ID signal
//try to find the relevant frame in the list and focus on it. //try to find the relevant frame in the list and focus on it.
void MainWindow::gotCenterTimeID(int32_t ID, double timestamp) void MainWindow::gotCenterTimeID(uint32_t ID, double timestamp)
{ {
int idx = model->getIndexFromTimeID(ID, timestamp); int idx = model->getIndexFromTimeID(ID, timestamp);
if (idx > -1) if (idx > -1)
@@ -1322,13 +1343,13 @@ void MainWindow::showGraphingWindow()
lastGraphingWindow = new GraphingWindow(model->getListReference()); lastGraphingWindow = new GraphingWindow(model->getListReference());
graphWindows.append(lastGraphingWindow); graphWindows.append(lastGraphingWindow);
connect(lastGraphingWindow, SIGNAL(sendCenterTimeID(uint32_t,double)), this, SLOT(gotCenterTimeID(int32_t,double))); connect(lastGraphingWindow, SIGNAL(sendCenterTimeID(uint32_t,double)), this, SLOT(gotCenterTimeID(uint32_t,double)));
connect(this, SIGNAL(sendCenterTimeID(uint32_t,double)), lastGraphingWindow, SLOT(gotCenterTimeID(int32_t,double))); connect(this, SIGNAL(sendCenterTimeID(uint32_t,double)), lastGraphingWindow, SLOT(gotCenterTimeID(uint32_t,double)));
if (flowViewWindow) //connect the two external windows together if (flowViewWindow) //connect the two external windows together
{ {
connect(lastGraphingWindow, SIGNAL(sendCenterTimeID(uint32_t,double)), flowViewWindow, SLOT(gotCenterTimeID(int32_t,double))); connect(lastGraphingWindow, SIGNAL(sendCenterTimeID(uint32_t,double)), flowViewWindow, SLOT(gotCenterTimeID(uint32_t,double)));
connect(flowViewWindow, SIGNAL(sendCenterTimeID(uint32_t,double)), lastGraphingWindow, SLOT(gotCenterTimeID(int32_t,double))); connect(flowViewWindow, SIGNAL(sendCenterTimeID(uint32_t,double)), lastGraphingWindow, SLOT(gotCenterTimeID(uint32_t,double)));
} }
lastGraphingWindow->show(); lastGraphingWindow->show();
+3 -1
View File
@@ -117,7 +117,7 @@ public slots:
void gotFrames(int); void gotFrames(int);
void updateSettings(); void updateSettings();
void readUpdateableSettings(); void readUpdateableSettings();
void gotCenterTimeID(int32_t ID, double timestamp); void gotCenterTimeID(uint32_t ID, double timestamp);
void updateConnectionSettings(QString connectionType, QString port, int speed0, int speed1); void updateConnectionSettings(QString connectionType, QString port, int speed0, int speed1);
signals: signals:
@@ -192,6 +192,7 @@ private:
int normalRowHeight; int normalRowHeight;
bool isConnected; bool isConnected;
QPoint contextMenuPosition; QPoint contextMenuPosition;
bool rowExpansionActive = false;
//private methods //private methods
QString getSignalNameFromPosition(QPoint pos); QString getSignalNameFromPosition(QPoint pos);
@@ -207,6 +208,7 @@ private:
void readSettings(); void readSettings();
void writeSettings(); void writeSettings();
bool eventFilter(QObject *obj, QEvent *event); bool eventFilter(QObject *obj, QEvent *event);
void manageRowExpansion();
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H
+1 -1
View File
@@ -298,7 +298,7 @@ void FlowViewWindow::plottableDoubleClick(QCPAbstractPlottable* plottable, QMous
else emit sendCenterTimeID(id, coord / 1000000.0); else emit sendCenterTimeID(id, coord / 1000000.0);
} }
void FlowViewWindow::gotCenterTimeID(int32_t ID, double timestamp) void FlowViewWindow::gotCenterTimeID(uint32_t ID, double timestamp)
{ {
int64_t t_stamp; int64_t t_stamp;
+1 -1
View File
@@ -37,7 +37,7 @@ private slots:
void saveFileFlow(); void saveFileFlow();
void saveFileGraph(); void saveFileGraph();
void plottableDoubleClick(QCPAbstractPlottable* plottable, QMouseEvent* event); void plottableDoubleClick(QCPAbstractPlottable* plottable, QMouseEvent* event);
void gotCenterTimeID(int32_t ID, double timestamp); void gotCenterTimeID(uint32_t ID, double timestamp);
void updateTriggerValues(); void updateTriggerValues();
void gotCellClick(int x, int y); void gotCellClick(int x, int y);
void graphRangeChanged(int range); void graphRangeChanged(int range);
+1 -1
View File
@@ -281,7 +281,7 @@ void GraphingWindow::plottableDoubleClick(QCPAbstractPlottable* plottable, int d
locationText->setText("X: " + QString::number(x) + " Y: " + QString::number(itemTracer->position->value())); locationText->setText("X: " + QString::number(x) + " Y: " + QString::number(itemTracer->position->value()));
} }
void GraphingWindow::gotCenterTimeID(int32_t ID, double timestamp) void GraphingWindow::gotCenterTimeID(uint32_t ID, double timestamp)
{ {
Q_UNUSED(ID) Q_UNUSED(ID)
//its problematic to try to highlight a graph since we get the ID //its problematic to try to highlight a graph since we get the ID
+1 -1
View File
@@ -81,7 +81,7 @@ private slots:
void appendToGraph(GraphParams &params, CANFrame &frame, QVector<double> &x, QVector<double> &y); void appendToGraph(GraphParams &params, CANFrame &frame, QVector<double> &x, QVector<double> &y);
void editSelectedGraph(); void editSelectedGraph();
void updatedFrames(int); void updatedFrames(int);
void gotCenterTimeID(int32_t ID, double timestamp); void gotCenterTimeID(uint32_t ID, double timestamp);
void resetView(); void resetView();
void zoomIn(); void zoomIn();
void zoomOut(); void zoomOut();