Skip to content

Commit 3866cab

Browse files
committed
only 1 task handles CAN data and upgrade privilege-rs
1 parent 245bfd9 commit 3866cab

File tree

6 files changed

+30
-23
lines changed

6 files changed

+30
-23
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ winapi = { version = "0.3.9", features = ["winuser"] }
1717
pcan-basic = { git = "https://github.com/TuEmb/pcan-basic.git", branch="main"}
1818

1919
[target.'cfg(unix)'.dependencies]
20-
privilege-rs = "0.1.2"
20+
privilege-rs = "0.1.3"
2121
socketcan = { git = "https://github.com/socketcan-rs/socketcan-rs.git", rev="e0d7760eca8085b247f37ea22f0aa41e00fa25fa", features = ["enumerate"] }
2222

2323
[build-dependencies]

src/event_handler/view.rs renamed to src/event_handler/can_handler.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,32 @@ use chrono::Utc;
44
use pcan_basic::socket::usb::UsbCanSocket;
55
use slint::{Model, ModelRc, SharedString, VecModel, Weak};
66
#[cfg(target_os = "linux")]
7-
use socketcan::{CanInterface, CanSocket, EmbeddedFrame, Frame, Socket};
7+
use socketcan::{CanFrame, CanInterface, CanSocket, EmbeddedFrame, Frame, Socket};
88
use std::{
99
collections::HashMap,
1010
fmt::Write,
1111
rc::Rc,
12-
sync::{mpsc::Receiver, Arc, Mutex},
12+
sync::{mpsc::Receiver, mpsc::Sender, Arc, Mutex},
1313
thread::sleep,
1414
time::{Duration, Instant},
1515
};
1616

1717
use crate::slint_generatedAppWindow::{AppWindow, CanData, CanSignal};
18-
pub struct ViewHandler<'a> {
18+
pub struct CanHandler<'a> {
1919
#[cfg(target_os = "linux")]
2020
pub iface: &'a str,
2121
#[cfg(target_os = "windows")]
2222
pub iface: UsbCanSocket,
2323
pub ui_handle: &'a Weak<AppWindow>,
2424
pub mspc_rx: &'a Arc<Mutex<Receiver<DBC>>>,
25+
pub can_tx: Sender<CanFrame>,
2526
pub bitrate: String,
2627
}
2728

2829
static mut NEW_DBC_CHECK: bool = false;
2930
use super::{EVEN_COLOR, ODD_COLOR};
3031

31-
impl<'a> ViewHandler<'a> {
32+
impl<'a> CanHandler<'a> {
3233
pub fn process_can_messages(&mut self) {
3334
if let Ok(dbc) = self.mspc_rx.lock().unwrap().try_recv() {
3435
#[cfg(target_os = "linux")]
@@ -107,6 +108,7 @@ impl<'a> ViewHandler<'a> {
107108
}
108109
}
109110
if let Ok(frame) = can_socket.read_frame() {
111+
let _ = self.can_tx.send(frame);
110112
total_bits += (frame.len() + 6) * 8; // Data length + overhead (approximation)
111113
let frame_id = frame.raw_id() & !0x80000000;
112114
for message in dbc.messages() {

src/event_handler/debug.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
1-
use std::{collections::HashMap, rc::Rc, time::Duration};
1+
use std::{collections::HashMap, rc::Rc, sync::mpsc::Receiver, time::Duration};
22

33
use crate::slint_generatedAppWindow::{raw_can, AppWindow};
44
use slint::{Model, SharedString, VecModel, Weak};
5-
use socketcan::{CanSocket, EmbeddedFrame, Frame, Socket};
5+
use socketcan::{CanFrame, EmbeddedFrame, Frame};
6+
7+
const MAX_LEN: usize = 1000;
68
pub struct DebugHandler<'a> {
7-
#[cfg(target_os = "linux")]
8-
pub iface: &'a str,
9-
#[cfg(target_os = "windows")]
10-
pub iface: UsbCanSocket,
119
pub ui_handle: &'a Weak<AppWindow>,
1210
pub bitrate: String,
1311
pub filter: (u32, u32),
12+
pub can_rx: Receiver<CanFrame>,
1413
}
1514

1615
impl<'a> DebugHandler<'a> {
1716
pub fn run(&mut self) {
18-
let can_socket = CanSocket::open(self.iface).unwrap();
19-
if let Ok(frame) = can_socket.read_frame() {
17+
if let Ok(frame) = self.can_rx.recv() {
2018
let frame_id = frame.raw_id() & !0x80000000;
2119
if frame_id >= self.filter.0 && frame_id <= self.filter.1 {
2220
let bitrate = self.bitrate().unwrap();
@@ -27,6 +25,9 @@ impl<'a> DebugHandler<'a> {
2725
for data in raw_data.iter() {
2826
vec_data.push(data);
2927
}
28+
if vec_data.len() > MAX_LEN {
29+
vec_data.remove(0);
30+
}
3031
vec_data.push(raw_can {
3132
data: SharedString::from(format!("{:?}", frame.data())),
3233
id: SharedString::from(frame_id.to_string()),

src/event_handler/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1+
pub(crate) mod can_handler;
12
pub(crate) mod dbc_file;
23
pub(crate) mod debug;
34
pub(crate) mod filter;
45
pub(crate) mod init;
5-
pub(crate) mod view;
66

7+
pub use can_handler::CanHandler;
78
pub use dbc_file::DBCFile;
89
pub use debug::DebugHandler;
910
pub use filter::PacketFilter;
1011
pub use init::Init;
1112
#[cfg(target_os = "windows")]
1213
use pcan_basic::socket::Baudrate;
1314
use slint::Color;
14-
pub use view::ViewHandler;
1515

1616
const ODD_COLOR: Color = Color::from_rgb_u8(0x18, 0x1c, 0x27);
1717
const EVEN_COLOR: Color = Color::from_rgb_u8(0x13, 0x16, 0x1f);

src/main.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::sync::{Arc, Mutex};
44

55
mod event_handler;
66
use can_dbc::DBC;
7-
use event_handler::{DBCFile, DebugHandler, Init, PacketFilter, ViewHandler};
7+
use event_handler::{CanHandler, DBCFile, DebugHandler, Init, PacketFilter};
88
#[cfg(target_os = "windows")]
99
use pcan_basic::{bus::UsbBus, socket::usb::UsbCanSocket};
1010
#[cfg(target_os = "linux")]
@@ -20,7 +20,10 @@ slint::include_modules!();
2020
#[tokio::main]
2121
async fn main() -> io::Result<()> {
2222
#[cfg(target_os = "linux")]
23-
privilege_request();
23+
if privilege_request()? == privilege_rs::Privilege::User {
24+
println!("Failed to request the privilege");
25+
std::process::exit(0);
26+
}
2427
let ui = AppWindow::new().unwrap();
2528

2629
let (tx, rx) = mpsc::channel::<DBC>();
@@ -86,17 +89,19 @@ async fn main() -> io::Result<()> {
8689
}
8790
});
8891

92+
let (can_tx, can_rx) = mpsc::channel();
8993
let ui_handle = ui.as_weak();
9094
tokio::spawn(async move {
9195
if let Ok((can_if, bitrate)) = start_rx_1.recv() {
92-
let mut can_handler = ViewHandler {
96+
let mut can_handler = CanHandler {
9397
#[cfg(target_os = "windows")]
9498
iface: can_if,
9599
#[cfg(target_os = "linux")]
96100
iface: &can_if,
97101
ui_handle: &ui_handle,
98102
mspc_rx: &rx,
99103
bitrate: bitrate.to_string(),
104+
can_tx,
100105
};
101106
loop {
102107
can_handler.process_can_messages();
@@ -106,15 +111,12 @@ async fn main() -> io::Result<()> {
106111

107112
let ui_handle = ui.as_weak();
108113
tokio::spawn(async move {
109-
if let Ok((can_if, bitrate)) = start_rx_2.recv() {
114+
if let Ok((_can_if, bitrate)) = start_rx_2.recv() {
110115
let mut can_handler = DebugHandler {
111-
#[cfg(target_os = "windows")]
112-
iface: can_if,
113-
#[cfg(target_os = "linux")]
114-
iface: &can_if,
115116
ui_handle: &ui_handle,
116117
bitrate: bitrate.to_string(),
117118
filter: (0, 0xFFFFFFFF),
119+
can_rx,
118120
};
119121
loop {
120122
can_handler.run();

ui/app.slint

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ export component AppWindow inherits Window {
114114
}
115115
if root.active-page == 2:
116116
debugPage {
117+
state: state;
118+
bus_load: bus_load;
117119
bitrate: bitrate;
118120
raw_data: raw_data;
119121
}

0 commit comments

Comments
 (0)