OE▸
OE PROTUNETRAINING ECU
{{base.hasTurbo ? 'TURBO' : 'NA'}}
{{!connected ? 'OFFLINE' : (controlling ? 'LIVE' : 'MONITOR')}}
{{!connected ? tr('Offline') : (controlling ? tr('Controlling') : tr('Monitoring'))}} {{storeRequired ? tr('Store Req') : tr('Stored')}}
Monitoring only - live data is shown but your tune is not affecting the car. Hit Connect to control the engine.
{{tr(grp.title)}}
{{tr(it.label)}}
LIVE λ {{t.lambdaActual | number:2}} / tgt {{t.lambdaTarget | number:2}} AFR {{afrLive()}} Smoke {{t.smoke | number:0}}% Knock {{t.knockLevel | number:1}} {{t.rpm | number:0}} rpm
{{tr('Runtime Values')}}
{{tr(panel.title)}}
{{rowLabel(tr(row[0]))}} {{tv(row[1], row[2])}}
{{tr(panel.title)}}
{{rowLabel(tr(row[0]))}} {{tv(row[1], row[2])}}
{{tr('Runtime Gauges')}}
{{tr('Yellow = investigate, red = lift. The values a tuner watches during a pull.')}}
{{tr(g.label)}}{{tv(g.key, g.unit)}}
{{tr('Dyno / AFR')}}
{{tr('Full-throttle pull from low RPM to the limiter. Red = engine (crank) HP, yellow = torque (lb-ft). First pull saves a baseline. Wheel HP is estimated from crank minus drivetrain loss (set it on Limiters to match a real hub-dyno run).')}}
Start gear Start RPM (auto)
Status{{dynoStatus}}
Tip: pull in 3rd gear or higher for comparable numbers - low gears read lower because the engine spins up so fast its own inertia eats torque, exactly like a real inertia dyno.
Baseline (crank){{dynoBasePeak().hp.toFixed(1)}} hp @ {{dynoBasePeak().hpRpm}} | {{dynoBasePeak().tq.toFixed(1)}} lb-ft
This pull (crank){{dynoCurPeak().hp.toFixed(1)}} hp @ {{dynoCurPeak().hpRpm}} | {{dynoCurPeak().tq.toFixed(1)}} lb-ft
≈ wheel HP (-{{(settings.drivetrainLoss||15)}}%){{(dynoCurPeak().hp*(1-(settings.drivetrainLoss||15)/100)).toFixed(1)}} whp
Gain vs baseline{{dynoGain('hp') >= 0 ? '+' : ''}}{{dynoGain('hp').toFixed(1)}} hp ({{dynoGainPct() >= 0 ? '+' : ''}}{{dynoGainPct().toFixed(1)}}%) / {{dynoGain('tq') >= 0 ? '+' : ''}}{{dynoGain('tq').toFixed(1)}} lb-ft
Cursor{{dynoText || 'hover the graph to scrub'}}
Live AFR{{afrText()}}
Wheel power (live est.){{tv('wheelPowerHp','whp')}}
{{tr('Build Card')}}
{{tr('A shareable spec sheet for your build. Do a dyno pull to lock in VERIFIED power, then hit Snapshot Mode and screenshot it to flex on the crew.')}}
{{cardCar()}}
{{build.config || tr('Custom build')}}
{{base.hasTurbo ? 'TURBO' : 'NA'}}
{{cardPower() ? cardPower().hp.toFixed(0) : '--'}}
HP
@ {{cardPower().hpRpm}} rpm
{{cardPower() ? cardPower().tq.toFixed(0) : '--'}}
LB-FT
@ {{cardPower().tqRpm}} rpm
{{!cardPower() ? tr('NO DATA - run a dyno pull') : (cardPower().verified ? tr('DYNO VERIFIED') : tr('RATED - run a dyno to verify'))}}
{{tr('Engine')}}{{cardEngine()}}
{{tr('Induction')}}{{cardInduction()}}
{{tr('Fuel')}}{{cardFuel()}}
{{tr('Block')}}{{cardBlock() ? cardBlock() + ' · ' + cardStrength() : cardStrength()}}
NOS{{cardNos()}}
{{tr('Tune status')}}{{tr(tuneStatus().text)}}
{{tr('Rev limit')}}{{settings.revLimit}} rpm
{{tr('Engine build')}}
{{p.slot}}{{p.name}}
{{tr('Parts list unavailable on this setup')}}
OE PROTUNE {{tr('Tuned on OE ProTune ECU')}}
{{tr('Log Analysis')}}
Samples{{logRows.length}}
Peak knock / lambda{{logStat('knockLevel','max')}} / {{logStat('lambdaActual','max')}}
Min health / Peak IDC{{logStat('engineHealth','min')}}% / {{logStat('injectorDuty','max')}}%
{{tr('Log Navigator')}}
Drag on the lanes to scrub. Drag the window on the Navigator strip to pan; drag its edges to zoom.
Parameter list (at cursor)
{{p.label}}{{p.val}}
Record a log (Connect + drive), then scrub the cursor to read every channel here.
{{tr('Mixture Map')}}
{{tr('After a logged pull, cells show suggested Fuel Main corrections (% ) from lambda error. Red = add fuel, blue = pull fuel.')}}
kPa\RPM{{r}}
{{mp}} {{mixCellText($parent.$index, $index)}}
{{tr('Tune Files')}}
Tune name
Presets
Save slots
Slot {{s.index+1}}: {{s.name}}
Tune library (Save As / Open)
{{e.name}}
Share this tune
Import a shared tune
{{f.name}}
{{tr('Calibration Notes')}}
[{{n.time}}] {{n.txt}}
No notes yet.
{{tr('Tune Compare')}}
No baseline saved.
{{row.label}}{{row.from}}{{row.from!==''?' -> ':''}}{{row.to}}
No differences from baseline.
{{tr('Axis Setup')}}
{{tr('Edit the shared RPM (columns) and MAP/load (rows) breakpoints. 4-12 comma-separated values each.')}}
RPM axis
MAP axis (kPa)
{{tr('Faults / Diagnostics')}}
Engine health{{tv('engineHealth','%')}}
Limp mode{{tv('limpMode')}}
Damage cause{{t.damageReason || 'OK'}}
Active fault codes
No active faults.
{{f}}
{{dtcDefs[f]}}
{{tr('Help')}}
{{help}}
{{tr('Help Me — Tune Doctor')}}
{{diagIntro()}}
{{d.title}}
{{d.advice}}
Naturally aspirated engine — the Boost table has no effect on this car.
Amt
{{axisUnit()}}\RPM{{r}}
{{axisLab(mp)}} {{ showDelta && baselineMap ? (cellDelta($parent.$index,$index)>=0?'+':'') + cellDelta($parent.$index,$index).toFixed(1) : fmtCellU(curMap()[$parent.$index][$index]) }}
Selected cell
{{axisLab(selInfo().map)}} {{axisUnit()}} / {{selInfo().rpm}} rpm
Value: {{fmtCellU(selInfo().val)}} {{cellUnitU()}}
Selection: {{selCount()}} cells
Hint
{{riskHint()}}
Surface
{{tr(pageDef().title)}}
{{tr(pageDef().help)}}
{{tr(ctrl.label)}}{{getNum(ctrl.key) | number:(ctrl.step<1?2:0)}}{{ctrl.fmt}}{{slDisp(ctrl)}}
{{tr(ctrl.label)}}: {{settings[ctrl.key] ? 'ON' : 'OFF'}}
{{tr(ctrl.label)}}
{{tr(ctrl.label)}}{{tv(ctrl.tkey, ctrl.unit, ctrl.digits)}}
{{ctrl.text}}
{{tutTitle()}}Step {{tutProgress()}}
{{tutStepText()}}
{{carName || 'No vehicle'}} Tune: {{tuneName}} RPM {{tv('rpm')}} λ {{tv('lambdaActual')}} Knock {{tv('knockLevel')}} {{storeRequired ? 'STORE REQUIRED' : 'STORED'}}
{{toast}}
Welcome to OE ProTune
New to tuning? Pick a chapter - each is a short set of step-by-step lessons that guide you and highlight what to click. {{lessonsDone()}}/{{lessons.length}} complete
{{ch.title}}{{ch.doneN}}/{{ch.total}}
{{ch.total}} lessons
{{chapters[tutChapter].title}}
{{ls.done ? '✓' : '▶'}} {{lTitle(ls)}}{{ls.difficulty}}
{{lDesc(ls)}}