ardupilot/Tools/scripts/rcda_decode.py

52 lines
1.5 KiB
Python
Executable File

#!/usr/bin/env python
'''
decode RCDA messages from a log and optionally play back to a serial port. The RCDA message is
captures RC input bytes when RC_OPTIONS=16 is set
'''
import struct
from argparse import ArgumentParser
parser = ArgumentParser(description=__doc__)
parser.add_argument("--condition", default=None, help="select packets by condition")
parser.add_argument("--baudrate", type=int, default=115200, help="baudrate")
parser.add_argument("--port", type=str, default=None, help="port")
parser.add_argument("--delay-mul", type=float, default=1.0, help="delay multiplier")
parser.add_argument("log", metavar="LOG")
import time
import serial
args = parser.parse_args()
from pymavlink import mavutil
print("Processing log %s" % args.log)
mlog = mavutil.mavlink_connection(args.log)
if args.port:
port = serial.Serial(args.port, args.baudrate, timeout=1.0)
tlast = -1
counter = 0
while True:
msg = mlog.recv_match(type=['RCDA'], condition=args.condition)
if msg is None:
mlog.rewind()
tlast = -1
continue
tnow = msg.TimeUS
if tlast == -1:
tlast = tnow
buf = struct.pack("<IIIIIIIIII",
msg.U0, msg.U1, msg.U2, msg.U3, msg.U4,
msg.U5, msg.U6, msg.U7, msg.U8, msg.U9)[0:msg.Len]
ibuf = [ ord(b) for b in buf ]
dt = tnow - tlast
tlast = tnow
print(len(ibuf), ibuf, dt)
if args.port:
time.sleep(dt*1.0e-6*args.delay_mul)
port.write(buf)