X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Flibsigrok-internal.h;h=b4b32f23ac2a6df21edd845dabe9dc8a3b2e3efe;hb=032da34b786333a1af811235c5cf29855479f0b6;hp=da04c111245861d8c574fe8a348969fb17584465;hpb=d514d35dab8b831264c8cb01444cf0bb5abbbf8f;p=libsigrok.git diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index da04c111..b4b32f23 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -51,32 +51,41 @@ #endif /** - * Read a 8 bits integer out of memory. + * Read a 8 bits unsigned integer out of memory. * @param x a pointer to the input memory - * @return the corresponding integer + * @return the corresponding unsigned integer */ #define R8(x) ((unsigned)((const uint8_t*)(x))[0]) /** - * Read a 16 bits big endian integer out of memory. + * Read a 16 bits big endian unsigned integer out of memory. * @param x a pointer to the input memory - * @return the corresponding integer + * @return the corresponding unsigned integer */ #define RB16(x) (((unsigned)((const uint8_t*)(x))[0] << 8) | \ (unsigned)((const uint8_t*)(x))[1]) /** - * Read a 16 bits little endian integer out of memory. + * Read a 16 bits little endian unsigned integer out of memory. * @param x a pointer to the input memory - * @return the corresponding integer + * @return the corresponding unsigned integer */ #define RL16(x) (((unsigned)((const uint8_t*)(x))[1] << 8) | \ (unsigned)((const uint8_t*)(x))[0]) /** - * Read a 32 bits big endian integer out of memory. + * Read a 16 bits little endian signed integer out of memory. * @param x a pointer to the input memory - * @return the corresponding integer + * @return the corresponding signed integer + */ +#define RL16S(x) ((int16_t) \ + (((unsigned)((const uint8_t*)(x))[1] << 8) | \ + (unsigned)((const uint8_t*)(x))[0])) + +/** + * Read a 32 bits big endian unsigned integer out of memory. + * @param x a pointer to the input memory + * @return the corresponding unsigned integer */ #define RB32(x) (((unsigned)((const uint8_t*)(x))[0] << 24) | \ ((unsigned)((const uint8_t*)(x))[1] << 16) | \ @@ -84,9 +93,9 @@ (unsigned)((const uint8_t*)(x))[3]) /** - * Read a 32 bits little endian integer out of memory. + * Read a 32 bits little endian unsigned integer out of memory. * @param x a pointer to the input memory - * @return the corresponding integer + * @return the corresponding unsigned integer */ #define RL32(x) (((unsigned)((const uint8_t*)(x))[3] << 24) | \ ((unsigned)((const uint8_t*)(x))[2] << 16) | \ @@ -94,51 +103,63 @@ (unsigned)((const uint8_t*)(x))[0]) /** - * Write a 8 bits integer to memory. + * Read a 32 bits little endian signed integer out of memory. + * @param x a pointer to the input memory + * @return the corresponding signed integer + */ +#define RL32S(x) ((int32_t) \ + (((unsigned)((const uint8_t*)(x))[3] << 24) | \ + ((unsigned)((const uint8_t*)(x))[2] << 16) | \ + ((unsigned)((const uint8_t*)(x))[1] << 8) | \ + (unsigned)((const uint8_t*)(x))[0])) + +/** + * Write a 8 bits unsigned integer to memory. * @param p a pointer to the output memory - * @param x the input integer + * @param x the input unsigned integer */ -#define W8(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); } while(0) +#define W8(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); } while (0) /** - * Write a 16 bits integer to memory stored as big endian. + * Write a 16 bits unsigned integer to memory stored as big endian. * @param p a pointer to the output memory - * @param x the input integer + * @param x the input unsigned integer */ #define WB16(p, x) do { ((uint8_t*)(p))[1] = (uint8_t) (x); \ - ((uint8_t*)(p))[0] = (uint8_t)((x)>>8); } while(0) + ((uint8_t*)(p))[0] = (uint8_t)((x)>>8); } while (0) /** - * Write a 16 bits integer to memory stored as little endian. + * Write a 16 bits unsigned integer to memory stored as little endian. * @param p a pointer to the output memory - * @param x the input integer + * @param x the input unsigned integer */ #define WL16(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); \ - ((uint8_t*)(p))[1] = (uint8_t)((x)>>8); } while(0) + ((uint8_t*)(p))[1] = (uint8_t)((x)>>8); } while (0) /** - * Write a 32 bits integer to memory stored as big endian. + * Write a 32 bits unsigned integer to memory stored as big endian. * @param p a pointer to the output memory - * @param x the input integer + * @param x the input unsigned integer */ #define WB32(p, x) do { ((uint8_t*)(p))[3] = (uint8_t) (x); \ ((uint8_t*)(p))[2] = (uint8_t)((x)>>8); \ ((uint8_t*)(p))[1] = (uint8_t)((x)>>16); \ - ((uint8_t*)(p))[0] = (uint8_t)((x)>>24); } while(0) + ((uint8_t*)(p))[0] = (uint8_t)((x)>>24); } while (0) /** - * Write a 32 bits integer to memory stored as little endian. + * Write a 32 bits unsigned integer to memory stored as little endian. * @param p a pointer to the output memory - * @param x the input integer + * @param x the input unsigned integer */ #define WL32(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); \ ((uint8_t*)(p))[1] = (uint8_t)((x)>>8); \ ((uint8_t*)(p))[2] = (uint8_t)((x)>>16); \ - ((uint8_t*)(p))[3] = (uint8_t)((x)>>24); } while(0) + ((uint8_t*)(p))[3] = (uint8_t)((x)>>24); } while (0) /* 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 @@ -153,14 +174,15 @@ #endif struct sr_context { + struct sr_dev_driver **driver_list; #ifdef HAVE_LIBUSB_1_0 libusb_context *libusb_ctx; gboolean usb_source_present; #ifdef _WIN32 GThread *usb_thread; gboolean usb_thread_running; - GMutex usb_mutex; - HANDLE usb_event; + HANDLE usb_wait_request_event; + HANDLE usb_wait_complete_event; GPollFD usb_pollfd; sr_receive_data_callback usb_cb; void *usb_cb_data; @@ -168,76 +190,143 @@ struct sr_context { #endif }; +/** Input module metadata keys. */ +enum sr_input_meta_keys { + /** The input filename, if there is one. */ + SR_INPUT_META_FILENAME = 0x01, + /** The input file's size in bytes. */ + SR_INPUT_META_FILESIZE = 0x02, + /** The first 128 bytes of the file, provided as a GString. */ + SR_INPUT_META_HEADER = 0x04, + /** The file's MIME type. */ + SR_INPUT_META_MIMETYPE = 0x08, + + /** The module cannot identify a file without this metadata. */ + SR_INPUT_META_REQUIRED = 0x80, +}; + /** Input (file) module struct. */ struct sr_input { /** * A pointer to this input module's 'struct sr_input_module'. - * The frontend can use this to call the module's callbacks. */ - struct sr_input_module *module; - - GHashTable *param; - + const struct sr_input_module *module; + GString *buf; struct sr_dev_inst *sdi; - - void *internal; + gboolean sdi_ready; + void *priv; }; /** Input (file) module driver. */ struct sr_input_module { - /** The unique ID for this input module. Must not be NULL. */ - char *id; + /** + * A unique ID for this input module, suitable for use in command-line + * clients, [a-z0-9-]. Must not be NULL. + */ + const char *id; /** - * A short description of the input module, which can (for example) - * be displayed to the user by frontends. Must not be NULL. + * A unique name for this input module, suitable for use in GUI + * clients, can contain UTF-8. Must not be NULL. */ - char *description; + const char *name; /** - * Check if this input module can load and parse the specified file. + * A short description of the input module. Must not be NULL. * - * @param[in] filename The name (and path) of the file to check. + * This can be displayed by frontends, e.g. when selecting the input + * module for saving a file. + */ + 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 + * identify streams at all, i.e. has to be forced into use. * - * @retval TRUE This module knows the format. - * @retval FALSE This module does not know the format. + * Each item is one of: + * SR_INPUT_META_FILENAME + * SR_INPUT_META_FILESIZE + * SR_INPUT_META_HEADER + * SR_INPUT_META_MIMETYPE + * + * If the high bit (SR_INPUT META_REQUIRED) is set, the module cannot + * identify a stream without the given metadata. */ - int (*format_match) (const char *filename); + const uint8_t metadata[8]; /** - * Initialize the input module. + * Returns a NULL-terminated list of options this module can take. + * Can be NULL, if the module has no options. + */ + struct sr_option *(*options) (void); + + /** + * Check if this input module can load and parse the specified stream. * - * @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. + * @param[in] metadata Metadata the module can use to identify the stream. + * + * @retval SR_OK This module knows the format. + * @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 + * that the module does not support. + * @retval SR_ERR This module does not know the format. + */ + int (*format_match) (GHashTable *metadata); + + /** + * Initialize the input module. * * @retval SR_OK Success * @retval other Negative error code. */ - int (*init) (struct sr_input *in, const char *filename); + int (*init) (struct sr_input *in, GHashTable *options); /** - * Load a file, parsing the input according to the file's format. + * Send data to the specified input instance. + * + * When an input module instance is created with sr_input_new(), this + * function is used to feed data to the instance. * - * This function will send datafeed packets to the session bus, so - * the calling frontend must have registered its session callbacks - * beforehand. + * 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. * - * 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. + * @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); + + /** + * This function is called after the caller is finished using + * the input module, and can be used to free any internal + * resources the module may keep. * - * @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. + * This function is optional. * * @retval SR_OK Success * @retval other Negative error code. */ - int (*loadfile) (struct sr_input *in, const char *filename); + void (*cleanup) (struct sr_input *in); }; /** Output module instance. */ @@ -283,6 +372,13 @@ struct sr_output_module { */ 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. @@ -307,7 +403,7 @@ struct sr_output_module { int (*init) (struct sr_output *o, GHashTable *options); /** - * This function is passed a copy of every packed in the data feed. + * This function is passed a copy of every packet 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. @@ -338,6 +434,93 @@ struct sr_output_module { 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 { @@ -359,8 +542,6 @@ struct sr_serial_dev_inst { char *port; /** Comm params for serial_set_paramstr(). */ char *serialcomm; - /** Port is non-blocking. */ - int nonblocking; /** libserialport port handle */ struct sp_port *data; /** libserialport event set */ @@ -409,12 +590,40 @@ enum { SR_CHANNEL_SET_ENABLED = 1 << 0, }; -SR_PRIV struct sr_channel *sr_channel_new(int index, int type, - gboolean enabled, const char *name); +SR_PRIV struct sr_channel *sr_channel_new(struct sr_dev_inst *sdi, + 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 index, 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 @@ -437,8 +646,12 @@ SR_PRIV void sr_usbtmc_dev_inst_free(struct sr_usbtmc_dev_inst *usbtmc); /*--- hwdriver.c ------------------------------------------------------------*/ -SR_PRIV void sr_hw_cleanup_all(void); -SR_PRIV struct sr_config *sr_config_new(int key, GVariant *data); +extern SR_PRIV struct sr_dev_driver **drivers_lists[]; + +SR_PRIV const GVariantType *sr_variant_type_get(int datatype); +SR_PRIV int sr_variant_type_check(uint32_t key, GVariant *data); +SR_PRIV void sr_hw_cleanup_all(const struct sr_context *ctx); +SR_PRIV struct sr_config *sr_config_new(uint32_t key, GVariant *data); SR_PRIV void sr_config_free(struct sr_config *src); SR_PRIV int sr_source_remove(int fd); SR_PRIV int sr_source_remove_pollfd(GPollFD *pollfd); @@ -453,10 +666,15 @@ SR_PRIV int sr_source_add_channel(GIOChannel *channel, int events, int timeout, /*--- session.c -------------------------------------------------------------*/ struct sr_session { - /** List of struct sr_dev pointers. */ + /** Context this session exists in. */ + struct sr_context *ctx; + /** 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; @@ -488,6 +706,17 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi, const struct sr_datafeed_packet *packet); SR_PRIV int sr_session_stop_sync(struct sr_session *session); SR_PRIV int sr_sessionfile_check(const char *filename); +SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet, + 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 -----------------------------------------------------------------*/ @@ -525,21 +754,25 @@ struct soft_trigger_logic { 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 { SERIAL_RDWR = 1, SERIAL_RDONLY = 2, - SERIAL_NONBLOCK = 4, }; typedef gboolean (*packet_valid_callback)(const uint8_t *buf); @@ -547,16 +780,13 @@ typedef gboolean (*packet_valid_callback)(const uint8_t *buf); 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_write(struct sr_serial_dev_inst *serial, - const void *buf, size_t count); +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(struct sr_serial_dev_inst *serial, 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, @@ -578,9 +808,10 @@ SR_PRIV int serial_source_add(struct sr_session *session, 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); @@ -590,7 +821,7 @@ SR_PRIV int ezusb_upload_firmware(libusb_device *dev, int configuration, 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); @@ -598,9 +829,10 @@ SR_PRIV int sr_usb_open(libusb_context *usb_ctx, struct sr_usb_dev_inst *usb); 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, char *path, int path_len); #endif -/*--- hardware/common/scpi.c ------------------------------------------------*/ +/*--- hardware/scpi.c -------------------------------------------------------*/ #define SCPI_CMD_IDN "*IDN?" #define SCPI_CMD_OPC "*OPC?" @@ -655,6 +887,7 @@ struct sr_scpi_dev_inst { int (*read_complete)(void *priv); int (*close)(void *priv); void (*free)(void *priv); + unsigned int read_timeout_ms; void *priv; }; @@ -697,7 +930,7 @@ SR_PRIV int sr_scpi_get_hw_id(struct sr_scpi_dev_inst *scpi, 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 @@ -742,7 +975,7 @@ SR_PRIV gboolean sr_es519xx_19200_14b_sel_lpf_packet_valid(const uint8_t *buf); 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 @@ -760,7 +993,7 @@ SR_PRIV int sr_fs9922_parse(const uint8_t *buf, float *floatval, 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 @@ -780,7 +1013,7 @@ SR_PRIV void sr_fs9721_10_temp_c(struct sr_datafeed_analog *analog, void *info); 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 @@ -788,7 +1021,7 @@ SR_PRIV gboolean sr_m2110_packet_valid(const uint8_t *buf); 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 @@ -807,7 +1040,7 @@ SR_PRIV gboolean sr_metex14_packet_valid(const uint8_t *buf); 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 @@ -818,7 +1051,7 @@ SR_PRIV gboolean sr_rs9lcd_packet_valid(const uint8_t *buf); 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 @@ -829,4 +1062,72 @@ SR_PRIV gboolean sr_brymen_bm25x_packet_valid(const uint8_t *buf); 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/dmm/vc870.c --------------------------------------------------*/ + +#define VC870_PACKET_SIZE 23 + +struct vc870_info { + gboolean is_voltage, is_dc, is_ac, is_temperature, is_resistance; + gboolean is_continuity, is_capacitance, is_diode, is_loop_current; + gboolean is_current, is_micro, is_milli, is_power; + gboolean is_power_factor_freq, is_power_apparent_power, is_v_a_eff_value; + gboolean is_sign2, is_sign1, is_batt, is_ol1, is_max, is_min; + gboolean is_maxmin, is_rel, is_ol2, is_open, is_manu, is_hold; + gboolean is_light, is_usb, is_warning, is_auto_power, is_misplug_warn; + gboolean is_lo, is_hi, is_open2; + + gboolean is_frequency, is_dual_display, is_auto, is_rms; +}; + +SR_PRIV gboolean sr_vc870_packet_valid(const uint8_t *buf); +SR_PRIV int sr_vc870_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); + +/*--- hardware/dmm/ut372.c --------------------------------------------------*/ + +#define UT372_PACKET_SIZE 27 + +struct ut372_info { + int dummy; +}; + +SR_PRIV gboolean sr_ut372_packet_valid(const uint8_t *buf); +SR_PRIV int sr_ut372_parse(const uint8_t *buf, float *floatval, + struct sr_datafeed_analog *analog, void *info); + #endif