From: Gerhard Sittig Date: Sat, 1 Aug 2020 15:22:28 +0000 (+0200) Subject: korad-kaxxxxp: add support for forced "detection" of a given model X-Git-Url: http://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=e37e301e26c1da480e41fa68aef3be4efa5d0345 korad-kaxxxxp: add support for forced "detection" of a given model Korad PSU models are rather popular. But the successful operation of currently unsupported model names or firmware versions is hard to verify by users, because building the library from locally modified sources is involved. Introduce support for the "force_detect=" scan option. Warning messages contain how the device identifies itself. Optional user specs can force the assignment of the driver to the unsupported model. Which results in reports that include the identification details as well as the successful use of the device. $ sigrok-cli -d korad-kaxxxxp:conn=...:force_detect=KORADKA3005PV2.0 --show --- diff --git a/src/hardware/korad-kaxxxxp/api.c b/src/hardware/korad-kaxxxxp/api.c index d0920c9b..798c6f3a 100644 --- a/src/hardware/korad-kaxxxxp/api.c +++ b/src/hardware/korad-kaxxxxp/api.c @@ -24,6 +24,7 @@ static const uint32_t scanopts[] = { SR_CONF_CONN, SR_CONF_SERIALCOMM, + SR_CONF_FORCE_DETECT, }; static const uint32_t drvopts[] = { @@ -97,6 +98,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) struct sr_dev_inst *sdi; struct sr_config *src; const char *conn, *serialcomm; + const char *force_detect; struct sr_serial_dev_inst *serial; char reply[50]; int i, model_id; @@ -104,6 +106,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) conn = NULL; serialcomm = NULL; + force_detect = NULL; for (l = options; l; l = l->next) { src = l->data; @@ -114,6 +117,9 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) case SR_CONF_SERIALCOMM: serialcomm = g_variant_get_string(src->data, NULL); break; + case SR_CONF_FORCE_DETECT: + force_detect = g_variant_get_string(src->data, NULL); + break; default: sr_err("Unknown option %d, skipping.", src->key); break; @@ -124,6 +130,8 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) return NULL; if (!serialcomm) serialcomm = "9600/8n1"; + if (force_detect && !*force_detect) + force_detect = NULL; serial = sr_serial_dev_inst_new(conn, serialcomm); if (serial_open(serial, SERIAL_RDWR) != SR_OK) @@ -162,6 +170,17 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) if (!g_strcmp0(models[i].id, reply)) model_id = i; } + if (model_id < 0 && force_detect) { + 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) + continue; + sr_info("Found replacement, using it instead."); + model_id = i; + break; + } + } if (model_id < 0) { sr_err("Unknown model ID '%s' detected, aborting.", reply); return NULL;