1use bitflags::bitflags;
2
3#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
5pub enum FieldId {
6 String,
7 Short,
8 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_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 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#[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_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_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_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_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_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 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 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 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 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 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
185impl 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#[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}