xref: /btstack/port/mtk/docs/scripts/process_scan.py (revision 6ccd8248590f666db07dd7add13fecb4f5664fb5)
1#!/usr/bin/env python3
2
3import struct
4import math
5import sys, os
6import pickle
7
8devices   = dict()
9delays    = dict()
10scan_start_timestamp = 0
11scan_nr = -1
12
13def delta(s):
14    rs = list()
15    for i in range(len(s)-1):
16        rs.append(s[i+1] - s[i])
17    return rs
18
19def normalize(s):
20    return map(lambda x: (x - s[0]), s)
21
22def average(s):
23    if len(s) == 0: return 0
24    return sum(s) * 1.0 / len(s)
25
26def stder(s, mean):
27    if len(s) == 0: return 0
28    variance = map(lambda x: (x - mean)**2, s)
29    return math.sqrt(average(variance))
30
31
32def reset_timestamp(packet_type, packet, time_sec):
33    global scan_start_timestamp, scan_nr
34    if packet_type != 0x00 or packet[0] != 0x0C or packet[1] != 0x20:
35        return
36    if (int(packet[3])):
37        scan_start_timestamp = time_sec
38        scan_nr = scan_nr + 1
39        print("Scanning started at %u"%scan_start_timestamp)
40
41    else:
42        print("Scanning stopped")
43
44def read_scan(packet_type, packet, time_sec):
45    if packet_type != 0x01 or packet[0] != 0x3E or packet[2] != 0x02:
46        return
47
48    if packet[3] != 1:
49        print("More then one report")
50        return
51
52    (event_type, addr_type, addr, data_len) = struct.unpack('<BB6sB', packet[4:13])
53    if event_type == 0x04:
54        return
55
56    unpack_format = '<%usB' % data_len
57    (data, rssi) = struct.unpack(unpack_format,packet[13:])
58
59    bt_addr = bytearray(addr)
60    bt_addr_str = ''
61    for b in bt_addr:
62        bt_addr_str = '%02x:%s' % (b, bt_addr_str)
63
64    if scan_start_timestamp <= 0:
65        return
66
67    normalized_timestamp = time_sec - scan_start_timestamp
68    if not bt_addr_str in devices.keys():
69        print("new device at %u %u" % (time_sec, scan_start_timestamp))
70        devices[bt_addr_str] = list()
71        delays[bt_addr_str] = list()
72
73    devices[bt_addr_str].append(normalized_timestamp)
74    if (len(delays[bt_addr_str]) == 0 or len(delays[bt_addr_str]) < scan_nr):
75        delays[bt_addr_str].append(normalized_timestamp)
76
77    #print("%03u, %08u, %08u, 0x%02X, adv: %s"%(length, time_sec, time_usec, packet_type, bt_addr_str))
78    return
79
80def process_pklg(exp_name, sensor_name, scanning_type, pklg_file_name):
81    print("Opening %s" % pklg_file_name)
82    with open(pklg_file_name, "rb") as f:
83        while True:
84            try:
85                (length, time_sec, time_usec, packet_type) = struct.unpack('>IIIB',f.read(13))
86            except:
87                break
88            packet = bytearray(f.read(length - 9))
89            reset_timestamp(packet_type, packet, time_sec)
90            read_scan(packet_type, packet, time_sec)
91
92    f.close();
93
94    prefix = '../data/processed/'
95    for k in devices.keys():
96        data_file_name = ''
97        if k == '5c:f3:70:60:7b:87:': #BCM
98            data_file_name = prefix + exp_name+'_'+scanning_type +'_mac.data'
99        if k == '00:1a:7d:00:86:7c:': #neo
100            data_file_name = prefix + exp_name+'_'+scanning_type +'_'+sensor_name+'.data'
101
102        if k == '00:07:80:67:45:bc:': #xg 1
103            data_file_name = prefix + exp_name+'_'+scanning_type +'_'+sensor_name+'1.data'
104
105        if k == '00:07:80:67:46:00:': #xg 2
106            data_file_name = prefix + exp_name+'_'+scanning_type +'_'+sensor_name+'2.data'
107
108        if not data_file_name:
109            continue
110
111        pickle.dump(devices[k], open(data_file_name, 'wb'))
112        mes_index = 0
113        # take the last measurement
114        for i in range(len(devices[k])-1):
115            if devices[k][i] > devices[k][i+1]:
116                mes_index = i+1
117        pickle.dump(devices[k][mes_index:len(devices[k])], open(data_file_name, 'wb'))
118
119def init():
120    global devices, delays, scan_start_timestamp, scan_nr
121    devices   = dict()
122    delays    = dict()
123    scan_start_timestamp = 0
124    scan_nr = -1
125
126init()
127data_folder = "../data/processed"
128if not os.access(data_folder, os.F_OK):
129    os.mkdir(data_folder)
130
131prefix = '../data/pklg/'
132process_pklg('exp1','nio','continuous_mac', prefix+'BCM20702A0_nio_continuous_scanning.pklg')
133process_pklg('exp1','nio','continuous_rug', prefix+'RugGear_nio_continuous_scanning.pklg')
134
135init()
136process_pklg('exp1','nio','normal_rug', prefix+'RugGear_nio_normal_scanning.pklg')
137process_pklg('exp1','nio','normal_mac', prefix+'BCM20702A0_nio_normal_scanning.pklg')
138
139
140init()
141process_pklg('exp2','xg','continuous_mac', prefix+'BCM20702A0_xg_continuous_scanning.pklg')
142process_pklg('exp2','xg','continuous_rug', prefix+'RugGear_xg_continuous_scanning.pklg')
143
144init()
145process_pklg('exp2','xg','normal_rug', prefix+'RugGear_xg_normal_scanning.pklg')
146process_pklg('exp2','xg','normal_mac', prefix+'BCM20702A0_xg_normal_scanning.pklg')
147
148