Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add module to extract message values for use in scripting #106

Merged
merged 2 commits into from
Nov 19, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions pyulog/extract_message.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
"""
Extract values from a ULog file message to use in scripting
"""

import numpy as np
from .core import ULog

def extract_message(ulog_file_name: str, message: str, time_s: "int | None" = None, time_e: "int | None" = None,
disable_str_exceptions=False) -> list[dict]:
"""
Extract values from a ULog file

:param ulog_file_name: (str) The ULog filename to open and read
:param message: (str) A ULog message to return values from
:param time_s: (int) Offset time for conversion in seconds
:param time_e: (int) Limit until time for conversion in seconds

:return: (list[dict]) A list of each record from the ULog as key-value pairs
"""

if not type(message) == str:
raise AttributeError("Must provide a message to pull from ULog file")

msg_filter = message.split(',') if message else None

ulog = ULog(ulog_file_name, msg_filter, disable_str_exceptions)
data = ulog.data_list

if not data:
raise AttributeError("Provided message is not in the ULog file")

values = []
for record in data:
# use same field order as in the log, except for the timestamp
data_keys = [f.field_name for f in record.field_data]
data_keys.remove('timestamp')
data_keys.insert(0, 'timestamp') # we want timestamp at first position

#get the index for row where timestamp exceeds or equals the required value
time_s_i = np.where(record.data['timestamp'] >= time_s * 1e6)[0][0] \
if time_s else 0
#get the index for row upto the timestamp of the required value
time_e_i = np.where(record.data['timestamp'] >= time_e * 1e6)[0][0] \
if time_e else len(record.data['timestamp'])

# write the data
for i in range(time_s_i, time_e_i):
row = {}
for k in range(len(data_keys)):
row[data_keys[k]] = record.data[data_keys[k]][i]
values.append(row)

return values
Loading