70 lines
1.8 KiB
Python
70 lines
1.8 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
'''
|
||
|
split log by system ID
|
||
|
'''
|
||
|
from __future__ import print_function
|
||
|
|
||
|
import os
|
||
|
import struct
|
||
|
|
||
|
from argparse import ArgumentParser
|
||
|
parser = ArgumentParser(description=__doc__)
|
||
|
|
||
|
parser.add_argument("--no-timestamps", dest="notimestamps", action='store_true', help="Log doesn't have timestamps")
|
||
|
parser.add_argument("--condition", default=None, help="select packets by condition")
|
||
|
parser.add_argument("--types", default=None, help="list of types to include")
|
||
|
parser.add_argument("logs", metavar="LOG", nargs="+")
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
from pymavlink import mavutil
|
||
|
|
||
|
def process(filename):
|
||
|
'''process one logfile'''
|
||
|
print("Processing %s" % filename)
|
||
|
|
||
|
types = args.types
|
||
|
if types is not None:
|
||
|
types = types.split(',')
|
||
|
|
||
|
mlog = mavutil.mavlink_connection(filename, notimestamps=args.notimestamps)
|
||
|
|
||
|
base, ext = os.path.splitext(filename)
|
||
|
output = None
|
||
|
count = 1
|
||
|
dirname = os.path.dirname(filename)
|
||
|
extension = "tlog"
|
||
|
|
||
|
file_header = bytearray()
|
||
|
|
||
|
messages = []
|
||
|
|
||
|
# dictionary of outputs by sysid
|
||
|
output = {}
|
||
|
|
||
|
while True:
|
||
|
m = mlog.recv_match(type=types)
|
||
|
if m is None:
|
||
|
break
|
||
|
|
||
|
if args.condition and not mavutil.evaluate_condition(args.condition, mlog.messages):
|
||
|
continue
|
||
|
|
||
|
if m.get_type() == 'BAD_DATA':
|
||
|
continue
|
||
|
|
||
|
sysid = m.get_srcSystem()
|
||
|
if not sysid in output:
|
||
|
fname = "%s-%u.%s" % (base, sysid, extension)
|
||
|
print("Creating %s" % fname)
|
||
|
output[sysid] = open(fname, mode='wb')
|
||
|
|
||
|
if output[sysid]:
|
||
|
timestamp = getattr(m, '_timestamp', None)
|
||
|
output[sysid].write(struct.pack('>Q', int(timestamp*1.0e6)))
|
||
|
output[sysid].write(m.get_msgbuf())
|
||
|
|
||
|
for filename in args.logs:
|
||
|
process(filename)
|
||
|
|