@@ -10,15 +10,18 @@ impl StandardId {
10
10
pub const ZERO : Self = Self ( 0 ) ;
11
11
12
12
/// CAN ID `0x7FF`, the lowest priority.
13
- pub const MAX : Self = Self ( 0x7FF ) ;
13
+ pub const MAX : Self = Self ( Self :: MAX_RAW ) ;
14
+
15
+ /// Raw CAN ID `0x7FF`, the lowest priority.
16
+ const MAX_RAW : u16 = 0x7FF ;
14
17
15
18
/// Tries to create a `StandardId` from a raw 16-bit integer.
16
19
///
17
20
/// This will return `None` if `raw` is out of range of an 11-bit integer (`> 0x7FF`).
18
21
#[ inline]
19
22
#[ must_use]
20
23
pub const fn new ( raw : u16 ) -> Option < Self > {
21
- if raw <= 0x7FF {
24
+ if raw <= Self :: MAX_RAW {
22
25
Some ( Self ( raw) )
23
26
} else {
24
27
None
@@ -53,15 +56,18 @@ impl ExtendedId {
53
56
pub const ZERO : Self = Self ( 0 ) ;
54
57
55
58
/// CAN ID `0x1FFFFFFF`, the lowest priority.
56
- pub const MAX : Self = Self ( 0x1FFF_FFFF ) ;
59
+ pub const MAX : Self = Self ( Self :: MAX_RAW ) ;
60
+
61
+ /// Raw CAN ID `0x1FFFFFFF`, the lowest priority.
62
+ const MAX_RAW : u32 = 0x1FFF_FFFF ;
57
63
58
64
/// Tries to create a `ExtendedId` from a raw 32-bit integer.
59
65
///
60
66
/// This will return `None` if `raw` is out of range of an 29-bit integer (`> 0x1FFF_FFFF`).
61
67
#[ inline]
62
68
#[ must_use]
63
69
pub const fn new ( raw : u32 ) -> Option < Self > {
64
- if raw <= 0x1FFF_FFFF {
70
+ if raw <= Self :: MAX_RAW {
65
71
Some ( Self ( raw) )
66
72
} else {
67
73
None
@@ -104,6 +110,27 @@ pub enum Id {
104
110
Extended ( ExtendedId ) ,
105
111
}
106
112
113
+ impl Id {
114
+ /// Creates a CAN identifier as a standard ID.
115
+ pub fn new_standard ( raw : u16 ) -> Option < Self > {
116
+ Some ( Id :: from ( StandardId :: new ( raw) ?) )
117
+ }
118
+
119
+ /// Creates a CAN identifier as an extended ID.
120
+ pub fn new_extended ( raw : u32 ) -> Option < Self > {
121
+ Some ( Id :: from ( ExtendedId :: new ( raw) ?) )
122
+ }
123
+
124
+ /// Determines if the value is a standard, 11-bit, identifier.
125
+ pub fn is_standard ( & self ) -> bool {
126
+ matches ! ( self , Id :: Standard ( _) )
127
+ }
128
+ /// Determines if the value is an extended, 29-bit, identifier.
129
+ pub fn is_extended ( & self ) -> bool {
130
+ matches ! ( self , Id :: Extended ( _) )
131
+ }
132
+ }
133
+
107
134
/// Implement `Ord` according to the CAN arbitration rules
108
135
///
109
136
/// When performing arbitration, frames are looked at bit for bit starting
@@ -162,20 +189,17 @@ mod tests {
162
189
163
190
#[ test]
164
191
fn standard_id_new ( ) {
165
- assert_eq ! (
166
- StandardId :: new( StandardId :: MAX . as_raw( ) ) ,
167
- Some ( StandardId :: MAX )
168
- ) ;
192
+ assert_eq ! ( StandardId :: new( StandardId :: MAX_RAW ) , Some ( StandardId :: MAX ) ) ;
169
193
}
170
194
171
195
#[ test]
172
196
fn standard_id_new_out_of_range ( ) {
173
- assert_eq ! ( StandardId :: new( StandardId :: MAX . as_raw ( ) + 1 ) , None ) ;
197
+ assert_eq ! ( StandardId :: new( StandardId :: MAX_RAW + 1 ) , None ) ;
174
198
}
175
199
176
200
#[ test]
177
201
fn standard_id_new_unchecked_out_of_range ( ) {
178
- let id = StandardId :: MAX . as_raw ( ) + 1 ;
202
+ let id = StandardId :: MAX_RAW + 1 ;
179
203
assert_eq ! ( unsafe { StandardId :: new_unchecked( id) } , StandardId ( id) ) ;
180
204
}
181
205
@@ -189,12 +213,12 @@ mod tests {
189
213
190
214
#[ test]
191
215
fn extended_id_new_out_of_range ( ) {
192
- assert_eq ! ( ExtendedId :: new( ExtendedId :: MAX . as_raw ( ) + 1 ) , None ) ;
216
+ assert_eq ! ( ExtendedId :: new( ExtendedId :: MAX_RAW + 1 ) , None ) ;
193
217
}
194
218
195
219
#[ test]
196
220
fn extended_id_new_unchecked_out_of_range ( ) {
197
- let id = ExtendedId :: MAX . as_raw ( ) + 1 ;
221
+ let id = ExtendedId :: MAX_RAW + 1 ;
198
222
assert_eq ! ( unsafe { ExtendedId :: new_unchecked( id) } , ExtendedId ( id) ) ;
199
223
}
200
224
@@ -216,4 +240,32 @@ mod tests {
216
240
assert ! ( Id :: Extended ( ExtendedId ( ( 1 << 11 ) - 1 ) ) < Id :: Standard ( StandardId ( 1 ) ) ) ;
217
241
assert ! ( Id :: Standard ( StandardId ( 1 ) ) < Id :: Extended ( ExtendedId :: MAX ) ) ;
218
242
}
243
+
244
+ #[ test]
245
+ fn id_new ( ) {
246
+ let id = Id :: new_standard ( StandardId :: MAX_RAW ) . unwrap ( ) ;
247
+ assert ! ( id. is_standard( ) ) ;
248
+ assert ! ( !id. is_extended( ) ) ;
249
+ match id {
250
+ Id :: Standard ( id) => assert_eq ! ( StandardId :: MAX , id) ,
251
+ _ => assert ! ( false ) ,
252
+ }
253
+
254
+ let id = Id :: new_extended ( ExtendedId :: MAX_RAW ) . unwrap ( ) ;
255
+ assert ! ( !id. is_standard( ) ) ;
256
+ assert ! ( id. is_extended( ) ) ;
257
+ match id {
258
+ Id :: Extended ( id) => assert_eq ! ( ExtendedId :: MAX , id) ,
259
+ _ => assert ! ( false ) ,
260
+ }
261
+ }
262
+
263
+ #[ test]
264
+ fn id_raw ( ) {
265
+ let id = StandardId :: new ( StandardId :: MAX_RAW ) . unwrap ( ) ;
266
+ assert_eq ! ( StandardId :: MAX_RAW , id. as_raw( ) ) ;
267
+
268
+ let id = ExtendedId :: new ( ExtendedId :: MAX_RAW ) . unwrap ( ) ;
269
+ assert_eq ! ( ExtendedId :: MAX_RAW , id. as_raw( ) ) ;
270
+ }
219
271
}
0 commit comments