X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fdemo%2Fprotocol.h;h=4156f5ee539847d6c3113195061b89cd081f1e2c;hb=f6129c8f0c92e45de5d70b4101bf2bd759a5fdf7;hp=79e5d886a877149964b8c27133c3c5932b968168;hpb=1b7b72d49e5ce19593ca4b2a793bec441b4cdea4;p=libsigrok.git diff --git a/src/hardware/demo/protocol.h b/src/hardware/demo/protocol.h index 79e5d886..4156f5ee 100644 --- a/src/hardware/demo/protocol.h +++ b/src/hardware/demo/protocol.h @@ -5,6 +5,7 @@ * Copyright (C) 2011 Olivier Fauchon * Copyright (C) 2012 Alexandru Gagniuc * Copyright (C) 2015 Bartosz Golaszewski + * Copyright (C) 2019 Frank Stettner * * 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 @@ -33,33 +34,17 @@ #define LOGIC_BUFSIZE 4096 /* Size of the analog pattern space per channel. */ #define ANALOG_BUFSIZE 4096 +/* This is a development feature: it starts a new frame every n samples. */ +#define SAMPLES_PER_FRAME 1000UL +#define DEFAULT_LIMIT_FRAMES 0 -/* 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; -}; +#define DEFAULT_ANALOG_ENCODING_DIGITS 4 +#define DEFAULT_ANALOG_SPEC_DIGITS 4 +#define DEFAULT_ANALOG_AMPLITUDE 10 +#define DEFAULT_ANALOG_OFFSET 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,17 +84,18 @@ 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, + PATTERN_ANALOG_RANDOM, }; static const char *analog_pattern_str[] = { @@ -117,23 +103,64 @@ static const char *analog_pattern_str[] = { "sine", "triangle", "sawtooth", + "random", +}; + +struct analog_pattern { + float data[ANALOG_BUFSIZE]; + unsigned int num_samples; +}; + +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 */ + struct analog_pattern *analog_patterns[ARRAY_SIZE(analog_pattern_str)]; + 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; }; 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; + float offset; struct sr_datafeed_analog packet; struct sr_analog_encoding encoding; 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); +SR_PRIV void demo_generate_analog_pattern(struct dev_context *devc); SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data); #endif