]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/demo/protocol.h
demo: Get/Set measurement quantity for the analog channels.
[libsigrok.git] / src / hardware / demo / protocol.h
index 79e5d886a877149964b8c27133c3c5932b968168..de0ac7a86078d125f1925c801638249bdff37a7c 100644 (file)
@@ -5,6 +5,7 @@
  * Copyright (C) 2011 Olivier Fauchon <olivier@aixmarseille.com>
  * Copyright (C) 2012 Alexandru Gagniuc <mr.nuke.me@gmail.com>
  * Copyright (C) 2015 Bartosz Golaszewski <bgolaszewski@baylibre.com>
+ * Copyright (C) 2019 Frank Stettner <frank-stettner@gmx.net>
  *
  * 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
 #define LOGIC_BUFSIZE                  4096
 /* Size of the analog pattern space per channel. */
 #define ANALOG_BUFSIZE                 4096
-
-/* Private, per-device-instance driver context. */
-struct dev_context {
-       uint64_t cur_samplerate;
-       uint64_t limit_samples;
-       uint64_t limit_msec;
-       uint64_t sent_samples;
-       int64_t start_us;
-       int64_t spent_us;
-       uint64_t step;
-       /* Logic */
-       int32_t num_logic_channels;
-       unsigned int logic_unitsize;
-       /* There is only ever one logic channel group, so its pattern goes here. */
-       uint8_t logic_pattern;
-       unsigned char logic_data[LOGIC_BUFSIZE];
-       /* Analog */
-       int32_t num_analog_channels;
-       GHashTable *ch_ag;
-       gboolean avg; /* True if averaging is enabled */
-       uint64_t avg_samples;
-       size_t enabled_logic_channels;
-       size_t enabled_analog_channels;
-};
+/* This is a development feature: it starts a new frame every n samples. */
+#define SAMPLES_PER_FRAME              1000UL
+#define DEFAULT_LIMIT_FRAMES           0
 
 /* Logic patterns we can generate. */
-enum {
+enum logic_pattern_type {
        /**
         * Spells "sigrok" across 8 channels using '0's (with '1's as
         * "background") when displayed using the 'bits' output format.
@@ -99,19 +79,51 @@ enum {
         * something that can get recognized.
         */
        PATTERN_SQUID,
+
+       /** Gray encoded data, like rotary encoder signals. */
+       PATTERN_GRAYCODE,
 };
 
 /* Analog patterns we can generate. */
-enum {
-       /**
-        * Square wave.
-        */
+enum analog_pattern_type {
        PATTERN_SQUARE,
        PATTERN_SINE,
        PATTERN_TRIANGLE,
        PATTERN_SAWTOOTH,
 };
 
+struct dev_context {
+       uint64_t cur_samplerate;
+       uint64_t limit_samples;
+       uint64_t limit_msec;
+       uint64_t limit_frames;
+       uint64_t sent_samples;
+       uint64_t sent_frame_samples; /* Number of samples that were sent for current frame. */
+       int64_t start_us;
+       int64_t spent_us;
+       uint64_t step;
+       /* Logic */
+       int32_t num_logic_channels;
+       size_t logic_unitsize;
+       uint64_t all_logic_channels_mask;
+       /* There is only ever one logic channel group, so its pattern goes here. */
+       enum logic_pattern_type logic_pattern;
+       uint8_t logic_data[LOGIC_BUFSIZE];
+       /* Analog */
+       int32_t num_analog_channels;
+       GHashTable *ch_ag;
+       gboolean avg; /* True if averaging is enabled */
+       uint64_t avg_samples;
+       size_t enabled_logic_channels;
+       size_t enabled_analog_channels;
+       size_t first_partial_logic_index;
+       uint8_t first_partial_logic_mask;
+       /* Triggers */
+       uint64_t capture_ratio;
+       gboolean trigger_fired;
+       struct soft_trigger_logic *stl;
+};
+
 static const char *analog_pattern_str[] = {
        "square",
        "sine",
@@ -121,7 +133,10 @@ static const char *analog_pattern_str[] = {
 
 struct analog_gen {
        struct sr_channel *ch;
-       int pattern;
+       enum sr_mq mq;
+       enum sr_mqflag mq_flags;
+       enum sr_unit unit;
+       enum analog_pattern_type pattern;
        float amplitude;
        float pattern_data[ANALOG_BUFSIZE];
        unsigned int num_samples;
@@ -130,7 +145,7 @@ struct analog_gen {
        struct sr_analog_meaning meaning;
        struct sr_analog_spec spec;
        float avg_val; /* Average value */
-       unsigned num_avgs; /* Number of samples averaged */
+       unsigned int num_avgs; /* Number of samples averaged */
 };
 
 SR_PRIV void demo_generate_analog_pattern(struct analog_gen *ag, uint64_t sample_rate);