10cacd247SMilanka Ringwald#!/usr/bin/env python 20cacd247SMilanka Ringwald# BlueKitchen GmbH (c) 2014 30cacd247SMilanka Ringwald 40cacd247SMilanka Ringwald# primitive dump for PacketLogger format 50cacd247SMilanka Ringwald 60cacd247SMilanka Ringwald# APPLE PacketLogger 70cacd247SMilanka Ringwald# typedef struct { 80cacd247SMilanka Ringwald# uint32_t len; 90cacd247SMilanka Ringwald# uint32_t ts_sec; 100cacd247SMilanka Ringwald# uint32_t ts_usec; 110cacd247SMilanka Ringwald# uint8_t type; // 0xfc for note 120cacd247SMilanka Ringwald# } 130cacd247SMilanka Ringwald 140cacd247SMilanka Ringwaldimport re 150cacd247SMilanka Ringwaldimport sys 160cacd247SMilanka Ringwaldimport time 170cacd247SMilanka Ringwaldimport datetime 180cacd247SMilanka Ringwald 190cacd247SMilanka Ringwaldpacket_types = [ "CMD =>", "EVT <=", "ACL =>", "ACL <="] 200cacd247SMilanka Ringwald 210cacd247SMilanka Ringwalddef read_net_32(f): 220cacd247SMilanka Ringwald a = f.read(1) 230cacd247SMilanka Ringwald b = f.read(1) 240cacd247SMilanka Ringwald c = f.read(1) 250cacd247SMilanka Ringwald d = f.read(1) 260cacd247SMilanka Ringwald return ord(a) << 24 | ord(b) << 16 | ord(c) << 8 | ord(d) 270cacd247SMilanka Ringwald 280cacd247SMilanka Ringwalddef as_hex(data): 290cacd247SMilanka Ringwald str_list = [] 300cacd247SMilanka Ringwald for byte in data: 310cacd247SMilanka Ringwald str_list.append("{0:02x} ".format(ord(byte))) 320cacd247SMilanka Ringwald return ''.join(str_list) 330cacd247SMilanka Ringwald 340cacd247SMilanka Ringwaldif len(sys.argv) < 2: 350cacd247SMilanka Ringwald print 'Dump PacketLogger file' 360cacd247SMilanka Ringwald print 'Copyright 2014, BlueKitchen GmbH' 370cacd247SMilanka Ringwald print '' 380cacd247SMilanka Ringwald print 'Usage: ', sys.argv[0], 'hci_dump.pklg test_name' 390cacd247SMilanka Ringwald exit(0) 400cacd247SMilanka Ringwald 410cacd247SMilanka Ringwaldinfile = sys.argv[1] 420cacd247SMilanka Ringwaldtest_name = sys.argv[2] 430cacd247SMilanka Ringwaldseparator = "" 440cacd247SMilanka Ringwaldspaces = " " 450cacd247SMilanka Ringwaldprint "const char * "+test_name+"[] = {" 460cacd247SMilanka Ringwald 47*18602070SMilanka Ringwald 480cacd247SMilanka Ringwaldwith open (infile, 'rb') as fin: 490cacd247SMilanka Ringwald try: 500cacd247SMilanka Ringwald while True: 510cacd247SMilanka Ringwald len = read_net_32(fin) 520cacd247SMilanka Ringwald ts_sec = read_net_32(fin) 530cacd247SMilanka Ringwald ts_usec = read_net_32(fin) 540cacd247SMilanka Ringwald type = ord(fin.read(1)) 550cacd247SMilanka Ringwald packet_len = len - 9; 560cacd247SMilanka Ringwald packet = fin.read(packet_len) 570cacd247SMilanka Ringwald time = "[%s.%03u]" % (datetime.datetime.fromtimestamp(ts_sec).strftime("%Y-%m-%d %H:%M:%S"), ts_usec / 1000) 580cacd247SMilanka Ringwald if type == 0xfc: 59*18602070SMilanka Ringwald packet = packet.replace("\n","\\n") 60*18602070SMilanka Ringwald packet = packet.replace("\r","\\r") 61*18602070SMilanka Ringwald packet = packet.replace("\"","\\\"") 620cacd247SMilanka Ringwald 630cacd247SMilanka Ringwald parts = re.match('HFP_RX(.*)',packet) 640cacd247SMilanka Ringwald if not parts: 65*18602070SMilanka Ringwald parts = re.match('HFP_TX(.*)',packet) 660cacd247SMilanka Ringwald 670cacd247SMilanka Ringwald cmd = 0 680cacd247SMilanka Ringwald if parts: 69*18602070SMilanka Ringwald hfp_cmds = parts.groups()[0].split('\\r\\n') 70*18602070SMilanka Ringwald for cmd in hfp_cmds: 71*18602070SMilanka Ringwald cmd = cmd.strip() 72*18602070SMilanka Ringwald if cmd <> "": 730cacd247SMilanka Ringwald print separator+spaces+"\""+cmd+"\"", 740cacd247SMilanka Ringwald separator = ",\n" 750cacd247SMilanka Ringwald 76*18602070SMilanka Ringwald 770cacd247SMilanka Ringwald except TypeError: 780cacd247SMilanka Ringwald print "\n};\n" 790cacd247SMilanka Ringwald exit(0) 800cacd247SMilanka Ringwald 810cacd247SMilanka Ringwaldprint "\n};\n" 820cacd247SMilanka Ringwald 83