((unsigned)((const uint8_t*)(x))[1] << 8) | \
(unsigned)((const uint8_t*)(x))[0]))
+/**
+ * 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)
+
/**
* Write a 8 bits unsigned integer to memory.
* @param p a pointer to the output memory
* @param x the input unsigned integer
*/
-#define W8(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); } while(0)
+#define W8(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); } while (0)
/**
* Write a 16 bits unsigned integer to memory stored as big endian.
* @param x the input unsigned integer
*/
#define WB16(p, x) do { ((uint8_t*)(p))[1] = (uint8_t) (x); \
- ((uint8_t*)(p))[0] = (uint8_t)((x)>>8); } while(0)
+ ((uint8_t*)(p))[0] = (uint8_t)((x)>>8); } while (0)
/**
* Write a 16 bits unsigned integer to memory stored as little endian.
* @param x the input unsigned integer
*/
#define WL16(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); \
- ((uint8_t*)(p))[1] = (uint8_t)((x)>>8); } while(0)
+ ((uint8_t*)(p))[1] = (uint8_t)((x)>>8); } while (0)
/**
* Write a 32 bits unsigned integer to memory stored as big endian.
#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); \
- ((uint8_t*)(p))[0] = (uint8_t)((x)>>24); } while(0)
+ ((uint8_t*)(p))[0] = (uint8_t)((x)>>24); } while (0)
/**
* Write a 32 bits unsigned integer to memory stored as little endian.
#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); \
- ((uint8_t*)(p))[3] = (uint8_t)((x)>>24); } while(0)
+ ((uint8_t*)(p))[3] = (uint8_t)((x)>>24); } while (0)
+
+/**
+ * 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)
/* Portability fixes for FreeBSD. */
#ifdef __FreeBSD__
#define LIBUSB_CLASS_APPLICATION 0xfe
+#define libusb_has_capability(x) 0
#define libusb_handle_events_timeout_completed(ctx, tv, c) \
libusb_handle_events_timeout(ctx, tv)
#endif
#endif
struct sr_context {
+ 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;
- GMutex usb_mutex;
- HANDLE usb_event;
+ HANDLE usb_wait_request_event;
+ HANDLE usb_wait_complete_event;
GPollFD usb_pollfd;
sr_receive_data_callback usb_cb;
void *usb_cb_data;
*/
const char *desc;
+ /**
+ * 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;
+
/**
* 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
*/
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.
*/
char *desc;
+ /**
+ * 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;
+
+ /**
+ * 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.
int (*init) (struct sr_output *o, GHashTable *options);
/**
- * This function is passed a copy of every packed in the data feed.
+ * This function is passed a copy of every packet in the data feed.
* 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.
int (*cleanup) (struct sr_output *o);
};
+/** 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);
+};
+
#ifdef HAVE_LIBUSB_1_0
/** USB device instance */
struct sr_usb_dev_inst {
SR_CHANNEL_SET_ENABLED = 1 << 0,
};
-SR_PRIV struct sr_channel *sr_channel_new(int index, int type,
- gboolean enabled, const char *name);
+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 {
+ /** 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;
+};
/* Generic device instances */
-SR_PRIV struct sr_dev_inst *sr_dev_inst_new(int status,
- const char *vendor, const char *model, const char *version);
SR_PRIV void sr_dev_inst_free(struct sr_dev_inst *sdi);
#ifdef HAVE_LIBUSB_1_0
/*--- hwdriver.c ------------------------------------------------------------*/
+extern SR_PRIV struct sr_dev_driver **drivers_lists[];
+
SR_PRIV const GVariantType *sr_variant_type_get(int datatype);
SR_PRIV int sr_variant_type_check(uint32_t key, GVariant *data);
-SR_PRIV void sr_hw_cleanup_all(void);
+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);
/*--- session.c -------------------------------------------------------------*/
struct sr_session {
+ /** Context this session exists in. */
+ struct sr_context *ctx;
/** List of struct sr_dev_inst pointers. */
GSList *devs;
/** List of struct sr_dev_inst pointers owned by this session. */
GSList *owned_devs;
/** List of struct datafeed_callback pointers. */
GSList *datafeed_callbacks;
+ GSList *transforms;
struct sr_trigger *trigger;
GTimeVal starttime;
gboolean running;
struct sr_datafeed_packet **copy);
SR_PRIV void sr_packet_free(struct sr_datafeed_packet *packet);
+/*--- 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);
+
/*--- std.c -----------------------------------------------------------------*/
typedef int (*dev_close_callback)(struct sr_dev_inst *sdi);
int unitsize;
int cur_stage;
uint8_t *prev_sample;
+ uint8_t *pre_trigger_buffer;
+ uint8_t *pre_trigger_head;
+ int pre_trigger_size;
+ int pre_trigger_fill;
};
SR_PRIV struct soft_trigger_logic *soft_trigger_logic_new(
- const struct sr_dev_inst *sdi, struct sr_trigger *trigger);
+ const struct sr_dev_inst *sdi, struct sr_trigger *trigger,
+ int pre_trigger_samples);
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 len, int *pre_trigger_samples);
/*--- hardware/serial.c -----------------------------------------------------*/
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);
+SR_PRIV int serial_drain(struct sr_serial_dev_inst *serial);
SR_PRIV int serial_write_blocking(struct sr_serial_dev_inst *serial,
const void *buf, size_t count, unsigned int timeout_ms);
SR_PRIV int serial_write_nonblocking(struct sr_serial_dev_inst *serial,
#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?"
-
-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;
-};
+/*--- modbus/modbus.c -------------------------------------------------------*/
-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 int sr_ut71x_parse(const uint8_t *buf, float *floatval,
struct sr_datafeed_analog *analog, void *info);
+/*--- 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);
+
/*--- hardware/lcr/es51919.c ------------------------------------------------*/
SR_PRIV void es51919_serial_clean(void *priv);
SR_PRIV int es51919_serial_acquisition_stop(struct sr_dev_inst *sdi,
void *cb_data);
+/*--- 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);
+
+/*--- 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);
+
#endif