brukeropusreader/brukeropusreader/block_parser.py

55 lines
1.6 KiB
Python

from brukeropusreader.constants import (
UNSIGNED_SHORT,
PARAM_TYPES,
INT,
DOUBLE,
NULL_BYTE,
ENCODING_LATIN,
ENCODING_UTF,
NULL_STR)
from brukeropusreader.opus_reader import read_chunk
from struct import unpack, error
import numpy as np
def parse_param(data: bytes, block_meta):
cursor = 0
chunk = read_chunk(data, block_meta)
params = {}
while True:
param_name = chunk[cursor : cursor + 3].decode(ENCODING_UTF)
if param_name == "END":
break
type_index = unpack(UNSIGNED_SHORT, chunk[cursor + 4 : cursor + 6])[0]
param_type = PARAM_TYPES[type_index]
param_size = unpack(UNSIGNED_SHORT, chunk[cursor + 6 : cursor + 8])[0]
param_bytes = chunk[cursor + 8 : cursor + 8 + 2 * param_size]
if param_type == "int":
try:
param_val = unpack(INT, param_bytes)[0]
except error:
return params
elif param_type == "float":
param_val = unpack(DOUBLE, param_bytes)[0]
elif param_type == "str":
p_end = param_bytes.find(NULL_BYTE)
param_val = param_bytes[:p_end].decode(ENCODING_LATIN)
else:
param_val = param_bytes
params[param_name] = param_val
cursor = cursor + 8 + 2 * param_size
return params
def parse_text(data: bytes, block_meta):
chunk = read_chunk(data, block_meta)
return chunk.decode(ENCODING_LATIN).strip(NULL_STR)
def parse_series(data: bytes, block_meta):
chunk = read_chunk(data, block_meta)
fmt = f"<{block_meta.chunk_size}f"
values = unpack(fmt, chunk)
return np.array(values)