#ifndef LIBSIGROK_LIBSIGROK_INTERNAL_H
#define LIBSIGROK_LIBSIGROK_INTERNAL_H
-#include <stdarg.h>
-#include <stdio.h>
#include <glib.h>
-#ifdef HAVE_LIBUSB_1_0
-#include <libusb.h>
-#endif
#ifdef HAVE_LIBSERIALPORT
#include <libserialport.h>
#endif
+#ifdef HAVE_LIBUSB_1_0
+#include <libusb.h>
+#endif
+#include <stdarg.h>
+#include <stdio.h>
struct zip;
struct zip_stat;
* Check if this input module can load and parse the specified stream.
*
* @param[in] metadata Metadata the module can use to identify the stream.
+ * @param[out] confidence "Strength" of the detection.
+ * Specialized handlers can take precedence over generic/basic support.
*
* @retval SR_OK This module knows the format.
* @retval SR_ERR_NA There wasn't enough data for this module to
* 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.
+ *
+ * Lower numeric values of 'confidence' mean that the input module
+ * stronger believes in its capability to handle this specific format.
+ * This way, multiple input modules can claim support for a format,
+ * and the application can pick the best match, or try fallbacks
+ * in case of errors. This approach also copes with formats that
+ * are unreliable to detect in the absence of magic signatures.
*/
- int (*format_match) (GHashTable *metadata);
+ int (*format_match) (GHashTable *metadata, unsigned int *confidence);
/**
* Initialize the input module.
char *port;
/** Comm params for serial_set_paramstr(). */
char *serialcomm;
+ struct {
+ int bit_rate;
+ int data_bits;
+ int parity_bits;
+ int stop_bits;
+ } comm_params;
/** libserialport port handle */
- struct sp_port *data;
+ struct sp_port *sp_data;
};
#endif
/*--- log.c -----------------------------------------------------------------*/
-#if defined(G_OS_WIN32) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+#if defined(_WIN32) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
/*
* On MinGW, we need to specify the gnu_printf format flavor or GCC
* will assume non-standard Microsoft printf syntax.
SR_PRIV struct sr_channel *sr_channel_new(struct sr_dev_inst *sdi,
int index, int type, gboolean enabled, const char *name);
+SR_PRIV void sr_channel_free(struct sr_channel *ch);
+SR_PRIV void sr_channel_free_cb(void *p);
SR_PRIV struct sr_channel *sr_next_enabled_channel(const struct sr_dev_inst *sdi,
struct sr_channel *cur_channel);
+SR_PRIV gboolean sr_channels_differ(struct sr_channel *ch1, struct sr_channel *ch2);
+SR_PRIV gboolean sr_channel_lists_differ(GSList *l1, GSList *l2);
/** Device instance data */
struct sr_dev_inst {
SR_PRIV int sr_session_source_remove_channel(struct sr_session *session,
GIOChannel *channel);
+SR_PRIV int sr_session_send_meta(const struct sr_dev_inst *sdi,
+ uint32_t key, GVariant *var);
SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi,
const struct sr_datafeed_packet *packet);
SR_PRIV int sr_sessionfile_check(const char *filename);
SR_PRIV struct sr_dev_inst *sr_session_prepare_sdi(const char *filename,
struct sr_session **session);
-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);
/*--- session_file.c --------------------------------------------------------*/
const uint32_t scanopts[], size_t scansize, const uint32_t drvopts[],
size_t drvsize, const uint32_t devopts[], size_t devsize);
+extern SR_PRIV const uint32_t NO_OPTS[1];
+
#define STD_CONFIG_LIST(key, data, sdi, cg, scanopts, drvopts, devopts) \
std_opts_config_list(key, data, sdi, cg, ARRAY_AND_SIZE(scanopts), \
ARRAY_AND_SIZE(drvopts), ARRAY_AND_SIZE(devopts))
SR_PRIV GVariant *std_gvar_tuple_u64(uint64_t low, uint64_t high);
SR_PRIV GVariant *std_gvar_tuple_double(double low, double high);
-SR_PRIV GVariant *std_gvar_array_i32(const int32_t *a, unsigned int n);
-SR_PRIV GVariant *std_gvar_array_u32(const uint32_t *a, unsigned int n);
-SR_PRIV GVariant *std_gvar_array_u64(const uint64_t *a, unsigned int n);
+SR_PRIV GVariant *std_gvar_array_i32(const int32_t a[], unsigned int n);
+SR_PRIV GVariant *std_gvar_array_u32(const uint32_t a[], unsigned int n);
+SR_PRIV GVariant *std_gvar_array_u64(const uint64_t a[], unsigned int n);
SR_PRIV GVariant *std_gvar_array_str(const char *a[], unsigned int n);
SR_PRIV GVariant *std_gvar_thresholds(const double a[][2], unsigned int n);
SR_PRIV int sr_atod_ascii(const char *str, double *ret);
SR_PRIV int sr_atof_ascii(const char *str, float *ret);
+SR_PRIV GString *sr_hexdump_new(const uint8_t *data, const size_t len);
+SR_PRIV void sr_hexdump_free(GString *s);
+
/*--- soft-trigger.c --------------------------------------------------------*/
struct soft_trigger_logic {
int pre_trigger_fill;
};
+SR_PRIV int logic_channel_unitsize(GSList *channels);
SR_PRIV struct soft_trigger_logic *soft_trigger_logic_new(
const struct sr_dev_inst *sdi, struct sr_trigger *trigger,
int pre_trigger_samples);
SR_PRIV int soft_trigger_logic_check(struct soft_trigger_logic *st, uint8_t *buf,
int len, int *pre_trigger_samples);
-/*--- hardware/serial.c -----------------------------------------------------*/
+/*--- serial.c --------------------------------------------------------------*/
#ifdef HAVE_LIBSERIALPORT
enum {
SR_PRIV int serial_timeout(struct sr_serial_dev_inst *port, int num_bytes);
#endif
-/*--- hardware/ezusb.c ------------------------------------------------------*/
+/*--- ezusb.c ---------------------------------------------------------------*/
#ifdef HAVE_LIBUSB_1_0
SR_PRIV int ezusb_reset(struct libusb_device_handle *hdl, int set_clear);
int configuration, const char *name);
#endif
-/*--- hardware/usb.c --------------------------------------------------------*/
+/*--- usb.c -----------------------------------------------------------------*/
#ifdef HAVE_LIBUSB_1_0
SR_PRIV GSList *sr_usb_find(libusb_context *usb_ctx, const char *conn);
SR_PRIV int sr_modbus_close(struct sr_modbus_dev_inst *modbus);
SR_PRIV void sr_modbus_free(struct sr_modbus_dev_inst *modbus);
-/*--- hardware/dmm/es519xx.c ------------------------------------------------*/
+/*--- dmm/es519xx.c ---------------------------------------------------------*/
/**
* All 11-byte es519xx chips repeat each block twice for each conversion cycle
SR_PRIV int sr_es519xx_19200_14b_sel_lpf_parse(const uint8_t *buf,
float *floatval, struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/fs9922.c -------------------------------------------------*/
+/*--- dmm/fs9922.c ----------------------------------------------------------*/
#define FS9922_PACKET_SIZE 14
struct sr_datafeed_analog *analog, void *info);
SR_PRIV void sr_fs9922_z1_diode(struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/fs9721.c -------------------------------------------------*/
+/*--- dmm/fs9721.c ----------------------------------------------------------*/
#define FS9721_PACKET_SIZE 14
SR_PRIV void sr_fs9721_01_10_temp_f_c(struct sr_datafeed_analog *analog, void *info);
SR_PRIV void sr_fs9721_max_c_min(struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/ms8250d.c ------------------------------------------------*/
+/*--- dmm/ms2115b.c ---------------------------------------------------------*/
+
+#define MS2115B_PACKET_SIZE 9
+
+enum ms2115b_display {
+ MS2115B_DISPLAY_MAIN,
+ MS2115B_DISPLAY_SUB,
+ MS2115B_DISPLAY_COUNT,
+};
+
+struct ms2115b_info {
+ /* Selected channel. */
+ size_t ch_idx;
+ gboolean is_ac, is_dc, is_auto;
+ gboolean is_diode, is_beep, is_farad;
+ gboolean is_ohm, is_ampere, is_volt, is_hz;
+ gboolean is_duty_cycle, is_percent;
+};
+
+extern SR_PRIV const char *ms2115b_channel_formats[];
+SR_PRIV gboolean sr_ms2115b_packet_valid(const uint8_t *buf);
+SR_PRIV int sr_ms2115b_parse(const uint8_t *buf, float *floatval,
+ struct sr_datafeed_analog *analog, void *info);
+
+/*--- dmm/ms8250d.c ---------------------------------------------------------*/
#define MS8250D_PACKET_SIZE 18
SR_PRIV int sr_ms8250d_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/dtm0660.c ------------------------------------------------*/
+/*--- dmm/dtm0660.c ---------------------------------------------------------*/
#define DTM0660_PACKET_SIZE 15
SR_PRIV int sr_dtm0660_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/m2110.c --------------------------------------------------*/
+/*--- dmm/m2110.c -----------------------------------------------------------*/
#define BBCGM_M2110_PACKET_SIZE 9
SR_PRIV int sr_m2110_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/metex14.c ------------------------------------------------*/
+/*--- dmm/metex14.c ---------------------------------------------------------*/
#define METEX14_PACKET_SIZE 14
SR_PRIV int sr_metex14_4packets_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/rs9lcd.c -------------------------------------------------*/
+/*--- dmm/rs9lcd.c ----------------------------------------------------------*/
#define RS9LCD_PACKET_SIZE 9
SR_PRIV int sr_rs9lcd_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/bm25x.c --------------------------------------------------*/
+/*--- dmm/bm25x.c -----------------------------------------------------------*/
#define BRYMEN_BM25X_PACKET_SIZE 15
SR_PRIV int sr_brymen_bm25x_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/ut71x.c --------------------------------------------------*/
+/*--- dmm/ut71x.c -----------------------------------------------------------*/
#define UT71X_PACKET_SIZE 11
SR_PRIV int sr_ut71x_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/vc870.c --------------------------------------------------*/
+/*--- dmm/vc870.c -----------------------------------------------------------*/
#define VC870_PACKET_SIZE 23
SR_PRIV int sr_vc870_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/lcr/es51919.c ------------------------------------------------*/
+/*--- dmm/vc96.c ------------------------------------------------------------*/
+
+#define VC96_PACKET_SIZE 13
+
+struct vc96_info {
+ size_t ch_idx;
+ gboolean is_ac, is_dc, is_resistance, is_diode, is_ampere, is_volt;
+ gboolean is_ohm, is_micro, is_milli, is_kilo, is_mega, is_hfe;
+ gboolean is_unitless;
+};
+
+SR_PRIV gboolean sr_vc96_packet_valid(const uint8_t *buf);
+SR_PRIV int sr_vc96_parse(const uint8_t *buf, float *floatval,
+ struct sr_datafeed_analog *analog, void *info);
+
+/*--- lcr/es51919.c ---------------------------------------------------------*/
SR_PRIV void es51919_serial_clean(void *priv);
SR_PRIV struct sr_dev_inst *es51919_serial_scan(GSList *options,
SR_PRIV int es51919_serial_acquisition_start(const struct sr_dev_inst *sdi);
SR_PRIV int es51919_serial_acquisition_stop(struct sr_dev_inst *sdi);
-/*--- hardware/dmm/ut372.c --------------------------------------------------*/
+/*--- dmm/ut372.c -----------------------------------------------------------*/
#define UT372_PACKET_SIZE 27
SR_PRIV int sr_ut372_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/dmm/asycii.c -------------------------------------------------*/
+/*--- dmm/asycii.c ----------------------------------------------------------*/
#define ASYCII_PACKET_SIZE 16
SR_PRIV int sr_asycii_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
-/*--- hardware/scale/kern.c -------------------------------------------------*/
+/*--- dmm/eev121gw.c --------------------------------------------------------*/
+
+#define EEV121GW_PACKET_SIZE 19
+
+enum eev121gw_display {
+ EEV121GW_DISPLAY_MAIN,
+ EEV121GW_DISPLAY_SUB,
+ EEV121GW_DISPLAY_BAR,
+ EEV121GW_DISPLAY_COUNT,
+};
+
+struct eev121gw_info {
+ /* Selected channel. */
+ size_t ch_idx;
+ /*
+ * Measured value, number and sign/overflow flags, scale factor
+ * and significant digits.
+ */
+ uint32_t uint_value;
+ gboolean is_ofl, is_neg;
+ int factor, digits;
+ /* Currently active mode (meter's function). */
+ gboolean is_ac, is_dc, is_voltage, is_current, is_power, is_gain;
+ gboolean is_resistance, is_capacitance, is_diode, is_temperature;
+ gboolean is_continuity, is_frequency, is_period, is_duty_cycle;
+ /* Quantities associated with mode/function. */
+ gboolean is_ampere, is_volt, is_volt_ampere, is_dbm;
+ gboolean is_ohm, is_farad, is_celsius, is_fahrenheit;
+ gboolean is_hertz, is_seconds, is_percent, is_loop_current;
+ gboolean is_unitless, is_logic;
+ /* Other indicators. */
+ gboolean is_min, is_max, is_avg, is_1ms_peak, is_rel, is_hold;
+ gboolean is_low_pass, is_mem, is_bt, is_auto_range, is_test;
+ gboolean is_auto_poweroff, is_low_batt;
+};
+
+extern SR_PRIV const char *eev121gw_channel_formats[];
+SR_PRIV gboolean sr_eev121gw_packet_valid(const uint8_t *buf);
+SR_PRIV int sr_eev121gw_parse(const uint8_t *buf, float *floatval,
+ struct sr_datafeed_analog *analog, void *info);
+SR_PRIV int sr_eev121gw_3displays_parse(const uint8_t *buf, float *floatval,
+ struct sr_datafeed_analog *analog, void *info);
+
+/*--- scale/kern.c ----------------------------------------------------------*/
struct kern_info {
gboolean is_gram, is_carat, is_ounce, is_pound, is_troy_ounce;