- if (buf[0] != 0xf0) {
- /* First time: Synchronize to the start of a packet. */
- if (!synced_on_first_packet) {
- if (dmm == UNI_T_UT61D) {
- /* Valid packets start with '+' or '-'. */
- if ((buf[1] != '+') && buf[1] != '-')
- return TRUE;
- } else if (dmm == VOLTCRAFT_VC820) {
- /* Valid packets have 0x1 as high nibble. */
- if (!sr_fs9721_is_packet_start(buf[1]))
- return TRUE;
- }
- synced_on_first_packet = TRUE;
- sr_spew("Successfully synchronized on first packet.");
- }
-
- num_databytes_in_chunk = buf[0] & 0x0f;
- for (i = 0; i < num_databytes_in_chunk; i++)
- pbuf[data_byte_counter++] = buf[1 + i];
-
- /* TODO: Handle > 14 bytes in pbuf? Can this happen? */
- if (data_byte_counter == NUM_DATA_BYTES) {
- log_dmm_packet(pbuf);
- data_byte_counter = 0;
- if (dmm == VOLTCRAFT_VC820) {
- if (!sr_fs9721_packet_valid(pbuf)) {
- sr_err("Invalid packet.");
- return TRUE;
- }
- }
- decode_packet(devc, dmm, pbuf);
- memset(pbuf, 0x00, NUM_DATA_BYTES);
+ /* If there are no data bytes just return (without error). */
+ if (buf[0] == 0xf0)
+ return SR_OK;
+
+ devc->bufoffset = 0;
+
+ /* Append the 1-7 data bytes of this chunk to pbuf. */
+ num_databytes_in_chunk = buf[0] & 0x0f;
+ for (i = 0; i < num_databytes_in_chunk; i++)
+ pbuf[devc->buflen++] = buf[1 + i];
+
+ /* Now look for packets in that data. */
+ while ((devc->buflen - devc->bufoffset) >= udmms[dmm].packet_size) {
+ if (udmms[dmm].packet_valid(pbuf + devc->bufoffset)) {
+ log_dmm_packet(pbuf + devc->bufoffset);
+ decode_packet(sdi, dmm, pbuf + devc->bufoffset, info);
+ devc->bufoffset += udmms[dmm].packet_size;
+ } else {
+ devc->bufoffset++;