Skip to content

Release v2.15.0 — lambda delay and acceleration enrichment table generators - #92

Merged
SomethingNew71 merged 7 commits into
mainfrom
dev
Sep 18, 2026
Merged

SomethingNew71 merged 7 commits into
mainfrom
dev

Conversation

@SomethingNew71

Copy link
Copy Markdown
Collaborator

Release PR for v2.15.0: everything on dev since 2.14.1. Merge #91 into dev first; this PR picks it up automatically.

Summary

Tuning table generators (#3, #4 — via #90 and #91)

Two new top-level tools beside Log Viewer / Scatter Plots / Histogram (Cmd+4 / Cmd+5):

  • Lambda Delay — injector pulse-width steps → first wideband crossing of a noise-scaled threshold, binned RPM × load (MAP or TPS). Dead time primary, T63 secondary. Gates for steady operating point, event spacing, PW floor, fuel cut, clutch, coolant, closed-loop movement, invalid samples. Strict / relaxed profiles, injector dead-time parameter. Exports in ms, engine cycles or ignition events.
  • Accel Enrichment — tip-ins from a native throttle-rate channel (scale detected) or a computed derivative; lambda window shifted by the session's lambda-delay cell or an assumed delay; signed excursion depth, duration, area vs target; suggested starting correction, labelled additional when an ECU AE-activity channel is mapped so one cell never mixes kinds.
  • Shared framework in src/analysis/tables/: sample-and-hold update-instant interpolation for CAN widebands, Haltech i32 sentinel masking, ragged-log refusal, per-load-nonce log identity, per-cell median + MAD + confidence tiers, multi-log accumulation with add/remove, axis cap of 64 bins.
  • Setup in the Tool Properties panel, heatmap + event inspector with jump-to-time in the central panel. State is app-level so tables survive tab and tool switches.
  • Export: CSV (value / count / MAD grids), clipboard TSV, PNG, PDF — all through one cell_value path so blanking and unit conversion agree.
  • Normalization: injector on-time names → Pulse Width; TPS DOT / Throttle Position Derivative / TPS Delta → new TPS Rate.
  • 15 locales.

Version + docs

  • Cargo.toml / Cargo.lock / README shield → 2.15.0
  • ultralog.co: two What's New cards, JSON-LD softwareVersion / releaseNotes / featureList, hero badge, meta description and keywords, sitemap
  • CLAUDE.md: Table Generators contracts (tools not a window, app-level state, PNG has no text, update-instant interpolation, sentinel masking, alignment, log identity, lambda→AE composition, axis cap, auto-suggestion)
  • Wiki: new Tuning-Table-Generators page, User-Guide tools list and shortcut table, sidebar (already pushed)

Not in this release

MCP tools for the generators, on-disk per-ECU mapping presets, cross-correlation mode (all listed under Phase 3 on #4).

Test plan

  • 68 unit tests in src/analysis/tables/ and src/ui/table_* including synthetic ground truth across 10–100 Hz logs and 10 Hz sensors inside 100 Hz logs; 11 fixture tests against rusEFI, Link, Haltech and MegaSquirt logs; ActiveTool shortcut-order contract.
  • cargo fmt --check, cargo clippy --all-targets --all-features -D warnings, cargo test --all-features, cargo doc --no-deps clean.
  • After merge: tag v2.15.0 so the release workflow builds the binaries.

Barneyjm and others added 7 commits September 18, 2026 13:35
…tors (#3, #4) (#90)

* feat(analysis): add table generators for lambda delay (#4) and accel enrichment (#3)

Adds src/analysis/tables/: a sibling TableAnalyzer trait for generators
whose output is a 2-D tuning table rather than one value per timestamp,
with robust statistics (median/MAD, update instants, effective update
interval), edge-list axes with lower-edge-inclusive binning and
confidence tiers, channel roles with three-tier auto-suggestion, event
primitives (sentinel masking, steadiness gates, sample-and-hold aware
crossing interpolation, rate runs), an accumulator that folds several
logs into one grid and re-bins per measure, and CSV/clipboard export.

Lambda delay: injector pulse-width steps to the first wideband crossing
of max(k*sigma, min_delta), gated on steady RPM/load, spacing, fuel cut,
clutch, coolant and closed-loop movement; dead time primary, t63
secondary; strict/relaxed profiles; ms, engine cycles or ignition events
on export.

Accel enrichment: tip-ins from a native throttle-rate channel (scale
detected) or a computed TPS/MAP derivative, AFR window shifted by a
session lambda-delay cell or an assumed delay, signed excursion depth,
duration and area against target or baseline, suggested starting
correction clamped, "additional" kind when an ECU AE-activity role is
mapped.

Synthetic ground-truth tests cover 10-100 Hz logs, 10 Hz sensors inside
100 Hz logs, noise, AFR vs lambda input, every rejection reason, ragged
logs, and lambda-delay to AE composition. LoadedFile gains a per-load
nonce so accumulated events never key on a file index; the histogram's
cell math now shares binning::uniform_bin.

Claude-Session: https://claude.ai/code/session_01VFsMnFcGNJfTPz6QBiEEUN

* feat(normalize): map injector on-time and throttle-rate channel names

Injector 1 On Time, Injection Stage 1 Average Injection Time, Injection
Effective/Actual PW, Fuel: Last inj pulse width, Base PW and
INJ Duration(ms) now normalize to Pulse Width; TPS DOT, Throttle
Position Derivative and TPS Delta to a new TPS Rate canonical, so the
table generators' auto-suggestion resolves them outright.

Claude-Session: https://claude.ai/code/session_01VFsMnFcGNJfTPz6QBiEEUN

* test(analysis): table generator fixtures against MegaSquirt, Haltech, rusEFI logs

Auto-suggestion regression on all three, driving-log rejection
breakdown and low-rate warning on MegaSquirt, sentinel masking and the
strict >= 90 % rejection on the Haltech blip log, tip-in detection
checked against Haltech's Transient Throttle Load Derivative and
rusEFI's Fuel: TPS AE Active, AE events binned and exported, lambda
delay grid feeding AE, and a timing guard on the 88 MB Haltech log when
present.

Claude-Session: https://claude.ai/code/session_01VFsMnFcGNJfTPz6QBiEEUN

* feat(ui): add table generator window with heatmap, inspector and export

Tools panel gains a Table Generators section opening a window with
setup (auto-suggested channel roles with ambiguity flags, editable axis
edges, parameter grid, gating profile), a Viridis heatmap with value
text and confidence-coloured count badges, hover tooltips, a per-cell
event inspector with jump-to-time, add/remove log, reset, measure
selector, CSV export and tab-separated clipboard copy. Strings under
table_gen.* in all 15 locales.

Claude-Session: https://claude.ai/code/session_01VFsMnFcGNJfTPz6QBiEEUN

* docs: describe the table generators and record implementation notes

Brings the 2026-07-16 design doc onto main with an implementation-notes
section, adds the Table Generators contracts to CLAUDE.md and the
feature to the README.

Claude-Session: https://claude.ai/code/session_01VFsMnFcGNJfTPz6QBiEEUN

---------

Co-authored-by: Claude <noreply@anthropic.com>
…vel tools

- ActiveTool gains LambdaDelay and AccelEnrich, plus ALL (switcher, View
  menu and Cmd+1..5 order) and generator_kind() for the shared match sites
- table_generator.rs splits the floating window into a Tool Properties
  setup panel and a central results view; state stays app-level so the
  multi-log accumulators survive tab and tool switches
- set_active_tool() is the single tool-switch entry point (analytics,
  selection reset); Jump lands on Log Viewer at the event's time
- tools panel section becomes two tool buttons with status lines
- table_export.rs: pure renderers over TableAccumulator sharing
  tables::export::cell_value with CSV, so all exports blank and convert
  identically; PDF carries values, counts and axis labels, PNG is cells
  and grid lines (no font rasterizer in the crate)
- wired into Cmd+E, the File > Export submenu and the Tools panel
- guards a missing measure list instead of panicking
- last_error is per generator so a failed Lambda Delay run no longer
  shows under Accel Enrichment
- Jump reopens a closed tab via switch_to_file_tab instead of no-op
- table PNG/PDF export checks for a table before the save dialog
- IPC show_chart / show_scatter_plot go through set_active_tool
- PDF axis edges reuse the CSV fmt_edge so both agree
- tests: PNG row order pixel probe, exclude_low and unit-conversion
  paths, measure_index clamp, clear_selection
… site

- Cargo.toml, README shield, JSON-LD softwareVersion, hero badge, and
  releaseNotes tag all move to 2.15.0
- What's New: Lambda Delay Tables and Accel Enrichment Tables cards lead
  the grid
- SEO: meta description, keywords, JSON-LD description and featureList
  mention the table generators
- Sitemap lastmod refreshed
feat(tables): promote lambda delay and accel enrichment to top-level tools, add PNG/PDF export, release 2.15.0
@SomethingNew71
SomethingNew71 merged commit 2cb08ac into main Sep 18, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants