1use std::mem::transmute;
2
3#[repr(u16)]
4#[derive(Debug, Clone, Copy, Default, Hash, PartialEq, Eq)]
5pub enum AlarmSeverity {
6 #[default]
7 None = 0,
8 Minor,
9 Major,
10 Invalid,
11}
12
13impl AlarmSeverity {
14 pub fn try_from_raw(raw: u16) -> Option<Self> {
15 if !(0..(sys::epicsAlarmSeverity::ALARM_NSEV as u16)).contains(&raw) {
16 return None;
17 }
18 let sev = unsafe { transmute::<u32, sys::epicsAlarmSeverity>(raw as _) };
19 Some(match sev {
20 sys::epicsAlarmSeverity::epicsSevNone => AlarmSeverity::None,
21 sys::epicsAlarmSeverity::epicsSevMinor => AlarmSeverity::Minor,
22 sys::epicsAlarmSeverity::epicsSevMajor => AlarmSeverity::Major,
23 sys::epicsAlarmSeverity::epicsSevInvalid => AlarmSeverity::Invalid,
24 _ => unreachable!(),
25 })
26 }
27
28 pub fn raw(&self) -> sys::epicsAlarmSeverity {
29 match self {
30 AlarmSeverity::None => sys::epicsAlarmSeverity::epicsSevNone,
31 AlarmSeverity::Minor => sys::epicsAlarmSeverity::epicsSevMinor,
32 AlarmSeverity::Major => sys::epicsAlarmSeverity::epicsSevMajor,
33 AlarmSeverity::Invalid => sys::epicsAlarmSeverity::epicsSevInvalid,
34 }
35 }
36}
37
38#[repr(u16)]
39#[derive(Debug, Clone, Copy, Default, Hash, PartialEq, Eq)]
40pub enum AlarmCondition {
41 #[default]
42 None = 0,
43 Read,
44 Write,
45 HiHi,
46 High,
47 LoLo,
48 Low,
49 State,
50 Cos,
51 Comm,
52 Timeout,
53 HwLimit,
54 Calc,
55 Scan,
56 Link,
57 Soft,
58 BadSub,
59 Udf,
60 Disable,
61 Simm,
62 ReadAccess,
63 WriteAccess,
64}
65
66impl AlarmCondition {
67 pub fn try_from_raw(raw: u16) -> Option<Self> {
68 if !(0..(sys::epicsAlarmCondition::ALARM_NSTATUS as u16)).contains(&raw) {
69 return None;
70 }
71 let sev = unsafe { transmute::<u32, sys::epicsAlarmCondition>(raw as _) };
72 Some(match sev {
73 sys::epicsAlarmCondition::epicsAlarmNone => AlarmCondition::None,
74 sys::epicsAlarmCondition::epicsAlarmRead => AlarmCondition::Read,
75 sys::epicsAlarmCondition::epicsAlarmWrite => AlarmCondition::Write,
76 sys::epicsAlarmCondition::epicsAlarmHiHi => AlarmCondition::HiHi,
77 sys::epicsAlarmCondition::epicsAlarmHigh => AlarmCondition::High,
78 sys::epicsAlarmCondition::epicsAlarmLoLo => AlarmCondition::LoLo,
79 sys::epicsAlarmCondition::epicsAlarmLow => AlarmCondition::Low,
80 sys::epicsAlarmCondition::epicsAlarmState => AlarmCondition::State,
81 sys::epicsAlarmCondition::epicsAlarmCos => AlarmCondition::Cos,
82 sys::epicsAlarmCondition::epicsAlarmComm => AlarmCondition::Comm,
83 sys::epicsAlarmCondition::epicsAlarmTimeout => AlarmCondition::Timeout,
84 sys::epicsAlarmCondition::epicsAlarmHwLimit => AlarmCondition::HwLimit,
85 sys::epicsAlarmCondition::epicsAlarmCalc => AlarmCondition::Calc,
86 sys::epicsAlarmCondition::epicsAlarmScan => AlarmCondition::Scan,
87 sys::epicsAlarmCondition::epicsAlarmLink => AlarmCondition::Link,
88 sys::epicsAlarmCondition::epicsAlarmSoft => AlarmCondition::Soft,
89 sys::epicsAlarmCondition::epicsAlarmBadSub => AlarmCondition::BadSub,
90 sys::epicsAlarmCondition::epicsAlarmUDF => AlarmCondition::Udf,
91 sys::epicsAlarmCondition::epicsAlarmDisable => AlarmCondition::Disable,
92 sys::epicsAlarmCondition::epicsAlarmSimm => AlarmCondition::Simm,
93 sys::epicsAlarmCondition::epicsAlarmReadAccess => AlarmCondition::ReadAccess,
94 sys::epicsAlarmCondition::epicsAlarmWriteAccess => AlarmCondition::WriteAccess,
95 _ => unreachable!(),
96 })
97 }
98
99 pub fn raw(&self) -> sys::epicsAlarmCondition {
100 match self {
101 AlarmCondition::None => sys::epicsAlarmCondition::epicsAlarmNone,
102 AlarmCondition::Read => sys::epicsAlarmCondition::epicsAlarmRead,
103 AlarmCondition::Write => sys::epicsAlarmCondition::epicsAlarmWrite,
104 AlarmCondition::HiHi => sys::epicsAlarmCondition::epicsAlarmHiHi,
105 AlarmCondition::High => sys::epicsAlarmCondition::epicsAlarmHigh,
106 AlarmCondition::LoLo => sys::epicsAlarmCondition::epicsAlarmLoLo,
107 AlarmCondition::Low => sys::epicsAlarmCondition::epicsAlarmLow,
108 AlarmCondition::State => sys::epicsAlarmCondition::epicsAlarmState,
109 AlarmCondition::Cos => sys::epicsAlarmCondition::epicsAlarmCos,
110 AlarmCondition::Comm => sys::epicsAlarmCondition::epicsAlarmComm,
111 AlarmCondition::Timeout => sys::epicsAlarmCondition::epicsAlarmTimeout,
112 AlarmCondition::HwLimit => sys::epicsAlarmCondition::epicsAlarmHwLimit,
113 AlarmCondition::Calc => sys::epicsAlarmCondition::epicsAlarmCalc,
114 AlarmCondition::Scan => sys::epicsAlarmCondition::epicsAlarmScan,
115 AlarmCondition::Link => sys::epicsAlarmCondition::epicsAlarmLink,
116 AlarmCondition::Soft => sys::epicsAlarmCondition::epicsAlarmSoft,
117 AlarmCondition::BadSub => sys::epicsAlarmCondition::epicsAlarmBadSub,
118 AlarmCondition::Udf => sys::epicsAlarmCondition::epicsAlarmUDF,
119 AlarmCondition::Disable => sys::epicsAlarmCondition::epicsAlarmDisable,
120 AlarmCondition::Simm => sys::epicsAlarmCondition::epicsAlarmSimm,
121 AlarmCondition::ReadAccess => sys::epicsAlarmCondition::epicsAlarmReadAccess,
122 AlarmCondition::WriteAccess => sys::epicsAlarmCondition::epicsAlarmWriteAccess,
123 }
124 }
125}
126
127#[repr(C)]
129#[derive(Debug, Clone, Copy, Default, Hash, PartialEq, Eq)]
130pub struct Alarm {
131 pub condition: AlarmCondition,
132 pub severity: AlarmSeverity,
133}