libsigrok.h 32.9 KB
Newer Older
DreamSourceLab's avatar
DreamSourceLab committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * This file is part of the libsigrok project.
 *
 * Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
 *
 * 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
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef LIBSIGROK_SIGROK_H
#define LIBSIGROK_SIGROK_H

DreamSourceLab's avatar
DreamSourceLab committed
23 24
#include <sys/time.h>

DreamSourceLab's avatar
DreamSourceLab committed
25 26 27 28 29
#include <stdio.h>
#include <sys/time.h>
#include <stdint.h>
#include <inttypes.h>
#include <glib.h>
Andy Dneg's avatar
Andy Dneg committed
30
#include <zip.h>
DreamSourceLab's avatar
DreamSourceLab committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @file
 *
 * The public libsigrok header file to be used by frontends.
 *
 * This is the only file that libsigrok users (frontends) are supposed to
 * use and \#include. There are other header files which get installed with
 * libsigrok, but those are not meant to be used directly by frontends.
 *
 * The correct way to get/use the libsigrok API functions is:
 *
 * @code{.c}
 *   #include <libsigrok/libsigrok.h>
 * @endcode
 */

/*
 * All possible return codes of libsigrok functions must be listed here.
 * Functions should never return hardcoded numbers as status, but rather
 * use these enum values. All error codes are negative numbers.
 *
 * The error codes are globally unique in libsigrok, i.e. if one of the
 * libsigrok functions returns a "malloc error" it must be exactly the same
 * return value as used by all other functions to indicate "malloc error".
 * There must be no functions which indicate two different errors via the
 * same return code.
 *
 * Also, for compatibility reasons, no defined return codes are ever removed
 * or reused for different errors later. You can only add new entries and
 * return codes, but never remove or redefine existing ones.
 */

/** Status/error codes returned by libsigrok functions. */
enum {
	SR_OK             =  0, /**< No error. */
	SR_ERR            = -1, /**< Generic/unspecified error. */
	SR_ERR_MALLOC     = -2, /**< Malloc/calloc/realloc error. */
	SR_ERR_ARG        = -3, /**< Function argument error. */
	SR_ERR_BUG        = -4, /**< Errors hinting at internal bugs. */
	SR_ERR_SAMPLERATE = -5, /**< Incorrect samplerate. */
	SR_ERR_NA         = -6, /**< Not applicable. */
	SR_ERR_DEV_CLOSED = -7, /**< Device is closed, but needs to be open. */

	/*
	 * Note: When adding entries here, don't forget to also update the
	 * sr_strerror() and sr_strerror_name() functions in error.c.
	 */
};

/* Handy little macros */
#define SR_HZ(n)  (n)
#define SR_KHZ(n) ((n) * (uint64_t)(1000ULL))
#define SR_MHZ(n) ((n) * (uint64_t)(1000000ULL))
#define SR_GHZ(n) ((n) * (uint64_t)(1000000000ULL))

#define SR_HZ_TO_NS(n) ((uint64_t)(1000000000ULL) / (n))

93 94 95 96 97 98 99 100 101 102 103 104 105
#define SR_NS(n)   (n)
#define SR_US(n)   ((n) * (uint64_t)(1000ULL))
#define SR_MS(n)   ((n) * (uint64_t)(1000000ULL))
#define SR_SEC(n)  ((n) * (uint64_t)(1000000000ULL))
#define SR_MIN(n)  ((n) * (uint64_t)(60000000000ULL))
#define SR_HOUR(n) ((n) * (uint64_t)(3600000000000ULL))
#define SR_DAY(n)  ((n) * (uint64_t)(86400000000000ULL))

#define SR_n(n)  (n)
#define SR_Kn(n) ((n) * (uint64_t)(1000ULL))
#define SR_Mn(n) ((n) * (uint64_t)(1000000ULL))
#define SR_Gn(n) ((n) * (uint64_t)(1000000000ULL))

106 107 108 109 110
#define SR_B(n)  (n)
#define SR_KB(n) ((n) * (uint64_t)(1024ULL))
#define SR_MB(n) ((n) * (uint64_t)(1048576ULL))
#define SR_GB(n) ((n) * (uint64_t)(1073741824ULL))

111 112 113 114 115
#define SR_mV(n) (n)
#define SR_V(n)  ((n) * (uint64_t)(1000ULL))
#define SR_KV(n) ((n) * (uint64_t)(1000000ULL))
#define SR_MV(n) ((n) * (uint64_t)(1000000000ULL))

DreamSourceLab's avatar
DreamSourceLab committed
116
#define SR_MAX_PROBENAME_LEN 32
117
#define DS_MAX_ANALOG_PROBES_NUM 4
DreamSourceLab's avatar
DreamSourceLab committed
118 119 120 121
#define DS_MAX_DSO_PROBES_NUM 2
#define TriggerStages 16
#define TriggerProbes 16
#define TriggerCountBits 16
122
#define STriggerDataStage 3
DreamSourceLab's avatar
DreamSourceLab committed
123 124 125 126

#define DS_CONF_DSO_HDIVS 10
#define DS_CONF_DSO_VDIVS 10

127
#define DS_MAX_TRIG_PERCENT 90
128 129 130 131
/*
 * Oscilloscope
 */
#define MAX_TIMEBASE SR_SEC(10)
132
#define MIN_TIMEBASE SR_NS(10)
133

134
extern char DS_RES_PATH[256];
135

DreamSourceLab's avatar
DreamSourceLab committed
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
/** libsigrok loglevels. */
enum {
	SR_LOG_NONE = 0, /**< Output no messages at all. */
	SR_LOG_ERR  = 1, /**< Output error messages. */
	SR_LOG_WARN = 2, /**< Output warnings. */
	SR_LOG_INFO = 3, /**< Output informational messages. */
	SR_LOG_DBG  = 4, /**< Output debug messages. */
	SR_LOG_SPEW = 5, /**< Output very noisy debug messages. */
};

/*
 * Use SR_API to mark public API symbols, and SR_PRIV for private symbols.
 *
 * Variables and functions marked 'static' are private already and don't
 * need SR_PRIV. However, functions which are not static (because they need
 * to be used in other libsigrok-internal files) but are also not meant to
 * be part of the public libsigrok API, must use SR_PRIV.
 *
 * This uses the 'visibility' feature of gcc (requires gcc >= 4.0).
 *
 * This feature is not available on MinGW/Windows, as it is a feature of
 * ELF files and MinGW/Windows uses PE files.
 *
 * Details: http://gcc.gnu.org/wiki/Visibility
 */

/* Marks public libsigrok API symbols. */
#ifndef _WIN32
#define SR_API __attribute__((visibility("default")))
#else
#define SR_API
#endif

/* Marks private, non-public libsigrok symbols (not part of the API). */
#ifndef _WIN32
#define SR_PRIV __attribute__((visibility("hidden")))
#else
#define SR_PRIV
#endif

/** Data types used by sr_config_info(). */
enum {
	SR_T_UINT64 = 10000,
179 180
    SR_T_UINT8,
    SR_T_CHAR,
DreamSourceLab's avatar
DreamSourceLab committed
181 182 183 184 185 186 187 188 189 190 191 192 193 194
	SR_T_BOOL,
	SR_T_FLOAT,
	SR_T_RATIONAL_PERIOD,
	SR_T_RATIONAL_VOLT,
	SR_T_KEYVALUE,
};

/** Value for sr_datafeed_packet.type. */
enum {
	SR_DF_HEADER = 10000,
	SR_DF_END,
	SR_DF_META,
	SR_DF_TRIGGER,
	SR_DF_LOGIC,
195
    SR_DF_DSO,
DreamSourceLab's avatar
DreamSourceLab committed
196 197 198
	SR_DF_ANALOG,
	SR_DF_FRAME_BEGIN,
	SR_DF_FRAME_END,
199
    SR_DF_OVERFLOW,
DreamSourceLab's avatar
DreamSourceLab committed
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
};

/** Values for sr_datafeed_analog.mq. */
enum {
	SR_MQ_VOLTAGE = 10000,
	SR_MQ_CURRENT,
	SR_MQ_RESISTANCE,
	SR_MQ_CAPACITANCE,
	SR_MQ_TEMPERATURE,
	SR_MQ_FREQUENCY,
	SR_MQ_DUTY_CYCLE,
	SR_MQ_CONTINUITY,
	SR_MQ_PULSE_WIDTH,
	SR_MQ_CONDUCTANCE,
	/** Electrical power, usually in W, or dBm. */
	SR_MQ_POWER,
	/** Gain (a transistor's gain, or hFE, for example). */
	SR_MQ_GAIN,
	/** Logarithmic representation of sound pressure relative to a
	 * reference value. */
	SR_MQ_SOUND_PRESSURE_LEVEL,
	SR_MQ_CARBON_MONOXIDE,
	SR_MQ_RELATIVE_HUMIDITY,
};

/** Values for sr_datafeed_analog.unit. */
enum {
	SR_UNIT_VOLT = 10000,
	SR_UNIT_AMPERE,
	SR_UNIT_OHM,
	SR_UNIT_FARAD,
	SR_UNIT_KELVIN,
	SR_UNIT_CELSIUS,
	SR_UNIT_FAHRENHEIT,
	SR_UNIT_HERTZ,
	SR_UNIT_PERCENTAGE,
	SR_UNIT_BOOLEAN,
	SR_UNIT_SECOND,
	/** Unit of conductance, the inverse of resistance. */
	SR_UNIT_SIEMENS,
	/**
	 * An absolute measurement of power, in decibels, referenced to
	 * 1 milliwatt (dBu).
	 */
	SR_UNIT_DECIBEL_MW,
	/** Voltage in decibel, referenced to 1 volt (dBV). */
	SR_UNIT_DECIBEL_VOLT,
	/**
	 * Measurements that intrinsically do not have units attached, such
	 * as ratios, gains, etc. Specifically, a transistor's gain (hFE) is
	 * a unitless quantity, for example.
	 */
	SR_UNIT_UNITLESS,
	/** Sound pressure level relative so 20 micropascals. */
	SR_UNIT_DECIBEL_SPL,
	/**
	 * Normalized (0 to 1) concentration of a substance or compound with 0
	 * representing a concentration of 0%, and 1 being 100%. This is
	 * represented as the fraction of number of particles of the substance.
	 */
	SR_UNIT_CONCENTRATION,
};

/** Values for sr_datafeed_analog.flags. */
enum {
	/** Voltage measurement is alternating current (AC). */
	SR_MQFLAG_AC = 0x01,
	/** Voltage measurement is direct current (DC). */
	SR_MQFLAG_DC = 0x02,
	/** This is a true RMS measurement. */
	SR_MQFLAG_RMS = 0x04,
	/** Value is voltage drop across a diode, or NAN. */
	SR_MQFLAG_DIODE = 0x08,
	/** Device is in "hold" mode (repeating the last measurement). */
	SR_MQFLAG_HOLD = 0x10,
	/** Device is in "max" mode, only updating upon a new max value. */
	SR_MQFLAG_MAX = 0x20,
	/** Device is in "min" mode, only updating upon a new min value. */
	SR_MQFLAG_MIN = 0x40,
	/** Device is in autoranging mode. */
	SR_MQFLAG_AUTORANGE = 0x80,
	/** Device is in relative mode. */
	SR_MQFLAG_RELATIVE = 0x100,
	/** Sound pressure level is A-weighted in the frequency domain,
	 * according to IEC 61672:2003. */
	SR_MQFLAG_SPL_FREQ_WEIGHT_A = 0x200,
	/** Sound pressure level is C-weighted in the frequency domain,
	 * according to IEC 61672:2003. */
	SR_MQFLAG_SPL_FREQ_WEIGHT_C = 0x400,
	/** Sound pressure level is Z-weighted (i.e. not at all) in the
	 * frequency domain, according to IEC 61672:2003. */
	SR_MQFLAG_SPL_FREQ_WEIGHT_Z = 0x800,
	/** Sound pressure level is not weighted in the frequency domain,
	 * albeit without standards-defined low and high frequency limits. */
	SR_MQFLAG_SPL_FREQ_WEIGHT_FLAT = 0x1000,
	/** Sound pressure level measurement is S-weighted (1s) in the
	 * time domain. */
	SR_MQFLAG_SPL_TIME_WEIGHT_S = 0x2000,
	/** Sound pressure level measurement is F-weighted (125ms) in the
	 * time domain. */
	SR_MQFLAG_SPL_TIME_WEIGHT_F = 0x4000,
	/** Sound pressure level is time-averaged (LAT), also known as
	 * Equivalent Continuous A-weighted Sound Level (LEQ). */
	SR_MQFLAG_SPL_LAT = 0x8000,
	/** Sound pressure level represented as a percentage of measurements
	 * that were over a preset alarm level. */
	SR_MQFLAG_SPL_PCT_OVER_ALARM = 0x10000,
};

309 310 311 312
enum DSO_MEASURE_TYPE {
    DSO_MS_BEGIN = 0,
    DSO_MS_FREQ,
    DSO_MS_PERD,
Andy Dneg's avatar
Andy Dneg committed
313 314 315 316 317 318 319 320 321 322 323
    DSO_MS_PDUT,
    DSO_MS_NDUT,
    DSO_MS_PCNT,
    DSO_MS_RISE,
    DSO_MS_FALL,
    DSO_MS_PWDT,
    DSO_MS_NWDT,
    DSO_MS_BRST,
    DSO_MS_AMPT,
    DSO_MS_VHIG,
    DSO_MS_VLOW,
324 325 326
    DSO_MS_VRMS,
    DSO_MS_VMEA,
    DSO_MS_VP2P,
Andy Dneg's avatar
Andy Dneg committed
327 328 329 330
    DSO_MS_VMAX,
    DSO_MS_VMIN,
    DSO_MS_POVR,
    DSO_MS_NOVR,
331 332 333
    DSO_MS_END,
};

334 335 336 337 338 339
enum {
    SR_PKT_OK,
    SR_PKT_SOURCE_ERROR,
    SR_PKT_DATA_ERROR,
};

DreamSourceLab's avatar
DreamSourceLab committed
340 341 342 343
struct sr_context;

struct sr_datafeed_packet {
	uint16_t type;
344
    uint16_t status;
DreamSourceLab's avatar
DreamSourceLab committed
345 346 347 348 349 350 351 352 353 354 355 356
	const void *payload;
};

struct sr_datafeed_header {
	int feed_version;
	struct timeval starttime;
};

struct sr_datafeed_meta {
	GSList *config;
};

357 358 359 360 361
enum LA_DATA_FORMAT {
    LA_CROSS_DATA,
    LA_SPLIT_DATA,
};

DreamSourceLab's avatar
DreamSourceLab committed
362 363
struct sr_datafeed_logic {
	uint64_t length;
364 365 366 367 368
    /** data format */
    int format;
    /** for LA_SPLIT_DATA, indicate the channel index */
    uint16_t index;
    uint16_t order;
DreamSourceLab's avatar
DreamSourceLab committed
369 370
	uint16_t unitsize;
    uint16_t data_error;
371
    uint64_t error_pattern;
DreamSourceLab's avatar
DreamSourceLab committed
372 373 374
	void *data;
};

375 376 377 378 379 380 381 382 383 384
struct sr_datafeed_dso {
    /** The probes for which data is included in this packet. */
    GSList *probes;
    int num_samples;
    /** Measured quantity (voltage, current, temperature, and so on). */
    int mq;
    /** Unit in which the MQ is measured. */
    int unit;
    /** Bitmap with extra information about the MQ. */
    uint64_t mqflags;
385 386
    /** samplerate different from last packet */
    gboolean samplerate_tog;
387 388
    /** trig flag */
    gboolean trig_flag;
389 390
    /** The analog value(s). The data is interleaved according to
     * the probes list. */
391
    void *data;
392 393
};

DreamSourceLab's avatar
DreamSourceLab committed
394 395 396 397
struct sr_datafeed_analog {
	/** The probes for which data is included in this packet. */
	GSList *probes;
	int num_samples;
398 399 400 401
    /** How many bits for each sample */
    uint8_t unit_bits;
    /** Interval between two valid samples */
    uint16_t unit_pitch;
DreamSourceLab's avatar
DreamSourceLab committed
402 403 404 405 406 407 408 409
	/** Measured quantity (voltage, current, temperature, and so on). */
	int mq;
	/** Unit in which the MQ is measured. */
	int unit;
	/** Bitmap with extra information about the MQ. */
	uint64_t mqflags;
	/** The analog value(s). The data is interleaved according to
	 * the probes list. */
410
    void *data;
DreamSourceLab's avatar
DreamSourceLab committed
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
};

/** Input (file) format struct. */
struct sr_input {
	/**
	 * A pointer to this input format's 'struct sr_input_format'.
	 * The frontend can use this to call the module's callbacks.
	 */
	struct sr_input_format *format;

	GHashTable *param;

	struct sr_dev_inst *sdi;

	void *internal;
};

struct sr_input_format {
	/** The unique ID for this input format. Must not be NULL. */
	char *id;

	/**
	 * A short description of the input format, which can (for example)
	 * be displayed to the user by frontends. Must not be NULL.
	 */
	char *description;

	/**
	 * Check if this input module can load and parse the specified file.
	 *
	 * @param filename The name (and path) of the file to check.
	 *
	 * @return TRUE if this module knows the format, FALSE if it doesn't.
	 */
	int (*format_match) (const char *filename);

	/**
	 * Initialize the input module.
	 *
	 * @param in A pointer to a valid 'struct sr_input' that the caller
	 *           has to allocate and provide to this function. It is also
	 *           the responsibility of the caller to free it later.
	 * @param filename The name (and path) of the file to use.
	 *
	 * @return SR_OK upon success, a negative error code upon failure.
	 */
	int (*init) (struct sr_input *in, const char *filename);

	/**
	 * Load a file, parsing the input according to the file's format.
461
     *
DreamSourceLab's avatar
DreamSourceLab committed
462 463 464 465 466 467 468 469 470 471 472 473 474 475
	 * This function will send datafeed packets to the session bus, so
	 * the calling frontend must have registered its session callbacks
	 * beforehand.
	 *
	 * The packet types sent across the session bus by this function must
	 * include at least SR_DF_HEADER, SR_DF_END, and an appropriate data
	 * type such as SR_DF_LOGIC. It may also send a SR_DF_TRIGGER packet
	 * if appropriate.
	 *
	 * @param in A pointer to a valid 'struct sr_input' that the caller
	 *           has to allocate and provide to this function. It is also
	 *           the responsibility of the caller to free it later.
	 * @param filename The name (and path) of the file to use.
	 *
476
     * @return SR_OK upon succcess, a negative error code upon failure.
DreamSourceLab's avatar
DreamSourceLab committed
477 478 479 480 481 482 483 484 485 486
	 */
	int (*loadfile) (struct sr_input *in, const char *filename);
};

/** Output (file) format struct. */
struct sr_output {
	/**
	 * A pointer to this output format's 'struct sr_output_format'.
	 * The frontend can use this to call the module's callbacks.
	 */
DreamSourceLab's avatar
DreamSourceLab committed
487
    const struct sr_output_module *module;
DreamSourceLab's avatar
DreamSourceLab committed
488 489 490 491 492

	/**
	 * The device for which this output module is creating output. This
	 * can be used by the module to find out probe names and numbers.
	 */
DreamSourceLab's avatar
DreamSourceLab committed
493
    const struct sr_dev_inst *sdi;
DreamSourceLab's avatar
DreamSourceLab committed
494 495 496 497 498 499 500 501 502 503 504 505 506 507 508

	/**
	 * An optional parameter which the frontend can pass in to the
	 * output module. How the string is interpreted is entirely up to
	 * the module.
	 */
	char *param;

	/**
	 * A generic pointer which can be used by the module to keep internal
	 * state between calls into its callback functions.
	 *
	 * For example, the module might store a pointer to a chunk of output
	 * there, and only flush it when it reaches a certain size.
	 */
509
	void *priv;
DreamSourceLab's avatar
DreamSourceLab committed
510 511
};

512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527
/** Generic option struct used by various subsystems. */
struct sr_option {
	/* Short name suitable for commandline usage, [a-z0-9-]. */
	char *id;
	/* Short name suitable for GUI usage, can contain UTF-8. */
	char *name;
	/* Description of the option, in a sentence. */
	char *desc;
	/* Default value for this option. */
	GVariant *def;
	/* List of possible values, if this is an option with few values. */
	GSList *values;
};

/** Output module driver. */
struct sr_output_module {
DreamSourceLab's avatar
DreamSourceLab committed
528
	/**
529 530
	 * A unique ID for this output module, suitable for use in command-line
	 * clients, [a-z0-9-]. Must not be NULL.
DreamSourceLab's avatar
DreamSourceLab committed
531 532 533 534
	 */
	char *id;

	/**
535 536 537 538 539 540 541
	 * A unique name for this output module, suitable for use in GUI
	 * clients, can contain UTF-8. Must not be NULL.
	 */
	const char *name;

	/**
	 * A short description of the output module. Must not be NULL.
DreamSourceLab's avatar
DreamSourceLab committed
542 543
	 *
	 * This can be displayed by frontends, e.g. when selecting the output
544
	 * module for saving a file.
DreamSourceLab's avatar
DreamSourceLab committed
545
	 */
546
	char *desc;
DreamSourceLab's avatar
DreamSourceLab committed
547

548 549 550 551 552 553 554 555 556 557 558 559
	/**
	 * A NULL terminated array of strings containing a list of file name
	 * extensions typical for the input file format, or NULL if there is
	 * no typical extension for this file format.
	 */
	const char *const *exts;

	/**
	 * Returns a NULL-terminated list of options this module can take.
	 * Can be NULL, if the module has no options.
	 */
	const struct sr_option *(*options) (void);
DreamSourceLab's avatar
DreamSourceLab committed
560 561 562 563 564 565 566 567 568 569 570 571 572

	/**
	 * This function is called once, at the beginning of an output stream.
	 *
	 * The device struct will be available in the output struct passed in,
	 * as well as the param field -- which may be NULL or an empty string,
	 * if no parameter was passed.
	 *
	 * The module can use this to initialize itself, create a struct for
	 * keeping state and storing it in the <code>internal</code> field.
	 *
	 * @param o Pointer to the respective 'struct sr_output'.
	 *
573 574
	 * @retval SR_OK Success
	 * @retval other Negative error code.
DreamSourceLab's avatar
DreamSourceLab committed
575
	 */
576
	int (*init) (struct sr_output *o, GHashTable *options);
DreamSourceLab's avatar
DreamSourceLab committed
577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592

	/**
	 * This function is passed a copy of every packed in the data feed.
	 * Any output generated by the output module in response to the
	 * packet should be returned in a newly allocated GString
	 * <code>out</code>, which will be freed by the caller.
	 *
	 * Packets not of interest to the output module can just be ignored,
	 * and the <code>out</code> parameter set to NULL.
	 *
	 * @param o Pointer to the respective 'struct sr_output'.
	 * @param sdi The device instance that generated the packet.
	 * @param packet The complete packet.
	 * @param out A pointer where a GString * should be stored if
	 * the module generates output, or NULL if not.
	 *
593 594
	 * @retval SR_OK Success
	 * @retval other Negative error code.
DreamSourceLab's avatar
DreamSourceLab committed
595
	 */
596
	int (*receive) (const struct sr_output *o,
DreamSourceLab's avatar
DreamSourceLab committed
597 598 599 600 601 602 603
			const struct sr_datafeed_packet *packet, GString **out);

	/**
	 * This function is called after the caller is finished using
	 * the output module, and can be used to free any internal
	 * resources the module may keep.
	 *
604 605
	 * @retval SR_OK Success
	 * @retval other Negative error code.
DreamSourceLab's avatar
DreamSourceLab committed
606 607 608 609
	 */
	int (*cleanup) (struct sr_output *o);
};

610

611
enum CHANNEL_TYPE {
Andy Dneg's avatar
Andy Dneg committed
612 613
    SR_CHANNEL_DECODER = 9998,
    SR_CHANNEL_GROUP = 9999,
DreamSourceLab's avatar
DreamSourceLab committed
614 615 616
    SR_CHANNEL_LOGIC = 10000,
    SR_CHANNEL_DSO,
    SR_CHANNEL_ANALOG,
DreamSourceLab's avatar
DreamSourceLab committed
617
    SR_CHANNEL_FFT,
Andy Dneg's avatar
Andy Dneg committed
618 619
    SR_CHANNEL_LISSAJOUS,
    SR_CHANNEL_MATH,
DreamSourceLab's avatar
DreamSourceLab committed
620 621
};

622
enum OPERATION_MODE {
DreamSourceLab's avatar
DreamSourceLab committed
623
    LOGIC = 0,
624 625
    DSO = 1,
    ANALOG = 2,
DreamSourceLab's avatar
DreamSourceLab committed
626 627
};

DreamSourceLab's avatar
DreamSourceLab committed
628 629
struct sr_channel {
    /* The index field will go: use g_slist_length(sdi->channels) instead. */
DreamSourceLab's avatar
DreamSourceLab committed
630
    uint16_t index;
DreamSourceLab's avatar
DreamSourceLab committed
631
    int type;
DreamSourceLab's avatar
DreamSourceLab committed
632 633 634
	gboolean enabled;
	char *name;
	char *trigger;
Andy Dneg's avatar
Andy Dneg committed
635
    uint8_t bits;
DreamSourceLab's avatar
DreamSourceLab committed
636
    uint64_t vdiv;
Andy Dneg's avatar
Andy Dneg committed
637 638 639 640
    uint64_t vfactor;
    uint16_t offset;
    uint16_t zero_offset;
    uint16_t hw_offset;
641
    uint16_t vpos_trans;
DreamSourceLab's avatar
DreamSourceLab committed
642
    uint8_t coupling;
DreamSourceLab's avatar
DreamSourceLab committed
643
    uint8_t trig_value;
644 645
    int8_t comb_diff_top;
    int8_t comb_diff_bom;
Andy Dneg's avatar
Andy Dneg committed
646 647 648
    int8_t comb_comp;

    gboolean map_default;
649 650 651
    const char *map_unit;
    double map_min;
    double map_max;
652
    struct DSL_vga *vga_ptr;
DreamSourceLab's avatar
DreamSourceLab committed
653 654 655 656 657 658 659 660 661 662
};

/** Structure for groups of channels that have common properties. */
struct sr_channel_group {
    /** Name of the channel group. */
    char *name;
    /** List of sr_channel structs of the channels belonging to this group. */
    GSList *channels;
    /** Private data for driver use. */
    void *priv;
DreamSourceLab's avatar
DreamSourceLab committed
663 664 665 666 667 668 669 670 671 672 673 674
};

struct sr_config {
	int key;
	GVariant *data;
};

struct sr_config_info {
	int key;
	int datatype;
	char *id;
	char *name;
675
    char *label;
Andy Dneg's avatar
Andy Dneg committed
676
    char *label_cn;
DreamSourceLab's avatar
DreamSourceLab committed
677 678 679
	char *description;
};

DreamSourceLab's avatar
DreamSourceLab committed
680 681 682 683 684 685 686 687 688 689 690
enum {
    SR_STATUS_TRIG_BEGIN = 0,
    SR_STATUS_TRIG_END = 4,
    SR_STATUS_CH0_BEGIN = 5,
    SR_STATUS_CH0_END = 14,
    SR_STATUS_CH1_BEGIN = 15,
    SR_STATUS_CH1_END = 24,
    SR_STATUS_ZERO_BEGIN = 128,
    SR_STATUS_ZERO_END = 135,
};

DreamSourceLab's avatar
DreamSourceLab committed
691 692 693 694 695 696
struct sr_status {
    uint8_t trig_hit;
    uint8_t captured_cnt3;
    uint8_t captured_cnt2;
    uint8_t captured_cnt1;
    uint8_t captured_cnt0;
DreamSourceLab's avatar
DreamSourceLab committed
697

Andy Dneg's avatar
Andy Dneg committed
698
    uint16_t pkt_id;
699
    uint32_t vlen;
DreamSourceLab's avatar
DreamSourceLab committed
700
    gboolean stream_mode;
Andy Dneg's avatar
Andy Dneg committed
701
    gboolean measure_valid;
DreamSourceLab's avatar
DreamSourceLab committed
702
    uint32_t sample_divider;
703
    gboolean sample_divider_tog;
704 705
    gboolean trig_flag;

Andy Dneg's avatar
Andy Dneg committed
706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
    uint8_t ch0_max;
    uint8_t ch0_min;
    uint32_t ch0_cyc_cnt;
    uint32_t ch0_cyc_tlen;
    uint32_t ch0_cyc_plen;
    uint32_t ch0_cyc_llen;
    gboolean ch0_level_valid;
    gboolean ch0_plevel;
    uint8_t ch0_low_level;
    uint8_t ch0_high_level;
    uint32_t ch0_cyc_rlen;
    uint32_t ch0_cyc_flen;
    uint64_t ch0_acc_square;
    uint32_t ch0_acc_mean;

    uint8_t ch1_max;
    uint8_t ch1_min;
    uint32_t ch1_cyc_cnt;
    uint32_t ch1_cyc_tlen;
    uint32_t ch1_cyc_plen;
    uint32_t ch1_cyc_llen;
    gboolean ch1_level_valid;
    gboolean ch1_plevel;
    uint8_t ch1_low_level;
    uint8_t ch1_high_level;
    uint32_t ch1_cyc_rlen;
    uint32_t ch1_cyc_flen;
    uint64_t ch1_acc_square;
    uint32_t ch1_acc_mean;
DreamSourceLab's avatar
DreamSourceLab committed
735 736
};

DreamSourceLab's avatar
DreamSourceLab committed
737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804
enum {
	/*--- Device classes ------------------------------------------------*/

	/** The device can act as logic analyzer. */
	SR_CONF_LOGIC_ANALYZER = 10000,

	/** The device can act as an oscilloscope. */
	SR_CONF_OSCILLOSCOPE,

	/** The device can act as a multimeter. */
	SR_CONF_MULTIMETER,

	/** The device is a demo device. */
	SR_CONF_DEMO_DEV,

	/** The device can act as a sound level meter. */
	SR_CONF_SOUNDLEVELMETER,

	/** The device can measure temperature. */
	SR_CONF_THERMOMETER,

	/** The device can measure humidity. */
	SR_CONF_HYGROMETER,

	/*--- Driver scan options -------------------------------------------*/

	/**
	 * Specification on how to connect to a device.
	 *
	 * In combination with SR_CONF_SERIALCOMM, this is a serial port in
	 * the form which makes sense to the OS (e.g., /dev/ttyS0).
	 * Otherwise this specifies a USB device, either in the form of
	 * @verbatim <bus>.<address> @endverbatim (decimal, e.g. 1.65) or
	 * @verbatim <vendorid>.<productid> @endverbatim
	 * (hexadecimal, e.g. 1d6b.0001).
	 */
	SR_CONF_CONN = 20000,

	/**
	 * Serial communication specification, in the form:
	 *
	 *   @verbatim <baudrate>/<databits><parity><stopbits> @endverbatim
	 *
	 * Example: 9600/8n1
	 *
	 * The string may also be followed by one or more special settings,
	 * in the form "/key=value". Supported keys and their values are:
	 *
	 * rts    0,1    set the port's RTS pin to low or high
	 * dtr    0,1    set the port's DTR pin to low or high
	 * flow   0      no flow control
	 *        1      hardware-based (RTS/CTS) flow control
	 *        2      software-based (XON/XOFF) flow control
	 * 
	 * This is always an optional parameter, since a driver typically
	 * knows the speed at which the device wants to communicate.
	 */
	SR_CONF_SERIALCOMM,

	/*--- Device configuration ------------------------------------------*/

	/** The device supports setting its samplerate, in Hz. */
	SR_CONF_SAMPLERATE = 30000,

	/** The device supports setting a pre/post-trigger capture ratio. */
	SR_CONF_CAPTURE_RATIO,

    /** */
805 806
    SR_CONF_USB_SPEED,
    SR_CONF_USB30_SUPPORT,
DreamSourceLab's avatar
DreamSourceLab committed
807
    SR_CONF_DEVICE_MODE,
DreamSourceLab's avatar
DreamSourceLab committed
808 809
    SR_CONF_INSTANT,
    SR_CONF_STATUS,
DreamSourceLab's avatar
DreamSourceLab committed
810 811 812 813 814 815 816

	/** The device supports setting a pattern (pattern generator mode). */
	SR_CONF_PATTERN_MODE,

	/** The device supports Run Length Encoding. */
	SR_CONF_RLE,

817 818 819
    /** Need wait to uplad captured data */
    SR_CONF_WAIT_UPLOAD,

DreamSourceLab's avatar
DreamSourceLab committed
820 821 822 823 824 825
	/** The device supports setting trigger slope. */
	SR_CONF_TRIGGER_SLOPE,

	/** Trigger source. */
	SR_CONF_TRIGGER_SOURCE,

826 827 828
    /** Trigger channel */
    SR_CONF_TRIGGER_CHANNEL,

DreamSourceLab's avatar
v0.3  
DreamSourceLab committed
829 830 831
    /** Trigger Value. */
    SR_CONF_TRIGGER_VALUE,

DreamSourceLab's avatar
DreamSourceLab committed
832 833 834
	/** Horizontal trigger position. */
	SR_CONF_HORIZ_TRIGGERPOS,

835 836 837
    /** Trigger hold off time */
    SR_CONF_TRIGGER_HOLDOFF,

838 839 840
    /** Trigger Margin */
    SR_CONF_TRIGGER_MARGIN,

DreamSourceLab's avatar
DreamSourceLab committed
841 842 843 844
	/** Buffer size. */
	SR_CONF_BUFFERSIZE,

	/** Time base. */
845
    SR_CONF_MAX_TIMEBASE,
846
    SR_CONF_MIN_TIMEBASE,
DreamSourceLab's avatar
DreamSourceLab committed
847 848 849 850 851
	SR_CONF_TIMEBASE,

	/** Filter. */
	SR_CONF_FILTER,

DreamSourceLab's avatar
v0.3  
DreamSourceLab committed
852 853 854
    /** DSO configure sync */
    SR_CONF_DSO_SYNC,

855 856
    /** How many bits for each sample */
    SR_CONF_UNIT_BITS,
Andy Dneg's avatar
Andy Dneg committed
857 858
    SR_CONF_REF_MIN,
    SR_CONF_REF_MAX,
859

860 861 862
    /** Valid channel number */
    SR_CONF_VLD_CH_NUM,

DreamSourceLab's avatar
v0.3  
DreamSourceLab committed
863
    /** Zero */
864 865
    SR_CONF_HAVE_ZERO,
    SR_CONF_ZERO,
DreamSourceLab's avatar
DreamSourceLab committed
866
    SR_CONF_ZERO_SET,
867
    SR_CONF_ZERO_LOAD,
Andy Dneg's avatar
Andy Dneg committed
868
    SR_CONF_ZERO_DEFAULT,
869 870
    SR_CONF_VOCM,
    SR_CONF_CALI,
DreamSourceLab's avatar
DreamSourceLab committed
871

872 873 874 875 876
    /** status for dso channel */
    SR_CONF_STATUS_PERIOD,
    SR_CONF_STATUS_PCNT,
    SR_CONF_STATUS_MAX,
    SR_CONF_STATUS_MIN,
Andy Dneg's avatar
Andy Dneg committed
877 878 879 880 881 882 883 884 885 886
    SR_CONF_STATUS_PLEN,
    SR_CONF_STATUS_LLEN,
    SR_CONF_STATUS_LEVEL,
    SR_CONF_STATUS_PLEVEL,
    SR_CONF_STATUS_LOW,
    SR_CONF_STATUS_HIGH,
    SR_CONF_STATUS_RLEN,
    SR_CONF_STATUS_FLEN,
    SR_CONF_STATUS_RMS,
    SR_CONF_STATUS_MEAN,
887

DreamSourceLab's avatar
DreamSourceLab committed
888 889 890
    /** Stream */
    SR_CONF_STREAM,

891 892 893
    /** DSO Roll */
    SR_CONF_ROLL,

DreamSourceLab's avatar
DreamSourceLab committed
894 895
    /** Test */
    SR_CONF_TEST,
896
    SR_CONF_EEPROM,
Andy Dneg's avatar
Andy Dneg committed
897 898 899 900
    SR_CONF_TUNE,
    SR_CONF_TUNE_SEL,
    SR_CONF_EXTEND_ID,
    SR_CONF_EXTEND_DATA,
DreamSourceLab's avatar
v0.3  
DreamSourceLab committed
901

DreamSourceLab's avatar
DreamSourceLab committed
902 903 904 905 906 907
	/** The device supports setting its sample interval, in ms. */
	SR_CONF_SAMPLE_INTERVAL,

	/** Number of timebases, as related to SR_CONF_TIMEBASE.  */
	SR_CONF_NUM_TIMEBASE,

908
    /** Number of vertical divisions, as related to SR_CONF_PROBE_VDIV.  */
DreamSourceLab's avatar
DreamSourceLab committed
909 910 911 912 913
	SR_CONF_NUM_VDIV,

    /** clock type (internal/external) */
    SR_CONF_CLOCK_TYPE,

DreamSourceLab's avatar
DreamSourceLab committed
914 915 916
    /** clock edge (posedge/negedge) */
    SR_CONF_CLOCK_EDGE,

917 918 919
    /** Device operation mode */
    SR_CONF_OPERATION_MODE,

920 921 922
    /** Device buffer options */
    SR_CONF_BUFFER_OPTIONS,

DreamSourceLab's avatar
DreamSourceLab committed
923 924 925
    /** Device channel mode */
    SR_CONF_CHANNEL_MODE,

926 927 928
    /** RLE compress support */
    SR_CONF_RLE_SUPPORT,

929 930 931 932
    /** Signal max height **/
    SR_CONF_MAX_HEIGHT,
    SR_CONF_MAX_HEIGHT_VALUE,

DreamSourceLab's avatar
DreamSourceLab committed
933 934
    /** Device sample threshold */
    SR_CONF_THRESHOLD,
DreamSourceLab's avatar
DreamSourceLab committed
935 936
    SR_CONF_VTH,

937
    /** Hardware capacity **/
DreamSourceLab's avatar
DreamSourceLab committed
938 939
    SR_CONF_MAX_DSO_SAMPLERATE,
    SR_CONF_MAX_DSO_SAMPLELIMITS,
940 941
    SR_CONF_HW_DEPTH,

Andy Dneg's avatar
Andy Dneg committed
942 943 944 945
    /** bandwidth */
    SR_CONF_BANDWIDTH,
    SR_CONF_BANDWIDTH_LIMIT,

946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965
    /*--- Probe configuration -------------------------------------------*/
    /** Probe options */
    SR_CONF_PROBE_CONFIGS,

    /** Probe options */
    SR_CONF_PROBE_SESSIONS,

    /** Enable */
    SR_CONF_PROBE_EN,

    /** Coupling */
    SR_CONF_PROBE_COUPLING,

    /** Volts/div */
    SR_CONF_PROBE_VDIV,

    /** Factor */
    SR_CONF_PROBE_FACTOR,

    /** Mapping */
Andy Dneg's avatar
Andy Dneg committed
966
    SR_CONF_PROBE_MAP_DEFAULT,
967 968 969 970 971
    SR_CONF_PROBE_MAP_UNIT,
    SR_CONF_PROBE_MAP_MIN,
    SR_CONF_PROBE_MAP_MAX,

    /** Vertical offset */
Andy Dneg's avatar
Andy Dneg committed
972 973 974 975 976
    SR_CONF_PROBE_OFFSET,
    SR_CONF_PROBE_HW_OFFSET,
    SR_CONF_PROBE_PREOFF,
    SR_CONF_PROBE_PREOFF_DEFAULT,
    SR_CONF_PROBE_PREOFF_MARGIN,
977 978 979 980 981

    /** VGain */
    SR_CONF_PROBE_VGAIN,
    SR_CONF_PROBE_VGAIN_DEFAULT,
    SR_CONF_PROBE_VGAIN_RANGE,
Andy Dneg's avatar
Andy Dneg committed
982 983
    SR_CONF_PROBE_COMB_COMP_EN,
    SR_CONF_PROBE_COMB_COMP,
984

DreamSourceLab's avatar
DreamSourceLab committed
985 986 987 988 989
	/*--- Special stuff -------------------------------------------------*/

	/** Device options for a particular device. */
	SR_CONF_DEVICE_OPTIONS,

990 991 992
    /** Sessions */
    SR_CONF_DEVICE_SESSIONS,

DreamSourceLab's avatar
DreamSourceLab committed
993 994 995 996 997 998
	/** Session filename. */
	SR_CONF_SESSIONFILE,

	/** The device supports specifying a capturefile to inject. */
	SR_CONF_CAPTUREFILE,

999 1000
    /** Session file version */
    SR_CONF_FILE_VERSION,
DreamSourceLab's avatar
DreamSourceLab committed
1001 1002 1003 1004

	/** The device supports setting the number of probes. */
	SR_CONF_CAPTURE_NUM_PROBES,

1005 1006 1007
    /** The device supports setting the number of data blocks. */
    SR_CONF_NUM_BLOCKS,

Andy Dneg's avatar
Andy Dneg committed
1008 1009 1010
    /** language (string code) **/
    SR_CONF_LANGUAGE,

DreamSourceLab's avatar
DreamSourceLab committed
1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
	/*--- Acquisition modes ---------------------------------------------*/

	/**
	 * The device supports setting a sample time limit (how long
	 * the sample acquisition should run, in ms).
	 */
	SR_CONF_LIMIT_MSEC = 50000,

	/**
	 * The device supports setting a sample number limit (how many
	 * samples should be acquired).
	 */
	SR_CONF_LIMIT_SAMPLES,

1025 1026 1027 1028 1029 1030 1031 1032 1033 1034
    /**
     * Absolute time record for session driver
     */
    SR_CONF_TRIGGER_TIME,

    /**
     * Trigger position for session driver
     */
    SR_CONF_TRIGGER_POS,

1035 1036 1037 1038 1039
    /**
     * The actual sample count received
     */
    SR_CONF_ACTUAL_SAMPLES,

DreamSourceLab's avatar
DreamSourceLab committed
1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
	/**
	 * The device supports setting a frame limit (how many
	 * frames should be acquired).
	 */
	SR_CONF_LIMIT_FRAMES,

	/**
	 * The device supports continuous sampling. Neither a time limit
	 * nor a sample number limit has to be supplied, it will just acquire
	 * samples continuously, until explicitly stopped by a certain command.
	 */
	SR_CONF_CONTINUOUS,

	/** The device has internal storage, into which data is logged. This
	 * starts or stops the internal logging. */
	SR_CONF_DATALOG,
};

struct sr_dev_inst {
DreamSourceLab's avatar
DreamSourceLab committed
1059 1060 1061 1062 1063 1064 1065 1066 1067
    /** Device driver. */
    struct sr_dev_driver *driver;
    /** Index of device in driver. */
    int index;
    /** Device instance status. SR_ST_NOT_FOUND, etc. */
    int status;
    /** Device instance type. SR_INST_USB, etc. */
    int inst_type;
    /** Device mode. LA/DAQ/OSC, etc. */
DreamSourceLab's avatar
DreamSourceLab committed
1068
    int mode;
DreamSourceLab's avatar
DreamSourceLab committed
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082
    /** Device vendor. */
    char *vendor;
    /** Device model. */
    char *model;
    /** Device version. */
    char *version;
    /** List of channels. */
    GSList *channels;
    /** List of sr_channel_group structs */
    GSList *channel_groups;
    /** Device instance connection data (used?) */
    void *conn;
    /** Device instance private data (used?) */
    void *priv;
DreamSourceLab's avatar
DreamSourceLab committed
1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
};

/** Types of device instances (sr_dev_inst). */
enum {
	/** Device instance type for USB devices. */
	SR_INST_USB = 10000,
	/** Device instance type for serial port devices. */
	SR_INST_SERIAL,
};

/** Device instance status. */
enum {
	/** The device instance was not found. */
	SR_ST_NOT_FOUND = 10000,
	/** The device instance was found, but is still booting. */
	SR_ST_INITIALIZING,
	/** The device instance is live, but not in use. */
	SR_ST_INACTIVE,
1101 1102
    /** The device instance has an imcompatible firmware */
    SR_ST_INCOMPATIBLE,
DreamSourceLab's avatar
DreamSourceLab committed
1103 1104 1105 1106 1107 1108
	/** The device instance is actively in use in a session. */
	SR_ST_ACTIVE,
	/** The device is winding down its session. */
	SR_ST_STOPPING,
};

1109
/** Device test modes. */
1110
enum {
1111 1112
    /** No test mode */
    SR_TEST_NONE,
1113
    /** Internal pattern test mode */
1114
    SR_TEST_INTERNAL,
1115
    /** External pattern test mode */
1116
    SR_TEST_EXTERNAL,
1117
    /** SDRAM loopback test mode */
1118
    SR_TEST_LOOPBACK,
1119 1120
};

1121 1122 1123 1124 1125 1126 1127 1128
/** Device buffer mode */
enum {
    /** Stop immediately */
    SR_BUF_STOP = 0,
    /** Upload captured data */
    SR_BUF_UPLOAD = 1,
};

DreamSourceLab's avatar
DreamSourceLab committed
1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142
/** Device threshold level. */
enum {
    /** 1.8/2.5/3.3 level */
    SR_TH_3V3 = 0,
    /** 5.0 level */
    SR_TH_5V0 = 1,
};

/** Device input filter. */
enum {
    /** None */
    SR_FILTER_NONE = 0,
    /** One clock cycle */
    SR_FILTER_1T = 1,
1143 1144
};

DreamSourceLab's avatar
DreamSourceLab committed
1145 1146 1147 1148 1149 1150 1151 1152 1153 1154
/** Coupling. */
enum {
    /** DC */
    SR_DC_COUPLING = 0,
    /** AC */
    SR_AC_COUPLING = 1,
    /** Ground */
    SR_GND_COUPLING = 2,
};

DreamSourceLab's avatar
DreamSourceLab committed
1155 1156
struct sr_dev_mode {
    int mode;
Andy Dneg's avatar
Andy Dneg committed
1157 1158
    char *name;
    char *name_cn;
DreamSourceLab's avatar
DreamSourceLab committed
1159
    char *acronym;
Andy Dneg's avatar
Andy Dneg committed
1160
    char *icon;
DreamSourceLab's avatar
DreamSourceLab committed
1161 1162
};

DreamSourceLab's avatar
DreamSourceLab committed
1163 1164 1165 1166 1167 1168 1169 1170 1171
struct sr_dev_driver {
	/* Driver-specific */
	char *name;
	char *longname;
	int api_version;
	int (*init) (struct sr_context *sr_ctx);
	int (*cleanup) (void);
	GSList *(*scan) (GSList *options);
	GSList *(*dev_list) (void);
1172
    const GSList *(*dev_mode_list) (const struct sr_dev_inst *sdi);
DreamSourceLab's avatar
DreamSourceLab committed
1173 1174 1175 1176 1177 1178 1179
    int (*dev_clear) (void);

    int (*config_get) (int id, GVariant **data,
                       const struct sr_dev_inst *sdi,
                       const struct sr_channel *ch,
                       const struct sr_channel_group *cg);
    int (*config_set) (int id, GVariant *data,
DreamSourceLab's avatar
DreamSourceLab committed
1180 1181 1182
                       struct sr_dev_inst *sdi,
                       struct sr_channel *ch,
                       struct sr_channel_group *cg);
DreamSourceLab's avatar
DreamSourceLab committed
1183 1184 1185
    int (*config_list) (int info_id, GVariant **data,
                        const struct sr_dev_inst *sdi,
                        const struct sr_channel_group *cg);
DreamSourceLab's avatar
DreamSourceLab committed
1186 1187 1188 1189

	/* Device-specific */
	int (*dev_open) (struct sr_dev_inst *sdi);
	int (*dev_close) (struct sr_dev_inst *sdi);
DreamSourceLab's avatar
DreamSourceLab committed
1190
    int (*dev_status_get) (const struct sr_dev_inst *sdi,
DreamSourceLab's avatar
DreamSourceLab committed
1191
                           struct sr_status *status,
1192
                           gboolean prg, int begin, int end);
DreamSourceLab's avatar
DreamSourceLab committed
1193
    int (*dev_acquisition_start) (struct sr_dev_inst *sdi,
DreamSourceLab's avatar
DreamSourceLab committed
1194
			void *cb_data);
DreamSourceLab's avatar
DreamSourceLab committed
1195
    int (*dev_acquisition_stop) (const struct sr_dev_inst *sdi,
DreamSourceLab's avatar
DreamSourceLab committed
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207
			void *cb_data);

	/* Dynamic */
	void *priv;
};

struct sr_session {
	/** List of struct sr_dev pointers. */
	GSList *devs;
	/** List of struct datafeed_callback pointers. */
	GSList *datafeed_callbacks;
	GTimeVal starttime;
DreamSourceLab's avatar
v0.3  
DreamSourceLab committed
1208
	gboolean running;
DreamSourceLab's avatar
DreamSourceLab committed
1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226

	unsigned int num_sources;

	/*
	 * Both "sources" and "pollfds" are of the same size and contain pairs
	 * of descriptor and callback function. We can not embed the GPollFD
	 * into the source struct since we want to be able to pass the array
	 * of all poll descriptors to g_poll().
	 */
	struct source *sources;
	GPollFD *pollfds;
	int source_timeout;

	/*
	 * These are our synchronization primitives for stopping the session in
	 * an async fashion. We need to make sure the session is stopped from
	 * within the session thread itself.
	 */
1227
    GMutex stop_mutex;
DreamSourceLab's avatar
DreamSourceLab committed
1228 1229 1230 1231 1232 1233
	gboolean abort_session;
};

enum {
    SIMPLE_TRIGGER = 0,
    ADV_TRIGGER,
1234
    SERIAL_TRIGGER,
DreamSourceLab's avatar
DreamSourceLab committed
1235 1236
};

DreamSourceLab's avatar
v0.3  
DreamSourceLab committed
1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248
enum {
    DSO_TRIGGER_AUTO = 0,
    DSO_TRIGGER_CH0,
    DSO_TRIGGER_CH1,
    DSO_TRIGGER_CH0A1,
    DSO_TRIGGER_CH0O1,
};
enum {
    DSO_TRIGGER_RISING = 0,
    DSO_TRIGGER_FALLING,
};

DreamSourceLab's avatar
DreamSourceLab committed
1249 1250 1251 1252 1253 1254 1255 1256 1257 1258
struct ds_trigger {
    uint16_t trigger_en;
    uint16_t trigger_mode;
    uint16_t trigger_pos;
    uint16_t trigger_stages;
    unsigned char trigger_logic[TriggerStages+1];
    unsigned char trigger0_inv[TriggerStages+1];
    unsigned char trigger1_inv[TriggerStages+1];
    char trigger0[TriggerStages+1][TriggerProbes];
    char trigger1[TriggerStages+1][TriggerProbes];
1259 1260
    uint32_t trigger0_count[TriggerStages+1];
    uint32_t trigger1_count[TriggerStages+1];
DreamSourceLab's avatar
DreamSourceLab committed
1261 1262 1263
};

struct ds_trigger_pos {
1264
    uint32_t check_id;
DreamSourceLab's avatar
DreamSourceLab committed
1265 1266
    uint32_t real_pos;
    uint32_t ram_saddr;
1267 1268 1269
    uint32_t remain_cnt_l;
    uint32_t remain_cnt_h;
    uint32_t status;
DreamSourceLab's avatar
DreamSourceLab committed
1270 1271
};

DreamSourceLab's avatar
DreamSourceLab committed
1272 1273
typedef int (*sr_receive_data_callback_t)(int fd, int revents, const struct sr_dev_inst *sdi);

DreamSourceLab's avatar
DreamSourceLab committed
1274 1275 1276 1277 1278 1279 1280 1281
#include "proto.h"
#include "version.h"

#ifdef __cplusplus
}
#endif

#endif