X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=libsigrok.h;h=6cda5543223d17cfceb225c0dce40ded25899feb;hb=e52e712d05419e4387704262a07e00904b2acbed;hp=bf0b8b295812bfdcd06ea4245274bd33853c5e96;hpb=07e1aad5c4d53ee1028613312061f261f1a7800a;p=libsigrok.git diff --git a/libsigrok.h b/libsigrok.h index bf0b8b29..6cda5543 100644 --- a/libsigrok.h +++ b/libsigrok.h @@ -1,7 +1,7 @@ /* - * This file is part of the sigrok project. + * This file is part of the libsigrok project. * - * Copyright (C) 2010-2012 Bert Vermeulen + * Copyright (C) 2013 Bert Vermeulen * * 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 @@ -36,7 +36,7 @@ extern "C" { * 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 + * 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: @@ -70,18 +70,24 @@ enum { 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. + */ }; -#define SR_MAX_NUM_PROBES 64 /* Limited by uint64_t. */ #define SR_MAX_PROBENAME_LEN 32 /* Handy little macros */ #define SR_HZ(n) (n) -#define SR_KHZ(n) ((n) * 1000) -#define SR_MHZ(n) ((n) * 1000000) -#define SR_GHZ(n) ((n) * 1000000000) +#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) (1000000000 / (n)) +#define SR_HZ_TO_NS(n) ((uint64_t)(1000000000ULL) / (n)) /** libsigrok loglevels. */ enum { @@ -136,14 +142,6 @@ enum { SR_T_KEYVALUE, }; -/** Rational number data type, containing numerator and denominator values. */ -struct sr_rational { - /** Numerator of the rational number. */ - uint64_t p; - /** Denominator of the rational number. */ - uint64_t q; -}; - /** Value for sr_datafeed_packet.type. */ enum { SR_DF_HEADER = 10000, @@ -456,7 +454,7 @@ struct sr_output_format { * data_out parameter, so the caller knows not to try * and g_free() it. * - * Note: This API call is obsolete, use recv() instead. + * Note: This API call is obsolete, use receive() instead. * * @param o Pointer to the respective 'struct sr_output'. * @param data_in Pointer to the input data buffer. @@ -488,7 +486,7 @@ struct sr_output_format { * it stored in the data_out and length_out * parameters, or NULL if no output was generated. * - * Note: This API call is obsolete, use recv() instead. + * Note: This API call is obsolete, use receive() instead. * * @param o Pointer to the respective 'struct sr_output'. * @param event_type Type of event that occured. @@ -498,11 +496,35 @@ struct sr_output_format { * @return SR_OK upon success, a negative error code otherwise. */ int (*event) (struct sr_output *o, int event_type, uint8_t **data_out, - uint64_t *length_out); + uint64_t *length_out); - GString *(*recv) (struct sr_output *o, const struct sr_dev_inst *sdi, - const struct sr_datafeed_packet *packet); + /** + * 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 + * out, which will be freed by the caller. + * + * Packets not of interest to the output module can just be ignored, + * and the out 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. + * + * @return SR_OK upon success, a negative error code otherwise. + */ + int (*receive) (struct sr_output *o, const struct sr_dev_inst *sdi, + 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. + * + * @return SR_OK upon success, a negative error code otherwise. + */ int (*cleanup) (struct sr_output *o); }; @@ -522,7 +544,7 @@ struct sr_probe { struct sr_config { int key; - const void *value; + GVariant *data; }; struct sr_config_info { @@ -594,7 +616,7 @@ enum { /*--- Device configuration ------------------------------------------*/ - /** The device supports setting/changing its samplerate. */ + /** The device supports setting its samplerate, in Hz. */ SR_CONF_SAMPLERATE = 30000, /** The device supports setting a pre/post-trigger capture ratio. */ @@ -633,6 +655,15 @@ enum { /** Trigger types. */ SR_CONF_TRIGGER_TYPE, + /** 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, + + /** Number of vertical divisions, as related to SR_CONF_VDIV. */ + SR_CONF_NUM_VDIV, + /*--- Special stuff -------------------------------------------------*/ /** Scan options supported by the driver. */ @@ -679,6 +710,10 @@ enum { * 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 { @@ -690,6 +725,7 @@ struct sr_dev_inst { char *model; char *version; GSList *probes; + void *conn; void *priv; }; @@ -715,18 +751,6 @@ enum { SR_ST_STOPPING, }; -/* - * A device supports either a range of samplerates with steps of a given - * granularity, or is limited to a set of defined samplerates. Use either - * step or list, but not both. - */ -struct sr_samplerates { - uint64_t low; - uint64_t high; - uint64_t step; - const uint64_t *list; -}; - struct sr_dev_driver { /* Driver-specific */ char *name; @@ -737,11 +761,11 @@ struct sr_dev_driver { GSList *(*scan) (GSList *options); GSList *(*dev_list) (void); int (*dev_clear) (void); - int (*config_get) (int id, const void **value, + int (*config_get) (int id, GVariant **data, const struct sr_dev_inst *sdi); - int (*config_set) (int id, const void *value, + int (*config_set) (int id, GVariant *data, const struct sr_dev_inst *sdi); - int (*config_list) (int info_id, const void **data, + int (*config_list) (int info_id, GVariant **data, const struct sr_dev_inst *sdi); /* Device-specific */ @@ -759,7 +783,7 @@ struct sr_dev_driver { struct sr_session { /** List of struct sr_dev pointers. */ GSList *devs; - /** List of sr_receive_data_callback_t items. */ + /** List of struct datafeed_callback pointers. */ GSList *datafeed_callbacks; GTimeVal starttime; @@ -774,6 +798,14 @@ struct sr_session { 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. + */ + GMutex stop_mutex; + gboolean abort_session; }; #include "proto.h"