Compare commits

...

171 Commits

Author SHA1 Message Date
DevTekVE a607bc6007 Merge branch 'feature/external-storage' into hkg-angle-steering-2025-ext-stg 2025-07-31 18:42:01 +02:00
DevTekVE c6b118788b Merge branch 'master-new' into hkg-angle-steering-2025 2025-07-31 18:25:08 +02:00
DevTekVE b004f6dbdc Merge branch 'master-new' into hkg-angle-steering-2025 2025-07-31 18:17:34 +02:00
James Vecellio-Grant 6d41ce2032 ci: Refactor model building workflows (#1096)
* Tinygrad bump from sync-20250627

* bump tinygrad_repo

* Reformat metadata generator to match driving_models.json

* bump tinygrad

* Revert "bump tinygrad"

This reverts commit f479dfd502.

* revert me after SP model compiled

* Model recompiled successfully, initiate "revert me after SP model compiled"

This reverts commit 95706eb688.

* The "FillMe" placeholder caused an extra 10 seconds of work

* bump to 22Jul2025

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Allow more dynamic short names

This should hopefully be future-proof for now.. It's robust enough to return the correct word-digit format (see example on how it generates from given display name below):

'Last Horizon V2 (November 22, 2024)' -> LHV2
'Alabama (November 25, 2024)' -> ALABAMA
'PlayStation (December 03, 2024)' -> PLAYSTAT
'Postal Service (December 09, 2024)' -> PS
'Null Pointer (December 13, 2024)' -> NP
'North America (December 16, 2024)' -> NA
'National Public Radio (December 18, 2024)' -> NPR
'Filet o Fish (March 7, 2025)' -> FOF
'Tomb Raider 2 (April 18, 2025)' -> TR2
'Tomb Raider 3 (April 22, 2025)' -> TR3
'Tomb Raider 4 (April 25, 2025)' -> TR4
'Tomb Raider 5 (April 25, 2025)' -> TR5
'Tomb Raider 6 (April 30, 2025)' -> TR6
'Tomb Raider 7 (May 07, 2025)' -> TR7
'Down to Ride (Revision: May 10, 2025)' -> DTR
'SP Vikander Model (May 16, 2025)' -> SPVM
'VFF Driving (May 15, 2025)' -> VFFD
'Secret Good Openpilot (May 16, 2025)' -> SGO
'Vegetarian Filet o Fish (May 29, 2025)' -> VFOF
'Down To Ride (Revision: May 30, 2025)' -> DTR
'Vegetarian Filet o Fish v2 (June 05, 2025)' -> VFOFV2
'Kerrygold Driving (June 08, 2025)' -> KD
'Tomb Raider 10 (June 16, 2025)' -> TR10
'Organic Kerrygold (June 17, 2025)' -> OK
'Liquid Crystal Driving (June 21, 2025)' -> LCD
'Vegetarian Filet o Fish v3 (June 21, 2025)' -> VFOFV3
'Vibe Model [Custom Model]' -> VMCM
'Tomb Raider 13 (June 27, 2025)' -> TR13
'Aggressive TR (June 28, 2025)' -> ATR
'Tomb Raider 14 (June 30, 2025)' -> TR14
'Cookiemonster Tomb Raider (July 02, 2025)' -> CTR
'Down to Ride (Revision: July 07, 2025)' -> DTR
'Simple Plan Driving (July 07, 2025)' -> SPD
'Down to Ride (Revision: July 08, 2025)' -> DTR
'Tomb Raider 15 (July 09, 2025)' -> TR15
'Tomb Raider 15 rev-2 (July 11, 2025)' -> TR15R2
'Le Tomb Raider 14 (July 14, 2025)' -> LTR14
'Le Tomb Raider 14h (July 17, 2025)' -> LTR14H
'Tomb Raider 16 (July 18, 2025)' -> TR16
'Tomb Raider 16v2 (July 21, 2025)' -> TR16V2

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* No need to sleep 3 seconds, just send it

* try dynamic

* cleanup

* Update build-single-tinygrad-model.yaml

* bc devtekve said. also, this is repetitive af

* Revert "bc devtekve said. also, this is repetitive af"

This reverts commit 3a0c1562de.

* maybe we could use a script instead that both build all

That both build all and sunnypilot-build-model reference

* refactor: consolidate model building steps into a single workflow

* tweak

* tweakx2

* tweakx3

* tweakx4

* dunno dunno...

* output dir

* lots of changes

* Revert "lots of changes"

This reverts commit 4aadb0ee29.

* fail if all fail

* no inputs needed

* make it easier for us

* note failure and exit 0

* Update build-all-tinygrad-models.yaml

* not needed unless we really want it

* Update build-single-tinygrad-model.yaml

* Merge branch 'sync-20250627-tinygrad' of github.com:sunnypilot/sunnypilot into sync-20250627-tinygrad

* retry for failed ?

* always run this step because sometimes one build fails

which causes the matrix to fail, but most builds still have uploaded artifacts.

* strip

* no escape

* Update build-all-tinygrad-models.yaml

* Test case from terminal run

(openpilot) james@Mac sunnypilot % jq -c '[.bundles[] | select(.runner=="tinygrad") | {ref, display_name: (.display_name | gsub(" \\([^)]*\\)"; "")), is_20hz}]' \
  /Users/james/Documents/GitHub/sunnypilot-docs/docs/driving_models_v6.json > matrix.json

mkdir -p output
touch "output/model-Tomb Raider 16v2 (July 21, 2025)-544"
touch "output/model-Space Lab Model (July 24, 2025)-547"
touch "output/model-Space Lab Model v1 (July 24, 2025)-548"

built=(); while IFS= read -r line; do built+=("$line"); done < <(
  ls output | sed -E 's/^model-//' | sed -E 's/-[0-9]+$//' | sed -E 's/ \([^)]*\)//' | awk '{gsub(/^ +| +$/, ""); print}'
)

jq -c --argjson built "$(printf '%s\n' "${built[@]}" | jq -R . | jq -s .)" \
  'map(select(.display_name as $n | ($built | index($n | gsub("^ +| +$"; "")) | not)))' \
  matrix.json > retry_matrix.json

cat retry_matrix.json

[]
(openpilot) james@Mac sunnypilot %

* always

* great success

* add suffix to retry artifact so it doesn't conflict

* retry to get_model too

* and there haha

* unnecessary hyphen

* compare built to missing. include retries

* adjust copy of artifacts.

* Update build-all-tinygrad-models.yaml

* Update model selector versioning and add documentation

* Update retry condition for failed models in build-all-tinygrad-models.yaml

* Update retry condition for failed models in build-all-tinygrad-models.yaml

* Update build-single-tinygrad-model.yaml

* false

* default none because why not

* red diff? i think?

* meh ... not needed i guess

* error error error

* Nayan is watching... always watching mike wazowski

* string all the way

* lots of retries just in case because im scared

* more robust

* ONLY ONE!!!!!!

* delete.... a lot

* fix artifacts

* fix artifacts

* make sure each is unique :)

* skip files like artifact duhhhh

* artifact name dir

* concurrency

* copy here

* Update build-single-tinygrad-model.yaml

* Update build-single-tinygrad-model.yaml

* bump

* bump tinygrad

* max parallel? if not, i have the other remedy ready in build-all

* revert me!

* I resynced tinygrad woo hoo

* setup shouldnt fail

* pull

* big ole diff

* condition

* Update build-all-tinygrad-models.yaml

* not always() never always() never!!!

* not failure instead of great success

* Update build-all-tinygrad-models.yaml

* yay that worked. lets invoke build-single one last time

* these arent used and are just taking up 250MB space

* really frog?

* bump back to 3

* self-hosted, tici

* rename to trigger tests

* 2 and done

---------

Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-07-31 09:15:06 -07:00
DevTekVE 572221a7c3 Merge branch 'master-new' into feature/external-storage 2025-07-31 18:09:13 +02:00
James Vecellio-Grant c47aadee19 sunnypilot modeld: Sync Tinygrad (#1081)
* Tinygrad bump from sync-20250627

* bump tinygrad_repo

* Reformat metadata generator to match driving_models.json

* bump tinygrad

* Revert "bump tinygrad"

This reverts commit f479dfd502.

* revert me after SP model compiled

* Model recompiled successfully, initiate "revert me after SP model compiled"

This reverts commit 95706eb688.

* The "FillMe" placeholder caused an extra 10 seconds of work

* bump to 22Jul2025

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* Allow more dynamic short names

This should hopefully be future-proof for now.. It's robust enough to return the correct word-digit format (see example on how it generates from given display name below):

'Last Horizon V2 (November 22, 2024)' -> LHV2
'Alabama (November 25, 2024)' -> ALABAMA
'PlayStation (December 03, 2024)' -> PLAYSTAT
'Postal Service (December 09, 2024)' -> PS
'Null Pointer (December 13, 2024)' -> NP
'North America (December 16, 2024)' -> NA
'National Public Radio (December 18, 2024)' -> NPR
'Filet o Fish (March 7, 2025)' -> FOF
'Tomb Raider 2 (April 18, 2025)' -> TR2
'Tomb Raider 3 (April 22, 2025)' -> TR3
'Tomb Raider 4 (April 25, 2025)' -> TR4
'Tomb Raider 5 (April 25, 2025)' -> TR5
'Tomb Raider 6 (April 30, 2025)' -> TR6
'Tomb Raider 7 (May 07, 2025)' -> TR7
'Down to Ride (Revision: May 10, 2025)' -> DTR
'SP Vikander Model (May 16, 2025)' -> SPVM
'VFF Driving (May 15, 2025)' -> VFFD
'Secret Good Openpilot (May 16, 2025)' -> SGO
'Vegetarian Filet o Fish (May 29, 2025)' -> VFOF
'Down To Ride (Revision: May 30, 2025)' -> DTR
'Vegetarian Filet o Fish v2 (June 05, 2025)' -> VFOFV2
'Kerrygold Driving (June 08, 2025)' -> KD
'Tomb Raider 10 (June 16, 2025)' -> TR10
'Organic Kerrygold (June 17, 2025)' -> OK
'Liquid Crystal Driving (June 21, 2025)' -> LCD
'Vegetarian Filet o Fish v3 (June 21, 2025)' -> VFOFV3
'Vibe Model [Custom Model]' -> VMCM
'Tomb Raider 13 (June 27, 2025)' -> TR13
'Aggressive TR (June 28, 2025)' -> ATR
'Tomb Raider 14 (June 30, 2025)' -> TR14
'Cookiemonster Tomb Raider (July 02, 2025)' -> CTR
'Down to Ride (Revision: July 07, 2025)' -> DTR
'Simple Plan Driving (July 07, 2025)' -> SPD
'Down to Ride (Revision: July 08, 2025)' -> DTR
'Tomb Raider 15 (July 09, 2025)' -> TR15
'Tomb Raider 15 rev-2 (July 11, 2025)' -> TR15R2
'Le Tomb Raider 14 (July 14, 2025)' -> LTR14
'Le Tomb Raider 14h (July 17, 2025)' -> LTR14H
'Tomb Raider 16 (July 18, 2025)' -> TR16
'Tomb Raider 16v2 (July 21, 2025)' -> TR16V2

* Update build-all-tinygrad-models.yaml

* Update build-all-tinygrad-models.yaml

* No need to sleep 3 seconds, just send it

* try dynamic

* cleanup

* Update build-single-tinygrad-model.yaml

* bc devtekve said. also, this is repetitive af

* Revert "bc devtekve said. also, this is repetitive af"

This reverts commit 3a0c1562de.

* maybe we could use a script instead that both build all

That both build all and sunnypilot-build-model reference

* refactor: consolidate model building steps into a single workflow

* tweak

* tweakx2

* tweakx3

* tweakx4

* dunno dunno...

* output dir

* lots of changes

* Revert "lots of changes"

This reverts commit 4aadb0ee29.

* fail if all fail

* no inputs needed

* make it easier for us

* note failure and exit 0

* Update build-all-tinygrad-models.yaml

* not needed unless we really want it

* Update build-single-tinygrad-model.yaml

* Merge branch 'sync-20250627-tinygrad' of github.com:sunnypilot/sunnypilot into sync-20250627-tinygrad

* retry for failed ?

* always run this step because sometimes one build fails

which causes the matrix to fail, but most builds still have uploaded artifacts.

* strip

* no escape

* Update build-all-tinygrad-models.yaml

* Test case from terminal run

(openpilot) james@Mac sunnypilot % jq -c '[.bundles[] | select(.runner=="tinygrad") | {ref, display_name: (.display_name | gsub(" \\([^)]*\\)"; "")), is_20hz}]' \
  /Users/james/Documents/GitHub/sunnypilot-docs/docs/driving_models_v6.json > matrix.json

mkdir -p output
touch "output/model-Tomb Raider 16v2 (July 21, 2025)-544"
touch "output/model-Space Lab Model (July 24, 2025)-547"
touch "output/model-Space Lab Model v1 (July 24, 2025)-548"

built=(); while IFS= read -r line; do built+=("$line"); done < <(
  ls output | sed -E 's/^model-//' | sed -E 's/-[0-9]+$//' | sed -E 's/ \([^)]*\)//' | awk '{gsub(/^ +| +$/, ""); print}'
)

jq -c --argjson built "$(printf '%s\n' "${built[@]}" | jq -R . | jq -s .)" \
  'map(select(.display_name as $n | ($built | index($n | gsub("^ +| +$"; "")) | not)))' \
  matrix.json > retry_matrix.json

cat retry_matrix.json

[]
(openpilot) james@Mac sunnypilot %

* always

* great success

* add suffix to retry artifact so it doesn't conflict

* retry to get_model too

* and there haha

* unnecessary hyphen

* compare built to missing. include retries

* adjust copy of artifacts.

* Update build-all-tinygrad-models.yaml

* Update model selector versioning and add documentation

* Update retry condition for failed models in build-all-tinygrad-models.yaml

* Update retry condition for failed models in build-all-tinygrad-models.yaml

* Update build-single-tinygrad-model.yaml

* false

* default none because why not

* red diff? i think?

* meh ... not needed i guess

* error error error

* Nayan is watching... always watching mike wazowski

* string all the way

* lots of retries just in case because im scared

* more robust

* ONLY ONE!!!!!!

* delete.... a lot

* fix artifacts

* fix artifacts

* make sure each is unique :)

* skip files like artifact duhhhh

* artifact name dir

* concurrency

* copy here

* Update build-single-tinygrad-model.yaml

* Update build-single-tinygrad-model.yaml

* bump

* bump tinygrad

* max parallel? if not, i have the other remedy ready in build-all

* revert me!

* I resynced tinygrad woo hoo

* setup shouldnt fail

* pull

* big ole diff

* condition

* Update build-all-tinygrad-models.yaml

* not always() never always() never!!!

* not failure instead of great success

* Update build-all-tinygrad-models.yaml

* yay that worked. lets invoke build-single one last time

* these arent used and are just taking up 250MB space

* really frog?

* bump back to 3

* self-hosted, tici

* rename to trigger tests

* split sync

---------

Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-07-31 06:50:23 -07:00
Jason Wen 72a6c9fd65 ci: refactor PR handling and input parsing for squash-and-merge (#1094)
* ci: refactor PR handling with output file storage and streamlined input parsing

* try runner.temp

* base64 it

* simple simple

* double it and give it to the next person

* One more test

* Apply suggestions from code review

---------

Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-07-31 06:41:08 +02:00
royjr 44b44a48a9 offroad only 2025-07-30 23:59:46 -04:00
royjr f26c39b754 Merge branch 'master-new' into feature/external-storage 2025-07-30 23:59:25 -04:00
Jason Wen 24699f3e54 events: Update startup event to support sunnypilot remote origin detection (#1092) 2025-07-29 23:09:58 -04:00
Jason Wen fd8cebf2c3 Revert "carControlSP: parse radarState's leadOne & leadTwo" (#1088)
Revert "`carControlSP`: parse `radarState`'s `leadOne` & `leadTwo` (#1082)"

This reverts commit 5b137d666f.
2025-07-29 13:49:58 -04:00
Jason Wen 5b137d666f carControlSP: parse radarState's leadOne & leadTwo (#1082)
* `carControlSP`: parse `radarState`'s `leadOne` & `leadTwo`

* typo

* bump
2025-07-29 10:53:06 -04:00
github-actions[bot] bbdbb55a2a [bot] Update translations (#1077)
Update translations

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-07-29 10:24:34 -04:00
royjr e2e960a9cb Merge branch 'master-new' into feature/external-storage 2025-07-28 23:57:14 -04:00
github-actions[bot] 5cb9f84c4c [bot] Update Python packages (#1076)
Update Python packages

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-07-28 22:36:43 -04:00
Nayan 0c73798049 ui: fix descriptions visibility on models panel (#1079)
i just want to hide the descriptions 🥺
2025-07-26 10:00:23 -04:00
DevTekVE cd4930b680 Bump opendbc 2025-07-26 10:56:49 +02:00
DevTekVE f861aca628 Refactor vehicle model initialization and adjust angle limits for baseline model 2025-07-26 08:12:06 +02:00
DevTekVE 1ff0d8e2ee please don't bother me anymore! 2025-07-26 08:09:51 +02:00
DevTekVE d76d70764e Update slip factor precision for Hyundai steering parameters
- Adjusted `slip_factor` in Hyundai CANFD safety modes for improved consistency and accuracy.
- Ensured proper representation of `slip_factor` output in test logs.
2025-07-25 20:17:19 +02:00
DevTekVE dc73ce0b71 save tools replay 2025-07-25 19:47:31 +02:00
Jason Wen e4ac9af404 ci: enable repo maintenance workflow (#1071)
* ci: enable repo maintenance workflow

* feature branch for now

* gate this

* back to sp master

* update later

* fix format
2025-07-25 12:02:57 -04:00
royjr 0a2e8dd81b mapd: bump version and fix missing folder (#994)
* fix mapd folder

* not needed

* unnecessary

* Remove unused import from mapd_installer.py

Deleted the unused import of Paths from openpilot.system.hardware.hw to clean up the code.

* Undo changes

* update: adjust `mapd` process to conditionally start based on readiness

- Added `mapd_ready` function to check `mapd` readiness.
- Modified `mapd` process to use this readiness condition.

* update: bump mapd version to v1.10.0 and add readiness utility

- Updated `VERSION` to v1.10.0 for `mapd_installer.py`.

* update: integrate `MapdInstallManager` versioning into main thread

- Added a call to `MapdInstallManager.update_installed_version` with `VERSION`.
- Ensures version management for `mapd` is synchronized during runtime.

* refactor: centralize `MAPD_PATH` and `MAPD_BIN_DIR` definitions in module init

- Moved constants to `sunnypilot/mapd/__init__.py` for cleaner imports and reuse.
- Updated references in `mapd_manager.py` and `mapd_installer.py`.

* revert back the file permission

* do this

* no longer static

---------

Co-authored-by: DevTekVE <devtekve@gmail.com>
Co-authored-by: rav4kumar <meetkumardesai@gmail.com>
Co-authored-by: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com>
Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
2025-07-25 11:25:31 -04:00
DevTekVE 3f666748af bump opendbc 2025-07-25 14:16:02 +02:00
DevTekVE 8de8a8838c bumo opendbc 2025-07-25 14:08:53 +02:00
DevTekVE f563b7eb71 Refactor steering angle limit application for improved safety and model compliance 2025-07-25 12:12:42 +02:00
DevTekVE 3c18b83708 save temp 2025-07-25 09:56:30 +02:00
royjr ea4818c50d fix format 2025-07-25 03:15:22 -04:00
DevTekVE bd35f5904b Enhance steering angle rate limiting and safety enforcement logic
- Introduced explicit post-rate limiting using model-specific dynamics.
- Improved low-speed smoothing and precision of applied angles.
2025-07-25 08:12:41 +02:00
royjr 27045be670 cleanup 2025-07-25 01:57:45 -04:00
royjr 064744457c fix ui crash 2025-07-25 00:14:19 -04:00
royjr 0feb985efb orderish 2025-07-24 23:27:06 -04:00
royjr f934f5a6c9 move to sp qt 2025-07-24 23:22:48 -04:00
royjr 391a0ac61a lagless 2025-07-24 21:42:06 -04:00
royjr a944e22524 better 2025-07-24 21:31:19 -04:00
royjr 5942af3506 works for now 2025-07-24 21:20:19 -04:00
DevTekVE 474f2737f6 Refactor steering angle limit logic for conservative seleion
- Removed unused lateral accel/jerk logic for simplicity.
- Updated angle limit calculations to choose the smallest delta for safer control.
2025-07-24 21:48:24 +02:00
DevTekVE ea1ac4a212 Revert "Add configurable max lateral accel and jerk parameters for Hyundai vehicles"
This reverts commit b95f8c5929.

Revert "Add baseline safety model and improve steering angle limiting logic"

This reverts commit b53cbb2e18.

Revert "Disable lateral accel/jerk params and ensure float consistency in angle limits"

This reverts commit 165d7c7b36.
2025-07-24 10:02:48 +02:00
DevTekVE 165d7c7b36 Disable lateral accel/jerk params and ensure float consistency in angle limits
- Commented out unused lateral accel/jerk parameters for clarity.
- Ensured `np.clip` always returns a float for precision.
2025-07-24 09:41:52 +02:00
DevTekVE b53cbb2e18 Add baseline safety model and improve steering angle limiting logic
- Introduced a baseline safety model (`GENESIS_GV80_2025`) for comparison.
- Enhanced steer angle limit calculation using both baseline and current limits for improved safety and precision.
2025-07-24 09:38:03 +02:00
DevTekVE b95f8c5929 Add configurable max lateral accel and jerk parameters for Hyundai vehicles
- Introduced user-configurable options for max lateral acceleration and jerk.
- Enables fine-tuning of vehicle handling for smoother control.
2025-07-24 08:39:10 +02:00
royjr 548c1ae2b9 Merge branch 'master-new' into feature/external-storage 2025-07-23 22:06:45 -04:00
DevTekVE e564bb0b85 bumo openbc 2025-07-23 18:46:52 +02:00
DevTekVE e2ec8a7b13 Refine lateral control limits and simplify safety model handling
- Reduced max lateral acceleration and jerk by 20% for smoother handling.
- Removed unused `get_safety_CP` function, simplifying `VehicleModel` initialization.
2025-07-22 08:07:51 +02:00
Nayan 358c0a8747 ui: proper capitalization for default interactivity timeout (#1065)
No More Neuron Triggering Scream
2025-07-22 01:02:28 -04:00
DevTekVE 75c6f0f10e Test with gv80 as baseline for limits 2025-07-20 22:14:18 +02:00
DevTekVE af38044b42 Merge branch 'master-new' into hkg-angle-steering-2025 2025-07-20 10:14:46 +02:00
James Vecellio-Grant 9f6f7896b0 sunnypilot modeld: Fix SP Model Generation (#1062)
simplify and fix SP model
2025-07-19 20:22:31 -07:00
DevTekVE 684fa846d8 Merge branch 'master-new' into hkg-angle-steering-2025
# Conflicts:
#	.codespellignore
#	opendbc_repo
#	system/manager/manager.py
2025-07-19 21:51:46 +02:00
DevTekVE 416e722855 Update baseline model to IONIQ 5 PE for improved angle safety tuning
- Replaced conservative GENESIS_GV80_2025 model with IONIQ 5 PE parameters.
- Adjusted steering parameters (ratio, slip factor, wheelbase) for better lateral control performance.
2025-07-19 21:46:17 +02:00
Nayan c46ecd18fa UI: Clear Model Cache (#1058)
* clear model cache

* add cache size

* move to model manager

* fix handling for default model

---------

Co-authored-by: DevTekVE <devtekve@gmail.com>
Co-authored-by: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com>
2025-07-19 21:40:16 +02:00
DevTekVE 8e3e5b13aa sunnylink: Adding more keys to be backed up (#1061)
* Enhance parameter backup capabilities

- Added `BACKUP` attribute to various persistent parameters to ensure their inclusion in backup processes.

* Add more keys

---------

Co-authored-by: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com>
2025-07-19 20:05:32 +02:00
James Vecellio-Grant 08f075ab23 ui: Link Advanced Controls (#1060) 2025-07-19 10:35:34 -07:00
Nayan 7555683105 UI: Advanced Controls Toggle (#1053)
* add advancedControl bool to SP Controls

* add Advanced Controls toggle in SP Dev Panel

* merge - ui: Init Developer Panel SP#1054

* because @discountchubbs did not want to commit directly to the pr 🤷‍♂️

* enable onroad too

* hide by default only on staging & release

---------

Co-authored-by: discountchubbs <alexgrant990@gmail.com>
Co-authored-by: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com>
Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-07-19 19:11:49 +02:00
James Vecellio-Grant 0d0f764a79 ui: Quickboot Mode Toggle (#1045)
* Fast boot mode

* Unused

* FastBoot -> QuickBoot

* Move down, since name change

* Chronological in manager too

* last one b4 merge

---------

Co-authored-by: Nayan <nayan8teen@gmail.com>
Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-07-19 07:55:13 -07:00
Nayan e955590f11 chore: remove compile_db from build targets (#1059)
remove --compile_db flag
2025-07-19 16:39:34 +02:00
James Vecellio-Grant 1b570ef418 sunnypilot modeld: Refactor Modeld to Allow Dynamic Plan and Lead (#1030)
* Introduce zero inputs for Lead, and plan to conform with new SP model introduced Monday, July 7, 2025

* Clean this up

* We can revert this after dev-c3-new testing and ready to merge.

* This needs to be apart of the conditional else fail

* Add full conditional

* Update longitudinal_planner.py

* Mypy from myphone!

* red diff

* Make generation a property for clarity

* Even clearer!

* Affix to generation, while allowing older models to use this IF param is set.

* seems a bit repetitive yea?

* dynamic

* Make most outputs dynamic

* Rm toggle from refactor

* refactor(modeld): simplify MHP output parsing logic

- Introduced `_parse_mhp_output` helper to remove redundancy and streamline `parse_dynamic_outputs`.
- Ensures improved code maintainability and clarity.

* refactor(longitudinal_planner): streamline generation handling logic

- Simplified `generation` assignment with inline conditional for better readability.
- Adjusted `mlsim` logic to default to model simulation when `generation` is unset.

* for ease of syncs from now on

* fix

---------

Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-07-19 16:22:02 +02:00
James Vecellio-Grant eae44df688 ui: Models panel Refine Software Delay Adjustments (#1048)
Allow lower values to match some makes liveDelay

Co-authored-by: Nayan <nayan8teen@gmail.com>
2025-07-19 15:57:01 +02:00
Nayan 7c1f3f646c UI: Model Folders (#1031)
* model folders.. yay

* scroll expanded item in view

---------

Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-07-19 15:52:54 +02:00
Kumar 3faf709387 ui: Visuals Panel Lead Chevron Info (#1033)
* lead info

* ui:chevron params

* Update system/manager/manager.py.

---------

Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-07-19 15:17:19 +02:00
James Vecellio-Grant 47833ed73a ui: Disable Updates Toggle (#1040)
* Disable Updates

* Add default to manager.py

* Add enabled state and alternate descriptions

---------

Co-authored-by: Nayan <nayan8teen@gmail.com>
Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-07-19 15:01:39 +02:00
James Vecellio-Grant 517919c7b7 ui: display recorded timestamp on error view (#827)
* Error log clear on manager start

* Error log clear on manager start

* 12 hour reset. may change soon

* Add last modified date

* unused

* rm space

* Squashed commit of the following:

commit bcf5b06c82
Author: discountchubbs <alexgrant990@gmail.com>
Date:   Thu Jul 17 14:14:29 2025 -0700

    Init Developer panel SP

commit cf8bbb70ab
Author: discountchubbs <alexgrant990@gmail.com>
Date:   Thu Jul 17 06:22:18 2025 -0700

    Chronological in manager too

commit ff9b873468
Author: discountchubbs <alexgrant990@gmail.com>
Date:   Thu Jul 17 06:19:59 2025 -0700

    Move down, since name change

commit 38f6cb8c57
Author: discountchubbs <alexgrant990@gmail.com>
Date:   Thu Jul 17 06:17:36 2025 -0700

    FastBoot -> QuickBoot

commit 38562db8dd
Author: discountchubbs <alexgrant990@gmail.com>
Date:   Wed Jul 16 11:20:17 2025 -0700

    Unused

commit c7a751b02d
Author: discountchubbs <alexgrant990@gmail.com>
Date:   Wed Jul 16 10:24:47 2025 -0700

    Fast boot mode

* * Depends on  #1054

* Update developer_panel.h

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
Co-authored-by: DevTekVE <devtekve@gmail.com>
2025-07-19 09:41:01 +02:00
Warren Togami 0b15b88104 NNLC: SIENNA_4TH_GEN gen 1, KIA_NERO_PHEV_2022 (#1013)
* `SIENNA_4TH_GEN` tuning Gen 1 (June 14th, 2025)
   2021-2023 Toyota Sienna
* `KIA_NIRO_PHEV_2022` tuning (July 15th, 2025)
   2021-2022 Kia Niro PHEV
* Fix: rename files to remove spaces in filenames for build compatibility
2025-07-19 09:30:39 +02:00
DevTekVE 9fd4613bbb Add 2025 Kia EV6 support with updated radar and camera fingerprints 2025-07-09 09:47:31 +02:00
DevTekVE a0362e3c5f "Refined UI labels and tooltips for HKG tuning options to improve clarity and user understanding." 2025-06-29 16:48:53 +02:00
DevTekVE e32ef1cdc0 Fix incorrect torque sign usage in torque reduction calculation
Ensure `actuators.torque` uses its absolute value in the `calculate_angle_torque_reduction_gain` method to prevent sign-related issues during Hyundai steering angle control.
2025-06-29 14:33:30 +02:00
DevTekVE 20673ec8a6 Adjust warning font size in angle tuning settings panel. 2025-06-29 13:35:09 +02:00
DevTekVE 53fbdf7329 Rename "IdleTorque" to "ActiveTorque" for clarity.
The parameter name "HkgTuningAngleIdleTorqueReductionGain" was updated to "HkgTuningAngleActiveTorqueReductionGain" across multiple files for better clarity and alignment with its functionality. This change ensures consistency in naming conventions and improves code readability.
2025-06-29 13:23:56 +02:00
DevTekVE 6f72b74fac Add idle torque reduction for Hyundai lateral control
Introduced `ANGLE_IDLE_TORQUE_REDUCTION_GAIN` to manage torque when the vehicle is stationary, ensuring smoother handling and better lane centering. Updated parsing, parameters, and UI settings to support this new idle torque parameter. Adjusted torque calculation logic and smoothing factor behavior for enhanced control flexibility.
2025-06-29 13:22:18 +02:00
DevTekVE e83705a32e Merge branch 'master-new' into hkg-angle-steering-2025
# Conflicts:
#	opendbc_repo
2025-06-29 09:44:01 +02:00
DevTekVE 95d36b9ba2 Refactor and enhance HKG angle tuning logic.
Introduced a toggle for angle smoothing factor and renamed related parameters for clarity. Refactored backend settings to use new parameter names and expanded smoothing matrices for better tuning granularity. Updated UI elements to reflect these changes, emphasizing usability and consistency.
2025-06-28 21:25:44 +02:00
DevTekVE b9e74254bd Merge branch 'master-new' into hkg-angle-steering-2025 2025-06-27 10:46:22 +02:00
DevTekVE b4405b200d Merge remote-tracking branch 'origin/master-new' into hkg-angle-steering-2025 2025-06-25 09:27:21 +02:00
DevTekVE a8a3fdac54 Rename parameter in calculate_target_torque for clarity. 2025-06-23 22:53:45 +02:00
DevTekVE 4eddc622a7 Refactor torque calculations in Hyundai controller
Rename methods and variables for clarity in torque reduction and override calculations. Adjust logic to streamline handling of steering inputs and improve maintainability.
2025-06-23 22:51:40 +02:00
DevTekVE 4e42ada240 Refactor torque management in Hyundai controller for cleaner override and ramp logic
Extract torque ramping and override functionality into dedicated methods within `LkasTorqueManager` to improve maintainability and reduce redundancy. Simplify `update` logic by delegating state-specific operations to new methods.
2025-06-23 22:47:51 +02:00
DevTekVE 6266217655 Introduce LkasTorqueManager for LKAS torque handling in Hyundai controller
Encapsulate LKAS torque calculations, ramping, and override logic into the new `LkasTorqueManager` class to improve modularity and maintainability. Replace existing torque logic with calls to the manager.
2025-06-23 22:20:10 +02:00
DevTekVE ea09d32e98 Remove lateral acceleration logic from Hyundai steering controller 2025-06-23 21:55:17 +02:00
DevTekVE 15958c88d3 Refactor lateral acceleration scaling logic in Hyundai controller
Move scaling of `max_angle_delta` under high lateral acceleration to improve clarity and prevent redundant operations.
2025-06-23 20:22:03 +02:00
DevTekVE b80d7fb5ea Adding GV70 electrified 2026 2025-06-22 14:30:59 +02:00
DevTekVE 1c3d25c6ff Refine lateral acceleration handling in Hyundai steering logic
Enforce absolute check for `real_a_lat` against `MAX_LATERAL_ACCEL` to improve angle scaling under high lateral acceleration conditions.
2025-06-22 11:03:35 +02:00
rav4kumar c9f22b32c7 Revert "Incorporate lateral acceleration in Hyundai angle steering logic"
This reverts commit c0524985bb.
2025-06-21 11:40:58 -07:00
DevTekVE c0524985bb Incorporate lateral acceleration in Hyundai angle steering logic
Add handling for IMU lateral acceleration to refine steering angle limits in CAN FD configurations. Parse and utilize `IMU_LatAccelVal` signal for enhanced lateral control accuracy.
2025-06-21 17:34:13 +02:00
DevTekVE 83839c7ea7 Add angle steering support and refactor related logic for Hyundai CAN FD.
Introduced support for CAN FD angle steering, including updated parameters, signal parsing, and new tests. Refactored related steering logic for clarity, reducing unused code and enhancing maintainability.
2025-06-21 13:38:50 +02:00
DevTekVE c1a1d4b4c3 Update lint script to exclude .xml files in layouts directory
Added `layouts/.*\.xml` to `IGNORED_FILES` in `lint.sh` to prevent linting of layout XML files.
2025-06-20 10:50:45 +02:00
DevTekVE b5af7a905a Merge branch 'master-new' into hkg-angle-steering-2025 2025-06-18 20:13:45 +02:00
DevTekVE 96b1b2f55f Update steering request logic in Hyundai controller
Ensure steering request activation depends on lateral control being active. This adds clarity and aligns better with control logic requirements.
2025-06-17 18:51:54 +02:00
DevTekVE 9361ba5d70 Refactor Hyundai steering angle handling logic
Streamline steering angle calculations and fault avoidance logic by removing redundant comments and unused code. Simplified `round_angle` implementation for clarity and consistency.
2025-06-17 12:08:06 +02:00
DevTekVE 4e9014311e Refactor steeringPressed logic in Hyundai carstate.py.
Revised the determination of `steeringPressed` to account for both hands-on-wheel detection and torque overriding in CAN FD setups. Simplified fallback logic for non-CAN FD configurations for better code clarity and maintainability.
2025-06-12 00:31:07 +02:00
DevTekVE 232873fc70 Refine steering press detection logic.
Adjusted the sensitivity and threshold values for `HOD_Dir_Status` in steering press updates, improving accuracy in detecting steering input. This change aligns with updated parameter requirements for better responsiveness.
2025-06-12 00:14:05 +02:00
DevTekVE 0a61fca9c9 Fix steering press detection for Hyundai models.
Updated the condition to detect steering press by changing HOD_Dir_Status threshold from `> 2` to `>= 2`. This ensures the detection logic aligns correctly with expected behavior.
2025-06-12 00:06:52 +02:00
DevTekVE 480bdc34dc Add support for CANFD angle steering in Hyundai cars
Introduced handling for the `HOD_FD_01_100ms` message when the CANFD angle steering flag is enabled. This ensures proper message parsing and extends compatibility for specific Hyundai vehicle configurations.
2025-06-12 00:04:44 +02:00
DevTekVE 716b475a13 Update Hyundai controls for HOD status and steer limits
Adjusted the steering override frame window and incorporated new HOD_Dir_Status to improve hands-on detection. Added parsing for new signals in Hyundai CAN FD, enhancing steering override responsiveness and reliability.
2025-06-12 00:01:31 +02:00
DevTekVE b1ec5ec034 Adjust override angle cap in Hyundai car controller
Increased the minimum override angle cap from 0.01 to 0.1 and explicitly cast the maximum cap to a float. This change improves consistency and ensures proper handling of steering limits.
2025-06-11 23:20:19 +02:00
DevTekVE 470613c2b7 Adjust Hyundai steer override parameters for improved control.
Reduced the override frame window and updated the angle cap logic to use MAX_ANGLE_RATE. These changes aim to enhance steering responsiveness and safety by fine-tuning steer angle limits.
2025-06-11 23:07:49 +02:00
DevTekVE 336c5b4154 Remove smoothing_factor from Hyundai car controller logic
The `smoothing_factor` parameter and related logic have been removed to simplify the steering angle smoothing approach. All references and usage of this parameter have been eliminated, relying solely on speed-based dynamic interpolation. This change streamlines the code while maintaining functionality.
2025-06-11 23:04:32 +02:00
DevTekVE abdb9dc750 Adjust Hyundai steering override frame logic
Reduced `OVERRIDE_FRAME_WINDOW` and updated condition to properly respect override frame limits. This ensures smoother handling and more precise steering adjustments under certain driving scenarios.
2025-06-11 22:49:04 +02:00
DevTekVE ab98683973 Refactor steering override logic in Hyundai carcontroller
Replaced `recently_overridden` with `frames_since_override` for better granularity and added dynamic override angle limits using interpolation. These changes enhance steering control accuracy during user overrides and improve overall code readability.
2025-06-11 22:42:05 +02:00
DevTekVE 186c24dbe6 Refine Hyundai steering override handling logic
Adjusted logic for recently overridden steering to improve angle limits and torque smoothing. Removed unused or redundant code, optimizing the functionality and maintaining cleaner readability.
2025-06-11 21:49:18 +02:00
DevTekVE 9cdf6340a1 Refactor steering angle smoothing for clarity and reuse.
Extracted the steering angle smoothing logic into a standalone function `sp_smooth_angle` to enhance readability and reusability. Adjusted angle smoothing parameters and introduced a maximum vehicle speed threshold for applying smoothing. Minor updates improve maintainability and ensure consistent behavior across speed ranges.
2025-06-11 10:07:44 +02:00
DevTekVE 2855b1341c Adjust steering thresholds for Hyundai CAN FD vehicles
Updated `STEER_THRESHOLD` to 350 and `NO_LONGER_OVERRIDING_THRESHOLD` to 150 for better alignment with Hyundai CAN FD steering behavior. These changes ensure improved compatibility and more accurate steering response.
2025-06-10 09:53:08 +02:00
DevTekVE cf28f99976 Revert "Add twilsonco's LKAS torque calculator for improved lateral control"
This reverts commit b1770fb0e7aece0e160b1b083cb260edbbdc53dd.
2025-06-10 09:40:59 +02:00
royjr 9edf231c91 Merge branch 'master-new' into feature/external-storage 2025-06-08 21:08:05 -04:00
DevTekVE a39d67dc47 Fix apply_angle_last reset logic in Hyundai carcontroller
Re-enables resetting `apply_angle_last` to `steering_angle` when steering is recently overridden. This ensures proper handling of steering angle limits during transitions.
2025-06-08 19:04:02 +02:00
DevTekVE 7e75257f12 Refine Hyundai steering control logic.
Simplified torque ramp-up logic by combining conditions and adjusted `STEER_THRESHOLD` for CANFD angle steering. These changes aim to enhance control precision and maintain consistency in overrides.
2025-06-08 19:02:49 +02:00
DevTekVE df38449553 Reduce override timeout for Hyundai carcontroller
Decrease the override timeout from 100 to 50 frames, ensuring quicker recognition of driver input override. This improves responsiveness and aligns with refined control behavior.
2025-06-08 18:22:44 +02:00
DevTekVE 1385ef3bc5 Fix steering control behavior during user override
Removed restrictive rate limiting during recent user overrides to improve steering response. Adjusted logic to ensure correct handling of steering angle when lateral control is inactive or overridden.
2025-06-08 18:01:47 +02:00
DevTekVE 7c23c11c51 Refine steering logic with override detection.
Adjust steering behavior to account for recent user overrides, improving safety and control. Introduced a "recently_overridden" check to limit angle rates and torque adjustments when user intervention is detected.
2025-06-08 17:52:16 +02:00
DevTekVE aeff2e12ec Refine steering logic with user override handling.
Added logic to use the current steering angle when the steering wheel is pressed, ensuring smoother transitions during user overrides. Updated function parameters and implementation to reflect this enhancement.
2025-06-08 17:38:34 +02:00
DevTekVE 7274899671 Refactor Hyundai override logic for steering thresholds
Removed redundant `recently_overridden` logic and introduced a more robust approach for tracking user steering overrides. Added `NO_LONGER_OVERRIDING_THRESHOLD` and updated conditions to improve steer override handling. Adjustments ensure smoother torque transitions and more accurate steering state detection.
2025-06-08 17:00:44 +02:00
DevTekVE 6c00fd608f pass tests? 2025-06-08 12:28:11 +02:00
DevTekVE df6a034c11 Bump opendbc 2025-06-08 12:26:09 +02:00
DevTekVE acb109c290 adding plotjuggler stuff 2025-06-08 10:02:44 +02:00
DevTekVE b227b00249 Update torque clamping to use parameterized min torque
Replaced hardcoded `angle_min_active_torque` with `ANGLE_MIN_TORQUE` from params for better configurability and consistency. This ensures the torque clamping logic aligns with defined parameters.
2025-06-07 19:43:01 +02:00
DevTekVE 3ec9d6c18a Merge branch 'master-new' into hkg-angle-steering-2025
# Conflicts:
#	common/params_keys.h
2025-06-07 15:04:16 +02:00
DevTekVE 86db8b95f0 Refactor torque calculation and deactivate live tuning.
Updated torque calculation logic with a new optional parameter for minimum active torque, streamlining control behavior. Deactivated and cleaned up references to HkgAngleLiveTuning, simplifying configuration and reducing runtime complexities. Updated relevant UI and parameter descriptions for clarity.
2025-06-07 11:55:57 +02:00
DevTekVE 4cfff8a35f Merge branch 'master-new' into hkg-angle-steering-2025 2025-06-06 23:08:37 +02:00
DevTekVE 962fedf48c Merge branch 'master-new' into hkg-angle-steering-2025
# Conflicts:
#	opendbc/car/tests/routes.py
2025-06-06 20:49:06 +02:00
DevTekVE 04494414d1 Merge branch 'master-new' into hkg-angle-steering-2025
# Conflicts:
#	opendbc_repo
2025-06-05 09:18:53 +02:00
royjr 9620163f96 fix perms 2025-06-05 01:24:48 -04:00
royjr 23448e9de4 fix mountStorage 2025-06-05 00:49:38 -04:00
royjr 149de6499c Merge branch 'master-new' into feature/external-storage 2025-06-05 00:28:50 -04:00
royjr 397f613201 Merge branch 'master-new' into feature/external-storage 2025-06-03 00:37:25 -04:00
royjr 85f6252d92 Merge branch 'master-new' into feature/external-storage 2025-06-03 00:12:01 -04:00
royjr b3a991b887 external storage 2025-06-02 23:49:42 -04:00
DevTekVE 0b83576e9b Adjust torque ramping logic and update steering thresholds
Increase the override window and refine torque ramp-up behavior to avoid conflicts during recent overrides. Updated steering driver allowance and threshold values for CANFD angle steering to improve compatibility and performance.
2025-06-02 09:49:31 +02:00
DevTekVE ce4ef0f817 Refine steering override logic in Hyundai car controller
Added logic to track recent steering overrides and adjust LKAS torque behavior accordingly. This ensures smoother transitions when the steering is overridden and reduces potential conflicts with driver input. Updated CANFD-specific steering thresholds for enhanced compatibility.
2025-06-02 09:12:03 +02:00
DevTekVE f0b15c1c56 Adding twil's torque calculation 2025-06-01 19:04:34 +02:00
DevTekVE f898e9fdfe Merge branch 'master-new' into hkg-angle-steering-2025
# Conflicts:
#	opendbc_repo
2025-06-01 09:46:45 +02:00
DevTekVE 8ee7804b0e Bump opendbc (no tesla controls, no twil yet) 2025-05-29 16:31:42 +02:00
DevTekVE 923228194e bump opendbc to prior tesla changes until i can pass safety validations 2025-05-28 12:44:44 +02:00
DevTekVE 8837b2e3f6 Merge branch 'master-new' into hkg-angle-steering-2025
# Conflicts:
#	opendbc_repo
2025-05-28 12:36:02 +02:00
DevTekVE f48c9dc1c2 bump opendbc 2025-05-25 17:34:24 +02:00
DevTekVE 74aa07a8cd Ingore something i dont control thx 2025-05-25 17:31:37 +02:00
DevTekVE 5236e4860f Make lint happy, maybe 2025-05-25 17:31:37 +02:00
DevTekVE 3d174da1c3 adding some of my tests and validaitons 2025-05-25 17:31:25 +02:00
DevTekVE 8faa40f3a3 clean 2025-05-25 17:31:25 +02:00
DevTekVE 3e03275f28 Add PlotJuggler layout for analyzing torque and angle data
This new layout visualizes actuator data, CAN steering messages, and car state variables. It provides multiple time-series plots to aid in debugging and analysis. Plugin configurations are also included for extended functionality.
2025-05-25 17:31:22 +02:00
DevTekVE 7595cf8a25 Refine Hyundai angle and torque control logic.
Simplified control flag handling for angle steering, adjusted torque calculations for smoother ramp rates, and updated tuning parameters for the Hyundai Ioniq 5 PE. Minor adjustment to return value handling in lateral control functions.
2025-05-25 17:31:22 +02:00
DevTekVE 2675d43adb bump opendbc
Remove duplicate STEER_ANGLE_SATURATION_THRESHOLD import

Cleaned up an unnecessary duplicate import of STEER_ANGLE_SATURATION_THRESHOLD from latcontrol_angle_torque. This simplifies the module imports and prevents potential redundancy or confusion.

Refactor lateral control to combine torque and angle logic

Merged functionalities of LatControlTorque and LatControlAngle into a single LatControlAngleTorque class. Refactored code to utilize methods from both parent classes, reducing duplication and improving maintainability.

Add angle-torque hybrid lateral control for Hyundai CAN FD

Introduces `LatControlAngleTorque` to enable hybrid angle and torque-based steering for specific Hyundai models. Updates related logic in carcontroller, interface, and controlsd to accommodate this new lateral control method. Adjusts torque parameters for enhanced control in supported models.
2025-05-25 17:31:21 +02:00
DevTekVE d9f4ce82e6 clean 2025-05-25 17:31:21 +02:00
DevTekVE 648a1845d8 cleanup the mess 2025-05-25 17:31:21 +02:00
DevTekVE a87eff6d1c Add HKG Angle Live Tuning parameter and update related handling 2025-05-25 17:31:21 +02:00
DevTekVE dd6ad37e23 Absolutely zero clue on this, I did it with AI and it's for me to play. Don't take this notebook seriously please 2025-05-25 17:31:21 +02:00
DevTekVE c5e778b939 How annoying the linter on a comment lol 2025-05-25 17:31:21 +02:00
DevTekVE a9ab81a77a useless but should keep linter happy 2025-05-25 17:31:21 +02:00
DevTekVE 2d40e1d8e5 Refactor torque parameter handling in Hyundai carcontroller
Replaced direct access to `params` with instance variables for torque parameters to improve code clarity and maintainability. Updated smoothing factor description in angle tuning settings to include speed-related behavior. This enhances readability and prepares for further tuning adjustments.
2025-05-25 17:31:20 +02:00
DevTekVE 7c8f367a5d Fix data type for HkgTuningOverridingCycles value
Updated the value of HkgTuningOverridingCycles to a string for consistency with other parameters in the tuning configuration. This ensures proper handling and avoids potential issues with type mismatches.

Add overriding cycles parameter for torque adjustment

Introduced "HkgTuningOverridingCycles" for configurable user override torque ramp-down cycles. Updated relevant logic in torque control and UI settings to handle the new parameter. This improves flexibility in adjusting steering torque override behavior.
2025-05-25 17:31:20 +02:00
DevTekVE ff4cf558aa Add HKG angle tuning settings with min/max torque parameters
Introduce separate angle tuning controls for HKG vehicles, including smoothing factor, min torque, and max torque parameters. Refactor developer panel to integrate the new settings into a dedicated UI panel, enhancing modularity and customization capabilities.
2025-05-25 17:31:20 +02:00
DevTekVE 0e151e51bc Update HKG Angle Smoothing Factor description in Developer Panel
Enhanced the description to clarify its effect on steering behavior. Included details on how the smoothing factor impacts steering smoothness using EMA, aiding user understanding.
2025-05-25 17:31:20 +02:00
DevTekVE 60cc0031b0 Revert "Revert "Revert the EMA calculation on the curvature to test another approach""
This reverts commit 58fcda8c
2025-05-25 17:31:20 +02:00
DevTekVE d24cac0998 Refactor steering angle logic for smoother control adjustments
Refactored the calculation and application of the steering angle to improve code clarity and ensure smoother transitions. Removed unused parameter update logic in `latcontrol_angle.py` and enhanced handling of driver overrides in `carcontroller.py`.
2025-05-25 17:31:20 +02:00
DevTekVE 45d110830c Fix typo in parameter access method.
Replaced `self._params` with `self.params` to correctly access the parameter `HkgTuningAngleSmoothingFactor`. This ensures the smoothing factor is updated as intended during the control loop.
2025-05-25 17:31:20 +02:00
DevTekVE ea3a9ae911 Improve angle smoothing by integrating dynamic parameter tuning
Introduced a dynamic smoothing factor using the `HkgTuningAngleSmoothingFactor` parameter. This allows more granular control over curvature smoothing based on customizable user input, enhancing driving smoothness. Added necessary logic to process and apply this parameter efficiently.
2025-05-25 17:31:19 +02:00
DevTekVE 6bff8c0e7c Revert "Revert the EMA calculation on the curvature to test another approach"
This reverts commit bd471b3498.
2025-05-25 17:31:19 +02:00
DevTekVE bc6b8802b8 Add HKG angle smoothing factor for steering adjustments
Introduced a new parameter, `HkgTuningAngleSmoothingFactor`, to apply exponential moving average (EMA) smoothing to steering angle changes, reducing sudden adjustments. Added associated UI controls, parameter persistence, and integration into Hyundai carcontroller logic for improved steering stability.
2025-05-25 17:31:19 +02:00
DevTekVE 252ef572d3 Revert the EMA calculation on the curvature to test another approach 2025-05-25 17:31:19 +02:00
DevTekVE 414d397e3f Handle missing pygame import gracefully
Wrap the pygame import in a try-except block to catch ImportError. This prevents the script from crashing and provides a clear message prompting the user to install pygame if it's missing.

Remove "inputs" package and update "pygame" dependency

The "inputs" package has been removed from the lockfile and dependency list, while "pygame" is now included universally without the "dev" extra marker. This change simplifies dependencies and ensures consistency across environments.

Update dependencies: replace 'inputs' with 'pygame'

Replaced the 'inputs' library with 'pygame' for joystickd dependencies in `pyproject.toml`. Additionally, removed a redundant 'pygame' entry from the general dependencies.

Ugly, I know, but soundd is unhappy with joystick

Allowing lat with mads

Invert steering input for joystick control

The steering axis input is now multiplied by -1 to reverse its direction. This ensures correct handling of the left stick's horizontal input, aligning behavior with expected control dynamics.

Refactor joystick control to use pygame for broader support

Replaced the `inputs` library with `pygame` for joystick handling, providing improved compatibility with Xbox and PlayStation controllers. Added initialization, adaptive mappings, deadzone handling, and enhanced event processing for robust joystick operation. Updated README with dependencies and usage information for Xbox controllers.
2025-05-25 17:31:19 +02:00
DevTekVE 11b7b3789d Adjust speed thresholds in filter_speed_matrox.
Updated the `filter_speed_matrox` values to improve curvature filtering behavior at different speeds. This change ensures better handling and stability across a wider range of driving conditions.
2025-05-25 17:31:19 +02:00
DevTekVE 871ac53717 Optimize curvature filtering by adding speed-dependent logic.
Introduced speed-based dynamic alpha adjustment using interpolation for smoother curvature filtering. This improves steering angle calculations by adapting filter sensitivity to vehicle speed, enhancing control performance.
2025-05-25 17:31:19 +02:00
DevTekVE 64ea66b6e6 chsnge alpha to nicer value 2025-05-25 17:31:19 +02:00
DevTekVE 6d7c6759b3 Adjust curvature handling and filtering parameters
Updated curvature breakpoints and torque scaling for improved control in sharp turns. Increased filter alpha for faster curvature response while maintaining system stability.
2025-05-25 17:31:18 +02:00
DevTekVE 4cea013570 Adjust curvature handling and filtering parameters
Updated curvature breakpoints in Hyundai carcontroller to improve torque scaling for curved driving. Slightly refined the filter coefficient in lateral control for smoother curvature filtering and more accurate steering adjustments.
2025-05-25 17:31:18 +02:00
DevTekVE eb375c0587 Refactor curvature-based steering angle and torque logic.
Introduced dynamic torque scaling based on curvature for smoother and more adaptive steering control. Replaced raw curvature inputs with filtered curvature for enhanced stability and reduced noise in steering angle calculations. Removed unused speed scaling logic to simplify the lateral control flow.
2025-05-25 17:31:18 +02:00
DevTekVE 7fd8a5a4bd Reapply "Significant improvement on the jerkiness"
This reverts commit 85ce84e7b7.
2025-05-25 17:31:18 +02:00
DevTekVE b3c90216bb Revert "Significant improvement on the jerkiness"
This reverts commit ea1af879ba2905b076ccfe65993a9db701d689dd.

Revert "More improvement but still not quite"

This reverts commit ad95493c5c61b2ace7c459d2ebc151ddaa80040f.

Revert "Adjust low-speed scaling for lateral control angle"

This reverts commit 6f789ac1ebb66b0239b4028303573c2d7d386b39.

Revert "Refactor speed-based steering scaling logic."

This reverts commit 1d40735ab8db8d470ff3b287a6b42847beffff7d.
2025-05-25 17:31:18 +02:00
DevTekVE 10f345f956 Refactor speed-based steering scaling logic.
Updated the steering angle computation to use a clearer and more descriptive speed-scaling configuration. Replaced low-speed-specific logic with a generalized approach based on speed breakpoints and corresponding influence factors. This improves maintainability and ensures smoother steering adjustments at varying speeds.
2025-05-25 17:31:18 +02:00
DevTekVE 956d2c36d0 Adjust low-speed scaling for lateral control angle
Refined the low-speed scaling parameters by modifying speed breakpoints and factors. This improves handling at lower speeds for smoother and more predictable behavior.
2025-05-25 17:31:18 +02:00
DevTekVE 55e688b6f2 More improvement but still not quite 2025-05-25 17:31:17 +02:00
DevTekVE f017954027 Significant improvement on the jerkiness 2025-05-25 17:31:17 +02:00
DevTekVE 7e992d11b1 bump panda and opendbc 2025-05-25 17:31:15 +02:00
93 changed files with 10783 additions and 1896 deletions
+1
View File
@@ -2,4 +2,5 @@ Wen
REGIST
PullRequest
cancelled
indeces
FOF
+200 -141
View File
@@ -1,21 +1,23 @@
name: Build All Tinygrad Models and Push to GitLab
name: Build and push all tinygrad models
on:
workflow_dispatch:
inputs:
branch:
description: 'Branch to run workflow from'
required: false
default: 'master-new'
set_min_version:
description: 'Minimum selector version required for the models (see helpers.py or readme.md)'
required: true
type: string
jobs:
setup:
runs-on: ubuntu-latest
outputs:
json_version: ${{ steps.get-json.outputs.json_version }}
recompiled_dir: ${{ steps.create-recompiled-dir.outputs.recompiled_dir }}
json_file: ${{ steps.get-json.outputs.json_file }}
model_matrix: ${{ steps.set-matrix.outputs.model_matrix }}
steps:
- name: Checkout docs repo
- name: Checkout docs repo (sunnypilot-docs, gh-pages)
uses: actions/checkout@v4
with:
repository: sunnypilot/sunnypilot-docs
@@ -23,7 +25,7 @@ jobs:
path: docs
ssh-key: ${{ secrets.CI_SUNNYPILOT_DOCS_PRIVATE_KEY }}
- name: Get next JSON version to use
- name: Get next JSON version to use (from GitHub docs repo)
id: get-json
run: |
cd docs/docs
@@ -31,19 +33,131 @@ jobs:
next=$((latest+1))
json_file="driving_models_v${next}.json"
cp "driving_models_v${latest}.json" "$json_file"
echo "json_file=$json_file" >> $GITHUB_OUTPUT
echo "json_file=docs/docs/$json_file" >> $GITHUB_OUTPUT
echo "json_version=$((next+0))" >> $GITHUB_OUTPUT
echo "SRC_JSON_FILE=docs/docs/driving_models_v${latest}.json" >> $GITHUB_ENV
- name: Upload context for next jobs
uses: actions/upload-artifact@v4
- name: Extract tinygrad models
id: set-matrix
working-directory: docs/docs
run: |
jq -c '[.bundles[] | select(.runner=="tinygrad") | {ref, display_name: (.display_name | gsub(" \\([^)]*\\)"; "")), is_20hz}]' "$(basename "${SRC_JSON_FILE}")" > matrix.json
echo "model_matrix=$(cat matrix.json)" >> $GITHUB_OUTPUT
- name: Set up SSH
uses: webfactory/ssh-agent@v0.9.0
with:
name: context
path: docs
ssh-private-key: ${{ secrets.GITLAB_SSH_PRIVATE_KEY }}
- run: |
mkdir -p ~/.ssh
ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts
build-all:
- name: Clone GitLab docs repo and create new recompiled dir
id: create-recompiled-dir
env:
GIT_SSH_COMMAND: 'ssh -o UserKnownHostsFile=~/.ssh/known_hosts'
run: |
git clone --depth 1 --filter=tree:0 --sparse git@gitlab.com:sunnypilot/public/docs.sunnypilot.ai2.git gitlab_docs
cd gitlab_docs
git checkout main
git sparse-checkout set --no-cone models/
cd models
latest_dir=$(ls -d recompiled* 2>/dev/null | sed -E 's/recompiled([0-9]+)/\1/' | sort -n | tail -1)
if [[ -z "$latest_dir" ]]; then
next_dir=1
else
next_dir=$((latest_dir+1))
fi
recompiled_dir="${next_dir}"
mkdir -p "recompiled${recompiled_dir}"
touch "recompiled${recompiled_dir}/.gitkeep"
cd ../..
echo "recompiled_dir=$recompiled_dir" >> $GITHUB_OUTPUT
- name: Push empty recompiled dir to GitLab
run: |
cd gitlab_docs
git add models/recompiled${{ steps.create-recompiled-dir.outputs.recompiled_dir }}
git config --global user.name "GitHub Action"
git config --global user.email "action@github.com"
git commit -m "Add recompiled${{ steps.create-recompiled-dir.outputs.recompiled_dir }} for build-all" || echo "No changes to commit"
git push origin main
- name: Push new JSON to GitHub docs repo
run: |
cd docs
git pull origin gh-pages
git add docs/"$(basename ${{ steps.get-json.outputs.json_file }})"
git config --global user.name "GitHub Action"
git config --global user.email "action@github.com"
git commit -m "Add new ${{ steps.get-json.outputs.json_file }} for build-all" || echo "No changes to commit"
git push origin gh-pages
get_and_build:
needs: [setup]
strategy:
matrix:
model: ${{ fromJson(needs.setup.outputs.model_matrix) }}
fail-fast: false
uses: ./.github/workflows/build-single-tinygrad-model.yaml
with:
upstream_branch: ${{ matrix.model.ref }}
custom_name: ${{ matrix.model.display_name }}
recompiled_dir: ${{ needs.setup.outputs.recompiled_dir }}
json_version: ${{ needs.setup.outputs.json_version }}
secrets: inherit
retry_failed_models:
needs: [setup, get_and_build]
runs-on: ubuntu-latest
needs: setup
if: ${{ needs.setup.result != 'failure' && (failure() && !cancelled()) }}
outputs:
retry_matrix: ${{ steps.set-retry-matrix.outputs.retry_matrix }}
steps:
- uses: actions/download-artifact@v4
with:
pattern: model-*
path: output
- id: set-retry-matrix
run: |
echo '${{ needs.setup.outputs.model_matrix }}' > matrix.json
built=(); while IFS= read -r line; do built+=("$line"); done < <(
ls output | sed -E 's/^model-//' | sed -E 's/-[0-9]+$//' | sed -E 's/ \([^)]*\)//' | awk '{gsub(/^ +| +$/, ""); print}'
)
jq -c --argjson built "$(printf '%s\n' "${built[@]}" | jq -R . | jq -s .)" \
'map(select(.display_name as $n | ($built | index($n | gsub("^ +| +$"; "")) | not)))' matrix.json > retry_matrix.json
echo "retry_matrix=$(cat retry_matrix.json)" >> $GITHUB_OUTPUT
retry_get_and_build:
needs: [setup, get_and_build, retry_failed_models]
if: ${{ needs.get_and_build.result == 'failure' || (needs.retry_failed_models.outputs.retry_matrix != '[]' && needs.retry_failed_models.outputs.retry_matrix != '') }}
strategy:
matrix:
model: ${{ fromJson(needs.retry_failed_models.outputs.retry_matrix) }}
fail-fast: false
uses: ./.github/workflows/build-single-tinygrad-model.yaml
with:
upstream_branch: ${{ matrix.model.ref }}
custom_name: ${{ matrix.model.display_name }}
recompiled_dir: ${{ needs.setup.outputs.recompiled_dir }}
json_version: ${{ needs.setup.outputs.json_version }}
artifact_suffix: -retry
secrets: inherit
publish_models:
name: Publish models sequentially
needs: [setup, get_and_build, retry_failed_models, retry_get_and_build]
if: ${{ !cancelled() && (needs.get_and_build.result != 'failure' || needs.retry_get_and_build.result == 'success' || (needs.retry_failed_models.outputs.retry_matrix != '[]' && needs.retry_failed_models.outputs.retry_matrix != '')) }}
runs-on: ubuntu-latest
strategy:
max-parallel: 1
matrix:
model: ${{ fromJson(needs.setup.outputs.model_matrix) }}
env:
JSON_FILE: docs/docs/${{ needs.setup.outputs.json_file }}
RECOMPILED_DIR: recompiled${{ needs.setup.outputs.recompiled_dir }}
JSON_FILE: ${{ needs.setup.outputs.json_file }}
ARTIFACT_NAME_INPUT: ${{ matrix.model.display_name }}
steps:
- name: Set up SSH
uses: webfactory/ssh-agent@v0.9.0
@@ -62,138 +176,73 @@ jobs:
echo "Cloning GitLab"
git clone --depth 1 --filter=tree:0 --sparse git@gitlab.com:sunnypilot/public/docs.sunnypilot.ai2.git gitlab_docs
cd gitlab_docs
echo "checkout models/${RECOMPILED_DIR}"
git sparse-checkout set --no-cone models/${RECOMPILED_DIR}
git checkout main
cd ..
- name: Set next recompiled dir
id: set-recompiled
run: |
cd gitlab_docs/models
latest_dir=$(ls -d recompiled* 2>/dev/null | sed -E 's/recompiled([0-9]+)/\1/' | sort -n | tail -1)
if [[ -z "$latest_dir" ]]; then
next_dir=1
else
next_dir=$((latest_dir+1))
fi
recompiled_dir="recompiled${next_dir}"
mkdir -p "$recompiled_dir"
echo "RECOMPILED_DIR=$recompiled_dir" >> $GITHUB_ENV
- name: Download context
uses: actions/download-artifact@v4
- name: Checkout docs repo
uses: actions/checkout@v4
with:
name: context
path: .
repository: sunnypilot/sunnypilot-docs
ref: gh-pages
path: docs
ssh-key: ${{ secrets.CI_SUNNYPILOT_DOCS_PRIVATE_KEY }}
- name: Install dependencies
- name: Validate recompiled dir and JSON version
run: |
sudo apt-get update
sudo apt-get install -y jq gh
- name: Build all tinygrad models
id: trigger-builds
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -e
> triggered_run_ids.txt
BRANCH="${{ github.event.inputs.branch }}"
jq -c '.bundles[] | select(.runner=="tinygrad")' "$JSON_FILE" | while read -r bundle; do
ref=$(echo "$bundle" | jq -r '.ref')
display_name=$(echo "$bundle" | jq -r '.display_name' | sed 's/ ([^)]*)//g')
is_20hz=$(echo "$bundle" | jq -r '.is_20hz')
echo "Triggering build for: $display_name ($ref) [20Hz: $is_20hz]"
START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
gh workflow run sunnypilot-build-model.yaml \
--repo sunnypilot/sunnypilot \
--ref "$BRANCH" \
-f upstream_branch="$ref" \
-f custom_name="$display_name" \
-f is_20hz="$is_20hz"
for i in {1..24}; do
RUN_ID=$(gh run list --repo sunnypilot/sunnypilot --workflow=sunnypilot-build-model.yaml --branch="$BRANCH" --created ">$START_TIME" --limit=1 --json databaseId --jq '.[0].databaseId')
if [ -n "$RUN_ID" ]; then
break
fi
sleep 5
done
if [ -z "$RUN_ID" ]; then
echo "ould not find the triggered workflow run for $display_name ($ref)"
exit 1
fi
echo "$RUN_ID" >> triggered_run_ids.txt
done
- name: Wait for all model builds to finish
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -e
SUCCESS_RUNS=()
FAILED_RUNS=()
declare -A RUN_ID_TO_NAME
while read -r RUN_ID; do
ARTIFACT_NAME=$(gh api repos/sunnypilot/sunnypilot/actions/runs/$RUN_ID/artifacts --jq '.artifacts[] | select(.name | startswith("model-")) | .name' || echo "unknown")
RUN_ID_TO_NAME["$RUN_ID"]="$ARTIFACT_NAME"
done < triggered_run_ids.txt
while read -r RUN_ID; do
echo "Watching run ID: $RUN_ID"
gh run watch "$RUN_ID" --repo sunnypilot/sunnypilot
CONCLUSION=$(gh run view "$RUN_ID" --repo sunnypilot/sunnypilot --json conclusion --jq '.conclusion')
ARTIFACT_NAME="${RUN_ID_TO_NAME[$RUN_ID]}"
echo "Run $RUN_ID ($ARTIFACT_NAME) concluded with: $CONCLUSION"
if [[ "$CONCLUSION" == "success" ]]; then
SUCCESS_RUNS+=("$RUN_ID")
else
FAILED_RUNS+=("$RUN_ID")
fi
done < triggered_run_ids.txt
if [[ ${#SUCCESS_RUNS[@]} -eq 0 ]]; then
echo "All model builds failed. Aborting."
if [ ! -d "gitlab_docs/models/$RECOMPILED_DIR" ]; then
echo "Recompiled dir $RECOMPILED_DIR does not exist in GitLab repo"
exit 1
fi
if [ ! -f "$JSON_FILE" ]; then
echo "JSON file $JSON_FILE does not exist!"
exit 1
fi
if [[ ${#FAILED_RUNS[@]} -gt 0 ]]; then
echo "WARNING: The following model builds failed:"
for RUN_ID in "${FAILED_RUNS[@]}"; do
echo "- $RUN_ID (${RUN_ID_TO_NAME[$RUN_ID]})"
done
echo "You may want to rerun these models manually."
fi
- name: Download artifact name file
uses: actions/download-artifact@v4
with:
name: artifact-name-${{ env.ARTIFACT_NAME_INPUT }}
path: artifact_name
- name: Download and extract all model artifacts
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Read artifact name
id: read-artifact-name
run: |
ARTIFACT_DIR="gitlab_docs/models/$RECOMPILED_DIR"
SUCCESS_RUNS=()
while read -r RUN_ID; do
CONCLUSION=$(gh run view "$RUN_ID" --repo sunnypilot/sunnypilot --json conclusion --jq '.conclusion')
if [[ "$CONCLUSION" == "success" ]]; then
SUCCESS_RUNS+=("$RUN_ID")
fi
done < triggered_run_ids.txt
ARTIFACT_NAME=$(cat artifact_name/artifact_name.txt)
echo "artifact_name=$ARTIFACT_NAME" >> $GITHUB_OUTPUT
for RUN_ID in "${SUCCESS_RUNS[@]}"; do
ARTIFACT_NAME=$(gh api repos/sunnypilot/sunnypilot/actions/runs/$RUN_ID/artifacts --jq '.artifacts[] | select(.name | startswith("model-")) | .name')
echo "Downloading artifact: $ARTIFACT_NAME from run: $RUN_ID"
mkdir -p "$ARTIFACT_DIR/$ARTIFACT_NAME"
echo "Created directory: $ARTIFACT_DIR/$ARTIFACT_NAME"
gh run download "$RUN_ID" --repo sunnypilot/sunnypilot -n "$ARTIFACT_NAME" --dir "$ARTIFACT_DIR/$ARTIFACT_NAME"
echo "Downloaded artifact zip(s) to: $ARTIFACT_DIR/$ARTIFACT_NAME"
ZIP_PATH=$(find "$ARTIFACT_DIR/$ARTIFACT_NAME" -type f -name '*.zip' | head -n1)
if [ -n "$ZIP_PATH" ]; then
echo "Unzipping $ZIP_PATH to $ARTIFACT_DIR/$ARTIFACT_NAME"
unzip -o "$ZIP_PATH" -d "$ARTIFACT_DIR/$ARTIFACT_NAME"
rm -f "$ZIP_PATH"
echo "Unzipped and removed $ZIP_PATH"
- name: Download model artifact
uses: actions/download-artifact@v4
with:
name: ${{ steps.read-artifact-name.outputs.artifact_name }}
path: output
- name: Remove onnx files bc not needed for recompiled dir since they already exist from single build
run: |
find output -type f -name '*.onnx' -delete
find output -type f -name 'big_*.pkl' -delete
find output -type f -name 'dmonitoring_model_tinygrad.pkl' -delete
- name: Copy model artifacts to gitlab
env:
ARTIFACT_NAME: ${{ steps.read-artifact-name.outputs.artifact_name }}
run: |
ARTIFACT_DIR="gitlab_docs/models/${RECOMPILED_DIR}/${ARTIFACT_NAME}"
mkdir -p "$ARTIFACT_DIR"
for path in output/*; do
if [ "$(basename "$path")" = "artifact_name.txt" ]; then
continue
fi
name="$(basename "$path")"
if [ -d "$path" ]; then
mkdir -p "$ARTIFACT_DIR/$name"
cp -r "$path"/* "$ARTIFACT_DIR/$name/"
echo "Copied dir $name -> $ARTIFACT_DIR/$name"
else
echo "No zip file found in $ARTIFACT_DIR/$ARTIFACT_NAME (This is NOT an error)."
cp "$path" "$ARTIFACT_DIR/"
echo "Copied file $name -> $ARTIFACT_DIR/"
fi
echo "Done processing $ARTIFACT_NAME"
done
- name: Push recompiled dir to GitLab
@@ -202,25 +251,35 @@ jobs:
run: |
cd gitlab_docs
git checkout main
mkdir -p models/"$(basename $RECOMPILED_DIR)"
git add models/"$(basename $RECOMPILED_DIR)"
git pull origin main
for d in models/"$RECOMPILED_DIR"/*/; do
git sparse-checkout add "$d"
done
git add models/"$RECOMPILED_DIR"
git config --global user.name "GitHub Action"
git config --global user.email "action@github.com"
git commit -m "Add $(basename $RECOMPILED_DIR) from build-all-tinygrad-models"
git commit -m "Update $RECOMPILED_DIR with model from build-all-tinygrad-models" || echo "No changes to commit"
git push origin main
- run: |
cd docs
git pull origin gh-pages
- name: Run json_parser.py to update JSON
- name: update json
run: |
python3 docs/json_parser.py \
ARGS=""
[ -n "${{ inputs.set_min_version }}" ] && ARGS="$ARGS --set-min-version \"${{ inputs.set_min_version }}\""
ARGS="$ARGS --sort-by-date"
eval python3 docs/json_parser.py \
--json-path "$JSON_FILE" \
--recompiled-dir "gitlab_docs/models/$RECOMPILED_DIR"
--recompiled-dir "gitlab_docs/models/$RECOMPILED_DIR" \
$ARGS
- name: Push updated JSON to GitHub docs repo
- name: Push updated json to GitHub
run: |
cd docs
git config --global user.name "GitHub Action"
git config --global user.email "action@github.com"
git checkout gh-pages
git add docs/"$(basename $JSON_FILE)"
git commit -m "Update $(basename $JSON_FILE) after recompiling models" || echo "No changes to commit"
git commit -m "Update $(basename $JSON_FILE) after recompiling model" || echo "No changes to commit"
git push origin gh-pages
@@ -1,13 +1,36 @@
name: Build Single Tinygrad Model and Push
on:
workflow_call:
inputs:
upstream_branch:
description: 'Upstream commit to build from'
required: true
type: string
custom_name:
description: 'Custom name for the model (no date, only name)'
required: false
type: string
recompiled_dir:
description: 'Existing recompiled directory number (e.g. 3 for recompiled3)'
required: true
type: string
json_version:
description: 'driving_models version number to update (e.g. 5 for driving_models_v5.json)'
required: true
type: string
artifact_suffix:
description: 'Suffix for artifact name'
required: false
type: string
default: ''
bypass_push:
description: 'Bypass pushing to GitLab for build-all'
required: false
default: true
type: boolean
workflow_dispatch:
inputs:
build_model_ref:
description: 'Branch to use for build-model workflow'
required: false
default: 'master-new'
type: string
upstream_branch:
description: 'Upstream commit to build from'
required: true
@@ -26,10 +49,12 @@ on:
type: number
model_folder:
description: 'Model folder'
required: true
type: choice
default: 'None'
options:
- None
- Simple Plan Models
- Space Lab Models
- TR Models
- DTR Models
- Custom Merge Models
@@ -47,13 +72,27 @@ on:
description: 'Minimum selector version'
required: false
type: number
env:
RECOMPILED_DIR: recompiled${{ inputs.recompiled_dir }}
JSON_FILE: docs/docs/driving_models_v${{ inputs.json_version }}.json
jobs:
build-single:
build_model:
uses: ./.github/workflows/sunnypilot-build-model.yaml
with:
upstream_branch: ${{ inputs.upstream_branch }}
custom_name: ${{ inputs.custom_name || inputs.upstream_branch }}
is_20hz: true
artifact_suffix: ${{ inputs.artifact_suffix }}
secrets: inherit
publish_model:
if: ${{ !inputs.bypass_push && !cancelled() }}
concurrency:
group: gitlab-push-${{ inputs.recompiled_dir }}
cancel-in-progress: false
needs: build_model
runs-on: ubuntu-latest
env:
RECOMPILED_DIR: recompiled${{ github.event.inputs.recompiled_dir }}
JSON_FILE: docs/docs/driving_models_v${{ github.event.inputs.json_version }}.json
steps:
- name: Set up SSH
uses: webfactory/ssh-agent@v0.9.0
@@ -96,66 +135,49 @@ jobs:
exit 1
fi
- name: Install dependencies
- name: Download artifact name file
uses: actions/download-artifact@v4
with:
name: artifact-name-${{ inputs.custom_name || inputs.upstream_branch }}
path: artifact_name
- name: Read artifact name
id: read-artifact-name
run: |
sudo apt-get update
sudo apt-get install -y jq gh
- name: Build model
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
gh workflow run sunnypilot-build-model.yaml \
--repo sunnypilot/sunnypilot \
--ref "${{ github.event.inputs.build_model_ref }}" \
-f upstream_branch="${{ github.event.inputs.upstream_branch }}" \
-f custom_name="${{ github.event.inputs.custom_name }}"
for i in {1..24}; do
RUN_ID=$(gh run list --repo sunnypilot/sunnypilot --workflow=sunnypilot-build-model.yaml --branch="${{ github.event.inputs.build_model_ref }}" --created ">$START_TIME" --limit=1 --json databaseId --jq '.[0].databaseId')
if [ -n "$RUN_ID" ]; then
break
fi
sleep 5
done
if [ -z "$RUN_ID" ]; then
echo "Could not find the triggered workflow run."
exit 1
fi
echo "Watching run ID: $RUN_ID"
gh run watch "$RUN_ID" --repo sunnypilot/sunnypilot
CONCLUSION=$(gh run view "$RUN_ID" --repo sunnypilot/sunnypilot --json conclusion --jq '.conclusion')
echo "Run concluded with: $CONCLUSION"
if [[ "$CONCLUSION" != "success" ]]; then
echo "Workflow run failed with conclusion: $CONCLUSION"
exit 1
fi
ARTIFACT_NAME=$(cat artifact_name/artifact_name.txt)
echo "artifact_name=$ARTIFACT_NAME" >> $GITHUB_OUTPUT
- name: Download and extract model artifact
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: actions/download-artifact@v4
with:
name: ${{ steps.read-artifact-name.outputs.artifact_name }}
path: output
- name: Remove unwanted files
run: |
ARTIFACT_DIR="gitlab_docs/models/$RECOMPILED_DIR"
RUN_ID=$(gh run list --repo sunnypilot/sunnypilot --workflow=sunnypilot-build-model.yaml --branch="${{ github.event.inputs.build_model_ref }}" --limit=1 --json databaseId --jq '.[0].databaseId')
ARTIFACT_NAME=$(gh api repos/sunnypilot/sunnypilot/actions/runs/$RUN_ID/artifacts --jq '.artifacts[] | select(.name | startswith("model-")) | .name')
echo "Downloading artifact: $ARTIFACT_NAME from run: $RUN_ID"
mkdir -p "$ARTIFACT_DIR/$ARTIFACT_NAME"
echo "Created directory: $ARTIFACT_DIR/$ARTIFACT_NAME"
gh run download "$RUN_ID" --repo sunnypilot/sunnypilot -n "$ARTIFACT_NAME" --dir "$ARTIFACT_DIR/$ARTIFACT_NAME"
echo "Downloaded artifact zip(s) to: $ARTIFACT_DIR/$ARTIFACT_NAME"
ZIP_PATH=$(find "$ARTIFACT_DIR/$ARTIFACT_NAME" -type f -name '*.zip' | head -n1)
if [ -n "$ZIP_PATH" ]; then
echo "Unzipping $ZIP_PATH to $ARTIFACT_DIR/$ARTIFACT_NAME"
unzip -o "$ZIP_PATH" -d "$ARTIFACT_DIR/$ARTIFACT_NAME"
rm -f "$ZIP_PATH"
echo "Unzipped and removed $ZIP_PATH"
else
echo "No zip file found in $ARTIFACT_DIR/$ARTIFACT_NAME"
fi
echo "Done processing $ARTIFACT_NAME"
find output -type f -name 'dmonitoring_model_tinygrad.pkl' -delete
find output -type f -name 'dmonitoring_model.onnx' -delete
- name: Copy model artifact(s) to GitLab recompiled dir
env:
ARTIFACT_NAME: ${{ steps.read-artifact-name.outputs.artifact_name }}
run: |
ARTIFACT_DIR="gitlab_docs/models/${RECOMPILED_DIR}/${ARTIFACT_NAME}"
mkdir -p "$ARTIFACT_DIR"
for path in output/*; do
if [ "$(basename "$path")" = "artifact_name.txt" ]; then
continue
fi
name="$(basename "$path")"
if [ -d "$path" ]; then
mkdir -p "$ARTIFACT_DIR/$name"
cp -r "$path"/* "$ARTIFACT_DIR/$name/"
echo "Copied dir $name -> $ARTIFACT_DIR/$name"
else
cp "$path" "$ARTIFACT_DIR/"
echo "Copied file $name -> $ARTIFACT_DIR/"
fi
done
- name: Push recompiled dir to GitLab
env:
@@ -163,28 +185,36 @@ jobs:
run: |
cd gitlab_docs
git checkout main
git pull origin main
for d in models/"$RECOMPILED_DIR"/*/; do
git sparse-checkout add "$d"
done
git add models/"$RECOMPILED_DIR"
git config --global user.name "GitHub Action"
git config --global user.email "action@github.com"
git commit -m "Update $RECOMPILED_DIR with new/updated model from build-single-tinygrad-model" || echo "No changes to commit"
git commit -m "Create/Update $RECOMPILED_DIR with new/updated model from build-single-tinygrad-model" || echo "No changes to commit"
git push origin main
- run: |
cd docs
git pull origin gh-pages
- name: Run json_parser.py to update JSON
run: |
FOLDER="${{ github.event.inputs.model_folder }}"
FOLDER="${{ inputs.model_folder }}"
if [ "$FOLDER" = "Other" ]; then
FOLDER="${{ github.event.inputs.custom_model_folder }}"
FOLDER="${{ inputs.custom_model_folder }}"
fi
ARGS=""
[ -n "$FOLDER" ] && ARGS="$ARGS --model-folder \"$FOLDER\""
[ -n "${{ github.event.inputs.generation }}" ] && ARGS="$ARGS --generation \"${{ github.event.inputs.generation }}\""
[ -n "${{ github.event.inputs.version }}" ] && ARGS="$ARGS --version \"${{ github.event.inputs.version }}\""
if [ "$FOLDER" != "None" ] && [ -n "$FOLDER" ]; then
ARGS="$ARGS --model-folder \"$FOLDER\""
fi
[ -n "${{ inputs.generation }}" ] && ARGS="$ARGS --generation \"${{ inputs.generation }}\""
[ -n "${{ inputs.version }}" ] && ARGS="$ARGS --version \"${{ inputs.version }}\""
eval python3 docs/json_parser.py \
--json-path "$JSON_FILE" \
--recompiled-dir "gitlab_docs/models/$RECOMPILED_DIR" \
--sort-by-date \
$ARGS
- name: Push updated JSON to GitHub docs repo
+6 -6
View File
@@ -13,7 +13,7 @@ env:
jobs:
update_translations:
runs-on: ubuntu-latest
if: github.repository == 'commaai/openpilot'
if: github.repository == 'sunnypilot/sunnypilot'
steps:
- uses: actions/checkout@v4
- uses: ./.github/workflows/setup-with-retry
@@ -23,12 +23,12 @@ jobs:
- name: Create Pull Request
uses: peter-evans/create-pull-request@9153d834b60caba6d51c9b9510b087acf9f33f83
with:
author: Vehicle Researcher <user@comma.ai>
author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
commit-message: "Update translations"
title: "[bot] Update translations"
body: "Automatic PR from repo-maintenance -> update_translations"
branch: "update-translations"
base: "master"
base: "master-new"
delete-branch: true
labels: bot
@@ -61,12 +61,12 @@ jobs:
- name: Create Pull Request
uses: peter-evans/create-pull-request@9153d834b60caba6d51c9b9510b087acf9f33f83
with:
author: Vehicle Researcher <user@comma.ai>
token: ${{ secrets.ACTIONS_CREATE_PR_PAT }}
author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
token: ${{ github.repository == 'commaai/openpilot' && secrets.ACTIONS_CREATE_PR_PAT || secrets.GITHUB_TOKEN }}
commit-message: Update Python packages
title: '[bot] Update Python packages'
branch: auto-package-updates
base: master
base: master-new
delete-branch: true
body: 'Automatic PR from repo-maintenance -> package_updates'
labels: bot
+62 -12
View File
@@ -9,6 +9,27 @@ env:
MODELS_DIR: ${{ github.workspace }}/selfdrive/modeld/models
on:
workflow_call:
inputs:
upstream_branch:
description: 'Upstream branch to build from'
required: true
default: 'master'
type: string
custom_name:
description: 'Custom name for the model (no date, only name)'
required: false
type: string
is_20hz:
description: 'Is this a 20Hz model'
required: false
type: boolean
default: true
artifact_suffix:
description: 'Suffix for artifact name'
required: false
type: string
default: ''
workflow_dispatch:
inputs:
upstream_branch:
@@ -32,34 +53,53 @@ run-name: Build model [${{ inputs.custom_name || inputs.upstream_branch }}] from
jobs:
get_model:
runs-on: ubuntu-latest
env:
REF: ${{ inputs.upstream_branch }}
outputs:
model_date: ${{ steps.commit-date.outputs.model_date }}
steps:
- uses: actions/checkout@v4
# Note: To allow dynamic models from both openpilot and sunnypilot (merges/mashups), we try commaai as default,
# and fallback to sunnypilot if the ref checkout fails.
- name: Checkout commaai/openpilot
id: checkout_upstream
continue-on-error: true
uses: actions/checkout@v4
with:
repository: ${{ env.UPSTREAM_REPO }}
ref: ${{ github.event.inputs.upstream_branch }}
repository: commaai/openpilot
ref: ${{ inputs.upstream_branch }}
submodules: recursive
path: openpilot
- name: Fallback to sunnypilot/sunnypilot
if: steps.checkout_upstream.outcome == 'failure'
uses: actions/checkout@v4
with:
repository: sunnypilot/sunnypilot
ref: ${{ inputs.upstream_branch }}
submodules: recursive
path: openpilot
- name: Get commit date
id: commit-date
run: |
# Get the commit date in YYYY-MM-DD format
cd ${{ github.workspace }}/openpilot
commit_date=$(git log -1 --format=%cd --date=format:'%B %d, %Y')
echo "model_date=${commit_date}" >> $GITHUB_OUTPUT
cat $GITHUB_OUTPUT
- run: git lfs pull
- run: |
cd ${{ github.workspace }}/openpilot
git lfs pull
- name: 'Upload Artifact'
uses: actions/upload-artifact@v4
with:
name: models
path: ${{ github.workspace }}/selfdrive/modeld/models/*.onnx
name: models-${{ env.REF }}${{ inputs.artifact_suffix }}
path: ${{ github.workspace }}/openpilot/selfdrive/modeld/models/*.onnx
build_model:
runs-on: self-hosted
runs-on: [self-hosted, tici]
needs: get_model
env:
MODEL_NAME: ${{ inputs.custom_name || inputs.upstream_branch }} (${{ needs.get_model.outputs.model_date }})
REF: ${{ inputs.upstream_branch }}
steps:
- uses: actions/checkout@v4
with:
@@ -71,7 +111,7 @@ jobs:
with:
path: ${{env.SCONS_CACHE_DIR}}
key: scons-${{ runner.os }}-${{ runner.arch }}-${{ github.head_ref || github.ref_name }}-model-${{ github.sha }}
# Note: GitHub Actions enforces cache isolation between different build sources (PR builds, workflow dispatches, etc.)
# Note: GitHub Actions enforces cache isolation between different build sources (PR builds, workflow dispatches, etc.)
# for security. Only caches from the default branch are shared across all builds. This is by design and cannot be overridden.
restore-keys: |
scons-${{ runner.os }}-${{ runner.arch }}-${{ github.head_ref || github.ref_name }}-model
@@ -114,7 +154,7 @@ jobs:
- name: Download model artifacts
uses: actions/download-artifact@v4
with:
name: models
name: models-${{ env.REF }}${{ inputs.artifact_suffix }}
path: ${{ github.workspace }}/selfdrive/modeld/models
- name: Build Model
@@ -157,12 +197,22 @@ jobs:
--upstream-branch "${{ inputs.upstream_branch }}" \
${{ inputs.is_20hz && '--is-20hz' || '' }}
- name: Write artifact name to file
run: echo "model-${{ env.MODEL_NAME }}${{ inputs.artifact_suffix }}-${{ github.run_number }}" > ${{ env.OUTPUT_DIR }}/artifact_name.txt
- name: Upload Build Artifacts
id: upload-artifact
uses: actions/upload-artifact@v4
with:
name: model-${{ env.MODEL_NAME }}-${{ github.run_number }}
name: model-${{ env.MODEL_NAME }}${{ inputs.artifact_suffix }}-${{ github.run_number }}
path: ${{ env.OUTPUT_DIR }}
- name: Upload artifact name file
uses: actions/upload-artifact@v4
with:
name: artifact-name-${{ inputs.custom_name || inputs.upstream_branch }}
path: ${{ env.OUTPUT_DIR }}/artifact_name.txt
- name: Re-enable powersave
if: always()
run: |
@@ -50,7 +50,7 @@ jobs:
concurrency:
group: build-${{ github.head_ref || github.ref_name }}
cancel-in-progress: false
runs-on: self-hosted
runs-on: [self-hosted, tici]
outputs:
new_branch: ${{ steps.set-env.outputs.new_branch }}
version: ${{ steps.set-env.outputs.version }}
@@ -153,6 +153,7 @@ jobs:
}
}' -F label="is:pr is:open label:${PR_LABEL} draft:false sort:created-asc")
PR_LIST=${PR_LIST//\'/}
echo "PR_LIST=${PR_LIST}" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+7
View File
@@ -21,5 +21,12 @@
</clean>
</configuration>
</target>
<target id="f2590b2b-9b93-49f9-8510-da3f3724a2ae" name="replay" defaultType="TOOL">
<configuration id="d475264f-6f4c-4092-9b4e-6773309f38b7" name="replay" toolchainName="Default">
<build type="TOOL">
<tool actionId="Tool_External Tools_uv build tools replay" />
</build>
</configuration>
</target>
</component>
</project>
+9 -2
View File
@@ -2,7 +2,7 @@
<tool name="uv Scons Build Debug" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="false" showConsoleOnStdErr="false" synchronizeAfterRun="true">
<exec>
<option name="COMMAND" value="bash" />
<option name="PARAMETERS" value="-c &quot;source .venv/bin/activate &amp;&amp; scons -u -j$(nproc) --compile_db --ccflags=\&quot;-fno-inline\&quot;&quot;" />
<option name="PARAMETERS" value="-c &quot;source .venv/bin/activate &amp;&amp; scons -u -j$(nproc) --ccflags=\&quot;-fno-inline\&quot;&quot;" />
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
</exec>
</tool>
@@ -16,7 +16,14 @@
<tool name="uv Scons Build Release" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="false" showConsoleOnStdErr="false" synchronizeAfterRun="true">
<exec>
<option name="COMMAND" value="bash" />
<option name="PARAMETERS" value="-c &quot;source .venv/bin/activate &amp;&amp; scons -u -j$(nproc) --compile_db&quot; " />
<option name="PARAMETERS" value="-c &quot;source .venv/bin/activate &amp;&amp; scons -u -j$(nproc)&quot; " />
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
</exec>
</tool>
<tool name="uv build tools replay" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="false" showConsoleOnStdErr="false" synchronizeAfterRun="true">
<exec>
<option name="COMMAND" value="bash" />
<option name="PARAMETERS" value="-c &quot;source .venv/bin/activate &amp;&amp; scons -u -j$(nproc) tools/replay/&quot;" />
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
</exec>
</tool>
+1 -1
View File
@@ -1,5 +1,5 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Build Debug" type="CLionExternalRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$ProjectFileDir$/selfdrive/ui" PASS_PARENT_ENVS_2="true" PROJECT_NAME="sunnypilot" TARGET_NAME="uv Scons Build Debug" CONFIG_NAME="uv Scons Build Debug" RUN_PATH="ui">
<configuration default="false" name="Build Debug" type="CLionExternalRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$ProjectFileDir$/selfdrive/ui" PASS_PARENT_ENVS_2="true" PROJECT_NAME="openpilot-special" TARGET_NAME="uv Scons Build Debug" CONFIG_NAME="uv Scons Build Debug" RUN_PATH="ui">
<envs>
<env name="QT_DBL_CLICK_DIST" value="150" />
</envs>
+27
View File
@@ -0,0 +1,27 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Debug Route Controls" type="PythonConfigurationType" factoryName="Python">
<module name="openpilot-special" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
<env name="FINGERPRINT" value="KIA_EV9" />
<env name="SKIP_FW_QUERY" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/selfdrive/car" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/selfdrive/car/card.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
</component>
+7
View File
@@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Replay for controls + ui" type="Multirun" separateTabs="false" reuseTabsWithFailures="false" startOneByOne="true" markFailedProcess="true" hideSuccessProcess="false" delayTime="0.0">
<runConfiguration name="replay for controls" type="Native Application" />
<runConfiguration name="Build Debug" type="Custom Build Application" />
<method v="2" />
</configuration>
</component>
+7
View File
@@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="replay for controls" type="CLionNativeAppRunConfigurationType" focusToolWindowBeforeRun="true" PROGRAM_PARAMS="&quot;$Prompt$&quot; --block &quot;sendcan,carState,carParams,carOutput,liveTracks,carParamsSP,carStateSP&quot;" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="true" WORKING_DIR="file://$ProjectFileDir$/tools/replay" PASS_PARENT_ENVS_2="true" PROJECT_NAME="openpilot-special" TARGET_NAME="replay" CONFIG_NAME="replay" version="1" RUN_PATH="replay">
<method v="2">
<option name="CLION.COMPOUND.BUILD" enabled="true" />
</method>
</configuration>
</component>
+23 -9
View File
@@ -5,8 +5,8 @@
inline static std::unordered_map<std::string, uint32_t> keys = {
{"AccessToken", CLEAR_ON_MANAGER_START | DONT_LOG},
{"AdbEnabled", PERSISTENT},
{"AlwaysOnDM", PERSISTENT},
{"AdbEnabled", PERSISTENT | BACKUP},
{"AlwaysOnDM", PERSISTENT | BACKUP},
{"ApiCache_Device", PERSISTENT},
{"ApiCache_FirehoseStats", PERSISTENT},
{"AssistNowToken", PERSISTENT},
@@ -78,7 +78,7 @@ inline static std::unordered_map<std::string, uint32_t> keys = {
{"LocationFilterInitialState", PERSISTENT},
{"LongitudinalManeuverMode", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
{"LongitudinalPersonality", PERSISTENT | BACKUP},
{"NetworkMetered", PERSISTENT},
{"NetworkMetered", PERSISTENT | BACKUP},
{"ObdMultiplexingChanged", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
{"ObdMultiplexingEnabled", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
{"Offroad_BadNvme", CLEAR_ON_MANAGER_START},
@@ -124,25 +124,29 @@ inline static std::unordered_map<std::string, uint32_t> keys = {
// --- sunnypilot params --- //
{"ApiCache_DriveStats", PERSISTENT},
{"AutoLaneChangeBsmDelay", PERSISTENT},
{"AutoLaneChangeTimer", PERSISTENT},
{"AutoLaneChangeBsmDelay", PERSISTENT | BACKUP},
{"AutoLaneChangeTimer", PERSISTENT | BACKUP},
{"BlinkerMinLateralControlSpeed", PERSISTENT | BACKUP},
{"BlinkerPauseLateralControl", PERSISTENT | BACKUP},
{"Brightness", PERSISTENT | BACKUP},
{"CarParamsSP", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
{"CarParamsSPCache", CLEAR_ON_MANAGER_START},
{"CarParamsSPPersistent", PERSISTENT},
{"CarPlatformBundle", PERSISTENT},
{"CarPlatformBundle", PERSISTENT | BACKUP},
{"ChevronInfo", PERSISTENT | BACKUP},
{"CustomAccIncrementsEnabled", PERSISTENT | BACKUP},
{"CustomAccLongPressIncrement", PERSISTENT | BACKUP},
{"CustomAccShortPressIncrement", PERSISTENT | BACKUP},
{"DeviceBootMode", PERSISTENT | BACKUP},
{"EnableGithubRunner", PERSISTENT | BACKUP},
{"InteractivityTimeout", PERSISTENT | BACKUP},
{"IsDevelopmentBranch", CLEAR_ON_MANAGER_START},
{"MaxTimeOffroad", PERSISTENT | BACKUP},
{"Brightness", PERSISTENT | BACKUP},
{"ModelRunnerTypeCache", CLEAR_ON_ONROAD_TRANSITION},
{"OffroadMode", CLEAR_ON_MANAGER_START},
{"QuickBootToggle", PERSISTENT | BACKUP},
{"QuietMode", PERSISTENT | BACKUP},
{"ShowAdvancedControls", PERSISTENT | BACKUP},
// MADS params
{"Mads", PERSISTENT | BACKUP},
@@ -152,6 +156,7 @@ inline static std::unordered_map<std::string, uint32_t> keys = {
// Model Manager params
{"ModelManager_ActiveBundle", PERSISTENT},
{"ModelManager_ClearCache", CLEAR_ON_MANAGER_START},
{"ModelManager_DownloadIndex", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
{"ModelManager_LastSyncTime", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
{"ModelManager_ModelsCache", PERSISTENT | BACKUP},
@@ -173,9 +178,9 @@ inline static std::unordered_map<std::string, uint32_t> keys = {
{"BackupManager_RestoreVersion", PERSISTENT},
// sunnypilot car specific params
{"HyundaiLongitudinalTuning", PERSISTENT},
{"HyundaiLongitudinalTuning", PERSISTENT | BACKUP},
{"DynamicExperimentalControl", PERSISTENT},
{"DynamicExperimentalControl", PERSISTENT | BACKUP},
{"BlindSpot", PERSISTENT | BACKUP},
// model panel params
@@ -202,4 +207,13 @@ inline static std::unordered_map<std::string, uint32_t> keys = {
{"OsmStateTitle", PERSISTENT},
{"OsmWayTest", PERSISTENT},
{"RoadName", CLEAR_ON_ONROAD_TRANSITION},
// Tuning keys
{"EnableHkgTuningAngleSmoothingFactor", PERSISTENT | BACKUP},
{"HkgTuningAngleMinTorqueReductionGain", PERSISTENT | BACKUP},
{"HkgTuningAngleMaxTorqueReductionGain", PERSISTENT | BACKUP},
{"HkgTuningAngleActiveTorqueReductionGain", PERSISTENT | BACKUP},
{"HkgTuningOverridingCycles", PERSISTENT | BACKUP},
{"HkgAngleLiveTuning", CLEAR_ON_MANAGER_START}
};
+9 -2
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.
# 312 Supported Cars
# 319 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|
|---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
@@ -116,6 +116,7 @@ A supported vehicle is one that just works when you install a comma device. All
|Hyundai|Ioniq Plug-in Hybrid 2019|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai C 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.html?make=Hyundai&model=Ioniq Plug-in Hybrid 2019">Buy Here</a></sub></details>|||
|Hyundai|Ioniq Plug-in Hybrid 2020-22|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 Hyundai H 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.html?make=Hyundai&model=Ioniq Plug-in Hybrid 2020-22">Buy Here</a></sub></details>|||
|Hyundai|Kona 2020|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 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.html?make=Hyundai&model=Kona 2020">Buy Here</a></sub></details>|||
|Hyundai|Kona 2022|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 O 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.html?make=Hyundai&model=Kona 2022">Buy Here</a></sub></details>|||
|Hyundai|Kona Electric 2018-21|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 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.html?make=Hyundai&model=Kona Electric 2018-21">Buy Here</a></sub></details>|||
|Hyundai|Kona Electric 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 O 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.html?make=Hyundai&model=Kona Electric 2022-23">Buy Here</a></sub></details>|||
|Hyundai|Kona Electric (with HDA II, Korea only) 2023[<sup>6</sup>](#footnotes)|Smart Cruise Control (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 R 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.html?make=Hyundai&model=Kona Electric (with HDA II, Korea only) 2023">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=U2fOCmcQ8hw" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>||
@@ -211,7 +212,9 @@ A supported vehicle is one that just works when you install a comma device. All
|Nissan[<sup>7</sup>](#footnotes)|Leaf 2018-23|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Nissan 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.html?make=Nissan&model=Leaf 2018-23">Buy Here</a></sub></details>|<a href="https://youtu.be/vaMbtAh_0cY" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>||
|Nissan[<sup>7</sup>](#footnotes)|Rogue 2018-20|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Nissan 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.html?make=Nissan&model=Rogue 2018-20">Buy Here</a></sub></details>|||
|Nissan[<sup>7</sup>](#footnotes)|X-Trail 2017|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Nissan 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.html?make=Nissan&model=X-Trail 2017">Buy Here</a></sub></details>|||
|Ram|1500 2019-24|Adaptive Cruise Control (ACC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ram 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.html?make=Ram&model=1500 2019-24">Buy Here</a></sub></details>|||
|Ram|1500 2019-24|Adaptive Cruise Control (ACC)|Stock|32 mph|1 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ram 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.html?make=Ram&model=1500 2019-24">Buy Here</a></sub></details>|||
|Ram|2500 2020-24|Adaptive Cruise Control (ACC)|Stock|0 mph|36 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ram 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.html?make=Ram&model=2500 2020-24">Buy Here</a></sub></details>|||
|Ram|3500 2019-22|Adaptive Cruise Control (ACC)|Stock|0 mph|36 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ram 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.html?make=Ram&model=3500 2019-22">Buy Here</a></sub></details>|||
|Rivian|R1S 2022-24|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Rivian A connector<br>- 1 USB-C coupler<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Rivian&model=R1S 2022-24">Buy Here</a></sub></details>||https://youtu.be/uaISd1j7Z4U|
|Rivian|R1T 2022-24|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Rivian A connector<br>- 1 USB-C coupler<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Rivian&model=R1T 2022-24">Buy Here</a></sub></details>||https://youtu.be/uaISd1j7Z4U|
|SEAT|Ateca 2016-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 USB-C coupler<br>- 1 VW J533 connector<br>- 1 comma 3X<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.html?make=SEAT&model=Ateca 2016-23">Buy Here</a></sub></details>|||
@@ -219,10 +222,14 @@ A supported vehicle is one that just works when you install a comma device. All
|Subaru|Ascent 2019-21|All[<sup>8</sup>](#footnotes)|openpilot available[<sup>1,9</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Ascent 2019-21">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|Crosstrek 2018-19|EyeSight Driver Assistance[<sup>8</sup>](#footnotes)|openpilot available[<sup>1,9</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Crosstrek 2018-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|<a href="https://youtu.be/Agww7oE1k-s?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>||
|Subaru|Crosstrek 2020-23|EyeSight Driver Assistance[<sup>8</sup>](#footnotes)|openpilot available[<sup>1,9</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Crosstrek 2020-23">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|Forester 2017-18|EyeSight Driver Assistance[<sup>8</sup>](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Forester 2017-18">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|Forester 2019-21|All[<sup>8</sup>](#footnotes)|openpilot available[<sup>1,9</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Forester 2019-21">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|Impreza 2017-19|EyeSight Driver Assistance[<sup>8</sup>](#footnotes)|openpilot available[<sup>1,9</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Impreza 2017-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|Impreza 2020-22|EyeSight Driver Assistance[<sup>8</sup>](#footnotes)|openpilot available[<sup>1,9</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Impreza 2020-22">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|Legacy 2015-18|EyeSight Driver Assistance[<sup>8</sup>](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Legacy 2015-18">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|Legacy 2020-22|All[<sup>8</sup>](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Legacy 2020-22">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|Outback 2015-17|EyeSight Driver Assistance[<sup>8</sup>](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Outback 2015-17">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|Outback 2018-19|EyeSight Driver Assistance[<sup>8</sup>](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Outback 2018-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|Outback 2020-22|All[<sup>8</sup>](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=Outback 2020-22">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|Subaru|XV 2018-19|EyeSight Driver Assistance[<sup>8</sup>](#footnotes)|openpilot available[<sup>1,9</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=XV 2018-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|<a href="https://youtu.be/Agww7oE1k-s?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>||
|Subaru|XV 2020-21|EyeSight Driver Assistance[<sup>8</sup>](#footnotes)|openpilot available[<sup>1,9</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Subaru 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.html?make=Subaru&model=XV 2020-21">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
+1 -1
Submodule panda updated: c33cfa0803...ff4733f958
+1 -2
View File
@@ -59,7 +59,7 @@ dependencies = [
"future-fstrings",
# joystickd
"inputs",
"pygame",
# these should be removed
"psutil",
@@ -108,7 +108,6 @@ dev = [
"opencv-python-headless",
"parameterized >=0.8, <0.9",
"pyautogui",
"pygame",
"pyopencl; platform_machine != 'aarch64'", # broken on arm64
"pytools < 2024.1.11; platform_machine != 'aarch64'", # pyopencl use a broken version
"pywinctl",
+27 -12
View File
@@ -13,17 +13,32 @@ def create_short_name(full_name):
words = [re.sub(r'[^a-zA-Z0-9]', '', word) for word in clean_name.split() if re.sub(r'[^a-zA-Z0-9]', '', word)]
if len(words) == 1:
# If there's only one word, return it as is, lowercased, truncated to 8 characters
truncated = words[0][:8]
return truncated.lower() if truncated.isupper() else truncated
return words[0][:8].upper()
# Handle special case: Name + Version (e.g., "Word A1" -> "WordA1")
if len(words) == 2 and re.match(r'^[A-Za-z]\d+$', words[1]):
first_word = words[0].lower() if words[0].isupper() else words[0]
return (first_word + words[1])[:8]
return (words[0] + words[1])[:8].upper()
# Normal case: first letter and trailing numbers from each word
result = ''.join(word if word.isdigit() else word[0] + (re.search(r'\d+$', word) or [''])[0] for word in words)
result = ""
for word in words:
# Version or number patterns
if (re.match(r'^\d+[a-zA-Z]+$', word) or
re.match(r'^\d+[vVbB]\d+$', word) or
re.match(r'^[vVbB]\d+$', word) or
re.match(r'^\d{4}$', word)):
result += word.upper()
# All uppercase abbreviations (2-3 letters)
elif re.match(r'^[A-Z]{2,3}$', word):
result += word
# Letters+digits (for example tr15 rev2)
elif re.match(r'^[a-zA-Z]+[0-9]+$', word):
result += word[0].upper() + ''.join(re.findall(r'\d+', word))
elif word.isalpha():
result += word[0].upper()
elif word.isdigit():
result += word
else:
result += word[0].upper()
return result[:8]
@@ -58,14 +73,14 @@ def generate_metadata(model_path: Path, output_dir: Path, short_name: str):
"artifact": {
"file_name": tinygrad_file.name,
"download_uri": {
"url": "https://gitlab.com/sunnypilot/public/docs.sunnypilot.ai/-/raw/main/<FILLME>",
"url": "https://gitlab.com/sunnypilot/public/docs.sunnypilot.ai/-/raw/main/",
"sha256": tinygrad_hash
}
},
"metadata": {
"file_name": metadata_file.name,
"download_uri": {
"url": "https://gitlab.com/sunnypilot/public/docs.sunnypilot.ai/-/raw/main/<FILLME>",
"url": "https://gitlab.com/sunnypilot/public/docs.sunnypilot.ai/-/raw/main/",
"sha256": metadata_hash
}
}
@@ -83,12 +98,12 @@ def create_metadata_json(models: list, output_dir: Path, custom_name=None, short
"ref": upstream_branch,
"environment": "development",
"runner": "tinygrad",
"build_time": datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%SZ"),
"models": models,
"overrides": {},
"index": -1,
"minimum_selector_version": "-1",
"generation": "-1",
"build_time": datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%SZ"),
"overrides": {},
"models": models,
}
# Write metadata to output_dir
+1 -1
View File
@@ -13,7 +13,7 @@ cd $ROOT
FAILED=0
IGNORED_FILES="uv\.lock|docs\/CARS.md|LICENSE\.md"
IGNORED_FILES="uv\.lock|docs\/CARS.md|LICENSE\.md|layouts\/.*\.xml"
IGNORED_DIRS="^third_party.*|^msgq.*|^msgq_repo.*|^opendbc.*|^opendbc_repo.*|^cereal.*|^panda.*|^rednose.*|^rednose_repo.*|^tinygrad.*|^tinygrad_repo.*|^teleoprtc.*|^teleoprtc_repo.*"
function run() {
+4 -1
View File
@@ -17,6 +17,7 @@ from openpilot.selfdrive.controls.lib.drive_helpers import clip_curvature
from openpilot.selfdrive.controls.lib.latcontrol import LatControl
from openpilot.selfdrive.controls.lib.latcontrol_pid import LatControlPID
from openpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle, STEER_ANGLE_SATURATION_THRESHOLD
from openpilot.selfdrive.controls.lib.latcontrol_angle_torque import LatControlAngleTorque
from openpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque
from openpilot.selfdrive.controls.lib.longcontrol import LongControl
from openpilot.selfdrive.locationd.helpers import PoseCalibrator, Pose
@@ -58,7 +59,9 @@ class Controls(ControlsExt):
self.LoC = LongControl(self.CP)
self.VM = VehicleModel(self.CP)
self.LaC: LatControl
if self.CP.steerControlType == car.CarParams.SteerControlType.angle:
if self.CP.steerControlType == car.CarParams.SteerControlType.angle and self.CP.lateralTuning.which() == 'torque':
self.LaC = LatControlAngleTorque(self.CP, self.CP_SP, self.CI)
elif self.CP.steerControlType == car.CarParams.SteerControlType.angle:
self.LaC = LatControlAngle(self.CP, self.CP_SP, self.CI)
elif self.CP.lateralTuning.which() == 'pid':
self.LaC = LatControlPID(self.CP, self.CP_SP, self.CI)
@@ -0,0 +1,13 @@
from openpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque
from openpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle
class LatControlAngleTorque(LatControlTorque, LatControlAngle):
def __init__(self, CP, CP_SP, CI):
LatControlTorque.__init__(self, CP, CP_SP, CI)
LatControlAngle.__init__(self, CP, CP_SP, CI)
def update(self, active, CS, VM, params, steer_limited_by_controls, desired_curvature, calibrated_pose, curvature_limited):
torque, _, _ = LatControlTorque.update(self, active, CS, VM, params, steer_limited_by_controls, desired_curvature, calibrated_pose, curvature_limited)
_, angle, angle_log = LatControlAngle.update(self, active, CS, VM, params, steer_limited_by_controls, desired_curvature, calibrated_pose, curvature_limited)
return torque, angle, angle_log
+1 -1
View File
@@ -90,7 +90,7 @@ class ModelState:
prev_desire: np.ndarray # for tracking the rising edge of the pulse
def __init__(self, context: CLContext):
self.LAT_SMOOTH_SECONDS = 0.0
self.LAT_SMOOTH_SECONDS = LAT_SMOOTH_SECONDS
with open(VISION_METADATA_PATH, 'rb') as f:
vision_metadata = pickle.load(f)
self.vision_input_shapes = vision_metadata['input_shapes']
+2 -1
View File
@@ -135,7 +135,8 @@ class SelfdriveD(CruiseHelper):
self.ignored_processes.update({'mapd'})
# Determine startup event
self.startup_event = EventName.startup if build_metadata.openpilot.comma_remote and build_metadata.tested_channel else EventName.startupMaster
is_remote = build_metadata.openpilot.comma_remote or build_metadata.openpilot.sunnypilot_remote
self.startup_event = EventName.startup if is_remote and build_metadata.tested_channel else EventName.startupMaster
if not car_recognized:
self.startup_event = EventName.startupNoCar
elif car_recognized and self.CP.passive:
@@ -45,17 +45,6 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : ListWidget(parent) {
});
addItem(experimentalLongitudinalToggle);
enableGithubRunner = new ParamControl("EnableGithubRunner", tr("Enable GitHub runner service"), tr("Enables or disables the github runner service."), "");
addItem(enableGithubRunner);
// error log button
errorLogBtn = new ButtonControl(tr("Error Log"), tr("VIEW"), tr("View the error log for sunnypilot crashes."));
connect(errorLogBtn, &ButtonControl::clicked, [=]() {
std::string txt = util::read_file("/data/community/crashes/error.log");
ConfirmationDialog::rich(QString::fromStdString(txt), this);
});
addItem(errorLogBtn);
// Joystick and longitudinal maneuvers should be hidden on release branches
is_release = params.getBool("IsReleaseBranch");
@@ -104,8 +93,6 @@ void DeveloperPanel::updateToggles(bool _offroad) {
experimentalLongitudinalToggle->refresh();
// Handle specific controls visibility for release branches
enableGithubRunner->setVisible(!is_release);
errorLogBtn->setVisible(!is_release);
joystickToggle->setVisible(!is_release);
offroad = _offroad;
@@ -16,10 +16,8 @@ private:
Params params;
ParamControl* adbToggle;
ParamControl* joystickToggle;
ButtonControl* errorLogBtn;
ParamControl* longManeuverToggle;
ParamControl* experimentalLongitudinalToggle;
ParamControl* enableGithubRunner;
bool is_release;
bool offroad = false;
+168
View File
@@ -34,6 +34,7 @@ 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();
}
@@ -173,6 +174,173 @@ QColor ModelRenderer::blendColors(const QColor &start, const QColor &end, float
(1 - t) * start.alphaF() + t * end.alphaF());
}
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.;
+11
View File
@@ -34,6 +34,12 @@ 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);
@@ -58,4 +64,9 @@ protected:
QPointF lead_vertices[2] = {};
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;
};
+139
View File
@@ -2,6 +2,7 @@
#include <QPushButton>
#include <QButtonGroup>
#include <QScroller>
#include "system/hardware/hw.h"
#include "selfdrive/ui/qt/util.h"
@@ -334,3 +335,141 @@ QString MultiOptionDialog::getSelection(const QString &prompt_text, const QStrin
}
return "";
}
TreeOptionDialog::TreeOptionDialog(const QString &prompt_text, const QList<QPair<QString, QStringList>> &items,
const QString &current, QWidget *parent) : DialogBase(parent) {
QFrame *container = new QFrame(this);
container->setStyleSheet(R"(
QFrame { background-color: #1B1B1B; }
#confirm_btn[enabled="false"] { background-color: #2B2B2B; }
#confirm_btn:enabled { background-color: #465BEA; }
#confirm_btn:enabled:pressed { background-color: #3049F4; }
QTreeWidget {
background-color: transparent;
border: none;
}
QTreeWidget::item {
height: 135;
padding: 0px 50px;
margin: 5px;
text-align: left;
font-size: 55px;
font-weight: 300;
border-radius: 10px;
background-color: #4F4F4F;
color: white;
}
QTreeWidget::item:selected {
background-color: #465BEA;
}
QTreeWidget::branch {
background-color: transparent;
}
)");
QVBoxLayout *main_layout = new QVBoxLayout(container);
main_layout->setContentsMargins(55, 50, 55, 50);
QLabel *title = new QLabel(prompt_text, this);
title->setStyleSheet("font-size: 70px; font-weight: 500;");
main_layout->addWidget(title, 0, Qt::AlignLeft | Qt::AlignTop);
main_layout->addSpacing(25);
treeWidget = new QTreeWidget(this);
treeWidget->setHeaderHidden(true);
treeWidget->setIndentation(50);
treeWidget->setExpandsOnDoubleClick(false); // Disable double-click expansion
treeWidget->setAnimated(true);
treeWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
treeWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
treeWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
treeWidget->setDragEnabled(false);
treeWidget->setMouseTracking(true);
// Connect single-click to expand/collapse
QObject::connect(treeWidget, &QTreeWidget::itemClicked, [=](QTreeWidgetItem *item, int) {
if (item->childCount() > 0) {
item->setExpanded(!item->isExpanded());
treeWidget->scrollToItem(item->child(0), QAbstractItemView::EnsureVisible);
}
});
QScroller::grabGesture(treeWidget->viewport(), QScroller::LeftMouseButtonGesture);
// Populate tree
QListIterator<QPair<QString, QStringList>> iter(items);
while (iter.hasNext()) {
QPair currItem = iter.next();
if (currItem.first.isEmpty()) {
for (const QString &item : currItem.second) {
QTreeWidgetItem *topLevel = new QTreeWidgetItem();
topLevel->setText(0, item);
topLevel->setFlags(topLevel->flags() | Qt::ItemIsSelectable);
treeWidget->addTopLevelItem(topLevel);
if (item == current) {
topLevel->setSelected(true);
}
}
} else {
QTreeWidgetItem *folderItem = new QTreeWidgetItem(treeWidget);
folderItem->setIcon(0, QIcon(QPixmap("../assets/icons/menu.png")));
folderItem->setText(0, " " + currItem.first);
folderItem->setFlags(folderItem->flags() | Qt::ItemIsAutoTristate);
folderItem->setFlags(folderItem->flags() & ~Qt::ItemIsSelectable);
for (const QString &item : currItem.second)
{
QTreeWidgetItem *childItem = new QTreeWidgetItem(folderItem);
childItem->setText(0, item);
childItem->setFlags(childItem->flags() | Qt::ItemIsSelectable);
if (item == current) {
childItem->setSelected(true);
folderItem->setExpanded(true);
}
}
}
}
confirm_btn = new QPushButton(tr("Select"));
confirm_btn->setObjectName("confirm_btn");
confirm_btn->setEnabled(false);
QObject::connect(treeWidget, &QTreeWidget::itemSelectionChanged, [=]() {
QList<QTreeWidgetItem*> selectedItems = treeWidget->selectedItems();
if (!selectedItems.isEmpty()) {
selection = selectedItems.first()->text(0);
confirm_btn->setEnabled(selection != current);
}
});
ScrollView *scroll_view = new ScrollView(treeWidget, this);
scroll_view->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
main_layout->addWidget(scroll_view);
main_layout->addSpacing(35);
// cancel + confirm buttons
QHBoxLayout *blayout = new QHBoxLayout;
main_layout->addLayout(blayout);
blayout->setSpacing(50);
QPushButton *cancel_btn = new QPushButton(tr("Cancel"));
QObject::connect(cancel_btn, &QPushButton::clicked, this, &ConfirmationDialog::reject);
QObject::connect(confirm_btn, &QPushButton::clicked, this, &ConfirmationDialog::accept);
blayout->addWidget(cancel_btn);
blayout->addWidget(confirm_btn);
QVBoxLayout *outer_layout = new QVBoxLayout(this);
outer_layout->setContentsMargins(50, 50, 50, 50);
outer_layout->addWidget(container);
}
QString TreeOptionDialog::getSelection(const QString &prompt_text, const QList<QPair<QString, QStringList>> &items,
const QString &current, QWidget *parent) {
TreeOptionDialog d(prompt_text, items, current, parent);
if (d.exec()) {
return d.selection;
}
return "";
}
+14
View File
@@ -6,6 +6,7 @@
#include <QString>
#include <QVBoxLayout>
#include <QWidget>
#include <QTreeWidget>
#include "selfdrive/ui/qt/widgets/keyboard.h"
@@ -69,3 +70,16 @@ public:
static QString getSelection(const QString &prompt_text, const QStringList &l, const QString &current, QWidget *parent);
QString selection;
};
class TreeOptionDialog : public DialogBase {
Q_OBJECT
public:
explicit TreeOptionDialog(const QString &prompt_text, const QList<QPair<QString, QStringList>> &items, const QString &current, QWidget *parent = nullptr);
static QString getSelection(const QString &prompt_text, const QList<QPair<QString, QStringList>> &items, const QString &current, QWidget *parent = nullptr);
QString selection;
private:
QTreeWidget *treeWidget;
QPushButton *confirm_btn;
};
+3
View File
@@ -4,6 +4,7 @@ widgets_src = [
"sunnypilot/qt/widgets/controls.cc",
"sunnypilot/qt/widgets/drive_stats.cc",
"sunnypilot/qt/widgets/expandable_row.cc",
"sunnypilot/qt/widgets/external_storage.cc",
"sunnypilot/qt/widgets/prime.cc",
"sunnypilot/qt/widgets/scrollview.cc",
"sunnypilot/qt/network/networking.cc",
@@ -21,6 +22,7 @@ qt_src = [
"sunnypilot/qt/home.cc",
"sunnypilot/qt/offroad/exit_offroad_button.cc",
"sunnypilot/qt/offroad/offroad_home.cc",
"sunnypilot/qt/offroad/settings/developer_panel.cc",
"sunnypilot/qt/offroad/settings/device_panel.cc",
"sunnypilot/qt/offroad/settings/lateral_panel.cc",
"sunnypilot/qt/offroad/settings/longitudinal_panel.cc",
@@ -46,6 +48,7 @@ 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/mads_settings.cc",
"sunnypilot/qt/offroad/settings/lateral/angle_tuning_settings.cc",
"sunnypilot/qt/offroad/settings/lateral/neural_network_lateral_control.cc",
]
@@ -0,0 +1,85 @@
/**
* 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/developer_panel.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/external_storage.h"
DeveloperPanelSP::DeveloperPanelSP(SettingsWindow *parent) : DeveloperPanel(parent) {
#ifndef __APPLE__
addItem(new ExternalStorageControl());
#endif
// Advanced Controls Toggle
showAdvancedControls = new ParamControlSP("ShowAdvancedControls", tr("Show Advanced Controls"), tr("Toggle visibility of advanced sunnypilot controls.\nThis only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state."), "");
addItem(showAdvancedControls);
QObject::connect(showAdvancedControls, &ParamControlSP::toggleFlipped, this, [=](bool) {
AbstractControlSP::UpdateAllAdvancedControls();
updateToggles(!uiState()->scene.started);
});
showAdvancedControls->showDescription();
// Github Runner Toggle
enableGithubRunner = new ParamControlSP("EnableGithubRunner", tr("Enable GitHub runner service"), tr("Enables or disables the github runner service."), "", this, true);
addItem(enableGithubRunner);
// Quickboot Mode Toggle
prebuiltToggle = new ParamControlSP("QuickBootToggle", tr("Enable Quickboot Mode"), tr(""), "", this, true);
addItem(prebuiltToggle);
QObject::connect(prebuiltToggle, &ParamControl::toggleFlipped, [=](bool state) {
QString prebuiltPath = "/data/openpilot/prebuilt";
state ? QFile(prebuiltPath).open(QIODevice::WriteOnly) : QFile::remove(prebuiltPath);
prebuiltToggle->refresh();
});
prebuiltToggle->setVisible(false);
// Error log button
errorLogBtn = new ButtonControlSP(tr("Error Log"), tr("VIEW"), tr("View the error log for sunnypilot crashes."));
connect(errorLogBtn, &ButtonControlSP::clicked, [=]() {
QFileInfo file("/data/community/crashes/error.log");
QString text;
if (file.exists()) {
text = "<b>" + file.lastModified().toString("dd-MMM-yyyy hh:mm:ss ").toUpper() + "</b><br><br>";
}
text += QString::fromStdString(util::read_file("/data/community/crashes/error.log"));
ConfirmationDialog::rich(text, this);
});
addItem(errorLogBtn);
QObject::connect(uiState(), &UIState::offroadTransition, this, &DeveloperPanelSP::updateToggles);
}
void DeveloperPanelSP::updateToggles(bool offroad) {
bool is_release = params.getBool("IsReleaseBranch");
bool is_tested = params.getBool("IsTestedBranch");
bool is_development = params.getBool("IsDevelopmentBranch");
bool disable_updates = params.getBool("DisableUpdates");
prebuiltToggle->setVisible(!is_release && !is_tested && !is_development);
prebuiltToggle->setEnabled(disable_updates);
params.putBool("QuickBootToggle", QFile::exists("/data/openpilot/prebuilt"));
prebuiltToggle->refresh();
prebuiltToggle->setDescription(disable_updates
? tr("When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, "
"it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. "
"<br><br><b>To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.</b>")
: tr("Quickboot mode requires updates to be disabled.<br>Enable 'Disable Updates' in the Software panel first."));
enableGithubRunner->setVisible(!is_release);
errorLogBtn->setVisible(!is_release);
showAdvancedControls->setEnabled(true);
}
void DeveloperPanelSP::showEvent(QShowEvent *event) {
DeveloperPanel::showEvent(event);
updateToggles(!uiState()->scene.started);
AbstractControlSP::UpdateAllAdvancedControls();
prebuiltToggle->showDescription();
}
@@ -0,0 +1,30 @@
/**
* 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 <QFile>
#include <QFileInfo>
#include "selfdrive/ui/qt/offroad/developer_panel.h"
class DeveloperPanelSP : public DeveloperPanel {
Q_OBJECT
public:
explicit DeveloperPanelSP(SettingsWindow *parent);
private:
ParamControlSP *enableGithubRunner;
ButtonControlSP *errorLogBtn;
ParamControlSP *prebuiltToggle;
Params params;
ParamControlSP *showAdvancedControls;
private slots:
void updateToggles(bool offroad);
protected:
void showEvent(QShowEvent *event) override;
};
@@ -212,7 +212,7 @@ void DevicePanelSP::updateState() {
QString timeoutValue = QString::fromStdString(params.get("InteractivityTimeout"));
if (timeoutValue == "0") {
interactivityTimeout->setLabel("DEFAULT");
interactivityTimeout->setLabel("Default");
} else {
interactivityTimeout->setLabel(timeoutValue + "s");
}
@@ -0,0 +1,87 @@
/**
* 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/angle_tuning_settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
AngleTunningSettings::AngleTunningSettings(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);
auto *list = new ListWidgetSP(this, false);
main_layout->addWidget(new QWidget());
enableHkgAngleSmoothingFactor = new ExpandableToggleRow("EnableHkgTuningAngleSmoothingFactor", tr("HKG Angle Smoothing Factor"), tr("Applies EMA (Exponential Moving Average) to the desired angle steering and avoid overcorrections."), "../assets/offroad/icon_blank.png");
list->addItem(enableHkgAngleSmoothingFactor);
auto first_row = new QHBoxLayout();
hkgTuningOverridingCycles = new OptionControlSP("HkgTuningOverridingCycles", tr("Override Ramp-Down Cycles"), tr("Number of cycles to ramp down the current amount of torque on the steering wheel.<br/>A smaller value means a faster override by the user (less effort)"), "../assets/offroad/icon_blank.png", {10, 30}, 1);
connect(hkgTuningOverridingCycles, &OptionControlSP::updateLabels, hkgTuningOverridingCycles, [=]() {
this->updateToggles(offroad);
});
first_row->addWidget(hkgTuningOverridingCycles);
hkgAngleMinTorque = new OptionControlSP("HkgTuningAngleMinTorqueReductionGain", tr("Override Steering Effort"), tr("Sets the steering effort percentage used when the driver is overriding lateral control.<br/>Higher values increase resistance and make the wheel feel stiffer."), "../assets/offroad/icon_blank.png", {5, 60}, 1);
connect(hkgAngleMinTorque, &OptionControlSP::updateLabels, hkgAngleMinTorque, [=]() {
this->updateToggles(offroad);
});
first_row->addWidget(hkgAngleMinTorque);
list->addItem(first_row);
auto second_row = new QHBoxLayout();
hkgAngleActiveTorque = new OptionControlSP("HkgTuningAngleActiveTorqueReductionGain", tr("Min Active Torque"), tr("Torque applied when lateral control is active but the vehicle is not turning.<br/>Used to maintain lane centering on straight paths when no user input is detected."), "../assets/offroad/icon_blank.png", {10, 100}, 1);
connect(hkgAngleActiveTorque, &OptionControlSP::updateLabels, hkgAngleActiveTorque, [=]() {
this->updateToggles(offroad);
});
second_row->addWidget(hkgAngleActiveTorque);
hkgAngleMaxTorque = new OptionControlSP("HkgTuningAngleMaxTorqueReductionGain", tr("Max Torque Allowance"), tr("Sets the maximum torque reduction percentage the controller can apply during normal lateral control.<br/>"), "../assets/offroad/icon_blank.png", {10, 100}, 1);
connect(hkgAngleMaxTorque, &OptionControlSP::updateLabels, hkgAngleMaxTorque, [=]() {
this->updateToggles(offroad);
});
second_row->addWidget(hkgAngleMaxTorque);
list->addItem(second_row);
QObject::connect(uiState(), &UIState::offroadTransition, this, &AngleTunningSettings::updateToggles);
main_layout->addWidget(new ScrollViewSP(list, this));
auto *warning = new QLabel(tr("Reboot required for settings to apply; Tap on each setting to see more details."));
warning->setStyleSheet("font-size: 30px; font-weight: 500; font-family: 'Noto Color Emoji'; color: orange;");
main_layout->addWidget(warning, 0, Qt::AlignCenter);
}
void AngleTunningSettings::showEvent(QShowEvent *event) {
updateToggles(offroad);
}
void AngleTunningSettings::updateToggles(bool _offroad) {
auto HkgAngleSmoothingFactorValue = params.getBool("EnableHkgTuningAngleSmoothingFactor");
enableHkgAngleSmoothingFactor->toggleFlipped(HkgAngleSmoothingFactorValue);
auto HkgAngleMinTorqueValue = QString::fromStdString(params.get("HkgTuningAngleMinTorqueReductionGain")).toInt();
hkgAngleMinTorque->setLabel(QString::number(HkgAngleMinTorqueValue)+"%");
auto HkgAngleActiveTorqueValue = QString::fromStdString(params.get("HkgTuningAngleActiveTorqueReductionGain")).toInt();
hkgAngleActiveTorque->setLabel(QString::number(HkgAngleActiveTorqueValue)+"%");
auto HkgAngleMaxTorqueValue = QString::fromStdString(params.get("HkgTuningAngleMaxTorqueReductionGain")).toInt();
hkgAngleMaxTorque->setLabel(QString::number(HkgAngleMaxTorqueValue)+"%");
auto HkgTuningOverridingCyclesValue = QString::fromStdString(params.get("HkgTuningOverridingCycles")).toInt();
hkgTuningOverridingCycles->setLabel(QString::number(HkgTuningOverridingCyclesValue));
offroad = _offroad;
}
@@ -0,0 +1,40 @@
/**
* 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/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/expandable_row.h"
class AngleTunningSettings : public QWidget {
Q_OBJECT
public:
explicit AngleTunningSettings(QWidget *parent = nullptr);
void showEvent(QShowEvent *event) override;
signals:
void backPress();
public slots:
void updateToggles(bool _offroad);
private:
Params params;
bool offroad;
ExpandableToggleRow* enableHkgAngleSmoothingFactor;
OptionControlSP* hkgAngleMinTorque;
OptionControlSP* hkgAngleActiveTorque;
OptionControlSP* hkgAngleMaxTorque;
OptionControlSP* hkgTuningOverridingCycles;
ParamControlSP* hkgAngleLiveTuning;
};
@@ -89,6 +89,36 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
nnlcToggle->updateToggle();
});
#pragma region hkg angle tuning
list->addItem(vertical_space());
list->addItem(horizontal_line());
list->addItem(vertical_space());
// HKG Angle Tuning
// angleTuningToggle = new ParamControl(
// "AngleTuning",
// tr("Modular Assistive Driving System (MADS)"),
// tr("Enable the beloved MADS feature. Disable toggle to revert back to stock sunnypilot engagement/disengagement."),
// "");
// angleTuningToggle->setConfirmation(true, false);
// list->addItem(angleTuningToggle);
angleTuningSettingsButton = new PushButtonSP(tr("Customize ANGLE Tuning"));
angleTuningSettingsButton->setObjectName("angle_btn");
connect(angleTuningSettingsButton, &QPushButton::clicked, [=]() {
sunnypilotScroller->setLastScrollPosition();
main_layout->setCurrentWidget(angleTuningWidget);
});
// QObject::connect(angleTuningToggle, &ToggleControl::toggleFlipped, angleTuningSettingsButton, &PushButtonSP::setEnabled);
angleTuningWidget = new AngleTunningSettings(this);
connect(angleTuningWidget, &AngleTunningSettings::backPress, [=]() {
sunnypilotScroller->restoreScrollPosition();
main_layout->setCurrentWidget(sunnypilotScreen);
});
list->addItem(angleTuningSettingsButton);
#pragma endregion
toggleOffroadOnly = {
madsToggle, nnlcToggle,
};
@@ -99,6 +129,7 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
main_layout->addWidget(sunnypilotScreen);
main_layout->addWidget(madsWidget);
main_layout->addWidget(angleTuningWidget);
main_layout->addWidget(laneChangeWidget);
setStyleSheet(R"(
@@ -149,6 +180,7 @@ void LateralPanel::updateToggles(bool _offroad) {
}
madsSettingsButton->setEnabled(madsToggle->isToggled());
// angleTuningSettingsButton->setEnabled(angleTuningToggle->isToggled());
blinkerPauseLateralSettings->refresh();
@@ -13,6 +13,7 @@
#include "selfdrive/ui/sunnypilot/ui.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/blinker_pause_lateral_settings.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/mads_settings.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/angle_tuning_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/qt/util.h"
@@ -39,8 +40,11 @@ private:
bool offroad;
ParamControl *madsToggle;
// ParamControl *angleTuningToggle;
PushButtonSP *madsSettingsButton;
PushButtonSP *angleTuningSettingsButton;
MadsSettings *madsWidget = nullptr;
AngleTunningSettings *angleTuningWidget = nullptr;
PushButtonSP *laneChangeSettingsButton;
LaneChangeSettings *laneChangeWidget = nullptr;
NeuralNetworkLateralControl *nnlcToggle = nullptr;
@@ -8,6 +8,8 @@
#include <algorithm>
#include <QJsonDocument>
#include <QStyle>
#include <QtConcurrent/QtConcurrent>
#include <QDir>
#include "common/model.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/models_panel.h"
@@ -66,6 +68,11 @@ ModelsPanel::ModelsPanel(QWidget *parent) : QWidget(parent) {
connect(uiStateSP(), &UIStateSP::uiUpdate, this, &ModelsPanel::updateLabels);
list->addItem(currentModelLblBtn);
clearModelCacheBtn = new ButtonControlSP(tr("Clear Model Cache"), tr("CLEAR"), "", this);
connect(clearModelCacheBtn, &ButtonControlSP::clicked, this, &ModelsPanel::clearModelCache);
list->addItem(clearModelCacheBtn);
// Create progress bars for downloads
supercomboProgressBar = createProgressBar(this);
QString supercomboType = tr("Driving Model");
@@ -98,7 +105,7 @@ ModelsPanel::ModelsPanel(QWidget *parent) : QWidget(parent) {
delay_control = new OptionControlSP("LagdToggledelay", tr("Adjust Software Delay"),
tr("Adjust the software delay when Live Learning Steer Delay is toggled off."
"\nThe default software delay value is 0.2"),
"", {10, 30}, 1, false, nullptr, true);
"", {5, 30}, 1, false, nullptr, true, true);
connect(delay_control, &OptionControlSP::updateLabels, [=]() {
float value = QString::fromStdString(params.get("LagdToggledelay")).toFloat();
@@ -244,28 +251,73 @@ void ModelsPanel::handleCurrentModelLblBtnClicked() {
currentModelLblBtn->setEnabled(false);
currentModelLblBtn->setValue(tr("Fetching models..."));
// Create mapping of bundle indices to display names
QMap<uint32_t, QString> index_to_bundle;
struct ModelEntry {
QString folder;
QString displayName;
int index;
};
QList<ModelEntry> sortedModels;
QSet<QString> modelFolders;
const auto bundles = model_manager.getAvailableBundles();
for (const auto &bundle: bundles) {
index_to_bundle.insert(bundle.getIndex(), QString::fromStdString(bundle.getDisplayName()));
for (const auto &bundle : bundles) {
auto overrides = bundle.getOverrides();
QString gen;
for (const auto &override : overrides) {
if (override.getKey() == "folder") {
gen = QString::fromStdString(override.getValue().cStr());
}
}
modelFolders.insert(gen);
sortedModels.append(ModelEntry{
gen,
QString::fromStdString(bundle.getDisplayName()),
static_cast<int>(bundle.getIndex())
});
}
// Sort bundles by index in descending order
QStringList bundleNames;
// Add "Default" as the first option
bundleNames.append(DEFAULT_MODEL);
std::sort(sortedModels.begin(), sortedModels.end(),
[](const ModelEntry &a, const ModelEntry &b) {
return a.index > b.index;
});
auto indices = index_to_bundle.keys();
std::sort(indices.begin(), indices.end(), std::greater<uint32_t>());
for (const auto &index: indices) {
bundleNames.append(index_to_bundle[index]);
// Create a list of folder-maxIndex pairs for sorting
QList<QPair<QString, int>> folderMaxIndices;
for (const auto &folder : modelFolders) {
int maxIndex = -1;
for (const auto &model : sortedModels) {
if (model.folder == folder) {
maxIndex = std::max(maxIndex, model.index);
}
}
folderMaxIndices.append(qMakePair(folder, maxIndex));
}
// Sort folders by their highest model index
std::sort(folderMaxIndices.begin(), folderMaxIndices.end(),
[](const QPair<QString, int> &a, const QPair<QString, int> &b) {
return a.second > b.second;
});
// Create the final items list using sorted folders
QList<QPair<QString, QStringList>> items;
for (const auto &folderPair : folderMaxIndices) {
QStringList folderModels;
for (const auto &model : sortedModels) {
if (model.folder == folderPair.first) {
folderModels.append(model.displayName);
}
}
items.append(qMakePair(folderPair.first, folderModels));
}
items.insert(0, qMakePair(QString(""), QStringList{DEFAULT_MODEL}));
currentModelLblBtn->setValue(GetActiveModelInternalName());
const QString selectedBundleName = MultiOptionDialog::getSelection(
tr("Select a Model"), bundleNames, GetActiveModelName(), this);
const QString selectedBundleName = TreeOptionDialog::getSelection(
tr("Select a Model"), items, GetActiveModelName(), this);
if (selectedBundleName.isEmpty() || !canContinueOnMeteredDialog()) {
return;
@@ -314,14 +366,14 @@ void ModelsPanel::updateLabels() {
desc += "<br><br><b><span style=\"color:#e0e0e0\">" + tr("Current:") + "</span></b> <span style=\"color:#e0e0e0\">" + current + "</span>";
}
lagd_toggle_control->setDescription(desc);
lagd_toggle_control->showDescription();
delay_control->setVisible(!params.getBool("LagdToggle"));
if (delay_control->isVisible()) {
float value = QString::fromStdString(params.get("LagdToggledelay")).toFloat();
delay_control->setLabel(QString::number(value, 'f', 2) + "s");
delay_control->showDescription();
}
clearModelCacheBtn->setValue(QString::number(calculateCacheSize(), 'f', 2) + " MB");
}
/**
@@ -342,3 +394,39 @@ void ModelsPanel::showResetParamsDialog() {
params.remove("LiveTorqueParameters");
}
}
void ModelsPanel::clearModelCache() {
QString confirmMsg = tr("This will delete ALL downloaded models from the cache"
"<br/><u>except the currently active model</u>."
"<br/><br/>Are you sure you want to continue?");
QString content("<body><h2 style=\"text-align: center;\">" + tr("Driving Model Selector") + "</h2><br>"
"<p style=\"text-align: center; margin: 0 128px; font-size: 50px;\">" + confirmMsg + "</p></body>");
if (showConfirmationDialog(
content,
tr("Clear Cache"))) {
params.putBool("ModelManager_ClearCache", true);
}
}
double ModelsPanel::calculateCacheSize() {
QFuture<qint64> future_ModelCacheSize = QtConcurrent::run([=]() {
QDir model_dir(QString::fromStdString(Path::model_root()));
QFileInfoList model_files = model_dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot);
qint64 totalSize = 0;
for (const QFileInfo &model_file : model_files) {
if (model_file.isFile()) {
totalSize += model_file.size();
}
}
return totalSize;
});
return static_cast<double>(future_ModelCacheSize) / (1024.0 * 1024.0);
}
void ModelsPanel::showEvent(QShowEvent *event) {
lagd_toggle_control->showDescription();
if (delay_control->isVisible()) {
delay_control->showDescription();
}
}
@@ -21,6 +21,7 @@ private:
QString GetActiveModelName();
QString GetActiveModelInternalName();
void updateModelManagerState();
void showEvent(QShowEvent *event) override;
bool isDownloading() const {
if (!model_manager.hasSelectedBundle()) {
@@ -41,6 +42,8 @@ private:
cereal::ModelManagerSP::Reader model_manager;
cereal::ModelManagerSP::DownloadStatus download_status{};
cereal::ModelManagerSP::DownloadStatus prev_download_status{};
void clearModelCache();
double calculateCacheSize();
bool canContinueOnMeteredDialog() {
if (!is_metered) return true;
@@ -75,5 +78,6 @@ private:
QProgressBar *policyProgressBar;
QFrame *policyFrame;
Params params;
ButtonControlSP *clearModelCacheBtn;
};
@@ -8,10 +8,10 @@
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
#include "selfdrive/ui/qt/offroad/developer_panel.h"
#include "selfdrive/ui/qt/offroad/firehose.h"
#include "selfdrive/ui/sunnypilot/qt/network/networking.h"
#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/models_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.h"
@@ -91,7 +91,7 @@ SettingsWindowSP::SettingsWindowSP(QWidget *parent) : SettingsWindow(parent) {
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"),
PanelInfo(" " + tr("Firehose"), new FirehosePanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_firehose.svg"),
PanelInfo(" " + tr("Developer"), new DeveloperPanel(this), "../assets/icons/shell.png"),
PanelInfo(" " + tr("Developer"), new DeveloperPanelSP(this), "../assets/icons/shell.png"),
};
nav_btns = new QButtonGroup(this);
@@ -18,6 +18,18 @@ SoftwarePanelSP::SoftwarePanelSP(QWidget *parent) : SoftwarePanel(parent) {
searchBranches(d.text());
}
});
// Disable Updates toggle
disableUpdatesToggle = new ParamControl("DisableUpdates",
tr("Disable Updates"),
tr("When enabled, software updates will be disabled. <b>This requires a reboot to take effect.</b>"),
"../assets/icons/icon_warning.png",
this, true);
disableUpdatesToggle->showDescription();
addItem(disableUpdatesToggle);
connect(disableUpdatesToggle, &ParamControl::toggleFlipped, this, &SoftwarePanelSP::handleDisableUpdatesToggled);
connect(uiState(), &UIState::offroadTransition, this, &SoftwarePanelSP::updateDisableUpdatesToggle);
updateDisableUpdatesToggle(!uiState()->scene.started);
}
/**
@@ -49,3 +61,27 @@ void SoftwarePanelSP::searchBranches(const QString &query) {
checkForUpdates();
}
}
void SoftwarePanelSP::handleDisableUpdatesToggled(bool state) {
if (ConfirmationDialog::confirm(tr("%1 updates requires a reboot.<br>Reboot now?")
.arg(state ? "Disabling" : "Enabling"), tr("Reboot"), this)) {
params.putBool("DoReboot", true);
} else {
params.putBool("DisableUpdates", !state);
disableUpdatesToggle->refresh();
}
}
void SoftwarePanelSP::updateDisableUpdatesToggle(bool offroad) {
bool enabled = offroad;
disableUpdatesToggle->setEnabled(enabled);
disableUpdatesToggle->setDescription(enabled
? tr("When enabled, software updates will be disabled.<br><b>This requires a reboot to take effect.</b>")
: tr("Please enable always offroad mode or turn off vehicle to adjust these toggles"));
}
void SoftwarePanelSP::showEvent(QShowEvent *event) {
SoftwarePanel::showEvent(event);
updateDisableUpdatesToggle(!uiState()->scene.started);
disableUpdatesToggle->showDescription();
}
@@ -19,4 +19,10 @@ public:
private:
void searchBranches(const QString &query);
ParamControl *disableUpdatesToggle = nullptr;
void handleDisableUpdatesToggled(bool state);
private slots:
void updateDisableUpdatesToggle(bool offroad);
protected:
void showEvent(QShowEvent *event) override;
};
@@ -12,7 +12,7 @@ VisualsPanel::VisualsPanel(QWidget *parent) : QWidget(parent) {
connect(param_watcher, &ParamWatcher::paramChanged, [=](const QString &param_name, const QString &param_value) {
paramsRefresh();
});
main_layout = new QStackedLayout(this);
ListWidgetSP *list = new ListWidgetSP(this, false);
@@ -30,6 +30,7 @@ VisualsPanel::VisualsPanel(QWidget *parent) : QWidget(parent) {
},
};
// Add regular toggles first
for (auto &[param, title, desc, icon, needs_restart] : toggle_defs) {
auto toggle = new ParamControlSP(param, title, desc, icon, this);
@@ -53,9 +54,20 @@ VisualsPanel::VisualsPanel(QWidget *parent) : QWidget(parent) {
param_watcher->addParam(param);
}
// Visuals: Display Metrics below Chevron
std::vector<QString> chevron_info_settings_texts{tr("Off"), tr("Distance"), tr("Speed"), tr("Time"), tr("All")};
chevron_info_settings = new ButtonParamControlSP(
"ChevronInfo", tr("Display Metrics Below Chevron"), tr("Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control)."),
"",
chevron_info_settings_texts,
200);
chevron_info_settings->showDescription();
list->addItem(chevron_info_settings);
param_watcher->addParam("ChevronInfo");
sunnypilotScroller = new ScrollViewSP(list, this);
vlayout->addWidget(sunnypilotScroller);
main_layout->addWidget(sunnypilotScreen);
}
@@ -67,4 +79,8 @@ void VisualsPanel::paramsRefresh() {
for (auto toggle : toggles) {
toggle.second->refresh();
}
if (chevron_info_settings) {
chevron_info_settings->refresh();
}
}
@@ -27,4 +27,5 @@ protected:
Params params;
std::map<std::string, ParamControlSP*> toggles;
ParamWatcher * param_watcher;
ButtonParamControlSP *chevron_info_settings;
};
+23 -8
View File
@@ -30,9 +30,24 @@ QFrame *vertical_space(int height, QWidget *parent) {
}
// AbstractControlSP
std::vector<AbstractControlSP*> AbstractControlSP::advanced_controls_;
AbstractControlSP::~AbstractControlSP() { UnregisterAdvancedControl(this); }
AbstractControlSP::AbstractControlSP(const QString &title, const QString &desc, const QString &icon, QWidget *parent)
: AbstractControl(title, desc, icon, parent) {
void AbstractControlSP::RegisterAdvancedControl(AbstractControlSP *ctrl) { advanced_controls_.push_back(ctrl); }
void AbstractControlSP::UnregisterAdvancedControl(AbstractControlSP *ctrl) {
advanced_controls_.erase(std::remove(advanced_controls_.begin(), advanced_controls_.end(), ctrl), advanced_controls_.end());
}
void AbstractControlSP::UpdateAllAdvancedControls() {
bool visibility = Params().getBool("ShowAdvancedControls");
advanced_controls_.erase(std::remove(advanced_controls_.begin(), advanced_controls_.end(), nullptr), advanced_controls_.end());
for (auto *ctrl : advanced_controls_) ctrl->setVisible(visibility);
}
AbstractControlSP::AbstractControlSP(const QString &title, const QString &desc, const QString &icon, QWidget *parent, bool advancedControl)
: AbstractControl(title, desc, icon, parent), isAdvancedControl(advancedControl) {
if (isAdvancedControl) RegisterAdvancedControl(this);
main_layout = new QVBoxLayout(this);
main_layout->setMargin(0);
@@ -82,8 +97,8 @@ void AbstractControlSP::hideEvent(QHideEvent *e) {
}
}
AbstractControlSP_SELECTOR::AbstractControlSP_SELECTOR(const QString &title, const QString &desc, const QString &icon, QWidget *parent)
: AbstractControlSP(title, desc, icon, parent) {
AbstractControlSP_SELECTOR::AbstractControlSP_SELECTOR(const QString &title, const QString &desc, const QString &icon, QWidget *parent, bool advancedControl)
: AbstractControlSP(title, desc, icon, parent, advancedControl) {
if (title_label != nullptr) {
delete title_label;
@@ -169,8 +184,8 @@ void AbstractControlSP_SELECTOR::hideEvent(QHideEvent *e) {
// controls
ButtonControlSP::ButtonControlSP(const QString &title, const QString &text, const QString &desc, QWidget *parent)
: AbstractControlSP(title, desc, "", parent) {
ButtonControlSP::ButtonControlSP(const QString &title, const QString &text, const QString &desc, QWidget *parent, bool advancedControl)
: AbstractControlSP(title, desc, "", parent, advancedControl) {
btn.setText(text);
btn.setStyleSheet(R"(
@@ -225,8 +240,8 @@ void ElidedLabelSP::paintEvent(QPaintEvent *event) {
// ParamControlSP
ParamControlSP::ParamControlSP(const QString &param, const QString &title, const QString &desc, const QString &icon, QWidget *parent)
: ToggleControlSP(title, desc, icon, false, parent) {
ParamControlSP::ParamControlSP(const QString &param, const QString &title, const QString &desc, const QString &icon, QWidget *parent, bool advancedControl)
: ToggleControlSP(title, desc, icon, false, parent, advancedControl){
key = param.toStdString();
QObject::connect(this, &ParamControlSP::toggleFlipped, this, &ParamControlSP::toggleClicked);
+27 -9
View File
@@ -57,6 +57,7 @@ class AbstractControlSP : public AbstractControl {
Q_OBJECT
public:
~AbstractControlSP();
void setDescription(const QString &desc) override {
if (description) description->setText(desc);
}
@@ -81,13 +82,30 @@ public slots:
description->setVisible(true);
}
void setVisible(bool visible) override {
bool _visible = visible;
if (isAdvancedControl && !params.getBool("ShowAdvancedControls")) {
_visible = false;
}
AbstractControl::setVisible(_visible);
}
static void RegisterAdvancedControl(AbstractControlSP *ctrl);
static void UnregisterAdvancedControl(AbstractControlSP *ctrl);
static void UpdateAllAdvancedControls();
protected:
AbstractControlSP(const QString &title, const QString &desc = "", const QString &icon = "", QWidget *parent = nullptr);
AbstractControlSP(const QString &title, const QString &desc = "", const QString &icon = "", QWidget *parent = nullptr, bool advancedControl = false);
void hideEvent(QHideEvent *e) override;
QVBoxLayout *main_layout;
ElidedLabelSP *value;
QLabel *description = nullptr;
bool isAdvancedControl;
private:
Params params;
static std::vector<AbstractControlSP*> advanced_controls_;
};
// AbstractControlSP_SELECTOR
@@ -97,7 +115,7 @@ class AbstractControlSP_SELECTOR : public AbstractControlSP {
protected:
QSpacerItem *spacingItem = new QSpacerItem(44, 44, QSizePolicy::Minimum, QSizePolicy::Fixed);
AbstractControlSP_SELECTOR(const QString &title, const QString &desc = "", const QString &icon = "", QWidget *parent = nullptr);
AbstractControlSP_SELECTOR(const QString &title, const QString &desc = "", const QString &icon = "", QWidget *parent = nullptr, bool advancedControl = false);
void hideEvent(QHideEvent *e) override;
};
@@ -123,7 +141,7 @@ class ButtonControlSP : public AbstractControlSP {
Q_OBJECT
public:
ButtonControlSP(const QString &title, const QString &text, const QString &desc = "", QWidget *parent = nullptr);
ButtonControlSP(const QString &title, const QString &text, const QString &desc = "", QWidget *parent = nullptr, bool advancedControl = false);
inline void setText(const QString &text) { btn.setText(text); }
inline QString text() const { return btn.text(); }
inline void click() { btn.click(); }
@@ -142,7 +160,7 @@ class ToggleControlSP : public AbstractControlSP {
Q_OBJECT
public:
ToggleControlSP(const QString &title, const QString &desc = "", const QString &icon = "", const bool state = false, QWidget *parent = nullptr) : AbstractControlSP(title, desc, icon, parent) {
ToggleControlSP(const QString &title, const QString &desc = "", const QString &icon = "", const bool state = false, QWidget *parent = nullptr, bool advancedControl = false) : AbstractControlSP(title, desc, icon, parent, advancedControl) {
// space between toggle and title
icon_label = new QLabel(this);
hlayout->addWidget(icon_label);
@@ -173,7 +191,7 @@ class ParamControlSP : public ToggleControlSP {
Q_OBJECT
public:
ParamControlSP(const QString &param, const QString &title, const QString &desc, const QString &icon, QWidget *parent = nullptr);
ParamControlSP(const QString &param, const QString &title, const QString &desc, const QString &icon, QWidget *parent = nullptr, bool advancedControl = false);
void setConfirmation(bool _confirm, bool _store_confirm) {
confirm = _confirm;
store_confirm = _store_confirm;
@@ -219,7 +237,7 @@ class MultiButtonControlSP : public AbstractControlSP_SELECTOR {
public:
MultiButtonControlSP(const QString &title, const QString &desc, const QString &icon,
const std::vector<QString> &button_texts, const int minimum_button_width = 225, const bool inline_layout = false) : AbstractControlSP_SELECTOR(title, desc, icon), button_texts(button_texts), is_inline_layout(inline_layout) {
const std::vector<QString> &button_texts, const int minimum_button_width = 225, const bool inline_layout = false, bool advancedControl = false) : AbstractControlSP_SELECTOR(title, desc, icon, nullptr, advancedControl), button_texts(button_texts), is_inline_layout(inline_layout) {
const QString style = R"(
QPushButton {
border-radius: 20px;
@@ -371,8 +389,8 @@ class ButtonParamControlSP : public MultiButtonControlSP {
Q_OBJECT
public:
ButtonParamControlSP(const QString &param, const QString &title, const QString &desc, const QString &icon,
const std::vector<QString> &button_texts, const int minimum_button_width = 225, const bool inline_layout = false) : MultiButtonControlSP(title, desc, icon,
button_texts, minimum_button_width, inline_layout) {
const std::vector<QString> &button_texts, const int minimum_button_width = 225, const bool inline_layout = false, bool advancedControl = false) : MultiButtonControlSP(title, desc, icon,
button_texts, minimum_button_width, inline_layout, advancedControl) {
key = param.toStdString();
int value = atoi(params.get(key).c_str());
@@ -499,7 +517,7 @@ private:
public:
OptionControlSP(const QString &param, const QString &title, const QString &desc, const QString &icon,
const MinMaxValue &range, const int per_value_change = 1, const bool inline_layout = false,
const QMap<QString, QString> *valMap = nullptr, bool scale_float = false) : AbstractControlSP_SELECTOR(title, desc, icon, nullptr), _title(title), valueMap(valMap), is_inline_layout(inline_layout), use_float_scaling(scale_float) {
const QMap<QString, QString> *valMap = nullptr, bool scale_float = false, bool advancedControl = false) : AbstractControlSP_SELECTOR(title, desc, icon, nullptr, advancedControl), _title(title), valueMap(valMap), is_inline_layout(inline_layout), use_float_scaling(scale_float) {
const QString style = R"(
QPushButton {
border-radius: 20px;
@@ -0,0 +1,167 @@
/**
* 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/widgets/external_storage.h"
#include <QProcess>
#include <QCoreApplication>
#include <QShowEvent>
#include <QTimer>
#include <QtConcurrent>
#include "common/params.h"
#include "selfdrive/ui/qt/api.h"
#include "selfdrive/ui/qt/widgets/input.h"
#include "selfdrive/ui/sunnypilot/ui.h"
ExternalStorageControl::ExternalStorageControl() :
ButtonControl(tr("External Storage"), "", tr("Extend your comma device's storage by inserting a USB drive into the aux port.")) {
QObject::connect(this, &ButtonControl::clicked, [=]() {
if (text() == tr("CHECK") || text() == tr("MOUNT")) {
mountStorage();
} else if (text() == tr("UNMOUNT")) {
unmountStorage();
} else if (text() == tr("FORMAT")) {
if (ConfirmationDialog::confirm(tr("Are you sure you want to format this drive? This will erase all data."), tr("Format"), this)) {
formatStorage();
}
}
});
QObject::connect(uiState(), &UIState::offroadTransition, this, &ExternalStorageControl::updateState);
updateState(!uiState()->scene.started);
refresh();
}
void ExternalStorageControl::updateState(bool offroad) {
setEnabled(offroad);
}
void ExternalStorageControl::debouncedRefresh() {
if (refreshPending) return;
refreshPending = true;
QTimer::singleShot(250, this, [=]() {
refreshPending = false;
refresh();
});
}
void ExternalStorageControl::refresh() {
QtConcurrent::run([=]() {
auto run = [](const QString &cmd) {
QProcess p;
p.start("sh", QStringList() << "-c" << cmd);
p.waitForFinished();
return p.exitCode() == 0;
};
bool isMounted = run("findmnt -n /mnt/external_realdata");
bool hasDrive = run("lsblk -f /dev/sdg1");
bool hasFs = run("lsblk -f /dev/sdg1 | grep -q ext4");
bool hasLabel = run("sudo blkid /dev/sdg1 | grep -q 'LABEL=\"openpilot\"'");
QString info;
if (isMounted && hasLabel) {
QProcess df;
df.start("sh", QStringList() << "-c" << "df -h /mnt/external_realdata | awk 'NR==2 {print $3 \"/\" $2}'");
df.waitForFinished();
info = df.readAllStandardOutput().trimmed();
}
QMetaObject::invokeMethod(this, [=]() {
if (formatting) {
setValue(tr("formatting"));
setText(tr("FORMAT"));
setEnabled(false);
} else {
if (!hasDrive) {
setValue(tr("insert drive"));
setText(tr("CHECK"));
} else if (!hasFs || !hasLabel) {
setValue(tr("needs format"));
setText(tr("FORMAT"));
} else if (isMounted) {
setValue(info);
setText(tr("UNMOUNT"));
} else {
setValue("drive detected");
setText(tr("MOUNT"));
}
updateState(!uiState()->scene.started);
}
}, Qt::QueuedConnection);
});
}
void ExternalStorageControl::mountStorage() {
setValue(tr("mounting"));
setEnabled(false);
QtConcurrent::run([=]() {
QProcess process;
process.start("sh", QStringList() << "-c" <<
"sudo mount -o remount,rw / && "
"sudo mkdir -p /mnt/external_realdata && "
"grep -q '/dev/sdg1 /mnt/external_realdata' /etc/fstab || "
"echo '/dev/sdg1 /mnt/external_realdata ext4 defaults,nofail 0 2' | sudo tee -a /etc/fstab && "
"sudo systemctl daemon-reexec && "
"sudo mount /mnt/external_realdata && "
"sudo chown -R comma:comma /mnt/external_realdata && "
"sudo chmod -R 775 /mnt/external_realdata && "
"sudo mount -o remount,ro /");
process.waitForFinished();
QMetaObject::invokeMethod(this, [=]() {
debouncedRefresh();
}, Qt::QueuedConnection);
});
}
void ExternalStorageControl::unmountStorage() {
setValue(tr("unmounting"));
setEnabled(false);
QtConcurrent::run([=]() {
QProcess process;
process.start("sh", QStringList() << "-c" << "sudo umount /mnt/external_realdata");
process.waitForFinished();
QMetaObject::invokeMethod(this, [=]() {
debouncedRefresh();
}, Qt::QueuedConnection);
});
}
void ExternalStorageControl::formatStorage() {
unmountStorage();
formatting = true;
setValue(tr("formatting"));
setEnabled(false);
QProcess *process = new QProcess(this);
connect(process, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
this, [=](int exitCode, QProcess::ExitStatus status) {
process->deleteLater();
formatting = false;
if (exitCode == 0 && status == QProcess::NormalExit) {
QProcess::execute("sh", QStringList() << "-c" << "sudo e2label /dev/sdg1 openpilot");
mountStorage();
} else {
setValue(tr("needs format"));
updateState(!uiState()->scene.started);
}
});
process->start("sh", QStringList() << "-c" << "sudo mkfs.ext4 -F /dev/sdg1");
}
void ExternalStorageControl::showEvent(QShowEvent *event) {
ButtonControl::showEvent(event);
QTimer::singleShot(100, this, &ExternalStorageControl::debouncedRefresh);
}
@@ -0,0 +1,34 @@
/**
* 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 "system/hardware/hw.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
#define ButtonControl ButtonControlSP
class ExternalStorageControl : public ButtonControl {
Q_OBJECT
public:
ExternalStorageControl();
protected:
void showEvent(QShowEvent *event) override;
private:
Params params;
bool refreshPending = false;
bool formatting = false;
void updateState(bool offroad);
void refresh();
void debouncedRefresh();
void mountStorage();
void unmountStorage();
void formatStorage();
};
+455 -56
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -179,6 +198,30 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info.</source>
<translation>أداة ADB (Android Debug Bridge) تسمح بالاتصال بجهازك عبر USB أو عبر الشبكة. راجع هذا الرابط: https://docs.comma.ai/how-to/connect-to-comma لمزيد من المعلومات.</translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -187,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -200,15 +247,11 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<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>
</context>
@@ -294,10 +337,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Power Off</source>
<translation>إيقاف التشغيل</translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<translation>يحتاج sunnypilot أن يتم ضبط الجهاز ضمن حدود 4 درجات يميناً أو يساراً و5 درجات نحو الأعلى أو 9 نحو الأسفل. يقوم sunnypilot بالمعايرة باستمرار، ونادراً ما يحتاج إلى عملية إعادة الضبط.</translation>
</message>
<message>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> يشير جهازك إلى %1 درجة %2، و%3 درجة %4.</translation>
@@ -359,7 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>The reset cannot be undone. You have been warned.</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation>بدء تشغيل الكاميرا</translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished">تأكيد</translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation>🔥 وضع خرطوم الحريق 🔥</translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation>وضع خرطوم الحريق: نشط</translation>
@@ -534,6 +633,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INACTIVE&lt;/span&gt;: connect to an unmetered network</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -660,6 +763,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -769,34 +903,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished">اختيار</translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -809,22 +915,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -869,6 +963,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished">إلغاء</translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1019,7 +1178,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>لقد اكتشف sunnypilot تغييراً في موقع تركيب الجهاز. تأكد من تثبيت الجهاز بشكل كامل في موقعه وتثبيته بإحكام على الزجاج الأمامي.</translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1038,6 +1199,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> تنبيه</translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1061,6 +1229,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>النظام لا يستجيب</translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">التحقق</translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished">اختيار</translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished">تحديث</translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1401,6 +1700,10 @@ This may take up to a minute.</source>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1496,6 +1799,16 @@ This may take up to a minute.</source>
<source>Custom Software</source>
<translation>البرمجيات المخصصة</translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1707,6 +2020,30 @@ This may take up to a minute.</source>
<source>Select a branch</source>
<translation type="unfinished">اختر فرعاً</translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">إعادة التشغيل</translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2057,6 +2394,25 @@ This may take up to a minute.</source>
<source>openpilot longitudinal control may come in a future update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished">اختيار</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">إلغاء</translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2093,6 +2449,49 @@ This may take up to a minute.</source>
<translation>فشل التحديث</translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+446 -47
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -191,6 +210,18 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -199,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -211,6 +246,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>View the error log for sunnypilot crashes.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>DevicePanel</name>
@@ -355,11 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation>Kamera startet</translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished">Bestätigen</translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation>🔥 Firehose-Modus 🔥</translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation>Firehose-Modus: AKTIV</translation>
@@ -530,6 +629,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.&lt;br&gt;&lt;br&gt;Firehose Mode can also work while you&apos;re driving if connected to a hotspot or unlimited SIM card.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Frequently Asked Questions&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;Does it matter how or where I drive?&lt;/i&gt; Nope, just drive as you normally would.&lt;br&gt;&lt;br&gt;&lt;i&gt;Do all of my segments get pulled in Firehose Mode?&lt;/i&gt; No, we selectively pull a subset of your segments.&lt;br&gt;&lt;br&gt;&lt;i&gt;What&apos;s a good USB-C adapter?&lt;/i&gt; Any fast phone or laptop charger should be fine.&lt;br&gt;&lt;br&gt;&lt;i&gt;Does it matter which software I run?&lt;/i&gt; Yes, only upstream sunnypilot (and particular forks) are able to be used for training.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -652,6 +755,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -761,34 +895,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished">AUSWÄHLEN</translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -801,22 +907,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -861,6 +955,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished">Abbrechen</translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1011,7 +1170,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation type="unfinished"></translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1030,6 +1191,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> HINWEIS</translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1053,6 +1221,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">ÜBERPRÜFEN</translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished">AUSWÄHLEN</translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished">Aktualisieren</translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1381,6 +1680,10 @@ Dies kann bis zu einer Minute dauern.</translation>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1476,6 +1779,16 @@ Dies kann bis zu einer Minute dauern.</translation>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1689,6 +2002,30 @@ Dies kann bis zu einer Minute dauern.</translation>
<source>Select a branch</source>
<translation type="unfinished">Wähle einen Branch</translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Neustart</translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2039,6 +2376,25 @@ Dies kann bis zu einer Minute dauern.</translation>
<source>Enable the sunnypilot longitudinal control (alpha) toggle to allow Experimental mode.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished">Auswählen</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Abbrechen</translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2075,6 +2431,49 @@ Dies kann bis zu einer Minute dauern.</translation>
<translation>Aktualisierung fehlgeschlagen</translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+455 -56
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -179,6 +198,30 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -187,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -200,15 +247,11 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<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>
</context>
@@ -314,10 +357,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Power Off</source>
<translation>Apagar</translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<translation>sunnypilot requiere que el dispositivo sea montado entre 4° grados a la izquierda o derecha y entre 5° grados hacia arriba o 9° grados hacia abajo. sunnypilot está constantemente en calibración, formatear rara vez es necesario.</translation>
</message>
<message>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> Su dispositivo está apuntando %1° %2 y %3° %4.</translation>
@@ -359,7 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>The reset cannot be undone. You have been warned.</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation>iniciando cámara</translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished">Confirmar</translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation type="unfinished"></translation>
@@ -530,6 +629,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INACTIVE&lt;/span&gt;: connect to an unmetered network</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -652,6 +755,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -761,34 +895,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished">SELECCIONAR</translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -801,22 +907,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -861,6 +955,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1011,7 +1170,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>sunnypilot detectó un cambio en la posición de montaje del dispositivo. Asegúrese de que el dispositivo esté completamente asentado en el soporte y que el soporte esté firmemente asegurado al parabrisas.</translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1030,6 +1191,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> ALERTA</translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1053,6 +1221,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>Systema no responde</translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">VERIFICAR</translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished">SELECCIONAR</translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished">ACTUALIZAR</translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1381,6 +1680,10 @@ Esto puede tardar un minuto.</translation>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1476,6 +1779,16 @@ Esto puede tardar un minuto.</translation>
<source>Select a language</source>
<translation>Seleccione un idioma</translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1687,6 +2000,30 @@ Esto puede tardar un minuto.</translation>
<source>Select a branch</source>
<translation type="unfinished">Selecione una rama</translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Reiniciar</translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2037,6 +2374,25 @@ Esto puede tardar un minuto.</translation>
<source>openpilot longitudinal control may come in a future update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished">Seleccionar</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2073,6 +2429,49 @@ Esto puede tardar un minuto.</translation>
<translation>Actualización fallida</translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+455 -56
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -179,6 +198,30 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -187,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -200,15 +247,11 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<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>
</context>
@@ -302,10 +345,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Power Off</source>
<translation>Éteindre</translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<translation>sunnypilot nécessite que l&apos;appareil soit monté à 4° à gauche ou à droite et à 5° vers le haut ou 9° vers le bas. sunnypilot se calibre en continu, la réinitialisation est rarement nécessaire.</translation>
</message>
<message>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> Votre appareil est orienté %1° %2 et %3° %4.</translation>
@@ -359,7 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>The reset cannot be undone. You have been warned.</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation>démarrage de la caméra</translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished">Confirmer</translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation type="unfinished"></translation>
@@ -530,6 +629,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INACTIVE&lt;/span&gt;: connect to an unmetered network</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -652,6 +755,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -761,34 +895,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished">SÉLECTIONNER</translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -801,22 +907,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -861,6 +955,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished">Annuler</translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1011,7 +1170,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>sunnypilot a détecté un changement dans la position de montage de l&apos;appareil. Assurez-vous que l&apos;appareil est totalement inséré dans le support et que le support est fermement fixé au pare-brise.</translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1030,6 +1191,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> ALERTE</translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1053,6 +1221,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>Système inopérant</translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">VÉRIFIER</translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished">SÉLECTIONNER</translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished">MISE À JOUR</translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1381,6 +1680,10 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1476,6 +1779,16 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<source>Custom Software</source>
<translation>Logiciel personnalisé</translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1687,6 +2000,30 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<source>Select a branch</source>
<translation type="unfinished">Sélectionner une branche</translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Redémarrer</translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2037,6 +2374,25 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<source>openpilot longitudinal control may come in a future update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished">Sélectionner</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Annuler</translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2073,6 +2429,49 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<translation>Échec de la mise à jour</translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+455 -56
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -179,6 +198,30 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info.</source>
<translation>ADBAndroid Debug BridgeUSBまたはネットワーク経由でデバイスに接続できますhttps://docs.comma.ai/how-to/connect-to-comma を参照してください。</translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -187,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -200,15 +247,11 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<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>
</context>
@@ -294,10 +337,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Power Off</source>
<translation></translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<translation>sunnypilotの本体は左右4°5°9°</translation>
</message>
<message>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> %2 %1°%4 %3°</translation>
@@ -359,7 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>The reset cannot be undone. You have been warned.</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation></translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation>🔥 Firehoseモード 🔥</translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation type="unfinished"></translation>
@@ -529,6 +628,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INACTIVE&lt;/span&gt;: connect to an unmetered network</source>
<translation>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;&lt;/span&gt;: </translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -650,6 +753,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -759,34 +893,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -799,22 +905,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -859,6 +953,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1009,7 +1168,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>: %1</translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1028,6 +1189,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> </translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1051,6 +1219,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1376,6 +1675,10 @@ This may take up to a minute.</source>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1471,6 +1774,16 @@ This may take up to a minute.</source>
<source>Custom Software</source>
<translation></translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1682,6 +1995,30 @@ This may take up to a minute.</source>
<source>Select a branch</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2032,6 +2369,25 @@ This may take up to a minute.</source>
<source>openpilot longitudinal control may come in a future update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2068,6 +2424,49 @@ This may take up to a minute.</source>
<translation></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+455 -56
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -179,6 +198,30 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info.</source>
<translation>ADB ( 릿) USB . https://docs.comma.ai/how-to/connect-to-comma를 참조하세요.</translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -187,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -200,15 +247,11 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<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>
</context>
@@ -294,10 +337,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Power Off</source>
<translation> </translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<translation>sunnypilot 4°, 5°, 9° . sunnypilot은 .</translation>
</message>
<message>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> %2 %1° %4 %3° .</translation>
@@ -359,7 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>The reset cannot be undone. You have been warned.</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation> </translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation>🔥 🔥</translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation> 모드: 활성화</translation>
@@ -529,6 +628,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INACTIVE&lt;/span&gt;: connect to an unmetered network</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -650,6 +753,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -759,34 +893,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -799,22 +905,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -859,6 +953,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1009,7 +1168,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> . . : %1</translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1028,6 +1189,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> </translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1051,6 +1219,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> </translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1376,6 +1675,10 @@ This may take up to a minute.</source>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1471,6 +1774,16 @@ This may take up to a minute.</source>
<source>Custom Software</source>
<translation> </translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1682,6 +1995,30 @@ This may take up to a minute.</source>
<source>Select a branch</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2032,6 +2369,25 @@ This may take up to a minute.</source>
<source>openpilot longitudinal control may come in a future update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2068,6 +2424,49 @@ This may take up to a minute.</source>
<translation> </translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+455 -56
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -179,6 +198,30 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info.</source>
<translation>ADB (Android Debug Bridge) permite conectar ao seu dispositivo por meio do USB ou através da rede. Veja https://docs.comma.ai/how-to/connect-to-comma para maiores informações.</translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -187,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -200,15 +247,11 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<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>
</context>
@@ -294,10 +337,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Power Off</source>
<translation>Desligar</translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<translation>O sunnypilot requer que o dispositivo seja montado dentro de 4° esquerda ou direita e dentro de 5° para cima ou 9° para baixo. O sunnypilot está continuamente calibrando, resetar raramente é necessário.</translation>
</message>
<message>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> Seu dispositivo está montado %1° %2 e %3° %4.</translation>
@@ -359,7 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>The reset cannot be undone. You have been warned.</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation>câmera iniciando</translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished">Confirmar</translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation>🔥 Modo Firehose 🔥</translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation>Modo Firehose: ATIVO</translation>
@@ -530,6 +629,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INACTIVE&lt;/span&gt;: connect to an unmetered network</source>
<translation>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INATIVO&lt;/span&gt;: conecte-se a uma rede sem limite &lt;br&gt; de dados</translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -652,6 +755,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -761,34 +895,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished">SELECIONE</translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -801,22 +907,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -861,6 +955,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1011,7 +1170,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>Temperatura do dispositivo muito alta. O sistema está sendo resfriado antes de iniciar. A temperatura atual do componente interno é: %1</translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1030,6 +1191,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> ALERTA</translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1053,6 +1221,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>Sistema sem Resposta</translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">VERIFICAR</translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished">SELECIONE</translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished">ATUALIZAÇÃO</translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1381,6 +1680,10 @@ Isso pode levar até um minuto.</translation>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1476,6 +1779,16 @@ Isso pode levar até um minuto.</translation>
<source>Custom Software</source>
<translation>Software Customizado</translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1687,6 +2000,30 @@ Isso pode levar até um minuto.</translation>
<source>Select a branch</source>
<translation type="unfinished">Selecione uma branch</translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Reiniciar</translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2037,6 +2374,25 @@ Isso pode levar até um minuto.</translation>
<source>openpilot longitudinal control may come in a future update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished">Selecione</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2073,6 +2429,49 @@ Isso pode levar até um minuto.</translation>
<translation>Falha na atualização</translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+455 -56
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -179,6 +198,30 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -187,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -200,15 +247,11 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<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>
</context>
@@ -294,10 +337,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Power Off</source>
<translation></translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<translation>sunnypilot 4° 5° 9° sunnypilot </translation>
</message>
<message>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> %2 %1° %4 %3°</translation>
@@ -359,7 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>The reset cannot be undone. You have been warned.</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation></translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation type="unfinished"></translation>
@@ -529,6 +628,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INACTIVE&lt;/span&gt;: connect to an unmetered network</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -650,6 +753,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -759,34 +893,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -799,22 +905,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -859,6 +953,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1009,7 +1168,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>sunnypilot </translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1028,6 +1189,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> </translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1051,6 +1219,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1376,6 +1675,10 @@ This may take up to a minute.</source>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1471,6 +1774,16 @@ This may take up to a minute.</source>
<source>Custom Software</source>
<translation></translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1682,6 +1995,30 @@ This may take up to a minute.</source>
<source>Select a branch</source>
<translation type="unfinished"> Branch</translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2032,6 +2369,25 @@ This may take up to a minute.</source>
<source>openpilot longitudinal control may come in a future update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2068,6 +2424,49 @@ This may take up to a minute.</source>
<translation></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+455 -56
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -179,6 +198,30 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -187,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -200,15 +247,11 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<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>
</context>
@@ -294,10 +337,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Power Off</source>
<translation>Sistemi kapat</translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<translation>sunnypilot, cihazın 4° sola veya 5° yukarı yada 9° aşağı bakıcak şekilde monte edilmesi gerekmektedir. sunnypilot sürekli kendisini kalibre edilmektedir ve nadiren sıfırlama gerebilir.</translation>
</message>
<message>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> Cihazınız %1° %2 ve %3° %4 yönünde ayarlı</translation>
@@ -359,7 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>The reset cannot be undone. You have been warned.</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation>kamera başlatılıyor</translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished">Onayla</translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation type="unfinished"></translation>
@@ -529,6 +628,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INACTIVE&lt;/span&gt;: connect to an unmetered network</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -650,6 +753,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -759,34 +893,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -799,22 +905,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -859,6 +953,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1008,7 +1167,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation type="unfinished"></translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1027,6 +1188,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> UYARI</translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1050,6 +1218,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">KONTROL ET</translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished">GÜNCELLE</translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1374,6 +1673,10 @@ This may take up to a minute.</source>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1469,6 +1772,16 @@ This may take up to a minute.</source>
<source>Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1680,6 +1993,30 @@ This may take up to a minute.</source>
<source>Select a branch</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Yeniden başlat</translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2030,6 +2367,25 @@ This may take up to a minute.</source>
<source>openpilot longitudinal control may come in a future update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished">Seç</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2066,6 +2422,49 @@ This may take up to a minute.</source>
<translation>Güncelleme başarız oldu</translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+455 -56
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -179,6 +198,30 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info.</source>
<translation>ADBAndroid调试桥接USB或网络连接到您的设备 [https://docs.comma.ai/how-to/connect-to-comma](https://docs.comma.ai/how-to/connect-to-comma)。</translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -187,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -200,15 +247,11 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<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>
</context>
@@ -294,10 +337,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Power Off</source>
<translation></translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<translation>sunnypilot要求设备安装的偏航角在左4°4°5°9°sunnypilot会持续更新校准</translation>
</message>
<message>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> %1° %2%3° %4</translation>
@@ -359,7 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>The reset cannot be undone. You have been warned.</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation></translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation>🔥 🔥</translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation></translation>
@@ -529,6 +628,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INACTIVE&lt;/span&gt;: connect to an unmetered network</source>
<translation>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;&lt;/span&gt;</translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -650,6 +753,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -759,34 +893,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -799,22 +905,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -859,6 +953,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1009,7 +1168,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>%1</translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1028,6 +1189,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> </translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1051,6 +1219,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1376,6 +1675,10 @@ This may take up to a minute.</source>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1471,6 +1774,16 @@ This may take up to a minute.</source>
<source>Custom Software</source>
<translation></translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1682,6 +1995,30 @@ This may take up to a minute.</source>
<source>Select a branch</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2032,6 +2369,25 @@ This may take up to a minute.</source>
<source>openpilot longitudinal control may come in a future update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2068,6 +2424,49 @@ This may take up to a minute.</source>
<translation></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+455 -56
View File
@@ -135,6 +135,25 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
<message>
@@ -179,6 +198,30 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info.</source>
<translation>ADBAndroid 調 USB [https://docs.comma.ai/how-to/connect-to-comma](https://docs.comma.ai/how-to/connect-to-comma)。</translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DeveloperPanelSP</name>
<message>
<source>Show Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle visibility of advanced sunnypilot controls.
This only toggles the visibility of the controls; it does not toggle the actual control enabled/disabled state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable GitHub runner service</source>
<translation type="unfinished"></translation>
@@ -187,6 +230,10 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Enables or disables the github runner service.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Quickboot Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error Log</source>
<translation type="unfinished"></translation>
@@ -200,15 +247,11 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot Longitudinal Control (Alpha)</source>
<source>When toggled on, this creates a prebuilt file to allow accelerated boot times. When toggled off, it immediately removes the prebuilt file so compilation of locally edited cpp files can be made. &lt;br&gt;&lt;br&gt;&lt;b&gt;To edit C++ files locally on device, you MUST first turn off this toggle so the changes can recompile.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>On this car, sunnypilot defaults to the car&apos;s built-in ACC instead of openpilot&apos;s longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.</source>
<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>
</context>
@@ -294,10 +337,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Power Off</source>
<translation></translation>
</message>
<message>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required.</source>
<translation>sunnypilot 4° 5° 9° </translation>
</message>
<message>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> %2 %1° %4 %3° </translation>
@@ -359,7 +398,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation type="unfinished"></translation>
</message>
<message>
<source> Resetting calibration will restart openpilot if the car is powered on.</source>
<source>sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Steering lag calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is %1% complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Steering torque response calibration is complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>openpilot is continuously calibrating, resetting is rarely required. Resetting calibration will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -449,6 +512,31 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>The reset cannot be undone. You have been warned.</source>
<translation type="unfinished"></translation>
</message>
<message>
<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> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Offroad: Device will be in Always Offroad mode after boot/wake-up.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -484,6 +572,21 @@ Please use caution when using this feature. Only use the blinker when traffic an
<translation></translation>
</message>
</context>
<context>
<name>ExitOffroadButton</name>
<message>
<source>Are you sure you want to exit Always Offroad mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>EXIT ALWAYS OFFROAD MODE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExperimentalModeButton</name>
<message>
@@ -497,10 +600,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>FirehosePanel</name>
<message>
<source>🔥 Firehose Mode 🔥</source>
<translation>🔥 🔥</translation>
</message>
<message>
<source>Firehose Mode: ACTIVE</source>
<translation></translation>
@@ -529,6 +628,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;INACTIVE&lt;/span&gt;: connect to an unmetered network</source>
<translation type="unfinished">&lt;span stylesheet=&apos;font-size: 60px; font-weight: bold; color: #e74c3c;&apos;&gt;&lt;/span&gt;</translation>
</message>
<message>
<source>Firehose Mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HudRenderer</name>
@@ -650,6 +753,37 @@ 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>Pause Lateral Control with Blinker</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause lateral control with blinker when traveling below the desired speed selected.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
<message>
<source>Custom ACC Speed Increments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable custom Short &amp; Long press increments for cruise speed increase/decrease.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature can only be used with openpilot longitudinal control enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This feature is not supported on this platform due to vehicle limitations.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -759,34 +893,6 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No custom model selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1 model [%2]... (%3%)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>downloaded</source>
<translation type="unfinished"></translation>
@@ -799,22 +905,10 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>from cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 model [%2] pending...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching models...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select a Model</source>
<translation type="unfinished"></translation>
@@ -859,6 +953,71 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Model Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CLEAR</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Driving Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Navigation Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Vision Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Policy Model</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Live Learning Steer Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Software Delay</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust the software delay when Live Learning Steer Delay is toggled off.
The default software delay value is 0.2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> %1 - %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> download failed - %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> pending - %1</source>
<translation type="unfinished"></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. The Current value is updated automatically when the vehicle is Onroad.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded models from the cache&lt;br/&gt;&lt;u&gt;except the currently active model&lt;/u&gt;.&lt;br/&gt;&lt;br/&gt;Are you sure you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1009,7 +1168,9 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>%1</translation>
</message>
<message>
<source>sunnypilot is now in Always Offroad mode. sunnypilot won&apos;t start until Always Offroad mode is disabled. Go to &quot;Settings&quot; -&gt; &quot;Device&quot; to exit Always Offroad mode.</source>
<source>OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.
%1</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1028,6 +1189,13 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation> </translation>
</message>
</context>
<context>
<name>OffroadHomeSP</name>
<message>
<source>ALWAYS OFFROAD ACTIVE</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OnroadAlerts</name>
<message>
@@ -1051,6 +1219,137 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>OsmPanel</name>
<message>
<source>Mapd Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Maps ETA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time Elapsed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded Maps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DELETE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will delete ALL downloaded maps
Are you sure you want to delete all the maps?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes, delete all the maps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Country</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SELECT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching Country list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fetching State list...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>REFRESH</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UPDATE</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download starting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: Invalid download. Retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>
Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This will start the download process and it might take a while to complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue on Metered</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>s</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Calculating ETA...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time remaining: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PairingPopup</name>
<message>
@@ -1376,6 +1675,10 @@ This may take up to a minute.</source>
<source>Visuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>OSM</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setup</name>
@@ -1471,6 +1774,16 @@ This may take up to a minute.</source>
<source>Custom Software</source>
<translation></translation>
</message>
<message>
<source>WARNING: Custom Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use caution when installing third-party software. Third-party software has not been tested by comma, and may cause damage to your device and/or vehicle.
If you&apos;d like to proceed, use https://flash.comma.ai to restore your device to a factory state later.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1682,6 +1995,30 @@ This may take up to a minute.</source>
<source>Select a branch</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Disable Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled. &lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 updates requires a reboot.&lt;br&gt;Reboot now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, software updates will be disabled.&lt;br&gt;&lt;b&gt;This requires a reboot to take effect.&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enable always offroad mode or turn off vehicle to adjust these toggles</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
@@ -2032,6 +2369,25 @@ This may take up to a minute.</source>
<source>openpilot longitudinal control may come in a future update.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and Upload Microphone Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
<source>Select</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>
@@ -2068,6 +2424,49 @@ This may take up to a minute.</source>
<translation></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
<message>
<source>Show Blind Spot Warnings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabling this will display warnings when a vehicle is detected in your blind spot as long as your car has BSM supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Changing this setting will restart openpilot if the car is powered on.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Metrics Below Chevron</source>
<translation type="unfinished"></translation>
</message>
<message>
<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>
</context>
<context>
<name>WiFiPromptWidget</name>
<message>
+5
View File
@@ -0,0 +1,5 @@
import os
from openpilot.common.basedir import BASEDIR
MAPD_BIN_DIR = os.path.join(BASEDIR, 'third_party/mapd_pfeiferj')
MAPD_PATH = os.path.join(MAPD_BIN_DIR, 'mapd')
+17 -15
View File
@@ -16,32 +16,39 @@ from urllib.request import urlopen
from cereal import messaging
from openpilot.common.params import Params
from openpilot.sunnypilot.mapd.mapd_manager import MAPD_PATH, MAPD_BIN_DIR
from openpilot.system.hardware.hw import Paths
from openpilot.common.spinner import Spinner
from openpilot.system.version import is_prebuilt
from openpilot.sunnypilot.mapd import MAPD_PATH, MAPD_BIN_DIR
import openpilot.system.sentry as sentry
VERSION = 'v1.9.0'
VERSION = 'v1.10.0'
URL = f"https://github.com/pfeiferj/openpilot-mapd/releases/download/{VERSION}/mapd"
def update_installed_version(version: str, params: Params = None) -> None:
if params is None:
params = Params()
params.put("MapdVersion", version)
class MapdInstallManager:
def __init__(self, spinner_ref: Spinner):
self._spinner = spinner_ref
self._params = Params()
def download(self) -> None:
self.ensure_directories_exist()
self._download_file()
self.update_installed_version(VERSION)
update_installed_version(VERSION, self._params)
def check_and_download(self) -> None:
if self.download_needed():
self.download()
@staticmethod
def download_needed() -> bool:
return not os.path.exists(MAPD_PATH) or MapdInstallManager.get_installed_version() != VERSION
def download_needed(self) -> bool:
return not os.path.exists(MAPD_PATH) or self.get_installed_version() != VERSION
@staticmethod
def ensure_directories_exist() -> None:
@@ -82,13 +89,8 @@ class MapdInstallManager:
temp_file.unlink()
logging.error("Failed to download file after all retries")
@staticmethod
def update_installed_version(version: str) -> None:
Params().put("MapdVersion", version)
@staticmethod
def get_installed_version() -> str:
return Params().get("MapdVersion", encoding="utf-8") or ""
def get_installed_version(self) -> str:
return self._params.get("MapdVersion", encoding="utf-8") or ""
def wait_for_internet_connection(self, return_on_failure: bool = False) -> bool:
max_retries = 10
@@ -122,7 +124,7 @@ class MapdInstallManager:
return
if self.wait_for_internet_connection(return_on_failure=True):
self._spinner.update(f"Downloading pfeiferj's mapd [{install_manager.get_installed_version()}] => [{VERSION}].")
self._spinner.update(f"Downloading pfeiferj's mapd [{self.get_installed_version()}] => [{VERSION}].")
time.sleep(0.1)
self.check_and_download()
self._spinner.close()
@@ -146,7 +148,7 @@ if __name__ == "__main__":
if is_prebuilt():
debug_msg = f"[DEBUG] This is prebuilt, no mapd install required. VERSION: [{VERSION}], Param [{install_manager.get_installed_version()}]"
spinner.update(debug_msg)
install_manager.update_installed_version(VERSION)
update_installed_version(VERSION)
else:
spinner.update(f"Checking if mapd is installed and valid. Prebuilt [{is_prebuilt()}]")
install_manager.non_prebuilt_install()
+3 -4
View File
@@ -12,22 +12,20 @@ import os
import glob
import shutil
from openpilot.common.basedir import BASEDIR
from openpilot.common.params import Params
from openpilot.common.realtime import Ratekeeper, config_realtime_process
from openpilot.common.swaglog import cloudlog
from openpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert
from openpilot.sunnypilot.mapd.live_map_data.osm_map_data import OsmMapData
from openpilot.system.hardware.hw import Paths
from openpilot.sunnypilot.mapd import MAPD_PATH
from openpilot.sunnypilot.mapd.mapd_installer import VERSION, update_installed_version
# PFEIFER - MAPD {{
params = Params()
mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else params
# }} PFEIFER - MAPD
MAPD_BIN_DIR = os.path.join(BASEDIR, 'third_party/mapd_pfeiferj')
MAPD_PATH = os.path.join(MAPD_BIN_DIR, 'mapd')
def get_files_for_cleanup() -> list[str]:
paths = [
@@ -117,6 +115,7 @@ def update_osm_db() -> None:
def main_thread():
update_installed_version(VERSION, params)
config_realtime_process([0, 1, 2, 3], 5)
rk = Ratekeeper(1, print_delay_threshold=None)
+1 -1
View File
@@ -103,7 +103,7 @@ def fill_model_msg(base_msg: capnp._DynamicStructBuilder, extended_msg: capnp._D
fill_xyzt(orientation_rate, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.ORIENTATION_RATE].T)
# temporal pose
temporal_pose = modelV2.temporalPose
temporal_pose = modelV2.temporalPoseDEPRECATED
temporal_pose.trans = net_output_data['plan'][0,0,Plan.VELOCITY].tolist()
temporal_pose.transStd = net_output_data['plan_stds'][0,0,Plan.VELOCITY].tolist()
temporal_pose.rot = net_output_data['plan'][0,0,Plan.ORIENTATION_RATE].tolist()
+1 -1
View File
@@ -62,7 +62,7 @@ class ModelState:
self.prev_desire = np.zeros(ModelConstants.DESIRE_LEN, dtype=np.float32)
bundle = get_active_bundle()
overrides = {override.key: override.value for override in bundle.overrides}
self.LAT_SMOOTH_SECONDS = float(overrides.get('lat', ".2"))
self.LAT_SMOOTH_SECONDS = float(overrides.get('lat', ".0"))
self.LONG_SMOOTH_SECONDS = float(overrides.get('long', ".0"))
model_paths = get_model_path()
+3 -3
View File
@@ -10,8 +10,8 @@ SEND_RAW_PRED = os.getenv('SEND_RAW_PRED')
ConfidenceClass = log.ModelDataV2.ConfidenceClass
def get_curvature_from_output(output, vego, lat_action_t, current_generation=None):
if current_generation != 11:
def get_curvature_from_output(output, vego, lat_action_t, mlsim):
if not mlsim:
if desired_curv := output.get('desired_curvature'): # If the model outputs the desired curvature, use that directly
return float(desired_curv[0, 0])
@@ -100,7 +100,7 @@ def fill_model_msg(base_msg: capnp._DynamicStructBuilder, extended_msg: capnp._D
fill_xyzt(modelV2.orientationRate, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.ORIENTATION_RATE].T)
# temporal pose
temporal_pose = modelV2.temporalPose
temporal_pose = modelV2.temporalPoseDEPRECATED
if 'sim_pose' in net_output_data:
temporal_pose.trans = net_output_data['sim_pose'][0,:ModelConstants.POSE_WIDTH//2].tolist()
temporal_pose.transStd = net_output_data['sim_pose_stds'][0,:ModelConstants.POSE_WIDTH//2].tolist()
+8 -4
View File
@@ -54,10 +54,10 @@ class ModelState:
raise
model_bundle = get_active_bundle()
self.generation = model_bundle.generation
self.generation = model_bundle.generation if model_bundle is not None else None
overrides = {override.key: override.value for override in model_bundle.overrides}
self.LAT_SMOOTH_SECONDS = float(overrides.get('lat', ".2"))
self.LAT_SMOOTH_SECONDS = float(overrides.get('lat', ".0"))
self.LONG_SMOOTH_SECONDS = float(overrides.get('long', ".0"))
self.MIN_LAT_CONTROL_SPEED = 0.3
@@ -86,6 +86,10 @@ class ModelState:
self.desire_reshape_dims = (self.numpy_inputs['desire'].shape[0], self.numpy_inputs['desire'].shape[1], -1,
self.numpy_inputs['desire'].shape[2])
@property
def mlsim(self) -> bool:
return bool(self.generation is not None and self.generation >= 11)
def run(self, bufs: dict[str, VisionBuf], transforms: dict[str, np.ndarray],
inputs: dict[str, np.ndarray], prepare_only: bool) -> dict[str, np.ndarray] | None:
# Model decides when action is completed, so desire input is just a pulse triggered on rising edge
@@ -151,7 +155,7 @@ class ModelState:
self.full_prev_desired_curv[0,:-1] = self.full_prev_desired_curv[0,1:]
self.full_prev_desired_curv[0,-1,:] = outputs['desired_curvature'][0, :]
self.numpy_inputs[input_name_prev][:] = self.full_prev_desired_curv[0, self.temporal_idxs]
if self.generation == 11:
if self.mlsim:
self.numpy_inputs[input_name_prev][:] = 0*self.full_prev_desired_curv[0, self.temporal_idxs]
else:
length = outputs['desired_curvature'][0].size
@@ -165,7 +169,7 @@ class ModelState:
action_t=long_action_t)
desired_accel = smooth_value(desired_accel, prev_action.desiredAcceleration, self.LONG_SMOOTH_SECONDS)
desired_curvature = get_curvature_from_output(model_output, v_ego, lat_action_t, self.generation)
desired_curvature = get_curvature_from_output(model_output, v_ego, lat_action_t, self.mlsim)
if v_ego > self.MIN_LAT_CONTROL_SPEED:
desired_curvature = smooth_value(desired_curvature, prev_action.desiredCurvature, self.LAT_SMOOTH_SECONDS)
else:
@@ -1,5 +1,6 @@
import numpy as np
from openpilot.sunnypilot.models.split_model_constants import SplitModelConstants
from openpilot.sunnypilot.models.helpers import get_active_bundle
def safe_exp(x, out=None):
@@ -24,6 +25,8 @@ def softmax(x, axis=-1):
class Parser:
def __init__(self, ignore_missing=False):
self.ignore_missing = ignore_missing
model_bundle = get_active_bundle()
self.generation = model_bundle.generation if model_bundle is not None else None
def check_missing(self, outs, name):
if name not in outs and not self.ignore_missing:
@@ -88,37 +91,64 @@ class Parser:
outs[name] = pred_mu_final.reshape(final_shape)
outs[name + '_stds'] = pred_std_final.reshape(final_shape)
def _parse_plan_mhp(self, outs):
self.parse_mdn('plan', outs, in_N=SplitModelConstants.PLAN_MHP_N, out_N=SplitModelConstants.PLAN_MHP_SELECTION,
out_shape=(SplitModelConstants.IDX_N,SplitModelConstants.PLAN_WIDTH))
def parse_dynamic_outputs(self, outs: dict[str, np.ndarray]) -> None:
if 'lead' in outs:
if self.generation >= 12 and \
outs['lead'].shape[1] == 2 * SplitModelConstants.LEAD_MHP_SELECTION * SplitModelConstants.LEAD_TRAJ_LEN * SplitModelConstants.LEAD_WIDTH:
self.parse_mdn('lead', outs, in_N=0, out_N=0,
out_shape=(SplitModelConstants.LEAD_MHP_SELECTION, SplitModelConstants.LEAD_TRAJ_LEN, SplitModelConstants.LEAD_WIDTH))
else:
self.parse_mdn('lead', outs, in_N=SplitModelConstants.LEAD_MHP_N, out_N=SplitModelConstants.LEAD_MHP_SELECTION,
out_shape=(SplitModelConstants.LEAD_TRAJ_LEN, SplitModelConstants.LEAD_WIDTH))
if 'plan' in outs:
if self.generation >= 12 and \
outs['plan'].shape[1] > 2 * SplitModelConstants.PLAN_WIDTH * SplitModelConstants.IDX_N:
self._parse_plan_mhp(outs)
elif self.generation >= 12:
self.parse_mdn('plan', outs, in_N=0, out_N=0,
out_shape=(SplitModelConstants.IDX_N, SplitModelConstants.PLAN_WIDTH))
else:
self._parse_plan_mhp(outs)
def split_outputs(self, outs: dict[str, np.ndarray]) -> None:
if 'desired_curvature' in outs:
self.parse_mdn('desired_curvature', outs, in_N=0, out_N=0, out_shape=(SplitModelConstants.DESIRED_CURV_WIDTH,))
if 'desire_pred' in outs:
self.parse_categorical_crossentropy('desire_pred', outs, out_shape=(SplitModelConstants.DESIRE_PRED_LEN,SplitModelConstants.DESIRE_PRED_WIDTH))
if 'desire_state' in outs:
self.parse_categorical_crossentropy('desire_state', outs, out_shape=(SplitModelConstants.DESIRE_PRED_WIDTH,))
if 'lane_lines' in outs:
self.parse_mdn('lane_lines', outs, in_N=0, out_N=0,
out_shape=(SplitModelConstants.NUM_LANE_LINES,SplitModelConstants.IDX_N,SplitModelConstants.LANE_LINES_WIDTH))
out_shape=(SplitModelConstants.NUM_LANE_LINES,SplitModelConstants.IDX_N,SplitModelConstants.LANE_LINES_WIDTH))
if 'lane_lines_prob' in outs:
self.parse_binary_crossentropy('lane_lines_prob', outs)
if 'lead_prob' in outs:
self.parse_binary_crossentropy('lead_prob', outs)
if 'lat_planner_solution' in outs:
self.parse_mdn('lat_planner_solution', outs, in_N=0, out_N=0, out_shape=(SplitModelConstants.IDX_N,SplitModelConstants.LAT_PLANNER_SOLUTION_WIDTH))
if 'meta' in outs:
self.parse_binary_crossentropy('meta', outs)
if 'road_edges' in outs:
self.parse_mdn('road_edges', outs, in_N=0, out_N=0,
out_shape=(SplitModelConstants.NUM_ROAD_EDGES,SplitModelConstants.IDX_N,SplitModelConstants.LANE_LINES_WIDTH))
self.parse_mdn('lead', outs, in_N=SplitModelConstants.LEAD_MHP_N, out_N=SplitModelConstants.LEAD_MHP_SELECTION,
out_shape=(SplitModelConstants.LEAD_TRAJ_LEN,SplitModelConstants.LEAD_WIDTH))
if 'sim_pose' in outs:
self.parse_mdn('sim_pose', outs, in_N=0, out_N=0, out_shape=(SplitModelConstants.POSE_WIDTH,))
for k in ['lead_prob', 'lane_lines_prob']:
self.parse_binary_crossentropy(k, outs)
out_shape=(SplitModelConstants.NUM_ROAD_EDGES,SplitModelConstants.IDX_N,SplitModelConstants.LANE_LINES_WIDTH))
if 'sim_pose' in outs:
self.parse_mdn('sim_pose', outs, in_N=0, out_N=0, out_shape=(SplitModelConstants.POSE_WIDTH,))
def parse_vision_outputs(self, outs: dict[str, np.ndarray]) -> dict[str, np.ndarray]:
self.parse_mdn('pose', outs, in_N=0, out_N=0, out_shape=(SplitModelConstants.POSE_WIDTH,))
self.parse_mdn('wide_from_device_euler', outs, in_N=0, out_N=0, out_shape=(SplitModelConstants.WIDE_FROM_DEVICE_WIDTH,))
self.parse_mdn('road_transform', outs, in_N=0, out_N=0, out_shape=(SplitModelConstants.POSE_WIDTH,))
self.parse_dynamic_outputs(outs)
self.split_outputs(outs)
self.parse_categorical_crossentropy('desire_pred', outs, out_shape=(SplitModelConstants.DESIRE_PRED_LEN,SplitModelConstants.DESIRE_PRED_WIDTH))
self.parse_binary_crossentropy('meta', outs)
return outs
def parse_policy_outputs(self, outs: dict[str, np.ndarray]) -> dict[str, np.ndarray]:
self.parse_mdn('plan', outs, in_N=SplitModelConstants.PLAN_MHP_N, out_N=SplitModelConstants.PLAN_MHP_SELECTION,
out_shape=(SplitModelConstants.IDX_N,SplitModelConstants.PLAN_WIDTH))
self.parse_dynamic_outputs(outs)
self.split_outputs(outs)
if 'lat_planner_solution' in outs:
self.parse_mdn('lat_planner_solution', outs, in_N=0, out_N=0, out_shape=(SplitModelConstants.IDX_N,SplitModelConstants.LAT_PLANNER_SOLUTION_WIDTH))
if 'desired_curvature' in outs:
self.parse_mdn('desired_curvature', outs, in_N=0, out_N=0, out_shape=(SplitModelConstants.DESIRED_CURV_WIDTH,))
self.parse_categorical_crossentropy('desire_state', outs, out_shape=(SplitModelConstants.DESIRE_PRED_WIDTH,))
return outs
def parse_outputs(self, outs: dict[str, np.ndarray]) -> dict[str, np.ndarray]:
+63
View File
@@ -0,0 +1,63 @@
# Model Selector Version Compatibility
This document explains the version compatibility mechanism used by the Model Selector system, and the rationale behind certain version constraints and JSON file management strategies.
## Overview
The Model Selector is responsible for selecting and validating model bundles based on their metadata and version constraints. Each model bundle is distributed via a JSON file and includes a `minimumSelectorVersion` field indicating the minimum selector version required to load it.
To ensure robust compatibility and prevent mismatches between model expectations and selector capabilities, the selector enforces two version boundaries:
* **`REQUIRED_MIN_SELECTOR_VERSION`**: the oldest selector version we support.
* **`CURRENT_SELECTOR_VERSION`**: the current version of the selector logic.
## Version Compatibility Check
A model bundle is considered compatible if:
```python
REQUIRED_MIN_SELECTOR_VERSION <= bundle["minimumSelectorVersion"] <= CURRENT_SELECTOR_VERSION
```
This ensures:
* **Old bundles are rejected** if they rely on deprecated selector behavior.
* **Future bundles are ignored** if they expect logic that the current selector doesn't yet implement.
## Handling Breaking Changes
When a deep change in selector behavior requires *all* models to be recompiled (e.g., due to a major architectural update), we:
1. **Create a new JSON file** (e.g., from `models_v4.json` to `models_v5.json`).
2. **Assign updated `minimumSelectorVersion` values** in the new bundles.
This allows older selector versions to continue using the previous JSON file, while newer versions point to the new one, preventing cross-contamination.
## Why `REQUIRED_MIN_SELECTOR_VERSION` Still Matters
Despite using new JSON files to isolate breaking changes, `REQUIRED_MIN_SELECTOR_VERSION` plays a critical role:
### 1. **Cached Bundle Validation**
Model bundles are cached locally (e.g., in-memory or on disk). A user might have previously loaded a now-invalid bundle from an older JSON file.
`REQUIRED_MIN_SELECTOR_VERSION` prevents the selector from reloading or trusting that stale cached bundle, even if the original JSON is gone.
### 2. **Explicit Deprecation Boundary**
By raising `REQUIRED_MIN_SELECTOR_VERSION`, we declare older bundles officially unsupported, even if they technically still exist in a legacy JSON file.
### 3. **Avoiding Race Conditions**
Some clients may have intermittent access to updated JSONs. The runtime check ensures version compatibility is enforced independently of external file state.
## Summary
| Component | Purpose |
| ------------------------------- | --------------------------------------------------------------------- |
| `minimumSelectorVersion` | Declares the minimum selector version required to load a model bundle |
| `REQUIRED_MIN_SELECTOR_VERSION` | Prevents loading bundles that are too old (e.g., from stale cache) |
| `CURRENT_SELECTOR_VERSION` | Prevents loading bundles that are too new or forward-incompatible |
| JSON file renaming | Isolates bundles by selector generation to handle full recompiles |
This layered strategy ensures safe evolution of the model selection system while maintaining backward compatibility and runtime protection against stale or incompatible bundles.
+1 -1
View File
@@ -115,7 +115,7 @@ class ModelCache:
class ModelFetcher:
"""Handles fetching and caching of model data from remote source"""
MODEL_URL = "https://docs.sunnypilot.ai/driving_models_v4.json"
MODEL_URL = "https://docs.sunnypilot.ai/driving_models_v6.json"
def __init__(self, params: Params):
self.params = params
+3 -2
View File
@@ -19,8 +19,9 @@ from openpilot.system.hardware import PC
from openpilot.system.hardware.hw import Paths
from pathlib import Path
CURRENT_SELECTOR_VERSION = 6
REQUIRED_MIN_SELECTOR_VERSION = 5
# see the README.md for more details on the model selector versioning
CURRENT_SELECTOR_VERSION = 8
REQUIRED_MIN_SELECTOR_VERSION = 6
USE_ONNX = os.getenv('USE_ONNX', PC)
+29
View File
@@ -178,6 +178,10 @@ class ModelManagerSP:
finally:
self.params.put("ModelManager_DownloadIndex", "")
if self.params.get("ModelManager_ClearCache", block=False, encoding="utf-8"):
self.clear_model_cache()
self.params.remove("ModelManager_ClearCache")
self._report_status()
rk.keep_time()
@@ -185,6 +189,31 @@ class ModelManagerSP:
cloudlog.exception(f"Error in main thread: {str(e)}")
rk.keep_time()
def clear_model_cache(self) -> None:
"""
Clears the model cache directory of all files except those in the active model bundle.
"""
# Get list of files used by active model bundle
active_files = []
if self.active_bundle is not None: # When the default model is active
for model in self.active_bundle.models:
if hasattr(model, 'artifact') and model.artifact.fileName:
active_files.append(model.artifact.fileName)
if hasattr(model, 'metadata') and model.metadata.fileName:
active_files.append(model.metadata.fileName)
# Remove all files except active ones
model_dir = Paths.model_root()
try:
for filename in os.listdir(model_dir):
if filename not in active_files:
file_path = os.path.join(model_dir, filename)
if os.path.isfile(file_path):
os.remove(file_path)
cloudlog.info("Model cache cleared, keeping active model files")
except Exception as e:
cloudlog.exception(f"Error clearing model cache: {str(e)}")
def main():
ModelManagerSP().main_thread()
@@ -16,12 +16,12 @@ DecState = custom.LongitudinalPlanSP.DynamicExperimentalControl.DynamicExperimen
class LongitudinalPlannerSP:
def __init__(self, CP: structs.CarParams, mpc):
self.dec = DynamicExperimentalController(CP, mpc)
model_bundle = get_active_bundle()
self.generation = model_bundle.generation if model_bundle is not None else None
self.generation = int(model_bundle.generation) if (model_bundle := get_active_bundle()) else None
@property
def mlsim(self) -> bool:
return self.generation == 11
# If we don't have a generation set, we assume it's default model. Which as of today are mlsim.
return bool(self.generation is None or self.generation >= 11)
def get_mpc_mode(self) -> str | None:
if not self.dec.active():
+16 -6
View File
@@ -381,20 +381,20 @@ def setNavDestination(latitude: int = 0, longitude: int = 0, place_name: str = N
return {"success": 1}
def scan_dir(path: str, prefix: str) -> list[str]:
def scan_dir(path: str, prefix: str, base: str) -> list[str]:
files = []
# only walk directories that match the prefix
# (glob and friends traverse entire dir tree)
with os.scandir(path) as i:
for e in i:
rel_path = os.path.relpath(e.path, Paths.log_root())
rel_path = os.path.relpath(e.path, base)
if e.is_dir(follow_symlinks=False):
# add trailing slash
rel_path = os.path.join(rel_path, '')
# if prefix is a partial dir name, current dir will start with prefix
# if prefix is a partial file name, prefix with start with dir name
if rel_path.startswith(prefix) or prefix.startswith(rel_path):
files.extend(scan_dir(e.path, prefix))
files.extend(scan_dir(e.path, prefix, base))
else:
if rel_path.startswith(prefix):
files.append(rel_path)
@@ -402,7 +402,12 @@ def scan_dir(path: str, prefix: str) -> list[str]:
@dispatcher.add_method
def listDataDirectory(prefix='') -> list[str]:
return scan_dir(Paths.log_root(), prefix)
internal_files = scan_dir(Paths.log_root(), prefix, Paths.log_root())
try:
external_files = scan_dir(Paths.log_root_external(), prefix, Paths.log_root_external())
except FileNotFoundError:
external_files = []
return sorted(set(internal_files + external_files))
@dispatcher.add_method
@@ -427,8 +432,13 @@ def uploadFilesToUrls(files_data: list[UploadFileDict]) -> UploadFilesToUrlRespo
failed.append(file.fn)
continue
path = os.path.join(Paths.log_root(), file.fn)
if not os.path.exists(path) and not os.path.exists(strip_zst_extension(path)):
path_internal = os.path.join(Paths.log_root(), file.fn)
path_external = os.path.join(Paths.log_root_external(), file.fn)
if os.path.exists(path_internal) or os.path.exists(strip_zst_extension(path_internal)):
path = path_internal
elif os.path.exists(path_external) or os.path.exists(strip_zst_extension(path_external)):
path = path_external
else:
failed.append(file.fn)
continue
+4
View File
@@ -55,4 +55,8 @@ namespace Path {
return "/dev/shm";
#endif
}
inline std::string model_root() {
return Hardware::PC() ? Path::comma_home() + "/media/0/models" : "/data/media/0/models";
}
} // namespace Path
+4
View File
@@ -20,6 +20,10 @@ class Paths:
else:
return '/data/media/0/realdata/'
@staticmethod
def log_root_external() -> str:
return '/mnt/external_realdata/'
@staticmethod
def swaglog_root() -> str:
if PC:
+11 -6
View File
@@ -9,21 +9,26 @@ STATS_DIR_FILE_LIMIT = 10000
STATS_SOCKET = "ipc:///tmp/stats"
STATS_FLUSH_TIME_S = 60
def get_available_percent(default: float) -> float:
PATH_DICT = {
"internal": Paths.log_root(),
"external": Paths.log_root_external()
}
def get_available_percent(default: float, path_type="internal") -> float:
try:
statvfs = os.statvfs(Paths.log_root())
statvfs = os.statvfs(PATH_DICT[path_type])
available_percent = 100.0 * statvfs.f_bavail / statvfs.f_blocks
except OSError:
except (OSError, KeyError):
available_percent = default
return available_percent
def get_available_bytes(default: int) -> int:
def get_available_bytes(default: int, path_type="internal") -> int:
try:
statvfs = os.statvfs(Paths.log_root())
statvfs = os.statvfs(PATH_DICT[path_type])
available_bytes = statvfs.f_bavail * statvfs.f_frsize
except OSError:
except (OSError, KeyError):
available_bytes = default
return available_bytes
+28
View File
@@ -2,6 +2,7 @@
import os
import shutil
import threading
from pathlib import Path
from openpilot.system.hardware.hw import Paths
from openpilot.common.swaglog import cloudlog
from openpilot.system.loggerd.config import get_available_bytes, get_available_percent
@@ -61,6 +62,33 @@ def deleter_thread(exit_event: threading.Event):
if any(name.endswith(".lock") for name in os.listdir(delete_path)):
continue
if Path(Paths.log_root_external()).is_mount():
out_of_bytes_external = get_available_bytes(default=MIN_BYTES + 1, path_type="external") < MIN_BYTES
out_of_percent_external = get_available_percent(default=MIN_PERCENT + 1, path_type="external") < MIN_PERCENT
if out_of_percent_external or out_of_bytes_external:
dirs_external = listdir_by_creation(Paths.log_root_external())
# remove the earliest external directory we can
for delete_dir_external in sorted(dirs_external):
delete_path_external = os.path.join(Paths.log_root_external(), delete_dir_external)
try:
cloudlog.info(f"deleting {delete_path_external}")
shutil.rmtree(delete_path_external)
break
except OSError:
cloudlog.exception(f"issue deleting {delete_path_external}")
# move directory from internal to external
path_external = os.path.join(Paths.log_root_external(), delete_dir)
try:
cloudlog.info(f"moving {delete_path} to {path_external}")
shutil.move(delete_path, path_external)
break
except Exception as e:
cloudlog.exception(f"issue moving {delete_path} to {path_external}: {str(e)}")
continue
try:
cloudlog.info(f"deleting {delete_path}")
shutil.rmtree(delete_path)
+12 -1
View File
@@ -50,10 +50,13 @@ def manager_init() -> None:
("BlindSpot", "0"),
("BlinkerMinLateralControlSpeed", "20"), # MPH or km/h
("BlinkerPauseLateralControl", "0"),
("Brightness", "0"),
("ChevronInfo", "4"),
("CustomAccIncrementsEnabled", "0"),
("CustomAccLongPressIncrement", "5"),
("CustomAccShortPressIncrement", "1"),
("DeviceBootMode", "0"),
("DisableUpdates", "0"),
("DynamicExperimentalControl", "0"),
("HyundaiLongitudinalTuning", "0"),
("InteractivityTimeout", "0"),
@@ -65,11 +68,18 @@ def manager_init() -> None:
("MadsUnifiedEngagementMode", "1"),
("MapdVersion", f"{VERSION}"),
("MaxTimeOffroad", "1800"),
("Brightness", "0"),
("ModelManager_LastSyncTime", "0"),
("ModelManager_ModelsCache", ""),
("NeuralNetworkLateralControl", "0"),
("QuickBootToggle", "0"),
("QuietMode", "0"),
("ShowAdvancedControls", "0" if build_metadata.tested_channel else "1"),
("EnableHkgTuningAngleSmoothingFactor", "1"),
("HkgTuningAngleMinTorqueReductionGain", "10"),
("HkgTuningAngleActiveTorqueReductionGain", "60"),
("HkgTuningAngleMaxTorqueReductionGain", "100"),
("HkgTuningOverridingCycles", "17"),
("HkgAngleLiveTuning", "0"),
]
# device boot mode
@@ -101,6 +111,7 @@ def manager_init() -> None:
params.put("GitCommitDate", build_metadata.openpilot.git_commit_date)
params.put("GitBranch", build_metadata.channel)
params.put("GitRemote", build_metadata.openpilot.git_origin)
params.put_bool("IsDevelopmentBranch", build_metadata.development_channel)
params.put_bool("IsTestedBranch", build_metadata.tested_channel)
params.put_bool("IsReleaseBranch", build_metadata.release_channel)
params.put("HardwareSerial", serial)
+5 -2
View File
@@ -88,6 +88,9 @@ def is_stock_model(started, params, CP: car.CarParams) -> bool:
"""Check if the active model runner is stock."""
return bool(get_active_model_runner(params, not started) == custom.ModelManagerSP.Runner.stock)
def mapd_ready(started: bool, params: Params, CP: car.CarParams) -> bool:
return bool(os.path.exists(Paths.mapd_root()))
def or_(*fns):
return lambda *args: operator.or_(*(fn(*args) for fn in fns))
@@ -114,7 +117,7 @@ procs = [
PythonProcess("sensord", "system.sensord.sensord", only_onroad, enabled=not PC),
NativeProcess("ui", "selfdrive/ui", ["./ui"], always_run, watchdog_max_dt=(5 if not PC else None)),
PythonProcess("soundd", "selfdrive.ui.soundd", only_onroad),
PythonProcess("soundd", "selfdrive.ui.soundd", and_(only_onroad, not_joystick)),
PythonProcess("locationd", "selfdrive.locationd.locationd", only_onroad),
NativeProcess("_pandad", "selfdrive/pandad", ["./pandad"], always_run, enabled=False),
PythonProcess("calibrationd", "selfdrive.locationd.calibrationd", only_onroad),
@@ -162,7 +165,7 @@ procs += [
PythonProcess("backup_manager", "sunnypilot.sunnylink.backups.manager", and_(only_offroad, sunnylink_ready_shim)),
# mapd
NativeProcess("mapd", Paths.mapd_root(), [MAPD_PATH], always_run),
NativeProcess("mapd", Paths.mapd_root(), [MAPD_PATH], mapd_ready),
PythonProcess("mapd_manager", "sunnypilot.mapd.mapd_manager", always_run),
]
+9 -1
View File
@@ -83,6 +83,10 @@ class OpenpilotMetadata:
# touch this to get rid of the orange startup alert. there's better ways to do that
return self.git_normalized_origin == "github.com/commaai/openpilot"
@property
def sunnypilot_remote(self) -> bool:
return self.git_normalized_origin == "github.com/sunnypilot/sunnypilot"
@property
def git_normalized_origin(self) -> str:
return self.git_origin \
@@ -117,9 +121,13 @@ class BuildMetadata:
def master_channel(self) -> bool:
return self.channel in MASTER_SP_BRANCHES
@property
def development_channel(self) -> bool:
return self.channel.startswith("dev-") or self.channel.endswith("-prebuilt")
@property
def channel_type(self) -> str:
if self.channel.startswith("dev-"):
if self.development_channel:
return "development"
elif self.channel.startswith("staging-"):
return "staging"
BIN
View File
Binary file not shown.
File diff suppressed because it is too large Load Diff
+4
View File
@@ -5,6 +5,10 @@
With joystick_control, you can connect your laptop to your comma device over the network and debug controls using a joystick or keyboard.
joystick_control uses [inputs](https://pypi.org/project/inputs) which supports many common gamepads and joysticks.
## Note
You might need to install [xow](https://github.com/medusalix/xow) to use the Xbox One controller on comma device.
Even though **xone** is recommended on the xow page, **xow** is the one that works with the comma device.
## Usage
The car must be off, and openpilot must be offroad before starting `joystick_control`.
+117 -48
View File
@@ -3,7 +3,10 @@ import os
import argparse
import threading
import numpy as np
from inputs import UnpluggedError, get_gamepad
try:
import pygame as pg
except ImportError:
print("pygame is not installed. Please install it with 'uv pip install pygame'")
from cereal import messaging
from openpilot.common.params import Params
@@ -11,7 +14,10 @@ from openpilot.common.realtime import Ratekeeper
from openpilot.system.hardware import HARDWARE
from openpilot.tools.lib.kbhit import KBHit
EXPO = 0.4
# Set SDL environment variable to avoid using a video driver for headless operation
os.environ["SDL_VIDEODRIVER"] = "dummy"
EXPO = 0.4 # Exponential factor for joystick response curve
class Keyboard:
@@ -40,60 +46,122 @@ class Keyboard:
return True
class Joystick:
class PyGameJoystick:
def __init__(self):
# This class supports a PlayStation 5 DualSense controller on the comma 3X
# TODO: find a way to get this from API or detect gamepad/PC, perhaps "inputs" doesn't support it
self.cancel_button = 'BTN_NORTH' # BTN_NORTH=X/triangle
if HARDWARE.get_device_type() == 'pc':
accel_axis = 'ABS_Z'
steer_axis = 'ABS_RX'
# TODO: once the longcontrol API is finalized, we can replace this with outputting gas/brake and steering
self.flip_map = {'ABS_RZ': accel_axis}
else:
accel_axis = 'ABS_RX'
steer_axis = 'ABS_Z'
self.flip_map = {'ABS_RY': accel_axis}
# Initialize pygame and joystick subsystem
pg.init()
if not pg.joystick.get_init():
pg.joystick.init()
self.min_axis_value = {accel_axis: 0., steer_axis: 0.}
self.max_axis_value = {accel_axis: 255., steer_axis: 255.}
self.axes_values = {accel_axis: 0., steer_axis: 0.}
self.axes_order = [accel_axis, steer_axis]
# Find connected joysticks
joystick_count = pg.joystick.get_count()
if joystick_count == 0:
print("No joysticks found. Please connect a controller.")
exit(1)
# Initialize the first joystick
self.joystick = pg.joystick.Joystick(0)
self.joystick.init()
print(f"Using joystick: {self.joystick.get_name()}")
print(f"Number of axes: {self.joystick.get_numaxes()}")
print(f"Number of buttons: {self.joystick.get_numbuttons()}")
print(f"Number of hats: {self.joystick.get_numhats()}")
# This supports PlayStation and Xbox controllers on different platforms
if HARDWARE.get_device_type() == 'pc':
# Xbox mapping on PC
self.accel_axis = 5 # Right trigger
self.brake_axis = 4 # Left trigger
self.steer_axis = 0 # Left stick horizontal
self.cancel_button = 3 # Y/Triangle button
else:
# PlayStation mapping on comma device
self.accel_axis = 5 # R2
self.brake_axis = 4 # L2
self.steer_axis = 0 # Left stick horizontal
self.cancel_button = 3 # Triangle button
# Configure for adaptive mappings based on detected controller
controller_name = self.joystick.get_name().lower()
if "xbox" in controller_name:
print("Xbox controller detected, using Xbox mappings")
self.accel_axis = 5 # Right trigger (RT)
self.brake_axis = 4 # Left trigger (LT)
self.cancel_button = 3 # Y button
elif "playstation" in controller_name or "dual" in controller_name:
print("PlayStation controller detected, using PlayStation mappings")
self.accel_axis = 5 # R2
self.brake_axis = 4 # L2
self.cancel_button = 3 # Triangle
# Initialize values
self.axes_values = {'gb': 0., 'steer': 0.} # Maintain same keys as Keyboard class
self.axes_order = ['gb', 'steer'] # Match expected format
self.cancel = False
self.deadzone = 0.03 # 3% deadzone for noisy joysticks
# Process events once to clear the event queue
pg.event.pump()
def update(self):
# Process pygame events
try:
joystick_event = get_gamepad()[0]
except (OSError, UnpluggedError):
self.axes_values = dict.fromkeys(self.axes_values, 0.)
for event in pg.event.get():
if event.type == pg.JOYDEVICEREMOVED:
if event.instance_id == self.joystick.get_instance_id():
print("Joystick disconnected!")
self.axes_values = {'gb': 0., 'steer': 0.}
return False
elif event.type == pg.JOYBUTTONDOWN:
if event.button == self.cancel_button:
self.cancel = True
elif event.type == pg.JOYBUTTONUP:
if event.button == self.cancel_button:
self.cancel = False
except Exception as e:
print(f"Error processing events: {e}")
return False
event = (joystick_event.code, joystick_event.state)
# Read current joystick state directly
try:
if not self.joystick.get_init():
print("Joystick not initialized")
return False
# flip left trigger to negative accel
if event[0] in self.flip_map:
event = (self.flip_map[event[0]], -event[1])
# Read steering (left stick horizontal)
steer_raw = self.joystick.get_axis(self.steer_axis) * -1
steer = steer_raw if abs(steer_raw) > self.deadzone else 0.0
if event[0] == self.cancel_button:
if event[1] == 1:
self.cancel = True
elif event[1] == 0: # state 0 is falling edge
self.cancel = False
elif event[0] in self.axes_values:
self.max_axis_value[event[0]] = max(event[1], self.max_axis_value[event[0]])
self.min_axis_value[event[0]] = min(event[1], self.min_axis_value[event[0]])
# Read gas (right trigger)
accel_raw = self.joystick.get_axis(self.accel_axis)
# Convert from [-1, 1] to [0, 1] range (triggers often start at -1 when not pressed)
accel = (accel_raw + 1) / 2 if self.accel_axis in [4, 5] else accel_raw
accel = accel if accel > self.deadzone else 0.0
norm = -float(np.interp(event[1], [self.min_axis_value[event[0]], self.max_axis_value[event[0]]], [-1., 1.]))
norm = norm if abs(norm) > 0.03 else 0. # center can be noisy, deadzone of 3%
self.axes_values[event[0]] = EXPO * norm ** 3 + (1 - EXPO) * norm # less action near center for fine control
else:
# Read brake (left trigger)
brake_raw = self.joystick.get_axis(self.brake_axis)
# Convert from [-1, 1] to [0, 1] range (triggers often start at -1 when not pressed)
brake = (brake_raw + 1) / 2 if self.brake_axis in [4, 5] else brake_raw
brake = brake if brake > self.deadzone else 0.0
# Apply expo for steering
self.axes_values['steer'] = EXPO * steer**3 + (1 - EXPO) * steer # Apply expo for fine control
# Calculate combined gas/brake value for output [-1, 1] where negative is brake
self.axes_values['gb'] = accel - brake
except Exception as e:
print(f"Error reading joystick: {e}")
self.axes_values = {'gb': 0., 'steer': 0.}
return False
return True
def send_thread(joystick):
pm = messaging.PubMaster(['testJoystick'])
rk = Ratekeeper(100, print_delay_threshold=None)
while True:
@@ -105,7 +173,6 @@ def send_thread(joystick):
joystick_msg.testJoystick.axes = [joystick.axes_values[ax] for ax in joystick.axes_order]
pm.send('testJoystick', joystick_msg)
rk.keep_time()
@@ -117,13 +184,12 @@ def joystick_control_thread(joystick):
def main():
joystick_control_thread(Joystick())
joystick_control_thread(PyGameJoystick())
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Publishes events from your joystick to control your car.\n' +
'openpilot must be offroad before starting joystick_control. This tool supports ' +
'a PlayStation 5 DualSense controller on the comma 3X.',
'PlayStation and Xbox controllers on various platforms.',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--keyboard', action='store_true', help='Use your keyboard instead of a joystick')
args = parser.parse_args()
@@ -139,9 +205,12 @@ if __name__ == '__main__':
print('Buttons')
print('- `R`: Resets axes')
print('- `C`: Cancel cruise control')
joystick_control_thread(Keyboard())
else:
print('Using joystick, make sure to run cereal/messaging/bridge on your device if running over the network!')
print('If not running on a comma device, the mapping may need to be adjusted.')
joystick = Keyboard() if args.keyboard else Joystick()
joystick_control_thread(joystick)
print('Using pygame joystick')
print('Standard controller mapping:')
print('- Left stick: Steering')
print('- Right trigger (R2): Gas')
print('- Left trigger (L2): Brake')
print('- Triangle/Y button: Cancel')
joystick_control_thread(PyGameJoystick())
+8 -2
View File
@@ -19,18 +19,24 @@ def joystickd_thread():
CP = messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams)
VM = VehicleModel(CP)
sm = messaging.SubMaster(['carState', 'onroadEvents', 'liveParameters', 'selfdriveState', 'testJoystick'], frequency=1. / DT_CTRL)
sm = messaging.SubMaster(['carState', 'onroadEvents', 'liveParameters', 'selfdriveState', 'testJoystick', 'selfdriveStateSP'], frequency=1. / DT_CTRL)
pm = messaging.PubMaster(['carControl', 'controlsState'])
rk = Ratekeeper(100, print_delay_threshold=None)
while 1:
sm.update(0)
ss_sp = sm['selfdriveStateSP']
_lat_active = False
if ss_sp.mads.available:
_lat_active = ss_sp.mads.active
else:
_lat_active = sm['selfdriveState'].active
cc_msg = messaging.new_message('carControl')
cc_msg.valid = True
CC = cc_msg.carControl
CC.enabled = sm['selfdriveState'].enabled
CC.latActive = sm['selfdriveState'].active and not sm['carState'].steerFaultTemporary and not sm['carState'].steerFaultPermanent
CC.latActive = _lat_active and not sm['carState'].steerFaultTemporary and not sm['carState'].steerFaultPermanent
CC.longActive = CC.enabled and not any(e.overrideLongitudinal for e in sm['onroadEvents']) and CP.openpilotLongitudinalControl
CC.cruiseControl.cancel = sm['carState'].cruiseState.enabled and (not CC.enabled or not CP.pcmCruise)
CC.hudControl.leadDistanceBars = 2
@@ -0,0 +1,128 @@
<?xml version='1.0' encoding='UTF-8'?>
<root>
<tabbed_widget name="Main Window" parent="main_window">
<Tab containers="1" tab_name="actuator data">
<Container>
<DockSplitter orientation="-" sizes="0.25;0.25;0.25;0.25" count="4">
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="558.699945" bottom="-1.050000" top="1.050000" left="6.491930"/>
<limitY/>
<curve name="/carControl/actuators/torque" color="#17becf"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="558.699945" bottom="-553.384988" top="395.185006" left="6.491930"/>
<limitY/>
<curve name="/carControl/actuators/steeringAngleDeg" color="#1f77b4"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="558.699945" bottom="-0.444933" top="18.242243" left="6.491930"/>
<limitY/>
<curve name="/carState/vEgoRaw" color="#ff7f0e"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="558.699945" bottom="-0.119883" top="0.177208" left="6.491930"/>
<limitY/>
<curve name="/carControl/actuators/curvature" color="#f14cc1"/>
</plot>
</DockArea>
</DockSplitter>
</Container>
</Tab>
<Tab containers="1" tab_name="steering messages (CAN)">
<Container>
<DockSplitter orientation="-" sizes="0.200218;0.200218;0.199129;0.200218;0.200218" count="5">
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="558.699945" bottom="-0.025000" top="1.025000" left="6.491930"/>
<limitY/>
<curve name="/can/128/LKAS_ALT/ADAS_ACIAnglTqRedcGainVal" color="#1f77b4"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="558.699945" bottom="-189.000000" top="189.000000" left="6.491930"/>
<limitY/>
<curve name="/can/128/LKAS_ALT/ADAS_StrAnglReqVal" color="#d62728"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="558.699945" bottom="-0.025000" top="1.025000" left="6.491930"/>
<limitY/>
<curve name="/carState/steeringPressed" color="#d62728"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="558.699945" bottom="-4.150000" top="170.150000" left="6.491930"/>
<limitY/>
<curve name="/pandaStates/0/safetyTxBlocked" color="#1f77b4"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="558.699945" bottom="-0.025000" top="1.025000" left="6.491930"/>
<limitY/>
<curve name="/can/1/CCNC_0x161/DAW_ICON" color="#f14cc1"/>
</plot>
</DockArea>
</DockSplitter>
</Container>
</Tab>
<Tab containers="1" tab_name="Understanding Torque">
<Container>
<DockSplitter orientation="-" sizes="0.5;0.5" count="2">
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="590.696728" bottom="-6.175000" top="253.175000" left="429.901019"/>
<limitY/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
<range right="558.699945" bottom="-107.707498" top="64.807501" left="6.491930"/>
<limitY/>
<curve name="/carState/steeringTorqueEps" color="#1ac938"/>
</plot>
</DockArea>
</DockSplitter>
</Container>
</Tab>
<currentTabIndex index="1"/>
</tabbed_widget>
<use_relative_time_offset enabled="1"/>
<!-- - - - - - - - - - - - - - - -->
<!-- - - - - - - - - - - - - - - -->
<Plugins>
<plugin ID="DataLoad CSV">
<default time_axis="" delimiter="0"/>
</plugin>
<plugin ID="DataLoad MCAP"/>
<plugin ID="DataLoad Rlog"/>
<plugin ID="DataLoad ULog"/>
<plugin ID="Cereal Subscriber"/>
<plugin ID="UDP Server"/>
<plugin ID="WebSocket Server"/>
<plugin ID="ZMQ Subscriber"/>
<plugin ID="Fast Fourier Transform"/>
<plugin ID="Quaternion to RPY"/>
<plugin ID="Reactive Script Editor">
<library code="--[[ Helper function to create a series from arrays&#xa;&#xa; new_series: a series previously created with ScatterXY.new(name)&#xa; prefix: prefix of the timeseries, before the index of the array&#xa; suffix_X: suffix to complete the name of the series containing the X value. If [nil], use the index of the array.&#xa; suffix_Y: suffix to complete the name of the series containing the Y value&#xa; timestamp: usually the tracker_time variable&#xa; &#xa; Example:&#xa; &#xa; Assuming we have multiple series in the form:&#xa; &#xa; /trajectory/node.{X}/position/x&#xa; /trajectory/node.{X}/position/y&#xa; &#xa; where {N} is the index of the array (integer). We can create a reactive series from the array with:&#xa; &#xa; new_series = ScatterXY.new(&quot;my_trajectory&quot;) &#xa; CreateSeriesFromArray( new_series, &quot;/trajectory/node&quot;, &quot;position/x&quot;, &quot;position/y&quot;, tracker_time );&#xa;--]]&#xa;&#xa;function CreateSeriesFromArray( new_series, prefix, suffix_X, suffix_Y, timestamp )&#xa; &#xa; --- clear previous values&#xa; new_series:clear()&#xa; &#xa; --- Append points to new_series&#xa; index = 0&#xa; while(true) do&#xa;&#xa; x = index;&#xa; -- if not nil, get the X coordinate from a series&#xa; if suffix_X ~= nil then &#xa; series_x = TimeseriesView.find( string.format( &quot;%s.%d/%s&quot;, prefix, index, suffix_X) )&#xa; if series_x == nil then break end&#xa; x = series_x:atTime(timestamp)&#x9; &#xa; end&#xa; &#xa; series_y = TimeseriesView.find( string.format( &quot;%s.%d/%s&quot;, prefix, index, suffix_Y) )&#xa; if series_y == nil then break end &#xa; y = series_y:atTime(timestamp)&#xa; &#xa; new_series:push_back(x,y)&#xa; index = index+1&#xa; end&#xa;end&#xa;&#xa;--[[ Similar to the built-in function GetSeriesNames(), but select only the names with a give prefix. --]]&#xa;&#xa;function GetSeriesNamesByPrefix(prefix)&#xa; -- GetSeriesNames(9 is a built-in function&#xa; all_names = GetSeriesNames()&#xa; filtered_names = {}&#xa; for i, name in ipairs(all_names) do&#xa; -- check the prefix&#xa; if name:find(prefix, 1, #prefix) then&#xa; table.insert(filtered_names, name);&#xa; end&#xa; end&#xa; return filtered_names&#xa;end&#xa;&#xa;--[[ Modify an existing series, applying offsets to all their X and Y values&#xa;&#xa; series: an existing timeseries, obtained with TimeseriesView.find(name)&#xa; delta_x: offset to apply to each x value&#xa; delta_y: offset to apply to each y value &#xa; &#xa;--]]&#xa;&#xa;function ApplyOffsetInPlace(series, delta_x, delta_y)&#xa; -- use C++ indeces, not Lua indeces&#xa; for index=0, series:size()-1 do&#xa; x,y = series:at(index)&#xa; series:set(index, x + delta_x, y + delta_y)&#xa; end&#xa;end&#xa;"/>
<scripts/>
</plugin>
<plugin ID="CSV Exporter"/>
</Plugins>
<!-- - - - - - - - - - - - - - - -->
<!-- - - - - - - - - - - - - - - -->
<customMathEquations/>
<snippets/>
<!-- - - - - - - - - - - - - - - -->
</root>
@@ -0,0 +1,209 @@
<?xml version='1.0' encoding='UTF-8'?>
<root>
<tabbed_widget parent="main_window" name="Main Window">
<Tab tab_name="actuator data" containers="1">
<Container>
<DockSplitter orientation="-" sizes="0.25;0.25;0.25;0.25" count="4">
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-1.050000" top="1.050000" right="722.420439" left="0.000000"/>
<limitY/>
<curve color="#17becf" name="/carControl/actuators/torque"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-453.043646" top="538.555487" right="722.420439" left="0.000000"/>
<limitY/>
<curve color="#1f77b4" name="/carControl/actuators/steeringAngleDeg"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-0.647461" top="26.545898" right="722.420439" left="0.000000"/>
<limitY/>
<curve color="#ff7f0e" name="/carState/vEgoRaw"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-0.209157" top="0.175448" right="722.420439" left="0.000000"/>
<limitY/>
<curve color="#f14cc1" name="/carControl/actuators/curvature"/>
</plot>
</DockArea>
</DockSplitter>
</Container>
</Tab>
<Tab tab_name="steering messages (CAN)" containers="1">
<Container>
<DockSplitter orientation="-" sizes="0.200218;0.200218;0.199129;0.200218;0.200218" count="5">
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-189.000000" top="189.000000" right="723.115449" left="6.371879"/>
<limitY/>
<curve color="#b6ff00" name="/can/128/LKAS_ALT/LKAS_ANGLE_CMD"/>
<curve color="#00fab2" name="/can/0/LKAS_ALT/LKAS_ANGLE_CMD"/>
<curve color="#d62728" name="/can/192/LKAS_ALT/LKAS_ANGLE_CMD"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-6.250000" top="256.250000" right="722.420439" left="6.497277"/>
<limitY/>
<curve color="#00ffe8" name="/can/128/LKAS_ALT/LKAS_ANGLE_MAX_TORQUE"/>
<curve color="#e5fd00" name="/can/0/LKAS_ALT/LKAS_ANGLE_MAX_TORQUE"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-4.399729" top="4.056632" right="722.420439" left="0.000000"/>
<limitY/>
<curve color="#ff7f0e" name="IMU_LatAccelVal_ms^2_roll_compensated"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-0.025000" top="1.025000" right="722.420439" left="0.000000"/>
<limitY/>
<curve color="#d62728" name="/carState/steeringPressed"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-0.025000" top="1.025000" right="722.420439" left="0.000000"/>
<limitY/>
<curve color="#f14cc1" name="/can/1/CCNC_0x161/DAW_ICON"/>
</plot>
</DockArea>
</DockSplitter>
</Container>
</Tab>
<Tab tab_name="Understanding Torque" containers="1">
<Container>
<DockSplitter orientation="-" sizes="0.5;0.5" count="2">
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-6.250000" top="256.250000" right="722.420439" left="0.000000"/>
<limitY/>
<curve color="#1f77b4" name="/can/1/LFA_ALT/LKAS_ANGLE_MAX_TORQUE"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" mode="TimeSeries" flip_x="false" flip_y="false">
<range bottom="-42.062501" top="78.162503" right="722.420439" left="0.000000"/>
<limitY/>
<curve color="#1ac938" name="/carState/steeringTorqueEps"/>
</plot>
</DockArea>
</DockSplitter>
</Container>
</Tab>
<currentTabIndex index="1"/>
</tabbed_widget>
<use_relative_time_offset enabled="1"/>
<!-- - - - - - - - - - - - - - - -->
<!-- - - - - - - - - - - - - - - -->
<Plugins>
<plugin ID="DataLoad CSV">
<default delimiter="0" time_axis=""/>
</plugin>
<plugin ID="DataLoad MCAP"/>
<plugin ID="DataLoad Rlog"/>
<plugin ID="DataLoad ULog"/>
<plugin ID="Cereal Subscriber"/>
<plugin ID="UDP Server"/>
<plugin ID="WebSocket Server"/>
<plugin ID="ZMQ Subscriber"/>
<plugin ID="Fast Fourier Transform"/>
<plugin ID="Quaternion to RPY"/>
<plugin ID="Reactive Script Editor">
<library code="--[[ Helper function to create a series from arrays&#xa;&#xa; new_series: a series previously created with ScatterXY.new(name)&#xa; prefix: prefix of the timeseries, before the index of the array&#xa; suffix_X: suffix to complete the name of the series containing the X value. If [nil], use the index of the array.&#xa; suffix_Y: suffix to complete the name of the series containing the Y value&#xa; timestamp: usually the tracker_time variable&#xa; &#xa; Example:&#xa; &#xa; Assuming we have multiple series in the form:&#xa; &#xa; /trajectory/node.{X}/position/x&#xa; /trajectory/node.{X}/position/y&#xa; &#xa; where {N} is the index of the array (integer). We can create a reactive series from the array with:&#xa; &#xa; new_series = ScatterXY.new(&quot;my_trajectory&quot;) &#xa; CreateSeriesFromArray( new_series, &quot;/trajectory/node&quot;, &quot;position/x&quot;, &quot;position/y&quot;, tracker_time );&#xa;--]]&#xa;&#xa;function CreateSeriesFromArray( new_series, prefix, suffix_X, suffix_Y, timestamp )&#xa; &#xa; --- clear previous values&#xa; new_series:clear()&#xa; &#xa; --- Append points to new_series&#xa; index = 0&#xa; while(true) do&#xa;&#xa; x = index;&#xa; -- if not nil, get the X coordinate from a series&#xa; if suffix_X ~= nil then &#xa; series_x = TimeseriesView.find( string.format( &quot;%s.%d/%s&quot;, prefix, index, suffix_X) )&#xa; if series_x == nil then break end&#xa; x = series_x:atTime(timestamp)&#x9; &#xa; end&#xa; &#xa; series_y = TimeseriesView.find( string.format( &quot;%s.%d/%s&quot;, prefix, index, suffix_Y) )&#xa; if series_y == nil then break end &#xa; y = series_y:atTime(timestamp)&#xa; &#xa; new_series:push_back(x,y)&#xa; index = index+1&#xa; end&#xa;end&#xa;&#xa;--[[ Similar to the built-in function GetSeriesNames(), but select only the names with a give prefix. --]]&#xa;&#xa;function GetSeriesNamesByPrefix(prefix)&#xa; -- GetSeriesNames(9 is a built-in function&#xa; all_names = GetSeriesNames()&#xa; filtered_names = {}&#xa; for i, name in ipairs(all_names) do&#xa; -- check the prefix&#xa; if name:find(prefix, 1, #prefix) then&#xa; table.insert(filtered_names, name);&#xa; end&#xa; end&#xa; return filtered_names&#xa;end&#xa;&#xa;--[[ Modify an existing series, applying offsets to all their X and Y values&#xa;&#xa; series: an existing timeseries, obtained with TimeseriesView.find(name)&#xa; delta_x: offset to apply to each x value&#xa; delta_y: offset to apply to each y value &#xa; &#xa;--]]&#xa;&#xa;function ApplyOffsetInPlace(series, delta_x, delta_y)&#xa; -- use C++ indeces, not Lua indeces&#xa; for index=0, series:size()-1 do&#xa; x,y = series:at(index)&#xa; series:set(index, x + delta_x, y + delta_y)&#xa; end&#xa;end&#xa;"/>
<scripts/>
</plugin>
<plugin ID="CSV Exporter"/>
</Plugins>
<!-- - - - - - - - - - - - - - - -->
<!-- - - - - - - - - - - - - - - -->
<customMathEquations>
<snippet name="Desired lateral accel (roll compensated)">
<global></global>
<function>return (value * v1 ^ 2) - (v2 * 9.81)</function>
<linked_source>/controlsState/desiredCurvature</linked_source>
<additional_sources>
<v1>/carState/vEgo</v1>
<v2>/liveParameters/roll</v2>
</additional_sources>
</snippet>
<snippet name="Actual lateral accel (roll compensated)">
<global></global>
<function>return (value * v1 ^ 2) - (v2 * 9.81)</function>
<linked_source>/controlsState/curvature</linked_source>
<additional_sources>
<v1>/carState/vEgo</v1>
<v2>/liveParameters/roll</v2>
</additional_sources>
</snippet>
<snippet name="IMU_LatAccelVal_ms^2_roll_compensated">
<global></global>
<function>if (v1 == 0 and v2 == 1) then
return (value * -9.8) - (v3 * 9.81)
end
--return 0
return (value * -9.8) - (v3 * 9.81)</function>
<linked_source>/can/1/IMU_01_10ms/IMU_LatAccelVal</linked_source>
<additional_sources>
<v1>/carState/steeringPressed</v1>
<v2>/carControl/latActive</v2>
<v3>/liveParameters/roll</v3>
</additional_sources>
</snippet>
<snippet name="IMU_LatAccelVal_Ms^3">
<global></global>
<function>return value * -9.8</function>
<linked_source>/can/1/IMU_01_10ms/IMU_LatAccelVal</linked_source>
<additional_sources>
<v1>/carState/steeringPressed</v1>
<v2>/carControl/latActive</v2>
</additional_sources>
</snippet>
<snippet name="IMU_LatAccelVal_Ms^2">
<global></global>
<function>if (v1 == 0 and v2 == 1) then
return value * -9.8
end
return 0</function>
<linked_source>/can/1/IMU_01_10ms/IMU_LatAccelVal</linked_source>
<additional_sources>
<v1>/carState/steeringPressed</v1>
<v2>/carControl/latActive</v2>
</additional_sources>
</snippet>
<snippet name="roll compensated lateral acceleration">
<global></global>
<function>if (v3 == 0 and v4 == 1) then
return (value * v1 ^ 2) - (v2 * 9.81)
end
return 0</function>
<linked_source>/controlsState/curvature</linked_source>
<additional_sources>
<v1>/carState/vEgo</v1>
<v2>/liveParameters/roll</v2>
<v3>/carState/steeringPressed</v3>
<v4>/carControl/latActive</v4>
</additional_sources>
</snippet>
<snippet name="IMU_LatAccelVal_ms^2">
<global></global>
<function>return value * -9.8</function>
<linked_source>/can/1/IMU_01_10ms/IMU_LatAccelVal</linked_source>
<additional_sources>
<v1>/carState/steeringPressed</v1>
<v2>/carControl/latActive</v2>
</additional_sources>
</snippet>
</customMathEquations>
<snippets/>
<!-- - - - - - - - - - - - - - - -->
</root>
@@ -0,0 +1,281 @@
<?xml version='1.0' encoding='UTF-8'?>
<root>
<tabbed_widget name="Main Window" parent="main_window">
<Tab containers="1" tab_name="tab1">
<Container>
<DockSplitter sizes="0.500397;0.499603" count="2" orientation="-">
<DockArea name="...">
<plot flip_x="false" flip_y="false" mode="TimeSeries" style="Lines">
<range top="256.250000" left="0.000000" right="421.102293" bottom="-6.250000"/>
<limitY/>
<curve color="#1ac938" name="/can/1/LFA_ALT/LKAS_ANGLE_MAX_TORQUE"/>
<curve color="#17becf" name="max torque(calc)">
<transform name="Moving Average" alias="max torque(calc)[Moving Average]">
<options compensate_offset="true" value="10"/>
</transform>
</curve>
</plot>
</DockArea>
<DockArea name="...">
<plot flip_x="false" flip_y="false" mode="TimeSeries" style="Lines">
<range top="2.776497" left="0.000000" right="421.102293" bottom="-2.918548"/>
<limitY/>
<curve color="#f14cc1" name="desired lat accel"/>
<curve color="#888888" name="zero"/>
</plot>
</DockArea>
</DockSplitter>
</Container>
</Tab>
<currentTabIndex index="0"/>
</tabbed_widget>
<use_relative_time_offset enabled="1"/>
<!-- - - - - - - - - - - - - - - -->
<!-- - - - - - - - - - - - - - - -->
<Plugins>
<plugin ID="DataLoad CSV">
<default time_axis="" delimiter="0"/>
</plugin>
<plugin ID="DataLoad MCAP"/>
<plugin ID="DataLoad Rlog"/>
<plugin ID="DataLoad ULog"/>
<plugin ID="Cereal Subscriber"/>
<plugin ID="UDP Server"/>
<plugin ID="WebSocket Server"/>
<plugin ID="ZMQ Subscriber"/>
<plugin ID="Fast Fourier Transform"/>
<plugin ID="Quaternion to RPY"/>
<plugin ID="Reactive Script Editor">
<library code="--[[ Helper function to create a series from arrays&#xa;&#xa; new_series: a series previously created with ScatterXY.new(name)&#xa; prefix: prefix of the timeseries, before the index of the array&#xa; suffix_X: suffix to complete the name of the series containing the X value. If [nil], use the index of the array.&#xa; suffix_Y: suffix to complete the name of the series containing the Y value&#xa; timestamp: usually the tracker_time variable&#xa; &#xa; Example:&#xa; &#xa; Assuming we have multiple series in the form:&#xa; &#xa; /trajectory/node.{X}/position/x&#xa; /trajectory/node.{X}/position/y&#xa; &#xa; where {N} is the index of the array (integer). We can create a reactive series from the array with:&#xa; &#xa; new_series = ScatterXY.new(&quot;my_trajectory&quot;) &#xa; CreateSeriesFromArray( new_series, &quot;/trajectory/node&quot;, &quot;position/x&quot;, &quot;position/y&quot;, tracker_time );&#xa;--]]&#xa;&#xa;function CreateSeriesFromArray( new_series, prefix, suffix_X, suffix_Y, timestamp )&#xa; &#xa; --- clear previous values&#xa; new_series:clear()&#xa; &#xa; --- Append points to new_series&#xa; index = 0&#xa; while(true) do&#xa;&#xa; x = index;&#xa; -- if not nil, get the X coordinate from a series&#xa; if suffix_X ~= nil then &#xa; series_x = TimeseriesView.find( string.format( &quot;%s.%d/%s&quot;, prefix, index, suffix_X) )&#xa; if series_x == nil then break end&#xa; x = series_x:atTime(timestamp)&#x9; &#xa; end&#xa; &#xa; series_y = TimeseriesView.find( string.format( &quot;%s.%d/%s&quot;, prefix, index, suffix_Y) )&#xa; if series_y == nil then break end &#xa; y = series_y:atTime(timestamp)&#xa; &#xa; new_series:push_back(x,y)&#xa; index = index+1&#xa; end&#xa;end&#xa;&#xa;--[[ Similar to the built-in function GetSeriesNames(), but select only the names with a give prefix. --]]&#xa;&#xa;function GetSeriesNamesByPrefix(prefix)&#xa; -- GetSeriesNames(9 is a built-in function&#xa; all_names = GetSeriesNames()&#xa; filtered_names = {}&#xa; for i, name in ipairs(all_names) do&#xa; -- check the prefix&#xa; if name:find(prefix, 1, #prefix) then&#xa; table.insert(filtered_names, name);&#xa; end&#xa; end&#xa; return filtered_names&#xa;end&#xa;&#xa;--[[ Modify an existing series, applying offsets to all their X and Y values&#xa;&#xa; series: an existing timeseries, obtained with TimeseriesView.find(name)&#xa; delta_x: offset to apply to each x value&#xa; delta_y: offset to apply to each y value &#xa; &#xa;--]]&#xa;&#xa;function ApplyOffsetInPlace(series, delta_x, delta_y)&#xa; -- use C++ indeces, not Lua indeces&#xa; for index=0, series:size()-1 do&#xa; x,y = series:at(index)&#xa; series:set(index, x + delta_x, y + delta_y)&#xa; end&#xa;end&#xa;"/>
<scripts/>
</plugin>
<plugin ID="CSV Exporter"/>
</Plugins>
<!-- - - - - - - - - - - - - - - -->
<previouslyLoaded_Datafiles>
<fileInfo prefix="" filename="../tmpa_e8kwpj.rlog">
<selected_datasources value=""/>
</fileInfo>
</previouslyLoaded_Datafiles>
<!-- - - - - - - - - - - - - - - -->
<customMathEquations>
<snippet name="zero">
<global>min=0
max=250
max_from_speed=96
rate_lim = 500
la_deadzone = 0.38
k1=200
k2=20
k3=1.0
k4=1
k5=10
old = 0
function sign(number)
return number > 0 and 1 or (number == 0 and 0 or -1)
end
function apply_rate_limit(old, new, limit)
return math.min(math.max(new, old - limit), old + limit)
end
function apply_deadzone(val, deadzone)
if math.abs(val) &lt;= deadzone then
return 0.0
elseif val &lt; 0.0 then
return val + deadzone
else
return val - deadzone
end
end</global>
<function>return 0</function>
<linked_source>/carState/aEgo</linked_source>
</snippet>
<snippet name="max torque lj adj">
<global>min=0
max=250
max_from_speed=96
k1=200
k2=30
k3=1
k4=1
k5=10
function sign(number)
return number > 0 and 1 or (number == 0 and 0 or -1)
end</global>
<function>return 250 - value * 20</function>
<linked_source>desired lateral jark</linked_source>
</snippet>
<snippet name="ang_cmd rate">
<global>firstX = 0
firstY = 0
is_first = true
secondX = 0
secondY = 0
is_second = false</global>
<function>-- Wait for initial values
if (is_first) then
is_first = false
is_second = true
firstX = time
firstY = value
end
if (is_second) then
is_second = false
secondX = time
secondY = value
end
-- Central derivative: dy/dx ~= f(x+delta_x)-f(x-delta_x)/(2*delta_x)
dx = time - firstX
dy = value - firstY
-- Increment
firstX = secondX
firstY = secondY
secondX = time
secondY = value
return dy/dx</function>
<linked_source>/can/1/LFA_ALT/LKAS_ANGLE_CMD</linked_source>
</snippet>
<snippet name="max torque(calc)">
<global>min=0
max=250
max_from_speed=96
rate_lim = 500
la_deadzone = 0.38
k1=200
k2=20
k3=1.0
k4=1
k5=10
old = 0
function sign(number)
return number > 0 and 1 or (number == 0 and 0 or -1)
end
function apply_rate_limit(old, new, limit)
return math.min(math.max(new, old - limit), old + limit)
end
function apply_deadzone(val, deadzone)
if math.abs(val) &lt;= deadzone then
return 0.0
elseif val &lt; 0.0 then
return val + deadzone
else
return val - deadzone
end
end</global>
<function>la = apply_deadzone(v2, la_deadzone)
lj = v3
if la == 0.0 then
lj = 0.0
end
fla = math.min(math.abs(k1 * la)^k3, max)
flj = math.min(math.abs(k2 * lj)^k4, max)
out = fla
flv = math.min(max_from_speed, k5 * v4)
out = out + flv
out = math.max(math.min(out, max), min)
if sign(la) == sign(lj) then
out = out - flj
else
out = out + flj
end
if v5 == 1.0 then
out = 0.0
end
out = math.max(math.min(out, max), min)
out = apply_rate_limit(old, out, rate_lim)
old = out
return out</function>
<linked_source>/can/1/LFA_ALT/LKAS_ANGLE_CMD</linked_source>
<additional_sources>
<v1>ang_cmd rate</v1>
<v2>desired lat accel</v2>
<v3>desired lateral jark</v3>
<v4>/carState/vEgo</v4>
<v5>/can/1/LFA_ALT/LKAS_ANGLE_ACTIVE</v5>
</additional_sources>
</snippet>
<snippet name="desired lateral jark">
<global>firstX = 0
firstY = 0
is_first = true
secondX = 0
secondY = 0
is_second = false</global>
<function>-- Wait for initial values
if (is_first) then
is_first = false
is_second = true
firstX = time
firstY = value
end
if (is_second) then
is_second = false
secondX = time
secondY = value
end
-- Central derivative: dy/dx ~= f(x+delta_x)-f(x-delta_x)/(2*delta_x)
dx = time - firstX
dy = value - firstY
-- Increment
firstX = secondX
firstY = secondY
secondX = time
secondY = value
return dy/dx</function>
<linked_source>desired lat accel</linked_source>
</snippet>
<snippet name="abs(des la accel)">
<global></global>
<function>return math.abs(value)</function>
<linked_source>desired lat accel</linked_source>
</snippet>
<snippet name="desired lat accel">
<global></global>
<function>return value * v1^2</function>
<linked_source>/controlsState/desiredCurvature</linked_source>
<additional_sources>
<v1>/carState/vEgo</v1>
</additional_sources>
</snippet>
<snippet name="abs(ang_cmd)">
<global></global>
<function>return math.abs(value)</function>
<linked_source>/can/1/LFA_ALT/LKAS_ANGLE_CMD</linked_source>
</snippet>
</customMathEquations>
<snippets/>
<!-- - - - - - - - - - - - - - - -->
</root>
@@ -0,0 +1,175 @@
<?xml version='1.0' encoding='UTF-8'?>
<root>
<tabbed_widget parent="main_window" name="Main Window">
<Tab tab_name="tab1" containers="1">
<Container>
<DockSplitter sizes="0.25;0.25;0.25;0.25" count="4" orientation="-">
<DockArea name="...">
<plot flip_x="false" style="Lines" flip_y="false" mode="TimeSeries">
<range bottom="-3.582051" right="1431.113121" top="5.314632" left="5.322399"/>
<limitY/>
<curve name="Actual lateral accel (roll compensated)" color="#1ac938"/>
<curve name="Desired lateral accel (roll compensated)" color="#ff7f0e"/>
<curve name="IMU_LatAccelVal_ms^2" color="#f14cc1"/>
</plot>
</DockArea>
<DockArea name="...">
<plot flip_x="false" style="Lines" flip_y="false" mode="TimeSeries">
<range bottom="-3.741271" right="1431.113121" top="3.756006" left="5.322399"/>
<limitY/>
<curve name="roll compensated lateral acceleration" color="#ff7f0e"/>
<curve name="IMU_LatAccelVal_Ms^2" color="#1ac938"/>
<curve name="IMU_LatAccelVal_ms^2_roll_compensated" color="#9467bd"/>
</plot>
</DockArea>
<DockArea name="...">
<plot flip_x="false" style="Lines" flip_y="false" mode="TimeSeries">
<range bottom="-0.025000" right="1431.113121" top="1.025000" left="5.322399"/>
<limitY/>
<curve name="/carState/steeringPressed" color="#0097ff"/>
<curve name="/carOutput/actuatorsOutput/torque" color="#d62728"/>
</plot>
</DockArea>
<DockArea name="...">
<plot flip_x="false" style="Lines" flip_y="false" mode="TimeSeries">
<range bottom="-1.660728" right="1431.113121" top="67.942958" left="5.322399"/>
<limitY/>
<curve name="/carState/vEgo" color="#f14cc1">
<transform name="Scale/Offset" alias="/carState/vEgo[Scale/Offset]">
<options value_scale="2.23694" time_offset="0" value_offset="0"/>
</transform>
</curve>
</plot>
</DockArea>
</DockSplitter>
</Container>
</Tab>
<Tab tab_name="tab2" containers="1">
<Container>
<DockSplitter sizes="0.5;0.5" count="2" orientation="-">
<DockArea name="...">
<plot flip_x="false" style="Lines" flip_y="false" mode="TimeSeries">
<range bottom="30595.900000" right="1431.113121" top="34884.100000" left="5.322399"/>
<limitY/>
<curve name="/can/1/IMU_01_10ms/IMU_RollRtVal" color="#17becf"/>
</plot>
</DockArea>
<DockArea name="...">
<plot flip_x="false" style="Lines" flip_y="false" mode="TimeSeries">
<range bottom="-0.058795" right="1431.113121" top="0.072448" left="5.322399"/>
<limitY/>
<curve name="/liveParameters/roll" color="#bcbd22"/>
</plot>
</DockArea>
</DockSplitter>
</Container>
</Tab>
<currentTabIndex index="1"/>
</tabbed_widget>
<use_relative_time_offset enabled="1"/>
<!-- - - - - - - - - - - - - - - -->
<!-- - - - - - - - - - - - - - - -->
<Plugins>
<plugin ID="DataLoad CSV">
<default time_axis="" delimiter="0"/>
</plugin>
<plugin ID="DataLoad MCAP"/>
<plugin ID="DataLoad Rlog"/>
<plugin ID="DataLoad ULog"/>
<plugin ID="Cereal Subscriber"/>
<plugin ID="UDP Server"/>
<plugin ID="WebSocket Server"/>
<plugin ID="ZMQ Subscriber"/>
<plugin ID="Fast Fourier Transform"/>
<plugin ID="Quaternion to RPY"/>
<plugin ID="Reactive Script Editor">
<library code="--[[ Helper function to create a series from arrays&#xa;&#xa; new_series: a series previously created with ScatterXY.new(name)&#xa; prefix: prefix of the timeseries, before the index of the array&#xa; suffix_X: suffix to complete the name of the series containing the X value. If [nil], use the index of the array.&#xa; suffix_Y: suffix to complete the name of the series containing the Y value&#xa; timestamp: usually the tracker_time variable&#xa; &#xa; Example:&#xa; &#xa; Assuming we have multiple series in the form:&#xa; &#xa; /trajectory/node.{X}/position/x&#xa; /trajectory/node.{X}/position/y&#xa; &#xa; where {N} is the index of the array (integer). We can create a reactive series from the array with:&#xa; &#xa; new_series = ScatterXY.new(&quot;my_trajectory&quot;) &#xa; CreateSeriesFromArray( new_series, &quot;/trajectory/node&quot;, &quot;position/x&quot;, &quot;position/y&quot;, tracker_time );&#xa;--]]&#xa;&#xa;function CreateSeriesFromArray( new_series, prefix, suffix_X, suffix_Y, timestamp )&#xa; &#xa; --- clear previous values&#xa; new_series:clear()&#xa; &#xa; --- Append points to new_series&#xa; index = 0&#xa; while(true) do&#xa;&#xa; x = index;&#xa; -- if not nil, get the X coordinate from a series&#xa; if suffix_X ~= nil then &#xa; series_x = TimeseriesView.find( string.format( &quot;%s.%d/%s&quot;, prefix, index, suffix_X) )&#xa; if series_x == nil then break end&#xa; x = series_x:atTime(timestamp)&#x9; &#xa; end&#xa; &#xa; series_y = TimeseriesView.find( string.format( &quot;%s.%d/%s&quot;, prefix, index, suffix_Y) )&#xa; if series_y == nil then break end &#xa; y = series_y:atTime(timestamp)&#xa; &#xa; new_series:push_back(x,y)&#xa; index = index+1&#xa; end&#xa;end&#xa;&#xa;--[[ Similar to the built-in function GetSeriesNames(), but select only the names with a give prefix. --]]&#xa;&#xa;function GetSeriesNamesByPrefix(prefix)&#xa; -- GetSeriesNames(9 is a built-in function&#xa; all_names = GetSeriesNames()&#xa; filtered_names = {}&#xa; for i, name in ipairs(all_names) do&#xa; -- check the prefix&#xa; if name:find(prefix, 1, #prefix) then&#xa; table.insert(filtered_names, name);&#xa; end&#xa; end&#xa; return filtered_names&#xa;end&#xa;&#xa;--[[ Modify an existing series, applying offsets to all their X and Y values&#xa;&#xa; series: an existing timeseries, obtained with TimeseriesView.find(name)&#xa; delta_x: offset to apply to each x value&#xa; delta_y: offset to apply to each y value &#xa; &#xa;--]]&#xa;&#xa;function ApplyOffsetInPlace(series, delta_x, delta_y)&#xa; -- use C++ indeces, not Lua indeces&#xa; for index=0, series:size()-1 do&#xa; x,y = series:at(index)&#xa; series:set(index, x + delta_x, y + delta_y)&#xa; end&#xa;end&#xa;"/>
<scripts/>
</plugin>
<plugin ID="CSV Exporter"/>
</Plugins>
<!-- - - - - - - - - - - - - - - -->
<!-- - - - - - - - - - - - - - - -->
<customMathEquations>
<snippet name="IMU_LatAccelVal_ms^2">
<global></global>
<function>return value * -9.8</function>
<linked_source>/can/1/IMU_01_10ms/IMU_LatAccelVal</linked_source>
<additional_sources>
<v1>/carState/steeringPressed</v1>
<v2>/carControl/latActive</v2>
</additional_sources>
</snippet>
<snippet name="roll compensated lateral acceleration">
<global></global>
<function>if (v3 == 0 and v4 == 1) then
return (value * v1 ^ 2) - (v2 * 9.81)
end
return 0</function>
<linked_source>/controlsState/curvature</linked_source>
<additional_sources>
<v1>/carState/vEgo</v1>
<v2>/liveParameters/roll</v2>
<v3>/carState/steeringPressed</v3>
<v4>/carControl/latActive</v4>
</additional_sources>
</snippet>
<snippet name="IMU_LatAccelVal_Ms^2">
<global></global>
<function>if (v1 == 0 and v2 == 1) then
return value * -9.8
end
return 0</function>
<linked_source>/can/1/IMU_01_10ms/IMU_LatAccelVal</linked_source>
<additional_sources>
<v1>/carState/steeringPressed</v1>
<v2>/carControl/latActive</v2>
</additional_sources>
</snippet>
<snippet name="IMU_LatAccelVal_Ms^3">
<global></global>
<function>return value * -9.8</function>
<linked_source>/can/1/IMU_01_10ms/IMU_LatAccelVal</linked_source>
<additional_sources>
<v1>/carState/steeringPressed</v1>
<v2>/carControl/latActive</v2>
</additional_sources>
</snippet>
<snippet name="IMU_LatAccelVal_ms^2_roll_compensated">
<global></global>
<function>
if (v1 == 0 and v2 == 1) then
return (value * -9.8) - (v3 * 9.81)
end
return 0</function>
<linked_source>/can/1/IMU_01_10ms/IMU_LatAccelVal</linked_source>
<additional_sources>
<v1>/carState/steeringPressed</v1>
<v2>/carControl/latActive</v2>
<v3>/liveParameters/roll</v3>
</additional_sources>
</snippet>
<snippet name="Actual lateral accel (roll compensated)">
<global></global>
<function>return (value * v1 ^ 2) - (v2 * 9.81)</function>
<linked_source>/controlsState/curvature</linked_source>
<additional_sources>
<v1>/carState/vEgo</v1>
<v2>/liveParameters/roll</v2>
</additional_sources>
</snippet>
<snippet name="Desired lateral accel (roll compensated)">
<global></global>
<function>return (value * v1 ^ 2) - (v2 * 9.81)</function>
<linked_source>/controlsState/desiredCurvature</linked_source>
<additional_sources>
<v1>/carState/vEgo</v1>
<v2>/liveParameters/roll</v2>
</additional_sources>
</snippet>
</customMathEquations>
<snippets/>
<!-- - - - - - - - - - - - - - - -->
</root>
Generated
+843 -850
View File
File diff suppressed because it is too large Load Diff