X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=libsigrok.h;h=523aabcb6f329451a5bd1ad5377cc4d6526a7e1e;hb=f1b296fcd290a53c269f5fb0d9e1a3480c1346b6;hp=fba6c9ccf2910c2c86f342480dcf4ec1aba2907b;hpb=2efa699fda95b6d2d722d41407ca741cdbfe709c;p=libsigrok.git diff --git a/libsigrok.h b/libsigrok.h index fba6c9cc..523aabcb 100644 --- a/libsigrok.h +++ b/libsigrok.h @@ -1,5 +1,5 @@ /* - * This file is part of the sigrok project. + * This file is part of the libsigrok project. * * Copyright (C) 2013 Bert Vermeulen * @@ -26,6 +26,14 @@ #include #include +#ifdef WIN32 +#define WINVER 0x0500 +#define _WIN32_WINNT WINVER +#include +#else +#include +#endif + #ifdef __cplusplus extern "C" { #endif @@ -70,10 +78,20 @@ 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 +#define DS_MAX_ANALOG_PROBES_NUM 8 +#define TriggerStages 16 +#define TriggerProbes 16 +#define TriggerCountBits 16 /* Handy little macros */ #define SR_HZ(n) (n) @@ -123,7 +141,7 @@ enum { #define SR_PRIV #endif -typedef int (*sr_receive_data_callback_t)(int fd, int revents, void *cb_data); +typedef int (*sr_receive_data_callback_t)(int fd, int revents, const struct sr_dev_inst *sdi); /** Data types used by sr_config_info(). */ enum { @@ -136,14 +154,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, @@ -282,9 +292,14 @@ struct sr_datafeed_meta { struct sr_datafeed_logic { uint64_t length; uint16_t unitsize; + uint16_t data_error; void *data; }; +struct sr_datafeed_trigger { + +}; + struct sr_datafeed_analog { /** The probes for which data is included in this packet. */ GSList *probes; @@ -456,7 +471,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 +503,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 +513,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); }; @@ -511,6 +550,16 @@ enum { SR_PROBE_ANALOG, }; +enum { + LOGIC = 0, + ANALOG = 1, +}; + +static const char *mode_strings[] = { + "Logic Analyzer", + "Oscilloscope", +}; + struct sr_probe { /* The index field will go: use g_slist_length(sdi->probes) instead. */ int index; @@ -600,6 +649,9 @@ enum { /** The device supports setting a pre/post-trigger capture ratio. */ SR_CONF_CAPTURE_RATIO, + /** */ + SR_CONF_DEVICE_MODE, + /** The device supports setting a pattern (pattern generator mode). */ SR_CONF_PATTERN_MODE, @@ -642,6 +694,9 @@ enum { /** Number of vertical divisions, as related to SR_CONF_VDIV. */ SR_CONF_NUM_VDIV, + /** clock type (internal/external) */ + SR_CONF_CLOCK_TYPE, + /*--- Special stuff -------------------------------------------------*/ /** Scan options supported by the driver. */ @@ -649,6 +704,7 @@ enum { /** Device options for a particular device. */ SR_CONF_DEVICE_OPTIONS, + SR_CONF_DEVICE_CONFIGS, /** Session filename. */ SR_CONF_SESSIONFILE, @@ -699,10 +755,12 @@ struct sr_dev_inst { int index; int status; int inst_type; + int mode; char *vendor; char *model; char *version; GSList *probes; + void *conn; void *priv; }; @@ -748,6 +806,7 @@ struct sr_dev_driver { /* Device-specific */ int (*dev_open) (struct sr_dev_inst *sdi); int (*dev_close) (struct sr_dev_inst *sdi); + int (*dev_test) (struct sr_dev_inst *sdi); int (*dev_acquisition_start) (const struct sr_dev_inst *sdi, void *cb_data); int (*dev_acquisition_stop) (struct sr_dev_inst *sdi, @@ -760,7 +819,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; @@ -775,6 +834,74 @@ 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; +}; + +enum { + SIMPLE_TRIGGER = 0, + ADV_TRIGGER, +}; + +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]; + uint16_t trigger0_count[TriggerStages+1]; + uint16_t trigger1_count[TriggerStages+1]; +}; + +struct ds_trigger_pos { + uint32_t real_pos; + uint32_t ram_saddr; + unsigned char first_block[504]; +}; + +//struct libusbhp_t; +typedef void (*libusbhp_hotplug_cb_fn)(struct libusbhp_device_t *device, + void *user_data); +#ifdef __linux__ +#include + +struct dev_list_t { + char *path; + unsigned short vid; + unsigned short pid; + struct dev_list_t *next; +}; +#endif/*__linux__*/ + +struct libusbhp_t { +#ifdef __linux__ + struct udev* hotplug; + struct udev_monitor* hotplug_monitor; + struct dev_list_t *devlist; +#endif/*__linux__*/ +#ifdef _WIN32 + HWND hwnd; + HDEVNOTIFY hDeviceNotify; + WNDCLASSEX wcex; +#endif/*_WIN32*/ + libusbhp_hotplug_cb_fn attach; + libusbhp_hotplug_cb_fn detach; + void *user_data; +}; + +struct libusbhp_device_t { + unsigned short idVendor; + unsigned short idProduct; }; #include "proto.h"