Skip to content

Commit ad9991b

Browse files
committed
Generate raw signal getters and setters
1 parent fcfc704 commit ad9991b

82 files changed

Lines changed: 23742 additions & 9806 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ SG_ Type : 30|1@0+ (1,0) [0|1] "boolean" Dolor
189189

190190
```rust,ignore
191191
pub fn xtype(&self) -> BarType {
192-
match self.xtype_raw() {
192+
match self.xtype_phys() {
193193
false => BarType::X0off,
194194
true => BarType::X1on,
195195
x => BarType::_Other(x),

src/lib.rs

Lines changed: 69 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ impl Config<'_> {
739739
}
740740
}
741741
}
742-
writeln!(w, "_ => {type_name}::_Other(self.{fn_name}_raw()),")?;
742+
writeln!(w, "_ => {type_name}::_Other(self.{fn_name}_phys()),")?;
743743
}
744744
writeln!(w, "}}")?;
745745
}
@@ -750,30 +750,29 @@ impl Config<'_> {
750750
writeln!(w, "pub fn {fn_name}(&self) -> {typ} {{")?;
751751
{
752752
let mut w = PadAdapter::wrap(w);
753-
writeln!(w, "self.{fn_name}_raw()")?;
753+
writeln!(w, "self.{fn_name}_phys()")?;
754754
}
755755
writeln!(w, "}}")?;
756756
writeln!(w)?;
757757
}
758758

759-
writeln!(w, "/// Get raw value of '{}'", signal.name)?;
759+
writeln!(w, "/// Get physical value of '{}'", signal.name)?;
760760
writeln!(w, "///")?;
761-
writeln!(w, "/// - Start bit: {}", signal.start_bit)?;
762-
writeln!(w, "/// - Signal size: {} bits", signal.size)?;
763761
writeln!(w, "/// - Factor: {}", signal.factor)?;
764762
writeln!(w, "/// - Offset: {}", signal.offset)?;
765-
writeln!(w, "/// - Byte order: {:?}", signal.byte_order)?;
766-
writeln!(w, "/// - Value type: {:?}", signal.value_type)?;
763+
writeln!(w, "/// - Unit: {:?}", signal.unit)?;
767764
writeln!(w, "#[inline(always)]")?;
768765
let typ = ValType::from_signal(signal);
769-
writeln!(w, "pub fn {fn_name}_raw(&self) -> {typ} {{")?;
766+
writeln!(w, "pub fn {fn_name}_phys(&self) -> {typ} {{")?;
770767
{
771768
let mut w = PadAdapter::wrap(w);
772769
signal_from_payload(&mut w, signal, msg).context("signal from payload")?;
773770
}
774771
writeln!(w, "}}")?;
775772
writeln!(w)?;
776773

774+
render_raw_accessors(w, signal, msg)?;
775+
777776
self.render_set_signal(w, signal, dbc, msg)?;
778777

779778
Ok(())
@@ -861,25 +860,24 @@ impl Config<'_> {
861860
dbc: &Dbc,
862861
msg: &Message,
863862
) -> Result<()> {
864-
writeln!(w, "/// Get raw value of '{}'", signal.name)?;
863+
writeln!(w, "/// Get physical value of '{}'", signal.name)?;
865864
writeln!(w, "///")?;
866-
writeln!(w, "/// - Start bit: {}", signal.start_bit)?;
867-
writeln!(w, "/// - Signal size: {} bits", signal.size)?;
868865
writeln!(w, "/// - Factor: {}", signal.factor)?;
869866
writeln!(w, "/// - Offset: {}", signal.offset)?;
870-
writeln!(w, "/// - Byte order: {:?}", signal.byte_order)?;
871-
writeln!(w, "/// - Value type: {:?}", signal.value_type)?;
867+
writeln!(w, "/// - Unit: {:?}", signal.unit)?;
872868
writeln!(w, "#[inline(always)]")?;
873869
let field = signal.field_name();
874870
let signal_typ = ValType::from_signal(signal);
875-
writeln!(w, "pub fn {field}_raw(&self) -> {signal_typ} {{")?;
871+
writeln!(w, "pub fn {field}_phys(&self) -> {signal_typ} {{")?;
876872
{
877873
let mut w = PadAdapter::wrap(w);
878874
signal_from_payload(&mut w, signal, msg).context("signal from payload")?;
879875
}
880876
writeln!(w, "}}")?;
881877
writeln!(w)?;
882878

879+
render_raw_accessors(w, signal, msg)?;
880+
883881
let field = signal.field_name();
884882
let typ = multiplex_enum_name(msg, signal)?;
885883
writeln!(w, "pub fn {field}(&mut self) -> Result<{typ}, CanError> {{")?;
@@ -899,7 +897,7 @@ impl Config<'_> {
899897

900898
{
901899
let mut w = PadAdapter::wrap(w);
902-
writeln!(w, "match self.{}_raw() {{", signal.field_name())?;
900+
writeln!(w, "match self.{}_phys() {{", signal.field_name())?;
903901

904902
{
905903
let mut w = PadAdapter::wrap(&mut w);
@@ -1198,6 +1196,14 @@ fn signal_to_payload(w: &mut impl Write, signal: &Signal, msg: &Message) -> Resu
11981196
}
11991197
}
12001198

1199+
pack_bits(w, signal, msg)?;
1200+
1201+
writeln!(w, "Ok(())")?;
1202+
Ok(())
1203+
}
1204+
1205+
/// Pack `value` into the message payload.
1206+
fn pack_bits(w: &mut impl Write, signal: &Signal, msg: &Message) -> Result<()> {
12011207
if signal.value_type == Signed {
12021208
let typ = ValType::from_signal_uint(signal);
12031209
writeln!(w, "let value = {typ}::from_ne_bytes(value.to_ne_bytes());")?;
@@ -1220,7 +1226,54 @@ fn signal_to_payload(w: &mut impl Write, signal: &Signal, msg: &Message) -> Resu
12201226
}
12211227
}
12221228

1223-
writeln!(w, "Ok(())")?;
1229+
Ok(())
1230+
}
1231+
1232+
/// Generate the raw getter and setter for a signal.
1233+
fn render_raw_accessors(w: &mut impl Write, signal: &Signal, msg: &Message) -> Result<()> {
1234+
let field = signal.field_name();
1235+
let typ = ValType::from_signal_int(signal);
1236+
1237+
writeln!(w, "/// Get raw value of '{}'", signal.name)?;
1238+
writeln!(w, "///")?;
1239+
writeln!(w, "/// - Start bit: {}", signal.start_bit)?;
1240+
writeln!(w, "/// - Signal size: {} bits", signal.size)?;
1241+
writeln!(w, "/// - Byte order: {:?}", signal.byte_order)?;
1242+
writeln!(w, "/// - Value type: {:?}", signal.value_type)?;
1243+
writeln!(w, "#[inline(always)]")?;
1244+
writeln!(w, "pub fn {field}_raw(&self) -> {typ} {{")?;
1245+
{
1246+
let mut w = PadAdapter::wrap(&mut *w);
1247+
writeln!(w, "{}", read_fn(signal, msg)?)?;
1248+
}
1249+
writeln!(w, "}}")?;
1250+
writeln!(w)?;
1251+
1252+
// To avoid accidentally changing the multiplexor value without changing
1253+
// the signals accordingly this fn is kept private for multiplexors.
1254+
let visibility = if signal.multiplexer_indicator == Multiplexor {
1255+
""
1256+
} else {
1257+
"pub "
1258+
};
1259+
1260+
writeln!(w, "/// Set raw value of '{}'", signal.name)?;
1261+
if visibility.is_empty() {
1262+
// Private multiplexor raw setters have no internal caller.
1263+
writeln!(w, "#[allow(dead_code)]")?;
1264+
}
1265+
writeln!(w, "#[inline(always)]")?;
1266+
writeln!(
1267+
w,
1268+
"{visibility}fn set_{field}_raw(&mut self, value: {typ}) {{",
1269+
)?;
1270+
{
1271+
let mut w = PadAdapter::wrap(&mut *w);
1272+
pack_bits(&mut w, signal, msg)?;
1273+
}
1274+
writeln!(w, "}}")?;
1275+
writeln!(w)?;
1276+
12241277
Ok(())
12251278
}
12261279

tests-snapshots/canpy/DBC_template.snap.rs

Lines changed: 94 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -93,22 +93,35 @@ impl CanMultiplexed {
9393
pub fn raw(&self) -> &[u8; 2] {
9494
&self.raw
9595
}
96+
/// Get physical value of 'Multiplexer'
97+
///
98+
/// - Factor: 1
99+
/// - Offset: 0
100+
/// - Unit: ""
101+
#[inline(always)]
102+
pub fn multiplexer_phys(&self) -> u8 {
103+
let signal = self.raw.view_bits::<Lsb0>()[0..8].load_le::<u8>();
104+
let factor = 1;
105+
u8::from(signal).saturating_mul(factor).saturating_add(0)
106+
}
96107
/// Get raw value of 'Multiplexer'
97108
///
98109
/// - Start bit: 0
99110
/// - Signal size: 8 bits
100-
/// - Factor: 1
101-
/// - Offset: 0
102111
/// - Byte order: LittleEndian
103112
/// - Value type: Unsigned
104113
#[inline(always)]
105114
pub fn multiplexer_raw(&self) -> u8 {
106-
let signal = self.raw.view_bits::<Lsb0>()[0..8].load_le::<u8>();
107-
let factor = 1;
108-
u8::from(signal).saturating_mul(factor).saturating_add(0)
115+
self.raw.view_bits::<Lsb0>()[0..8].load_le::<u8>()
116+
}
117+
/// Set raw value of 'Multiplexer'
118+
#[allow(dead_code)]
119+
#[inline(always)]
120+
fn set_multiplexer_raw(&mut self, value: u8) {
121+
self.raw.view_bits_mut::<Lsb0>()[0..8].store_le(value);
109122
}
110123
pub fn multiplexer(&mut self) -> Result<CanMultiplexedMultiplexerIndex, CanError> {
111-
match self.multiplexer_raw() {
124+
match self.multiplexer_phys() {
112125
0 => {
113126
Ok(
114127
CanMultiplexedMultiplexerIndex::M0(CanMultiplexedMultiplexerM0 {
@@ -321,22 +334,34 @@ impl CanMultiplexedMultiplexerM0 {
321334
2 => CanMultiplexedValue0::Value2,
322335
1 => CanMultiplexedValue0::Value1,
323336
0 => CanMultiplexedValue0::Value0,
324-
_ => CanMultiplexedValue0::_Other(self.value0_raw()),
337+
_ => CanMultiplexedValue0::_Other(self.value0_phys()),
325338
}
326339
}
340+
/// Get physical value of 'Value0'
341+
///
342+
/// - Factor: 1
343+
/// - Offset: 0
344+
/// - Unit: ""
345+
#[inline(always)]
346+
pub fn value0_phys(&self) -> u8 {
347+
let signal = self.raw.view_bits::<Lsb0>()[8..16].load_le::<u8>();
348+
let factor = 1;
349+
u8::from(signal).saturating_mul(factor).saturating_add(0)
350+
}
327351
/// Get raw value of 'Value0'
328352
///
329353
/// - Start bit: 8
330354
/// - Signal size: 8 bits
331-
/// - Factor: 1
332-
/// - Offset: 0
333355
/// - Byte order: LittleEndian
334356
/// - Value type: Unsigned
335357
#[inline(always)]
336358
pub fn value0_raw(&self) -> u8 {
337-
let signal = self.raw.view_bits::<Lsb0>()[8..16].load_le::<u8>();
338-
let factor = 1;
339-
u8::from(signal).saturating_mul(factor).saturating_add(0)
359+
self.raw.view_bits::<Lsb0>()[8..16].load_le::<u8>()
360+
}
361+
/// Set raw value of 'Value0'
362+
#[inline(always)]
363+
pub fn set_value0_raw(&mut self, value: u8) {
364+
self.raw.view_bits_mut::<Lsb0>()[8..16].store_le(value);
340365
}
341366
/// Set value of 'Value0'
342367
#[inline(always)]
@@ -398,22 +423,34 @@ impl CanMultiplexedMultiplexerM1 {
398423
2 => CanMultiplexedValue1::Two,
399424
1 => CanMultiplexedValue1::One,
400425
0 => CanMultiplexedValue1::Zero,
401-
_ => CanMultiplexedValue1::_Other(self.value1_raw()),
426+
_ => CanMultiplexedValue1::_Other(self.value1_phys()),
402427
}
403428
}
429+
/// Get physical value of 'Value1'
430+
///
431+
/// - Factor: 1
432+
/// - Offset: 0
433+
/// - Unit: ""
434+
#[inline(always)]
435+
pub fn value1_phys(&self) -> u8 {
436+
let signal = self.raw.view_bits::<Lsb0>()[8..16].load_le::<u8>();
437+
let factor = 1;
438+
u8::from(signal).saturating_mul(factor).saturating_add(0)
439+
}
404440
/// Get raw value of 'Value1'
405441
///
406442
/// - Start bit: 8
407443
/// - Signal size: 8 bits
408-
/// - Factor: 1
409-
/// - Offset: 0
410444
/// - Byte order: LittleEndian
411445
/// - Value type: Unsigned
412446
#[inline(always)]
413447
pub fn value1_raw(&self) -> u8 {
414-
let signal = self.raw.view_bits::<Lsb0>()[8..16].load_le::<u8>();
415-
let factor = 1;
416-
u8::from(signal).saturating_mul(factor).saturating_add(0)
448+
self.raw.view_bits::<Lsb0>()[8..16].load_le::<u8>()
449+
}
450+
/// Set raw value of 'Value1'
451+
#[inline(always)]
452+
pub fn set_value1_raw(&mut self, value: u8) {
453+
self.raw.view_bits_mut::<Lsb0>()[8..16].store_le(value);
417454
}
418455
/// Set value of 'Value1'
419456
#[inline(always)]
@@ -481,22 +518,34 @@ impl CanMessage {
481518
/// - Receivers: Node1, Node2
482519
#[inline(always)]
483520
pub fn signal1(&self) -> u64 {
484-
self.signal1_raw()
521+
self.signal1_phys()
485522
}
486-
/// Get raw value of 'Signal1'
523+
/// Get physical value of 'Signal1'
487524
///
488-
/// - Start bit: 32
489-
/// - Signal size: 32 bits
490525
/// - Factor: 100
491526
/// - Offset: 0
492-
/// - Byte order: LittleEndian
493-
/// - Value type: Unsigned
527+
/// - Unit: "%"
494528
#[inline(always)]
495-
pub fn signal1_raw(&self) -> u64 {
529+
pub fn signal1_phys(&self) -> u64 {
496530
let signal = self.raw.view_bits::<Lsb0>()[32..64].load_le::<u32>();
497531
let factor = 100;
498532
u64::from(signal).saturating_mul(factor).saturating_add(0)
499533
}
534+
/// Get raw value of 'Signal1'
535+
///
536+
/// - Start bit: 32
537+
/// - Signal size: 32 bits
538+
/// - Byte order: LittleEndian
539+
/// - Value type: Unsigned
540+
#[inline(always)]
541+
pub fn signal1_raw(&self) -> u32 {
542+
self.raw.view_bits::<Lsb0>()[32..64].load_le::<u32>()
543+
}
544+
/// Set raw value of 'Signal1'
545+
#[inline(always)]
546+
pub fn set_signal1_raw(&mut self, value: u32) {
547+
self.raw.view_bits_mut::<Lsb0>()[32..64].store_le(value);
548+
}
500549
/// Set value of 'Signal1'
501550
#[inline(always)]
502551
pub fn set_signal1(&mut self, value: u64) -> Result<(), CanError> {
@@ -525,23 +574,36 @@ impl CanMessage {
525574
/// - Receivers: Node1, Node2
526575
#[inline(always)]
527576
pub fn signal0(&self) -> i32 {
528-
self.signal0_raw()
577+
self.signal0_phys()
529578
}
530-
/// Get raw value of 'Signal0'
579+
/// Get physical value of 'Signal0'
531580
///
532-
/// - Start bit: 0
533-
/// - Signal size: 32 bits
534581
/// - Factor: 1
535582
/// - Offset: 0
536-
/// - Byte order: LittleEndian
537-
/// - Value type: Signed
583+
/// - Unit: ""
538584
#[inline(always)]
539-
pub fn signal0_raw(&self) -> i32 {
585+
pub fn signal0_phys(&self) -> i32 {
540586
let signal = self.raw.view_bits::<Lsb0>()[0..32].load_le::<i32>();
541587
let factor = 1;
542588
let signal = signal as i32;
543589
i32::from(signal).saturating_mul(factor).saturating_add(0)
544590
}
591+
/// Get raw value of 'Signal0'
592+
///
593+
/// - Start bit: 0
594+
/// - Signal size: 32 bits
595+
/// - Byte order: LittleEndian
596+
/// - Value type: Signed
597+
#[inline(always)]
598+
pub fn signal0_raw(&self) -> i32 {
599+
self.raw.view_bits::<Lsb0>()[0..32].load_le::<i32>()
600+
}
601+
/// Set raw value of 'Signal0'
602+
#[inline(always)]
603+
pub fn set_signal0_raw(&mut self, value: i32) {
604+
let value = u32::from_ne_bytes(value.to_ne_bytes());
605+
self.raw.view_bits_mut::<Lsb0>()[0..32].store_le(value);
606+
}
545607
/// Set value of 'Signal0'
546608
#[inline(always)]
547609
pub fn set_signal0(&mut self, value: i32) -> Result<(), CanError> {

0 commit comments

Comments
 (0)