- if (revents == G_IO_IN) {
- /* Get the value. */
- korad_kaxxxxp_get_reply(serial, devc);
-
- /* Send the value forward. */
- packet.type = SR_DF_ANALOG_OLD;
- packet.payload = &analog;
- analog.channels = sdi->channels;
- analog.num_samples = 1;
- if (devc->target == KAXXXXP_CURRENT) {
- analog.mq = SR_MQ_CURRENT;
- analog.unit = SR_UNIT_AMPERE;
- analog.mqflags = 0;
- analog.data = &devc->current;
- sr_session_send(sdi, &packet);
- }
- if (devc->target == KAXXXXP_VOLTAGE) {
- analog.mq = SR_MQ_VOLTAGE;
- analog.unit = SR_UNIT_VOLT;
- analog.mqflags = SR_MQFLAG_DC;
- analog.data = &devc->voltage;
- sr_session_send(sdi, &packet);
- devc->num_samples++;
- }
- next_measurement(devc);
- } else {
- /* Time out */
- if (!devc->reply_pending) {
- if (korad_kaxxxxp_query_value(serial, devc) < 0)
- return TRUE;
- devc->req_sent_at = g_get_monotonic_time();
- devc->reply_pending = TRUE;
- }
- }
-
- if (devc->limit_samples && (devc->num_samples >= devc->limit_samples)) {
- sr_info("Requested number of samples reached.");
- sdi->driver->dev_acquisition_stop(sdi);
- return TRUE;
- }
-
- if (devc->limit_msec) {
- t = (g_get_monotonic_time() - devc->starttime) / 1000;
- if (t > (int64_t)devc->limit_msec) {
- sr_info("Requested time limit reached.");
- sdi->driver->dev_acquisition_stop(sdi);
- return TRUE;
- }
+ /* Get the value. */
+ korad_kaxxxxp_get_value(serial, devc->acquisition_target, devc);
+
+ /* Note: digits/spec_digits will be overridden later. */
+ sr_analog_init(&analog, &encoding, &meaning, &spec, 0);
+
+ /* Send the value forward. */
+ packet.type = SR_DF_ANALOG;
+ packet.payload = &analog;
+ analog.num_samples = 1;
+ l = g_slist_copy(sdi->channels);
+ if (devc->acquisition_target == KAXXXXP_CURRENT) {
+ l = g_slist_remove_link(l, g_slist_nth(l, 0));
+ analog.meaning->channels = l;
+ analog.meaning->mq = SR_MQ_CURRENT;
+ analog.meaning->unit = SR_UNIT_AMPERE;
+ analog.meaning->mqflags = SR_MQFLAG_DC;
+ analog.encoding->digits = 3;
+ analog.spec->spec_digits = 3;
+ analog.data = &devc->current;
+ sr_session_send(sdi, &packet);
+ } else if (devc->acquisition_target == KAXXXXP_VOLTAGE) {
+ l = g_slist_remove_link(l, g_slist_nth(l, 1));
+ analog.meaning->channels = l;
+ analog.meaning->mq = SR_MQ_VOLTAGE;
+ analog.meaning->unit = SR_UNIT_VOLT;
+ analog.meaning->mqflags = SR_MQFLAG_DC;
+ analog.encoding->digits = 2;
+ analog.spec->spec_digits = 2;
+ analog.data = &devc->voltage;
+ sr_session_send(sdi, &packet);
+ sr_sw_limits_update_samples_read(&devc->limits, 1);