#!/usr/bin/env python # # fuconverter.py # author: pj@discotd5.com # converts Nanocom One .fu1 fuel data files to .csv with all data intact. # """ usage: fuconverter.py /path/to/yourfile.fu1 saves csv file to current working directory """ from __future__ import print_function import sys import os from struct import unpack_from import csv def decimal_shift(data, factor): return (float(data) / factor) def k_to_c(data): return(float(data - 2732) / 10) path = sys.argv[1] filename = os.path.split(path)[-1] csvname = os.path.splitext(filename)[0] + ".csv" fuformat = '>HBHHHHHHHHHHHHHHHHHhhhhhhHHHHHHx' fuheader = ['t', 'RPM', 'Road Speed', 'ECT', 'ECT mV', 'IAT', 'IAT mV', 'AAT', 'AAT mV', 'Fuel Temp', 'Fuel Temp mV', 'TPS1 mV', 'TPS2 mV', 'TPS3 mV', 'Throttle %', 'TPS Supply mV', 'MAP kpa', 'MAP kpa raw', 'MAF Kg/hr', 'MAF mV', 'RPM-Idle', 'Balance 1', 'Balance 2', 'Balance 3', 'Balance 4', 'Balance 5', 'AAP kpa', 'AAP kpa raw','EGR Inlet %','WGM% 1', 'WGM% 2', 'BATV1'] try: with open(path, 'rb') as file: fdata = file.read()[2:-2] except OSError: print("Specified file cannot be opened.") raise OSError else: data = list() for i in range(0, len(fdata)-1, 64): data.append(fdata[i: i+62]) fdata = list() for counter, record in enumerate(data): updata = list(unpack_from(fuformat, record)) for offset in range(2, 10, 2): updata[offset] = k_to_c(updata[offset]) for offset in [13, 15, 16, 25, 26, 27, 28, 29]: updata[offset] = decimal_shift(updata[offset], 100) updata[17] = decimal_shift(updata[17], 10) updata.insert(0, counter) fdata.append(updata) try: with open(csvname, 'w') as c: writer = csv.writer(c) writer.writerow(fuheader) writer.writerows(fdata) except OSError: print("Output file could not be written") raise OSError