+ }
+
+ if (devc->buffer_len == BUFFER_SIZE && devc->buffer[0] == 0x7f
+ && devc->buffer[BUFFER_SIZE - 1] == 0x00) {
+ process_measurement(sdi);
+ devc->buffer_len = 0;
+ }
+}
+
+static void process_usage_byte(const struct sr_dev_inst *sdi, uint8_t c)
+{
+ struct dev_context *devc;
+
+ devc = sdi->priv;
+
+ if (devc->buffer_len < MEM_USAGE_BUFFER_SIZE) {
+ devc->buffer[devc->buffer_len++] = c;
+ } else {
+ memmove(devc->buffer, devc->buffer + 1, MEM_USAGE_BUFFER_SIZE - 1);
+ devc->buffer[MEM_USAGE_BUFFER_SIZE - 1] = c;
+ }
+
+ if (devc->buffer_len == MEM_USAGE_BUFFER_SIZE && devc->buffer[0] == 0xd1
+ && devc->buffer[1] == 0x05 && devc->buffer[2] == 0x00
+ && devc->buffer[3] == 0x01 && devc->buffer[4] == 0xd2
+ && devc->buffer[MEM_USAGE_BUFFER_SIZE - 1] == 0x20) {
+ devc->memory_block_usage = devc->buffer[5] << 8 | devc->buffer[6];
+ devc->memory_last_block_usage = devc->buffer[7];
+ sr_warn("Memory usage: %d blocks of 256 bytes, 1 block of %d bytes",
+ devc->memory_block_usage - 1, devc->memory_last_block_usage);
+ devc->buffer_len = 0;
+ devc->buffer_skip = 1;
+ devc->memory_state = MEM_STATE_REQUEST_MEMORY_BLOCK;
+ devc->memory_block_cursor = 0;
+ devc->memory_block_counter = 0;
+ }
+}
+
+static void process_memory_byte(const struct sr_dev_inst *sdi, uint8_t c)
+{
+ struct dev_context *devc;
+
+ devc = sdi->priv;
+
+ if (devc->buffer_len < MEM_DATA_BUFFER_SIZE) {
+ devc->buffer[devc->buffer_len++] = c;
+ } else {
+ memmove(devc->buffer, devc->buffer + 1, MEM_DATA_BUFFER_SIZE - 1);
+ devc->buffer[MEM_DATA_BUFFER_SIZE - 1] = c;
+ }
+
+ if (devc->buffer_skip == 0 \
+ && (devc->buffer[devc->buffer_len-2] & 0x7f) == 0x7f
+ && (devc->buffer[devc->buffer_len-1] & 0xf7) == 0xf7) {
+ /* Recording session header bytes found, load next 7 bytes. */
+ devc->buffer_skip = MEM_DATA_BUFFER_SIZE - 2;
+ }
+
+ if (devc->buffer_skip == 0 && devc->buffer_len == MEM_DATA_BUFFER_SIZE
+ && (devc->buffer[0] & 0x7f) == 0x7f && (devc->buffer[1] & 0xf7) == 0xf7
+ && devc->buffer[2] == 0x01 && devc->buffer[3] == 0x00) {
+ /* Print information about recording. */
+ sr_err("Recording dB(%X) %02x/%02x/%02x %02x:%02x:%02x ",
+ devc->buffer[4], devc->buffer[5], devc->buffer[6], devc->buffer[7],
+ devc->buffer[8] & 0x3f, devc->buffer[9], devc->buffer[10]);
+ /* Set dBA/dBC flag for recording. */
+ if (devc->buffer[4] == 0x0c) {
+ devc->cur_mqflags |= SR_MQFLAG_SPL_FREQ_WEIGHT_C;
+ devc->cur_mqflags &= ~SR_MQFLAG_SPL_FREQ_WEIGHT_A;
+ } else {
+ devc->cur_mqflags |= SR_MQFLAG_SPL_FREQ_WEIGHT_A;
+ devc->cur_mqflags &= ~SR_MQFLAG_SPL_FREQ_WEIGHT_C;