X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fhardware%2Fserial-lcr%2Fprotocol.c;h=f0e997317de3d9d4fcabe11f56eb412ddf80243f;hb=dd143eb2c781c46bc3a7efd66d259e4b1390e1d2;hp=ccf89747cbabccb1257130b668b4fb0787d15266;hpb=bf5c4d46f8453f810b6f7615d2c16c9f752f9246;p=libsigrok.git diff --git a/src/hardware/serial-lcr/protocol.c b/src/hardware/serial-lcr/protocol.c index ccf89747..f0e99731 100644 --- a/src/hardware/serial-lcr/protocol.c +++ b/src/hardware/serial-lcr/protocol.c @@ -31,7 +31,6 @@ static void send_frame_start(struct sr_dev_inst *sdi) struct lcr_parse_info *info; uint64_t freq; const char *model; - struct sr_datafeed_packet packet; devc = sdi->priv; info = &devc->parse_info; @@ -51,16 +50,7 @@ static void send_frame_start(struct sr_dev_inst *sdi) } /* Data is about to get sent. Start a new frame. */ - packet.type = SR_DF_FRAME_BEGIN; - sr_session_send(sdi, &packet); -} - -static void send_frame_end(struct sr_dev_inst *sdi) -{ - struct sr_datafeed_packet packet; - - packet.type = SR_DF_FRAME_END; - sr_session_send(sdi, &packet); + std_session_send_df_frame_begin(sdi); } static int handle_packet(struct sr_dev_inst *sdi, const uint8_t *pkt) @@ -106,7 +96,7 @@ static int handle_packet(struct sr_dev_inst *sdi, const uint8_t *pkt) g_slist_free(analog.meaning->channels); } if (frame) { - send_frame_end(sdi); + std_session_send_df_frame_end(sdi); sr_sw_limits_update_frames_read(&devc->limits, 1); } @@ -156,10 +146,42 @@ static int handle_new_data(struct sr_dev_inst *sdi) return SR_OK; } +static int handle_timeout(struct sr_dev_inst *sdi) +{ + struct dev_context *devc; + const struct lcr_info *lcr; + struct sr_serial_dev_inst *serial; + int64_t now; + int ret; + + devc = sdi->priv; + lcr = devc->lcr_info; + + if (!lcr->packet_request) + return SR_OK; + + now = g_get_monotonic_time(); + if (devc->req_next_at && now < devc->req_next_at) + return SR_OK; + + serial = sdi->conn; + ret = lcr->packet_request(serial); + if (ret < 0) { + sr_err("Failed to request packet: %d.", ret); + return ret; + } + + if (lcr->req_timeout_ms) + devc->req_next_at = now + lcr->req_timeout_ms * 1000; + + return SR_OK; +} + SR_PRIV int lcr_receive_data(int fd, int revents, void *cb_data) { struct sr_dev_inst *sdi; struct dev_context *devc; + int ret; (void)fd; @@ -169,10 +191,13 @@ SR_PRIV int lcr_receive_data(int fd, int revents, void *cb_data) return TRUE; if (revents == G_IO_IN) - handle_new_data(sdi); - + ret = handle_new_data(sdi); + else + ret = handle_timeout(sdi); if (sr_sw_limits_check(&devc->limits)) sr_dev_acquisition_stop(sdi); + if (ret != SR_OK) + return FALSE; return TRUE; }