1 changed files with 75 additions and 0 deletions
@ -0,0 +1,75 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
''' |
||||||
|
unpack a param.pck file from @PARAM/param.pck via mavlink FTP |
||||||
|
''' |
||||||
|
|
||||||
|
import struct, sys |
||||||
|
|
||||||
|
from argparse import ArgumentParser |
||||||
|
parser = ArgumentParser(description=__doc__) |
||||||
|
parser.add_argument("file", metavar="LOG") |
||||||
|
|
||||||
|
args = parser.parse_args() |
||||||
|
|
||||||
|
data = open(args.file,'rb').read() |
||||||
|
last_name = "" |
||||||
|
|
||||||
|
magic = 0x671b |
||||||
|
|
||||||
|
# header of 6 bytes |
||||||
|
magic2,num_params,total_params = struct.unpack("<HHH", data[0:6]) |
||||||
|
if magic != magic2: |
||||||
|
print("Bad magic 0x%x expected 0x%x" % (magic2, magic)) |
||||||
|
sys.exit(1) |
||||||
|
|
||||||
|
data = data[6:] |
||||||
|
|
||||||
|
# mapping of data type to type length and format |
||||||
|
data_types = { |
||||||
|
1: (1, 'b'), |
||||||
|
2: (2, 'h'), |
||||||
|
3: (4, 'i'), |
||||||
|
4: (4, 'f'), |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
# we discard leading pad bytes (zero) on all params |
||||||
|
# pad bytes are inserted to ensure that a value doesn't |
||||||
|
# cross a block boundary |
||||||
|
pad_byte = 0 |
||||||
|
if sys.version_info.major < 3: |
||||||
|
pad_byte = chr(0) |
||||||
|
|
||||||
|
count = 0 |
||||||
|
|
||||||
|
while True: |
||||||
|
# skip pad bytes |
||||||
|
while len(data) > 0 and data[0] == pad_byte: |
||||||
|
data = data[1:] |
||||||
|
|
||||||
|
if len(data) == 0: |
||||||
|
break |
||||||
|
|
||||||
|
ptype, plen = struct.unpack("<BB", data[0:2]) |
||||||
|
flags = (ptype>>4) & 0x0F |
||||||
|
ptype &= 0x0F |
||||||
|
|
||||||
|
if not ptype in data_types: |
||||||
|
raise Exception("bad type 0x%x" % ptype) |
||||||
|
|
||||||
|
(type_len, type_format) = data_types[ptype] |
||||||
|
|
||||||
|
name_len = ((plen>>4) & 0x0F) + 1 |
||||||
|
common_len = (plen & 0x0F) |
||||||
|
name = last_name[0:common_len] + data[2:2+name_len].decode('utf-8') |
||||||
|
vdata = data[2+name_len:2+name_len+type_len] |
||||||
|
last_name = name |
||||||
|
data = data[2+name_len+type_len:] |
||||||
|
v, = struct.unpack("<" + type_format, vdata) |
||||||
|
count += 1 |
||||||
|
print("%-16s %f" % (name, float(v))) |
||||||
|
|
||||||
|
if count != num_params or count > total_params: |
||||||
|
print("Error: Got %u params expected %u/%u" % (count, num_params, total_params)) |
||||||
|
sys.exit(1) |
||||||
|
sys.exit(0) |
Loading…
Reference in new issue