#[cfg(feature = "strum")]
macro_rules! impl_as_str {
($enum:ty) => {
impl $enum {
pub fn as_str(&self) -> &str {
self.as_ref()
}
}
};
}
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduIt {
IoUnum32 = 0x1000,
IoProgVoltage = 0x1001,
IoByteArray = 0x1002,
IoFilter = 0x1003,
IoEventQueueProperty = 0x1004,
RscStatus = 0x1100,
Param = 0x1200,
Result = 0x1300,
Status = 0x1301,
Error = 0x1302,
Info = 0x1303,
RscId = 0x1400,
RscConflict = 0x1500,
ModuleId = 0x1600,
UniqueRespIdTable = 0x1700,
IoVehicleIdRequest = 0x1800,
EthSwitchState = 0x1801,
EntityAddress = 0x1802,
EntityStatus = 0x1803,
}
#[cfg(feature = "strum")]
#[cfg(feature = "strum")]
impl_as_str!(PduIt);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduCopt {
StartComm = 0x8001,
StopComm = 0x8002,
UpdateParam = 0x8003,
SendRecv = 0x8004,
Delay = 0x8005,
RestoreParam = 0x8006,
}
#[cfg(feature = "strum")]
#[cfg(feature = "strum")]
impl_as_str!(PduCopt);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduObjt {
Protocol = 0x8021,
BusType = 0x8022,
IoCtrl = 0x8023,
ComParam = 0x8024,
PinType = 0x8025,
Resource = 0x8026,
}
#[cfg(feature = "strum")]
#[cfg(feature = "strum")]
impl_as_str!(PduObjt);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduStatus {
CopstIdle = 0x8010,
CopstExecuting = 0x8011,
CopstFinished = 0x8012,
CopstCancelled = 0x8013,
CopstWaiting = 0x8014,
CllstOffline = 0x8050,
CllstOnline = 0x8051,
CllstCommStarted = 0x8052,
ModstReady = 0x8060,
ModstNotReady = 0x8061,
ModstNotAvail = 0x8062,
ModstAvail = 0x8063,
}
#[cfg(feature = "strum")]
#[cfg(feature = "strum")]
impl_as_str!(PduStatus);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduInfo {
ModuleListChange = 0x8070,
ResourceLockChange = 0x8071,
ComParamChange = 0x8072,
}
#[cfg(feature = "strum")]
#[cfg(feature = "strum")]
impl_as_str!(PduInfo);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduEvtData {
Available = 0x801,
Lost = 0x0802,
}
#[cfg(feature = "strum")]
#[cfg(feature = "strum")]
impl_as_str!(PduEvtData);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduFilter {
Pass = 0x00000001,
Block = 0x00000002,
PassUudt = 0x00000011,
BlockUudt = 0x00000012,
}
#[cfg(feature = "strum")]
#[cfg(feature = "strum")]
impl_as_str!(PduFilter);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduQueueMode {
Unlimited = 0x00000000,
Limited = 0x00000001,
Circular = 0x00000002,
}
#[cfg(feature = "strum")]
impl_as_str!(PduQueueMode);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[cfg_attr(feature = "thiserror", derive(thiserror::Error))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduError {
#[cfg_attr(feature = "thiserror", error("No error (function call OK)"))]
StatusNoError = 0x00000000,
#[cfg_attr(feature = "thiserror", error("Function call failed (Generic failure)"))]
FctFailed = 0x00000001,
#[cfg_attr(feature = "thiserror", error("Reserved for ISO 22900-2"))]
Reserved1 = 0x00000010,
#[cfg_attr(
feature = "thiserror",
error("Communication failed between host and MVCI")
)]
CommPcToVciFailed = 0x00000011,
#[cfg_attr(feature = "thiserror", error("PDU API has not yet been constructed"))]
PduApiNotConstructed = 0x00000020,
#[cfg_attr(
feature = "thiserror",
error("PDU Destruct was not called before another PDU Construct")
)]
SharingViolation = 0x00000021,
#[cfg_attr(feature = "thiserror", error("Resource is already in use"))]
ResourceBusy = 0x00000030,
#[cfg_attr(feature = "thiserror", error("Resource table changed"))]
ResourceTableChanged = 0x00000031,
#[cfg_attr(feature = "thiserror", error("Generic resource error"))]
ResourceError = 0x00000032,
#[cfg_attr(
feature = "thiserror",
error("ComLogicalLink cannot be offline and perform the requested action")
)]
CllNotConnected = 0x00000040,
#[cfg_attr(
feature = "thiserror",
error("ComLogicalLink must be started to perform the requested action")
)]
CllNotStarted = 0x00000041,
#[cfg_attr(
feature = "thiserror",
error("A parameter parsed into the function was invalid")
)]
InvalidParameters = 0x00000050,
#[cfg_attr(feature = "thiserror", error("A handle provided was invalid"))]
InvalidHandle = 0x00000060,
#[cfg_attr(feature = "thiserror", error("Option value was unsupported"))]
ValueNotSupported = 0x00000061,
#[cfg_attr(feature = "thiserror", error("IOCTL Command ID was unsupported"))]
IdNotSupported = 0x00000062,
#[cfg_attr(
feature = "thiserror",
error("Communication parameter was unsupported")
)]
ComParamNotSupported = 0x00000063,
#[cfg_attr(
feature = "thiserror",
error(
"Physical communication parameter cannot be changed as it is locked by another LogicalLink"
)
)]
ComParamLocked = 0x00000064,
#[cfg_attr(feature = "thiserror", error("Transmit queue is full"))]
TxQueueFull = 0x00000070,
#[cfg_attr(feature = "thiserror", error("No more events are available to read"))]
EventQueueEmpty = 0x00000071,
#[cfg_attr(
feature = "thiserror",
error("IOCTL - Voltage value supplied is unsupported by the MVCI module")
)]
VoltageNotSupported = 0x00000080,
#[cfg_attr(
feature = "thiserror",
error("IOCTL - Pin or resource is not supported by the MVCI module")
)]
MuxRscNotSupported = 0x00000081,
#[cfg_attr(
feature = "thiserror",
error("Cable attached to MVCI module is unknown")
)]
CableUnknown = 0x00000082,
#[cfg_attr(feature = "thiserror", error("No cable attached to the MVCI module"))]
NoCableDetected = 0x00000083,
#[cfg_attr(feature = "thiserror", error("ComLogicalLink is already connected"))]
CllConnected = 0x00000084,
#[cfg_attr(
feature = "thiserror",
error("Physical Com parameters cannot be changes as a temporary one")
)]
TempParamNotAllowed = 0x00000090,
#[cfg_attr(feature = "thiserror", error("Resource is already locked"))]
RscLocked = 0x000000A0,
#[cfg_attr(
feature = "thiserror",
error("Resource is already locked by another ComLogicalLink")
)]
RscLockedByAnotherCll = 0x000000A1,
#[cfg_attr(feature = "thiserror", error("Resource is already unlocked"))]
RscNotLocked = 0x000000A2,
#[cfg_attr(feature = "thiserror", error("Module is not connected or ready"))]
ModuleNotConnected = 0x000000A3,
#[cfg_attr(feature = "thiserror", error("API software is out of date"))]
ApiSwOutOfDate = 0x000000A4,
#[cfg_attr(feature = "thiserror", error("VCI firmware is out of date"))]
ModuleFwOutOfDate = 0x000000A5,
#[cfg_attr(
feature = "thiserror",
error("Requested pin is not routed by the MVCI's cable")
)]
PinNotConnected = 0x000000A6,
#[cfg_attr(feature = "thiserror", error("IP protocol not supported"))]
IpProtocolNotSupported = 0x000000B0,
#[cfg_attr(
feature = "thiserror",
error("DoIP Routing activation failed (Generic failure)")
)]
DoIpRoutingActivationFailed = 0x000000B1,
#[cfg_attr(
feature = "thiserror",
error("DoIP Routing activation failed - missing / wrong authentication")
)]
DoIpRoutingActivationAuthFailed = 0x000000B2,
#[cfg_attr(
feature = "thiserror",
error("DoIP Logical address is defined multiple times so it is ambiguous")
)]
DoIpAmbiguousLogicalAddress = 0x000000B3,
#[cfg_attr(
feature = "thiserror",
error("DoIP Routing activation failed - Unknown or invalid source address")
)]
DoIpRoutineActivationInvalidSrcAddress = 0x000000B4,
#[cfg_attr(
feature = "thiserror",
error("DoIP Routing activation failed - No more free sockets available")
)]
DoIpRoutingActivationNoDataSocketAvailable = 0x000000B5,
#[cfg_attr(
feature = "thiserror",
error("DoIP Routing activation failed - The source address changed")
)]
DoIpRoutineActivationSourceAddressChanged = 0x000000B6,
#[cfg_attr(
feature = "thiserror",
error("DoIP Routing activation failed - Source address already in use")
)]
DoIpRoutingActivationSourceAddressInUse = 0x000000B7,
#[cfg_attr(
feature = "thiserror",
error("DoIP Routing activation failed - Rejected confirmation")
)]
DoIpRoutineActivationConfirmationRejected = 0x000000B8,
#[cfg_attr(
feature = "thiserror",
error("DoIP Routing activation failed - Requested activation type was unsupported")
)]
DoIpRoutineActivationTypeUnsupported = 0x000000B9,
#[cfg_attr(
feature = "thiserror",
error("DoIP Routing activation failed - Response code was unknown")
)]
DoIpRoutineActivationResponseCodeUnknown = 0x000000BA,
#[cfg_attr(
feature = "thiserror",
error("DoIP Routing activation failed - Timeout waiting for activation response")
)]
DoIpRoutingActivationResponseTimeout = 0x000000BB,
#[cfg_attr(feature = "thiserror", error("DoIP general timeout"))]
DoIpResponseTimeout = 0x000000BC,
}
#[cfg(feature = "strum")]
impl_as_str!(PduError);
impl PduError {
pub fn is_success(&self) -> bool {
matches!(self, PduError::StatusNoError)
}
}
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduErrorEvt {
NoError = 0x00000000,
FrameStruct = 0x00000100,
TxError = 0x00000101,
TesterPresentError = 0x00000102,
RscLocked = 0x00000109,
RxTimeout = 0x00000103,
RxError = 0x00000104,
ProtErr = 0x00000105,
LostCommToVci = 0x00000106,
VciHardwareFault = 0x00000107,
InitError = 0x00000108,
}
#[cfg(feature = "strum")]
impl_as_str!(PduErrorEvt);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduPt {
Unum8 = 0x000000101,
Snum8 = 0x000000102,
Unum16 = 0x000000103,
Snum16 = 0x000000104,
Unum32 = 0x000000105,
Snum32 = 0x000000106,
ByteField = 0x000000107,
StructField = 0x000000108,
LongField = 0x00000109,
}
#[cfg(feature = "strum")]
impl_as_str!(PduPt);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduPc {
Timing = 1,
Init = 2,
Com = 3,
ErrHdl = 4,
BusType = 5,
UniqueId = 6,
TesterPresent = 7,
}
#[cfg(feature = "strum")]
impl_as_str!(PduPc);
#[repr(u32)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PduCpst {
SessionTiming = 0x00000001,
AccessTiming = 0x00000002,
}
#[cfg(feature = "strum")]
impl_as_str!(PduCpst);
#[repr(u8)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum VidPreselectMode {
None = 0,
Vin = 1,
Eid = 2,
}
#[cfg(feature = "strum")]
impl_as_str!(VidPreselectMode);
#[repr(u8)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum CombinationMode {
None = 0,
VIN = 1,
Group = 2,
All = 3,
}
#[cfg(feature = "strum")]
impl_as_str!(CombinationMode);
#[repr(u8)]
#[cfg_attr(feature = "num_enum", derive(num_enum::TryFromPrimitive))]
#[cfg_attr(feature = "num_enum", derive(strum::AsRefStr))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum TimingSet {
Default = 1,
OverrideReceived = 2,
OverrideTester = 3,
Normal = 4,
Extended = 0xFF,
}
#[cfg(feature = "strum")]
impl_as_str!(TimingSet);
#[cfg(feature = "serde")]
impl serde::Serialize for TimingSet {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let value = match self {
TimingSet::Default => 1,
TimingSet::OverrideReceived => 2,
TimingSet::OverrideTester => 3,
TimingSet::Normal => 4,
TimingSet::Extended => 0xFF,
};
serializer.serialize_u8(value)
}
}
#[cfg(feature = "serde")]
impl<'de> serde::Deserialize<'de> for TimingSet {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
struct TimingSetVisitor;
impl<'de> serde::de::Visitor<'de> for TimingSetVisitor {
type Value = TimingSet;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("TimingSet as u8 or string")
}
fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
match value {
1 => Ok(TimingSet::Default),
2 => Ok(TimingSet::OverrideReceived),
3 => Ok(TimingSet::OverrideTester),
4 => Ok(TimingSet::Normal),
0xFF => Ok(TimingSet::Extended),
v => Err(E::custom(format!("unknown value {:#04X}", v))),
}
}
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
match value {
"Default" | "default" => Ok(TimingSet::Default),
"OverrideReceived" | "override_received" => Ok(TimingSet::OverrideReceived),
"OverrideTester" | "override_tester" => Ok(TimingSet::OverrideTester),
"Normal" | "normal" => Ok(TimingSet::Normal),
"Extended" | "extended" => Ok(TimingSet::Extended),
v => Err(E::custom(format!("unknown TimingSet {}", v))),
}
}
}
deserializer.deserialize_any(TimingSetVisitor)
}
}