@ -5,14 +5,19 @@
// HistoryLogModel
HistoryLogModel : : HistoryLogModel ( QObject * parent ) : QAbstractTableModel ( parent ) {
QObject : : connect ( can , & CANMessages : : seekedTo , [ this ] ( ) {
if ( ! msg_id . isEmpty ( ) ) setMessage ( msg_id ) ;
} ) ;
}
QVariant HistoryLogModel : : data ( const QModelIndex & index , int role ) const {
if ( role = = Qt : : DisplayRole ) {
const auto & m = messages [ index . row ( ) ] ;
if ( index . column ( ) = = 0 ) {
return QString : : number ( m . ts , ' f ' , 2 ) ;
return QString : : number ( ( m . mono_ time / ( double ) 1e9 ) - can - > routeStartTime ( ) , ' f ' , 2 ) ;
}
return ! sigs . empty ( ) ? QString : : number ( get_raw_value ( ( uint8_t * ) m . dat . data ( ) , m . dat . size ( ) , * sigs [ index . column ( ) - 1 ] ) )
: toHex ( m . dat ) ;
return ! sigs . empty ( ) ? QString : : number ( m . sig_values [ index . column ( ) - 1 ] ) : toHex ( m . data ) ;
} else if ( role = = Qt : : FontRole & & index . column ( ) = = 1 & & sigs . empty ( ) ) {
return QFontDatabase : : systemFont ( QFontDatabase : : FixedFont ) ;
}
@ -24,6 +29,7 @@ void HistoryLogModel::setMessage(const QString &message_id) {
msg_id = message_id ;
sigs . clear ( ) ;
messages . clear ( ) ;
has_more_data = true ;
if ( auto dbc_msg = dbc ( ) - > msg ( message_id ) ) {
sigs = dbc_msg - > getSignals ( ) ;
}
@ -48,23 +54,60 @@ QVariant HistoryLogModel::headerData(int section, Qt::Orientation orientation, i
}
void HistoryLogModel : : updateState ( ) {
int prev_row_count = messages . size ( ) ;
if ( ! msg_id . isEmpty ( ) ) {
messages = can - > messages ( msg_id ) ;
}
int delta = messages . size ( ) - prev_row_count ;
if ( delta > 0 ) {
beginInsertRows ( { } , prev_row_count , messages . size ( ) - 1 ) ;
endInsertRows ( ) ;
} else if ( delta < 0 ) {
beginRemoveRows ( { } , messages . size ( ) , prev_row_count - 1 ) ;
endRemoveRows ( ) ;
uint64_t last_mono_time = messages . empty ( ) ? 0 : messages . front ( ) . mono_time ;
auto new_msgs = fetchData ( last_mono_time , ( can - > currentSec ( ) + can - > routeStartTime ( ) ) * 1e9 ) ;
if ( ( has_more_data = ! new_msgs . empty ( ) ) ) {
beginInsertRows ( { } , 0 , new_msgs . size ( ) - 1 ) ;
messages . insert ( messages . begin ( ) , std : : move_iterator ( new_msgs . begin ( ) ) , std : : move_iterator ( new_msgs . end ( ) ) ) ;
endInsertRows ( ) ;
}
}
}
void HistoryLogModel : : fetchMore ( const QModelIndex & parent ) {
if ( ! messages . empty ( ) ) {
emit dataChanged ( index ( 0 , 0 ) , index ( rowCount ( ) - 1 , columnCount ( ) - 1 ) , { Qt : : DisplayRole } ) ;
auto new_msgs = fetchData ( 0 , messages . back ( ) . mono_time ) ;
if ( ( has_more_data = ! new_msgs . empty ( ) ) ) {
beginInsertRows ( { } , messages . size ( ) , messages . size ( ) + new_msgs . size ( ) - 1 ) ;
messages . insert ( messages . end ( ) , std : : move_iterator ( new_msgs . begin ( ) ) , std : : move_iterator ( new_msgs . end ( ) ) ) ;
endInsertRows ( ) ;
}
}
}
std : : deque < HistoryLogModel : : Message > HistoryLogModel : : fetchData ( uint64_t min_mono_time , uint64_t max_mono_time ) {
auto events = can - > events ( ) ;
auto it = std : : lower_bound ( events - > begin ( ) , events - > end ( ) , max_mono_time , [ = ] ( auto & e , uint64_t ts ) {
return e - > mono_time < ts ;
} ) ;
if ( it = = events - > end ( ) | | it = = events - > begin ( ) )
return { } ;
std : : deque < HistoryLogModel : : Message > msgs ;
const auto [ src , address ] = DBCManager : : parseId ( msg_id ) ;
uint32_t cnt = 0 ;
for ( - - it ; it ! = events - > begin ( ) & & ( * it ) - > mono_time > min_mono_time ; - - it ) {
if ( ( * it ) - > which = = cereal : : Event : : Which : : CAN ) {
for ( const auto & c : ( * it ) - > event . getCan ( ) ) {
if ( src = = c . getSrc ( ) & & address = = c . getAddress ( ) ) {
const auto dat = c . getDat ( ) ;
auto & m = msgs . emplace_back ( ) ;
m . mono_time = ( * it ) - > mono_time ;
m . data . append ( ( char * ) dat . begin ( ) , dat . size ( ) ) ;
m . sig_values . reserve ( sigs . size ( ) ) ;
for ( const Signal * sig : sigs ) {
m . sig_values . push_back ( get_raw_value ( ( uint8_t * ) dat . begin ( ) , dat . size ( ) , * sig ) ) ;
}
if ( + + cnt > = batch_size & & min_mono_time = = 0 )
return msgs ;
}
}
}
}
return msgs ;
}
// HeaderView
QSize HeaderView : : sectionSizeFromContents ( int logicalIndex ) const {
@ -98,7 +141,3 @@ HistoryLog::HistoryLog(QWidget *parent) : QTableView(parent) {
setFrameShape ( QFrame : : NoFrame ) ;
setSizePolicy ( QSizePolicy : : Preferred , QSizePolicy : : Expanding ) ;
}
int HistoryLog : : sizeHintForColumn ( int column ) const {
return - 1 ;
}