3 unpack a param.pck file from @PARAM/param.pck via mavlink FTP
8 from argparse
import ArgumentParser
9 parser
= ArgumentParser(description
=__doc__
)
10 parser
.add_argument("file", metavar
="LOG")
12 args
= parser
.parse_args()
14 data
= open(args
.file,'rb').read()
20 magic2
,num_params
,total_params
= struct
.unpack("<HHH", data
[0:6])
22 print("Bad magic 0x%x expected 0x%x" % (magic2
, magic
))
27 # mapping of data type to type length and format
36 # we discard leading pad bytes (zero) on all params
37 # pad bytes are inserted to ensure that a value doesn't
38 # cross a block boundary
40 if sys
.version_info
.major
< 3:
47 while len(data
) > 0 and data
[0] == pad_byte
:
53 ptype
, plen
= struct
.unpack("<BB", data
[0:2])
54 flags
= (ptype
>>4) & 0x0F
57 if ptype
not in data_types
:
58 raise Exception("bad type 0x%x" % ptype
)
60 (type_len
, type_format
) = data_types
[ptype
]
62 name_len
= ((plen
>>4) & 0x0F) + 1
63 common_len
= (plen
& 0x0F)
64 name
= last_name
[0:common_len
] + data
[2:2+name_len
].decode('utf-8')
65 vdata
= data
[2+name_len
:2+name_len
+type_len
]
67 data
= data
[2+name_len
+type_len
:]
68 v
, = struct
.unpack("<" + type_format
, vdata
)
70 print("%-16s %f" % (name
, float(v
)))
72 if count
!= num_params
or count
> total_params
:
73 print("Error: Got %u params expected %u/%u" % (count
, num_params
, total_params
))