ut181a 0.2.1

Uni-T UT181A DMM remote control
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
use std::fmt;
use std::result;

use error::*;

#[allow(non_camel_case_types)]
#[derive(Clone, Copy, Debug)]
pub enum Mode {
    VAC_Normal,
    VAC_Normal_Rel,
    VAC_Hz,
    VAC_Peak,
    VAC_LowPass,
    VAC_LowPass_Rel,
    VAC_dBV,
    VAC_dBV_Rel,
    VAC_dBm,
    VAC_dBm_Rel,

    mVAC_Normal,
    mVAC_Normal_Rel,
    mVAC_Hz,
    mVAC_Peak,
    mVAC_AC_DC,
    mVAC_AC_DC_Rel,

    VDC_Normal,
    VDC_Normal_Rel,
    VDC_AC_DC,
    VDC_AC_DC_Rel,
    VDC_Peak,

    mVDC_Normal,
    mVDC_Normal_Rel,
    mVDC_Peak,

    TempC_T1_T2,
    TempC_T1_T2_Rel,
    TempC_T2_T1,
    TempC_T2_T1_Rel,
    TempC_T1_T2_Diff,
    TempC_T2_T1_Diff,

    TempF_T1_T2,
    TempF_T1_T2_Rel,
    TempF_T2_T1,
    TempF_T2_T1_Rel,
    TempF_T1_T2_Diff,
    TempF_T2_T1_Diff,

    Resistance,
    Resistance_Rel,

    Beeper_Short,
    Beeper_Open,

    Admittance,
    Admittance_Rel,

    Diode_Normal,
    Diode_Alarm,

    Capacitance,
    Capacitance_Rel,

    Frequency,
    Frequency_Rel,

    DutyCycle,
    DutyCycle_Rel,

    PulseWidth,
    PulseWidth_Rel,

    uADC_Normal,
    uADC_Normal_Rel,
    uADC_AC_DC,
    uADC_AC_DC_Rel,
    uADC_Peak,

    uAAC_Normal,
    uAAC_Normal_Rel,
    uAAC_Hz,
    uAAC_Peak,

    mADC_Normal,
    mADC_Normal_Rel,
    mADC_AC_DC,
    mADC_AC_DC_Rel,
    mADC_Peak,

    mAAC_Normal,
    mAAC_Normal_Rel,
    mAAC_Hz,
    mAAC_Peak,

    ADC_Normal,
    ADC_Normal_Rel,
    ADC_AC_DC,
    ADC_AC_DC_Rel,
    ADC_Peak,

    AAC_Normal,
    AAC_Normal_Rel,
    AAC_Hz,
    AAC_Peak,
}

impl Mode {
    pub(crate) fn from_bin(data: &[u8]) -> Result<Mode> {
        use byteorder::{ByteOrder, LittleEndian};
        let m = LittleEndian::read_u16(data);
        match m {
            0x1111 => Ok(Mode::VAC_Normal),
            0x1112 => Ok(Mode::VAC_Normal_Rel),
            0x1121 => Ok(Mode::VAC_Hz),
            0x1131 => Ok(Mode::VAC_Peak),
            0x1141 => Ok(Mode::VAC_LowPass),
            0x1142 => Ok(Mode::VAC_LowPass_Rel),
            0x1151 => Ok(Mode::VAC_dBV),
            0x1152 => Ok(Mode::VAC_dBV_Rel),
            0x1161 => Ok(Mode::VAC_dBm),
            0x1162 => Ok(Mode::VAC_dBm_Rel),

            0x2111 => Ok(Mode::mVAC_Normal),
            0x2112 => Ok(Mode::mVAC_Normal_Rel),
            0x2121 => Ok(Mode::mVAC_Hz),
            0x2131 => Ok(Mode::mVAC_Peak),
            0x2141 => Ok(Mode::mVAC_AC_DC),
            0x2142 => Ok(Mode::mVAC_AC_DC_Rel),

            0x3111 => Ok(Mode::VDC_Normal),
            0x3112 => Ok(Mode::VDC_Normal_Rel),
            0x3121 => Ok(Mode::VDC_AC_DC),
            0x3122 => Ok(Mode::VDC_AC_DC_Rel),
            0x3131 => Ok(Mode::VDC_Peak),

            0x4111 => Ok(Mode::mVDC_Normal),
            0x4112 => Ok(Mode::mVDC_Normal_Rel),
            0x4121 => Ok(Mode::mVDC_Peak),

            0x4211 => Ok(Mode::TempC_T1_T2),
            0x4212 => Ok(Mode::TempC_T1_T2_Rel),
            0x4221 => Ok(Mode::TempC_T2_T1),
            0x4222 => Ok(Mode::TempC_T2_T1_Rel),
            0x4231 => Ok(Mode::TempC_T1_T2_Diff),
            0x4241 => Ok(Mode::TempC_T2_T1_Diff),

            0x4311 => Ok(Mode::TempF_T1_T2),
            0x4312 => Ok(Mode::TempF_T1_T2_Rel),
            0x4321 => Ok(Mode::TempF_T2_T1),
            0x4322 => Ok(Mode::TempF_T2_T1_Rel),
            0x4331 => Ok(Mode::TempF_T1_T2_Diff),
            0x4341 => Ok(Mode::TempF_T2_T1_Diff),

            0x5111 => Ok(Mode::Resistance),
            0x5112 => Ok(Mode::Resistance_Rel),

            0x5211 => Ok(Mode::Beeper_Short),
            0x5212 => Ok(Mode::Beeper_Open),

            0x5311 => Ok(Mode::Admittance),
            0x5312 => Ok(Mode::Admittance_Rel),

            0x6111 => Ok(Mode::Diode_Normal),
            0x6112 => Ok(Mode::Diode_Alarm),

            0x6211 => Ok(Mode::Capacitance),
            0x6212 => Ok(Mode::Capacitance_Rel),

            0x7111 => Ok(Mode::Frequency),
            0x7112 => Ok(Mode::Frequency_Rel),

            0x7211 => Ok(Mode::DutyCycle),
            0x7212 => Ok(Mode::DutyCycle_Rel),

            0x7311 => Ok(Mode::PulseWidth),
            0x7312 => Ok(Mode::PulseWidth_Rel),

            0x8111 => Ok(Mode::uADC_Normal),
            0x8112 => Ok(Mode::uADC_Normal_Rel),
            0x8121 => Ok(Mode::uADC_AC_DC),
            0x8122 => Ok(Mode::uADC_AC_DC_Rel),
            0x8131 => Ok(Mode::uADC_Peak),

            0x8211 => Ok(Mode::uAAC_Normal),
            0x8212 => Ok(Mode::uAAC_Normal_Rel),
            0x8221 => Ok(Mode::uAAC_Hz),
            0x8231 => Ok(Mode::uAAC_Peak),

            0x9111 => Ok(Mode::mADC_Normal),
            0x9112 => Ok(Mode::mADC_Normal_Rel),
            0x9121 => Ok(Mode::mADC_AC_DC),
            0x9122 => Ok(Mode::mADC_AC_DC_Rel),
            0x9131 => Ok(Mode::mADC_Peak),

            0x9211 => Ok(Mode::mAAC_Normal),
            0x9212 => Ok(Mode::mAAC_Normal_Rel),
            0x9221 => Ok(Mode::mAAC_Hz),
            0x9231 => Ok(Mode::mAAC_Peak),

            0xA111 => Ok(Mode::ADC_Normal),
            0xA112 => Ok(Mode::ADC_Normal_Rel),
            0xA121 => Ok(Mode::ADC_AC_DC),
            0xA122 => Ok(Mode::ADC_AC_DC_Rel),
            0xA131 => Ok(Mode::ADC_Peak),

            0xA211 => Ok(Mode::AAC_Normal),
            0xA212 => Ok(Mode::AAC_Normal_Rel),
            0xA221 => Ok(Mode::AAC_Hz),
            0xA231 => Ok(Mode::AAC_Peak),

            mode => Err(ErrorKind::UnknownMeasurementMode(mode).into()),
        }
    }

    pub(crate) fn to_bin(self) -> [u8; 2] {
        match self {
            Mode::VAC_Normal => [0x11, 0x11],
            Mode::VAC_Normal_Rel => [0x12, 0x11],
            Mode::VAC_Hz => [0x21, 0x11],
            Mode::VAC_Peak => [0x31, 0x11],
            Mode::VAC_LowPass => [0x41, 0x11],
            Mode::VAC_LowPass_Rel => [0x42, 0x11],
            Mode::VAC_dBV => [0x51, 0x11],
            Mode::VAC_dBV_Rel => [0x52, 0x11],
            Mode::VAC_dBm => [0x61, 0x11],
            Mode::VAC_dBm_Rel => [0x62, 0x11],

            Mode::mVAC_Normal => [0x11, 0x21],
            Mode::mVAC_Normal_Rel => [0x12, 0x21],
            Mode::mVAC_Hz => [0x21, 0x21],
            Mode::mVAC_Peak => [0x31, 0x21],
            Mode::mVAC_AC_DC => [0x41, 0x21],
            Mode::mVAC_AC_DC_Rel => [0x42, 0x21],

            Mode::VDC_Normal => [0x11, 0x31],
            Mode::VDC_Normal_Rel => [0x12, 0x31],
            Mode::VDC_AC_DC => [0x21, 0x31],
            Mode::VDC_AC_DC_Rel => [0x22, 0x31],
            Mode::VDC_Peak => [0x31, 0x31],

            Mode::mVDC_Normal => [0x11, 0x41],
            Mode::mVDC_Normal_Rel => [0x12, 0x41],
            Mode::mVDC_Peak => [0x21, 0x41],

            Mode::TempC_T1_T2 => [0x11, 0x42],
            Mode::TempC_T1_T2_Rel => [0x12, 0x42],
            Mode::TempC_T2_T1 => [0x21, 0x42],
            Mode::TempC_T2_T1_Rel => [0x22, 0x42],
            Mode::TempC_T1_T2_Diff => [0x31, 0x42],
            Mode::TempC_T2_T1_Diff => [0x41, 0x42],

            Mode::TempF_T1_T2 => [0x11, 0x43],
            Mode::TempF_T1_T2_Rel => [0x12, 0x43],
            Mode::TempF_T2_T1 => [0x21, 0x43],
            Mode::TempF_T2_T1_Rel => [0x22, 0x43],
            Mode::TempF_T1_T2_Diff => [0x31, 0x43],
            Mode::TempF_T2_T1_Diff => [0x41, 0x43],

            Mode::Resistance => [0x11, 0x51],
            Mode::Resistance_Rel => [0x12, 0x51],

            Mode::Beeper_Short => [0x11, 0x52],
            Mode::Beeper_Open => [0x12, 0x52],

            Mode::Admittance => [0x11, 0x53],
            Mode::Admittance_Rel => [0x12, 0x53],

            Mode::Diode_Normal => [0x11, 0x61],
            Mode::Diode_Alarm => [0x12, 0x61],

            Mode::Capacitance => [0x11, 0x62],
            Mode::Capacitance_Rel => [0x12, 0x62],

            Mode::Frequency => [0x11, 0x71],
            Mode::Frequency_Rel => [0x12, 0x71],

            Mode::DutyCycle => [0x11, 0x72],
            Mode::DutyCycle_Rel => [0x12, 0x72],

            Mode::PulseWidth => [0x11, 0x73],
            Mode::PulseWidth_Rel => [0x12, 0x73],

            Mode::uADC_Normal => [0x11, 0x81],
            Mode::uADC_Normal_Rel => [0x12, 0x81],
            Mode::uADC_AC_DC => [0x21, 0x81],
            Mode::uADC_AC_DC_Rel => [0x22, 0x81],
            Mode::uADC_Peak => [0x31, 0x81],

            Mode::uAAC_Normal => [0x11, 0x82],
            Mode::uAAC_Normal_Rel => [0x12, 0x82],
            Mode::uAAC_Hz => [0x21, 0x82],
            Mode::uAAC_Peak => [0x31, 0x82],

            Mode::mADC_Normal => [0x11, 0x91],
            Mode::mADC_Normal_Rel => [0x12, 0x91],
            Mode::mADC_AC_DC => [0x21, 0x91],
            Mode::mADC_AC_DC_Rel => [0x22, 0x91],
            Mode::mADC_Peak => [0x31, 0x91],

            Mode::mAAC_Normal => [0x11, 0x92],
            Mode::mAAC_Normal_Rel => [0x12, 0x92],
            Mode::mAAC_Hz => [0x21, 0x92],
            Mode::mAAC_Peak => [0x31, 0x92],

            Mode::ADC_Normal => [0x11, 0xA1],
            Mode::ADC_Normal_Rel => [0x12, 0xA1],
            Mode::ADC_AC_DC => [0x21, 0xA1],
            Mode::ADC_AC_DC_Rel => [0x22, 0xA1],
            Mode::ADC_Peak => [0x31, 0xA1],

            Mode::AAC_Normal => [0x11, 0xA2],
            Mode::AAC_Normal_Rel => [0x12, 0xA2],
            Mode::AAC_Hz => [0x21, 0xA2],
            Mode::AAC_Peak => [0x31, 0xA2],
        }
    }
}

impl fmt::Display for Mode {
    fn fmt(&self, f: &mut fmt::Formatter) -> result::Result<(), fmt::Error> {
        match *self {
            Mode::VAC_Normal => f.write_str("VAC"),
            Mode::VAC_Normal_Rel => f.write_str("VAC/Rel"),
            Mode::VAC_Hz => f.write_str("VAC/Hz"),
            Mode::VAC_Peak => f.write_str("VAC/Peak"),
            Mode::VAC_LowPass => f.write_str("VAC/Low Pass"),
            Mode::VAC_LowPass_Rel => f.write_str("VAC/Low Pass/Rel"),
            Mode::VAC_dBV => f.write_str("VAC/dBV"),
            Mode::VAC_dBV_Rel => f.write_str("VAC/dBV/Rel"),
            Mode::VAC_dBm => f.write_str("VAC/dBm"),
            Mode::VAC_dBm_Rel => f.write_str("VAC/dBm/Rel"),

            Mode::mVAC_Normal => f.write_str("mVAC"),
            Mode::mVAC_Normal_Rel => f.write_str("mVAC/Rel"),
            Mode::mVAC_Hz => f.write_str("mVAC/Hz"),
            Mode::mVAC_Peak => f.write_str("mVAC/Peak"),
            Mode::mVAC_AC_DC => f.write_str("mVAC/AC+DC"),
            Mode::mVAC_AC_DC_Rel => f.write_str("mVAC/AC+DC/Rel"),

            Mode::VDC_Normal => f.write_str("VDC"),
            Mode::VDC_Normal_Rel => f.write_str("VDC/Rel"),
            Mode::VDC_AC_DC => f.write_str("VDC/AC+DC"),
            Mode::VDC_AC_DC_Rel => f.write_str("VDC/AC+DC/Rel"),
            Mode::VDC_Peak => f.write_str("VDC/Peak"),

            Mode::mVDC_Normal => f.write_str("mVDC"),
            Mode::mVDC_Normal_Rel => f.write_str("mVDC/Rel"),
            Mode::mVDC_Peak => f.write_str("mVDC/Peak"),

            Mode::TempC_T1_T2 => f.write_str("Temp C/T1,T2"),
            Mode::TempC_T1_T2_Rel => f.write_str("Temp C/T1,T2/Rel"),
            Mode::TempC_T2_T1 => f.write_str("Temp C/T2,T1"),
            Mode::TempC_T2_T1_Rel => f.write_str("Temp C/T2,T1/Rel"),
            Mode::TempC_T1_T2_Diff => f.write_str("Temp C/T1-T2"),
            Mode::TempC_T2_T1_Diff => f.write_str("Temp C/T2-T1"),

            Mode::TempF_T1_T2 => f.write_str("Temp F/T1,T2"),
            Mode::TempF_T1_T2_Rel => f.write_str("Temp F/T1,T2/Rel"),
            Mode::TempF_T2_T1 => f.write_str("Temp F/T2,T1"),
            Mode::TempF_T2_T1_Rel => f.write_str("Temp F/T2,T1/Rel"),
            Mode::TempF_T1_T2_Diff => f.write_str("Temp F/T1-T2"),
            Mode::TempF_T2_T1_Diff => f.write_str("Temp F/T2-T1"),

            Mode::Resistance => f.write_str("Resistance"),
            Mode::Resistance_Rel => f.write_str("Resistance/Rel"),

            Mode::Beeper_Short => f.write_str("Beeper/Short"),
            Mode::Beeper_Open => f.write_str("Beeper/Open"),

            Mode::Admittance => f.write_str("Admittance"),
            Mode::Admittance_Rel => f.write_str("Admittance/Rel"),

            Mode::Diode_Normal => f.write_str("Diode"),
            Mode::Diode_Alarm => f.write_str("Diode/Alarm"),

            Mode::Capacitance => f.write_str("Capacitance"),
            Mode::Capacitance_Rel => f.write_str("Capacitance/Rel"),

            Mode::Frequency => f.write_str("Frequency"),
            Mode::Frequency_Rel => f.write_str("Frequency/Rel"),

            Mode::DutyCycle => f.write_str("Duty Cycle"),
            Mode::DutyCycle_Rel => f.write_str("Duty cycle/Rel"),

            Mode::PulseWidth => f.write_str("Pulse width"),
            Mode::PulseWidth_Rel => f.write_str("Pulse width/Rel"),

            Mode::uADC_Normal => f.write_str("uADC"),
            Mode::uADC_Normal_Rel => f.write_str("uADC/Rel"),
            Mode::uADC_AC_DC => f.write_str("uADC/AC+DC"),
            Mode::uADC_AC_DC_Rel => f.write_str("uADC/AC+DC/Rel"),
            Mode::uADC_Peak => f.write_str("uADC/Peak"),

            Mode::uAAC_Normal => f.write_str("uAAC"),
            Mode::uAAC_Normal_Rel => f.write_str("uAAC/Rel"),
            Mode::uAAC_Hz => f.write_str("uAAC/Hz"),
            Mode::uAAC_Peak => f.write_str("uAAC/Peak"),

            Mode::mADC_Normal => f.write_str("mADC"),
            Mode::mADC_Normal_Rel => f.write_str("mADC/Rel"),
            Mode::mADC_AC_DC => f.write_str("mADC/AC+DC"),
            Mode::mADC_AC_DC_Rel => f.write_str("mADC/AC+DC/Rel"),
            Mode::mADC_Peak => f.write_str("mADC/Peak"),

            Mode::mAAC_Normal => f.write_str("mAAC"),
            Mode::mAAC_Normal_Rel => f.write_str("mAAC/Rel"),
            Mode::mAAC_Hz => f.write_str("mAAC/Hz"),
            Mode::mAAC_Peak => f.write_str("mAAC/Peak"),

            Mode::ADC_Normal => f.write_str("ADC"),
            Mode::ADC_Normal_Rel => f.write_str("ADC/Rel"),
            Mode::ADC_AC_DC => f.write_str("ADC/AC+DC"),
            Mode::ADC_AC_DC_Rel => f.write_str("ADC/AC+DC/Rel"),
            Mode::ADC_Peak => f.write_str("ADC/Peak"),

            Mode::AAC_Normal => f.write_str("AAC"),
            Mode::AAC_Normal_Rel => f.write_str("AAC/Rel"),
            Mode::AAC_Hz => f.write_str("AAC/Hz"),
            Mode::AAC_Peak => f.write_str("AAC/Peak"),
        }
    }
}