[{"data":1,"prerenderedAt":132},["ShallowReactive",2],{"docs-nav":3,"doc:supported-ecu-formats":56},[4,12,30,42,50],{"title":5,"items":6},"Getting Started",[7,10],{"path":8,"title":9},"\u002Fdocs\u002Finstallation","Installation",{"path":11,"title":5},"\u002Fdocs\u002Fgetting-started",{"title":13,"items":14},"User Documentation",[15,18,21,24,27],{"path":16,"title":17},"\u002Fdocs\u002Fuser-guide","User Guide",{"path":19,"title":20},"\u002Fdocs\u002Fsupported-ecu-formats","Supported ECU Formats",{"path":22,"title":23},"\u002Fdocs\u002Funit-conversion","Unit Conversion",{"path":25,"title":26},"\u002Fdocs\u002Ffield-normalization","Field Normalization",{"path":28,"title":29},"\u002Fdocs\u002Ftuning-table-generators","Tuning Table Generators",{"title":31,"items":32},"Support",[33,36,39],{"path":34,"title":35},"\u002Fdocs\u002Ftroubleshooting","Troubleshooting",{"path":37,"title":38},"\u002Fdocs\u002Ffaq","Frequently Asked Questions",{"path":40,"title":41},"\u002Fdocs\u002Fprivacy","Privacy & Analytics",{"title":43,"items":44},"Development",[45,47],{"path":46,"title":43},"\u002Fdocs\u002Fdevelopment",{"path":48,"title":49},"\u002Fdocs\u002Fcontributing","Contributing",{"title":51,"items":52},"Legal",[53],{"path":54,"title":55},"\u002Fdocs\u002Flegal","Legal Notices",{"slug":57,"name":58,"title":20,"html":59,"toc":60,"editUrl":130,"sourceUrl":131},"supported-ecu-formats","Supported-ECU-Formats","\u003Cp>UltraLog supports multiple ECU systems. This page details each format&#39;s capabilities and requirements.\u003C\u002Fp>\n\u003Ch2 id=\"quick-compatibility-reference\">Quick Compatibility Reference\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>ECU System\u003C\u002Fth>\n\u003Cth>Status\u003C\u002Fth>\n\u003Cth>File Type\u003C\u002Fth>\n\u003Cth>Export Required\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Haltech\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (from NSP)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>ECUMaster EMU Pro\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (from EMU Pro)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>RomRaider\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (from RomRaider Logger)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Speeduino\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.mlg\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>No (native format)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>rusEFI\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.mlg\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>No (native format)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>AiM\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.xrk\u003C\u002Fcode>, \u003Ccode>.drk\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>No (native format)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Link ECU\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.llg\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>No (native format)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Emerald\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.lg1\u003C\u002Fcode>, \u003Ccode>.lg2\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>No (native format)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>MegaSquirt\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (from TunerStudio)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>TunerStudio MSL\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.msl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (TunerStudio legacy ASCII, or RealDash)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Woolich Racing Tuned\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (from WRT software)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>RaceChrono\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode> (v3)\u003C\u002Ftd>\n\u003Ctd>Yes (CSV v3 export)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>MHD Tuning\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (from MHD Tuning app)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>BlueDriver OBD-II\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (from BlueDriver app)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Motorsport Electronics\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (from ME Tuner software)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>DynamicEFI\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (from EBL WhatsUp software)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Locomotive\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Yes (from datalogger export)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Torque Pro\u003C\u002Ftd>\n\u003Ctd>Full Support\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.csv\u003C\u002Fcode> (trackLog)\u003C\u002Ftd>\n\u003Ctd>No (the app writes it while logging)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>AEM\u003C\u002Ftd>\n\u003Ctd>Coming Soon\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>MaxxECU\u003C\u002Ftd>\n\u003Ctd>Coming Soon\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>MoTeC\u003C\u002Ftd>\n\u003Ctd>Coming Soon\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2 id=\"haltech\">Haltech\u003C\u002Fh2>\n\u003Ch3 id=\"overview\">Overview\u003C\u002Fh3>\n\u003Cp>Full support for Haltech ECU log files exported from NSP (Nexus Software Platform).\u003C\u002Fp>\n\u003Ch3 id=\"supported-file-format\">Supported File Format\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Type:\u003C\u002Fstrong> CSV text file\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Extension:\u003C\u002Fstrong> \u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Source:\u003C\u002Fstrong> Exported from Haltech NSP software\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Identifier:\u003C\u002Fstrong> File begins with \u003Ccode>%DataLog%\u003C\u002Fcode> header\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"how-to-export-from-nsp\">How to Export from NSP\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Open your datalog in Haltech NSP\u003C\u002Fli>\n\u003Cli>Go to \u003Cstrong>File → Export → CSV\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>Select all channels you want to include\u003C\u002Fli>\n\u003Cli>Choose save location and filename\u003C\u002Fli>\n\u003Cli>Click Export\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"supported-channel-types\">Supported Channel Types\u003C\u002Fh3>\n\u003Cp>UltraLog supports 50+ Haltech channel types with automatic unit conversion:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Engine Parameters\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Engine Speed (RPM)\u003C\u002Fli>\n\u003Cli>Manifold Pressure (MAP)\u003C\u002Fli>\n\u003Cli>Throttle Position (TPS)\u003C\u002Fli>\n\u003Cli>Engine Load\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Fuel System\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Air\u002FFuel Ratio (AFR)\u003C\u002Fli>\n\u003Cli>Lambda\u003C\u002Fli>\n\u003Cli>Fuel Pressure\u003C\u002Fli>\n\u003Cli>Injector Duty Cycle\u003C\u002Fli>\n\u003Cli>Fuel Trim (Short-term, Long-term)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Ignition System\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ignition Timing\u003C\u002Fli>\n\u003Cli>Knock Levels\u003C\u002Fli>\n\u003Cli>Dwell Time\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Temperatures\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Coolant Temperature\u003C\u002Fli>\n\u003Cli>Intake Air Temperature\u003C\u002Fli>\n\u003Cli>Oil Temperature\u003C\u002Fli>\n\u003Cli>Exhaust Gas Temperature (EGT)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Pressures\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Boost Pressure\u003C\u002Fli>\n\u003Cli>Oil Pressure\u003C\u002Fli>\n\u003Cli>Fuel Pressure\u003C\u002Fli>\n\u003Cli>Barometric Pressure\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Vehicle Data\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Vehicle Speed\u003C\u002Fli>\n\u003Cli>Gear Position\u003C\u002Fli>\n\u003Cli>Battery Voltage\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>And many more...\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch3 id=\"unit-handling\">Unit Handling\u003C\u002Fh3>\n\u003Cp>Haltech logs store data in specific units based on the CAN protocol. UltraLog:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Automatically detects the channel type\u003C\u002Fli>\n\u003Cli>Applies appropriate conversions\u003C\u002Fli>\n\u003Cli>Displays in your preferred units via Unit Preferences\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"minmax-values\">Min\u002FMax Values\u003C\u002Fh3>\n\u003Cp>Haltech logs include min\u002Fmax metadata for each channel, which UltraLog uses for the legend display.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"ecumaster-emu-pro\">ECUMaster EMU Pro\u003C\u002Fh2>\n\u003Ch3 id=\"overview-1\">Overview\u003C\u002Fh3>\n\u003Cp>Full support for ECUMaster EMU Pro log files exported as CSV.\u003C\u002Fp>\n\u003Ch3 id=\"supported-file-format-1\">Supported File Format\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Type:\u003C\u002Fstrong> CSV text file (semicolon or tab-delimited)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Extension:\u003C\u002Fstrong> \u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Source:\u003C\u002Fstrong> Exported from EMU Pro software\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Note:\u003C\u002Fstrong> Native \u003Ccode>.emuprolog\u003C\u002Fcode> binary format is NOT supported\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"how-to-export-from-emu-pro\">How to Export from EMU Pro\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Open your log in EMU Pro software\u003C\u002Fli>\n\u003Cli>Go to \u003Cstrong>File → Export → CSV\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>Select channels to export\u003C\u002Fli>\n\u003Cli>Choose delimiter (semicolon or tab both work)\u003C\u002Fli>\n\u003Cli>Save the file\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"channel-path-structure\">Channel Path Structure\u003C\u002Fh3>\n\u003Cp>ECUMaster uses hierarchical channel paths:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>engine\u002Frpm\nengine\u002Fmap\nengine\u002Fcoolant_temp\nfuel\u002Flambda\nfuel\u002Finjector_pw\nignition\u002Ftiming\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>UltraLog parses these paths and can normalize them to standard names.\u003C\u002Fp>\n\u003Ch3 id=\"automatic-unit-inference\">Automatic Unit Inference\u003C\u002Fh3>\n\u003Cp>UltraLog infers units from channel naming patterns:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Pattern\u003C\u002Fth>\n\u003Cth>Inferred Unit\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>*temp*\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>°C\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>*rpm*\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>RPM\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>*map*\u003C\u002Fcode>, \u003Ccode>*press*\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>kPa\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>*lambda*\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Lambda\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>*percent*\u003C\u002Fcode>, \u003Ccode>*duty*\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>%\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch3 id=\"supported-channels\">Supported Channels\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Engine\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>RPM\u003C\u002Fli>\n\u003Cli>MAP\u003C\u002Fli>\n\u003Cli>TPS\u003C\u002Fli>\n\u003Cli>Load\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Fuel\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Lambda\u003C\u002Fli>\n\u003Cli>AFR\u003C\u002Fli>\n\u003Cli>Injector Pulse Width\u003C\u002Fli>\n\u003Cli>Fuel Pressure\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Ignition\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Timing\u003C\u002Fli>\n\u003Cli>Dwell\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Temperatures\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Coolant\u003C\u002Fli>\n\u003Cli>Intake Air\u003C\u002Fli>\n\u003Cli>Oil\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>And more depending on your EMU Pro configuration\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch3 id=\"limitations\">Limitations\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Native \u003Ccode>.emuprolog\u003C\u002Fcode> binary format is not currently supported\u003C\u002Fli>\n\u003Cli>Always export to CSV from EMU Pro software\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"romraider\">RomRaider\u003C\u002Fh2>\n\u003Ch3 id=\"overview-2\">Overview\u003C\u002Fh3>\n\u003Cp>Full support for RomRaider ECU log files. RomRaider is an open-source tuning suite primarily used for Subaru ECUs, providing comprehensive logging capabilities for OEM and modified ECU parameters.\u003C\u002Fp>\n\u003Ch3 id=\"supported-file-format-2\">Supported File Format\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Type:\u003C\u002Fstrong> CSV text file (comma-delimited)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Extension:\u003C\u002Fstrong> \u003Ccode>.csv\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Source:\u003C\u002Fstrong> Exported from RomRaider Logger\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Identifier:\u003C\u002Fstrong> File begins with \u003Ccode>Time\u003C\u002Fcode> column header\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"how-to-export-from-romraider\">How to Export from RomRaider\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Open RomRaider Logger\u003C\u002Fli>\n\u003Cli>Start logging your parameters\u003C\u002Fli>\n\u003Cli>When complete, go to \u003Cstrong>File → Save Log\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>Choose CSV format and save location\u003C\u002Fli>\n\u003Cli>The file is ready to load in UltraLog\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"csv-format-details\">CSV Format Details\u003C\u002Fh3>\n\u003Cp>RomRaider logs use a straightforward CSV format:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-csv\">Time (msec),Engine Speed (rpm),Engine Load (%),A\u002FF Correction #1 (%)\n0,850,15.2,1.5\n20,855,15.4,1.6\n40,860,15.3,1.5\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Key characteristics:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>First column is always timestamp in milliseconds\u003C\u002Fli>\n\u003Cli>Column headers include units in parentheses\u003C\u002Fli>\n\u003Cli>Comma-separated values\u003C\u002Fli>\n\u003Cli>Timestamps are converted to relative seconds automatically\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"automatic-unit-extraction\">Automatic Unit Extraction\u003C\u002Fh3>\n\u003Cp>UltraLog automatically extracts units from column headers:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Header Example\u003C\u002Fth>\n\u003Cth>Extracted Name\u003C\u002Fth>\n\u003Cth>Extracted Unit\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>Engine Speed (rpm)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Engine Speed\u003C\u002Ftd>\n\u003Ctd>rpm\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>A\u002FF Correction #1 (%)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A\u002FF Correction #1\u003C\u002Ftd>\n\u003Ctd>%\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Manifold Relative Pressure (psi)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Manifold Relative Pressure\u003C\u002Ftd>\n\u003Ctd>psi\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Coolant Temperature (C)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Coolant Temperature\u003C\u002Ftd>\n\u003Ctd>C\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>For columns without units in parentheses, UltraLog infers units from common patterns.\u003C\u002Fp>\n\u003Ch3 id=\"supported-channels-1\">Supported Channels\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Engine Parameters\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Engine Speed (RPM)\u003C\u002Fli>\n\u003Cli>Engine Load\u003C\u002Fli>\n\u003Cli>Manifold Absolute\u002FRelative Pressure\u003C\u002Fli>\n\u003Cli>Throttle Position\u003C\u002Fli>\n\u003Cli>Mass Airflow\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Fuel System\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>A\u002FF Correction #1 and #2\u003C\u002Fli>\n\u003Cli>A\u002FF Learning #1 and #2\u003C\u002Fli>\n\u003Cli>A\u002FF Sensor readings\u003C\u002Fli>\n\u003Cli>Fuel Injector timing\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Ignition System\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ignition Timing\u003C\u002Fli>\n\u003Cli>Knock Correction\u003C\u002Fli>\n\u003Cli>Fine Knock Learning\u003C\u002Fli>\n\u003Cli>Feedback Knock Correction\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Temperatures\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Coolant Temperature\u003C\u002Fli>\n\u003Cli>Intake Air Temperature\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Subaru-Specific\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>IAM (Ignition Advance Multiplier)\u003C\u002Fli>\n\u003Cli>DAM (Dynamic Advance Multiplier)\u003C\u002Fli>\n\u003Cli>Fine Learning tables\u003C\u002Fli>\n\u003Cli>Various OEM diagnostic parameters\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"timestamp-handling\">Timestamp Handling\u003C\u002Fh3>\n\u003Cp>RomRaider logs time in milliseconds. UltraLog:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Converts milliseconds to seconds for display\u003C\u002Fli>\n\u003Cli>Calculates relative time from the first record\u003C\u002Fli>\n\u003Cli>Supports precise cursor positioning and playback\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"speeduino--rusefi\">Speeduino \u002F rusEFI\u003C\u002Fh2>\n\u003Ch3 id=\"overview-3\">Overview\u003C\u002Fh3>\n\u003Cp>Full support for Speeduino and rusEFI logs in MegaLogViewer (MLG) binary format.\u003C\u002Fp>\n\u003Ch3 id=\"supported-file-format-3\">Supported File Format\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Type:\u003C\u002Fstrong> Binary file\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Extension:\u003C\u002Fstrong> \u003Ccode>.mlg\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Source:\u003C\u002Fstrong> Logged directly by Speeduino\u002FrusEFI\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Identifier:\u003C\u002Fstrong> File begins with \u003Ccode>MLVLG\u003C\u002Fcode> header\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Channel count:\u003C\u002Fstrong> No fixed limit. Current rusEFI firmware logs over 1,000 channels; these load in UltraLog 2.16.1 and later\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"no-export-required\">No Export Required\u003C\u002Fh3>\n\u003Cp>Unlike Haltech and ECUMaster, Speeduino and rusEFI log directly to the MLG format. Simply load the \u003Ccode>.mlg\u003C\u002Fcode> file directly into UltraLog.\u003C\u002Fp>\n\u003Ch3 id=\"binary-field-types\">Binary Field Types\u003C\u002Fh3>\n\u003Cp>UltraLog supports all MLG field types:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>U08\u003C\u002Ftd>\n\u003Ctd>Unsigned 8-bit integer\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>S08\u003C\u002Ftd>\n\u003Ctd>Signed 8-bit integer\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>U16\u003C\u002Ftd>\n\u003Ctd>Unsigned 16-bit integer\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>S16\u003C\u002Ftd>\n\u003Ctd>Signed 16-bit integer\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>U32\u003C\u002Ftd>\n\u003Ctd>Unsigned 32-bit integer\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>S32\u003C\u002Ftd>\n\u003Ctd>Signed 32-bit integer\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>S64\u003C\u002Ftd>\n\u003Ctd>Signed 64-bit integer\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>F32\u003C\u002Ftd>\n\u003Ctd>32-bit floating point\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch3 id=\"supported-channels-2\">Supported Channels\u003C\u002Fh3>\n\u003Cp>Depends on your Speeduino\u002FrusEFI configuration. Common channels include:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Engine\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>RPM\u003C\u002Fli>\n\u003Cli>MAP\u003C\u002Fli>\n\u003Cli>TPS\u003C\u002Fli>\n\u003Cli>VE (Volumetric Efficiency)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Fuel\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>AFR \u002F Lambda\u003C\u002Fli>\n\u003Cli>Pulse Width\u003C\u002Fli>\n\u003Cli>Fuel Pressure\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Ignition\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Advance\u003C\u002Fli>\n\u003Cli>Dwell\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Temperatures\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Coolant\u003C\u002Fli>\n\u003Cli>IAT\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Sensors\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>O2 Sensor\u003C\u002Fli>\n\u003Cli>Battery Voltage\u003C\u002Fli>\n\u003Cli>Various analog inputs\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"timestamp-handling-1\">Timestamp Handling\u003C\u002Fh3>\n\u003Cp>MLG files include precise timestamps for each record, which UltraLog uses for:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Time axis display\u003C\u002Fli>\n\u003Cli>Playback synchronization\u003C\u002Fli>\n\u003Cli>Cursor position tracking\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"format-auto-detection\">Format Auto-Detection\u003C\u002Fh2>\n\u003Cp>UltraLog automatically detects the ECU format based on file contents. Binary formats are checked first:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>AiM:\u003C\u002Fstrong> Identifies \u003Ccode>&lt;hCNF\u003C\u002Fcode> tag in XRK\u002FDRK files\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Speeduino\u002FrusEFI:\u003C\u002Fstrong> Identifies \u003Ccode>MLVLG\u003C\u002Fcode> binary header\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Link ECU:\u003C\u002Fstrong> Identifies \u003Ccode>lf3\u003C\u002Fcode> magic bytes in LLG files\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Emerald:\u003C\u002Fstrong> Identifies \u003Ccode>.lg1\u003C\u002Fcode>\u002F\u003Ccode>.lg2\u003C\u002Fcode> file pair\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Then text formats, each by its own fingerprint:\u003C\u002Fp>\n\u003Col start=\"5\">\n\u003Cli>\u003Cstrong>MHD Tuning:\u003C\u002Fstrong> Identifies the leading \u003Ccode>#\u003C\u002Fcode> metadata block (\u003Ccode>#Ecu CALID\u003C\u002Fcode>, \u003Ccode>#Ecu PRGID\u003C\u002Fcode>) or the tune-file header column\u003C\u002Fli>\n\u003Cli>\u003Cstrong>RaceChrono:\u003C\u002Fstrong> Identifies the &quot;created using RaceChrono&quot; banner plus the \u003Ccode>Format,N\u003C\u002Fcode> metadata line\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Torque Pro:\u003C\u002Fstrong> Identifies a header row that starts with \u003Ccode>GPS Time, Device Time\u003C\u002Fcode> (searched in the first 64 lines)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>MegaSquirt:\u003C\u002Fstrong> Identifies TunerStudio datalog markers in the header\u003C\u002Fli>\n\u003Cli>\u003Cstrong>TunerStudio MSL:\u003C\u002Fstrong> Identifies a tab-delimited \u003Ccode>Time\u003C\u002Fcode> header row followed by a units row naming a time unit (\u003Ccode>sec\u003C\u002Fcode>, \u003Ccode>s\u003C\u002Fcode>, \u003Ccode>ms\u003C\u002Fcode>) — that units row is what separates MSL from every other tab-delimited \u003Ccode>Time\u003C\u002Fcode>-first export\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ECUMaster:\u003C\u002Fstrong> Identifies semicolon\u002Ftab-delimited CSV with \u003Ccode>TIME\u003C\u002Fcode> column\u003C\u002Fli>\n\u003Cli>\u003Cstrong>BlueDriver:\u003C\u002Fstrong> Identifies BlueDriver&#39;s export header (UTF-16 files are decoded first)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Motorsport Electronics:\u003C\u002Fstrong> Identifies a first column of exactly \u003Ccode>Time\u003C\u002Fcode> followed by ME Tuner&#39;s \u003Ccode>Marker\u003C\u002Fcode> column (or ME221 channel names) — checked before RomRaider because ME Tuner logs seconds where RomRaider logs milliseconds\u003C\u002Fli>\n\u003Cli>\u003Cstrong>RomRaider:\u003C\u002Fstrong> Identifies comma-delimited CSV starting with a \u003Ccode>Time\u003C\u002Fcode> column (also the catch-all for generic OBD-II apps such as OBDLink; the time unit is read from the header)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Locomotive:\u003C\u002Fstrong> Identifies the \u003Ccode>TimeStamp:\u003C\u002Fcode> \u002F \u003Ccode>Customer:\u003C\u002Fcode> metadata header lines\u003C\u002Fli>\n\u003Cli>\u003Cstrong>DynamicEFI:\u003C\u002Fstrong> Identifies the EBL WhatsUp \u003Ccode>RUNTIME\u003C\u002Fcode> column layout\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Woolich Racing Tuned:\u003C\u002Fstrong> Identifies comma-delimited CSV starting with a \u003Ccode>Log Time\u003C\u002Fcode> column of \u003Ccode>HH:MM:SS.mmm\u003C\u002Fcode> timestamps\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Haltech:\u003C\u002Fstrong> Looks for \u003Ccode>%DataLog%\u003C\u002Fcode> header (also the final fallback in the chain)\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>You don&#39;t need to specify the format - just load the file.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"aim\">AiM\u003C\u002Fh2>\n\u003Ch3 id=\"overview-4\">Overview\u003C\u002Fh3>\n\u003Cp>Full support for AiM motorsport data acquisition systems. AiM devices are widely used in professional racing and track day applications.\u003C\u002Fp>\n\u003Ch3 id=\"supported-file-format-4\">Supported File Format\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Type:\u003C\u002Fstrong> XRK\u002FDRK binary format\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Extension:\u003C\u002Fstrong> \u003Ccode>.xrk\u003C\u002Fcode>, \u003Ccode>.drk\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Source:\u003C\u002Fstrong> Logged directly by AiM devices\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Identifier:\u003C\u002Fstrong> File begins with \u003Ccode>&lt;hCNF\u003C\u002Fcode> tag\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"no-export-required-1\">No Export Required\u003C\u002Fh3>\n\u003Cp>AiM devices log directly to XRK\u002FDRK format. Simply load the file directly into UltraLog.\u003C\u002Fp>\n\u003Ch3 id=\"supported-devices\">Supported Devices\u003C\u002Fh3>\n\u003Cp>UltraLog works with all AiM data loggers:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>MXP\u003C\u002Fstrong> - Professional dash logger\u003C\u002Fli>\n\u003Cli>\u003Cstrong>MXG\u003C\u002Fstrong> - GPS lap timer with data acquisition\u003C\u002Fli>\n\u003Cli>\u003Cstrong>MXL2\u003C\u002Fstrong> - Compact GPS lap timer\u003C\u002Fli>\n\u003Cli>\u003Cstrong>EVO5\u003C\u002Fstrong> - Advanced dash display\u003C\u002Fli>\n\u003Cli>\u003Cstrong>MyChron5\u003C\u002Fstrong> - Karting data acquisition\u003C\u002Fli>\n\u003Cli>And other AiM motorsport data loggers\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"binary-format-parsing\">Binary Format Parsing\u003C\u002Fh3>\n\u003Cp>UltraLog uses a pure Rust implementation to parse the XRK binary format:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Automatically extracts all logged channels\u003C\u002Fli>\n\u003Cli>Parses metadata (vehicle, racer, track, championship, lap count)\u003C\u002Fli>\n\u003Cli>Handles GPS data and lap timing information\u003C\u002Fli>\n\u003Cli>Supports all AiM channel types\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-data\">Supported Data\u003C\u002Fh3>\n\u003Cp>Depends on your AiM device configuration and sensors. Common channels include:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>GPS and Lap Data\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>GPS Speed\u003C\u002Fli>\n\u003Cli>GPS Position\u003C\u002Fli>\n\u003Cli>Lap Times\u003C\u002Fli>\n\u003Cli>Lap Number\u003C\u002Fli>\n\u003Cli>Split Times\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Engine Data\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>RPM\u003C\u002Fli>\n\u003Cli>Engine Temperature\u003C\u002Fli>\n\u003Cli>Oil Temperature\u003C\u002Fli>\n\u003Cli>Oil Pressure\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Vehicle Dynamics\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Lateral G-Force\u003C\u002Fli>\n\u003Cli>Longitudinal G-Force\u003C\u002Fli>\n\u003Cli>Vertical G-Force\u003C\u002Fli>\n\u003Cli>Speed\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Sensors\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Analog inputs\u003C\u002Fli>\n\u003Cli>Digital inputs\u003C\u002Fli>\n\u003Cli>CAN bus data (if configured)\u003C\u002Fli>\n\u003Cli>Lambda\u002FAFR sensors\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"metadata\">Metadata\u003C\u002Fh3>\n\u003Cp>AiM files include rich metadata that UltraLog displays:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Vehicle name\u003C\u002Fli>\n\u003Cli>Racer name\u003C\u002Fli>\n\u003Cli>Track\u002Fvenue name\u003C\u002Fli>\n\u003Cli>Championship\u003C\u002Fli>\n\u003Cli>Session date and time\u003C\u002Fli>\n\u003Cli>Lap count\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"link-ecu\">Link ECU\u003C\u002Fh2>\n\u003Ch3 id=\"overview-5\">Overview\u003C\u002Fh3>\n\u003Cp>Full support for Link ECU log files from G4, G4+, and G4X ECUs. Link ECUs are popular in the performance and motorsport community.\u003C\u002Fp>\n\u003Ch3 id=\"supported-file-format-5\">Supported File Format\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Type:\u003C\u002Fstrong> Link log format (binary)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Extension:\u003C\u002Fstrong> \u003Ccode>.llg\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Source:\u003C\u002Fstrong> Logged directly by Link ECU via PCLink software\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Identifier:\u003C\u002Fstrong> File begins with \u003Ccode>lf3\u003C\u002Fcode> magic bytes\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"no-export-required-2\">No Export Required\u003C\u002Fh3>\n\u003Cp>Link ECUs log directly to LLG format via PCLink. Simply load the \u003Ccode>.llg\u003C\u002Fcode> file into UltraLog.\u003C\u002Fp>\n\u003Ch3 id=\"how-to-log-with-pclink\">How to Log with PCLink\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Connect to your Link ECU with PCLink software\u003C\u002Fli>\n\u003Cli>Go to \u003Cstrong>Logging\u003C\u002Fstrong> tab\u003C\u002Fli>\n\u003Cli>Select channels to log\u003C\u002Fli>\n\u003Cli>Click \u003Cstrong>Start Logging\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>Drive\u002Frun the engine\u003C\u002Fli>\n\u003Cli>Click \u003Cstrong>Stop Logging\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>Save the \u003Ccode>.llg\u003C\u002Fcode> file\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"binary-format-details\">Binary Format Details\u003C\u002Fh3>\n\u003Cp>Link uses a proprietary binary format:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Header with ECU model and software version\u003C\u002Fli>\n\u003Cli>Metadata section with log date\u002Ftime\u003C\u002Fli>\n\u003Cli>Channel blocks with name, unit, and time-series data\u003C\u002Fli>\n\u003Cli>Data stored as f32 (value, time) pairs\u003C\u002Fli>\n\u003Cli>UTF-16 LE string encoding for metadata\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-channels-3\">Supported Channels\u003C\u002Fh3>\n\u003Cp>Depends on your Link ECU model and configuration. Common channels include:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Engine Parameters\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Engine RPM\u003C\u002Fli>\n\u003Cli>Manifold Absolute Pressure (MAP)\u003C\u002Fli>\n\u003Cli>Throttle Position\u003C\u002Fli>\n\u003Cli>Engine Load\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Fuel System\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Lambda (AFR)\u003C\u002Fli>\n\u003Cli>Fuel Pressure\u003C\u002Fli>\n\u003Cli>Injector Pulse Width\u003C\u002Fli>\n\u003Cli>Fuel Trim\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Ignition System\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ignition Timing\u003C\u002Fli>\n\u003Cli>Ignition Coil Dwell\u003C\u002Fli>\n\u003Cli>Knock levels\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Temperatures\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Coolant Temperature\u003C\u002Fli>\n\u003Cli>Intake Air Temperature\u003C\u002Fli>\n\u003Cli>Oil Temperature\u003C\u002Fli>\n\u003Cli>Exhaust Gas Temperature (EGT)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Pressures\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Oil Pressure\u003C\u002Fli>\n\u003Cli>Fuel Pressure\u003C\u002Fli>\n\u003Cli>Barometric Pressure\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Vehicle Sensors\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Vehicle Speed\u003C\u002Fli>\n\u003Cli>Gear Position\u003C\u002Fli>\n\u003Cli>Battery Voltage\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Custom Channels\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Analog Voltage inputs\u003C\u002Fli>\n\u003Cli>Digital inputs\u003C\u002Fli>\n\u003Cli>CAN bus data (if configured)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"metadata-1\">Metadata\u003C\u002Fh3>\n\u003Cp>Link log files include:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>ECU model name\u003C\u002Fli>\n\u003Cli>Log date and time\u003C\u002Fli>\n\u003Cli>Software version\u003C\u002Fli>\n\u003Cli>Data source information\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"emerald-ecu\">Emerald ECU\u003C\u002Fh2>\n\u003Ch3 id=\"overview-6\">Overview\u003C\u002Fh3>\n\u003Cp>Full support for Emerald ECU log files from K6, M3D, and compatible ECU models. Emerald ECUs are popular in the British motorsport and classic car communities.\u003C\u002Fp>\n\u003Ch3 id=\"supported-file-format-6\">Supported File Format\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Type:\u003C\u002Fstrong> Binary format (dual-file system)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Extensions:\u003C\u002Fstrong> \u003Ccode>.lg1\u003C\u002Fcode> (data) + \u003Ccode>.lg2\u003C\u002Fcode> (channel definitions)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Source:\u003C\u002Fstrong> Logged directly by Emerald ECU via EM Soft\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Note:\u003C\u002Fstrong> Both files must be in the same directory\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"no-export-required-3\">No Export Required\u003C\u002Fh3>\n\u003Cp>Emerald ECUs log directly to LG1\u002FLG2 format. Simply load either the \u003Ccode>.lg1\u003C\u002Fcode> or \u003Ccode>.lg2\u003C\u002Fcode> file into UltraLog - both files are automatically loaded together.\u003C\u002Fp>\n\u003Ch3 id=\"how-to-log-with-emerald-em-soft\">How to Log with Emerald EM Soft\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Connect to your Emerald ECU with EM Soft\u003C\u002Fli>\n\u003Cli>Go to \u003Cstrong>Logging\u003C\u002Fstrong> section\u003C\u002Fli>\n\u003Cli>Select channels to log\u003C\u002Fli>\n\u003Cli>Click \u003Cstrong>Start Logging\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>Drive\u002Frun the engine\u003C\u002Fli>\n\u003Cli>Click \u003Cstrong>Stop Logging\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>Save the log files (both \u003Ccode>.lg1\u003C\u002Fcode> and \u003Ccode>.lg2\u003C\u002Fcode> will be created)\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"binary-format-details-1\">Binary Format Details\u003C\u002Fh3>\n\u003Cp>Emerald uses a dual-file binary format:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>.lg1\u003C\u002Fcode> file\u003C\u002Fstrong> - Contains the actual time-series data values\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>.lg2\u003C\u002Fcode> file\u003C\u002Fstrong> - Contains the channel ID for each of the 8 logger slots and the logger unit settings\u003C\u002Fli>\n\u003Cli>Data stored as binary values with timestamps\u003C\u002Fli>\n\u003Cli>Both files must be present in the same directory for UltraLog to load the log\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-channels-4\">Supported Channels\u003C\u002Fh3>\n\u003Cp>The \u003Ccode>.lg2\u003C\u002Fcode> file stores a channel ID for each of the 8 logger slots. UltraLog maps these IDs to channels:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>EM Soft label\u003C\u002Fth>\n\u003Cth>UltraLog channel\u003C\u002Fth>\n\u003Cth>Unit\u003C\u002Fth>\n\u003Cth>Status\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Engine Speed\u003C\u002Ftd>\n\u003Ctd>RPM\u003C\u002Ftd>\n\u003Ctd>RPM\u003C\u002Ftd>\n\u003Ctd>Confirmed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Throttle Pos\u003C\u002Ftd>\n\u003Ctd>TPS\u003C\u002Ftd>\n\u003Ctd>%\u003C\u002Ftd>\n\u003Ctd>Confirmed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>AFR\u002FLambda\u003C\u002Ftd>\n\u003Ctd>Lambda Sensor Voltage\u003C\u002Ftd>\n\u003Ctd>V\u003C\u002Ftd>\n\u003Ctd>Confirmed (see note)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>MAP\u003C\u002Ftd>\n\u003Ctd>MAP\u003C\u002Ftd>\n\u003Ctd>kPa\u003C\u002Ftd>\n\u003Ctd>Confirmed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Ign Adv\u003C\u002Ftd>\n\u003Ctd>Ignition Advance\u003C\u002Ftd>\n\u003Ctd>°\u003C\u002Ftd>\n\u003Ctd>Confirmed (see note)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Inj Duration\u003C\u002Ftd>\n\u003Ctd>Inj Duration\u003C\u002Ftd>\n\u003Ctd>%\u003C\u002Ftd>\n\u003Ctd>Confirmed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>BoostPWM\u003C\u002Ftd>\n\u003Ctd>Boost PWM\u003C\u002Ftd>\n\u003Ctd>%\u003C\u002Ftd>\n\u003Ctd>Confirmed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Load site\u003C\u002Ftd>\n\u003Ctd>Load Site\u003C\u002Ftd>\n\u003Ctd>0-15\u003C\u002Ftd>\n\u003Ctd>Confirmed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>AirTemp\u003C\u002Ftd>\n\u003Ctd>Air Temp\u003C\u002Ftd>\n\u003Ctd>°C\u003C\u002Ftd>\n\u003Ctd>Not yet confirmed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>CoolantTemp\u003C\u002Ftd>\n\u003Ctd>Coolant Temp\u003C\u002Ftd>\n\u003Ctd>°C\u003C\u002Ftd>\n\u003Ctd>Not yet confirmed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>Other channel IDs show as \u003Ccode>Channel N (ID x)\u003C\u002Fcode> with the raw value, or use a name that is not yet confirmed. If a channel shows the wrong name or value, open an issue and attach the \u003Ccode>.lg1\u003C\u002Fcode>\u002F\u003Ccode>.lg2\u003C\u002Fcode> pair and a screenshot of the same point in EM Soft.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Notes:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Lambda Sensor Voltage\u003C\u002Fstrong> is the K6&#39;s own lambda input in volts (0-1 V). If a wideband controller feeds that input, convert the voltage to AFR with a computed channel (see \u003Ca href=\"\u002Fdocs\u002Fuser-guide#computed-channels\">Computed Channels\u003C\u002Fa>) that uses your controller&#39;s output curve.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Ignition Advance\u003C\u002Fstrong> uses an offset worked out from log data (5.5° at idle, 14-17° at full boost on a turbo engine). Compare it with EM Soft for your log before you use it for tuning.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>MAP\u003C\u002Fstrong> is stored in the pressure unit the EM Soft logger was set to. UltraLog reads that setting from the \u003Ccode>.lg2\u003C\u002Fcode> file and shows kPa. Only the kPa and bar settings are supported; with any other setting MAP values are wrong.\u003C\u002Fli>\n\u003Cli>If a log has two channels with the same name, the confirmed one keeps the plain name and the other gets its channel ID added, for example \u003Ccode>Ignition Advance (ID 21)\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"important-notes\">Important Notes\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Both files required:\u003C\u002Fstrong> You must keep the \u003Ccode>.lg1\u003C\u002Fcode> and \u003Ccode>.lg2\u003C\u002Fcode> files together in the same directory\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Load either file:\u003C\u002Fstrong> UltraLog can be pointed at either file - it will automatically find and load the companion file\u003C\u002Fli>\n\u003Cli>\u003Cstrong>File naming:\u003C\u002Fstrong> The files must have matching base names (e.g., \u003Ccode>mylog.lg1\u003C\u002Fcode> and \u003Ccode>mylog.lg2\u003C\u002Fcode>)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"megasquirt--honda-tuning-studio---full-support\">MegaSquirt \u002F Honda Tuning Studio - Full Support\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>File type:\u003C\u002Fstrong> CSV datalogs exported from TunerStudio\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supported devices:\u003C\u002Fstrong> MegaSquirt MS1, MS2, MS3, MS3-Pro, MSPNP, MSPNP2, Honda Tuning Studio\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features:\u003C\u002Fstrong> Automatic channel and unit extraction from column headers, boolean value parsing (MIL lamp ON\u002FOFF), anomalous first-row timestamp handling, UTF-8 BOM support\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-data-1\">Supported Data\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>RPM, MAP, TPS, VSS, Gear\u003C\u002Fli>\n\u003Cli>Injector Duration &amp; Duty Cycle\u003C\u002Fli>\n\u003Cli>Ignition Table &amp; Final Timing\u003C\u002Fli>\n\u003Cli>Coolant Temperature (ECT), Intake Air Temperature (IAT)\u003C\u002Fli>\n\u003Cli>Air-Fuel Ratio, Battery Voltage\u003C\u002Fli>\n\u003Cli>Boost Pressure, Barometric Pressure\u003C\u002Fli>\n\u003Cli>Analog inputs (D14, MAP Voltage, ELD Voltage, TPS Voltage)\u003C\u002Fli>\n\u003Cli>MIL (Malfunction Indicator Lamp) status\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"important-notes-1\">Important Notes\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>TunerStudio format:\u003C\u002Fstrong> The log file must be exported from TunerStudio (starts with &quot;Tune Datalog export&quot;)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Channel variability:\u003C\u002Fstrong> Available channels depend on your TunerStudio dashboard configuration\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Compatible software:\u003C\u002Fstrong> TunerStudio MS, TunerStudio Lite, Honda Tuning Studio, MegaLogViewer\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>.msl\u003C\u002Fcode> files:\u003C\u002Fstrong> Those use a different layout and are handled by the TunerStudio MSL parser below\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"tunerstudio-msl---full-support\">TunerStudio MSL - Full Support\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>File type:\u003C\u002Fstrong> Tab-delimited legacy ASCII datalogs (\u003Ccode>.msl\u003C\u002Fcode>)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Where they come from:\u003C\u002Fstrong> TunerStudio&#39;s Data Logging menu, and third-party dashes that write the same dialect — notably RealDash, which logs a Speeduino over Bluetooth straight to \u003Ccode>.msl\u003C\u002Fcode> with no cable and no conversion step\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supported devices:\u003C\u002Fstrong> Speeduino, MegaSquirt, and any ECU logged through TunerStudio or RealDash\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features:\u003C\u002Fstrong> Units read from the row beneath the header, optional firmware\u002Fcapture-date preamble, \u003Ccode>MARK\u003C\u002Fcode> lines skipped, blank and non-numeric fields carried forward from the last known value, clock columns converted to seconds since midnight, monotonic time enforced across concatenated sessions\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"format-layout\">Format Layout\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-text\">Time    SecL    RPM     MAP     ...     GPS Latitude    GPS Longitude   GPS Time\nsec     s       RPM     kPa     ...     lat             lon             time\n0.0     202.0   965.0   33.0    ...     -26.253315      -51.06884       21:51\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Row 1 is the channel names, row 2 is the unit for each column, and everything after is data. UltraLog reads the time unit from that second row, so a log in milliseconds scales correctly instead of being read as seconds.\u003C\u002Fp>\n\u003Ch3 id=\"supported-data-2\">Supported Data\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>RPM, MAP, TPS, MAT, CLT, Battery Voltage\u003C\u002Fli>\n\u003Cli>AFR and AFR2, EGO corrections\u003C\u002Fli>\n\u003Cli>Pulse Width, VE, Duty Cycle (per bank)\u003C\u002Fli>\n\u003Cli>Spark Advance, MAF, Boost (bar and psi), Acceleration\u003C\u002Fli>\n\u003Cli>Speed, and GPS Latitude \u002F Longitude \u002F Altitude \u002F Speed \u002F Date \u002F Time\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"important-notes-2\">Important Notes\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Track Map works out of the box:\u003C\u002Fstrong> GPS columns keep their exported names, so a logged session draws the track with lap detection and channel coloring\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Non-numeric columns:\u003C\u002Fstrong> \u003Ccode>GPS Date\u003C\u002Fcode> is text (\u003Ccode>18.8.2026\u003C\u002Fcode>) and has no numeric meaning, so it reads as the last known value. \u003Ccode>GPS Time\u003C\u002Fcode> is converted to seconds since midnight and does plot\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Blank fields:\u003C\u002Fstrong> RealDash leaves GPS fields blank until it gets a fix. Those rows carry the previous value forward rather than dropping to zero mid-log\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Not the same as the MegaSquirt CSV:\u003C\u002Fstrong> TunerStudio&#39;s comma-delimited CSV export is handled by the MegaSquirt parser above. Both are supported; UltraLog picks the right one automatically\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"woolich-racing-tuned---full-support\">Woolich Racing Tuned - Full Support\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>File type:\u003C\u002Fstrong> CSV datalogs exported from Woolich Racing Tuned (WRT) flash-tuning software\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supported devices:\u003C\u002Fstrong> Yamaha, Kawasaki, Suzuki, Honda, and BMW sportbike ECUs flashed and logged through the WRT datalogger\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features:\u003C\u002Fstrong> \u003Ccode>HH:MM:SS.mmm\u003C\u002Fcode> timestamp parsing normalized to relative seconds, boolean channel parsing (\u003Ccode>Clutch In\u003C\u002Fcode> True\u002FFalse → 1\u002F0), automatic unit inference, trailing-comma handling\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-file-format-7\">Supported File Format\u003C\u002Fh3>\n\u003Cp>Woolich logs are plain comma-delimited CSV with a \u003Ccode>Log Time\u003C\u002Fcode> column first and a trailing comma on every row:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Log Time,RPM,TPS,IAP,AFR,Gear,Clutch In,Coolant Temp,IAT,\n00:00:00.040,0,0.00,100.00,0.0,0,False,24.0,25.0,\n00:00:00.100,1224,12.50,59.00,13.2,0,True,92.0,26.0,\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"how-to-export-from-woolich-racing-tuned\">How to Export from Woolich Racing Tuned\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Open your logged session in the Woolich Racing Tuned software\u003C\u002Fli>\n\u003Cli>Use the \u003Cstrong>Export to CSV\u003C\u002Fstrong> option from the logging\u002Fdata view\u003C\u002Fli>\n\u003Cli>Load the resulting \u003Ccode>.csv\u003C\u002Fcode> file directly into UltraLog\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"supported-data-3\">Supported Data\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>RPM, TPS (throttle position), IAP (intake air pressure)\u003C\u002Fli>\n\u003Cli>AFR (air-fuel ratio)\u003C\u002Fli>\n\u003Cli>Gear, Clutch In (boolean)\u003C\u002Fli>\n\u003Cli>Coolant Temp, IAT (intake air temperature)\u003C\u002Fli>\n\u003Cli>Any additional channels selected in the WRT logging configuration\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"timestamp-handling-2\">Timestamp Handling\u003C\u002Fh3>\n\u003Cp>The \u003Ccode>Log Time\u003C\u002Fcode> column is wall-clock elapsed time formatted as \u003Ccode>HH:MM:SS.mmm\u003C\u002Fcode>. UltraLog converts it to seconds and normalizes the first sample to \u003Ccode>t = 0\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"unit-handling-1\">Unit Handling\u003C\u002Fh3>\n\u003Cp>WRT exports do not embed units in the header, so UltraLog infers conventional units from each channel name (e.g. RPM → RPM, IAP → kPa, temps → °C, TPS → %, AFR → AFR). Boolean channels such as \u003Ccode>Clutch In\u003C\u002Fcode> are charted as 1 (True) \u002F 0 (False).\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"racechrono---full-support\">RaceChrono - Full Support\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>File type:\u003C\u002Fstrong> CSV v3 session exports from the RaceChrono \u002F RaceChrono Pro lap-timing app (Android\u002FiOS)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supported devices:\u003C\u002Fstrong> Any session recorded in RaceChrono — phone GPS or external GPS receivers, phone accelerometer\u002Fgyroscope\u002Fmagnetometer, and OBD-II \u002F CAN-Bus channels from a connected adapter\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features:\u003C\u002Fstrong> All sources merged on one time axis, duplicate channel names disambiguated by source, multi-fragment (paused and resumed) sessions, GPS Track Map support out of the box\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-file-format-8\">Supported File Format\u003C\u002Fh3>\n\u003Cp>RaceChrono CSV v3 files start with a banner and a metadata preamble, followed by a header row, a units row, and a sources row:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">This file is created using RaceChrono Pro v10.1.3 ( http:\u002F\u002Fracechrono.com\u002F ).\nFormat,3\nSession title,&quot;My Track Session&quot;\nSession type,Lap timing\n...\n\ntimestamp,fragment_id,lap_number,elapsed_time,...,latitude,longitude,...,speed,...,rpm\nunix time,,,s,...,deg,deg,...,m\u002Fs,...,rpm\n,,,,...,100: gps,100: gps,...,calc,...,300: canbus\n1785849363.002,0,,0.002,...,44.831825,11.224415,...,0.0,...,850.0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"how-to-export-from-racechrono\">How to Export from RaceChrono\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Open the session in RaceChrono\u003C\u002Fli>\n\u003Cli>Tap the share\u002Fexport button and choose \u003Cstrong>CSV v3\u003C\u002Fstrong> as the export format\u003C\u002Fli>\n\u003Cli>Load the resulting \u003Ccode>.csv\u003C\u002Fcode> file directly into UltraLog\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Only CSV v3 is supported. The other RaceChrono export formats (\u003Ccode>.vbo\u003C\u002Fcode>, \u003Ccode>.rcz\u003C\u002Fcode>, CSV v1\u002Fv2) will not load — UltraLog shows a clear error asking for a CSV v3 re-export if it sees an older CSV version.\u003C\u002Fp>\n\u003Ch3 id=\"supported-data-4\">Supported Data\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>GPS: latitude, longitude, altitude, speed, bearing, accuracy, satellites, fix type\u003C\u002Fli>\n\u003Cli>Phone sensors: accelerometer (x\u002Fy\u002Fz), gyroscope, magnetometer, and derived lateral\u002Flongitudinal\u002Fcombined acceleration and lean angle\u003C\u002Fli>\n\u003Cli>Lap timing: lap number, fragment id, distance traveled\u003C\u002Fli>\n\u003Cli>OBD-II \u002F CAN: every channel the session logged (RPM, engine oil temp, throttle, and more)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"channel-naming\">Channel Naming\u003C\u002Fh3>\n\u003Cp>RaceChrono exports the same column name once per source (for example \u003Ccode>speed\u003C\u002Fcode> from GPS and from the calculated pipeline). UltraLog disambiguates duplicates with the source label — \u003Ccode>speed (gps)\u003C\u002Fcode>, \u003Ccode>speed (calc)\u003C\u002Fcode>, \u003Ccode>device_update_rate (acc)\u003C\u002Fcode> — while unique names such as \u003Ccode>latitude\u003C\u002Fcode>, \u003Ccode>longitude\u003C\u002Fcode>, and \u003Ccode>rpm\u003C\u002Fcode> are kept exactly as exported.\u003C\u002Fp>\n\u003Ch3 id=\"timestamp-handling-3\">Timestamp Handling\u003C\u002Fh3>\n\u003Cp>The \u003Ccode>timestamp\u003C\u002Fcode> column is unix time. UltraLog re-bases it so the first record is \u003Ccode>t = 0\u003C\u002Fcode>. The \u003Ccode>elapsed_time\u003C\u002Fcode> column resets to zero at every fragment boundary (each time the recording was paused and resumed), so it is kept as a regular channel rather than used as the time axis.\u003C\u002Fp>\n\u003Ch3 id=\"gps-track-map\">GPS Track Map\u003C\u002Fh3>\n\u003Cp>Because latitude\u002Flongitude arrive in decimal degrees under their standard names, the GPS Track Map works immediately: lap detection, channel-colored track polyline, and cursor sync.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"mhd-tuning---full-support\">MHD Tuning - Full Support\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>File type:\u003C\u002Fstrong> CSV datalogs exported from the MHD Tuning flashing\u002Flogging app\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supported devices:\u003C\u002Fstrong> BMW N54, N55, S55, B58, and other platforms flashed and logged with MHD Tuning\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features:\u003C\u002Fstrong> Skips the leading \u003Ccode>#\u003C\u002Fcode> metadata block, UTF-8 BOM handling, unit extraction from column headers, MHD&#39;s \u003Ccode>*\u003C\u002Fcode>-for-degree notation normalized to °\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-file-format-9\">Supported File Format\u003C\u002Fh3>\n\u003Cp>MHD logs are comma-delimited CSV with a leading block of \u003Ccode>#\u003C\u002Fcode>-prefixed metadata lines, then a header row whose first column is \u003Ccode>Time\u003C\u002Fcode> and whose channel names carry their unit in trailing parentheses:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">#Encoding: UTF-8\n#Ecu CALID: \n#Ecu PRGID: 7616431\n#VIN: REDACTED\nTime,Boost (Bar),Coolant (*C),RPM (RPM),Gear (-),MHD 5.26 IJE0S ST2V7.bin\n539.607,-0.479,89,1346,2,0\n539.742,-0.466,89,1350,2,0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"how-to-export-from-mhd-tuning\">How to Export from MHD Tuning\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Open the logged session in the MHD Tuning app\u003C\u002Fli>\n\u003Cli>Use the log export option to save the session as CSV\u003C\u002Fli>\n\u003Cli>Load the resulting \u003Ccode>.csv\u003C\u002Fcode> file directly into UltraLog\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"supported-data-5\">Supported Data\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Boost and boost target, wastegate duty cycle (WGDC)\u003C\u002Fli>\n\u003Cli>RPM, coolant and intake air temperature, engine load\u003C\u002Fli>\n\u003Cli>Per-cylinder ignition timing correction\u003C\u002Fli>\n\u003Cli>Lambda\u002FAFR per bank, short-term fuel trim per bank\u003C\u002Fli>\n\u003Cli>Fuel rail pressure, gear, torque\u003C\u002Fli>\n\u003Cli>Any additional channel selected in the MHD logging configuration\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"metadata-block\">Metadata Block\u003C\u002Fh3>\n\u003Cp>MHD writes a leading block of \u003Ccode>#\u003C\u002Fcode>-prefixed lines before the header row (\u003Ccode>#Encoding\u003C\u002Fcode>, \u003Ccode>#Ecu CALID\u003C\u002Fcode>, \u003Ccode>#Ecu PRGID\u003C\u002Fcode>, \u003Ccode>#VIN\u003C\u002Fcode>). UltraLog reads these into log metadata, then skips past them to find the header row. This preamble is also why MHD detection runs against the raw file text ahead of the rest of the format-detection chain, rather than after the generic comment-stripping step every other CSV parser sees.\u003C\u002Fp>\n\u003Cp>The final header column is normally the active tune file name (e.g. \u003Ccode>MHD 5.26 IJE0S ST2V7.bin\u003C\u002Fcode>) — UltraLog captures this in log metadata rather than treating it as a channel.\u003C\u002Fp>\n\u003Ch3 id=\"degree-notation\">Degree Notation\u003C\u002Fh3>\n\u003Cp>MHD substitutes \u003Ccode>*\u003C\u002Fcode> for the degree sign in channel headers: \u003Ccode>(*C)\u003C\u002Fcode> normalizes to °C, \u003Ccode>(*)\u003C\u002Fcode> to °, and \u003Ccode>(*CRK)\u003C\u002Fcode> to °CRK. A unit of \u003Ccode>-\u003C\u002Fcode> means the channel is unitless (e.g. \u003Ccode>Gear (-)\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Ch3 id=\"missing-data\">Missing Data\u003C\u002Fh3>\n\u003Cp>Unparseable or blank fields are filled with the last successfully parsed value for that column (\u003Ccode>0.0\u003C\u002Fcode> before the first valid sample), the same approach used by the Haltech and ECUMaster parsers. This keeps every row aligned with the channel list instead of shifting later columns when one field fails to parse.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"bluedriver-obd-ii---full-support\">BlueDriver OBD-II - Full Support\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>File type:\u003C\u002Fstrong> CSV log exports from the BlueDriver Bluetooth OBD-II scan tool app\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supported devices:\u003C\u002Fstrong> Any vehicle with an OBD-II port, scanned through a BlueDriver Bluetooth adapter\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features:\u003C\u002Fstrong> Automatic channel\u002Funit extraction from parenthesized header units, UTF-16 file handling\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-file-format-10\">Supported File Format\u003C\u002Fh3>\n\u003Cp>BlueDriver exports a UTF-16-encoded CSV (with a byte-order mark) containing a title line, a date line, then a header row and comma-separated data. Time is in decimal seconds:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">BlueDriver Data Log\nJan 16, 2026\nTime(s), Engine RPM (rpm), Voltage (V)\n0.00, 850, 14.2\n0.50, 900, 14.1\n1.00, 950, 14.0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"how-to-export-from-bluedriver\">How to Export from BlueDriver\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Open the logged session in the BlueDriver app\u003C\u002Fli>\n\u003Cli>Use the app&#39;s export\u002Fshare option to save the session as CSV\u003C\u002Fli>\n\u003Cli>Load the resulting \u003Ccode>.csv\u003C\u002Fcode> file directly into UltraLog\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"supported-data-6\">Supported Data\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Every OBD-II PID logged by the session: RPM, vehicle speed, coolant temperature, MAF\u003C\u002Fli>\n\u003Cli>Fuel trims (short-term\u002Flong-term)\u003C\u002Fli>\n\u003Cli>O2 sensor readings and voltages (e.g. &quot;O2 Bank 1 - Sensor 2 - Oxygen Sensor Voltage&quot;)\u003C\u002Fli>\n\u003Cli>Any additional PID selected in the BlueDriver live-data view\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"character-encoding\">Character Encoding\u003C\u002Fh3>\n\u003Cp>BlueDriver writes its CSV as UTF-16 with a byte-order mark, unlike nearly every other supported format, which is UTF-8. UltraLog detects and decodes this automatically — no manual conversion needed before loading the file.\u003C\u002Fp>\n\u003Ch3 id=\"missing-data-1\">Missing Data\u003C\u002Fh3>\n\u003Cp>Empty or unparseable cells are recorded as \u003Ccode>NaN\u003C\u002Fcode> rather than filled from the previous value, so a PID the scan tool briefly failed to read shows as a genuine gap instead of a flat line.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"motorsport-electronics---full-support\">Motorsport Electronics - Full Support\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>File type:\u003C\u002Fstrong> CSV exports from the ME Tuner software used with Motorsport Electronics ECUs\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supported devices:\u003C\u002Fstrong> ME221, ME442, and other Motorsport Electronics ECUs — common on turbo\u002Fsupercharged MX-5s, Ford Focus ST150, Honda S2000, Toyota Starlet, Mitsubishi Evo, and similar builds\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features:\u003C\u002Fstrong> Automatic unit inference from channel names, since ME Tuner does not embed units in the header\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-file-format-11\">Supported File Format\u003C\u002Fh3>\n\u003Cp>ME Tuner logs are comma-delimited CSV with \u003Ccode>Time\u003C\u002Fcode> (seconds since logging start) as the first column and \u003Ccode>Marker\u003C\u002Fcode> as the second, followed by the channels picked in the ME Tuner log setup. A full ME221 log looks like this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Time, Marker, RPM, Sync status, Lost sync count, Injector duty, MAP Raw, MAP, TPS Raw, TPS, ...\n0.11,0,1104.00,2.00,0.00,0.64,5908.00,27.05,5870.00,0.00,...\n0.22,0,1105.00,2.00,0.00,0.64,5924.00,27.09,5881.00,0.00,...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>A log with a short custom channel list, such as this ME442 export, loads the same way:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Time, Marker, RPM, MAP, Coolant Temp., DBW A Pedal Pos Raw 1, Lambda Ext. AFR, DBW A Sens. Status, ALS Status\n0.11,0,1004.00,35.70,59.00,0.00,12.04,0.00,0.00\n0.22,0,1004.00,35.64,59.00,0.00,12.04,0.00,0.00\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"how-to-export-from-me-tuner\">How to Export from ME Tuner\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Open the logged session in ME Tuner\u003C\u002Fli>\n\u003Cli>Use the software&#39;s log export option to save the session as CSV\u003C\u002Fli>\n\u003Cli>Load the resulting \u003Ccode>.csv\u003C\u002Fcode> file directly into UltraLog\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"supported-data-7\">Supported Data\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>RPM, MAP, TPS (raw and calibrated), primary\u002Fsecondary load\u003C\u002Fli>\n\u003Cli>Injector duty cycle, base and total VE, fuel trims (CLT\u002FIAT\u002Fidle\u002Fknock\u002Flambda)\u003C\u002Fli>\n\u003Cli>Ignition advance (base table, knock modifier, CLT\u002FIAT add), dwell\u003C\u002Fli>\n\u003Cli>Coolant and intake air temperature, battery voltage\u003C\u002Fli>\n\u003Cli>Boost open\u002Fclosed-loop duty and target, wideband AFR\u002Flambda status\u003C\u002Fli>\n\u003Cli>Drive-by-wire (DBW) status and throttle plate position\u003C\u002Fli>\n\u003Cli>Any additional channel logged in the ME Tuner configuration\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Raw ADC channels (\u003Ccode>MAP Raw\u003C\u002Fcode>, \u003Ccode>Coolant temperature Raw\u003C\u002Fcode>, ...) and status channels (\u003Ccode>Sync status\u003C\u002Fcode>, \u003Ccode>ALS Status\u003C\u002Fcode>, ...) are shown without a unit, so the unit preferences never convert them.\u003C\u002Fp>\n\u003Ch3 id=\"detection-against-romraider\">Detection Against RomRaider\u003C\u002Fh3>\n\u003Cp>ME Tuner&#39;s header also starts with a bare \u003Ccode>Time\u003C\u002Fcode> column — the same fingerprint the RomRaider\u002Fgeneric-CSV parser looks for. RomRaider treats an un-annotated \u003Ccode>Time\u003C\u002Fcode> column as milliseconds, which would scale ME Tuner timestamps 1000x too small. UltraLog fingerprints ME Tuner files by the \u003Ccode>Time, Marker\u003C\u002Fcode> pair at the start of the header, which ME Tuner writes whatever channels are logged. As a fallback it also accepts a bare \u003Ccode>Time\u003C\u002Fcode> header with several ME221-specific column names (\u003Ccode>Sync status\u003C\u002Fcode>, \u003Ccode>Lost sync count\u003C\u002Fcode>, \u003Ccode>MAP Raw\u003C\u002Fcode>, \u003Ccode>WBO2 Curr. AFR\u003C\u002Fcode>, and others). This check runs before the RomRaider chain so ME Tuner exports are never misread as millisecond timestamps. Before v2.15.2 only the ME221 column names were checked, so an ME442 log with a short custom channel list loaded through RomRaider at 1\u002F1000 of its real length.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"dynamicefi---full-support\">DynamicEFI - Full Support\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>File type:\u003C\u002Fstrong> CSV exports from DynamicEFI&#39;s EBL WhatsUp software, used with modified GM TBI (Throttle Body Injection) systems\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supported devices:\u003C\u002Fstrong> GM TBI-based engines logged through EBL WhatsUp\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features:\u003C\u002Fstrong> GM TBI channel abbreviations mapped to display units, Y\u002FN flag and gear-letter parsing, sub-second timestamp interpolation\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-file-format-12\">Supported File Format\u003C\u002Fh3>\n\u003Cp>EBL WhatsUp exports comma-delimited CSV with a trailing comma on every row, a \u003Ccode>RUNTIME\u003C\u002Fcode> column in \u003Ccode>HH:MM:SS\u003C\u002Fcode> format, and GM TBI-specific channel abbreviations:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">RUNTIME,RPM,MPH,MAP,PSI,BRO,VAC,VE%,TPS,CTS,IAT,I\u002FC,O2,G\u002FS,SA,...,BLM,BPC,IAC,AFR,WB,...\n00:00:00,   0,  0, 98,  0, 98,  0, 72,  0, 72, 69, 72, 451,  0,10, 0,...\n00:01:53, 775,  0, 35,  0, 98, 63, 38,  0,100, 69, 99, 743, 17,25, 0,...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"how-to-export\">How to Export\u003C\u002Fh3>\n\u003Cp>EBL WhatsUp logs natively to a \u003Ccode>.dat\u003C\u002Fcode> raw serial stream; use the software&#39;s CSV export option to convert a logged session, then load the resulting \u003Ccode>.csv\u003C\u002Fcode> file directly into UltraLog.\u003C\u002Fp>\n\u003Ch3 id=\"supported-data-8\">Supported Data\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>RPM, road speed (MPH), MAP\u002FBRO (kPa), boost\u002Fvacuum (PSI\u002FinHg)\u003C\u002Fli>\n\u003Cli>VE%, TPS, injector pulse width (base\u002Factual\u002FAE)\u003C\u002Fli>\n\u003Cli>Coolant and intake air temperature (°F), O2 sensor (mV), airflow (g\u002Fs)\u003C\u002Fli>\n\u003Cli>Spark advance, BLM\u002FBPC fuel trims, IAC steps\u003C\u002Fli>\n\u003Cli>AFR\u002Fwideband, and Y\u002FN flag or gear-letter channels (e.g. Park\u002FNeutral)\u003C\u002Fli>\n\u003Cli>Any additional channel logged by EBL WhatsUp\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"runtime-resolution-and-timestamp-interpolation\">RUNTIME Resolution and Timestamp Interpolation\u003C\u002Fh3>\n\u003Cp>EBL WhatsUp&#39;s \u003Ccode>RUNTIME\u003C\u002Fcode> column only has 1-second resolution, but the underlying data is sampled much faster. UltraLog distributes the multiple samples that share a \u003Ccode>RUNTIME\u003C\u002Fcode> value evenly across that second so the time axis stays smooth instead of stair-stepping. It also detects \u003Ccode>RUNTIME\u003C\u002Fcode> resets — the column wrapping back to \u003Ccode>00:00:00\u003C\u002Fcode> mid-session — and continues the time axis monotonically with a 1-second gap rather than jumping backwards.\u003C\u002Fp>\n\u003Ch3 id=\"flag-and-gear-values\">Flag and Gear Values\u003C\u002Fh3>\n\u003Cp>GM TBI channel values include letter\u002Fflag codes alongside numbers: \u003Ccode>Y\u003C\u002Fcode>\u002F\u003Ccode>N\u003C\u002Fcode> map to 1\u002F0, \u003Ccode>P\u002FN\u003C\u002Fcode> (Park\u002FNeutral) maps to 0, and gear letters map to \u003Ccode>D\u003C\u002Fcode> = 4, \u003Ccode>R\u003C\u002Fcode> = -1, \u003Ccode>L\u003C\u002Fcode> = 1.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"locomotive---full-support\">Locomotive - Full Support\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>File type:\u003C\u002Fstrong> CSV exports from a locomotive datalogger\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supported devices:\u003C\u002Fstrong> Locomotive control\u002Fmonitoring systems that export a \u003Ccode>TimeStamp:\u003C\u002Fcode>\u002F\u003Ccode>Customer:\u003C\u002Fcode>\u002F\u003Ccode>UnitNumber:\u003C\u002Fcode> metadata header followed by day-of-week-prefixed data rows\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features:\u003C\u002Fstrong> Wall-clock timestamp parsing, metadata extraction (customer, unit number, software version), parallel row parsing for large logs\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-file-format-13\">Supported File Format\u003C\u002Fh3>\n\u003Cp>Locomotive logs start with five metadata lines, a blank line, then a comma-delimited header row, followed by data rows that begin with a day-of-week abbreviation:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">TimeStamp: Sat Nov 15 19:00:03 2025\nCustomer: VLi\nUnitNumber: 6194\nSoftwarePartNumber: 16085\nSoftwareVersion: 33.21.04\n\nTimeStamp, CPMRst, Rc_tfnd, AB Mode, ASRstSt, ..., Eng RPM, ..., Batt V, ...\nSat Nov 15 19:00:03 2025, 1, 1, 1, 2, ..., 2907, ..., 64.0000000000, ...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"how-to-export-1\">How to Export\u003C\u002Fh3>\n\u003Cp>Export the session log as CSV from your locomotive datalogger software, then load the resulting \u003Ccode>.csv\u003C\u002Fcode> file directly into UltraLog.\u003C\u002Fp>\n\u003Ch3 id=\"supported-data-9\">Supported Data\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Hundreds of locomotive control and diagnostic channels: engine RPM, battery voltage, traction motor and alternator status, brake and throttle position, cab signal states, and fault\u002Fstatus flags across the locomotive&#39;s control systems\u003C\u002Fli>\n\u003Cli>Exact channel set depends on the datalogger configuration and locomotive model\u003C\u002Fli>\n\u003Cli>Channels carry no unit metadata in the source file, so all values display unitless\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"metadata-2\">Metadata\u003C\u002Fh3>\n\u003Cp>Locomotive logs carry session metadata in their first five lines, which UltraLog reads into log metadata rather than treating as channels: \u003Ccode>TimeStamp\u003C\u002Fcode>, \u003Ccode>Customer\u003C\u002Fcode>, \u003Ccode>UnitNumber\u003C\u002Fcode>, \u003Ccode>SoftwarePartNumber\u003C\u002Fcode>, and \u003Ccode>SoftwareVersion\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"timestamp-handling-4\">Timestamp Handling\u003C\u002Fh3>\n\u003Cp>Each data row starts with a full wall-clock timestamp (e.g. \u003Ccode>Sat Nov 15 19:00:03 2025\u003C\u002Fcode>), not an elapsed-time column. UltraLog parses this \u003Ccode>&lt;weekday&gt; &lt;month&gt; &lt;day&gt; &lt;HH:MM:SS&gt; &lt;year&gt;\u003C\u002Fcode> format, converts it to seconds, and normalizes the first sample to \u003Ccode>t = 0\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"torque-pro---full-support\">Torque Pro - Full Support\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>File type:\u003C\u002Fstrong> \u003Ccode>trackLog-*.csv\u003C\u002Fcode> files written by the Torque Pro OBD-II app (Android)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supported devices:\u003C\u002Fstrong> Any car Torque Pro can read through an ELM327-style OBD-II adapter, plus the phone&#39;s GPS and accelerometer\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features:\u003C\u002Fstrong> Millisecond timeline from the phone clock, PIDs the car never answered are hidden, logging restarts in the same file are joined, GPS Track Map support out of the box\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Available since:\u003C\u002Fstrong> UltraLog v2.16.0\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"supported-file-format-14\">Supported File Format\u003C\u002Fh3>\n\u003Cp>Torque writes a header row of fixed phone columns followed by one column per logged PID, named \u003Ccode>Name(unit)\u003C\u002Fcode>. A PID with no reading in a row is written as \u003Ccode>-\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">GPS Time, Device Time, Longitude, Latitude,GPS Speed (Meters\u002Fsecond), Horizontal Dilution of Precision, Altitude, Bearing, G(x), G(y), G(z), G(calibrated),Engine RPM(rpm),Engine Coolant Temperature(°C),...\nSat Jan 05 14:34:31 MST 2013,05-Jan-2013 14:32:13.526,-104.86746,39.07588,0.0,2.83,2087.4,213.3,0.19,0.95,9.57,0.0001,850.5,-,...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"how-to-log-with-torque-pro\">How to Log with Torque Pro\u003C\u002Fh3>\n\u003Col>\n\u003Cli>In Torque Pro, open \u003Cstrong>Settings &gt; Data Logging &amp; Upload\u003C\u002Fstrong> and pick the PIDs to log\u003C\u002Fli>\n\u003Cli>Start logging from the menu on a dashboard screen, drive, then stop logging\u003C\u002Fli>\n\u003Cli>Copy the \u003Ccode>trackLog-*.csv\u003C\u002Fcode> file from the \u003Ccode>torqueLogs\u003C\u002Fcode> folder on the phone to your computer\u003C\u002Fli>\n\u003Cli>Load the file into UltraLog\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>If the file has only the header row, Torque recorded no samples in that session (for example, logging was started and stopped with no OBD-II connection). UltraLog shows an error that says this, instead of opening an empty log.\u003C\u002Fp>\n\u003Ch3 id=\"supported-data-10\">Supported Data\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Phone GPS: latitude, longitude, speed, altitude, bearing, and horizontal dilution of precision\u003C\u002Fli>\n\u003Cli>Phone accelerometer: G(x), G(y), G(z), and G(calibrated)\u003C\u002Fli>\n\u003Cli>Every OBD-II and custom PID Torque logged (RPM, coolant and intake temperatures, fuel trims, O2 sensors, boost, and more), with the unit from the column name\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"timestamp-handling-5\">Timestamp Handling\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>The time axis comes from \u003Ccode>Device Time\u003C\u002Fcode> (\u003Ccode>05-Jan-2013 14:32:13.526\u003C\u002Fcode>), which has milliseconds. \u003Ccode>GPS Time\u003C\u002Fcode> has 1 second resolution and is used only when \u003Ccode>Device Time\u003C\u002Fcode> cannot be read.\u003C\u002Fli>\n\u003Cli>If the file was opened and saved in Excel, \u003Ccode>Device Time\u003C\u002Fcode> can become a short \u003Ccode>mm:ss.0\u003C\u002Fcode> clock. UltraLog still reads it and handles the hourly rollover.\u003C\u002Fli>\n\u003Cli>When the phone clock steps back (time-zone change or daylight saving time), the timeline continues from the last row instead of losing data.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"missing-readings-and-empty-columns\">Missing Readings and Empty Columns\u003C\u002Fh3>\n\u003Cp>Torque reads PIDs in turn, so a PID often has \u003Ccode>-\u003C\u002Fcode> in rows between its readings. UltraLog keeps the last reading for those rows. With &quot;log all PIDs&quot; the header can list more than 200 PIDs that most cars never answer; columns with no reading anywhere are hidden.\u003C\u002Fp>\n\u003Ch3 id=\"logging-restarts\">Logging Restarts\u003C\u002Fh3>\n\u003Cp>When logging restarts into the same file, Torque writes the header row again, and the PID list can change. UltraLog loads every section into one log. A PID that is missing from a section keeps its last reading there.\u003C\u002Fp>\n\u003Ch3 id=\"gps-track-map-1\">GPS Track Map\u003C\u002Fh3>\n\u003Cp>\u003Ccode>Latitude\u003C\u002Fcode> and \u003Ccode>Longitude\u003C\u002Fcode> keep their names, so the GPS Track Map works immediately.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"coming-soon\">Coming Soon\u003C\u002Fh2>\n\u003Cp>The following ECU formats are planned for future releases:\u003C\u002Fp>\n\u003Ch3 id=\"aem\">AEM\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>AEM Infinity\u003C\u002Fli>\n\u003Cli>AEM EMS\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"maxxecu\">MaxxECU\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>MaxxECU log files\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"motec\">MoTeC\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>MoTeC M1 series\u003C\u002Fli>\n\u003Cli>MoTeC i2 exports\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"requesting-new-format-support\">Requesting New Format Support\u003C\u002Fh2>\n\u003Cp>If your ECU system isn&#39;t supported:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Open an issue on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FSomethingNew71\u002FUltraLog\u002Fissues\" rel=\"noopener\">GitHub\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>Include:\u003Cul>\n\u003Cli>ECU system name and model\u003C\u002Fli>\n\u003Cli>Software version used for logging\u002Fexport\u003C\u002Fli>\n\u003Cli>A sample log file (if possible)\u003C\u002Fli>\n\u003Cli>Documentation links (if available)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Ch2 id=\"trademark-notice\">Trademark Notice\u003C\u002Fh2>\n\u003Cp>UltraLog is an independent, open-source project created for \u003Cstrong>interoperability purposes\u003C\u002Fstrong>. All ECU system names and trademarks mentioned on this page are property of their respective owners.\u003C\u002Fp>\n\u003Cp>UltraLog is not affiliated with, endorsed by, or sponsored by any of these companies or projects. Product names are used solely for identification and interoperability purposes.\u003C\u002Fp>\n\u003Cp>For full legal information, see \u003Ca href=\"\u002Fdocs\u002Flegal\">Legal\u003C\u002Fa>.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"next-steps\">Next Steps\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"\u002Fdocs\u002Fgetting-started\">Getting Started\u003C\u002Fa> - Start using UltraLog\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fdocs\u002Fuser-guide\">User Guide\u003C\u002Fa> - Complete feature reference\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fdocs\u002Funit-conversion\">Unit Conversion\u003C\u002Fa> - Configure display units\u003C\u002Fli>\n\u003C\u002Ful>\n",[61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127],{"id":62,"text":63},"quick-compatibility-reference","Quick Compatibility Reference",{"id":65,"text":66},"haltech","Haltech",{"id":68,"text":69},"ecumaster-emu-pro","ECUMaster EMU Pro",{"id":71,"text":72},"romraider","RomRaider",{"id":74,"text":75},"speeduino--rusefi","Speeduino \u002F rusEFI",{"id":77,"text":78},"format-auto-detection","Format Auto-Detection",{"id":80,"text":81},"aim","AiM",{"id":83,"text":84},"link-ecu","Link ECU",{"id":86,"text":87},"emerald-ecu","Emerald ECU",{"id":89,"text":90},"megasquirt--honda-tuning-studio---full-support","MegaSquirt \u002F Honda Tuning Studio - Full Support",{"id":92,"text":93},"tunerstudio-msl---full-support","TunerStudio MSL - Full Support",{"id":95,"text":96},"woolich-racing-tuned---full-support","Woolich Racing Tuned - Full Support",{"id":98,"text":99},"racechrono---full-support","RaceChrono - Full Support",{"id":101,"text":102},"mhd-tuning---full-support","MHD Tuning - Full Support",{"id":104,"text":105},"bluedriver-obd-ii---full-support","BlueDriver OBD-II - Full Support",{"id":107,"text":108},"motorsport-electronics---full-support","Motorsport Electronics - Full Support",{"id":110,"text":111},"dynamicefi---full-support","DynamicEFI - Full Support",{"id":113,"text":114},"locomotive---full-support","Locomotive - Full Support",{"id":116,"text":117},"torque-pro---full-support","Torque Pro - Full Support",{"id":119,"text":120},"coming-soon","Coming Soon",{"id":122,"text":123},"requesting-new-format-support","Requesting New Format Support",{"id":125,"text":126},"trademark-notice","Trademark Notice",{"id":128,"text":129},"next-steps","Next Steps","https:\u002F\u002Fgithub.com\u002FClassicMiniDIY\u002FUltraLog\u002Fwiki\u002FSupported-ECU-Formats\u002F_edit","https:\u002F\u002Fgithub.com\u002FClassicMiniDIY\u002FUltraLog\u002Fwiki\u002FSupported-ECU-Formats",1792894561016]