CANBUS-RE-Tools/ChecksumTools/fuckbmw2uniqueCounter.py

55 lines
2.5 KiB
Python

import csv
failed_rows = []
unique_addresses = {}
with open('input.csv', 'r') as in_file, open('output.csv', 'w', newline='') as out_file, open('failedoutputs.csv', 'w', newline='') as fail_file:
csv_reader = csv.DictReader(in_file)
csv_writer = csv.writer(out_file)
fail_writer = csv.writer(fail_file)
csv_writer.writerow(['Time Stamp', 'ID', 'Extended', 'Dir', 'Bus', 'LEN', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8'])
fail_writer.writerow(['Time Stamp', 'ID', 'Extended', 'Dir', 'Bus', 'LEN', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8'])
for row in csv_reader:
d_values = [int(row[f"D{i}"], 16) for i in range(2, 9)]
checksum = sum(d_values) + int(row['ID'], 16)
checksum = (checksum & 0xFF) + (checksum >> 8)
d1 = int(row['D1'], 16)
if d1 <= checksum or (d1 > checksum and d1 - checksum == 256):
address = row['ID']
if address not in unique_addresses:
csv_writer.writerow([row['Time Stamp'], row['ID'], row['Extended'], row['Dir'], row['Bus'], row['LEN'], row['D1'], row['D2'], row['D3'], row['D4'], row['D5'], row['D6'], row['D7'], row['D8']])
unique_addresses[address] = [1, 0]
else:
unique_addresses[address][0] += 1
else:
failed_rows.append(row)
fail_writer.writerow([row['Time Stamp'], row['ID'], row['Extended'], row['Dir'], row['Bus'], row['LEN'], row['D1'], row['D2'], row['D3'], row['D4'], row['D5'], row['D6'], row['D7'], row['D8']])
address = row['ID']
if address not in unique_addresses:
unique_addresses[address] = [0, 1]
else:
unique_addresses[address][1] += 1
for row in failed_rows:
address = row['ID']
d1 = int(row['D1'], 16)
d8 = int(row['D8'], 16)
if address not in unique_addresses:
unique_addresses[address] = [0, 1, 0, 0] # Initialize with D1 and D8 matched counts set to 0
if is_d1_checksum:
unique_addresses[address][2] += 1
if is_d8_checksum:
unique_addresses[address][3] += 1
sorted_addresses = sorted(unique_addresses.items(), key=lambda x: x[1][0], reverse=True)
print("Address Successes Failures Total D1_Matched D8_Matched")
for address, counts in sorted_addresses:
total = counts[0] + counts[1]
if total > 0:
print(f"{address} {counts[0]} {counts[1]} {total} {counts[2]} {counts[3]}")