]> sigrok.org Git - libsigrok.git/blobdiff - output/output_text.c
Sigma: Move sigma state to device specific struct
[libsigrok.git] / output / output_text.c
index 99bad3800143d254ea556172c48a4ee945d2ddc4..6e2d4f08f46b0d02e1fda80b936fed0d08811b16 100644 (file)
@@ -25,7 +25,7 @@
 #include "config.h"
 
 #define DEFAULT_BPL_BITS 64
-#define DEFAULT_BPL_HEX  256
+#define DEFAULT_BPL_HEX  192
 
 struct context {
        unsigned int num_enabled_probes;
@@ -88,8 +88,9 @@ static int init(struct output *o, int default_spl)
 
        for (l = o->device->probes; l; l = l->next) {
                probe = l->data;
-               if (probe->enabled)
-                       ctx->probelist[ctx->num_enabled_probes++] = probe->name;
+               if (!probe->enabled)
+                       continue;
+               ctx->probelist[ctx->num_enabled_probes++] = probe->name;
        }
 
        ctx->probelist[ctx->num_enabled_probes] = 0;
@@ -98,9 +99,11 @@ static int init(struct output *o, int default_spl)
        ctx->spl_cnt = 0;
        ctx->mark_trigger = -1;
 
-       if (o->param && o->param[0])
+       if (o->param && o->param[0]) {
                ctx->samples_per_line = strtoul(o->param, NULL, 10);
-       else
+               if (ctx->samples_per_line < 1)
+                       return SIGROK_ERR;
+       } else
                ctx->samples_per_line = default_spl;
 
        if (!(ctx->header = malloc(512))) {
@@ -109,8 +112,8 @@ static int init(struct output *o, int default_spl)
        }
 
        snprintf(ctx->header, 511, "%s\n", PACKAGE_STRING);
+       num_probes = g_slist_length(o->device->probes);
        if (o->device->plugin) {
-               num_probes = g_slist_length(o->device->probes);
                samplerate = *((uint64_t *) o->device->plugin->get_device_info(
                                o->device->plugin_index, DI_CUR_SAMPLERATE));
                if (!(samplerate_s = sigrok_samplerate_string(samplerate))) {
@@ -125,7 +128,7 @@ static int init(struct output *o, int default_spl)
                free(samplerate_s);
        }
 
-       ctx->linebuf_len = ctx->samples_per_line * 2;
+       ctx->linebuf_len = ctx->samples_per_line * 2 + 4;
        if (!(ctx->linebuf = calloc(1, num_probes * ctx->linebuf_len))) {
                free(ctx->header);
                free(ctx);
@@ -151,6 +154,8 @@ static int event(struct output *o, int event_type, char **data_out,
        switch (event_type) {
        case DF_TRIGGER:
                ctx->mark_trigger = ctx->spl_cnt;
+               *data_out = NULL;
+               *length_out = 0;
                break;
        case DF_END:
                outsize = ctx->num_enabled_probes
@@ -163,6 +168,10 @@ static int event(struct output *o, int event_type, char **data_out,
                free(o->internal);
                o->internal = NULL;
                break;
+       default:
+               *data_out = NULL;
+               *length_out = 0;
+               break;
        }
 
        return SIGROK_OK;
@@ -178,12 +187,15 @@ static int data_bits(struct output *o, char *data_in, uint64_t length_in,
 {
        struct context *ctx;
        unsigned int outsize, offset, p;
+       int max_linelen;
        uint64_t sample;
-       char *outbuf;
+       char *outbuf, c;
 
        ctx = o->internal;
-       outsize = length_in / ctx->unitsize * ctx->num_enabled_probes *
-                 ctx->samples_per_line + 512;
+       max_linelen = MAX_PROBENAME_LEN + 3 + ctx->samples_per_line
+                       + ctx->samples_per_line / 8;
+       outsize = (1 + (length_in / ctx->unitsize) / ctx->samples_per_line)
+            * (ctx->num_enabled_probes * max_linelen);
 
        if (!(outbuf = calloc(1, outsize + 1)))
                return SIGROK_ERR_MALLOC;
@@ -201,12 +213,9 @@ static int data_bits(struct output *o, char *data_in, uint64_t length_in,
                     offset += ctx->unitsize) {
                        memcpy(&sample, data_in + offset, ctx->unitsize);
                        for (p = 0; p < ctx->num_enabled_probes; p++) {
-                               if (sample & ((uint64_t) 1 << p))
-                                       ctx->linebuf[p * ctx->linebuf_len +
-                                                    ctx->line_offset] = '1';
-                               else
-                                       ctx->linebuf[p * ctx->linebuf_len +
-                                                    ctx->line_offset] = '0';
+                               c = (sample & ((uint64_t) 1 << p)) ? '1' : '0';
+                               ctx->linebuf[p * ctx->linebuf_len +
+                                            ctx->line_offset] = c;
                        }
                        ctx->line_offset++;
                        ctx->spl_cnt++;
@@ -238,7 +247,7 @@ static int data_bits(struct output *o, char *data_in, uint64_t length_in,
 
 static int init_hex(struct output *o)
 {
-       return init(o, DEFAULT_BPL_BITS);
+       return init(o, DEFAULT_BPL_HEX);
 }
 
 static int data_hex(struct output *o, char *data_in, uint64_t length_in,
@@ -246,12 +255,15 @@ static int data_hex(struct output *o, char *data_in, uint64_t length_in,
 {
        struct context *ctx;
        unsigned int outsize, offset, p;
+       int max_linelen;
        uint64_t sample;
        char *outbuf;
 
        ctx = o->internal;
-       outsize = length_in / ctx->unitsize * ctx->num_enabled_probes *
-                 ctx->samples_per_line + 512;
+       max_linelen = MAX_PROBENAME_LEN + 3 + ctx->samples_per_line
+                       + ctx->samples_per_line / 2;
+       outsize = length_in / ctx->unitsize * ctx->num_enabled_probes
+                       / ctx->samples_per_line * max_linelen + 512;
 
        if (!(outbuf = calloc(1, outsize + 1)))
                return SIGROK_ERR_MALLOC;
@@ -300,7 +312,8 @@ static int data_hex(struct output *o, char *data_in, uint64_t length_in,
 
 struct output_format output_text_bits = {
        "bits",
-       "Text (bits)",
+       "Bits (takes argument, default 64)",
+       DF_LOGIC,
        init_bits,
        data_bits,
        event,
@@ -308,7 +321,8 @@ struct output_format output_text_bits = {
 
 struct output_format output_text_hex = {
        "hex",
-       "Text (hexadecimal)",
+       "Hexadecimal (takes argument, default 192)",
+       DF_LOGIC,
        init_hex,
        data_hex,
        event,