You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.5 KiB
51 lines
1.5 KiB
#!/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)
|
|
|