Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 29 additions & 12 deletions src/registry/a2l/a2l_writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,14 +150,26 @@ fn write_axis_descr(_name: &str, dim_type: &McDimType, mc_support_data: &McSuppo
let x_dim = dim_type.get_dim()[0];
let y_dim = dim_type.get_dim()[1];

let x_axis_input_quantity = if let Some(v) = &mc_support_data.x_axis_input_quantity {
v.as_str()
} else {
"NO_INPUT_QUANTITY"
};
let y_axis_input_quantity = if let Some(v) = &mc_support_data.y_axis_input_quantity {
v.as_str()
} else {
"NO_INPUT_QUANTITY"
};

// MAP
if x_dim > 1 || y_dim > 1 {
if x_dim > 1 && y_dim > 1 {
// X
if let Some(x_axis_conv) = &mc_support_data.x_axis_conv {
write!(
writer,
r#" /begin AXIS_DESCR FIX_AXIS NO_INPUT_QUANTITY {} {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
r#" /begin AXIS_DESCR FIX_AXIS {} {} {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
x_axis_input_quantity,
x_axis_conv,
x_dim, // MaxAxisPoints
x_dim - 1, // 0-UpperLimit
Expand All @@ -166,13 +178,14 @@ fn write_axis_descr(_name: &str, dim_type: &McDimType, mc_support_data: &McSuppo
} else if let Some(x_axis_ref) = &mc_support_data.x_axis_ref {
write!(
writer,
r#" /begin AXIS_DESCR COM_AXIS NO_INPUT_QUANTITY NO_COMPU_METHOD {} 0.0 0.0 AXIS_PTS_REF {} /end AXIS_DESCR"#,
x_dim, x_axis_ref
r#" /begin AXIS_DESCR COM_AXIS {} NO_COMPU_METHOD {} 0.0 0.0 AXIS_PTS_REF {} /end AXIS_DESCR"#,
x_axis_input_quantity, x_dim, x_axis_ref
)?;
} else {
write!(
writer,
r#" /begin AXIS_DESCR FIX_AXIS NO_INPUT_QUANTITY NO_COMPU_METHOD {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
r#" /begin AXIS_DESCR FIX_AXIS {} NO_COMPU_METHOD {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
x_axis_input_quantity,
x_dim,
x_dim - 1,
x_dim
Expand All @@ -182,7 +195,8 @@ fn write_axis_descr(_name: &str, dim_type: &McDimType, mc_support_data: &McSuppo
if let Some(y_axis_conv) = &mc_support_data.y_axis_conv {
write!(
writer,
r#" /begin AXIS_DESCR FIX_AXIS NO_INPUT_QUANTITY {} {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
r#" /begin AXIS_DESCR FIX_AXIS {} {} {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
y_axis_input_quantity,
y_axis_conv,
y_dim,
y_dim - 1,
Expand All @@ -191,13 +205,14 @@ fn write_axis_descr(_name: &str, dim_type: &McDimType, mc_support_data: &McSuppo
} else if let Some(y_axis_ref) = &mc_support_data.y_axis_ref {
write!(
writer,
r#" /begin AXIS_DESCR COM_AXIS NO_INPUT_QUANTITY NO_COMPU_METHOD {} 0.0 0.0 AXIS_PTS_REF {} /end AXIS_DESCR"#,
y_dim, y_axis_ref
r#" /begin AXIS_DESCR COM_AXIS {} NO_COMPU_METHOD {} 0.0 0.0 AXIS_PTS_REF {} /end AXIS_DESCR"#,
y_axis_input_quantity, y_dim, y_axis_ref
)?;
} else {
write!(
writer,
r#" /begin AXIS_DESCR FIX_AXIS NO_INPUT_QUANTITY NO_COMPU_METHOD {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
r#" /begin AXIS_DESCR FIX_AXIS {} NO_COMPU_METHOD {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
y_axis_input_quantity,
y_dim,
y_dim - 1,
y_dim
Expand All @@ -209,7 +224,8 @@ fn write_axis_descr(_name: &str, dim_type: &McDimType, mc_support_data: &McSuppo
if let Some(x_axis_conv) = &mc_support_data.x_axis_conv {
write!(
writer,
r#" /begin AXIS_DESCR FIX_AXIS NO_INPUT_QUANTITY {} {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
r#" /begin AXIS_DESCR FIX_AXIS {} {} {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
x_axis_input_quantity,
x_axis_conv,
x_dim,
x_dim - 1,
Expand All @@ -218,13 +234,14 @@ fn write_axis_descr(_name: &str, dim_type: &McDimType, mc_support_data: &McSuppo
} else if let Some(x_axis_ref) = &mc_support_data.x_axis_ref {
write!(
writer,
r#" /begin AXIS_DESCR COM_AXIS NO_INPUT_QUANTITY NO_COMPU_METHOD {} 0.0 0.0 AXIS_PTS_REF {} /end AXIS_DESCR"#,
x_dim, x_axis_ref
r#" /begin AXIS_DESCR COM_AXIS {} NO_COMPU_METHOD {} 0.0 0.0 AXIS_PTS_REF {} /end AXIS_DESCR"#,
x_axis_input_quantity, x_dim, x_axis_ref
)?;
} else {
write!(
writer,
r#" /begin AXIS_DESCR FIX_AXIS NO_INPUT_QUANTITY NO_COMPU_METHOD {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
r#" /begin AXIS_DESCR FIX_AXIS {} NO_COMPU_METHOD {} 0 {} FIX_AXIS_PAR_DIST 0 1 {} /end AXIS_DESCR"#,
x_axis_input_quantity,
x_dim,
x_dim - 1,
x_dim
Expand Down
36 changes: 36 additions & 0 deletions src/registry/mc_support.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,12 @@ pub struct McSupportData {
#[serde(skip_serializing_if = "Option::is_none")]
pub y_axis_ref: Option<McIdentifier>,

#[serde(skip_serializing_if = "Option::is_none")]
pub x_axis_input_quantity: Option<McIdentifier>,

#[serde(skip_serializing_if = "Option::is_none")]
pub y_axis_input_quantity: Option<McIdentifier>,

#[serde(skip_serializing_if = "Option::is_none")]
pub x_axis_conv: Option<McIdentifier>,

Expand All @@ -165,6 +171,8 @@ impl Default for McSupportData {
step: None,
x_axis_ref: None,
y_axis_ref: None,
x_axis_input_quantity: None,
y_axis_input_quantity: None,
x_axis_conv: None,
y_axis_conv: None,
}
Expand All @@ -186,6 +194,8 @@ impl Clone for McSupportData {
step: self.step,
x_axis_ref: self.x_axis_ref,
y_axis_ref: self.y_axis_ref,
x_axis_input_quantity: self.x_axis_input_quantity,
y_axis_input_quantity: self.y_axis_input_quantity,
x_axis_conv: self.x_axis_conv,
y_axis_conv: self.y_axis_conv,
}
Expand Down Expand Up @@ -223,6 +233,12 @@ impl std::fmt::Display for McSupportData {
if self.y_axis_ref.is_some() {
write!(f, " y_axis_ref={}", self.y_axis_ref.as_ref().unwrap())?;
}
if self.x_axis_input_quantity.is_some() {
write!(f, " x_axis_input_quantity={}", self.x_axis_input_quantity.as_ref().unwrap())?;
}
if self.y_axis_input_quantity.is_some() {
write!(f, " y_axis_input_quantity={}", self.y_axis_input_quantity.as_ref().unwrap())?;
}
if self.x_axis_conv.is_some() {
write!(f, " x_axis_conv={}", self.x_axis_conv.as_ref().unwrap())?;
}
Expand Down Expand Up @@ -251,6 +267,8 @@ impl McSupportData {
step: None,
x_axis_ref: None,
y_axis_ref: None,
x_axis_input_quantity: None,
y_axis_input_quantity: None,
x_axis_conv: None,
y_axis_conv: None,
}
Expand Down Expand Up @@ -347,6 +365,14 @@ impl McSupportData {
self.y_axis_ref = y_axis_ref.map(|s| s.into());
self
}
pub fn set_x_axis_input_quantity<T: Into<McIdentifier>>(mut self, x_axis_input_quantity: Option<T>) -> Self {
self.x_axis_input_quantity = x_axis_input_quantity.map(|s| s.into());
self
}
pub fn set_y_axis_input_quantity<T: Into<McIdentifier>>(mut self, y_axis_input_quantity: Option<T>) -> Self {
self.y_axis_input_quantity = y_axis_input_quantity.map(|s| s.into());
self
}
pub fn set_x_axis_conv<T: Into<McIdentifier>>(mut self, x_axis_conv: Option<T>) -> Self {
self.x_axis_conv = x_axis_conv.map(|s| s.into());
self
Expand Down Expand Up @@ -398,6 +424,16 @@ impl McSupportData {
self.y_axis_ref
}

/// Get the x-axis reference as McIdentifier
pub fn get_x_axis_input_quantity(&self) -> Option<McIdentifier> {
self.x_axis_input_quantity
}

/// Get the y-axis reference as McIdentifier
pub fn get_y_axis_input_quantity(&self) -> Option<McIdentifier> {
self.y_axis_input_quantity
}

/// Get the x-axis conversion as McIdentifier
pub fn get_x_axis_conv(&self) -> Option<McIdentifier> {
self.x_axis_conv
Expand Down
8 changes: 6 additions & 2 deletions src/registry/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,9 @@ where
// .set_unit(field.unit()) // not needed if set_linear is used
.set_linear(field.factor(), field.offset(), field.unit())
.set_x_axis_ref(field.x_axis_ref())
.set_y_axis_ref(field.y_axis_ref());
.set_y_axis_ref(field.y_axis_ref())
.set_x_axis_input_quantity(field.x_axis_input_quantity())
.set_y_axis_input_quantity(field.y_axis_input_quantity());
if field.is_volatile() {
mc_support_data = mc_support_data.set_qualifier(McObjectQualifier::Volatile);
}
Expand Down Expand Up @@ -220,7 +222,9 @@ where
// .set_unit(field.unit()) // not needed if set_linear is used
.set_linear(field.factor(), field.offset(), field.unit())
.set_x_axis_ref(field.x_axis_ref())
.set_y_axis_ref(field.y_axis_ref());
.set_y_axis_ref(field.y_axis_ref())
.set_x_axis_input_quantity(field.x_axis_input_quantity())
.set_y_axis_input_quantity(field.y_axis_input_quantity());
if field.is_volatile() {
mc_support_data = mc_support_data.set_qualifier(McObjectQualifier::Volatile);
}
Expand Down
20 changes: 20 additions & 0 deletions xcp_type_description/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ pub struct FieldDescriptor {
y_dim: u16,
x_axis_ref: &'static str,
y_axis_ref: &'static str,
x_axis_input_quantity: &'static str,
y_axis_input_quantity: &'static str,
addr_offset: u16,
}

Expand All @@ -53,6 +55,8 @@ impl FieldDescriptor {
y_dim: u16,
x_axis_ref: &'static str,
y_axis_ref: &'static str,
x_axis_input_quantity: &'static str,
y_axis_input_quantity: &'static str,
addr_offset: u16,
) -> Self {
FieldDescriptor {
Expand All @@ -72,6 +76,8 @@ impl FieldDescriptor {
y_dim,
x_axis_ref,
y_axis_ref,
x_axis_input_quantity,
y_axis_input_quantity,
addr_offset,
}
}
Expand Down Expand Up @@ -123,6 +129,20 @@ impl FieldDescriptor {
pub fn y_axis_ref(&self) -> Option<&'static str> {
if self.is_axis() || self.y_axis_ref.is_empty() { None } else { Some(self.y_axis_ref) }
}
pub fn x_axis_input_quantity(&self) -> Option<&'static str> {
if self.is_axis() || self.x_axis_input_quantity.is_empty() {
None
} else {
Some(self.x_axis_input_quantity)
}
}
pub fn y_axis_input_quantity(&self) -> Option<&'static str> {
if self.is_axis() || self.y_axis_input_quantity.is_empty() {
None
} else {
Some(self.y_axis_input_quantity)
}
}

pub fn is_measurement(&self) -> bool {
self.classifier == "measurement"
Expand Down
12 changes: 9 additions & 3 deletions xcp_type_description/xcp_type_description_derive/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ extern crate proc_macro;
mod utils;

use proc_macro::TokenStream;
use quote::ToTokens;
use quote::quote;
use syn::{Data, DeriveInput, Expr, parse_macro_input};

Expand All @@ -26,13 +27,14 @@ pub fn xcp_type_description_derive(input: TokenStream) -> TokenStream {
fn generate_type_description_impl(data_struct: syn::DataStruct, value_type: &syn::Ident) -> proc_macro2::TokenStream {
let field_handlers = data_struct.fields.iter().map(|field| {
let field_name = &field.ident; // Field identifier
let field_data_type = &field.ty; // Field type
let raw_type_tokens = field.ty.to_token_stream();
let field_data_type = &syn::parse2(utils::normalize_tokens(raw_type_tokens)).expect("failed to parse normalized"); // Field type
let (x_dim, y_dim) = dimensions(field_data_type); //Dimension of type is array

// Field attributes
// #[axis/characteristic/measurement(...)] attr = access_type, comment, min, max, step, factor, offset, unit, x_axis, y_axis
let field_attributes = &field.attrs;
let (classifier, qualifier, comment, min, max, step, factor, offset, unit, x_axis_ref, y_axis_ref) = parse_field_attributes(field_attributes, field_data_type);
let (classifier, qualifier, comment, min, max, step, factor, offset, unit, x_axis_ref, y_axis_ref, x_axis_input_quantity, y_axis_input_quantity) =
parse_field_attributes(field_attributes, field_data_type);
let classifier_str = classifier.to_str(); // "characteristic" or "axis" or "undefined" from field attribute
let min_token = syn::parse_str::<Expr>(format!("{:?}", min).as_str()).unwrap();
let max_token = syn::parse_str::<Expr>(format!("{:?}", max).as_str()).unwrap();
Expand Down Expand Up @@ -73,6 +75,8 @@ fn generate_type_description_impl(data_struct: syn::DataStruct, value_type: &syn
#y_dim,
#x_axis_ref,
#y_axis_ref,
#x_axis_input_quantity,
#y_axis_input_quantity,
addr_offset,
));
}
Expand All @@ -98,6 +102,8 @@ fn generate_type_description_impl(data_struct: syn::DataStruct, value_type: &syn
#y_dim,
#x_axis_ref,
#y_axis_ref,
#x_axis_input_quantity,
#y_axis_input_quantity,
addr_offset,
));
}
Expand Down
Loading