Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 21 additions & 5 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,8 @@ src/
├── settings_panel.rs # Consolidated settings (display, units, normalization, updates)
├── tool_properties_panel.rs # Dynamic panel showing controls for the active tool (channels / histogram / scatter)
├── analysis_panel.rs # Window for running analysis algorithms (src/analysis) on the active log
├── table_generator.rs # Table generator window (setup / heatmap results / event inspector / export)
├── table_generator.rs # Table tools: Tool Properties setup + central heatmap / inspector view
├── table_export.rs # PNG / PDF export for generated tables (pure renderers + app wrappers)
├── data_panel.rs # Right-side data panel hosting DataWidget panes (rail, header, hide/restore)
├── widgets/
│ ├── mod.rs # DataWidget trait + static widget registry
Expand All @@ -145,7 +146,7 @@ src/
├── toast.rs # Toast notification system
├── icons.rs # Custom icon drawing utilities
├── tab_bar.rs # Multi-file tab interface
├── tool_switcher.rs # Switch between Log Viewer, Scatter Plot, and Histogram tools
├── tool_switcher.rs # Switch between the five tools (ActiveTool::ALL)
├── scatter_plot.rs # XY scatter plot visualization
├── histogram.rs # 2D histogram/heatmap view for channel distributions
├── export.rs # PNG and PDF export functionality
Expand Down Expand Up @@ -291,6 +292,21 @@ low cells are never interpolated and export blank.
- **Axis cap** - `binning::MAX_BINS_PER_AXIS` (64) keeps any future MCP payload well under the
512 KiB response guard. `histogram.rs` now calls `binning::uniform_bin` for its cell math so both
tools agree on boundaries.
- **Tools, not a window** - `ActiveTool::LambdaDelay` / `ActiveTool::AccelEnrich` render like
Histogram: setup in the Tool Properties panel (`render_table_tool_properties`), results in the
central panel (`render_table_tool_view`). `ActiveTool::generator_kind()` is the one helper the
match sites use, and `ActiveTool::ALL` fixes the switcher / View-menu / Cmd+1..5 order, so a new
tool is appended there and nowhere else. Tool switches go through `UltraLogApp::set_active_tool`
(analytics + table selection reset), not direct assignment.
- **State is app-level, not per-tab** - unlike `Tab::histogram_state`, `UltraLogApp::table_generator`
holds the accumulators, mappings and export options for both generators. The tables are
multi-log by design, so the active tab only decides which file *Run / Add current file* reads;
switching tabs or tools does not lose a table.
- **PNG has no text** - the crate has no font rasterizer, so `table_export::render_table_png`
draws cells and grid lines only (same as the histogram PNG). `render_table_pdf` draws values,
counts and axis labels with built-in Helvetica, whose encoding turns `~` into an arrow, so the
confidence markers are `*` (medium) and `?` (low). Both go through `tables::export::cell_value`
so PNG, PDF, CSV and clipboard blank the same cells and convert delay units identically.
- **Auto-suggestion** (`channel_map::suggest_mapping`) - normalization hit (100) → strong name
hints (50) → spec category + hint (60) → generic hints (40), then a data-plausibility veto on the
channel median; `overall|avg|average` names lose 10 points so a single sensor beats an averaged
Expand Down Expand Up @@ -372,7 +388,7 @@ UI rendering is split into focused modules that implement methods on `UltraLogAp
- **`toast.rs`** - Toast notification overlay for user feedback
- **`icons.rs`** - Custom icon drawing (upload icon for drop zone)
- **`tab_bar.rs`** - Chrome-style tabs for multi-file support
- **`tool_switcher.rs`** - Switch between Log Viewer, Scatter Plot, and Histogram tools
- **`tool_switcher.rs`** - Switch between the five tools in `ActiveTool::ALL` (Log Viewer, Scatter Plot, Histogram, Lambda Delay, Accel Enrichment)
- **`scatter_plot.rs`** - XY scatter plot for channel correlation analysis
- **`histogram.rs`** - 2D histogram/heatmap view of channel distributions, with configurable cell coloring (average Z-value or hit count)
- **`export.rs`** - PNG and PDF export with chart rendering
Expand Down Expand Up @@ -553,7 +569,7 @@ The Track Map widget can draw map tile backgrounds. Tiles are **opt-in** (off by
- **Multi-ECU Support** - Haltech, ECUMaster, RomRaider, Speeduino, rusEFI, AiM, Link, Emerald, MegaSquirt, TunerStudio MSL, MHD Tuning, Motorsport Electronics, RaceChrono, Woolich Racing Tuned, BlueDriver, DynamicEFI, and Locomotive log formats
- **Computed Channels** - Create virtual channels from mathematical formulas with time-shifting (e.g., `RPM[-1]`, `Boost@-0.5s`)
- **Analysis Algorithms** - AFR/Lambda drift and zone detection, derived metrics (VE, injector duty cycle), signal filters, and descriptive statistics (`src/analysis/`)
- **Table Generators** - Lambda delay and acceleration enrichment tuning tables mined from one or more logs, with auto-suggested channel roles, confidence-tiered cells, an event inspector, and CSV/clipboard export (`src/analysis/tables/`, `src/ui/table_generator.rs`)
- **Table Generators** - Lambda delay and acceleration enrichment tuning tables mined from one or more logs, each a top-level tool beside Histogram, with auto-suggested channel roles, confidence-tiered cells, an event inspector, and CSV/clipboard/PNG/PDF export (`src/analysis/tables/`, `src/ui/table_generator.rs`, `src/ui/table_export.rs`)
- **GPS Track Map** - Right-side data panel with a track map: lap detection, channel-colored polyline (Viridis/Turbo with editable range), hover-scrub/click-seek cursor sync, and opt-in Esri/OSM tile backgrounds (`src/ui/widgets/track_map.rs`, `src/tiles.rs`, `src/laps.rs`). GPS coordinate encodings are auto-detected and normalized to decimal degrees (`GpsCoordSpec` in `src/laps.rs`): NMEA `DDMM.mmmm`, milli/micro/1e-7-scaled integer degrees, and 0-360 longitude. Detection is conservative - values already in valid degree ranges are never transformed, and radians are deliberately not detected (ambiguous with genuine near-equator degree tracks).
- **Claude Desktop / MCP Integration** - Embedded MCP server (`src/mcp/`) lets Claude control the running app over `http://localhost:52385/mcp` — select channels, add computed channels, query log data
- **Unit Preferences** - Users can select display units for temperature, pressure, speed, distance, fuel economy, volume, flow rate, and acceleration
Expand All @@ -578,7 +594,7 @@ Handled in `UltraLogApp::handle_keyboard_shortcuts` (`src/app.rs`); ignored whil
- **Cmd/Ctrl+O** - Open file
- **Cmd/Ctrl+W** - Close current tab
- **Cmd/Ctrl+,** - Open Settings panel
- **Cmd/Ctrl+1/2/3** - Switch tool (Log Viewer / Scatter Plot / Histogram)
- **Cmd/Ctrl+1..5** - Switch tool, in `ActiveTool::ALL` order (Log Viewer / Scatter Plot / Histogram / Lambda Delay / Accel Enrichment)
- **Cmd/Ctrl+Shift+F/C/T** - Switch side panel (Files / Tool Properties / Tools)
- **Arrow Left/Right** - Step cursor one record (Shift = 10 records)
- **Home/End** - Jump cursor to start/end of log
Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "ultralog"
version = "2.14.1"
version = "2.15.0"
edition = "2024"
# egui/eframe 0.36 is the binding constraint on the minimum supported Rust
# version; edition 2024 itself only needs 1.85.
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ A high-performance, cross-platform ECU log viewer written in Rust.

![CI](https://github.com/ClassicMiniDIY/UltraLog/actions/workflows/ci.yml/badge.svg)
![License](https://img.shields.io/badge/license-AGPL--3.0-blue.svg)
![Version](https://img.shields.io/badge/version-2.14.1-green.svg)
![Version](https://img.shields.io/badge/version-2.15.0-green.svg)

---

Expand Down Expand Up @@ -79,7 +79,7 @@ Configurable units for 8 measurement categories:
- **Scatter Plot** - XY scatter visualization for channel correlation analysis
- **Histogram** - 2D heatmap visualization with configurable grid sizes (10x10 to 25x25) for analyzing channel distributions
- **MCP Server** - Built-in Model Context Protocol server lets Claude Desktop (or any MCP client) control UltraLog — load files, select channels, get stats, create computed channels, and run analysis via `http://localhost:52453/mcp`
- **Table Generators** - Mine logged events into tuning tables (Tools panel → Table Generators):
- **Table Generators** - Mine logged events into tuning tables. Each is a tool tab beside Histogram (⌘4 / ⌘5), with setup in the Tool Properties panel and CSV, clipboard, PNG and PDF export:
- **Lambda Delay Table** - time from injector pulse-width steps to the wideband response, binned by RPM × load, for closed-loop O2 delay tables (ms, engine cycles or ignition events)
- **Acceleration Enrichment Table** - tip-in lean/rich excursion depth, duration and a suggested starting correction, binned by RPM × throttle rate, with lambda-delay compensation from a table generated in the same session
- Auto-suggested channel roles, per-cell sample counts and confidence, multi-log accumulation, event inspector with jump-to-time, CSV export and tab-separated clipboard copy
Expand Down
30 changes: 23 additions & 7 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
<title>UltraLog - Free ECU Log Viewer & Analyzer | Haltech, ECUMaster, Speeduino, AiM & More</title>
<meta name="title" content="UltraLog - Free ECU Log Viewer & Analyzer | Haltech, ECUMaster, Speeduino, AiM & More">
<meta name="description"
content="UltraLog is a free, open-source ECU datalog viewer built with Rust. Analyze logs from Haltech, ECUMaster, RomRaider, Speeduino, rusEFI, AiM, Link, Emerald, BlueDriver, MegaSquirt, TunerStudio MSL, MHD, Woolich, and RaceChrono lap-timing sessions. Features include stacked plot areas, histogram heatmaps, scatter plots, computed channels, MCP server for AI integration, and professional analysis tools. Download for Windows, macOS, and Linux.">
content="UltraLog is a free, open-source ECU datalog viewer built with Rust. Analyze logs from Haltech, ECUMaster, RomRaider, Speeduino, rusEFI, AiM, Link, Emerald, BlueDriver, MegaSquirt, TunerStudio MSL, MHD, Woolich, and RaceChrono lap-timing sessions. Features include lambda delay and acceleration enrichment table generators, stacked plot areas, histogram heatmaps, scatter plots, computed channels, MCP server for AI integration, and professional analysis tools. Download for Windows, macOS, and Linux.">
<meta name="keywords"
content="ECU log viewer, datalog analyzer, Haltech NSP, ECUMaster EMU Pro, RomRaider, Speeduino MLG, rusEFI, AiM XRK DRK, Link ECU LLG, Emerald K6 M3D, automotive tuning software, engine tuning, AFR analysis, boost log, free tuning software, open source ECU, car data logger, dyno analysis, motorsport data, fuel map analysis, ignition timing, lambda analysis, volumetric efficiency, injector duty cycle, Butterworth filter, scatter plot, histogram heatmap, computed channels, Rust application, stacked plots, MCP server, Model Context Protocol, Claude Desktop, BlueDriver OBD-II, AI log analysis, RaceChrono CSV, TunerStudio MSL, RealDash log, lap timing analysis, track day data, GPS track map">
content="ECU log viewer, datalog analyzer, Haltech NSP, ECUMaster EMU Pro, RomRaider, Speeduino MLG, rusEFI, AiM XRK DRK, Link ECU LLG, Emerald K6 M3D, automotive tuning software, engine tuning, AFR analysis, boost log, free tuning software, open source ECU, car data logger, dyno analysis, motorsport data, fuel map analysis, ignition timing, lambda analysis, volumetric efficiency, injector duty cycle, Butterworth filter, scatter plot, histogram heatmap, computed channels, Rust application, stacked plots, MCP server, Model Context Protocol, Claude Desktop, BlueDriver OBD-II, AI log analysis, RaceChrono CSV, TunerStudio MSL, RealDash log, lap timing analysis, track day data, GPS track map, lambda delay table, O2 delay table, acceleration enrichment, accel enrichment table, transient fuel tuning">
<meta name="author" content="Cole Gentry">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
<meta name="googlebot" content="index, follow">
Expand Down Expand Up @@ -107,13 +107,13 @@
"@type": "SoftwareApplication",
"name": "UltraLog",
"alternateName": ["UltraLog ECU Viewer", "UltraLog Datalog Analyzer"],
"description": "A high-performance, cross-platform ECU log viewer and analyzer built with Rust. Supports Haltech, ECUMaster, RomRaider, Speeduino, rusEFI, AiM, Link, Emerald, MegaSquirt, TunerStudio MSL, MHD, Motorsport Electronics, RaceChrono, Woolich, BlueDriver, DynamicEFI, and Locomotive log formats with advanced analysis tools.",
"description": "A high-performance, cross-platform ECU log viewer and analyzer built with Rust. Supports Haltech, ECUMaster, RomRaider, Speeduino, rusEFI, AiM, Link, Emerald, MegaSquirt, TunerStudio MSL, MHD, Motorsport Electronics, RaceChrono, Woolich, BlueDriver, DynamicEFI, and Locomotive log formats with advanced analysis tools, including lambda delay and acceleration enrichment table generators.",
"url": "https://ultralog.co/",
"applicationCategory": "UtilitiesApplication",
"applicationSubCategory": "Automotive Software",
"operatingSystem": ["Windows 10", "Windows 11", "macOS", "Linux"],
"softwareVersion": "2.14.1",
"releaseNotes": "https://github.com/ClassicMiniDIY/UltraLog/releases/tag/v2.14.1",
"softwareVersion": "2.15.0",
"releaseNotes": "https://github.com/ClassicMiniDIY/UltraLog/releases/tag/v2.15.0",
"downloadUrl": "https://github.com/ClassicMiniDIY/UltraLog/releases/latest",
"installUrl": "https://github.com/ClassicMiniDIY/UltraLog/releases/latest",
"screenshot": [
Expand Down Expand Up @@ -147,6 +147,8 @@
},
"featureList": [
"Multi-channel time series visualization",
"Lambda delay table generator",
"Acceleration enrichment table generator",
"2D histogram heatmaps",
"XY scatter plot analysis",
"Computed math channels with formulas",
Expand Down Expand Up @@ -1427,7 +1429,7 @@ <h1 id="hero-heading" class="tagline" itemprop="headline">Unlock Your Performanc
<div class="hero-badges">
<span class="version-badge">
<span class="new-tag">New</span>
v2.14.1
v2.15.0
</span>
<a href="https://github.com/ClassicMiniDIY/UltraLog" class="opensource-badge" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-github" aria-hidden="true"></i> Open Source
Expand Down Expand Up @@ -1530,8 +1532,22 @@ <h3>Computed Math Channels</h3>
<!-- What's New -->
<section class="whats-new-section">
<h2>What's New</h2>
<p class="section-subtitle">TunerStudio MSL imports, RaceChrono lap-timing sessions, GPS track maps with satellite imagery, stacked plots, AI-powered analysis via MCP, and more</p>
<p class="section-subtitle">Lambda delay and acceleration enrichment table generators, TunerStudio MSL imports, RaceChrono lap-timing sessions, GPS track maps, AI-powered analysis via MCP, and more</p>
<div class="new-features-grid">
<div class="new-feature-card">
<div class="feature-header">
<div class="feature-icon cyan"><i class="fa-solid fa-stopwatch" aria-hidden="true"></i></div>
<h3>Lambda Delay Tables</h3>
</div>
<p>A new tool that mines your logs for injector pulse-width steps and measures how long the wideband takes to respond, binned by RPM and load. Every cell carries a sample count and confidence, sparse cells stay blank, and the result exports as CSV, clipboard, PNG or PDF in milliseconds, engine cycles or ignition events — ready for your ECU's closed-loop O2 delay table.</p>
</div>
<div class="new-feature-card">
<div class="feature-header">
<div class="feature-icon cyan"><i class="fa-solid fa-gauge-high" aria-hidden="true"></i></div>
<h3>Accel Enrichment Tables</h3>
</div>
<p>Detects tip-ins, shifts the lambda window by the measured delay, and reports the lean or rich excursion against target with a suggested starting correction, binned by RPM and throttle rate. Runs across several logs at once and composes with a lambda delay table generated in the same session.</p>
</div>
<div class="new-feature-card">
<div class="feature-header">
<div class="feature-icon orange"><i class="fa-solid fa-file-lines" aria-hidden="true"></i></div>
Expand Down
2 changes: 1 addition & 1 deletion docs/sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
<url>
<loc>https://ultralog.co/</loc>
<lastmod>2026-09-15</lastmod>
<lastmod>2026-09-18</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
<image:image>
Expand Down
10 changes: 9 additions & 1 deletion i18n/ar.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@ menu:
export_png: "تصدير كـ PNG..."
export_pdf: "تصدير كـ PDF..."
export_histogram_pdf: "تصدير المدرج التكراري كـ PDF..."
export_table_png: "تصدير الجدول كـ PNG..."
export_table_pdf: "تصدير الجدول كـ PDF..."
view: "عرض"
show_grid: "إظهار الشبكة"
tool_mode: "وضع الأداة"
log_viewer: "عارض السجل"
scatter_plots: "المخططات المبعثرة"
histogram: "المدرج التكراري"
lambda_delay: "تأخير لامدا"
accel_enrich: "إثراء التسارع"
side_panel: "اللوحة الجانبية"
files: "الملفات"
channels: "القنوات"
Expand Down Expand Up @@ -170,6 +174,8 @@ toast:
export_failed: "فشل التصدير: %{error}"
histogram_exported_png: "تم تصدير المدرج التكراري كـ PNG"
histogram_exported_pdf: "تم تصدير المدرج التكراري كـ PDF"
table_exported_png: "تم تصدير الجدول كـ PNG (الخلايا فقط؛ استخدم CSV للقيم)"
table_exported_pdf: "تم تصدير الجدول كـ PDF"
scatter_exported_png: "تم تصدير المخطط المبعثر كـ PNG"
scatter_exported_pdf: "تم تصدير المخطط المبعثر كـ PDF"
failed_to_save: "فشل الحفظ: %{error}"
Expand Down Expand Up @@ -354,7 +360,7 @@ table_gen:
section_help: "استخراج الأحداث المسجلة في جداول تأخير لامدا وإثراء التسارع."
load_file_hint: "حمّل ملفًا لإنشاء جداول"
status: "%{logs} سجل(ات)، %{events} أحداث"
window_title: "مولدات الجداول"
configure_hint: "عيّن القنوات في لوحة خصائص الأداة ثم انقر تشغيل."
setup_header: "الإعداد - %{file}"
channels: "القنوات"
auto_detect: "الكشف التلقائي"
Expand Down Expand Up @@ -401,6 +407,8 @@ tools:
log_viewer: "عارض السجل"
scatter_plots: "المخططات المبعثرة"
histogram: "المدرج التكراري"
lambda_delay: "تأخير لامدا"
accel_enrich: "إثراء التسارع"

# Activity bar (src/ui/activity_bar.rs)
activity:
Expand Down
Loading
Loading