@@ -236,11 +236,11 @@ void CANFrameModel::setAllFilters(bool state)
236
236
* quicksort on the columns and interpret the columns numerically. But, correct or not, this implementation is quite fast
237
237
* and sorts the columns properly.
238
238
*/
239
- uint64_t CANFrameModel::getCANFrameVal (int row, Column col)
239
+ uint64_t CANFrameModel::getCANFrameVal (QVector<CANFrame> *frames, int row, Column col)
240
240
{
241
241
uint64_t temp = 0 ;
242
- if (row >= frames. count ()) return 0 ;
243
- CANFrame frame = frames[ row] ;
242
+ if (row >= frames-> count ()) return 0 ;
243
+ CANFrame frame = frames-> at ( row) ;
244
244
switch (col)
245
245
{
246
246
case Column::TimeStamp:
@@ -279,18 +279,18 @@ void CANFrameModel::qSortCANFrameAsc(QVector<CANFrame> *frames, Column column, i
279
279
qDebug () << " Lower " << lowerBound << " Upper" << upperBound;
280
280
if (lowerBound < upperBound)
281
281
{
282
- uint64_t piv = getCANFrameVal (lowerBound + (upperBound - lowerBound) / 2 , column);
282
+ uint64_t piv = getCANFrameVal (frames, lowerBound + (upperBound - lowerBound) / 2 , column);
283
283
i = lowerBound - 1 ;
284
284
j = upperBound + 1 ;
285
285
for (;;){
286
286
do {
287
287
i++;
288
- } while ((i < upperBound) && getCANFrameVal (i, column) < piv);
288
+ } while ((i < upperBound) && getCANFrameVal (frames, i, column) < piv);
289
289
290
290
do
291
291
{
292
292
j--;
293
- } while ((j > lowerBound) && getCANFrameVal (j, column) > piv);
293
+ } while ((j > lowerBound) && getCANFrameVal (frames, j, column) > piv);
294
294
if (i < j) {
295
295
CANFrame temp = frames->at (i);
296
296
frames->replace (i, frames->at (j));
@@ -310,18 +310,18 @@ void CANFrameModel::qSortCANFrameDesc(QVector<CANFrame> *frames, Column column,
310
310
qDebug () << " Lower " << lowerBound << " Upper" << upperBound;
311
311
if (lowerBound < upperBound)
312
312
{
313
- uint64_t piv = getCANFrameVal (lowerBound + (upperBound - lowerBound) / 2 , column);
313
+ uint64_t piv = getCANFrameVal (frames, lowerBound + (upperBound - lowerBound) / 2 , column);
314
314
i = lowerBound - 1 ;
315
315
j = upperBound + 1 ;
316
316
for (;;){
317
317
do {
318
318
i++;
319
- } while ((i < upperBound) && getCANFrameVal (i, column) > piv);
319
+ } while ((i < upperBound) && getCANFrameVal (frames, i, column) > piv);
320
320
321
321
do
322
322
{
323
323
j--;
324
- } while ((j > lowerBound) && getCANFrameVal (j, column) < piv);
324
+ } while ((j > lowerBound) && getCANFrameVal (frames, j, column) < piv);
325
325
if (i < j) {
326
326
CANFrame temp = frames->at (i);
327
327
frames->replace (i, frames->at (j));
@@ -338,11 +338,13 @@ void CANFrameModel::qSortCANFrameDesc(QVector<CANFrame> *frames, Column column,
338
338
void CANFrameModel::sortByColumn (int column)
339
339
{
340
340
sortDirAsc = !sortDirAsc;
341
- // beginResetModel();
342
- if (sortDirAsc) qSortCANFrameAsc (&frames, Column (column), 0 , frames.count ()-1 );
343
- else qSortCANFrameDesc (&frames, Column (column), 0 , frames.count ()-1 );
344
- // endResetModel();
345
- sendRefresh ();
341
+ if (sortDirAsc) qSortCANFrameAsc (&filteredFrames, Column (column), 0 , filteredFrames.count ()-1 );
342
+ else qSortCANFrameDesc (&filteredFrames, Column (column), 0 , filteredFrames.count ()-1 );
343
+
344
+ mutex.lock ();
345
+ beginResetModel ();
346
+ endResetModel ();
347
+ mutex.unlock ();
346
348
}
347
349
348
350
// End of custom sorting code
@@ -365,34 +367,38 @@ void CANFrameModel::recalcOverwrite()
365
367
366
368
idAugmented = frame.frameId ();
367
369
idAugmented = idAugmented + (frame.bus << 29ull );
368
- if (!overWriteFrames.contains (idAugmented))
369
- {
370
- frame.timedelta = 0 ;
371
- frame.frameCount = 1 ;
372
- overWriteFrames.insert (idAugmented, frame);
373
- }
374
- else
370
+ if (filters[frame.frameId ()] && busFilters[frame.bus ])
375
371
{
376
- frame.timedelta = frame.timeStamp ().microSeconds () - overWriteFrames[idAugmented].timeStamp ().microSeconds ();
377
- frame.frameCount = overWriteFrames[idAugmented].frameCount + 1 ;
378
- overWriteFrames[idAugmented] = frame;
372
+ if (!overWriteFrames.contains (idAugmented))
373
+ {
374
+ frame.timedelta = 0 ;
375
+ frame.frameCount = 1 ;
376
+ overWriteFrames.insert (idAugmented, frame);
377
+ }
378
+ else
379
+ {
380
+ frame.timedelta = frame.timeStamp ().microSeconds () - overWriteFrames[idAugmented].timeStamp ().microSeconds ();
381
+ frame.frameCount = overWriteFrames[idAugmented].frameCount + 1 ;
382
+ overWriteFrames[idAugmented] = frame;
383
+ }
379
384
}
380
385
}
381
386
// Then replace the old list of frames with just the unique list
382
- frames.clear ();
383
- frames.append (overWriteFrames.values ().toVector ());
384
- frames.reserve (preallocSize);
387
+ // frames.clear();
388
+ // frames.append(overWriteFrames.values().toVector());
389
+ // frames.reserve(preallocSize);
385
390
386
391
filteredFrames.clear ();
392
+ filteredFrames.append (overWriteFrames.values ().toVector ());
387
393
filteredFrames.reserve (preallocSize);
388
394
389
- for (int i = 0 ; i < frames.count (); i++)
395
+ /* for (int i = 0; i < frames.count(); i++)
390
396
{
391
397
if (filters[frames[i].frameId()] && busFilters[frames[i].bus])
392
398
{
393
399
filteredFrames.append(frames[i]);
394
400
}
395
- }
401
+ }*/
396
402
397
403
endResetModel ();
398
404
mutex.unlock ();
@@ -705,20 +711,32 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false)
705
711
else // yes, overwrite dups
706
712
{
707
713
bool found = false ;
708
- for (int i = 0 ; i < frames.count (); i++)
714
+ // for (int i = 0; i < frames.count(); i++)
715
+ // {
716
+ // if ( (frames[i].frameId() == tempFrame.frameId()) && (frames[i].bus == tempFrame.bus) )
717
+ // {
718
+ // tempFrame.frameCount = frames[i].frameCount + 1;
719
+ // tempFrame.timedelta = tempFrame.timeStamp().microSeconds() - frames[i].timeStamp().microSeconds();
720
+ // frames.replace(i, tempFrame);
721
+ // found = true;
722
+ // break;
723
+ // }
724
+ // }
725
+ for (int i = 0 ; i < filteredFrames.count (); i++)
709
726
{
710
- if ( (frames [i].frameId () == tempFrame.frameId ()) && (frames [i].bus == tempFrame.bus ) )
727
+ if ( (filteredFrames [i].frameId () == tempFrame.frameId ()) && (filteredFrames [i].bus == tempFrame.bus ) )
711
728
{
712
- tempFrame.frameCount = frames [i].frameCount + 1 ;
713
- tempFrame.timedelta = tempFrame.timeStamp ().microSeconds () - frames [i].timeStamp ().microSeconds ();
714
- frames .replace (i, tempFrame);
729
+ tempFrame.frameCount = filteredFrames [i].frameCount + 1 ;
730
+ tempFrame.timedelta = tempFrame.timeStamp ().microSeconds () - filteredFrames [i].timeStamp ().microSeconds ();
731
+ filteredFrames .replace (i, tempFrame);
715
732
found = true ;
716
733
break ;
717
734
}
718
735
}
736
+ frames.append (tempFrame);
719
737
if (!found)
720
738
{
721
- frames.append (tempFrame);
739
+ // frames.append(tempFrame);
722
740
if (filters[tempFrame.frameId ()] && busFilters[tempFrame.bus ])
723
741
{
724
742
if (autoRefresh) beginInsertRows (QModelIndex (), filteredFrames.count (), filteredFrames.count ());
@@ -750,16 +768,20 @@ void CANFrameModel::addFrames(const CANConnection*, const QVector<CANFrame>& pFr
750
768
{
751
769
if (frames.length () > frames.capacity () * 0.99 )
752
770
{
771
+ mutex.lock ();
753
772
qDebug () << " Frames count: " << frames.length () << " of " << frames.capacity () << " capacity, removing first " << (int )(frames.capacity () * 0.05 ) << " frames" ;
754
773
frames.remove (0 , (int )(frames.capacity () * 0.05 ));
755
774
qDebug () << " Frames removed, new count: " << frames.length ();
775
+ mutex.unlock ();
756
776
}
757
777
758
778
if (filteredFrames.length () > filteredFrames.capacity () * 0.99 )
759
779
{
780
+ mutex.lock ();
760
781
qDebug () << " filteredFrames count: " << filteredFrames.length () << " of " << filteredFrames.capacity () << " capacity, removing first " << (int )(filteredFrames.capacity () * 0.05 ) << " frames" ;
761
782
filteredFrames.remove (0 , (int )(filteredFrames.capacity () * 0.05 ));
762
783
qDebug () << " filteredFrames removed, new count: " << filteredFrames.length ();
784
+ mutex.unlock ();
763
785
}
764
786
765
787
foreach (const CANFrame& frame, pFrames)
@@ -775,25 +797,33 @@ void CANFrameModel::addFrames(const CANConnection*, const QVector<CANFrame>& pFr
775
797
776
798
void CANFrameModel::sendRefresh ()
777
799
{
778
- qDebug () << " Sending mass refresh" ;
779
- QVector<CANFrame> tempContainer;
780
- int count = frames.count ();
781
- for (int i = 0 ; i < count; i++)
800
+ qDebug () << " Sending mass refresh" ;
801
+
802
+ if (overwriteDups)
782
803
{
783
- if (filters[frames[i].frameId ()] && busFilters[frames[i].bus ])
804
+ recalcOverwrite ();
805
+ }
806
+ else
807
+ {
808
+ QVector<CANFrame> tempContainer;
809
+ int count = frames.count ();
810
+ for (int i = 0 ; i < count; i++)
784
811
{
785
- tempContainer.append (frames[i]);
812
+ if (filters[frames[i].frameId ()] && busFilters[frames[i].bus ])
813
+ {
814
+ tempContainer.append (frames[i]);
815
+ }
786
816
}
787
- }
788
- mutex.lock ();
789
- beginResetModel ();
790
- filteredFrames.clear ();
791
- filteredFrames.append (tempContainer);
792
- filteredFrames.reserve (preallocSize);
793
817
794
- lastUpdateNumFrames = 0 ;
795
- endResetModel ();
796
- mutex.unlock ();
818
+ mutex.lock ();
819
+ beginResetModel ();
820
+ filteredFrames.clear ();
821
+ filteredFrames.append (tempContainer);
822
+ filteredFrames.reserve (preallocSize);
823
+ lastUpdateNumFrames = 0 ;
824
+ endResetModel ();
825
+ mutex.unlock ();
826
+ }
797
827
}
798
828
799
829
void CANFrameModel::sendRefresh (int pos)
@@ -811,7 +841,7 @@ int CANFrameModel::sendBulkRefresh()
811
841
if (lastUpdateNumFrames <= 0 ) return 0 ;
812
842
813
843
if (lastUpdateNumFrames == 0 && !overwriteDups) return 0 ;
814
- if (filteredFrames.count () == 0 ) return 0 ;
844
+ // if (filteredFrames.count() == 0) return 0;
815
845
816
846
// qDebug() << "Bulk refresh of " << lastUpdateNumFrames;
817
847
0 commit comments