#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.
*/
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;
+ /* Triggers */
+ uint64_t capture_ratio;
+ gboolean trigger_fired;
+ struct soft_trigger_logic *stl;
+};
+
static const char *analog_pattern_str[] = {
"square",
"sine",
};
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;
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);