ui: nonblocking writes for ExperimentalMode + DriverView toggles + cycle-restart
All four put calls fire from the main render thread on user interaction
and block on disk fsync, causing visible UI frame spikes.
Each consumer is safe under nonblocking:
- onboarding inactivity_callback: write-and-forget (~25 ms saved)
- home long-press exp toggle: ui_state.experimental_mode owns visual state (~10 ms)
- onroad exp_button: $held_mode + selfdriveState owns visual state
- restart_needed_callback (OnroadCycleRequested): cross-process signal,
consumer is selfdrived which polls the param
BigParamControl-driven toggles in settings (developer.py, toggles.py)
are intentionally left blocking — those widgets refresh visual state
from disk every frame to mirror external changes, which would race a
nonblocking write.
* log raylib fps
* log fps from frame time
* whitespace
* or just log frame time?
* init pubmaster in init window
* yield timings
* bump ordinal
* dont log on screen off
* UInt
* lint
* /0
* oops
* oops2
* more precise raylib frame time, can get fps with 1/ft
* don't crash on screen off
* NL
* no _
---------
Co-authored-by: Shane Smiskol <shane@smiskol.com>
* ui: speed up `mici/AugmentedRoadView` by optimizing _calc_frame_matrix caching (#36669)
speed up AugmentedRoadView by optimizing _calc_frame_matrix caching
* ui: apply rect.x/y as a 2D screen offset post-projection
Removes the parent rect's screen position from the cached
video_transform passed to ModelRenderer. Instead, ModelRenderer
applies (rect.x, rect.y) as a 2D offset to projected_points at draw
time.
Why this works: the rect.x/y term in video_transform gets multiplied
by P_calib[2] before the perspective divide, then divided by the same
value, which cancels out to a simple additive shift on the final
screen coordinate. So adding x to video_transform[0,2] is equivalent
to adding x to screen_x post-projection.
Net effect: the cache key in _calc_frame_matrix no longer needs to
include rect.x/y. Cache stays hot under translation (e.g. swiping
between layouts), and the model overlay tracks the camera at 60Hz
because the offset is updated cheaply each frame.
This addresses the original revert reason for #36669 (model overlay
visually desyncs from camera during a home<->onroad swipe).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ui: update model screen offset every frame, not just on cache miss
set_screen_offset() was called inside the cache-miss path of
_calc_frame_matrix, so the offset only updated at ~20Hz (calib publish
rate). The model overlay visibly lagged the camera during a swipe.
Move it out of the cached path so it updates each frame.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fully clean up
* shorter cmts
* make non
* clean up
* fix ty
---------
Co-authored-by: Dean Lee <deanlee3@gmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ui: keep arc_bar_pts cache hot when bar is translated
The LRU cache key included (cx, cy), which change every frame when
the parent widget's rect translates (e.g. during a scroll animation
in MainLayout). That made every cache lookup miss, recomputing the
arc geometry twice per frame and dropping fps.
Compute the shape at origin (so the cache key only depends on the
geometry: radius, thickness, angles), then translate to (cx, cy)
after. Cache stays hot under translation.
Measured on comma four (engaged, scrolling): ~5fps recovered while
moving between layouts.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fully clean up
* fully clean up
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix frame under text
* claude always taking the hard path
* cmt
* it still shows on start
* revert
* fix
* wait to show
* already a bug, don't fix here
* cmt
* cmt
* spellings
* unused
* no roll
* lil more
* lil more
* one more
* policy enum
* better trans
* set_timer -> set_policy
* set_timer -> set_policy
* no yaonet
* del redundant code
---------
Co-authored-by: ZwX1616 <zwx1616@gmail.com>
* c4 body ui
* clean up diff
* clean up
* default bodyview debug with True
* remove battery indicator and fix close settings bug
* organize debug file
* clean
* clean up frame index
* remove unneccessary is body check
* update bodyview
* remove joystick_debug_mode based events
* remove debug script
* apply suggestions
* clean diff
* clean diff
* move ignition message
* save a line
* remove visibility set and fix tici body face when sidebar open
* remove explicit textColor offroad message
* remove unused imports
* revert pairing dialog
* apply suggestions
* add body specific icon
* add body icon for homescreen
* set mode for state on tici after on body changed
* tiny
* tweak
* v
* tweaks
* icon ratio was wrong!
* same order
* rm
* apply suggestions
* remove commented lines in animation
* onroad click callback was on home bug and fix setup widget settings call back hack
* fix body changed
* one liner
* clean up
* formatting
* if false
* revert to master + reimplement
* close sidebar on body home tici
* make ignition message bigger on c3
* flip eye direction when turning
---------
Co-authored-by: Nick <nickorie@gmail.com>
Co-authored-by: Shane Smiskol <shane@smiskol.com>
* replay: add dragging gesture support
* update dragging to support distance and duration; update mici script to go through settings
* refactor
* fix and add network
* add more
* interact device
* fix
* match statements
* more
* improve
* simplify script
* add keyboard test
* format
* simplify
* improve
* comment
* improve
* clarify
* clean
* simplify
* simplify
* move
* improve
* more delay
* simplify keyboard test
* simplify
* comment
* add onroad alert tests to mici
* scroll less
* test offroad alerts
* remove space
* scroll faster
* more toggle tests
* back to home
* test settings onroad
* fix pairing qr code
* add replay progress bar
* add replay progress bar
* simplify
* correct comment
* remove _
* we don't need this
* change click
* add return types
* fast typing
* use frames instead
* use frames instead
* update
* disable in CI
* +1
* fix script
* refactor how mici replay script cases are built
* refactor
* refactor: rename helper function for exploring settings in build_mici_script
* remove onroad settings check
* refactor
* simplify
* refactor: use explore_setting in more places to reduce duplication
* add type
* refactor: simplify explore_cases function by removing swipe_wait parameter
* add case to open wifi selection
* refactor: enhance run_actions to support after_each callback for interaction tests; rename explore_cases to scroll_through_cases
* add review training guide
* update comment
* comments
* comment
* fix swipe back