summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
inline | side by side (from parent 1:
65a6794)
The previous implementation used to put FRAME_BEGIN and FRAME_END
markers around each received chunk of samples, while those chunks
correspond to a single channel (analog) or a group of eight channels
(digital) each. In other words, the hameg-hmo driver had provided a
multiple of the requested frames, and those frames were incomplete.
Make sure to only send FRAME_BEGIN before the first channel's data,
and FRAME_END after the last channel's data of a frame. Thus make
sigrok frames exactly match the scope's frames.
Add some comments on the frame marker and the acquisition stop logic
while we are here.
ch = devc->current_channel->data;
state = devc->model_state;
ch = devc->current_channel->data;
state = devc->model_state;
+ /*
+ * Send "frame begin" packet upon reception of data for the
+ * first enabled channel.
+ */
+ if (devc->current_channel == devc->enabled_channels) {
+ packet.type = SR_DF_FRAME_BEGIN;
+ sr_session_send(sdi, &packet);
+ }
+
+ /*
+ * Pass on the received data of the channel(s).
+ */
switch (ch->type) {
case SR_CHANNEL_ANALOG:
if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
switch (ch->type) {
case SR_CHANNEL_ANALOG:
if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
- packet.type = SR_DF_FRAME_BEGIN;
- sr_session_send(sdi, &packet);
-
packet.type = SR_DF_ANALOG;
analog.data = data->data;
packet.type = SR_DF_ANALOG;
analog.data = data->data;
- packet.type = SR_DF_FRAME_BEGIN;
- sr_session_send(sdi, &packet);
logic.length = data->len;
logic.unitsize = 1;
logic.length = data->len;
logic.unitsize = 1;
- packet.type = SR_DF_FRAME_END;
- sr_session_send(sdi, &packet);
-
+ /*
+ * Advance to the next enabled channel. When data for all enabled
+ * channels was received, then send the "frame end" packet.
+ */
if (devc->current_channel->next) {
devc->current_channel = devc->current_channel->next;
hmo_request_data(sdi);
if (devc->current_channel->next) {
devc->current_channel = devc->current_channel->next;
hmo_request_data(sdi);
- } else if (++devc->num_frames == devc->frame_limit) {
+ return TRUE;
+ }
+ packet.type = SR_DF_FRAME_END;
+ sr_session_send(sdi, &packet);
+
+ /*
+ * End of frame was reached. Stop acquisition after the specified
+ * number of frames, or continue reception by starting over at
+ * the first enabled channel.
+ */
+ if (++devc->num_frames == devc->frame_limit) {
sdi->driver->dev_acquisition_stop(sdi);
} else {
devc->current_channel = devc->enabled_channels;
sdi->driver->dev_acquisition_stop(sdi);
} else {
devc->current_channel = devc->enabled_channels;