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/>.
24 /** Set or clear flags in devc->mqflags. */
25 static void setmqf(struct dev_context *devc, uint64_t flags, gboolean set)
28 devc->mqflags |= flags;
30 devc->mqflags &= ~flags;
33 /** Decode current type and measured value, Metrahit 12-16. */
34 static void decode_ctmv_16(uint8_t ctmv, struct dev_context *devc)
41 case 0x00: /* 0000 - */
43 case 0x01: /* 0001 mV DC */
44 devc->scale1000 = -1; /* Fall through */
45 case 0x02: /* 0010 V DC */
46 case 0x03: /* 0011 V AC+DC */
47 case 0x04: /* 0100 V AC */
48 devc->mq = SR_MQ_VOLTAGE;
49 devc->unit = SR_UNIT_VOLT;
51 devc->mqflags |= SR_MQFLAG_DC;
53 devc->mqflags |= SR_MQFLAG_AC;
54 if (devc->model >= METRAHIT_16S)
55 devc->mqflags |= SR_MQFLAG_RMS;
58 case 0x05: /* 0101 Hz (15S/16S only) */
59 case 0x06: /* 0110 kHz (15S/16S only) */
60 devc->mq = SR_MQ_FREQUENCY;
61 devc->unit = SR_UNIT_HERTZ;
65 case 0x07: /* 0111 % (15S/16S only) */
66 devc->mq = SR_MQ_DUTY_CYCLE;
67 devc->unit = SR_UNIT_PERCENTAGE;
69 case 0x08: /* 1000 Diode */
70 devc->mq = SR_MQ_VOLTAGE;
71 devc->unit = SR_UNIT_VOLT;
72 devc->mqflags |= SR_MQFLAG_DIODE;
74 case 0x09: /* 1001 Ohm, °C */
75 case 0x0a: /* 1010 kOhm */
76 case 0x0b: /* 1011 MOhm */
77 devc->mq = SR_MQ_RESISTANCE; /* Changed to temp. later if req.*/
78 devc->unit = SR_UNIT_OHM;
79 devc->scale1000 = ctmv - 0x09;
81 case 0x0c: /* 1100 nF (15S/16S only) */
82 case 0x0d: /* 1101 µF (15S/16S only) */
83 devc->mq = SR_MQ_CAPACITANCE;
84 devc->unit = SR_UNIT_FARAD;
90 case 0x0e: /* mA, µA */
91 devc->scale1000 = -1; /* Fall through. */
93 devc->mq = SR_MQ_CURRENT;
94 devc->unit = SR_UNIT_AMPERE;
95 if (devc->model == METRAHIT_16S)
96 devc->mqflags |= SR_MQFLAG_RMS;
97 /* 16I A only with clamp, RMS questionable. */
103 * Decode range/sign/acdc byte special chars (Metrahit 12-16).
105 * @param[in] rs Range and sign byte.
107 static void decode_rs_16(uint8_t rs, struct dev_context *devc)
109 sr_spew("decode_rs_16(%d) scale = %f", rs, devc->scale);
111 if (rs & 0x04) /* Sign */
114 if (devc->mq == SR_MQ_CURRENT) {
115 if (rs & 0x08) /* Current is AC */
116 devc->mqflags |= SR_MQFLAG_AC;
118 devc->mqflags |= SR_MQFLAG_DC;
123 if (devc->mq == SR_MQ_VOLTAGE) /* V */
125 else if (devc->mq == SR_MQ_CURRENT) /* 000.0 µA */
126 devc->scale *= 0.0000001; /* Untested! */
127 else if (devc->mq == SR_MQ_RESISTANCE) {
128 if (devc->buflen >= 10) {
129 /* °C with 10 byte msg type, otherwise GOhm. */
130 devc->mq = SR_MQ_TEMPERATURE;
131 devc->unit = SR_UNIT_CELSIUS;
133 } else if (devc->scale1000 == 2) {
134 /* 16I Iso 500/1000V 3 GOhm */
140 devc->scale *= 0.0001;
143 devc->scale *= 0.001;
152 * Decode special chars, Metrahit 12-16.
154 * @param[in] spc Special characters 1 and 2 (s1 | (s2 << 4)).
156 static void decode_spc_16(uint8_t spc, struct dev_context *devc)
159 /* TODO: What does that mean? Power on? The 16I sets this. */
161 /* xxxxxx1x Low battery */
164 setmqf(devc, SR_MQFLAG_MIN, spc & 0x80);
167 setmqf(devc, SR_MQFLAG_AUTORANGE, !(spc & 0x40));
170 setmqf(devc, SR_MQFLAG_HOLD, spc & 0x20);
173 setmqf(devc, SR_MQFLAG_MAX, spc & 0x10);
176 /** Decode current type and measured value, Metrahit 18. */
177 static void decode_ctmv_18(uint8_t ctmv, struct dev_context *devc)
184 case 0x00: /* 0000 - */
186 case 0x01: /* 0001 V AC */
187 case 0x02: /* 0010 V AC+DC */
188 case 0x03: /* 0011 V DC */
189 devc->mq = SR_MQ_VOLTAGE;
190 devc->unit = SR_UNIT_VOLT;
192 devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_RMS);
194 devc->mqflags |= SR_MQFLAG_DC;
196 case 0x04: /* 0100 Ohm/Ohm with buzzer */
197 devc->mq = SR_MQ_RESISTANCE;
198 devc->unit = SR_UNIT_OHM;
200 case 0x05: /* 0101 Diode/Diode with buzzer */
201 devc->mq = SR_MQ_VOLTAGE;
202 devc->unit = SR_UNIT_VOLT;
203 devc->mqflags |= SR_MQFLAG_DIODE;
205 case 0x06: /* 0110 °C */
206 devc->mq = SR_MQ_TEMPERATURE;
207 devc->unit = SR_UNIT_CELSIUS;
209 case 0x07: /* 0111 F */
210 devc->mq = SR_MQ_CAPACITANCE;
211 devc->unit = SR_UNIT_FARAD;
213 case 0x08: /* 1000 mA DC */
214 case 0x09: /* 1001 A DC */
215 case 0x0a: /* 1010 mA AC+DC */
216 case 0x0b: /* 1011 A AC+DC */
217 devc->mq = SR_MQ_CURRENT;
218 devc->unit = SR_UNIT_AMPERE;
219 devc->mqflags |= SR_MQFLAG_DC;
221 devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_RMS);
222 if ((ctmv == 0x08) || (ctmv == 0x0a))
223 devc->scale1000 = -1;
225 case 0x0c: /* 1100 Hz */
226 devc->mq = SR_MQ_FREQUENCY;
227 devc->unit = SR_UNIT_HERTZ;
229 case 0x0d: /* 1101 dB */
230 devc->mq = SR_MQ_VOLTAGE;
231 devc->unit = SR_UNIT_DECIBEL_VOLT;
232 devc->mqflags |= SR_MQFLAG_AC; /* dB available for AC only */
234 case 0x0e: /* 1110 Events AC, Events AC+DC. Actually delivers just
235 * current voltage via IR, nothing more. */
236 devc->mq = SR_MQ_VOLTAGE;
237 devc->unit = SR_UNIT_VOLT;
238 devc->mqflags |= SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS;
240 case 0x0f: /* 1111 Clock */
241 devc->mq = SR_MQ_TIME;
242 devc->unit = SR_UNIT_SECOND;
243 devc->mqflags |= SR_MQFLAG_DURATION;
249 * Decode range/sign/acdc byte special chars, Metrahit 18.
251 * @param[in] rs Rance/sign byte.
253 static void decode_rs_18(uint8_t rs, struct dev_context *devc)
258 if (((devc->scale > 0) && (rs & 0x08)) ||
259 ((devc->scale < 0) && !(rs & 0x08)))
266 if (devc->unit == SR_UNIT_DECIBEL_VOLT) {
267 devc->scale *= pow(10.0, -2);
269 * When entering relative mode, the device switches
270 * from 10 byte to 6 byte msg format. Unfortunately
271 * it switches back to 10 byte when the second value
272 * is measured, so that's not sufficient to
273 * identify relative mode.
276 else if (devc->vmains_29S)
277 devc->scale *= pow(10.0, range - 2);
279 devc->scale *= pow(10.0, range - 5);
282 if (devc->scale1000 == -1)
283 devc->scale *= pow(10.0, range - 5);
285 devc->scale *= pow(10.0, range - 4);
287 case SR_MQ_RESISTANCE:
288 devc->scale *= pow(10.0, range - 2);
290 case SR_MQ_FREQUENCY:
291 devc->scale *= pow(10.0, range - 3);
293 case SR_MQ_TEMPERATURE:
294 devc->scale *= pow(10.0, range - 2);
296 case SR_MQ_CAPACITANCE:
297 devc->scale *= pow(10.0, range - 14);
299 /* TODO: 29S Mains measurements. */
304 * Decode special chars, Metrahit 18.
306 * @param[in] spc Special characters 1 and 2 (s1 | (s2 << 4)).
308 static void decode_spc_18(uint8_t spc, struct dev_context *devc)
312 /* xxxxxx1x Low battery */
315 if (devc->mq == SR_MQ_TIME) {
316 /* xxx1xxxx Clock running: 1; stop: 0 */
317 sr_spew("Clock running: %d", spc >> 4);
320 setmqf(devc, SR_MQFLAG_AUTORANGE, !(spc & 0x80));
323 setmqf(devc, SR_MQFLAG_MIN, spc & 0x40);
326 setmqf(devc, SR_MQFLAG_MAX, spc & 0x20);
329 setmqf(devc, SR_MQFLAG_HOLD, spc & 0x10);
334 * Decode current type and measured value, Metrahit 2x.
336 * @param[in] ctmv Current type and measured value (v1 | (v2 << 4)).
338 static void decode_ctmv_2x(uint8_t ctmv, struct dev_context *devc)
340 if ((ctmv > 0x1c) || (!devc)) {
341 sr_err("decode_ctmv_2x(%d): invalid param(s)!", ctmv);
351 case 0x01: /* 00001 V DC */
352 case 0x02: /* 00010 V AC+DC */
353 case 0x03: /* 00011 V AC */
354 devc->mq = SR_MQ_VOLTAGE;
355 devc->unit = SR_UNIT_VOLT;
357 devc->mqflags |= SR_MQFLAG_DC;
359 devc->mqflags |= SR_MQFLAG_AC;
360 if (devc->model >= METRAHIT_24S)
361 devc->model |= SR_MQFLAG_RMS;
364 case 0x04: /* 00100 mA DC */
365 case 0x05: /* 00101 mA AC+DC */
366 devc->scale1000 = -1;
367 case 0x06: /* 00110 A DC */
368 case 0x07: /* 00111 A AC+DC */
369 devc->mq = SR_MQ_CURRENT;
370 devc->unit = SR_UNIT_AMPERE;
371 devc->mqflags |= SR_MQFLAG_DC;
372 if ((ctmv == 0x05) || (ctmv == 0x07)) {
373 devc->mqflags |= SR_MQFLAG_AC;
374 if (devc->model >= METRAHIT_24S)
375 devc->mqflags |= SR_MQFLAG_RMS;
378 case 0x08: /* 01000 Ohm */
379 devc->mq = SR_MQ_RESISTANCE;
380 devc->unit = SR_UNIT_OHM;
382 case 0x09: /* 01001 F */
383 devc->mq = SR_MQ_CAPACITANCE;
384 devc->unit = SR_UNIT_FARAD;
387 case 0x0a: /* 01010 dB */
388 devc->mq = SR_MQ_VOLTAGE;
389 devc->unit = SR_UNIT_DECIBEL_VOLT;
390 devc->mqflags |= SR_MQFLAG_AC;
392 case 0x0b: /* 01011 Hz U ACDC */
393 case 0x0c: /* 01100 Hz U AC */
394 devc->mq = SR_MQ_FREQUENCY;
395 devc->unit = SR_UNIT_HERTZ;
396 devc->mqflags |= SR_MQFLAG_AC;
398 devc->mqflags |= SR_MQFLAG_DC;
400 case 0x0d: /* 01101 W on power, mA range (29S only) */
401 case 0x0e: /* 01110 W on power, A range (29S only) */
402 /* TODO: Differences between Send Mode and bidir protocol here */
403 devc->mq = SR_MQ_POWER;
404 devc->unit = SR_UNIT_WATT;
406 case 0x0f: /* 01111 Diode */
407 case 0x10: /* 10000 Diode with buzzer (actually cont. with voltage) */
408 devc->unit = SR_UNIT_VOLT;
410 devc->mq = SR_MQ_VOLTAGE;
411 devc->mqflags |= SR_MQFLAG_DIODE;
414 devc->mq = SR_MQ_CONTINUITY;
415 devc->scale *= 0.00001;
417 devc->unit = SR_UNIT_VOLT;
419 case 0x11: /* 10001 Ohm with buzzer */
420 devc->mq = SR_MQ_CONTINUITY;
421 devc->unit = SR_UNIT_OHM;
422 devc->scale1000 = -1;
424 case 0x12: /* 10010 Temperature */
425 devc->mq = SR_MQ_TEMPERATURE;
426 devc->unit = SR_UNIT_CELSIUS;
427 /* This can be Fahrenheit. That is detected by range=4 later. */
429 /* 0x13 10011, 0x14 10100 unsed */
430 case 0x15: /* 10101 Press (29S only) */
431 /* TODO: What does that mean? Possibly phase shift?
432 Then we need a unit/flag for it. */
433 devc->mq = SR_MQ_GAIN;
434 devc->unit = SR_UNIT_PERCENTAGE;
436 case 0x16: /* 10110 Pulse W (29S only) */
437 /* TODO: Own unit and flag for this! */
438 devc->mq = SR_MQ_POWER;
439 devc->unit = SR_UNIT_WATT;
441 case 0x17: /* 10111 TRMS V on mains (29S only) */
442 devc->mq = SR_MQ_VOLTAGE;
443 devc->unit = SR_UNIT_VOLT;
444 devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_RMS);
445 devc->vmains_29S = TRUE;
447 case 0x18: /* 11000 Counter (zero crossings of a signal) */
448 devc->mq = SR_MQ_VOLTAGE;
449 devc->unit = SR_UNIT_UNITLESS;
451 case 0x19: /* 11001 Events U ACDC */
452 case 0x1a: /* 11010 Events U AC */
453 /* TODO: No unit or flags for this yet! */
454 devc->mq = SR_MQ_VOLTAGE;
455 devc->unit = SR_UNIT_UNITLESS;
456 devc->mqflags |= SR_MQFLAG_AC;
458 devc->mqflags |= SR_MQFLAG_DC;
460 case 0x1b: /* 11011 pulse on mains (29S only) */
461 /* TODO: No unit or flags for this yet! */
462 devc->mq = SR_MQ_VOLTAGE;
463 devc->unit = SR_UNIT_UNITLESS;
464 devc->mqflags |= SR_MQFLAG_AC;
466 case 0x1c: /* 11100 dropout on mains (29S only) */
467 /* TODO: No unit or flags for this yet! */
468 devc->mq = SR_MQ_VOLTAGE;
469 devc->unit = SR_UNIT_UNITLESS;
470 devc->mqflags |= SR_MQFLAG_AC;
473 sr_err("decode_ctmv_2x(%d, ...): Unknown ctmv!");
479 * Decode range/sign/acdc byte special chars, Metrahit 2x.
481 * @param[in] rs Rance/sign byte.
483 static void decode_rs_2x(uint8_t rs, struct dev_context *devc)
488 if (((devc->scale > 0) && (rs & 0x08)) ||
489 ((devc->scale < 0) && !(rs & 0x08)))
496 if (devc->unit == SR_UNIT_DECIBEL_VOLT)
497 devc->scale *= pow(10.0, -3);
498 else if (devc->vmains_29S)
499 devc->scale *= pow(10.0, range - 2);
500 else if(devc->mqflags & SR_MQFLAG_AC)
501 devc->scale *= pow(10.0, range - 6);
502 else /* "Undocumented feature": Between AC and DC
503 scaling differs by 1. */
504 devc->scale *= pow(10.0, range - 5);
507 if (devc->scale1000 == -1)
508 devc->scale *= pow(10.0, range - 5);
510 devc->scale *= pow(10.0, range - 4);
512 case SR_MQ_RESISTANCE:
513 devc->scale *= pow(10.0, range - 3);
515 case SR_MQ_FREQUENCY:
516 devc->scale *= pow(10.0, range - 3);
518 case SR_MQ_TEMPERATURE:
519 if (range == 4) /* Indicator for °F */
520 devc->unit = SR_UNIT_FAHRENHEIT;
521 devc->scale *= pow(10.0, - 2);
523 case SR_MQ_CAPACITANCE:
524 devc->scale *= pow(10.0, range - 13);
526 /* TODO: 29S Mains measurements. */
531 * Decode special chars (Metrahit 2x).
533 * @param[in] spc Special characters 1 and 2 (s1 | (s2 << 4)).
535 static void decode_spc_2x(uint8_t spc, struct dev_context *devc)
539 /* xxxxxx1x Low battery */
546 setmqf(devc, SR_MQFLAG_HOLD, spc & 0x10);
548 /* x11xxxxx unused */
550 setmqf(devc, SR_MQFLAG_AUTORANGE, !(spc & 0x80));
553 /** Clean range and sign. */
554 static void clean_rs_v(struct dev_context *devc)
560 /** Clean current type, measured variable, range and sign. */
561 static void clean_ctmv_rs_v(struct dev_context *devc)
567 devc->vmains_29S = FALSE;
571 /** Send prepared value. */
572 static void send_value(struct sr_dev_inst *sdi)
574 struct dev_context *devc;
575 struct sr_datafeed_analog analog;
576 struct sr_datafeed_packet packet;
580 memset(&analog, 0, sizeof(analog));
581 analog.probes = sdi->probes;
582 analog.num_samples = 1;
583 analog.mq = devc->mq;
584 analog.unit = devc->unit;
585 analog.mqflags = devc->mqflags;
586 analog.data = &devc->value;
588 memset(&packet, 0, sizeof(packet));
589 packet.type = SR_DF_ANALOG;
590 packet.payload = &analog;
591 sr_session_send(devc->cb_data, &packet);
596 /** Process 6-byte data message, Metrahit 1x/2x. */
597 static void process_msg_dta_6(struct sr_dev_inst *sdi)
599 struct dev_context *devc;
606 /* Byte 0, range and sign */
607 if (devc->model <= METRAHIT_16X)
608 decode_rs_16(bc(devc->buf[0]), devc);
609 else if (devc->model < METRAHIT_2X)
610 decode_rs_18(bc(devc->buf[0]), devc);
612 decode_rs_2x(bc(devc->buf[0]), devc);
614 /* Bytes 1-5, digits (ls first). */
615 for (cnt = 0; cnt < 5; cnt++) {
616 dgt = bc(devc->buf[1 + cnt]);
618 /* 10 Overload; on model <= 16X also 11 possible. */
623 devc->value += pow(10.0, cnt) * dgt;
625 sr_spew("process_msg_dta_6() value=%f scale=%f scalet=%d",
626 devc->value, devc->scale, devc->scale1000);
627 if (devc->value != NAN)
628 devc->value *= devc->scale * pow(1000.0, devc->scale1000);
630 /* Create and send packet. */
634 /** Process 5-byte info message, Metrahit 1x/2x. */
635 static void process_msg_inf_5(struct sr_dev_inst *sdi)
637 struct dev_context *devc;
642 clean_ctmv_rs_v(devc);
645 model = gmc_decode_model_sm(bc(devc->buf[0]));
646 if (model != devc->model) {
647 sr_warn("Model mismatch in data: Detected %s, now %s",
648 gmc_model_str(devc->model), gmc_model_str(model));
651 /* Process bytes 1-4 */
652 if (devc->model <= METRAHIT_16X) {
653 decode_ctmv_16(bc(devc->buf[1]), devc);
654 decode_spc_16(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
655 decode_rs_16(bc(devc->buf[4]), devc);
656 } else if (devc->model <= METRAHIT_18S) {
657 decode_ctmv_18(bc(devc->buf[1]), devc);
658 decode_spc_18(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
659 decode_rs_18(bc(devc->buf[4]), devc);
660 } else { /* Must be Metrahit 2x */
661 decode_ctmv_2x(bc(devc->buf[1]), devc);
662 decode_spc_2x(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
663 decode_rs_2x(bc(devc->buf[4]), devc);
667 /** Process 10-byte info/data message, Metrahit 15+. */
668 static void process_msg_inf_10(struct sr_dev_inst *sdi)
670 struct dev_context *devc;
676 process_msg_inf_5(sdi);
678 /* Now decode numbers */
679 for (cnt = 0; cnt < 5; cnt++) {
680 dgt = bc(devc->buf[5 + cnt]);
681 if (dgt >= 10) { /* Overload */
686 devc->value += pow(10.0, cnt) * dgt;
688 sr_spew("process_msg_inf_10() value=%f scale=%f scalet=%d",
689 devc->value, devc->scale, devc->scale1000);
691 if (devc->value != NAN)
692 devc->value *= devc->scale * pow(1000.0, devc->scale1000);
694 /* Create and send packet. */
698 /** Decode send interval (Metrahit 2x only). */
699 static const char *decode_send_interval(uint8_t si)
735 return "Unknown value";
739 /** Process 13-byte info/data message, Metrahit 2x. */
740 static void process_msg_inf_13(struct sr_dev_inst *sdi)
742 struct dev_context *devc;
749 clean_ctmv_rs_v(devc);
752 model = gmc_decode_model_sm(bc(devc->buf[0]));
753 if (model != devc->model) {
754 sr_warn("Model mismatch in data: Detected %s, now %s",
755 gmc_model_str(devc->model), gmc_model_str(model));
759 decode_ctmv_2x(bc(devc->buf[1]) | (bc(devc->buf[11]) << 4), devc);
760 decode_spc_2x(bc(devc->buf[2]) | (bc(devc->buf[3]) << 4), devc);
761 decode_rs_2x(bc(devc->buf[4]), devc);
763 /* Bytes 5-10, digits (ls first). */
764 for (cnt = 0; cnt < 6; cnt++) {
765 dgt = bc(devc->buf[5 + cnt]);
766 if (dgt == 10) { /* Overload */
771 devc->value += pow(10.0, cnt) * dgt;
773 sr_spew("process_msg_inf_13() value=%f scale=%f scale1000=%d mq=%d "
774 "unit=%d mqflags=0x%02llx", devc->value, devc->scale,
775 devc->scale1000, devc->mq, devc->unit, devc->mqflags);
776 if (devc->value != NAN)
777 devc->value *= devc->scale * pow(1000.0, devc->scale1000);
779 /* Byte 12, Send Interval */
780 sr_spew("Send interval: %s", decode_send_interval(bc(devc->buf[12])));
782 /* Create and send packet. */
786 SR_PRIV int gmc_mh_1x_2x_receive_data(int fd, int revents, void *cb_data)
788 struct sr_dev_inst *sdi;
789 struct dev_context *devc;
790 struct sr_serial_dev_inst *serial;
797 if (!(sdi = cb_data))
800 if (!(devc = sdi->priv))
805 if (revents == G_IO_IN) { /* Serial data arrived. */
806 while (GMC_BUFSIZE - devc->buflen - 1 > 0) {
807 len = serial_read(serial, devc->buf + devc->buflen, 1);
810 buf = *(devc->buf + devc->buflen);
811 sr_spew("read 0x%02x/%d/%d", buf, buf, buf & MSGC_MASK);
813 if (!devc->settings_ok) {
815 * If no device type/settings record processed
818 if ((devc->buf[0] & MSGID_MASK) != MSGID_INF) {
822 devc->settings_ok = TRUE;
825 msgt = devc->buf[0] & MSGID_MASK;
828 if (devc->buflen == 13) {
829 process_msg_inf_13(sdi);
832 } else if ((devc->buflen == 10) &&
833 (devc->model <= METRAHIT_18S)) {
834 process_msg_inf_10(sdi);
838 else if ((devc->buflen >= 5) &&
839 (devc->buf[devc->buflen - 1] &
840 MSGID_MASK) != MSGID_DATA) {
842 * Char just received is beginning
845 process_msg_inf_5(sdi);
847 devc->buf[devc->buflen - 1];
854 if (devc->buflen == 6) {
855 process_msg_dta_6(sdi);
860 sr_err("Comm error, unexpected data byte!");
867 /* If number of samples or time limit reached, stop aquisition. */
868 if (devc->limit_samples && (devc->num_samples >= devc->limit_samples))
869 sdi->driver->dev_acquisition_stop(sdi, cb_data);
871 if (devc->limit_msec) {
872 elapsed_s = g_timer_elapsed(devc->elapsed_msec, NULL);
873 if ((elapsed_s * 1000) >= devc->limit_msec)
874 sdi->driver->dev_acquisition_stop(sdi, cb_data);
880 /** Decode model in "send mode". */
881 SR_PRIV int gmc_decode_model_sm(uint8_t mcode)
884 sr_err("decode_model(%d): Model code 0..15 expected!", mcode);
885 return METRAHIT_NONE;
889 case 0x04: /* 0100b */
891 case 0x08: /* 1000b */
892 return METRAHIT_13S14A;
893 case 0x09: /* 1001b */
895 case 0x0A: /* 1010b */
897 case 0x0B: /* 1011b */
899 case 0x06: /* 0110b (undocumented by GMC!) */
901 case 0x0D: /* 1101b */
903 case 0x02: /* 0010b */
904 return METRAHIT_22SM;
905 case 0x03: /* 0011b */
907 case 0x0f: /* 1111b */
909 case 0x05: /* 0101b */
910 return METRAHIT_25SM;
911 case 0x01: /* 0001b */
913 case 0x0c: /* 1100b */
915 case 0x0e: /* 1110b */
918 sr_err("Unknown model code %d!", mcode);
919 return METRAHIT_NONE;
924 * Decode model in bidirectional mode.
926 * @param[in] mcode Model code.
928 * @return Model code.
930 SR_PRIV int gmc_decode_model_bidi(uint8_t mcode)
934 return METRAHIT_22SM;
940 return METRAHIT_25SM;
948 sr_err("Unknown model code %d!", mcode);
949 return METRAHIT_NONE;
953 SR_PRIV const char *gmc_model_str(enum model mcode)
957 return "-uninitialized model variable-";
959 return "METRAHit 12S";
960 case METRAHIT_13S14A:
961 return "METRAHit 13S/14A";
963 return "METRAHit 14S";
965 return "METRAHit 15S";
967 return "METRAHit 16S";
969 return "METRAHit 16I";
971 return "METRAHit 18S";
973 return "METRAHit 22S/M";
975 return "METRAHit 23S";
977 return "METRAHit 24S";
979 return "METRAHit 25S/M";
981 return "METRAHit 26S";
983 return "METRAHit 28S";
985 return "METRAHit 29S";
987 return "Unknown model code";