X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fcommon%2Fdmm%2Ffs9721.c;h=f3101f8b34b88ce5bffc9078341bdd3e7c4c9d35;hb=43cd4637285833706f8a404ca027bcf0ee75b9ae;hp=a914add8f414a26db59e90adb38d031d9519fd96;hpb=48535594664cc5d55db428cd8ca5ffba328be05a;p=libsigrok.git diff --git a/hardware/common/dmm/fs9721.c b/hardware/common/dmm/fs9721.c index a914add8..f3101f8b 100644 --- a/hardware/common/dmm/fs9721.c +++ b/hardware/common/dmm/fs9721.c @@ -38,14 +38,7 @@ #include "libsigrok.h" #include "libsigrok-internal.h" -/* Message logging helpers with driver-specific prefix string. */ -#define DRIVER_LOG_DOMAIN "fs9721: " -#define sr_log(l, s, args...) sr_log(l, DRIVER_LOG_DOMAIN s, ## args) -#define sr_spew(s, args...) sr_spew(DRIVER_LOG_DOMAIN s, ## args) -#define sr_dbg(s, args...) sr_dbg(DRIVER_LOG_DOMAIN s, ## args) -#define sr_info(s, args...) sr_info(DRIVER_LOG_DOMAIN s, ## args) -#define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args) -#define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args) +#define LOG_PREFIX "fs9721" static int parse_digit(uint8_t b) { @@ -71,7 +64,7 @@ static int parse_digit(uint8_t b) case 0x3f: return 9; default: - sr_err("Invalid digit byte: 0x%02x.", b); + sr_dbg("Invalid digit byte: 0x%02x.", b); return -1; } } @@ -83,7 +76,7 @@ static gboolean sync_nibbles_valid(const uint8_t *buf) /* Check the synchronization nibbles, and make sure they all match. */ for (i = 0; i < FS9721_PACKET_SIZE; i++) { if (((buf[i] >> 4) & 0x0f) != (i + 1)) { - sr_err("Sync nibble in byte %d (0x%02x) is invalid.", + sr_dbg("Sync nibble in byte %d (0x%02x) is invalid.", i, buf[i]); return FALSE; } @@ -104,7 +97,7 @@ static gboolean flags_valid(const struct fs9721_info *info) count += (info->is_kilo) ? 1 : 0; count += (info->is_mega) ? 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; } @@ -117,19 +110,19 @@ static gboolean flags_valid(const struct fs9721_info *info) count += (info->is_volt) ? 1 : 0; count += (info->is_percent) ? 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; } /* RS232 flag not set? */ if (!info->is_rs232) { - sr_err("No RS232 flag detected in packet."); + sr_dbg("No RS232 flag detected in packet."); return FALSE; } @@ -306,6 +299,8 @@ static void handle_flags(struct sr_datafeed_analog *analog, float *floatval, analog->mqflags |= SR_MQFLAG_DC; if (info->is_auto) analog->mqflags |= SR_MQFLAG_AUTORANGE; + if (info->is_diode) + analog->mqflags |= SR_MQFLAG_DIODE; if (info->is_hold) analog->mqflags |= SR_MQFLAG_HOLD; if (info->is_rel) @@ -359,7 +354,7 @@ SR_PRIV int sr_fs9721_parse(const uint8_t *buf, float *floatval, info_local = (struct fs9721_info *)info; if ((ret = parse_value(buf, floatval)) != SR_OK) { - sr_err("Error parsing value: %d.", ret); + sr_dbg("Error parsing value: %d.", ret); return ret; } @@ -369,7 +364,7 @@ SR_PRIV int sr_fs9721_parse(const uint8_t *buf, float *floatval, return SR_OK; } -SR_PRIV void sr_fs9721_details_c2c1_00_temp_celsius(struct sr_datafeed_analog *analog, void *info) +SR_PRIV void sr_fs9721_00_temp_c(struct sr_datafeed_analog *analog, void *info) { struct fs9721_info *info_local; @@ -381,3 +376,70 @@ SR_PRIV void sr_fs9721_details_c2c1_00_temp_celsius(struct sr_datafeed_analog *a analog->unit = SR_UNIT_CELSIUS; } } + +SR_PRIV void sr_fs9721_01_temp_c(struct sr_datafeed_analog *analog, void *info) +{ + struct fs9721_info *info_local; + + info_local = (struct fs9721_info *)info; + + /* User-defined FS9721_LP3 flag 'c2c1_01' means temperature (C). */ + if (info_local->is_c2c1_01) { + analog->mq = SR_MQ_TEMPERATURE; + analog->unit = SR_UNIT_CELSIUS; + } +} + +SR_PRIV void sr_fs9721_10_temp_c(struct sr_datafeed_analog *analog, void *info) +{ + struct fs9721_info *info_local; + + info_local = (struct fs9721_info *)info; + + /* User-defined FS9721_LP3 flag 'c2c1_10' means temperature (C). */ + if (info_local->is_c2c1_10) { + analog->mq = SR_MQ_TEMPERATURE; + analog->unit = SR_UNIT_CELSIUS; + } +} + +SR_PRIV void sr_fs9721_01_10_temp_f_c(struct sr_datafeed_analog *analog, void *info) +{ + struct fs9721_info *info_local; + + info_local = (struct fs9721_info *)info; + + /* User-defined FS9721_LP3 flag 'c2c1_01' means temperature (F). */ + if (info_local->is_c2c1_01) { + analog->mq = SR_MQ_TEMPERATURE; + analog->unit = SR_UNIT_FAHRENHEIT; + } + + /* User-defined FS9721_LP3 flag 'c2c1_10' means temperature (C). */ + if (info_local->is_c2c1_10) { + analog->mq = SR_MQ_TEMPERATURE; + analog->unit = SR_UNIT_CELSIUS; + } +} + +SR_PRIV void sr_fs9721_max_c_min(struct sr_datafeed_analog *analog, void *info) +{ + struct fs9721_info *info_local; + + info_local = (struct fs9721_info *)info; + + /* User-defined FS9721_LP3 flag 'c2c1_00' means MAX. */ + if (info_local->is_c2c1_00) + analog->mqflags |= SR_MQFLAG_MAX; + + /* User-defined FS9721_LP3 flag 'c2c1_01' means temperature (C). */ + if (info_local->is_c2c1_01) { + analog->mq = SR_MQ_TEMPERATURE; + analog->unit = SR_UNIT_CELSIUS; + } + + /* User-defined FS9721_LP3 flag 'c2c1_11' means MIN. */ + if (info_local->is_c2c1_11) + analog->mqflags |= SR_MQFLAG_MIN; + +}