epics_ca/types/
id.rs

1use bitflags::bitflags;
2
3/// Field type identifier.
4#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
5pub enum FieldId {
6    String,
7    Short,
8    // Int, // Alias to Short
9    Float,
10    Enum,
11    Char,
12    Long,
13    Double,
14}
15
16impl FieldId {
17    pub fn try_from_raw(raw: i32) -> Option<Self> {
18        match raw {
19            sys::DBF_STRING => Some(FieldId::String),
20            sys::DBF_SHORT => Some(FieldId::Short),
21            // sys::DBF_INT => Some(DbField::Int),
22            sys::DBF_FLOAT => Some(FieldId::Float),
23            sys::DBF_ENUM => Some(FieldId::Enum),
24            sys::DBF_CHAR => Some(FieldId::Char),
25            sys::DBF_LONG => Some(FieldId::Long),
26            sys::DBF_DOUBLE => Some(FieldId::Double),
27            _ => None,
28        }
29    }
30
31    pub fn raw(&self) -> i32 {
32        match self {
33            FieldId::String => sys::DBF_STRING,
34            FieldId::Short => sys::DBF_SHORT,
35            // DbField::Int => sys::DBF_INT,
36            FieldId::Float => sys::DBF_FLOAT,
37            FieldId::Enum => sys::DBF_ENUM,
38            FieldId::Char => sys::DBF_CHAR,
39            FieldId::Long => sys::DBF_LONG,
40            FieldId::Double => sys::DBF_DOUBLE,
41        }
42    }
43}
44
45/// Request type identifier.
46#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
47pub enum RequestId {
48    Base(FieldId),
49    Sts(FieldId),
50    Time(FieldId),
51    Gr(FieldId),
52    Ctrl(FieldId),
53    PutAckt,
54    PutAcks,
55    StsackString,
56    ClassName,
57}
58
59impl RequestId {
60    pub fn try_from_raw(raw: i32) -> Option<Self> {
61        match raw {
62            sys::DBR_STRING => Some(RequestId::Base(FieldId::String)),
63            sys::DBR_SHORT => Some(RequestId::Base(FieldId::Short)),
64            // sys::DBR_INT => Some(DbRequest::Base(DbField::Int)),
65            sys::DBR_FLOAT => Some(RequestId::Base(FieldId::Float)),
66            sys::DBR_ENUM => Some(RequestId::Base(FieldId::Enum)),
67            sys::DBR_CHAR => Some(RequestId::Base(FieldId::Char)),
68            sys::DBR_LONG => Some(RequestId::Base(FieldId::Long)),
69            sys::DBR_DOUBLE => Some(RequestId::Base(FieldId::Double)),
70
71            sys::DBR_STS_STRING => Some(RequestId::Sts(FieldId::String)),
72            sys::DBR_STS_SHORT => Some(RequestId::Sts(FieldId::Short)),
73            // sys::DBR_STS_INT => Some(DbRequest::Sts(DbField::Int)),
74            sys::DBR_STS_FLOAT => Some(RequestId::Sts(FieldId::Float)),
75            sys::DBR_STS_ENUM => Some(RequestId::Sts(FieldId::Enum)),
76            sys::DBR_STS_CHAR => Some(RequestId::Sts(FieldId::Char)),
77            sys::DBR_STS_LONG => Some(RequestId::Sts(FieldId::Long)),
78            sys::DBR_STS_DOUBLE => Some(RequestId::Sts(FieldId::Double)),
79
80            sys::DBR_TIME_STRING => Some(RequestId::Time(FieldId::String)),
81            sys::DBR_TIME_SHORT => Some(RequestId::Time(FieldId::Short)),
82            // sys::DBR_TIME_INT => Some(DbRequest::Time(DbField::Int)),
83            sys::DBR_TIME_FLOAT => Some(RequestId::Time(FieldId::Float)),
84            sys::DBR_TIME_ENUM => Some(RequestId::Time(FieldId::Enum)),
85            sys::DBR_TIME_CHAR => Some(RequestId::Time(FieldId::Char)),
86            sys::DBR_TIME_LONG => Some(RequestId::Time(FieldId::Long)),
87            sys::DBR_TIME_DOUBLE => Some(RequestId::Time(FieldId::Double)),
88
89            sys::DBR_GR_STRING => Some(RequestId::Gr(FieldId::String)),
90            sys::DBR_GR_SHORT => Some(RequestId::Gr(FieldId::Short)),
91            // sys::DBR_GR_INT => Some(DbRequest::Gr(DbField::Int)),
92            sys::DBR_GR_FLOAT => Some(RequestId::Gr(FieldId::Float)),
93            sys::DBR_GR_ENUM => Some(RequestId::Gr(FieldId::Enum)),
94            sys::DBR_GR_CHAR => Some(RequestId::Gr(FieldId::Char)),
95            sys::DBR_GR_LONG => Some(RequestId::Gr(FieldId::Long)),
96            sys::DBR_GR_DOUBLE => Some(RequestId::Gr(FieldId::Double)),
97
98            sys::DBR_CTRL_STRING => Some(RequestId::Ctrl(FieldId::String)),
99            sys::DBR_CTRL_SHORT => Some(RequestId::Ctrl(FieldId::Short)),
100            // sys::DBR_CTRL_INT => Some(DbRequest::Ctrl(DbField::Int)),
101            sys::DBR_CTRL_FLOAT => Some(RequestId::Ctrl(FieldId::Float)),
102            sys::DBR_CTRL_ENUM => Some(RequestId::Ctrl(FieldId::Enum)),
103            sys::DBR_CTRL_CHAR => Some(RequestId::Ctrl(FieldId::Char)),
104            sys::DBR_CTRL_LONG => Some(RequestId::Ctrl(FieldId::Long)),
105            sys::DBR_CTRL_DOUBLE => Some(RequestId::Ctrl(FieldId::Double)),
106
107            sys::DBR_PUT_ACKT => Some(RequestId::PutAckt),
108            sys::DBR_PUT_ACKS => Some(RequestId::PutAcks),
109            sys::DBR_STSACK_STRING => Some(RequestId::StsackString),
110            sys::DBR_CLASS_NAME => Some(RequestId::ClassName),
111
112            _ => None,
113        }
114    }
115
116    pub fn raw(&self) -> i32 {
117        match self {
118            RequestId::Base(dbf) => match dbf {
119                FieldId::String => sys::DBR_STRING,
120                FieldId::Short => sys::DBR_SHORT,
121                // DbField::Int => sys::DBR_INT,
122                FieldId::Float => sys::DBR_FLOAT,
123                FieldId::Enum => sys::DBR_ENUM,
124                FieldId::Char => sys::DBR_CHAR,
125                FieldId::Long => sys::DBR_LONG,
126                FieldId::Double => sys::DBR_DOUBLE,
127            },
128            RequestId::Sts(dbf) => match dbf {
129                FieldId::String => sys::DBR_STS_STRING,
130                FieldId::Short => sys::DBR_STS_SHORT,
131                // DbField::Int => sys::DBR_STS_INT,
132                FieldId::Float => sys::DBR_STS_FLOAT,
133                FieldId::Enum => sys::DBR_STS_ENUM,
134                FieldId::Char => sys::DBR_STS_CHAR,
135                FieldId::Long => sys::DBR_STS_LONG,
136                FieldId::Double => sys::DBR_STS_DOUBLE,
137            },
138            RequestId::Time(dbf) => match dbf {
139                FieldId::String => sys::DBR_TIME_STRING,
140                FieldId::Short => sys::DBR_TIME_SHORT,
141                // DbField::Int => sys::DBR_TIME_INT,
142                FieldId::Float => sys::DBR_TIME_FLOAT,
143                FieldId::Enum => sys::DBR_TIME_ENUM,
144                FieldId::Char => sys::DBR_TIME_CHAR,
145                FieldId::Long => sys::DBR_TIME_LONG,
146                FieldId::Double => sys::DBR_TIME_DOUBLE,
147            },
148            RequestId::Gr(dbf) => match dbf {
149                FieldId::String => sys::DBR_GR_STRING,
150                FieldId::Short => sys::DBR_GR_SHORT,
151                // DbField::Int => sys::DBR_GR_INT,
152                FieldId::Float => sys::DBR_GR_FLOAT,
153                FieldId::Enum => sys::DBR_GR_ENUM,
154                FieldId::Char => sys::DBR_GR_CHAR,
155                FieldId::Long => sys::DBR_GR_LONG,
156                FieldId::Double => sys::DBR_GR_DOUBLE,
157            },
158            RequestId::Ctrl(dbf) => match dbf {
159                FieldId::String => sys::DBR_CTRL_STRING,
160                FieldId::Short => sys::DBR_CTRL_SHORT,
161                // DbField::Int => sys::DBR_CTRL_INT,
162                FieldId::Float => sys::DBR_CTRL_FLOAT,
163                FieldId::Enum => sys::DBR_CTRL_ENUM,
164                FieldId::Char => sys::DBR_CTRL_CHAR,
165                FieldId::Long => sys::DBR_CTRL_LONG,
166                FieldId::Double => sys::DBR_CTRL_DOUBLE,
167            },
168            RequestId::PutAckt => sys::DBR_PUT_ACKT,
169            RequestId::PutAcks => sys::DBR_PUT_ACKS,
170            RequestId::StsackString => sys::DBR_STSACK_STRING,
171            RequestId::ClassName => sys::DBR_CLASS_NAME,
172        }
173    }
174}
175
176bitflags! {
177    pub struct EventMask: u32 {
178        const VALUE = sys::DBE_VALUE as u32;
179        const ARCHIVE = sys::DBE_ARCHIVE as u32;
180        const ALARM = sys::DBE_ALARM as u32;
181        const PROPERTY = sys::DBE_PROPERTY as u32;
182    }
183}
184
185/// Channel event mask.
186impl EventMask {
187    pub fn try_from_raw(raw: i32) -> Option<Self> {
188        Self::from_bits(raw as u32)
189    }
190    pub fn raw(&self) -> i32 {
191        self.bits() as i32
192    }
193}
194
195/// Channel access rights.
196#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
197pub struct AccessRights {
198    read_access: bool,
199    write_access: bool,
200}
201
202impl AccessRights {
203    pub fn raw(self) -> sys::ca_access_rights {
204        let mut raw = 0;
205        if self.read_access {
206            raw |= sys::CA_READ_ACCESS;
207        }
208        if self.write_access {
209            raw |= sys::CA_WRITE_ACCESS;
210        }
211        raw
212    }
213}
214
215#[cfg(test)]
216mod tests {
217    use super::*;
218
219    fn dbf_size(dbf: FieldId) -> usize {
220        unsafe { *(sys::dbr_size.as_ptr().offset(dbf.raw() as isize)) as usize }
221    }
222
223    #[test]
224    fn dbr_sizes() {
225        assert_eq!(dbf_size(FieldId::String), sys::MAX_STRING_SIZE as usize);
226        assert_eq!(dbf_size(FieldId::Short), 2);
227        assert_eq!(dbf_size(FieldId::Float), 4);
228        assert_eq!(dbf_size(FieldId::Enum), 2);
229        assert_eq!(dbf_size(FieldId::Char), 1);
230        assert_eq!(dbf_size(FieldId::Long), 4);
231        assert_eq!(dbf_size(FieldId::Double), 8);
232    }
233}