Compare commits

..

101 Commits

Author SHA1 Message Date
rav4kumar 6b10358865 sunny said to split it, now he is going to say make separate pr... coming up 2025-10-13 13:40:48 -07:00
rav4kumar 79e84fe081 clean up 2025-10-13 13:16:35 -07:00
rav4kumar c1416c5c06 clean up 2025-10-13 12:55:55 -07:00
rav4kumar 2a4317aa56 vibe pytest cleanup 2025-10-13 12:55:55 -07:00
rav4kumar 555a0d1393 clean ul; 2025-10-13 12:55:55 -07:00
rav4kumar f1f9894777 missing params 2025-10-13 12:55:55 -07:00
rav4kumar 0ff2dde674 vibe: Linear Interpolation 2025-10-13 12:55:55 -07:00
rav4kumar 1ddd0ea633 return type 2025-10-13 12:55:55 -07:00
rav4kumar ba0f963357 good time to remove 2025-10-13 12:55:55 -07:00
rav4kumar 833a13e076 so picky 2025-10-13 12:55:55 -07:00
rav4kumar 652ede7264 vibe pytest 2025-10-13 12:55:55 -07:00
rav4kumar 1cd9c8cd3c vibe 2025-10-13 12:55:53 -07:00
Jason Wen 7e03277962 ui: bigger cluster set speed fonts when ICBM is active (#1369) 2025-10-13 03:06:39 -04:00
Jason Wen bd9bb74d03 custom cereal: fix formatting (#1367) 2025-10-13 01:40:22 -04:00
Kirito3481 7d54b58b8d ui: Update Korean translations (#1359)
Update ko-kr translations

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-13 00:19:24 -04:00
Jason Wen 68d059fd5d ui: ensure Cruise panel widget is reset when hideEvent (#1366) 2025-10-12 23:48:58 -04:00
Nayan 728108f97f ui: Optimize Param Read for Onroad UI (#1365)
* Move params to uiscene

* more

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-12 23:36:58 -04:00
Kumar cb6fa622ee Visuals: Move custom chevron info to sunnypilot/qt (#1066)
* refactor: move to sp ui

* pr suggestion

* no need to check pcm just oplong

* no color, big front, long check

* Fix Rainbow Mode & Y Positioning

* Move param to uiscene

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
Co-authored-by: nayan <nayan8teen@gmail.com>
2025-10-12 23:11:23 -04:00
Nayan 5b29fd0f2c UI: Onroad Screen Timeout Fixes (#1364)
* Screen Timeout Fixes

* rename

* auto type

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-12 12:12:52 -04:00
Nayan 6f42bbab18 Reapply "UI: Make Always Offroad more accessible" (#1327) (#1361)
* UI: Make Always Offroad more accessible

* conditional - based on offroad

* no need to delete

* account for always offroad

* fix offroad transition

* do this inside updateState on every invoke

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-12 01:59:03 -04:00
Nayan b89393a5a2 UI: Blinker Size & State Fix (#1363)
Blinker Size & State Fix

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-12 00:34:15 -04:00
Nayan 1e5758e712 ui: Better E2E Alert UI Positioning (#1355)
Better E2E Alert UI Positioning
2025-10-12 00:21:38 -04:00
James Vecellio-Grant 974a7a3f7d ui: improve toggle states in Developer panel (#1352)
ui: quickboot toggle race condition

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-11 02:47:45 -04:00
Jason Wen fe6edda23a Revert "UI: Make Always Offroad more accessible (#1327)" (#1358)
Reverts #1327
2025-10-11 01:52:33 -04:00
Jason Wen 17e25f78b4 ui: dynamic ICBM status (#1357)
* ui: dynamic ICBM status

* straight up pls
2025-10-10 17:00:44 -04:00
Nayan 9b92cdd2cc ui: fix standstill timer reset when offroad (#1351)
Standstill timer fix
2025-10-09 23:57:09 -04:00
Jason Wen d6317ffd20 mapd: script to update version and hash (#1349)
* init and hash for 1.11.0

* update version and example for 1.12.0
2025-10-09 19:04:43 -04:00
Nayan 3ba52bc6fe ui: New? Old? Different? Standstill Timer UI (#1347)
New Standstill Timer UI

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-09 17:30:59 -04:00
Nayan d7fd78050b OSM: Search!! (#1341)
* OSM Search

* cleanup

* wat

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-09 16:29:55 -04:00
HazZelnutz 8864b79a6e Visuals: Turn signals on screen when blinker is used (#1291)
* get blinker state from car_state

* Draw turn signals when blinker is active

* reloacted and resized turning signals

* add turn signal display setting

* Lowered Blink Frequency

* Moved x and y Offsets to drawing Function

Co-authored-by: Nayan <nayan8teen@gmail.com>

* Grouped Settings

* Moved blinking Logic to pulseElement Function

Co-authored-by: Nayan <nayan8teen@gmail.com>

* Improved Blinker Size and Position

* Get laneChangeBlocked Event from onroadEvents

* Draw Blinker red if laneChangeBlocked event is set

* Revert "Get laneChangeBlocked Event from onroadEvents"

This reverts commit 4310931b6cd59aed22119c2b4b558f09d3ad9c90.

* Get left and right Blindspot

* Replaced laneChangeBlocked by Blindspot checks

* slight optimization

* more refinement

---------

Co-authored-by: Nayan <nayan8teen@gmail.com>
Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-09 15:59:28 -04:00
Nayan e9f054b7ee UI: Adjust Alert display with Developer UI (#1299)
* Adjust Alert Rect for Dev UI

* split out into SP classes

* fix includes

* formatting

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-09 15:26:14 -04:00
Nayan f429f3191f ui: Bug fix Search with special chars (#1344)
Fix Search with special chars

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-09 14:53:47 -04:00
Jason Wen 3df1b53fab ui: update description of Speedometer: Hide from Onroad Screen (#1346) 2025-10-09 14:33:14 -04:00
Jason Wen 6bb87174b9 Revert "CarControlSP: live params (#943)" (#1345)
* Revert "`CarControlSP`: live params (#943)"

This reverts commit b5104377

* bump

* bump
2025-10-09 14:14:12 -04:00
Jason Wen 6d356d520e ui: HUD drawing optimizations and fixes (#1342)
* no duplicated speed drawing

* reuse polygon
2025-10-09 10:28:56 -04:00
Jason Wen 73123aa400 torqued_ext: adjust RELAXED_MIN_BUCKET_POINTS boundary values (#1340) 2025-10-09 07:48:35 -04:00
github-actions[bot] 7dfe03b7a3 [bot] Update translations (#1200)
Update translations

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-09 02:21:09 -04:00
DevTekVE 12a4b1b561 sunnylink: enhance fault handling and parameter checks (#1323)
* enhance sunnylink fault handling and parameter checks

- Added `SunnylinkTempFault` to handle temporary registration issues.
- Updated methods to account for new fault state, improving robustness.
- Improved uploader logic by considering metered network restrictions.

* maybe it was overkill

* Lol, kinda important

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-08 23:37:21 -04:00
Jason Wen 7aac14e6fc ui: Speedometer: Hide from onroad screen (#1336)
* ui: Speedometer: Display True Speed

* update

* ui: Speedometer: Hide from onroad screen

* wrong

* use stock one
2025-10-08 21:54:24 -04:00
Jason Wen ae21d40a19 ui: Speedometer: Always display true speed (#1335)
* ui: Speedometer: Display True Speed

* update

* use stock one
2025-10-08 20:33:19 -04:00
Nayan 41abede7f6 UI: Better layout for onroad screen-off settings (#1334)
* OCD FIX

* MORE FIX.. BECAUSE WE ALL HAVE OCD

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-08 17:55:56 -04:00
Kumar f653566803 mapd: Bump version v1.11.0 -> v1.12.0 (#1288)
v1.12.0

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-08 17:39:14 -04:00
DevTekVE e8a39c4a74 Reapply "sunnylink: enhanced param keys fetch with data type" (#1317)
Reapply "sunnylink: enhanced param keys fetch with data type" (#1316)"

This reverts commit 282a8b093d.

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-08 15:01:33 -04:00
Nayan 517020ffb6 UI: Move Brightness & Interactivity Timeout to Display Panel (#1326)
* UI: Move Brightness & Interactivity Timeout to Display Panel

* why Qt.. WHYY

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-08 13:51:31 -04:00
Jason Wen a85f3ce11c Device: Onroad Uploads button (#1332) 2025-10-08 13:03:15 -04:00
Nayan 014baf8e90 UI: Make Always Offroad more accessible (#1327)
* UI: Make Always Offroad more accessible

* conditional - based on offroad

* no need to delete

* account for always offroad

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-08 12:05:06 -04:00
Nayan 8050c56a43 UI: OptionControlSP - Fix Inline Spacer (#1325)
OptionControlSP - Fix Inline Spacer issue!!

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-07 23:24:18 -04:00
Nayan 0b826002e9 UI: Expandable Row - Fix margins (#1324)
Expandable Row - Fix margins

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-07 22:44:27 -04:00
Jason Wen 408d52d72a NNLC: ensure PID is always initialized properly (#1304) 2025-10-07 21:45:33 -04:00
DevTekVE aeaac22274 ci: refine PR search query to avoid querying whole github (#1330)
* ci: refine PR search query to improve label handling in GitHub Action workflow

- Replaced `label` with `search_query` for better flexibility.
- Added support for multiple labels (`PR_LABEL` and `${PR_LABEL}-c3`).

* ci: fix PR search query for proper label matching in workflow

- Adjusted `label` query syntax to correctly handle multiple labels.

* Update .github/workflows/sunnypilot-master-dev-prep.yaml
2025-10-07 07:45:04 +02:00
github-actions[bot] f28cea759d [bot] Update Python packages (#1250)
Update Python packages

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 02:52:02 -04:00
Jason Wen de64b99740 Torque Lateral Control: customized settings (#1314)
* init

* use internal frame

* exit early if toggle not enabled

* ui init

* ui: replace `static_cast<int>` with `std::nearbyint` for precise rounding

* revert

* update title

* handle live relaxed

* fix

* tweak ui

* toggle behaviors

* lint

* Update torqued_ext.py

* always update

* make sure it's updated properly with offroad states

* fix

* make sure to initialize

---------

Co-authored-by: nayan <nayan8teen@gmail.com>
2025-10-05 23:41:31 -04:00
Nayan 0e1de37281 Bug: Fix Lead Departure Alert Chime (#1328)
make lead-alert ding again
2025-10-05 21:18:03 -04:00
dzid26 5a309daee6 docs: clarify pedal press (#1289)
Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-05 03:38:49 -04:00
dzid26 520649b893 params: Fix loading delay on startup (#1297)
params frame counter init

make sure param_store.update gets processed on first call

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-05 03:34:12 -04:00
DevTekVE 18abe218d9 ci: Disable homebrew cache for MacOS builds (#1322)
* maybe

Revert "fuck"

This reverts commit cb072a73b1b44ac3abeb50196be0956f3b7a7e14.

Revert "i dunno anymore"

This reverts commit 4d3c84ecb0e7830a552237e824995bc255007a1b.

i dunno anymore

fuck

* maybe

* try to fix the pipelines
2025-10-04 18:19:16 +02:00
DevTekVE cca3be3a96 relock after inplace metadrive update (#1321)
relock after inplace metadrive update (#36256)

* relock after inplace metadrive update

* Revert "relock after inplace metadrive update"

This reverts commit 18193ffe34b66085e18605e6c9289ddcd658844d.

* just the hash

(cherry picked from commit 4d53a26a06)

Co-authored-by: Armand du Parc Locmaria <adpl33@gmail.com>
2025-10-04 10:08:08 +02:00
DevTekVE 282a8b093d Revert "sunnylink: enhanced param keys fetch with data type" (#1316)
Revert "sunnylink: enhanced param keys fetch with data type (#1308)"

This reverts commit dcd382ffb8.
2025-10-04 07:42:44 +02:00
Jason Wen 1e7fc15a04 Speed Limit Assist: Update state machine for PCM long cars (#1311)
* Speed Limit Assist: Update state machine for PCM long cars

* new test to catch this wrong transition

* tldr
2025-10-03 18:24:24 -04:00
Jason Wen e999839a57 ui: replace static_cast<int> with std::nearbyint for convert & rounding (#1313)
* ui: replace `static_cast<int>` with `std::nearbyint` for precise rounding

* revert
2025-10-03 17:46:13 -04:00
DevTekVE 1bfecbc9c2 sunnylink: Enabled by default (#1312)
Enable sunnylink by default
2025-10-03 19:43:13 +02:00
DevTekVE dcd382ffb8 sunnylink: enhanced param keys fetch with data type (#1308)
* refactor: enhance parameter handling and add new parameter retrieval method

- Refactored `get_param_as_byte` for better modularity and added `_to_bytes` helper function.
- Introduced `getParamsAllKeysV1` to retrieve all keys with enhanced metadata.

* refactor: update parameter handling and response structure in sunnylink

- Modified `_to_bytes` to accept `bytes` type for improved type consistency.
- Adjusted response keys in `sunnylinkd` for clarity.

* fix: update `get_param_as_byte` to use corrected method for default values

- Replaced `get_default` with `get_default_value` for accurate param retrieval.
- Ensures consistent handling of default parameter values.

* refactor: remove redundant `None` check in `sunnylinkd.py`

- Streamlined parameter iteration by eliminating unnecessary `None` validation.
- Simplifies logic for constructing `params_dict`.

* refactor: streamline `sunnylinkd` response by removing redundant `keys_v1` field

- Simplified return structure by excluding unused `keys_v1` key.
- Reduces response payload for improved efficiency.

* refactor: split `getParamsAllKeys` into distinct functions for improved clarity

- Added `getParamsAllKeysV1` to preserve original metadata-rich behavior.
- Revised `getParamsAllKeys` to return a simplified list of parameter keys.

* style: remove extraneous newline in `sunnylinkd.py`

- Ensures consistent formatting and adheres to style guidelines.

* Test
2025-10-03 19:42:46 +02:00
Jason Wen 09d165a85b Tesla: MADS full support with VEHICLE bus harness (#1310)
* Tesla: MADS full support with VEHICLE bus harness

* bump

* need new arg

* uh

* block cruise main for these cars still

* continue to block tesla

* oops

* always allow for tesla
2025-10-02 16:37:57 -04:00
Nayan 4c4964a740 Device: Wake for all visual alerts (#1309)
this should do it
2025-10-02 14:42:15 -04:00
Nayan 225ce45d31 feat: Lead Departure Alert (#1302)
* init

* fix

* event

* UI

* events..for real

* SP

* ugh

* toggles

* read params first

* stoopid it is

* fix green light img

* fix green light image. for real this time

* move events to longitudinal_planner

* move events to longitudinal_planner

* move e2e alerts to separate class

* fix

* fixxxxxxx

* blinky blink

* blinky blink

* refactor

* more refactor

---------

Co-authored-by: Kumar <36933347+rav4kumar@users.noreply.github.com>
Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-02 13:53:23 -04:00
Nayan 92214b69d8 feat: Green Traffic Light Alert (#1287)
* init

* fix

* event

* UI

* events..for real

* SP

* ugh

* toggles

* read params first

* stoopid it is

* fix green light img

* fix green light image. for real this time

* move events to longitudinal_planner

* move events to longitudinal_planner

* move e2e alerts to separate class

* green light alert only for this PR

* fix

* fixxxxxxx

* blinky blink

* blinky blink

* slight cleanup

* only used for params

* a bit more

* only when long is not engaged

* too long

* update description

* always 3 seconds if not moving

* initialize in constructor instead

* less

* rename

* always init at 0

---------

Co-authored-by: Kumar <36933347+rav4kumar@users.noreply.github.com>
Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-10-01 12:37:10 -04:00
Jason Wen f3ed577870 Longitudinal: reimplement Gas Interceptor (comma Pedal) support (#1290)
* init

* bump

* bump

* bump

* recheck openpilot long availability

* bump

* bump

* bump

* bump

* bump

* just base for now

* bump

* bump

* bump

* bump

* flipped

* apparently it's yucky, reverting most

* bump

* need to add for toyota

* should've been remove

* flipped

* bump

* no way

* fix

* test sdsu distance

* final tuning for pedal

* bump
2025-09-30 22:37:13 -04:00
Nayan 49e58a2532 Device: Driving Screen Off (#1252)
* init

* onroad brightness control

* new icon

* update touch handlling

* don't touch me

* now i feel every touch

* resolve review comments

* tired of this shit

* ugh

* translate

* duplicate

* fix

* adjust

* update param in the same function

* flip

* format

* reorder

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-09-30 21:06:11 -04:00
Jason Wen ae901d1562 ui: add Display settings panel (#1301)
* init

* onroad brightness control

* new icon

* update touch handlling

* don't touch me

* now i feel every touch

* resolve review comments

* tired of this shit

* ugh

* just panel for now

* more

---------

Co-authored-by: nayan <nayan8teen@gmail.com>
2025-09-30 20:17:53 -04:00
Jason Wen 85d2653fda Speed Limit Assist: No Easter Eggs 2025-09-30 17:50:35 -04:00
Jason Wen 0f4828df82 ui: only longitudinal cars can use Speed Limit Assist (#1300) 2025-09-30 13:39:11 -04:00
Jason Wen dc0fd4ca96 Longitudinal: Speed Limit Assist (SLA) (#833)
* formatting

* more

* create directory if does not exist

* mypy my bt

* policy param catch exceptions

* handle all params with exceptions

* more

* single method

* define types in init

* rename

* simpler op enabled check

* more mypy stuff

* rename

* no need for brake pressed

* don't reset if gas pressed

* type hint all

* type hint all

* back to upstream

* in another pr

* no longer need data type

* qlog

* slc in another pr

* use horizontal accuracy

* use horizontal accuracy

* set core affinity for all realtime processes

* unused

* sort

* unused

* type hint and slight cleanup

* from old implementation

* use directly

* combine pm

* slight more cleanup

* type hints

* even more type hint

* Revert "slc in another pr"

This reverts commit 3a6987e6

* Revert "in another pr"

This reverts commit a29bccff12.

* rebump

* no need to check alive

* use it directly

* fix test

* refactor

* use gps data directly

* quote...?

* lint

* fix tests

* use CC.longActive

* user confirm in another PR

* rename

* fix import

* params fix

* no more

* fix

* drop new state machine for now

* more fixes

* internalize output

* unused

* rearrange

* auto draft

* rename

* this

* no

* no need

* use existing

* wrong cruise speed

* fix

* not used for now

* Revert "not used for now"

This reverts commit f0083d6241.

* some

* use frames instead

* split speed limit resolver out of slc

* no need to pass sm

* fix params

* test init

* use frame instead of time

* track session

* some tests

* too limiting

* bump

* always reset state

* end session if long_active but slc inactive at any given time

* off

* no warning in this PR

* no speed factor engage type yet

* wide open

* no

* introduce disabled, no longer transitions at inactive

* fix tests

* no more tempinactive

* clean

* rename

* offset default > off

* new tests, fixes controller

* more tests

* not really needed yet

* lint

* fix

* some more tests

* wrap

* more

* more

* use vCruiseCluster for set speed

* init better

* finish it up

* no

* typo

* one method state machine

* refactor preactive timeout check

* refactor new session check

* directly return statuses

* comments

* v_target

* refactor speed limit resolver

* turn off debug

* more resolver refactor

* no longer needed

* lint

* more lint

* fix

* move around

* fix events

* update event

* already happens while in enabled

* add carstateSP

* less

* Speed Limit Control -> Speed Limit Assist

* in another PR

* more rename

* overriding state

* fix

* make sure to return the correct type

* sync with latest

* housekeeping

* use v cruise cluster instead

* fix var

* show it in UI!

* actually show it

* update event texts

* todo

* no override for now

* wrong timer!

* add vtarget and atarget

* fix

* handle no speed limit events

* fix size

* unused

* skip preActive if init max speed was already reached

* display last known speed limit and its state with SLA

* pending event

* much shorter disable guard

* update events

* convert max init for metric

* fix even if unused atm

* just use it

* red for all

* not disabled

* rename

* 10s pre active

* kumar wants it higher, blame him

* fix

* pcm long only

* some fixes

* rename

* use consolidate method to evaluate set speed status

* init non pcm cruise

* tests

* disable non pcm long state machine for now

* lint

* lint

* let the non PCM party begins

* fix event

* update event

* use speed limit final last

* only do direction checks if preActive

* use resolver

* use it directly

* no longer applies

* do it globally

* non pcm long: adapting or pending unused

* use button events instead of raw vals

* need to initialize

* move

* what?

* what #2???

* cst!

* circular

* slight fixes for tests

* change up checks for user confirm

* get buttonEvents at 100 hz and process for 20 hz consumption

* get v cruise cluster from outer loop

* Revert "get v cruise cluster from outer loop"

This reverts commit be8068e8ab.

* Revert "get buttonEvents at 100 hz and process for 20 hz consumption"

This reverts commit a739d4d437.

* don't need

* do not allow target speed confirm if inactive

* do not allow preActive if no valid speed limit

* gimme them arrow pls

* less

* descriptive direction

* fix event

* update cs in 100 hz

* Revert "don't need"

This reverts commit 1eec763be7.

* missed

* wrong

* stop

* throw them to helpers class

* property

* hold speed behavior changes

* abstract it

* use converted to check last set speed change

* Revert "do not allow target speed confirm if inactive"

This reverts commit 9840e74e

* pre active too short

* slight fixes

* fix tests

* linty lint

* speed limit changed hold timer for non pcm long

* should be 0

* less loopy

* some gates

* special sauce for sla

---------

Co-authored-by: nayan <nayan8teen@gmail.com>
Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-09-30 13:13:45 -04:00
Jason Wen 90adc18032 MADS: enforce certain soft disable events by user when in motion (#1298)
* MADS: enforce soft disable events by user when the vehicle is in motion

* flipped
2025-09-29 19:18:52 -04:00
Jason Wen db65937fc7 Revert "ui: generic check with ICBM param" (#1286)
Revert "ui: generic check with ICBM param (#1274)"

This reverts commit d5a873ed86.
2025-09-25 19:15:36 -04:00
James Vecellio-Grant 8ebe9b69af bug: fix Speed Limit Resolver initialization (#1285)
bug: fix speedlimitresolver init
2025-09-25 10:11:51 -04:00
Jason Wen 4c40be8b1f ui: always convert speedLimitFinalLast 2025-09-25 07:01:32 -04:00
Jason Wen 082ea8119b Speed Limit Resolver: abstract more speed limit attributes (#1284)
* Speed Limit Resolver: abstract more speed limit attributes

* update ui

* lint
2025-09-24 22:17:03 -04:00
Jason Wen 1465e38c7b SCC-M: overriding is an enabled state (#1281) 2025-09-23 10:11:52 -04:00
Jason Wen ecee67dd64 Locationd: reimplement liveLocationKalman and use position_geodetic in liveMapDataSP (#1275)
* init

* desc

* llk welcome back

* more

* new param to write

* update mapd

* no migration

* no refactor for now

* exec

* rename

* bearing

* fix test

* lint
2025-09-22 23:39:55 -04:00
Jason Wen ea6178e53e Smart Cruise Control: Map (SCC-M) (#1280)
* init

* more

* a bit more

* expose

* bruh

* some fixes

* ui

* lint

* Update map_controller.py

* add overriding

* draw in orders
2025-09-22 22:54:45 -04:00
Jason Wen 01a0ad496d ui: more speed limit improvements (#1278)
* ui: more speed limit improvements

- show speed limit offset with last valid speed limit
- show last valid speed limit if current speed limit is not valid

* rename

* round it

* update logic

* in its own var and 5 frames now

* new offset vals

* slightly more

* apply suggestions
2025-09-22 19:50:59 -04:00
Jason Wen b64d5a0fa4 liveMapDataSP: parse bearing from GPS (#1279)
* simpler approach pls

* fix
2025-09-22 09:39:22 -04:00
Jason Wen 005c6aed95 ui: separate road name toggle param and bigger fonts (#1277)
* ui: separate road name toggle param and bigger fonts

* slightly lower
2025-09-22 08:54:16 -04:00
Jason Wen 2fa66d6f4d ui: include Speed Limit Offset for Speed Limit Warning (#1276)
* ui: include Speed Limit Offset for Speed Limit Warning

* fix
2025-09-22 01:35:13 -04:00
Jason Wen d5a873ed86 ui: generic check with ICBM param (#1274) 2025-09-21 02:53:03 -04:00
Jason Wen 563ae65443 ui: Road Name param should be persistent (#1273) 2025-09-21 00:33:43 -04:00
Jason Wen 2efe78a4ef ICBM: allow button commands at all speeds (#1271)
* ICBM: allow button commands at all speeds

* use openpilot state
2025-09-20 17:48:13 -04:00
Jason Wen 569a9216db ui: only draw speed limit offset when speed limit is valid (#1270) 2025-09-20 17:36:13 -04:00
Jason Wen 629cfd845f ui: fix scrolling behavior in Speed Limit settings (#1269)
* rename

* ui: fix scrolling behavior in Speed Limit settings
2025-09-20 17:23:24 -04:00
Jason Wen 2892dc05c8 mapd: use SubMaster polling to validate GPS status (#1268) 2025-09-20 16:20:22 -04:00
Jason Wen 632b416f2a ICBM: use longitudinalPlanSP.vTarget directly for evaluation (#1266)
* ICBM: add SCC-V to v_targets list

* Longitudinal planner: expose custom vTarget and aTarget

* use the source directly
2025-09-20 14:22:10 -04:00
Jason Wen 5f3821c1f9 Longitudinal planner: expose custom vTarget and aTarget (#1267) 2025-09-20 12:21:13 -04:00
Jason Wen 55b7529ca4 ui: Road Name (#1265) 2025-09-20 05:23:02 -04:00
Jason Wen c248f307f8 ui: Speed Limit Warning (#1263)
* ui: Speed Limit Warning

* missed

* behind toggle

* missed

* reorder

* fix type
2025-09-20 01:59:07 -04:00
Jason Wen bdb83b6be1 ui: remove redundant code (#1262) 2025-09-20 01:40:51 -04:00
Kumar c55f40e77d ui: Speed Limit Information (#995)
* less for now

* always on and fix conv

* update api

* missed

* fix convert

* only draw when decreasing, seems like a bug from mapd

* use frame check, otherwise too jumpy

* only update when mapd updates

* count up and down

* introduce toggle

* more ui

* slightly wider

* desc

* rename

* slight cleanup

* fix offset position

* more vienna fix

* fix ahead alignment

* road name in another PR

* cleanup

* single place

* adjust ahead distance display

* cleanup

* Near

* bump it

* cleanup logic

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-09-20 01:01:08 -04:00
Jason Wen ddf63701e8 Speed Limit: Resolver (#1256)
* init

* some fixes

* move

* more

* old navd helpers

* bring back cereal

* fix linting

* more

* add to cereal first

* sp events

* lint

* implement in long plan

* fixme-sp

* refactor state machine

* wrong state

* start refactor controller

* some type hints

* init these

* enable debug print

* ui? ui!

* print them out

* fix spinner import

* fix path

* let's use gps chips directly for now

* service missing

* publish events

* no nav for now

* need to sub

* no car state speed yet

* missed event

* Car: `CarStateSP`

* fix tests

* bring back car state speed limit

* fix

* use old controller for now

* fix

* fix source

* type hints

* none for now

* formatting

* more

* create directory if does not exist

* mypy my bt

* policy param catch exceptions

* handle all params with exceptions

* more

* single method

* define types in init

* rename

* simpler op enabled check

* more mypy stuff

* rename

* no need for brake pressed

* don't reset if gas pressed

* type hint all

* type hint all

* back to upstream

* in another pr

* no longer need data type

* qlog

* slc in another pr

* use horizontal accuracy

* use horizontal accuracy

* set core affinity for all realtime processes

* unused

* sort

* unused

* type hint and slight cleanup

* from old implementation

* use directly

* combine pm

* slight more cleanup

* type hints

* even more type hint

* Revert "slc in another pr"

This reverts commit 3a6987e6

* Revert "in another pr"

This reverts commit a29bccff12.

* rebump

* no need to check alive

* use it directly

* fix test

* refactor

* use gps data directly

* quote...?

* lint

* fix tests

* use CC.longActive

* user confirm in another PR

* rename

* fix import

* params fix

* no more

* fix

* drop new state machine for now

* more fixes

* internalize output

* unused

* rearrange

* auto draft

* rename

* this

* no

* no need

* use existing

* wrong cruise speed

* fix

* not used for now

* Revert "not used for now"

This reverts commit f0083d6241.

* some

* use frames instead

* split speed limit resolver out of slc

* no need to pass sm

* fix params

* test init

* use frame instead of time

* track session

* some tests

* too limiting

* bump

* always reset state

* end session if long_active but slc inactive at any given time

* off

* no warning in this PR

* no speed factor engage type yet

* wide open

* no

* introduce disabled, no longer transitions at inactive

* fix tests

* no more tempinactive

* clean

* rename

* offset default > off

* new tests, fixes controller

* more tests

* not really needed yet

* lint

* fix

* some more tests

* wrap

* more

* more

* use vCruiseCluster for set speed

* init better

* finish it up

* no

* typo

* one method state machine

* refactor preactive timeout check

* refactor new session check

* directly return statuses

* comments

* v_target

* refactor speed limit resolver

* turn off debug

* more resolver refactor

* no longer needed

* lint

* more lint

* fix

* move around

* fix events

* update event

* already happens while in enabled

* add carstateSP

* less

* Speed Limit Control -> Speed Limit Assist

* in another PR

* more rename

* overriding state

* fix

* make sure to return the correct type

* just slr in this one

* more

* update

* redundant

* fix

* fix

* lint

* fix

* fix

* match toggle

* fix priority checks

* fix combined source for picking 0 limit

* no need to wrap

* add speed limit offset to resolver

* add speed limit offset

* make sure it displays distance when higher

* Revert "make sure it displays distance when higher"

This reverts commit 15c6834d4e.

* some rename

* translations

* unused for now

* more

* lint

---------

Co-authored-by: nayan <nayan8teen@gmail.com>
Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-09-19 18:32:20 -04:00
Jason Wen 28098bb7c4 ICBM: disable hysteresis (#1260)
* ICBM: disable hysteresis

* notes
2025-09-19 17:36:33 -04:00
Kumar 60e056cc0a mapd: Bump version v1.10.0 -> v1.11.0 (#1111)
* bump mapd v1.10.1

* v1.11.0

* v1.11.0

* permission

---------

Co-authored-by: DevTekVE <devtekve@gmail.com>
Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-09-19 00:34:03 -04:00
Jason Wen fb743d313e Reapply "Intelligent Cruise Button Management (ICBM)" (#1257) (#1258)
* Reapply "Intelligent Cruise Button Management (ICBM)" (#1257)

This reverts commit 4441671227.

* ICBM: `pcmCruiseSpeed` is true during initialization

* bump

* fix tests
2025-09-18 16:47:40 -04:00
Jason Wen 4441671227 Revert "Intelligent Cruise Button Management (ICBM)" (#1257)
Revert "Intelligent Cruise Button Management (ICBM) (#1242)"

This reverts commit 1f8941367d.
2025-09-18 16:02:51 -04:00
205 changed files with 14316 additions and 1160 deletions
+3
View File
@@ -115,7 +115,9 @@ jobs:
- run: echo "CACHE_COMMIT_DATE=$(git log -1 --pretty='format:%cd' --date=format:'%Y-%m-%d-%H:%M')" >> $GITHUB_ENV
- name: Homebrew cache
uses: ./.github/workflows/auto-cache
if: false # disabling the cache for now because it is breaking macos builds...
with:
save: false # No need save here if we manually save it later conditionally
path: ~/Library/Caches/Homebrew
key: brew-macos-${{ env.CACHE_COMMIT_DATE }}-${{ github.sha }}
restore-keys: |
@@ -136,6 +138,7 @@ jobs:
- name: Getting scons cache
uses: ./.github/workflows/auto-cache
with:
save: false # No need save here if we manually save it later conditionally
path: /tmp/scons_cache
key: scons-${{ runner.arch }}-macos-${{ env.CACHE_COMMIT_DATE }}-${{ github.sha }}
restore-keys: |
@@ -118,8 +118,8 @@ jobs:
run: |
# Use GitHub API to get PRs with specific label, ordered by creation date
PR_LIST=$(gh api graphql -f query='
query($label:String!) {
search(query: $label, type:ISSUE, first:100) {
query($search_query:String!) {
search(query: $search_query, type:ISSUE, first:100) {
nodes {
... on PullRequest {
number
@@ -149,7 +149,7 @@ jobs:
}
}
}
}' -F label="is:pr is:open label:${PR_LABEL} draft:false sort:created-asc")
}' -F search_query="repo:${{ github.repository }} is:pr is:open label:${PR_LABEL},${PR_LABEL}-c3 draft:false sort:created-asc")
PR_LIST=${PR_LIST//\'/}
echo "PR_LIST=${PR_LIST}" >> $GITHUB_OUTPUT
+88 -7
View File
@@ -145,6 +145,12 @@ struct LongitudinalPlanSP @0xf35cc4560bbf6ec2 {
dec @0 :DynamicExperimentalControl;
longitudinalPlanSource @1 :LongitudinalPlanSource;
smartCruiseControl @2 :SmartCruiseControl;
speedLimit @3 :SpeedLimit;
vTarget @4 :Float32;
aTarget @5 :Float32;
events @6 :List(OnroadEventSP.Event);
e2eAlerts @7 :E2eAlerts;
accelPersonality @8 :AccelerationPersonality;
struct DynamicExperimentalControl {
state @0 :DynamicExperimentalControlState;
@@ -159,6 +165,7 @@ struct LongitudinalPlanSP @0xf35cc4560bbf6ec2 {
struct SmartCruiseControl {
vision @0 :Vision;
map @1 :Map;
struct Vision {
state @0 :VisionState;
@@ -170,6 +177,14 @@ struct LongitudinalPlanSP @0xf35cc4560bbf6ec2 {
active @6 :Bool;
}
struct Map {
state @0 :MapState;
vTarget @1 :Float32;
aTarget @2 :Float32;
enabled @3 :Bool;
active @4 :Bool;
}
enum VisionState {
disabled @0; # System disabled or inactive.
enabled @1; # No predicted substantial turn on vision range.
@@ -178,11 +193,70 @@ struct LongitudinalPlanSP @0xf35cc4560bbf6ec2 {
leaving @4; # Road ahead straightens. Start to allow positive acceleration.
overriding @5; # System overriding with manual control.
}
enum MapState {
disabled @0; # System disabled or inactive.
enabled @1; # No predicted substantial turn on map range.
turning @2; # Actively turning. Managing acceleration to provide a roll on turn feeling.
overriding @3; # System overriding with manual control.
}
}
struct SpeedLimit {
resolver @0 :Resolver;
assist @1 :Assist;
struct Resolver {
speedLimit @0 :Float32;
distToSpeedLimit @1 :Float32;
source @2 :Source;
speedLimitOffset @3 :Float32;
speedLimitLast @4 :Float32;
speedLimitFinal @5 :Float32;
speedLimitFinalLast @6 :Float32;
speedLimitValid @7 :Bool;
speedLimitLastValid @8 :Bool;
}
struct Assist {
state @0 :AssistState;
enabled @1 :Bool;
active @2 :Bool;
vTarget @3 :Float32;
aTarget @4 :Float32;
}
enum Source {
none @0;
car @1;
map @2;
}
enum AssistState {
disabled @0;
inactive @1; # No speed limit set or not enabled by parameter.
preActive @2;
pending @3; # Awaiting new speed limit.
adapting @4; # Reducing speed to match new speed limit.
active @5; # Cruising at speed limit.
}
}
enum LongitudinalPlanSource {
cruise @0;
sccVision @1;
sccMap @2;
speedLimitAssist @3;
}
struct E2eAlerts {
greenLightAlert @0 :Bool;
leadDepartAlert @1 :Bool;
}
enum AccelerationPersonality {
sport @0;
normal @1;
eco @2;
}
}
@@ -225,14 +299,20 @@ struct OnroadEventSP @0xda96579883444c35 {
pedalPressedAlertOnly @16;
laneTurnLeft @17;
laneTurnRight @18;
speedLimitPreActive @19;
speedLimitActive @20;
speedLimitChanged @21;
speedLimitPending @22;
e2eChime @23;
}
}
struct CarParamsSP @0x80ae746ee2596b11 {
flags @0 :UInt32; # flags for car specific quirks in sunnypilot
safetyParam @1 : Int16; # flags for sunnypilot's custom safety flags
pcmCruiseSpeed @3 :Bool = true;
pcmCruiseSpeed @3 :Bool;
intelligentCruiseButtonManagementAvailable @4 :Bool;
enableGasInterceptor @5 :Bool;
neuralNetworkLateralControl @2 :NeuralNetworkLateralControl;
@@ -261,7 +341,7 @@ struct CarControlSP @0xa5cd762cd951a455 {
valueDEPRECATED @1 :Text; # The data type change may cause issues with backwards compatibility.
}
enum ParamType {
string @0;
bool @1;
@@ -316,6 +396,7 @@ struct BackupManagerSP @0xf98d843bfd7004a3 {
}
struct CarStateSP @0xb86e6369214c01c8 {
speedLimit @0 :Float32;
}
struct LiveMapDataSP @0xf416ec09499d9d19 {
@@ -331,11 +412,11 @@ struct ModelDataV2SP @0xa1680744031fdb2d {
laneTurnDirection @0 :TurnDirection;
}
enum TurnDirection {
none @0;
turnLeft @1;
turnRight @2;
}
enum TurnDirection {
none @0;
turnLeft @1;
turnRight @2;
}
struct CustomReserved10 @0xcb9fd56c7057593a {
}
+1 -1
View File
@@ -2684,7 +2684,7 @@ struct Event {
lateralPlanDEPRECATED @64 :LateralPlan;
navModelDEPRECATED @104 :NavModelData;
uiPlanDEPRECATED @106 :UiPlan;
liveLocationKalmanDEPRECATED @72 :LiveLocationKalman;
liveLocationKalman @72 :LiveLocationKalman;
liveTracksDEPRECATED @16 :List(LiveTracksDEPRECATED);
onroadEventsDEPRECATED @68: List(Car.OnroadEventDEPRECATED);
}
+1
View File
@@ -89,6 +89,7 @@ _services: dict[str, tuple] = {
"carStateSP": (True, 100., 10),
"liveMapDataSP": (True, 1., 1),
"modelDataV2SP": (True, 20.),
"liveLocationKalman": (True, 20.),
# debug
"uiDebug": (True, 0., 1),
+38 -3
View File
@@ -130,6 +130,7 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"Version", {PERSISTENT, STRING}},
// --- sunnypilot params --- //
{"AccelPersonality", {PERSISTENT | BACKUP, INT, std::to_string(static_cast<int>(cereal::LongitudinalPlanSP::AccelerationPersonality::NORMAL))}},
{"ApiCache_DriveStats", {PERSISTENT, JSON}},
{"AutoLaneChangeBsmDelay", {PERSISTENT | BACKUP, BOOL, "0"}},
{"AutoLaneChangeTimer", {PERSISTENT | BACKUP, INT, "0"}},
@@ -148,20 +149,32 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"DevUIInfo", {PERSISTENT | BACKUP, INT, "0"}},
{"EnableCopyparty", {PERSISTENT | BACKUP, BOOL}},
{"EnableGithubRunner", {PERSISTENT | BACKUP, BOOL}},
{"GreenLightAlert", {PERSISTENT | BACKUP, BOOL, "0"}},
{"GithubRunnerSufficientVoltage", {CLEAR_ON_MANAGER_START , BOOL}},
{"HideVEgoUI", {PERSISTENT | BACKUP, BOOL, "0"}},
{"IntelligentCruiseButtonManagement", {PERSISTENT | BACKUP , BOOL}},
{"InteractivityTimeout", {PERSISTENT | BACKUP, INT, "0"}},
{"IsDevelopmentBranch", {CLEAR_ON_MANAGER_START, BOOL}},
{"LastGPSPositionLLK", {PERSISTENT, STRING}},
{"LeadDepartAlert", {PERSISTENT | BACKUP, BOOL, "0"}},
{"MaxTimeOffroad", {PERSISTENT | BACKUP, INT, "1800"}},
{"ModelRunnerTypeCache", {CLEAR_ON_ONROAD_TRANSITION, INT}},
{"OffroadMode", {CLEAR_ON_MANAGER_START, BOOL}},
{"Offroad_TiciSupport", {CLEAR_ON_MANAGER_START, JSON}},
{"OnroadScreenOffBrightness", {PERSISTENT | BACKUP, INT, "100"}},
{"OnroadScreenOffControl", {PERSISTENT | BACKUP, BOOL}},
{"OnroadScreenOffTimer", {PERSISTENT | BACKUP, INT, "0"}},
{"OnroadUploads", {PERSISTENT | BACKUP, BOOL, "1"}},
{"QuickBootToggle", {PERSISTENT | BACKUP, BOOL, "0"}},
{"QuietMode", {PERSISTENT | BACKUP, BOOL, "0"}},
{"RainbowMode", {PERSISTENT | BACKUP, BOOL, "0"}},
{"ShowAdvancedControls", {PERSISTENT | BACKUP, BOOL, "0"}},
{"SmartCruiseControlVision", {PERSISTENT | BACKUP, BOOL, "0"}},
{"ShowTurnSignals", {PERSISTENT | BACKUP, BOOL, "0"}},
{"StandstillTimer", {PERSISTENT | BACKUP, BOOL, "0"}},
{"TrueVEgoUI", {PERSISTENT | BACKUP, BOOL, "0"}},
{"VibePersonalityEnabled", {PERSISTENT | BACKUP, BOOL, "0"}},
{"VibeAccelPersonalityEnabled", {PERSISTENT | BACKUP, BOOL, "0"}},
{"VibeFollowPersonalityEnabled", {PERSISTENT | BACKUP, BOOL, "0"}},
// MADS params
{"Mads", {PERSISTENT | BACKUP, BOOL, "1"}},
@@ -187,7 +200,8 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"SunnylinkCache_Users", {PERSISTENT, STRING}},
{"SunnylinkDongleId", {PERSISTENT, STRING}},
{"SunnylinkdPid", {PERSISTENT, INT}},
{"SunnylinkEnabled", {PERSISTENT, BOOL}},
{"SunnylinkEnabled", {PERSISTENT, BOOL, "1"}},
{"SunnylinkTempFault", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, BOOL, "0"}},
// Backup Manager params
{"BackupManager_CreateBackup", {PERSISTENT, BOOL}},
@@ -203,7 +217,7 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"LagdToggle", {PERSISTENT | BACKUP, BOOL, "1"}},
{"LagdToggleDelay", {PERSISTENT | BACKUP, FLOAT, "0.2"}},
{"LagdValueCache", {PERSISTENT, FLOAT, "0.2"}},
{"LaneTurnDesire", {PERSISTENT | BACKUP, INT, "0"}},
{"LaneTurnDesire", {PERSISTENT | BACKUP, BOOL, "0"}},
{"LaneTurnValue", {PERSISTENT | BACKUP, FLOAT, "19.0"}},
// mapd
@@ -225,4 +239,25 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"OsmStateTitle", {PERSISTENT, STRING}},
{"OsmWayTest", {PERSISTENT, STRING}},
{"RoadName", {CLEAR_ON_ONROAD_TRANSITION, STRING}},
{"RoadNameToggle", {PERSISTENT, STRING}},
// Speed Limit
{"SpeedLimitMode", {PERSISTENT | BACKUP, INT, "1"}},
{"SpeedLimitOffsetType", {PERSISTENT | BACKUP, INT, "0"}},
{"SpeedLimitPolicy", {PERSISTENT | BACKUP, INT, "3"}},
{"SpeedLimitValueOffset", {PERSISTENT | BACKUP, INT, "0"}},
// Smart Cruise Control
{"MapTargetVelocities", {CLEAR_ON_ONROAD_TRANSITION, STRING}},
{"SmartCruiseControlMap", {PERSISTENT | BACKUP, BOOL, "0"}},
{"SmartCruiseControlVision", {PERSISTENT | BACKUP, BOOL, "0"}},
// Torque lateral control custom params
{"CustomTorqueParams", {PERSISTENT | BACKUP , BOOL}},
{"EnforceTorqueControl", {PERSISTENT | BACKUP, BOOL}},
{"LiveTorqueParamsToggle", {PERSISTENT | BACKUP , BOOL}},
{"LiveTorqueParamsRelaxedToggle", {PERSISTENT | BACKUP , BOOL}},
{"TorqueParamsOverrideEnabled", {PERSISTENT | BACKUP, BOOL, "0"}},
{"TorqueParamsOverrideFriction", {PERSISTENT | BACKUP, FLOAT, "0.1"}},
{"TorqueParamsOverrideLatAccelFactor", {PERSISTENT | BACKUP, FLOAT, "2.5"}},
};
+1
View File
@@ -36,6 +36,7 @@ const double MS_TO_KPH = 3.6;
const double MS_TO_MPH = MS_TO_KPH * KM_TO_MILE;
const double METER_TO_MILE = KM_TO_MILE / 1000.0;
const double METER_TO_FOOT = 3.28084;
const double METER_TO_KM = 1. / 1000.0;
#define ALIGNED_SIZE(x, align) (((x) + (align)-1) & ~((align)-1))
+6 -3
View File
@@ -4,7 +4,7 @@
A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified.
# 334 Supported Cars
# 337 Supported Cars
|Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|<a href="##"><img width=2000></a>Hardware Needed<br>&nbsp;|Video|Setup Video|
|---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
@@ -83,7 +83,7 @@ A supported vehicle is one that just works when you install a comma device. All
|Honda|Civic Hatchback 2017-18|Honda Sensing|openpilot available[<sup>1</sup>](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback 2017-18">Buy Here</a></sub></details>|||
|Honda|Civic Hatchback 2019-21|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback 2019-21">Buy Here</a></sub></details>|||
|Honda|Civic Hatchback 2022-24|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback 2022-24">Buy Here</a></sub></details>|<a href="https://youtu.be/ytiOT5lcp6Q" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>||
|Honda|Civic Hatchback Hybrid 2025|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback Hybrid 2025">Buy Here</a></sub></details>|||
|Honda|Civic Hatchback Hybrid 2025-26|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback Hybrid 2025-26">Buy Here</a></sub></details>|||
|Honda|Civic Hatchback Hybrid (Europe only) 2023|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback Hybrid (Europe only) 2023">Buy Here</a></sub></details>|||
|Honda|Civic Hybrid 2025|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hybrid 2025">Buy Here</a></sub></details>|||
|Honda|Clarity 2018-21|Honda Sensing|openpilot|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector + Honda Clarity Proxy Board<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://shop.retropilot.org/product/honda-clarity-proxy-board-kit">Buy Here</a></sub></details>|||
@@ -99,7 +99,9 @@ A supported vehicle is one that just works when you install a comma device. All
|Honda|HR-V 2023-25|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda HR-V 2023-25">Buy Here</a></sub></details>|||
|Honda|Insight 2019-22|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Insight 2019-22">Buy Here</a></sub></details>|||
|Honda|Inspire 2018|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Inspire 2018">Buy Here</a></sub></details>|||
|Honda|N-Box 2018|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|11 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda N-Box 2018">Buy Here</a></sub></details>|||
|Honda|Odyssey 2018-20|Honda Sensing|openpilot|26 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Odyssey 2018-20">Buy Here</a></sub></details>|||
|Honda|Odyssey 2021-25|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|43 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Odyssey 2021-25">Buy Here</a></sub></details>|||
|Honda|Passport 2019-25|All|openpilot|26 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Passport 2019-25">Buy Here</a></sub></details>|||
|Honda|Pilot 2016-22|Honda Sensing|openpilot|26 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Pilot 2016-22">Buy Here</a></sub></details>|||
|Honda|Pilot 2023-25|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch C connector<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Pilot 2023-25">Buy Here</a></sub></details>|||
@@ -163,6 +165,7 @@ A supported vehicle is one that just works when you install a comma device. All
|Kia|EV6 (without HDA II) 2022-24[<sup>6</sup>](#footnotes)|Highway Driving Assist|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai L connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia EV6 (without HDA II) 2022-24">Buy Here</a></sub></details>|||
|Kia|Forte 2019-21|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|6 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai G connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia Forte 2019-21">Buy Here</a></sub></details>|||
|Kia|Forte 2022-23|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai E connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia Forte 2022-23">Buy Here</a></sub></details>|||
|Kia|Forte Non-SCC 2019|No Smart Cruise Control (Non-SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai G connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia Forte Non-SCC 2019">Buy Here</a></sub></details>|||
|Kia|K5 2021-24|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia K5 2021-24">Buy Here</a></sub></details>|||
|Kia|K5 Hybrid 2020-22|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia K5 Hybrid 2020-22">Buy Here</a></sub></details>|||
|Kia|K8 Hybrid (with HDA II) 2023[<sup>6</sup>](#footnotes)|Highway Driving Assist II|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai Q connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia K8 Hybrid (with HDA II) 2023">Buy Here</a></sub></details>|||
@@ -259,7 +262,7 @@ A supported vehicle is one that just works when you install a comma device. All
|Tesla[<sup>11</sup>](#footnotes)|Model 3 (with HW3) 2019-23[<sup>10</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Tesla A connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Tesla Model 3 (with HW3) 2019-23">Buy Here</a></sub></details>|||
|Tesla[<sup>11</sup>](#footnotes)|Model 3 (with HW4) 2024-25[<sup>10</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Tesla B connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Tesla Model 3 (with HW4) 2024-25">Buy Here</a></sub></details>|||
|Tesla[<sup>11</sup>](#footnotes)|Model Y (with HW3) 2020-23[<sup>10</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Tesla A connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Tesla Model Y (with HW3) 2020-23">Buy Here</a></sub></details>|||
|Tesla[<sup>11</sup>](#footnotes)|Model Y (with HW4) 2024[<sup>10</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Tesla B connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Tesla Model Y (with HW4) 2024">Buy Here</a></sub></details>|||
|Tesla[<sup>11</sup>](#footnotes)|Model Y (with HW4) 2024-25[<sup>10</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Tesla B connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Tesla Model Y (with HW4) 2024-25">Buy Here</a></sub></details>|||
|Toyota|Alphard 2019-20|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Toyota Alphard 2019-20">Buy Here</a></sub></details>|||
|Toyota|Alphard Hybrid 2021|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Toyota Alphard Hybrid 2021">Buy Here</a></sub></details>|||
|Toyota|Avalon 2016|Toyota Safety Sense P|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Toyota Avalon 2016">Buy Here</a></sub></details>|||
+3 -2
View File
@@ -71,7 +71,7 @@ class Car:
def __init__(self, CI=None, RI=None) -> None:
self.can_sock = messaging.sub_sock('can', timeout=20)
self.sm = messaging.SubMaster(['pandaStates', 'carControl', 'onroadEvents'] + ['carControlSP'])
self.sm = messaging.SubMaster(['pandaStates', 'carControl', 'onroadEvents'] + ['carControlSP', 'longitudinalPlanSP'])
self.pm = messaging.PubMaster(['sendcan', 'carState', 'carParams', 'carOutput', 'liveTracks'] + ['carParamsSP', 'carStateSP'])
self.can_rcv_cum_timeout_counter = 0
@@ -124,7 +124,7 @@ class Car:
self.CP.alternativeExperience = 0
# mads
set_alternative_experience(self.CP, self.params)
set_alternative_experience(self.CP, self.CP_SP, self.params)
set_car_specific_params(self.CP, self.CP_SP, self.params)
# Dynamic Experimental Control
@@ -216,6 +216,7 @@ class Car:
if can_rcv_valid and REPLAY:
self.can_log_mono_time = messaging.log_from_bytes(can_strs[0]).logMonoTime
self.v_cruise_helper.update_speed_limit_assist(self.is_metric, self.sm['longitudinalPlanSP'])
self.v_cruise_helper.update_v_cruise(CS, self.sm['carControl'].enabled, self.is_metric)
if self.sm['carControl'].enabled and not self.CC_prev.enabled:
# Use CarState w/ buttons from the step selfdrived enables on
+7
View File
@@ -53,6 +53,7 @@ class VCruiseHelper(VCruiseHelperSP):
if not self.CP.pcmCruise or (not self.CP_SP.pcmCruiseSpeed and _enabled):
# if stock cruise is completely disabled, then we can use our own set speed logic
self._update_v_cruise_non_pcm(CS, _enabled, is_metric)
self.update_speed_limit_assist_v_cruise_non_pcm()
self.v_cruise_cluster_kph = self.v_cruise_kph
self.update_button_timers(CS, enabled)
else:
@@ -104,6 +105,12 @@ class VCruiseHelper(VCruiseHelperSP):
if not self.button_change_states[button_type]["enabled"]:
return
# Speed Limit Assist for Non PCM long cars.
# True: Disallow set speed changes when user confirmed the target set speed during preActive state
# False: Allow set speed changes as SLA is not requesting user confirmation
if self.update_speed_limit_assist_pre_active_confirmed(button_type):
return
long_press, v_cruise_delta = VCruiseHelperSP.update_v_cruise_delta(self, long_press, v_cruise_delta)
if long_press and self.v_cruise_kph % v_cruise_delta != 0: # partial interval
self.v_cruise_kph = CRUISE_NEAREST_FUNC[button_type](self.v_cruise_kph / v_cruise_delta) * v_cruise_delta
+1 -1
View File
@@ -57,7 +57,7 @@ def convert_carControlSP(struct: capnp.lib.capnp._DynamicStructReader) -> struct
struct_dataclass = structs.CarControlSP(**remove_deprecated({k: v for k, v in struct_dict.items() if not isinstance(k, dict)}))
struct_dataclass.mads = structs.ModularAssistiveDrivingSystem(**remove_deprecated(struct_dict.get('mads', {})))
struct_dataclass.params = [structs.CarControlSP.Param(**remove_deprecated(p)) for p in struct_dict.get('params', [])]
# struct_dataclass.params = [structs.CarControlSP.Param(**remove_deprecated(p)) for p in struct_dict.get('params', [])]
struct_dataclass.leadOne = structs.LeadData(**remove_deprecated(struct_dict.get('leadOne', {})))
struct_dataclass.leadTwo = structs.LeadData(**remove_deprecated(struct_dict.get('leadTwo', {})))
struct_dataclass.intelligentCruiseButtonManagement = structs.IntelligentCruiseButtonManagement(
+1 -1
View File
@@ -60,7 +60,7 @@ class TestCarInterfaces:
# Test controller initialization
# TODO: wait until card refactor is merged to run controller a few times,
# hypothesis also slows down significantly with just one more message draw
LongControl(car_params)
LongControl(car_params, car_params_sp)
if car_params.steerControlType == CarParams.SteerControlType.angle:
LatControlAngle(car_params, car_params_sp, car_interface)
elif car_params.lateralTuning.which() == 'pid':
+3 -3
View File
@@ -44,12 +44,12 @@ class TestCruiseSpeed:
assert simulation_steady_state == pytest.approx(cruise_speed, abs=.01), f'Did not reach {self.speed} m/s'
# TODO: test pcmCruise
@parameterized_class(('pcm_cruise',), [(False,)])
# TODO: test pcmCruise and pcmCruiseSpeed
@parameterized_class(('pcm_cruise', 'pcm_cruise_speed'), [(False, True)])
class TestVCruiseHelper:
def setup_method(self):
self.CP = car.CarParams(pcmCruise=self.pcm_cruise)
self.CP_SP = custom.CarParamsSP()
self.CP_SP = custom.CarParamsSP(pcmCruiseSpeed=self.pcm_cruise_speed)
self.v_cruise_helper = VCruiseHelper(self.CP, self.CP_SP)
self.reset_cruise_speed_state()
+1 -1
View File
@@ -58,7 +58,7 @@ class Controls(ControlsExt, ModelStateBase):
self.pose_calibrator = PoseCalibrator()
self.calibrated_pose: Pose | None = None
self.LoC = LongControl(self.CP)
self.LoC = LongControl(self.CP, self.CP_SP)
self.VM = VehicleModel(self.CP)
self.LaC: LatControl
if self.CP.steerControlType == car.CarParams.SteerControlType.angle:
+19 -9
View File
@@ -1,4 +1,4 @@
from cereal import log
from cereal import log, custom
from openpilot.common.constants import CV
from openpilot.common.realtime import DT_MDL
from openpilot.sunnypilot.selfdrive.controls.lib.auto_lane_change import AutoLaneChangeController, AutoLaneChangeMode
@@ -31,6 +31,12 @@ DESIRES = {
},
}
TURN_DESIRES = {
custom.TurnDirection.none: log.Desire.none,
custom.TurnDirection.turnLeft: log.Desire.turnLeft,
custom.TurnDirection.turnRight: log.Desire.turnRight,
}
class DesireHelper:
def __init__(self):
@@ -42,7 +48,8 @@ class DesireHelper:
self.prev_one_blinker = False
self.desire = log.Desire.none
self.alc = AutoLaneChangeController(self)
self.lane_turn_controller = LaneTurnController()
self.lane_turn_controller = LaneTurnController(self)
self.lane_turn_direction = custom.TurnDirection.none
@staticmethod
def get_lane_change_direction(CS):
@@ -50,10 +57,16 @@ class DesireHelper:
def update(self, carstate, lateral_active, lane_change_prob):
self.alc.update_params()
self.lane_turn_controller.update_params()
v_ego = carstate.vEgo
one_blinker = carstate.leftBlinker != carstate.rightBlinker
below_lane_change_speed = v_ego < LANE_CHANGE_SPEED_MIN
# Lane turn controller update
self.lane_turn_controller.update_lane_turn(blindspot_left=carstate.leftBlindspot, blindspot_right=carstate.rightBlindspot,
left_blinker=carstate.leftBlinker, right_blinker=carstate.rightBlinker, v_ego=v_ego)
self.lane_turn_direction = self.lane_turn_controller.get_turn_direction()
if not lateral_active or self.lane_change_timer > LANE_CHANGE_TIME_MAX or self.alc.lane_change_set_timer == AutoLaneChangeMode.OFF:
self.lane_change_state = LaneChangeState.off
self.lane_change_direction = LaneChangeDirection.none
@@ -113,13 +126,10 @@ class DesireHelper:
self.prev_one_blinker = one_blinker
self.desire = DESIRES[self.lane_change_direction][self.lane_change_state]
# Lane turn controller update
turn_desire = self.lane_turn_controller.update(carstate.leftBlindspot, carstate.rightBlindspot, carstate.leftBlinker, carstate.rightBlinker,
carstate.vEgo, carstate.steeringPressed, carstate.steeringTorque)
if turn_desire != log.Desire.none:
self.desire = turn_desire
if self.lane_turn_direction != custom.TurnDirection.none:
self.desire = TURN_DESIRES[self.lane_turn_direction]
else:
self.desire = DESIRES[self.lane_change_direction][self.lane_change_state]
# Send keep pulse once per second during LaneChangeStart.preLaneChange
if self.lane_change_state in (LaneChangeState.off, LaneChangeState.laneChangeStarting):
@@ -48,6 +48,10 @@ class LatControlTorque(LatControl):
self.lateral_accel_from_torque(-self.steer_max, self.torque_params))
def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, calibrated_pose, curvature_limited):
# Override torque params from extension
if self.extension.update_override_torque_params(self.torque_params):
self.update_limits()
pid_log = log.ControlsState.LateralTorqueState.new_message()
if not active:
output_torque = 0.0
+7 -3
View File
@@ -10,8 +10,11 @@ CONTROL_N_T_IDX = ModelConstants.T_IDXS[:CONTROL_N]
LongCtrlState = car.CarControl.Actuators.LongControlState
def long_control_state_trans(CP, active, long_control_state, v_ego,
def long_control_state_trans(CP, CP_SP, active, long_control_state, v_ego,
should_stop, brake_pressed, cruise_standstill):
# Gas Interceptor
cruise_standstill = cruise_standstill and not CP_SP.enableGasInterceptor
stopping_condition = should_stop
starting_condition = (not should_stop and
not cruise_standstill and
@@ -45,8 +48,9 @@ def long_control_state_trans(CP, active, long_control_state, v_ego,
return long_control_state
class LongControl:
def __init__(self, CP):
def __init__(self, CP, CP_SP):
self.CP = CP
self.CP_SP = CP_SP
self.long_control_state = LongCtrlState.off
self.pid = PIDController((CP.longitudinalTuning.kpBP, CP.longitudinalTuning.kpV),
(CP.longitudinalTuning.kiBP, CP.longitudinalTuning.kiV),
@@ -61,7 +65,7 @@ class LongControl:
self.pid.neg_limit = accel_limits[0]
self.pid.pos_limit = accel_limits[1]
self.long_control_state = long_control_state_trans(self.CP, active, self.long_control_state, CS.vEgo,
self.long_control_state = long_control_state_trans(self.CP, self.CP_SP, active, self.long_control_state, CS.vEgo,
should_stop, CS.brakePressed,
CS.cruiseState.standstill)
if self.long_control_state == LongCtrlState.off:
@@ -10,6 +10,8 @@ from openpilot.common.swaglog import cloudlog
from openpilot.selfdrive.modeld.constants import index_function
from openpilot.selfdrive.controls.radard import _LEAD_ACCEL_TAU
from openpilot.sunnypilot.selfdrive.controls.lib.vibe_personality.vibe_personality import VibePersonalityController
if __name__ == '__main__': # generating code
from openpilot.third_party.acados.acados_template import AcadosModel, AcadosOcp, AcadosOcpSolver
else:
@@ -228,6 +230,7 @@ class LongitudinalMpc:
self.solver = AcadosOcpSolverCython(MODEL_NAME, ACADOS_SOLVER_TYPE, N)
self.reset()
self.source = SOURCES[2]
self.vibe_controller = VibePersonalityController()
def reset(self):
# self.solver = AcadosOcpSolverCython(MODEL_NAME, ACADOS_SOLVER_TYPE, N)
@@ -328,10 +331,18 @@ class LongitudinalMpc:
return lead_xv
def update(self, radarstate, v_cruise, x, v, a, j, personality=log.LongitudinalPersonality.standard):
t_follow = get_T_FOLLOW(personality)
v_ego = self.x0[1]
# Get following distance
t_follow_vibe = self.vibe_controller.get_follow_distance_multiplier(v_ego)
t_follow = t_follow_vibe if t_follow_vibe is not None else get_T_FOLLOW(personality)
self.status = radarstate.leadOne.status or radarstate.leadTwo.status
# Get acceleration limits
accel_limits = self.vibe_controller.get_accel_limits(v_ego)
a_cruise_min = accel_limits[0] if accel_limits is not None else CRUISE_MIN_ACCEL
lead_xv_0 = self.process_lead(radarstate.leadOne)
lead_xv_1 = self.process_lead(radarstate.leadTwo)
@@ -350,7 +361,7 @@ class LongitudinalMpc:
# Fake an obstacle for cruise, this ensures smooth acceleration to set speed
# when the leads are no factor.
v_lower = v_ego + (T_IDXS * CRUISE_MIN_ACCEL * 1.05)
v_lower = v_ego + (T_IDXS * a_cruise_min * 1.05)
# TODO does this make sense when max_a is negative?
v_upper = v_ego + (T_IDXS * CRUISE_MAX_ACCEL * 1.05)
v_cruise_clipped = np.clip(v_cruise * np.ones(N+1),
@@ -405,7 +416,7 @@ class LongitudinalMpc:
if any((lead_0_obstacle - get_safe_obstacle_distance(self.x_sol[:,1], t_follow))- self.x_sol[:,0] < 0.0):
self.source = 'lead0'
if any((lead_1_obstacle - get_safe_obstacle_distance(self.x_sol[:,1], t_follow))- self.x_sol[:,0] < 0.0) and \
(lead_1_obstacle[0] - lead_0_obstacle[0]):
(lead_1_obstacle[0] - lead_0_obstacle[0]):
self.source = 'lead1'
def run(self):
@@ -124,7 +124,11 @@ class LongitudinalPlanner(LongitudinalPlannerSP):
prev_accel_constraint = not (reset_state or sm['carState'].standstill)
if mode == 'acc':
accel_clip = [ACCEL_MIN, get_max_accel(v_ego)]
accel_limits = self.vibe_controller.get_accel_limits(v_ego)
if accel_limits is not None:
accel_clip = [ACCEL_MIN, accel_limits[1]]
else:
accel_clip = [ACCEL_MIN, get_max_accel(v_ego)]
steer_angle_without_offset = sm['carState'].steeringAngleDeg - sm['liveParameters'].angleOffsetDeg
accel_clip = limit_accel_in_turns(v_ego, steer_angle_without_offset, accel_clip, self.CP)
else:
@@ -146,7 +150,7 @@ class LongitudinalPlanner(LongitudinalPlannerSP):
clipped_accel_coast_interp = np.interp(v_ego, [MIN_ALLOW_THROTTLE_SPEED, MIN_ALLOW_THROTTLE_SPEED*2], [accel_clip[1], clipped_accel_coast])
accel_clip[1] = min(accel_clip[1], clipped_accel_coast_interp)
# Get new v_cruise and a_desired from Smart Cruise Control
# Get new v_cruise and a_desired from Smart Cruise Control and Speed Limit Assist
v_cruise, self.a_desired = LongitudinalPlannerSP.update_targets(self, sm, self.v_desired_filter.x, self.a_desired, v_cruise)
if force_slow_decel:
+7 -2
View File
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
from cereal import car
from openpilot.common.gps import get_gps_location_service
from openpilot.common.params import Params
from openpilot.common.realtime import Priority, config_realtime_process
from openpilot.common.swaglog import cloudlog
@@ -16,14 +17,18 @@ def main():
CP = messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams)
cloudlog.info("plannerd got CarParams: %s", CP.brand)
gps_location_service = get_gps_location_service(params)
ldw = LaneDepartureWarning()
longitudinal_planner = LongitudinalPlanner(CP)
pm = messaging.PubMaster(['longitudinalPlan', 'driverAssistance', 'longitudinalPlanSP'])
sm = messaging.SubMaster(['carControl', 'carState', 'controlsState', 'liveParameters', 'radarState', 'modelV2', 'selfdriveState'],
poll='modelV2')
sm = messaging.SubMaster(['carControl', 'carState', 'controlsState', 'liveParameters', 'radarState', 'modelV2', 'selfdriveState',
'liveMapDataSP', 'carStateSP', gps_location_service],
poll='carState')
while True:
sm.update()
longitudinal_planner.sla.update_car_state(sm['carState'])
if sm.updated['modelV2']:
longitudinal_planner.update(sm)
longitudinal_planner.publish(sm, pm)
+15 -12
View File
@@ -1,4 +1,4 @@
from cereal import car
from cereal import car, custom
from openpilot.selfdrive.controls.lib.longcontrol import LongCtrlState, long_control_state_trans
@@ -8,49 +8,52 @@ class TestLongControlStateTransition:
def test_stay_stopped(self):
CP = car.CarParams.new_message()
CP_SP = custom.CarParamsSP.new_message()
active = True
current_state = LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=True, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=True, cruise_standstill=False)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=False, cruise_standstill=True)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=1.0,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=1.0,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.pid
active = False
next_state = long_control_state_trans(CP, active, current_state, v_ego=1.0,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=1.0,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.off
def test_engage():
CP = car.CarParams.new_message()
CP_SP = custom.CarParamsSP.new_message()
active = True
current_state = LongCtrlState.off
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=True, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=True, cruise_standstill=False)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=False, cruise_standstill=True)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.pid
def test_starting():
CP = car.CarParams.new_message(startingState=True, vEgoStarting=0.5)
CP_SP = custom.CarParamsSP.new_message()
active = True
current_state = LongCtrlState.starting
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.starting
next_state = long_control_state_trans(CP, active, current_state, v_ego=1.0,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=1.0,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.pid
+8 -2
View File
@@ -11,6 +11,7 @@ from openpilot.common.filter_simple import FirstOrderFilter
from openpilot.common.swaglog import cloudlog
from openpilot.selfdrive.locationd.helpers import PointBuckets, ParameterEstimator, PoseCalibrator, Pose
from openpilot.sunnypilot.livedelay.helpers import get_lat_delay
from openpilot.sunnypilot.selfdrive.locationd.torqued_ext import TorqueEstimatorExt
HISTORY = 5 # secs
POINTS_PER_BUCKET = 1500
@@ -50,9 +51,10 @@ class TorqueBuckets(PointBuckets):
break
class TorqueEstimator(ParameterEstimator):
class TorqueEstimator(ParameterEstimator, TorqueEstimatorExt):
def __init__(self, CP, decimated=False, track_all_points=False):
super().__init__()
ParameterEstimator.__init__(self)
TorqueEstimatorExt.__init__(self, CP)
self.CP = CP
self.hist_len = int(HISTORY / DT_MDL)
self.lag = 0.0
@@ -82,6 +84,8 @@ class TorqueEstimator(ParameterEstimator):
self.calibrator = PoseCalibrator()
TorqueEstimatorExt.initialize_custom_params(self, decimated)
self.reset()
initial_params = {
@@ -260,6 +264,8 @@ def main(demo=False):
t = sm.logMonoTime[which] * 1e-9
estimator.handle_log(t, which, sm[which])
TorqueEstimatorExt.update_use_params(estimator)
# 4Hz driven by livePose
if sm.frame % 5 == 0:
pm.send('liveTorqueParameters', estimator.get_msg(valid=sm.all_checks()))
+1 -1
View File
@@ -398,7 +398,7 @@ def main(demo=False):
DH.update(sm['carState'], sm['carControl'].latActive, lane_change_prob)
modelv2_send.modelV2.meta.laneChangeState = DH.lane_change_state
modelv2_send.modelV2.meta.laneChangeDirection = DH.lane_change_direction
mdv2sp_send.modelDataV2SP.laneTurnDirection = DH.lane_turn_controller.turn_direction
mdv2sp_send.modelDataV2SP.laneTurnDirection = DH.lane_turn_direction
drivingdata_send.drivingModelData.meta.laneChangeState = DH.lane_change_state
drivingdata_send.drivingModelData.meta.laneChangeDirection = DH.lane_change_direction
+4 -3
View File
@@ -96,7 +96,7 @@ class SelfdriveD(CruiseHelper):
'carOutput', 'driverMonitoringState', 'longitudinalPlan', 'livePose', 'liveDelay',
'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters',
'controlsState', 'carControl', 'driverAssistance', 'alertDebug', 'userBookmark', 'audioFeedback',
'modelDataV2SP'] + \
'modelDataV2SP', 'longitudinalPlanSP'] + \
self.camera_packets + self.sensor_packets + self.gps_packets,
ignore_alive=ignore, ignore_avg_freq=ignore,
ignore_valid=ignore, frequency=int(1/DT_CTRL))
@@ -159,7 +159,7 @@ class SelfdriveD(CruiseHelper):
self.mads = ModularAssistiveDrivingSystem(self)
self.icbm = IntelligentCruiseButtonManagement(self.CP, self.CP_SP)
self.car_events_sp = CarSpecificEventsSP(self.CP, self.params)
self.car_events_sp = CarSpecificEventsSP(self.CP, self.CP_SP)
CruiseHelper.__init__(self, self.CP)
@@ -205,6 +205,7 @@ class SelfdriveD(CruiseHelper):
if not self.CP.notCar:
self.events.add_from_msg(self.sm['driverMonitoringState'].events)
self.events_sp.add_from_msg(self.sm['longitudinalPlanSP'].events)
# Add car events, ignore if CAN isn't valid
if CS.canValid:
@@ -444,7 +445,7 @@ class SelfdriveD(CruiseHelper):
self.events.add(EventName.personalityChanged)
self.experimental_mode_switched = False
self.icbm.run(CS, self.sm['carControl'], self.is_metric)
self.icbm.run(CS, self.sm['carControl'], self.sm['longitudinalPlanSP'], self.is_metric)
def data_sample(self):
_car_state = messaging.recv_one(self.car_state_sock)
@@ -67,6 +67,9 @@ class Plant:
lp = messaging.new_message('liveParameters')
car_control = messaging.new_message('carControl')
model = messaging.new_message('modelV2')
car_state_sp = messaging.new_message('carStateSP')
live_map_data_sp = messaging.new_message('liveMapDataSP')
gps_data = messaging.new_message('gpsLocation')
a_lead = (v_lead - self.v_lead_prev)/self.ts
self.v_lead_prev = v_lead
@@ -133,7 +136,10 @@ class Plant:
'controlsState': control.controlsState,
'selfdriveState': ss.selfdriveState,
'liveParameters': lp.liveParameters,
'modelV2': model.modelV2}
'modelV2': model.modelV2,
'carStateSP': car_state_sp.carStateSP,
'liveMapDataSP': live_map_data_sp.liveMapDataSP,
'gpsLocation': gps_data.gpsLocation}
self.planner.update(sm)
self.acceleration = self.planner.output_a_target
self.speed = self.speed + self.acceleration * self.ts
+4 -2
View File
@@ -28,7 +28,8 @@ MigrationFunc = Callable[[list[MessageWithIndex]], MigrationOps]
# 3. product is the message type created by the migration function, and the function will be skipped if product type already exists in lr
# 4. it must return a list of operations to be applied to the logreader (replace, add, delete)
# 5. all migration functions must be independent of each other
def migrate_all(lr: LogIterable, manager_states: bool = False, panda_states: bool = False, camera_states: bool = False):
def migrate_all(lr: LogIterable, manager_states: bool = False, panda_states: bool = False, camera_states: bool = False,
live_location_kalman: bool = True):
migrations = [
migrate_sensorEvents,
migrate_carParams,
@@ -37,7 +38,6 @@ def migrate_all(lr: LogIterable, manager_states: bool = False, panda_states: boo
migrate_carOutput,
migrate_controlsState,
migrate_carState,
migrate_liveLocationKalman,
migrate_liveTracks,
migrate_driverAssistance,
migrate_drivingModelData,
@@ -51,6 +51,8 @@ def migrate_all(lr: LogIterable, manager_states: bool = False, panda_states: boo
migrations.extend([migrate_pandaStates, migrate_peripheralState])
if camera_states:
migrations.append(migrate_cameraStates)
if live_location_kalman:
migrations.append(migrate_liveLocationKalman)
return migrate(lr, migrations)
@@ -496,7 +496,7 @@ CONFIGS = [
pubs=[
"cameraOdometry", "accelerometer", "gyroscope", "liveCalibration", "carState"
],
subs=["livePose"],
subs=["liveLocationKalman", "livePose"],
ignore=["logMonoTime"],
should_recv_callback=MessageBasedRcvCallback("cameraOdometry"),
tolerance=NUMPY_TOLERANCE,
+19 -1
View File
@@ -92,7 +92,15 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) {
"your steering wheel distance button."),
"../assets/icons/speed_limit.png",
longi_button_texts);
// accel controller
std::vector<QString> accel_personality_texts{tr("Sport"), tr("Normal"), tr("Eco")};
accel_personality_setting = new ButtonParamControlSP("AccelPersonality", tr("Acceleration Personality"),
tr("Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. "
"In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these "
"acceleration personality within Onroad Settings on the driving screen."),
"",
accel_personality_texts);
accel_personality_setting->showDescription();
// set up uiState update for personality setting
QObject::connect(uiState(), &UIState::uiUpdate, this, &TogglesPanel::updateState);
@@ -120,6 +128,7 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) {
// insert longitudinal personality after NDOG toggle
if (param == "DisengageOnAccelerator") {
addItem(long_personality_setting);
addItem(accel_personality_setting);
}
}
@@ -140,6 +149,13 @@ void TogglesPanel::updateState(const UIState &s) {
}
uiState()->scene.personality = personality;
}
if (sm.updated("longitudinalPlanSP")) {
auto accel_personality = sm["longitudinalPlanSP"].getLongitudinalPlanSP().getAccelPersonality();
if (accel_personality != s.scene.accel_personality && s.scene.started && isVisible()) {
accel_personality_setting->setCheckedButton(static_cast<int>(accel_personality));
}
uiState()->scene.accel_personality = accel_personality;
}
}
void TogglesPanel::expandToggleDescription(const QString &param) {
@@ -186,10 +202,12 @@ void TogglesPanel::updateToggles() {
experimental_mode_toggle->setEnabled(true);
experimental_mode_toggle->setDescription(e2e_description);
long_personality_setting->setEnabled(true);
accel_personality_setting->setEnabled(true);
} else {
// no long for now
experimental_mode_toggle->setEnabled(false);
long_personality_setting->setEnabled(false);
accel_personality_setting->setEnabled(true);
params.remove("ExperimentalMode");
const QString unavailable = tr("Experimental mode is currently unavailable on this car since the car's stock ACC is used for longitudinal control.");
+1
View File
@@ -88,6 +88,7 @@ protected:
Params params;
std::map<std::string, ParamControl*> toggles;
ButtonParamControl *long_personality_setting;
ButtonParamControl *accel_personality_setting;
virtual void updateToggles();
};
-9
View File
@@ -4,9 +4,6 @@
#include <map>
#include "selfdrive/ui/qt/util.h"
#ifdef SUNNYPILOT
#include "selfdrive/ui/sunnypilot/ui.h"
#endif
void OnroadAlerts::updateState(const UIState &s) {
Alert a = getAlert(*(s.sm), s.scene.started_frame);
@@ -76,12 +73,6 @@ void OnroadAlerts::paintEvent(QPaintEvent *event) {
}
QRect r = QRect(0 + margin, height() - h + margin, width() - margin*2, h - margin*2);
#ifdef SUNNYPILOT
const int dev_ui_info = uiStateSP()->scene.dev_ui_info;
const int adjustment = dev_ui_info > 1 && alert.size != cereal::SelfdriveState::AlertSize::FULL ? 30 : 0;
r = QRect(0 + margin, height() - h + margin - adjustment, width() - margin*2, h - margin*2);
#endif
QPainter p(this);
// draw background + gradient
+2 -1
View File
@@ -47,11 +47,12 @@ void HudRenderer::draw(QPainter &p, const QRect &surface_rect) {
bg.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0));
p.fillRect(0, 0, surface_rect.width(), UI_HEADER_HEIGHT, bg);
#ifndef SUNNYPILOT
if (is_cruise_available) {
drawSetSpeed(p, surface_rect);
}
drawCurrentSpeed(p, surface_rect);
#endif
p.restore();
}
-167
View File
@@ -34,7 +34,6 @@ void ModelRenderer::draw(QPainter &painter, const QRect &surface_rect) {
drawLead(painter, lead_two, lead_vertices[1], surface_rect);
}
}
drawLeadStatus(painter, surface_rect.height(), surface_rect.width());
painter.restore();
}
@@ -175,172 +174,6 @@ QColor ModelRenderer::blendColors(const QColor &start, const QColor &end, float
}
void ModelRenderer::drawLeadStatus(QPainter &painter, int height, int width) {
auto *s = uiState();
auto &sm = *(s->sm);
if (!sm.alive("radarState")) return;
const auto &radar_state = sm["radarState"].getRadarState();
const auto &lead_one = radar_state.getLeadOne();
const auto &lead_two = radar_state.getLeadTwo();
// Check if we have any active leads
bool has_lead_one = lead_one.getStatus();
bool has_lead_two = lead_two.getStatus();
if (!has_lead_one && !has_lead_two) {
// Fade out status display
lead_status_alpha = std::max(0.0f, lead_status_alpha - 0.05f);
if (lead_status_alpha <= 0.0f) return;
} else {
// Fade in status display
lead_status_alpha = std::min(1.0f, lead_status_alpha + 0.1f);
}
// Draw status for each lead vehicle under its chevron
if (true) {
drawLeadStatusAtPosition(painter, lead_one, lead_vertices[0], height, width, "L1");
}
if (has_lead_two && std::abs(lead_one.getDRel() - lead_two.getDRel()) > 3.0) {
drawLeadStatusAtPosition(painter, lead_two, lead_vertices[1], height, width, "L2");
}
}
void ModelRenderer::drawLeadStatusAtPosition(QPainter &painter,
const cereal::RadarState::LeadData::Reader &lead_data,
const QPointF &chevron_pos,
int height, int width,
const QString &label) {
float d_rel = lead_data.getDRel();
float v_rel = lead_data.getVRel();
auto *s = uiState();
auto &sm = *(s->sm);
float v_ego = sm["carState"].getCarState().getVEgo();
int chevron_data = std::atoi(Params().get("ChevronInfo").c_str());
// Calculate chevron size (same logic as drawLead)
float sz = std::clamp((25 * 30) / (d_rel / 3 + 30), 15.0f, 30.0f) * 2.35;
QFont content_font = painter.font();
content_font.setPixelSize(35);
content_font.setBold(true);
painter.setFont(content_font);
QFontMetrics fm(content_font);
bool is_metric = s->scene.is_metric;
QStringList text_lines;
const int chevron_types = 3;
const int chevron_all = chevron_types + 1; // All metrics (value 4)
QStringList chevron_text[chevron_types];
int position;
float val;
// Distance display (chevron_data == 1 or all)
if (chevron_data == 1 || chevron_data == chevron_all) {
position = 0;
val = std::max(0.0f, d_rel);
QString distance_unit = is_metric ? "m" : "ft";
if (!is_metric) {
val *= 3.28084f; // Convert meters to feet
}
chevron_text[position].append(QString::number(val, 'f', 0) + " " + distance_unit);
}
// Absolute velocity display (chevron_data == 2 or all)
if (chevron_data == 2 || chevron_data == chevron_all) {
position = (chevron_data == 2) ? 0 : 1;
val = std::max(0.0f, (v_rel + v_ego) * (is_metric ? static_cast<float>(MS_TO_KPH) : static_cast<float>(MS_TO_MPH)));
chevron_text[position].append(QString::number(val, 'f', 0) + " " + (is_metric ? "km/h" : "mph"));
}
// Time-to-contact display (chevron_data == 3 or all)
if (chevron_data == 3 || chevron_data == chevron_all) {
position = (chevron_data == 3) ? 0 : 2;
val = (d_rel > 0 && v_ego > 0) ? std::max(0.0f, d_rel / v_ego) : 0.0f;
QString ttc_str = (val > 0 && val < 200) ? QString::number(val, 'f', 1) + "s" : "---";
chevron_text[position].append(ttc_str);
}
// Collect all non-empty text lines
for (int i = 0; i < chevron_types; ++i) {
if (!chevron_text[i].isEmpty()) {
text_lines.append(chevron_text[i]);
}
}
// If no text to display, return early
if (text_lines.isEmpty()) {
return;
}
// Text box dimensions
float str_w = 150; // Width of text area
float str_h = 45; // Height per line
// Position text below chevron, centered horizontally
float text_x = chevron_pos.x() - str_w / 2;
float text_y = chevron_pos.y() + sz + 15;
// Clamp to screen bounds
text_x = std::clamp(text_x, 10.0f, (float)width - str_w - 10);
// Shadow offset
QPoint shadow_offset(2, 2);
// Draw each line of text with shadow
for (int i = 0; i < text_lines.size(); ++i) {
if (!text_lines[i].isEmpty()) {
QRect textRect(text_x, text_y + (i * str_h), str_w, str_h);
// Draw shadow
painter.setPen(QColor(0x0, 0x0, 0x0, (int)(200 * lead_status_alpha)));
painter.drawText(textRect.translated(shadow_offset.x(), shadow_offset.y()),
Qt::AlignBottom | Qt::AlignHCenter, text_lines[i]);
// Determine text color based on content and danger level
QColor text_color;
// Check if this is a distance line (contains 'm' or 'ft')
if (text_lines[i].contains("m") || text_lines[i].contains("ft")) {
if (d_rel < 20.0f) {
text_color = QColor(255, 80, 80, (int)(255 * lead_status_alpha)); // Red - danger
} else if (d_rel < 40.0f) {
text_color = QColor(255, 200, 80, (int)(255 * lead_status_alpha)); // Yellow - caution
} else {
text_color = QColor(80, 255, 120, (int)(255 * lead_status_alpha)); // Green - safe
}
}
// Enhanced color coding for time-to-contact
else if (text_lines[i].contains("s") && !text_lines[i].contains("---")) {
float ttc_val = text_lines[i].left(text_lines[i].length() - 1).toFloat();
if (ttc_val < 3.0f) {
text_color = QColor(255, 80, 80, (int)(255 * lead_status_alpha)); // Red - urgent
} else if (ttc_val < 6.0f) {
text_color = QColor(255, 200, 80, (int)(255 * lead_status_alpha)); // Yellow - caution
} else {
text_color = QColor(0xff, 0xff, 0xff, (int)(255 * lead_status_alpha)); // White - safe
}
}
else {
text_color = QColor(0xff, 0xff, 0xff, (int)(255 * lead_status_alpha)); // White for other lines
}
// Draw main text
painter.setPen(text_color);
painter.drawText(textRect, Qt::AlignBottom | Qt::AlignHCenter, text_lines[i]);
}
}
// Reset pen
painter.setPen(Qt::NoPen);
}
void ModelRenderer::drawLead(QPainter &painter, const cereal::RadarState::LeadData::Reader &lead_data,
const QPointF &vd, const QRect &surface_rect) {
const float speedBuff = 10.;
-10
View File
@@ -34,12 +34,6 @@ protected:
bool mapToScreen(float in_x, float in_y, float in_z, QPointF *out);
void mapLineToPolygon(const cereal::XYZTData::Reader &line, float y_off, float z_off,
QPolygonF *pvd, int max_idx, bool allow_invert = true);
void drawLeadStatus(QPainter &painter, int height, int width);
void drawLeadStatusAtPosition(QPainter &painter,
const cereal::RadarState::LeadData::Reader &lead_data,
const QPointF &chevron_pos,
int height, int width,
const QString &label);
void drawLead(QPainter &painter, const cereal::RadarState::LeadData::Reader &lead_data, const QPointF &vd, const QRect &surface_rect);
void update_leads(const cereal::RadarState::Reader &radar_state, const cereal::XYZTData::Reader &line);
virtual void update_model(const cereal::ModelDataV2::Reader &model, const cereal::RadarState::LeadData::Reader &lead);
@@ -65,8 +59,4 @@ protected:
Eigen::Matrix3f car_space_transform = Eigen::Matrix3f::Zero();
QRectF clip_region;
float lead_status_alpha = 0.0f;
QPointF lead_status_pos;
QString lead_status_text;
QColor lead_status_color;
};
+2
View File
@@ -4,8 +4,10 @@
#ifdef SUNNYPILOT
#include "selfdrive/ui/sunnypilot/qt/onroad/annotated_camera.h"
#include "selfdrive/ui/sunnypilot/qt/onroad/alerts.h"
#define UIState UIStateSP
#define AnnotatedCameraWidget AnnotatedCameraWidgetSP
#define OnroadAlerts OnroadAlertsSP
#else
#include "selfdrive/ui/qt/onroad/annotated_camera.h"
#endif
+10
View File
@@ -92,6 +92,16 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event) {
// ignore events when device is awakened by resetInteractiveTimeout
ignore = !device()->isAwake();
device()->resetInteractiveTimeout();
#ifdef SUNNYPILOT
auto *s_sp = uiStateSP();
bool onroadScreenControl = s_sp->scene.onroadScreenOffControl;
bool started = s_sp->scene.started;
bool timerExpired = (s_sp->scene.onroadScreenOffTimer == 0);
ignore |= (onroadScreenControl and started and timerExpired);
s_sp->reset_onroad_sleep_timer();
#endif
break;
}
default:
+4
View File
@@ -7,6 +7,10 @@
#include "selfdrive/ui/qt/offroad/onboarding.h"
#include "selfdrive/ui/qt/offroad/settings.h"
#ifdef SUNNYPILOT
#include "selfdrive/ui/sunnypilot/ui.h"
#endif
class MainWindow : public QWidget {
Q_OBJECT
+11 -2
View File
@@ -24,6 +24,7 @@ qt_src = [
"sunnypilot/qt/offroad/offroad_home.cc",
"sunnypilot/qt/offroad/settings/developer_panel.cc",
"sunnypilot/qt/offroad/settings/device_panel.cc",
"sunnypilot/qt/offroad/settings/display_panel.cc",
"sunnypilot/qt/offroad/settings/lateral_panel.cc",
"sunnypilot/qt/offroad/settings/longitudinal_panel.cc",
"sunnypilot/qt/offroad/settings/max_time_offroad.cc",
@@ -37,6 +38,7 @@ qt_src = [
"sunnypilot/qt/offroad/settings/trips_panel.cc",
"sunnypilot/qt/offroad/settings/vehicle_panel.cc",
"sunnypilot/qt/offroad/settings/visuals_panel.cc",
"sunnypilot/qt/onroad/alerts.cc",
"sunnypilot/qt/onroad/annotated_camera.cc",
"sunnypilot/qt/onroad/buttons.cc",
"sunnypilot/qt/onroad/developer_ui/developer_ui.cc",
@@ -48,13 +50,16 @@ qt_src = [
lateral_panel_qt_src = [
"sunnypilot/qt/offroad/settings/lateral/blinker_pause_lateral_settings.cc",
"sunnypilot/qt/offroad/settings/lateral/lane_change_settings.cc",
"sunnypilot/qt/offroad/settings/lateral/lane_turn_settings.cc",
"sunnypilot/qt/offroad/settings/lateral/mads_settings.cc",
"sunnypilot/qt/offroad/settings/lateral/neural_network_lateral_control.cc",
"sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_custom_params.cc",
"sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_settings.cc",
]
longitudinal_panel_qt_src = [
"sunnypilot/qt/offroad/settings/longitudinal/custom_acc_increment.cc",
"sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_policy.cc",
"sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.cc",
]
network_src = [
@@ -89,9 +94,13 @@ brand_settings_qt_src = [
"sunnypilot/qt/offroad/settings/vehicle/volkswagen_settings.cc",
]
display_panel_qt_src = [
"sunnypilot/qt/offroad/settings/display/onroad_screen_brightness.cc",
]
sp_widgets_src = widgets_src + network_src
sp_qt_src = qt_src + lateral_panel_qt_src + vehicle_panel_qt_src + brand_settings_qt_src + longitudinal_panel_qt_src + osm_panel_qt_src
sp_qt_src = qt_src + lateral_panel_qt_src + vehicle_panel_qt_src + brand_settings_qt_src + \
longitudinal_panel_qt_src + osm_panel_qt_src + display_panel_qt_src
sp_qt_util = qt_util
Export('sp_widgets_src', 'sp_qt_src', "sp_qt_util")
@@ -25,8 +25,8 @@ const QMap<QString, QString> Brightness::brightness_options = {
Brightness::Brightness() : OptionControlSP(
"Brightness",
tr("Brightness"),
tr("Overrides the brightness of the device."),
tr("Global Brightness"),
tr("Overrides the brightness of the device. This applies to both onroad and offroad screens. "),
"../assets/offroad/icon_blank.png",
{0, 11}, 1, true, &brightness_options) {
@@ -56,14 +56,13 @@ DeveloperPanelSP::DeveloperPanelSP(SettingsWindow *parent) : DeveloperPanel(pare
addItem(errorLogBtn);
QObject::connect(uiState(), &UIState::offroadTransition, this, &DeveloperPanelSP::updateToggles);
is_release = params.getBool("IsReleaseBranch");
is_tested = params.getBool("IsTestedBranch");
is_development = params.getBool("IsDevelopmentBranch");
}
void DeveloperPanelSP::updateToggles(bool offroad) {
bool disable_updates = params.getBool("DisableUpdates");
bool is_release = params.getBool("IsReleaseBranch");
bool is_tested = params.getBool("IsTestedBranch");
bool is_development = params.getBool("IsDevelopmentBranch");
prebuiltToggle->setVisible(!is_release && !is_tested && !is_development);
prebuiltToggle->setEnabled(disable_updates);
@@ -22,9 +22,6 @@ private:
ParamControlSP *prebuiltToggle;
Params params;
ParamControlSP *showAdvancedControls;
bool is_development;
bool is_release;
bool is_tested;
private slots:
void updateToggles(bool offroad);
@@ -23,6 +23,7 @@ DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) {
{"regulatoryBtn", tr("Regulatory"), ""},
{"translateBtn", tr("Language"), ""},
{"resetParams", tr("Reset Settings"), ""},
{"onroadUploadsBtn", tr("Onroad Uploads"), "OnroadUploads"}
};
int row = 0, col = 0;
@@ -75,35 +76,21 @@ DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) {
connect(buttons["resetParams"], &PushButtonSP::clicked, this, &DevicePanelSP::resetSettings);
connect(buttons["onroadUploadsBtn"], &PushButtonSP::clicked, buttons["onroadUploadsBtn"], &PushButtonSP::updateButton);
// Max Time Offroad
maxTimeOffroad = new MaxTimeOffroad();
connect(maxTimeOffroad, &OptionControlSP::updateLabels, maxTimeOffroad, &MaxTimeOffroad::refresh);
addItem(maxTimeOffroad);
toggleDeviceBootMode = new ButtonParamControlSP("DeviceBootMode", tr("Wake-Up Behavior"), "", "", {"Default", "Offroad"}, 375, true);
toggleDeviceBootMode = new ButtonParamControlSP("DeviceBootMode", tr("Wake-Up Behavior"), "", "", {"Default", "Offroad"}, 375, true);
addItem(toggleDeviceBootMode);
connect(toggleDeviceBootMode, &ButtonParamControlSP::buttonClicked, this, [=](int index) {
params.put("DeviceBootMode", QString::number(index).toStdString());
updateState();
updateState(offroad);
});
interactivityTimeout = new OptionControlSP("InteractivityTimeout", tr("Interactivity Timeout"),
tr("Apply a custom timeout for settings UI."
"\nThis is the time after which settings UI closes automatically if user is not interacting with the screen."),
"", {0, 120}, 10, true, nullptr, false);
connect(interactivityTimeout, &OptionControlSP::updateLabels, [=]() {
updateState();
});
addItem(interactivityTimeout);
// Brightness
brightness = new Brightness();
connect(brightness, &OptionControlSP::updateLabels, brightness, &Brightness::refresh);
addItem(brightness);
addItem(device_grid_layout);
// offroad mode and power buttons
@@ -129,29 +116,21 @@ DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) {
offroadBtn->setFixedWidth(power_layout->sizeHint().width());
QObject::connect(offroadBtn, &PushButtonSP::clicked, this, &DevicePanelSP::setOffroadMode);
QVBoxLayout *power_group_layout = new QVBoxLayout();
power_group_layout = new QVBoxLayout();
power_group_layout->setSpacing(25);
power_group_layout->addWidget(offroadBtn, 0, Qt::AlignHCenter);
power_group_layout->addLayout(power_layout);
addItem(power_group_layout);
std::vector always_enabled_btns = {
always_enabled_btns = {
rebootBtn,
poweroffBtn,
offroadBtn,
buttons["quietModeBtn"],
buttons["onroadUploadsBtn"],
};
QObject::connect(uiState(), &UIState::offroadTransition, [=](bool offroad) {
for (auto btn : findChildren<PushButtonSP*>()) {
bool always_enabled = std::find(always_enabled_btns.begin(), always_enabled_btns.end(), btn) != always_enabled_btns.end();
if (!always_enabled) {
btn->setEnabled(offroad);
}
}
});
QObject::connect(uiState(), &UIState::offroadTransition, this, &DevicePanelSP::updateState);
}
void DevicePanelSP::setOffroadMode() {
@@ -175,7 +154,7 @@ void DevicePanelSP::setOffroadMode() {
ConfirmationDialog::alert(tr("Disengage to Enter Always Offroad Mode"), this);
}
updateState();
updateState(offroad);
}
void DevicePanelSP::resetSettings() {
@@ -192,16 +171,20 @@ void DevicePanelSP::resetSettings() {
}
void DevicePanelSP::showEvent(QShowEvent *event) {
updateState();
updateState(offroad);
}
void DevicePanelSP::updateState() {
if (!isVisible()) {
return;
void DevicePanelSP::updateState(bool _offroad) {
for (auto btn : findChildren<PushButtonSP*>()) {
bool always_enabled = std::find(always_enabled_btns.begin(), always_enabled_btns.end(), btn) != always_enabled_btns.end();
if (!always_enabled) {
btn->setEnabled(_offroad);
}
}
bool offroad_mode_param = params.getBool("OffroadMode");
offroadBtn->setText(offroad_mode_param ? tr("Exit Always Offroad") : tr("Always Offroad"));
offroadBtn->setText(offroad_mode_param ? tr("Exit Always Offroad") : tr("Enable Always Offroad"));
offroadBtn->setStyleSheet(offroad_mode_param ? alwaysOffroadStyle : autoOffroadStyle);
DeviceSleepModeStatus currStatus = DeviceSleepModeStatus::DEFAULT;
@@ -210,10 +193,11 @@ void DevicePanelSP::updateState() {
}
toggleDeviceBootMode->setDescription(deviceSleepModeDescription(currStatus));
QString timeoutValue = QString::fromStdString(params.get("InteractivityTimeout"));
if (timeoutValue == "0" || timeoutValue.isEmpty()) {
interactivityTimeout->setLabel("Default");
if (offroad and not offroad_mode_param) {
power_group_layout->insertWidget(0, offroadBtn, 0, Qt::AlignHCenter);
} else {
interactivityTimeout->setLabel(timeoutValue + "s");
AddWidgetAt(0, offroadBtn);
}
offroad = _offroad;
}
@@ -8,7 +8,6 @@
#pragma once
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/max_time_offroad.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/brightness.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
@@ -24,7 +23,7 @@ public:
explicit DevicePanelSP(SettingsWindowSP *parent = 0);
void showEvent(QShowEvent *event) override;
void setOffroadMode();
void updateState();
void updateState(bool _offroad);
void resetSettings();
private:
@@ -32,8 +31,10 @@ private:
PushButtonSP *offroadBtn;
MaxTimeOffroad *maxTimeOffroad;
ButtonParamControlSP *toggleDeviceBootMode;
Brightness *brightness;
OptionControlSP *interactivityTimeout;
QVBoxLayout *power_group_layout;
bool offroad;
std::vector<PushButtonSP*> always_enabled_btns = {};
const QString alwaysOffroadStyle = R"(
PushButtonSP {
@@ -0,0 +1,54 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/display/onroad_screen_brightness.h"
OnroadScreenBrightnessControl::OnroadScreenBrightnessControl(const QString &param, const QString &title,
const QString &description, const QString &icon,
QWidget *parent)
: ExpandableToggleRow(param, title, description, icon, parent) {
auto *mainFrame = new QFrame(this);
auto *mainFrameLayout = new QVBoxLayout();
mainFrame->setLayout(mainFrameLayout);
mainFrameLayout->setSpacing(30);
mainFrameLayout->setContentsMargins(0, 0, 0, 0);
onroadScreenOffTimer = new OptionControlSP(
"OnroadScreenOffTimer",
"Onroad Brightness Delay",
"",
"",
{0, 11}, 1, true, &onroadScreenOffTimerOptions);
onroadScreenBrightness = new OptionControlSP(
"OnroadScreenOffBrightness",
"Onroad Brightness",
"",
"",
{0, 100}, 10, true);
connect(onroadScreenOffTimer, &OptionControlSP::updateLabels, this, &OnroadScreenBrightnessControl::refresh);
connect(onroadScreenBrightness, &OptionControlSP::updateLabels, this, &OnroadScreenBrightnessControl::refresh);
mainFrameLayout->addWidget(onroadScreenBrightness);
mainFrameLayout->addWidget(onroadScreenOffTimer);
addItem(mainFrame);
refresh();
}
void OnroadScreenBrightnessControl::refresh() {
// Driving Screen Off Timer
int valTimer = std::atoi(params.get("OnroadScreenOffTimer").c_str());
std::string labelTimer = (valTimer < 60 ? std::to_string(valTimer) + "s" : std::to_string(valTimer / 60) + "m");
onroadScreenOffTimer->setLabel(QString::fromStdString(labelTimer));
// Driving Screen Off Brightness
std::string valBrightness = params.get("OnroadScreenOffBrightness");
std::string labelBrightness = (valBrightness == "0" ? " Screen Off" : valBrightness + "%");
onroadScreenBrightness->setLabel(QString::fromStdString(labelBrightness));
}
@@ -0,0 +1,42 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/sunnypilot/ui.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/expandable_row.h"
static const QMap<QString, QString> onroadScreenOffTimerOptions = {
{"0", "15"},
{"1", "30"},
{"2", "60"},
{"3", "120"},
{"4", "180"},
{"5", "240"},
{"6", "300"},
{"7", "360"},
{"8", "420"},
{"9", "480"},
{"10", "540"},
{"11", "600"}
};
class OnroadScreenBrightnessControl : public ExpandableToggleRow {
Q_OBJECT
public:
OnroadScreenBrightnessControl(const QString &param, const QString &title, const QString &desc, const QString &icon,
QWidget *parent = nullptr);
void refresh();
private:
Params params;
OptionControlSP *onroadScreenOffTimer;
OptionControlSP *onroadScreenBrightness;
};
@@ -0,0 +1,65 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/display_panel.h"
DisplayPanel::DisplayPanel(QWidget *parent) : QWidget(parent) {
main_layout = new QStackedLayout(this);
ListWidgetSP *list = new ListWidgetSP(this, false);
sunnypilotScreen = new QWidget(this);
QVBoxLayout* vlayout = new QVBoxLayout(sunnypilotScreen);
vlayout->setContentsMargins(50, 20, 50, 20);
// Onroad Screen Off/Brightness
onroadScreenBrightnessControl = new OnroadScreenBrightnessControl(
"OnroadScreenOffControl",
tr("Onroad Screen: Reduced Brightness"),
tr("Turn off device screen or reduce brightness after driving starts. "
"It automatically brightens again when screen is touched or a visible alert is displayed."),
"",
this);
list->addItem(onroadScreenBrightnessControl);
list->addItem(horizontal_line());
// Global Brightness
brightness = new Brightness();
connect(brightness, &OptionControlSP::updateLabels, brightness, &Brightness::refresh);
list->addItem(brightness);
list->addItem(horizontal_line());
// Interactivity Timeout
interactivityTimeout = new OptionControlSP("InteractivityTimeout", tr("Interactivity Timeout"),
tr("Apply a custom timeout for settings UI."
"\nThis is the time after which settings UI closes automatically if user is not interacting with the screen."),
"", {0, 120}, 10, true, nullptr, false);
connect(interactivityTimeout, &OptionControlSP::updateLabels, [=]() {
refresh();
});
list->addItem(interactivityTimeout);
sunnypilotScroller = new ScrollViewSP(list, this);
vlayout->addWidget(sunnypilotScroller);
main_layout->addWidget(sunnypilotScreen);
}
void DisplayPanel::showEvent(QShowEvent *event) {
QWidget::showEvent(event);
refresh();
}
void DisplayPanel::refresh() {
onroadScreenBrightnessControl->refresh();
QString timeoutValue = QString::fromStdString(params.get("InteractivityTimeout"));
if (timeoutValue == "0" || timeoutValue.isEmpty()) {
interactivityTimeout->setLabel("Default");
} else {
interactivityTimeout->setLabel(timeoutValue + "s");
}
}
@@ -0,0 +1,31 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/brightness.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/display/onroad_screen_brightness.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
class DisplayPanel : public QWidget {
Q_OBJECT
public:
explicit DisplayPanel(QWidget *parent = nullptr);
void showEvent(QShowEvent *event) override;
void refresh();
private:
QStackedLayout* main_layout = nullptr;
QWidget* sunnypilotScreen = nullptr;
ScrollViewSP *sunnypilotScroller = nullptr;
Params params;
OnroadScreenBrightnessControl *onroadScreenBrightnessControl = nullptr;
Brightness *brightness;
OptionControlSP *interactivityTimeout;
};
@@ -1,86 +0,0 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/lane_turn_settings.h"
LaneTurnSettings::LaneTurnSettings(QWidget* parent) : QWidget(parent) {
QVBoxLayout* main_layout = new QVBoxLayout(this);
main_layout->setContentsMargins(50, 20, 50, 20);
main_layout->setSpacing(20);
// Back button
PanelBackButton* back = new PanelBackButton(tr("Back"));
connect(back, &QPushButton::clicked, [=]() { emit backPress(); });
main_layout->addWidget(back, 0, Qt::AlignLeft);
ListWidgetSP *list = new ListWidgetSP(this, false);
// Lane Turn Desire Control
laneTurnDesireControl = new LaneTurnDesireControl();
laneTurnDesireControl->setUpdateOtherToggles(true);
laneTurnDesireControl->showDescription();
connect(laneTurnDesireControl, &OptionControlSP::updateLabels, laneTurnDesireControl, &LaneTurnDesireControl::refresh);
list->addItem(laneTurnDesireControl);
// Lane Turn Value control
bool is_metric = params.getBool("IsMetric");
int per_value_change = is_metric ? 62 : 100; // ~1 km/h or 1 mph
laneTurnValueControl = new OptionControlSP("LaneTurnValue", tr("Adjust Lane Turn Speed"),
tr("Set the maximum speed for lane turn desires. Default is 19 %1.").arg(is_metric ? "km/h" : "mph"),
"", {500, 2000}, per_value_change, false, nullptr, true, true);
laneTurnValueControl->showDescription();
list->addItem(laneTurnValueControl);
// show/hide value control based on desire
connect(laneTurnDesireControl, &OptionControlSP::updateLabels, this, &LaneTurnSettings::updateValueControlVisibility);
connect(laneTurnValueControl, &OptionControlSP::updateLabels, this, &LaneTurnSettings::refreshLaneTurnValueControl);
main_layout->addWidget(new ScrollViewSP(list, this));
}
void LaneTurnSettings::showEvent(QShowEvent *event) {
updateValueControlVisibility();
}
void LaneTurnSettings::updateValueControlVisibility() {
QString option = QString::fromStdString(params.get("LaneTurnDesire"));
bool visible = (option != "0");
laneTurnValueControl->setVisible(visible);
if (visible) {
refreshLaneTurnValueControl();
}
}
void LaneTurnSettings::refreshLaneTurnValueControl() {
if (!laneTurnValueControl) return;
float stored_mph = QString::fromStdString(params.get("LaneTurnValue")).toFloat();
bool is_metric = params.getBool("IsMetric");
QString unit = is_metric ? "km/h" : "mph";
float display_value = is_metric ? stored_mph * 1.609344f : stored_mph;
laneTurnValueControl->setLabel(QString::number(qRound(display_value)) + " " + unit);
}
// Lane Turn Desire Control
LaneTurnDesireControl::LaneTurnDesireControl() : OptionControlSP(
"LaneTurnDesire",
tr("Lane Turn Desires"),
tr("If you're driving at 20 mph (32 km/h) or below and have your blinker on, "
"the car will plan a turn in that direction at the nearest drivable path. "
"This prevents situations (like at red lights) where the car might plan the wrong turn direction."),
"../assets/offroad/icon_shell.png",
{0, 2}) {
refresh();
}
void LaneTurnDesireControl::refresh() {
QString option = QString::fromStdString(params.get("LaneTurnDesire"));
static const QMap<QString, QString> options = {
{"0", tr("Off")},
{"1", tr("Nudge")},
{"2", tr("Nudgeless")},
};
setLabel(options.value(option, tr("Off")));
}
@@ -1,45 +0,0 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
class LaneTurnDesireControl : public OptionControlSP {
Q_OBJECT
public:
LaneTurnDesireControl();
void refresh();
private:
Params params;
};
class LaneTurnSettings : public QWidget {
Q_OBJECT
public:
explicit LaneTurnSettings(QWidget* parent = nullptr);
void showEvent(QShowEvent *event) override;
signals:
void backPress();
private:
void refreshLaneTurnValueControl();
void updateValueControlVisibility();
private:
Params params;
std::map<std::string, ParamControlSP*> toggles;
LaneTurnDesireControl *laneTurnDesireControl;
OptionControlSP *laneTurnValueControl;
};
@@ -52,12 +52,16 @@ void MadsSettings::updateToggles(bool _offroad) {
);
auto cp_bytes = params.get("CarParamsPersistent");
if (!cp_bytes.empty()) {
auto cp_sp_bytes = params.get("CarParamsSPPersistent");
if (!cp_bytes.empty() && !cp_sp_bytes.empty()) {
AlignedBuffer aligned_buf;
AlignedBuffer aligned_buf_sp;
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(cp_bytes.data(), cp_bytes.size()));
capnp::FlatArrayMessageReader cmsg_sp(aligned_buf_sp.align(cp_sp_bytes.data(), cp_sp_bytes.size()));
cereal::CarParams::Reader CP = cmsg.getRoot<cereal::CarParams>();
cereal::CarParamsSP::Reader CP_SP = cmsg_sp.getRoot<cereal::CarParamsSP>();
if (isBrandInList(CP.getBrand(), mads_limited_settings_brands)) {
if (madsLimitedSettings(CP, CP_SP)) {
params.remove("MadsMainCruiseAllowed");
params.putBool("MadsUnifiedEngagementMode", true);
params.put("MadsSteeringMode", std::to_string(static_cast<int>(MadsSteeringMode::DISENGAGE)));
@@ -12,7 +12,16 @@
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
const std::vector<std::string> mads_limited_settings_brands = {"rivian", "tesla"};
inline bool madsLimitedSettings(const cereal::CarParams::Reader &CP, const cereal::CarParamsSP::Reader &CP_SP) {
if (CP.getBrand() == "rivian") {
return true;
}
if (CP.getBrand() == "tesla") {
return !(CP_SP.getFlags() & 1); // 1 == TeslaFlagsSP.HAS_VEHICLE_BUS
}
return false;
}
enum class MadsSteeringMode {
REMAIN_ACTIVE = 0,
@@ -10,14 +10,15 @@
NeuralNetworkLateralControl::NeuralNetworkLateralControl() :
ParamControl("NeuralNetworkLateralControl", tr("Neural Network Lateral Control (NNLC)"), "", "") {
setConfirmation(true, false);
updateToggle();
updateToggle(offroad);
}
void NeuralNetworkLateralControl::updateToggle() {
void NeuralNetworkLateralControl::updateToggle(bool _offroad) {
QString statusInitText = "<font color='yellow'>" + STATUS_CHECK_COMPATIBILITY + "</font>";
QString notLoadedText = "<font color='yellow'>" + STATUS_NOT_LOADED + "</font>";
QString loadedText = "<font color=#00ff00>" + STATUS_LOADED + "</font>";
bool allowed = true;
auto cp_bytes = params.get("CarParamsPersistent");
auto cp_sp_bytes = params.get("CarParamsSPPersistent");
if (!cp_bytes.empty() && !cp_sp_bytes.empty()) {
@@ -31,7 +32,7 @@ void NeuralNetworkLateralControl::updateToggle() {
if (CP.getSteerControlType() == cereal::CarParams::SteerControlType::ANGLE) {
params.remove("NeuralNetworkLateralControl");
setDescription(nnffDescriptionBuilder(STATUS_NOT_AVAILABLE));
setEnabled(false);
allowed = false;
} else {
QString nn_model_name = QString::fromStdString(CP_SP.getNeuralNetworkLateralControl().getModel().getName());
QString nn_fuzzy = CP_SP.getNeuralNetworkLateralControl().getFuzzyFingerprint() ?
@@ -56,4 +57,11 @@ void NeuralNetworkLateralControl::updateToggle() {
if (getDescription() != getBaseDescription()) {
showDescription();
}
bool enforce_torque_toggle = params.getBool("EnforceTorqueControl");
setEnabled(_offroad && allowed && !enforce_torque_toggle);
refresh();
offroad = _offroad;
}
@@ -20,10 +20,11 @@ public:
NeuralNetworkLateralControl();
public slots:
void updateToggle();
void updateToggle(bool _offroad);
private:
Params params;
bool offroad;
// Status messages
const QString STATUS_NOT_AVAILABLE = tr("NNLC is currently not available on this platform.");
@@ -0,0 +1,58 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_custom_params.h"
TorqueLateralControlCustomParams::TorqueLateralControlCustomParams(const QString &param, const QString &title, const QString &description, const QString &icon, QWidget *parent)
: ExpandableToggleRow(param, title, description, icon, parent) {
QFrame *frame = new QFrame(this);
QGridLayout *frame_layout = new QGridLayout();
frame->setLayout(frame_layout);
frame_layout->setSpacing(0);
torqueLateralControlParamsOverride = new ParamControl(
"TorqueParamsOverrideEnabled",
tr("Manual Real-Time Tuning"),
tr("Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values."),
"../assets/offroad/icon_blank.png",
this
);
connect(torqueLateralControlParamsOverride, &ParamControl::toggleFlipped, this, &TorqueLateralControlCustomParams::refresh);
torqueParamsOverrideLatAccelFactor = new OptionControlSP("TorqueParamsOverrideLatAccelFactor", tr("Lateral Acceleration Factor"), "", "", {1, 500}, 1, false, nullptr, true, false);
connect(torqueParamsOverrideLatAccelFactor, &OptionControlSP::updateLabels, this, &TorqueLateralControlCustomParams::refresh);
torqueParamsOverrideLatAccelFactor->setFixedWidth(280);
torqueParamsOverrideFriction = new OptionControlSP("TorqueParamsOverrideFriction", tr("Friction"), "", "", {1, 100}, 1, false, nullptr, true, false);
connect(torqueParamsOverrideFriction, &OptionControlSP::updateLabels, this, &TorqueLateralControlCustomParams::refresh);
torqueParamsOverrideFriction->setFixedWidth(280);
frame_layout->addWidget(torqueLateralControlParamsOverride, 0, 0, 1, 2);
QSpacerItem *spacer = new QSpacerItem(20, 40);
frame_layout->addItem(spacer, 1, 0, 1, 2);
frame_layout->addWidget(torqueParamsOverrideLatAccelFactor, 2, 0, Qt::AlignCenter);
frame_layout->addWidget(torqueParamsOverrideFriction, 2, 1, Qt::AlignCenter);
addItem(frame);
refresh();
}
void TorqueLateralControlCustomParams::refresh() {
bool torque_override_param = params.getBool("TorqueParamsOverrideEnabled");
float laf_param = QString::fromStdString(params.get("TorqueParamsOverrideLatAccelFactor")).toFloat();
const QString laf_unit = "m/s²";
float friction_param = QString::fromStdString(params.get("TorqueParamsOverrideFriction")).toFloat();
torqueParamsOverrideLatAccelFactor->setTitle(tr("Lateral Acceleration Factor") + "\n(" + (torque_override_param ? tr("Real-time and Offline") : tr("Offline Only")) + ")");
torqueParamsOverrideFriction->setTitle(tr("Friction") + "\n(" + (torque_override_param ? tr("Real-time and Offline") : tr("Offline Only")) + ")");
torqueParamsOverrideLatAccelFactor->setLabel(QString::number(laf_param, 'f', 2) + " " + laf_unit);
torqueParamsOverrideFriction->setLabel(QString::number(friction_param, 'f', 2));
}
@@ -0,0 +1,27 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/sunnypilot/ui.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/expandable_row.h"
class TorqueLateralControlCustomParams : public ExpandableToggleRow {
Q_OBJECT
public:
TorqueLateralControlCustomParams(const QString &param, const QString &title, const QString &description, const QString &icon, QWidget *parent = nullptr);
void refresh();
private:
Params params;
ParamControl *torqueLateralControlParamsOverride;
OptionControlSP *torqueParamsOverrideFriction;
OptionControlSP *torqueParamsOverrideLatAccelFactor;
};
@@ -0,0 +1,81 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
TorqueLateralControlSettings::TorqueLateralControlSettings(QWidget *parent) : QWidget(parent) {
QVBoxLayout *main_layout = new QVBoxLayout(this);
main_layout->setContentsMargins(50, 20, 50, 20);
main_layout->setSpacing(20);
// Back button
PanelBackButton *back = new PanelBackButton();
connect(back, &QPushButton::clicked, [=]() { emit backPress(); });
main_layout->addWidget(back, 0, Qt::AlignLeft);
ListWidget *list = new ListWidget(this, false);
// param, title, desc, icon
std::vector<std::tuple<QString, QString, QString, QString>> toggle_defs{
{
"LiveTorqueParamsToggle",
tr("Self-Tune"),
tr("Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default."),
"../assets/offroad/icon_blank.png",
},
{
"LiveTorqueParamsRelaxedToggle",
tr("Less Restrict Settings for Self-Tune (Beta)"),
tr("Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values."),
"../assets/offroad/icon_blank.png",
}
};
for (auto &[param, title, desc, icon] : toggle_defs) {
auto toggle = new ParamControlSP(param, title, desc, icon, this);
list->addItem(toggle);
toggles[param.toStdString()] = toggle;
}
torqueLateralControlCustomParams = new TorqueLateralControlCustomParams(
"CustomTorqueParams",
tr("Enable Custom Tuning"),
tr("Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within \"opendbc/car/torque_data\". "
"The values will also be used live when \"Manual Real-Time Tuning\" toggle is enabled."),
"../assets/offroad/icon_blank.png",
this);
list->addItem(torqueLateralControlCustomParams);
QObject::connect(uiState(), &UIState::offroadTransition, this, &TorqueLateralControlSettings::updateToggles);
QObject::connect(toggles["LiveTorqueParamsToggle"], &ParamControlSP::toggleFlipped, [=](bool state) {
if (!state) {
params.remove("LiveTorqueParamsRelaxedToggle");
toggles["LiveTorqueParamsRelaxedToggle"]->refresh();
}
updateToggles(offroad);
});
main_layout->addWidget(new ScrollViewSP(list, this));
}
void TorqueLateralControlSettings::showEvent(QShowEvent *event) {
updateToggles(offroad);
}
void TorqueLateralControlSettings::updateToggles(bool _offroad) {
bool live_toggle = toggles["LiveTorqueParamsToggle"]->isToggled();
toggles["LiveTorqueParamsToggle"]->setEnabled(_offroad);
toggles["LiveTorqueParamsRelaxedToggle"]->setEnabled(_offroad && live_toggle);
torqueLateralControlCustomParams->setEnabled(_offroad);
torqueLateralControlCustomParams->refresh();
offroad = _offroad;
}
@@ -0,0 +1,36 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/qt/util.h"
#include "selfdrive/ui/sunnypilot/ui.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_custom_params.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
class TorqueLateralControlSettings : public QWidget {
Q_OBJECT
public:
explicit TorqueLateralControlSettings(QWidget *parent = nullptr);
void showEvent(QShowEvent *event) override;
signals:
void backPress();
public slots:
void updateToggles(bool _offroad);
private:
Params params;
bool offroad;
std::map<std::string, ParamControlSP*> toggles;
TorqueLateralControlCustomParams *torqueLateralControlCustomParams;
};
@@ -59,27 +59,7 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
sunnypilotScroller->restoreScrollPosition();
main_layout->setCurrentWidget(sunnypilotScreen);
});
// Lane Turn Settings
laneTurnSettingsButton = new PushButtonSP(tr("Customize Lane Turn"));
laneTurnSettingsButton->setObjectName("lane_turn_btn");
connect(laneTurnSettingsButton, &QPushButton::clicked, [=]() {
sunnypilotScroller->setLastScrollPosition();
main_layout->setCurrentWidget(laneTurnWidget);
});
laneTurnWidget = new LaneTurnSettings(this);
connect(laneTurnWidget, &LaneTurnSettings::backPress, [=]() {
sunnypilotScroller->restoreScrollPosition();
main_layout->setCurrentWidget(sunnypilotScreen);
});
QWidget *laneButtonsWidget = new QWidget();
QHBoxLayout *laneButtonsLayout = new QHBoxLayout(laneButtonsWidget);
laneButtonsLayout->setContentsMargins(0, 0, 0, 0);
laneChangeSettingsButton->setFixedWidth(750); laneTurnSettingsButton->setFixedWidth(750);
laneButtonsLayout->addWidget(laneChangeSettingsButton); laneButtonsLayout->addWidget(laneTurnSettingsButton);
list->addItem(laneButtonsWidget);
list->addItem(laneChangeSettingsButton);
list->addItem(vertical_space(0));
list->addItem(horizontal_line());
@@ -95,6 +75,36 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
list->addItem(horizontal_line());
// Customized Torque Lateral Control
torqueLateralControlToggle = new ParamControl(
"EnforceTorqueControl",
tr("Enforce Torque Lateral Control"),
tr("Enable this to enforce sunnypilot to steer with Torque lateral control."),
"");
list->addItem(torqueLateralControlToggle);
torqueLateralControlSettingsButton = new PushButtonSP(tr("Customize Params"));
torqueLateralControlSettingsButton->setObjectName("torque_btn");
connect(torqueLateralControlSettingsButton, &QPushButton::clicked, [=]() {
sunnypilotScroller->setLastScrollPosition();
main_layout->setCurrentWidget(torqueLateralControlWidget);
});
QObject::connect(torqueLateralControlToggle, &ToggleControl::toggleFlipped, [=](bool state) {
torqueLateralControlSettingsButton->setEnabled(state);
nnlcToggle->updateToggle(offroad);
updateToggles(offroad);
});
torqueLateralControlWidget = new TorqueLateralControlSettings(this);
connect(torqueLateralControlWidget, &TorqueLateralControlSettings::backPress, [=]() {
sunnypilotScroller->restoreScrollPosition();
main_layout->setCurrentWidget(sunnypilotScreen);
});
list->addItem(torqueLateralControlSettingsButton);
list->addItem(vertical_space(0));
list->addItem(horizontal_line());
// Neural Network Lateral Control
nnlcToggle = new NeuralNetworkLateralControl();
list->addItem(nnlcToggle);
@@ -106,12 +116,10 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
nnlcToggle->hideDescription();
}
nnlcToggle->updateToggle();
nnlcToggle->updateToggle(offroad);
updateToggles(offroad);
});
toggleOffroadOnly = {
madsToggle, nnlcToggle,
};
QObject::connect(uiState(), &UIState::offroadTransition, this, &LateralPanel::updateToggles);
sunnypilotScroller = new ScrollViewSP(list, this);
@@ -120,7 +128,7 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
main_layout->addWidget(sunnypilotScreen);
main_layout->addWidget(madsWidget);
main_layout->addWidget(laneChangeWidget);
main_layout->addWidget(laneTurnWidget);
main_layout->addWidget(torqueLateralControlWidget);
setStyleSheet(R"(
#back_btn {
@@ -141,7 +149,7 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
}
void LateralPanel::showEvent(QShowEvent *event) {
nnlcToggle->updateToggle();
nnlcToggle->updateToggle(offroad);
updateToggles(offroad);
}
@@ -150,27 +158,40 @@ void LateralPanel::hideEvent(QHideEvent *event) {
}
void LateralPanel::updateToggles(bool _offroad) {
for (auto *toggle : toggleOffroadOnly) {
toggle->setEnabled(_offroad);
}
bool torque_allowed = true;
auto cp_bytes = params.get("CarParamsPersistent");
if (!cp_bytes.empty()) {
auto cp_sp_bytes = params.get("CarParamsSPPersistent");
if (!cp_bytes.empty() && !cp_sp_bytes.empty()) {
AlignedBuffer aligned_buf;
AlignedBuffer aligned_buf_sp;
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(cp_bytes.data(), cp_bytes.size()));
capnp::FlatArrayMessageReader cmsg_sp(aligned_buf_sp.align(cp_sp_bytes.data(), cp_sp_bytes.size()));
cereal::CarParams::Reader CP = cmsg.getRoot<cereal::CarParams>();
cereal::CarParamsSP::Reader CP_SP = cmsg_sp.getRoot<cereal::CarParamsSP>();
if (isBrandInList(CP.getBrand(), mads_limited_settings_brands)) {
if (madsLimitedSettings(CP, CP_SP)) {
madsToggle->setDescription(descriptionBuilder(STATUS_MADS_SETTINGS_LIMITED_COMPATIBILITY, MADS_BASE_DESC));
} else {
madsToggle->setDescription(descriptionBuilder(STATUS_MADS_SETTINGS_FULL_COMPATIBILITY, MADS_BASE_DESC));
}
if (CP.getSteerControlType() == cereal::CarParams::SteerControlType::ANGLE) {
params.remove("EnforceTorqueControl");
torque_allowed = false;
}
} else {
madsToggle->setDescription(descriptionBuilder(STATUS_MADS_CHECK_COMPATIBILITY, MADS_BASE_DESC));
params.remove("EnforceTorqueControl");
torque_allowed = false;
}
madsToggle->setEnabled(_offroad);
madsSettingsButton->setEnabled(madsToggle->isToggled());
torqueLateralControlToggle->setEnabled(_offroad && torque_allowed && !nnlcToggle->isToggled());
torqueLateralControlSettingsButton->setEnabled(torqueLateralControlToggle->isToggled());
blinkerPauseLateralSettings->refresh();
offroad = _offroad;
@@ -15,7 +15,7 @@
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/mads_settings.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/neural_network_lateral_control.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/lane_change_settings.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/lane_turn_settings.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_settings.h"
#include "selfdrive/ui/qt/util.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
@@ -36,7 +36,6 @@ private:
QStackedLayout* main_layout = nullptr;
QWidget* sunnypilotScreen = nullptr;
ScrollViewSP *sunnypilotScroller = nullptr;
std::vector<ParamControl *> toggleOffroadOnly;
bool offroad;
ParamControl *madsToggle;
@@ -44,10 +43,11 @@ private:
MadsSettings *madsWidget = nullptr;
PushButtonSP *laneChangeSettingsButton;
LaneChangeSettings *laneChangeWidget = nullptr;
PushButtonSP *laneTurnSettingsButton;
LaneTurnSettings *laneTurnWidget = nullptr;
NeuralNetworkLateralControl *nnlcToggle = nullptr;
BlinkerPauseLateralSettings *blinkerPauseLateralSettings = nullptr;
ParamControl *torqueLateralControlToggle;
PushButtonSP *torqueLateralControlSettingsButton;
TorqueLateralControlSettings *torqueLateralControlWidget = nullptr;
const QString MADS_BASE_DESC = tr("Enables independent engagements of Automatic Lane Centering (ALC) and Adaptive Cruise Control (ACC).");
@@ -0,0 +1,49 @@
/*
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
enum class SpeedLimitOffsetType {
NONE,
FIXED,
PERCENT,
};
inline const QString SpeedLimitOffsetTypeTexts[]{
QObject::tr("None"),
QObject::tr("Fixed"),
QObject::tr("Percent"),
};
enum class SpeedLimitSourcePolicy {
CAR_ONLY,
MAP_ONLY,
CAR_FIRST,
MAP_FIRST,
COMBINED,
};
inline const QString SpeedLimitSourcePolicyTexts[]{
QObject::tr("Car\nOnly"),
QObject::tr("Map\nOnly"),
QObject::tr("Car\nFirst"),
QObject::tr("Map\nFirst"),
QObject::tr("Combined\nData")
};
enum class SpeedLimitMode {
OFF,
INFORMATION,
WARNING,
ASSIST,
};
inline const QString SpeedLimitModeTexts[]{
QObject::tr("Off"),
QObject::tr("Information"),
QObject::tr("Warning"),
QObject::tr("Assist"),
};
@@ -0,0 +1,56 @@
/*
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include <QScrollBar>
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_policy.h"
SpeedLimitPolicy::SpeedLimitPolicy(QWidget *parent) : QWidget(parent) {
QVBoxLayout *main_layout = new QVBoxLayout(this);
main_layout->setContentsMargins(0, 0, 0, 0);
main_layout->setSpacing(0);
// Back button
PanelBackButton *back = new PanelBackButton(tr("Back"));
connect(back, &QPushButton::clicked, [=]() { emit backPress(); });
main_layout->addWidget(back, 0, Qt::AlignLeft);
main_layout->addSpacing(10);
ListWidgetSP *list = new ListWidgetSP(this);
std::vector<QString> speed_limit_policy_texts{
SpeedLimitSourcePolicyTexts[static_cast<int>(SpeedLimitSourcePolicy::CAR_ONLY)],
SpeedLimitSourcePolicyTexts[static_cast<int>(SpeedLimitSourcePolicy::MAP_ONLY)],
SpeedLimitSourcePolicyTexts[static_cast<int>(SpeedLimitSourcePolicy::CAR_FIRST)],
SpeedLimitSourcePolicyTexts[static_cast<int>(SpeedLimitSourcePolicy::MAP_FIRST)],
SpeedLimitSourcePolicyTexts[static_cast<int>(SpeedLimitSourcePolicy::COMBINED)]
};
speed_limit_policy = new ButtonParamControlSP(
"SpeedLimitPolicy",
tr("Speed Limit Source"),
"",
"",
speed_limit_policy_texts,
250);
list->addItem(speed_limit_policy);
connect(speed_limit_policy, &ButtonParamControlSP::buttonClicked, this, &SpeedLimitPolicy::refresh);
speedLimitPolicyScroller = new ScrollViewSP(list, this);
main_layout->addWidget(speedLimitPolicyScroller);
refresh();
};
void SpeedLimitPolicy::refresh() {
SpeedLimitSourcePolicy policy_param = static_cast<SpeedLimitSourcePolicy>(std::atoi(params.get("SpeedLimitPolicy").c_str()));
speed_limit_policy->setDescription(sourceDescription(policy_param));
}
void SpeedLimitPolicy::showEvent(QShowEvent *event) {
speedLimitPolicyScroller->verticalScrollBar()->setValue(0);
refresh();
speed_limit_policy->showDescription();
}
@@ -0,0 +1,57 @@
/*
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/sunnypilot/ui.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/helpers.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
class SpeedLimitPolicy : public QWidget {
Q_OBJECT
public:
explicit SpeedLimitPolicy(QWidget *parent = nullptr);
void refresh();
void showEvent(QShowEvent *event) override;
signals:
void backPress();
private:
Params params;
ButtonParamControlSP *speed_limit_policy;
ScrollViewSP *speedLimitPolicyScroller;
static QString sourceDescription(SpeedLimitSourcePolicy type = SpeedLimitSourcePolicy::CAR_ONLY) {
QString car_only = tr("⦿ Car Only: Use Speed Limit data only from Car");
QString map_only = tr("⦿ Map Only: Use Speed Limit data only from OpenStreetMaps");
QString car_first = tr("⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps");
QString map_first = tr("⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car");
QString combined = tr("⦿ Combined: Use combined Speed Limit data from Car & OpenStreetMaps");
if (type == SpeedLimitSourcePolicy::CAR_ONLY) {
car_only = "<font color='white'><b>" + car_only + "</b></font>";
} else if (type == SpeedLimitSourcePolicy::MAP_ONLY) {
map_only = "<font color='white'><b>" + map_only + "</b></font>";
} else if (type == SpeedLimitSourcePolicy::CAR_FIRST) {
car_first = "<font color='white'><b>" + car_first + "</b></font>";
} else if (type == SpeedLimitSourcePolicy::MAP_FIRST) {
map_first = "<font color='white'><b>" + map_first + "</b></font>";
} else {
combined = "<font color='white'><b>" + combined + "</b></font>";
}
return QString("%1<br>%2<br>%3<br>%4<br>%5")
.arg(car_only)
.arg(map_only)
.arg(car_first)
.arg(map_first)
.arg(combined);
}
};
@@ -0,0 +1,164 @@
/*
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h"
SpeedLimitSettings::SpeedLimitSettings(QWidget *parent) : QStackedWidget(parent) {
subPanelFrame = new QFrame();
QVBoxLayout *subPanelLayout = new QVBoxLayout(subPanelFrame);
subPanelLayout->setContentsMargins(0, 0, 0, 0);
subPanelLayout->setSpacing(0);
// Back button
PanelBackButton *back = new PanelBackButton(tr("Back"));
connect(back, &QPushButton::clicked, [=]() { emit backPress(); });
subPanelLayout->addWidget(back, 0, Qt::AlignLeft);
subPanelLayout->addSpacing(20);
ListWidgetSP *list = new ListWidgetSP(this, false);
speedLimitPolicyScreen = new SpeedLimitPolicy(this);
std::vector<QString> speed_limit_mode_texts{
SpeedLimitModeTexts[static_cast<int>(SpeedLimitMode::OFF)],
SpeedLimitModeTexts[static_cast<int>(SpeedLimitMode::INFORMATION)],
SpeedLimitModeTexts[static_cast<int>(SpeedLimitMode::WARNING)],
SpeedLimitModeTexts[static_cast<int>(SpeedLimitMode::ASSIST)],
};
speed_limit_mode_settings = new ButtonParamControlSP(
"SpeedLimitMode",
tr("Speed Limit"),
"",
"",
speed_limit_mode_texts,
380);
list->addItem(speed_limit_mode_settings);
list->addItem(horizontal_line());
list->addItem(vertical_space());
speedLimitSource = new PushButtonSP(tr("Customize Source"));
connect(speedLimitSource, &QPushButton::clicked, [&]() {
speedLimitScroller->setLastScrollPosition();
setCurrentWidget(speedLimitPolicyScreen);
speedLimitPolicyScreen->refresh();
});
connect(speedLimitPolicyScreen, &SpeedLimitPolicy::backPress, [&]() {
speedLimitScroller->restoreScrollPosition();
setCurrentWidget(subPanelFrame);
showEvent(new QShowEvent());
});
speedLimitSource->setFixedWidth(720);
list->addItem(speedLimitSource);
list->addItem(vertical_space(0));
list->addItem(horizontal_line());
QFrame *offsetFrame = new QFrame(this);
QVBoxLayout *offsetLayout = new QVBoxLayout(offsetFrame);
std::vector<QString> speed_limit_offset_texts{
SpeedLimitOffsetTypeTexts[static_cast<int>(SpeedLimitOffsetType::NONE)],
SpeedLimitOffsetTypeTexts[static_cast<int>(SpeedLimitOffsetType::FIXED)],
SpeedLimitOffsetTypeTexts[static_cast<int>(SpeedLimitOffsetType::PERCENT)]
};
speed_limit_offset_settings = new ButtonParamControlSP(
"SpeedLimitOffsetType",
tr("Speed Limit Offset"),
"",
"",
speed_limit_offset_texts,
500);
offsetLayout->addWidget(speed_limit_offset_settings);
speed_limit_offset = new OptionControlSP(
"SpeedLimitValueOffset",
"",
"",
"",
{-30, 30}
);
offsetLayout->addWidget(speed_limit_offset);
list->addItem(offsetFrame);
connect(speed_limit_mode_settings, &ButtonParamControlSP::buttonClicked, this, &SpeedLimitSettings::refresh);
connect(speed_limit_offset, &OptionControlSP::updateLabels, this, &SpeedLimitSettings::refresh);
connect(speed_limit_offset_settings, &ButtonParamControlSP::showDescriptionEvent, speed_limit_offset, &OptionControlSP::showDescription);
connect(speed_limit_offset_settings, &ButtonParamControlSP::buttonClicked, this, &SpeedLimitSettings::refresh);
refresh();
speedLimitScroller = new ScrollViewSP(list, this);
subPanelLayout->addWidget(speedLimitScroller);
addWidget(subPanelFrame);
addWidget(speedLimitPolicyScreen);
setCurrentWidget(subPanelFrame);
}
void SpeedLimitSettings::refresh() {
bool is_metric_param = params.getBool("IsMetric");
SpeedLimitMode speed_limit_mode_param = static_cast<SpeedLimitMode>(std::atoi(params.get("SpeedLimitMode").c_str()));
SpeedLimitOffsetType offset_type_param = static_cast<SpeedLimitOffsetType>(std::atoi(params.get("SpeedLimitOffsetType").c_str()));
QString offsetLabel = QString::fromStdString(params.get("SpeedLimitValueOffset"));
bool has_longitudinal_control;
bool intelligent_cruise_button_management_available;
auto cp_bytes = params.get("CarParamsPersistent");
auto cp_sp_bytes = params.get("CarParamsSPPersistent");
if (!cp_bytes.empty() && !cp_sp_bytes.empty()) {
AlignedBuffer aligned_buf;
AlignedBuffer aligned_buf_sp;
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(cp_bytes.data(), cp_bytes.size()));
capnp::FlatArrayMessageReader cmsg_sp(aligned_buf_sp.align(cp_sp_bytes.data(), cp_sp_bytes.size()));
cereal::CarParams::Reader CP = cmsg.getRoot<cereal::CarParams>();
cereal::CarParamsSP::Reader CP_SP = cmsg_sp.getRoot<cereal::CarParamsSP>();
has_longitudinal_control = hasLongitudinalControl(CP);
intelligent_cruise_button_management_available = CP_SP.getIntelligentCruiseButtonManagementAvailable();
} else {
has_longitudinal_control = false;
intelligent_cruise_button_management_available = false;
}
speed_limit_mode_settings->setDescription(modeDescription(speed_limit_mode_param));
speed_limit_offset->setDescription(offsetDescription(offset_type_param));
if (offset_type_param == SpeedLimitOffsetType::PERCENT) {
offsetLabel += "%";
} else if (offset_type_param == SpeedLimitOffsetType::FIXED) {
offsetLabel += QString(" %1").arg(is_metric_param ? "km/h" : "mph");
}
if (offset_type_param == SpeedLimitOffsetType::NONE) {
speed_limit_offset->setVisible(false);
} else {
speed_limit_offset->setVisible(true);
speed_limit_offset->setLabel(offsetLabel);
speed_limit_offset->showDescription();
}
if (has_longitudinal_control || intelligent_cruise_button_management_available) {
speed_limit_mode_settings->setEnableSelectedButtons(true, convertSpeedLimitModeValues(getSpeedLimitModeValues()));
} else {
speed_limit_mode_settings->setEnableSelectedButtons(true, convertSpeedLimitModeValues(
{SpeedLimitMode::OFF,SpeedLimitMode::INFORMATION, SpeedLimitMode::WARNING}));
}
speed_limit_mode_settings->showDescription();
speed_limit_offset->showDescription();
}
void SpeedLimitSettings::showEvent(QShowEvent *event) {
refresh();
}
void SpeedLimitSettings::hideEvent(QHideEvent *event) {
setCurrentWidget(subPanelFrame);
}
@@ -0,0 +1,97 @@
/*
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/sunnypilot/ui.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/helpers.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_policy.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
class SpeedLimitSettings : public QStackedWidget {
Q_OBJECT
public:
SpeedLimitSettings(QWidget *parent = nullptr);
void refresh();
void showEvent(QShowEvent *event) override;
void hideEvent(QHideEvent *event) override;
signals:
void backPress();
private:
Params params;
ScrollViewSP *speedLimitScroller;
QFrame *subPanelFrame;
ButtonParamControlSP *speed_limit_mode_settings;
PushButtonSP *speedLimitSource;
SpeedLimitPolicy *speedLimitPolicyScreen;
ButtonParamControlSP *speed_limit_offset_settings;
OptionControlSP *speed_limit_offset;
static QString offsetDescription(SpeedLimitOffsetType type = SpeedLimitOffsetType::NONE) {
QString none_str = tr("⦿ None: No Offset");
QString fixed_str = tr("⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]");
QString percent_str = tr("⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]");
if (type == SpeedLimitOffsetType::FIXED) {
fixed_str = "<font color='white'><b>" + fixed_str + "</b></font>";
} else if (type == SpeedLimitOffsetType::PERCENT) {
percent_str = "<font color='white'><b>" + percent_str + "</b></font>";
} else {
none_str = "<font color='white'><b>" + none_str + "</b></font>";
}
return QString("%1<br>%2<br>%3")
.arg(none_str)
.arg(fixed_str)
.arg(percent_str);
}
static QString modeDescription(SpeedLimitMode mode = SpeedLimitMode::OFF) {
QString off_str = tr("⦿ Off: Disables the Speed Limit functions.");
QString info_str = tr("⦿ Information: Displays the current road's speed limit.");
QString warning_str = tr("⦿ Warning: Provides a warning when exceeding the current road's speed limit.");
QString assist_str = tr("⦿ Assist: Adjusts the vehicle's cruise speed based on the current road's speed limit when operating the +/- buttons.");
if (mode == SpeedLimitMode::ASSIST) {
assist_str = "<font color='white'><b>" + assist_str + "</b></font>";
} else if (mode == SpeedLimitMode::WARNING) {
warning_str = "<font color='white'><b>" + warning_str + "</b></font>";
} else if (mode == SpeedLimitMode::INFORMATION) {
info_str = "<font color='white'><b>" + info_str + "</b></font>";
} else {
off_str = "<font color='white'><b>" + off_str + "</b></font>";
}
return QString("%1<br>%2<br>%3<br>%4")
.arg(off_str)
.arg(info_str)
.arg(warning_str)
.arg(assist_str);
}
static std::vector<SpeedLimitMode> getSpeedLimitModeValues() {
std::vector<SpeedLimitMode> values;
for (int i = static_cast<int>(SpeedLimitMode::OFF);
i <= static_cast<int>(SpeedLimitMode::ASSIST); ++i) {
values.push_back(static_cast<SpeedLimitMode>(i));
}
return values;
}
static std::vector<int> convertSpeedLimitModeValues(const std::vector<SpeedLimitMode> &modes) {
std::vector<int> values;
for (const auto& mode : modes) {
values.push_back(static_cast<int>(mode));
}
return values;
}
};
@@ -8,6 +8,21 @@
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal_panel.h"
LongitudinalPanel::LongitudinalPanel(QWidget *parent) : QWidget(parent) {
setStyleSheet(R"(
#back_btn {
font-size: 50px;
margin: 0px;
padding: 15px;
border-width: 0;
border-radius: 30px;
color: #dddddd;
background-color: #393939;
}
#back_btn:pressed {
background-color: #4a4a4a;
}
)");
main_layout = new QStackedLayout(this);
ListWidget *list = new ListWidget(this, false);
@@ -35,12 +50,62 @@ LongitudinalPanel::LongitudinalPanel(QWidget *parent) : QWidget(parent) {
"");
list->addItem(SmartCruiseControlVision);
SmartCruiseControlMap = new ParamControl(
"SmartCruiseControlMap",
tr("Smart Cruise Control - Map"),
tr("Use map data to estimate the appropriate speed to drive through turns ahead."),
"");
list->addItem(SmartCruiseControlMap);
customAccIncrement = new CustomAccIncrement("CustomAccIncrementsEnabled", tr("Custom ACC Speed Increments"), "", "", this);
list->addItem(customAccIncrement);
QObject::connect(uiState(), &UIState::offroadTransition, this, &LongitudinalPanel::refresh);
speedLimitSettings = new PushButtonSP(tr("Speed Limit"), 750, this);
connect(speedLimitSettings, &QPushButton::clicked, [&]() {
cruisePanelScroller->setLastScrollPosition();
main_layout->setCurrentWidget(speedLimitScreen);
});
list->addItem(speedLimitSettings);
speedLimitScreen = new SpeedLimitSettings(this);
connect(speedLimitScreen, &SpeedLimitSettings::backPress, [=]() {
cruisePanelScroller->restoreScrollPosition();
main_layout->setCurrentWidget(cruisePanelScreen);
});
// Vibe Personality Controller
vibePersonalityControl = new ParamControlSP("VibePersonalityEnabled",
tr("Vibe Personality Controller"),
tr("Advanced driving personality system with separate controls for acceleration behavior (Eco/Normal/Sport) and following distance/braking (Relaxed/Standard/Aggressive). "
"Customize your driving experience with independent acceleration and distance personalities."),
"../assets/offroad/icon_shell.png");
list->addItem(vibePersonalityControl);
connect(vibePersonalityControl, &ParamControlSP::toggleFlipped, [=]() {
refresh(offroad);
});
// Vibe Acceleration Personality
vibeAccelPersonalityControl = new ParamControlSP("VibeAccelPersonalityEnabled",
tr("Acceleration Personality"),
tr("Controls acceleration behavior: Eco (efficient), Normal (balanced), Sport (responsive). "
"Adjust how aggressively the vehicle accelerates while maintaining smooth operation."),
"../assets/offroad/icon_shell.png");
list->addItem(vibeAccelPersonalityControl);
// Vibe Following Distance Personality
vibeFollowPersonalityControl = new ParamControlSP("VibeFollowPersonalityEnabled",
tr("Following Distance Personality"),
tr("Controls following distance and braking behavior: Relaxed (longer distance, gentler braking), Standard (balanced), Aggressive (shorter distance, firmer braking). "
"Fine-tune your comfort level in traffic situations."),
"../assets/offroad/icon_shell.png");
list->addItem(vibeFollowPersonalityControl);
main_layout->addWidget(cruisePanelScreen);
main_layout->addWidget(speedLimitScreen);
main_layout->setCurrentWidget(cruisePanelScreen);
refresh(offroad);
}
@@ -50,6 +115,10 @@ void LongitudinalPanel::showEvent(QShowEvent *event) {
refresh(offroad);
}
void LongitudinalPanel::hideEvent(QHideEvent *event) {
main_layout->setCurrentWidget(cruisePanelScreen);
}
void LongitudinalPanel::refresh(bool _offroad) {
auto cp_bytes = params.get("CarParamsPersistent");
auto cp_sp_bytes = params.get("CarParamsSPPersistent");
@@ -95,6 +164,14 @@ void LongitudinalPanel::refresh(bool _offroad) {
intelligentCruiseButtonManagement->toggleFlipped(false);
}
}
bool vibePersonalityEnabled = params.getBool("VibePersonalityEnabled");
if (vibePersonalityEnabled) {
vibeAccelPersonalityControl->setVisible(true);
vibeFollowPersonalityControl->setVisible(true);
} else {
vibeAccelPersonalityControl->setVisible(false);
vibeFollowPersonalityControl->setVisible(false);
}
bool icbm_allowed = intelligent_cruise_button_management_available && !has_longitudinal_control;
intelligentCruiseButtonManagement->setEnabled(icbm_allowed && offroad);
@@ -105,6 +182,14 @@ void LongitudinalPanel::refresh(bool _offroad) {
customAccIncrement->refresh();
SmartCruiseControlVision->setEnabled(has_longitudinal_control || icbm_allowed);
SmartCruiseControlMap->setEnabled(has_longitudinal_control || icbm_allowed);
// Vibe Personality controls - always enabled for toggling
vibePersonalityControl->setEnabled(true);
vibeAccelPersonalityControl->setEnabled(true);
vibeFollowPersonalityControl->setEnabled(true);
vibePersonalityControl->refresh();
vibeAccelPersonalityControl->refresh();
vibeFollowPersonalityControl->refresh();
offroad = _offroad;
}
@@ -8,6 +8,7 @@
#pragma once
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/custom_acc_increment.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
@@ -17,6 +18,7 @@ class LongitudinalPanel : public QWidget {
public:
explicit LongitudinalPanel(QWidget *parent = nullptr);
void showEvent(QShowEvent *event) override;
void hideEvent(QHideEvent *event) override;
void refresh(bool _offroad);
private:
@@ -31,5 +33,12 @@ private:
QWidget *cruisePanelScreen = nullptr;
CustomAccIncrement *customAccIncrement = nullptr;
ParamControl *SmartCruiseControlVision;
ParamControl *SmartCruiseControlMap;
ParamControl *intelligentCruiseButtonManagement = nullptr;
SpeedLimitSettings *speedLimitScreen;
PushButtonSP *speedLimitSettings;
ParamControlSP *vibePersonalityControl;
ParamControlSP *vibeAccelPersonalityControl;
ParamControlSP *vibeFollowPersonalityControl;
};
@@ -103,6 +103,30 @@ ModelsPanel::ModelsPanel(QWidget *parent) : QWidget(parent) {
list->addItem(policyFrame);
list->addItem(horizontal_line());
// Lane Turn Desire toggle
lane_turn_desire_toggle = new ParamControlSP("LaneTurnDesire", tr("Use Lane Turn Desires"),
"If youre driving at 20 mph (32 km/h) or below and have your blinker on, "
"the car will plan a turn in that direction at the nearest drivable path. "
"This prevents situations (like at red lights) where the car might plan the wrong turn direction.",
"../assets/offroad/icon_shell.png");
list->addItem(lane_turn_desire_toggle);
// Lane Turn Value control
int max_value_mph = 20;
bool is_metric_initial = params.getBool("IsMetric");
const float K = 1.609344f;
int per_value_change_scaled = is_metric_initial ? static_cast<int>(std::round((1.0f / K) * 100.0f)) : 100; // 100 -> 1 mph
lane_turn_value_control = new OptionControlSP("LaneTurnValue", tr("Adjust Lane Turn Speed"),
tr("Set the maximum speed for lane turn desires. Default is 19 %1.").arg(is_metric_initial ? "km/h" : "mph"),
"", {5 * 100, max_value_mph * 100}, per_value_change_scaled, false, nullptr, true, true);
lane_turn_value_control->showDescription();
list->addItem(lane_turn_value_control);
// Show based on toggle
refreshLaneTurnValueControl();
connect(lane_turn_desire_toggle, &ParamControlSP::toggleFlipped, this, &ModelsPanel::refreshLaneTurnValueControl);
connect(lane_turn_value_control, &OptionControlSP::updateLabels, this, &ModelsPanel::refreshLaneTurnValueControl);
// LiveDelay toggle
lagd_toggle_control = new ParamControlSP("LagdToggle", tr("Live Learning Steer Delay"), "", "../assets/offroad/icon_shell.png");
lagd_toggle_control->showDescription();
@@ -145,6 +169,23 @@ QFrame* ModelsPanel::createModelDetailFrame(QWidget *parent, QString &typeName,
return frame;
}
void ModelsPanel::refreshLaneTurnValueControl() {
if (!lane_turn_value_control) return;
float stored_mph = QString::fromStdString(params.get("LaneTurnValue")).toFloat();
bool is_metric = params.getBool("IsMetric");
QString unit = is_metric ? "km/h" : "mph";
float display_value = stored_mph;
if (is_metric) {
display_value = stored_mph * 1.609344f;
}
lane_turn_value_control->setLabel(QString::number(static_cast<int>(std::round(display_value))) + " " + unit);
lane_turn_value_control->setVisible(params.getBool("LaneTurnDesire"));
}
/**
* @brief Updates the UI with bundle download progress information
* Reads status from modelManagerSP cereal message and displays status for all models
*/
void ModelsPanel::handleBundleDownloadProgress() {
supercomboFrame->setVisible(false);
visionFrame->setVisible(false);
@@ -415,6 +456,9 @@ void ModelsPanel::updateLabels() {
delay_control->setLabel(QString::number(value, 'f', 2) + "s");
}
// Update lane turn desire label and visibility
refreshLaneTurnValueControl();
clearModelCacheBtn->setValue(QString::number(calculateCacheSize(), 'f', 2) + " MB");
}
@@ -38,6 +38,7 @@ private:
void updateLabels();
void handleCurrentModelLblBtnClicked();
void handleBundleDownloadProgress();
void refreshLaneTurnValueControl();
void showResetParamsDialog();
QProgressBar* createProgressBar(QWidget *parent);
QFrame* createModelDetailFrame(QWidget *parent, QString &typeName, QProgressBar *progressBar);
@@ -82,4 +83,6 @@ private:
Params params;
ButtonControlSP *clearModelCacheBtn;
ButtonControlSP *refreshAvailableModelsBtn;
ParamControlSP *lane_turn_desire_toggle;
OptionControlSP *lane_turn_value_control;
};
@@ -12,6 +12,7 @@
#include <string>
#include "common/swaglog.h"
#include "selfdrive/ui/sunnypilot/qt/util.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
OsmPanel::OsmPanel(QWidget *parent) : QFrame(parent) {
@@ -91,24 +92,30 @@ ButtonControlSP *OsmPanel::setupOsmDownloadButton(QWidget *parent) {
locationTitles.push_back(std::get<0>(loc));
}
const QString selection = MultiOptionDialog::getSelection(tr("Country"), locationTitles, currentTitle, this);
if (!selection.isEmpty()) {
params.put("OsmLocal", "1");
params.put("OsmLocationTitle", selection.toStdString());
for (auto &loc: locations) {
if (std::get<0>(loc) == selection) {
params.put("OsmLocationName", std::get<1>(loc).toStdString());
break;
InputDialog d(tr("Search Country"), this, tr("Enter search keywords, or leave blank to list all countries."), false);
d.setMinLength(0);
const int ret = d.exec();
if (ret) {
const QString selection = search(d.text(), locationTitles, tr("Select Country"));
if (!selection.isEmpty()) {
params.put("OsmLocal", "1");
params.put("OsmLocationTitle", selection.toStdString());
for (auto &loc: locations) {
if (std::get<0>(loc) == selection) {
params.put("OsmLocationName", std::get<1>(loc).toStdString());
break;
}
}
}
if (params.get("OsmLocationName") == "US") {
usStatesBtn->click();
return;
} else if (selection != "== None ==") {
if (showConfirmationDialog(parent)) {
osm_download_in_progress = true;
params.putBool("OsmDbUpdatesCheck", true);
updateLabels();
if (params.get("OsmLocationName") == "US") {
usStatesBtn->click();
return;
}
if (selection != "== None ==") {
if (showConfirmationDialog(parent)) {
osm_download_in_progress = true;
params.putBool("OsmDbUpdatesCheck", true);
updateLabels();
}
}
}
}
@@ -135,20 +142,25 @@ ButtonControlSP *OsmPanel::setupUsStatesButton(QWidget *parent) {
locationTitles.push_back(std::get<0>(loc));
}
const QString selection = MultiOptionDialog::getSelection(tr("State"), locationTitles, currentTitle, this);
if (!selection.isEmpty()) {
params.put("OsmStateTitle", selection.toStdString());
for (auto &loc: locations) {
if (std::get<0>(loc) == selection) {
params.put("OsmStateName", std::get<1>(loc).toStdString());
break;
InputDialog d(tr("Search State"), this, tr("Enter search keywords, or leave blank to list all states."), false);
d.setMinLength(0);
const int ret = d.exec();
if (ret) {
const QString selection = search(d.text(), locationTitles, tr("Select State"));
if (!selection.isEmpty()) {
params.put("OsmStateTitle", selection.toStdString());
for (auto &loc: locations) {
if (std::get<0>(loc) == selection) {
params.put("OsmStateName", std::get<1>(loc).toStdString());
break;
}
}
usStatesBtn->setValue(selection);
if (showConfirmationDialog(parent)) {
osm_download_in_progress = true;
params.putBool("OsmDbUpdatesCheck", true);
updateLabels();
}
}
usStatesBtn->setValue(selection);
if (showConfirmationDialog(parent)) {
osm_download_in_progress = true;
params.putBool("OsmDbUpdatesCheck", true);
updateLabels();
}
}
updateLabels();
@@ -281,3 +293,15 @@ void OsmPanel::updateMapSize() {
mapSizeFuture = QtConcurrent::run(getDirSize, MAP_PATH);
}
}
QString OsmPanel::search(const QString &query, const QStringList &list, const QString &prompt_text) {
QStringList lst_results = searchFromList(query, list);
QString selection;
if (lst_results.isEmpty()) {
ConfirmationDialog::alert(tr("No results found for keywords: %1").arg(query), this);
return selection;
}
selection = MultiOptionDialog::getSelection(prompt_text, lst_results, "", this);
return selection;
}
@@ -76,6 +76,7 @@ private:
void updateDownloadProgress();
static int extractIntFromJson(const QJsonObject &json, const QString &key);
QString processUpdateStatus(bool pending_update_check, int total_files, int downloaded_files, const QJsonObject &json, bool failed_state);
QString search(const QString &query, const QStringList &list, const QString &prompt_text);
ConfirmationDialog *confirmationDialog;
LabelControlSP *mapdVersion;
@@ -13,6 +13,7 @@
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/developer_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/device_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/display_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/models_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/sunnylink_panel.h"
@@ -87,6 +88,7 @@ SettingsWindowSP::SettingsWindowSP(QWidget *parent) : SettingsWindow(parent) {
PanelInfo(" " + tr("Steering"), new LateralPanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_lateral.png"),
PanelInfo(" " + tr("Cruise"), new LongitudinalPanel(this), "../assets/icons/speed_limit.png"),
PanelInfo(" " + tr("Visuals"), new VisualsPanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_visuals.png"),
PanelInfo(" " + tr("Display"), new DisplayPanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_display.png"),
PanelInfo(" " + tr("OSM"), new OsmPanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_map.png"),
PanelInfo(" " + tr("Trips"), new TripsPanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_trips.png"),
PanelInfo(" " + tr("Vehicle"), new VehiclePanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_vehicle.png"),
@@ -21,7 +21,7 @@ SunnylinkPanel::SunnylinkPanel(QWidget *parent) : QFrame(parent) {
paramsRefresh(param_name, param_value);
});
is_sunnylink_enabled = Params().getBool("SunnylinkEnabled");
is_sunnylink_enabled = params.getBool("SunnylinkEnabled");
connect(uiStateSP(), &UIStateSP::sunnylinkRolesChanged, this, &SunnylinkPanel::updatePanel);
connect(uiStateSP(), &UIStateSP::sunnylinkDeviceUsersChanged, this, &SunnylinkPanel::updatePanel);
connect(uiStateSP(), &UIStateSP::offroadTransition, [=](bool offroad) {
@@ -272,7 +272,7 @@ void SunnylinkPanel::updatePanel() {
const auto sunnylinkDongleId = getSunnylinkDongleId().value_or(tr("N/A"));
sunnylinkEnabledBtn->setEnabled(!is_onroad);
is_sunnylink_enabled = Params().getBool("SunnylinkEnabled");
is_sunnylink_enabled = params.getBool("SunnylinkEnabled");
bool is_sub = uiStateSP()->isSunnylinkSponsor() && is_sunnylink_enabled;
auto max_current_sponsor_rule = uiStateSP()->sunnylinkSponsorRole();
auto role_name = max_current_sponsor_rule.getSponsorTierString();
@@ -25,21 +25,69 @@ VisualsPanel::VisualsPanel(QWidget *parent) : QWidget(parent) {
"BlindSpot",
tr("Show Blind Spot Warnings"),
tr("Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported."),
"../assets/offroad/icon_monitoring.png",
"",
false,
},
{
"RainbowMode",
tr("Enable Tesla Rainbow Mode"),
RainbowizeWords(tr("A beautiful rainbow effect on the path the model wants to take.")) + "<br/><i>" + tr("It")+ " <b>" + tr("does not") + "</b> " + tr("affect driving in any way.") + "</i>",
"../assets/offroad/icon_monitoring.png",
"",
false,
},
{
"StandstillTimer",
tr("Enable Standstill Timer"),
tr("Show a timer on the HUD when the car is at a standstill."),
"../assets/offroad/icon_monitoring.png",
"",
false,
},
{
"RoadNameToggle",
tr("Display Road Name"),
tr("Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name."),
"",
false,
},
{
"GreenLightAlert",
tr("Green Traffic Light Alert (Beta)"),
QString("%1<br>"
"<h4>%2</h4><br>")
.arg(tr("A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you."))
.arg(tr("Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly.")),
"",
false,
},
{
"LeadDepartAlert",
tr("Lead Departure Alert (Beta)"),
QString("%1<br>"
"<h4>%2</h4><br>")
.arg(tr("A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving."))
.arg(tr("Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly.")),
"",
false,
},
{
"TrueVEgoUI",
tr("Speedometer: Always Display True Speed"),
tr("Always display the true vehicle current speed from wheel speed sensors."),
"",
false,
},
{
"HideVEgoUI",
tr("Speedometer: Hide from Onroad Screen"),
tr("When enabled, the speedometer on the onroad screen is not displayed."),
"",
false,
},
{
"ShowTurnSignals",
tr("Display Turn Signals"),
tr("When enabled, visual turn indicators are drawn on the HUD."),
"",
false,
},
};
@@ -92,6 +140,40 @@ VisualsPanel::VisualsPanel(QWidget *parent) : QWidget(parent) {
vlayout->addWidget(sunnypilotScroller);
main_layout->addWidget(sunnypilotScreen);
QObject::connect(uiState(), &UIState::offroadTransition, this, &VisualsPanel::refreshLongitudinalStatus);
refreshLongitudinalStatus();
}
void VisualsPanel::refreshLongitudinalStatus() {
auto cp_bytes = params.get("CarParamsPersistent");
if (!cp_bytes.empty()) {
AlignedBuffer aligned_buf;
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(cp_bytes.data(), cp_bytes.size()));
cereal::CarParams::Reader CP = cmsg.getRoot<cereal::CarParams>();
has_longitudinal_control = hasLongitudinalControl(CP);
} else {
has_longitudinal_control = false;
}
if (chevron_info_settings) {
QString chevronEnabledDescription = tr("Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).");
QString chevronNoLongDescription = tr("This feature requires openpilot longitudinal control to be available.");
if (has_longitudinal_control) {
chevron_info_settings->setDescription(chevronEnabledDescription);
} else {
// Reset to "Off" when longitudinal not available
params.put("ChevronInfo", "0");
chevron_info_settings->setDescription(chevronNoLongDescription);
}
// Enable only when longitudinal is available
chevron_info_settings->setEnabled(has_longitudinal_control);
chevron_info_settings->refresh();
}
}
void VisualsPanel::paramsRefresh() {
@@ -19,6 +19,7 @@ public:
explicit VisualsPanel(QWidget *parent = nullptr);
void paramsRefresh();
void refreshLongitudinalStatus();
protected:
QStackedLayout* main_layout = nullptr;
@@ -29,4 +30,6 @@ protected:
ParamWatcher * param_watcher;
ButtonParamControlSP *chevron_info_settings;
ButtonParamControlSP *dev_ui_settings;
bool has_longitudinal_control = false;
};
+102
View File
@@ -0,0 +1,102 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/onroad/alerts.h"
#include <QPainter>
#include <map>
#include <QRect>
#include <QFont>
OnroadAlerts::Alert OnroadAlertsSP::getAlert(const SubMaster &sm, uint64_t started_frame) {
OnroadAlerts::Alert alert = OnroadAlerts::getAlert(sm, started_frame);
alert.text1.replace("openpilot", "sunnypilot");
alert.text2.replace("openpilot", "sunnypilot");
return alert;
}
void OnroadAlertsSP::paintEvent(QPaintEvent *event) {
if (alert.size == cereal::SelfdriveState::AlertSize::NONE) {
return;
} else if (alert.size == cereal::SelfdriveState::AlertSize::FULL) {
OnroadAlerts::paintEvent(event);
return;
}
static std::map<cereal::SelfdriveState::AlertSize, const int> alert_heights = {
{cereal::SelfdriveState::AlertSize::SMALL, 271},
{cereal::SelfdriveState::AlertSize::MID, 420}
};
int h = alert_heights[alert.size];
QPainter p(this);
QFont topFont;
QFont bottomFont;
QRect topTextBoundingRect;
QRect bottomTextBoundingRect;
QRect rect;
int margin = 40;
int radius = 30;
const int dev_ui_info = uiStateSP()->scene.dev_ui_info;
const int v_adjustment = dev_ui_info > 1 && alert.size != cereal::SelfdriveState::AlertSize::FULL ? 40 : 0;
const int h_adjustment = dev_ui_info > 0 && alert.size != cereal::SelfdriveState::AlertSize::FULL ? 230 : 0;
if (alert.size == cereal::SelfdriveState::AlertSize::SMALL) {
topFont = InterFont(74, QFont::DemiBold);
QFontMetrics fmTop(topFont);
topTextBoundingRect = fmTop.boundingRect(
QRect(0 + margin, height() - h + margin - v_adjustment, width() - margin * 2 - h_adjustment, 0), Qt::TextWordWrap,
alert.text1);
h = topTextBoundingRect.height();
rect = QRect(0 + margin, height() - h - margin * 2 - v_adjustment, width() - margin * 2 - h_adjustment, h + margin);
} else if (alert.size == cereal::SelfdriveState::AlertSize::MID) {
topFont = InterFont(88, QFont::Bold);
bottomFont = InterFont(66);
QFontMetrics fmTop(topFont);
QFontMetrics fmBotton(bottomFont);
topTextBoundingRect = fmTop.boundingRect(
QRect(0 + margin, height() - h + margin - v_adjustment, width() - margin * 2 - h_adjustment, 0), Qt::TextWordWrap,
alert.text1);
bottomTextBoundingRect = fmBotton.boundingRect(
QRect(0 + margin, height() - h + margin - v_adjustment + topTextBoundingRect.height(),
width() - margin * 2 - h_adjustment, 0), Qt::TextWordWrap, alert.text2);
h = topTextBoundingRect.height() + bottomTextBoundingRect.height() + margin * 2;
rect = QRect(0 + margin, height() - h - margin * 2 - v_adjustment, width() - margin * 2 - h_adjustment, h + margin);
}
// draw background + gradient
// draw background + gradient
p.setPen(Qt::NoPen);
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
p.setBrush(QBrush(alert_colors[alert.status]));
p.drawRoundedRect(rect, radius, radius);
QLinearGradient g(0, rect.y(), 0, rect.bottom());
g.setColorAt(0, QColor::fromRgbF(0, 0, 0, 0.05));
g.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0.35));
p.setCompositionMode(QPainter::CompositionMode_DestinationOver);
p.setBrush(QBrush(g));
p.drawRoundedRect(rect, radius, radius);
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
// text
p.setPen(QColor(0xff, 0xff, 0xff));
p.setRenderHint(QPainter::TextAntialiasing);
p.setFont(topFont);
if (alert.size == cereal::SelfdriveState::AlertSize::SMALL) {
p.drawText(rect, Qt::AlignCenter | Qt::TextWordWrap, alert.text1);
} else if (alert.size == cereal::SelfdriveState::AlertSize::MID) {
QRect topText = QRect(rect.x(), rect.top() + margin, rect.width(), topTextBoundingRect.height());
p.drawText(topText, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap | Qt::AlignCenter, alert.text1);
p.setFont(bottomFont);
p.drawText(QRect(rect.x(), topText.bottom() + margin, rect.width(), bottomTextBoundingRect.height()),
Qt::AlignHCenter | Qt::TextWordWrap | Qt::AlignCenter, alert.text2);
}
}
@@ -0,0 +1,22 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/qt/onroad/alerts.h"
#include "selfdrive/ui/sunnypilot/ui.h"
class OnroadAlertsSP : public OnroadAlerts {
Q_OBJECT
public:
OnroadAlertsSP(QWidget *parent = 0) : OnroadAlerts(parent) {}
protected:
void paintEvent(QPaintEvent *) override;
Alert getAlert(const SubMaster &sm, uint64_t started_frame);
};
@@ -18,4 +18,10 @@ void AnnotatedCameraWidgetSP::updateState(const UIState &s) {
void AnnotatedCameraWidgetSP::showEvent(QShowEvent *event) {
AnnotatedCameraWidget::showEvent(event);
ui_update_params_sp(uiState());
uiStateSP()->reset_onroad_sleep_timer(OnroadTimerStatusToggle::RESUME);
}
void AnnotatedCameraWidgetSP::hideEvent(QHideEvent *event) {
AnnotatedCameraWidget::hideEvent(event);
uiStateSP()->reset_onroad_sleep_timer(OnroadTimerStatusToggle::PAUSE);
}
@@ -18,4 +18,5 @@ public:
protected:
void showEvent(QShowEvent *event) override;
void hideEvent(QHideEvent* event) override;
};
+590 -41
View File
@@ -11,13 +11,22 @@
#include "selfdrive/ui/qt/util.h"
HudRendererSP::HudRendererSP() {}
HudRendererSP::HudRendererSP() {
plus_arrow_up_img = loadPixmap("../../sunnypilot/selfdrive/assets/img_plus_arrow_up", {105, 105});
minus_arrow_down_img = loadPixmap("../../sunnypilot/selfdrive/assets/img_minus_arrow_down", {105, 105});
int small_max = e2e_alert_small * 2 - 40;
int large_max = e2e_alert_large * 2 - 40;
green_light_alert_small_img = loadPixmap("../../sunnypilot/selfdrive/assets/images/green_light.png", {small_max, small_max});
green_light_alert_large_img = loadPixmap("../../sunnypilot/selfdrive/assets/images/green_light.png", {large_max, large_max});
lead_depart_alert_small_img = loadPixmap("../../sunnypilot/selfdrive/assets/images/lead_depart.png", {small_max, small_max});
lead_depart_alert_large_img = loadPixmap("../../sunnypilot/selfdrive/assets/images/lead_depart.png", {large_max, large_max});
}
void HudRendererSP::updateState(const UIState &s) {
HudRenderer::updateState(s);
const SubMaster &sm = *(s.sm);
const bool cs_alive = sm.alive("controlsState");
const auto cs = sm["controlsState"].getControlsState();
const auto car_state = sm["carState"].getCarState();
const auto car_control = sm["carControl"].getCarControl();
@@ -27,6 +36,31 @@ void HudRendererSP::updateState(const UIState &s) {
const auto ltp = sm["liveTorqueParameters"].getLiveTorqueParameters();
const auto car_params = sm["carParams"].getCarParams();
const auto lp_sp = sm["longitudinalPlanSP"].getLongitudinalPlanSP();
const auto lmd = sm["liveMapDataSP"].getLiveMapDataSP();
float speedConv = is_metric ? MS_TO_KPH : MS_TO_MPH;
speedLimit = lp_sp.getSpeedLimit().getResolver().getSpeedLimit() * speedConv;
speedLimitLast = lp_sp.getSpeedLimit().getResolver().getSpeedLimitLast() * speedConv;
speedLimitOffset = lp_sp.getSpeedLimit().getResolver().getSpeedLimitOffset() * speedConv;
speedLimitValid = lp_sp.getSpeedLimit().getResolver().getSpeedLimitValid();
speedLimitLastValid = lp_sp.getSpeedLimit().getResolver().getSpeedLimitLastValid();
speedLimitFinalLast = lp_sp.getSpeedLimit().getResolver().getSpeedLimitFinalLast() * speedConv;
speedLimitMode = static_cast<SpeedLimitMode>(s.scene.speed_limit_mode);
speedLimitAssistState = lp_sp.getSpeedLimit().getAssist().getState();
speedLimitAssistActive = lp_sp.getSpeedLimit().getAssist().getActive();
roadName = s.scene.road_name;
if (sm.updated("liveMapDataSP")) {
roadNameStr = QString::fromStdString(lmd.getRoadName());
speedLimitAheadValid = lmd.getSpeedLimitAheadValid();
speedLimitAhead = lmd.getSpeedLimitAhead() * speedConv;
speedLimitAheadDistance = lmd.getSpeedLimitAheadDistance();
if (speedLimitAheadDistance < speedLimitAheadDistancePrev && speedLimitAheadValidFrame < SPEED_LIMIT_AHEAD_VALID_FRAME_THRESHOLD) {
speedLimitAheadValidFrame++;
} else if (speedLimitAheadDistance > speedLimitAheadDistancePrev && speedLimitAheadValidFrame > 0) {
speedLimitAheadValidFrame--;
}
}
speedLimitAheadDistancePrev = speedLimitAheadDistance;
static int reverse_delay = 0;
bool reverse_allowed = false;
@@ -41,13 +75,6 @@ void HudRendererSP::updateState(const UIState &s) {
}
reversing = reverse_allowed;
is_metric = s.scene.is_metric;
// Handle older routes where vEgoCluster is not set
v_ego_cluster_seen = v_ego_cluster_seen || car_state.getVEgoCluster() != 0.0;
float v_ego = v_ego_cluster_seen ? car_state.getVEgoCluster() : car_state.getVEgo();
speed = cs_alive ? std::max<float>(0.0, v_ego) : 0.0;
speed *= is_metric ? MS_TO_KPH : MS_TO_MPH;
latActive = car_control.getLatActive();
steerOverride = car_state.getSteeringPressed();
@@ -80,29 +107,72 @@ void HudRendererSP::updateState(const UIState &s) {
standstillTimer = s.scene.standstill_timer;
isStandstill = car_state.getStandstill();
if (not s.scene.started) standstillElapsedTime = 0.0;
longOverride = car_control.getCruiseControl().getOverride();
smartCruiseControlVisionEnabled = lp_sp.getSmartCruiseControl().getVision().getEnabled();
smartCruiseControlVisionActive = lp_sp.getSmartCruiseControl().getVision().getActive();
smartCruiseControlMapEnabled = lp_sp.getSmartCruiseControl().getMap().getEnabled();
smartCruiseControlMapActive = lp_sp.getSmartCruiseControl().getMap().getActive();
greenLightAlert = lp_sp.getE2eAlerts().getGreenLightAlert();
leadDepartAlert = lp_sp.getE2eAlerts().getLeadDepartAlert();
// override stock current speed values
float v_ego = (v_ego_cluster_seen && !s.scene.trueVEgoUI) ? car_state.getVEgoCluster() : car_state.getVEgo();
speed = std::max<float>(0.0f, v_ego * (is_metric ? MS_TO_KPH : MS_TO_MPH));
hideVEgoUI = s.scene.hideVEgoUI;
leftBlinkerOn = car_state.getLeftBlinker();
rightBlinkerOn = car_state.getRightBlinker();
leftBlindspot = car_state.getLeftBlindspot();
rightBlindspot = car_state.getRightBlindspot();
showTurnSignals = s.scene.turn_signals;
carControlEnabled = car_control.getEnabled();
speedCluster = car_state.getCruiseState().getSpeedCluster() * speedConv;
}
void HudRendererSP::draw(QPainter &p, const QRect &surface_rect) {
HudRenderer::draw(p, surface_rect);
e2eAlertDisplayTimer = std::max(0, e2eAlertDisplayTimer - 1);
p.save();
if (is_cruise_available) {
drawSetSpeedSP(p, surface_rect);
}
if (!hideVEgoUI) {
drawCurrentSpeedSP(p, surface_rect);
}
if (!reversing) {
// Smart Cruise Control
int x_offset = -260;
int y1_offset = -80;
// int y2_offset = -140; // reserved for 2 icons
int y2_offset = -140;
int y_scc_v = 0, y_scc_m = 0;
const int orders[2] = {y1_offset, y2_offset};
int i = 0;
// SCC-V takes first order
if (smartCruiseControlVisionEnabled) y_scc_v = orders[i++];
if (smartCruiseControlMapEnabled) y_scc_m = orders[i++];
// Smart Cruise Control - Vision
bool scc_vision_active_pulse = pulseElement(smartCruiseControlVisionFrame);
if ((smartCruiseControlVisionEnabled && !smartCruiseControlVisionActive) || (smartCruiseControlVisionActive && scc_vision_active_pulse)) {
drawSmartCruiseControlOnroadIcon(p, surface_rect, x_offset, y1_offset, "SCC-V");
drawSmartCruiseControlOnroadIcon(p, surface_rect, x_offset, y_scc_v, "SCC-V");
}
smartCruiseControlVisionFrame = smartCruiseControlVisionActive ? (smartCruiseControlVisionFrame + 1) : 0;
if (smartCruiseControlVisionActive) {
smartCruiseControlVisionFrame++;
} else {
smartCruiseControlVisionFrame = 0;
// Smart Cruise Control - Map
bool scc_map_active_pulse = pulseElement(smartCruiseControlMapFrame);
if ((smartCruiseControlMapEnabled && !smartCruiseControlMapActive) || (smartCruiseControlMapActive && scc_map_active_pulse)) {
drawSmartCruiseControlOnroadIcon(p, surface_rect, x_offset, y_scc_m, "SCC-M");
}
smartCruiseControlMapFrame = smartCruiseControlMapActive ? (smartCruiseControlMapFrame + 1) : 0;
// Bottom Dev UI
if (devUiInfo == 2) {
@@ -119,11 +189,81 @@ void HudRendererSP::draw(QPainter &p, const QRect &surface_rect) {
drawRightDevUI(p, surface_rect.right() - 184 - UI_BORDER_SIZE * 2, UI_BORDER_SIZE * 2 + rect_right.height());
}
// Speed Limit
bool showSpeedLimit;
bool speed_limit_assist_pre_active_pulse = pulseElement(speedLimitAssistFrame);
// Position speed limit sign next to set speed box
const int sign_width = is_metric ? 200 : 172;
const int sign_x = is_metric ? 280 : 272;
const int sign_y = 45;
const int sign_height = 204;
QRect sign_rect(sign_x, sign_y, sign_width, sign_height);
if (speedLimitAssistState == cereal::LongitudinalPlanSP::SpeedLimit::AssistState::PRE_ACTIVE) {
speedLimitAssistFrame++;
showSpeedLimit = speed_limit_assist_pre_active_pulse;
drawSpeedLimitPreActiveArrow(p, sign_rect);
} else {
speedLimitAssistFrame = 0;
showSpeedLimit = speedLimitMode != SpeedLimitMode::OFF;
}
if (showSpeedLimit) {
drawSpeedLimitSigns(p, sign_rect);
// do not show during SLA's preActive state
if (speedLimitAssistState != cereal::LongitudinalPlanSP::SpeedLimit::AssistState::PRE_ACTIVE) {
drawUpcomingSpeedLimit(p);
}
}
// Road Name
drawRoadName(p, surface_rect);
// Green Light & Lead Depart Alerts
if (greenLightAlert or leadDepartAlert) {
e2eAlertDisplayTimer = 3 * UI_FREQ;
// reset onroad sleep timer for e2e alerts
uiStateSP()->reset_onroad_sleep_timer();
}
if (e2eAlertDisplayTimer > 0) {
e2eAlertFrame++;
if (greenLightAlert) {
alert_text = tr("GREEN\nLIGHT");
alert_img = devUiInfo > 0 ? green_light_alert_small_img : green_light_alert_large_img;
}
else if (leadDepartAlert) {
alert_text = tr("LEAD VEHICLE\nDEPARTING");
alert_img = devUiInfo > 0 ? lead_depart_alert_small_img : lead_depart_alert_large_img;
}
drawE2eAlert(p, surface_rect);
}
// Standstill Timer
if (standstillTimer) {
drawStandstillTimer(p, surface_rect.right() / 12 * 10, surface_rect.bottom() / 12 * 1.53);
else if (standstillTimer && isStandstill) {
alert_img = QPixmap();
standstillElapsedTime += 1.0 / UI_FREQ;
int minute = static_cast<int>(standstillElapsedTime / 60);
int second = static_cast<int>(standstillElapsedTime - (minute * 60));
alert_text = QString("%1:%2").arg(minute, 1, 10, QChar('0')).arg(second, 2, 10, QChar('0'));
drawE2eAlert(p, surface_rect, tr("STOPPED"));
e2eAlertFrame++;
}
// No Alerts displayed
else {
e2eAlertFrame = 0;
if (not isStandstill) standstillElapsedTime = 0.0;
}
// Blinker
if (showTurnSignals) {
drawBlinker(p, surface_rect);
}
}
p.restore();
}
void HudRendererSP::drawText(QPainter &p, int x, int y, const QString &text, QColor color) {
@@ -278,36 +418,445 @@ void HudRendererSP::drawBottomDevUI(QPainter &p, int x, int y) {
rw += drawBottomDevUIElement(p, rw, y, altitudeElement.value, altitudeElement.label, altitudeElement.units, altitudeElement.color);
}
void HudRendererSP::drawStandstillTimer(QPainter &p, int x, int y) {
if (isStandstill) {
standstillElapsedTime += 1.0 / UI_FREQ;
void HudRendererSP::drawSpeedLimitSigns(QPainter &p, QRect &sign_rect) {
bool speedLimitWarningEnabled = speedLimitMode >= SpeedLimitMode::WARNING; // TODO-SP: update to include SpeedLimitMode::ASSIST
bool hasSpeedLimit = speedLimitValid || speedLimitLastValid;
bool overspeed = hasSpeedLimit && std::nearbyint(speedLimitFinalLast) < std::nearbyint(speed);
QString speedLimitStr = hasSpeedLimit ? QString::number(std::nearbyint(speedLimitLast)) : "---";
int minute = static_cast<int>(standstillElapsedTime / 60);
int second = static_cast<int>(standstillElapsedTime - (minute * 60));
// Offset display text
QString speedLimitSubText = "";
if (speedLimitOffset != 0) {
speedLimitSubText = (speedLimitOffset > 0 ? "" : "-") + QString::number(std::nearbyint(speedLimitOffset));
}
// stop sign for standstill timer
const int size = 190; // size
const float angle = M_PI / 8.0;
float speedLimitSubTextFactor = is_metric ? 0.5 : 0.6;
if (speedLimitSubText.size() >= 3) {
speedLimitSubTextFactor = 0.475;
}
QPolygon octagon;
for (int i = 0; i < 8; i++) {
float curr_angle = angle + i * M_PI / 4.0;
int point_x = x + size / 2 * cos(curr_angle);
int point_y = y + size / 2 * sin(curr_angle);
octagon << QPoint(point_x, point_y);
int alpha = 255;
QColor red_color = QColor(255, 0, 0, alpha);
QColor speed_color = (speedLimitWarningEnabled && overspeed) ? red_color :
(!speedLimitValid && speedLimitLastValid ? QColor(0x91, 0x9b, 0x95, 0xf1) : QColor(0, 0, 0, alpha));
if (is_metric) {
// EU Vienna Convention style circular sign
QRect vienna_rect = sign_rect;
int circle_size = std::min(vienna_rect.width(), vienna_rect.height());
QRect circle_rect(vienna_rect.x(), vienna_rect.y(), circle_size, circle_size);
if (vienna_rect.width() > vienna_rect.height()) {
circle_rect.moveLeft(vienna_rect.x() + (vienna_rect.width() - circle_size) / 2);
} else if (vienna_rect.height() > vienna_rect.width()) {
circle_rect.moveTop(vienna_rect.y() + (vienna_rect.height() - circle_size) / 2);
}
p.setPen(QPen(Qt::white, 6));
p.setBrush(QColor(255, 90, 81, 200)); // red pastel
p.drawPolygon(octagon);
// White background circle
p.setPen(Qt::NoPen);
p.setBrush(QColor(255, 255, 255, alpha));
p.drawEllipse(circle_rect);
QString time_str = QString("%1:%2").arg(minute, 1, 10, QChar('0')).arg(second, 2, 10, QChar('0'));
p.setFont(InterFont(55, QFont::Bold));
p.setPen(Qt::white);
QRect timerTextRect = p.fontMetrics().boundingRect(QString(time_str));
timerTextRect.moveCenter({x, y});
p.drawText(timerTextRect, Qt::AlignCenter, QString(time_str));
// Red border ring with color coding
QRect red_ring = circle_rect;
p.setBrush(red_color);
p.drawEllipse(red_ring);
// Center white circle for text
int ring_size = circle_size * 0.12;
QRect center_circle = red_ring.adjusted(ring_size, ring_size, -ring_size, -ring_size);
p.setBrush(QColor(255, 255, 255, alpha));
p.drawEllipse(center_circle);
// Speed value, smaller font for 3+ digits
int font_size = (speedLimitStr.size() >= 3) ? 70 : 85;
p.setFont(InterFont(font_size, QFont::Bold));
p.setPen(speed_color);
p.drawText(center_circle, Qt::AlignCenter, speedLimitStr);
// Offset value in small circular box
if (!speedLimitSubText.isEmpty() && hasSpeedLimit) {
int offset_circle_size = circle_size * 0.4;
int overlap = offset_circle_size * 0.25;
QRect offset_circle_rect(
circle_rect.right() - offset_circle_size/1.25 + overlap,
circle_rect.top() - offset_circle_size/1.75 + overlap,
offset_circle_size,
offset_circle_size
);
p.setPen(QPen(QColor(77, 77, 77, 255), 6));
p.setBrush(QColor(0, 0, 0, alpha));
p.drawEllipse(offset_circle_rect);
p.setFont(InterFont(offset_circle_size * speedLimitSubTextFactor, QFont::Bold));
p.setPen(QColor(255, 255, 255, alpha));
p.drawText(offset_circle_rect, Qt::AlignCenter, speedLimitSubText);
}
} else {
standstillElapsedTime = 0.0;
// US/Canada MUTCD style sign
p.setPen(Qt::NoPen);
p.setBrush(QColor(255, 255, 255, alpha));
p.drawRoundedRect(sign_rect, 32, 32);
// Inner border with violation color coding
QRect inner_rect = sign_rect.adjusted(10, 10, -10, -10);
QColor border_color = QColor(0, 0, 0, alpha);
p.setPen(QPen(border_color, 4));
p.setBrush(QColor(255, 255, 255, alpha));
p.drawRoundedRect(inner_rect, 22, 22);
// "SPEED LIMIT" text
p.setFont(InterFont(40, QFont::DemiBold));
p.setPen(QColor(0, 0, 0, alpha));
p.drawText(inner_rect.adjusted(0, 10, 0, 0), Qt::AlignTop | Qt::AlignHCenter, tr("SPEED"));
p.drawText(inner_rect.adjusted(0, 50, 0, 0), Qt::AlignTop | Qt::AlignHCenter, tr("LIMIT"));
// Speed value with color coding
p.setFont(InterFont(90, QFont::Bold));
p.setPen(speed_color);
p.drawText(inner_rect.adjusted(0, 80, 0, 0), Qt::AlignTop | Qt::AlignHCenter, speedLimitStr);
// Offset value in small box
if (!speedLimitSubText.isEmpty() && hasSpeedLimit) {
int offset_box_size = sign_rect.width() * 0.4;
int overlap = offset_box_size * 0.25;
QRect offset_box_rect(
sign_rect.right() - offset_box_size/1.5 + overlap,
sign_rect.top() - offset_box_size/1.25 + overlap,
offset_box_size,
offset_box_size
);
int corner_radius = offset_box_size * 0.2;
p.setPen(QPen(QColor(77, 77, 77, 255), 6));
p.setBrush(QColor(0, 0, 0, alpha));
p.drawRoundedRect(offset_box_rect, corner_radius, corner_radius);
p.setFont(InterFont(offset_box_size * speedLimitSubTextFactor, QFont::Bold));
p.setPen(QColor(255, 255, 255, alpha));
p.drawText(offset_box_rect, Qt::AlignCenter, speedLimitSubText);
}
}
}
void HudRendererSP::drawUpcomingSpeedLimit(QPainter &p) {
bool speed_limit_ahead = speedLimitAheadValid && speedLimitAhead > 0 && speedLimitAhead != speedLimit && speedLimitAheadValidFrame > 0;
if (!speed_limit_ahead) {
return;
}
auto roundToInterval = [&](float distance, int interval, int threshold) {
int base = static_cast<int>(distance / interval) * interval;
return (distance - base >= threshold) ? base + interval : base;
};
auto outputDistance = [&] {
if (is_metric) {
if (speedLimitAheadDistance < 50) return tr("Near");
if (speedLimitAheadDistance >= 1000) return QString::number(speedLimitAheadDistance * METER_TO_KM, 'f', 1) + tr("km");
int rounded = (speedLimitAheadDistance < 200) ? std::max(10, roundToInterval(speedLimitAheadDistance, 10, 5)) : roundToInterval(speedLimitAheadDistance, 100, 50);
return QString::number(rounded) + tr("m");
} else {
float distance_ft = speedLimitAheadDistance * METER_TO_FOOT;
if (distance_ft < 100) return tr("Near");
if (distance_ft >= 900) return QString::number(speedLimitAheadDistance * METER_TO_MILE, 'f', 1) + tr("mi");
int rounded = (distance_ft < 500) ? std::max(50, roundToInterval(distance_ft, 50, 25)) : roundToInterval(distance_ft, 100, 50);
return QString::number(rounded) + tr("ft");
}
};
QString speedStr = QString::number(std::nearbyint(speedLimitAhead));
QString distanceStr = outputDistance();
// Position below current speed limit sign
const int sign_width = is_metric ? 200 : 172;
const int sign_x = is_metric ? 280 : 272;
const int sign_y = 45;
const int sign_height = 204;
const int ahead_width = 170;
const int ahead_height = 160;
const int ahead_x = sign_x + (sign_width - ahead_width) / 2;
const int ahead_y = sign_y + sign_height + 10;
QRect ahead_rect(ahead_x, ahead_y, ahead_width, ahead_height);
p.setPen(QPen(QColor(255, 255, 255, 100), 3));
p.setBrush(QColor(0, 0, 0, 180));
p.drawRoundedRect(ahead_rect, 16, 16);
// "AHEAD" label
p.setFont(InterFont(40, QFont::DemiBold));
p.setPen(QColor(200, 200, 200, 255));
p.drawText(ahead_rect.adjusted(0, 4, 0, 0), Qt::AlignTop | Qt::AlignHCenter, tr("AHEAD"));
// Speed value
p.setFont(InterFont(70, QFont::Bold));
p.setPen(QColor(255, 255, 255, 255));
p.drawText(ahead_rect.adjusted(0, 38, 0, 0), Qt::AlignTop | Qt::AlignHCenter, speedStr);
// Distance
p.setFont(InterFont(40, QFont::Normal));
p.setPen(QColor(180, 180, 180, 255));
p.drawText(ahead_rect.adjusted(0, 110, 0, 0), Qt::AlignTop | Qt::AlignHCenter, distanceStr);
}
void HudRendererSP::drawRoadName(QPainter &p, const QRect &surface_rect) {
if (!roadName || roadNameStr.isEmpty()) return;
// Measure text to size container
p.setFont(InterFont(46, QFont::DemiBold));
QFontMetrics fm(p.font());
int text_width = fm.horizontalAdvance(roadNameStr);
int padding = 40;
int rect_width = text_width + padding;
// Constrain to reasonable bounds
int min_width = 200;
int max_width = surface_rect.width() - 40;
rect_width = std::max(min_width, std::min(rect_width, max_width));
// Center at top of screen
QRect road_rect(surface_rect.width() / 2 - rect_width / 2, -4, rect_width, 60);
p.setPen(Qt::NoPen);
p.setBrush(QColor(0, 0, 0, 120));
p.drawRoundedRect(road_rect, 12, 12);
p.setPen(QColor(255, 255, 255, 200));
// Truncate if still too long
QString truncated = fm.elidedText(roadNameStr, Qt::ElideRight, road_rect.width() - 20);
p.drawText(road_rect, Qt::AlignCenter, truncated);
}
void HudRendererSP::drawSpeedLimitPreActiveArrow(QPainter &p, QRect &sign_rect) {
const int sign_margin = 12;
const int arrow_spacing = sign_margin * 3;
int arrow_x = sign_rect.right() + arrow_spacing;
int _set_speed = std::nearbyint(set_speed);
int _speed_limit_final_last = std::nearbyint(speedLimitFinalLast);
// Calculate the vertical offset using a sinusoidal function for smooth bouncing
double bounce_frequency = 2.0 * M_PI / UI_FREQ; // 20 frames for one full oscillation
int bounce_offset = 20 * sin(speedLimitAssistFrame * bounce_frequency); // Adjust the amplitude (20 pixels) as needed
if (_set_speed < _speed_limit_final_last) {
QPoint iconPosition(arrow_x, sign_rect.center().y() - plus_arrow_up_img.height() / 2 + bounce_offset);
p.drawPixmap(iconPosition, plus_arrow_up_img);
} else if (_set_speed > _speed_limit_final_last) {
QPoint iconPosition(arrow_x, sign_rect.center().y() - minus_arrow_down_img.height() / 2 - bounce_offset);
p.drawPixmap(iconPosition, minus_arrow_down_img);
}
}
void HudRendererSP::drawSetSpeedSP(QPainter &p, const QRect &surface_rect) {
// Draw outer box + border to contain set speed
const QSize default_size = {172, 204};
QSize set_speed_size = is_metric ? QSize(200, 204) : default_size;
QRect set_speed_rect(QPoint(60 + (default_size.width() - set_speed_size.width()) / 2, 45), set_speed_size);
// Draw set speed box
p.setPen(QPen(QColor(255, 255, 255, 75), 6));
p.setBrush(QColor(0, 0, 0, 166));
p.drawRoundedRect(set_speed_rect, 32, 32);
// Colors based on status
QColor max_color = QColor(0xa6, 0xa6, 0xa6, 0xff);
QColor set_speed_color = QColor(0x72, 0x72, 0x72, 0xff);
if (is_cruise_set) {
set_speed_color = QColor(255, 255, 255);
if (speedLimitAssistActive) {
set_speed_color = longOverride ? QColor(0x91, 0x9b, 0x95, 0xff) : QColor(0, 0xff, 0, 0xff);
max_color = longOverride ? QColor(0x91, 0x9b, 0x95, 0xff) : QColor(0x80, 0xd8, 0xa6, 0xff);
} else {
if (status == STATUS_DISENGAGED) {
max_color = QColor(255, 255, 255);
} else if (status == STATUS_OVERRIDE) {
max_color = QColor(0x91, 0x9b, 0x95, 0xff);
} else {
max_color = QColor(0x80, 0xd8, 0xa6, 0xff);
}
}
}
// Draw "MAX" or carState.cruiseState.speedCluster (when ICBM is active) text
if (carControlEnabled) {
if (std::nearbyint(set_speed) != std::nearbyint(speedCluster)) {
icbm_active_counter = 3 * UI_FREQ;
} else if (icbm_active_counter > 0) {
icbm_active_counter--;
}
} else {
icbm_active_counter = 0;
}
int max_str_size = (icbm_active_counter != 0) ? 60 : 40;
int max_str_y = (icbm_active_counter != 0) ? 15 : 27;
QString max_str = (icbm_active_counter != 0) ? QString::number(std::nearbyint(speedCluster)) : tr("MAX");
p.setFont(InterFont(max_str_size, QFont::DemiBold));
p.setPen(max_color);
p.drawText(set_speed_rect.adjusted(0, max_str_y, 0, 0), Qt::AlignTop | Qt::AlignHCenter, max_str);
// Draw set speed
QString setSpeedStr = is_cruise_set ? QString::number(std::nearbyint(set_speed)) : "";
p.setFont(InterFont(90, QFont::Bold));
p.setPen(set_speed_color);
p.drawText(set_speed_rect.adjusted(0, 77, 0, 0), Qt::AlignTop | Qt::AlignHCenter, setSpeedStr);
}
void HudRendererSP::drawE2eAlert(QPainter &p, const QRect &surface_rect, const QString &alert_alt_text) {
int size = devUiInfo > 0 ? e2e_alert_small : e2e_alert_large;
int x = surface_rect.center().x() + surface_rect.width() / 4;
int y = surface_rect.center().y() + 20;
x += devUiInfo > 0 ? 0 : 50;
QRect alertRect(x - size, y - size, size * 2, size * 2);
// Alert Circle
QPoint center = alertRect.center();
QColor frameColor;
if (not alert_alt_text.isEmpty()) frameColor = QColor(255, 255, 255, 75);
else frameColor = pulseElement(e2eAlertFrame) ? QColor(255, 255, 255, 75) : QColor(0, 255, 0, 75);
p.setPen(QPen(frameColor, 15));
p.setBrush(QColor(0, 0, 0, 190));
p.drawEllipse(center, size, size);
// Alert Text
QColor txtColor;
QFont font;
int alert_bottom_adjustment;
if (not alert_alt_text.isEmpty()) {
font = InterFont(100, QFont::Bold);
alert_bottom_adjustment = 5;
txtColor = QColor(255, 255, 255, 255);
} else {
font = InterFont(48, QFont::Bold);
alert_bottom_adjustment = 7;
txtColor = pulseElement(e2eAlertFrame) ? QColor(255, 255, 255, 255) : QColor(0, 255, 0, 190);
}
p.setPen(txtColor);
p.setFont(font);
QFontMetrics fm(p.font());
QRect textRect = fm.boundingRect(alertRect, Qt::TextWordWrap, alert_text);
textRect.moveCenter({alertRect.center().x(), alertRect.center().y()});
textRect.moveBottom(alertRect.bottom() - alertRect.height() / alert_bottom_adjustment);
p.drawText(textRect, Qt::AlignCenter, alert_text);
if (not alert_alt_text.isEmpty()) {
// Alert Alternate Text
p.setFont(InterFont(80, QFont::Bold));
p.setPen(QColor(255, 175, 3, 240));
QFontMetrics fmt(p.font());
QRect topTextRect = fmt.boundingRect(alertRect, Qt::TextWordWrap, alert_alt_text);
topTextRect.moveCenter({alertRect.center().x(), alertRect.center().y()});
topTextRect.moveTop(alertRect.top() + alertRect.height() / 3.5);
p.drawText(topTextRect, Qt::AlignCenter, alert_alt_text);
} else {
// Alert Image instead of Top Text
QPointF pixmapCenterOffset = QPointF(alert_img.width() / 2.0, alert_img.height() / 2.0);
QPointF drawPoint = center - pixmapCenterOffset;
p.drawPixmap(drawPoint, alert_img);
}
}
void HudRendererSP::drawCurrentSpeedSP(QPainter &p, const QRect &surface_rect) {
QString speedStr = QString::number(std::nearbyint(speed));
p.setFont(InterFont(176, QFont::Bold));
HudRenderer::drawText(p, surface_rect.center().x(), 210, speedStr);
p.setFont(InterFont(66));
HudRenderer::drawText(p, surface_rect.center().x(), 290, is_metric ? tr("km/h") : tr("mph"), 200);
}
void HudRendererSP::drawBlinker(QPainter &p, const QRect &surface_rect) {
const bool hazard = leftBlinkerOn && rightBlinkerOn;
int blinkerStatus = hazard ? 2 : (leftBlinkerOn or rightBlinkerOn) ? 1 : 0;
if (!leftBlinkerOn && !rightBlinkerOn) {
blinkerFrameCounter = 0;
lastBlinkerStatus = 0;
return;
}
if (blinkerStatus != lastBlinkerStatus) {
blinkerFrameCounter = 0;
lastBlinkerStatus = blinkerStatus;
}
++blinkerFrameCounter;
const int BLINKER_COOLDOWN_FRAMES = UI_FREQ / 10;
if (blinkerFrameCounter < BLINKER_COOLDOWN_FRAMES) {
return;
}
const int circleRadius = 60;
const int arrowLength = 60;
const int x_gap = 160;
const int y_offset = 272;
const int centerX = surface_rect.center().x();
const QPen bgBorder(Qt::white, 5);
const QPen arrowPen(Qt::NoPen);
p.save();
auto drawArrow = [&](int cx, int cy, int dir, const QBrush &arrowBrush) {
const int bodyLength = arrowLength / 2;
const int bodyWidth = arrowLength / 2;
const int headLength = arrowLength / 2;
const int headWidth = arrowLength;
QPolygon arrow;
arrow.reserve(7);
arrow << QPoint(cx - dir * bodyLength, cy - bodyWidth / 2)
<< QPoint(cx, cy - bodyWidth / 2)
<< QPoint(cx, cy - headWidth / 2)
<< QPoint(cx + dir * headLength, cy)
<< QPoint(cx, cy + headWidth / 2)
<< QPoint(cx, cy + bodyWidth / 2)
<< QPoint(cx - dir * bodyLength, cy + bodyWidth / 2);
p.setPen(arrowPen);
p.setBrush(arrowBrush);
p.drawPolygon(arrow);
};
auto drawCircle = [&](int cx, int cy, const QBrush &bgBrush) {
p.setPen(bgBorder);
p.setBrush(bgBrush);
p.drawEllipse(QPoint(cx, cy), circleRadius, circleRadius);
};
struct BlinkerSide { bool on; int dir; bool blocked; int cx; };
const std::array<BlinkerSide, 2> sides = {{
{leftBlinkerOn, -1, hazard ? true : (leftBlinkerOn && leftBlindspot), centerX - x_gap},
{rightBlinkerOn, 1, hazard ? true : (rightBlinkerOn && rightBlindspot), centerX + x_gap},
}};
for (const auto &s: sides) {
if (!s.on) continue;
QColor bgColor = s.blocked ? QColor(135, 23, 23) : QColor(23, 134, 68);
QColor arrowColor = s.blocked ? QColor(66, 12, 12) : QColor(12, 67, 34);
if (pulseElement(blinkerFrameCounter)) arrowColor = Qt::white;
const QBrush bgBrush(bgColor);
const QBrush arrowBrush(arrowColor);
drawCircle(s.cx, y_offset, bgBrush);
drawArrow(s.cx, y_offset, s.dir, arrowBrush);
}
p.restore();
}
+57
View File
@@ -8,8 +8,11 @@
#pragma once
#include "selfdrive/ui/qt/onroad/hud.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/helpers.h"
#include "selfdrive/ui/sunnypilot/qt/onroad/developer_ui/developer_ui.h"
constexpr int SPEED_LIMIT_AHEAD_VALID_FRAME_THRESHOLD = 5;
class HudRendererSP : public HudRenderer {
Q_OBJECT
@@ -28,6 +31,14 @@ private:
void drawStandstillTimer(QPainter &p, int x, int y);
bool pulseElement(int frame);
void drawSmartCruiseControlOnroadIcon(QPainter &p, const QRect &surface_rect, int x_offset, int y_offset, std::string name);
void drawSpeedLimitSigns(QPainter &p, QRect &sign_rect);
void drawUpcomingSpeedLimit(QPainter &p);
void drawRoadName(QPainter &p, const QRect &surface_rect);
void drawSpeedLimitPreActiveArrow(QPainter &p, QRect &sign_rect);
void drawSetSpeedSP(QPainter &p, const QRect &surface_rect);
void drawE2eAlert(QPainter &p, const QRect &surface_rect, const QString &alert_alt_text = "");
void drawCurrentSpeedSP(QPainter &p, const QRect &surface_rect);
void drawBlinker(QPainter &p, const QRect &surface_rect);
bool lead_status;
float lead_d_rel;
@@ -63,4 +74,50 @@ private:
bool smartCruiseControlVisionEnabled;
bool smartCruiseControlVisionActive;
int smartCruiseControlVisionFrame;
bool smartCruiseControlMapEnabled;
bool smartCruiseControlMapActive;
int smartCruiseControlMapFrame;
float speedLimit;
float speedLimitLast;
float speedLimitOffset;
bool speedLimitValid;
bool speedLimitLastValid;
float speedLimitFinalLast;
bool speedLimitAheadValid;
float speedLimitAhead;
float speedLimitAheadDistance;
float speedLimitAheadDistancePrev;
int speedLimitAheadValidFrame;
SpeedLimitMode speedLimitMode = SpeedLimitMode::OFF;
bool roadName;
QString roadNameStr;
cereal::LongitudinalPlanSP::SpeedLimit::AssistState speedLimitAssistState;
bool speedLimitAssistActive;
int speedLimitAssistFrame;
QPixmap plus_arrow_up_img;
QPixmap minus_arrow_down_img;
int e2e_alert_small = 250;
int e2e_alert_large = 300;
QPixmap green_light_alert_small_img;
QPixmap green_light_alert_large_img;
bool greenLightAlert;
int e2eAlertFrame;
int e2eAlertDisplayTimer = 0;
bool leadDepartAlert;
QPixmap lead_depart_alert_small_img;
QPixmap lead_depart_alert_large_img;
QString alert_text;
QPixmap alert_img;
bool hideVEgoUI;
bool leftBlinkerOn;
bool rightBlinkerOn;
bool leftBlindspot;
bool rightBlindspot;
int blinkerFrameCounter;
int lastBlinkerStatus;
bool showTurnSignals;
bool carControlEnabled;
float speedCluster = 0;
int icbm_active_counter = 0;
};
+137 -2
View File
@@ -24,7 +24,7 @@ void ModelRendererSP::update_model(const cereal::ModelDataV2::Reader &model, con
void ModelRendererSP::drawPath(QPainter &painter, const cereal::ModelDataV2::Reader &model, const QRect &surface_rect) {
auto *s = uiState();
auto &sm = *(s->sm);
bool blindspot = Params().getBool("BlindSpot");
bool blindspot = s->scene.blindspot_ui;
if (blindspot) {
bool left_blindspot = sm["carState"].getCarState().getLeftBlindspot();
@@ -49,7 +49,7 @@ void ModelRendererSP::drawPath(QPainter &painter, const cereal::ModelDataV2::Rea
}
}
bool rainbow = Params().getBool("RainbowMode");
bool rainbow = s->scene.rainbow_mode;
//float v_ego = sm["carState"].getCarState().getVEgo();
if (rainbow) {
@@ -87,4 +87,139 @@ void ModelRendererSP::drawPath(QPainter &painter, const cereal::ModelDataV2::Rea
// Normal path rendering
ModelRenderer::drawPath(painter, model, surface_rect.height());
}
drawLeadStatus(painter, surface_rect.height(), surface_rect.width());
}
void ModelRendererSP::drawLeadStatus(QPainter &painter, int height, int width) {
auto *s = uiState();
auto &sm = *(s->sm);
bool longitudinal_control = sm["carParams"].getCarParams().getOpenpilotLongitudinalControl();
if (!longitudinal_control) {
lead_status_alpha = std::max(0.0f, lead_status_alpha - 0.05f);
return;
}
if (!sm.alive("radarState")) {
lead_status_alpha = std::max(0.0f, lead_status_alpha - 0.05f);
return;
}
const auto &radar_state = sm["radarState"].getRadarState();
const auto &lead_one = radar_state.getLeadOne();
const auto &lead_two = radar_state.getLeadTwo();
bool has_lead_one = lead_one.getStatus();
bool has_lead_two = lead_two.getStatus();
if (!has_lead_one && !has_lead_two) {
lead_status_alpha = std::max(0.0f, lead_status_alpha - 0.05f);
if (lead_status_alpha <= 0.0f) return;
} else {
lead_status_alpha = std::min(1.0f, lead_status_alpha + 0.1f);
}
if (has_lead_one) {
drawLeadStatusAtPosition(painter, lead_one, lead_vertices[0], height, width, "L1");
}
if (has_lead_two && std::abs(lead_one.getDRel() - lead_two.getDRel()) > 3.0) {
drawLeadStatusAtPosition(painter, lead_two, lead_vertices[1], height, width, "L2");
}
}
void ModelRendererSP::drawLeadStatusAtPosition(QPainter &painter,
const cereal::RadarState::LeadData::Reader &lead_data,
const QPointF &chevron_pos,
int height, int width,
const QString &label) {
float d_rel = lead_data.getDRel();
float v_rel = lead_data.getVRel();
auto *s = uiState();
auto &sm = *(s->sm);
float v_ego = sm["carState"].getCarState().getVEgo();
int chevron_data = s->scene.chevron_info;
float sz = std::clamp((25 * 30) / (d_rel / 3 + 30), 15.0f, 30.0f) * 2.35;
QFont content_font = painter.font();
content_font.setPixelSize(50);
content_font.setBold(true);
painter.setFont(content_font);
bool is_metric = s->scene.is_metric;
QStringList text_lines;
const int chevron_all = 4;
QStringList chevron_text[3];
// Distance display
if (chevron_data == 1 || chevron_data == chevron_all) {
int pos = 0;
float val = std::max(0.0f, d_rel);
QString unit = is_metric ? "m" : "ft";
if (!is_metric) val *= 3.28084f;
chevron_text[pos].append(QString::number(val, 'f', 0) + " " + unit);
}
// Speed display
if (chevron_data == 2 || chevron_data == chevron_all) {
int pos = (chevron_data == 2) ? 0 : 1;
float multiplier = is_metric ? static_cast<float>(MS_TO_KPH) : static_cast<float>(MS_TO_MPH);
float val = std::max(0.0f, (v_rel + v_ego) * multiplier);
QString unit = is_metric ? "km/h" : "mph";
chevron_text[pos].append(QString::number(val, 'f', 0) + " " + unit);
}
// Time to contact
if (chevron_data == 3 || chevron_data == chevron_all) {
int pos = (chevron_data == 3) ? 0 : 2;
float val = (d_rel > 0 && v_ego > 0) ? std::max(0.0f, d_rel / v_ego) : 0.0f;
QString ttc = (val > 0 && val < 200) ? QString::number(val, 'f', 1) + "s" : "---";
chevron_text[pos].append(ttc);
}
for (int i = 0; i < 3; ++i) {
if (!chevron_text[i].isEmpty()) text_lines.append(chevron_text[i]);
}
if (text_lines.isEmpty()) return;
QFontMetrics fm(content_font);
float text_width = 120.0f;
for (const QString &line : text_lines) {
text_width = std::max(text_width, fm.horizontalAdvance(line) + 20.0f);
}
text_width = std::min(text_width, 250.0f);
float line_height = 50.0f;
float total_height = text_lines.size() * line_height;
float margin = 20.0f;
float text_y = chevron_pos.y() + sz + 15;
if (text_y + total_height > height - margin) {
float y_max = chevron_pos.y() > (height - margin) ? (height - margin) : chevron_pos.y();
text_y = y_max - 15 - total_height;
text_y = std::max(margin, text_y);
}
float text_x = chevron_pos.x() - text_width / 2;
text_x = std::clamp(text_x, margin, (float)width - text_width - margin);
QPoint shadow_offset(2, 2);
QColor text_color = QColor(255, 255, 255, (int)(255 * lead_status_alpha));
for (int i = 0; i < text_lines.size(); ++i) {
float y = text_y + (i * line_height);
if (y + line_height > height - margin) break;
QRect rect(text_x, y, text_width, line_height);
// Draw shadow
painter.setPen(QColor(0, 0, 0, (int)(200 * lead_status_alpha)));
painter.drawText(rect.translated(shadow_offset), Qt::AlignCenter, text_lines[i]);
painter.setPen(text_color);
painter.drawText(rect, Qt::AlignCenter, text_lines[i]);
}
painter.setPen(Qt::NoPen);
}
+11
View File
@@ -17,6 +17,17 @@ private:
void update_model(const cereal::ModelDataV2::Reader &model, const cereal::RadarState::LeadData::Reader &lead) override;
void drawPath(QPainter &painter, const cereal::ModelDataV2::Reader &model, const QRect &rect) override;
// Lead status display methods
void drawLeadStatus(QPainter &painter, int height, int width);
void drawLeadStatusAtPosition(QPainter &painter,
const cereal::RadarState::LeadData::Reader &lead_data,
const QPointF &chevron_pos,
int height, int width,
const QString &label);
QPolygonF left_blindspot_vertices;
QPolygonF right_blindspot_vertices;
// Lead status animation
float lead_status_alpha = 0.0f;
};
+1 -2
View File
@@ -95,13 +95,12 @@ QStringList searchFromList(const QString &query, const QStringList &list) {
return list;
}
QStringList search_terms = query.simplified().toLower().split(" ", QString::SkipEmptyParts);
QStringList search_terms = query.simplified().toLower().replace(QRegularExpression("[^a-zA-Z0-9\\s]"), " ").split(" ", QString::SkipEmptyParts);
QStringList search_results;
for (const QString &element : list) {
if (std::all_of(search_terms.begin(), search_terms.end(), [&](const QString &term) {
QString normalized_term = term.normalized(QString::NormalizationForm_KD).toLower();
normalized_term.remove(QRegularExpression("[^a-zA-Z0-9\\s]"));
QString normalized_element = element.normalized(QString::NormalizationForm_KD).toLower();
return normalized_element.contains(normalized_term, Qt::CaseInsensitive);
})) {
@@ -7,6 +7,7 @@
#pragma once
#include <cmath>
#include <map>
#include <optional>
#include <string>
@@ -500,7 +501,7 @@ private:
int getParamValueScaled() {
const auto param_value = QString::fromStdString(params.get(key));
return static_cast<int>(param_value.toFloat() * 100);
return std::nearbyint(param_value.toFloat() * 100.0f);
}
void setParamValueScaled(const int new_value) {
@@ -544,10 +545,8 @@ public:
main_layout->removeWidget(title_label);
hlayout->addWidget(title_label, 1);
}
if (spacingItem != nullptr && main_layout->indexOf(spacingItem) != -1) {
main_layout->removeItem(spacingItem);
spacingItem = nullptr;
}
main_layout->removeItem(spacingItem);
spacingItem = nullptr;
}
label.setStyleSheet(label_enabled_style);
@@ -14,10 +14,10 @@ ExpandableToggleRow::ExpandableToggleRow(const QString &param, const QString &ti
QObject::connect(this, &ExpandableToggleRow::toggleFlipped, this, &ExpandableToggleRow::toggleClicked);
collapsibleWidget = new QFrame(this);
collapsibleWidget->setContentsMargins(0, 0, 0, 0);
collapsibleWidget->setVisible(false);
QVBoxLayout *collapsible_layout = new QVBoxLayout();
collapsibleWidget->setLayout(collapsible_layout);
collapsible_layout->setContentsMargins(0, 0, 0, 0);
list = new ListWidgetSP(this, false);
+35 -1
View File
@@ -11,6 +11,15 @@
void UIStateSP::updateStatus() {
UIState::updateStatus();
if (scene.started && scene.onroadScreenOffControl) {
auto selfdriveState = (*sm)["selfdriveState"].getSelfdriveState();
if (selfdriveState.getAlertSize() != cereal::SelfdriveState::AlertSize::NONE) {
reset_onroad_sleep_timer();
} else if (scene.onroadScreenOffTimer > 0) {
scene.onroadScreenOffTimer--;
}
}
}
UIStateSP::UIStateSP(QObject *parent) : UIState(parent) {
@@ -20,7 +29,7 @@ UIStateSP::UIStateSP(QObject *parent) : UIState(parent) {
"wideRoadCameraState", "managerState", "selfdriveState", "longitudinalPlan",
"modelManagerSP", "selfdriveStateSP", "longitudinalPlanSP", "backupManagerSP",
"carControl", "gpsLocationExternal", "gpsLocation", "liveTorqueParameters",
"carStateSP", "liveParameters"
"carStateSP", "liveParameters", "liveMapDataSP"
});
// update timer
@@ -53,6 +62,31 @@ void ui_update_params_sp(UIStateSP *s) {
auto params = Params();
s->scene.dev_ui_info = std::atoi(params.get("DevUIInfo").c_str());
s->scene.standstill_timer = params.getBool("StandstillTimer");
s->scene.speed_limit_mode = std::atoi(params.get("SpeedLimitMode").c_str());
s->scene.road_name = params.getBool("RoadNameToggle");
s->scene.trueVEgoUI = params.getBool("TrueVEgoUI");
s->scene.hideVEgoUI = params.getBool("HideVEgoUI");
// Onroad Screen Brightness
s->scene.onroadScreenOffBrightness = std::atoi(params.get("OnroadScreenOffBrightness").c_str());
s->scene.onroadScreenOffControl = params.getBool("OnroadScreenOffControl");
s->scene.onroadScreenOffTimerParam = std::atoi(params.get("OnroadScreenOffTimer").c_str());
s->scene.turn_signals = params.getBool("ShowTurnSignals");
s->scene.chevron_info = std::atoi(params.get("ChevronInfo").c_str());
s->scene.blindspot_ui = params.getBool("BlindSpot");
s->scene.rainbow_mode = params.getBool("RainbowMode");
}
void UIStateSP::reset_onroad_sleep_timer(OnroadTimerStatusToggle toggleTimerStatus) {
// Toggling from active state to inactive
if (toggleTimerStatus == OnroadTimerStatusToggle::PAUSE and scene.onroadScreenOffTimer != -1) {
scene.onroadScreenOffTimer = -1;
}
// Toggling from a previously inactive state or resetting an active timer
else if ((scene.onroadScreenOffTimerParam >= 0 and scene.onroadScreenOffControl and scene.onroadScreenOffTimer != -1) or toggleTimerStatus == OnroadTimerStatusToggle::RESUME) {
scene.onroadScreenOffTimer = scene.onroadScreenOffTimerParam * UI_FREQ;
}
}
DeviceSP::DeviceSP(QObject *parent) : Device(parent) {
+7
View File
@@ -15,6 +15,12 @@
#include "selfdrive/ui/ui.h"
#include "selfdrive/ui/qt/util.h"
enum OnroadTimerStatusToggle {
NONE,
PAUSE,
RESUME
};
class UIStateSP : public UIState {
Q_OBJECT
@@ -61,6 +67,7 @@ public:
return user.user_id.toLower() != "unregisteredsponsor" && user.user_id.toLower() != "temporarysponsor";
});
}
void reset_onroad_sleep_timer(OnroadTimerStatusToggle toggleTimerStatus = OnroadTimerStatusToggle::NONE);
signals:
void sunnylinkRoleChanged(bool subscriber);
+11
View File
@@ -10,4 +10,15 @@
typedef struct UISceneSP : UIScene {
int dev_ui_info = 0;
bool standstill_timer = false;
int speed_limit_mode = 0;
bool road_name = false;
int onroadScreenOffBrightness, onroadScreenOffTimer = 0;
bool onroadScreenOffControl;
int onroadScreenOffTimerParam;
bool trueVEgoUI;
bool hideVEgoUI;
bool turn_signals = false;
int chevron_info;
bool blindspot_ui;
bool rainbow_mode;
} UISceneSP;
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -464,15 +472,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">إعادة التشغيل</translation>
@@ -517,10 +516,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -533,6 +528,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -594,6 +617,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>تشغيل وضع الراحة</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">التحقق</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -649,6 +727,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>MAX</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">كم/س</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">ميل/س</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">MAX</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -767,6 +902,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -790,6 +937,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1048,6 +1223,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1169,10 +1356,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation>يتم تنزيل تحديث لنظام تشغيل جهازك في الخلفية. سيطلَب منك التحديث عندما يصبح جاهزاً للتثبيت.</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>محرك NVMe غير مثبَّت.</translation>
</message>
<message>
<source>Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.</source>
<translation type="unfinished"></translation>
@@ -1211,6 +1394,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1597,6 +1784,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1691,6 +1931,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished">المطور</translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1927,6 +2171,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished">السابق</translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished">السابق</translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2309,6 +2631,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2319,6 +2695,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished">إلغاء</translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2362,6 +2742,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -464,15 +472,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Neustart</translation>
@@ -517,10 +516,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -533,6 +528,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -594,6 +617,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>ENTSPANNTER MODUS AN</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">ÜBERPRÜFEN</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -645,6 +723,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>MAX</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">MAX</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -759,6 +894,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -782,6 +929,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1040,6 +1215,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1157,10 +1344,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation>Ein Update für das Betriebssystem deines Geräts wird im Hintergrund heruntergeladen. Du wirst aufgefordert, das Update zu installieren, sobald es bereit ist.</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>NVMe-Laufwerk nicht gemounted.</translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation>Gerätetemperatur zu hoch. Das System kühlt ab, bevor es startet. Aktuelle interne Komponententemperatur: %1</translation>
@@ -1203,6 +1386,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1577,6 +1764,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1671,6 +1911,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished">Entwickler</translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1909,6 +2153,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished">Zurück</translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished">Zurück</translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2291,6 +2613,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2301,6 +2677,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished">Abbrechen</translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2344,6 +2724,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -468,15 +476,6 @@ La calibración del retraso de la dirección está completa.</translation>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Reiniciar</translation>
@@ -521,10 +520,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -537,6 +532,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -598,6 +621,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>MODO CHILL</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">VERIFICAR</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -649,6 +727,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>MAX</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">MAX</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -763,6 +898,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -786,6 +933,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1044,6 +1219,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1165,10 +1352,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation>Se está descargando una actualización del sistema operativo de su dispositivo en segundo plano. Se le pedirá que actualice cuando esté listo para instalarse.</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>Unidad NVMe no montada.</translation>
</message>
<message>
<source>Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.</source>
<translation type="unfinished"></translation>
@@ -1207,6 +1390,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1581,6 +1768,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1675,6 +1915,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished">Desarrollador</translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1911,6 +2155,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2293,6 +2615,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2303,6 +2679,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2346,6 +2726,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -464,15 +472,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Redémarrer</translation>
@@ -517,10 +516,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -533,6 +528,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -594,6 +617,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>MODE DÉTENTE ACTIVÉ</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">VÉRIFIER</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -645,6 +723,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>MAX</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mi/h</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">MAX</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -759,6 +894,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -782,6 +929,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1040,6 +1215,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1161,10 +1348,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation>Une mise à jour du système d&apos;exploitation de votre appareil est en cours de téléchargement en arrière-plan. Vous serez invité à effectuer la mise à jour lorsqu&apos;elle sera prête à être installée.</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>Le disque NVMe n&apos;est pas monté.</translation>
</message>
<message>
<source>Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.</source>
<translation type="unfinished"></translation>
@@ -1203,6 +1386,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1577,6 +1764,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1671,6 +1911,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished">Dév.</translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1907,6 +2151,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished">Retour</translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished">Retour</translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2289,6 +2611,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2299,6 +2675,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished">Annuler</translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2342,6 +2722,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -468,15 +476,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
@@ -521,10 +520,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -537,6 +532,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -598,6 +621,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>CHILLモード</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -648,6 +726,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -761,6 +896,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -784,6 +931,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1042,6 +1217,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1159,10 +1346,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation></translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>SSDドライブ(NVMe)</translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation>: %1</translation>
@@ -1205,6 +1388,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1576,6 +1763,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1670,6 +1910,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1906,6 +2150,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2288,6 +2610,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2298,6 +2674,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2341,6 +2721,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+510 -40
View File
@@ -134,14 +134,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation> .</translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation> ()</translation>
@@ -150,6 +142,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation></translation>
</message>
<message>
<source>Global Brightness</source>
<translation> </translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation> . ( ) . </translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -254,6 +254,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation> .&lt;br&gt; &apos; &apos; .</translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation>Copyparty </translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation>Copyparty는 , , , . comma IP를 .</translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -472,16 +480,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation> </translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation> </translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation> .
.</translation>
</message>
<message>
<source>Reboot</source>
<translation></translation>
@@ -526,10 +524,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation> </translation>
</message>
<message>
<source>Always Offroad</source>
<translation> </translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation> 기본값: 기기가 / , .</translation>
@@ -542,6 +536,35 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation>/ .</translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation> </translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation> </translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation> 화면: 밝기 </translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation> . .</translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation> </translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation> UI에 .
UI가 .</translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -603,6 +626,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation> </translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation> </translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation>USB AUX comma .</translation>
</message>
<message>
<source>CHECK</source>
<translation></translation>
</message>
<message>
<source>MOUNT</source>
<translation></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation> </translation>
</message>
<message>
<source>FORMAT</source>
<translation></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation> ? .</translation>
</message>
<message>
<source>Format</source>
<translation></translation>
</message>
<message>
<source>formatting</source>
<translation> </translation>
</message>
<message>
<source>insert drive</source>
<translation> </translation>
</message>
<message>
<source>needs format</source>
<translation> </translation>
</message>
<message>
<source>mounting</source>
<translation> </translation>
</message>
<message>
<source>unmounting</source>
<translation> </translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -655,6 +733,64 @@ Firehose 모드를 사용하면 훈련 데이터 업로드를 극대화하여 op
<translation></translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation>km/h</translation>
</message>
<message>
<source>mph</source>
<translation>mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation> </translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation>
</translation>
</message>
<message>
<source>SPEED</source>
<translation>SPEED</translation>
</message>
<message>
<source>LIMIT</source>
<translation>LIMIT</translation>
</message>
<message>
<source>Near</source>
<translation></translation>
</message>
<message>
<source>km</source>
<translation>km</translation>
</message>
<message>
<source>m</source>
<translation>m</translation>
</message>
<message>
<source>mi</source>
<translation>mi</translation>
</message>
<message>
<source>ft</source>
<translation>ft</translation>
</message>
<message>
<source>AHEAD</source>
<translation></translation>
</message>
<message>
<source>MAX</source>
<translation></translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -768,6 +904,18 @@ Firehose 모드를 사용하면 훈련 데이터 업로드를 극대화하여 op
<source>This platform supports limited MADS settings.</source>
<translation> MADS .</translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation> </translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation>sunnypilot이 .</translation>
</message>
<message>
<source>Customize Params</source>
<translation> </translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -791,6 +939,34 @@ Firehose 모드를 사용하면 훈련 데이터 업로드를 극대화하여 op
<source>Start the vehicle to check vehicle compatibility.</source>
<translation> .</translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation> (ICBM) ()</translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation>, sunnypilot은 .</translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation> - </translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation> .</translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation> - </translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation> .</translation>
</message>
<message>
<source>Speed Limit</source>
<translation> </translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1020,35 +1196,47 @@ The default software delay value is 0.2</source>
</message>
<message>
<source>Refresh Model List</source>
<translation type="unfinished"></translation>
<translation> </translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"> </translation>
<translation></translation>
</message>
<message>
<source>Fetching Latest Models</source>
<translation type="unfinished"></translation>
<translation> </translation>
</message>
<message>
<source>Enable this for the car to learn and adapt its steering response time. Disable to use a fixed steering response time. Keeping this on provides the stock openpilot experience.</source>
<translation type="unfinished"></translation>
<translation> . . openpilot .</translation>
</message>
<message>
<source>Live Steer Delay:</source>
<translation type="unfinished"></translation>
<translation> :</translation>
</message>
<message>
<source>Actuator Delay:</source>
<translation type="unfinished"></translation>
<translation> :</translation>
</message>
<message>
<source>Software Delay:</source>
<translation type="unfinished"></translation>
<translation> :</translation>
</message>
<message>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
<translation> :</translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation> </translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation> </translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation> . 19 %1 .</translation>
</message>
</context>
<context>
@@ -1167,10 +1355,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation> . .</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>NVMe .</translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation> . . %1.</translation>
@@ -1215,6 +1399,10 @@ The default software delay value is 0.2</source>
%1</translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation>&lt;b&gt; &lt;/b&gt; - &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; comma three . &lt;b&gt;[ &gt; ]&lt;/b&gt; &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; comma three .</translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1590,6 +1778,62 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation>sunnypilot</translation>
</message>
<message>
<source>None</source>
<translation></translation>
</message>
<message>
<source>Fixed</source>
<translation></translation>
</message>
<message>
<source>Percent</source>
<translation></translation>
</message>
<message>
<source>Car
Only</source>
<translation></translation>
</message>
<message>
<source>Map
Only</source>
<translation></translation>
</message>
<message>
<source>Car
First</source>
<translation>
</translation>
</message>
<message>
<source>Map
First</source>
<translation>
</translation>
</message>
<message>
<source>Combined
Data</source>
<translation>
</translation>
</message>
<message>
<source>Off</source>
<translation></translation>
</message>
<message>
<source>Information</source>
<translation></translation>
</message>
<message>
<source>Warning</source>
<translation></translation>
</message>
<message>
<source>Assist</source>
<translation></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1684,6 +1928,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation></translation>
</message>
<message>
<source>Display</source>
<translation></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1920,6 +2168,84 @@ Warning: You are on a metered connection!</source>
<translation> .</translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation> </translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation>⦿ 차량만: 차량에서 </translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation>⦿ 지도만: OpenStreetMaps에서 </translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation>⦿ 우선: 사용 , OpenStreetMaps의 </translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation>⦿ 우선: 사용 OpenStreetMaps의 , </translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation>⦿ 결합: 차량 OpenStreetMaps의 </translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation></translation>
</message>
<message>
<source>Speed Limit</source>
<translation> </translation>
</message>
<message>
<source>Customize Source</source>
<translation> </translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation> </translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation>⦿ 없음: 오프셋 </translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation>⦿ 고정: 고정 . [ + ]</translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation>⦿ 비율: 백분율 . [ + ( % )]</translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation>⦿ 끄기: 속도 .</translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation>⦿ 정보: 현재 .</translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation>⦿ 경고: 현재 .</translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation>⦿ : +/- .</translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2090,27 +2416,27 @@ Warning: You are on a metered connection!</source>
</message>
<message>
<source>Enable sunnylink uploader to allow sunnypilot to upload your driving data to sunnypilot servers. (only for highest tiers, and does NOT bring ANY benefit to you. We are just testing data volume.)</source>
<translation type="unfinished"></translation>
<translation>sunnylink sunnypilot이 sunnypilot . ( , . .)</translation>
</message>
<message>
<source>[Don&apos;t use] Enable sunnylink uploader</source>
<translation type="unfinished"></translation>
<translation>[ ] sunnylink </translation>
</message>
<message>
<source>🚀 sunnylink 🚀</source>
<translation type="unfinished"></translation>
<translation>🚀 sunnylink 🚀</translation>
</message>
<message>
<source>For secure backup, restore, and remote configuration</source>
<translation type="unfinished"></translation>
<translation> , </translation>
</message>
<message>
<source>Sponsorship isn&apos;t required for basic backup/restore</source>
<translation type="unfinished"></translation>
<translation> / </translation>
</message>
<message>
<source>Click the sponsor button for more details</source>
<translation type="unfinished"></translation>
<translation> </translation>
</message>
</context>
<context>
@@ -2302,6 +2628,60 @@ Warning: You are on a metered connection!</source>
<translation> sunnypilot () .</translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation> </translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation> . .</translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation> </translation>
</message>
<message>
<source>Friction</source>
<translation></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation> </translation>
</message>
<message>
<source>Offline Only</source>
<translation></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation> </translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation> .</translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation> ()</translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation> . torqued가 .</translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation> </translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation> . &quot;opendbc/car/torque_data&quot; YAML . &quot; &quot; .</translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2312,6 +2692,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<source>Favorites</source>
<translation></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2355,6 +2739,92 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation> . (openpilot )</translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation> </translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation> .</translation>
</message>
<message>
<source>It</source>
<translation> </translation>
</message>
<message>
<source>does not</source>
<translation></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation> .</translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation> </translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation> HUD에 .</translation>
</message>
<message>
<source>Display Road Name</source>
<translation> </translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation> . OSM OpenStreetMap .</translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation> ()</translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation> , .</translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation>참고: . .</translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation> ()</translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation> , .</translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation>속도계: 항상 </translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation> .</translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation>속도계: 주행 </translation>
</message>
<message>
<source>Right</source>
<translation></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation> &amp;&amp;
</translation>
</message>
<message>
<source>Developer UI</source>
<translation> UI</translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation> .</translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -468,15 +476,6 @@ A calibração do atraso da direção foi concluída.</translation>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Reiniciar</translation>
@@ -521,10 +520,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -537,6 +532,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -598,6 +621,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>MODO CHILL ON</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">VERIFICAR</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -649,6 +727,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>LIMITE</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">LIMITE</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -763,6 +898,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -786,6 +933,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1044,6 +1219,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1161,10 +1348,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation>Uma atualização para o sistema operacional do seu dispositivo está sendo baixada em segundo plano. Você será solicitado a atualizar quando estiver pronto para instalar.</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>Unidade NVMe não montada.</translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation>Temperatura do dispositivo muito alta. O sistema está sendo resfriado antes de iniciar. A temperatura atual do componente interno é: %1</translation>
@@ -1207,6 +1390,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1581,6 +1768,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1675,6 +1915,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished">Desenvdor</translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1911,6 +2155,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished">Voltar</translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished">Voltar</translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2293,6 +2615,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2303,6 +2679,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2346,6 +2726,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -464,15 +472,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
@@ -517,10 +516,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -533,6 +528,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -594,6 +617,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation></translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -644,6 +722,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">./.</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">/.</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -757,6 +892,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -780,6 +927,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1038,6 +1213,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1159,10 +1346,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation> </translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation> NVMe</translation>
</message>
<message>
<source>Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.</source>
<translation type="unfinished"></translation>
@@ -1201,6 +1384,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1572,6 +1759,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1666,6 +1906,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1902,6 +2146,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2284,6 +2606,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2294,6 +2670,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2337,6 +2717,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -464,15 +472,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Yeniden başlat</translation>
@@ -517,10 +516,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -533,6 +528,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -594,6 +617,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">KONTROL ET</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -644,6 +722,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>MAX</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">MAX</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -757,6 +892,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -780,6 +927,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1038,6 +1213,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1158,10 +1345,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.</source>
<translation type="unfinished"></translation>
@@ -1200,6 +1383,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1571,6 +1758,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1665,6 +1905,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1901,6 +2145,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2283,6 +2605,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2293,6 +2669,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2336,6 +2716,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -468,15 +476,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
@@ -521,10 +520,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -537,6 +532,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -598,6 +621,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation></translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -648,6 +726,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -761,6 +896,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -784,6 +931,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1042,6 +1217,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1159,10 +1346,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation></translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>NVMe固态硬盘未被挂载</translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation>%1</translation>
@@ -1205,6 +1388,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1576,6 +1763,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1670,6 +1910,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1906,6 +2150,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2288,6 +2610,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2298,6 +2674,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2341,6 +2721,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -468,15 +476,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
@@ -521,10 +520,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -537,6 +532,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -598,6 +621,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation> ON</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -648,6 +726,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -761,6 +896,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -784,6 +931,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1042,6 +1217,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1159,10 +1346,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation></translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>NVMe </translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation>%1</translation>
@@ -1205,6 +1388,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1576,6 +1763,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1670,6 +1910,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1906,6 +2150,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2288,6 +2610,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2298,6 +2674,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2341,6 +2721,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+7
View File
@@ -204,6 +204,13 @@ void Device::updateBrightness(const UIState &s) {
brightness = 0;
}
// Onroad Brightness Control
#ifdef SUNNYPILOT
if (awake && s.scene.started && s.scene.onroadScreenOffControl && s.scene.onroadScreenOffTimer == 0) {
brightness = s.scene.onroadScreenOffBrightness * 0.01 * brightness;
}
#endif
if (brightness != last_brightness) {
if (!brightness_future.isRunning()) {
brightness_future = QtConcurrent::run(Hardware::set_brightness, brightness);

Some files were not shown because too many files have changed in this diff Show More