Skip to content

Instantly share code, notes, and snippets.

@kevinmehall
Created September 10, 2015 18:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kevinmehall/976d60d9177722aa6bd1 to your computer and use it in GitHub Desktop.
Save kevinmehall/976d60d9177722aa6bd1 to your computer and use it in GitHub Desktop.
# Decode UAVCAN transfers from a CAN dump CSV exported from Saleae Logic
import argparse
import csv
import uavcan
from uavcan.transport import TransferManager, Frame, Transfer
def parsecsv(f):
manager = TransferManager()
reader = csv.reader(f, delimiter=',')
for t, seq, tp, id, ctl, data, crc, ack in reader:
if "Time" in t: continue # skip header
id = int(id, 16)
data = [int(x, 16) for x in data.split(' ')]
frame = Frame(id, data)
transfer_frames = manager.receive_frame(frame)
if transfer_frames:
transfer = Transfer()
transfer.from_frames(transfer_frames)
yield t, transfer
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('csvfile', help="CSV file exported from the Saleae CAN decoder")
parser.add_argument('-d', '--dsdl', action='append', help="Path to a DSDL library")
args = parser.parse_args()
uavcan.load_dsdl(args.dsdl)
with open(args.csvfile, 'rb') as csvfile:
for time, transfer in parsecsv(csvfile):
print "{0} {1!r}\n".format(time, transfer)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment