/** libsigrok driver info struct. */
struct sr_dev_driver di;
/** Manufacturer/brand. */
- char *vendor;
+ const char *vendor;
/** Model. */
- char *device;
- /** serialconn string. */
- char *conn;
- /** Baud rate. */
- uint32_t baudrate;
+ const char *device;
+ /** conn string. */
+ const char *conn;
+ /** serialcomm string. */
+ const char *serialcomm;
/** Packet size in bytes. */
- int packet_size;
- /** Request timeout [ms] before request is considered lost and a new
- * one is sent. Used only if device needs polling. */
- int64_t req_timeout_ms;
- /** Delay between reception of packet and next request. Some DMMs
- * need this. Used only if device needs polling. */
- int64_t req_delay_ms;
+ size_t packet_size;
+ /**
+ * Request timeout [ms] before request is considered lost and a new
+ * one is sent. Used only if device needs polling.
+ */
+ uint64_t req_timeout_ms;
+ /**
+ * Delay between reception of packet and next request. Some DMMs
+ * need this. Used only if device needs polling.
+ */
+ uint64_t req_delay_ms;
/** Packet request function. */
int (*packet_request)(struct sr_serial_dev_inst *);
+ /** Number of channels / displays. */
+ size_t channel_count;
+ /** (Optional) printf formats for channel names. */
+ const char **channel_formats;
/** Packet validation function. */
gboolean (*packet_valid)(const uint8_t *);
/** Packet parsing function. */
void (*dmm_details)(struct sr_datafeed_analog *, void *);
/** Size of chipset info struct. */
gsize info_size;
+ /* Serial-dmm items "with state" and variable length packets. */
+ void *dmm_state;
+ void *(*dmm_state_init)(void);
+ void (*dmm_state_free)(void *state);
+ int (*after_open)(struct sr_serial_dev_inst *serial);
+ int (*packet_valid_len)(void *state, const uint8_t *data, size_t dlen,
+ size_t *pkt_len);
+ int (*packet_parse_len)(void *state, const uint8_t *data, size_t dlen,
+ double *val, struct sr_datafeed_analog *analog, void *info);
+ int (*config_get)(void *state, uint32_t key, GVariant **data,
+ const struct sr_dev_inst *sdi, const struct sr_channel_group *cg);
+ int (*config_set)(void *state, uint32_t key, GVariant *data,
+ const struct sr_dev_inst *sdi, const struct sr_channel_group *cg);
+ int (*config_list)(void *state, uint32_t key, GVariant **data,
+ const struct sr_dev_inst *sdi, const struct sr_channel_group *cg);
+ /** Hook at acquisition start. Can re-route the receive routine. */
+ int (*acquire_start)(void *state, const struct sr_dev_inst *sdi,
+ sr_receive_data_callback *cb, void **cb_data);
};
#define DMM_BUFSIZE 256
-/** Private, per-device-instance driver context. */
struct dev_context {
- /** The current sampling limit (in number of samples). */
- uint64_t limit_samples;
-
- /** The time limit (in milliseconds). */
- uint64_t limit_msec;
-
- /** Opaque pointer passed in by the frontend. */
- void *cb_data;
-
- /** The current number of already received samples. */
- uint64_t num_samples;
-
- /** The starting time of current sampling run. */
- int64_t starttime;
+ struct sr_sw_limits limits;
uint8_t buf[DMM_BUFSIZE];
- int bufoffset;
- int buflen;
+ size_t buflen;
- /** The timestamp [µs] to send the next request.
- * Used only if device needs polling. */
- int64_t req_next_at;
+ /**
+ * The timestamp [µs] to send the next request.
+ * Used only if device needs polling.
+ */
+ uint64_t req_next_at;
};
SR_PRIV int req_packet(struct sr_dev_inst *sdi);