Skip to content

Commit 0f5b37b

Browse files
committed
support CAN bus bitrate configuration
1 parent 0176621 commit 0f5b37b

File tree

5 files changed

+51
-15
lines changed

5 files changed

+51
-15
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ description = "view real-time CAN packages"
66

77
[dependencies]
88
chrono = "0.4.38"
9+
sudo = "0.6"
910
can-dbc = { git="https://github.com/TuEmb/can-dbc.git", branch="dev" }
1011
rfd = "0.14.1"
1112
slint = { version = "1.7.1", default-features = false, features = ["backend-winit", "compat-1-2", "renderer-winit-femtovg"] }
@@ -16,6 +17,7 @@ winapi = { version = "0.3.9", features = ["winuser"] }
1617
pcan-basic = { git = "https://github.com/TuEmb/pcan-basic.git", branch="main"}
1718

1819
[target.'cfg(unix)'.dependencies]
20+
privilege-rs = "0.1.0"
1921
socketcan = { git = "https://github.com/socketcan-rs/socketcan-rs.git", rev="e0d7760eca8085b247f37ea22f0aa41e00fa25fa", features = ["enumerate"] }
2022

2123
[build-dependencies]

src/event_handler/can_handler.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub struct CanHandler<'a> {
2525
pub iface: UsbCanSocket,
2626
pub ui_handle: &'a Weak<AppWindow>,
2727
pub mspc_rx: &'a Arc<Mutex<Receiver<DBC>>>,
28+
pub bitrate: String,
2829
}
2930

3031
static mut NEW_DBC_CHECK: bool = false;
@@ -35,8 +36,11 @@ impl<'a> CanHandler<'a> {
3536
if let Ok(dbc) = self.mspc_rx.lock().unwrap().try_recv() {
3637
#[cfg(target_os = "linux")]
3738
{
38-
let can_socket = self.open_can_socket();
3939
let can_if = CanInterface::open(self.iface).unwrap();
40+
let _ = can_if.bring_down();
41+
let _ = can_if.set_bitrate(self.bitrate().unwrap(), None);
42+
let _ = can_if.bring_up();
43+
let can_socket = self.open_can_socket();
4044
self.process_ui_events(dbc, can_socket, can_if);
4145
}
4246
#[cfg(target_os = "windows")]
@@ -284,4 +288,30 @@ impl<'a> CanHandler<'a> {
284288
hex_string.pop(); // Remove the trailing space
285289
hex_string
286290
}
291+
292+
fn bitrate(&self) -> Option<u32> {
293+
let bitrate_map: HashMap<&str, u32> = [
294+
("1 Mbit/s", 1_000_000),
295+
("800 kbit/s", 800_000),
296+
("500 kbit/s", 500_000),
297+
("250 kbit/s", 250_000),
298+
("200 kbit/s", 200_000),
299+
("125 kbit/s", 125_000),
300+
("100 kbit/s", 100_000),
301+
("95.238 kbit/s", 95_238),
302+
("83.333 kbit/s", 83_333),
303+
("50 kbit/s", 50_000),
304+
("47.619 kbit/s", 47_619),
305+
("40 kbit/s", 40_000),
306+
("33.333 kbit/s", 33_333),
307+
("20 kbit/s", 20_000),
308+
("10 kbit/s", 10_000),
309+
("5 kbit/s", 5_000),
310+
]
311+
.iter()
312+
.cloned()
313+
.collect();
314+
315+
bitrate_map.get(self.bitrate.as_str()).copied()
316+
}
287317
}

src/main.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ use pcan_basic::{
1313
hw::attached_channels,
1414
socket::{usb::UsbCanSocket, Baudrate},
1515
};
16+
#[cfg(target_os = "linux")]
17+
use privilege_rs::privilege_request;
1618
#[cfg(target_os = "windows")]
1719
use slint::Model;
1820
use slint::{ModelRc, SharedString, VecModel};
@@ -25,6 +27,7 @@ slint::include_modules!();
2527

2628
#[tokio::main]
2729
async fn main() -> io::Result<()> {
30+
privilege_request();
2831
let ui = AppWindow::new().unwrap();
2932

3033
let (tx, rx) = mpsc::channel::<DBC>();
@@ -161,7 +164,7 @@ async fn main() -> io::Result<()> {
161164
let (start_tx, start_rx) = mpsc::channel();
162165
// Handle start event
163166
let ui_handle = ui.as_weak();
164-
ui.on_start(move |_name, _index| {
167+
ui.on_start(move |_name, _index, bitrate| {
165168
// start_tx.send((_name, _index));
166169
#[cfg(target_os = "linux")]
167170
{
@@ -170,7 +173,7 @@ async fn main() -> io::Result<()> {
170173
ui.set_init_string(SharedString::from("No device found!!!"));
171174
} else {
172175
ui.set_is_init(true);
173-
let _ = start_tx.send(_name);
176+
let _ = start_tx.send((_name, bitrate));
174177
}
175178
}
176179
#[cfg(target_os = "windows")]
@@ -201,14 +204,15 @@ async fn main() -> io::Result<()> {
201204

202205
let ui_handle = ui.as_weak();
203206
tokio::spawn(async move {
204-
if let Ok(can_if) = start_rx.recv() {
207+
if let Ok((can_if, bitrate)) = start_rx.recv() {
205208
let mut can_handler = CanHandler {
206209
#[cfg(target_os = "windows")]
207210
iface: can_if,
208211
#[cfg(target_os = "linux")]
209212
iface: &can_if,
210213
ui_handle: &ui_handle,
211214
mspc_rx: &rx,
215+
bitrate: bitrate.to_string(),
212216
};
213217
loop {
214218
can_handler.process_can_messages();

ui/app.slint

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export component AppWindow inherits Window {
2525

2626
callback open_dbc_file();
2727
callback filter_id(CanData, bool);
28-
callback start(string, int);
28+
callback start(string, int, string);
2929
title: @tr("CAN VIEWER (version 0.2.0)");
3030
icon: @image-url("images/can_viewer_128px.png");
3131
background: #1a1f2b;
@@ -38,8 +38,8 @@ export component AppWindow inherits Window {
3838
initPage {
3939
out: init_string;
4040
can_sockets: can_sockets;
41-
start(name, index) => {
42-
start(name, index);
41+
start(name, index, bitrate) => {
42+
start(name, index, bitrate);
4343
}
4444
}
4545

ui/init_page.slint

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export component initPage inherits Rectangle {
1212
background: #1a1f2b;
1313
in property <socket_info> can_sockets;
1414
in property <string> out: "Please select CAN device to start";
15-
callback start(string /* name */, int /* index */);
15+
callback start(string /* name */, int /* index */, string /* */);
1616
VerticalLayout {
1717
Rectangle {}
1818
Text {
@@ -31,16 +31,16 @@ export component initPage inherits Rectangle {
3131
current-value: can_sockets.name[0];
3232
}
3333
}
34-
// bitrate_box := ComboBox {
35-
// model: ["1 Mbit/s", "800 kbit/s", "500 kbit/s", "250 kbit/s", "200 kbit/s", "125 kbit/s",
36-
// "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"];
38-
// current-value: "250 kbit/s";
39-
// }
34+
bitrate_box := ComboBox {
35+
model: ["1 Mbit/s", "800 kbit/s", "500 kbit/s", "250 kbit/s", "200 kbit/s", "125 kbit/s",
36+
"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"];
38+
current-value: "250 kbit/s";
39+
}
4040
Button {
4141
text: "start";
4242
clicked => {
43-
start(socket_can_box.current-value, socket_can_box.current-index);
43+
start(socket_can_box.current-value, socket_can_box.current-index, bitrate_box.current-value);
4444
}
4545
}
4646
Rectangle {}

0 commit comments

Comments
 (0)