Skip to content

Commit 1f4d5d4

Browse files
author
Pascal Hertleif
authored
Merge pull request #5 from marcelbuesing/assert-range
Add check for range of value parameter when setting signal
2 parents f6aa0bd + eb8ce47 commit 1f4d5d4

File tree

5 files changed

+66
-3
lines changed

5 files changed

+66
-3
lines changed

src/includes/errors.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
#[derive(Clone, Copy, PartialEq, Eq)]
1+
#[derive(Clone, Copy, PartialEq)]
22
#[cfg_attr(feature = "debug", derive(Debug))]
33
pub enum CanError {
44
UnknownMessageId(u32),
5+
/// Signal parameter is not within the range
6+
/// defined in the dbc
7+
ParameterOutOfRange {
8+
/// dbc message id
9+
message_id: u32,
10+
},
511
InvalidPayloadSize,
612
}

src/main.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,15 @@ fn render_signal(mut w: impl Write, signal: &Signal, dbc: &DBC, msg: &Message) -
379379
)?;
380380
{
381381
let mut w = PadAdapter::wrap(&mut w);
382+
writeln!(w, r##"#[cfg(feature = "range_checked")]"##)?;
383+
writeln!(
384+
w,
385+
r##"if value < {min}_{typ} || {max}_{typ} < value {{ return Err(CanError::ParameterOutOfRange{{ message_id: {message_id} }}); }}"##,
386+
typ = signal_to_rust_type(&signal),
387+
message_id = msg.message_id().0,
388+
min = signal.min(),
389+
max = signal.max(),
390+
)?;
382391
signal_to_payload(&mut w, signal)?;
383392
}
384393
writeln!(&mut w, "}}")?;

testing/can-messages/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ bitsh = { git = "https://github.com/bitbleep/bitsh/" }
1010
[features]
1111
default = ["debug"]
1212
debug = []
13+
range_checked = []

testing/can-messages/src/lib.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,19 @@
11
mod messages;
22
pub use messages::*;
3+
4+
#[test]
5+
#[cfg(feature = "range_checked")]
6+
fn check_range_value_error() {
7+
let result = messages::Bar::new(1, 2.0, 3, 4);
8+
assert!(matches!(
9+
result,
10+
Err(CanError::ParameterOutOfRange { message_id: 512 })
11+
));
12+
}
13+
14+
#[test]
15+
#[cfg(feature = "range_checked")]
16+
fn check_range_value_valid() {
17+
let result = messages::Bar::new(1, 2.0, 3, 3);
18+
assert!(result.is_ok());
19+
}

testing/can-messages/src/messages.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ impl Foo {
9191
/// Set value of Voltage
9292
#[inline(always)]
9393
pub fn set_voltage(&mut self, value: f32) -> Result<(), CanError> {
94+
#[cfg(feature = "range_checked")]
95+
if value < 0_f32 || 63.9990234375_f32 < value {
96+
return Err(CanError::ParameterOutOfRange { message_id: 256 });
97+
}
9498
let factor = 0.000976562_f32;
9599
let offset = 0_f32;
96100
let value = ((value - offset) / factor) as u16;
@@ -132,6 +136,10 @@ impl Foo {
132136
/// Set value of Current
133137
#[inline(always)]
134138
pub fn set_current(&mut self, value: f32) -> Result<(), CanError> {
139+
#[cfg(feature = "range_checked")]
140+
if value < -2048_f32 || 2047.9375_f32 < value {
141+
return Err(CanError::ParameterOutOfRange { message_id: 256 });
142+
}
135143
let factor = 0.0625_f32;
136144
let offset = 0_f32;
137145
let value = ((value - offset) / factor) as i16;
@@ -215,6 +223,10 @@ impl Bar {
215223
/// Set value of One
216224
#[inline(always)]
217225
pub fn set_one(&mut self, value: u8) -> Result<(), CanError> {
226+
#[cfg(feature = "range_checked")]
227+
if value < 0_u8 || 3_u8 < value {
228+
return Err(CanError::ParameterOutOfRange { message_id: 512 });
229+
}
218230
let start_bit = 15;
219231
let bits = 2;
220232
value.pack_be_bits(&mut self.raw, start_bit, bits);
@@ -252,6 +264,10 @@ impl Bar {
252264
/// Set value of Two
253265
#[inline(always)]
254266
pub fn set_two(&mut self, value: f32) -> Result<(), CanError> {
267+
#[cfg(feature = "range_checked")]
268+
if value < 0_f32 || 100_f32 < value {
269+
return Err(CanError::ParameterOutOfRange { message_id: 512 });
270+
}
255271
let factor = 0.39_f32;
256272
let offset = 0_f32;
257273
let value = ((value - offset) / factor) as u8;
@@ -297,6 +313,10 @@ impl Bar {
297313
/// Set value of Three
298314
#[inline(always)]
299315
pub fn set_three(&mut self, value: u8) -> Result<(), CanError> {
316+
#[cfg(feature = "range_checked")]
317+
if value < 0_u8 || 7_u8 < value {
318+
return Err(CanError::ParameterOutOfRange { message_id: 512 });
319+
}
300320
let start_bit = 13;
301321
let bits = 3;
302322
value.pack_be_bits(&mut self.raw, start_bit, bits);
@@ -338,6 +358,10 @@ impl Bar {
338358
/// Set value of Four
339359
#[inline(always)]
340360
pub fn set_four(&mut self, value: u8) -> Result<(), CanError> {
361+
#[cfg(feature = "range_checked")]
362+
if value < 0_u8 || 3_u8 < value {
363+
return Err(CanError::ParameterOutOfRange { message_id: 512 });
364+
}
341365
let start_bit = 10;
342366
let bits = 2;
343367
value.pack_be_bits(&mut self.raw, start_bit, bits);
@@ -360,7 +384,7 @@ impl core::convert::TryFrom<&[u8]> for Bar {
360384
}
361385

362386
/// Defined values for Three
363-
#[derive(Clone, Copy)]
387+
#[derive(Clone, Copy, PartialEq)]
364388
#[cfg_attr(feature = "debug", derive(Debug))]
365389
pub enum BarThree {
366390
Off,
@@ -383,9 +407,15 @@ pub enum BarFour {
383407
/// This is just to make testing easier
384408
fn main() {}
385409

386-
#[derive(Clone, Copy, PartialEq, Eq)]
410+
#[derive(Clone, Copy, PartialEq)]
387411
#[cfg_attr(feature = "debug", derive(Debug))]
388412
pub enum CanError {
389413
UnknownMessageId(u32),
414+
/// Signal parameter is not within the range
415+
/// defined in the dbc
416+
ParameterOutOfRange {
417+
/// dbc message id
418+
message_id: u32,
419+
},
390420
InvalidPayloadSize,
391421
}

0 commit comments

Comments
 (0)