@@ -211,29 +211,40 @@ impl<'a> IbcHandler<'a> {
211211 Err ( e) => bail ! ( "Failed to read event {i}: {e}" ) ,
212212 }
213213 }
214+ let mut base_timestamp: u32 = 0 ;
214215 for i in 0 ..=newest_fault_event_index {
215216 let e = events[ i as usize ] ;
216217 println ! ( "{}" , "FAULT EVENT" . red( ) ) ;
217218 println ! ( " EVENT_INDEX: {i}" ) ;
218- self . print_event ( e, verbose, vout_mode) ;
219+ self . print_event ( e, verbose, vout_mode, & mut base_timestamp ) ;
219220 }
220221 for i in 24 ..=newest_lifecycle_event_index {
221222 let e = events[ i as usize ] ;
222223 println ! ( "{}" , "LIFECYCLE EVENT" . green( ) ) ;
223224 println ! ( " EVENT_INDEX: {i}" ) ;
224- self . print_event ( e, verbose, vout_mode) ;
225+ self . print_event ( e, verbose, vout_mode, & mut base_timestamp ) ;
225226 }
226227
227228 Ok ( ( ) )
228229 }
229230
230- fn print_event ( & self , e : IbcEvent , verbose : bool , vout_mode : u8 ) {
231- println ! (
232- " TIMESTAMP {:#010x} = {}" ,
233- e. timestamp. get( ) ,
234- Self :: format_time( e. timestamp. get( ) )
235- ) ;
236- println ! ( " EVENT_ID {:#06x}" , e. event_id. get( ) ) ;
231+ fn print_event (
232+ & self ,
233+ e : IbcEvent ,
234+ verbose : bool ,
235+ vout_mode : u8 ,
236+ base_timestamp : & mut u32 ,
237+ ) {
238+ // In that case that a log contains no entries, the newest event index
239+ // reported will be the lowest slot for the log type, which will be
240+ // empty. Reading an empty event will return 0xFF in all bytes.
241+ if e. timestamp . get ( ) == u32:: MAX
242+ && e. event_id . get ( ) == u16:: MAX
243+ && e. status_word . get ( ) == u16:: MAX
244+ {
245+ println ! ( " EMPTY" ) ;
246+ return ;
247+ }
237248
238249 // Decoding is extracted from revision A and B of the datasheet, which
239250 // contain non-overlapping sets of decoding information. They don't
@@ -250,6 +261,30 @@ impl<'a> IbcHandler<'a> {
250261 // 28710-FGB 100 378 Rev A (Application Note 326), May 2023
251262
252263 let status_word = e. status_word . get ( ) ;
264+
265+ // When a BOOT_EVENT or TIME_ERASE_EVENT is seen, record the timestamp
266+ // so that the times for following events can be displayed relative to
267+ // this.
268+ if e. status_word . get ( ) == 1 && ( e. status_mfr == 0 || e. status_mfr == 6 )
269+ {
270+ * base_timestamp = e. timestamp . get ( ) ;
271+ }
272+
273+ if * base_timestamp != 0 && * base_timestamp <= e. timestamp . get ( ) {
274+ println ! (
275+ " TIMESTAMP {:#010x} = +{}" ,
276+ e. timestamp. get( ) ,
277+ Self :: format_time( e. timestamp. get( ) - * base_timestamp)
278+ ) ;
279+ } else {
280+ println ! (
281+ " TIMESTAMP {:#010x} = {}" ,
282+ e. timestamp. get( ) ,
283+ Self :: format_time( e. timestamp. get( ) )
284+ ) ;
285+ }
286+ println ! ( " EVENT_ID {:#06x}" , e. event_id. get( ) ) ;
287+
253288 println ! ( " STATUS_WORD {:#06x}" , status_word) ;
254289 for ( bit, name) in [
255290 ( 0 , "System event" ) ,
0 commit comments