From: Gerhard Sittig Date: Thu, 15 Sep 2022 20:34:02 +0000 (+0200) Subject: korad-kaxxxxp: prepare more versatile ID response text checks X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=551024f26f62cdea8eef1b787fbef31e1b58c466;p=libsigrok.git korad-kaxxxxp: prepare more versatile ID response text checks Add more quirks for IDN responses: Some devices would not report the vendor in their response. Some devices suffer from trailing garbage. Move IDN response text checks to a new model_matches() routine, stick with the strcmp() implementation in this commit for compatibility. This commit does not change the set of supported models, but prepares the addition of more versatile IDN response checks in a future version. --- diff --git a/src/hardware/korad-kaxxxxp/api.c b/src/hardware/korad-kaxxxxp/api.c index c913e6a1..366aaabe 100644 --- a/src/hardware/korad-kaxxxxp/api.c +++ b/src/hardware/korad-kaxxxxp/api.c @@ -54,7 +54,8 @@ static const double amps_5[] = { 0, 5.1, 0.001, }; static const struct korad_kaxxxxp_model models[] = { /* Vendor, model name, ID reply, channels, voltage, current, quirks. */ - {"Korad", "KA3005P", "KORADKA3005PV2.0", 1, volts_30, amps_5, 0}, + {"Korad", "KA3005P", "KORADKA3005PV2.0", + 1, volts_30, amps_5, KORAD_QUIRK_ID_TRAILING}, /* Some KA3005P have extra bytes after the ID text. */ {"Korad", "KA3005P", "KORADKA3005PV2.0\x01", 1, volts_30, amps_5, 0}, {"Korad", "KA3005P", "KORADKA3005PV2.0\xBC", 1, volts_30, amps_5, 0}, @@ -69,7 +70,8 @@ static const struct korad_kaxxxxp_model models[] = { {"RND", "KA3005P", "RND 320-KA3005P V5.5", 1, volts_30, amps_5, 0}, {"RND", "KD3005P", "RND 320-KD3005P V4.2", 1, volts_30, amps_5, 0}, {"RND", "KA3005P", "RND 320-KA3005P V2.0", 1, volts_30, amps_5, 0}, - {"Stamos Soldering", "S-LS-31", "S-LS-31 V2.0", 1, volts_30, amps_5, 0}, + {"Stamos Soldering", "S-LS-31", "S-LS-31 V2.0", + 1, volts_30, amps_5, KORAD_QUIRK_ID_NO_VENDOR}, {"Tenma", "72-2535", "TENMA 72-2535 V2.1", 1, volts_30, amps_3, 0}, {"Tenma", "72-2540", "TENMA72-2540V2.0", 1, volts_30, amps_5, 0}, {"Tenma", "72-2540", "TENMA 72-2540 V2.1", 1, volts_30, amps_5, 0}, @@ -83,6 +85,26 @@ static const struct korad_kaxxxxp_model models[] = { ALL_ZERO }; +/* + * Bump this when adding new models[] above. Make sure the text buffer + * for the ID response can hold the longest sequence that we expect in + * the field which consists of: vendor + model [ + version ][ + serno ]. + * Don't be too generous here, the maximum receive buffer size affects + * the timeout within which the first response character is expected. + */ +static const size_t id_text_buffer_size = 48; + +/* + * Check whether the device's "*IDN?" response matches a supported model. + * The caller already stripped off the optional serial number. + */ +static gboolean model_matches(const struct korad_kaxxxxp_model *model, + const char *id_text) +{ + /* TODO Implement more versatile ID response text checks. */ + return g_strcmp0(model->id, id_text) == 0; +} + static GSList *scan(struct sr_dev_driver *di, GSList *options) { static const char *serno_prefix = " SN:"; @@ -134,17 +156,8 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) if (serial_open(serial, SERIAL_RDWR) != SR_OK) return NULL; - /* - * 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 (len < strlen(models[i].id)) - len = strlen(models[i].id); - } - len += strlen(serno_prefix) + 12; + /* Communicate the identification request. */ + len = id_text_buffer_size; if (len > sizeof(reply) - 1) len = sizeof(reply) - 1; sr_dbg("Want max %zu bytes.", len); @@ -170,7 +183,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) model = NULL; for (i = 0; models[i].id; i++) { - if (g_strcmp0(models[i].id, reply) != 0) + if (!model_matches(&models[i], reply)) continue; model = &models[i]; break; @@ -179,7 +192,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) sr_warn("Found model ID '%s' is unknown, trying '%s' spec.", reply, force_detect); for (i = 0; models[i].id; i++) { - if (strcmp(models[i].id, force_detect) != 0) + if (!model_matches(&models[i], force_detect)) continue; sr_info("Found replacement, using it instead."); model = &models[i]; diff --git a/src/hardware/korad-kaxxxxp/protocol.h b/src/hardware/korad-kaxxxxp/protocol.h index 9c7b33a1..29903e9b 100644 --- a/src/hardware/korad-kaxxxxp/protocol.h +++ b/src/hardware/korad-kaxxxxp/protocol.h @@ -34,7 +34,9 @@ enum korad_quirks_flag { KORAD_QUIRK_NONE = 0, KORAD_QUIRK_LABPS_OVP_EN = 1UL << 0, - KORAD_QUIRK_ALL = (1UL << 1) - 1, + KORAD_QUIRK_ID_NO_VENDOR = 1UL << 1, + KORAD_QUIRK_ID_TRAILING = 1UL << 2, + KORAD_QUIRK_ALL = (1UL << 3) - 1, }; /* Information on single model */