1
1
use can_dbc:: DBC ;
2
2
use chrono:: Utc ;
3
+ use pcan_basic:: bus:: UsbBus ;
3
4
#[ cfg( target_os = "windows" ) ]
4
- use pcan_basic:: socket:: usb:: UsbCanSocket ;
5
+ use pcan_basic:: socket:: { usb:: UsbCanSocket , CanFrame } ;
5
6
use slint:: { Model , ModelRc , SharedString , VecModel , Weak } ;
6
7
#[ cfg( target_os = "linux" ) ]
7
8
use socketcan:: { CanFrame , CanInterface , CanSocket , EmbeddedFrame , Frame , Socket } ;
@@ -19,7 +20,7 @@ pub struct CanHandler<'a> {
19
20
#[ cfg( target_os = "linux" ) ]
20
21
pub iface : & ' a str ,
21
22
#[ cfg( target_os = "windows" ) ]
22
- pub iface : UsbCanSocket ,
23
+ pub iface : UsbBus ,
23
24
pub ui_handle : & ' a Weak < AppWindow > ,
24
25
pub mspc_rx : & ' a Arc < Mutex < Receiver < DBC > > > ,
25
26
pub can_tx : Sender < CanFrame > ,
@@ -28,7 +29,7 @@ pub struct CanHandler<'a> {
28
29
}
29
30
30
31
static mut NEW_DBC_CHECK : bool = false ;
31
- use super :: { EVEN_COLOR , ODD_COLOR } ;
32
+ use super :: { p_can_bitrate , EVEN_COLOR , ODD_COLOR } ;
32
33
33
34
impl < ' a > CanHandler < ' a > {
34
35
pub fn process_can_messages ( & mut self ) {
@@ -43,7 +44,17 @@ impl<'a> CanHandler<'a> {
43
44
self . process_ui_events ( tx_can_socket, rx_can_socket, can_if) ;
44
45
}
45
46
#[ cfg( target_os = "windows" ) ]
46
- self . process_ui_events ( dbc) ;
47
+ {
48
+ let baudrate = p_can_bitrate ( & self . bitrate ) . unwrap ( ) ;
49
+ match UsbCanSocket :: open ( self . iface , baudrate) {
50
+ Ok ( socket) => {
51
+ self . process_ui_events ( socket) ;
52
+ }
53
+ Err ( e) => {
54
+ println ! ( "Failed to open CAN socket: {:?}" , e) ;
55
+ }
56
+ }
57
+ }
47
58
}
48
59
#[ cfg( target_os = "linux" ) ]
49
60
fn open_can_socket ( & self ) -> CanSocket {
@@ -182,11 +193,39 @@ impl<'a> CanHandler<'a> {
182
193
}
183
194
}
184
195
#[ cfg( target_os = "windows" ) ]
185
- fn process_ui_events ( & mut self , dbc : DBC ) {
186
- use pcan_basic:: { error:: PcanError , socket:: RecvCan } ;
196
+ fn process_ui_events ( & mut self , can_if : UsbCanSocket ) {
197
+ use pcan_basic:: {
198
+ error:: PcanError ,
199
+ socket:: { MessageType , RecvCan , SendCan } ,
200
+ } ;
187
201
let mut start_bus_load = Instant :: now ( ) ;
188
202
let mut total_bits = 0 ;
189
- self . check_to_kill_thread ( ) ;
203
+ let refer_socket = UsbCanSocket :: open_with_usb_bus ( self . iface ) ;
204
+ let _ = self . ui_handle . upgrade_in_event_loop ( move |ui| {
205
+ ui. on_can_transmit ( move |is_extended, can_id, can_data| {
206
+ match Self :: convert_hex_string_u32 ( & can_id) {
207
+ Ok ( id) => match Self :: convert_hex_string_arr ( & can_data) {
208
+ Ok ( data) => {
209
+ if is_extended {
210
+ let can_frame =
211
+ CanFrame :: new ( id, MessageType :: Extended , & data) . unwrap ( ) ;
212
+ let _ = refer_socket. send ( can_frame) ;
213
+ } else {
214
+ let can_frame =
215
+ CanFrame :: new ( id, MessageType :: Standard , & data) . unwrap ( ) ;
216
+ let _ = refer_socket. send ( can_frame) ;
217
+ } ;
218
+ }
219
+ Err ( e) => {
220
+ println ! ( "Failed to parse can data {}, error {}" , can_data, e) ;
221
+ }
222
+ } ,
223
+ Err ( e) => {
224
+ println ! ( "Failed to parse can id {}, error: {}" , can_id, e) ;
225
+ }
226
+ }
227
+ } ) ;
228
+ } ) ;
190
229
loop {
191
230
let bitrate = self . bitrate ( ) . unwrap ( ) ;
192
231
let busload = if start_bus_load. elapsed ( ) >= Duration :: from_millis ( 1000 ) {
@@ -199,11 +238,7 @@ impl<'a> CanHandler<'a> {
199
238
} ;
200
239
let _ = self . ui_handle . upgrade_in_event_loop ( move |ui| unsafe {
201
240
if ui. get_is_new_dbc ( ) {
202
- if ui. get_is_first_open ( ) {
203
- ui. set_is_first_open ( false ) ;
204
- } else {
205
- NEW_DBC_CHECK = true ;
206
- }
241
+ NEW_DBC_CHECK = true ;
207
242
ui. set_is_new_dbc ( false ) ;
208
243
}
209
244
ui. set_bitrate ( bitrate as i32 ) ;
@@ -213,37 +248,42 @@ impl<'a> CanHandler<'a> {
213
248
} ) ;
214
249
unsafe {
215
250
if NEW_DBC_CHECK {
216
- NEW_DBC_CHECK = false ;
217
- break ;
251
+ if let Ok ( dbc) = self . mspc_rx . lock ( ) . unwrap ( ) . try_recv ( ) {
252
+ self . dbc = Some ( dbc) ;
253
+ NEW_DBC_CHECK = false ;
254
+ }
218
255
}
219
256
}
220
- match self . iface . recv_frame ( ) {
257
+ match can_if . recv_frame ( ) {
221
258
Ok ( frame) => {
259
+ let _ = self . can_tx . send ( frame) ;
222
260
let _ = self . ui_handle . upgrade_in_event_loop ( move |ui| {
223
261
ui. set_state ( "OK" . into ( ) ) ;
224
262
} ) ;
225
263
total_bits += ( frame. dlc ( ) as u32 + 6 ) * 8 ; // Data length + overhead (approximation)
226
- let id = frame. can_id ( ) ;
227
- let frame_id = id & !0x80000000 ;
228
- for message in dbc. messages ( ) {
229
- if frame_id == ( message. message_id ( ) . raw ( ) & !0x80000000 ) {
230
- let padding_data = Self :: pad_to_8_bytes ( frame. data ( ) ) ;
231
- let hex_string = Self :: array_to_hex_string ( frame. data ( ) ) ;
232
- let signal_data = message. parse_from_can ( & padding_data) ;
233
- let _ = self . ui_handle . upgrade_in_event_loop ( move |ui| {
234
- let is_filter = ui. get_is_filter ( ) ;
235
- let messages: ModelRc < CanData > = if !is_filter {
236
- ui. get_messages ( )
237
- } else {
238
- ui. get_filter_messages ( )
239
- } ;
240
- Self :: update_ui_with_signals (
241
- & messages,
242
- frame_id,
243
- signal_data,
244
- hex_string,
245
- ) ;
246
- } ) ;
264
+ if let Some ( dbc) = & self . dbc {
265
+ let id = frame. can_id ( ) ;
266
+ let frame_id = id & !0x80000000 ;
267
+ for message in dbc. messages ( ) {
268
+ if frame_id == ( message. message_id ( ) . raw ( ) & !0x80000000 ) {
269
+ let padding_data = Self :: pad_to_8_bytes ( frame. data ( ) ) ;
270
+ let hex_string = Self :: array_to_hex_string ( frame. data ( ) ) ;
271
+ let signal_data = message. parse_from_can ( & padding_data) ;
272
+ let _ = self . ui_handle . upgrade_in_event_loop ( move |ui| {
273
+ let is_filter = ui. get_is_filter ( ) ;
274
+ let messages: ModelRc < CanData > = if !is_filter {
275
+ ui. get_messages ( )
276
+ } else {
277
+ ui. get_filter_messages ( )
278
+ } ;
279
+ Self :: update_ui_with_signals (
280
+ & messages,
281
+ frame_id,
282
+ signal_data,
283
+ hex_string,
284
+ ) ;
285
+ } ) ;
286
+ }
247
287
}
248
288
}
249
289
}
@@ -253,6 +293,7 @@ impl<'a> CanHandler<'a> {
253
293
ui. set_state ( format ! ( "{:?}" , e) . into ( ) ) ;
254
294
}
255
295
} ) ;
296
+ sleep ( Duration :: from_millis ( 1 ) ) ;
256
297
}
257
298
}
258
299
}
0 commit comments