2011-01-15 14:06:58 +00:00
|
|
|
/*
|
2013-04-23 20:24:30 +00:00
|
|
|
* This file is part of the libsigrok project.
|
2011-01-15 14:06:58 +00:00
|
|
|
*
|
2013-03-24 10:21:00 +00:00
|
|
|
* Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
|
2011-01-15 14:06:58 +00:00
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2013-11-22 19:40:52 +00:00
|
|
|
/** @file
|
|
|
|
* @internal
|
|
|
|
*/
|
|
|
|
|
2013-12-10 16:39:31 +00:00
|
|
|
#ifndef LIBSIGROK_LIBSIGROK_INTERNAL_H
|
|
|
|
#define LIBSIGROK_LIBSIGROK_INTERNAL_H
|
2011-01-15 14:06:58 +00:00
|
|
|
|
2011-04-14 07:46:53 +00:00
|
|
|
#include <stdarg.h>
|
2011-11-24 21:42:02 +00:00
|
|
|
#include <glib.h>
|
2012-02-01 22:40:35 +00:00
|
|
|
#include "config.h" /* Needed for HAVE_LIBUSB_1_0 and others. */
|
2012-01-29 22:06:10 +00:00
|
|
|
#ifdef HAVE_LIBUSB_1_0
|
|
|
|
#include <libusb.h>
|
|
|
|
#endif
|
2013-11-13 18:56:13 +00:00
|
|
|
#ifdef HAVE_LIBSERIALPORT
|
2013-11-15 08:48:34 +00:00
|
|
|
#include <libserialport.h>
|
2013-11-13 18:56:13 +00:00
|
|
|
#endif
|
2011-04-14 07:46:53 +00:00
|
|
|
|
2012-10-21 22:30:12 +00:00
|
|
|
/**
|
|
|
|
* @file
|
|
|
|
*
|
|
|
|
* libsigrok private header file, only to be used internally.
|
|
|
|
*/
|
|
|
|
|
2011-02-20 17:29:05 +00:00
|
|
|
/*--- Macros ----------------------------------------------------------------*/
|
|
|
|
|
|
|
|
#ifndef ARRAY_SIZE
|
|
|
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef ARRAY_AND_SIZE
|
|
|
|
#define ARRAY_AND_SIZE(a) (a), ARRAY_SIZE(a)
|
|
|
|
#endif
|
|
|
|
|
2014-02-02 20:29:34 +00:00
|
|
|
/**
|
2014-08-26 20:45:38 +00:00
|
|
|
* Read a 8 bits unsigned integer out of memory.
|
2014-02-02 20:29:34 +00:00
|
|
|
* @param x a pointer to the input memory
|
2014-08-26 20:45:38 +00:00
|
|
|
* @return the corresponding unsigned integer
|
2014-02-02 20:29:34 +00:00
|
|
|
*/
|
|
|
|
#define R8(x) ((unsigned)((const uint8_t*)(x))[0])
|
|
|
|
|
2013-12-11 23:20:47 +00:00
|
|
|
/**
|
2014-08-26 20:45:38 +00:00
|
|
|
* Read a 16 bits big endian unsigned integer out of memory.
|
2013-12-11 23:20:47 +00:00
|
|
|
* @param x a pointer to the input memory
|
2014-08-26 20:45:38 +00:00
|
|
|
* @return the corresponding unsigned integer
|
2013-12-11 23:20:47 +00:00
|
|
|
*/
|
2013-12-30 18:23:54 +00:00
|
|
|
#define RB16(x) (((unsigned)((const uint8_t*)(x))[0] << 8) | \
|
|
|
|
(unsigned)((const uint8_t*)(x))[1])
|
2013-12-11 23:20:47 +00:00
|
|
|
|
|
|
|
/**
|
2014-08-26 20:45:38 +00:00
|
|
|
* Read a 16 bits little endian unsigned integer out of memory.
|
2013-12-11 23:20:47 +00:00
|
|
|
* @param x a pointer to the input memory
|
2014-08-26 20:45:38 +00:00
|
|
|
* @return the corresponding unsigned integer
|
2013-12-11 23:20:47 +00:00
|
|
|
*/
|
2013-12-30 18:23:54 +00:00
|
|
|
#define RL16(x) (((unsigned)((const uint8_t*)(x))[1] << 8) | \
|
|
|
|
(unsigned)((const uint8_t*)(x))[0])
|
2013-12-11 23:20:47 +00:00
|
|
|
|
|
|
|
/**
|
2014-08-26 20:45:38 +00:00
|
|
|
* Read a 16 bits little endian signed integer out of memory.
|
2013-12-11 23:20:47 +00:00
|
|
|
* @param x a pointer to the input memory
|
2014-08-26 20:45:38 +00:00
|
|
|
* @return the corresponding signed integer
|
|
|
|
*/
|
|
|
|
#define RL16S(x) ((int16_t) \
|
2014-09-18 23:03:32 +00:00
|
|
|
(((unsigned)((const uint8_t*)(x))[1] << 8) | \
|
2014-08-26 20:45:38 +00:00
|
|
|
(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
|
2013-12-11 23:20:47 +00:00
|
|
|
*/
|
2013-12-30 18:23:54 +00:00
|
|
|
#define RB32(x) (((unsigned)((const uint8_t*)(x))[0] << 24) | \
|
|
|
|
((unsigned)((const uint8_t*)(x))[1] << 16) | \
|
|
|
|
((unsigned)((const uint8_t*)(x))[2] << 8) | \
|
|
|
|
(unsigned)((const uint8_t*)(x))[3])
|
2013-12-11 23:20:47 +00:00
|
|
|
|
|
|
|
/**
|
2014-08-26 20:45:38 +00:00
|
|
|
* Read a 32 bits little endian unsigned integer out of memory.
|
2013-12-11 23:20:47 +00:00
|
|
|
* @param x a pointer to the input memory
|
2014-08-26 20:45:38 +00:00
|
|
|
* @return the corresponding unsigned integer
|
2013-12-11 23:20:47 +00:00
|
|
|
*/
|
2013-12-30 18:23:54 +00:00
|
|
|
#define RL32(x) (((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])
|
2013-12-11 23:20:47 +00:00
|
|
|
|
2014-02-02 20:33:09 +00:00
|
|
|
/**
|
2014-08-26 20:45:38 +00:00
|
|
|
* 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]))
|
|
|
|
|
2015-02-22 23:26:16 +00:00
|
|
|
/**
|
|
|
|
* Read a 32 bits big endian float out of memory.
|
|
|
|
* @param x a pointer to the input memory
|
|
|
|
* @return the corresponding float
|
|
|
|
*/
|
|
|
|
#define RBFL(x) ((union { uint32_t u; float f; }) { .u = RB32(x) }.f)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Read a 32 bits little endian float out of memory.
|
|
|
|
* @param x a pointer to the input memory
|
|
|
|
* @return the corresponding float
|
|
|
|
*/
|
|
|
|
#define RLFL(x) ((union { uint32_t u; float f; }) { .u = RL32(x) }.f)
|
|
|
|
|
2014-08-26 20:45:38 +00:00
|
|
|
/**
|
|
|
|
* Write a 8 bits unsigned integer to memory.
|
2014-02-02 20:33:09 +00:00
|
|
|
* @param p a pointer to the output memory
|
2014-08-26 20:45:38 +00:00
|
|
|
* @param x the input unsigned integer
|
2014-02-02 20:33:09 +00:00
|
|
|
*/
|
2015-03-11 22:32:39 +00:00
|
|
|
#define W8(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); } while (0)
|
2014-02-02 20:33:09 +00:00
|
|
|
|
|
|
|
/**
|
2014-08-26 20:45:38 +00:00
|
|
|
* Write a 16 bits unsigned integer to memory stored as big endian.
|
2014-02-02 20:33:09 +00:00
|
|
|
* @param p a pointer to the output memory
|
2014-08-26 20:45:38 +00:00
|
|
|
* @param x the input unsigned integer
|
2014-02-02 20:33:09 +00:00
|
|
|
*/
|
|
|
|
#define WB16(p, x) do { ((uint8_t*)(p))[1] = (uint8_t) (x); \
|
2015-03-11 22:32:39 +00:00
|
|
|
((uint8_t*)(p))[0] = (uint8_t)((x)>>8); } while (0)
|
2014-02-02 20:33:09 +00:00
|
|
|
|
|
|
|
/**
|
2014-08-26 20:45:38 +00:00
|
|
|
* Write a 16 bits unsigned integer to memory stored as little endian.
|
2014-02-02 20:33:09 +00:00
|
|
|
* @param p a pointer to the output memory
|
2014-08-26 20:45:38 +00:00
|
|
|
* @param x the input unsigned integer
|
2014-02-02 20:33:09 +00:00
|
|
|
*/
|
|
|
|
#define WL16(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); \
|
2015-03-11 22:32:39 +00:00
|
|
|
((uint8_t*)(p))[1] = (uint8_t)((x)>>8); } while (0)
|
2014-02-02 20:33:09 +00:00
|
|
|
|
|
|
|
/**
|
2014-08-26 20:45:38 +00:00
|
|
|
* Write a 32 bits unsigned integer to memory stored as big endian.
|
2014-02-02 20:33:09 +00:00
|
|
|
* @param p a pointer to the output memory
|
2014-08-26 20:45:38 +00:00
|
|
|
* @param x the input unsigned integer
|
2014-02-02 20:33:09 +00:00
|
|
|
*/
|
|
|
|
#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); \
|
2015-03-11 22:32:39 +00:00
|
|
|
((uint8_t*)(p))[0] = (uint8_t)((x)>>24); } while (0)
|
2014-02-02 20:33:09 +00:00
|
|
|
|
|
|
|
/**
|
2014-08-26 20:45:38 +00:00
|
|
|
* Write a 32 bits unsigned integer to memory stored as little endian.
|
2014-02-02 20:33:09 +00:00
|
|
|
* @param p a pointer to the output memory
|
2014-08-26 20:45:38 +00:00
|
|
|
* @param x the input unsigned integer
|
2014-02-02 20:33:09 +00:00
|
|
|
*/
|
|
|
|
#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); \
|
2015-03-11 22:32:39 +00:00
|
|
|
((uint8_t*)(p))[3] = (uint8_t)((x)>>24); } while (0)
|
2014-02-02 20:33:09 +00:00
|
|
|
|
2015-02-22 23:26:16 +00:00
|
|
|
/**
|
|
|
|
* Write a 32 bits float to memory stored as big endian.
|
|
|
|
* @param p a pointer to the output memory
|
|
|
|
* @param x the input float
|
|
|
|
*/
|
|
|
|
#define WBFL(p, x) WB32(p, (union { uint32_t u; float f; }) { .f = x }.u)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Write a 32 bits float to memory stored as little endian.
|
|
|
|
* @param p a pointer to the output memory
|
|
|
|
* @param x the input float
|
|
|
|
*/
|
|
|
|
#define WLFL(p, x) WL32(p, (union { uint32_t u; float f; }) { .f = x }.u)
|
|
|
|
|
2013-10-28 21:59:32 +00:00
|
|
|
/* Portability fixes for FreeBSD. */
|
|
|
|
#ifdef __FreeBSD__
|
|
|
|
#define LIBUSB_CLASS_APPLICATION 0xfe
|
2014-12-30 23:32:44 +00:00
|
|
|
#define libusb_has_capability(x) 0
|
2013-10-28 21:59:32 +00:00
|
|
|
#define libusb_handle_events_timeout_completed(ctx, tv, c) \
|
|
|
|
libusb_handle_events_timeout(ctx, tv)
|
|
|
|
#endif
|
|
|
|
|
2014-08-25 23:48:27 +00:00
|
|
|
/* 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
|
|
|
|
|
2012-10-21 18:23:14 +00:00
|
|
|
struct sr_context {
|
2015-04-04 18:57:22 +00:00
|
|
|
struct sr_dev_driver **driver_list;
|
2012-10-21 18:23:36 +00:00
|
|
|
#ifdef HAVE_LIBUSB_1_0
|
|
|
|
libusb_context *libusb_ctx;
|
2013-12-22 17:27:13 +00:00
|
|
|
gboolean usb_source_present;
|
2015-09-04 16:51:55 +00:00
|
|
|
# ifdef G_OS_WIN32
|
|
|
|
int64_t usb_timeout;
|
|
|
|
int64_t usb_due;
|
2014-05-03 20:14:01 +00:00
|
|
|
sr_receive_data_callback usb_cb;
|
2013-12-22 07:16:56 +00:00
|
|
|
void *usb_cb_data;
|
2015-09-04 16:51:55 +00:00
|
|
|
# endif
|
2012-10-21 18:23:36 +00:00
|
|
|
#endif
|
2012-10-21 18:23:14 +00:00
|
|
|
};
|
|
|
|
|
2014-08-15 17:59:38 +00:00
|
|
|
/** 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,
|
|
|
|
};
|
|
|
|
|
2014-08-03 13:12:49 +00:00
|
|
|
/** Input (file) module struct. */
|
|
|
|
struct sr_input {
|
|
|
|
/**
|
|
|
|
* A pointer to this input module's 'struct sr_input_module'.
|
|
|
|
*/
|
2014-08-10 14:57:04 +00:00
|
|
|
const struct sr_input_module *module;
|
|
|
|
GString *buf;
|
2014-08-03 13:12:49 +00:00
|
|
|
struct sr_dev_inst *sdi;
|
2014-09-22 13:22:41 +00:00
|
|
|
gboolean sdi_ready;
|
2014-08-10 14:57:04 +00:00
|
|
|
void *priv;
|
2014-08-03 13:12:49 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/** Input (file) module driver. */
|
|
|
|
struct sr_input_module {
|
2014-08-10 14:57:04 +00:00
|
|
|
/**
|
2014-08-15 21:31:39 +00:00
|
|
|
* A unique ID for this input module, suitable for use in command-line
|
2014-08-10 14:57:04 +00:00
|
|
|
* clients, [a-z0-9-]. Must not be NULL.
|
|
|
|
*/
|
|
|
|
const char *id;
|
2014-08-03 13:12:49 +00:00
|
|
|
|
|
|
|
/**
|
2014-08-15 21:31:39 +00:00
|
|
|
* A unique name for this input module, suitable for use in GUI
|
2014-08-10 14:57:04 +00:00
|
|
|
* clients, can contain UTF-8. Must not be NULL.
|
2014-08-03 13:12:49 +00:00
|
|
|
*/
|
2014-08-10 14:57:04 +00:00
|
|
|
const char *name;
|
2014-08-03 13:12:49 +00:00
|
|
|
|
|
|
|
/**
|
2014-08-15 21:31:39 +00:00
|
|
|
* A short description of the input module. Must not be NULL.
|
2014-08-03 13:12:49 +00:00
|
|
|
*
|
2014-08-15 21:31:39 +00:00
|
|
|
* This can be displayed by frontends, e.g. when selecting the input
|
2014-08-10 14:57:04 +00:00
|
|
|
* module for saving a file.
|
|
|
|
*/
|
|
|
|
const char *desc;
|
|
|
|
|
2015-01-21 05:56:51 +00:00
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
|
2014-08-10 14:57:04 +00:00
|
|
|
/**
|
|
|
|
* 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.
|
2014-08-03 13:12:49 +00:00
|
|
|
*
|
2014-08-27 22:22:13 +00:00
|
|
|
* @retval SR_OK This module knows the format.
|
2014-09-23 10:05:31 +00:00
|
|
|
* @retval SR_ERR_NA There wasn't enough data for this module to
|
2014-08-27 22:22:13 +00:00
|
|
|
* 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.
|
2014-08-03 13:12:49 +00:00
|
|
|
*/
|
2014-08-10 14:57:04 +00:00
|
|
|
int (*format_match) (GHashTable *metadata);
|
2014-08-03 13:12:49 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize the input module.
|
|
|
|
*
|
|
|
|
* @retval SR_OK Success
|
|
|
|
* @retval other Negative error code.
|
|
|
|
*/
|
2014-08-10 14:57:04 +00:00
|
|
|
int (*init) (struct sr_input *in, GHashTable *options);
|
2014-08-03 13:12:49 +00:00
|
|
|
|
|
|
|
/**
|
2014-09-23 10:05:31 +00:00
|
|
|
* Send data to the specified input instance.
|
2014-08-03 13:12:49 +00:00
|
|
|
*
|
2014-09-23 10:05:31 +00:00
|
|
|
* When an input module instance is created with sr_input_new(), this
|
|
|
|
* function is used to feed data to the instance.
|
2014-08-03 13:12:49 +00:00
|
|
|
*
|
2014-09-23 10:05:31 +00:00
|
|
|
* 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.
|
2014-08-10 14:57:04 +00:00
|
|
|
*
|
|
|
|
* @retval SR_OK Success
|
|
|
|
* @retval other Negative error code.
|
|
|
|
*/
|
2014-09-22 13:22:41 +00:00
|
|
|
int (*receive) (struct sr_input *in, GString *buf);
|
2014-08-10 14:57:04 +00:00
|
|
|
|
2014-09-23 10:05:31 +00:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2014-09-23 09:12:33 +00:00
|
|
|
int (*end) (struct sr_input *in);
|
|
|
|
|
2014-08-10 14:57:04 +00:00
|
|
|
/**
|
|
|
|
* 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.
|
2014-08-03 13:12:49 +00:00
|
|
|
*
|
2014-09-23 10:05:31 +00:00
|
|
|
* This function is optional.
|
|
|
|
*
|
2014-08-03 13:12:49 +00:00
|
|
|
* @retval SR_OK Success
|
|
|
|
* @retval other Negative error code.
|
|
|
|
*/
|
2014-09-23 09:27:50 +00:00
|
|
|
void (*cleanup) (struct sr_input *in);
|
2014-08-03 13:12:49 +00:00
|
|
|
};
|
|
|
|
|
2014-07-25 03:56:52 +00:00
|
|
|
/** 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;
|
|
|
|
|
2015-07-29 19:19:49 +00:00
|
|
|
/**
|
|
|
|
* The name of the file that the data should be written to.
|
|
|
|
*/
|
|
|
|
const char *filename;
|
|
|
|
|
2014-07-25 03:56:52 +00:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2014-07-28 13:56:17 +00:00
|
|
|
void *priv;
|
2014-07-25 03:56:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/** 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;
|
|
|
|
|
2015-01-21 06:02:14 +00:00
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
|
2015-08-15 21:40:29 +00:00
|
|
|
/**
|
|
|
|
* Bitfield containing flags that describe certain properties
|
|
|
|
* this output module may or may not have.
|
|
|
|
* @see sr_output_flags
|
|
|
|
*/
|
|
|
|
const uint64_t flags;
|
|
|
|
|
2014-07-25 03:56:52 +00:00
|
|
|
/**
|
|
|
|
* Returns a NULL-terminated list of options this module can take.
|
|
|
|
* Can be NULL, if the module has no options.
|
|
|
|
*/
|
2014-08-15 18:21:50 +00:00
|
|
|
const struct sr_option *(*options) (void);
|
2014-07-25 03:56:52 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 <code>internal</code> 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);
|
|
|
|
|
|
|
|
/**
|
2015-03-22 15:04:18 +00:00
|
|
|
* This function is passed a copy of every packet in the data feed.
|
2014-07-25 03:56:52 +00:00
|
|
|
* Any output generated by the output module in response to the
|
|
|
|
* packet should be returned in a newly allocated GString
|
|
|
|
* <code>out</code>, which will be freed by the caller.
|
|
|
|
*
|
|
|
|
* Packets not of interest to the output module can just be ignored,
|
|
|
|
* and the <code>out</code> 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);
|
|
|
|
};
|
|
|
|
|
2015-02-10 19:42:50 +00:00
|
|
|
/** 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);
|
|
|
|
};
|
|
|
|
|
2012-01-29 22:06:10 +00:00
|
|
|
#ifdef HAVE_LIBUSB_1_0
|
2013-11-22 19:40:52 +00:00
|
|
|
/** USB device instance */
|
2012-02-17 20:02:52 +00:00
|
|
|
struct sr_usb_dev_inst {
|
2013-12-09 21:49:12 +00:00
|
|
|
/** USB bus */
|
|
|
|
uint8_t bus;
|
|
|
|
/** Device address on USB bus */
|
|
|
|
uint8_t address;
|
|
|
|
/** libusb device handle */
|
|
|
|
struct libusb_device_handle *devhdl;
|
2012-01-29 22:06:10 +00:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2013-11-13 18:56:13 +00:00
|
|
|
#ifdef HAVE_LIBSERIALPORT
|
2013-10-27 15:51:24 +00:00
|
|
|
#define SERIAL_PARITY_NONE SP_PARITY_NONE
|
|
|
|
#define SERIAL_PARITY_EVEN SP_PARITY_EVEN
|
|
|
|
#define SERIAL_PARITY_ODD SP_PARITY_ODD
|
2012-02-17 20:02:52 +00:00
|
|
|
struct sr_serial_dev_inst {
|
2013-12-09 21:49:12 +00:00
|
|
|
/** Port name, e.g. '/dev/tty42'. */
|
|
|
|
char *port;
|
|
|
|
/** Comm params for serial_set_paramstr(). */
|
|
|
|
char *serialcomm;
|
|
|
|
/** libserialport port handle */
|
|
|
|
struct sp_port *data;
|
2013-12-20 17:45:46 +00:00
|
|
|
/** libserialport event set */
|
|
|
|
struct sp_event_set *event_set;
|
|
|
|
/** GPollFDs for event polling */
|
|
|
|
GPollFD *pollfds;
|
2012-01-29 22:06:10 +00:00
|
|
|
};
|
2013-11-13 18:56:13 +00:00
|
|
|
#endif
|
2012-01-29 22:06:10 +00:00
|
|
|
|
2013-11-29 00:48:42 +00:00
|
|
|
struct sr_usbtmc_dev_inst {
|
|
|
|
char *device;
|
|
|
|
int fd;
|
|
|
|
};
|
|
|
|
|
2012-10-19 08:35:11 +00:00
|
|
|
/* Private driver context. */
|
|
|
|
struct drv_context {
|
2013-12-09 21:49:12 +00:00
|
|
|
/** sigrok context */
|
|
|
|
struct sr_context *sr_ctx;
|
2012-10-19 08:35:11 +00:00
|
|
|
GSList *instances;
|
|
|
|
};
|
|
|
|
|
2012-07-24 22:20:06 +00:00
|
|
|
/*--- log.c -----------------------------------------------------------------*/
|
|
|
|
|
|
|
|
SR_PRIV int sr_log(int loglevel, const char *format, ...);
|
|
|
|
SR_PRIV int sr_spew(const char *format, ...);
|
|
|
|
SR_PRIV int sr_dbg(const char *format, ...);
|
|
|
|
SR_PRIV int sr_info(const char *format, ...);
|
|
|
|
SR_PRIV int sr_warn(const char *format, ...);
|
|
|
|
SR_PRIV int sr_err(const char *format, ...);
|
|
|
|
|
2013-12-23 03:38:35 +00:00
|
|
|
/* Message logging helpers with subsystem-specific prefix string. */
|
|
|
|
#ifndef NO_LOG_WRAPPERS
|
|
|
|
#define sr_log(l, s, args...) sr_log(l, "%s: " s, LOG_PREFIX, ## args)
|
|
|
|
#define sr_spew(s, args...) sr_spew("%s: " s, LOG_PREFIX, ## args)
|
|
|
|
#define sr_dbg(s, args...) sr_dbg("%s: " s, LOG_PREFIX, ## args)
|
|
|
|
#define sr_info(s, args...) sr_info("%s: " s, LOG_PREFIX, ## args)
|
|
|
|
#define sr_warn(s, args...) sr_warn("%s: " s, LOG_PREFIX, ## args)
|
|
|
|
#define sr_err(s, args...) sr_err("%s: " s, LOG_PREFIX, ## args)
|
|
|
|
#endif
|
|
|
|
|
2012-07-24 22:20:06 +00:00
|
|
|
/*--- device.c --------------------------------------------------------------*/
|
|
|
|
|
2014-03-24 15:05:42 +00:00
|
|
|
/** Values for the changes argument of sr_dev_driver.config_channel_set. */
|
2014-01-19 19:39:11 +00:00
|
|
|
enum {
|
2014-03-24 15:11:45 +00:00
|
|
|
/** The enabled state of the channel has been changed. */
|
2014-03-24 21:39:42 +00:00
|
|
|
SR_CHANNEL_SET_ENABLED = 1 << 0,
|
2014-01-19 19:39:11 +00:00
|
|
|
};
|
|
|
|
|
2015-03-19 21:37:33 +00:00
|
|
|
SR_PRIV struct sr_channel *sr_channel_new(struct sr_dev_inst *sdi,
|
|
|
|
int index, int type, gboolean enabled, const char *name);
|
2015-08-16 13:54:02 +00:00
|
|
|
SR_PRIV struct sr_channel *sr_next_enabled_channel(const struct sr_dev_inst *sdi,
|
|
|
|
struct sr_channel *cur_channel);
|
2012-07-24 22:20:06 +00:00
|
|
|
|
2014-11-11 11:24:08 +00:00
|
|
|
/** 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;
|
|
|
|
};
|
|
|
|
|
2012-07-24 22:20:06 +00:00
|
|
|
/* Generic device instances */
|
|
|
|
SR_PRIV void sr_dev_inst_free(struct sr_dev_inst *sdi);
|
|
|
|
|
2012-10-23 22:41:21 +00:00
|
|
|
#ifdef HAVE_LIBUSB_1_0
|
2012-01-29 22:06:10 +00:00
|
|
|
/* USB-specific instances */
|
2012-02-17 20:02:52 +00:00
|
|
|
SR_PRIV struct sr_usb_dev_inst *sr_usb_dev_inst_new(uint8_t bus,
|
2012-01-29 22:06:10 +00:00
|
|
|
uint8_t address, struct libusb_device_handle *hdl);
|
2012-02-17 20:02:52 +00:00
|
|
|
SR_PRIV void sr_usb_dev_inst_free(struct sr_usb_dev_inst *usb);
|
2012-01-29 22:06:10 +00:00
|
|
|
#endif
|
|
|
|
|
2013-11-13 18:56:13 +00:00
|
|
|
#ifdef HAVE_LIBSERIALPORT
|
2012-01-29 22:06:10 +00:00
|
|
|
/* Serial-specific instances */
|
2012-11-11 19:38:47 +00:00
|
|
|
SR_PRIV struct sr_serial_dev_inst *sr_serial_dev_inst_new(const char *port,
|
|
|
|
const char *serialcomm);
|
2012-02-17 20:02:52 +00:00
|
|
|
SR_PRIV void sr_serial_dev_inst_free(struct sr_serial_dev_inst *serial);
|
2013-11-13 18:56:13 +00:00
|
|
|
#endif
|
2012-01-29 22:06:10 +00:00
|
|
|
|
2013-11-29 00:48:42 +00:00
|
|
|
/* USBTMC-specific instances */
|
|
|
|
SR_PRIV struct sr_usbtmc_dev_inst *sr_usbtmc_dev_inst_new(const char *device);
|
|
|
|
SR_PRIV void sr_usbtmc_dev_inst_free(struct sr_usbtmc_dev_inst *usbtmc);
|
2011-04-14 07:46:53 +00:00
|
|
|
|
2012-02-28 22:52:30 +00:00
|
|
|
/*--- hwdriver.c ------------------------------------------------------------*/
|
2012-02-13 01:13:51 +00:00
|
|
|
|
2015-04-04 18:57:22 +00:00
|
|
|
extern SR_PRIV struct sr_dev_driver **drivers_lists[];
|
|
|
|
|
2014-09-14 03:47:12 +00:00
|
|
|
SR_PRIV const GVariantType *sr_variant_type_get(int datatype);
|
2014-09-16 15:49:20 +00:00
|
|
|
SR_PRIV int sr_variant_type_check(uint32_t key, GVariant *data);
|
2015-04-04 18:57:22 +00:00
|
|
|
SR_PRIV void sr_hw_cleanup_all(const struct sr_context *ctx);
|
2014-09-16 15:49:20 +00:00
|
|
|
SR_PRIV struct sr_config *sr_config_new(uint32_t key, GVariant *data);
|
2013-03-25 19:23:13 +00:00
|
|
|
SR_PRIV void sr_config_free(struct sr_config *src);
|
2012-07-24 22:20:06 +00:00
|
|
|
SR_PRIV int sr_source_remove(int fd);
|
2014-05-04 22:07:00 +00:00
|
|
|
SR_PRIV int sr_source_remove_pollfd(GPollFD *pollfd);
|
|
|
|
SR_PRIV int sr_source_remove_channel(GIOChannel *channel);
|
2012-07-24 22:20:06 +00:00
|
|
|
SR_PRIV int sr_source_add(int fd, int events, int timeout,
|
2014-05-03 20:14:01 +00:00
|
|
|
sr_receive_data_callback cb, void *cb_data);
|
2014-05-04 22:07:00 +00:00
|
|
|
SR_PRIV int sr_source_add_pollfd(GPollFD *pollfd, int timeout,
|
|
|
|
sr_receive_data_callback cb, void *cb_data);
|
|
|
|
SR_PRIV int sr_source_add_channel(GIOChannel *channel, int events, int timeout,
|
|
|
|
sr_receive_data_callback cb, void *cb_data);
|
2012-02-13 01:13:51 +00:00
|
|
|
|
2012-02-13 02:36:32 +00:00
|
|
|
/*--- session.c -------------------------------------------------------------*/
|
|
|
|
|
2013-11-22 14:02:12 +00:00
|
|
|
struct sr_session {
|
2015-03-25 01:43:30 +00:00
|
|
|
/** Context this session exists in. */
|
|
|
|
struct sr_context *ctx;
|
2014-10-12 14:39:36 +00:00
|
|
|
/** List of struct sr_dev_inst pointers. */
|
2013-11-22 14:02:12 +00:00
|
|
|
GSList *devs;
|
2014-10-12 14:56:36 +00:00
|
|
|
/** List of struct sr_dev_inst pointers owned by this session. */
|
|
|
|
GSList *owned_devs;
|
2013-11-22 14:02:12 +00:00
|
|
|
/** List of struct datafeed_callback pointers. */
|
|
|
|
GSList *datafeed_callbacks;
|
2015-02-10 20:24:23 +00:00
|
|
|
GSList *transforms;
|
2014-05-22 23:21:58 +00:00
|
|
|
struct sr_trigger *trigger;
|
2015-08-30 19:43:30 +00:00
|
|
|
|
2013-11-22 14:02:12 +00:00
|
|
|
gboolean running;
|
|
|
|
|
|
|
|
/*
|
session: Allow multiple poll FDs per event source
Turns out that having one event source per libusb poll FD is
a bad idea. There is only a single callback for all poll FDs,
and libusb expects to be called only once per poll iteration,
no matter how many FDs triggered.
Also, they should all share the same timeout, which should get
reset on events from any polled FD. The new timeout handling made
this problem apparent, as it caused the callback to be invoked
multiple times on timeouts, once for each separate event source.
In order to fix this, change the implementation to allow for an
arbitrary number of poll FDs per event source. This number is
zero for timer FDs, one for normal I/O sources, and one or more
for libusb sources (Unix only).
Also, on Windows, do not get an additional timeout from libusb
in the event loop. This is only appropriate when polling the
libusb FDs directly, which we aren't doing on Windows.
2015-09-01 01:36:03 +00:00
|
|
|
* Event sources and poll FDs are stored in the same order in the
|
|
|
|
* the sources and pollfds arrays. However, each source may cover
|
|
|
|
* any number of associated poll FDs, so the indices do not match.
|
|
|
|
*
|
|
|
|
* We cannot embed the GPollFD into the source struct since we want
|
2015-08-31 00:35:57 +00:00
|
|
|
* to be able to pass the array of all poll descriptors to g_poll().
|
|
|
|
*/
|
|
|
|
GArray *sources;
|
|
|
|
GArray *pollfds;
|
2013-11-22 14:02:12 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
2013-12-09 21:49:12 +00:00
|
|
|
/** Mutex protecting access to abort_session. */
|
|
|
|
GMutex stop_mutex;
|
|
|
|
/** Abort current session. See sr_session_stop(). */
|
2013-11-22 14:02:12 +00:00
|
|
|
gboolean abort_session;
|
|
|
|
};
|
|
|
|
|
2015-08-30 19:43:30 +00:00
|
|
|
SR_PRIV int sr_session_source_add_internal(struct sr_session *session,
|
session: Allow multiple poll FDs per event source
Turns out that having one event source per libusb poll FD is
a bad idea. There is only a single callback for all poll FDs,
and libusb expects to be called only once per poll iteration,
no matter how many FDs triggered.
Also, they should all share the same timeout, which should get
reset on events from any polled FD. The new timeout handling made
this problem apparent, as it caused the callback to be invoked
multiple times on timeouts, once for each separate event source.
In order to fix this, change the implementation to allow for an
arbitrary number of poll FDs per event source. This number is
zero for timer FDs, one for normal I/O sources, and one or more
for libusb sources (Unix only).
Also, on Windows, do not get an additional timeout from libusb
in the event loop. This is only appropriate when polling the
libusb FDs directly, which we aren't doing on Windows.
2015-09-01 01:36:03 +00:00
|
|
|
const GPollFD *pollfds, int num_fds, int timeout,
|
|
|
|
sr_receive_data_callback cb, void *cb_data,
|
|
|
|
gintptr poll_object);
|
|
|
|
SR_PRIV int sr_session_source_remove_internal(struct sr_session *session,
|
|
|
|
gintptr poll_object);
|
2012-07-22 13:31:56 +00:00
|
|
|
SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi,
|
2013-04-16 22:41:01 +00:00
|
|
|
const struct sr_datafeed_packet *packet);
|
2014-05-04 22:07:00 +00:00
|
|
|
SR_PRIV int sr_session_stop_sync(struct sr_session *session);
|
2013-09-18 11:28:07 +00:00
|
|
|
SR_PRIV int sr_sessionfile_check(const char *filename);
|
2014-09-25 23:33:15 +00:00
|
|
|
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);
|
2012-02-13 02:36:32 +00:00
|
|
|
|
2014-11-13 23:50:46 +00:00
|
|
|
/*--- 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);
|
|
|
|
|
2013-01-29 11:55:00 +00:00
|
|
|
/*--- std.c -----------------------------------------------------------------*/
|
|
|
|
|
2014-05-03 20:14:01 +00:00
|
|
|
typedef int (*dev_close_callback)(struct sr_dev_inst *sdi);
|
|
|
|
typedef void (*std_dev_clear_callback)(void *priv);
|
2013-02-01 22:45:32 +00:00
|
|
|
|
2013-05-31 13:46:57 +00:00
|
|
|
SR_PRIV int std_init(struct sr_context *sr_ctx, struct sr_dev_driver *di,
|
2013-04-16 22:41:01 +00:00
|
|
|
const char *prefix);
|
2013-11-13 18:56:13 +00:00
|
|
|
#ifdef HAVE_LIBSERIALPORT
|
2013-12-07 19:26:15 +00:00
|
|
|
SR_PRIV int std_serial_dev_open(struct sr_dev_inst *sdi);
|
2013-12-07 19:39:55 +00:00
|
|
|
SR_PRIV int std_serial_dev_acquisition_stop(struct sr_dev_inst *sdi,
|
2014-05-03 20:14:01 +00:00
|
|
|
void *cb_data, dev_close_callback dev_close_fn,
|
2013-04-16 22:41:01 +00:00
|
|
|
struct sr_serial_dev_inst *serial, const char *prefix);
|
2013-11-13 18:56:13 +00:00
|
|
|
#endif
|
2013-02-06 18:57:32 +00:00
|
|
|
SR_PRIV int std_session_send_df_header(const struct sr_dev_inst *sdi,
|
2013-04-16 22:41:01 +00:00
|
|
|
const char *prefix);
|
|
|
|
SR_PRIV int std_dev_clear(const struct sr_dev_driver *driver,
|
2014-05-03 20:14:01 +00:00
|
|
|
std_dev_clear_callback clear_private);
|
2013-12-07 18:41:09 +00:00
|
|
|
SR_PRIV int std_serial_dev_close(struct sr_dev_inst *sdi);
|
2013-02-06 18:57:32 +00:00
|
|
|
|
2013-12-03 16:16:59 +00:00
|
|
|
/*--- strutil.c -------------------------------------------------------------*/
|
|
|
|
|
|
|
|
SR_PRIV int sr_atol(const char *str, long *ret);
|
|
|
|
SR_PRIV int sr_atoi(const char *str, int *ret);
|
|
|
|
SR_PRIV int sr_atod(const char *str, double *ret);
|
|
|
|
SR_PRIV int sr_atof(const char *str, float *ret);
|
2014-01-16 14:28:48 +00:00
|
|
|
SR_PRIV int sr_atof_ascii(const char *str, float *ret);
|
2013-12-03 16:16:59 +00:00
|
|
|
|
2014-05-28 13:53:27 +00:00
|
|
|
/*--- soft-trigger.c --------------------------------------------------------*/
|
|
|
|
|
|
|
|
struct soft_trigger_logic {
|
|
|
|
const struct sr_dev_inst *sdi;
|
|
|
|
const struct sr_trigger *trigger;
|
|
|
|
int count;
|
|
|
|
int unitsize;
|
|
|
|
int cur_stage;
|
|
|
|
uint8_t *prev_sample;
|
2014-11-25 11:23:34 +00:00
|
|
|
uint8_t *pre_trigger_buffer;
|
|
|
|
uint8_t *pre_trigger_head;
|
|
|
|
int pre_trigger_size;
|
|
|
|
int pre_trigger_fill;
|
2014-05-28 13:53:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
SR_PRIV struct soft_trigger_logic *soft_trigger_logic_new(
|
2014-11-25 11:23:34 +00:00
|
|
|
const struct sr_dev_inst *sdi, struct sr_trigger *trigger,
|
|
|
|
int pre_trigger_samples);
|
2014-05-28 13:53:27 +00:00
|
|
|
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,
|
2014-11-25 11:23:34 +00:00
|
|
|
int len, int *pre_trigger_samples);
|
2014-05-28 13:53:27 +00:00
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/serial.c -----------------------------------------------------*/
|
2011-01-19 00:16:19 +00:00
|
|
|
|
2013-11-13 18:56:13 +00:00
|
|
|
#ifdef HAVE_LIBSERIALPORT
|
2012-12-02 11:45:54 +00:00
|
|
|
enum {
|
|
|
|
SERIAL_RDWR = 1,
|
|
|
|
SERIAL_RDONLY = 2,
|
|
|
|
};
|
|
|
|
|
2014-05-03 20:14:01 +00:00
|
|
|
typedef gboolean (*packet_valid_callback)(const uint8_t *buf);
|
2012-11-14 17:35:37 +00:00
|
|
|
|
2012-11-11 19:38:47 +00:00
|
|
|
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);
|
2014-11-01 18:35:30 +00:00
|
|
|
SR_PRIV int serial_drain(struct sr_serial_dev_inst *serial);
|
2013-12-30 02:52:17 +00:00
|
|
|
SR_PRIV int serial_write_blocking(struct sr_serial_dev_inst *serial,
|
2014-09-28 12:05:33 +00:00
|
|
|
const void *buf, size_t count, unsigned int timeout_ms);
|
2013-12-30 02:52:17 +00:00
|
|
|
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,
|
2014-09-28 12:05:33 +00:00
|
|
|
size_t count, unsigned int timeout_ms);
|
2013-12-30 02:52:17 +00:00
|
|
|
SR_PRIV int serial_read_nonblocking(struct sr_serial_dev_inst *serial, void *buf,
|
|
|
|
size_t count);
|
2012-11-11 19:38:47 +00:00
|
|
|
SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate,
|
2012-11-26 23:50:51 +00:00
|
|
|
int bits, int parity, int stopbits, int flowcontrol, int rts, int dtr);
|
2012-11-11 19:38:47 +00:00
|
|
|
SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial,
|
|
|
|
const char *paramstr);
|
|
|
|
SR_PRIV int serial_readline(struct sr_serial_dev_inst *serial, char **buf,
|
|
|
|
int *buflen, gint64 timeout_ms);
|
2012-11-14 17:35:37 +00:00
|
|
|
SR_PRIV int serial_stream_detect(struct sr_serial_dev_inst *serial,
|
|
|
|
uint8_t *buf, size_t *buflen,
|
2014-05-03 20:14:01 +00:00
|
|
|
size_t packet_size,
|
|
|
|
packet_valid_callback is_valid,
|
2012-11-14 17:35:37 +00:00
|
|
|
uint64_t timeout_ms, int baudrate);
|
2013-10-25 16:13:20 +00:00
|
|
|
SR_PRIV int sr_serial_extract_options(GSList *options, const char **serial_device,
|
|
|
|
const char **serial_options);
|
2014-07-21 12:35:27 +00:00
|
|
|
SR_PRIV int serial_source_add(struct sr_session *session,
|
|
|
|
struct sr_serial_dev_inst *serial, int events, int timeout,
|
|
|
|
sr_receive_data_callback cb, void *cb_data);
|
|
|
|
SR_PRIV int serial_source_remove(struct sr_session *session,
|
|
|
|
struct sr_serial_dev_inst *serial);
|
2014-02-02 20:47:45 +00:00
|
|
|
SR_PRIV GSList *sr_serial_find_usb(uint16_t vendor_id, uint16_t product_id);
|
2014-10-06 10:10:25 +00:00
|
|
|
SR_PRIV int serial_timeout(struct sr_serial_dev_inst *port, int num_bytes);
|
2013-11-13 18:56:13 +00:00
|
|
|
#endif
|
2011-01-15 14:06:58 +00:00
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/ezusb.c ------------------------------------------------------*/
|
2011-01-19 00:16:19 +00:00
|
|
|
|
2011-02-02 09:25:52 +00:00
|
|
|
#ifdef HAVE_LIBUSB_1_0
|
2012-02-01 22:40:35 +00:00
|
|
|
SR_PRIV int ezusb_reset(struct libusb_device_handle *hdl, int set_clear);
|
|
|
|
SR_PRIV int ezusb_install_firmware(libusb_device_handle *hdl,
|
|
|
|
const char *filename);
|
|
|
|
SR_PRIV int ezusb_upload_firmware(libusb_device *dev, int configuration,
|
|
|
|
const char *filename);
|
2011-02-02 09:25:52 +00:00
|
|
|
#endif
|
2011-01-19 00:16:19 +00:00
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/usb.c --------------------------------------------------------*/
|
2012-11-02 20:04:21 +00:00
|
|
|
|
|
|
|
#ifdef HAVE_LIBUSB_1_0
|
2012-12-04 22:25:11 +00:00
|
|
|
SR_PRIV GSList *sr_usb_find(libusb_context *usb_ctx, const char *conn);
|
2012-11-02 20:04:21 +00:00
|
|
|
SR_PRIV int sr_usb_open(libusb_context *usb_ctx, struct sr_usb_dev_inst *usb);
|
2015-08-16 18:00:26 +00:00
|
|
|
SR_PRIV void sr_usb_close(struct sr_usb_dev_inst *usb);
|
2014-07-21 12:35:27 +00:00
|
|
|
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);
|
2014-10-06 22:02:10 +00:00
|
|
|
SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len);
|
2012-11-02 20:04:21 +00:00
|
|
|
#endif
|
|
|
|
|
2013-10-29 11:15:47 +00:00
|
|
|
|
2015-02-22 23:13:31 +00:00
|
|
|
/*--- modbus/modbus.c -------------------------------------------------------*/
|
|
|
|
|
|
|
|
struct sr_modbus_dev_inst {
|
|
|
|
const char *name;
|
|
|
|
const char *prefix;
|
|
|
|
int priv_size;
|
|
|
|
GSList *(*scan)(int modbusaddr);
|
|
|
|
int (*dev_inst_new)(void *priv, const char *resource,
|
|
|
|
char **params, const char *serialcomm, int modbusaddr);
|
|
|
|
int (*open)(void *priv);
|
|
|
|
int (*source_add)(struct sr_session *session, void *priv, int events,
|
|
|
|
int timeout, sr_receive_data_callback cb, void *cb_data);
|
|
|
|
int (*source_remove)(struct sr_session *session, void *priv);
|
|
|
|
int (*send)(void *priv, const uint8_t *buffer, int buffer_size);
|
|
|
|
int (*read_begin)(void *priv, uint8_t *function_code);
|
|
|
|
int (*read_data)(void *priv, uint8_t *buf, int maxlen);
|
|
|
|
int (*read_end)(void *priv);
|
|
|
|
int (*close)(void *priv);
|
|
|
|
void (*free)(void *priv);
|
|
|
|
unsigned int read_timeout_ms;
|
|
|
|
void *priv;
|
|
|
|
};
|
|
|
|
|
|
|
|
SR_PRIV GSList *sr_modbus_scan(struct drv_context *drvc, GSList *options,
|
|
|
|
struct sr_dev_inst *(*probe_device)(struct sr_modbus_dev_inst *modbus));
|
|
|
|
SR_PRIV struct sr_modbus_dev_inst *modbus_dev_inst_new(const char *resource,
|
|
|
|
const char *serialcomm, int modbusaddr);
|
|
|
|
SR_PRIV int sr_modbus_open(struct sr_modbus_dev_inst *modbus);
|
|
|
|
SR_PRIV int sr_modbus_source_add(struct sr_session *session,
|
|
|
|
struct sr_modbus_dev_inst *modbus, int events, int timeout,
|
|
|
|
sr_receive_data_callback cb, void *cb_data);
|
|
|
|
SR_PRIV int sr_modbus_source_remove(struct sr_session *session,
|
|
|
|
struct sr_modbus_dev_inst *modbus);
|
|
|
|
SR_PRIV int sr_modbus_request(struct sr_modbus_dev_inst *modbus,
|
|
|
|
uint8_t *request, int request_size);
|
|
|
|
SR_PRIV int sr_modbus_reply(struct sr_modbus_dev_inst *modbus,
|
|
|
|
uint8_t *reply, int reply_size);
|
|
|
|
SR_PRIV int sr_modbus_request_reply(struct sr_modbus_dev_inst *modbus,
|
|
|
|
uint8_t *request, int request_size,
|
|
|
|
uint8_t *reply, int reply_size);
|
|
|
|
SR_PRIV int sr_modbus_read_coils(struct sr_modbus_dev_inst *modbus,
|
|
|
|
int address, int nb_coils, uint8_t *coils);
|
|
|
|
SR_PRIV int sr_modbus_read_holding_registers(struct sr_modbus_dev_inst *modbus,
|
|
|
|
int address, int nb_registers,
|
|
|
|
uint16_t *registers);
|
|
|
|
SR_PRIV int sr_modbus_write_coil(struct sr_modbus_dev_inst *modbus,
|
|
|
|
int address, int value);
|
|
|
|
SR_PRIV int sr_modbus_write_multiple_registers(struct sr_modbus_dev_inst*modbus,
|
|
|
|
int address, int nb_registers,
|
|
|
|
uint16_t *registers);
|
|
|
|
SR_PRIV int sr_modbus_close(struct sr_modbus_dev_inst *modbus);
|
|
|
|
SR_PRIV void sr_modbus_free(struct sr_modbus_dev_inst *modbus);
|
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/dmm/es519xx.c ------------------------------------------------*/
|
2013-10-03 20:00:22 +00:00
|
|
|
|
2013-10-10 21:11:06 +00:00
|
|
|
/**
|
|
|
|
* All 11-byte es519xx chips repeat each block twice for each conversion cycle
|
|
|
|
* so always read 2 blocks at a time.
|
|
|
|
*/
|
|
|
|
#define ES519XX_11B_PACKET_SIZE (11 * 2)
|
2013-10-06 12:59:10 +00:00
|
|
|
#define ES519XX_14B_PACKET_SIZE 14
|
2013-10-03 20:00:22 +00:00
|
|
|
|
|
|
|
struct es519xx_info {
|
|
|
|
gboolean is_judge, is_voltage, is_auto, is_micro, is_current;
|
|
|
|
gboolean is_milli, is_resistance, is_continuity, is_diode;
|
|
|
|
gboolean is_frequency, is_rpm, is_capacitance, is_duty_cycle;
|
|
|
|
gboolean is_temperature, is_celsius, is_fahrenheit;
|
|
|
|
gboolean is_adp0, is_adp1, is_adp2, is_adp3;
|
|
|
|
gboolean is_sign, is_batt, is_ol, is_pmax, is_pmin, is_apo;
|
|
|
|
gboolean is_dc, is_ac, is_vahz, is_min, is_max, is_rel, is_hold;
|
|
|
|
gboolean is_digit4, is_ul, is_vasel, is_vbar, is_lpf1, is_lpf0, is_rmr;
|
|
|
|
uint32_t baudrate;
|
|
|
|
int packet_size;
|
|
|
|
gboolean alt_functions, fivedigits, clampmeter, selectable_lpf;
|
|
|
|
};
|
|
|
|
|
2013-10-06 12:59:10 +00:00
|
|
|
SR_PRIV gboolean sr_es519xx_2400_11b_packet_valid(const uint8_t *buf);
|
|
|
|
SR_PRIV int sr_es519xx_2400_11b_parse(const uint8_t *buf, float *floatval,
|
|
|
|
struct sr_datafeed_analog *analog, void *info);
|
2014-01-14 22:24:47 +00:00
|
|
|
SR_PRIV gboolean sr_es519xx_2400_11b_altfn_packet_valid(const uint8_t *buf);
|
|
|
|
SR_PRIV int sr_es519xx_2400_11b_altfn_parse(const uint8_t *buf,
|
|
|
|
float *floatval, struct sr_datafeed_analog *analog, void *info);
|
2013-10-06 12:59:10 +00:00
|
|
|
SR_PRIV gboolean sr_es519xx_19200_11b_5digits_packet_valid(const uint8_t *buf);
|
2013-10-06 22:24:44 +00:00
|
|
|
SR_PRIV int sr_es519xx_19200_11b_5digits_parse(const uint8_t *buf,
|
2013-10-06 12:59:10 +00:00
|
|
|
float *floatval, struct sr_datafeed_analog *analog, void *info);
|
|
|
|
SR_PRIV gboolean sr_es519xx_19200_11b_clamp_packet_valid(const uint8_t *buf);
|
|
|
|
SR_PRIV int sr_es519xx_19200_11b_clamp_parse(const uint8_t *buf,
|
|
|
|
float *floatval, struct sr_datafeed_analog *analog, void *info);
|
|
|
|
SR_PRIV gboolean sr_es519xx_19200_11b_packet_valid(const uint8_t *buf);
|
|
|
|
SR_PRIV int sr_es519xx_19200_11b_parse(const uint8_t *buf, float *floatval,
|
|
|
|
struct sr_datafeed_analog *analog, void *info);
|
|
|
|
SR_PRIV gboolean sr_es519xx_19200_14b_packet_valid(const uint8_t *buf);
|
|
|
|
SR_PRIV int sr_es519xx_19200_14b_parse(const uint8_t *buf, float *floatval,
|
|
|
|
struct sr_datafeed_analog *analog, void *info);
|
|
|
|
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);
|
2013-10-03 20:00:22 +00:00
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/dmm/fs9922.c -------------------------------------------------*/
|
2012-10-27 20:41:50 +00:00
|
|
|
|
2012-12-19 21:47:26 +00:00
|
|
|
#define FS9922_PACKET_SIZE 14
|
|
|
|
|
|
|
|
struct fs9922_info {
|
|
|
|
gboolean is_auto, is_dc, is_ac, is_rel, is_hold, is_bpn, is_z1, is_z2;
|
|
|
|
gboolean is_max, is_min, is_apo, is_bat, is_nano, is_z3, is_micro;
|
|
|
|
gboolean is_milli, is_kilo, is_mega, is_beep, is_diode, is_percent;
|
|
|
|
gboolean is_z4, is_volt, is_ampere, is_ohm, is_hfe, is_hertz, is_farad;
|
|
|
|
gboolean is_celsius, is_fahrenheit;
|
|
|
|
int bargraph_sign, bargraph_value;
|
|
|
|
};
|
|
|
|
|
|
|
|
SR_PRIV gboolean sr_fs9922_packet_valid(const uint8_t *buf);
|
|
|
|
SR_PRIV int sr_fs9922_parse(const uint8_t *buf, float *floatval,
|
|
|
|
struct sr_datafeed_analog *analog, void *info);
|
2013-09-01 11:10:54 +00:00
|
|
|
SR_PRIV void sr_fs9922_z1_diode(struct sr_datafeed_analog *analog, void *info);
|
2012-10-27 20:41:50 +00:00
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/dmm/fs9721.c -------------------------------------------------*/
|
2012-10-29 11:02:05 +00:00
|
|
|
|
2012-11-01 14:58:09 +00:00
|
|
|
#define FS9721_PACKET_SIZE 14
|
|
|
|
|
|
|
|
struct fs9721_info {
|
|
|
|
gboolean is_ac, is_dc, is_auto, is_rs232, is_micro, is_nano, is_kilo;
|
|
|
|
gboolean is_diode, is_milli, is_percent, is_mega, is_beep, is_farad;
|
|
|
|
gboolean is_ohm, is_rel, is_hold, is_ampere, is_volt, is_hz, is_bat;
|
|
|
|
gboolean is_c2c1_11, is_c2c1_10, is_c2c1_01, is_c2c1_00, is_sign;
|
|
|
|
};
|
|
|
|
|
|
|
|
SR_PRIV gboolean sr_fs9721_packet_valid(const uint8_t *buf);
|
|
|
|
SR_PRIV int sr_fs9721_parse(const uint8_t *buf, float *floatval,
|
2012-12-01 17:50:35 +00:00
|
|
|
struct sr_datafeed_analog *analog, void *info);
|
2013-05-01 00:10:56 +00:00
|
|
|
SR_PRIV void sr_fs9721_00_temp_c(struct sr_datafeed_analog *analog, void *info);
|
|
|
|
SR_PRIV void sr_fs9721_01_temp_c(struct sr_datafeed_analog *analog, void *info);
|
|
|
|
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);
|
2014-01-02 00:34:21 +00:00
|
|
|
SR_PRIV void sr_fs9721_max_c_min(struct sr_datafeed_analog *analog, void *info);
|
2012-10-29 11:02:05 +00:00
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/dmm/m2110.c --------------------------------------------------*/
|
2013-12-18 22:37:42 +00:00
|
|
|
|
|
|
|
#define BBCGM_M2110_PACKET_SIZE 9
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/dmm/metex14.c ------------------------------------------------*/
|
2012-11-14 17:38:26 +00:00
|
|
|
|
|
|
|
#define METEX14_PACKET_SIZE 14
|
|
|
|
|
|
|
|
struct metex14_info {
|
|
|
|
gboolean is_ac, is_dc, is_resistance, is_capacity, is_temperature;
|
|
|
|
gboolean is_diode, is_frequency, is_ampere, is_volt, is_farad;
|
2013-10-23 16:41:13 +00:00
|
|
|
gboolean is_hertz, is_ohm, is_celsius, is_pico, is_nano, is_micro;
|
|
|
|
gboolean is_milli, is_kilo, is_mega, is_gain, is_decibel, is_hfe;
|
2014-03-24 20:50:07 +00:00
|
|
|
gboolean is_unitless, is_logic;
|
2012-11-14 17:38:26 +00:00
|
|
|
};
|
|
|
|
|
2013-11-13 18:56:13 +00:00
|
|
|
#ifdef HAVE_LIBSERIALPORT
|
2012-12-02 13:22:15 +00:00
|
|
|
SR_PRIV int sr_metex14_packet_request(struct sr_serial_dev_inst *serial);
|
2013-11-13 18:56:13 +00:00
|
|
|
#endif
|
2012-11-14 17:38:26 +00:00
|
|
|
SR_PRIV gboolean sr_metex14_packet_valid(const uint8_t *buf);
|
|
|
|
SR_PRIV int sr_metex14_parse(const uint8_t *buf, float *floatval,
|
2012-12-01 18:01:07 +00:00
|
|
|
struct sr_datafeed_analog *analog, void *info);
|
2012-11-14 17:38:26 +00:00
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/dmm/rs9lcd.c -------------------------------------------------*/
|
2012-12-02 18:58:30 +00:00
|
|
|
|
2012-12-02 19:15:21 +00:00
|
|
|
#define RS9LCD_PACKET_SIZE 9
|
2012-12-02 18:58:30 +00:00
|
|
|
|
2012-12-13 18:35:06 +00:00
|
|
|
/* Dummy info struct. The parser does not use it. */
|
2013-02-02 11:14:26 +00:00
|
|
|
struct rs9lcd_info { int dummy; };
|
2012-12-13 18:35:06 +00:00
|
|
|
|
2012-12-02 18:58:30 +00:00
|
|
|
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);
|
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/dmm/bm25x.c --------------------------------------------------*/
|
2014-07-30 07:28:58 +00:00
|
|
|
|
|
|
|
#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);
|
|
|
|
|
2014-10-25 09:36:58 +00:00
|
|
|
/*--- 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);
|
|
|
|
|
2014-12-29 22:30:41 +00:00
|
|
|
/*--- 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);
|
|
|
|
|
2014-10-12 23:06:09 +00:00
|
|
|
/*--- hardware/lcr/es51919.c ------------------------------------------------*/
|
2014-10-11 12:47:34 +00:00
|
|
|
|
|
|
|
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);
|
|
|
|
|
2015-03-01 21:13:30 +00:00
|
|
|
/*--- 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);
|
|
|
|
|
2015-08-27 19:21:03 +00:00
|
|
|
/*--- hardware/scale/kern.c -------------------------------------------------*/
|
|
|
|
|
|
|
|
struct kern_info {
|
|
|
|
gboolean is_gram, is_carat, is_ounce, is_pound, is_troy_ounce;
|
|
|
|
gboolean is_pennyweight, is_grain, is_tael, is_momme, is_tola;
|
|
|
|
gboolean is_percentage, is_piece, is_unstable, is_stable, is_error;
|
|
|
|
int buflen;
|
|
|
|
};
|
|
|
|
|
|
|
|
SR_PRIV gboolean sr_kern_packet_valid(const uint8_t *buf);
|
|
|
|
SR_PRIV int sr_kern_parse(const uint8_t *buf, float *floatval,
|
|
|
|
struct sr_datafeed_analog *analog, void *info);
|
|
|
|
|
2011-01-15 14:06:58 +00:00
|
|
|
#endif
|