#include "libsigrok.h"
#include "libsigrok-internal.h"
+/* Message logging helpers with driver-specific prefix string. */
+#define DRIVER_LOG_DOMAIN "strutil: "
+#define sr_log(l, s, args...) sr_log(l, DRIVER_LOG_DOMAIN s, ## args)
+#define sr_spew(s, args...) sr_spew(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_dbg(s, args...) sr_dbg(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_info(s, args...) sr_info(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args)
+
+/**
+ * @file
+ *
+ * Helper functions for handling or converting libsigrok-related strings.
+ */
+
/**
* @defgroup grp_strutil String utilities
*
*/
SR_API char *sr_si_string_u64(uint64_t x, const char *unit)
{
- if(unit == NULL)
+ if (unit == NULL)
unit = "";
if ((x >= SR_GHZ(1)) && (x % SR_GHZ(1) == 0)) {
return g_strdup_printf("%" PRIu64 " %s", x, unit);
}
- sr_err("strutil: %s: Error creating SI units string.",
- __func__);
+ sr_err("%s: Error creating SI units string.", __func__);
return NULL;
}
/* Allocate enough for a uint64_t as string + " ms". */
if (!(o = g_try_malloc0(30 + 1))) {
- sr_err("strutil: %s: o malloc failed", __func__);
+ sr_err("%s: o malloc failed", __func__);
return NULL;
}
*/
SR_API char *sr_voltage_string(struct sr_rational *voltage)
{
- char *o;
int r;
+ char *o;
if (!(o = g_try_malloc0(30 + 1))) {
- sr_err("strutil: %s: o malloc failed", __func__);
+ sr_err("%s: o malloc failed", __func__);
return NULL;
}
else if (voltage->q == 1)
r = snprintf(o, 30, "%" PRIu64 "V", voltage->p);
else
- r = -1;
+ r = snprintf(o, 30, "%gV", (float)voltage->p / (float)voltage->q);
if (r < 0) {
/* Something went wrong... */
/**
* Parse a trigger specification string.
*
- * @param dev The device for which the trigger specification is intended.
+ * @param sdi The device instance for which the trigger specification is
+ * intended. Must not be NULL. Also, sdi->driver and
+ * sdi->driver->info_get must not be NULL.
* @param triggerstring The string containing the trigger specification for
* one or more probes of this device. Entries for multiple probes are
* comma-separated. Triggers are specified in the form key=value,
const char *triggerstring)
{
GSList *l;
+ GVariant *gvar;
struct sr_probe *probe;
int max_probes, probenum, i;
char **tokens, **triggerlist, *trigger, *tc;
error = FALSE;
if (!(triggerlist = g_try_malloc0(max_probes * sizeof(char *)))) {
- sr_err("strutil: %s: triggerlist malloc failed", __func__);
+ sr_err("%s: triggerlist malloc failed", __func__);
return NULL;
}
- if (sdi->driver->info_get(SR_DI_TRIGGER_TYPES,
- (const void **)&trigger_types, sdi) != SR_OK) {
- sr_err("strutil: %s: Device doesn't support any triggers.", __func__);
+ if (sdi->driver->config_list(SR_CONF_TRIGGER_TYPE, &gvar, sdi) != SR_OK) {
+ sr_err("%s: Device doesn't support any triggers.", __func__);
return NULL;
}
+ trigger_types = g_variant_get_string(gvar, NULL);
tokens = g_strsplit(triggerstring, ",", max_probes);
for (i = 0; tokens[i]; i++) {
}
if (probenum < 0 || probenum >= max_probes) {
- sr_err("strutil: Invalid probe.");
+ sr_err("Invalid probe.");
error = TRUE;
break;
}
if ((trigger = strchr(tokens[i], '='))) {
for (tc = ++trigger; *tc; tc++) {
if (strchr(trigger_types, *tc) == NULL) {
- sr_err("strutil: Unsupported trigger "
+ sr_err("Unsupported trigger "
"type '%c'.", *tc);
error = TRUE;
break;
}
}
g_strfreev(tokens);
+ g_variant_unref(gvar);
if (error) {
for (i = 0; i < max_probes; i++)
* @param timestring A string containing a (decimal) time value.
* @return The string's time value as uint64_t, in milliseconds.
*
- * TODO: Error handling.
- * TODO: Add support for "m" (minutes) and others.
- * TODO: picoseconds?
- * TODO: Allow both lower-case and upper-case.
+ * @todo Add support for "m" (minutes) and others.
+ * @todo Add support for picoseconds?
+ * @todo Allow both lower-case and upper-case? If no, document it.
*/
SR_API uint64_t sr_parse_timestring(const char *timestring)
{
uint64_t time_msec;
char *s;
+ /* TODO: Error handling, logging. */
+
time_msec = strtoull(timestring, &s, 10);
if (time_msec == 0 && s == timestring)
return 0;
if (s && *s) {
while (*s == ' ')
s++;
- if (!strcmp(s, "ns"))
- r->q = 1000000000L;
+ if (!strcmp(s, "fs"))
+ r->q = 1000000000000000ULL;
+ else if (!strcmp(s, "ps"))
+ r->q = 1000000000000ULL;
+ else if (!strcmp(s, "ns"))
+ r->q = 1000000000ULL;
else if (!strcmp(s, "us"))
r->q = 1000000;
else if (!strcmp(s, "ms"))