v0.9.99
Pre-release
Pre-release
Highlights
The module view is now INPA itself. Every ECU screen is drawn by executing BMW's own .IPO script live in the browser (screens/ipo-runtime.js), the same bytecode INPA runs. inpainit identifies the module and names the root menu, each F-key runs its own script body, each screen sends its own jobs on INPA's own cycle. The derived "IR" renderer, its heuristics and the offline browsing mode are gone: what you see is what INPA would show, key for key.
Live .IPO runtime
- Menus, screens, key legends, title bars and Shift rows exactly as the script prints them. INPA layout mode is the bare text grid; modern mode groups the same cells into rows, tiles, lamps and zoned bars (scale, min/max marks, live value).
- Fault memory: numbered result sets (short list, detail, freeze frames), logical LINE bands,
Select/Deselectline filters,Print screen. - Activations and guided procedures:
%STATEmachines run live (setstate, timers, polls), togglelist component pickers (single and multi-select), quit-mode message boxes, INPA'sinputint/inputhex/inputdigitalprompts and the OK/Cancel confirm box. Verified on a real E46: ZKE5 and SHD46 activations, LSZ selection, IHKA status, MS45 rough running and switch lamps. - Scriptchange chains are followed (KLIMA_5B hands an IHKA46_3 to IHKA46.IPO), by-reference parameters, unary minus,
longtoreal, numericinttolong/bytetoint, bound-awarenumconvert, per-run step budgets, keypresses queued while a job is on the wire. - Opening a module never prompts. Only actions the user takes ask for confirmation, once per action.
- No cable: the script's first job fails and the view says "No adapter connected" with a Back key. A silent module shows the script's own "Program will be stopped" plus the group probe's verdict.
Translations: exact dictionaries only
- The
deGermanword-rule table is deleted. Captions translate through per-ECU dictionaries (data/inpa-i18n/<ECU>.json) and a generated shared table of INPA chrome; runtime SGBD text (*_TEXT, fault locations, P-codes, freeze-frame labels and enum values) through the fault and environment dictionaries. Anything without an entry shows exactly as BMW wrote it. - Key legends keep their key and translate the caption; padded captions keep their column.
tools/decompile/ipo_i18n.js --gapslists what is still untranslated. - The IR corpus was regenerated with the current decoder.
Vehicle identity
- The EWS stored odometer (KD block 0) is read and shown beside the cluster odometer.
- Fix: the EWS odometer job is matched by name, so it is found on every EWS variant.
Remote diagnostics
- The host approves each user action once, not every job it sends; approvals expire after 15 minutes.
- The helper sees a full-screen "Waiting for the host to accept your request" card; a refusal reads "The host rejected your request".
- Helper and host must run the same version to connect.
- Fix: a backgrounded host tab throttled every bus wait to one second, so remote reads took 5 to 8 seconds. All bus timing now runs on a worker-backed timer and is unaffected by tab focus.
- The host's own module screens pause while a helper drives, so the helper's reads are not queued behind them.
Removed
- Demo mode.
- The WiFi / THOR transport option (K+DCAN over Web Serial only).
- The auto-connect setting (the cable always reconnects).
- The derived IR renderer (
screens/ir.js4614 lines to about 210),?ir=1, theliveIposetting and the four tests that pinned it.
Verification
- New
test_ir_i18n.js(exact-dictionary captions) and a 41-checktest_ipo_runtime.js(fake wire, exact job sequences, painted cells, scriptchange hop) run in CI before every deploy. - Real-car verified on an E46 325i over K+DCAN: MS45 fault lists and freeze frames, lamps and bars, SHD46 and ZKE5 activations, LSZ multi-select, IHKA status, the remote helper flow end to end.
What's Changed
- Live .IPO runtime as the module view; EWS odometer; exact-only i18n (0.9.99) by @dader34 in #117
- Pages: replace the deleted renderer tests in the verify step by @dader34 in #118
Full Changelog: v0.9.98...v0.9.99
Complete offline build (6.2G)
Everything above plus the ETK parts catalogue for every chassis, too large for a GitHub release asset: