]> sigrok.org Git - libsigrok.git/commitdiff
Add a sr_analog_init() API to initialize sr_datafeed_analog2 struct.
authorAurelien Jacobs <redacted>
Thu, 13 Nov 2014 23:50:46 +0000 (00:50 +0100)
committerBert Vermeulen <redacted>
Mon, 17 Nov 2014 21:04:24 +0000 (22:04 +0100)
It fills the fields with reasonable default values that should suit
most of the drivers. Drivers are obviously free to override the fields
they want after initializing.

src/analog.c
src/hardware/mic-985xx/protocol.c
src/hardware/victor-dmm/protocol.c
src/libsigrok-internal.h

index 0f7a30719153fff25c0e3f1f610b6e4bdba071cb..29fb8426204c998f0512ca22735a3113f945cb0f 100644 (file)
 
 #define LOG_PREFIX "analog"
 
+SR_PRIV int sr_analog_init(struct sr_datafeed_analog2 *analog,
+               struct sr_analog_encoding *encoding,
+               struct sr_analog_meaning *meaning,
+               struct sr_analog_spec *spec,
+               int digits)
+{
+       memset(analog, 0, sizeof(*analog));
+       memset(encoding, 0, sizeof(*encoding));
+       memset(meaning, 0, sizeof(*meaning));
+       memset(spec, 0, sizeof(*spec));
+
+       analog->encoding = encoding;
+       analog->meaning = meaning;
+       analog->spec = spec;
+
+       encoding->unitsize = sizeof(float);
+       encoding->is_float = TRUE;
+#ifdef WORDS_BIGENDIAN
+       encoding->is_bigendian = TRUE;
+#else
+       encoding->is_bigendian = FALSE;
+#endif
+       encoding->digits = digits;
+       encoding->is_digits_decimal = TRUE;
+       encoding->scale.p = 1;
+       encoding->scale.q = 1;
+       encoding->offset.p = 0;
+       encoding->offset.q = 1;
+
+       spec->spec_digits = digits;
+
+       return SR_OK;
+}
+
 SR_API int sr_analog_to_float(const struct sr_datafeed_analog2 *analog,
                float *buf)
 {
index eb9b48be8d6d24a324deb0776b81514c3ff265be..49f679802a31a2cfdf34da426ee8f163c8e24b8a 100644 (file)
@@ -111,32 +111,12 @@ static int handle_packet(const uint8_t *buf, struct sr_dev_inst *sdi, int idx)
                return SR_ERR;
        }
 
-       memset(&analog, 0, sizeof(struct sr_datafeed_analog));
-       memset(&encoding, 0, sizeof(struct sr_analog_encoding));
-       memset(&meaning, 0, sizeof(struct sr_analog_meaning));
-       memset(&spec, 0, sizeof(struct sr_analog_spec));
+       sr_analog_init(&analog, &encoding, &meaning, &spec, 3);
 
        /* Common values for both channels. */
        packet.type = SR_DF_ANALOG2;
        packet.payload = &analog;
-       analog.encoding = &encoding;
-       analog.meaning = &meaning;
-       analog.spec = &spec;
        analog.num_samples = 1;
-       encoding.unitsize = sizeof(float);
-       encoding.is_float = TRUE;
-#ifdef WORDS_BIGENDIAN
-       encoding.is_bigendian = TRUE;
-#else
-       encoding.is_bigendian = FALSE;
-#endif
-       encoding.digits = 3; /* Values are always 3-digit numbers. */
-       encoding.is_digits_decimal = TRUE;
-       encoding.scale.p = 1;
-       encoding.scale.q = 1;
-       encoding.offset.p = 0;
-       encoding.offset.q = 1;
-       spec.spec_digits = encoding.digits;
 
        /* Temperature. */
        l = g_slist_copy(sdi->channels);
index 1eaffda3e6eb72b2ba770a145a814b8431b63832..6f72d9470f1ee0b843599f77720382153f6eec5b 100644 (file)
@@ -167,10 +167,7 @@ static void decode_buf(struct sr_dev_inst *sdi, unsigned char *data)
        if (minus)
                fvalue = -fvalue;
 
-       memset(&analog, 0, sizeof(struct sr_datafeed_analog2));
-       memset(&encoding, 0, sizeof(struct sr_analog_encoding));
-       memset(&meaning, 0, sizeof(struct sr_analog_meaning));
-       memset(&spec, 0, sizeof(struct sr_analog_spec));
+       sr_analog_init(&analog, &encoding, &meaning, &spec, 4);
 
        /* Measurement mode */
        meaning.channels = sdi->channels;
@@ -259,27 +256,8 @@ static void decode_buf(struct sr_dev_inst *sdi, unsigned char *data)
        if (is_relative)
                meaning.mqflags |= SR_MQFLAG_RELATIVE;
 
-       encoding.unitsize = sizeof(float);
-       encoding.is_float = TRUE;
-#ifdef WORDS_BIGENDIAN
-       encoding.is_bigendian = TRUE;
-#else
-       encoding.is_bigendian = FALSE;
-#endif
-       encoding.digits = 4; /* Values are always 4-digit numbers. */
-       encoding.is_digits_decimal = TRUE;
-       encoding.scale.p = 1;
-       encoding.scale.q = 1;
-       encoding.offset.p = 0;
-       encoding.offset.q = 1;
-
-       spec.spec_digits = encoding.digits;
-
        analog.data = &fvalue;
        analog.num_samples = 1;
-       analog.encoding = &encoding;
-       analog.meaning = &meaning;
-       analog.spec = &spec;
 
        packet.type = SR_DF_ANALOG2;
        packet.payload = &analog;
index f98a35a87f2bc4fc8baf9aae3bcc161f6c30a9b2..bdbcb09059019bf80d48e10b7d6d2d346ffd038f 100644 (file)
@@ -603,6 +603,14 @@ SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet,
                struct sr_datafeed_packet **copy);
 SR_PRIV void sr_packet_free(struct sr_datafeed_packet *packet);
 
+/*--- analog.c --------------------------------------------------------------*/
+
+SR_PRIV int sr_analog_init(struct sr_datafeed_analog2 *analog,
+                           struct sr_analog_encoding *encoding,
+                           struct sr_analog_meaning *meaning,
+                           struct sr_analog_spec *spec,
+                           int digits);
+
 /*--- std.c -----------------------------------------------------------------*/
 
 typedef int (*dev_close_callback)(struct sr_dev_inst *sdi);