33#include < AnalyzerChannelData.h>
44#include < algorithm>
55#include < cmath>
6+ #include < functional>
67#include < iomanip>
78#include < sstream>
89#include < vector>
@@ -177,7 +178,8 @@ void FlexRayAnalyzer::WorkerThread()
177178 };
178179
179180 auto add_segment = [&]( U64 start_sample, U64 end_sample, U8 frame_type, U8 frame_flags, const std::string& short_text,
180- const std::string& long_text, const char * frame_v2_type, bool * packet_has_segments = nullptr ) {
181+ const std::string& long_text, const char * frame_v2_type, bool * packet_has_segments = nullptr ,
182+ const std::function<void ( FrameV2& )>& populate_frame_v2 = std::function<void ( FrameV2& )>() ) {
181183 Frame frame;
182184 frame.mStartingSampleInclusive = start_sample;
183185 frame.mEndingSampleInclusive = std::max ( start_sample, end_sample );
@@ -192,8 +194,8 @@ void FlexRayAnalyzer::WorkerThread()
192194 mResults ->AddFlexRaySegment ( frame, std::move ( record ) );
193195
194196 FrameV2 frame_v2;
195- frame_v2. AddString ( " label " , short_text. c_str () );
196- frame_v2. AddString ( " description " , long_text. empty () ? short_text. c_str () : long_text. c_str () );
197+ if ( populate_frame_v2 )
198+ populate_frame_v2 ( frame_v2 );
197199 mResults ->AddFrameV2 ( frame_v2, frame_v2_type, frame.mStartingSampleInclusive , frame.mEndingSampleInclusive );
198200
199201 if ( packet_has_segments != nullptr )
@@ -289,7 +291,11 @@ void FlexRayAnalyzer::WorkerThread()
289291 const U64 wakeup_end_sample = first_edge_after_tss > 0 ? first_edge_after_tss - 1 : first_edge_after_tss;
290292 std::ostringstream wakeup_text;
291293 wakeup_text << " Wakeup symbol (" << observed_tss_bits << " low, " << observed_post_low_high_bits << " idle bits)" ;
292- add_segment ( tss_start_sample, wakeup_end_sample, FlexRayWakeupSymbolField, 0 , " WUS" , wakeup_text.str (), " wakeup_symbol" );
294+ add_segment ( tss_start_sample, wakeup_end_sample, FlexRayWakeupSymbolField, 0 , " WUS" , wakeup_text.str (), " wakeup_symbol" , nullptr ,
295+ [&]( FrameV2& frame_v2 ) {
296+ frame_v2.AddByte ( " low_bits" , static_cast <U8>( observed_tss_bits ) );
297+ frame_v2.AddByte ( " idle_bits" , static_cast <U8>( observed_post_low_high_bits ) );
298+ } );
293299
294300 if ( have_pending_wakeup_pattern == true &&
295301 static_cast <double >( tss_start_sample - pending_wakeup_last_low_start_sample ) + ( bit_width * 0.25 ) <= maximum_wakeup_window_samples )
@@ -336,7 +342,7 @@ void FlexRayAnalyzer::WorkerThread()
336342 auto commit_packet = [&]( U64 end_sample, U8 frame_flags, FlexRayFrameRecord record ) {
337343 if ( record.mIsError == true && packet_has_segments == false )
338344 add_segment ( tss_start_sample, end_sample, FlexRayErrorField, DISPLAY_AS_ERROR_FLAG, " Err" , record.mErrorText , " error_field" ,
339- &packet_has_segments );
345+ &packet_has_segments, [&]( FrameV2& frame_v2 ) { frame_v2. AddString ( " error " , record. mErrorText . c_str () ); } );
340346
341347 commit_record ( tss_start_sample, end_sample, frame_flags, std::move ( record ) );
342348 };
@@ -459,7 +465,8 @@ void FlexRayAnalyzer::WorkerThread()
459465 if ( observed_tss_bits >= kCasRxLowMinBits && observed_tss_bits <= kCasRxLowMaxBits )
460466 {
461467 add_segment ( tss_start_sample, last_sample + end_padding_samples, FlexRayCasField, 0 , " CAS" , " Collision avoidance symbol" , " cas_field" ,
462- &packet_has_segments );
468+ &packet_has_segments,
469+ [&]( FrameV2& frame_v2 ) { frame_v2.AddByte ( " low_bits" , static_cast <U8>( observed_tss_bits ) ); } );
463470 record.mSymbolName = " CAS" ;
464471 packet_end_sample = last_sample + end_padding_samples;
465472 commit_packet ( packet_end_sample, 0 , std::move ( record ) );
@@ -469,7 +476,8 @@ void FlexRayAnalyzer::WorkerThread()
469476 ++bit_index;
470477
471478 add_segment ( tss_start_sample, tss_end_sample > 0 ? ( tss_end_sample - 1 ) : tss_end_sample, FlexRayTssField, 0 ,
472- " TSS" , " Transmission start sequence" , " tss_field" , &packet_has_segments );
479+ " TSS" , " Transmission start sequence" , " tss_field" , &packet_has_segments,
480+ [&]( FrameV2& frame_v2 ) { frame_v2.AddByte ( " low_bits" , static_cast <U8>( observed_tss_bits ) ); } );
473481 add_segment ( segment_start ( fss_sample ), segment_end ( fss_sample ), FlexRayFssField, 0 , " FSS" , " Frame start sequence" , " fss_field" ,
474482 &packet_has_segments );
475483
@@ -532,7 +540,19 @@ void FlexRayAnalyzer::WorkerThread()
532540 << " Cyc " << static_cast <U32>( record.mCycle )
533541 << " Len " << static_cast <U32>( record.mPayloadLengthWords ) * 2 << " B" ;
534542 add_segment ( segment_start ( header_start_sample ), segment_end ( header_end_sample ), FlexRayHeaderField, 0 , " Hdr" ,
535- header_text.str (), " header_field" , &packet_has_segments );
543+ header_text.str (), " header_field" , &packet_has_segments, [&]( FrameV2& frame_v2 ) {
544+ frame_v2.AddString ( " identifier" , format_hex ( record.mFrameId , 3 ).c_str () );
545+ frame_v2.AddByte ( " cycle" , record.mCycle );
546+ frame_v2.AddByte ( " payload_length_words" , record.mPayloadLengthWords );
547+ frame_v2.AddByte ( " payload_length_bytes" , static_cast <U8>( record.mPayloadLengthWords * 2 ) );
548+ frame_v2.AddBoolean ( " reserved_bit" , record.mReservedBit );
549+ frame_v2.AddBoolean ( " payload_preamble" , record.mPayloadPreamble );
550+ frame_v2.AddBoolean ( " null_frame" , record.mNullFrame );
551+ frame_v2.AddBoolean ( " sync_frame" , record.mSyncFrame );
552+ frame_v2.AddBoolean ( " startup_frame" , record.mStartupFrame );
553+ frame_v2.AddString ( " header_crc" , format_hex ( record.mHeaderCrc , 3 ).c_str () );
554+ frame_v2.AddBoolean ( " header_crc_ok" , record.mHeaderCrcOk );
555+ } );
536556 }
537557
538558 std::vector<U8> payload_bits;
@@ -554,7 +574,11 @@ void FlexRayAnalyzer::WorkerThread()
554574 std::ostringstream payload_text;
555575 payload_text << " Payload[" << payload_index << " ] 0x" << format_hex_byte ( payload_byte );
556576 add_segment ( segment_start ( payload_start_sample ), segment_end ( payload_end_sample ), FlexRayPayloadByteField, 0 ,
557- format_hex_byte ( payload_byte ), payload_text.str (), " payload_byte" , &packet_has_segments );
577+ format_hex_byte ( payload_byte ), payload_text.str (), " payload_byte" , &packet_has_segments,
578+ [&]( FrameV2& frame_v2 ) {
579+ frame_v2.AddByte ( " index" , static_cast <U8>( payload_index ) );
580+ frame_v2.AddByte ( " data" , payload_byte );
581+ } );
558582 }
559583
560584 if ( syntax_error.empty () == false )
@@ -608,7 +632,11 @@ void FlexRayAnalyzer::WorkerThread()
608632 std::ostringstream crc_text;
609633 crc_text << " Frame CRC " << format_hex ( record.mFrameCrc , 6 ) << ( record.mFrameCrcOk ? " OK" : " BAD" );
610634 add_segment ( segment_start ( frame_crc_start_sample ), segment_end ( frame_crc_end_sample ), FlexRayFrameCrcField,
611- record.mFrameCrcOk ? 0 : DISPLAY_AS_ERROR_FLAG, " FCRC" , crc_text.str (), " frame_crc_field" , &packet_has_segments );
635+ record.mFrameCrcOk ? 0 : DISPLAY_AS_ERROR_FLAG, " FCRC" , crc_text.str (), " frame_crc_field" , &packet_has_segments,
636+ [&]( FrameV2& frame_v2 ) {
637+ frame_v2.AddString ( " crc" , format_hex ( record.mFrameCrc , 6 ).c_str () );
638+ frame_v2.AddBoolean ( " crc_ok" , record.mFrameCrcOk );
639+ } );
612640 }
613641
614642 U64 fes_low_sample = 0 ;
@@ -662,7 +690,8 @@ void FlexRayAnalyzer::WorkerThread()
662690 std::ostringstream dts_text;
663691 dts_text << " Dynamic trailing sequence (" << record.mDtsBits << " bits)" ;
664692 add_segment ( segment_start ( dts_start_sample ), segment_end ( dts_end_sample ), FlexRayDtsField, 0 , " DTS" , dts_text.str (),
665- " dts_field" , &packet_has_segments );
693+ " dts_field" , &packet_has_segments,
694+ [&]( FrameV2& frame_v2 ) { frame_v2.AddByte ( " dts_bits" , static_cast <U8>( record.mDtsBits ) ); } );
666695 packet_end_sample = segment_end ( dts_end_sample );
667696 }
668697
@@ -698,7 +727,11 @@ void FlexRayAnalyzer::WorkerThread()
698727 cid_text << " , truncated" ;
699728 cid_text << " )" ;
700729 add_segment ( segment_start ( cid_start_sample ), segment_end ( cid_end_sample ), FlexRayCidField,
701- record.mCidOk ? 0 : DISPLAY_AS_WARNING_FLAG, " CID" , cid_text.str (), " cid_field" , &packet_has_segments );
730+ record.mCidOk ? 0 : DISPLAY_AS_WARNING_FLAG, " CID" , cid_text.str (), " cid_field" , &packet_has_segments,
731+ [&]( FrameV2& frame_v2 ) {
732+ frame_v2.AddByte ( " cid_bits" , static_cast <U8>( record.mCidBits ) );
733+ frame_v2.AddBoolean ( " cid_ok" , record.mCidOk );
734+ } );
702735 packet_end_sample = segment_end ( cid_end_sample );
703736 }
704737 }
@@ -736,7 +769,11 @@ void FlexRayAnalyzer::WorkerThread()
736769 cid_text << " , truncated" ;
737770 cid_text << " )" ;
738771 add_segment ( segment_start ( cid_start_sample ), segment_end ( cid_end_sample ), FlexRayCidField,
739- record.mCidOk ? 0 : DISPLAY_AS_WARNING_FLAG, " CID" , cid_text.str (), " cid_field" , &packet_has_segments );
772+ record.mCidOk ? 0 : DISPLAY_AS_WARNING_FLAG, " CID" , cid_text.str (), " cid_field" , &packet_has_segments,
773+ [&]( FrameV2& frame_v2 ) {
774+ frame_v2.AddByte ( " cid_bits" , static_cast <U8>( record.mCidBits ) );
775+ frame_v2.AddBoolean ( " cid_ok" , record.mCidOk );
776+ } );
740777 packet_end_sample = segment_end ( cid_end_sample );
741778 }
742779
0 commit comments