Skip to content

Commit b425744

Browse files
committed
split header fields
1 parent e1063fe commit b425744

1 file changed

Lines changed: 92 additions & 16 deletions

File tree

src/FlexRayAnalyzer.cpp

Lines changed: 92 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)