- if (ret % vdev->unitsize != 0)
- sr_warn("Read size %d not a multiple of the"
- " unit size %d.", ret, vdev->unitsize);
- got_data = TRUE;
- packet.type = SR_DF_LOGIC;
- packet.payload = &logic;
- logic.length = ret;
- logic.unitsize = vdev->unitsize;
- logic.data = buf;
- vdev->bytes_read += ret;
- sr_session_send(sdi, &packet);
+ if (vdev->cur_analog_channel != 0) {
+ got_data = TRUE;
+ packet.type = SR_DF_ANALOG;
+ packet.payload = &analog;
+ /* TODO: Use proper 'digits' value for this device (and its modes). */
+ sr_analog_init(&analog, &encoding, &meaning, &spec, 2);
+ analog.meaning->channels = g_slist_prepend(NULL,
+ g_array_index(vdev->analog_channels,
+ struct sr_channel *, vdev->cur_analog_channel - 1));
+ analog.num_samples = ret / sizeof(float);
+ analog.meaning->mq = SR_MQ_VOLTAGE;
+ analog.meaning->unit = SR_UNIT_VOLT;
+ analog.meaning->mqflags = SR_MQFLAG_DC;
+ analog.data = (float *) buf;
+ } else if (vdev->unitsize) {
+ got_data = TRUE;
+ if (ret % vdev->unitsize != 0)
+ sr_warn("Read size %d not a multiple of the"
+ " unit size %d.", ret, vdev->unitsize);
+ packet.type = SR_DF_LOGIC;
+ packet.payload = &logic;
+ logic.length = ret;
+ logic.unitsize = vdev->unitsize;
+ logic.data = buf;
+ } else {
+ /*
+ * Neither analog data, nor logic which has
+ * unitsize, must be an unexpected API use.
+ */
+ sr_warn("Neither analog nor logic data. Ignoring.");
+ }
+ if (got_data) {
+ vdev->bytes_read += ret;
+ sr_session_send(sdi, &packet);
+ }