Skip to main content

Vehicle controls

Vehicle body and convenience controls presented in HMI: doors/locks, lights, windows, mirrors, wipers, drive modes, and similar affordances. Physical hard-keys may coexist; HMI must remain honest about state.

Purpose

  • Provide a consistent control language for body features across OEM apps and system settings.
  • Distinguish convenience toggles from safety-critical indicators/actions.
  • Support extension for OEM-specific features (frunk, camping mode, etc.).

Component set (planned)

ComponentRoleSafety class
LockToggleLock/unlockConvenience (context-dependent)
LightModesHeadlights / auto / fogConvenience / informational
WindowControlsWindow positionsConvenience; restrict complexity while driving
DriveModeSelectorEco / normal / sport / …Convenience; confirmations per program
Trailer / TowingStatusTow stateInformational / warning
HazardControlHazards when in HMISafety-critical
VehicleControlGridLauncher of controlsConvenience (restriction-aware)

OEM-specific controls use the extension model.

States

  • On / off / auto / unavailable / fault
  • Partially open (windows) with clear indeterminate UI
  • Drive mode pending vs applied
  • Powered-off vehicle limited control set

Compliance

ConcernRule
DrivingPrefer simple toggles; block multi-step mirror fold sequences if restricted (driving)
SafetyHazards and critical telltales follow safety-critical
DeterminismNever show “unlocked” without signal confirmation
UXGrid items meet touch minima; clear off targets

Token dependencies

  • Control grid spacing / icon sizes
  • Semantic warning/error
  • Shape tokens for control tiles (modest radii)

Planned Compose API

// Planned
@Composable
fun VehicleControlGrid(
items: List<VehicleControlItem>,
onToggle: (VehicleControlItem.Id, Boolean) -> Unit,
modifier: Modifier = Modifier,
)

@Composable
fun HazardControl(
signal: Signal<Boolean>,
onToggle: () -> Unit,
modifier: Modifier = Modifier,
)

Planned Views API

// Planned
class VehicleControlGridView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
) : GridLayout(context, attrs) {
fun bind(items: List<VehicleControlItem>) { /* … */ }
}

Parity notes

Latched states (locks, hazards, lights) must match exactly across stacks for the same Signal fixtures. Indeterminate window positions need shared enum mapping.

Acceptance criteria

  • Safety-critical controls identified
  • Unavailable ≠ off
  • Driving-gated multi-step flows
  • Extension slots for OEM controls documented
  • Dual-stack parity for latched toggles