Skip to content

Commit c690bb0

Browse files
committed
also support bitrate configuration for Windows
1 parent 0f5b37b commit c690bb0

File tree

5 files changed

+74
-39
lines changed

5 files changed

+74
-39
lines changed

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "can-viewer"
3-
version = "0.2.0"
3+
version = "0.2.1"
44
edition = "2021"
55
description = "view real-time CAN packages"
66

@@ -27,7 +27,7 @@ winresource = "0.1.17"
2727
[package.metadata.bundle]
2828
name = "can-viewer"
2929
icon = ["ui/images/can_viewer_32px.png", "ui/images/can_viewer_128px.png", "ui/images/can_viewer_256px.png"]
30-
version = "1.0.0"
30+
version = "0.2.1"
3131
copyright = "Copyright (c) Tu Nguyen 2024. All rights reserved."
3232
category = "Developer Tool"
3333
short_description = "view real-time CAN packages"
@@ -37,5 +37,5 @@ can-view can records real-time can packages and parse data with DBC input.
3737
"""
3838

3939
[package.metadata.winresource]
40-
OriginalFilename = "can-viewer.exe"
40+
OriginalFilename = "can-viewer_0.2.1.exe"
4141
LegalCopyright = "Copyright © 2024"

src/event_handler/can_handler.rs

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,14 @@ impl<'a> CanHandler<'a> {
138138
}
139139
#[cfg(target_os = "windows")]
140140
fn process_ui_events(&mut self, dbc: DBC) {
141-
use pcan_basic::socket::RecvCan;
141+
use pcan_basic::{error::PcanError, socket::RecvCan};
142142
let mut start_bus_load = Instant::now();
143143
let mut total_bits = 0;
144144
loop {
145+
let bitrate = self.bitrate().unwrap();
145146
let busload = if start_bus_load.elapsed() >= Duration::from_millis(1000) {
146147
start_bus_load = Instant::now();
147-
let bus_load = (total_bits as f64 / 250000_f64) * 100.0;
148+
let bus_load = (total_bits as f64 / bitrate as f64) * 100.0;
148149
total_bits = 0;
149150
bus_load
150151
} else {
@@ -159,6 +160,7 @@ impl<'a> CanHandler<'a> {
159160
}
160161
ui.set_is_new_dbc(false);
161162
}
163+
ui.set_bitrate(bitrate as i32);
162164
if busload > 0.0 {
163165
ui.set_bus_load(busload as i32);
164166
}
@@ -169,31 +171,43 @@ impl<'a> CanHandler<'a> {
169171
break;
170172
}
171173
}
172-
if let Ok(frame) = self.iface.recv_frame() {
173-
total_bits += (frame.dlc() as u32 + 6) * 8; // Data length + overhead (approximation)
174-
let id = frame.can_id();
175-
let frame_id = id & !0x80000000;
176-
for message in dbc.messages() {
177-
if frame_id == (message.message_id().raw() & !0x80000000) {
178-
let padding_data = Self::pad_to_8_bytes(frame.data());
179-
let hex_string = Self::array_to_hex_string(frame.data());
180-
let signal_data = message.parse_from_can(&padding_data);
181-
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
182-
let is_filter = ui.get_is_filter();
183-
let messages: ModelRc<CanData> = if !is_filter {
184-
ui.get_messages()
185-
} else {
186-
ui.get_filter_messages()
187-
};
188-
Self::update_ui_with_signals(
189-
&messages,
190-
frame_id,
191-
signal_data,
192-
hex_string,
193-
);
194-
});
174+
match self.iface.recv_frame() {
175+
Ok(frame) => {
176+
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
177+
ui.set_state("OK".into());
178+
});
179+
total_bits += (frame.dlc() as u32 + 6) * 8; // Data length + overhead (approximation)
180+
let id = frame.can_id();
181+
let frame_id = id & !0x80000000;
182+
for message in dbc.messages() {
183+
if frame_id == (message.message_id().raw() & !0x80000000) {
184+
let padding_data = Self::pad_to_8_bytes(frame.data());
185+
let hex_string = Self::array_to_hex_string(frame.data());
186+
let signal_data = message.parse_from_can(&padding_data);
187+
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
188+
let is_filter = ui.get_is_filter();
189+
let messages: ModelRc<CanData> = if !is_filter {
190+
ui.get_messages()
191+
} else {
192+
ui.get_filter_messages()
193+
};
194+
Self::update_ui_with_signals(
195+
&messages,
196+
frame_id,
197+
signal_data,
198+
hex_string,
199+
);
200+
});
201+
}
195202
}
196203
}
204+
Err(e) => {
205+
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
206+
if e != PcanError::QrcvEmpty {
207+
ui.set_state(format!("{:?}", e).into());
208+
}
209+
});
210+
}
197211
}
198212
}
199213
}
@@ -295,14 +309,12 @@ impl<'a> CanHandler<'a> {
295309
("800 kbit/s", 800_000),
296310
("500 kbit/s", 500_000),
297311
("250 kbit/s", 250_000),
298-
("200 kbit/s", 200_000),
299312
("125 kbit/s", 125_000),
300313
("100 kbit/s", 100_000),
301314
("95.238 kbit/s", 95_238),
302315
("83.333 kbit/s", 83_333),
303316
("50 kbit/s", 50_000),
304317
("47.619 kbit/s", 47_619),
305-
("40 kbit/s", 40_000),
306318
("33.333 kbit/s", 33_333),
307319
("20 kbit/s", 20_000),
308320
("10 kbit/s", 10_000),

src/event_handler/mod.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,30 @@ pub(crate) mod packet_filter;
55
pub use can_handler::CanHandler;
66
pub use dbc_file::DBCFile;
77
pub use packet_filter::PacketFilter;
8+
#[cfg(target_os = "windows")]
9+
use pcan_basic::socket::Baudrate;
810
use slint::Color;
911

1012
const ODD_COLOR: Color = Color::from_rgb_u8(0x18, 0x1c, 0x27);
1113
const EVEN_COLOR: Color = Color::from_rgb_u8(0x13, 0x16, 0x1f);
14+
15+
#[cfg(target_os = "windows")]
16+
pub fn p_can_bitrate(bitrate: &str) -> Option<Baudrate> {
17+
match bitrate {
18+
"1 Mbit/s" => Some(Baudrate::Baud1M),
19+
"800 kbit/s" => Some(Baudrate::Baud800K),
20+
"500 kbit/s" => Some(Baudrate::Baud500K),
21+
"250 kbit/s" => Some(Baudrate::Baud250K),
22+
"125 kbit/s" => Some(Baudrate::Baud125K),
23+
"100 kbit/s" => Some(Baudrate::Baud100K),
24+
"95.238 kbit/s" => Some(Baudrate::Baud95K),
25+
"83.333 kbit/s" => Some(Baudrate::Baud83),
26+
"50 kbit/s" => Some(Baudrate::Baud50K),
27+
"47.619 kbit/s" => Some(Baudrate::Baud47K),
28+
"33.333 kbit/s" => Some(Baudrate::Baud33K),
29+
"20 kbit/s" => Some(Baudrate::Baud20K),
30+
"10 kbit/s" => Some(Baudrate::Baud10K),
31+
"5 kbit/s" => Some(Baudrate::Baud5K),
32+
_ => None,
33+
}
34+
}

src/main.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,11 @@ use std::time::Duration;
66

77
mod event_handler;
88
use can_dbc::DBC;
9+
#[cfg(target_os = "windows")]
10+
use event_handler::p_can_bitrate;
911
use event_handler::{CanHandler, DBCFile, PacketFilter};
1012
#[cfg(target_os = "windows")]
11-
use pcan_basic::{
12-
bus::UsbBus,
13-
hw::attached_channels,
14-
socket::{usb::UsbCanSocket, Baudrate},
15-
};
13+
use pcan_basic::{bus::UsbBus, hw::attached_channels, socket::usb::UsbCanSocket};
1614
#[cfg(target_os = "linux")]
1715
use privilege_rs::privilege_request;
1816
#[cfg(target_os = "windows")]
@@ -27,6 +25,7 @@ slint::include_modules!();
2725

2826
#[tokio::main]
2927
async fn main() -> io::Result<()> {
28+
#[cfg(target_os = "linux")]
3029
privilege_request();
3130
let ui = AppWindow::new().unwrap();
3231

@@ -188,10 +187,11 @@ async fn main() -> io::Result<()> {
188187
};
189188
let usb_can = UsbBus::try_from(get_device_handle as u16).unwrap();
190189
let ui_handle = ui.as_weak();
191-
match UsbCanSocket::open(usb_can, Baudrate::Baud250K) {
190+
let baudrate = p_can_bitrate(&bitrate).unwrap();
191+
match UsbCanSocket::open(usb_can, baudrate) {
192192
Ok(socket) => {
193193
ui_handle.unwrap().set_is_init(true);
194-
let _ = start_tx.send(socket);
194+
let _ = start_tx.send((socket, bitrate));
195195
}
196196
Err(e) => {
197197
ui_handle

ui/init_page.slint

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ export component initPage inherits Rectangle {
3232
}
3333
}
3434
bitrate_box := ComboBox {
35-
model: ["1 Mbit/s", "800 kbit/s", "500 kbit/s", "250 kbit/s", "200 kbit/s", "125 kbit/s",
35+
model: ["1 Mbit/s", "800 kbit/s", "500 kbit/s", "250 kbit/s", "125 kbit/s",
3636
"100 kbit/s", "95.238 kbit/s", "83.333 kbit/s", "50 kbit/s", "47.619 kbit/s",
37-
"40 kbit/s", "33.333 kbit/s", "20 kbit/s", "10 kbit/s", "5 kbit/s"];
37+
"33.333 kbit/s", "20 kbit/s", "10 kbit/s", "5 kbit/s"];
3838
current-value: "250 kbit/s";
3939
}
4040
Button {

0 commit comments

Comments
 (0)