Sender at bottom of main window is now operational.

This commit is contained in:
Collin Kidder
2024-02-13 21:52:52 -05:00
parent 0c84b6998f
commit 47a5aa5085
4 changed files with 64 additions and 49 deletions
+11 -7
View File
@@ -154,12 +154,15 @@ void FrameSenderObject::timerTriggered()
sendingList.clear(); sendingList.clear();
if(mutex.tryLock()) if(mutex.tryLock())
{ {
//get elapsed microseconds since last tick (in case timer skips or is otherwise inaccurate, though there are no guarantees about elapsed timer either) /*
quint64 elapsed = sendingElapsed.nsecsElapsed() / 1000; * Requested tick interval was 1ms but the actual interval could be wildly different. So, we track
* by counting microseconds and accumulating. This creates decent stability even for long intervals
*/
quint64 elapsed = sendingElapsed.nsecsElapsed() / 1000ul;
if (elapsed == 0) elapsed = 1; if (elapsed == 0) elapsed = 1;
sendingElapsed.start(); sendingElapsed.start();
sendingLastTimeStamp += elapsed; sendingLastTimeStamp += elapsed;
//qDebug() << playbackLastTimeStamp; //qDebug() << sendingLastTimeStamp;
//qDebug() << "El: " << elapsed; //qDebug() << "El: " << elapsed;
statusCounter++; statusCounter++;
for (int i = 0; i < sendingData.count(); i++) for (int i = 0; i < sendingData.count(); i++)
@@ -178,19 +181,20 @@ void FrameSenderObject::timerTriggered()
} }
if (sendData->triggers.count() == 0) if (sendData->triggers.count() == 0)
{ {
qDebug() << "No triggers to process"; //qDebug() << "No triggers to process";
break; break;
} }
for (int j = 0; j < sendData->triggers.count(); j++) for (int j = 0; j < sendData->triggers.count(); j++)
{ {
trigger = &sendData->triggers[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->currCount >= trigger->maxCount) || (trigger->maxCount == -1) ) 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 if (!trigger->readyCount) continue; //don't tick if not ready to tick
//is it time to fire? //is it time to fire?
trigger->msCounter += elapsed; //gives proper tracking even if timer doesn't fire as fast as it should trigger->msCounter += elapsed; //gives proper tracking even if timer doesn't fire as fast as it should
if (trigger->msCounter >= trigger->milliseconds) //qDebug() << trigger->msCounter;
if (trigger->msCounter >= (trigger->milliseconds * 1000))
{ {
trigger->msCounter -= trigger->milliseconds; trigger->msCounter -= (trigger->milliseconds * 1000);
sendData->count++; sendData->count++;
trigger->currCount++; trigger->currCount++;
doModifiers(i); doModifiers(i);
+22 -14
View File
@@ -230,13 +230,12 @@ MainWindow::MainWindow(QWidget *parent) :
ui->actionSingle_Multi_State_2->setVisible(false); ui->actionSingle_Multi_State_2->setVisible(false);
QStringList headers; QStringList headers;
headers << "En" << "Bus" << "ID" << "Len" << "Ext" << "Rem" << "Data" headers << "En" << "Bus" << "ID" << "Ext" << "Rem" << "Data"
<< "Interval" << "Count"; << "Interval" << "Count";
ui->tableSimpleSender->setColumnCount(9); ui->tableSimpleSender->setColumnCount(8);
ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_EN, 70); ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_EN, 70);
ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_BUS, 70); ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_BUS, 70);
ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_ID, 70); ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_ID, 70);
ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_LEN, 70);
ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_EXT, 70); ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_EXT, 70);
ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_REM, 70); ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_REM, 70);
ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_DATA, 300); ui->tableSimpleSender->setColumnWidth(SIMP_COL::SC_COL_DATA, 300);
@@ -489,7 +488,12 @@ void MainWindow::processSenderCellChange(int line, int col)
if (!tempData) if (!tempData)
{ {
qDebug() << "Need to set up a new entry in senders";
FrameSendData dat; FrameSendData dat;
dat.enabled = false;
dat.count = 0;
dat.frameCount = 0;
dat.bus = 0;
frameSender->addSendRecord(dat); frameSender->addSendRecord(dat);
tempData = frameSender->getSendRecordRef(line); tempData = frameSender->getSendRecordRef(line);
} }
@@ -530,13 +534,6 @@ void MainWindow::processSenderCellChange(int line, int col)
} }
qDebug() << "setting ID to " << tempVal; qDebug() << "setting ID to " << tempVal;
break; break;
case SIMP_COL::SC_COL_LEN:
tempVal = Utility::ParseStringToNum(ui->tableSimpleSender->item(line, SIMP_COL::SC_COL_LEN)->text());
if (tempVal < 0) tempVal = 0;
if (tempVal > 8) tempVal = 8;
arr.resize(tempVal);
tempData->setPayload(arr);
break;
case SIMP_COL::SC_COL_EXT: case SIMP_COL::SC_COL_EXT:
if (ui->tableSimpleSender->item(line, SIMP_COL::SC_COL_EXT)->checkState() == Qt::Checked) { if (ui->tableSimpleSender->item(line, SIMP_COL::SC_COL_EXT)->checkState() == Qt::Checked) {
tempData->setExtendedFrameFormat(true); tempData->setExtendedFrameFormat(true);
@@ -555,9 +552,9 @@ void MainWindow::processSenderCellChange(int line, int col)
for (int i = 0; i < 8; i++) tempData->payload().data()[i] = 0; for (int i = 0; i < 8; i++) tempData->payload().data()[i] = 0;
#if QT_VERSION >= QT_VERSION_CHECK( 5, 14, 0 ) #if QT_VERSION >= QT_VERSION_CHECK( 5, 14, 0 )
tokens = ui->tableSimpleSender->item(line, ST_COLS::SENDTAB_COL_DATA)->text().split(" ", Qt::SkipEmptyParts); tokens = ui->tableSimpleSender->item(line, SIMP_COL::SC_COL_DATA)->text().split(" ", Qt::SkipEmptyParts);
#else #else
tokens = ui->tableSender->item(line, ST_COLS::SENDTAB_COL_DATA)->text().split(" ", QString::SkipEmptyParts); tokens = ui->tableSimpleSender->item(line, SIMP_COL::SC_COL_DATA)->text().split(" ", QString::SkipEmptyParts);
#endif #endif
arr.clear(); arr.clear();
arr.reserve(tokens.count()); arr.reserve(tokens.count());
@@ -569,7 +566,7 @@ void MainWindow::processSenderCellChange(int line, int col)
break; break;
case SIMP_COL::SC_COL_INTERVAL: //interval in ms case SIMP_COL::SC_COL_INTERVAL: //interval in ms
QString trigger = ui->tableSimpleSender->item(line, ST_COLS::SENDTAB_COL_TRIGGER)->text().toUpper(); QString trigger = ui->tableSimpleSender->item(line, SIMP_COL::SC_COL_INTERVAL)->text().toUpper();
Trigger thisTrigger; Trigger thisTrigger;
thisTrigger.bus = -1; //-1 means we don't care which thisTrigger.bus = -1; //-1 means we don't care which
@@ -598,7 +595,6 @@ void MainWindow::processSenderCellChange(int line, int col)
} }
} }
void MainWindow::createSenderRow() void MainWindow::createSenderRow()
{ {
int row = ui->tableSimpleSender->rowCount(); int row = ui->tableSimpleSender->rowCount();
@@ -1018,6 +1014,18 @@ void MainWindow::tickGUIUpdate()
} }
} }
//refresh the count for all the frame senders
FrameSendData *tempData;
int numRows = ui->tableSimpleSender->rowCount();
for (int i = 0; i < numRows; i++)
{
tempData = frameSender->getSendRecordRef(i);
if (tempData)
{
ui->tableSimpleSender->item(i, SIMP_COL::SC_COL_COUNT)->setText(QString::number( tempData->count ));
}
}
rxFrames = 0; rxFrames = 0;
//} //}
} }
+5 -6
View File
@@ -45,12 +45,11 @@ enum SIMP_COL
SC_COL_EN = 0, SC_COL_EN = 0,
SC_COL_BUS = 1, SC_COL_BUS = 1,
SC_COL_ID = 2, SC_COL_ID = 2,
SC_COL_LEN = 3, SC_COL_EXT = 3,
SC_COL_EXT = 4, SC_COL_REM = 4,
SC_COL_REM = 5, SC_COL_DATA = 5,
SC_COL_DATA = 6, SC_COL_INTERVAL = 6,
SC_COL_INTERVAL = 7, SC_COL_COUNT = 7,
SC_COL_COUNT = 8,
}; };
namespace Ui { namespace Ui {
+26 -22
View File
@@ -26,27 +26,34 @@
<string>SavvyCAN</string> <string>SavvyCAN</string>
</property> </property>
<widget class="QWidget" name="centralWidget"> <widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="5,1"> <layout class="QVBoxLayout" name="verticalLayout_2" stretch="0">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="4,1"> <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="3,1">
<item> <item>
<widget class="QTableView" name="canFramesView"> <layout class="QVBoxLayout" name="verticalLayout_3" stretch="4,1">
<property name="font"> <item>
<font> <widget class="QTableView" name="canFramesView">
<pointsize>11</pointsize> <property name="font">
<bold>false</bold> <font>
</font> <pointsize>11</pointsize>
</property> <bold>false</bold>
<property name="alternatingRowColors"> </font>
<bool>true</bool> </property>
</property> <property name="alternatingRowColors">
<property name="verticalScrollMode"> <bool>true</bool>
<enum>QAbstractItemView::ScrollPerPixel</enum> </property>
</property> <property name="verticalScrollMode">
<property name="wordWrap"> <enum>QAbstractItemView::ScrollPerPixel</enum>
<bool>false</bool> </property>
</property> <property name="wordWrap">
</widget> <bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QTableWidget" name="tableSimpleSender"/>
</item>
</layout>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
@@ -364,9 +371,6 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<widget class="QTableWidget" name="tableSimpleSender"/>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menuBar"> <widget class="QMenuBar" name="menuBar">