]> sigrok.org Git - libsigrok.git/blobdiff - output/output_analog.c
Add sr_ prefix to input/output structs.
[libsigrok.git] / output / output_analog.c
index 6c2901ae086a9850ab6a54ae20c98c0f847457f7..6a48a495393000f31d7880eca04d31544c1e2d2d 100644 (file)
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2010 Bert Vermeulen <bert@biot.com>
  * Copyright (C) 2011 HÃ¥vard Espeland <gus@ping.uio.no>
+ * Copyright (C) 2011 Daniel Ribeiro <drwyrm@gmail.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -47,7 +48,7 @@ struct context {
        uint8_t *linevalues;
        char *header;
        int mark_trigger;
-       uint64_t prevsample;
+//     struct analog_sample *prevsample;
        enum outputmode mode;
 };
 
@@ -88,7 +89,7 @@ static void flush_linebufs(struct context *ctx, char *outbuf)
        memset(ctx->linebuf, 0, i * ctx->linebuf_len);
 }
 
-static int init(struct output *o, int default_spl, enum outputmode mode)
+static int init(struct sr_output *o, int default_spl, enum outputmode mode)
 {
        struct context *ctx;
        struct probe *probe;
@@ -98,7 +99,7 @@ static int init(struct output *o, int default_spl, enum outputmode mode)
        char *samplerate_s;
 
        if (!(ctx = calloc(1, sizeof(struct context))))
-               return SIGROK_ERR_MALLOC;
+               return SR_ERR_MALLOC;
 
        o->internal = ctx;
        ctx->num_enabled_probes = 0;
@@ -111,7 +112,8 @@ static int init(struct output *o, int default_spl, enum outputmode mode)
        }
 
        ctx->probelist[ctx->num_enabled_probes] = 0;
-       ctx->unitsize = (ctx->num_enabled_probes + 7) / 8;
+       ctx->unitsize = sizeof(struct analog_sample) +
+               (ctx->num_enabled_probes * sizeof(struct analog_probe));
        ctx->line_offset = 0;
        ctx->spl_cnt = 0;
        ctx->mark_trigger = -1;
@@ -120,13 +122,13 @@ static int init(struct output *o, int default_spl, enum outputmode mode)
        if (o->param && o->param[0]) {
                ctx->samples_per_line = strtoul(o->param, NULL, 10);
                if (ctx->samples_per_line < 1)
-                       return SIGROK_ERR;
+                       return SR_ERR;
        } else
                ctx->samples_per_line = default_spl;
 
        if (!(ctx->header = malloc(512))) {
                free(ctx);
-               return SIGROK_ERR_MALLOC;
+               return SR_ERR_MALLOC;
        }
 
        snprintf(ctx->header, 511, "%s\n", PACKAGE_STRING);
@@ -137,7 +139,7 @@ static int init(struct output *o, int default_spl, enum outputmode mode)
                if (!(samplerate_s = sigrok_samplerate_string(samplerate))) {
                        free(ctx->header);
                        free(ctx);
-                       return SIGROK_ERR;
+                       return SR_ERR;
                }
                snprintf(ctx->header + strlen(ctx->header),
                         511 - strlen(ctx->header),
@@ -150,18 +152,18 @@ static int init(struct output *o, int default_spl, enum outputmode mode)
        if (!(ctx->linebuf = calloc(1, num_probes * ctx->linebuf_len))) {
                free(ctx->header);
                free(ctx);
-               return SIGROK_ERR_MALLOC;
+               return SR_ERR_MALLOC;
        }
        if (!(ctx->linevalues = calloc(1, num_probes))) {
                free(ctx->header);
                free(ctx);
-               return SIGROK_ERR_MALLOC;
+               return SR_ERR_MALLOC;
        }
 
-       return SIGROK_OK;
+       return SR_OK;
 }
 
-static int event(struct output *o, int event_type, char **data_out,
+static int event(struct sr_output *o, int event_type, char **data_out,
                 uint64_t *length_out)
 {
        struct context *ctx;
@@ -179,7 +181,7 @@ static int event(struct output *o, int event_type, char **data_out,
                outsize = ctx->num_enabled_probes
                                * (ctx->samples_per_line + 20) + 512;
                if (!(outbuf = calloc(1, outsize)))
-                       return SIGROK_ERR_MALLOC;
+                       return SR_ERR_MALLOC;
                flush_linebufs(ctx, outbuf);
                *data_out = outbuf;
                *length_out = strlen(outbuf);
@@ -192,21 +194,21 @@ static int event(struct output *o, int event_type, char **data_out,
                break;
        }
 
-       return SIGROK_OK;
+       return SR_OK;
 }
 
-static int init_bits(struct output *o)
+static int init_bits(struct sr_output *o)
 {
        return init(o, DEFAULT_BPL_BITS, MODE_BITS);
 }
 
-static int data_bits(struct output *o, char *data_in, uint64_t length_in,
+static int data_bits(struct sr_output *o, char *data_in, uint64_t length_in,
                     char **data_out, uint64_t *length_out)
 {
        struct context *ctx;
        unsigned int outsize, offset, p;
        int max_linelen;
-       uint64_t sample;
+       struct analog_sample *sample;
        char *outbuf, c;
 
        ctx = o->internal;
@@ -220,7 +222,7 @@ static int data_bits(struct output *o, char *data_in, uint64_t length_in,
             * (ctx->num_enabled_probes * max_linelen);
 
        if (!(outbuf = calloc(1, outsize + 1)))
-               return SIGROK_ERR_MALLOC;
+               return SR_ERR_MALLOC;
 
        outbuf[0] = '\0';
        if (ctx->header) {
@@ -230,16 +232,26 @@ static int data_bits(struct output *o, char *data_in, uint64_t length_in,
                ctx->header = NULL;
 
                /* Ensure first transition. */
-               memcpy(&ctx->prevsample, data_in, ctx->unitsize);
-               ctx->prevsample = ~ctx->prevsample;
+//             memcpy(&ctx->prevsample, data_in, ctx->unitsize);
+//             ctx->prevsample = ~ctx->prevsample;
        }
 
        if (length_in >= ctx->unitsize) {
                for (offset = 0; offset <= length_in - ctx->unitsize;
                     offset += ctx->unitsize) {
-                       memcpy(&sample, data_in + offset, ctx->unitsize);
+                       sample = (struct analog_sample *) (data_in + offset);
                        for (p = 0; p < ctx->num_enabled_probes; p++) {
-                               c = (sample & ((uint64_t) 1 << p)) ? '1' : '0';
+                               int val = sample->probes[p].val;
+                               int res = sample->probes[p].res;
+                               if (res == 1)
+                                       c = '0' + (val & ((1 << res) - 1));
+                               else
+                                       /*
+                                        * Scale analog resolution down so it
+                                        * fits 25 letters
+                                        */
+                                       c = 'A' + (((val & ((1 << res) - 1)) /
+                                                       (res * res)) / 10);
                                ctx->linebuf[p * ctx->linebuf_len +
                                             ctx->line_offset] = c;
                        }
@@ -268,15 +280,15 @@ static int data_bits(struct output *o, char *data_in, uint64_t length_in,
        *data_out = outbuf;
        *length_out = strlen(outbuf);
 
-       return SIGROK_OK;
+       return SR_OK;
 }
-
-static int init_hex(struct output *o)
+#if 0
+static int init_hex(struct sr_output *o)
 {
        return init(o, DEFAULT_BPL_HEX, MODE_HEX);
 }
 
-static int data_hex(struct output *o, char *data_in, uint64_t length_in,
+static int data_hex(struct sr_output *o, char *data_in, uint64_t length_in,
                    char **data_out, uint64_t *length_out)
 {
        struct context *ctx;
@@ -292,7 +304,7 @@ static int data_hex(struct output *o, char *data_in, uint64_t length_in,
                        / ctx->samples_per_line * max_linelen + 512;
 
        if (!(outbuf = calloc(1, outsize + 1)))
-               return SIGROK_ERR_MALLOC;
+               return SR_ERR_MALLOC;
 
        outbuf[0] = '\0';
        if (ctx->header) {
@@ -333,15 +345,15 @@ static int data_hex(struct output *o, char *data_in, uint64_t length_in,
        *data_out = outbuf;
        *length_out = strlen(outbuf);
 
-       return SIGROK_OK;
+       return SR_OK;
 }
 
-static int init_ascii(struct output *o)
+static int init_ascii(struct sr_output *o)
 {
        return init(o, DEFAULT_BPL_ASCII, MODE_ASCII);
 }
 
-static int data_ascii(struct output *o, char *data_in, uint64_t length_in,
+static int data_ascii(struct sr_output *o, char *data_in, uint64_t length_in,
                     char **data_out, uint64_t *length_out)
 {
        struct context *ctx;
@@ -361,7 +373,7 @@ static int data_ascii(struct output *o, char *data_in, uint64_t length_in,
             * (ctx->num_enabled_probes * max_linelen);
 
        if (!(outbuf = calloc(1, outsize + 1)))
-               return SIGROK_ERR_MALLOC;
+               return SR_ERR_MALLOC;
 
        outbuf[0] = '\0';
        if (ctx->header) {
@@ -422,33 +434,34 @@ static int data_ascii(struct output *o, char *data_in, uint64_t length_in,
        *data_out = outbuf;
        *length_out = strlen(outbuf);
 
-       return SIGROK_OK;
+       return SR_OK;
 }
+#endif
 
-
-struct output_format output_text_bits = {
-       "bits",
+struct sr_output_format output_analog_bits = {
+       "analog_bits",
        "Bits (takes argument, default 64)",
-       DF_LOGIC,
+       DF_ANALOG,
        init_bits,
        data_bits,
        event,
 };
-
-struct output_format output_text_hex = {
-       "hex",
+#if 0
+struct sr_output_format output_analog_hex = {
+       "analog_hex",
        "Hexadecimal (takes argument, default 192)",
-       DF_LOGIC,
+       DF_ANALOG,
        init_hex,
        data_hex,
        event,
 };
 
-struct output_format output_text_ascii = {
-       "ascii",
+struct sr_output_format output_analog_ascii = {
+       "analog_ascii",
        "ASCII (takes argument, default 74)",
-       DF_LOGIC,
+       DF_ANALOG,
        init_ascii,
        data_ascii,
        event,
 };
+#endif