X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Flibsigrok-internal.h;h=b2564ecae3a7f4d9671efdb323c367cf13e1ae36;hb=a258204e00715c44b0d013ee3141ce890c8ea71c;hp=2a4384c4b13047bb816fb9248d9ba558bdf3a07f;hpb=a755b0e122105d934c4e7b97435420eda6df6e8e;p=libsigrok.git diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index 2a4384c4..b2564eca 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,32 +103,43 @@ (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) /** - * 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) /** - * 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) /** - * 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); \ @@ -127,9 +147,9 @@ ((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); \ @@ -143,6 +163,15 @@ libusb_handle_events_timeout(ctx, tv) #endif +/* Static definitions of structs ending with an all-zero entry are a + * problem when compiling with -Wmissing-field-initializers: GCC + * suppresses the warning only with { 0 }, clang wants { } */ +#ifdef __clang__ +#define ALL_ZERO { } +#else +#define ALL_ZERO { 0 } +#endif + struct sr_context { #ifdef HAVE_LIBUSB_1_0 libusb_context *libusb_ctx; @@ -159,6 +188,138 @@ 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'. + */ + const struct sr_input_module *module; + GString *buf; + struct sr_dev_inst *sdi; + gboolean sdi_ready; + void *priv; +}; + +/** Input (file) module driver. */ +struct sr_input_module { + /** + * 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 unique name for this input module, suitable for use in GUI + * clients, can contain UTF-8. Must not be NULL. + */ + const char *name; + + /** + * A short description of the input module. Must not be NULL. + * + * This can be displayed by frontends, e.g. when selecting the input + * module for saving a file. + */ + const char *desc; + + /** + * 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. + * + * 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. + */ + const uint8_t metadata[8]; + + /** + * 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] 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, GHashTable *options); + + /** + * 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. + * + * 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); + + /** + * 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. + * + * This function is optional. + * + * @retval SR_OK Success + * @retval other Negative error code. + */ + void (*cleanup) (struct sr_input *in); +}; + /** Output module instance. */ struct sr_output { /** A pointer to this output's module. */ @@ -177,7 +338,7 @@ struct sr_output { * For example, the module might store a pointer to a chunk of output * there, and only flush it when it reaches a certain size. */ - void *internal; + void *priv; }; /** Output module driver. */ @@ -205,11 +366,8 @@ struct sr_output_module { /** * Returns a NULL-terminated list of options this module can take. * Can be NULL, if the module has no options. - * - * If cached is TRUE, no new GVariants are created for the def and - * values fields; instead, the current values are returned. */ - struct sr_option *(*options) (gboolean cached); + const struct sr_option *(*options) (void); /** * This function is called once, at the beginning of an output stream. @@ -281,8 +439,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 */ @@ -335,7 +491,7 @@ SR_PRIV struct sr_channel *sr_channel_new(int index, int type, gboolean enabled, const char *name); /* Generic device instances */ -SR_PRIV struct sr_dev_inst *sr_dev_inst_new(int index, int status, +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); @@ -359,8 +515,10 @@ SR_PRIV void sr_usbtmc_dev_inst_free(struct sr_usbtmc_dev_inst *usbtmc); /*--- hwdriver.c ------------------------------------------------------------*/ +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(void); -SR_PRIV struct sr_config *sr_config_new(int key, GVariant *data); +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); @@ -375,8 +533,10 @@ SR_PRIV int sr_source_add_channel(GIOChannel *channel, int events, int timeout, /*--- 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; struct sr_trigger *trigger; @@ -410,6 +570,9 @@ 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); /*--- std.c -----------------------------------------------------------------*/ @@ -455,13 +618,12 @@ 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); -/*--- 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); @@ -469,16 +631,12 @@ 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_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, @@ -500,9 +658,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); @@ -512,7 +671,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); @@ -520,9 +679,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?" @@ -577,6 +737,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; }; @@ -619,7 +780,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 @@ -664,7 +825,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 @@ -682,7 +843,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 @@ -702,7 +863,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 @@ -710,7 +871,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 @@ -729,7 +890,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 @@ -740,4 +901,50 @@ 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/dmm/bm25x.c --------------------------------------------------*/ + +#define BRYMEN_BM25X_PACKET_SIZE 15 + +/* Dummy info struct. The parser does not use it. */ +struct bm25x_info { int dummy; }; + +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/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