Skip to content

Commit c900c19

Browse files
committed
support debug page for windows also
1 parent ba0c3c8 commit c900c19

File tree

4 files changed

+99
-59
lines changed

4 files changed

+99
-59
lines changed

src/event_handler/can_handler.rs

Lines changed: 77 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use can_dbc::DBC;
22
use chrono::Utc;
3+
use pcan_basic::bus::UsbBus;
34
#[cfg(target_os = "windows")]
4-
use pcan_basic::socket::usb::UsbCanSocket;
5+
use pcan_basic::socket::{usb::UsbCanSocket, CanFrame};
56
use slint::{Model, ModelRc, SharedString, VecModel, Weak};
67
#[cfg(target_os = "linux")]
78
use socketcan::{CanFrame, CanInterface, CanSocket, EmbeddedFrame, Frame, Socket};
@@ -19,7 +20,7 @@ pub struct CanHandler<'a> {
1920
#[cfg(target_os = "linux")]
2021
pub iface: &'a str,
2122
#[cfg(target_os = "windows")]
22-
pub iface: UsbCanSocket,
23+
pub iface: UsbBus,
2324
pub ui_handle: &'a Weak<AppWindow>,
2425
pub mspc_rx: &'a Arc<Mutex<Receiver<DBC>>>,
2526
pub can_tx: Sender<CanFrame>,
@@ -28,7 +29,7 @@ pub struct CanHandler<'a> {
2829
}
2930

3031
static mut NEW_DBC_CHECK: bool = false;
31-
use super::{EVEN_COLOR, ODD_COLOR};
32+
use super::{p_can_bitrate, EVEN_COLOR, ODD_COLOR};
3233

3334
impl<'a> CanHandler<'a> {
3435
pub fn process_can_messages(&mut self) {
@@ -43,7 +44,17 @@ impl<'a> CanHandler<'a> {
4344
self.process_ui_events(tx_can_socket, rx_can_socket, can_if);
4445
}
4546
#[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+
}
4758
}
4859
#[cfg(target_os = "linux")]
4960
fn open_can_socket(&self) -> CanSocket {
@@ -182,11 +193,39 @@ impl<'a> CanHandler<'a> {
182193
}
183194
}
184195
#[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+
};
187201
let mut start_bus_load = Instant::now();
188202
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+
});
190229
loop {
191230
let bitrate = self.bitrate().unwrap();
192231
let busload = if start_bus_load.elapsed() >= Duration::from_millis(1000) {
@@ -199,11 +238,7 @@ impl<'a> CanHandler<'a> {
199238
};
200239
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| unsafe {
201240
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;
207242
ui.set_is_new_dbc(false);
208243
}
209244
ui.set_bitrate(bitrate as i32);
@@ -213,37 +248,42 @@ impl<'a> CanHandler<'a> {
213248
});
214249
unsafe {
215250
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+
}
218255
}
219256
}
220-
match self.iface.recv_frame() {
257+
match can_if.recv_frame() {
221258
Ok(frame) => {
259+
let _ = self.can_tx.send(frame);
222260
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
223261
ui.set_state("OK".into());
224262
});
225263
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+
}
247287
}
248288
}
249289
}
@@ -253,6 +293,7 @@ impl<'a> CanHandler<'a> {
253293
ui.set_state(format!("{:?}", e).into());
254294
}
255295
});
296+
sleep(Duration::from_millis(1));
256297
}
257298
}
258299
}

src/event_handler/debug.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ use std::{
77

88
use crate::slint_generatedAppWindow::{raw_can, AppWindow};
99
use chrono::Local;
10+
#[cfg(target_os = "windows")]
11+
use pcan_basic::socket::CanFrame;
1012
use slint::{Model, SharedString, VecModel, Weak};
13+
#[cfg(target_os = "linux")]
1114
use socketcan::{CanFrame, EmbeddedFrame, Frame};
1215

1316
const MAX_LEN: usize = 1000;
@@ -21,13 +24,22 @@ pub struct DebugHandler<'a> {
2124
impl<'a> DebugHandler<'a> {
2225
pub fn run(&mut self) {
2326
let (tx, rx) = mpsc::channel();
24-
let mut debug_enable = true;
27+
let mut debug_enable = false;
28+
let tx_clone = tx.clone();
29+
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
30+
ui.on_change_state(move |state| {
31+
let _ = tx_clone.send(state);
32+
});
33+
});
2534
loop {
2635
if let Ok(en) = rx.try_recv() {
2736
debug_enable = en;
2837
}
2938
if debug_enable {
3039
if let Ok(frame) = self.can_rx.try_recv() {
40+
#[cfg(target_os = "windows")]
41+
let frame_id = frame.can_id() & !0x80000000;
42+
#[cfg(target_os = "linux")]
3143
let frame_id = frame.raw_id() & !0x80000000;
3244
if frame_id >= self.filter.0 && frame_id <= self.filter.1 {
3345
let bitrate = self.bitrate().unwrap();
@@ -49,7 +61,10 @@ impl<'a> DebugHandler<'a> {
4961
),
5062
data: SharedString::from(format!("{:?}", frame.data())),
5163
id: SharedString::from(format!("0x{:08X}", frame_id)),
64+
#[cfg(target_os = "linux")]
5265
len: frame.len() as i32,
66+
#[cfg(target_os = "windows")]
67+
len: frame.dlc() as i32,
5368
},
5469
);
5570
let message_vec: Rc<VecModel<raw_can>> =
@@ -63,13 +78,6 @@ impl<'a> DebugHandler<'a> {
6378
} else {
6479
std::thread::sleep(Duration::from_millis(50));
6580
}
66-
let tx_clone = tx.clone();
67-
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
68-
let enable = ui.get_is_debug_en();
69-
if enable != debug_enable {
70-
let _ = tx_clone.send(enable);
71-
}
72-
});
7381
}
7482
}
7583

src/main.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ mod event_handler;
66
use can_dbc::DBC;
77
use event_handler::{CanHandler, DBCFile, DebugHandler, Init, PacketFilter};
88
#[cfg(target_os = "windows")]
9-
use pcan_basic::{bus::UsbBus, socket::usb::UsbCanSocket};
9+
use pcan_basic::bus::UsbBus;
1010
#[cfg(target_os = "linux")]
1111
use privilege_rs::privilege_request;
1212
#[cfg(target_os = "windows")]
@@ -62,7 +62,6 @@ async fn main() -> io::Result<()> {
6262
}
6363
#[cfg(target_os = "windows")]
6464
{
65-
use event_handler::p_can_bitrate;
6665
let ui = ui_handle.unwrap();
6766
let get_device_handle = match ui.get_can_sockets().index.row_data(_index as usize) {
6867
Some(device) => device,
@@ -72,19 +71,9 @@ async fn main() -> io::Result<()> {
7271
}
7372
};
7473
let usb_can = UsbBus::try_from(get_device_handle as u16).unwrap();
75-
let ui_handle = ui.as_weak();
76-
let baudrate = p_can_bitrate(&bitrate).unwrap();
77-
match UsbCanSocket::open(usb_can, baudrate) {
78-
Ok(socket) => {
79-
ui_handle.unwrap().set_is_init(true);
80-
let _ = start_tx_1.send((socket, bitrate));
81-
}
82-
Err(e) => {
83-
ui_handle
84-
.unwrap()
85-
.set_init_string(SharedString::from(format!("Failed to start: {:?}", e)));
86-
}
87-
}
74+
let _ = start_tx_1.send((usb_can, bitrate.clone()));
75+
let _ = start_tx_2.send((usb_can, bitrate));
76+
ui.set_is_init(true);
8877
}
8978
});
9079

ui/app.slint

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export component AppWindow inherits Window {
3131
callback can_transmit(bool, string, string);
3232
callback can_id_check_string(bool, string) -> bool;
3333
callback can_data_check_string(string) -> bool;
34+
callback change_state(bool);
3435
title: @tr("CAN VIEWER (version 0.2.2)");
3536
icon: @image-url("images/can_viewer_128px.png");
3637
background: #1a1f2b;
@@ -124,6 +125,7 @@ export component AppWindow inherits Window {
124125
raw_data: raw_data;
125126
change_state(en) => {
126127
is_debug_en = en;
128+
change_state(en);
127129
}
128130
can_transmit(is_extended, can_id, can_data) => {
129131
can_transmit(is_extended, can_id, can_data)

0 commit comments

Comments
 (0)