#!/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)