X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fdemo%2Fprotocol.h;h=d21d0d6a359c9a26f2cd92d42e7a63650afdd94b;hb=53ea24610e5eb0750f98ed7fccccba4de0b4b5ba;hp=d747d9c20f9736b18e9cd5c7c3d86292d5fbb3f6;hpb=2ea1fdf12113311cbe1a4316e9e2efe4d8ac40f0;p=libsigrok.git diff --git a/src/hardware/demo/protocol.h b/src/hardware/demo/protocol.h index d747d9c2..d21d0d6a 100644 --- a/src/hardware/demo/protocol.h +++ b/src/hardware/demo/protocol.h @@ -33,31 +33,12 @@ #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);