+ sr_info("In callback G_IO_IN, offset=%d", devc->offset);
+
+ bytes_remaining = (devc->limit_samples * logic.unitsize) -
+ devc->bytes_read;
+
+ /* Configure data packet */
+ packet.type = SR_DF_LOGIC;
+ packet.payload = &logic;
+ logic.data = devc->sample_buf + devc->offset;
+ logic.length = MIN(packetsize, bytes_remaining);
+
+ if (devc->trigger_fired) {
+ /* Send the incoming transfer to the session bus. */
+ sr_session_send(devc->cb_data, &packet);
+ } else {
+ /* Check for trigger */
+ trigger_offset = soft_trigger_logic_check(devc->stl,
+ logic.data,
+ packetsize);
+
+ if (trigger_offset > -1) {
+ trigger_offset *= logic.unitsize;
+ logic.length = MIN(packetsize - trigger_offset,
+ bytes_remaining);
+ logic.data += trigger_offset;
+
+ sr_session_send(devc->cb_data, &packet);
+
+ devc->trigger_fired = TRUE;
+ }
+ }
+
+ /* Move the read pointer forward */
+ lseek(fd, packetsize, SEEK_CUR);
+
+ /* Update byte count and offset (roll over if needed) */
+ devc->bytes_read += logic.length;
+ if ((devc->offset += packetsize) >= devc->buffersize) {
+ /* One shot capture, we abort and settle with less than
+ * the required number of samples */
+ if (devc->triggerflags)
+ devc->offset = 0;
+ else
+ packetsize = 0;
+ }
+ }
+
+ /* EOF Received or we have reached the limit */
+ if (devc->bytes_read >= devc->limit_samples * logic.unitsize ||
+ packetsize == 0) {
+ /* Send EOA Packet, stop polling */
+ packet.type = SR_DF_END;
+ packet.payload = NULL;
+ sr_session_send(devc->cb_data, &packet);
+
+ sr_session_source_remove_pollfd(sdi->session, &devc->pollfd);