]> sigrok.org Git - libsigrok.git/commitdiff
korad-kaxxxxp: support optional version after fixed ID response text
authorGerhard Sittig <redacted>
Fri, 16 Sep 2022 08:03:30 +0000 (10:03 +0200)
committerGerhard Sittig <redacted>
Sat, 17 Sep 2022 09:24:49 +0000 (11:24 +0200)
The combination of a literal expected ID response, and an optionally
trailing version information that need not be part of the driver's
strict expectation, would be useful to handle the RND devices' prefix.

Extend the "strict ID response text check", accept an optional version
text before checking for exhausted input. This commit only introduces
the support code, does not change the set of supported models.

src/hardware/korad-kaxxxxp/api.c
src/hardware/korad-kaxxxxp/protocol.h

index effab3e337ff78f01f7da2ca319e7d28f179da4e..d8215c605535fa687cec7341492b3916dc0acb2b 100644 (file)
@@ -92,7 +92,7 @@ static gboolean model_matches(const struct korad_kaxxxxp_model *model,
        const char *id_text)
 {
        gboolean matches;
-       gboolean skip_vendor, accept_trail;
+       gboolean opt_version, skip_vendor, accept_trail;
        const char *want;
 
        if (!model)
@@ -103,12 +103,34 @@ static gboolean model_matches(const struct korad_kaxxxxp_model *model,
         * then expect to see this very text in literal form. This
         * lets the driver map weird and untypical responses to a
         * specific set of display texts for vendor and model names.
+        * Accept an optionally trailing version if models[] says so.
         */
        if (model->id && model->id[0]) {
-               matches = g_strcmp0(model->id, id_text) == 0;
-               if (matches)
+               opt_version = model->quirks & KORAD_QUIRK_ID_OPT_VERSION;
+               if (!opt_version) {
+                       matches = g_strcmp0(id_text, model->id) == 0;
+                       if (!matches)
+                               return FALSE;
                        sr_dbg("Matches expected ID text: '%s'.", model->id);
-               return matches;
+                       return TRUE;
+               }
+               matches = g_str_has_prefix(id_text, model->id);
+               if (!matches)
+                       return FALSE;
+               id_text += strlen(model->id);
+               while (isspace((int)*id_text))
+                       id_text++;
+               if (*id_text == 'V') {
+                       id_text++;
+                       while (*id_text == '.' || isdigit((int)*id_text))
+                               id_text++;
+                       while (isspace((int)*id_text))
+                               id_text++;
+               }
+               if (*id_text)
+                       return FALSE;
+               sr_dbg("Matches expected ID text [vers]: '%s'.", model->id);
+               return TRUE;
        }
 
        /*
index 29903e9b1b94aa5adef59cbd3742c87ae65b469e..9dcc19cacdfd192c19a8f7aac4442a428df0c5cb 100644 (file)
@@ -36,7 +36,8 @@ enum korad_quirks_flag {
        KORAD_QUIRK_LABPS_OVP_EN = 1UL << 0,
        KORAD_QUIRK_ID_NO_VENDOR = 1UL << 1,
        KORAD_QUIRK_ID_TRAILING = 1UL << 2,
-       KORAD_QUIRK_ALL = (1UL << 3) - 1,
+       KORAD_QUIRK_ID_OPT_VERSION = 1UL << 3,
+       KORAD_QUIRK_ALL = (1UL << 4) - 1,
 };
 
 /* Information on single model */