Override VE, Ignition and AFR Table Axis
The target lambda and main ignition tables can use a consumer-load source other than their model default. The VE load field is different: the current configuration still exposes it, but the standard physical air-mass models do not use it to redirect the main VE table. Changing an axis also changes what each row means; existing breakpoints and cell values are not converted automatically.
Current consumer selectors
The target lambda/AFR and main ignition selectors are active, independent table-coordinate choices:
| Consumer | Field | Allowed choices |
|---|---|---|
| Target lambda / AFR | afrOverrideMode | Model default, Measured MAP, TPS, Acc Pedal, Cyl Filling %, Effective MAP |
| Main ignition | ignOverrideMode | The same six choices |
The fields and load_override_e are defined in
fome_config.txt,
and the TunerStudio labels are Target lambda load source at
tunerstudio.template.ini
and Ignition table load source at
tunerstudio.template.ini.
The selectors are captured into the air-mass input snapshot in
airmass.cpp
and resolved independently by the shared load resolver starting at
airmass.cpp.
They select coordinates for the lambda and ignition table lookups; they do not change how the active physical model calculates air mass.
Model default resolves through
resolveNativeModelLoad().
It is effective MAP for Speed Density and SD + Alpha-N, normalized TPS for standalone Alpha-N, and pre-trim standardized cylinder filling for MAF Air Charge. Measured MAP requires a valid measured MAP value. Effective MAP may use the configured MAP estimate, while the percent choices are normalized coordinates. See Load Sources for their validity and fallback rules.
VE field and current model axes
The generated configuration still exposes veOverrideMode with choices None, MAP and TPS in
fome_config.txt,
and TunerStudio still labels it Override VE table load axis in the
final template.
It is retained as a legacy compatibility field. captureAirmassInputs() copies it at
airmass.cpp,
but the only firmware code that reads the captured value is the legacy getVe(rpm, load, ...) wrapper at
airmass.cpp.
The standard physical models do not call that wrapper. They pass their strategy-owned axes directly to evaluateVe() or evaluateRawVe():
| Strategy or table | Current Y axis |
|---|---|
Standalone Speed Density VE | Captured effective MAP (speed_density_airmass.cpp) |
Standalone Alpha-N Alpha-N filling | Normalized TPS (alphan_airmass.cpp) |
MAF Air Charge MAF Trim | Pre-trim standardized cylinder filling (maf_airmass.cpp) |
| SD + Alpha-N raw branches | Speed Density's native MAP and Alpha-N's normalized TPS, before the two masses are combined (blended_airmass.cpp) |
Consequently, changing veOverrideMode does not redirect the current Speed Density VE table, Alpha-N filling table, MAF trim table, or either raw branch of SD + Alpha-N. The selector is also unrelated to a blend table's Y axis override.
The source test named
AirmassModes.VeOverride
drives a dummy model that explicitly calls the compatibility wrapper. It verifies the wrapper's behavior, not a current physical-model load axis.
Before changing a consumer axis
- Record the current table and breakpoints.
- Confirm that the setting is a lambda or ignition consumer selector, not a blend table's Y-axis override.
- Replace breakpoints that were tuned in the old units; values are not converted automatically.
- Confirm the consumer table's live cursor follows the chosen source.
- Check source validity and fault or fallback channels during a steady state before applying load.
Changing afrOverrideMode affects only the target lambda/AFR lookup, and changing ignOverrideMode affects only the main ignition lookup. The two selectors are independent.