]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/demo/protocol.h
demo: optionally accept frame limit spec at scan time
[libsigrok.git] / src / hardware / demo / protocol.h
index d747d9c20f9736b18e9cd5c7c3d86292d5fbb3f6..d21d0d6a359c9a26f2cd92d42e7a63650afdd94b 100644 (file)
 #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;
-};
+/* 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.
@@ -75,24 +56,69 @@ enum {
         */
        PATTERN_INC,
 
+       /**
+        * Single bit "walking" across all logic channels by being
+        * shifted across data lines, restarting after the last line
+        * was used. An all-zero (all-one) state is inserted to prevent
+        * repetitive patterns (e.g. with 8 data lines, every 8th state
+        * would show the same line state)
+        */
+       PATTERN_WALKING_ONE,
+       PATTERN_WALKING_ZERO,
+
        /** All channels have a low logic state. */
        PATTERN_ALL_LOW,
 
        /** All channels have a high logic state. */
        PATTERN_ALL_HIGH,
-};
 
-/* Analog patterns we can generate. */
-enum {
        /**
-        * Square wave.
+        * Mimics a cable squid. Derived from the "works with" logo
+        * to occupy a larger number of channels yet "painting"
+        * something that can get recognized.
         */
+       PATTERN_SQUID,
+
+       /** Gray encoded data, like rotary encoder signals. */
+       PATTERN_GRAYCODE,
+};
+
+/* Analog patterns we can generate. */
+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;
+};
+
 static const char *analog_pattern_str[] = {
        "square",
        "sine",
@@ -101,7 +127,8 @@ static const char *analog_pattern_str[] = {
 };
 
 struct analog_gen {
-       int pattern;
+       struct sr_channel *ch;
+       enum analog_pattern_type pattern;
        float amplitude;
        float pattern_data[ANALOG_BUFSIZE];
        unsigned int num_samples;
@@ -110,7 +137,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);