@@ -4,9 +4,8 @@ use chrono::Utc;
4
4
use pcan_basic:: socket:: usb:: UsbCanSocket ;
5
5
use slint:: { Model , VecModel , Weak } ;
6
6
use slint:: { ModelRc , SharedString } ;
7
- use socketcan:: CanInterface ;
8
7
#[ cfg( target_os = "linux" ) ]
9
- use socketcan:: { CanSocket , EmbeddedFrame , Frame , Socket } ;
8
+ use socketcan:: { CanInterface , CanSocket , EmbeddedFrame , Frame , Socket } ;
10
9
use std:: collections:: HashMap ;
11
10
use std:: fmt:: Write ;
12
11
use std:: rc:: Rc ;
@@ -136,8 +135,17 @@ impl<'a> CanHandler<'a> {
136
135
#[ cfg( target_os = "windows" ) ]
137
136
fn process_ui_events ( & mut self , dbc : DBC ) {
138
137
use pcan_basic:: socket:: RecvCan ;
139
-
138
+ let mut start_bus_load = Instant :: now ( ) ;
139
+ let mut total_bits = 0 ;
140
140
loop {
141
+ let busload = if start_bus_load. elapsed ( ) >= Duration :: from_millis ( 1000 ) {
142
+ start_bus_load = Instant :: now ( ) ;
143
+ let bus_load = ( total_bits as f64 / 250000_f64 ) * 100.0 ;
144
+ total_bits = 0 ;
145
+ bus_load
146
+ } else {
147
+ 0.0
148
+ } ;
141
149
let _ = self . ui_handle . upgrade_in_event_loop ( move |ui| unsafe {
142
150
if ui. get_is_new_dbc ( ) {
143
151
if ui. get_is_first_open ( ) {
@@ -147,6 +155,9 @@ impl<'a> CanHandler<'a> {
147
155
}
148
156
ui. set_is_new_dbc ( false ) ;
149
157
}
158
+ if busload > 0.0 {
159
+ ui. set_bus_load ( busload as i32 ) ;
160
+ }
150
161
} ) ;
151
162
unsafe {
152
163
if NEW_DBC_CHECK {
@@ -155,6 +166,7 @@ impl<'a> CanHandler<'a> {
155
166
}
156
167
}
157
168
if let Ok ( frame) = self . iface . recv_frame ( ) {
169
+ total_bits += ( frame. dlc ( ) as u32 + 6 ) * 8 ; // Data length + overhead (approximation)
158
170
let id = frame. can_id ( ) ;
159
171
let frame_id = id & !0x80000000 ;
160
172
for message in dbc. messages ( ) {
@@ -178,8 +190,6 @@ impl<'a> CanHandler<'a> {
178
190
} ) ;
179
191
}
180
192
}
181
- } else {
182
- sleep ( Duration :: from_millis ( 50 ) ) ;
183
193
}
184
194
}
185
195
}
@@ -193,10 +203,9 @@ impl<'a> CanHandler<'a> {
193
203
for ( message_count, message) in messages. iter ( ) . enumerate ( ) {
194
204
if message. can_id == format ! ( "{:08X}" , frame_id) {
195
205
let now = Utc :: now ( ) . timestamp_micros ( ) ;
196
- let can_data = messages. row_data ( message_count) . unwrap ( ) ;
197
206
let can_signals = Self :: create_can_signals ( & message, & signal_data) ;
198
207
let circle_time =
199
- ( now - ( can_data . time_stamp ) . parse :: < i64 > ( ) . unwrap ( ) ) as f32 / 1000.0 ;
208
+ ( now - ( message . time_stamp ) . parse :: < i64 > ( ) . unwrap ( ) ) as f32 / 1000.0 ;
200
209
messages. set_row_data (
201
210
message_count,
202
211
CanData {
0 commit comments