epics_ca/types/
alarm.rs

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/// EPICS channel alarm.
128#[repr(C)]
129#[derive(Debug, Clone, Copy, Default, Hash, PartialEq, Eq)]
130pub struct Alarm {
131    pub condition: AlarmCondition,
132    pub severity: AlarmSeverity,
133}