#ifdef HAVE_LIBUSB_1_0
#include <libusb.h>
#endif
+#ifdef HAVE_LIBFTDI
+#include <ftdi.h>
+#endif
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
}
#define WL32(p, x) write_u32le((uint8_t *)(p), (uint32_t)(x))
+/**
+ * Write a 48 bits unsigned integer to memory stored as little endian.
+ * @param p a pointer to the output memory
+ * @param x the input unsigned integer
+ */
+static inline void write_u48le(uint8_t *p, uint64_t x)
+{
+ p[0] = x & 0xff; x >>= 8;
+ p[1] = x & 0xff; x >>= 8;
+ p[2] = x & 0xff; x >>= 8;
+ p[3] = x & 0xff; x >>= 8;
+ p[4] = x & 0xff; x >>= 8;
+ p[5] = x & 0xff; x >>= 8;
+}
+#define WL48(p, x) write_u48le((uint8_t *)(p), (uint64_t)(x))
+
/**
* Write a 64 bits unsigned integer to memory stored as big endian.
* @param p a pointer to the output memory
*p += sizeof(x);
}
+/**
+ * Write unsigned 48bit little endian integer to raw memory, increment write position.
+ * @param[in, out] p Pointer into byte stream.
+ * @param[in] x Value to write.
+ */
+static inline void write_u48le_inc(uint8_t **p, uint64_t x)
+{
+ if (!p || !*p)
+ return;
+ write_u48le(*p, x);
+ *p += 48 / 8 * sizeof(uint8_t);
+}
+
/**
* Write unsigned 64bit little endian integer to raw memory, increment write position.
* @param[in, out] p Pointer into byte stream.
libusb_handle_events_timeout(ctx, tv)
#endif
+/*
+ * Convenience for FTDI library version dependency.
+ * - Version 1.5 introduced ftdi_tciflush(), ftdi_tcoflush(), and
+ * ftdi_tcioflush() all within the same commit, and deprecated
+ * ftdi_usb_purge_buffers() which suffered from inverse semantics.
+ * The API is drop-in compatible (arguments count and data types are
+ * identical). The libsigrok source code always flushes RX and TX at
+ * the same time, never individually.
+ */
+#if defined HAVE_FTDI_TCIOFLUSH && HAVE_FTDI_TCIOFLUSH
+# define PURGE_FTDI_BOTH ftdi_tcioflush
+#else
+# define PURGE_FTDI_BOTH ftdi_usb_purge_buffers
+#endif
+
/* 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 { } */
SR_PRIV int sr_atol(const char *str, long *ret);
SR_PRIV int sr_atol_base(const char *str, long *ret, char **end, int base);
+SR_PRIV int sr_atoul_base(const char *str, unsigned long *ret, char **end, int base);
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);
size_t packet_size, packet_valid_callback is_valid,
packet_valid_len_callback is_valid_len, size_t *return_size,
uint64_t timeout_ms);
-SR_PRIV int sr_serial_extract_options(GSList *options, const char **serial_device,
- const char **serial_options);
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);
#endif
#endif
+SR_PRIV int sr_serial_extract_options(GSList *options,
+ const char **serial_device, const char **serial_options);
+
/*--- bt/ API ---------------------------------------------------------------*/
#ifdef HAVE_BLUETOOTH
/** Binary value type */
enum binary_value_type {
- BVT_UINT8 = 0,
+ BVT_INVALID,
+
+ BVT_UINT8,
BVT_BE_UINT8 = BVT_UINT8,
BVT_LE_UINT8 = BVT_UINT8,
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);
+/*--- dmm/mm38xr.c ---------------------------------------------------------*/
+
+#define METERMAN_38XR_PACKET_SIZE 15
+
+struct meterman_38xr_info { int dummy; };
+
+SR_PRIV gboolean meterman_38xr_packet_valid(const uint8_t *buf);
+SR_PRIV int meterman_38xr_parse(const uint8_t *buf, float *floatval,
+ struct sr_datafeed_analog *analog, void *info);
+
/*--- dmm/ms2115b.c ---------------------------------------------------------*/
#define MS2115B_PACKET_SIZE 9
GVariant *data);
SR_PRIV void sr_sw_limits_acquisition_start(struct sr_sw_limits *limits);
SR_PRIV gboolean sr_sw_limits_check(struct sr_sw_limits *limits);
+SR_PRIV int sr_sw_limits_get_remain(const struct sr_sw_limits *limits,
+ uint64_t *samples, uint64_t *frames, uint64_t *msecs,
+ gboolean *exceeded);
SR_PRIV void sr_sw_limits_update_samples_read(struct sr_sw_limits *limits,
uint64_t samples_read);
SR_PRIV void sr_sw_limits_update_frames_read(struct sr_sw_limits *limits,
struct feed_queue_analog;
SR_API struct feed_queue_logic *feed_queue_logic_alloc(
- struct sr_dev_inst *sdi,
+ const struct sr_dev_inst *sdi,
size_t sample_count, size_t unit_size);
SR_API int feed_queue_logic_submit(struct feed_queue_logic *q,
const uint8_t *data, size_t count);
SR_API int feed_queue_logic_flush(struct feed_queue_logic *q);
+SR_API int feed_queue_logic_send_trigger(struct feed_queue_logic *q);
SR_API void feed_queue_logic_free(struct feed_queue_logic *q);
SR_API struct feed_queue_analog *feed_queue_analog_alloc(
- struct sr_dev_inst *sdi,
+ const struct sr_dev_inst *sdi,
size_t sample_count, int digits, struct sr_channel *ch);
SR_API int feed_queue_analog_submit(struct feed_queue_analog *q,
float data, size_t count);