EcuPulse is a free Subaru telemetry logger and diagnostics tool with an optional Wear OS companion. It communicates through a compatible OBDLink/STN adapter or Tactrix USB cable, displays available ECU channels, records sessions and highlights configured events. Channel availability depends on the ECU, firmware, definitions and adapter. Alarms and unflagged logs do not establish that an engine or tune is safe. This manual describes the intended Play workflows; public release remains subject to the release audit and physical validation.
EcuPulse does not flash or edit a tune. Explicit diagnostic actions can clear codes or reset ECU learning and readiness. Save diagnostic evidence before using them. Set up the app while parked, let a passenger handle the device on the road, and perform acceleration tests only on a closed course.
With matching SSM definitions, EcuPulse can read channels such as feedback knock correction (FBKC), fine learning knock correction (FLKC), Dynamic Advance Multiplier (DAM) or Ignition Advance Multiplier (IAM), knock counters, fuel trims, A/F learning and boost target. The learned FLKC table needs its own supported definition and read operation. These are possible capabilities, not a universal channel list: a supported connection can still lack particular channels. See the Glossary at the end for what each one means.
There is no EcuPulse account, analytics SDK or developer telemetry backend. Recordings are stored on your device; optional Wear synchronization can use Google's encrypted cloud relay, and Android can back up or transfer preferences, including saved snapshots. Export important logs before uninstalling; CSV files and imported definitions are excluded from automatic backup. See the full privacy policy.
The first time EcuPulse opens it plays a five-page tour: what the app does, the two worlds of DRIVE and GARAGE, how a pull records itself, a permissions primer, and a CONNECT MY CAR button that takes you to the connect screen. SKIP leaves it at any time; replay it later from SETUP ▸ ABOUT ▸ HELP. After the tour, each screen shows a one-time hint card the first time you open it. RESET FIRST-VISIT HINTS in the same place brings them back.
Permissions are requested for the feature that uses them. Denial limits that feature: Bluetooth telemetry needs nearby-device access, video needs camera access, recorded sound and voice need microphone access, and GPS comparison needs precise location. Timing and CSV logging do not require camera permission.
| Permission | Why | When asked |
|---|---|---|
| Nearby devices (Bluetooth) | Talk to your paired OBD adapter. No adapter, no data. | The tour's GRANT chip, or the first visit to CONNECT |
| Notifications | Show the ongoing notification Android requires while a log keeps running with the screen off | When your first pull records |
| Microphone | Voice commands (recognized on the device, never stored or sent) and sound in your own videos | When you turn on voice, or start a video with REC AUDIO on |
| Camera | The video viewfinder and optional recording | When you open the viewfinder, or use START RUN with run video on |
| Location (GPS) | Verify performance runs against GPS speed; choose Precise, approximate location cannot verify a run. No route is saved, nothing is uploaded | The first time you tap START RUN |
EcuPulse never scans for Bluetooth devices. Pair your OBDLink once in Android's Bluetooth settings, with the adapter plugged into the car's OBD port and the ignition on, and it then appears on the app's CONNECT screen. The adapter card lists paired devices whose names look like STN adapters (OBDLink, STN, MX+ and similar); if nothing matches, it lists every paired device with a NO NAME MATCH hint so an unusually named adapter can still be picked. With no adapter paired at all, the screen reads NO ADAPTER YET. and offers OPEN BLUETOOTH SETTINGS.
A Tactrix Openport 2.0 needs no pairing: plug it into the car and into your phone with a USB-OTG cable, allow Android's USB access prompt, and the app starts connecting by itself the moment the cable is attached.
Open CONNECT and tap your adapter. The link ladder climbs through SCANNING, CONNECTING, HANDSHAKE (SSM init and the ROM ID read) and STREAMING, where it shows the live sample rate. The vehicle card then fills in with the car's name, ROM ID, VIN, a parameter count, and a knock badge:
| Badge | Meaning |
|---|---|
KNOCK: FULL SSM | Matching enhanced knock definitions are available; still check that the channels you need supply live data |
KNOCK: ROM NOT IN DEFS | No exact matching enhanced definition is available; import a trusted definition for this specific ROM or use the available base channels |
KNOCK: NOT ON THIS ROM | Knock channels are not available through the current definition and connection |
A HOLD TO DISCONNECT control (hold for two seconds) appears while connected.
AUTO checks the supported transport paths, including CAN on applicable older CAN-patched Subarus. The displayed vehicle year comes from the VIN; enhanced parameter addresses follow the ECU's ROM identity. A donor ROM can therefore have a different year from the car. When the connection is lost or replaced, Drive clears its old readings, loop state and traces until fresh data arrives.
The OBSERVED CHANNELS list combines proven compatibility aliases into one physical-source row and names the aliases. Channels with different addresses or storage widths remain separate even when their labels are similar. An alias row does not mean the ECU is polled twice.
The first time a car connects, EcuPulse opens the car setup wizard so the thresholds, alarms and gear detection fit your car rather than a generic Subaru. SKIP FOR NOW in the header postpones it; you can come back to it any time.
CAR: the profile name (pre-filled, editable), the VIN and ROM ID as read from the ECU, and your units: PSI or BAR, °F or °C, AFR or λ.GEAR: the platform (AUTO, TURBO EJ, TURBO FA or NA), the transmission (AUTO, 5MT, STI 6MT, WRX 6MT or CVT) so the dash can show the current gear, and the vehicle weight. If the ECU reports a VIN the weight is pre-filled from the model's curb weight plus a driver allowance; correct it to your car's real weight, since the dyno estimate and performance runs use it.BOOST (turbo platforms only): the fuel-cut ceiling, the over-target caution margin and the boost band, each with a RESET to the ROM default.LIMITS: redline and shift RPM, the WOT AFR target range, and the caution and danger thresholds for AFR, FBKC, FLKC, DAM, intake temperature, injector duty and coolant, pre-filled from the ROM profile. Rows that do not apply to your platform are hidden.ALARMS: the built-in alarm rules for your platform, seeded from the limits you just set, each with a plain-language summary and an on/off toggle.DONE: a summary of what will be written, a RUNNING A WIDEBAND? toggle that opens the wideband wizard right after, and FINISH SETUP.Rerun the wizard any time from SETUP ▸ CAR SETUP, or from the RE-RUN CAR SETUP button on the vehicle card. If you re-flash the ECU and its calibration ID changes, EcuPulse notices on the next connect and offers to review the platform, limits and alarms for the new ROM; choose Later and it stays quiet until the ID changes again.
Units and defaults. A fresh installation defaults to imperial units and AFR: the dash uses psi, °F and mph. Metric switches the dash to bar, °C and km/h; the pressure and temperature selectors share that metric/imperial choice. AFR versus lambda is a separate preference. Generic OBD metric pressure can be kPa, and log/review channels retain their recorded units: read each label rather than assuming every screen or imported CSV uses the dash units. The app's AFR/lambda conversion uses a gasoline-equivalent 14.7:1 scale. Profile thresholds are reference settings, not limits measured from your tune; check their provenance and suitability for the actual car.
EcuPulse has two worlds.
DRIVE is the fullscreen live dash: gauges, severity floods and the recording controls, with no navigation chrome. It is where the app lives while the car is moving.GARAGE is everything parked. In landscape it is a rail down the left edge; in portrait it is a bar along the bottom. Its destinations are DRIVE, CONNECT, PULLS, HEALTH, SNAPS, PERF, CODES, VIDEO, ALARMS and SETUP.Next to the rail sit the car chip (your car's name, or NO CAR; tap it to go to CONNECT) and the connection dot with the live polling rate, for example 9.8 HZ. From DRIVE, the ⌂ GARAGE item in the dash rail returns to the garage screen you last used. The system back button returns to DRIVE from anywhere in the garage; from DRIVE it leaves the app, and while a pull is recording it asks for a second press first.
If an alarm fires while the link is not live, the banner is prefixed [STALE], [RECONNECTING] or [DISCONNECTED] so it is never mistaken for a current reading.
Landscape and portrait are separately designed layouts rather than one layout squeezed to fit, so rotate the device to whichever suits the mount.
KNOCK on a live event and dims to a KNK ×2 style count once the alarm is latched. With the ring tach (on by default) the RPM half becomes a ring around the screen edge and the strip becomes a full-width knock zone.+0.2 VS TGT under boost, or HEADROOM OK under injector duty. A cell in caution turns amber. A cell in danger floods red and pulses when its configured condition is met; this does not diagnose the cause.T 19.0 on boost is the ECU's own target for this moment, and DAM 1.00 on the knock cell is the live multiplier.From left to right: ⌂ GARAGE, the connection dot with the live Hz, a MIC chip when voice commands are on, the preset name, EDIT, a ● VID chip while a video is recording, the REC control and MARK.
REC shows the recorder's state: REC when idle, ARMED · TPS > 90 while waiting for the trigger, REC 0:07 with a red flood while recording, then a green summary such as PULL 07 · 7.4 S · 2 KNK for a few seconds before it re-arms. Tap it to start or stop a manual log at any time.MARK drops a timestamped marker into whatever is recording. It does nothing when nothing is recording.● VID appears while the phone camera is recording a video; tap it to stop the video.Four presets, each a grid tuned to a job: STREET PULL (RPM, boost versus target, AFR, knock and heat cells), DYNO (adds estimated wheel horsepower and defaults to analog dials), CRUISE (coolant, trims, DAM and battery for the drive home) and TRACK DAY. The dyno chip reads SAE ×1.03 when the app applies its atmospheric correction estimate, or UNCORRECTED; see Virtual dyno for its assumptions. In landscape each preset has its own grid, with a third row of boost and AFR trend cells on a tablet; in portrait they share one tall stack. Swipe left or right to move between a preset's pages; the dots in the rail show where you are.
Tap EDIT (or long-press the preset name) to open the gauge editor for the current preset.
RESET, SAVE and CLOSE, and a preset switch.ANALOG DIALS and the RING TACH on or off, and BG chooses between the flat default and an image of your own for this preset's background.GAUGE ACTIONS provides the same editing through native lists for keyboard, TalkBack and Switch Access. Each gauge is identified by its label, row, column and span. Select a gauge to change, rename, resize, remove or swap it with another gauge; Add gauge… lists empty slots and explains when the page is full. Edits still require SAVE.+ slot, for its actions: change parameter (from a list of common kinds, or SEARCH ALL PARAMETERS… for any channel, formula or wideband), numeral color (a curated set of OK-state colors; caution and danger colors stay reserved), gauge style (digital or analog, for the RPM, boost and AFR cells), rename label, widen to 2×1 or shrink back, and remove.PAGE 1 · PAGE 2 · +) adds and switches pages, up to three per preset. Long-press a page label to delete it.The dash has day, night and sun palettes. In AUTO (the default) it follows the ambient light sensor: night below about 10 lux, sun above about 8,000 lux, with a few seconds' hold so it does not flicker under streetlights. Pin DAY, NIGHT or SUN in SETUP ▸ APPEARANCE.
When a rule fires, a banner floods across the top of the dash with the rule name and the offending value: amber for a medium or low rule, pulsing red for a high one. Tap it, or say SILENCE, to silence it. Rules that are silenced but still unsafe dock in a static red ribbon below the banner until their values return to safe. See Alarms for the rules themselves.
The pull is EcuPulse's unit of work: one run, captured as one reviewable event. The recorder runs app-wide, so it keeps capturing with any screen open or the screen off.
PULL TRIGGER ARMED enabled, the trigger watches throttle position. The default start threshold is 90%.REC control shows a summary such as PULL 07 · 7.4 S · 2 KNK for a few seconds and the trigger re-arms for the next run.If the connection is interrupted mid-pull, the recorder seals what it has and flags the interruption LOST. A separate watchdog also seals a recording after about five seconds without fresh frames; reconnecting does not splice a later session into that pull.
Each saved pull is auto-flagged so you know at a glance whether it needs eyes. The pull list shows the flags as word chips; the review chart shows them as letters.
| List chip | Chart | Meaning |
|---|---|---|
2 KNK | K | Knock: FBKC pulled timing to −1.4° or beyond. Red when the pull reached your danger threshold, amber otherwise |
1 LEAN | L | AFR crossed the lean-danger threshold while the analysis load gate was met (throttle at least 90% and boost above 5 psi). This gate does not read commanded open-loop status |
OVER | O | Overboost: boost ran past the target band for at least a quarter second |
CUT | C | Boost reached the configured fuel-cut reference. The flag does not prove that the ECU actually cut fuel |
GAP | G | An inter-row interval exceeded the larger of 1.5 seconds and three times the log's median interval |
LOST | × | Signal lost: the adapter dropped and the pull was sealed early |
Manual logs. Tap REC on the dash to record without the trigger, for example a partial-throttle run. Tap it again to stop. Throttle lift does not stop a manual log, but connection loss, missing frames or a recording failure can end it. A custom trigger's timed log stops after its configured duration.
Cruise logging. For one continuous background log instead of triggered pulls, tap START CRUISE LOG in SETUP ▸ LOGGING & PULLS. There is no throttle trigger or throttle-based stop; the same interruption limits apply. Android shows an EcuPulse is logging notification while the log runs with the screen off. STOP CRUISE LOG seals it. Cruise logs are named by date and time, for example BG 2026-09-02 19:30.
Markers. Tap MARK, press the mapped hardware button, say MARK, or double-tap the watch to drop a marker into the current log. Saved markers show as neutral M chips in review and as chapters in a video recorded with the pull. Open ⋮ (Review details) ▸ Saved markers for their labels and exact timestamps. Selecting a marker switches to the full log on the time axis and places the cursor on the nearest plotted sample; the saved timestamp stays unchanged. This list also works with TalkBack and keyboard navigation.
Trigger settings. SETUP ▸ LOGGING & PULLS holds the PULL TRIGGER ARMED switch, the trigger window (START and STOP throttle percentages), and the LOG PARAMETERS list with presets you can load and save. The pre-buffer is a fixed three seconds. The only trigger channel is throttle position.
The header counts your pulls, newest first. One pull is one row: a colored edge bar and up to three flag chips colored by the worst severity in the pull (or neutral NO FLAGS; missing or unlogged channels cannot be assessed), its name, a meta line with the length, parameter count and time, and a peak line such as PK 19.2 PSI · 6,700 RPM · AFR 11.4. A pull still being analyzed reads ANALYZING… for a moment after it saves. The filter bar narrows the list to ALL, FLAGGED (any flag), TODAY, or BG (cruise logs).
SELECT FOR COMPARE, EXPORT RECORDING and HOLD TO DELETE (hold for two seconds; the log and its flags are removed). Select two pulls this way and a COMPARE 2 pill appears in the header; it opens review with the newer pull on top and the older as its ghost.⇪ IMPORT CSV brings in a log recorded elsewhere. CSV bytes are preserved; the local filename may be sanitized or given a suffix to avoid collisions. Analysis uses the available columns and their units. Importing a CSV does not establish its recording date or ROM, and does not assign the currently connected car to it.⇩ EXPORT shares every pull in the current filter as one zip, each CSV with its flag sidecar. To share a single pull, open it and use the ⇪ CSV chip in review.OPEN PARTIAL reviews the intact portion, EXPORT RECORDING shares it, and HOLD TO DELETE removes it. An interruption already sealed by the recorder opens normally with its flags.Pulls are named PULL 01, PULL 02 and so on by number; cruise logs by date and time; imports by their filename. With no pulls yet the screen offers RECORD NOW (a manual log, which needs a connected car) and ARM WOT TRIGGER. There is no rename for a pull inside the app; to remove one, long-press it and use HOLD TO DELETE.
Recording identity. A CSV without saved recording identity shows DATE UNKNOWN and has no recorded ROM. TODAY includes only known recording dates; import time and file modification time are not recording dates. List order alone does not establish when a historical recording was made. Without a known start, snapshots and video telemetry cannot be automatically aligned to that log by wall-clock time. Existing positive dates and ROMs in older sidecars are preserved; when their capture context is absent, the source description warns that their original provenance is unverified.
Recording context and thresholds. Open the review's ellipsis menu ▸ Review details & actions ▸ Channel quality and source, or read the recording export, for the saved source. Native recordings capture context and thresholds at recording start. Review, comparison and unsealed recovery prefer that valid frozen threshold snapshot, then the recording's preserved legacy ROM profile, then generic defaults. Each comparison log resolves its own references. Current vehicle limits are never substituted into an older ROM-only recording. A preserved legacy profile still does not prove which limits applied at the time; unknown imports use generic references, which do not identify or validate the historical tune.
Review is the flagship screen. The X axis is RPM by default whenever the pull has a real full-throttle window, so pulls line up run to run instead of drifting with launch timing; switch to TIME to see events in order.
TRACKS: one lane per chosen parameter, all sharing one linked cursor. The actual value is solid amber, the ECU's commanded value is dashed grey, and the ghost pull is faint. A lean zone wash and the fuel-cut line are drawn where they apply.OVERLAY: the same parameters on one plot, each scaled 0 to 100% of its own range, with live values above.SCATTER: any parameter against any other, each point colored by its AFR zone (RICH, TARGET, LEAN, DANGER), with the lean line drawn.TABLE: binned averages. Pick the X and Y channels, the Z value and the bin count (5, 10 or 20); tap a cell to jump to those rows.Parameters. Logged numeric channels are available for review; missing cells mean unavailable, not zero. Unknown channel roles or units may prevent threshold assessment even when a trace can be drawn. Tap ▸ PARAMS under the chart for a row per logged channel with a checkbox, its color and its recorded value at the cursor, and use the view chips (KNOCK, FUEL, BOOST, ALL) to switch sets. + SAVE keeps your own selection as a view; long-press a saved view to delete it. The choice sticks between pulls. Inspect data-quality and coverage notes: repeated rows do not prove each ECU channel was freshly sampled, and display reduction is not the raw CSV cadence.
Scrubbing. Drag anywhere on the chart to move the cursor. The panel shows each visible channel at that point with its min, max and average over the wide-open-throttle window and the delta against the ghost. ▶ replays the pull in real time, ‹ and › step one sample, and A sets a range mark so the panel reports the span from A to the cursor. The amber band under the scrub bar is the WOT window.
WOT ONLY and FULL LOG. WOT only trims everything to the full-throttle window (throttle at or above 90%), which is useful context for comparing loaded operation. Full log shows the whole recording. A log with no full-throttle window offers only FULL LOG, so it can never be mislabeled.
Ghost. The next-older pull is drawn as a faint second trace with deltas in the panel; select two pulls in the list (long-press ▸ SELECT FOR COMPARE) to ghost any pair. In TIME mode a GHOST OFFSET nudge (−, RESET, +, in half-second steps up to ten seconds) lines up an imported log that shares no trigger clock with yours.
Flag chips. The flags appear as small squares along the top of the chart at the moment they happened: K knock, L lean, O overboost, C fuel cut, G data gap, × signal lost. Tap one to jump the cursor there.
Saved markers. Neutral M chips occupy a separate row below the diagnostic flags. Tap one, or choose it from ⋮ (Review details) ▸ Saved markers, to inspect its timestamp in the full recording. The cursor panel shows marker labels separately from diagnostic flags, so a nearby loss or knock event remains visible. Plot reduction can place the cursor on a nearby sample instead of the exact annotation time. The A reference control is a temporary analysis selection and does not add or remove a saved marker.
Knock map. An 8 by 5 grid of RPM against load, counting knock events over the WOT window, where an event is the feedback knock correction stepping half a degree or more further into retard between two samples. Amber cells saw one or two events; red cells saw three or more, and the line below reads, for example, 4 KNOCK EVENTS OVER 312 SAMPLES. Repeated correction at similar RPM and load deserves investigation with your tuner; it does not by itself distinguish combustion knock from noise or a mechanical cause.
⇪ CSV in the header shares a recording ZIP containing the unchanged raw CSV, its existing metadata sidecar when available, and a readable context manifest. Use the ellipsis menu's Review details & actions for review information, including Channel quality and source. Rotating the device keeps the review mode, axis, filter, ghost offset, cursor, scatter/table channel choices and bin count.
HEALTH displays the available current learning and correction channels, plus observations accumulated during the live session. It cannot reconstruct unrecorded driving history. Live cards update while connected; the learned table requires an explicit read. Disconnected, the screen dims and reads NO DATA — CONNECT AN ADAPTER.
DAM · TRUST shows the current value and configured limit, with a history sparkline. AT SET LIMIT is a threshold comparison, not an engine-health verdict. FA-DIT uses this session’s starting value as a reference; that baseline can itself be low. Recent resets, fuel, model-specific learning and the tune affect interpretation.FBKC · NOW shows current feedback correction and the minimum observed during this screen’s session. NO RETARD OBSERVED describes those samples only.FLKC · LEARNED shows the learned correction for the cell the engine is in now, amber when negative and red past your danger threshold, with a note on whether any cell has learned a correction.KNOCK Σ · CYL shows available ECU knock counts and per-cylinder bars: dim under 5, amber from 5, red from 8, with the knock-sum increase since this connection session's starting value. Counter meaning and reset behavior depend on the ECU; these counts do not independently confirm combustion knock.FLKC TABLE is a 4 by 4 grid of the learned corrections over RPM and load. It is read on demand: tap READ TABLE for a one-shot read that pauses polling for a moment. It needs a live SSM connection and a ROM whose definition describes the table; otherwise the caption says so.A/F LEARNING · BANK 1 shows the fuel-learning ranges (A/F LEARN A to D, or a single value on ROMs that report one) on a ±10% scale with the ±8% OK band marked. The card hides on ROMs without the channel.NO TIMING FLAGS, INCOMPLETE DATA, items to review or INVESTIGATE. It identifies missing current DAM/FBKC/FLKC and does not certify engine safety or assert that unassessed fuel trims are healthy.A cell whose channel has not resolved yet reads AWAITING DATA.
Snapshots preserve available configured readings around an event, even without a pull recording. The trace window is two seconds before and one second after the trigger, on a 100 ms trace grid. That grid does not establish a 10 Hz ECU sampling rate. Up to eight relevant channels receive traces, including the trigger channel; the value grid contains the captured configured readings. Missing history, interrupted capture or storage limits can shorten or omit traces.
KNOCK watches a feedback-correction drop, IAM DROP watches the configured multiplier threshold, ROUGHNESS watches a counter increase, and DTC watches the available MIL indication. They require the corresponding live channels; a DTC snapshot does not identify when each stored code originally set.+ CUSTOM opens an editor: pick the PARAMETER, whether it fires BELOW or ABOVE a threshold, and the action. The current button labelled SNAPSHOT ±2 S uses the same 2 s pre / 1 s post window above, despite its abbreviated label. TIMED LOG instead starts a manual log for a LOG DURATION of 10 to 120 seconds, when another recording is not already active. Save + arm arms it; the chip becomes ✎, and a long-press edits it.K knock, L lean, D code, I IAM drop, R roughness, A alarm), the trigger value and the two most relevant readings at that instant, when it happened, and a PULL 07 chip when it landed inside a recorded pull.SNAP — KNOCK style detail: available mini traces with the trigger moment marked, a grid of captured values, and an OPEN IN PULL action when a sealed recording with a known start covers that event.EcuPulse keeps the ten most recent snapshots; older ones roll off. Alarm rules with the snapshot action also land here.
A Performance Run starts timing and a linked pull from one button, with optional phone video. Record video with run is off by default. Enable it explicitly before starting if you want a clip; your saved choice is retained. The option is locked while a run is active. Configure the overlay and microphone in VIDEO.
START RUN (the car must still be connected when permission prompts finish). The app requests location for GPS comparison, and camera/microphone only when the selected video/audio options need them. Permission requests are tracked separately, so enabling video after a GPS-only run can still request camera access. A run can proceed without camera or GPS; missing microphone access means no recorded audio. GPS comparison requires valid fixes and does not certify elapsed time.LAUNCH WHEN READY; the button reads CANCEL until you launch. If you never stop, for example when staging a rolling 60 to 130, the rolling benchmarks arm on their own after thirty seconds (RANGES ARMED).1/4 MI 12.59 @ 103 MPH), the ladder builds a row per split below it, and a knock event flashes the cell.STOP RUN ends it early. It saves as a run file with a timeslip image. Only qualifying valid results update the bests board; interrupted runs are not valid bests.The linked log and optional clip are available from the saved run when recording succeeded. Video failure does not invalidate timing by itself. AUTO REC WITH PULL does not override the Performance video choice while a run is active. Once the run finishes, ordinary pulls can again start automatic video, even while the saved-run overlay remains briefly visible.
60FT, 330FT, 1/8 MI, 1000FT and 1/4 MI, using the app's one-foot-rollout calculation. Trap speed is averaged over the last 66 ft before the line. ECU sampling, wheel-speed calibration and launch detection differ from track timing equipment, so these are not interchangeable with a certified strip slip.GPS AGREES when enough valid GPS fixes agree with ECU wheel speed and the estimated slope meets the configured criteria; otherwise ECU-TIMED · UNVERIFIED or NOT COMPARABLE. Phone GPS speed agreement is not independent timing certification. Vertical accuracy and sampled slope coverage limit the grade estimate.DENSITY ALT (EST) uses available ECU barometric pressure and intake temperature. Humidity is ignored and intake temperature substitutes for ambient; heat soak can distort the estimate. It is context for a run, not a measured weather report.EST WHP · SAE. Otherwise an available uncorrected MAF estimate is labelled EST WHP · MAF. Neither is a measured dyno result.GPS is read only while a run is in progress and the app is on screen. Backgrounding the app or losing the connection interrupts the run; saved partial results carry that status and do not become valid bests. Coordinates and route are never saved: derived comparison information is kept on the run. The run remains associated with its starting car profile.
RUNS · THIS CAR shows the best 0 to 60, the best quarter mile with its trap speed and the best 60 to 130 for the current car profile, above a list of recent runs. Tap a run for its detail: the timeslip image, ⇪ SHARE SLIP, ▶ OPEN VIDEO, ≡ OPEN LOG (opens the pull in review) and HOLD TO DELETE RUN.
The simple timers on the same screen are independent of runs. Tap ARM TIMERS and the 0 to 60, quarter mile and 60 to 130 cells read ARMED · AWAITING LAUNCH until the car launches, then hold their results until RESET. They use the ECU's wheel speed.
START PULL RECORDING opens a capture window for the dyno section; this control does not itself create a CSV log. Available data fills the estimated wheel-horsepower peak and power/torque curves against RPM. The MAF calculation uses an airflow-to-power heuristic and a fixed 15% driveline-loss assumption; torque is derived from that power and RPM. Neither airflow calibration nor actual driveline loss is measured by this feature.
With plausible ECU barometric pressure and intake temperature, the app applies a correction formula referenced to 990 mbar and 25 °C. The chip displays its factor, for example 3,395 LB · SAE J1349 ×1.03; without both inputs it reads UNCORRECTED. The UI's SAE label does not establish SAE J1349 test compliance or equivalence to a dyno shop's result. Humidity is ignored and IAT stands in for ambient temperature; heat soak can over-correct. No fixed accuracy is established. Use the estimate as qualified context when comparing similarly recorded runs.
Without a MAF channel, an acceleration-derived estimate may be available and labelled ACCEL-DERIVED. It uses the configured vehicle weight, so correct that value. Road grade, speed sampling, tire calibration and the model's other assumptions affect this estimate too.
CODES reads diagnostic trouble codes using the supported SSM or standard OBD-II path for the current connection.
READ CODES. STORED and PENDING codes list separately, each row with its code and available description. Expanding a stored code shows available freeze-frame readings and a general explanation. The app requests a standard OBD freeze frame when that path supports it; this is not a separate, proven capture for every code displayed. Missing freeze-frame data does not mean the readings were zero or that no fault occurred.HOLD TO CLEAR CODES requires a two-second hold and confirmation for the current connection session. Save codes and freeze-frame evidence first. Clearing can erase diagnostic evidence and reset readiness; effects on learned values depend on the ECU and the reset operation. It does not repair the cause, and does not guarantee every code will disappear. If the connection changes, reread and confirm on the intended car.READ READINESS displays the returned monitor set for the ECU's ignition type, with explicit READY, NOT READY or NOT SUPPORTED states. There is no universal eight-monitor set. No readiness data returned means unknown, not ready or unsupported. The drive-cycle hint appears only for supported incomplete monitors; follow the vehicle's applicable procedure rather than assuming one generic drive will complete them.EcuPulse reads codes natively over SSM first and falls back to the adapter's standard OBD-II path if that read fails. When neither can answer, the screen says the read or clear is not available on this connection rather than showing a false all-clear; readiness in particular needs the generic OBD-II path.
Record track video on the phone with live telemetry burned into the picture.
VIDEO for the camera preview and overlay. Tap REC to start and stop. The recording locks to the orientation it started in. Preview layout is a guide; the saved clip's dimensions and actual frame delivery depend on the capture path and device.BURN OVERLAY (on by default) bakes the telemetry into the video and records chapter markers. With it off, REC records a clean clip with no overlay and no chapters.+ ADD PARAMETER; the position is fixed.REC AUDIO (MIC) (on by default) requests microphone audio for your video, subject to consent and permission. With it off, video recording does not use the microphone; voice commands have their own separate setting and permission.AUTO REC WITH PULL (off by default) requests video when an ordinary pull starts. Camera access, foreground availability, storage and recording state still determine whether a clip starts. Performance uses its own Record video with run choice, also off by default.MARK becomes a chapter in a burned-in recording, saved in a small sidecar file beside the video.STORAGE LOW). This cannot guarantee enough space for an arbitrarily long clip; check the final save status.Burned-in capture targets 720p and configures a 30 fps encoder; actual delivered frame rate can be lower and is not guaranteed. Clean clips use the camera's HD setting. Videos are saved to your device's media library in a Movies/EcuPulse album, so they appear in your gallery app as well.
Video requires the app to remain in the foreground. Going Home or locking the screen ends capture; CSV logging has its own background lifetime. Check RECORDINGS after interruption: a usable partial clip may be saved, while absent or invalid output is reported as a failure. Wait for saving to finish before assuming a clip exists. Opening the gallery releases an idle preview camera; an active recording retains ownership while you navigate within the app.
RECORDINGS lists every clip with a thumbnail, its date, length and size, and a chip counting its alarms or marks. Tap one to play it: chapter chips along the top jump to two seconds before each event, and SHARE and HOLD TO DELETE are on the same screen.
Alarms are headless rules that watch the live stream whether or not the dash is on screen.
HIGH rule also speaks its phrase. Depending on the rule it drops a marker into the log, captures a snapshot and buzzes the watch.SILENCE, or tap the watch. A latching rule becomes LATCHED: a static ribbon on the dash and a count in the strip, so you know it happened even after the value recovers.| Severity | Sound |
|---|---|
HIGH | Tone or custom sound, plus the voice phrase when voice is on |
MED | A shorter tone or custom sound; never spoken |
LOW | Visual only, by design |
Latching, the log marker, the snapshot and the watch haptic are per-rule choices at any severity.
The car setup wizard seeds rules for your platform from your limits: knock (HIGH, latching), lean under boost (HIGH, latching, judged only while boost is above 5 psi, turbo cars only), coolant hot (HIGH, latching), overboost (MED, one psi below the fuel cut), intake heat soak (MED), injector duty (MED), and battery low (LOW, ships disabled). Rules you write yourself are never touched by a reseed.
Open ALARMS for the ledger, grouped HIGH, MED, LOW, each row with its arm toggle, name, a plain-language condition line and LATCH and VOICE chips. Tap a rule to edit it, or + NEW RULE.
< or >, and the threshold with a stepper. With more than one condition, choose ALL or ANY. A condition on a channel the ROM profile knows shows AUTO FROM ROM with the profile value and a RESET, and reads USER once you change it.HIGH, MED or LOW, and the action toggles Tone, Voice, Log marker, Snapshot and Wear haptic.PICK an audio file, PREVIEW it, CLEAR to return to the default tone.Latch until safe, and Re-trigger on worsening (on by default) with a WORSEN STEP; zero re-fires on any worsening.TEST plays the rule as configured without saving it.SAVE first runs a dry run against your last five pulls and shows, per pull, how many times and when the rule would have fired, or NOT LOGGED when a pull lacks the channel. CONFIRM saves; CANCEL returns to the editor. HOLD TO DELETE removes an existing rule.SETUP is search-first: type in SEARCH SETTINGS to filter the sections by name or description. The sections:
CONNECTION: the adapter list and link state (the same screen as CONNECT).VEHICLE & PROTOCOL: the ECU card; the platform and transmission; the SSM TRANSPORT override (AUTO, K-LINE or CAN, applied on the next connect); units; the SAFETY THRESHOLDS table, where every row shows its provenance (AUTO FROM ROM, MAP NOTES, USER or DEFAULT) with a per-row RESET; and EXPORT PROFILE and IMPORT PROFILE for the threshold set as a JSON file.CAR SETUP: rerun the guided setup for the current car.LOGGING & PULLS: PULL TRIGGER ARMED, the trigger window, START CRUISE LOG, and the LOG PARAMETERS list with + ADD PARAMETER, LOAD PRESET and SAVE PRESET.ECU DEFINITIONS: the status of the bundled definitions and Custom… (load from file) to import a RomRaider logger XML. Imported definitions merge on top of the bundled ones and win for the ROM IDs they cover; Hold to remove import reverts to the bundle.ALARMS: the rules ledger and editor.WIDEBAND: the three-step wideband AFR wizard (see Wideband AFR below).FORMULAS: calculated parameters (see Formulas below).APPEARANCE: the gauge theme (EMBER, SIGNAL, RALLY or TITANIUM, which recolor the accent and numerals only; status colors never change), the lighting mode, KEEP SCREEN ON (on by default) and FLASH SCREEN ON ALARM (off by default; an explicit saved choice is retained).VOICE & CONTROLS: voice commands and hardware buttons (see Voice and Hardware Buttons below).WEAR OS: the watch companion (see Wear OS below).CAR PROFILES: every saved car with an ACTIVE chip; LOAD a profile (while disconnected), CREATE FROM CURRENT CONFIG, HOLD TO DELETE, and EXPORT ACTIVE and IMPORT for a whole car configuration as a JSON file.KNOCK & TIMING GUIDE: plain-language explainers for FBKC, FLKC, IAM and DAM, threshold context, and how to read a pull. Reference ranges do not establish that a tune is safe.DIAGNOSTICS: REPORT A BUG opens a pre-filled email to support.PRIVACY POLICY and THIRD-PARTY NOTICES.DimeMod channels. On a normal SSM CAN or K-line connection, EcuPulse automatically checks for supported DimeMod 2.4 build 0 firmware and verifies its channel descriptor using read-only requests. Standard telemetry starts while discovery proceeds. Enabled channels appear after verification; VIN year is not used to guess their addresses. ECU DEFINITIONS shows discovery status and an optional ROM-import fallback. Importing a file does not flash the ECU or bypass verification, and the app retains descriptor information rather than the full ROM file. Other DimeMod versions and hybrid passive-CAN discovery are not covered by this implementation. Discovery can miss an unfamiliar layout; a connection or plausible value alone does not establish support. Unavailable, disabled or stale DimeMod inputs are withheld.
ABOUT: version and build, USER MANUAL, REPLAY WELCOME TOUR, RESET FIRST-VISIT HINTS, and open-source acknowledgements.A correctly installed and calibrated wideband adds useful mixture evidence under load. Select the controller output and verify it against the gauge; an in-range value alone cannot verify wiring or scaling. SETUP ▸ WIDEBAND enables the selected source; select OFF to disable it.
SOURCE: where the gauge's signal comes from. REAR O2 is the usual Subaru setup, the gauge's analog output wired into the rear O2 sensor input the ECU already reads; FRONT O2 and OTHER (any ECU parameter) cover other wiring; SERIAL reads the gauge's own data stream through a USB-serial cable into the phone, with a PROTOCOL (AEM UEGO, Innovate LC-2 or MTX-L, PLX, generic ASCII) and BAUD setting. A serial gauge runs alongside the Bluetooth ECU link.SCALING (analog sources only): use the controller's documented output curve, not the oxygen sensor model. Supported presets include the original AEM X-Series 30-0300 valid output range, UEGO 30-4110, factory Innovate output 1, PLX and factory linear Zeitronix. Programmable or different controller versions require their own calibration. Bosch LSU sensors alone do not provide a universal analog curve; Link CAN Lambda and Haltech CAN controllers are not analog presets. An unverified NGK Powerdex preset is disabled; use a documented CUSTOM slope and offset when appropriate.CHECK: inspect the live pin voltage, computed AFR and gauge status. IN RANGE means only a plausible numeric range; independently compare with the physical gauge. Warm-up, fault and stale serial frames are withheld. Stock front-sensor AFR is not a substitute for verifying the controller output under load.For SERIAL, choose CONNECT USB GAUGE and the correct adapter port, then grant USB permission. DISCONNECT closes it; changing source or switching wideband off also closes the gauge link. The ECU and wideband cannot own the same USB device. AEM CAN decoding is not a live USB-CAN connection feature. AFR is represented on a gasoline-equivalent 14.7:1 basis; lambda is fuel independent. Changing tank fuel does not change a gauge's encoded output scale.
Once enabled, WIDEBAND AFR and its lambda twin are available as channels, and AFR displays or analysis that prefer a wideband can use them. Check the actual dash selection, log parameter list and alarm conditions; enabling a source does not rewrite old CSVs or replace every explicitly selected stock channel. Review needs the wideband values to have been recorded. Missing or stale wideband data is not evidence of a safe mixture.
SETUP ▸ FORMULAS defines calculated parameters. Give the formula a name and unit, then build it from the PARAMETERS chips (one per channel the ECU is streaming, so connect first) and the FUNCTIONS chips: + − × ÷, parentheses, abs, min, max, deriv (rate of change per second) and smooth (a trailing average over the seconds you give it). A formula can reference another formula. Live validation re-evaluates on every keystroke and reads = 14.700, SYNTAX ERROR, or CHECK NAMES / MISSING LIVE VALUE. Malformed expressions cannot be saved. A syntactically valid expression may still lack live inputs; missing values are not replaced with zero. Saved formulas can be selected for dash cells, logging and alarm rules, and reviewed when logged; tap one to edit it, ✕ to delete it.
SETUP ▸ CAR PROFILES snapshots settings such as alarms, transmission and weight, dash layouts, logging parameters, appearance, units and protocol, and loads another profile while the car is disconnected. Threshold and platform edits remain in their own storage; use VEHICLE & PROTOCOL ▸ EXPORT PROFILE or IMPORT PROFILE to transfer those limits separately.
Limits belong to a vehicle and ROM. Two cars with different VINs keep separate USER limits even when they run the same ROM. Learning or losing the ASCII CAL name on an unchanged ROM does not select another set of limits. A genuinely different ROM has its own set. When no valid VIN is available, the app uses a separate unidentified profile for the available ROM/CAL; it cannot distinguish two physical cars with the same reported IDs in that state. Unidentified edits do not become a known car's limits automatically. Export/import them explicitly if they should move to an identified car.
Earlier saved limits with a matching recorded VIN and ROM migrate into missing vehicle entries. Existing USER values, explicit not-applicable values and resets are kept; conflicting entries remain listed for review. If an older profile has no recorded owner, REVIEW EARLIER LIMITS shows the saved choices. Select Use for this vehicle only after checking that they belong to this car and tune, or Keep separate to leave them preserved. Assigning an older profile does not authorize copying it automatically to another VIN or ROM.
Both are ways to run the app without taking your eyes off the road. SETUP ▸ VOICE & CONTROLS has one switch for each: VOICE COMMANDS (off by default) and HARDWARE BUTTONS (on by default).
Recognition runs entirely on the device: the audio is never stored and never sent anywhere, and on a device without an on-device recognizer voice simply stays off. Listening is active only while the DRIVE screen is showing and pauses while the app itself is speaking. The MIC chip in the dash rail shows the state: green while listening, dim while paused, MIC N/A when the device has no on-device recognizer, and a red MIC! when the microphone permission is missing (tap it to grant).
| Say | Does |
|---|---|
START LOG (or START LOGGING) / STOP LOG | Start or stop a manual log |
MARK | Drop a marker into the current log |
NEXT PAGE | Move to the next dash page |
SILENCE | Silence the active alarm (a latching rule latches) |
STATUS | Speaks a short status: DAM, boost, intake and coolant temperatures and the A/F trim, whichever are live |
On DRIVE, the phone's buttons drive the app, which also works from a steering-wheel or media remote: hold volume up for about half a second to start or stop a log, press volume down to drop a marker, and press media next to change dash page. The map is fixed, and on the dash the volume keys belong to the app, so a short tap does not change the volume. The log button is ignored while no car is connected.
The companion is for Wear OS 3 or newer. Pair the watch to the phone using the watch manufacturer's supported companion app, then install EcuPulse's watch app when available through Play. Live readings need the phone app running and connected to the car. Its settings live on the phone under SETUP ▸ WEAR OS: SYNC TO WATCH (off by default) sends telemetry to the watch, WATCH REMOTE (on by default) accepts gestures from it. The watch relays phone data and commands; it does not independently connect to the ECU or verify a reading.
REC badge while anything is recording. Live readings update up to five times a second, depending on the connection. Each reading clears when its own data becomes stale or unavailable; fresh data from another channel cannot keep an old reading visible. STALE, NO DATA and the connection status explain what is available.SETUP ▸ WEAR OS ▸ WATCH GAUGE on the phone. AUTO preserves automatic selection: the most urgent channel takes priority, followed by a live gauge such as boost or AFR when readings are OK. Choose boost, AFR, feedback knock, DAM, fine learning knock, coolant, intake temperature or injector duty to keep that gauge visible while readings are OK. Choose NONE · LARGE GEAR to leave out the normal gauge and make the gear number larger. Cautions and dangers still take priority. A chosen gauge without current data stays unavailable instead of silently switching to another healthy gauge. Channel availability depends on the vehicle and protocol; generic OBD does not supply these Subaru severity channels.SETUP ▸ WEAR OS ▸ SHIFT CUE. To change it, open VEHICLE & PROTOCOL ▸ SAFETY THRESHOLDS ▸ SHIFT (RPM). The phone shift light and watch use this same threshold. Defaults depend on the resolved profile; edits are kept for each vehicle and ROM. Without a VIN, limits stay in a separate unidentified profile. The watch cue is approximate and is not a shift-timing device.HIGH rule, or any rule with the watch haptic action, fires, the face floods red (amber for lower severities) with the rule's name and value and TAP TO SILENCE, and the watch buzzes three times. Tap it: the watch shows SILENCE SENT… and then SILENCED once the phone confirms, so the latch is the same on the wrist, the phone and the dash.DOUBLE TAP drops a marker, HOLD starts or stops a log, and an available SIDE BUTTON 1 starts or stops a Performance Run; the other side buttons and SHAKE are off. Available gestures can be set to OFF, MARK, LOG, REC, RUN, PAGE or SIL on the phone. A single tap on the face deliberately does nothing. A command acknowledgment reports acceptance; the REC indicator follows actual recording state.CROWN FORWARD and CROWN BACKWARD can have separate actions. Both default to OFF; assign them under SETUP ▸ WEAR OS. Keep EcuPulse open on the watch. One continuous turn sends one action, even if you reverse direction; pause briefly before starting another turn. If crown availability is unknown, open the updated watch app to refresh it. Crown rotation is checked separately from side buttons, and saved mappings are kept when the watch disconnects.OPEN ECUPULSE ON PHONE and NO DATA. An unanswered gesture shows CHECK PHONE. With the phone connected but no active log or car, the relevant commands return NO LOG or NO CAR.| What | Where |
|---|---|
| Pull logs | App storage, one CSV per pull (ecupulse_log_20260902_193045.csv) with a .meta.json sidecar carrying its name, peaks, flags, markers and available recording identity/context. Share from PULLS |
| Performance runs and timeslips | App storage, one run file and one slip image per run. Share the slip from the run's detail |
| Videos | Your media library, Movies/EcuPulse, visible to your gallery app |
| Snapshots, alarm rules, presets, settings | App storage |
| Threshold and car profile exports | Wherever you choose in the file picker when you export |
Recording files use the app's folder under Android/data/com.ecupulse.app/files/ (pulls under Documents/EcuPulse/, runs under Documents/EcuPulse/runs/, slips under Pictures/EcuPulse/slips/). Preferences and some records use separate app-managed storage. Android may restrict direct folder access; use the share and export controls. Uninstalling removes app-owned data, so export important recordings and profiles first. Videos in the media library remain separate from app-owned storage.
My adapter is not listed on CONNECT. Bluetooth adapters must be paired in Android's Bluetooth settings first; the app does not scan. If it is paired and still missing, check that Bluetooth is on and that the app has the nearby-devices permission. If it is listed under NO NAME MATCH, it may not be an STN-based adapter: EcuPulse is built for OBDLink MX+, LX and similar, and the Tactrix Openport 2.0, and ELM327 clones cannot keep up with SSM. A USB cable other than a Tactrix does not appear at all.
The link climbs to HANDSHAKE and stops. The ECU may not have answered the SSM initialization. Check that the ignition is on, the adapter is powered, and no other app is holding it. AUTO can try another supported transport; if detection keeps choosing incorrectly, use SETUP ▸ VEHICLE & PROTOCOL ▸ SSM TRANSPORT. With no matching enhanced definition, only supported base channels may remain available. A basic connection does not validate enhanced channel addresses.
The data went grey and the rail says STALE. No frame has arrived for a few seconds (two to eight, scaled to how fast your transport normally delivers). The app re-initializes silently and never shows a popup. A Bluetooth link then walks the retry ladder, 1, 2, 4 and 8 seconds and then every 8 seconds indefinitely, and the ladder shows the attempt count; a Tactrix link restarts its polling in place a few times and then disconnects, and USB never reconnects on its own, so reconnect it by hand or replug the cable. If a Bluetooth adapter never recovers, power-cycle it.
The polling rate is low. Bandwidth is shared across the requested channels. The CONNECT rate is measured stream delivery; individual channels can update more slowly. Transport estimates are planning figures, not guaranteed vehicle rates. Reduce optional log channels and inspect CSV timestamps and missing values. Priority polling cannot guarantee that safety channels never slow down.
The knock badge says ROM NOT IN DEFS. Play requires an exact enhanced definition for your ROM. Import a trusted matching RomRaider logger XML under SETUP ▸ ECU DEFINITIONS, then reconnect and verify channels. Plausible values at a neighboring RAM address do not identify a channel, so sibling borrowing and discovery are excluded from Play. Base channels may remain available.
No knock or DAM cells. Check the exact ROM definition, available channels and transport limitations on the vehicle card. Naturally aspirated does not by itself mean an ECU has no knock control; it means boost-specific assumptions and rules may not apply. An unavailable channel cannot be assessed.
The pull never triggers. The trigger is throttle above 90% by default; a partial-throttle run does not count. Check PULL TRIGGER ARMED and the window in SETUP ▸ LOGGING & PULLS, and confirm the throttle channel reads correctly on the dash. Use REC for a manual log meanwhile.
Wideband reads nonsense. Rerun the wizard's CHECK step and verify the input, controller's documented output curve and physical gauge reading. Wrong wiring or scaling can still produce plausible in-range numbers; the app's numeric range check does not prove calibration.
Voice does nothing. Voice listens only on the DRIVE screen and only with VOICE COMMANDS on and the microphone permission granted. Devices without an on-device speech recognizer show MIC N/A and cannot use voice; the buttons still work.
The watch shows no readings. Live values need the phone app running and connected to the car, SYNC TO WATCH on under SETUP ▸ WEAR OS, and the watch paired to this phone with EcuPulse installed on it. DISCONNECTED or NO DATA is expected when no vehicle data is available.
Something is wrong and I want to report it. SETUP ▸ DIAGNOSTICS ▸ REPORT A BUG opens an email with your app version, device, Android version and ROM ID filled in. Add the car's year and model, the adapter, what happened versus what you expected, screenshots, and, if a value or flag looks wrong, the pull's exported CSV.
T 19.0 and judges boost error against it.CUT flag indicate a threshold crossing, not confirmation that this action occurred.Email support@ecupulse.com for bugs, feedback and feature requests, or use SETUP ▸ DIAGNOSTICS ▸ REPORT A BUG for an email pre-filled with your build details. The FAQ is at ecupulse.com/support.
EcuPulse is not affiliated with Subaru Corporation. Product names are trademarks of their respective owners and are used for compatibility reference only. Tune at your own risk, on a closed course.