STEERING · AUTO LEARN
{{ vehicle }}
{{ state.description }}
@@ -162,6 +172,7 @@ export const FlmPage = {{{ manualState.pending.question }}
Adjust your saved vehicle tune.
{{ manualState.status === 'loading' ? 'Loading steering controls…' : 'Steering controls unavailable. Reconnecting…' }}
-{{ manualState.data.subtitle }}
-No manual numeric controls are available for this vehicle.
-Thirty automatic correction values, grouped by steering behavior.
Thirty steering parameters, grouped by behavior.
{{ selectedGroup.description }}
Parked edits apply to the next drive. Auto Learn pauses while manual overrides are set. Zero removes an override.
+{{ manualState.status === 'loading' ? 'Loading saved manual tune…' : 'Manual tuning unavailable. Reconnecting…' }}
+{{ manualState.data.rows[0]?.reason || 'Manual tuning is unavailable for this controller.' }}
+These reported results are separate from your manual settings.
Zero is the original baseline. These are correction coordinates, not raw degrees or torque. Speed-window coordinates scale the original speed range; deadband and angle assistance use the controller's physical normalizer. A trial is an offer, not proof of application. All 30 stages exist for torque; 26 exist for torque-actuated PID.
{{ !paused && error ? error : 'Missing samples leave a gap in the graph.' }}
Desired / actual · m/s² · {{ source(data?.values?.lateralSource) }}
+Desired / actual · m/s² · {{ source(data?.values?.lateralSource) }}
Desired: {{ label(data?.values?.desiredLateralAccel) }} · Actual: {{ label(data?.values?.actualLateralAccel) }}
-Speed source: {{ source(data?.values?.speedSource) }}
-30 s match: {{ !data || data?.bootStabilizing ? 'N/A' : lateralQuality.label }} · {{ data?.bootStabilizing ? 'Waiting for startup to settle' : status !== 'current' ? 'Last received window' : lateralQuality.detail }}
Target / measured · m/s² · {{ source(data?.values?.longitudinalSource) }}; measured from {{ data?.values?.poseFresh ? 'device motion' : 'unavailable motion source' }}
+Speed source: {{ source(data?.values?.speedSource) }}
+30 s match: {{ !data || data?.bootStabilizing ? 'N/A' : lateralQuality.label }} · {{ data?.bootStabilizing ? 'Waiting for startup to settle' : status !== 'current' ? 'Last received window' : lateralQuality.detail }}
Target / measured · m/s² · {{ source(data?.values?.longitudinalSource) }}; measured from {{ data?.values?.poseFresh ? 'device motion' : 'unavailable motion source' }}
Target: {{ label(data?.values?.desiredLongitudinalAccel) }} · Measured: {{ label(data?.values?.actualLongitudinalAccel) }}
-30 s match: {{ !data || data?.bootStabilizing ? 'N/A' : longQuality.label }} · {{ data?.bootStabilizing ? 'Waiting for startup to settle' : status !== 'current' ? 'Last received window' : longQuality.detail }}
P / I / D / F · controller output units · {{ source(data?.values?.lateralTermsSource) }}
+30 s match: {{ !data || data?.bootStabilizing ? 'N/A' : longQuality.label }} · {{ data?.bootStabilizing ? 'Waiting for startup to settle' : status !== 'current' ? 'Last received window' : longQuality.detail }}
P / I / D / F · controller output units · {{ source(data?.values?.lateralTermsSource) }}
P / I / F · m/s² · {{ source(data?.values?.longitudinalTermsSource) }}
+P / I / F · m/s² · {{ source(data?.values?.longitudinalTermsSource) }}
Blue is target, orange is observed. Missing or stale sources are never plotted as zero.