Signed-off-by: Lars-Peter Clausen <redacted>
sdi->driver = di;
sdi->connection_id = g_strdup(connection_id);
devc = g_malloc0(sizeof(struct dev_context));
sdi->driver = di;
sdi->connection_id = g_strdup(connection_id);
devc = g_malloc0(sizeof(struct dev_context));
+ sr_sw_limits_init(&devc->limits);
sdi->priv = devc;
sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "P1");
sdi->priv = devc;
sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "P1");
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
const struct sr_channel_group *cg)
{
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
const struct sr_channel_group *cg)
{
+ struct dev_context *devc = sdi->priv;
struct sr_usb_dev_inst *usb;
char str[128];
struct sr_usb_dev_inst *usb;
char str[128];
snprintf(str, 128, "%d.%d", usb->bus, usb->address);
*data = g_variant_new_string(str);
break;
snprintf(str, 128, "%d.%d", usb->bus, usb->address);
*data = g_variant_new_string(str);
break;
+ case SR_CONF_LIMIT_SAMPLES:
+ case SR_CONF_LIMIT_MSEC:
+ return sr_sw_limits_config_get(&devc->limits, key, data);
default:
return SR_ERR_NA;
}
default:
return SR_ERR_NA;
}
const struct sr_channel_group *cg)
{
struct dev_context *devc;
const struct sr_channel_group *cg)
{
struct dev_context *devc;
- switch (key) {
- case SR_CONF_LIMIT_MSEC:
- devc->limit_msec = g_variant_get_uint64(data);
- now = g_get_monotonic_time() / 1000;
- devc->end_time = now + devc->limit_msec;
- break;
- case SR_CONF_LIMIT_SAMPLES:
- devc->limit_samples = g_variant_get_uint64(data);
- break;
- default:
- return SR_ERR_NA;
- }
-
- return SR_OK;
+ return sr_sw_limits_config_set(&devc->limits, key, data);
}
static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
}
static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
sr_dbg("Got %d-byte packet.", transfer->actual_length);
if (transfer->actual_length == DMM_DATA_SIZE) {
victor_dmm_receive_data(sdi, transfer->buffer);
sr_dbg("Got %d-byte packet.", transfer->actual_length);
if (transfer->actual_length == DMM_DATA_SIZE) {
victor_dmm_receive_data(sdi, transfer->buffer);
- if (devc->limit_samples) {
- if (devc->num_samples >= devc->limit_samples)
- dev_acquisition_stop(sdi);
- }
+ if (sr_sw_limits_check(&devc->limits))
+ dev_acquisition_stop(sdi);
}
}
/* Anything else is either an error or a timeout, which is fine:
}
}
/* Anything else is either an error or a timeout, which is fine:
struct sr_dev_inst *sdi;
struct sr_dev_driver *di;
struct timeval tv;
struct sr_dev_inst *sdi;
struct sr_dev_driver *di;
struct timeval tv;
di = sdi->driver;
drvc = di->context;
di = sdi->driver;
drvc = di->context;
- if (devc->limit_msec) {
- now = g_get_monotonic_time() / 1000;
- if (now > devc->end_time)
- dev_acquisition_stop(sdi);
- }
+ if (sr_sw_limits_check(&devc->limits))
+ dev_acquisition_stop(sdi);
if (sdi->status == SR_ST_STOPPING) {
usb_source_remove(sdi->session, drvc->sr_ctx);
if (sdi->status == SR_ST_STOPPING) {
usb_source_remove(sdi->session, drvc->sr_ctx);
packet.payload = &analog;
sr_session_send(sdi, &packet);
packet.payload = &analog;
sr_session_send(sdi, &packet);
+ sr_sw_limits_update_samples_read(&devc->limits, 1);
}
SR_PRIV int victor_dmm_receive_data(struct sr_dev_inst *sdi, unsigned char *buf)
}
SR_PRIV int victor_dmm_receive_data(struct sr_dev_inst *sdi, unsigned char *buf)
/** Private, per-device-instance driver context. */
struct dev_context {
/** Private, per-device-instance driver context. */
struct dev_context {
- /** The current sampling limit (in number of samples). */
- uint64_t limit_samples;
-
- /** The current sampling limit (in ms). */
- uint64_t limit_msec;
-
- /** The current number of already received samples. */
- uint64_t num_samples;
- gint64 end_time;
+ struct sr_sw_limits limits;
};
SR_PRIV int victor_dmm_receive_data(struct sr_dev_inst *sdi, unsigned char *buf);
};
SR_PRIV int victor_dmm_receive_data(struct sr_dev_inst *sdi, unsigned char *buf);