]> sigrok.org Git - libsigrok.git/blob - src/hardware/gmc-mh-1x-2x/protocol.c
53efdf4255f7500d60c4f07ef36ac6e537f4dff3
[libsigrok.git] / src / hardware / gmc-mh-1x-2x / protocol.c
1 /*
2  * This file is part of the libsigrok project.
3  *
4  * Copyright (C) 2013, 2014 Matthias Heidbrink <m-sigrok@heidbrink.biz>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <math.h>
22 #include <string.h>
23 #include "protocol.h"
24
25 static guchar calc_chksum_14(guchar *dta);
26 static int chk_msg14(struct sr_dev_inst *sdi);
27
28 /** Set or clear flags in devc->mqflags. */
29 static void setmqf(struct dev_context *devc, uint64_t flags, gboolean set)
30 {
31         if (set)
32                 devc->mqflags |= flags;
33         else
34                 devc->mqflags &= ~flags;
35 }
36
37 /** Decode current type and measured value, Metrahit 12-16. */
38 static void decode_ctmv_16(uint8_t ctmv, struct dev_context *devc)
39 {
40         devc->mq = 0;
41         devc->unit = 0;
42         devc->mqflags = 0;
43
44         switch (ctmv) {
45         case 0x00: /* 0000 - */
46                 break;
47         case 0x01: /* 0001 mV DC */
48                 devc->scale1000 = -1; /* Fall through */
49         case 0x02: /* 0010 V DC */
50         case 0x03: /* 0011 V AC+DC */
51         case 0x04: /* 0100 V AC */
52                 devc->mq = SR_MQ_VOLTAGE;
53                 devc->unit = SR_UNIT_VOLT;
54                 if (ctmv <= 0x03)
55                         devc->mqflags |= SR_MQFLAG_DC;
56                 if (ctmv >= 0x03) {
57                         devc->mqflags |= SR_MQFLAG_AC;
58                         if (devc->model >= METRAHIT_16S)
59                                 devc->mqflags |= SR_MQFLAG_RMS;
60                 }
61                 break;
62         case 0x05: /* 0101 Hz (15S/16S only) */
63         case 0x06: /* 0110 kHz (15S/16S only) */
64                 devc->mq = SR_MQ_FREQUENCY;
65                 devc->unit = SR_UNIT_HERTZ;
66                 if (ctmv == 0x06)
67                         devc->scale1000 = 1;
68                 break;
69         case 0x07: /* 0111 % (15S/16S only) */
70                 devc->mq = SR_MQ_DUTY_CYCLE;
71                 devc->unit = SR_UNIT_PERCENTAGE;
72                 break;
73         case 0x08: /* 1000 Diode */
74                 devc->mq = SR_MQ_VOLTAGE;
75                 devc->unit = SR_UNIT_VOLT;
76                 devc->mqflags |= SR_MQFLAG_DIODE;
77                 break;
78         case 0x09: /* 1001 Ohm, °C */
79         case 0x0a: /* 1010 kOhm */
80         case 0x0b: /* 1011 MOhm */
81                 devc->mq = SR_MQ_RESISTANCE; /* Changed to temp. later if req.*/
82                 devc->unit = SR_UNIT_OHM;
83                 devc->scale1000 = ctmv - 0x09;
84                 break;
85         case 0x0c: /* 1100 nF (15S/16S only) */
86         case 0x0d: /* 1101 µF (15S/16S only) */
87                 devc->mq = SR_MQ_CAPACITANCE;
88                 devc->unit = SR_UNIT_FARAD;
89                 devc->scale1000 = (ctmv == 0x0c) ? -3 : -2;
90                 break;
91         case 0x0e: /* mA, µA */
92                 devc->scale1000 = -1; /* Fall through. */
93         case 0x0f: /* A */
94                 devc->mq = SR_MQ_CURRENT;
95                 devc->unit = SR_UNIT_AMPERE;
96                 if (devc->model == METRAHIT_16S)
97                         devc->mqflags |= SR_MQFLAG_RMS;
98                 /* 16I A only with clamp, RMS questionable. */
99                 break;
100         }
101 }
102
103 /**
104  * Decode range/sign/acdc byte special chars (Metrahit 12-16).
105  *
106  * @param[in] rs Range and sign byte.
107  */
108 static void decode_rs_16(uint8_t rs, struct dev_context *devc)
109 {
110         sr_spew("decode_rs_16(%d) scale = %d", rs, devc->scale);
111
112         if (rs & 0x04) /* Sign */
113                 devc->scale = -devc->scale;
114
115         if (devc->mq == SR_MQ_CURRENT)
116                 devc->mqflags |= (rs & 0x08) ? SR_MQFLAG_AC : SR_MQFLAG_DC;
117
118         switch (rs & 0x03) {
119         case 0:
120                 if (devc->mq == SR_MQ_VOLTAGE) /* V */
121                         devc->scale += -1;
122                 else if (devc->mq == SR_MQ_CURRENT) /* 000.0 µA */
123                         devc->scale += -5;
124                 else if (devc->mq == SR_MQ_RESISTANCE) {
125                         if (devc->buflen >= 10) {
126                                 /* °C with 10 byte msg type, otherwise GOhm. */
127                                 devc->mq = SR_MQ_TEMPERATURE;
128                                 devc->unit = SR_UNIT_CELSIUS;
129                                 devc->scale += -2;
130                         } else if (devc->scale1000 == 2) {
131                                 /* 16I Iso 500/1000V 3 GOhm */
132                                 devc->scale += -1;
133                         }
134                 }
135                 break;
136         case 1:
137                 devc->scale += -4;
138                 break;
139         case 2:
140                 devc->scale += -3;
141                 break;
142         case 3:
143                 devc->scale += -2;
144                 break;
145         }
146 }
147
148 /**
149  * Decode special chars, Metrahit 12-16.
150  *
151  * @param[in] spc Special characters 1 and 2 (s1 | (s2 << 4)).
152  */
153 static void decode_spc_16(uint8_t spc, struct dev_context *devc)
154 {
155         /* xxxx1xxx ON */
156         /* TODO: What does that mean? Power on? The 16I sets this. */
157         /* xxxxx1xx BEEP */
158         /* xxxxxx1x Low battery */
159         /* xxxxxxx1 FUSE */
160         /* 1xxxxxxx MIN */
161         setmqf(devc, SR_MQFLAG_MIN, spc & 0x80);
162
163         /* x1xxxxxx MAN */
164         setmqf(devc, SR_MQFLAG_AUTORANGE, !(spc & 0x40));
165
166         /* xx1xxxxx DATA */
167         setmqf(devc, SR_MQFLAG_HOLD, spc & 0x20);
168
169         /* xxx1xxxx MAX */
170         setmqf(devc, SR_MQFLAG_MAX, spc & 0x10);
171 }
172
173 /** Decode current type and measured value, Metrahit 18. */
174 static void decode_ctmv_18(uint8_t ctmv, struct dev_context *devc)
175 {
176         devc->mq = 0;
177         devc->unit = 0;
178         devc->mqflags = 0;
179
180         switch (ctmv) {
181         case 0x00: /* 0000 - */
182                 break;
183         case 0x01: /* 0001 V AC */
184         case 0x02: /* 0010 V AC+DC */
185         case 0x03: /* 0011 V DC */
186                 devc->mq = SR_MQ_VOLTAGE;
187                 devc->unit = SR_UNIT_VOLT;
188                 if (ctmv <= 0x02)
189                         devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_RMS);
190                 if (ctmv >= 0x02)
191                         devc->mqflags |= SR_MQFLAG_DC;
192                 break;
193         case 0x04: /* 0100 Ohm/Ohm with buzzer */
194                 devc->mq = SR_MQ_RESISTANCE;
195                 devc->unit = SR_UNIT_OHM;
196                 break;
197         case 0x05: /* 0101 Diode/Diode with buzzer */
198                 devc->mq = SR_MQ_VOLTAGE;
199                 devc->unit = SR_UNIT_VOLT;
200                 devc->mqflags |= SR_MQFLAG_DIODE;
201                 break;
202         case 0x06: /* 0110 °C */
203                 devc->mq = SR_MQ_TEMPERATURE;
204                 devc->unit = SR_UNIT_CELSIUS;
205                 break;
206         case 0x07: /* 0111 F */
207                 devc->mq = SR_MQ_CAPACITANCE;
208                 devc->unit = SR_UNIT_FARAD;
209                 break;
210         case 0x08: /* 1000 mA DC */
211         case 0x09: /* 1001 A DC */
212         case 0x0a: /* 1010 mA AC+DC */
213         case 0x0b: /* 1011 A AC+DC */
214                 devc->mq = SR_MQ_CURRENT;
215                 devc->unit = SR_UNIT_AMPERE;
216                 devc->mqflags |= SR_MQFLAG_DC;
217                 if (ctmv >= 0x0a)
218                         devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_RMS);
219                 if ((ctmv == 0x08) || (ctmv == 0x0a))
220                         devc->scale1000 = -1;
221                 break;
222         case 0x0c: /* 1100 Hz */
223                 devc->mq = SR_MQ_FREQUENCY;
224                 devc->unit = SR_UNIT_HERTZ;
225                 break;
226         case 0x0d: /* 1101 dB */
227                 devc->mq = SR_MQ_VOLTAGE;
228                 devc->unit = SR_UNIT_DECIBEL_VOLT;
229                 devc->mqflags |= SR_MQFLAG_AC; /* dB available for AC only */
230                 break;
231         case 0x0e: /* 1110 Events AC, Events AC+DC. Actually delivers just
232                 * current voltage via IR, nothing more. */
233                 devc->mq = SR_MQ_VOLTAGE;
234                 devc->unit = SR_UNIT_VOLT;
235                 devc->mqflags |= SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS;
236                 break;
237         case 0x0f: /* 1111 Clock */
238                 devc->mq = SR_MQ_TIME;
239                 devc->unit = SR_UNIT_SECOND;
240                 devc->mqflags |= SR_MQFLAG_DURATION;
241                 break;
242         }
243 }
244
245 /**
246  * Decode range/sign/acdc byte special chars, Metrahit 18.
247  *
248  * @param[in] rs Range/sign byte.
249  */
250 static void decode_rs_18(uint8_t rs, struct dev_context *devc)
251 {
252         int range;
253
254         /* Sign */
255         if (((devc->scale > 0) && (rs & 0x08)) ||
256                         ((devc->scale < 0) && !(rs & 0x08)))
257                 devc->scale = -devc->scale;
258
259         /* Range */
260         range = rs & 0x07;
261         switch (devc->mq) {
262         case SR_MQ_VOLTAGE:
263                 if (devc->unit == SR_UNIT_DECIBEL_VOLT) {
264                         devc->scale += -2;
265                         /*
266                          * When entering relative mode, the device switches
267                          * from 10 byte to 6 byte msg format. Unfortunately
268                          * it switches back to 10 byte when the second value
269                          * is measured, so that's not sufficient to
270                          * identify relative mode.
271                          */
272                 }
273                 else
274                         devc->scale += range - 5;
275                 break;
276         case SR_MQ_CURRENT:
277                 devc->scale += (devc->scale1000 == -1) ? range - 5 : range - 4;
278                 break;
279         case SR_MQ_RESISTANCE:
280                 devc->scale += range - 2;
281                 break;
282         case SR_MQ_FREQUENCY:
283                 devc->scale += range - 2;
284                 break;
285         case SR_MQ_TEMPERATURE:
286                 devc->scale += range - 2;
287                 break;
288         case SR_MQ_CAPACITANCE:
289                 devc->scale += range - 13;
290                 break;
291                 /* TODO: 29S Mains measurements. */
292         default:
293                 /* Avoid certain compiler warnings due to (-Wswitch). */
294                 break;
295         }
296 }
297
298 /**
299  * Decode special chars, Metrahit 18.
300  *
301  * @param[in] spc Special characters 1 and 2 (s1 | (s2 << 4)).
302  */
303 static void decode_spc_18(uint8_t spc, struct dev_context *devc)
304 {
305         /* xxxx1xxx ZERO */
306         /* xxxxx1xx BEEP */
307         /* xxxxxx1x Low battery */
308         /* xxxxxxx1 Fuse */
309
310         if (devc->mq == SR_MQ_TIME) {
311                 /* xxx1xxxx Clock running: 1; stop: 0 */
312                 sr_spew("Clock running: %d", spc >> 4);
313         } else {
314                 /* 1xxxxxxx MAN */
315                 setmqf(devc, SR_MQFLAG_AUTORANGE, !(spc & 0x80));
316
317                 /* x1xxxxxx MIN */
318                 setmqf(devc, SR_MQFLAG_MIN, spc & 0x40);
319
320                 /* xx1xxxxx MAX */
321                 setmqf(devc, SR_MQFLAG_MAX, spc & 0x20);
322
323                 /* xxx1xxxx DATA */
324                 setmqf(devc, SR_MQFLAG_HOLD, spc & 0x10);
325         }
326 }
327
328 /**
329  * Decode current type and measured value, Metrahit 2x.
330  *
331  * @param[in] ctmv Current type and measured value (v1 | (v2 << 4)).
332  */
333 static void decode_ctmv_2x(uint8_t ctmv, struct dev_context *devc)
334 {
335         if ((ctmv > 0x20) || (!devc)) {
336                 sr_err("decode_ctmv_2x(0x%x): invalid param(s)!", ctmv);
337                 return;
338         }
339
340         devc->mq = 0;
341         devc->unit = 0;
342         devc->mqflags = 0;
343
344         switch (ctmv) {
345         /* 00000 unused */
346         case 0x01: /* 00001 V DC */
347         case 0x02: /* 00010 V AC+DC */
348         case 0x03: /* 00011 V AC */
349                 devc->mq = SR_MQ_VOLTAGE;
350                 devc->unit = SR_UNIT_VOLT;
351                 if (ctmv <= 0x02)
352                         devc->mqflags |= SR_MQFLAG_DC;
353                 if (ctmv >= 0x02) {
354                         devc->mqflags |= SR_MQFLAG_AC;
355                         if (devc->model >= METRAHIT_24S)
356                                 devc->mqflags |= SR_MQFLAG_RMS;
357                 }
358                 break;
359         case 0x04: /* 00100 mA DC */
360         case 0x05: /* 00101 mA AC+DC */
361                 devc->scale1000 = -1;
362                 /* Fall through! */
363         case 0x06: /* 00110 A DC */
364         case 0x07: /* 00111 A AC+DC */
365                 devc->mq = SR_MQ_CURRENT;
366                 devc->unit = SR_UNIT_AMPERE;
367                 devc->mqflags |= SR_MQFLAG_DC;
368                 if ((ctmv == 0x05) || (ctmv == 0x07)) {
369                         devc->mqflags |= SR_MQFLAG_AC;
370                         if (devc->model >= METRAHIT_24S)
371                                 devc->mqflags |= SR_MQFLAG_RMS;
372                 }
373                 break;
374         case 0x08: /* 01000 Ohm */
375                 devc->mq = SR_MQ_RESISTANCE;
376                 devc->unit = SR_UNIT_OHM;
377                 break;
378         case 0x09: /* 01001 F */
379                 devc->mq = SR_MQ_CAPACITANCE;
380                 devc->unit = SR_UNIT_FARAD;
381                 devc->scale += -1;
382                 break;
383         case 0x0a: /* 01010 V dB */
384                 devc->mq = SR_MQ_VOLTAGE;
385                 devc->unit = SR_UNIT_DECIBEL_VOLT;
386                 devc->mqflags |= SR_MQFLAG_AC;
387                 if (devc->model >= METRAHIT_24S)
388                         devc->mqflags |= SR_MQFLAG_RMS;
389                 break;
390         case 0x0b: /* 01011 Hz U ACDC */
391         case 0x0c: /* 01100 Hz U AC */
392                 devc->mq = SR_MQ_FREQUENCY;
393                 devc->unit = SR_UNIT_HERTZ;
394                 devc->mqflags |= SR_MQFLAG_AC;
395                 if (ctmv <= 0x0b)
396                         devc->mqflags |= SR_MQFLAG_DC;
397                 break;
398         case 0x0d: /* 01101 W on power, mA range (29S only) */
399                 devc->scale += -1;
400                 /* Fall through! */
401         case 0x0e: /* 01110 W on power, A range (29S only) */
402                 devc->scale += -1;
403                 devc->scale1000 = -1;
404                 devc->mq = SR_MQ_POWER;
405                 devc->unit = SR_UNIT_WATT;
406                 devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS);
407                 break;
408         case 0x0f: /* 01111 Diode */
409         case 0x10: /* 10000 Diode with buzzer (actually cont. with voltage) */
410                 devc->unit = SR_UNIT_VOLT;
411                 if (ctmv == 0x0f) {
412                         devc->mq = SR_MQ_VOLTAGE;
413                         devc->mqflags |= SR_MQFLAG_DIODE;
414                 } else {
415                         devc->mq = SR_MQ_CONTINUITY;
416                         devc->scale += -5;
417                 }
418                 devc->unit = SR_UNIT_VOLT;
419                 break;
420         case 0x11: /* 10001 Ohm with buzzer */
421                 devc->mq = SR_MQ_CONTINUITY;
422                 devc->unit = SR_UNIT_OHM;
423                 devc->scale1000 = -1;
424                 break;
425         case 0x12: /* 10010 Temperature */
426                 devc->mq = SR_MQ_TEMPERATURE;
427                 devc->unit = SR_UNIT_CELSIUS;
428                 /* This can be Fahrenheit. That is detected by range=4 later. */
429                 break;
430         /* 0x13 10011 unused */
431         /* 0x14 10100 unused */
432         case 0x15: /* 10101 Press (29S only) */
433                 /* TODO: What does that mean? Possibly phase shift?
434                    Then we need a unit/flag for it. */
435                 devc->mq = SR_MQ_GAIN;
436                 devc->unit = SR_UNIT_PERCENTAGE;
437                 break;
438         case 0x16: /* 10110 Pulse W (29S only) */
439                 /* TODO: Own unit and flag for this! */
440                 devc->mq = SR_MQ_POWER;
441                 devc->unit = SR_UNIT_WATT;
442                 break;
443         case 0x17: /* 10111 TRMS V on mains (29S only) */
444                 devc->mq = SR_MQ_VOLTAGE;
445                 devc->unit = SR_UNIT_VOLT;
446                 devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS);
447                 break;
448         case 0x18: /* 11000 Counter (zero crossings of a signal) */
449                 devc->mq = SR_MQ_VOLTAGE;
450                 devc->unit = SR_UNIT_UNITLESS;
451                 break;
452         case 0x19: /* 11001 Events U ACDC */
453         case 0x1a: /* 11010 Events U AC */
454                 /* TODO: No unit or flags for this yet! */
455                 devc->mq = SR_MQ_VOLTAGE;
456                 devc->unit = SR_UNIT_UNITLESS;
457                 devc->mqflags |= SR_MQFLAG_AC;
458                 if (ctmv <= 0x19)
459                         devc->mqflags |= SR_MQFLAG_DC;
460                 break;
461         case 0x1b: /* 11011 Milliamperes in power mode (29S only); error in docs, "pulse on mains" */
462                 devc->mq = SR_MQ_CURRENT;
463                 devc->unit = SR_UNIT_AMPERE;
464                 devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS);
465                 devc->scale1000 = -1;
466                 break;
467         case 0x1c: /* 11100 dropout on mains (29S only) */
468                 /* TODO: No unit or flags for this yet! */
469                 devc->mq = SR_MQ_VOLTAGE;
470                 devc->unit = SR_UNIT_UNITLESS;
471                 devc->mqflags |= SR_MQFLAG_AC;
472                 break;
473         case 0x1d: /* 11101 Voltage in power mode (29S); undocumented! */
474                 devc->mq = SR_MQ_VOLTAGE;
475                 devc->unit = SR_UNIT_VOLT;
476                 devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS);
477                 break;
478         /* 0x1e: 11110 Undocumented */
479         case 0x1f: /* 11111 25S in stopwatch mode; undocumented!
480                         The value is voltage, not time, so treat it such. */
481                 devc->mq = SR_MQ_VOLTAGE;
482                 devc->unit = SR_UNIT_VOLT;
483                 devc->mqflags |= SR_MQFLAG_DC;
484                 break;
485         case 0x20: /* 100000 25S in event count mode; undocumented!
486                         Value is 0 anyway. */
487                 devc->mq = SR_MQ_VOLTAGE;
488                 devc->unit = SR_UNIT_UNITLESS;
489                 break;
490         default:
491                 sr_err("decode_ctmv_2x(%d, ...): Unknown ctmv!", ctmv);
492                 break;
493         }
494 }
495
496 /**
497  * Decode range/sign/acdc byte special chars, Metrahit 2x, table TR.
498  *
499  * @param[in] rs Range/sign byte.
500  */
501 static void decode_rs_2x(uint8_t rs, struct dev_context *devc)
502 {
503         int range;
504
505         /* Sign */
506         if (((devc->scale > 0) && (rs & 0x08)) ||
507                         ((devc->scale < 0) && !(rs & 0x08)))
508                 devc->scale = -devc->scale;
509
510         /* Range */
511         range = rs & 0x07;
512         switch (devc->mq) {
513         case SR_MQ_VOLTAGE:
514                 devc->scale += (devc->unit == SR_UNIT_DECIBEL_VOLT) ? -3 : range - 6;
515                 break;
516         case SR_MQ_CURRENT:
517                 if (devc->scale1000 != -1) /* uA, mA */
518                         range += 1;/* mA and A ranges differ by 10^4, not 10^3!*/
519                 devc->scale += range - 6;
520                 break;
521         case SR_MQ_RESISTANCE:
522                 devc->scale += range - 3;
523                 break;
524         case SR_MQ_FREQUENCY:
525                 devc->scale += range - 3;
526                 break;
527         case SR_MQ_TEMPERATURE:
528                 if (range == 4) /* Indicator for °F */
529                         devc->unit = SR_UNIT_FAHRENHEIT;
530                 devc->scale += -2;
531                 break;
532         case SR_MQ_CAPACITANCE:
533                 if (range == 7)
534                         range -= 1; /* Same value as range 6 */
535                 devc->scale += range - 13;
536                 break;
537         /* TODO: 29S Mains measurements. */
538         default:
539                 /* Avoid certain compiler warnings due to (-Wswitch). */
540                 break;
541         }
542 }
543
544 /**
545  * Decode range/sign/acdc byte special chars, Metrahit 2x, table TR 2.
546  *
547  * @param[in] rs Range/sign byte.
548  */
549 static void decode_rs_2x_TR2(uint8_t rs, struct dev_context *devc)
550 {
551         int range;
552
553         /* Range */
554         range = rs & 0x07;
555         switch (devc->mq) {
556         case SR_MQ_CURRENT:
557                 if (devc->scale1000 == -1) /* mA */
558                         switch (range) {
559                         case 0:
560                         case 1: /* 100, 300 µA */
561                                 devc->scale += -6;
562                                 break;
563                         case 2:
564                         case 3: /* 1, 3 mA */
565                                 devc->scale += -5;
566                                 break;
567                         case 4:
568                         case 5: /* 10, 30 mA */
569                                 devc->scale += -4;
570                                 break;
571                         case 6:
572                         case 7: /* 100, 300 mA */
573                                 devc->scale += -3;
574                                 break;
575                         }
576                 else /* A */
577                         switch (range) {
578                         case 0:
579                         case 1: /* 1, 3 A */
580                                 devc->scale += -5;
581                                 break;
582                         case 2: /* 10 A */
583                                 devc->scale += -4;
584                                 break;
585                         }
586                 break;
587         default:
588                 decode_rs_2x(rs, devc);
589                 return;
590         }
591
592         /* Sign */
593         if (((devc->scale > 0) && (rs & 0x08)) ||
594                         ((devc->scale < 0) && !(rs & 0x08)))
595                 devc->scale = -devc->scale;
596 }
597
598 /**
599  * Decode special chars (Metrahit 2x).
600  *
601  * @param[in] spc Special characters 1 and 2 (s1 | (s2 << 4)).
602  */
603 static void decode_spc_2x(uint8_t spc, struct dev_context *devc)
604 {
605         /* xxxxxxx1 Fuse */
606
607         /* xxxxxx1x Low battery */
608
609         /* xxxxx1xx BEEP */
610
611         /* xxxx1xxx ZERO */
612
613         /* xxx1xxxx DATA */
614         setmqf(devc, SR_MQFLAG_HOLD, spc & 0x10);
615
616         /* x11xxxxx unused */
617         /* 1xxxxxxx MAN */
618         setmqf(devc, SR_MQFLAG_AUTORANGE, !(spc & 0x80));
619 }
620
621 /** Clean range and sign. */
622 static void clean_rs_v(struct dev_context *devc)
623 {
624         devc->value = 0.0;
625         devc->scale = 0;
626 }
627
628 /** Clean current type, measured variable, range and sign. */
629 static void clean_ctmv_rs_v(struct dev_context *devc)
630 {
631         devc->mq = 0;
632         devc->unit = 0;
633         devc->mqflags = 0;
634         devc->scale1000 = 0;
635         clean_rs_v(devc);
636 }
637
638 /** Send prepared value. */
639 static void send_value(struct sr_dev_inst *sdi)
640 {
641         struct dev_context *devc;
642         struct sr_datafeed_analog analog;
643         struct sr_analog_encoding encoding;
644         struct sr_analog_meaning meaning;
645         struct sr_analog_spec spec;
646         struct sr_datafeed_packet packet;
647         int digits;
648
649         devc = sdi->priv;
650
651         digits = -(devc->scale + 3 * devc->scale1000);
652         sr_analog_init(&analog, &encoding, &meaning, &spec, digits);
653         analog.meaning->channels = sdi->channels;
654         analog.num_samples = 1;
655         analog.meaning->mq = devc->mq;
656         analog.meaning->unit = devc->unit;
657         analog.meaning->mqflags = devc->mqflags;
658         analog.data = &devc->value;
659
660         memset(&packet, 0, sizeof(struct sr_datafeed_packet));
661         packet.type = SR_DF_ANALOG;
662         packet.payload = &analog;
663         sr_session_send(sdi, &packet);
664
665         sr_sw_limits_update_samples_read(&devc->limits, 1);
666 }
667
668 /** Process 6-byte data message, Metrahit 1x/2x send mode. */
669 static void process_msg_dta_6(struct sr_dev_inst *sdi)
670 {
671         struct dev_context *devc;
672         int cnt;
673         uint8_t dgt;
674
675         devc = sdi->priv;
676         clean_rs_v(devc);
677
678         /* Byte 0, range and sign */
679         if (devc->model <= METRAHIT_16X)
680                 decode_rs_16(bc(devc->buf[0]), devc);
681         else if (devc->model < METRAHIT_2X)
682                 decode_rs_18(bc(devc->buf[0]), devc);
683         else {
684                 decode_rs_2x(bc(devc->buf[0]), devc);
685                 devc->scale += 1; /* Compensate for format having only 5 digits, decode_rs_2x() assumes 6. */
686         }
687
688         /* Bytes 1-5, digits (ls first). */
689         for (cnt = 0; cnt < 5; cnt++) {
690                 dgt = bc(devc->buf[1 + cnt]);
691                 if (dgt >= 10) {
692                         /* 10 Overload; on model <= 16X also 11 possible. */
693                         devc->value = NAN;
694                         devc->scale = 0;
695                         break;
696                 }
697                 devc->value += pow(10.0, cnt) * dgt;
698         }
699
700         sr_spew("process_msg_dta_6() value=%f scale=%d scale1000=%d",
701                 devc->value, devc->scale, devc->scale1000);
702         if (devc->value != NAN)
703                 devc->value *= pow(10.0, devc->scale) * pow(1000.0, devc->scale1000);
704
705         /* Create and send packet. */
706         send_value(sdi);
707 }
708
709 /** Process 5-byte info message, Metrahit 1x/2x. */
710 static void process_msg_inf_5(struct sr_dev_inst *sdi)
711 {
712         struct dev_context *devc;
713         enum model model;
714
715         devc = sdi->priv;
716
717         clean_ctmv_rs_v(devc);
718
719         /* Process byte 0 */
720         model = gmc_decode_model_sm(bc(devc->buf[0]));
721         if (model != devc->model) {
722                 sr_warn("Model mismatch in data: Detected %s, now %s",
723                         gmc_model_str(devc->model), gmc_model_str(model));
724         }
725
726         /* Process bytes 1-4 */
727         if (devc->model <= METRAHIT_16X) {
728                 decode_ctmv_16(bc(devc->buf[1]), devc);
729                 decode_spc_16(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
730                 decode_rs_16(bc(devc->buf[4]), devc);
731         } else if (devc->model <= METRAHIT_18S) {
732                 decode_ctmv_18(bc(devc->buf[1]), devc);
733                 decode_spc_18(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
734                 decode_rs_18(bc(devc->buf[4]), devc);
735         } else { /* Must be Metrahit 2x */
736                 decode_ctmv_2x(bc(devc->buf[1]), devc);
737                 decode_spc_2x(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
738                 decode_rs_2x(bc(devc->buf[4]), devc);
739         }
740 }
741
742 /** Process 10-byte info/data message, Metrahit 15+. */
743 static void process_msg_inf_10(struct sr_dev_inst *sdi)
744 {
745         struct dev_context *devc;
746         int cnt;
747         uint8_t dgt;
748
749         devc = sdi->priv;
750
751         process_msg_inf_5(sdi);
752
753         /* Now decode numbers */
754         for (cnt = 0; cnt < 5; cnt++) {
755                 dgt = bc(devc->buf[5 + cnt]);
756                 if (dgt == 11) { /* Empty digit */
757                         dgt = 0;
758                 }
759                 else if (dgt >= 12) { /* Overload */
760                         devc->value = NAN;
761                         devc->scale = 0;
762                         break;
763                 }
764                 devc->value += pow(10.0, cnt) * dgt;
765         }
766         sr_spew("process_msg_inf_10() value=%f scale=%d scalet=%d",
767                 devc->value, devc->scale, devc->scale1000);
768
769         if (devc->value != NAN)
770                 devc->value *= pow(10, devc->scale) * pow(1000.0, devc->scale1000);
771
772         /* Create and send packet. */
773         send_value(sdi);
774 }
775
776 /** Decode send interval (Metrahit 2x only). */
777 static const char *decode_send_interval(uint8_t si)
778 {
779         switch (si) {
780         case 0x00:
781                 return "0.05";
782         case 0x01:
783                 return "0.1";
784         case 0x02:
785                 return "0.2";
786         case 0x03:
787                 return "0.5";
788         case 0x04:
789                 return "00:01";
790         case 0x05:
791                 return "00:02";
792         case 0x06:
793                 return "00:05";
794         case 0x07:
795                 return "00:10";
796         case 0x08:
797                 return "00:20";
798         case 0x09:
799                 return "00:30";
800         case 0x0a:
801                 return "01:00";
802         case 0x0b:
803                 return "02:00";
804         case 0x0c:
805                 return "05:00";
806         case 0x0d:
807                 return "10:00";
808         case 0x0e:
809                 return "----";
810         case 0x0f:
811                 return "data";
812         default:
813                 return "Unknown value";
814         }
815 }
816
817 /** Process 13-byte info/data message, Metrahit 2x. */
818 static void process_msg_inf_13(struct sr_dev_inst *sdi)
819 {
820         struct dev_context *devc;
821         enum model model;
822         int cnt;
823         uint8_t dgt;
824
825         devc = sdi->priv;
826
827         clean_ctmv_rs_v(devc);
828
829         /* Byte 0, model. */
830         model = gmc_decode_model_sm(bc(devc->buf[0]));
831         if (model != devc->model) {
832                 sr_warn("Model mismatch in data: Detected %s, now %s",
833                         gmc_model_str(devc->model), gmc_model_str(model));
834         }
835
836         /* Bytes 1-4, 11. */
837         decode_ctmv_2x(bc(devc->buf[1]) | (bc(devc->buf[11]) << 4), devc);
838         decode_spc_2x(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
839         decode_rs_2x(bc(devc->buf[4]), devc);
840
841         /* Bytes 5-10, digits (ls first). */
842         for (cnt = 0; cnt < 6; cnt++) {
843                 dgt = bc(devc->buf[5 + cnt]);
844                 if (dgt == 10) { /* Overload */
845                         devc->value = NAN;
846                         devc->scale = 0;
847                         break;
848                 }
849                 devc->value += pow(10.0, cnt) * dgt;
850         }
851         sr_spew("process_msg_inf_13() value=%f scale=%d scale1000=%d mq=%d "
852                 "unit=%d mqflags=0x%02" PRIx64, devc->value, devc->scale,
853                 devc->scale1000, devc->mq, devc->unit, (uint64_t)devc->mqflags);
854         if (devc->value != NAN)
855                 devc->value *= pow(10, devc->scale) * pow(1000.0, devc->scale1000);
856
857         /* Byte 12, Send Interval */
858         sr_spew("Send interval: %s", decode_send_interval(bc(devc->buf[12])));
859
860         /* Create and send packet. */
861         send_value(sdi);
862 }
863
864 /**
865  * Dump contents of 14-byte message.
866  *
867  * @param buf Pointer to array of 14 data bytes.
868  * @param[in] raw Write only data bytes, no interpretation.
869  */
870 static void dump_msg14(guchar *buf, gboolean raw)
871 {
872         if (!buf)
873                 return;
874
875         if (raw)
876                 sr_spew("msg14: 0x %02x %02x %02x %02x %02x %02x %02x %02x "
877                         "%02x %02x %02x %02x %02x %02x",
878                         buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
879                                 buf[7], buf[8], buf[9], buf[10], buf[11], buf[12],
880                                 buf[13]);
881         else
882                 sr_spew("msg14: 0x a=%d c1=%02x c2=%02x cmd=%02x dta=%02x "
883                         "%02x %02x %02x %02x %02x %02x %02x %02x chs=%02x",
884                         buf[1] == 0x2b?buf[0] >> 2:buf[0] % 0x0f, buf[1], buf[2], buf[3], buf[4], buf[5],
885                                 buf[6], buf[7], buf[8], buf[9], buf[10], buf[11],
886                                 buf[12], buf[13]);
887 }
888
889 /**
890  * Calc checksum for 14 byte message type.
891  *
892  * @param[in] dta Pointer to array of 13 data bytes.
893  * @return Checksum.
894  */
895 static guchar calc_chksum_14(guchar *dta)
896 {
897         guchar cnt, chs;
898
899         for (chs = 0, cnt = 0; cnt < (GMC_REPLY_SIZE - 1); cnt++)
900                 chs += dta[cnt];
901
902         return (64 - chs) & MASK_6BITS;
903 }
904
905 /** Check 14-byte message, Metrahit 2x. */
906 static int chk_msg14(struct sr_dev_inst *sdi)
907 {
908         struct dev_context *devc;
909         int retc;
910         gboolean isreq; /* Message is request to multimeter (otherwise response) */
911         uint8_t addr; /* Adaptor address */
912
913         retc = SR_OK;
914
915         /* Check parameters and message */
916         if (!sdi || !(devc = sdi->priv))
917                 return SR_ERR_ARG;
918
919         if (devc->buflen != 14) {
920                 sr_err("process_msg_14(): Msg len 14 expected!");
921                 return SR_ERR_ARG;
922         }
923
924         isreq = devc->buf[1] == 0x2b;
925         if (isreq)
926                 addr = devc->buf[0] >> 2;
927         else
928                 addr = devc->buf[0] & 0x0f;
929
930         if ((devc->addr != addr) && !(isreq && (addr == 0))) {
931                 sr_err("process_msg_14(): Address mismatch, msg for other device!");
932                 retc = SR_ERR_ARG;
933         }
934
935         if (devc->buf[1] == 0) { /* Error msg from device! */
936                 switch (devc->buf[2]) {
937                 case 1: /* Not used */
938                         sr_err("Device: Illegal error code!");
939                         break;
940                 case 2: /* Incorrect check sum of received block */
941                         sr_err("Device: Incorrect checksum in cmd!");
942                         break;
943                 case 3: /* Incorrect length of received block */
944                         sr_err("Device: Incorrect block length in cmd!");
945                         break;
946                 case 4: /* Incorrect 2nd or 3rd byte */
947                         sr_err("Device: Incorrect byte 2 or 3 in cmd!");
948                         break;
949                 case 5: /* Parameter out of range */
950                         sr_err("Device: Parameter out of range!");
951                         break;
952                 default:
953                         sr_err("Device: Unknown error code!");
954                 }
955                 retc = SR_ERR_ARG;
956         }
957         else if (!isreq && ((devc->buf[1] != 0x27) || (devc->buf[2] != 0x3f))) {
958                 sr_err("process_msg_14(): byte 1/2 unexpected!");
959                 retc = SR_ERR_ARG;
960         }
961
962         if (calc_chksum_14(devc->buf) != devc->buf[13]) {
963                 sr_err("process_msg_14(): Invalid checksum!");
964                 retc = SR_ERR_ARG;
965         }
966
967         if (retc != SR_OK)
968                 dump_msg14(devc->buf, TRUE);
969
970         return retc;
971 }
972
973 /** Check 14-byte message, Metrahit 2x. */
974 SR_PRIV int process_msg14(struct sr_dev_inst *sdi)
975 {
976         struct dev_context *devc;
977         int retc;
978         uint8_t addr;
979         uint8_t cnt, dgt;
980
981         if ((retc = chk_msg14(sdi)) != SR_OK)
982                 return retc;
983
984         devc = sdi->priv;
985
986         clean_ctmv_rs_v(devc);
987         addr = devc->buf[0] & MASK_6BITS;
988         if (addr != devc->addr)
989                 sr_info("Device address mismatch %d/%d!", addr, devc->addr);
990
991         switch (devc->buf[3]) { /* That's the command this reply is for */
992         /* 0 cannot occur, the respective message is not a 14-byte message */
993         case 1: /* Read first free and occupied address */
994                 sr_spew("Cmd %d unimplemented!", devc->buf[3]);
995                 break;
996         case 2: /* Clear all RAM in multimeter */
997                 sr_spew("Cmd %d unimplemented!", devc->buf[3]);
998                 break;
999         case 3: /* Read firmware version and status */
1000                 sr_spew("Cmd 3, Read firmware and status");
1001                 switch (devc->cmd_idx) {
1002                 case 0:
1003                         devc->fw_ver_maj = devc->buf[5];
1004                         devc->fw_ver_min = devc->buf[4];
1005                         sr_spew("Firmware version %d.%d", (int)devc->fw_ver_maj, (int)devc->fw_ver_min);
1006                         sr_spew("Rotary Switch Position (1..10): %d", (int)devc->buf[6]);
1007                         /** Docs say values 0..9, but that's not true */
1008                         sr_spew("Measurement Function: %d ", (int)devc->buf[7]);
1009                         decode_ctmv_2x(devc->buf[7], devc);
1010                         sr_spew("Range: 0x%x", devc->buf[8]);
1011                         decode_rs_2x_TR2(devc->buf[8] & 0x0f, devc); /* Docs wrong, uses conversion table TR_2! */
1012                         devc->autorng = (devc->buf[8] & 0x20) == 0;
1013                         // TODO 9, 10: 29S special functions
1014                         devc->ubatt = 0.1 * (float)devc->buf[11];
1015                         devc->model = gmc_decode_model_bd(devc->buf[12]);
1016                         sr_spew("Model=%s, battery voltage=%2.1f V", gmc_model_str(devc->model), (double)devc->ubatt);
1017                         break;
1018                 case 1:
1019                         sr_spew("Internal version %d.%d", (int)devc->buf[5], (int)devc->buf[4]);
1020                         sr_spew("Comm mode: 0x%x", (int)devc->buf[6]);
1021                         sr_spew("Block cnt%%64: %d", (int)devc->buf[7]);
1022                         sr_spew("drpCi: %d drpCh: %d", (int)devc->buf[8], (int)devc->buf[9]);
1023                         // Semantics undocumented. Possibly Metrahit 29S dropouts stuff?
1024                         break;
1025                 default:
1026                         sr_spew("Cmd 3: Unknown cmd_idx=%d", devc->cmd_idx);
1027                         break;
1028                 }
1029                 break;
1030         case 4: /* Set real time, date, sample rate, trigger, ... */
1031                 sr_spew("Cmd %d unimplemented!", devc->buf[3]);
1032                 break;
1033         case 5: /* Read real time, date, sample rate, trigger... */
1034                 sr_spew("Cmd %d unimplemented!", devc->buf[3]);
1035                 break;
1036         case 6: /* Set modes or power off */
1037                 sr_spew("Cmd %d unimplemented!", devc->buf[3]);
1038                 break;
1039         case 7: /* Set measurement function, range, autom/man. */
1040                 sr_spew("Cmd %d unimplemented!", devc->buf[3]);
1041                 break;
1042         case 8: /* Get one measurement value */
1043                 sr_spew("Cmd 8, get one measurement value");
1044                 sr_spew("Measurement Function: %d ", (int)devc->buf[5]);
1045                 decode_ctmv_2x(devc->buf[5], devc);
1046                 if (!(devc->buf[6] & 0x10)) /* If bit4=0, old data. */
1047                         return SR_OK;
1048
1049                 decode_rs_2x_TR2(devc->buf[6] & 0x0f, devc); // The docs say conversion table TR_3, but that does not work
1050                 setmqf(devc, SR_MQFLAG_AUTORANGE, devc->autorng);
1051                 /* 6 digits */
1052                 for (cnt = 0; cnt < 6; cnt++) {
1053                         dgt = bc(devc->buf[7 + cnt]);
1054                         if (dgt == 10) { /* Overload */
1055                                 devc->value = NAN;
1056                                 devc->scale = 0;
1057                                 break;
1058                         }
1059                         else if (dgt == 13) { /* FUSE */
1060                                 sr_err("FUSE!");
1061                         }
1062                         else if (dgt == 14) { /* Function recognition mode, OPEN */
1063                                 sr_info("Function recognition mode, OPEN!");
1064                                 devc->value = NAN;
1065                                 devc->scale = 0;
1066                                 break;
1067                         }
1068                         devc->value += pow(10.0, cnt) * dgt;
1069                 }
1070                 sr_spew("process_msg14() value=%f scale=%d scale1000=%d mq=%d "
1071                         "unit=%d mqflags=0x%02" PRIx64, devc->value, devc->scale,
1072                         devc->scale1000, devc->mq, devc->unit, (uint64_t)devc->mqflags);
1073                 if (devc->value != NAN)
1074                         devc->value *= pow(10, devc->scale) * pow(1000.0, devc->scale1000);
1075
1076                 send_value(sdi);
1077
1078                 break;
1079         default:
1080                 sr_spew("Unknown cmd %d!", devc->buf[3]);
1081                 break;
1082         }
1083
1084         return SR_OK;
1085 }
1086
1087 /** Data reception callback function. */
1088 SR_PRIV int gmc_mh_1x_2x_receive_data(int fd, int revents, void *cb_data)
1089 {
1090         struct sr_dev_inst *sdi;
1091         struct dev_context *devc;
1092         struct sr_serial_dev_inst *serial;
1093         uint8_t buf, msgt;
1094         int len;
1095
1096         (void)fd;
1097
1098         if (!(sdi = cb_data))
1099                 return TRUE;
1100
1101         if (!(devc = sdi->priv))
1102                 return TRUE;
1103
1104         serial = sdi->conn;
1105
1106         if (revents == G_IO_IN) { /* Serial data arrived. */
1107                 while (GMC_BUFSIZE - devc->buflen - 1 > 0) {
1108                         len = serial_read_nonblocking(serial, devc->buf + devc->buflen, 1);
1109                         if (len < 1)
1110                                 break;
1111                         buf = *(devc->buf + devc->buflen);
1112                         sr_spew("read 0x%02x/%d/%d", buf, buf, buf & MSGC_MASK);
1113                         devc->buflen += len;
1114                         if (!devc->settings_ok) {
1115                                 /*
1116                                  * If no device type/settings record processed
1117                                  * yet, wait for one.
1118                                  */
1119                                 if ((devc->buf[0] & MSGID_MASK) != MSGID_INF) {
1120                                         devc->buflen = 0;
1121                                         continue;
1122                                 }
1123                                 devc->settings_ok = TRUE;
1124                         }
1125
1126                         msgt = devc->buf[0] & MSGID_MASK;
1127                         switch (msgt) {
1128                         case MSGID_INF:
1129                                 if (devc->buflen == 13) {
1130                                         process_msg_inf_13(sdi);
1131                                         devc->buflen = 0;
1132                                         continue;
1133                                 } else if ((devc->buflen == 10) &&
1134                                            (devc->model <= METRAHIT_18S)) {
1135                                         process_msg_inf_10(sdi);
1136                                         devc->buflen = 0;
1137                                         continue;
1138                                 }
1139                                 else if ((devc->buflen >= 5) &&
1140                                          (devc->buf[devc->buflen - 1] &
1141                                           MSGID_MASK) != MSGID_DATA) {
1142                                         /*
1143                                          * Char just received is beginning
1144                                          * of next message.
1145                                          */
1146                                         process_msg_inf_5(sdi);
1147                                         devc->buf[0] =
1148                                                         devc->buf[devc->buflen - 1];
1149                                         devc->buflen = 1;
1150                                         continue;
1151                                 }
1152                                 break;
1153                         case MSGID_DTA:
1154                         case MSGID_D10:
1155                                 if (devc->buflen == 6) {
1156                                         process_msg_dta_6(sdi);
1157                                         devc->buflen = 0;
1158                                 }
1159                                 break;
1160                         case MSGID_DATA:
1161                                 sr_err("Comm error, unexpected data byte!");
1162                                 devc->buflen = 0;
1163                                 break;
1164                         }
1165                 }
1166         }
1167
1168         if (sr_sw_limits_check(&devc->limits))
1169                 sr_dev_acquisition_stop(sdi);
1170
1171         return TRUE;
1172 }
1173
1174 SR_PRIV int gmc_mh_2x_receive_data(int fd, int revents, void *cb_data)
1175 {
1176         struct sr_dev_inst *sdi;
1177         struct dev_context *devc;
1178         struct sr_serial_dev_inst *serial;
1179         uint8_t buf;
1180         int len;
1181
1182         (void)fd;
1183
1184         if (!(sdi = cb_data))
1185                 return TRUE;
1186
1187         if (!(devc = sdi->priv))
1188                 return TRUE;
1189
1190         serial = sdi->conn;
1191
1192         if (revents == G_IO_IN) { /* Serial data arrived. */
1193                 while (GMC_BUFSIZE - devc->buflen - 1 > 0) {
1194                         len = serial_read_nonblocking(serial, devc->buf + devc->buflen, 1);
1195                         if (len < 1)
1196                                 break;
1197                         buf = *(devc->buf + devc->buflen);
1198                         sr_spew("read 0x%02x/%d/%d", buf, buf, buf & MASK_6BITS);
1199                         devc->buf[devc->buflen] &= MASK_6BITS;
1200                         devc->buflen += len;
1201
1202                         if (devc->buflen == 14) {
1203                                 devc->response_pending = FALSE;
1204                                 sr_spew("gmc_mh_2x_receive_data processing msg");
1205                                 process_msg14(sdi);
1206                                 devc->buflen = 0;
1207                         }
1208                 }
1209         }
1210
1211         if (sr_sw_limits_check(&devc->limits))
1212                 sr_dev_acquisition_stop(sdi);
1213
1214         /* Request next data set, if required */
1215         if (sdi->status == SR_ST_ACTIVE) {
1216                 if (devc->response_pending) {
1217                         gint64 elapsed_us = g_get_monotonic_time() - devc->req_sent_at;
1218                         if (elapsed_us > (1 * 1000 * 1000)) /* Timeout! */
1219                                 devc->response_pending = FALSE;
1220                 }
1221                 if (!devc->response_pending) {
1222                         devc->cmd_seq++;
1223                         if (devc->cmd_seq % 10 == 0) {
1224                                 if (req_stat14(sdi, FALSE) != SR_OK)
1225                                         return FALSE;
1226                         }
1227                         else if (req_meas14(sdi) != SR_OK)
1228                                 return FALSE;
1229                 }
1230         }
1231
1232         return TRUE;
1233 }
1234
1235 /**
1236  * Create 14 (42) byte command for Metrahit 2x multimeter in bidir mode.
1237  *
1238  * Actually creates 42 bytes due to the encoding method used.
1239  *
1240  * @param[in] addr Device address (0=adapter, 1..15 multimeter; for byte 0).
1241  * @param[in] func Function code (byte 3).
1242  * @param[in] params Further parameters (9 bytes)
1243  * @param[out] buf Buffer to create msg in (42 bytes).
1244  */
1245 static void create_cmd_14(guchar addr, guchar func, guchar *params, guchar *buf)
1246 {
1247         uint8_t dta[GMC_REPLY_SIZE];    /* Unencoded message */
1248         int cnt;
1249
1250         if (!params || !buf)
1251                 return;
1252
1253         /* 0: Address */
1254         dta[0] = ((addr << 2) | 0x03) & MASK_6BITS;
1255
1256         /* 1-3: Set command header */
1257         dta[1] = 0x2b;
1258         dta[2] = 0x3f;
1259         dta[3] = func;
1260
1261         /* 4-12: Copy further parameters */
1262         for (cnt = 0; cnt < 9; cnt++)
1263                 dta[cnt + 4] = (params[cnt] & MASK_6BITS);
1264
1265         /* 13: Checksum (b complement) */
1266         dta[13] = calc_chksum_14(dta);
1267
1268         /* The whole message is packed into 3 bytes per byte now (lower 6 bits only) the most
1269          * peculiar way I have ever seen. Possibly to improve IR communication? */
1270         for (cnt = 0; cnt < GMC_REPLY_SIZE; cnt++) {
1271                 buf[(3 * cnt) + 0] = (dta[cnt] & 0x01 ? 0x0f : 0) | (dta[cnt] & 0x02 ? 0xf0 : 0);
1272                 buf[(3 * cnt) + 1] = (dta[cnt] & 0x04 ? 0x0f : 0) | (dta[cnt] & 0x08 ? 0xf0 : 0);
1273                 buf[(3 * cnt) + 2] = (dta[cnt] & 0x10 ? 0x0f : 0) | (dta[cnt] & 0x20 ? 0xf0 : 0);
1274         }
1275 }
1276
1277 /** Request one measurement from 2x multimeter (msg 8). */
1278 int req_meas14(const struct sr_dev_inst *sdi)
1279 {
1280         struct dev_context *devc;
1281         struct sr_serial_dev_inst *serial;
1282         uint8_t params[9];
1283         uint8_t msg[42];
1284
1285         if (!sdi || !(devc = sdi->priv) || !(serial = sdi->conn))
1286                 return SR_ERR;
1287
1288         memset(params, 0, sizeof(params));
1289         params[0] = 0;
1290         devc->cmd_idx = 0;
1291         create_cmd_14(devc->addr, 8, params, msg);
1292         devc->req_sent_at = g_get_monotonic_time();
1293         if (serial_write_blocking(serial, msg, sizeof(msg),
1294                         serial_timeout(serial, sizeof(msg))) < (int)sizeof(msg)) {
1295                 return SR_ERR;
1296         }
1297
1298         devc->response_pending = TRUE;
1299
1300         return SR_OK;
1301 }
1302
1303 /**
1304  * Request status from 2x multimeter (msg 3).
1305  *
1306  * @param[in] power_on Try to power on powered off multimeter by sending
1307  *                     additional messages.
1308  */
1309 int req_stat14(const struct sr_dev_inst *sdi, gboolean power_on)
1310 {
1311         struct dev_context *devc;
1312         struct sr_serial_dev_inst *serial;
1313         uint8_t params[9];
1314         uint8_t msg[42];
1315
1316         if (!sdi || !(devc = sdi->priv) || !(serial = sdi->conn))
1317                 return SR_ERR;
1318
1319         memset(params, 0, sizeof(params));
1320         params[0] = 0;
1321         devc->cmd_idx = 0;
1322         create_cmd_14(devc->addr, 3, params, msg);
1323
1324         if (power_on) {
1325                 sr_info("Write some data and wait 3s to turn on powered off device...");
1326                 if (serial_write_blocking(serial, msg, sizeof(msg),
1327                                 serial_timeout(serial, sizeof(msg))) < 0)
1328                         return SR_ERR;
1329                 g_usleep(1 * 1000 * 1000);
1330                 if (serial_write_blocking(serial, msg, sizeof(msg),
1331                                 serial_timeout(serial, sizeof(msg))) < 0)
1332                         return SR_ERR;
1333                 g_usleep(1 * 1000 * 1000);
1334                 if (serial_write_blocking(serial, msg, sizeof(msg),
1335                                 serial_timeout(serial, sizeof(msg))) < 0)
1336                         return SR_ERR;
1337                 g_usleep(1 * 1000 * 1000);
1338                 serial_flush(serial);
1339         }
1340
1341         /* Write message and wait for reply */
1342         devc->req_sent_at = g_get_monotonic_time();
1343         if (serial_write_blocking(serial, msg, sizeof(msg),
1344                         serial_timeout(serial, sizeof(msg))) < (int)sizeof(msg)) {
1345                 return SR_ERR;
1346         }
1347
1348         devc->response_pending = TRUE;
1349
1350         return SR_OK;
1351 }
1352
1353 /**
1354  * Decode model in "send mode".
1355  *
1356  * @param[in] mcode Model code.
1357  * @return Model code.
1358  */
1359 SR_PRIV int gmc_decode_model_sm(uint8_t mcode)
1360 {
1361         if (mcode > 0xf) {
1362                 sr_err("decode_model(%d): Model code 0..15 expected!", mcode);
1363                 return METRAHIT_NONE;
1364         }
1365
1366         switch (mcode) {
1367         case 0x04: /* 0100b */
1368                 return METRAHIT_12S;
1369         case 0x08: /* 1000b */
1370                 return METRAHIT_13S14A;
1371         case 0x09: /* 1001b */
1372                 return METRAHIT_14S;
1373         case 0x0A: /* 1010b */
1374                 return METRAHIT_15S;
1375         case 0x0B: /* 1011b */
1376                 return METRAHIT_16S;
1377         case 0x06: /* 0110b (undocumented by GMC!) */
1378                 return METRAHIT_16I;
1379         case 0x07: /* 0111b (undocumented by GMC!) */
1380                 return METRAHIT_16T;
1381         case 0x0D: /* 1101b */
1382                 return METRAHIT_18S;
1383         case 0x02: /* 0010b */
1384                 return METRAHIT_22SM;
1385         case 0x03: /* 0011b */
1386                 return METRAHIT_23S;
1387         case 0x0F: /* 1111b */
1388                 return METRAHIT_24S;
1389         case 0x05: /* 0101b */
1390                 return METRAHIT_25S;
1391         case 0x01: /* 0001b */
1392                 return METRAHIT_26SM;
1393         case 0x0C: /* 1100b */
1394                 return METRAHIT_28S;
1395         case 0x0E: /* 1110b */
1396                 return METRAHIT_29S;
1397         default:
1398                 sr_err("Unknown model code %d!", mcode);
1399                 return METRAHIT_NONE;
1400         }
1401 }
1402
1403 /**
1404  * Convert GMC model code in bidirectional mode to sigrok-internal one.
1405  *
1406  * @param[in] mcode Model code.
1407  *
1408  * @return Model code.
1409  */
1410 SR_PRIV int gmc_decode_model_bd(uint8_t mcode)
1411 {
1412         switch (mcode & 0x1f) {
1413         case 2:
1414                 return (mcode & 0x20) ? METRAHIT_22M : METRAHIT_22S;
1415         case 3:
1416                 return METRAHIT_23S;
1417         case 4:
1418                 return METRAHIT_24S;
1419         case 5:
1420                 return METRAHIT_25S;
1421         case 1:
1422                 return (mcode & 0x20) ? METRAHIT_26M : METRAHIT_26S;
1423         case 12:
1424                 return METRAHIT_28S;
1425         case 14:
1426                 return METRAHIT_29S;
1427         default:
1428                 sr_err("Unknown model code %d!", mcode);
1429                 return METRAHIT_NONE;
1430         }
1431 }
1432
1433 /**
1434  * Convert sigrok-internal model code to string.
1435  *
1436  * @param[in] mcode Model code.
1437  *
1438  * @return Model code string.
1439  */
1440 SR_PRIV const char *gmc_model_str(enum model mcode)
1441 {
1442         switch (mcode) {
1443         case METRAHIT_NONE:
1444                 return "-uninitialized model variable-";
1445         case METRAHIT_12S:
1446                 return "METRAHit 12S";
1447         case METRAHIT_13S14A:
1448                 return "METRAHit 13S/14A";
1449         case METRAHIT_14S:
1450                 return "METRAHit 14S";
1451         case METRAHIT_15S:
1452                 return "METRAHit 15S";
1453         case METRAHIT_16S:
1454                 return "METRAHit 16S";
1455         case METRAHIT_16I:
1456                 return "METRAHit 16I/16L";
1457         case METRAHIT_16T:
1458                 return "METRAHit 16T/16U/KMM2002";
1459         case METRAHIT_18S:
1460                 return "METRAHit 18S";
1461         case METRAHIT_22SM:
1462                 return "METRAHit 22S/M";
1463         case METRAHIT_22S:
1464                 return "METRAHit 22S";
1465         case METRAHIT_22M:
1466                 return "METRAHit 22M";
1467         case METRAHIT_23S:
1468                 return "METRAHit 23S";
1469         case METRAHIT_24S:
1470                 return "METRAHit 24S";
1471         case METRAHIT_25S:
1472                 return "METRAHit 25S";
1473         case METRAHIT_26SM:
1474                 return "METRAHit 26S/M";
1475         case METRAHIT_26S:
1476                 return "METRAHit 26S";
1477         case METRAHIT_26M:
1478                 return "METRAHit 26M";
1479         case METRAHIT_28S:
1480                 return "METRAHit 28S";
1481         case METRAHIT_29S:
1482                 return "METRAHit 29S";
1483         default:
1484                 return "Unknown model code";
1485         }
1486 }
1487
1488 /** @copydoc sr_dev_driver.config_set */
1489 SR_PRIV int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
1490                 const struct sr_channel_group *cg)
1491 {
1492         struct dev_context *devc;
1493         uint8_t params[9];
1494         uint8_t msg[42];
1495
1496         (void)cg;
1497
1498         devc = sdi->priv;
1499
1500         switch (key) {
1501         case SR_CONF_POWER_OFF:
1502                 if (devc->model < METRAHIT_2X)
1503                         return SR_ERR_NA;
1504                 if (!g_variant_get_boolean(data))
1505                         return SR_ERR;
1506                 sr_info("Powering device off.");
1507
1508                 memset(params, 0, sizeof(params));
1509                 params[0] = 5;
1510                 params[1] = 5;
1511                 create_cmd_14(devc->addr, 6, params, msg);
1512                 if (serial_write_blocking(sdi->conn, msg, sizeof(msg),
1513                                 serial_timeout(sdi->conn, sizeof(msg))) < 0)
1514                         return SR_ERR;
1515                 else
1516                         g_usleep(2 * 1000 * 1000); /* Wait to ensure transfer before interface switched off. */
1517                 break;
1518         case SR_CONF_LIMIT_SAMPLES:
1519         case SR_CONF_LIMIT_MSEC:
1520                 return sr_sw_limits_config_set(&devc->limits, key, data);
1521         default:
1522                 return SR_ERR_NA;
1523         }
1524
1525         return SR_OK;
1526 }