pico_common/
range.rs

1use enum_iterator::IntoEnumIterator;
2use num_derive::*;
3use std::fmt;
4
5/// Pico channel ranges
6#[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
270/// A simple struct containing the long and short unit strings
271pub 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    /// Get the expected units for this channel range
287    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    /// Get the maximum scaled value for this range
344    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::RESISTANCE_LEAD_DIODE_TEST => 7006,
420            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::PRESSURE_SENSOR_NEG100000_TO_150000_PASCALS => 150_000.0,
432            // PicoRange::PRESSURE_SENSOR_NEG100000_TO_400000_PASCALS => 400_000.0,
433            // PicoRange::PRESSURE_SENSOR_NEG200000_TO_800000_PASCALS => 800_000.0,
434            // PicoRange::PRESSURE_SENSOR_NEG400000_TO_1600000_PASCALS => 1_600_000.0,
435            // PicoRange::PRESSURE_SENSOR_NEG400000_TO_3400000_PASCALS => 3_400_000.0,
436            // PicoRange::PRESSURE_SENSOR_NEG150000_TO_1350000_PASCALS => ?,
437            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}