2 * This file is part of the libsigrok project.
4 * Copyright (C) 2013 Matthias Heidbrink <m-sigrok@heidbrink.biz>
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.
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.
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/>.
21 * Gossen Metrawatt Metrahit 1x/2x drivers
29 /** Set or clear flags in devc->mqflags. */
30 static void setmqf(struct dev_context *devc, uint64_t flags, gboolean set)
33 devc->mqflags |= flags;
35 devc->mqflags &= ~flags;
38 /** Decode current type and measured value, Metrahit 12-16. */
39 static void decode_ctmv_16(uint8_t ctmv, struct dev_context *devc)
46 case 0x00: /* 0000 - */
48 case 0x01: /* 0001 mV DC */
49 devc->scale1000 = -1; /* Fall through */
50 case 0x02: /* 0010 V DC */
51 case 0x03: /* 0011 V AC+DC */
52 case 0x04: /* 0100 V AC */
53 devc->mq = SR_MQ_VOLTAGE;
54 devc->unit = SR_UNIT_VOLT;
56 devc->mqflags |= SR_MQFLAG_DC;
58 devc->mqflags |= SR_MQFLAG_AC;
59 if (devc->model >= METRAHIT_16S)
60 devc->mqflags |= SR_MQFLAG_RMS;
63 case 0x05: /* 0101 Hz (15S/16S only) */
64 case 0x06: /* 0110 kHz (15S/16S only) */
65 devc->mq = SR_MQ_FREQUENCY;
66 devc->unit = SR_UNIT_HERTZ;
70 case 0x07: /* 0111 % (15S/16S only) */
71 devc->mq = SR_MQ_DUTY_CYCLE;
72 devc->unit = SR_UNIT_PERCENTAGE;
74 case 0x08: /* 1000 Diode */
75 devc->mq = SR_MQ_VOLTAGE;
76 devc->unit = SR_UNIT_VOLT;
77 devc->mqflags |= SR_MQFLAG_DIODE;
79 case 0x09: /* 1001 Ohm, °C */
80 case 0x0a: /* 1010 kOhm */
81 case 0x0b: /* 1011 MOhm */
82 devc->mq = SR_MQ_RESISTANCE; /* Changed to temp. later if req.*/
83 devc->unit = SR_UNIT_OHM;
84 devc->scale1000 = ctmv - 0x09;
86 case 0x0c: /* 1100 nF (15S/16S only) */
87 case 0x0d: /* 1101 µF (15S/16S only) */
88 devc->mq = SR_MQ_CAPACITANCE;
89 devc->unit = SR_UNIT_FARAD;
95 case 0x0e: /* mA, µA */
96 devc->scale1000 = -1; /* Fall through. */
98 devc->mq = SR_MQ_CURRENT;
99 devc->unit = SR_UNIT_AMPERE;
100 if (devc->model == METRAHIT_16S)
101 devc->mqflags |= SR_MQFLAG_RMS;
102 /* 16I A only with clamp, RMS questionable. */
108 * Decode range/sign/acdc byte special chars (Metrahit 12-16).
110 * @param[in] rs Range and sign byte.
112 static void decode_rs_16(uint8_t rs, struct dev_context *devc)
114 sr_spew("decode_rs_16(%d) scale = %f", rs, devc->scale);
116 if (rs & 0x04) /* Sign */
119 if (devc->mq == SR_MQ_CURRENT) {
120 if (rs & 0x08) /* Current is AC */
121 devc->mqflags |= SR_MQFLAG_AC;
123 devc->mqflags |= SR_MQFLAG_DC;
128 if (devc->mq == SR_MQ_VOLTAGE) /* V */
130 else if (devc->mq == SR_MQ_CURRENT) /* 000.0 µA */
131 devc->scale *= 0.0000001; /* Untested! */
132 else if (devc->mq == SR_MQ_RESISTANCE) {
133 if (devc->buflen >= 10) {
134 /* °C with 10 byte msg type, otherwise GOhm. */
135 devc->mq = SR_MQ_TEMPERATURE;
136 devc->unit = SR_UNIT_CELSIUS;
138 } else if (devc->scale1000 == 2) {
139 /* 16I Iso 500/1000V 3 GOhm */
145 devc->scale *= 0.0001;
148 devc->scale *= 0.001;
157 * Decode special chars, Metrahit 12-16.
159 * @param[in] spc Special characters 1 and 2 (s1 | (s2 << 4)).
161 static void decode_spc_16(uint8_t spc, struct dev_context *devc)
164 /* TODO: What does that mean? Power on? The 16I sets this. */
166 /* xxxxxx1x Low battery */
169 setmqf(devc, SR_MQFLAG_MIN, spc & 0x80);
172 setmqf(devc, SR_MQFLAG_AUTORANGE, !(spc & 0x40));
175 setmqf(devc, SR_MQFLAG_HOLD, spc & 0x20);
178 setmqf(devc, SR_MQFLAG_MAX, spc & 0x10);
181 /** Decode current type and measured value, Metrahit 18. */
182 static void decode_ctmv_18(uint8_t ctmv, struct dev_context *devc)
189 case 0x00: /* 0000 - */
191 case 0x01: /* 0001 V AC */
192 case 0x02: /* 0010 V AC+DC */
193 case 0x03: /* 0011 V DC */
194 devc->mq = SR_MQ_VOLTAGE;
195 devc->unit = SR_UNIT_VOLT;
197 devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_RMS);
199 devc->mqflags |= SR_MQFLAG_DC;
201 case 0x04: /* 0100 Ohm/Ohm with buzzer */
202 devc->mq = SR_MQ_RESISTANCE;
203 devc->unit = SR_UNIT_OHM;
205 case 0x05: /* 0101 Diode/Diode with buzzer */
206 devc->mq = SR_MQ_VOLTAGE;
207 devc->unit = SR_UNIT_VOLT;
208 devc->mqflags |= SR_MQFLAG_DIODE;
210 case 0x06: /* 0110 °C */
211 devc->mq = SR_MQ_TEMPERATURE;
212 devc->unit = SR_UNIT_CELSIUS;
214 case 0x07: /* 0111 F */
215 devc->mq = SR_MQ_CAPACITANCE;
216 devc->unit = SR_UNIT_FARAD;
218 case 0x08: /* 1000 mA DC */
219 case 0x09: /* 1001 A DC */
220 case 0x0a: /* 1010 mA AC+DC */
221 case 0x0b: /* 1011 A AC+DC */
222 devc->mq = SR_MQ_CURRENT;
223 devc->unit = SR_UNIT_AMPERE;
224 devc->mqflags |= SR_MQFLAG_DC;
226 devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_RMS);
227 if ((ctmv == 0x08) || (ctmv == 0x0a))
228 devc->scale1000 = -1;
230 case 0x0c: /* 1100 Hz */
231 devc->mq = SR_MQ_FREQUENCY;
232 devc->unit = SR_UNIT_HERTZ;
234 case 0x0d: /* 1101 dB */
235 devc->mq = SR_MQ_VOLTAGE;
236 devc->unit = SR_UNIT_DECIBEL_VOLT;
237 devc->mqflags |= SR_MQFLAG_AC; /* dB available for AC only */
239 case 0x0e: /* 1110 Events AC, Events AC+DC. Actually delivers just
240 * current voltage via IR, nothing more. */
241 devc->mq = SR_MQ_VOLTAGE;
242 devc->unit = SR_UNIT_VOLT;
243 devc->mqflags |= SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS;
245 case 0x0f: /* 1111 Clock */
246 devc->mq = SR_MQ_TIME;
247 devc->unit = SR_UNIT_SECOND;
248 devc->mqflags |= SR_MQFLAG_DURATION;
254 * Decode range/sign/acdc byte special chars, Metrahit 18.
256 * @param[in] rs Rance/sign byte.
258 static void decode_rs_18(uint8_t rs, struct dev_context *devc)
263 if (((devc->scale > 0) && (rs & 0x08)) ||
264 ((devc->scale < 0) && !(rs & 0x08)))
271 if (devc->unit == SR_UNIT_DECIBEL_VOLT) {
272 devc->scale *= pow(10.0, -2);
274 * When entering relative mode, the device switches
275 * from 10 byte to 6 byte msg format. Unfortunately
276 * it switches back to 10 byte when the second value
277 * is measured, so that's not sufficient to
278 * identify relative mode.
281 else if (devc->vmains_29S)
282 devc->scale *= pow(10.0, range - 2);
284 devc->scale *= pow(10.0, range - 5);
287 if (devc->scale1000 == -1)
288 devc->scale *= pow(10.0, range - 5);
290 devc->scale *= pow(10.0, range - 4);
292 case SR_MQ_RESISTANCE:
293 devc->scale *= pow(10.0, range - 2);
295 case SR_MQ_FREQUENCY:
296 devc->scale *= pow(10.0, range - 3);
298 case SR_MQ_TEMPERATURE:
299 devc->scale *= pow(10.0, range - 2);
301 case SR_MQ_CAPACITANCE:
302 devc->scale *= pow(10.0, range - 14);
304 /* TODO: 29S Mains measurements. */
309 * Decode special chars, Metrahit 18.
311 * @param[in] spc Special characters 1 and 2 (s1 | (s2 << 4)).
313 static void decode_spc_18(uint8_t spc, struct dev_context *devc)
317 /* xxxxxx1x Low battery */
320 if (devc->mq == SR_MQ_TIME) {
321 /* xxx1xxxx Clock running: 1; stop: 0 */
322 sr_spew("Clock running: %d", spc >> 4);
325 setmqf(devc, SR_MQFLAG_AUTORANGE, !(spc & 0x80));
328 setmqf(devc, SR_MQFLAG_MIN, spc & 0x40);
331 setmqf(devc, SR_MQFLAG_MAX, spc & 0x20);
334 setmqf(devc, SR_MQFLAG_HOLD, spc & 0x10);
339 * Decode current type and measured value, Metrahit 2x.
341 * @param[in] ctmv Current type and measured value (v1 | (v2 << 4)).
343 static void decode_ctmv_2x(uint8_t ctmv, struct dev_context *devc)
345 if ((ctmv > 0x1c) || (!devc)) {
346 sr_err("decode_ctmv_2x(%d): invalid param(s)!", ctmv);
356 case 0x01: /* 00001 V DC */
357 case 0x02: /* 00010 V AC+DC */
358 case 0x03: /* 00011 V AC */
359 devc->mq = SR_MQ_VOLTAGE;
360 devc->unit = SR_UNIT_VOLT;
362 devc->mqflags |= SR_MQFLAG_DC;
364 devc->mqflags |= SR_MQFLAG_AC;
365 if (devc->model >= METRAHIT_24S)
366 devc->mqflags |= SR_MQFLAG_RMS;
369 case 0x04: /* 00100 mA DC */
370 case 0x05: /* 00101 mA AC+DC */
371 devc->scale1000 = -1;
372 case 0x06: /* 00110 A DC */
373 case 0x07: /* 00111 A AC+DC */
374 devc->mq = SR_MQ_CURRENT;
375 devc->unit = SR_UNIT_AMPERE;
376 devc->mqflags |= SR_MQFLAG_DC;
377 if ((ctmv == 0x05) || (ctmv == 0x07)) {
378 devc->mqflags |= SR_MQFLAG_AC;
379 if (devc->model >= METRAHIT_24S)
380 devc->mqflags |= SR_MQFLAG_RMS;
383 case 0x08: /* 01000 Ohm */
384 devc->mq = SR_MQ_RESISTANCE;
385 devc->unit = SR_UNIT_OHM;
387 case 0x09: /* 01001 F */
388 devc->mq = SR_MQ_CAPACITANCE;
389 devc->unit = SR_UNIT_FARAD;
392 case 0x0a: /* 01010 dBV */
393 devc->mq = SR_MQ_VOLTAGE;
394 devc->unit = SR_UNIT_DECIBEL_VOLT;
395 devc->mqflags |= SR_MQFLAG_AC;
396 if (devc->model >= METRAHIT_24S)
397 devc->mqflags |= SR_MQFLAG_RMS;
399 case 0x0b: /* 01011 Hz U ACDC */
400 case 0x0c: /* 01100 Hz U AC */
401 devc->mq = SR_MQ_FREQUENCY;
402 devc->unit = SR_UNIT_HERTZ;
403 devc->mqflags |= SR_MQFLAG_AC;
405 devc->mqflags |= SR_MQFLAG_DC;
407 case 0x0d: /* 01101 W on power, mA range (29S only) */
408 devc->scale *= 0.001;
410 case 0x0e: /* 01110 W on power, A range (29S only) */
411 devc->mq = SR_MQ_POWER;
412 devc->unit = SR_UNIT_WATT;
414 case 0x0f: /* 01111 Diode */
415 case 0x10: /* 10000 Diode with buzzer (actually cont. with voltage) */
416 devc->unit = SR_UNIT_VOLT;
418 devc->mq = SR_MQ_VOLTAGE;
419 devc->mqflags |= SR_MQFLAG_DIODE;
421 devc->mq = SR_MQ_CONTINUITY;
422 devc->scale *= 0.00001;
424 devc->unit = SR_UNIT_VOLT;
426 case 0x11: /* 10001 Ohm with buzzer */
427 devc->mq = SR_MQ_CONTINUITY;
428 devc->unit = SR_UNIT_OHM;
429 devc->scale1000 = -1;
431 case 0x12: /* 10010 Temperature */
432 devc->mq = SR_MQ_TEMPERATURE;
433 devc->unit = SR_UNIT_CELSIUS;
434 /* This can be Fahrenheit. That is detected by range=4 later. */
436 /* 0x13 10011, 0x14 10100 unsed */
437 case 0x15: /* 10101 Press (29S only) */
438 /* TODO: What does that mean? Possibly phase shift?
439 Then we need a unit/flag for it. */
440 devc->mq = SR_MQ_GAIN;
441 devc->unit = SR_UNIT_PERCENTAGE;
443 case 0x16: /* 10110 Pulse W (29S only) */
444 /* TODO: Own unit and flag for this! */
445 devc->mq = SR_MQ_POWER;
446 devc->unit = SR_UNIT_WATT;
448 case 0x17: /* 10111 TRMS V on mains (29S only) */
449 devc->mq = SR_MQ_VOLTAGE;
450 devc->unit = SR_UNIT_VOLT;
451 devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_RMS);
452 devc->vmains_29S = TRUE;
454 case 0x18: /* 11000 Counter (zero crossings of a signal) */
455 devc->mq = SR_MQ_VOLTAGE;
456 devc->unit = SR_UNIT_UNITLESS;
458 case 0x19: /* 11001 Events U ACDC */
459 case 0x1a: /* 11010 Events U AC */
460 /* TODO: No unit or flags for this yet! */
461 devc->mq = SR_MQ_VOLTAGE;
462 devc->unit = SR_UNIT_UNITLESS;
463 devc->mqflags |= SR_MQFLAG_AC;
465 devc->mqflags |= SR_MQFLAG_DC;
467 case 0x1b: /* 11011 pulse 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;
473 case 0x1c: /* 11100 dropout on mains (29S only) */
474 /* TODO: No unit or flags for this yet! */
475 devc->mq = SR_MQ_VOLTAGE;
476 devc->unit = SR_UNIT_UNITLESS;
477 devc->mqflags |= SR_MQFLAG_AC;
480 sr_err("decode_ctmv_2x(%d, ...): Unknown ctmv!");
486 * Decode range/sign/acdc byte special chars, Metrahit 2x, table TR.
488 * @param[in] rs Range/sign byte.
490 static void decode_rs_2x(uint8_t rs, struct dev_context *devc)
495 if (((devc->scale > 0) && (rs & 0x08)) ||
496 ((devc->scale < 0) && !(rs & 0x08)))
503 if (devc->unit == SR_UNIT_DECIBEL_VOLT)
504 devc->scale *= pow(10.0, -3);
505 else if (devc->vmains_29S)
506 devc->scale *= pow(10.0, range - 2);
508 devc->scale *= pow(10.0, range - 6);
511 if (devc->scale1000 != -1) /* uA, mA */
512 range += 1;/* mA and A ranges differ by 10^4, not 10^3!*/
513 devc->scale *= pow(10.0, range - 6);
515 case SR_MQ_RESISTANCE:
516 devc->scale *= pow(10.0, range - 3);
518 case SR_MQ_FREQUENCY:
519 devc->scale *= pow(10.0, range - 3);
521 case SR_MQ_TEMPERATURE:
522 if (range == 4) /* Indicator for °F */
523 devc->unit = SR_UNIT_FAHRENHEIT;
524 devc->scale *= pow(10.0, - 2);
526 case SR_MQ_CAPACITANCE:
528 range -= 1; /* Same value as range 6 */
529 devc->scale *= pow(10.0, range - 13);
531 /* TODO: 29S Mains measurements. */
536 * Decode special chars (Metrahit 2x).
538 * @param[in] spc Special characters 1 and 2 (s1 | (s2 << 4)).
540 static void decode_spc_2x(uint8_t spc, struct dev_context *devc)
544 /* xxxxxx1x Low battery */
551 setmqf(devc, SR_MQFLAG_HOLD, spc & 0x10);
553 /* x11xxxxx unused */
555 setmqf(devc, SR_MQFLAG_AUTORANGE, !(spc & 0x80));
558 /** Clean range and sign. */
559 static void clean_rs_v(struct dev_context *devc)
565 /** Clean current type, measured variable, range and sign. */
566 static void clean_ctmv_rs_v(struct dev_context *devc)
572 devc->vmains_29S = FALSE;
576 /** Send prepared value. */
577 static void send_value(struct sr_dev_inst *sdi)
579 struct dev_context *devc;
580 struct sr_datafeed_analog analog;
581 struct sr_datafeed_packet packet;
585 memset(&analog, 0, sizeof(analog));
586 analog.probes = sdi->probes;
587 analog.num_samples = 1;
588 analog.mq = devc->mq;
589 analog.unit = devc->unit;
590 analog.mqflags = devc->mqflags;
591 analog.data = &devc->value;
593 memset(&packet, 0, sizeof(packet));
594 packet.type = SR_DF_ANALOG;
595 packet.payload = &analog;
596 sr_session_send(devc->cb_data, &packet);
601 /** Process 6-byte data message, Metrahit 1x/2x send mode. */
602 static void process_msg_dta_6(struct sr_dev_inst *sdi)
604 struct dev_context *devc;
611 /* Byte 0, range and sign */
612 if (devc->model <= METRAHIT_16X)
613 decode_rs_16(bc(devc->buf[0]), devc);
614 else if (devc->model < METRAHIT_2X)
615 decode_rs_18(bc(devc->buf[0]), devc);
617 decode_rs_2x(bc(devc->buf[0]), devc);
618 devc->scale *= 10; /* Compensate for format having only 5 digits, decode_rs_2x() assumes 6. */
621 /* Bytes 1-5, digits (ls first). */
622 for (cnt = 0; cnt < 5; cnt++) {
623 dgt = bc(devc->buf[1 + cnt]);
625 /* 10 Overload; on model <= 16X also 11 possible. */
630 devc->value += pow(10.0, cnt) * dgt;
633 sr_spew("process_msg_dta_6() value=%f scale=%f scale1000=%d",
634 devc->value, devc->scale, devc->scale1000);
635 if (devc->value != NAN)
636 devc->value *= devc->scale * pow(1000.0, devc->scale1000);
638 /* Create and send packet. */
642 /** Process 5-byte info message, Metrahit 1x/2x. */
643 static void process_msg_inf_5(struct sr_dev_inst *sdi)
645 struct dev_context *devc;
650 clean_ctmv_rs_v(devc);
653 model = gmc_decode_model_sm(bc(devc->buf[0]));
654 if (model != devc->model) {
655 sr_warn("Model mismatch in data: Detected %s, now %s",
656 gmc_model_str(devc->model), gmc_model_str(model));
659 /* Process bytes 1-4 */
660 if (devc->model <= METRAHIT_16X) {
661 decode_ctmv_16(bc(devc->buf[1]), devc);
662 decode_spc_16(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
663 decode_rs_16(bc(devc->buf[4]), devc);
664 } else if (devc->model <= METRAHIT_18S) {
665 decode_ctmv_18(bc(devc->buf[1]), devc);
666 decode_spc_18(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
667 decode_rs_18(bc(devc->buf[4]), devc);
668 } else { /* Must be Metrahit 2x */
669 decode_ctmv_2x(bc(devc->buf[1]), devc);
670 decode_spc_2x(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
671 decode_rs_2x(bc(devc->buf[4]), devc);
675 /** Process 10-byte info/data message, Metrahit 15+. */
676 static void process_msg_inf_10(struct sr_dev_inst *sdi)
678 struct dev_context *devc;
684 process_msg_inf_5(sdi);
686 /* Now decode numbers */
687 for (cnt = 0; cnt < 5; cnt++) {
688 dgt = bc(devc->buf[5 + cnt]);
689 if (dgt == 11) { /* Empty digit */
692 else if (dgt >= 12) { /* Overload */
697 devc->value += pow(10.0, cnt) * dgt;
699 sr_spew("process_msg_inf_10() value=%f scale=%f scalet=%d",
700 devc->value, devc->scale, devc->scale1000);
702 if (devc->value != NAN)
703 devc->value *= devc->scale * pow(1000.0, devc->scale1000);
705 /* Create and send packet. */
709 /** Decode send interval (Metrahit 2x only). */
710 static const char *decode_send_interval(uint8_t si)
746 return "Unknown value";
750 /** Process 13-byte info/data message, Metrahit 2x. */
751 static void process_msg_inf_13(struct sr_dev_inst *sdi)
753 struct dev_context *devc;
760 clean_ctmv_rs_v(devc);
763 model = gmc_decode_model_sm(bc(devc->buf[0]));
764 if (model != devc->model) {
765 sr_warn("Model mismatch in data: Detected %s, now %s",
766 gmc_model_str(devc->model), gmc_model_str(model));
770 decode_ctmv_2x(bc(devc->buf[1]) | (bc(devc->buf[11]) << 4), devc);
771 decode_spc_2x(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
772 decode_rs_2x(bc(devc->buf[4]), devc);
774 /* Bytes 5-10, digits (ls first). */
775 for (cnt = 0; cnt < 6; cnt++) {
776 dgt = bc(devc->buf[5 + cnt]);
777 if (dgt == 10) { /* Overload */
782 devc->value += pow(10.0, cnt) * dgt;
784 sr_spew("process_msg_inf_13() value=%f scale=%f scale1000=%d mq=%d "
785 "unit=%d mqflags=0x%02llx", devc->value, devc->scale,
786 devc->scale1000, devc->mq, devc->unit, devc->mqflags);
787 if (devc->value != NAN)
788 devc->value *= devc->scale * pow(1000.0, devc->scale1000);
790 /* Byte 12, Send Interval */
791 sr_spew("Send interval: %s", decode_send_interval(bc(devc->buf[12])));
793 /* Create and send packet. */
797 SR_PRIV int gmc_mh_1x_2x_receive_data(int fd, int revents, void *cb_data)
799 struct sr_dev_inst *sdi;
800 struct dev_context *devc;
801 struct sr_serial_dev_inst *serial;
808 if (!(sdi = cb_data))
811 if (!(devc = sdi->priv))
816 if (revents == G_IO_IN) { /* Serial data arrived. */
817 while (GMC_BUFSIZE - devc->buflen - 1 > 0) {
818 len = serial_read(serial, devc->buf + devc->buflen, 1);
821 buf = *(devc->buf + devc->buflen);
822 sr_spew("read 0x%02x/%d/%d", buf, buf, buf & MSGC_MASK);
824 if (!devc->settings_ok) {
826 * If no device type/settings record processed
829 if ((devc->buf[0] & MSGID_MASK) != MSGID_INF) {
833 devc->settings_ok = TRUE;
836 msgt = devc->buf[0] & MSGID_MASK;
839 if (devc->buflen == 13) {
840 process_msg_inf_13(sdi);
843 } else if ((devc->buflen == 10) &&
844 (devc->model <= METRAHIT_18S)) {
845 process_msg_inf_10(sdi);
849 else if ((devc->buflen >= 5) &&
850 (devc->buf[devc->buflen - 1] &
851 MSGID_MASK) != MSGID_DATA) {
853 * Char just received is beginning
856 process_msg_inf_5(sdi);
858 devc->buf[devc->buflen - 1];
865 if (devc->buflen == 6) {
866 process_msg_dta_6(sdi);
871 sr_err("Comm error, unexpected data byte!");
878 /* If number of samples or time limit reached, stop aquisition. */
879 if (devc->limit_samples && (devc->num_samples >= devc->limit_samples))
880 sdi->driver->dev_acquisition_stop(sdi, cb_data);
882 if (devc->limit_msec) {
883 elapsed_s = g_timer_elapsed(devc->elapsed_msec, NULL);
884 if ((elapsed_s * 1000) >= devc->limit_msec)
885 sdi->driver->dev_acquisition_stop(sdi, cb_data);
891 /** Decode model in "send mode". */
892 SR_PRIV int gmc_decode_model_sm(uint8_t mcode)
895 sr_err("decode_model(%d): Model code 0..15 expected!", mcode);
896 return METRAHIT_NONE;
900 case 0x04: /* 0100b */
902 case 0x08: /* 1000b */
903 return METRAHIT_13S14A;
904 case 0x09: /* 1001b */
906 case 0x0A: /* 1010b */
908 case 0x0B: /* 1011b */
910 case 0x06: /* 0110b (undocumented by GMC!) */
912 case 0x0D: /* 1101b */
914 case 0x02: /* 0010b */
915 return METRAHIT_22SM;
916 case 0x03: /* 0011b */
918 case 0x0f: /* 1111b */
920 case 0x05: /* 0101b */
922 case 0x01: /* 0001b */
923 return METRAHIT_26SM;
924 case 0x0c: /* 1100b */
926 case 0x0e: /* 1110b */
929 sr_err("Unknown model code %d!", mcode);
930 return METRAHIT_NONE;
934 /** Convert GMC model code in bidirectional mode to sigrok-internal one.
936 * @param[in] mcode Model code.
938 * @return Model code.
940 SR_PRIV int gmc_decode_model_bd(uint8_t mcode)
942 switch (mcode & 0x1f) {
944 return METRAHIT_22SM;
952 return METRAHIT_26SM;
958 sr_err("Unknown model code %d!", mcode);
959 return METRAHIT_NONE;
963 /** Convert sigrok-internal model code to string.
965 * @param[in] mcode Model code.
967 * @return Model code string.
969 SR_PRIV const char *gmc_model_str(enum model mcode)
973 return "-uninitialized model variable-";
975 return "METRAHit 12S";
976 case METRAHIT_13S14A:
977 return "METRAHit 13S/14A";
979 return "METRAHit 14S";
981 return "METRAHit 15S";
983 return "METRAHit 16S";
985 return "METRAHit 16I";
987 return "METRAHit 18S";
989 return "METRAHit 22S/M";
991 return "METRAHit 23S";
993 return "METRAHit 24S";
995 return "METRAHit 25S";
997 return "METRAHit 26S/M";
999 return "METRAHit 28S";
1001 return "METRAHit 29S";
1003 return "Unknown model code";