]> sigrok.org Git - libsigrok.git/blobdiff - hardware/common/dmm/es519xx.c
es519xx: correctly handle the VAHZ function
[libsigrok.git] / hardware / common / dmm / es519xx.c
index 67d669a584211628b3a527b7e16edcec725f1a3e..510fd4f314688bdb405fe604707172c14f8d087a 100644 (file)
@@ -169,6 +169,8 @@ static int parse_range(uint8_t b, float *floatval,
                mode = 7; /* Capacitance */
        else if (info->is_diode)
                mode = 8; /* Diode */
+       else if (info->is_duty_cycle)
+               mode = 0; /* Dummy, unused */
        else {
                sr_dbg("Invalid mode, range byte was: 0x%02x.", b);
                return SR_ERR;
@@ -180,6 +182,8 @@ static int parse_range(uint8_t b, float *floatval,
                else if (info->is_milli)
                        factor = (const float[]){1e-2, 1e-1}[idx];
        }
+       else if (info->is_duty_cycle)
+               factor = 1e-1;
        else if (info->baudrate == 2400)
                factor = factors_2400_11b[mode][idx];
        else if (info->fivedigits)
@@ -369,9 +373,9 @@ static void parse_flags(const uint8_t *buf, struct es519xx_info *info)
                case 0x32: /* Frequency / RPM / duty cycle */
                        if (info->packet_size == 14) {
                                if (info->is_judge)
-                                       info->is_frequency = TRUE;
-                               else
                                        info->is_duty_cycle = TRUE;
+                               else
+                                       info->is_frequency = TRUE;
                        } else {
                                if (info->is_judge)
                                        info->is_rpm = TRUE;
@@ -408,6 +412,23 @@ static void parse_flags(const uint8_t *buf, struct es519xx_info *info)
                }
        }
 
+       if (info->is_vahz && (info->is_voltage || info->is_current)) {
+               info->is_voltage = FALSE;
+               info->is_current = FALSE;
+               info->is_milli = info->is_micro = FALSE;
+               if (info->packet_size == 14) {
+                       if (info->is_judge)
+                               info->is_duty_cycle = TRUE;
+                       else
+                               info->is_frequency = TRUE;
+               } else {
+                       if (info->is_judge)
+                               info->is_rpm = TRUE;
+                       else
+                               info->is_frequency = TRUE;
+               }
+       }
+
        if (info->is_current && (info->is_micro || info->is_milli) && info->is_vasel) {
                info->is_current = info->is_auto = FALSE;
                info->is_voltage = TRUE;