Skip to content

Commit afa9fea

Browse files
committed
Add checking CAN ID and CAN data input of transmission
1 parent 316902a commit afa9fea

File tree

5 files changed

+94
-0
lines changed

5 files changed

+94
-0
lines changed

src/main.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,34 @@ async fn main() -> io::Result<()> {
151151
std::process::exit(0);
152152
});
153153

154+
ui.on_can_id_check_string(move |is_extended, can_id| is_valid_can_id(is_extended, &can_id));
155+
156+
ui.on_can_data_check_string(move |can_data| is_valid_can_data(&can_data));
157+
154158
ui.run().unwrap();
155159
Ok(())
156160
}
161+
162+
fn is_valid_can_id(is_extended: bool, can_id: &str) -> bool {
163+
// Try to parse the string as a hex number
164+
match u32::from_str_radix(can_id, 16) {
165+
Ok(id) => {
166+
if is_extended {
167+
id <= 0x1FFFFFFF // Extended CAN ID (29-bit max)
168+
} else {
169+
id <= 0x7FF // Standard CAN ID (11-bit max)
170+
}
171+
}
172+
Err(_) => false, // If parsing fails, it's not a valid hex string
173+
}
174+
}
175+
176+
fn is_valid_can_data(can_data: &str) -> bool {
177+
// CAN data is valid if it's a hex string of even length up to 16 characters (8 bytes)
178+
if can_data.len() % 2 != 0 || can_data.len() > 16 {
179+
return false;
180+
}
181+
182+
// Try to parse the data as hex
183+
can_data.chars().all(|c| c.is_ascii_hexdigit())
184+
}

ui/app.slint

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ export component AppWindow inherits Window {
2929
callback filter_id(CanData, bool);
3030
callback start(string, int, string);
3131
callback can_transmit(bool, string, string);
32+
callback can_id_check_string(bool, string) -> bool;
33+
callback can_data_check_string(string) -> bool;
3234
title: @tr("CAN VIEWER (version 0.2.2)");
3335
icon: @image-url("images/can_viewer_128px.png");
3436
background: #1a1f2b;
@@ -126,6 +128,12 @@ export component AppWindow inherits Window {
126128
can_transmit(is_extended, can_id, can_data) => {
127129
can_transmit(is_extended, can_id, can_data)
128130
}
131+
can_id_check_string(is_extended, id) => {
132+
can_id_check_string(is_extended, id)
133+
}
134+
can_data_check_string(data) => {
135+
can_data_check_string(data)
136+
}
129137
}
130138
}
131139
}

ui/debug_page.slint

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,21 @@ export struct raw_can {
99
data: string
1010
}
1111

12+
export component VerificationIcon inherits Rectangle {
13+
in property <bool> is_ok: true;
14+
if is_ok:
15+
Image {
16+
source: @image-url("images/green_tick.png");
17+
width: 25px;
18+
height: 25px;
19+
}
20+
if !is_ok:
21+
Image {
22+
source: @image-url("images/red_cross.png");
23+
width: 25px;
24+
height: 25px;
25+
}
26+
}
1227

1328
export component StartPauseButton inherits Rectangle {
1429
callback clicked();
@@ -40,18 +55,35 @@ export component StartPauseButton inherits Rectangle {
4055

4156
export component CanTransmitData inherits Rectangle {
4257
callback send(bool, string, string);
58+
out property <bool> can_id_check: false;
59+
out property <bool> can_data_check: false;
60+
callback can_id_check_string(bool, string) -> bool;
61+
callback can_data_check_string(string) -> bool;
4362
HorizontalLayout {
4463
is_extended := MyCheckBox {
4564
text: "Extended Frame";
4665
}
4766
can_id := LineEdit {
4867
placeholder-text: "ID (hex) - eg: 1814FF12";
68+
edited => {
69+
can_id_check = can_id_check_string(is_extended.checked, can_id.text);
70+
}
71+
}
72+
VerificationIcon {
73+
is_ok: can_id_check;
4974
}
5075
can_data := LineEdit {
5176
placeholder-text: "data (hex) - eg: 1A2B3C4D";
77+
edited => {
78+
can_data_check = can_data_check_string(can_data.text);
79+
}
80+
}
81+
VerificationIcon {
82+
is_ok: can_data_check;
5283
}
5384
Button {
5485
text: "send";
86+
enabled: can_id_check && can_data_check;
5587
clicked => {
5688
send(is_extended.checked, can_id.text, can_data.text)
5789
}
@@ -71,6 +103,8 @@ export component debugPage inherits Rectangle {
71103
{id: "181FF1FA", len: 4, data: "00 01 02 03 04 05 06 07"}];
72104
callback change_state(bool);
73105
callback can_transmit(bool, string, string);
106+
callback can_id_check_string(bool, string) -> bool;
107+
callback can_data_check_string(string) -> bool;
74108

75109
VerticalLayout {
76110
HorizontalLayout {
@@ -180,21 +214,45 @@ export component debugPage inherits Rectangle {
180214
send(is_extended, can_id, can_data) => {
181215
can_transmit(is_extended, can_id, can_data);
182216
}
217+
can_id_check_string(is_extended, id) => {
218+
can_id_check_string(is_extended, id)
219+
}
220+
can_data_check_string(data) => {
221+
can_data_check_string(data)
222+
}
183223
}
184224
CanTransmitData {
185225
send(is_extended, can_id, can_data) => {
186226
can_transmit(is_extended, can_id, can_data);
187227
}
228+
can_id_check_string(is_extended, id) => {
229+
can_id_check_string(is_extended, id)
230+
}
231+
can_data_check_string(data) => {
232+
can_data_check_string(data)
233+
}
188234
}
189235
CanTransmitData {
190236
send(is_extended, can_id, can_data) => {
191237
can_transmit(is_extended, can_id, can_data);
192238
}
239+
can_id_check_string(is_extended, id) => {
240+
can_id_check_string(is_extended, id)
241+
}
242+
can_data_check_string(data) => {
243+
can_data_check_string(data)
244+
}
193245
}
194246
CanTransmitData {
195247
send(is_extended, can_id, can_data) => {
196248
can_transmit(is_extended, can_id, can_data);
197249
}
250+
can_id_check_string(is_extended, id) => {
251+
can_id_check_string(is_extended, id)
252+
}
253+
can_data_check_string(data) => {
254+
can_data_check_string(data)
255+
}
198256
}
199257
}
200258
}

ui/images/green_tick.png

105 KB
Loading

ui/images/red_cross.png

24.7 KB
Loading

0 commit comments

Comments
 (0)