/* Portability fixes for FreeBSD. */
#ifdef __FreeBSD__
#define LIBUSB_CLASS_APPLICATION 0xfe
+#define libusb_has_capability(x) 0
#define libusb_handle_events_timeout_completed(ctx, tv, c) \
libusb_handle_events_timeout(ctx, tv)
#endif
*/
const char *desc;
+ /**
+ * 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;
+
/**
* Zero-terminated list of metadata items the module needs to be able
* to identify an input stream. Can be all-zero, if the module cannot
* @param[in] metadata Metadata the module can use to identify the stream.
*
* @retval SR_OK This module knows the format.
- * @retval SR_OK_CONTINUE There wasn't enough data for this module to
+ * @retval SR_ERR_NA There wasn't enough data for this module to
* positively identify the format.
* @retval SR_ERR_DATA This module knows the format, but cannot handle it.
* This means the stream is either corrupt, or indicates a feature
/**
* 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[in] filename The name (and path) of the file to use.
- *
* @retval SR_OK Success
* @retval other Negative error code.
*/
int (*init) (struct sr_input *in, GHashTable *options);
/**
- * Load a file, parsing the input according to the file's format.
- *
- * This function will send datafeed packets to the session bus, so
- * the calling frontend must have registered its session callbacks
- * beforehand.
+ * Send data to the specified input instance.
*
- * 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.
+ * When an input module instance is created with sr_input_new(), this
+ * function is used to feed data to the instance.
*
- * @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 f The name (and path) of the file to use.
+ * As enough data gets fed into this function to completely populate
+ * the device instance associated with this input instance, this is
+ * guaranteed to return the moment it's ready. This gives the caller
+ * the chance to examine the device instance, attach session callbacks
+ * and so on.
*
* @retval SR_OK Success
* @retval other Negative error code.
*/
int (*receive) (struct sr_input *in, GString *buf);
+ /**
+ * Signal the input module no more data will come.
+ *
+ * This will cause the module to process any data it may have buffered.
+ * The SR_DF_END packet will also typically be sent at this time.
+ */
int (*end) (struct sr_input *in);
/**
* the input module, and can be used to free any internal
* resources the module may keep.
*
+ * This function is optional.
+ *
* @retval SR_OK Success
* @retval other Negative error code.
*/
- int (*cleanup) (struct sr_input *in);
+ void (*cleanup) (struct sr_input *in);
};
/** Output module instance. */
*/
char *desc;
+ /**
+ * 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.
int (*cleanup) (struct sr_output *o);
};
+/** Transform module instance. */
+struct sr_transform {
+ /** A pointer to this transform's module. */
+ const struct sr_transform_module *module;
+
+ /**
+ * The device for which this transform module is used. This
+ * can be used by the module to find out channel names and numbers.
+ */
+ const struct sr_dev_inst *sdi;
+
+ /**
+ * A generic pointer which can be used by the module to keep internal
+ * state between calls into its callback functions.
+ */
+ void *priv;
+};
+
+struct sr_transform_module {
+ /**
+ * A unique ID for this transform module, suitable for use in
+ * command-line clients, [a-z0-9-]. Must not be NULL.
+ */
+ char *id;
+
+ /**
+ * A unique name for this transform module, suitable for use in GUI
+ * clients, can contain UTF-8. Must not be NULL.
+ */
+ const char *name;
+
+ /**
+ * A short description of the transform module. Must not be NULL.
+ *
+ * This can be displayed by frontends, e.g. when selecting
+ * which transform module(s) to add.
+ */
+ char *desc;
+
+ /**
+ * Returns a NULL-terminated list of options this transform module
+ * can take. Can be NULL, if the transform module has no options.
+ */
+ const struct sr_option *(*options) (void);
+
+ /**
+ * This function is called once, at the beginning of a stream.
+ *
+ * @param t Pointer to the respective 'struct sr_transform'.
+ * @param options Hash table of options for this transform module.
+ * Can be NULL if no options are to be used.
+ *
+ * @retval SR_OK Success
+ * @retval other Negative error code.
+ */
+ int (*init) (struct sr_transform *t, GHashTable *options);
+
+ /**
+ * This function is passed a pointer to every packet in the data feed.
+ *
+ * It can either return (in packet_out) a pointer to another packet
+ * (possibly the exact same packet it got as input), or NULL.
+ *
+ * @param t Pointer to the respective 'struct sr_transform'.
+ * @param packet_in Pointer to a datafeed packet.
+ * @param packet_out Pointer to the resulting datafeed packet after
+ * this function was run. If NULL, the transform
+ * module intentionally didn't output a new packet.
+ *
+ * @retval SR_OK Success
+ * @retval other Negative error code.
+ */
+ int (*receive) (const struct sr_transform *t,
+ struct sr_datafeed_packet *packet_in,
+ struct sr_datafeed_packet **packet_out);
+
+ /**
+ * This function is called after the caller is finished using
+ * the transform module, and can be used to free any internal
+ * resources the module may keep.
+ *
+ * @retval SR_OK Success
+ * @retval other Negative error code.
+ */
+ int (*cleanup) (struct sr_transform *t);
+};
+
#ifdef HAVE_LIBUSB_1_0
/** USB device instance */
struct sr_usb_dev_inst {
SR_PRIV struct sr_channel *sr_channel_new(int index, int type,
gboolean enabled, const char *name);
+/** Device instance data */
+struct sr_dev_inst {
+ /** Device driver. */
+ struct sr_dev_driver *driver;
+ /** Device instance status. SR_ST_NOT_FOUND, etc. */
+ int status;
+ /** Device instance type. SR_INST_USB, etc. */
+ int inst_type;
+ /** Device vendor. */
+ char *vendor;
+ /** Device model. */
+ char *model;
+ /** Device version. */
+ char *version;
+ /** Serial number. */
+ char *serial_num;
+ /** Connection string to uniquely identify devices. */
+ char *connection_id;
+ /** 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;
+ /** Session to which this device is currently assigned. */
+ struct sr_session *session;
+};
+
/* Generic device instances */
-SR_PRIV struct sr_dev_inst *sr_dev_inst_new(int status,
- const char *vendor, const char *model, const char *version);
SR_PRIV void sr_dev_inst_free(struct sr_dev_inst *sdi);
#ifdef HAVE_LIBUSB_1_0
/*--- session.c -------------------------------------------------------------*/
struct sr_session {
- /** List of struct sr_dev pointers. */
+ /** List of struct sr_dev_inst pointers. */
GSList *devs;
+ /** List of struct sr_dev_inst pointers owned by this session. */
+ GSList *owned_devs;
/** List of struct datafeed_callback pointers. */
GSList *datafeed_callbacks;
+ GSList *transforms;
struct sr_trigger *trigger;
GTimeVal starttime;
gboolean running;
struct sr_datafeed_packet **copy);
SR_PRIV void sr_packet_free(struct sr_datafeed_packet *packet);
+/*--- analog.c --------------------------------------------------------------*/
+
+SR_PRIV int sr_analog_init(struct sr_datafeed_analog2 *analog,
+ struct sr_analog_encoding *encoding,
+ struct sr_analog_meaning *meaning,
+ struct sr_analog_spec *spec,
+ int digits);
+
/*--- std.c -----------------------------------------------------------------*/
typedef int (*dev_close_callback)(struct sr_dev_inst *sdi);
int unitsize;
int cur_stage;
uint8_t *prev_sample;
+ uint8_t *pre_trigger_buffer;
+ uint8_t *pre_trigger_head;
+ int pre_trigger_size;
+ int pre_trigger_fill;
};
SR_PRIV struct soft_trigger_logic *soft_trigger_logic_new(
- const struct sr_dev_inst *sdi, struct sr_trigger *trigger);
+ const struct sr_dev_inst *sdi, struct sr_trigger *trigger,
+ int pre_trigger_samples);
SR_PRIV void soft_trigger_logic_free(struct soft_trigger_logic *st);
SR_PRIV int soft_trigger_logic_check(struct soft_trigger_logic *st, uint8_t *buf,
- int len);
+ int len, int *pre_trigger_samples);
-/*--- hardware/common/serial.c ----------------------------------------------*/
+/*--- hardware/serial.c -----------------------------------------------------*/
#ifdef HAVE_LIBSERIALPORT
enum {
SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags);
SR_PRIV int serial_close(struct sr_serial_dev_inst *serial);
SR_PRIV int serial_flush(struct sr_serial_dev_inst *serial);
+SR_PRIV int serial_drain(struct sr_serial_dev_inst *serial);
SR_PRIV int serial_write_blocking(struct sr_serial_dev_inst *serial,
- const void *buf, size_t count);
+ const void *buf, size_t count, unsigned int timeout_ms);
SR_PRIV int serial_write_nonblocking(struct sr_serial_dev_inst *serial,
const void *buf, size_t count);
SR_PRIV int serial_read_blocking(struct sr_serial_dev_inst *serial, void *buf,
- size_t count);
+ size_t count, unsigned int timeout_ms);
SR_PRIV int serial_read_nonblocking(struct sr_serial_dev_inst *serial, void *buf,
size_t count);
SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate,
SR_PRIV int serial_source_remove(struct sr_session *session,
struct sr_serial_dev_inst *serial);
SR_PRIV GSList *sr_serial_find_usb(uint16_t vendor_id, uint16_t product_id);
+SR_PRIV int serial_timeout(struct sr_serial_dev_inst *port, int num_bytes);
#endif
-/*--- hardware/common/ezusb.c -----------------------------------------------*/
+/*--- hardware/ezusb.c ------------------------------------------------------*/
#ifdef HAVE_LIBUSB_1_0
SR_PRIV int ezusb_reset(struct libusb_device_handle *hdl, int set_clear);
const char *filename);
#endif
-/*--- hardware/common/usb.c -------------------------------------------------*/
+/*--- hardware/usb.c --------------------------------------------------------*/
#ifdef HAVE_LIBUSB_1_0
SR_PRIV GSList *sr_usb_find(libusb_context *usb_ctx, const char *conn);
SR_PRIV int usb_source_add(struct sr_session *session, struct sr_context *ctx,
int timeout, sr_receive_data_callback cb, void *cb_data);
SR_PRIV int usb_source_remove(struct sr_session *session, struct sr_context *ctx);
-SR_PRIV int usb_get_port_path(libusb_device *dev, const char *path, int path_len);
+SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len);
#endif
-/*--- hardware/common/scpi.c ------------------------------------------------*/
+/*--- hardware/scpi.c -------------------------------------------------------*/
#define SCPI_CMD_IDN "*IDN?"
#define SCPI_CMD_OPC "*OPC?"
int (*read_complete)(void *priv);
int (*close)(void *priv);
void (*free)(void *priv);
+ unsigned int read_timeout_ms;
void *priv;
};
struct sr_scpi_hw_info **scpi_response);
SR_PRIV void sr_scpi_hw_info_free(struct sr_scpi_hw_info *hw_info);
-/*--- hardware/common/dmm/es519xx.c -----------------------------------------*/
+/*--- hardware/dmm/es519xx.c ------------------------------------------------*/
/**
* All 11-byte es519xx chips repeat each block twice for each conversion cycle
SR_PRIV int sr_es519xx_19200_14b_sel_lpf_parse(const uint8_t *buf,
float *floatval, struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/common/dmm/fs9922.c ------------------------------------------*/
+/*--- hardware/dmm/fs9922.c -------------------------------------------------*/
#define FS9922_PACKET_SIZE 14
struct sr_datafeed_analog *analog, void *info);
SR_PRIV void sr_fs9922_z1_diode(struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/common/dmm/fs9721.c ------------------------------------------*/
+/*--- hardware/dmm/fs9721.c -------------------------------------------------*/
#define FS9721_PACKET_SIZE 14
SR_PRIV void sr_fs9721_01_10_temp_f_c(struct sr_datafeed_analog *analog, void *info);
SR_PRIV void sr_fs9721_max_c_min(struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/common/dmm/m2110.c -----------------------------------------*/
+/*--- hardware/dmm/m2110.c --------------------------------------------------*/
#define BBCGM_M2110_PACKET_SIZE 9
SR_PRIV int sr_m2110_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/common/dmm/metex14.c -----------------------------------------*/
+/*--- hardware/dmm/metex14.c ------------------------------------------------*/
#define METEX14_PACKET_SIZE 14
SR_PRIV int sr_metex14_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/common/dmm/rs9lcd.c ------------------------------------------*/
+/*--- hardware/dmm/rs9lcd.c -------------------------------------------------*/
#define RS9LCD_PACKET_SIZE 9
SR_PRIV int sr_rs9lcd_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/common/dmm/bm25x.c -----------------------------------------*/
+/*--- hardware/dmm/bm25x.c --------------------------------------------------*/
#define BRYMEN_BM25X_PACKET_SIZE 15
SR_PRIV int sr_brymen_bm25x_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
+/*--- hardware/dmm/ut71x.c --------------------------------------------------*/
+
+#define UT71X_PACKET_SIZE 11
+
+struct ut71x_info {
+ gboolean is_voltage, is_resistance, is_capacitance, is_temperature;
+ gboolean is_celsius, is_fahrenheit, is_current, is_continuity;
+ gboolean is_diode, is_frequency, is_duty_cycle, is_dc, is_ac;
+ gboolean is_auto, is_manual, is_sign, is_power, is_loop_current;
+};
+
+SR_PRIV gboolean sr_ut71x_packet_valid(const uint8_t *buf);
+SR_PRIV int sr_ut71x_parse(const uint8_t *buf, float *floatval,
+ struct sr_datafeed_analog *analog, void *info);
+
+/*--- hardware/lcr/es51919.c ------------------------------------------------*/
+
+SR_PRIV void es51919_serial_clean(void *priv);
+SR_PRIV struct sr_dev_inst *es51919_serial_scan(GSList *options,
+ const char *vendor,
+ const char *model);
+SR_PRIV int es51919_serial_config_get(uint32_t key, GVariant **data,
+ const struct sr_dev_inst *sdi,
+ const struct sr_channel_group *cg);
+SR_PRIV int es51919_serial_config_set(uint32_t key, GVariant *data,
+ const struct sr_dev_inst *sdi,
+ const struct sr_channel_group *cg);
+SR_PRIV int es51919_serial_config_list(uint32_t key, GVariant **data,
+ const struct sr_dev_inst *sdi,
+ const struct sr_channel_group *cg);
+SR_PRIV int es51919_serial_acquisition_start(const struct sr_dev_inst *sdi,
+ void *cb_data);
+SR_PRIV int es51919_serial_acquisition_stop(struct sr_dev_inst *sdi,
+ void *cb_data);
+
#endif