Skip to content

Commit b6d6f58

Browse files
committed
receive can frame from beginning
1 parent 3866cab commit b6d6f58

File tree

7 files changed

+152
-70
lines changed

7 files changed

+152
-70
lines changed

src/event_handler/can_handler.rs

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -24,27 +24,25 @@ pub struct CanHandler<'a> {
2424
pub mspc_rx: &'a Arc<Mutex<Receiver<DBC>>>,
2525
pub can_tx: Sender<CanFrame>,
2626
pub bitrate: String,
27+
pub dbc: Option<DBC>,
2728
}
2829

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

3233
impl<'a> CanHandler<'a> {
3334
pub fn process_can_messages(&mut self) {
34-
if let Ok(dbc) = self.mspc_rx.lock().unwrap().try_recv() {
35-
#[cfg(target_os = "linux")]
36-
{
37-
let can_if = CanInterface::open(self.iface).unwrap();
38-
let _ = can_if.bring_down();
39-
let _ = can_if.set_bitrate(self.bitrate().unwrap(), None);
40-
let _ = can_if.bring_up();
41-
let can_socket = self.open_can_socket();
42-
self.process_ui_events(dbc, can_socket, can_if);
43-
}
44-
#[cfg(target_os = "windows")]
45-
self.process_ui_events(dbc);
35+
#[cfg(target_os = "linux")]
36+
{
37+
let can_if = CanInterface::open(self.iface).unwrap();
38+
let _ = can_if.bring_down();
39+
let _ = can_if.set_bitrate(self.bitrate().unwrap(), None);
40+
let _ = can_if.bring_up();
41+
let can_socket = self.open_can_socket();
42+
self.process_ui_events(can_socket, can_if);
4643
}
47-
sleep(Duration::from_millis(10));
44+
#[cfg(target_os = "windows")]
45+
self.process_ui_events(dbc);
4846
}
4947
#[cfg(target_os = "linux")]
5048
fn open_can_socket(&self) -> CanSocket {
@@ -65,7 +63,7 @@ impl<'a> CanHandler<'a> {
6563
}
6664
}
6765
#[cfg(target_os = "linux")]
68-
fn process_ui_events(&self, dbc: DBC, can_socket: CanSocket, can_if: CanInterface) {
66+
fn process_ui_events(&mut self, can_socket: CanSocket, can_if: CanInterface) {
6967
let mut start_bus_load = Instant::now();
7068
let mut total_bits = 0;
7169
loop {
@@ -88,11 +86,7 @@ impl<'a> CanHandler<'a> {
8886
};
8987
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| unsafe {
9088
if ui.get_is_new_dbc() {
91-
if ui.get_is_first_open() {
92-
ui.set_is_first_open(false);
93-
} else {
94-
NEW_DBC_CHECK = true;
95-
}
89+
NEW_DBC_CHECK = true;
9690
ui.set_is_new_dbc(false);
9791
}
9892
ui.set_state(bus_state.into());
@@ -103,33 +97,37 @@ impl<'a> CanHandler<'a> {
10397
});
10498
unsafe {
10599
if NEW_DBC_CHECK {
106-
NEW_DBC_CHECK = false;
107-
break;
100+
if let Ok(dbc) = self.mspc_rx.lock().unwrap().try_recv() {
101+
self.dbc = Some(dbc);
102+
NEW_DBC_CHECK = false;
103+
}
108104
}
109105
}
110106
if let Ok(frame) = can_socket.read_frame() {
111107
let _ = self.can_tx.send(frame);
112108
total_bits += (frame.len() + 6) * 8; // Data length + overhead (approximation)
113109
let frame_id = frame.raw_id() & !0x80000000;
114-
for message in dbc.messages() {
115-
if frame_id == (message.message_id().raw() & !0x80000000) {
116-
let padding_data = Self::pad_to_8_bytes(frame.data());
117-
let hex_string = Self::array_to_hex_string(frame.data());
118-
let signal_data = message.parse_from_can(&padding_data);
119-
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
120-
let is_filter = ui.get_is_filter();
121-
let messages: ModelRc<CanData> = if !is_filter {
122-
ui.get_messages()
123-
} else {
124-
ui.get_filter_messages()
125-
};
126-
Self::update_ui_with_signals(
127-
&messages,
128-
frame_id,
129-
signal_data,
130-
hex_string,
131-
);
132-
});
110+
if let Some(dbc) = &self.dbc {
111+
for message in dbc.messages() {
112+
if frame_id == (message.message_id().raw() & !0x80000000) {
113+
let padding_data = Self::pad_to_8_bytes(frame.data());
114+
let hex_string = Self::array_to_hex_string(frame.data());
115+
let signal_data = message.parse_from_can(&padding_data);
116+
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
117+
let is_filter = ui.get_is_filter();
118+
let messages: ModelRc<CanData> = if !is_filter {
119+
ui.get_messages()
120+
} else {
121+
ui.get_filter_messages()
122+
};
123+
Self::update_ui_with_signals(
124+
&messages,
125+
frame_id,
126+
signal_data,
127+
hex_string,
128+
);
129+
});
130+
}
133131
}
134132
}
135133
} else {

src/event_handler/debug.rs

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
use std::{collections::HashMap, rc::Rc, sync::mpsc::Receiver, time::Duration};
1+
use std::{
2+
collections::HashMap,
3+
rc::Rc,
4+
sync::mpsc::{self, Receiver},
5+
time::Duration,
6+
};
27

38
use crate::slint_generatedAppWindow::{raw_can, AppWindow};
9+
use chrono::Local;
410
use slint::{Model, SharedString, VecModel, Weak};
511
use socketcan::{CanFrame, EmbeddedFrame, Frame};
612

@@ -14,32 +20,57 @@ pub struct DebugHandler<'a> {
1420

1521
impl<'a> DebugHandler<'a> {
1622
pub fn run(&mut self) {
17-
if let Ok(frame) = self.can_rx.recv() {
18-
let frame_id = frame.raw_id() & !0x80000000;
19-
if frame_id >= self.filter.0 && frame_id <= self.filter.1 {
20-
let bitrate = self.bitrate().unwrap();
21-
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
22-
ui.set_bitrate(bitrate as i32);
23-
let raw_data = ui.get_raw_data();
24-
let mut vec_data = Vec::default();
25-
for data in raw_data.iter() {
26-
vec_data.push(data);
27-
}
28-
if vec_data.len() > MAX_LEN {
29-
vec_data.remove(0);
23+
let (tx, rx) = mpsc::channel();
24+
let mut debug_enable = true;
25+
loop {
26+
if let Ok(en) = rx.try_recv() {
27+
debug_enable = en;
28+
}
29+
if debug_enable {
30+
if let Ok(frame) = self.can_rx.try_recv() {
31+
let frame_id = frame.raw_id() & !0x80000000;
32+
if frame_id >= self.filter.0 && frame_id <= self.filter.1 {
33+
let bitrate = self.bitrate().unwrap();
34+
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
35+
ui.set_bitrate(bitrate as i32);
36+
let raw_data = ui.get_raw_data();
37+
let mut vec_data = Vec::default();
38+
for data in raw_data.iter() {
39+
vec_data.push(data);
40+
}
41+
if vec_data.len() > MAX_LEN {
42+
vec_data.remove(MAX_LEN);
43+
}
44+
vec_data.insert(
45+
0,
46+
raw_can {
47+
time: SharedString::from(format!(
48+
"{:?}",
49+
Local::now().to_string().replace('"', "")
50+
)),
51+
data: SharedString::from(format!("{:?}", frame.data())),
52+
id: SharedString::from(format!("0x{:08X}", frame_id)),
53+
len: frame.len() as i32,
54+
},
55+
);
56+
let message_vec: Rc<VecModel<raw_can>> =
57+
Rc::new(VecModel::from(vec_data));
58+
ui.set_raw_data(message_vec.into());
59+
});
3060
}
31-
vec_data.push(raw_can {
32-
data: SharedString::from(format!("{:?}", frame.data())),
33-
id: SharedString::from(frame_id.to_string()),
34-
len: frame.len() as i32,
35-
});
36-
vec_data.reverse();
37-
let message_vec: Rc<VecModel<raw_can>> = Rc::new(VecModel::from(vec_data));
38-
ui.set_raw_data(message_vec.into());
39-
});
61+
} else {
62+
std::thread::sleep(Duration::from_millis(1));
63+
}
64+
} else {
65+
std::thread::sleep(Duration::from_millis(50));
4066
}
41-
} else {
42-
std::thread::sleep(Duration::from_millis(1));
67+
let tx_clone = tx.clone();
68+
let _ = self.ui_handle.upgrade_in_event_loop(move |ui| {
69+
let enable = ui.get_is_debug_en();
70+
if enable != debug_enable {
71+
let _ = tx_clone.send(enable);
72+
}
73+
});
4374
}
4475
}
4576

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ async fn main() -> io::Result<()> {
101101
ui_handle: &ui_handle,
102102
mspc_rx: &rx,
103103
bitrate: bitrate.to_string(),
104+
dbc: None,
104105
can_tx,
105106
};
106107
loop {

ui/app.slint

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import { raw_can, debugPage } from "debug_page.slint";
1212
export component AppWindow inherits Window {
1313
in property <bool> is_filter: false;
1414
in property <bool> is_new_dbc: false;
15-
in property <bool> is_first_open: true;
1615
in property <bool> is_init: false;
16+
out property <bool> is_debug_en: false;
1717
in property <string> init_string: "Please select CAN device to start";
1818
in property <socket_info> can_sockets;
1919
in property <[CanData]> messages;
@@ -114,10 +114,14 @@ export component AppWindow inherits Window {
114114
}
115115
if root.active-page == 2:
116116
debugPage {
117+
en: is_debug_en;
117118
state: state;
118119
bus_load: bus_load;
119120
bitrate: bitrate;
120121
raw_data: raw_data;
122+
change_state(en) => {
123+
is_debug_en = en;
124+
}
121125
}
122126
}
123127
}

ui/debug_page.slint

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,43 @@
22
import { ListView, Button } from "std-widgets.slint";
33

44
export struct raw_can {
5+
time: string,
56
id: string,
67
len: int,
78
data: string
89
}
10+
11+
12+
export component StartPauseButton inherits Rectangle {
13+
callback clicked();
14+
in-out property <bool> en: false;
15+
border-radius: 5px;
16+
width: 30px;
17+
height: 30px;
18+
states [
19+
pressed when touch-area.pressed : {
20+
}
21+
22+
hover when touch-area.has-hover: {
23+
background: #ffffff.darker(0.4);
24+
}
25+
]
26+
image := Image {
27+
source: root.en ? @image-url("images/play.png") : @image-url("images/pause.png");
28+
width: parent.width * 80%;
29+
height: parent.height * 80%;
30+
colorize: white;
31+
}
32+
touch-area := TouchArea {
33+
pointer-event(event) => {
34+
if (event.button == PointerEventButton.left && event.kind == PointerEventKind.down) {
35+
clicked();
36+
}
37+
}
38+
}
39+
}
940
export component debugPage inherits Rectangle {
41+
in-out property <bool> en;
1042
in property <string> state;
1143
in property <string> bitrate;
1244
in property <string> bus_load;
@@ -15,8 +47,17 @@ export component debugPage inherits Rectangle {
1547
{id: "181FF1FA", len: 4, data: "00 01 02 03 04 05 06 07"},
1648
{id: "181FF1FA", len: 4, data: "00 01 02 03 04 05 06 07"},
1749
{id: "181FF1FA", len: 4, data: "00 01 02 03 04 05 06 07"}];
50+
callback change_state(bool);
51+
1852
VerticalLayout {
1953
HorizontalLayout {
54+
play_button:= StartPauseButton {
55+
en: en;
56+
clicked() => {
57+
en = !en;
58+
change_state(en);
59+
}
60+
}
2061
Rectangle {}
2162
Rectangle {
2263
max-height: 30px;
@@ -63,21 +104,28 @@ export component debugPage inherits Rectangle {
63104
for raw in raw_data: Rectangle {
64105
HorizontalLayout {
65106
Rectangle {
66-
width: parent.width * 30%;
107+
width: parent.width * 40%;
108+
Text {
109+
text: raw.time;
110+
color: white;
111+
}
112+
}
113+
Rectangle {
114+
width: parent.width * 10%;
67115
Text {
68116
text: raw.id;
69117
color: white;
70118
}
71119
}
72120
Rectangle {
73-
width: parent.width * 20%;
121+
width: parent.width * 10%;
74122
Text {
75123
text: raw.len;
76124
color: white;
77125
}
78126
}
79127
Rectangle {
80-
width: parent.width * 50%;
128+
width: parent.width * 40%;
81129
Text {
82130
text: raw.data;
83131
color: white;
@@ -135,4 +183,4 @@ export component debugPage inherits Rectangle {
135183
}
136184
}
137185
}
138-
}
186+
}

ui/images/pause.png

6.58 KB
Loading

ui/images/play.png

2.33 KB
Loading

0 commit comments

Comments
 (0)