#define LIBSIGROK_LIBSIGROK_INTERNAL_H
#include <stdarg.h>
+#include <stdio.h>
#include <glib.h>
-#include "config.h" /* Needed for HAVE_LIBUSB_1_0 and others. */
#ifdef HAVE_LIBUSB_1_0
#include <libusb.h>
#endif
#include <libserialport.h>
#endif
+struct zip;
+struct zip_stat;
+
/**
* @file
*
struct sr_dev_driver **driver_list;
#ifdef HAVE_LIBUSB_1_0
libusb_context *libusb_ctx;
- gboolean usb_source_present;
-#ifdef _WIN32
- GThread *usb_thread;
- gboolean usb_thread_running;
- HANDLE usb_wait_request_event;
- HANDLE usb_wait_complete_event;
- GPollFD usb_pollfd;
- sr_receive_data_callback usb_cb;
- void *usb_cb_data;
-#endif
#endif
+ sr_resource_open_callback resource_open_cb;
+ sr_resource_close_callback resource_close_cb;
+ sr_resource_read_callback resource_read_cb;
+ void *resource_cb_data;
};
/** Input module metadata keys. */
*/
const struct sr_dev_inst *sdi;
+ /**
+ * The name of the file that the data should be written to.
+ */
+ const char *filename;
+
/**
* A generic pointer which can be used by the module to keep internal
* state between calls into its callback functions.
*/
const char *const *exts;
+ /**
+ * Bitfield containing flags that describe certain properties
+ * this output module may or may not have.
+ * @see sr_output_flags
+ */
+ const uint64_t flags;
+
/**
* Returns a NULL-terminated list of options this module can take.
* Can be NULL, if the module has no options.
#endif
#ifdef HAVE_LIBSERIALPORT
-#define SERIAL_PARITY_NONE SP_PARITY_NONE
-#define SERIAL_PARITY_EVEN SP_PARITY_EVEN
-#define SERIAL_PARITY_ODD SP_PARITY_ODD
struct sr_serial_dev_inst {
/** Port name, e.g. '/dev/tty42'. */
char *port;
char *serialcomm;
/** libserialport port handle */
struct sp_port *data;
- /** libserialport event set */
- struct sp_event_set *event_set;
- /** GPollFDs for event polling */
- GPollFD *pollfds;
};
#endif
/*--- 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, ...);
+#if defined(G_OS_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 int sr_log(int loglevel, const char *format, ...)
+ __attribute__((__format__ (__gnu_printf__, 2, 3)));
+#else
+SR_PRIV int sr_log(int loglevel, const char *format, ...) G_GNUC_PRINTF(2, 3);
+#endif
/* 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
+#define sr_spew(...) sr_log(SR_LOG_SPEW, LOG_PREFIX ": " __VA_ARGS__)
+#define sr_dbg(...) sr_log(SR_LOG_DBG, LOG_PREFIX ": " __VA_ARGS__)
+#define sr_info(...) sr_log(SR_LOG_INFO, LOG_PREFIX ": " __VA_ARGS__)
+#define sr_warn(...) sr_log(SR_LOG_WARN, LOG_PREFIX ": " __VA_ARGS__)
+#define sr_err(...) sr_log(SR_LOG_ERR, LOG_PREFIX ": " __VA_ARGS__)
/*--- device.c --------------------------------------------------------------*/
SR_PRIV struct sr_channel *sr_channel_new(struct sr_dev_inst *sdi,
int index, int type, gboolean enabled, const char *name);
+SR_PRIV struct sr_channel *sr_next_enabled_channel(const struct sr_dev_inst *sdi,
+ struct sr_channel *cur_channel);
/** Device instance data */
struct sr_dev_inst {
SR_PRIV void sr_hw_cleanup_all(const struct sr_context *ctx);
SR_PRIV struct sr_config *sr_config_new(uint32_t key, GVariant *data);
SR_PRIV void sr_config_free(struct sr_config *src);
-SR_PRIV int sr_source_remove(int fd);
-SR_PRIV int sr_source_remove_pollfd(GPollFD *pollfd);
-SR_PRIV int sr_source_remove_channel(GIOChannel *channel);
-SR_PRIV int sr_source_add(int fd, int events, int timeout,
- sr_receive_data_callback cb, void *cb_data);
-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);
/*--- session.c -------------------------------------------------------------*/
GSList *datafeed_callbacks;
GSList *transforms;
struct sr_trigger *trigger;
- GTimeVal starttime;
+
+ /** Callback to invoke on session stop. */
+ sr_session_stopped_callback stopped_callback;
+ /** User data to be passed to the session stop callback. */
+ void *stopped_cb_data;
+
+ /** Mutex protecting the main context pointer. */
+ GMutex main_mutex;
+ /** Context of the session main loop. */
+ GMainContext *main_context;
+
+ /** Registered event sources for this session. */
+ GHashTable *event_sources;
+ /** Session main loop. */
+ GMainLoop *main_loop;
+ /** ID of idle source for dispatching the session stop notification. */
+ unsigned int stop_check_id;
+ /** Whether the session has been started. */
gboolean running;
+};
- unsigned int num_sources;
+SR_PRIV int sr_session_source_add_internal(struct sr_session *session,
+ void *key, GSource *source);
+SR_PRIV int sr_session_source_remove_internal(struct sr_session *session,
+ void *key);
+SR_PRIV int sr_session_source_destroyed(struct sr_session *session,
+ void *key, GSource *source);
+SR_PRIV int sr_session_fd_source_add(struct sr_session *session,
+ void *key, gintptr fd, int events, int timeout,
+ sr_receive_data_callback cb, void *cb_data);
- /*
- * Both "sources" and "pollfds" are of the same size and contain pairs
- * of descriptor and callback function. We can not embed the GPollFD
- * into the source struct since we want to be able to pass the array
- * of all poll descriptors to g_poll().
- */
- struct source *sources;
- GPollFD *pollfds;
- int source_timeout;
-
- /*
- * 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.
- */
- /** Mutex protecting access to abort_session. */
- GMutex stop_mutex;
- /** Abort current session. See sr_session_stop(). */
- gboolean abort_session;
-};
+SR_PRIV int sr_session_source_add(struct sr_session *session, int fd,
+ int events, int timeout, sr_receive_data_callback cb, void *cb_data);
+SR_PRIV int sr_session_source_add_pollfd(struct sr_session *session,
+ GPollFD *pollfd, int timeout, sr_receive_data_callback cb,
+ void *cb_data);
+SR_PRIV int sr_session_source_add_channel(struct sr_session *session,
+ GIOChannel *channel, int events, int timeout,
+ sr_receive_data_callback cb, void *cb_data);
+SR_PRIV int sr_session_source_remove(struct sr_session *session, int fd);
+SR_PRIV int sr_session_source_remove_pollfd(struct sr_session *session,
+ GPollFD *pollfd);
+SR_PRIV int sr_session_source_remove_channel(struct sr_session *session,
+ GIOChannel *channel);
SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi,
const struct sr_datafeed_packet *packet);
-SR_PRIV int sr_session_stop_sync(struct sr_session *session);
SR_PRIV int sr_sessionfile_check(const char *filename);
SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet,
struct sr_datafeed_packet **copy);
SR_PRIV void sr_packet_free(struct sr_datafeed_packet *packet);
+/*--- session_file.c --------------------------------------------------------*/
+
+SR_PRIV GKeyFile *sr_sessionfile_read_metadata(struct zip *archive,
+ const struct zip_stat *entry);
+
/*--- analog.c --------------------------------------------------------------*/
-SR_PRIV int sr_analog_init(struct sr_datafeed_analog2 *analog,
+SR_PRIV int sr_analog_init(struct sr_datafeed_analog *analog,
struct sr_analog_encoding *encoding,
struct sr_analog_meaning *meaning,
struct sr_analog_spec *spec,
std_dev_clear_callback clear_private);
SR_PRIV int std_serial_dev_close(struct sr_dev_inst *sdi);
+/*--- resource.c ------------------------------------------------------------*/
+
+SR_PRIV int64_t sr_file_get_size(FILE *file);
+
+SR_PRIV int sr_resource_open(struct sr_context *ctx,
+ struct sr_resource *res, int type, const char *name)
+ G_GNUC_WARN_UNUSED_RESULT;
+SR_PRIV int sr_resource_close(struct sr_context *ctx,
+ struct sr_resource *res);
+SR_PRIV ssize_t sr_resource_read(struct sr_context *ctx,
+ const struct sr_resource *res, void *buf, size_t count)
+ G_GNUC_WARN_UNUSED_RESULT;
+SR_PRIV void *sr_resource_load(struct sr_context *ctx, int type,
+ const char *name, size_t *size, size_t max_size)
+ G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
+
/*--- strutil.c -------------------------------------------------------------*/
SR_PRIV int sr_atol(const char *str, long *ret);
#ifdef HAVE_LIBUSB_1_0
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);
+SR_PRIV int ezusb_install_firmware(struct sr_context *ctx, libusb_device_handle *hdl,
+ const char *name);
+SR_PRIV int ezusb_upload_firmware(struct sr_context *ctx, libusb_device *dev,
+ int configuration, const char *name);
#endif
/*--- hardware/usb.c --------------------------------------------------------*/
#ifdef HAVE_LIBUSB_1_0
SR_PRIV GSList *sr_usb_find(libusb_context *usb_ctx, const char *conn);
SR_PRIV int sr_usb_open(libusb_context *usb_ctx, struct sr_usb_dev_inst *usb);
+SR_PRIV void sr_usb_close(struct sr_usb_dev_inst *usb);
SR_PRIV int usb_source_add(struct sr_session *session, struct sr_context *ctx,
int timeout, sr_receive_data_callback cb, void *cb_data);
SR_PRIV int usb_source_remove(struct sr_session *session, struct sr_context *ctx);
SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len);
#endif
-/*--- hardware/scpi.c -------------------------------------------------------*/
-#define SCPI_CMD_IDN "*IDN?"
-#define SCPI_CMD_OPC "*OPC?"
+/*--- modbus/modbus.c -------------------------------------------------------*/
-enum {
- SCPI_CMD_SET_TRIGGER_SOURCE,
- SCPI_CMD_SET_TIMEBASE,
- SCPI_CMD_SET_VERTICAL_DIV,
- SCPI_CMD_SET_TRIGGER_SLOPE,
- SCPI_CMD_SET_COUPLING,
- SCPI_CMD_SET_HORIZ_TRIGGERPOS,
- SCPI_CMD_GET_ANALOG_CHAN_STATE,
- SCPI_CMD_GET_DIG_CHAN_STATE,
- SCPI_CMD_GET_TIMEBASE,
- SCPI_CMD_GET_VERTICAL_DIV,
- SCPI_CMD_GET_VERTICAL_OFFSET,
- SCPI_CMD_GET_TRIGGER_SOURCE,
- SCPI_CMD_GET_HORIZ_TRIGGERPOS,
- SCPI_CMD_GET_TRIGGER_SLOPE,
- SCPI_CMD_GET_COUPLING,
- SCPI_CMD_SET_ANALOG_CHAN_STATE,
- SCPI_CMD_SET_DIG_CHAN_STATE,
- SCPI_CMD_GET_DIG_POD_STATE,
- SCPI_CMD_SET_DIG_POD_STATE,
- SCPI_CMD_GET_ANALOG_DATA,
- SCPI_CMD_GET_DIG_DATA,
- SCPI_CMD_GET_SAMPLE_RATE,
- SCPI_CMD_GET_SAMPLE_RATE_LIVE,
-};
-
-struct sr_scpi_hw_info {
- char *manufacturer;
- char *model;
- char *serial_number;
- char *firmware_version;
-};
-
-struct sr_scpi_dev_inst {
+struct sr_modbus_dev_inst {
const char *name;
const char *prefix;
int priv_size;
- GSList *(*scan)(struct drv_context *drvc);
- int (*dev_inst_new)(void *priv, struct drv_context *drvc,
- const char *resource, char **params, const char *serialcomm);
+ 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 char *command);
- int (*read_begin)(void *priv);
- int (*read_data)(void *priv, char *buf, int maxlen);
- int (*read_complete)(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_scpi_scan(struct drv_context *drvc, GSList *options,
- struct sr_dev_inst *(*probe_device)(struct sr_scpi_dev_inst *scpi));
-SR_PRIV struct sr_scpi_dev_inst *scpi_dev_inst_new(struct drv_context *drvc,
- const char *resource, const char *serialcomm);
-SR_PRIV int sr_scpi_open(struct sr_scpi_dev_inst *scpi);
-SR_PRIV int sr_scpi_source_add(struct sr_session *session,
- struct sr_scpi_dev_inst *scpi, int events, int timeout,
+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_scpi_source_remove(struct sr_session *session,
- struct sr_scpi_dev_inst *scpi);
-SR_PRIV int sr_scpi_send(struct sr_scpi_dev_inst *scpi,
- const char *format, ...);
-SR_PRIV int sr_scpi_send_variadic(struct sr_scpi_dev_inst *scpi,
- const char *format, va_list args);
-SR_PRIV int sr_scpi_read_begin(struct sr_scpi_dev_inst *scpi);
-SR_PRIV int sr_scpi_read_data(struct sr_scpi_dev_inst *scpi, char *buf, int maxlen);
-SR_PRIV int sr_scpi_read_complete(struct sr_scpi_dev_inst *scpi);
-SR_PRIV int sr_scpi_close(struct sr_scpi_dev_inst *scpi);
-SR_PRIV void sr_scpi_free(struct sr_scpi_dev_inst *scpi);
-
-SR_PRIV int sr_scpi_get_string(struct sr_scpi_dev_inst *scpi,
- const char *command, char **scpi_response);
-SR_PRIV int sr_scpi_get_bool(struct sr_scpi_dev_inst *scpi,
- const char *command, gboolean *scpi_response);
-SR_PRIV int sr_scpi_get_int(struct sr_scpi_dev_inst *scpi,
- const char *command, int *scpi_response);
-SR_PRIV int sr_scpi_get_float(struct sr_scpi_dev_inst *scpi,
- const char *command, float *scpi_response);
-SR_PRIV int sr_scpi_get_double(struct sr_scpi_dev_inst *scpi,
- const char *command, double *scpi_response);
-SR_PRIV int sr_scpi_get_opc(struct sr_scpi_dev_inst *scpi);
-SR_PRIV int sr_scpi_get_floatv(struct sr_scpi_dev_inst *scpi,
- const char *command, GArray **scpi_response);
-SR_PRIV int sr_scpi_get_uint8v(struct sr_scpi_dev_inst *scpi,
- const char *command, GArray **scpi_response);
-SR_PRIV int sr_scpi_get_hw_id(struct sr_scpi_dev_inst *scpi,
- struct sr_scpi_hw_info **scpi_response);
-SR_PRIV void sr_scpi_hw_info_free(struct sr_scpi_hw_info *hw_info);
+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);
/*--- hardware/dmm/es519xx.c ------------------------------------------------*/
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);
+ struct sr_datafeed_analog_old *analog, void *info);
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);
+ float *floatval, struct sr_datafeed_analog_old *analog, void *info);
SR_PRIV gboolean sr_es519xx_19200_11b_5digits_packet_valid(const uint8_t *buf);
SR_PRIV int sr_es519xx_19200_11b_5digits_parse(const uint8_t *buf,
- float *floatval, struct sr_datafeed_analog *analog, void *info);
+ float *floatval, struct sr_datafeed_analog_old *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);
+ float *floatval, struct sr_datafeed_analog_old *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);
+ struct sr_datafeed_analog_old *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);
+ struct sr_datafeed_analog_old *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);
+ float *floatval, struct sr_datafeed_analog_old *analog, void *info);
/*--- hardware/dmm/fs9922.c -------------------------------------------------*/
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);
-SR_PRIV void sr_fs9922_z1_diode(struct sr_datafeed_analog *analog, void *info);
+ struct sr_datafeed_analog_old *analog, void *info);
+SR_PRIV void sr_fs9922_z1_diode(struct sr_datafeed_analog_old *analog, void *info);
/*--- hardware/dmm/fs9721.c -------------------------------------------------*/
SR_PRIV gboolean sr_fs9721_packet_valid(const uint8_t *buf);
SR_PRIV int sr_fs9721_parse(const uint8_t *buf, float *floatval,
- struct sr_datafeed_analog *analog, void *info);
-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);
-SR_PRIV void sr_fs9721_max_c_min(struct sr_datafeed_analog *analog, void *info);
+ struct sr_datafeed_analog_old *analog, void *info);
+SR_PRIV void sr_fs9721_00_temp_c(struct sr_datafeed_analog_old *analog, void *info);
+SR_PRIV void sr_fs9721_01_temp_c(struct sr_datafeed_analog_old *analog, void *info);
+SR_PRIV void sr_fs9721_10_temp_c(struct sr_datafeed_analog_old *analog, void *info);
+SR_PRIV void sr_fs9721_01_10_temp_f_c(struct sr_datafeed_analog_old *analog, void *info);
+SR_PRIV void sr_fs9721_max_c_min(struct sr_datafeed_analog_old *analog, void *info);
/*--- hardware/dmm/m2110.c --------------------------------------------------*/
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);
+ struct sr_datafeed_analog_old *analog, void *info);
/*--- hardware/dmm/metex14.c ------------------------------------------------*/
#endif
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);
+ struct sr_datafeed_analog_old *analog, void *info);
/*--- hardware/dmm/rs9lcd.c -------------------------------------------------*/
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);
+ struct sr_datafeed_analog_old *analog, void *info);
/*--- hardware/dmm/bm25x.c --------------------------------------------------*/
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);
+ struct sr_datafeed_analog_old *analog, void *info);
/*--- hardware/dmm/ut71x.c --------------------------------------------------*/
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);
+ struct sr_datafeed_analog_old *analog, void *info);
/*--- hardware/dmm/vc870.c --------------------------------------------------*/
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);
+ struct sr_datafeed_analog_old *analog, void *info);
/*--- hardware/lcr/es51919.c ------------------------------------------------*/
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);
+ struct sr_datafeed_analog_old *analog, void *info);
+
+/*--- 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_old *analog, void *info);
#endif