1use enum_iterator::IntoEnumIterator;
2use num_derive::*;
3use std::fmt;
4
5#[allow(non_camel_case_types)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8#[derive(Debug, Clone, Copy, FromPrimitive, ToPrimitive, PartialEq, IntoEnumIterator)]
9pub enum PicoRange {
10 X1_PROBE_10MV = 0,
11 X1_PROBE_20MV = 1,
12 X1_PROBE_50MV = 2,
13 X1_PROBE_100MV = 3,
14 X1_PROBE_200MV = 4,
15 X1_PROBE_500MV = 5,
16 X1_PROBE_1V = 6,
17 X1_PROBE_2V = 7,
18 X1_PROBE_5V = 8,
19 X1_PROBE_10V = 9,
20 X1_PROBE_20V = 10,
21 X1_PROBE_50V = 11,
22 X1_PROBE_100V = 12,
23 X1_PROBE_200V = 13,
24
25 X10_PROBE_100MV = 32,
26 X10_PROBE_200MV = 33,
27 X10_PROBE_500MV = 34,
28 X10_PROBE_1V = 35,
29 X10_PROBE_2V = 36,
30 X10_PROBE_5V = 37,
31 X10_PROBE_10V = 38,
32 X10_PROBE_20V = 39,
33 X10_PROBE_50V = 40,
34 X10_PROBE_100V = 41,
35 X10_PROBE_200V = 42,
36 X10_PROBE_500V = 43,
37
38 PS4000A_RESISTANCE_315K = 512,
39 PS4000A_RESISTANCE_1100K = 513,
40 PS4000A_RESISTANCE_10M = 514,
41 PS4000A_RESISTANCE_ADCV_FLAG = 268_435_456,
42
43 CONNECT_PROBE_OFF = 1024,
44 CURRENT_CLAMP_200A_2kA_1A = 4000,
45 CURRENT_CLAMP_200A_2kA_2A = 4001,
46 CURRENT_CLAMP_200A_2kA_5A = 4002,
47 CURRENT_CLAMP_200A_2kA_10A = 4003,
48 CURRENT_CLAMP_200A_2kA_20A = 4004,
49 CURRENT_CLAMP_200A_2kA_50A = 4005,
50 CURRENT_CLAMP_200A_2kA_100A = 4006,
51 CURRENT_CLAMP_200A_2kA_200A = 4007,
52 CURRENT_CLAMP_200A_2kA_500A = 4008,
53 CURRENT_CLAMP_200A_2kA_1000A = 4009,
54 CURRENT_CLAMP_200A_2kA_2000A = 4010,
55 CURRENT_CLAMP_40A_100mA = 5000,
56 CURRENT_CLAMP_40A_200mA = 5001,
57 CURRENT_CLAMP_40A_500mA = 5002,
58 CURRENT_CLAMP_40A_1A = 5003,
59 CURRENT_CLAMP_40A_2A = 5004,
60 CURRENT_CLAMP_40A_5A = 5005,
61 CURRENT_CLAMP_40A_10A = 5006,
62 CURRENT_CLAMP_40A_20A = 5007,
63 CURRENT_CLAMP_40A_40A = 5008,
64
65 _1KV_2_5V = 6003,
66 _1KV_5V = 6004,
67 _1KV_12_5V = 6005,
68 _1KV_25V = 6006,
69 _1KV_50V = 6007,
70 _1KV_125V = 6008,
71 _1KV_250V = 6009,
72 _1KV_500V = 6010,
73 _1KV_1000V = 6011,
74
75 CURRENT_CLAMP_2000ARMS_10A = 6500,
76 CURRENT_CLAMP_2000ARMS_20A = 6501,
77 CURRENT_CLAMP_2000ARMS_50A = 6502,
78 CURRENT_CLAMP_2000ARMS_100A = 6503,
79 CURRENT_CLAMP_2000ARMS_200A = 6504,
80 CURRENT_CLAMP_2000ARMS_500A = 6505,
81 CURRENT_CLAMP_2000ARMS_1000A = 6506,
82 CURRENT_CLAMP_2000ARMS_2000A = 6507,
83 CURRENT_CLAMP_2000ARMS_5000A = 6508,
84
85 RESISTANCE_LEAD_NEG5_TO_20OHM = 7000,
86 RESISTANCE_LEAD_NEG50_TO_200OHM = 7001,
87 RESISTANCE_LEAD_NEG500_TO_2KOHM = 7002,
88 RESISTANCE_LEAD_NEG5K_TO_20KOHM = 7003,
89 RESISTANCE_LEAD_NEG50K_TO_LEAD_200KOHM = 7004,
90 RESISTANCE_LEAD_NEG500K_TO_LEAD_2MOHM = 7005,
91 RESISTANCE_LEAD_DIODE_TEST = 7006,
92
93 HT_NEG3_TO_5KV = 8950,
94 HT_NEG3_TO_10KV = 8951,
95 HT_NEG5_TO_20KV = 8952,
96 HT_NEG5_TO_50KV = 8953,
97 HT_NEG5_TO_100KV = 8954,
98 HT_NEG3_TO_5KV_INVERTED = 8955,
99 HT_NEG3_TO_10KV_INVERTED = 8956,
100 HT_NEG5_TO_20KV_INVERTED = 8957,
101 HT_NEG5_TO_50KV_INVERTED = 8958,
102 HT_NEG5_TO_100KV_INVERTED = 8959,
103
104 TEMPERATURE_NEG50_TO_150DEGC = 9000,
105
106 PRESSURE_SENSOR_NEG100000_TO_150000_PASCALS = 9100,
107 PRESSURE_SENSOR_NEG100000_TO_400000_PASCALS = 9101,
108 PRESSURE_SENSOR_NEG200000_TO_800000_PASCALS = 9102,
109 PRESSURE_SENSOR_NEG400000_TO_1600000_PASCALS = 9103,
110 PRESSURE_SENSOR_NEG400000_TO_3400000_PASCALS = 9104,
111 PRESSURE_SENSOR_NEG150000_TO_1350000_PASCALS = 9105,
112
113 CURRENT_CLAMP_100A_2_5A = 10000,
114 CURRENT_CLAMP_100A_5A = 10001,
115 CURRENT_CLAMP_100A_10A = 10002,
116 CURRENT_CLAMP_100A_25A = 10003,
117 CURRENT_CLAMP_100A_50A = 10004,
118 CURRENT_CLAMP_100A_100A = 10005,
119
120 CURRENT_CLAMP_60A_2A = 10500,
121 CURRENT_CLAMP_60A_5A = 10501,
122 CURRENT_CLAMP_60A_10A = 10502,
123 CURRENT_CLAMP_60A_20A = 10503,
124 CURRENT_CLAMP_60A_50A = 10504,
125 CURRENT_CLAMP_60A_60A = 10505,
126
127 OPTICAL_SENSOR_10V = 10550,
128
129 CURRENT_CLAMP_60A_V2_0_5A = 10600,
130 CURRENT_CLAMP_60A_V2_1A = 10601,
131 CURRENT_CLAMP_60A_V2_2A = 10602,
132 CURRENT_CLAMP_60A_V2_5A = 10603,
133 CURRENT_CLAMP_60A_V2_10A = 10604,
134 CURRENT_CLAMP_60A_V2_20A = 10605,
135 CURRENT_CLAMP_60A_V2_50A = 10606,
136 CURRENT_CLAMP_60A_V2_60A = 10607,
137}
138
139impl PicoRange {
140 pub fn parse(input: &str, valid_ranges: Option<&[Self]>) -> Option<Self> {
141 let input = input.replace(" ", "").replace("±", "").to_uppercase();
142 let all_ranges = PicoRange::into_enum_iter().collect::<Vec<Self>>();
143 let valid_ranges = valid_ranges.unwrap_or(&all_ranges);
144
145 for range in valid_ranges {
146 let to_cmp = format!("{}", range)
147 .replace(" ", "")
148 .replace("±", "")
149 .to_uppercase();
150
151 if input == to_cmp {
152 return Some(*range);
153 }
154 }
155
156 None
157 }
158}
159
160impl fmt::Display for PicoRange {
161 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
162 match self {
163 PicoRange::X1_PROBE_10MV => write!(f, "±10 mV"),
164 PicoRange::X1_PROBE_20MV => write!(f, "±20 mV"),
165 PicoRange::X1_PROBE_50MV => write!(f, "±50 mV"),
166 PicoRange::X1_PROBE_100MV => write!(f, "±100 mV"),
167 PicoRange::X1_PROBE_200MV => write!(f, "±200 mV"),
168 PicoRange::X1_PROBE_500MV => write!(f, "±500 mV"),
169 PicoRange::X1_PROBE_1V => write!(f, "±1 V"),
170 PicoRange::X1_PROBE_2V => write!(f, "±2 V"),
171 PicoRange::X1_PROBE_5V => write!(f, "±5 V"),
172 PicoRange::X1_PROBE_10V => write!(f, "±10 V"),
173 PicoRange::X1_PROBE_20V => write!(f, "±20 V"),
174 PicoRange::X1_PROBE_50V => write!(f, "±50 V"),
175 PicoRange::X1_PROBE_100V => write!(f, "±100 V"),
176 PicoRange::X1_PROBE_200V => write!(f, "±200 V"),
177 PicoRange::X10_PROBE_100MV => write!(f, "±100 mV"),
178 PicoRange::X10_PROBE_200MV => write!(f, "±200 mV"),
179 PicoRange::X10_PROBE_500MV => write!(f, "±500 mV"),
180 PicoRange::X10_PROBE_1V => write!(f, "±1 V"),
181 PicoRange::X10_PROBE_2V => write!(f, "±2 V"),
182 PicoRange::X10_PROBE_5V => write!(f, "±5 V"),
183 PicoRange::X10_PROBE_10V => write!(f, "±10 V"),
184 PicoRange::X10_PROBE_20V => write!(f, "±20 V"),
185 PicoRange::X10_PROBE_50V => write!(f, "±50 V"),
186 PicoRange::X10_PROBE_100V => write!(f, "±100 V"),
187 PicoRange::X10_PROBE_200V => write!(f, "±200 V"),
188 PicoRange::X10_PROBE_500V => write!(f, "±500 V"),
189 PicoRange::CURRENT_CLAMP_200A_2kA_1A => write!(f, "±1 A"),
190 PicoRange::CURRENT_CLAMP_200A_2kA_2A => write!(f, "±2 A"),
191 PicoRange::CURRENT_CLAMP_200A_2kA_5A => write!(f, "±5 A"),
192 PicoRange::CURRENT_CLAMP_200A_2kA_10A => write!(f, "±10 A"),
193 PicoRange::CURRENT_CLAMP_200A_2kA_20A => write!(f, "±20 A"),
194 PicoRange::CURRENT_CLAMP_200A_2kA_50A => write!(f, "±50 A"),
195 PicoRange::CURRENT_CLAMP_200A_2kA_100A => write!(f, "±100 A"),
196 PicoRange::CURRENT_CLAMP_200A_2kA_200A => write!(f, "±200 A"),
197 PicoRange::CURRENT_CLAMP_200A_2kA_500A => write!(f, "±500 A"),
198 PicoRange::CURRENT_CLAMP_200A_2kA_1000A => write!(f, "±1000 A"),
199 PicoRange::CURRENT_CLAMP_200A_2kA_2000A => write!(f, "±2000 A"),
200 PicoRange::CURRENT_CLAMP_40A_100mA => write!(f, "±100 mA"),
201 PicoRange::CURRENT_CLAMP_40A_200mA => write!(f, "±200 mA"),
202 PicoRange::CURRENT_CLAMP_40A_500mA => write!(f, "±500 mA"),
203 PicoRange::CURRENT_CLAMP_40A_1A => write!(f, "±1 A"),
204 PicoRange::CURRENT_CLAMP_40A_2A => write!(f, "±2 A"),
205 PicoRange::CURRENT_CLAMP_40A_5A => write!(f, "±5 A"),
206 PicoRange::CURRENT_CLAMP_40A_10A => write!(f, "±10 A"),
207 PicoRange::CURRENT_CLAMP_40A_20A => write!(f, "±20 A"),
208 PicoRange::CURRENT_CLAMP_40A_40A => write!(f, "±40 A"),
209 PicoRange::_1KV_2_5V => write!(f, "±2.5 V"),
210 PicoRange::_1KV_5V => write!(f, "±5 V"),
211 PicoRange::_1KV_12_5V => write!(f, "±12.5 V"),
212 PicoRange::_1KV_25V => write!(f, "±25 V"),
213 PicoRange::_1KV_50V => write!(f, "±50 V"),
214 PicoRange::_1KV_125V => write!(f, "±125 V"),
215 PicoRange::_1KV_250V => write!(f, "±250 V"),
216 PicoRange::_1KV_500V => write!(f, "±500 V"),
217 PicoRange::_1KV_1000V => write!(f, "±1 kV"),
218 PicoRange::CURRENT_CLAMP_2000ARMS_10A => write!(f, "±10 A"),
219 PicoRange::CURRENT_CLAMP_2000ARMS_20A => write!(f, "±20 A"),
220 PicoRange::CURRENT_CLAMP_2000ARMS_50A => write!(f, "±50 A"),
221 PicoRange::CURRENT_CLAMP_2000ARMS_100A => write!(f, "±100 A"),
222 PicoRange::CURRENT_CLAMP_2000ARMS_200A => write!(f, "±200 A"),
223 PicoRange::CURRENT_CLAMP_2000ARMS_500A => write!(f, "±500 A"),
224 PicoRange::CURRENT_CLAMP_2000ARMS_1000A => write!(f, "±1000 A"),
225 PicoRange::CURRENT_CLAMP_2000ARMS_2000A => write!(f, "±2000 A"),
226 PicoRange::CURRENT_CLAMP_2000ARMS_5000A => write!(f, "±5000 A"),
227 PicoRange::CURRENT_CLAMP_60A_2A => write!(f, "±2 A"),
228 PicoRange::CURRENT_CLAMP_60A_5A => write!(f, "±5 A"),
229 PicoRange::CURRENT_CLAMP_60A_10A => write!(f, "±10 A"),
230 PicoRange::CURRENT_CLAMP_60A_20A => write!(f, "±20 A"),
231 PicoRange::CURRENT_CLAMP_60A_50A => write!(f, "±50 A"),
232 PicoRange::CURRENT_CLAMP_60A_60A => write!(f, "±60 A"),
233 rest => write!(f, "{:?}", rest),
234 }
235 }
236}
237
238impl From<PicoRange> for u32 {
239 fn from(value: PicoRange) -> Self {
240 num_traits::ToPrimitive::to_u32(&value).expect("Non-valid range")
241 }
242}
243
244impl From<PicoRange> for i32 {
245 fn from(value: PicoRange) -> Self {
246 num_traits::ToPrimitive::to_i32(&value).expect("Non-valid range")
247 }
248}
249
250impl From<PicoRange> for i16 {
251 fn from(value: PicoRange) -> Self {
252 num_traits::ToPrimitive::to_i16(&value).expect("Non-valid range")
253 }
254}
255
256impl From<i32> for PicoRange {
257 fn from(value: i32) -> Self {
258 num_traits::FromPrimitive::from_i32(value)
259 .unwrap_or_else(|| panic!("Invalid PicoRange range '{}'", value))
260 }
261}
262
263impl From<u32> for PicoRange {
264 fn from(value: u32) -> Self {
265 num_traits::FromPrimitive::from_u32(value)
266 .unwrap_or_else(|| panic!("Invalid PicoRange range '{}'", value))
267 }
268}
269
270pub struct UnitStrings {
272 pub long: String,
273 pub short: String,
274}
275
276impl UnitStrings {
277 pub fn new(long: &str, short: &str) -> Self {
278 UnitStrings {
279 long: long.to_string(),
280 short: short.to_string(),
281 }
282 }
283}
284
285impl PicoRange {
286 pub fn get_units(self) -> UnitStrings {
288 match self {
289 PicoRange::PS4000A_RESISTANCE_315K
290 | PicoRange::PS4000A_RESISTANCE_1100K
291 | PicoRange::PS4000A_RESISTANCE_10M
292 | PicoRange::RESISTANCE_LEAD_NEG5_TO_20OHM
293 | PicoRange::RESISTANCE_LEAD_NEG50_TO_200OHM
294 | PicoRange::RESISTANCE_LEAD_NEG500_TO_2KOHM
295 | PicoRange::RESISTANCE_LEAD_NEG5K_TO_20KOHM
296 | PicoRange::RESISTANCE_LEAD_NEG50K_TO_LEAD_200KOHM
297 | PicoRange::RESISTANCE_LEAD_NEG500K_TO_LEAD_2MOHM => UnitStrings::new("Ohms", "Ω"),
298 PicoRange::CURRENT_CLAMP_200A_2kA_1A
299 | PicoRange::CURRENT_CLAMP_200A_2kA_2A
300 | PicoRange::CURRENT_CLAMP_200A_2kA_5A
301 | PicoRange::CURRENT_CLAMP_200A_2kA_10A
302 | PicoRange::CURRENT_CLAMP_200A_2kA_20A
303 | PicoRange::CURRENT_CLAMP_200A_2kA_50A
304 | PicoRange::CURRENT_CLAMP_200A_2kA_100A
305 | PicoRange::CURRENT_CLAMP_200A_2kA_200A
306 | PicoRange::CURRENT_CLAMP_200A_2kA_500A
307 | PicoRange::CURRENT_CLAMP_200A_2kA_1000A
308 | PicoRange::CURRENT_CLAMP_200A_2kA_2000A
309 | PicoRange::CURRENT_CLAMP_40A_100mA
310 | PicoRange::CURRENT_CLAMP_40A_200mA
311 | PicoRange::CURRENT_CLAMP_40A_500mA
312 | PicoRange::CURRENT_CLAMP_40A_1A
313 | PicoRange::CURRENT_CLAMP_40A_2A
314 | PicoRange::CURRENT_CLAMP_40A_5A
315 | PicoRange::CURRENT_CLAMP_40A_10A
316 | PicoRange::CURRENT_CLAMP_40A_20A
317 | PicoRange::CURRENT_CLAMP_40A_40A
318 | PicoRange::CURRENT_CLAMP_2000ARMS_20A
319 | PicoRange::CURRENT_CLAMP_2000ARMS_10A
320 | PicoRange::CURRENT_CLAMP_2000ARMS_50A
321 | PicoRange::CURRENT_CLAMP_2000ARMS_100A
322 | PicoRange::CURRENT_CLAMP_2000ARMS_200A
323 | PicoRange::CURRENT_CLAMP_2000ARMS_500A
324 | PicoRange::CURRENT_CLAMP_2000ARMS_1000A
325 | PicoRange::CURRENT_CLAMP_2000ARMS_2000A
326 | PicoRange::CURRENT_CLAMP_2000ARMS_5000A
327 | PicoRange::CURRENT_CLAMP_100A_2_5A
328 | PicoRange::CURRENT_CLAMP_100A_5A
329 | PicoRange::CURRENT_CLAMP_100A_10A
330 | PicoRange::CURRENT_CLAMP_100A_25A
331 | PicoRange::CURRENT_CLAMP_100A_50A
332 | PicoRange::CURRENT_CLAMP_100A_100A
333 | PicoRange::CURRENT_CLAMP_60A_2A
334 | PicoRange::CURRENT_CLAMP_60A_5A
335 | PicoRange::CURRENT_CLAMP_60A_10A
336 | PicoRange::CURRENT_CLAMP_60A_20A
337 | PicoRange::CURRENT_CLAMP_60A_50A
338 | PicoRange::CURRENT_CLAMP_60A_60A => UnitStrings::new("Amps", "A"),
339 _ => UnitStrings::new("Volts", "V"),
340 }
341 }
342
343 pub fn get_max_scaled_value(self) -> f64 {
345 match self {
346 PicoRange::X1_PROBE_10MV => 0.01,
347 PicoRange::X1_PROBE_20MV => 0.02,
348 PicoRange::X1_PROBE_50MV => 0.05,
349 PicoRange::X1_PROBE_100MV => 0.1,
350 PicoRange::X1_PROBE_200MV => 0.2,
351 PicoRange::X1_PROBE_500MV => 0.5,
352 PicoRange::X1_PROBE_1V => 1.0,
353 PicoRange::X1_PROBE_2V => 2.0,
354 PicoRange::X1_PROBE_5V => 5.0,
355 PicoRange::X1_PROBE_10V => 10.0,
356 PicoRange::X1_PROBE_20V => 20.0,
357 PicoRange::X1_PROBE_50V => 50.0,
358 PicoRange::X1_PROBE_100V => 100.0,
359 PicoRange::X1_PROBE_200V => 200.0,
360 PicoRange::X10_PROBE_100MV => 0.1,
361 PicoRange::X10_PROBE_200MV => 0.2,
362 PicoRange::X10_PROBE_500MV => 0.5,
363 PicoRange::X10_PROBE_1V => 1.0,
364 PicoRange::X10_PROBE_2V => 2.0,
365 PicoRange::X10_PROBE_5V => 5.0,
366 PicoRange::X10_PROBE_10V => 10.0,
367 PicoRange::X10_PROBE_20V => 20.0,
368 PicoRange::X10_PROBE_50V => 50.0,
369 PicoRange::X10_PROBE_100V => 100.0,
370 PicoRange::X10_PROBE_200V => 200.0,
371 PicoRange::X10_PROBE_500V => 500.0,
372 PicoRange::PS4000A_RESISTANCE_315K => 315_000.0,
373 PicoRange::PS4000A_RESISTANCE_1100K => 1_100_000.0,
374 PicoRange::PS4000A_RESISTANCE_10M => 10_000_000.0,
375 PicoRange::CURRENT_CLAMP_200A_2kA_1A => 1.0,
376 PicoRange::CURRENT_CLAMP_200A_2kA_2A => 2.0,
377 PicoRange::CURRENT_CLAMP_200A_2kA_5A => 5.0,
378 PicoRange::CURRENT_CLAMP_200A_2kA_10A => 10.0,
379 PicoRange::CURRENT_CLAMP_200A_2kA_20A => 20.0,
380 PicoRange::CURRENT_CLAMP_200A_2kA_50A => 50.0,
381 PicoRange::CURRENT_CLAMP_200A_2kA_100A => 100.0,
382 PicoRange::CURRENT_CLAMP_200A_2kA_200A => 200.0,
383 PicoRange::CURRENT_CLAMP_200A_2kA_500A => 500.0,
384 PicoRange::CURRENT_CLAMP_200A_2kA_1000A => 1_000.0,
385 PicoRange::CURRENT_CLAMP_200A_2kA_2000A => 2_000.0,
386 PicoRange::CURRENT_CLAMP_40A_100mA => 0.1,
387 PicoRange::CURRENT_CLAMP_40A_200mA => 0.2,
388 PicoRange::CURRENT_CLAMP_40A_500mA => 0.5,
389 PicoRange::CURRENT_CLAMP_40A_1A => 1.0,
390 PicoRange::CURRENT_CLAMP_40A_2A => 2.0,
391 PicoRange::CURRENT_CLAMP_40A_5A => 5.0,
392 PicoRange::CURRENT_CLAMP_40A_10A => 10.0,
393 PicoRange::CURRENT_CLAMP_40A_20A => 20.0,
394 PicoRange::CURRENT_CLAMP_40A_40A => 40.0,
395 PicoRange::_1KV_2_5V => 2.5,
396 PicoRange::_1KV_5V => 5.0,
397 PicoRange::_1KV_12_5V => 12.5,
398 PicoRange::_1KV_25V => 25.0,
399 PicoRange::_1KV_50V => 50.0,
400 PicoRange::_1KV_125V => 125.0,
401 PicoRange::_1KV_250V => 250.0,
402 PicoRange::_1KV_500V => 500.0,
403 PicoRange::_1KV_1000V => 1_000.0,
404 PicoRange::CURRENT_CLAMP_2000ARMS_10A => 10.0,
405 PicoRange::CURRENT_CLAMP_2000ARMS_20A => 20.0,
406 PicoRange::CURRENT_CLAMP_2000ARMS_50A => 50.0,
407 PicoRange::CURRENT_CLAMP_2000ARMS_100A => 100.0,
408 PicoRange::CURRENT_CLAMP_2000ARMS_200A => 200.0,
409 PicoRange::CURRENT_CLAMP_2000ARMS_500A => 500.0,
410 PicoRange::CURRENT_CLAMP_2000ARMS_1000A => 1_000.0,
411 PicoRange::CURRENT_CLAMP_2000ARMS_2000A => 2_000.0,
412 PicoRange::CURRENT_CLAMP_2000ARMS_5000A => 5_000.0,
413 PicoRange::RESISTANCE_LEAD_NEG5_TO_20OHM => 20.0,
414 PicoRange::RESISTANCE_LEAD_NEG50_TO_200OHM => 200.0,
415 PicoRange::RESISTANCE_LEAD_NEG500_TO_2KOHM => 2_000.0,
416 PicoRange::RESISTANCE_LEAD_NEG5K_TO_20KOHM => 20_000.0,
417 PicoRange::RESISTANCE_LEAD_NEG50K_TO_LEAD_200KOHM => 200_000.0,
418 PicoRange::RESISTANCE_LEAD_NEG500K_TO_LEAD_2MOHM => 2_000_000.0,
419 PicoRange::HT_NEG3_TO_5KV => 5_000.0,
421 PicoRange::HT_NEG3_TO_10KV => 10_000.0,
422 PicoRange::HT_NEG5_TO_20KV => 20_000.0,
423 PicoRange::HT_NEG5_TO_50KV => 50_000.0,
424 PicoRange::HT_NEG5_TO_100KV => 100_000.0,
425 PicoRange::HT_NEG3_TO_5KV_INVERTED => -5_000.0,
426 PicoRange::HT_NEG3_TO_10KV_INVERTED => -10_000.0,
427 PicoRange::HT_NEG5_TO_20KV_INVERTED => -20_000.0,
428 PicoRange::HT_NEG5_TO_50KV_INVERTED => -50_000.0,
429 PicoRange::HT_NEG5_TO_100KV_INVERTED => -100_000.0,
430 PicoRange::TEMPERATURE_NEG50_TO_150DEGC => 150.0,
431 PicoRange::CURRENT_CLAMP_100A_2_5A => 2.5,
438 PicoRange::CURRENT_CLAMP_100A_5A => 5.0,
439 PicoRange::CURRENT_CLAMP_100A_10A => 10.0,
440 PicoRange::CURRENT_CLAMP_100A_25A => 25.0,
441 PicoRange::CURRENT_CLAMP_100A_50A => 50.0,
442 PicoRange::CURRENT_CLAMP_100A_100A => 100.0,
443 PicoRange::CURRENT_CLAMP_60A_2A => 2.0,
444 PicoRange::CURRENT_CLAMP_60A_5A => 5.0,
445 PicoRange::CURRENT_CLAMP_60A_10A => 10.0,
446 PicoRange::CURRENT_CLAMP_60A_20A => 20.0,
447 PicoRange::CURRENT_CLAMP_60A_50A => 50.0,
448 PicoRange::CURRENT_CLAMP_60A_60A => 60.0,
449 oops => panic!("Scaling for range '{:?}' not defined", oops),
450 }
451 }
452}
453
454#[cfg(test)]
455mod range_tests {
456 use super::*;
457
458 #[test]
459 fn channel_parse() {
460 assert_eq!(
461 PicoRange::parse("200mv", None),
462 Some(PicoRange::X1_PROBE_200MV)
463 );
464 assert_eq!(
465 PicoRange::parse(" 20 v ", None),
466 Some(PicoRange::X1_PROBE_20V)
467 );
468 assert_eq!(
469 PicoRange::parse(
470 "200 mv",
471 Some(&[
472 PicoRange::X10_PROBE_100MV,
473 PicoRange::X10_PROBE_200MV,
474 PicoRange::X10_PROBE_500MV,
475 PicoRange::X10_PROBE_1V,
476 PicoRange::X10_PROBE_2V,
477 PicoRange::X10_PROBE_5V
478 ])
479 ),
480 Some(PicoRange::X10_PROBE_200MV)
481 )
482 }
483}