@@ -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 ) ) ]
365389pub enum BarThree {
366390 Off ,
@@ -383,9 +407,15 @@ pub enum BarFour {
383407/// This is just to make testing easier
384408fn main ( ) { }
385409
386- #[ derive( Clone , Copy , PartialEq , Eq ) ]
410+ #[ derive( Clone , Copy , PartialEq ) ]
387411#[ cfg_attr( feature = "debug" , derive( Debug ) ) ]
388412pub 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