#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::proto::mavlink_messages_v1 as proto;
use crate::protocol::{errors::ProtoImportError, Units, Value};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct EnumEntryMavCmdParam {
index: u8,
description: String,
label: Option<String>,
units: Option<Units>,
r#enum: Option<String>,
decimal_places: Option<u8>,
increment: Option<Value>,
min_value: Option<Value>,
max_value: Option<Value>,
reserved: bool,
default: Option<Value>,
}
impl EnumEntryMavCmdParam {
#[allow(clippy::too_many_arguments)]
pub fn new(
index: u8,
description: String,
label: Option<String>,
units: Option<Units>,
r#enum: Option<String>,
decimal_places: Option<u8>,
increment: Option<Value>,
min_value: Option<Value>,
max_value: Option<Value>,
reserved: bool,
default: Option<Value>,
) -> Self {
Self {
index,
description,
label,
units,
r#enum,
decimal_places,
increment,
min_value,
max_value,
reserved,
default,
}
}
pub fn to_proto(&self) -> proto::EnumEntryMavCmdParam {
proto::EnumEntryMavCmdParam {
index: self.index as u32,
description: self.description.to_string(),
label: self.label.clone(),
units: self.units.as_ref().map(|u| u.to_proto() as i32),
r#enum: self.r#enum.clone(),
decimal_places: self.decimal_places.map(|dec| dec as u32),
increment: self.increment.as_ref().map(|inc| inc.to_proto()),
min_value: self.min_value.as_ref().map(|min| min.to_proto()),
max_value: self.min_value.as_ref().map(|max| max.to_proto()),
reserved: self.reserved,
default: self.min_value.as_ref().map(|def| def.to_proto()),
}
}
pub fn from_proto(proto: proto::EnumEntryMavCmdParam) -> Result<Self, ProtoImportError> {
Ok(Self {
index: proto.index as u8,
description: proto.description.clone(),
label: proto.label,
units: match proto.units {
None => None,
Some(val) => Some(Units::from_value(val)?),
},
r#enum: proto.r#enum.clone(),
decimal_places: proto.decimal_places.map(|val| val as u8),
increment: match proto.increment {
None => None,
Some(value) => Some(Value::from_proto(value)?),
},
min_value: match proto.min_value {
None => None,
Some(value) => Some(Value::from_proto(value)?),
},
max_value: match proto.max_value {
None => None,
Some(value) => Some(Value::from_proto(value)?),
},
reserved: proto.reserved,
default: match proto.default {
None => None,
Some(value) => Some(Value::from_proto(value)?),
},
})
}
pub fn index(&self) -> u8 {
self.index
}
pub fn description(&self) -> &String {
&self.description
}
pub fn label(&self) -> &Option<String> {
&self.label
}
pub fn units(&self) -> &Option<Units> {
&self.units
}
pub fn r#enum(&self) -> &Option<String> {
&self.r#enum
}
pub fn decimal_places(&self) -> Option<u8> {
self.decimal_places
}
pub fn increment(&self) -> &Option<Value> {
&self.increment
}
pub fn min_value(&self) -> &Option<Value> {
&self.min_value
}
pub fn max_value(&self) -> &Option<Value> {
&self.max_value
}
pub fn reserved(&self) -> bool {
self.reserved
}
pub fn default(&self) -> &Option<Value> {
&self.default
}
}