#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::proto::mavlink_messages_v1 as proto;
use crate::protocol::errors::{ParseError, ProtoImportError};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Units {
Seconds,
DeciSeconds,
CentiSeconds,
MilliSeconds,
MicroSeconds,
NanoSeconds,
Hertz,
MegaHertz,
KiloMetres,
DecaMetres,
Metres,
MetresPerSecond,
MetresPerSecondSquared,
FiveMetresPerSecond,
DeciMetres,
DeciMetresPerSecond,
CentiMetres,
SquareCentiMetres,
CentiMetresPerSecond,
MilliMetres,
MilliMetresPerSecond,
MilliMetresPerHour,
Kelvins,
DegreesCelsius,
CentiDegreeCelsius,
Radians,
RadiansPerSecond,
MilliRadiansPerSecond,
Degrees,
HalfDegrees,
DegreesPerSecond,
CentiDegrees,
CentiDegreesPerSecond,
DegreesE5,
DegreesE7,
RotationsPerMinute,
Volt,
CentiVolt,
MilliVolt,
Ampere,
CentiAmpere,
MilliAmpere,
MilliAmpereHour,
MilliTesla,
Gauss,
MilliGauss,
HectoJoule,
Watt,
MilliG,
Grams,
KiloGrams,
Pascal,
HectoPascal,
KiloPascal,
MilliBar,
Percent,
DeciPercent,
CentiPercent,
DeciBel,
DeciBelMilliWats,
KibiByte,
KibiBytePerSecond,
MebiByte,
MebiBytePerSecond,
Bytes,
BytesPerSecond,
BitsPerSecond,
Pixels,
DeciPixels,
GramsPerMinute,
CubicCentiMetresPerMinute,
CubicCentiMetres,
Litres,
}
impl Units {
pub fn parse(s: &str) -> Result<Option<Units>, ParseError> {
let normalized = s.trim();
let known = match normalized {
"s" => Units::Seconds,
"ds" => Units::DeciSeconds,
"cs" => Units::CentiSeconds,
"ms" => Units::MilliSeconds,
"us" => Units::MicroSeconds,
"ns" => Units::NanoSeconds,
"Hz" => Units::Hertz,
"MHz" => Units::MegaHertz,
"km" => Units::KiloMetres,
"dam" => Units::DecaMetres,
"m" => Units::Metres,
"m/s" => Units::MetresPerSecond,
"m/s/s" => Units::MetresPerSecondSquared,
"m/s*5" => Units::FiveMetresPerSecond,
"dm" => Units::DeciMetres,
"dm/s" => Units::DeciMetresPerSecond,
"cm" => Units::CentiMetres,
"cm^2" => Units::SquareCentiMetres,
"cm/s" => Units::CentiMetresPerSecond,
"mm" => Units::MilliMetres,
"mm/s" => Units::MilliMetresPerSecond,
"mm/h" => Units::MilliMetresPerHour,
"K" => Units::Kelvins,
"degC" => Units::DegreesCelsius,
"cdegC" => Units::CentiDegreeCelsius,
"rad" => Units::Radians,
"rad/s" => Units::RadiansPerSecond,
"mrad/s" => Units::MilliRadiansPerSecond,
"deg" => Units::Degrees,
"deg/2" => Units::HalfDegrees,
"deg/s" => Units::DegreesPerSecond,
"cdeg" => Units::CentiDegrees,
"cdeg/s" => Units::CentiDegreesPerSecond,
"degE5" => Units::DegreesE5,
"degE7" => Units::DegreesE7,
"rpm" => Units::RotationsPerMinute,
"V" => Units::Volt,
"cV" => Units::CentiVolt,
"mV" => Units::MilliVolt,
"A" => Units::Ampere,
"cA" => Units::CentiAmpere,
"mA" => Units::MilliAmpere,
"mAh" => Units::MilliAmpereHour,
"mT" => Units::MilliTesla,
"gauss" => Units::Gauss,
"mgauss" => Units::MilliGauss,
"hJ" => Units::HectoJoule,
"W" => Units::Watt,
"mG" => Units::MilliG,
"g" => Units::Grams,
"kg" => Units::KiloGrams,
"Pa" => Units::Pascal,
"hPa" => Units::HectoPascal,
"kPa" => Units::KiloPascal,
"mbar" => Units::MilliBar,
"%" => Units::Percent,
"d%" => Units::DeciPercent,
"c%" => Units::CentiPercent,
"dB" => Units::DeciBel,
"dBm" => Units::DeciBelMilliWats,
"KiB" => Units::KibiByte,
"KiB/s" => Units::KibiBytePerSecond,
"MiB" => Units::MebiByte,
"MiB/s" => Units::MebiBytePerSecond,
"bytes" => Units::Bytes,
"bytes/s" => Units::BytesPerSecond,
"bits/s" => Units::BitsPerSecond,
"pix" => Units::Pixels,
"dpix" => Units::DeciPixels,
"g/min" => Units::GramsPerMinute,
"cm^3/min" => Units::CubicCentiMetresPerMinute,
"cm^3" => Units::CubicCentiMetres,
"l" => Units::Litres,
unknown => {
return match unknown {
"" => Ok(None),
&_ => Err(ParseError::UnitsError(unknown.to_string())),
}
}
};
Ok(Some(known))
}
pub fn to_proto(&self) -> proto::Units {
match self {
Self::Seconds => proto::Units::Seconds,
Self::DeciSeconds => proto::Units::DeciSeconds,
Self::CentiSeconds => proto::Units::CentiSeconds,
Self::MilliSeconds => proto::Units::MilliSeconds,
Self::MicroSeconds => proto::Units::MicroSeconds,
Self::NanoSeconds => proto::Units::NanoSeconds,
Self::Hertz => proto::Units::Hertz,
Self::MegaHertz => proto::Units::MegaHertz,
Self::KiloMetres => proto::Units::KiloMetres,
Self::DecaMetres => proto::Units::DecaMetres,
Self::Metres => proto::Units::Metres,
Self::MetresPerSecond => proto::Units::MetresPerSecond,
Self::MetresPerSecondSquared => proto::Units::MetresPerSecondSquared,
Self::FiveMetresPerSecond => proto::Units::FiveMetresPerSecond,
Self::DeciMetres => proto::Units::DeciMetres,
Self::DeciMetresPerSecond => proto::Units::DeciMetresPerSecond,
Self::CentiMetres => proto::Units::CentiMetres,
Self::SquareCentiMetres => proto::Units::SquareCentiMetres,
Self::CentiMetresPerSecond => proto::Units::CentiMetresPerSecond,
Self::MilliMetres => proto::Units::MilliMetres,
Self::MilliMetresPerSecond => proto::Units::MilliMetresPerSecond,
Self::MilliMetresPerHour => proto::Units::MilliMetresPerHour,
Self::Kelvins => proto::Units::Kelvins,
Self::DegreesCelsius => proto::Units::DegreesCelsius,
Self::CentiDegreeCelsius => proto::Units::CentiDegreeCelsius,
Self::Radians => proto::Units::Radians,
Self::RadiansPerSecond => proto::Units::RadiansPerSecond,
Self::MilliRadiansPerSecond => proto::Units::MilliRadiansPerSecond,
Self::Degrees => proto::Units::Degrees,
Self::HalfDegrees => proto::Units::HalfDegrees,
Self::DegreesPerSecond => proto::Units::DegreesPerSecond,
Self::CentiDegrees => proto::Units::CentiDegrees,
Self::CentiDegreesPerSecond => proto::Units::CentiDegreesPerSecond,
Self::DegreesE5 => proto::Units::DegreesE5,
Self::DegreesE7 => proto::Units::DegreesE7,
Self::RotationsPerMinute => proto::Units::RotationsPerMinute,
Self::Volt => proto::Units::Volt,
Self::CentiVolt => proto::Units::CentiVolt,
Self::MilliVolt => proto::Units::MilliVolt,
Self::Ampere => proto::Units::Ampere,
Self::CentiAmpere => proto::Units::CentiAmpere,
Self::MilliAmpere => proto::Units::MilliAmpere,
Self::MilliAmpereHour => proto::Units::MilliAmpereHour,
Self::MilliTesla => proto::Units::MilliTesla,
Self::Gauss => proto::Units::Gauss,
Self::MilliGauss => proto::Units::MilliGauss,
Self::HectoJoule => proto::Units::HectoJoule,
Self::Watt => proto::Units::Watt,
Self::MilliG => proto::Units::MilliG,
Self::Grams => proto::Units::Grams,
Self::KiloGrams => proto::Units::KiloGrams,
Self::Pascal => proto::Units::Pascal,
Self::HectoPascal => proto::Units::HectoPascal,
Self::KiloPascal => proto::Units::KiloPascal,
Self::MilliBar => proto::Units::MilliBar,
Self::Percent => proto::Units::Percent,
Self::DeciPercent => proto::Units::DeciPercent,
Self::CentiPercent => proto::Units::CentiPercent,
Self::DeciBel => proto::Units::DeciBel,
Self::DeciBelMilliWats => proto::Units::DeciBelMilliWats,
Self::KibiByte => proto::Units::KibiByte,
Self::KibiBytePerSecond => proto::Units::KibiBytePerSecond,
Self::MebiByte => proto::Units::MebiByte,
Self::MebiBytePerSecond => proto::Units::MebiBytePerSecond,
Self::Bytes => proto::Units::Bytes,
Self::BytesPerSecond => proto::Units::BytesPerSecond,
Self::BitsPerSecond => proto::Units::BitsPerSecond,
Self::Pixels => proto::Units::Pixels,
Self::DeciPixels => proto::Units::DeciPixels,
Self::GramsPerMinute => proto::Units::GramsPerMinute,
Self::CubicCentiMetresPerMinute => proto::Units::CubicCentiMetresPerMinute,
Self::CubicCentiMetres => proto::Units::CubicCentiMetres,
Self::Litres => proto::Units::Litres,
}
}
pub fn from_proto(proto: &proto::Units) -> Result<Self, ProtoImportError> {
Ok(match proto {
proto::Units::Seconds => Self::Seconds,
proto::Units::DeciSeconds => Self::DeciSeconds,
proto::Units::CentiSeconds => Self::CentiSeconds,
proto::Units::MilliSeconds => Self::MilliSeconds,
proto::Units::MicroSeconds => Self::MicroSeconds,
proto::Units::NanoSeconds => Self::NanoSeconds,
proto::Units::Hertz => Self::Hertz,
proto::Units::MegaHertz => Self::MegaHertz,
proto::Units::KiloMetres => Self::KiloMetres,
proto::Units::DecaMetres => Self::DecaMetres,
proto::Units::Metres => Self::Metres,
proto::Units::MetresPerSecond => Self::MetresPerSecond,
proto::Units::MetresPerSecondSquared => Self::MetresPerSecondSquared,
proto::Units::FiveMetresPerSecond => Self::FiveMetresPerSecond,
proto::Units::DeciMetres => Self::DeciMetres,
proto::Units::DeciMetresPerSecond => Self::DeciMetresPerSecond,
proto::Units::CentiMetres => Self::CentiMetres,
proto::Units::SquareCentiMetres => Self::SquareCentiMetres,
proto::Units::CentiMetresPerSecond => Self::CentiMetresPerSecond,
proto::Units::MilliMetres => Self::MilliMetres,
proto::Units::MilliMetresPerSecond => Self::MilliMetresPerSecond,
proto::Units::MilliMetresPerHour => Self::MilliMetresPerHour,
proto::Units::Kelvins => Self::Kelvins,
proto::Units::DegreesCelsius => Self::DegreesCelsius,
proto::Units::CentiDegreeCelsius => Self::CentiDegreeCelsius,
proto::Units::Radians => Self::Radians,
proto::Units::RadiansPerSecond => Self::RadiansPerSecond,
proto::Units::MilliRadiansPerSecond => Self::MilliRadiansPerSecond,
proto::Units::Degrees => Self::Degrees,
proto::Units::HalfDegrees => Self::HalfDegrees,
proto::Units::DegreesPerSecond => Self::DegreesPerSecond,
proto::Units::CentiDegrees => Self::CentiDegrees,
proto::Units::CentiDegreesPerSecond => Self::CentiDegreesPerSecond,
proto::Units::DegreesE5 => Self::DegreesE5,
proto::Units::DegreesE7 => Self::DegreesE7,
proto::Units::RotationsPerMinute => Self::RotationsPerMinute,
proto::Units::Volt => Self::Volt,
proto::Units::CentiVolt => Self::CentiVolt,
proto::Units::MilliVolt => Self::MilliVolt,
proto::Units::Ampere => Self::Ampere,
proto::Units::CentiAmpere => Self::CentiAmpere,
proto::Units::MilliAmpere => Self::MilliAmpere,
proto::Units::MilliAmpereHour => Self::MilliAmpereHour,
proto::Units::MilliTesla => Self::MilliTesla,
proto::Units::Gauss => Self::Gauss,
proto::Units::MilliGauss => Self::MilliGauss,
proto::Units::HectoJoule => Self::HectoJoule,
proto::Units::Watt => Self::Watt,
proto::Units::MilliG => Self::MilliG,
proto::Units::Grams => Self::Grams,
proto::Units::KiloGrams => Self::KiloGrams,
proto::Units::Pascal => Self::Pascal,
proto::Units::HectoPascal => Self::HectoPascal,
proto::Units::KiloPascal => Self::KiloPascal,
proto::Units::MilliBar => Self::MilliBar,
proto::Units::Percent => Self::Percent,
proto::Units::DeciPercent => Self::DeciPercent,
proto::Units::CentiPercent => Self::CentiPercent,
proto::Units::DeciBel => Self::DeciBel,
proto::Units::DeciBelMilliWats => Self::DeciBelMilliWats,
proto::Units::KibiByte => Self::KibiByte,
proto::Units::KibiBytePerSecond => Self::KibiBytePerSecond,
proto::Units::MebiByte => Self::MebiByte,
proto::Units::MebiBytePerSecond => Self::MebiBytePerSecond,
proto::Units::Bytes => Self::Bytes,
proto::Units::BytesPerSecond => Self::BytesPerSecond,
proto::Units::BitsPerSecond => Self::BitsPerSecond,
proto::Units::Pixels => Self::Pixels,
proto::Units::DeciPixels => Self::DeciPixels,
proto::Units::GramsPerMinute => Self::GramsPerMinute,
proto::Units::CubicCentiMetresPerMinute => Self::CubicCentiMetresPerMinute,
proto::Units::CubicCentiMetres => Self::CubicCentiMetres,
proto::Units::Litres => Self::Litres,
proto::Units::Unspecified => {
return Err(ProtoImportError::UnspecifiedUnitsAreNotSupported)
}
})
}
pub fn from_value(value: i32) -> Result<Self, ProtoImportError> {
Self::from_proto(
&proto::Units::try_from(value)
.map_err(ProtoImportError::InvalidUnitsNumericEnumValue)?,
)
}
}