X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Flibsigrok-internal.h;h=89cfb599c950d9dca6c483a79d9ca24b55ae0caa;hb=d65fcbcd4101c276e509746e1af73b3a95aa03fb;hp=8c58bd9f1e53e61c49985207cca5b2472321f699;hpb=155b680da482cea2381becb73c51cfb838bff31e;p=libsigrok.git diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index 8c58bd9f..89cfb599 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -143,6 +143,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 +168,230 @@ 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; + 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 TRUE This module knows the format. + * @retval FALSE This module does not know the format. + */ + int (*format_match) (GHashTable *metadata); + + /** + * 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. + * + * 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. + * + * @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. + * + * @retval SR_OK Success + * @retval other Negative error code. + */ + int (*receive) (const struct sr_input *in, GString *buf); + + /** + * 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. + * + * @retval SR_OK Success + * @retval other Negative error code. + */ + int (*cleanup) (struct sr_input *in); +}; + +/** Output module instance. */ +struct sr_output { + /** A pointer to this output's module. */ + const struct sr_output_module *module; + + /** + * The device for which this output module is creating output. 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. + * + * 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 *priv; +}; + +/** Output module driver. */ +struct sr_output_module { + /** + * A unique ID for this output module, suitable for use in command-line + * clients, [a-z0-9-]. Must not be NULL. + */ + char *id; + + /** + * A unique name for this output module, suitable for use in GUI + * clients, can contain UTF-8. Must not be NULL. + */ + const char *name; + + /** + * A short description of the output module. Must not be NULL. + * + * This can be displayed by frontends, e.g. when selecting the output + * module for saving a file. + */ + char *desc; + + /** + * Returns a NULL-terminated list of options this module can take. + * Can be NULL, if the module has no options. + */ + const struct sr_option *(*options) (void); + + /** + * This function is called once, at the beginning of an output stream. + * + * The device struct will be available in the output struct passed in, + * as well as the param field -- which may be NULL or an empty string, + * if no parameter was passed. + * + * The module can use this to initialize itself, create a struct for + * keeping state and storing it in the internal field. + * + * @param o Pointer to the respective 'struct sr_output'. + * + * @retval SR_OK Success + * @retval other Negative error code. + */ + int (*init) (struct sr_output *o, GHashTable *options); + + /** + * 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. + * + * @retval SR_OK Success + * @retval other Negative error code. + */ + int (*receive) (const struct sr_output *o, + 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. + * + * @retval SR_OK Success + * @retval other Negative error code. + */ + int (*cleanup) (struct sr_output *o); +}; + #ifdef HAVE_LIBUSB_1_0 /** USB device instance */ struct sr_usb_dev_inst { @@ -639,4 +872,15 @@ 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 -----------------------------------------*/ + +#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); + #endif