1use asyn_rs::error::AsynResult;
2use asyn_rs::param::ParamType;
3use asyn_rs::port::PortDriverBase;
4
5use super::ndarray_driver::NDArrayDriverParams;
6
7#[derive(Clone, Copy)]
9pub struct ADDriverParams {
10 pub base: NDArrayDriverParams,
11
12 pub max_size_x: usize,
14 pub max_size_y: usize,
15 pub size_x: usize,
16 pub size_y: usize,
17 pub min_x: usize,
18 pub min_y: usize,
19 pub bin_x: usize,
20 pub bin_y: usize,
21 pub reverse_x: usize,
22 pub reverse_y: usize,
23
24 pub image_mode: usize,
26 pub num_images: usize,
27 pub num_images_counter: usize,
28 pub num_exposures: usize,
29 pub num_exposures_counter: usize,
30 pub acquire_time: usize,
31 pub acquire_period: usize,
32 pub time_remaining: usize,
33 pub status: usize,
34 pub status_message: usize,
35 pub string_to_server: usize,
36 pub string_from_server: usize,
37 pub acquire: usize,
38 pub acquire_busy: usize,
39 pub wait_for_plugins: usize,
40 pub read_status: usize,
41
42 pub gain: usize,
44 pub frame_type: usize,
45 pub trigger_mode: usize,
46
47 pub shutter_control: usize,
49 pub shutter_control_epics: usize,
50 pub shutter_status: usize,
51 pub shutter_status_epics: usize,
52 pub shutter_mode: usize,
53 pub shutter_open_delay: usize,
54 pub shutter_close_delay: usize,
55
56 pub temperature: usize,
58 pub temperature_actual: usize,
59}
60
61impl ADDriverParams {
62 pub fn create(port_base: &mut PortDriverBase) -> AsynResult<Self> {
63 let base = NDArrayDriverParams::create(port_base)?;
64
65 Ok(Self {
66 base,
67
68 max_size_x: port_base.create_param("MAX_SIZE_X", ParamType::Int32)?,
70 max_size_y: port_base.create_param("MAX_SIZE_Y", ParamType::Int32)?,
71 size_x: port_base.create_param("SIZE_X", ParamType::Int32)?,
72 size_y: port_base.create_param("SIZE_Y", ParamType::Int32)?,
73 min_x: port_base.create_param("MIN_X", ParamType::Int32)?,
74 min_y: port_base.create_param("MIN_Y", ParamType::Int32)?,
75 bin_x: port_base.create_param("BIN_X", ParamType::Int32)?,
76 bin_y: port_base.create_param("BIN_Y", ParamType::Int32)?,
77 reverse_x: port_base.create_param("REVERSE_X", ParamType::Int32)?,
78 reverse_y: port_base.create_param("REVERSE_Y", ParamType::Int32)?,
79
80 image_mode: port_base.create_param("IMAGE_MODE", ParamType::Int32)?,
82 num_images: port_base.create_param("NUM_IMAGES", ParamType::Int32)?,
83 num_images_counter: port_base.create_param("NUM_IMAGES_COUNTER", ParamType::Int32)?,
84 num_exposures: port_base.create_param("NUM_EXPOSURES", ParamType::Int32)?,
85 num_exposures_counter: port_base.create_param("NUM_EXPOSURES_COUNTER", ParamType::Int32)?,
86 acquire_time: port_base.create_param("ACQUIRE_TIME", ParamType::Float64)?,
87 acquire_period: port_base.create_param("ACQUIRE_PERIOD", ParamType::Float64)?,
88 time_remaining: port_base.create_param("TIME_REMAINING", ParamType::Float64)?,
89 status: port_base.create_param("DETECTOR_STATE", ParamType::Int32)?,
90 status_message: port_base.create_param("STATUS_MESSAGE", ParamType::Octet)?,
91 string_to_server: port_base.create_param("STRING_TO_SERVER", ParamType::Octet)?,
92 string_from_server: port_base.create_param("STRING_FROM_SERVER", ParamType::Octet)?,
93 acquire: port_base.create_param("ACQUIRE", ParamType::Int32)?,
94 acquire_busy: port_base.create_param("ACQUIRE_BUSY", ParamType::Int32)?,
95 wait_for_plugins: port_base.create_param("WAIT_FOR_PLUGINS", ParamType::Int32)?,
96 read_status: port_base.create_param("READ_STATUS", ParamType::Int32)?,
97
98 gain: port_base.create_param("GAIN", ParamType::Float64)?,
100 frame_type: port_base.create_param("FRAME_TYPE", ParamType::Int32)?,
101 trigger_mode: port_base.create_param("TRIGGER_MODE", ParamType::Int32)?,
102
103 shutter_control: port_base.create_param("SHUTTER_CONTROL", ParamType::Int32)?,
105 shutter_control_epics: port_base.create_param("SHUTTER_CONTROL_EPICS", ParamType::Int32)?,
106 shutter_status: port_base.create_param("SHUTTER_STATUS", ParamType::Int32)?,
107 shutter_status_epics: port_base.create_param("SHUTTER_STATUS_EPICS", ParamType::Int32)?,
108 shutter_mode: port_base.create_param("SHUTTER_MODE", ParamType::Int32)?,
109 shutter_open_delay: port_base.create_param("SHUTTER_OPEN_DELAY", ParamType::Float64)?,
110 shutter_close_delay: port_base.create_param("SHUTTER_CLOSE_DELAY", ParamType::Float64)?,
111
112 temperature: port_base.create_param("TEMPERATURE", ParamType::Float64)?,
114 temperature_actual: port_base.create_param("TEMPERATURE_ACTUAL", ParamType::Float64)?,
115 })
116 }
117}
118
119#[cfg(test)]
120mod tests {
121 use super::*;
122 use asyn_rs::port::PortFlags;
123
124 #[test]
125 fn test_create_ad_driver_params() {
126 let mut base = PortDriverBase::new("test", 1, PortFlags::default());
127 let params = ADDriverParams::create(&mut base).unwrap();
128 assert!(base.find_param("ACQUIRE").is_some());
129 assert!(base.find_param("GAIN").is_some());
130 assert!(base.find_param("SHUTTER_CONTROL").is_some());
131 assert!(base.find_param("TEMPERATURE").is_some());
132 assert!(base.find_param("SIZE_X").is_some());
133 assert_eq!(params.acquire, base.find_param("ACQUIRE").unwrap());
134 }
135
136 #[test]
137 fn test_ad_driver_param_count() {
138 let mut base = PortDriverBase::new("test", 1, PortFlags::default());
139 let _ = ADDriverParams::create(&mut base).unwrap();
140 assert!(base.params.len() >= 80);
142 }
143
144 #[test]
145 fn test_ad_driver_inherits_base() {
146 let mut base = PortDriverBase::new("test", 1, PortFlags::default());
147 let params = ADDriverParams::create(&mut base).unwrap();
148 assert!(base.find_param("ARRAY_COUNTER").is_some());
150 assert_eq!(params.base.array_counter, base.find_param("ARRAY_COUNTER").unwrap());
151 }
152}