| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -161,6 +161,8 @@ void CanData::compute(const char *can_data, const int size, double current_sec, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    bit_change_counts.resize(size); | 
					 | 
					 | 
					 | 
					    bit_change_counts.resize(size); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    colors = QVector(size, QColor(0, 0, 0, 0)); | 
					 | 
					 | 
					 | 
					    colors = QVector(size, QColor(0, 0, 0, 0)); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    last_change_t = QVector(size, ts); | 
					 | 
					 | 
					 | 
					    last_change_t = QVector(size, ts); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    last_delta.resize(size); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    same_delta_counter.resize(size); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else { | 
					 | 
					 | 
					 | 
					  } else { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    bool lighter = settings.theme == DARK_THEME; | 
					 | 
					 | 
					 | 
					    bool lighter = settings.theme == DARK_THEME; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    const QColor &cyan = !lighter ? CYAN : CYAN_LIGHTER; | 
					 | 
					 | 
					 | 
					    const QColor &cyan = !lighter ? CYAN : CYAN_LIGHTER; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -170,10 +172,20 @@ void CanData::compute(const char *can_data, const int size, double current_sec, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for (int i = 0; i < size; ++i) { | 
					 | 
					 | 
					 | 
					    for (int i = 0; i < size; ++i) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      const uint8_t last = dat[i]; | 
					 | 
					 | 
					 | 
					      const uint8_t last = dat[i]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      const uint8_t cur = can_data[i]; | 
					 | 
					 | 
					 | 
					      const uint8_t cur = can_data[i]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      const int delta = cur - last; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (last != cur) { | 
					 | 
					 | 
					 | 
					      if (last != cur) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        double delta_t = ts - last_change_t[i]; | 
					 | 
					 | 
					 | 
					        double delta_t = ts - last_change_t[i]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (delta_t * freq > periodic_threshold) { | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        // Keep track if signal is changing randomly, or mostly moving in the same direction
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (std::signbit(delta) == std::signbit(last_delta[i])) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          same_delta_counter[i] = std::min(16, same_delta_counter[i] + 1); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        } else { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          same_delta_counter[i] = std::max(0, same_delta_counter[i] - 4); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        // Mostly moves in the same direction, color based on delta up/down
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (delta_t * freq > periodic_threshold || same_delta_counter[i] > 8) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          // Last change was while ago, choose color based on delta up or down
 | 
					 | 
					 | 
					 | 
					          // Last change was while ago, choose color based on delta up or down
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          colors[i] = (cur > last) ? cyan : red; | 
					 | 
					 | 
					 | 
					          colors[i] = (cur > last) ? cyan : red; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        } else { | 
					 | 
					 | 
					 | 
					        } else { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -190,6 +202,7 @@ void CanData::compute(const char *can_data, const int size, double current_sec, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        } | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        last_change_t[i] = ts; | 
					 | 
					 | 
					 | 
					        last_change_t[i] = ts; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        last_delta[i] = delta; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      } else { | 
					 | 
					 | 
					 | 
					      } else { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // Fade out
 | 
					 | 
					 | 
					 | 
					        // Fade out
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        float alpha_delta = 1.0 / (freq + 1) / (fade_time * playback_speed); | 
					 | 
					 | 
					 | 
					        float alpha_delta = 1.0 / (freq + 1) / (fade_time * playback_speed); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |