X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Flibsigrok-internal.h;h=812cf3ceca11811aebe7569c6e14439375a7febb;hb=639c6f61c32e508e2d8e2330a7f21cb15e29c294;hp=d4533c9fd639b7aacf782e929449bbe3744baa0f;hpb=e66d1892d0dd16ed166fc8f13493f95de0607362;p=libsigrok.git diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index d4533c9f..812cf3ce 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -26,15 +26,15 @@ #ifndef LIBSIGROK_LIBSIGROK_INTERNAL_H #define LIBSIGROK_LIBSIGROK_INTERNAL_H -#include -#include #include -#ifdef HAVE_LIBUSB_1_0 -#include -#endif #ifdef HAVE_LIBSERIALPORT #include #endif +#ifdef HAVE_LIBUSB_1_0 +#include +#endif +#include +#include struct zip; struct zip_stat; @@ -426,6 +426,8 @@ struct sr_input_module { * 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 @@ -434,8 +436,15 @@ struct sr_input_module { * 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. @@ -717,8 +726,14 @@ struct sr_serial_dev_inst { 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 @@ -736,7 +751,7 @@ struct drv_context { /*--- 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. @@ -773,8 +788,12 @@ enum { 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 { @@ -895,14 +914,13 @@ SR_PRIV int sr_session_source_remove_pollfd(struct sr_session *session, 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 --------------------------------------------------------*/ @@ -940,6 +958,8 @@ SR_PRIV int std_serial_dev_acquisition_stop(struct sr_dev_inst *sdi); #endif SR_PRIV int std_session_send_df_header(const struct sr_dev_inst *sdi); SR_PRIV int std_session_send_df_end(const struct sr_dev_inst *sdi); +SR_PRIV int std_session_send_frame_begin(const struct sr_dev_inst *sdi); +SR_PRIV int std_session_send_frame_end(const struct sr_dev_inst *sdi); SR_PRIV int std_dev_clear_with_callback(const struct sr_dev_driver *driver, std_dev_clear_callback clear_private); SR_PRIV int std_dev_clear(const struct sr_dev_driver *driver); @@ -952,10 +972,43 @@ SR_PRIV int std_opts_config_list(uint32_t key, GVariant **data, 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_array(const uint64_t a[][2], unsigned int n); +SR_PRIV GVariant *std_gvar_tuple_rational(const struct sr_rational *r, unsigned int n); +SR_PRIV GVariant *std_gvar_samplerates(const uint64_t samplerates[], unsigned int n); +SR_PRIV GVariant *std_gvar_samplerates_steps(const uint64_t samplerates[], unsigned int n); +SR_PRIV GVariant *std_gvar_min_max_step(double min, double max, double step); +SR_PRIV GVariant *std_gvar_min_max_step_array(const double a[3]); +SR_PRIV GVariant *std_gvar_min_max_step_thresholds(const double dmin, const double dmax, const double dstep); + +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_str(const char *a[], unsigned int n); + +SR_PRIV GVariant *std_gvar_thresholds(const double a[][2], unsigned int n); + +SR_PRIV int std_str_idx(GVariant *data, const char *a[], unsigned int n); +SR_PRIV int std_u64_idx(GVariant *data, const uint64_t a[], unsigned int n); +SR_PRIV int std_u8_idx(GVariant *data, const uint8_t a[], unsigned int n); + +SR_PRIV int std_str_idx_s(const char *s, const char *a[], unsigned int n); +SR_PRIV int std_u8_idx_s(uint8_t b, const uint8_t a[], unsigned int n); + +SR_PRIV int std_u64_tuple_idx(GVariant *data, const uint64_t a[][2], unsigned int n); +SR_PRIV int std_double_tuple_idx(GVariant *data, const double a[][2], unsigned int n); +SR_PRIV int std_double_tuple_idx_d0(const double d, const double a[][2], unsigned int n); + +SR_PRIV int std_cg_idx(const struct sr_channel_group *cg, struct sr_channel_group *a[], unsigned int n); + /*--- resource.c ------------------------------------------------------------*/ SR_PRIV int64_t sr_file_get_size(FILE *file); @@ -978,8 +1031,12 @@ 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); +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 { @@ -995,6 +1052,7 @@ 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); @@ -1002,7 +1060,7 @@ SR_PRIV void soft_trigger_logic_free(struct soft_trigger_logic *st); SR_PRIV int soft_trigger_logic_check(struct soft_trigger_logic *st, uint8_t *buf, int len, int *pre_trigger_samples); -/*--- hardware/serial.c -----------------------------------------------------*/ +/*--- serial.c --------------------------------------------------------------*/ #ifdef HAVE_LIBSERIALPORT enum { @@ -1046,7 +1104,7 @@ 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/ezusb.c ------------------------------------------------------*/ +/*--- ezusb.c ---------------------------------------------------------------*/ #ifdef HAVE_LIBUSB_1_0 SR_PRIV int ezusb_reset(struct libusb_device_handle *hdl, int set_clear); @@ -1056,7 +1114,7 @@ SR_PRIV int ezusb_upload_firmware(struct sr_context *ctx, libusb_device *dev, 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); @@ -1124,7 +1182,7 @@ SR_PRIV int sr_modbus_write_multiple_registers(struct sr_modbus_dev_inst*modbus, 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 @@ -1170,7 +1228,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/dmm/fs9922.c -------------------------------------------------*/ +/*--- dmm/fs9922.c ----------------------------------------------------------*/ #define FS9922_PACKET_SIZE 14 @@ -1188,7 +1246,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/dmm/fs9721.c -------------------------------------------------*/ +/*--- dmm/fs9721.c ----------------------------------------------------------*/ #define FS9721_PACKET_SIZE 14 @@ -1208,7 +1266,46 @@ 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/dmm/dtm0660.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 + +struct ms8250d_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_ncv, is_min, is_max, is_sign, is_autotimer; +}; + +SR_PRIV gboolean sr_ms8250d_packet_valid(const uint8_t *buf); +SR_PRIV int sr_ms8250d_parse(const uint8_t *buf, float *floatval, + struct sr_datafeed_analog *analog, void *info); + +/*--- dmm/dtm0660.c ---------------------------------------------------------*/ #define DTM0660_PACKET_SIZE 15 @@ -1224,7 +1321,7 @@ SR_PRIV gboolean sr_dtm0660_packet_valid(const uint8_t *buf); 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 @@ -1235,16 +1332,18 @@ 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/dmm/metex14.c ------------------------------------------------*/ +/*--- dmm/metex14.c ---------------------------------------------------------*/ #define METEX14_PACKET_SIZE 14 struct metex14_info { + size_t ch_idx; gboolean is_ac, is_dc, is_resistance, is_capacity, is_temperature; gboolean is_diode, is_frequency, is_ampere, is_volt, is_farad; - 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; - gboolean is_unitless, is_logic; + gboolean is_hertz, is_ohm, is_celsius, is_fahrenheit, is_watt; + gboolean is_pico, is_nano, is_micro, is_milli, is_kilo, is_mega; + gboolean is_gain, is_decibel, is_power, is_decibel_mw, is_power_factor; + gboolean is_hfe, is_unitless, is_logic, is_min, is_max, is_avg; }; #ifdef HAVE_LIBSERIALPORT @@ -1253,8 +1352,11 @@ SR_PRIV int sr_metex14_packet_request(struct sr_serial_dev_inst *serial); 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); +SR_PRIV gboolean sr_metex14_4packets_valid(const uint8_t *buf); +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 @@ -1265,7 +1367,7 @@ SR_PRIV gboolean sr_rs9lcd_packet_valid(const uint8_t *buf); SR_PRIV int sr_rs9lcd_parse(const uint8_t *buf, float *floatval, struct sr_datafeed_analog *analog, void *info); -/*--- hardware/dmm/bm25x.c --------------------------------------------------*/ +/*--- dmm/bm25x.c -----------------------------------------------------------*/ #define BRYMEN_BM25X_PACKET_SIZE 15 @@ -1276,7 +1378,7 @@ 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 --------------------------------------------------*/ +/*--- dmm/ut71x.c -----------------------------------------------------------*/ #define UT71X_PACKET_SIZE 11 @@ -1291,7 +1393,7 @@ SR_PRIV gboolean sr_ut71x_packet_valid(const uint8_t *buf); SR_PRIV int sr_ut71x_parse(const uint8_t *buf, float *floatval, struct sr_datafeed_analog *analog, void *info); -/*--- hardware/dmm/vc870.c --------------------------------------------------*/ +/*--- dmm/vc870.c -----------------------------------------------------------*/ #define VC870_PACKET_SIZE 23 @@ -1312,7 +1414,22 @@ SR_PRIV gboolean sr_vc870_packet_valid(const uint8_t *buf); SR_PRIV int sr_vc870_parse(const uint8_t *buf, float *floatval, struct sr_datafeed_analog *analog, void *info); -/*--- hardware/lcr/es51919.c ------------------------------------------------*/ +/*--- 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, @@ -1330,7 +1447,7 @@ SR_PRIV int es51919_serial_config_list(uint32_t key, GVariant **data, 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 @@ -1342,7 +1459,7 @@ 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); -/*--- hardware/dmm/asycii.c -------------------------------------------------*/ +/*--- dmm/asycii.c ----------------------------------------------------------*/ #define ASYCII_PACKET_SIZE 16 @@ -1367,7 +1484,50 @@ SR_PRIV gboolean sr_asycii_packet_valid(const uint8_t *buf); 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;