From: Gerhard Sittig Date: Fri, 6 Jan 2017 17:12:55 +0000 (+0100) Subject: hameg-hmo: Send exactly one sigrok frame per scope frame X-Git-Tag: libsigrok-0.5.0~145 X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=b23eb1d4d13d5ccf23303bf0bd378504f84de580 hameg-hmo: Send exactly one sigrok frame per scope frame 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. --- diff --git a/src/hardware/hameg-hmo/protocol.c b/src/hardware/hameg-hmo/protocol.c index 97eb77aa..978708c4 100644 --- a/src/hardware/hameg-hmo/protocol.c +++ b/src/hardware/hameg-hmo/protocol.c @@ -799,6 +799,18 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) 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) { @@ -808,9 +820,6 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) return TRUE; } - packet.type = SR_DF_FRAME_BEGIN; - sr_session_send(sdi, &packet); - packet.type = SR_DF_ANALOG; analog.data = data->data; @@ -857,8 +866,6 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) return TRUE; } - packet.type = SR_DF_FRAME_BEGIN; - sr_session_send(sdi, &packet); logic.length = data->len; logic.unitsize = 1; @@ -874,13 +881,24 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) break; } - 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); - } 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;