From: Gerhard Sittig Date: Fri, 28 Aug 2020 14:17:22 +0000 (+0200) Subject: korad-kaxxxxp: style cleanup in device scan, keep serno at hand X-Git-Url: http://sigrok.org/gitweb/?a=commitdiff_plain;h=fcacf532f5180b11b9ddaac6d7a95549f3ee0e32;p=libsigrok.git korad-kaxxxxp: style cleanup in device scan, keep serno at hand Cleanup style in the korad driver's scan() routine. Keep declarations out of code blocks. Reduce redundancy and improve robustness in the response buffer length calculation. Reduce clutter and group related instructions together. Unobfuscate result checks, and keep the result at hand (for diagnostics, or error propagation). Unobfuscate string comparisons in the model ID lookups, terminate the search upon match. Use a not so terse name for data that gets referenced at rather distant locations. Keep the optionally available serial number at hand, to present it to users when desired. This aspect was Reported-By: Karl Palsson --- diff --git a/src/hardware/korad-kaxxxxp/api.c b/src/hardware/korad-kaxxxxp/api.c index 798c6f3a..78c55b47 100644 --- a/src/hardware/korad-kaxxxxp/api.c +++ b/src/hardware/korad-kaxxxxp/api.c @@ -93,6 +93,8 @@ static const struct korad_kaxxxxp_model models[] = { static GSList *scan(struct sr_dev_driver *di, GSList *options) { + static const char *serno_prefix = " SN:"; + struct dev_context *devc; GSList *l; struct sr_dev_inst *sdi; @@ -101,8 +103,9 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) const char *force_detect; struct sr_serial_dev_inst *serial; char reply[50]; - int i, model_id; - unsigned int len; + int ret, i, model_id; + size_t len; + char *serno; conn = NULL; serialcomm = NULL; @@ -137,38 +140,47 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) if (serial_open(serial, SERIAL_RDWR) != SR_OK) return NULL; - /* Get the device model. */ + /* + * Prepare a receive buffer for the identification response that + * is large enough to hold the longest known model name, and an + * optional serial number. Communicate the identification request. + */ len = 0; for (i = 0; models[i].id; i++) { - if (strlen(models[i].id) > len) + if (len < strlen(models[i].id)) len = strlen(models[i].id); } + len += strlen(serno_prefix) + 12; + if (len > sizeof(reply) - 1) + len = sizeof(reply) - 1; + sr_dbg("Want max %zu bytes.", len); - /* - * Some models also include the serial number: - * RND 320-KD3005P V4.2 SN:59834414 - */ - len += 12; + ret = korad_kaxxxxp_send_cmd(serial, "*IDN?"); + if (ret < 0) + return NULL; memset(&reply, 0, sizeof(reply)); - sr_dbg("Want max %d bytes.", len); - if ((korad_kaxxxxp_send_cmd(serial, "*IDN?") < 0)) + ret = korad_kaxxxxp_read_chars(serial, len, reply); + if (ret < 0) return NULL; + sr_dbg("Received: %d, %s", ret, reply); - /* i is used here for debug purposes only. */ - if ((i = korad_kaxxxxp_read_chars(serial, len, reply)) < 0) - return NULL; - sr_dbg("Received: %d, %s", i, reply); - model_id = -1; - - /* Truncate before serial number. */ - char *sn = g_strrstr(reply, " SN:"); - if (sn) - *sn = '\0'; + /* + * Isolate the optional serial number at the response's end. + * Lookup the response's model ID in the list of known models. + */ + serno = g_strrstr(reply, serno_prefix); + if (serno) { + *serno = '\0'; + serno += strlen(serno_prefix); + } + model_id = -1; for (i = 0; models[i].id; i++) { - if (!g_strcmp0(models[i].id, reply)) - model_id = i; + if (g_strcmp0(models[i].id, reply) != 0) + continue; + model_id = i; + break; } if (model_id < 0 && force_detect) { sr_warn("Found model ID '%s' is unknown, trying '%s' spec.", @@ -192,6 +204,8 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) sdi->status = SR_ST_INACTIVE; sdi->vendor = g_strdup(models[model_id].vendor); sdi->model = g_strdup(models[model_id].name); + if (serno) + sdi->serial_num = g_strdup(serno); sdi->inst_type = SR_INST_SERIAL; sdi->conn = serial; sdi->connection_id = g_strdup(conn);