@@ -33,36 +33,39 @@ void CANFDMolinaroAnalyzer::SetupResults (void) {
33
33
34
34
// --------------------------------------------------------------------------------------------------
35
35
36
- void CANFDMolinaroAnalyzer::WorkerThread () {
36
+ void CANFDMolinaroAnalyzer::WorkerThread (void ) {
37
+ mResults .reset (new CANFDMolinaroAnalyzerResults (this , mSettings .get ())) ;
38
+ SetAnalyzerResults (mResults .get ()) ;
39
+ mResults ->AddChannelBubblesWillAppearOn (mSettings ->mInputChannel ) ;
40
+ // ---
37
41
const bool inverted = mSettings ->inverted () ;
38
42
mSampleRateHz = GetSampleRate () ;
39
- mSerial = GetAnalyzerChannelData (mSettings ->mInputChannel ) ;
43
+ AnalyzerChannelData * serial = GetAnalyzerChannelData (mSettings ->mInputChannel ) ;
40
44
// --- Sample settings
41
45
mCurrentSamplesPerBit = mSampleRateHz / mSettings ->arbitrationBitRate () ;
42
46
// --- Synchronize to recessive level
43
- if (mSerial ->GetBitState () == (inverted ? BIT_HIGH : BIT_LOW)) {
44
- mSerial ->AdvanceToNextEdge () ;
47
+ if (serial ->GetBitState () == (inverted ? BIT_HIGH : BIT_LOW)) {
48
+ serial ->AdvanceToNextEdge () ;
45
49
}
50
+ // ---
51
+ mFrameFieldEngineState = FrameFieldEngineState::IDLE ;
52
+ mUnstuffingActive = false ;
53
+ mPreviousBit = (serial->GetBitState () == BIT_HIGH) ^ inverted ;
54
+ // ---
46
55
while (1 ) {
47
- // --- Synchronize on falling edge: this SOF bit
48
- mFrameFieldEngineState = FrameFieldEngineState::IDLE ;
49
- mUnstuffingActive = false ;
50
- // --- Loop util the end of the frame (11 consecutive high bits)
51
- bool currentBitState = true ;
52
- do {
53
- mSerial ->AdvanceToNextEdge () ;
54
- currentBitState ^= true ;
55
- const U64 start = mSerial ->GetSampleNumber () ;
56
- const U64 nextEdge = mSerial ->GetSampleOfNextEdge () ;
57
-
58
- U64 currentCenter = start + mCurrentSamplesPerBit / 2 ;
59
- while (currentCenter < (nextEdge + mCurrentSamplesPerBit / 4 )) {
60
- enterBit (currentBitState, currentCenter) ;
61
- currentCenter += mCurrentSamplesPerBit ;
62
- }
63
- }while (mFrameFieldEngineState != FrameFieldEngineState::IDLE) ;
56
+ // serial->AdvanceToNextEdge () ;
57
+ const bool currentBitValue = (serial->GetBitState () == BIT_HIGH) ^ inverted ;
58
+ const U64 start = serial->GetSampleNumber () ;
59
+ const U64 nextEdge = serial->GetSampleOfNextEdge () ;
60
+
61
+ U64 currentCenter = start + mCurrentSamplesPerBit / 2 ;
62
+ while (currentCenter < (nextEdge + mCurrentSamplesPerBit / 4 )) {
63
+ enterBit (currentBitValue, currentCenter) ;
64
+ currentCenter += mCurrentSamplesPerBit ;
65
+ }
64
66
// ---
65
67
mResults ->CommitResults () ;
68
+ serial->AdvanceToNextEdge () ;
66
69
}
67
70
}
68
71
@@ -137,7 +140,6 @@ void CANFDMolinaroAnalyzer::enterBit (const bool inBit, U64 & ioBitCenterSampleN
137
140
enterBitInCRC21 (inBit) ;
138
141
}else if ((mConsecutiveBitCountOfSamePolarity == 5 ) && (mPreviousBit == inBit)) { // Stuff Error
139
142
addMark (ioBitCenterSampleNumber, AnalyzerResults::ErrorX);
140
- // const U32 samplesPerBit = mSampleRateHz / mSettings->arbitrationBitRate () ;
141
143
enterInErrorMode (ioBitCenterSampleNumber + mCurrentSamplesPerBit / 2 ) ;
142
144
mConsecutiveBitCountOfSamePolarity += 1 ;
143
145
}else if (mPreviousBit == inBit) {
@@ -213,7 +215,9 @@ void CANFDMolinaroAnalyzer::decodeFrameBit (const bool inBit, U64 & ioBitCenterS
213
215
// --------------------------------------------------------------------------------------------------
214
216
215
217
void CANFDMolinaroAnalyzer::handle_IDLE_state (const bool inBit, const U64 inBitCenterSampleNumber) {
216
- if (!inBit) {
218
+ if (inBit) {
219
+ addMark (inBitCenterSampleNumber, AnalyzerResults::Stop) ;
220
+ }else { // SOF
217
221
mUnstuffingActive = true ;
218
222
mCRC15Accumulator = 0 ;
219
223
switch (mSettings ->protocol ()) {
@@ -309,6 +313,7 @@ void CANFDMolinaroAnalyzer::handle_CONTROL_BASE_state (const bool inBit, const U
309
313
mFrameFieldEngineState = FrameFieldEngineState::CONTROL_AFTER_R0 ;
310
314
}
311
315
}else if (inBit) { // R0 bit recessive -> error
316
+ addMark (inBitCenterSampleNumber, AnalyzerResults::ErrorDot) ;
312
317
enterInErrorMode (inBitCenterSampleNumber) ;
313
318
}else { // R0 dominant: ok
314
319
addMark (inBitCenterSampleNumber, AnalyzerResults::Zero) ;
@@ -332,6 +337,7 @@ void CANFDMolinaroAnalyzer::handle_CONTROL_EXTENDED_state (const bool inBit, con
332
337
addMark (inBitCenterSampleNumber, AnalyzerResults::DownArrow) ;
333
338
}
334
339
}else if (inBit) { // R0 bit recessive -> error
340
+ addMark (inBitCenterSampleNumber, AnalyzerResults::ErrorDot) ;
335
341
enterInErrorMode (inBitCenterSampleNumber) ;
336
342
}else { // R0 dominant: ok
337
343
addMark (inBitCenterSampleNumber, AnalyzerResults::Zero) ;
@@ -469,6 +475,7 @@ void CANFDMolinaroAnalyzer::handle_SBC_state (const bool inBit, const U64 inBitC
469
475
if (mFieldBitIndex == 1 ) { // Forced Stuff Bit
470
476
mSBCField = 0 ;
471
477
if (inBit == mPreviousBit ) {
478
+ addMark (inBitCenterSampleNumber, AnalyzerResults::ErrorX) ;
472
479
enterInErrorMode (inBitCenterSampleNumber) ;
473
480
}else {
474
481
addMark (inBitCenterSampleNumber, AnalyzerResults::X);
@@ -515,6 +522,7 @@ void CANFDMolinaroAnalyzer::handle_CRC17_state (const bool inBit, const U64 inBi
515
522
enterBitInCRC17 (inBit) ;
516
523
addMark (inBitCenterSampleNumber, mMarkerTypeForDataAndCRC );
517
524
}else if (inBit == mPreviousBit ) {
525
+ addMark (inBitCenterSampleNumber, AnalyzerResults::ErrorX) ;
518
526
enterInErrorMode (inBitCenterSampleNumber) ;
519
527
}else {
520
528
addMark (inBitCenterSampleNumber, AnalyzerResults::X);
@@ -534,6 +542,7 @@ void CANFDMolinaroAnalyzer::handle_CRC21_state (const bool inBit, const U64 inBi
534
542
enterBitInCRC21 (inBit) ;
535
543
addMark (inBitCenterSampleNumber, mMarkerTypeForDataAndCRC );
536
544
}else if (inBit == mPreviousBit ) {
545
+ addMark (inBitCenterSampleNumber, AnalyzerResults::ErrorX) ;
537
546
enterInErrorMode (inBitCenterSampleNumber) ;
538
547
}else {
539
548
addMark (inBitCenterSampleNumber, AnalyzerResults::X);
@@ -566,6 +575,7 @@ void CANFDMolinaroAnalyzer::handle_CRCDEL_state (const bool inBit, U64 & ioBitCe
566
575
// --- Switch to Data Bit Rate
567
576
mCurrentSamplesPerBit = samplesPerArbitrationBit ;
568
577
}else {
578
+ addMark (ioBitCenterSampleNumber, AnalyzerResults::ErrorX) ;
569
579
enterInErrorMode (ioBitCenterSampleNumber) ;
570
580
}
571
581
mStartOfFieldSampleNumber = ioBitCenterSampleNumber + mCurrentSamplesPerBit / 2 ;
@@ -580,13 +590,14 @@ void CANFDMolinaroAnalyzer::handle_ACK_state (const bool inBit, const U64 inBitC
580
590
addMark (inBitCenterSampleNumber, inBit ? AnalyzerResults::ErrorSquare : AnalyzerResults::DownArrow);
581
591
}else { // ACK DELIMITER
582
592
addBubble (ACK_FIELD_RESULT, 0 , 0 , inBitCenterSampleNumber) ;
593
+ mFrameFieldEngineState = FrameFieldEngineState::ENDOFFRAME ;
583
594
if (inBit) {
584
595
addMark (inBitCenterSampleNumber, AnalyzerResults::One) ;
585
596
}else {
597
+ addMark (inBitCenterSampleNumber, AnalyzerResults::ErrorDot) ;
586
598
enterInErrorMode (inBitCenterSampleNumber) ;
587
599
}
588
600
mFieldBitIndex = 0 ;
589
- mFrameFieldEngineState = FrameFieldEngineState::ENDOFFRAME ;
590
601
}
591
602
}
592
603
@@ -596,6 +607,7 @@ void CANFDMolinaroAnalyzer::handle_ENDOFFRAME_state (const bool inBit, const U64
596
607
if (inBit) {
597
608
addMark (inBitCenterSampleNumber, AnalyzerResults::One) ;
598
609
}else {
610
+ addMark (inBitCenterSampleNumber, AnalyzerResults::ErrorX) ;
599
611
enterInErrorMode (inBitCenterSampleNumber) ;
600
612
}
601
613
mFieldBitIndex ++ ;
@@ -612,6 +624,7 @@ void CANFDMolinaroAnalyzer::handle_INTERMISSION_state (const bool inBit, const U
612
624
if (inBit) {
613
625
addMark (inBitCenterSampleNumber, AnalyzerResults::One) ;
614
626
}else {
627
+ addMark (inBitCenterSampleNumber, AnalyzerResults::ErrorX) ;
615
628
enterInErrorMode (inBitCenterSampleNumber) ;
616
629
}
617
630
mFieldBitIndex ++ ;
@@ -697,6 +710,7 @@ void CANFDMolinaroAnalyzer::addBubble (const U8 inBubbleType,
697
710
const U64 endSampleNumber = inBitCenterSampleNumber + mCurrentSamplesPerBit / 2 ;
698
711
frame.mEndingSampleInclusive = endSampleNumber ;
699
712
mResults ->AddFrame (frame) ;
713
+ // mResults->CommitResults () ;
700
714
701
715
FrameV2 frameV2 ;
702
716
switch (inBubbleType) {
@@ -764,27 +778,14 @@ void CANFDMolinaroAnalyzer::addBubble (const U8 inBubbleType,
764
778
mResults ->AddFrameV2 (frameV2, " EOF" , mStartOfFieldSampleNumber , endSampleNumber) ;
765
779
break ;
766
780
case INTERMISSION_FIELD_RESULT :
767
- // { const U64 frameSampleCount = inData1 ;
768
- // const U32 samplesPerBit = mSampleRateHz / mSettings->mBitRate ;
769
- // const U64 length = (frameSampleCount + samplesPerBit / 2) / samplesPerBit ;
770
- // const U64 stuffBitCount = inData2 ;
771
- // const U64 durationMicroSeconds = frameSampleCount * 1000000 / mSampleRateHz ;
772
- // std::stringstream str ;
773
- // str << length << " bits, "
774
- // << durationMicroSeconds << "µs, "
775
- // << stuffBitCount << " stuff bit" << ((inData2 > 1) ? "s" : "") ;
776
- // frameV2.AddString ("Value", str.str ().c_str ()) ;
777
- mResults ->AddFrameV2 (frameV2, " IFS" , mStartOfFieldSampleNumber , endSampleNumber) ;
778
- // }
781
+ mResults ->AddFrameV2 (frameV2, " IFS" , mStartOfFieldSampleNumber , endSampleNumber) ;
779
782
break ;
780
783
case CAN_ERROR_RESULT :
781
784
mResults ->AddFrameV2 (frameV2, " Error" , mStartOfFieldSampleNumber , endSampleNumber) ;
782
785
break ;
783
786
}
784
787
785
788
mResults ->CommitResults () ;
786
-
787
-
788
789
ReportProgress (frame.mEndingSampleInclusive ) ;
789
790
// --- Prepare for next bubble
790
791
mStartOfFieldSampleNumber = endSampleNumber ;
@@ -793,10 +794,9 @@ void CANFDMolinaroAnalyzer::addBubble (const U8 inBubbleType,
793
794
// --------------------------------------------------------------------------------------------------
794
795
795
796
void CANFDMolinaroAnalyzer::enterInErrorMode (const U64 inBitCenterSampleNumber) {
796
- addMark (inBitCenterSampleNumber, AnalyzerResults::ErrorX);
797
- mStartOfFieldSampleNumber = inBitCenterSampleNumber + mCurrentSamplesPerBit / 2 ;
798
- mFrameFieldEngineState = FrameFieldEngineState::DECODER_ERROR ;
797
+ mStartOfFieldSampleNumber = inBitCenterSampleNumber ;
799
798
mCurrentSamplesPerBit = mSampleRateHz / mSettings ->arbitrationBitRate () ;
799
+ mFrameFieldEngineState = DECODER_ERROR ;
800
800
mUnstuffingActive = false ;
801
801
}
802
802
0 commit comments