#include <stdlib.h>
#include <string.h>
#include <glib.h>
-#include "config.h"
#include "libsigrok.h"
#include "libsigrok-internal.h"
#include <math.h>
GString *out;
};
-
static int init(struct sr_output *o)
{
struct context *ctx;
if (!o || !o->sdi)
return SR_ERR_ARG;
- if (!(ctx = g_try_malloc0(sizeof(struct context))))
+ if (!(ctx = g_try_malloc0(sizeof(struct context)))) {
+ sr_err("output/analog: Context malloc failed.");
return SR_ERR_MALLOC;
+ }
o->internal = ctx;
/* Get the number of probes and their names. */
static void si_printf(float value, GString *out, char *unitstr)
{
+ float v;
- if (value > 1000000000L)
- g_string_append_printf(out, "%f G%s", value / 1000000000L, unitstr);
- else if (value > 1000000)
- g_string_append_printf(out, "%f M%s", value / 1000000, unitstr);
- else if (value > 1000)
- g_string_append_printf(out, "%f k%s", value / 1000, unitstr);
- else if (value < 0.000000000001)
- g_string_append_printf(out, "%f p%s", value * 1000000000000, unitstr);
- else if (value < 0.000000001)
- g_string_append_printf(out, "%f n%s", value * 1000000000, unitstr);
- else if (value < 0.000001)
- g_string_append_printf(out, "%f u%s", value * 1000000, unitstr);
- else if (value < 0.001)
- g_string_append_printf(out, "%f m%s", value * 1000, unitstr);
+ if (signbit(value))
+ v = -(value);
+ else
+ v = value;
+
+ if (v < 1e-12 || v > 1e+12)
+ g_string_append_printf(out, "%f %s", value, unitstr);
+ else if (v > 1e+9)
+ g_string_append_printf(out, "%f G%s", value / 1e+9, unitstr);
+ else if (v > 1e+6)
+ g_string_append_printf(out, "%f M%s", value / 1e+6, unitstr);
+ else if (v > 1e+3)
+ g_string_append_printf(out, "%f k%s", value / 1e+3, unitstr);
+ else if (v < 1e-9)
+ g_string_append_printf(out, "%f n%s", value * 1e+9, unitstr);
+ else if (v < 1e-6)
+ g_string_append_printf(out, "%f u%s", value * 1e+6, unitstr);
+ else if (v < 1e-3)
+ g_string_append_printf(out, "%f m%s", value * 1e+3, unitstr);
else
g_string_append_printf(out, "%f %s", value, unitstr);
case SR_UNIT_SIEMENS:
si_printf(value, out, "S");
break;
+ case SR_UNIT_DECIBEL_MW:
+ si_printf(value, out, "dBu");
+ break;
+ case SR_UNIT_DECIBEL_VOLT:
+ si_printf(value, out, "dBV");
+ break;
}
- if (mqflags & SR_MQFLAG_AC)
+ if ((mqflags & (SR_MQFLAG_AC | SR_MQFLAG_DC)) == (SR_MQFLAG_AC | SR_MQFLAG_DC))
+ g_string_append_printf(out, " AC+DC");
+ else if (mqflags & SR_MQFLAG_AC)
g_string_append_printf(out, " AC");
else if (mqflags & SR_MQFLAG_DC)
g_string_append_printf(out, " DC");
}
-static GString *recv(struct sr_output *o, const struct sr_dev_inst *sdi,
+static GString *receive(struct sr_output *o, const struct sr_dev_inst *sdi,
struct sr_datafeed_packet *packet)
{
struct sr_datafeed_analog *analog;
float *fdata;
int i, j;
+ (void)sdi;
if (!o || !o->sdi)
return NULL;
ctx = o->internal;
.description = "Analog data",
.df_type = SR_DF_ANALOG,
.init = init,
- .recv = recv,
+ .recv = receive,
.cleanup = cleanup
};