X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fcommon%2Fdmm%2Fes519xx.c;h=075587ce40fcc37fcde278f84ec7976ea5a94ee7;hb=c6c63b08af0f73b60de6726c9d5aea50d20d83d2;hp=0a0a2231e64723c83f657a55794676559d06af58;hpb=93d719cde6dbd3cc79b035b223e5a0d4ab5926cb;p=libsigrok.git diff --git a/hardware/common/dmm/es519xx.c b/hardware/common/dmm/es519xx.c index 0a0a2231..075587ce 100644 --- a/hardware/common/dmm/es519xx.c +++ b/hardware/common/dmm/es519xx.c @@ -32,17 +32,10 @@ #include "libsigrok.h" #include "libsigrok-internal.h" -/* Message logging helpers with subsystem-specific prefix string. */ -#define LOG_PREFIX "es519xx: " -#define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args) -#define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args) -#define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args) -#define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args) -#define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args) -#define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args) +#define LOG_PREFIX "es519xx" /* Factors for the respective measurement mode (0 means "invalid"). */ -static const float factors_2400_11b[8][8] = { +static const float factors_2400_11b[9][8] = { {1e-4, 1e-3, 1e-2, 1e-1, 1, 0, 0, 0 }, /* V */ {1e-7, 1e-6, 0, 0, 0, 0, 0, 0 }, /* uA */ {1e-5, 1e-4, 0, 0, 0, 0, 0, 0 }, /* mA */ @@ -51,8 +44,9 @@ static const float factors_2400_11b[8][8] = { {1e-1, 1, 1e1, 1e2, 1e3, 1e4, 0, 0 }, /* Resistance */ {1, 1e1, 1e2, 1e3, 1e4, 1e5, 0, 0 }, /* Frequency */ {1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5}, /* Capacitance */ + {1e-3, 0, 0, 0, 0, 0, 0, 0 }, /* Diode */ }; -static const float factors_19200_11b_5digits[8][8] = { +static const float factors_19200_11b_5digits[9][8] = { {1e-4, 1e-3, 1e-2, 1e-1, 1e-5, 0, 0, 0}, /* V */ {1e-8, 1e-7, 0, 0, 0, 0, 0, 0}, /* uA */ {1e-6, 1e-5, 0, 0, 0, 0, 0, 0}, /* mA */ @@ -61,8 +55,9 @@ static const float factors_19200_11b_5digits[8][8] = { {1e-2, 1e-1, 1, 1e1, 1e2, 1e3, 1e4, 0}, /* Resistance */ {1e-1, 0, 1, 1e1, 1e2, 1e3, 1e4, 0}, /* Frequency */ {1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5}, /* Capacitance */ + {1e-4, 0, 0, 0, 0, 0, 0, 0 }, /* Diode */ }; -static const float factors_19200_11b_clampmeter[8][8] = { +static const float factors_19200_11b_clampmeter[9][8] = { {1e-3, 1e-2, 1e-1, 1, 1e-4, 0, 0, 0}, /* V */ {1e-7, 1e-6, 0, 0, 0, 0, 0, 0}, /* uA */ {1e-5, 1e-4, 0, 0, 0, 0, 0, 0}, /* mA */ @@ -71,8 +66,9 @@ static const float factors_19200_11b_clampmeter[8][8] = { {1e-1, 1, 1e1, 1e2, 1e3, 1e4, 0, 0}, /* Resistance */ {1e-1, 0, 1, 1e1, 1e2, 1e3, 1e4, 0}, /* Frequency */ {1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5}, /* Capacitance */ + {1e-3, 0, 0, 0, 0, 0, 0, 0 }, /* Diode */ }; -static const float factors_19200_11b[8][8] = { +static const float factors_19200_11b[9][8] = { {1e-3, 1e-2, 1e-1, 1, 1e-4, 0, 0, 0}, /* V */ {1e-7, 1e-6, 0, 0, 0, 0, 0, 0}, /* uA */ {1e-5, 1e-4, 0, 0, 0, 0, 0, 0}, /* mA */ @@ -81,8 +77,9 @@ static const float factors_19200_11b[8][8] = { {1e-1, 1, 1e1, 1e2, 1e3, 1e4, 0, 0}, /* Resistance */ {1, 1e1, 1e2, 1e3, 1e4, 0, 0, 0}, /* Frequency */ {1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 0}, /* Capacitance */ + {1e-3, 0, 0, 0, 0, 0, 0, 0}, /* Diode */ }; -static const float factors_19200_14b[8][8] = { +static const float factors_19200_14b[9][8] = { {1e-4, 1e-3, 1e-2, 1e-1, 1e-5, 0, 0, 0}, /* V */ {1e-8, 1e-7, 0, 0, 0, 0, 0, 0}, /* uA */ {1e-6, 1e-5, 0, 0, 0, 0, 0, 0}, /* mA */ @@ -91,6 +88,7 @@ static const float factors_19200_14b[8][8] = { {1e-2, 1e-1, 1, 1e1, 1e2, 1e3, 1e4, 0}, /* Resistance */ {1e-2, 1e-1, 0, 1, 1e1, 1e2, 1e3, 1e4}, /* Frequency */ {1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5}, /* Capacitance */ + {1e-4, 0, 0, 0, 0, 0, 0, 0 }, /* Diode */ }; static int parse_value(const uint8_t *buf, struct es519xx_info *info, @@ -113,7 +111,7 @@ static int parse_value(const uint8_t *buf, struct es519xx_info *info, } else if (!isdigit(buf[1]) || !isdigit(buf[2]) || !isdigit(buf[3]) || !isdigit(buf[4]) || (num_digits == 5 && !isdigit(buf[5]))) { - sr_err("Value contained invalid digits: %02x %02x %02x %02x " + sr_dbg("Value contained invalid digits: %02x %02x %02x %02x " "(%c %c %c %c).", buf[1], buf[2], buf[3], buf[4], buf[1], buf[2], buf[3], buf[4]); return SR_ERR; @@ -163,12 +161,16 @@ static int parse_range(uint8_t b, float *floatval, else if (info->is_rpm) /* Not a typo, it's really index 4 in factors_2400_11b[][]. */ mode = 4; /* RPM */ - else if (info->is_resistance) + else if (info->is_resistance || info->is_continuity) mode = 5; /* Resistance */ else if (info->is_frequency) mode = 6; /* Frequency */ else if (info->is_capacitance) 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) @@ -335,7 +339,7 @@ static void parse_flags(const uint8_t *buf, struct es519xx_info *info) info->is_adp3 = TRUE; break; default: - sr_err("Invalid function byte: 0x%02x.", buf[function]); + sr_dbg("Invalid function byte: 0x%02x.", buf[function]); break; } } else { @@ -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; @@ -403,11 +407,28 @@ static void parse_flags(const uint8_t *buf, struct es519xx_info *info) info->is_adp3 = TRUE; break; default: - sr_err("Invalid function byte: 0x%02x.", buf[function]); + sr_dbg("Invalid function byte: 0x%02x.", buf[function]); break; } } + 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; @@ -462,7 +483,7 @@ static void handle_flags(struct sr_datafeed_analog *analog, if (info->is_continuity) { analog->mq = SR_MQ_CONTINUITY; analog->unit = SR_UNIT_BOOLEAN; - *floatval = (*floatval < 0.0) ? 0.0 : 1.0; + *floatval = (*floatval < 0.0 || *floatval > 25.0) ? 0.0 : 1.0; } if (info->is_diode) { analog->mq = SR_MQ_VOLTAGE; @@ -532,7 +553,7 @@ static gboolean flags_valid(const struct es519xx_info *info) count = (info->is_micro) ? 1 : 0; count += (info->is_milli) ? 1 : 0; if (count > 1) { - sr_err("More than one multiplier detected in packet."); + sr_dbg("More than one multiplier detected in packet."); return FALSE; } @@ -547,13 +568,13 @@ static gboolean flags_valid(const struct es519xx_info *info) count += (info->is_diode) ? 1 : 0; count += (info->is_rpm) ? 1 : 0; if (count > 1) { - sr_err("More than one measurement type detected in packet."); + sr_dbg("More than one measurement type detected in packet."); return FALSE; } /* Both AC and DC set? */ if (info->is_ac && info->is_dc) { - sr_err("Both AC and DC flags detected in packet."); + sr_dbg("Both AC and DC flags detected in packet."); return FALSE; } @@ -591,13 +612,15 @@ static int sr_es519xx_parse(const uint8_t *buf, float *floatval, return SR_ERR; if ((ret = parse_value(buf, info, floatval)) != SR_OK) { - sr_err("Error parsing value: %d.", ret); + sr_dbg("Error parsing value: %d.", ret); return ret; } - handle_flags(analog, floatval, info); + if ((ret = parse_range(buf[0], floatval, info)) != SR_OK) + return ret; - return parse_range(buf[0], floatval, info); + handle_flags(analog, floatval, info); + return SR_OK; } /* @@ -608,6 +631,7 @@ SR_PRIV gboolean sr_es519xx_2400_11b_packet_valid(const uint8_t *buf) { struct es519xx_info info; + memset(&info, 0, sizeof(struct es519xx_info)); info.baudrate = 2400; info.packet_size = 11; @@ -620,6 +644,7 @@ SR_PRIV int sr_es519xx_2400_11b_parse(const uint8_t *buf, float *floatval, struct es519xx_info *info_local; info_local = info; + memset(info_local, 0, sizeof(struct es519xx_info)); info_local->baudrate = 2400; info_local->packet_size = 11; @@ -634,6 +659,7 @@ SR_PRIV gboolean sr_es519xx_2400_11b_altfn_packet_valid(const uint8_t *buf) { struct es519xx_info info; + memset(&info, 0, sizeof(struct es519xx_info)); info.baudrate = 2400; info.packet_size = 11; info.alt_functions = TRUE; @@ -647,6 +673,7 @@ SR_PRIV int sr_es519xx_2400_11b_altfn_parse(const uint8_t *buf, struct es519xx_info *info_local; info_local = info; + memset(info_local, 0, sizeof(struct es519xx_info)); info_local->baudrate = 2400; info_local->packet_size = 11; info_local->alt_functions = TRUE; @@ -662,6 +689,7 @@ SR_PRIV gboolean sr_es519xx_19200_11b_5digits_packet_valid(const uint8_t *buf) { struct es519xx_info info; + memset(&info, 0, sizeof(struct es519xx_info)); info.baudrate = 19200; info.packet_size = 11; info.fivedigits = TRUE; @@ -675,6 +703,7 @@ SR_PRIV int sr_es519xx_19200_11b_5digits_parse(const uint8_t *buf, struct es519xx_info *info_local; info_local = info; + memset(info_local, 0, sizeof(struct es519xx_info)); info_local->baudrate = 19200; info_local->packet_size = 11; info_local->fivedigits = TRUE; @@ -690,6 +719,7 @@ SR_PRIV gboolean sr_es519xx_19200_11b_clamp_packet_valid(const uint8_t *buf) { struct es519xx_info info; + memset(&info, 0, sizeof(struct es519xx_info)); info.baudrate = 19200; info.packet_size = 11; info.clampmeter = TRUE; @@ -703,6 +733,7 @@ SR_PRIV int sr_es519xx_19200_11b_clamp_parse(const uint8_t *buf, struct es519xx_info *info_local; info_local = info; + memset(info_local, 0, sizeof(struct es519xx_info)); info_local->baudrate = 19200; info_local->packet_size = 11; info_local->clampmeter = TRUE; @@ -718,6 +749,7 @@ SR_PRIV gboolean sr_es519xx_19200_11b_packet_valid(const uint8_t *buf) { struct es519xx_info info; + memset(&info, 0, sizeof(struct es519xx_info)); info.baudrate = 19200; info.packet_size = 11; @@ -730,6 +762,7 @@ SR_PRIV int sr_es519xx_19200_11b_parse(const uint8_t *buf, float *floatval, struct es519xx_info *info_local; info_local = info; + memset(info_local, 0, sizeof(struct es519xx_info)); info_local->baudrate = 19200; info_local->packet_size = 11; @@ -744,6 +777,7 @@ SR_PRIV gboolean sr_es519xx_19200_14b_packet_valid(const uint8_t *buf) { struct es519xx_info info; + memset(&info, 0, sizeof(struct es519xx_info)); info.baudrate = 19200; info.packet_size = 14; @@ -756,6 +790,7 @@ SR_PRIV int sr_es519xx_19200_14b_parse(const uint8_t *buf, float *floatval, struct es519xx_info *info_local; info_local = info; + memset(info_local, 0, sizeof(struct es519xx_info)); info_local->baudrate = 19200; info_local->packet_size = 14; @@ -770,6 +805,7 @@ SR_PRIV gboolean sr_es519xx_19200_14b_sel_lpf_packet_valid(const uint8_t *buf) { struct es519xx_info info; + memset(&info, 0, sizeof(struct es519xx_info)); info.baudrate = 19200; info.packet_size = 14; info.selectable_lpf = TRUE; @@ -783,6 +819,7 @@ SR_PRIV int sr_es519xx_19200_14b_sel_lpf_parse(const uint8_t *buf, struct es519xx_info *info_local; info_local = info; + memset(info_local, 0, sizeof(struct es519xx_info)); info_local->baudrate = 19200; info_local->packet_size = 14; info_local->selectable_lpf = TRUE;