@ -5,6 +5,8 @@ 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# include  <QTimer> # include  <QTimer>  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  const  int  EVENT_NEXT_BUFFER_SIZE  =  6  *  1024  *  1024 ;   // 6MB
  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					AbstractStream  * can  =  nullptr ; AbstractStream  * can  =  nullptr ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					StreamNotifier  * StreamNotifier : : instance ( )  { StreamNotifier  * StreamNotifier : : instance ( )  {  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -12,8 +14,11 @@ StreamNotifier *StreamNotifier::instance() { 
			
		
	
		
		
			
				
					
					  return  & notifier ;    return  & notifier ;   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					AbstractStream : : AbstractStream ( QObject  * parent )  :  new_msgs ( new  QHash < MessageId ,  CanData > ( ) ) ,  QObject ( parent )  { AbstractStream : : AbstractStream ( QObject  * parent )  :  QObject ( parent )  {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  assert ( parent  ! =  nullptr ) ;    assert ( parent  ! =  nullptr ) ;   
			
		
	
		
		
			
				
					
					  new_msgs  =  std : : make_unique < QHash < MessageId ,  CanData > > ( ) ;   
			
		
	
		
		
			
				
					
					  event_buffer  =  std : : make_unique < MonotonicBuffer > ( EVENT_NEXT_BUFFER_SIZE ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  QObject : : connect ( this ,  & AbstractStream : : seekedTo ,  this ,  & AbstractStream : : updateLastMsgsTo ) ;    QObject : : connect ( this ,  & AbstractStream : : seekedTo ,  this ,  & AbstractStream : : updateLastMsgsTo ) ;   
			
		
	
		
		
			
				
					
					  QObject : : connect ( & settings ,  & Settings : : changed ,  this ,  & AbstractStream : : updateMasks ) ;    QObject : : connect ( & settings ,  & Settings : : changed ,  this ,  & AbstractStream : : updateMasks ) ;   
			
		
	
		
		
			
				
					
					  QObject : : connect ( dbc ( ) ,  & DBCManager : : DBCFileChanged ,  this ,  & AbstractStream : : updateMasks ) ;    QObject : : connect ( dbc ( ) ,  & DBCManager : : DBCFileChanged ,  this ,  & AbstractStream : : updateMasks ) ;   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -129,37 +134,25 @@ void AbstractStream::updateLastMsgsTo(double sec) { 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					void  AbstractStream : : mergeEvents ( std : : vector < Event  * > : : const_iterator  first ,  std : : vector < Event  * > : : const_iterator  last )  { void  AbstractStream : : mergeEvents ( std : : vector < Event  * > : : const_iterator  first ,  std : : vector < Event  * > : : const_iterator  last )  {  
			
		
	
		
		
			
				
					
					  size_t  memory_size  =  0 ;    static  std : : unordered_map < MessageId ,  std : : deque < const  CanEvent  * > >  new_events_map ;   
			
				
				
			
		
	
		
		
			
				
					
					  size_t  events_cnt  =  0 ;    static   std : : vector < const  CanEvent  * >  new_events ;   
			
				
				
			
		
	
		
		
			
				
					
					  for  ( auto  it  =  first ;  it  ! =  last ;  + + it )  {    new_events_map . clear ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    if  ( ( * it ) - > which  = =  cereal : : Event : : Which : : CAN )  {    new_events . clear ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					      for  ( const  auto  & c  :  ( * it ) - > event . getCan ( ) )  {   
			
		
	
		
		
			
				
					
					        memory_size  + =  sizeof ( CanEvent )  +  sizeof ( uint8_t )  *  c . getDat ( ) . size ( ) ;   
			
		
	
		
		
			
				
					
					        + + events_cnt ;   
			
		
	
		
		
			
				
					
					      }   
			
		
	
		
		
			
				
					
					    }   
			
		
	
		
		
			
				
					
					  }   
			
		
	
		
		
			
				
					
					  if  ( memory_size  = =  0 )  return ;   
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  char  * ptr  =  memory_blocks . emplace_back ( new  char [ memory_size ] ) . get ( ) ;   
			
		
	
		
		
			
				
					
					  std : : unordered_map < MessageId ,  std : : deque < const  CanEvent  * > >  new_events_map ;   
			
		
	
		
		
			
				
					
					  std : : vector < const  CanEvent  * >  new_events ;   
			
		
	
		
		
			
				
					
					  new_events . reserve ( events_cnt ) ;   
			
		
	
		
		
			
				
					
					  for  ( auto  it  =  first ;  it  ! =  last ;  + + it )  {    for  ( auto  it  =  first ;  it  ! =  last ;  + + it )  {   
			
		
	
		
		
			
				
					
					    if  ( ( * it ) - > which  = =  cereal : : Event : : Which : : CAN )  {      if  ( ( * it ) - > which  = =  cereal : : Event : : Which : : CAN )  {   
			
		
	
		
		
			
				
					
					      uint64_t  ts  =  ( * it ) - > mono_time ;        uint64_t  ts  =  ( * it ) - > mono_time ;   
			
		
	
		
		
			
				
					
					      for  ( const  auto  & c  :  ( * it ) - > event . getCan ( ) )  {        for  ( const  auto  & c  :  ( * it ) - > event . getCan ( ) )  {   
			
		
	
		
		
			
				
					
					        CanEvent  * e  =  ( CanEvent  * ) ptr ;          auto  dat  =  c . getDat ( ) ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					        CanEvent  * e  =  ( CanEvent  * ) event_buffer - > allocate ( sizeof ( CanEvent )  +  sizeof ( uint8_t )  *  dat . size ( ) ) ;   
			
		
	
		
		
			
				
					
					        e - > src  =  c . getSrc ( ) ;          e - > src  =  c . getSrc ( ) ;   
			
		
	
		
		
			
				
					
					        e - > address  =  c . getAddress ( ) ;          e - > address  =  c . getAddress ( ) ;   
			
		
	
		
		
			
				
					
					        e - > mono_time  =  ts ;          e - > mono_time  =  ts ;   
			
		
	
		
		
			
				
					
					        auto  dat  =  c . getDat ( ) ;   
			
		
	
		
		
			
				
					
					        e - > size  =  dat . size ( ) ;          e - > size  =  dat . size ( ) ;   
			
		
	
		
		
			
				
					
					        memcpy ( e - > dat ,  ( uint8_t  * ) dat . begin ( ) ,  e - > size ) ;          memcpy ( e - > dat ,  ( uint8_t  * ) dat . begin ( ) ,  e - > size ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					        new_events_map [ { . source  =  e - > src ,  . address  =  e - > address } ] . push_back ( e ) ;          new_events_map [ { . source  =  e - > src ,  . address  =  e - > address } ] . push_back ( e ) ;   
			
		
	
		
		
			
				
					
					        new_events . push_back ( e ) ;          new_events . push_back ( e ) ;   
			
		
	
		
		
			
				
					
					        ptr  + =  sizeof ( CanEvent )  +  sizeof ( uint8_t )  *  e - > size ;   
			
		
	
		
		
			
				
					
					      }        }   
			
		
	
		
		
			
				
					
					    }      }   
			
		
	
		
		
			
				
					
					  }    }   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -168,17 +161,14 @@ void AbstractStream::mergeEvents(std::vector<Event *>::const_iterator first, std 
			
		
	
		
		
			
				
					
					    return  l - > mono_time  <  r - > mono_time ;      return  l - > mono_time  <  r - > mono_time ;   
			
		
	
		
		
			
				
					
					  } ;    } ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  bool  append  =  new_events . front ( ) - > mono_time  >  lastest_event_ts ;   
			
		
	
		
		
			
				
					
					  for  ( auto  & [ id ,  new_e ]  :  new_events_map )  {    for  ( auto  & [ id ,  new_e ]  :  new_events_map )  {   
			
		
	
		
		
			
				
					
					    auto  & e  =  events_ [ id ] ;      auto  & e  =  events_ [ id ] ;   
			
		
	
		
		
			
				
					
					    auto  pos  =  append  ?  e . end ( )      auto  insert_pos  =  std : : upper_bound ( e . cbegin ( ) ,  e . cend ( ) ,  new_e . front ( ) ,  compare ) ;   
			
				
				
			
		
	
		
		
			
				
					
					                      :  std : : upper_bound ( e . cbegin ( ) ,  e . cend ( ) ,  new_e . front ( ) ,  compare ) ;      e . insert ( insert_pos ,  new_e . cbegin ( ) ,  new_e . cend ( ) ) ;   
			
				
				
			
		
	
		
		
			
				
					
					    e . insert ( pos ,  new_e . cbegin ( ) ,  new_e . cend ( ) ) ;   
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					  }    }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  auto  pos  =  append  ?  all_events_ . end ( )    auto  insert_pos  =  std : : upper_bound ( all_events_ . cbegin ( ) ,  all_events_ . cend ( ) ,  new_events . front ( ) ,  compare ) ;   
			
				
				
			
		
	
		
		
			
				
					
					                    :  std : : upper_bound ( all_events_ . begin ( ) ,  all_events_ . end ( ) ,  new_events . front ( ) ,  compare ) ;    all_events_ . insert ( insert_pos ,  new_events . cbegin ( ) ,  new_events . cend ( ) ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  all_events_ . insert ( pos ,  new_events . cbegin ( ) ,  new_events . cend ( ) ) ;   
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  lastest_event_ts  =  all_events_ . back ( ) - > mono_time ;    lastest_event_ts  =  all_events_ . back ( ) - > mono_time ;   
			
		
	
		
		
			
				
					
					  emit  eventsMerged ( ) ;    emit  eventsMerged ( ) ;