+ } else if (devc->state == ST_GET_LOG_HEADER) {
+ sr_dbg("log header: 0x%.2x", c);
+ if (devc->buf_len < 2)
+ devc->buf[devc->buf_len++] = c;
+ if (devc->buf_len == 2) {
+ sr_dbg("Device says it has %d bytes stored.",
+ ((devc->buf[0] << 8) + devc->buf[1]) - 100);
+ devc->buf_len = 0;
+ devc->state = ST_GET_LOG_RECORD_META;
+ }
+ } else if (devc->state == ST_GET_LOG_RECORD_META) {
+ sr_dbg("log meta: 0x%.2x", c);
+ if (c == RECORD_END) {
+ devc->state = ST_INIT;
+ /* Stop acquisition after transferring all stored
+ * records. Otherwise the frontend would have no
+ * way to tell where stored data ends and live
+ * measurements begin. */
+ sdi->driver->dev_acquisition_stop((struct sr_dev_inst *)sdi,
+ devc->cb_data);
+ } else if (c == RECORD_DATA) {
+ devc->buf_len = 0;
+ devc->state = ST_GET_LOG_RECORD_DATA;
+ } else {
+ /* RECORD_DBA/RECORD_DBC + 7 bytes of metadata */
+ devc->buf[devc->buf_len++] = c;
+ if (devc->buf_len < 8)
+ /* Keep filling up the record header. */
+ return;
+ if (devc->buf[0] == RECORD_DBA)
+ devc->cur_mqflags = SR_MQFLAG_SPL_FREQ_WEIGHT_A;
+ else if (devc->buf[0] == RECORD_DBC)
+ devc->cur_mqflags = SR_MQFLAG_SPL_FREQ_WEIGHT_C;
+ else {
+ /* Shouldn't happen. */
+ sr_dbg("Unknown record token 0x%.2x", c);
+ return;
+ }
+ packet.type = SR_DF_META;
+ packet.payload = &meta;
+ src = sr_config_new(SR_CONF_SAMPLE_INTERVAL,
+ g_variant_new_uint64(devc->buf[7] * 1000));
+ meta.config = g_slist_append(NULL, src);
+ sr_session_send(devc->cb_data, &packet);
+ g_free(src);
+ devc->buf_len = 0;
+ }
+ } else if (devc->state == ST_GET_LOG_RECORD_DATA) {
+ sr_dbg("log data: 0x%.2x", c);
+ if (c == RECORD_DBA || c == RECORD_DBC || c == RECORD_DATA || c == RECORD_END) {
+ /* Work around off-by-one bug in device firmware. This
+ * happens only on the last record, i.e. before RECORD_END */
+ if (devc->buf_len & 1)
+ devc->buf_len--;
+ /* Done with this set of samples */
+ send_data(sdi, devc->buf, devc->buf_len / 2);
+ devc->buf_len = 0;
+
+ /* Process this meta marker in the right state. */
+ devc->state = ST_GET_LOG_RECORD_META;
+ process_byte(sdi, c, handle_packets);
+ } else {
+ devc->buf[devc->buf_len++] = c;
+ if (devc->buf_len == SAMPLES_PER_PACKET * 2) {
+ send_data(sdi, devc->buf, devc->buf_len / 2);
+ devc->buf_len = 0;
+ }
+ }