@@ -219,6 +219,33 @@ void FlexRayAnalyzer::WorkerThread()
219219 *packet_has_segments = true ;
220220 };
221221
222+ auto add_visual_segment = [&]( U64 start_sample, U64 end_sample, U8 frame_type, U8 frame_flags, const std::string& short_text,
223+ const std::string& long_text, bool * packet_has_segments = nullptr ) {
224+ Frame frame;
225+ frame.mStartingSampleInclusive = start_sample;
226+ frame.mEndingSampleInclusive = std::max ( start_sample, end_sample );
227+ frame.mData1 = 0 ;
228+ frame.mData2 = 0 ;
229+ frame.mType = frame_type;
230+ frame.mFlags = frame_flags;
231+
232+ FlexRaySegmentRecord record;
233+ record.mShortText = short_text;
234+ record.mLongText = long_text.empty () ? short_text : long_text;
235+ mResults ->AddFlexRaySegment ( frame, std::move ( record ) );
236+
237+ if ( packet_has_segments != nullptr )
238+ *packet_has_segments = true ;
239+ };
240+
241+ auto add_frame_v2_only = [&]( U64 start_sample, U64 end_sample, const char * frame_v2_type,
242+ const std::function<void ( FrameV2& )>& populate_frame_v2 ) {
243+ FrameV2 frame_v2;
244+ if ( populate_frame_v2 )
245+ populate_frame_v2 ( frame_v2 );
246+ mResults ->AddFrameV2 ( frame_v2, frame_v2_type, start_sample, std::max ( start_sample, end_sample ) );
247+ };
248+
222249 auto commit_record = [&]( U64 start_sample, U64 end_sample, U8 frame_flags, FlexRayFrameRecord record ) {
223250 record.mStartSample = start_sample;
224251 record.mEndSample = end_sample;
@@ -448,7 +475,8 @@ void FlexRayAnalyzer::WorkerThread()
448475 return true ;
449476 };
450477
451- auto read_extended_byte = [&]( U8& value, std::string& error_text, U64* byte_start_sample = nullptr , U64* byte_end_sample = nullptr ) -> bool {
478+ auto read_extended_byte = [&]( U8& value, std::string& error_text, U64* byte_start_sample = nullptr , U64* byte_end_sample = nullptr ,
479+ std::vector<U64>* data_bit_samples = nullptr ) -> bool {
452480 U64 sample_number = 0 ;
453481
454482 if ( read_expected_bit ( 1 , " BSS high" , error_text, &sample_number ) == false )
@@ -471,6 +499,9 @@ void FlexRayAnalyzer::WorkerThread()
471499 value = static_cast <U8>( ( value << 1 ) | sampled_bit );
472500 ++bit_index;
473501
502+ if ( data_bit_samples != nullptr )
503+ data_bit_samples->push_back ( sample_number );
504+
474505 if ( byte_end_sample != nullptr )
475506 *byte_end_sample = sample_number;
476507 }
@@ -495,6 +526,10 @@ void FlexRayAnalyzer::WorkerThread()
495526
496527 std::vector<U8> header_bytes;
497528 header_bytes.reserve ( kHeaderByteCount );
529+ std::vector<U64> header_bit_samples;
530+ header_bit_samples.reserve ( kHeaderByteCount * 8 );
531+ std::vector<U64> header_byte_start_samples;
532+ header_byte_start_samples.reserve ( kHeaderByteCount );
498533 std::string syntax_error;
499534
500535 U8 first_bss_high = 0 ;
@@ -503,6 +538,7 @@ void FlexRayAnalyzer::WorkerThread()
503538 last_sample = header_start_sample;
504539 if ( first_bss_high != 1 )
505540 continue ;
541+ header_byte_start_samples.push_back ( header_start_sample );
506542 ++bit_index;
507543
508544 U8 first_bss_low = 0 ;
@@ -545,6 +581,7 @@ void FlexRayAnalyzer::WorkerThread()
545581 U64 sample_number = 0 ;
546582 read_bit ( bit_index, sampled_bit, sample_number );
547583 last_sample = sample_number;
584+ header_bit_samples.push_back ( sample_number );
548585 first_header_byte = static_cast <U8>( ( first_header_byte << 1 ) | sampled_bit );
549586 ++bit_index;
550587 }
@@ -557,10 +594,11 @@ void FlexRayAnalyzer::WorkerThread()
557594 U64 byte_start_sample = 0 ;
558595 U64 byte_end_sample = 0 ;
559596
560- if ( read_extended_byte ( header_byte, syntax_error, &byte_start_sample, &byte_end_sample ) == false )
597+ if ( read_extended_byte ( header_byte, syntax_error, &byte_start_sample, &byte_end_sample, &header_bit_samples ) == false )
561598 break ;
562599
563600 header_bytes.push_back ( header_byte );
601+ header_byte_start_samples.push_back ( byte_start_sample );
564602 header_end_sample = byte_end_sample;
565603 }
566604
@@ -596,20 +634,58 @@ void FlexRayAnalyzer::WorkerThread()
596634 header_text << " ID " << format_hex ( record.mFrameId , 3 )
597635 << " Cyc " << static_cast <U32>( record.mCycle )
598636 << " Len " << static_cast <U32>( record.mPayloadLengthWords ) * 2 << " B" ;
599- add_segment ( segment_start ( header_start_sample ), segment_end ( header_end_sample ), FlexRayHeaderField, 0 , " Hdr" ,
600- header_text.str (), " header_field" , &packet_has_segments, [&]( FrameV2& frame_v2 ) {
601- frame_v2.AddString ( " identifier" , format_hex ( record.mFrameId , 3 ).c_str () );
602- frame_v2.AddByte ( " cycle" , record.mCycle );
603- frame_v2.AddByte ( " payload_length_words" , record.mPayloadLengthWords );
604- frame_v2.AddByte ( " payload_length_bytes" , static_cast <U8>( record.mPayloadLengthWords * 2 ) );
605- frame_v2.AddBoolean ( " reserved_bit" , record.mReservedBit );
606- frame_v2.AddBoolean ( " payload_preamble" , record.mPayloadPreamble );
607- frame_v2.AddBoolean ( " null_frame" , record.mNullFrame );
608- frame_v2.AddBoolean ( " sync_frame" , record.mSyncFrame );
609- frame_v2.AddBoolean ( " startup_frame" , record.mStartupFrame );
610- frame_v2.AddString ( " header_crc" , format_hex ( record.mHeaderCrc , 3 ).c_str () );
611- frame_v2.AddBoolean ( " header_crc_ok" , record.mHeaderCrcOk );
612- } );
637+ add_frame_v2_only ( segment_start ( header_start_sample ), segment_end ( header_end_sample ), " header_field" , [&]( FrameV2& frame_v2 ) {
638+ frame_v2.AddString ( " identifier" , format_hex ( record.mFrameId , 3 ).c_str () );
639+ frame_v2.AddByte ( " cycle" , record.mCycle );
640+ frame_v2.AddByte ( " payload_length_words" , record.mPayloadLengthWords );
641+ frame_v2.AddByte ( " payload_length_bytes" , static_cast <U8>( record.mPayloadLengthWords * 2 ) );
642+ frame_v2.AddBoolean ( " reserved_bit" , record.mReservedBit );
643+ frame_v2.AddBoolean ( " payload_preamble" , record.mPayloadPreamble );
644+ frame_v2.AddBoolean ( " null_frame" , record.mNullFrame );
645+ frame_v2.AddBoolean ( " sync_frame" , record.mSyncFrame );
646+ frame_v2.AddBoolean ( " startup_frame" , record.mStartupFrame );
647+ frame_v2.AddString ( " header_crc" , format_hex ( record.mHeaderCrc , 3 ).c_str () );
648+ frame_v2.AddBoolean ( " header_crc_ok" , record.mHeaderCrcOk );
649+ } );
650+
651+ if ( header_bit_samples.size () == ( kHeaderByteCount * 8 ) && header_byte_start_samples.size () == kHeaderByteCount )
652+ {
653+ auto header_subfield_start_sample = [&]( U32 bit_offset ) {
654+ if ( ( bit_offset % 8 ) == 0 )
655+ return header_byte_start_samples.at ( bit_offset / 8 );
656+
657+ return segment_start ( header_bit_samples.at ( bit_offset ) );
658+ };
659+
660+ auto add_header_subfield = [&]( U32 bit_offset, U32 bit_count, const std::string& short_text, const std::string& long_text ) {
661+ add_visual_segment ( header_subfield_start_sample ( bit_offset ),
662+ segment_end ( header_bit_samples.at ( bit_offset + bit_count - 1 ) ), FlexRayHeaderField, 0 ,
663+ short_text, long_text, &packet_has_segments );
664+ };
665+
666+ add_header_subfield ( 0 , 5 , " Flg" , " Header flags" );
667+ add_header_subfield ( 5 , 11 , " ID " + format_hex ( record.mFrameId , 3 ), " Frame identifier " + format_hex ( record.mFrameId , 3 ) );
668+
669+ {
670+ std::ostringstream length_text;
671+ length_text << " Len " << static_cast <U32>( record.mPayloadLengthWords ) * 2 << " B" ;
672+ add_header_subfield ( 16 , 7 , length_text.str (), " Payload length " + length_text.str ().substr ( 4 ) );
673+ }
674+
675+ add_header_subfield ( 23 , 11 , " HCRC " + format_hex ( record.mHeaderCrc , 3 ),
676+ " Header CRC " + format_hex ( record.mHeaderCrc , 3 ) );
677+
678+ {
679+ std::ostringstream cycle_text;
680+ cycle_text << " Cyc " << static_cast <U32>( record.mCycle );
681+ add_header_subfield ( 34 , 6 , cycle_text.str (), " Cycle " + std::to_string ( static_cast <U32>( record.mCycle ) ) );
682+ }
683+ }
684+ else
685+ {
686+ add_visual_segment ( segment_start ( header_start_sample ), segment_end ( header_end_sample ), FlexRayHeaderField, 0 , " Hdr" ,
687+ header_text.str (), &packet_has_segments );
688+ }
613689 }
614690
615691 std::vector<U8> payload_bits;
0 commit comments