]> sigrok.org Git - libsigrok.git/blobdiff - strutil.c
sr: fx2lafw: Add basic support for USBee DX and clones
[libsigrok.git] / strutil.c
index cb51b2ab72ae241e42b0f96662bc52f531cedb15..7c346a006c21606f9076154c0fe94643fc6750c9 100644 (file)
--- a/strutil.c
+++ b/strutil.c
@@ -21,8 +21,8 @@
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
-#include "sigrok.h"
-#include "sigrok-internal.h"
+#include "libsigrok.h"
+#include "libsigrok-internal.h"
 
 /**
  * Convert a numeric samplerate value to its "natural" string representation.
@@ -110,6 +110,45 @@ SR_API char *sr_period_string(uint64_t frequency)
        return o;
 }
 
+/**
+ * Convert a numeric frequency value to the "natural" string representation
+ * of its voltage value.
+ *
+ * E.g. a value of 300000 would be converted to "300mV", 2 to "2V".
+ *
+ * @param voltage The voltage represented as a rational number, with the
+ *                denominator a divisor of 1V.
+ *
+ * @return A g_try_malloc()ed string representation of the voltage value,
+ *         or NULL upon errors. The caller is responsible to g_free() the
+ *         memory.
+ */
+SR_API char *sr_voltage_string(struct sr_rational *voltage)
+{
+       char *o;
+       int r;
+
+       if (!(o = g_try_malloc0(30 + 1))) {
+               sr_err("strutil: %s: o malloc failed", __func__);
+               return NULL;
+       }
+
+       if (voltage->q == 1000)
+               r = snprintf(o, 30, "%" PRIu64 "mV", voltage->p);
+       else if (voltage->q == 1)
+               r = snprintf(o, 30, "%" PRIu64 "V", voltage->p);
+       else
+               r = -1;
+
+       if (r < 0) {
+               /* Something went wrong... */
+               g_free(o);
+               return NULL;
+       }
+
+       return o;
+}
+
 /**
  * Parse a trigger specification string.
  *
@@ -137,7 +176,8 @@ SR_API char **sr_parse_triggerstring(struct sr_dev *dev,
        GSList *l;
        struct sr_probe *probe;
        int max_probes, probenum, i;
-       char **tokens, **triggerlist, *trigger, *tc, *trigger_types;
+       char **tokens, **triggerlist, *trigger, *tc;
+       const char *trigger_types;
        gboolean error;
 
        max_probes = g_slist_length(dev->probes);
@@ -314,3 +354,58 @@ SR_API gboolean sr_parse_boolstring(const char *boolstr)
 
        return FALSE;
 }
+
+SR_API int sr_parse_period(const char *periodstr, struct sr_rational *r)
+{
+       char *s;
+
+       r->p = strtoull(periodstr, &s, 10);
+       if (r->p == 0 && s == periodstr)
+               /* No digits found. */
+               return SR_ERR_ARG;
+
+       if (s && *s) {
+               while (*s == ' ')
+                       s++;
+               if (!strcmp(s, "ns"))
+                       r->q = 1000000000L;
+               else if (!strcmp(s, "us"))
+                       r->q = 1000000;
+               else if (!strcmp(s, "ms"))
+                       r->q = 1000;
+               else if (!strcmp(s, "s"))
+                       r->q = 1;
+               else
+                       /* Must have a time suffix. */
+                       return SR_ERR_ARG;
+       }
+
+       return SR_OK;
+}
+
+
+SR_API int sr_parse_voltage(const char *voltstr, struct sr_rational *r)
+{
+       char *s;
+
+       r->p = strtoull(voltstr, &s, 10);
+       if (r->p == 0 && s == voltstr)
+               /* No digits found. */
+               return SR_ERR_ARG;
+
+       if (s && *s) {
+               while (*s == ' ')
+                       s++;
+               if (!strcasecmp(s, "mv"))
+                       r->q = 1000L;
+               else if (!strcasecmp(s, "v"))
+                       r->q = 1;
+               else
+                       /* Must have a base suffix. */
+                       return SR_ERR_ARG;
+       }
+
+       return SR_OK;
+}
+
+