Merge remote-tracking branch 'sunnypilot/sunnypilot/master' into hkg-angle-steering-2025

# Conflicts:
#	common/params_keys.h
#	opendbc_repo
#	selfdrive/ui/sunnypilot/qt/offroad/settings/lateral_panel.cc
This commit is contained in:
Jason Wen
2025-10-10 17:02:14 -04:00
115 changed files with 8030 additions and 613 deletions
+3
View File
@@ -115,7 +115,9 @@ jobs:
- run: echo "CACHE_COMMIT_DATE=$(git log -1 --pretty='format:%cd' --date=format:'%Y-%m-%d-%H:%M')" >> $GITHUB_ENV
- name: Homebrew cache
uses: ./.github/workflows/auto-cache
if: false # disabling the cache for now because it is breaking macos builds...
with:
save: false # No need save here if we manually save it later conditionally
path: ~/Library/Caches/Homebrew
key: brew-macos-${{ env.CACHE_COMMIT_DATE }}-${{ github.sha }}
restore-keys: |
@@ -136,6 +138,7 @@ jobs:
- name: Getting scons cache
uses: ./.github/workflows/auto-cache
with:
save: false # No need save here if we manually save it later conditionally
path: /tmp/scons_cache
key: scons-${{ runner.arch }}-macos-${{ env.CACHE_COMMIT_DATE }}-${{ github.sha }}
restore-keys: |
@@ -118,8 +118,8 @@ jobs:
run: |
# Use GitHub API to get PRs with specific label, ordered by creation date
PR_LIST=$(gh api graphql -f query='
query($label:String!) {
search(query: $label, type:ISSUE, first:100) {
query($search_query:String!) {
search(query: $search_query, type:ISSUE, first:100) {
nodes {
... on PullRequest {
number
@@ -149,7 +149,7 @@ jobs:
}
}
}
}' -F label="is:pr is:open label:${PR_LABEL} draft:false sort:created-asc")
}' -F search_query="repo:${{ github.repository }} is:pr is:open label:${PR_LABEL},${PR_LABEL}-c3 draft:false sort:created-asc")
PR_LIST=${PR_LIST//\'/}
echo "PR_LIST=${PR_LIST}" >> $GITHUB_OUTPUT
+37
View File
@@ -148,6 +148,8 @@ struct LongitudinalPlanSP @0xf35cc4560bbf6ec2 {
speedLimit @3 :SpeedLimit;
vTarget @4 :Float32;
aTarget @5 :Float32;
events @6 :List(OnroadEventSP.Event);
e2eAlerts @7 :E2eAlerts;
struct DynamicExperimentalControl {
state @0 :DynamicExperimentalControlState;
@@ -201,12 +203,26 @@ struct LongitudinalPlanSP @0xf35cc4560bbf6ec2 {
struct SpeedLimit {
resolver @0 :Resolver;
assist @1 :Assist;
struct Resolver {
speedLimit @0 :Float32;
distToSpeedLimit @1 :Float32;
source @2 :Source;
speedLimitOffset @3 :Float32;
speedLimitLast @4 :Float32;
speedLimitFinal @5 :Float32;
speedLimitFinalLast @6 :Float32;
speedLimitValid @7 :Bool;
speedLimitLastValid @8 :Bool;
}
struct Assist {
state @0 :AssistState;
enabled @1 :Bool;
active @2 :Bool;
vTarget @3 :Float32;
aTarget @4 :Float32;
}
enum Source {
@@ -214,12 +230,27 @@ struct LongitudinalPlanSP @0xf35cc4560bbf6ec2 {
car @1;
map @2;
}
enum AssistState {
disabled @0;
inactive @1; # No speed limit set or not enabled by parameter.
preActive @2;
pending @3; # Awaiting new speed limit.
adapting @4; # Reducing speed to match new speed limit.
active @5; # Cruising at speed limit.
}
}
enum LongitudinalPlanSource {
cruise @0;
sccVision @1;
sccMap @2;
speedLimitAssist @3;
}
struct E2eAlerts {
greenLightAlert @0 :Bool;
leadDepartAlert @1 :Bool;
}
}
@@ -262,6 +293,11 @@ struct OnroadEventSP @0xda96579883444c35 {
pedalPressedAlertOnly @16;
laneTurnLeft @17;
laneTurnRight @18;
speedLimitPreActive @19;
speedLimitActive @20;
speedLimitChanged @21;
speedLimitPending @22;
e2eChime @23;
}
}
@@ -270,6 +306,7 @@ struct CarParamsSP @0x80ae746ee2596b11 {
safetyParam @1 : Int16; # flags for sunnypilot's custom safety flags
pcmCruiseSpeed @3 :Bool;
intelligentCruiseButtonManagementAvailable @4 :Bool;
enableGasInterceptor @5 :Bool;
neuralNetworkLateralControl @2 :NeuralNetworkLateralControl;
+20 -1
View File
@@ -148,20 +148,29 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"DevUIInfo", {PERSISTENT | BACKUP, INT, "0"}},
{"EnableCopyparty", {PERSISTENT | BACKUP, BOOL}},
{"EnableGithubRunner", {PERSISTENT | BACKUP, BOOL}},
{"GreenLightAlert", {PERSISTENT | BACKUP, BOOL, "0"}},
{"GithubRunnerSufficientVoltage", {CLEAR_ON_MANAGER_START , BOOL}},
{"HideVEgoUI", {PERSISTENT | BACKUP, BOOL, "0"}},
{"IntelligentCruiseButtonManagement", {PERSISTENT | BACKUP , BOOL}},
{"InteractivityTimeout", {PERSISTENT | BACKUP, INT, "0"}},
{"IsDevelopmentBranch", {CLEAR_ON_MANAGER_START, BOOL}},
{"LastGPSPositionLLK", {PERSISTENT, STRING}},
{"LeadDepartAlert", {PERSISTENT | BACKUP, BOOL, "0"}},
{"MaxTimeOffroad", {PERSISTENT | BACKUP, INT, "1800"}},
{"ModelRunnerTypeCache", {CLEAR_ON_ONROAD_TRANSITION, INT}},
{"OffroadMode", {CLEAR_ON_MANAGER_START, BOOL}},
{"Offroad_TiciSupport", {CLEAR_ON_MANAGER_START, JSON}},
{"OnroadScreenOffBrightness", {PERSISTENT | BACKUP, INT, "100"}},
{"OnroadScreenOffControl", {PERSISTENT | BACKUP, BOOL}},
{"OnroadScreenOffTimer", {PERSISTENT | BACKUP, INT, "0"}},
{"OnroadUploads", {PERSISTENT | BACKUP, BOOL, "1"}},
{"QuickBootToggle", {PERSISTENT | BACKUP, BOOL, "0"}},
{"QuietMode", {PERSISTENT | BACKUP, BOOL, "0"}},
{"RainbowMode", {PERSISTENT | BACKUP, BOOL, "0"}},
{"ShowAdvancedControls", {PERSISTENT | BACKUP, BOOL, "0"}},
{"ShowTurnSignals", {PERSISTENT | BACKUP, BOOL, "0"}},
{"StandstillTimer", {PERSISTENT | BACKUP, BOOL, "0"}},
{"TrueVEgoUI", {PERSISTENT | BACKUP, BOOL, "0"}},
// MADS params
{"Mads", {PERSISTENT | BACKUP, BOOL, "1"}},
@@ -187,7 +196,8 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"SunnylinkCache_Users", {PERSISTENT, STRING}},
{"SunnylinkDongleId", {PERSISTENT, STRING}},
{"SunnylinkdPid", {PERSISTENT, INT}},
{"SunnylinkEnabled", {PERSISTENT, BOOL}},
{"SunnylinkEnabled", {PERSISTENT, BOOL, "1"}},
{"SunnylinkTempFault", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, BOOL, "0"}},
// Backup Manager params
{"BackupManager_CreateBackup", {PERSISTENT, BOOL}},
@@ -238,6 +248,15 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"SmartCruiseControlMap", {PERSISTENT | BACKUP, BOOL, "0"}},
{"SmartCruiseControlVision", {PERSISTENT | BACKUP, BOOL, "0"}},
// Torque lateral control custom params
{"CustomTorqueParams", {PERSISTENT | BACKUP , BOOL}},
{"EnforceTorqueControl", {PERSISTENT | BACKUP, BOOL}},
{"LiveTorqueParamsToggle", {PERSISTENT | BACKUP , BOOL}},
{"LiveTorqueParamsRelaxedToggle", {PERSISTENT | BACKUP , BOOL}},
{"TorqueParamsOverrideEnabled", {PERSISTENT | BACKUP, BOOL, "0"}},
{"TorqueParamsOverrideFriction", {PERSISTENT | BACKUP, FLOAT, "0.1"}},
{"TorqueParamsOverrideLatAccelFactor", {PERSISTENT | BACKUP, FLOAT, "2.5"}},
// Tuning keys
{"EnableHkgTuningAngleSmoothingFactor", {PERSISTENT | BACKUP, BOOL, "1"}},
{"HkgTuningAngleMinTorqueReductionGain", {PERSISTENT | BACKUP, INT, "10"}},
+6 -3
View File
@@ -4,7 +4,7 @@
A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified.
# 334 Supported Cars
# 337 Supported Cars
|Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|<a href="##"><img width=2000></a>Hardware Needed<br>&nbsp;|Video|Setup Video|
|---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
@@ -83,7 +83,7 @@ A supported vehicle is one that just works when you install a comma device. All
|Honda|Civic Hatchback 2017-18|Honda Sensing|openpilot available[<sup>1</sup>](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback 2017-18">Buy Here</a></sub></details>|||
|Honda|Civic Hatchback 2019-21|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback 2019-21">Buy Here</a></sub></details>|||
|Honda|Civic Hatchback 2022-24|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback 2022-24">Buy Here</a></sub></details>|<a href="https://youtu.be/ytiOT5lcp6Q" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>||
|Honda|Civic Hatchback Hybrid 2025|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback Hybrid 2025">Buy Here</a></sub></details>|||
|Honda|Civic Hatchback Hybrid 2025-26|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback Hybrid 2025-26">Buy Here</a></sub></details>|||
|Honda|Civic Hatchback Hybrid (Europe only) 2023|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback Hybrid (Europe only) 2023">Buy Here</a></sub></details>|||
|Honda|Civic Hybrid 2025|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hybrid 2025">Buy Here</a></sub></details>|||
|Honda|Clarity 2018-21|Honda Sensing|openpilot|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector + Honda Clarity Proxy Board<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://shop.retropilot.org/product/honda-clarity-proxy-board-kit">Buy Here</a></sub></details>|||
@@ -99,7 +99,9 @@ A supported vehicle is one that just works when you install a comma device. All
|Honda|HR-V 2023-25|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda HR-V 2023-25">Buy Here</a></sub></details>|||
|Honda|Insight 2019-22|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Insight 2019-22">Buy Here</a></sub></details>|||
|Honda|Inspire 2018|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Inspire 2018">Buy Here</a></sub></details>|||
|Honda|N-Box 2018|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|11 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda N-Box 2018">Buy Here</a></sub></details>|||
|Honda|Odyssey 2018-20|Honda Sensing|openpilot|26 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Odyssey 2018-20">Buy Here</a></sub></details>|||
|Honda|Odyssey 2021-25|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|43 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Odyssey 2021-25">Buy Here</a></sub></details>|||
|Honda|Passport 2019-25|All|openpilot|26 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Passport 2019-25">Buy Here</a></sub></details>|||
|Honda|Pilot 2016-22|Honda Sensing|openpilot|26 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Pilot 2016-22">Buy Here</a></sub></details>|||
|Honda|Pilot 2023-25|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch C connector<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Pilot 2023-25">Buy Here</a></sub></details>|||
@@ -163,6 +165,7 @@ A supported vehicle is one that just works when you install a comma device. All
|Kia|EV6 (without HDA II) 2022-24[<sup>6</sup>](#footnotes)|Highway Driving Assist|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai L connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia EV6 (without HDA II) 2022-24">Buy Here</a></sub></details>|||
|Kia|Forte 2019-21|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|6 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai G connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia Forte 2019-21">Buy Here</a></sub></details>|||
|Kia|Forte 2022-23|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai E connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia Forte 2022-23">Buy Here</a></sub></details>|||
|Kia|Forte Non-SCC 2019|No Smart Cruise Control (Non-SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai G connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia Forte Non-SCC 2019">Buy Here</a></sub></details>|||
|Kia|K5 2021-24|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia K5 2021-24">Buy Here</a></sub></details>|||
|Kia|K5 Hybrid 2020-22|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia K5 Hybrid 2020-22">Buy Here</a></sub></details>|||
|Kia|K8 Hybrid (with HDA II) 2023[<sup>6</sup>](#footnotes)|Highway Driving Assist II|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai Q connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Kia K8 Hybrid (with HDA II) 2023">Buy Here</a></sub></details>|||
@@ -259,7 +262,7 @@ A supported vehicle is one that just works when you install a comma device. All
|Tesla[<sup>11</sup>](#footnotes)|Model 3 (with HW3) 2019-23[<sup>10</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Tesla A connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Tesla Model 3 (with HW3) 2019-23">Buy Here</a></sub></details>|||
|Tesla[<sup>11</sup>](#footnotes)|Model 3 (with HW4) 2024-25[<sup>10</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Tesla B connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Tesla Model 3 (with HW4) 2024-25">Buy Here</a></sub></details>|||
|Tesla[<sup>11</sup>](#footnotes)|Model Y (with HW3) 2020-23[<sup>10</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Tesla A connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Tesla Model Y (with HW3) 2020-23">Buy Here</a></sub></details>|||
|Tesla[<sup>11</sup>](#footnotes)|Model Y (with HW4) 2024[<sup>10</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Tesla B connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Tesla Model Y (with HW4) 2024">Buy Here</a></sub></details>|||
|Tesla[<sup>11</sup>](#footnotes)|Model Y (with HW4) 2024-25[<sup>10</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Tesla B connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Tesla Model Y (with HW4) 2024-25">Buy Here</a></sub></details>|||
|Toyota|Alphard 2019-20|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Toyota Alphard 2019-20">Buy Here</a></sub></details>|||
|Toyota|Alphard Hybrid 2021|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Toyota Alphard Hybrid 2021">Buy Here</a></sub></details>|||
|Toyota|Avalon 2016|Toyota Safety Sense P|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x?harness=Toyota Avalon 2016">Buy Here</a></sub></details>|||
+3 -2
View File
@@ -71,7 +71,7 @@ class Car:
def __init__(self, CI=None, RI=None) -> None:
self.can_sock = messaging.sub_sock('can', timeout=20)
self.sm = messaging.SubMaster(['pandaStates', 'carControl', 'onroadEvents'] + ['carControlSP'])
self.sm = messaging.SubMaster(['pandaStates', 'carControl', 'onroadEvents'] + ['carControlSP', 'longitudinalPlanSP'])
self.pm = messaging.PubMaster(['sendcan', 'carState', 'carParams', 'carOutput', 'liveTracks'] + ['carParamsSP', 'carStateSP'])
self.can_rcv_cum_timeout_counter = 0
@@ -124,7 +124,7 @@ class Car:
self.CP.alternativeExperience = 0
# mads
set_alternative_experience(self.CP, self.params)
set_alternative_experience(self.CP, self.CP_SP, self.params)
set_car_specific_params(self.CP, self.CP_SP, self.params)
# Dynamic Experimental Control
@@ -216,6 +216,7 @@ class Car:
if can_rcv_valid and REPLAY:
self.can_log_mono_time = messaging.log_from_bytes(can_strs[0]).logMonoTime
self.v_cruise_helper.update_speed_limit_assist(self.is_metric, self.sm['longitudinalPlanSP'])
self.v_cruise_helper.update_v_cruise(CS, self.sm['carControl'].enabled, self.is_metric)
if self.sm['carControl'].enabled and not self.CC_prev.enabled:
# Use CarState w/ buttons from the step selfdrived enables on
+7
View File
@@ -53,6 +53,7 @@ class VCruiseHelper(VCruiseHelperSP):
if not self.CP.pcmCruise or (not self.CP_SP.pcmCruiseSpeed and _enabled):
# if stock cruise is completely disabled, then we can use our own set speed logic
self._update_v_cruise_non_pcm(CS, _enabled, is_metric)
self.update_speed_limit_assist_v_cruise_non_pcm()
self.v_cruise_cluster_kph = self.v_cruise_kph
self.update_button_timers(CS, enabled)
else:
@@ -104,6 +105,12 @@ class VCruiseHelper(VCruiseHelperSP):
if not self.button_change_states[button_type]["enabled"]:
return
# Speed Limit Assist for Non PCM long cars.
# True: Disallow set speed changes when user confirmed the target set speed during preActive state
# False: Allow set speed changes as SLA is not requesting user confirmation
if self.update_speed_limit_assist_pre_active_confirmed(button_type):
return
long_press, v_cruise_delta = VCruiseHelperSP.update_v_cruise_delta(self, long_press, v_cruise_delta)
if long_press and self.v_cruise_kph % v_cruise_delta != 0: # partial interval
self.v_cruise_kph = CRUISE_NEAREST_FUNC[button_type](self.v_cruise_kph / v_cruise_delta) * v_cruise_delta
+1 -1
View File
@@ -57,7 +57,7 @@ def convert_carControlSP(struct: capnp.lib.capnp._DynamicStructReader) -> struct
struct_dataclass = structs.CarControlSP(**remove_deprecated({k: v for k, v in struct_dict.items() if not isinstance(k, dict)}))
struct_dataclass.mads = structs.ModularAssistiveDrivingSystem(**remove_deprecated(struct_dict.get('mads', {})))
struct_dataclass.params = [structs.CarControlSP.Param(**remove_deprecated(p)) for p in struct_dict.get('params', [])]
# struct_dataclass.params = [structs.CarControlSP.Param(**remove_deprecated(p)) for p in struct_dict.get('params', [])]
struct_dataclass.leadOne = structs.LeadData(**remove_deprecated(struct_dict.get('leadOne', {})))
struct_dataclass.leadTwo = structs.LeadData(**remove_deprecated(struct_dict.get('leadTwo', {})))
struct_dataclass.intelligentCruiseButtonManagement = structs.IntelligentCruiseButtonManagement(
+1 -1
View File
@@ -60,7 +60,7 @@ class TestCarInterfaces:
# Test controller initialization
# TODO: wait until card refactor is merged to run controller a few times,
# hypothesis also slows down significantly with just one more message draw
LongControl(car_params)
LongControl(car_params, car_params_sp)
if car_params.steerControlType == CarParams.SteerControlType.angle:
LatControlAngle(car_params, car_params_sp, car_interface)
elif car_params.lateralTuning.which() == 'pid':
+1 -1
View File
@@ -58,7 +58,7 @@ class Controls(ControlsExt, ModelStateBase):
self.pose_calibrator = PoseCalibrator()
self.calibrated_pose: Pose | None = None
self.LoC = LongControl(self.CP)
self.LoC = LongControl(self.CP, self.CP_SP)
self.VM = VehicleModel(self.CP)
self.LaC: LatControl
if self.CP.steerControlType == car.CarParams.SteerControlType.angle:
@@ -48,6 +48,10 @@ class LatControlTorque(LatControl):
self.lateral_accel_from_torque(-self.steer_max, self.torque_params))
def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, calibrated_pose, curvature_limited):
# Override torque params from extension
if self.extension.update_override_torque_params(self.torque_params):
self.update_limits()
pid_log = log.ControlsState.LateralTorqueState.new_message()
if not active:
output_torque = 0.0
+7 -3
View File
@@ -10,8 +10,11 @@ CONTROL_N_T_IDX = ModelConstants.T_IDXS[:CONTROL_N]
LongCtrlState = car.CarControl.Actuators.LongControlState
def long_control_state_trans(CP, active, long_control_state, v_ego,
def long_control_state_trans(CP, CP_SP, active, long_control_state, v_ego,
should_stop, brake_pressed, cruise_standstill):
# Gas Interceptor
cruise_standstill = cruise_standstill and not CP_SP.enableGasInterceptor
stopping_condition = should_stop
starting_condition = (not should_stop and
not cruise_standstill and
@@ -45,8 +48,9 @@ def long_control_state_trans(CP, active, long_control_state, v_ego,
return long_control_state
class LongControl:
def __init__(self, CP):
def __init__(self, CP, CP_SP):
self.CP = CP
self.CP_SP = CP_SP
self.long_control_state = LongCtrlState.off
self.pid = PIDController((CP.longitudinalTuning.kpBP, CP.longitudinalTuning.kpV),
(CP.longitudinalTuning.kiBP, CP.longitudinalTuning.kiV),
@@ -61,7 +65,7 @@ class LongControl:
self.pid.neg_limit = accel_limits[0]
self.pid.pos_limit = accel_limits[1]
self.long_control_state = long_control_state_trans(self.CP, active, self.long_control_state, CS.vEgo,
self.long_control_state = long_control_state_trans(self.CP, self.CP_SP, active, self.long_control_state, CS.vEgo,
should_stop, CS.brakePressed,
CS.cruiseState.standstill)
if self.long_control_state == LongCtrlState.off:
@@ -146,7 +146,7 @@ class LongitudinalPlanner(LongitudinalPlannerSP):
clipped_accel_coast_interp = np.interp(v_ego, [MIN_ALLOW_THROTTLE_SPEED, MIN_ALLOW_THROTTLE_SPEED*2], [accel_clip[1], clipped_accel_coast])
accel_clip[1] = min(accel_clip[1], clipped_accel_coast_interp)
# Get new v_cruise and a_desired from Smart Cruise Control
# Get new v_cruise and a_desired from Smart Cruise Control and Speed Limit Assist
v_cruise, self.a_desired = LongitudinalPlannerSP.update_targets(self, sm, self.v_desired_filter.x, self.a_desired, v_cruise)
if force_slow_decel:
+2 -1
View File
@@ -24,10 +24,11 @@ def main():
pm = messaging.PubMaster(['longitudinalPlan', 'driverAssistance', 'longitudinalPlanSP'])
sm = messaging.SubMaster(['carControl', 'carState', 'controlsState', 'liveParameters', 'radarState', 'modelV2', 'selfdriveState',
'liveMapDataSP', 'carStateSP', gps_location_service],
poll='modelV2')
poll='carState')
while True:
sm.update()
longitudinal_planner.sla.update_car_state(sm['carState'])
if sm.updated['modelV2']:
longitudinal_planner.update(sm)
longitudinal_planner.publish(sm, pm)
+15 -12
View File
@@ -1,4 +1,4 @@
from cereal import car
from cereal import car, custom
from openpilot.selfdrive.controls.lib.longcontrol import LongCtrlState, long_control_state_trans
@@ -8,49 +8,52 @@ class TestLongControlStateTransition:
def test_stay_stopped(self):
CP = car.CarParams.new_message()
CP_SP = custom.CarParamsSP.new_message()
active = True
current_state = LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=True, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=True, cruise_standstill=False)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=False, cruise_standstill=True)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=1.0,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=1.0,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.pid
active = False
next_state = long_control_state_trans(CP, active, current_state, v_ego=1.0,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=1.0,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.off
def test_engage():
CP = car.CarParams.new_message()
CP_SP = custom.CarParamsSP.new_message()
active = True
current_state = LongCtrlState.off
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=True, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=True, cruise_standstill=False)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=False, cruise_standstill=True)
assert next_state == LongCtrlState.stopping
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.pid
def test_starting():
CP = car.CarParams.new_message(startingState=True, vEgoStarting=0.5)
CP_SP = custom.CarParamsSP.new_message()
active = True
current_state = LongCtrlState.starting
next_state = long_control_state_trans(CP, active, current_state, v_ego=0.1,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=0.1,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.starting
next_state = long_control_state_trans(CP, active, current_state, v_ego=1.0,
next_state = long_control_state_trans(CP, CP_SP, active, current_state, v_ego=1.0,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.pid
+8 -2
View File
@@ -11,6 +11,7 @@ from openpilot.common.filter_simple import FirstOrderFilter
from openpilot.common.swaglog import cloudlog
from openpilot.selfdrive.locationd.helpers import PointBuckets, ParameterEstimator, PoseCalibrator, Pose
from openpilot.sunnypilot.livedelay.helpers import get_lat_delay
from openpilot.sunnypilot.selfdrive.locationd.torqued_ext import TorqueEstimatorExt
HISTORY = 5 # secs
POINTS_PER_BUCKET = 1500
@@ -50,9 +51,10 @@ class TorqueBuckets(PointBuckets):
break
class TorqueEstimator(ParameterEstimator):
class TorqueEstimator(ParameterEstimator, TorqueEstimatorExt):
def __init__(self, CP, decimated=False, track_all_points=False):
super().__init__()
ParameterEstimator.__init__(self)
TorqueEstimatorExt.__init__(self, CP)
self.CP = CP
self.hist_len = int(HISTORY / DT_MDL)
self.lag = 0.0
@@ -82,6 +84,8 @@ class TorqueEstimator(ParameterEstimator):
self.calibrator = PoseCalibrator()
TorqueEstimatorExt.initialize_custom_params(self, decimated)
self.reset()
initial_params = {
@@ -260,6 +264,8 @@ def main(demo=False):
t = sm.logMonoTime[which] * 1e-9
estimator.handle_log(t, which, sm[which])
TorqueEstimatorExt.update_use_params(estimator)
# 4Hz driven by livePose
if sm.frame % 5 == 0:
pm.send('liveTorqueParameters', estimator.get_msg(valid=sm.all_checks()))
+2 -1
View File
@@ -159,7 +159,7 @@ class SelfdriveD(CruiseHelper):
self.mads = ModularAssistiveDrivingSystem(self)
self.icbm = IntelligentCruiseButtonManagement(self.CP, self.CP_SP)
self.car_events_sp = CarSpecificEventsSP(self.CP, self.params)
self.car_events_sp = CarSpecificEventsSP(self.CP, self.CP_SP)
CruiseHelper.__init__(self, self.CP)
@@ -205,6 +205,7 @@ class SelfdriveD(CruiseHelper):
if not self.CP.notCar:
self.events.add_from_msg(self.sm['driverMonitoringState'].events)
self.events_sp.add_from_msg(self.sm['longitudinalPlanSP'].events)
# Add car events, ignore if CAN isn't valid
if CS.canValid:
-9
View File
@@ -4,9 +4,6 @@
#include <map>
#include "selfdrive/ui/qt/util.h"
#ifdef SUNNYPILOT
#include "selfdrive/ui/sunnypilot/ui.h"
#endif
void OnroadAlerts::updateState(const UIState &s) {
Alert a = getAlert(*(s.sm), s.scene.started_frame);
@@ -76,12 +73,6 @@ void OnroadAlerts::paintEvent(QPaintEvent *event) {
}
QRect r = QRect(0 + margin, height() - h + margin, width() - margin*2, h - margin*2);
#ifdef SUNNYPILOT
const int dev_ui_info = uiStateSP()->scene.dev_ui_info;
const int adjustment = dev_ui_info > 1 && alert.size != cereal::SelfdriveState::AlertSize::FULL ? 30 : 0;
r = QRect(0 + margin, height() - h + margin - adjustment, width() - margin*2, h - margin*2);
#endif
QPainter p(this);
// draw background + gradient
+2 -1
View File
@@ -47,11 +47,12 @@ void HudRenderer::draw(QPainter &p, const QRect &surface_rect) {
bg.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0));
p.fillRect(0, 0, surface_rect.width(), UI_HEADER_HEIGHT, bg);
#ifndef SUNNYPILOT
if (is_cruise_available) {
drawSetSpeed(p, surface_rect);
}
drawCurrentSpeed(p, surface_rect);
#endif
p.restore();
}
+2
View File
@@ -4,8 +4,10 @@
#ifdef SUNNYPILOT
#include "selfdrive/ui/sunnypilot/qt/onroad/annotated_camera.h"
#include "selfdrive/ui/sunnypilot/qt/onroad/alerts.h"
#define UIState UIStateSP
#define AnnotatedCameraWidget AnnotatedCameraWidgetSP
#define OnroadAlerts OnroadAlertsSP
#else
#include "selfdrive/ui/qt/onroad/annotated_camera.h"
#endif
+9 -1
View File
@@ -24,6 +24,7 @@ qt_src = [
"sunnypilot/qt/offroad/offroad_home.cc",
"sunnypilot/qt/offroad/settings/developer_panel.cc",
"sunnypilot/qt/offroad/settings/device_panel.cc",
"sunnypilot/qt/offroad/settings/display_panel.cc",
"sunnypilot/qt/offroad/settings/lateral_panel.cc",
"sunnypilot/qt/offroad/settings/longitudinal_panel.cc",
"sunnypilot/qt/offroad/settings/max_time_offroad.cc",
@@ -37,6 +38,7 @@ qt_src = [
"sunnypilot/qt/offroad/settings/trips_panel.cc",
"sunnypilot/qt/offroad/settings/vehicle_panel.cc",
"sunnypilot/qt/offroad/settings/visuals_panel.cc",
"sunnypilot/qt/onroad/alerts.cc",
"sunnypilot/qt/onroad/annotated_camera.cc",
"sunnypilot/qt/onroad/buttons.cc",
"sunnypilot/qt/onroad/developer_ui/developer_ui.cc",
@@ -51,6 +53,8 @@ lateral_panel_qt_src = [
"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",
"sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_custom_params.cc",
"sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_settings.cc",
]
longitudinal_panel_qt_src = [
@@ -91,9 +95,13 @@ brand_settings_qt_src = [
"sunnypilot/qt/offroad/settings/vehicle/volkswagen_settings.cc",
]
display_panel_qt_src = [
"sunnypilot/qt/offroad/settings/display/onroad_screen_brightness.cc",
]
sp_widgets_src = widgets_src + network_src
sp_qt_src = qt_src + lateral_panel_qt_src + vehicle_panel_qt_src + brand_settings_qt_src + longitudinal_panel_qt_src + osm_panel_qt_src
sp_qt_src = qt_src + lateral_panel_qt_src + vehicle_panel_qt_src + brand_settings_qt_src + \
longitudinal_panel_qt_src + osm_panel_qt_src + display_panel_qt_src
sp_qt_util = qt_util
Export('sp_widgets_src', 'sp_qt_src', "sp_qt_util")
@@ -25,8 +25,8 @@ const QMap<QString, QString> Brightness::brightness_options = {
Brightness::Brightness() : OptionControlSP(
"Brightness",
tr("Brightness"),
tr("Overrides the brightness of the device."),
tr("Global Brightness"),
tr("Overrides the brightness of the device. This applies to both onroad and offroad screens. "),
"../assets/offroad/icon_blank.png",
{0, 11}, 1, true, &brightness_options) {
@@ -23,6 +23,7 @@ DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) {
{"regulatoryBtn", tr("Regulatory"), ""},
{"translateBtn", tr("Language"), ""},
{"resetParams", tr("Reset Settings"), ""},
{"onroadUploadsBtn", tr("Onroad Uploads"), "OnroadUploads"}
};
int row = 0, col = 0;
@@ -75,12 +76,14 @@ DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) {
connect(buttons["resetParams"], &PushButtonSP::clicked, this, &DevicePanelSP::resetSettings);
connect(buttons["onroadUploadsBtn"], &PushButtonSP::clicked, buttons["onroadUploadsBtn"], &PushButtonSP::updateButton);
// Max Time Offroad
maxTimeOffroad = new MaxTimeOffroad();
connect(maxTimeOffroad, &OptionControlSP::updateLabels, maxTimeOffroad, &MaxTimeOffroad::refresh);
addItem(maxTimeOffroad);
toggleDeviceBootMode = new ButtonParamControlSP("DeviceBootMode", tr("Wake-Up Behavior"), "", "", {"Default", "Offroad"}, 375, true);
toggleDeviceBootMode = new ButtonParamControlSP("DeviceBootMode", tr("Wake-Up Behavior"), "", "", {"Default", "Offroad"}, 375, true);
addItem(toggleDeviceBootMode);
connect(toggleDeviceBootMode, &ButtonParamControlSP::buttonClicked, this, [=](int index) {
@@ -88,22 +91,6 @@ DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) {
updateState();
});
interactivityTimeout = new OptionControlSP("InteractivityTimeout", tr("Interactivity Timeout"),
tr("Apply a custom timeout for settings UI."
"\nThis is the time after which settings UI closes automatically if user is not interacting with the screen."),
"", {0, 120}, 10, true, nullptr, false);
connect(interactivityTimeout, &OptionControlSP::updateLabels, [=]() {
updateState();
});
addItem(interactivityTimeout);
// Brightness
brightness = new Brightness();
connect(brightness, &OptionControlSP::updateLabels, brightness, &Brightness::refresh);
addItem(brightness);
addItem(device_grid_layout);
// offroad mode and power buttons
@@ -129,9 +116,8 @@ DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) {
offroadBtn->setFixedWidth(power_layout->sizeHint().width());
QObject::connect(offroadBtn, &PushButtonSP::clicked, this, &DevicePanelSP::setOffroadMode);
QVBoxLayout *power_group_layout = new QVBoxLayout();
power_group_layout = new QVBoxLayout();
power_group_layout->setSpacing(25);
power_group_layout->addWidget(offroadBtn, 0, Qt::AlignHCenter);
power_group_layout->addLayout(power_layout);
addItem(power_group_layout);
@@ -141,9 +127,10 @@ DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) {
poweroffBtn,
offroadBtn,
buttons["quietModeBtn"],
buttons["onroadUploadsBtn"],
};
QObject::connect(uiState(), &UIState::offroadTransition, [=](bool offroad) {
QObject::connect(uiState(), &UIState::offroadTransition, [=](bool _offroad) {
for (auto btn : findChildren<PushButtonSP*>()) {
bool always_enabled = std::find(always_enabled_btns.begin(), always_enabled_btns.end(), btn) != always_enabled_btns.end();
@@ -151,6 +138,8 @@ DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) {
btn->setEnabled(offroad);
}
}
offroad = _offroad;
updateState();
});
}
@@ -201,7 +190,7 @@ void DevicePanelSP::updateState() {
}
bool offroad_mode_param = params.getBool("OffroadMode");
offroadBtn->setText(offroad_mode_param ? tr("Exit Always Offroad") : tr("Always Offroad"));
offroadBtn->setText(offroad_mode_param ? tr("Exit Always Offroad") : tr("Enable Always Offroad"));
offroadBtn->setStyleSheet(offroad_mode_param ? alwaysOffroadStyle : autoOffroadStyle);
DeviceSleepModeStatus currStatus = DeviceSleepModeStatus::DEFAULT;
@@ -210,10 +199,9 @@ void DevicePanelSP::updateState() {
}
toggleDeviceBootMode->setDescription(deviceSleepModeDescription(currStatus));
QString timeoutValue = QString::fromStdString(params.get("InteractivityTimeout"));
if (timeoutValue == "0" || timeoutValue.isEmpty()) {
interactivityTimeout->setLabel("Default");
if (offroad and not offroad_mode_param) {
power_group_layout->insertWidget(0, offroadBtn, 0, Qt::AlignHCenter);
} else {
interactivityTimeout->setLabel(timeoutValue + "s");
AddWidgetAt(0, offroadBtn);
}
}
@@ -8,7 +8,6 @@
#pragma once
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/max_time_offroad.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/brightness.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
@@ -32,8 +31,8 @@ private:
PushButtonSP *offroadBtn;
MaxTimeOffroad *maxTimeOffroad;
ButtonParamControlSP *toggleDeviceBootMode;
Brightness *brightness;
OptionControlSP *interactivityTimeout;
QVBoxLayout *power_group_layout;
bool offroad;
const QString alwaysOffroadStyle = R"(
PushButtonSP {
@@ -0,0 +1,54 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/display/onroad_screen_brightness.h"
OnroadScreenBrightnessControl::OnroadScreenBrightnessControl(const QString &param, const QString &title,
const QString &description, const QString &icon,
QWidget *parent)
: ExpandableToggleRow(param, title, description, icon, parent) {
auto *mainFrame = new QFrame(this);
auto *mainFrameLayout = new QVBoxLayout();
mainFrame->setLayout(mainFrameLayout);
mainFrameLayout->setSpacing(30);
mainFrameLayout->setContentsMargins(0, 0, 0, 0);
onroadScreenOffTimer = new OptionControlSP(
"OnroadScreenOffTimer",
"Onroad Brightness Delay",
"",
"",
{0, 11}, 1, true, &onroadScreenOffTimerOptions);
onroadScreenBrightness = new OptionControlSP(
"OnroadScreenOffBrightness",
"Onroad Brightness",
"",
"",
{0, 100}, 10, true);
connect(onroadScreenOffTimer, &OptionControlSP::updateLabels, this, &OnroadScreenBrightnessControl::refresh);
connect(onroadScreenBrightness, &OptionControlSP::updateLabels, this, &OnroadScreenBrightnessControl::refresh);
mainFrameLayout->addWidget(onroadScreenBrightness);
mainFrameLayout->addWidget(onroadScreenOffTimer);
addItem(mainFrame);
refresh();
}
void OnroadScreenBrightnessControl::refresh() {
// Driving Screen Off Timer
int valTimer = std::atoi(params.get("OnroadScreenOffTimer").c_str());
std::string labelTimer = (valTimer < 60 ? std::to_string(valTimer) + "s" : std::to_string(valTimer / 60) + "m");
onroadScreenOffTimer->setLabel(QString::fromStdString(labelTimer));
// Driving Screen Off Brightness
std::string valBrightness = params.get("OnroadScreenOffBrightness");
std::string labelBrightness = (valBrightness == "0" ? " Screen Off" : valBrightness + "%");
onroadScreenBrightness->setLabel(QString::fromStdString(labelBrightness));
}
@@ -0,0 +1,42 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/sunnypilot/ui.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/expandable_row.h"
static const QMap<QString, QString> onroadScreenOffTimerOptions = {
{"0", "15"},
{"1", "30"},
{"2", "60"},
{"3", "120"},
{"4", "180"},
{"5", "240"},
{"6", "300"},
{"7", "360"},
{"8", "420"},
{"9", "480"},
{"10", "540"},
{"11", "600"}
};
class OnroadScreenBrightnessControl : public ExpandableToggleRow {
Q_OBJECT
public:
OnroadScreenBrightnessControl(const QString &param, const QString &title, const QString &desc, const QString &icon,
QWidget *parent = nullptr);
void refresh();
private:
Params params;
OptionControlSP *onroadScreenOffTimer;
OptionControlSP *onroadScreenBrightness;
};
@@ -0,0 +1,65 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/display_panel.h"
DisplayPanel::DisplayPanel(QWidget *parent) : QWidget(parent) {
main_layout = new QStackedLayout(this);
ListWidgetSP *list = new ListWidgetSP(this, false);
sunnypilotScreen = new QWidget(this);
QVBoxLayout* vlayout = new QVBoxLayout(sunnypilotScreen);
vlayout->setContentsMargins(50, 20, 50, 20);
// Onroad Screen Off/Brightness
onroadScreenBrightnessControl = new OnroadScreenBrightnessControl(
"OnroadScreenOffControl",
tr("Onroad Screen: Reduced Brightness"),
tr("Turn off device screen or reduce brightness after driving starts. "
"It automatically brightens again when screen is touched or a visible alert is displayed."),
"",
this);
list->addItem(onroadScreenBrightnessControl);
list->addItem(horizontal_line());
// Global Brightness
brightness = new Brightness();
connect(brightness, &OptionControlSP::updateLabels, brightness, &Brightness::refresh);
list->addItem(brightness);
list->addItem(horizontal_line());
// Interactivity Timeout
interactivityTimeout = new OptionControlSP("InteractivityTimeout", tr("Interactivity Timeout"),
tr("Apply a custom timeout for settings UI."
"\nThis is the time after which settings UI closes automatically if user is not interacting with the screen."),
"", {0, 120}, 10, true, nullptr, false);
connect(interactivityTimeout, &OptionControlSP::updateLabels, [=]() {
refresh();
});
list->addItem(interactivityTimeout);
sunnypilotScroller = new ScrollViewSP(list, this);
vlayout->addWidget(sunnypilotScroller);
main_layout->addWidget(sunnypilotScreen);
}
void DisplayPanel::showEvent(QShowEvent *event) {
QWidget::showEvent(event);
refresh();
}
void DisplayPanel::refresh() {
onroadScreenBrightnessControl->refresh();
QString timeoutValue = QString::fromStdString(params.get("InteractivityTimeout"));
if (timeoutValue == "0" || timeoutValue.isEmpty()) {
interactivityTimeout->setLabel("Default");
} else {
interactivityTimeout->setLabel(timeoutValue + "s");
}
}
@@ -0,0 +1,31 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/brightness.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/display/onroad_screen_brightness.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
class DisplayPanel : public QWidget {
Q_OBJECT
public:
explicit DisplayPanel(QWidget *parent = nullptr);
void showEvent(QShowEvent *event) override;
void refresh();
private:
QStackedLayout* main_layout = nullptr;
QWidget* sunnypilotScreen = nullptr;
ScrollViewSP *sunnypilotScroller = nullptr;
Params params;
OnroadScreenBrightnessControl *onroadScreenBrightnessControl = nullptr;
Brightness *brightness;
OptionControlSP *interactivityTimeout;
};
@@ -52,12 +52,16 @@ void MadsSettings::updateToggles(bool _offroad) {
);
auto cp_bytes = params.get("CarParamsPersistent");
if (!cp_bytes.empty()) {
auto cp_sp_bytes = params.get("CarParamsSPPersistent");
if (!cp_bytes.empty() && !cp_sp_bytes.empty()) {
AlignedBuffer aligned_buf;
AlignedBuffer aligned_buf_sp;
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(cp_bytes.data(), cp_bytes.size()));
capnp::FlatArrayMessageReader cmsg_sp(aligned_buf_sp.align(cp_sp_bytes.data(), cp_sp_bytes.size()));
cereal::CarParams::Reader CP = cmsg.getRoot<cereal::CarParams>();
cereal::CarParamsSP::Reader CP_SP = cmsg_sp.getRoot<cereal::CarParamsSP>();
if (isBrandInList(CP.getBrand(), mads_limited_settings_brands)) {
if (madsLimitedSettings(CP, CP_SP)) {
params.remove("MadsMainCruiseAllowed");
params.putBool("MadsUnifiedEngagementMode", true);
params.put("MadsSteeringMode", std::to_string(static_cast<int>(MadsSteeringMode::DISENGAGE)));
@@ -12,7 +12,16 @@
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
const std::vector<std::string> mads_limited_settings_brands = {"rivian", "tesla"};
inline bool madsLimitedSettings(const cereal::CarParams::Reader &CP, const cereal::CarParamsSP::Reader &CP_SP) {
if (CP.getBrand() == "rivian") {
return true;
}
if (CP.getBrand() == "tesla") {
return !(CP_SP.getFlags() & 1); // 1 == TeslaFlagsSP.HAS_VEHICLE_BUS
}
return false;
}
enum class MadsSteeringMode {
REMAIN_ACTIVE = 0,
@@ -10,14 +10,15 @@
NeuralNetworkLateralControl::NeuralNetworkLateralControl() :
ParamControl("NeuralNetworkLateralControl", tr("Neural Network Lateral Control (NNLC)"), "", "") {
setConfirmation(true, false);
updateToggle();
updateToggle(offroad);
}
void NeuralNetworkLateralControl::updateToggle() {
void NeuralNetworkLateralControl::updateToggle(bool _offroad) {
QString statusInitText = "<font color='yellow'>" + STATUS_CHECK_COMPATIBILITY + "</font>";
QString notLoadedText = "<font color='yellow'>" + STATUS_NOT_LOADED + "</font>";
QString loadedText = "<font color=#00ff00>" + STATUS_LOADED + "</font>";
bool allowed = true;
auto cp_bytes = params.get("CarParamsPersistent");
auto cp_sp_bytes = params.get("CarParamsSPPersistent");
if (!cp_bytes.empty() && !cp_sp_bytes.empty()) {
@@ -31,7 +32,7 @@ void NeuralNetworkLateralControl::updateToggle() {
if (CP.getSteerControlType() == cereal::CarParams::SteerControlType::ANGLE) {
params.remove("NeuralNetworkLateralControl");
setDescription(nnffDescriptionBuilder(STATUS_NOT_AVAILABLE));
setEnabled(false);
allowed = false;
} else {
QString nn_model_name = QString::fromStdString(CP_SP.getNeuralNetworkLateralControl().getModel().getName());
QString nn_fuzzy = CP_SP.getNeuralNetworkLateralControl().getFuzzyFingerprint() ?
@@ -56,4 +57,11 @@ void NeuralNetworkLateralControl::updateToggle() {
if (getDescription() != getBaseDescription()) {
showDescription();
}
bool enforce_torque_toggle = params.getBool("EnforceTorqueControl");
setEnabled(_offroad && allowed && !enforce_torque_toggle);
refresh();
offroad = _offroad;
}
@@ -20,10 +20,11 @@ public:
NeuralNetworkLateralControl();
public slots:
void updateToggle();
void updateToggle(bool _offroad);
private:
Params params;
bool offroad;
// Status messages
const QString STATUS_NOT_AVAILABLE = tr("NNLC is currently not available on this platform.");
@@ -0,0 +1,58 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_custom_params.h"
TorqueLateralControlCustomParams::TorqueLateralControlCustomParams(const QString &param, const QString &title, const QString &description, const QString &icon, QWidget *parent)
: ExpandableToggleRow(param, title, description, icon, parent) {
QFrame *frame = new QFrame(this);
QGridLayout *frame_layout = new QGridLayout();
frame->setLayout(frame_layout);
frame_layout->setSpacing(0);
torqueLateralControlParamsOverride = new ParamControl(
"TorqueParamsOverrideEnabled",
tr("Manual Real-Time Tuning"),
tr("Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values."),
"../assets/offroad/icon_blank.png",
this
);
connect(torqueLateralControlParamsOverride, &ParamControl::toggleFlipped, this, &TorqueLateralControlCustomParams::refresh);
torqueParamsOverrideLatAccelFactor = new OptionControlSP("TorqueParamsOverrideLatAccelFactor", tr("Lateral Acceleration Factor"), "", "", {1, 500}, 1, false, nullptr, true, false);
connect(torqueParamsOverrideLatAccelFactor, &OptionControlSP::updateLabels, this, &TorqueLateralControlCustomParams::refresh);
torqueParamsOverrideLatAccelFactor->setFixedWidth(280);
torqueParamsOverrideFriction = new OptionControlSP("TorqueParamsOverrideFriction", tr("Friction"), "", "", {1, 100}, 1, false, nullptr, true, false);
connect(torqueParamsOverrideFriction, &OptionControlSP::updateLabels, this, &TorqueLateralControlCustomParams::refresh);
torqueParamsOverrideFriction->setFixedWidth(280);
frame_layout->addWidget(torqueLateralControlParamsOverride, 0, 0, 1, 2);
QSpacerItem *spacer = new QSpacerItem(20, 40);
frame_layout->addItem(spacer, 1, 0, 1, 2);
frame_layout->addWidget(torqueParamsOverrideLatAccelFactor, 2, 0, Qt::AlignCenter);
frame_layout->addWidget(torqueParamsOverrideFriction, 2, 1, Qt::AlignCenter);
addItem(frame);
refresh();
}
void TorqueLateralControlCustomParams::refresh() {
bool torque_override_param = params.getBool("TorqueParamsOverrideEnabled");
float laf_param = QString::fromStdString(params.get("TorqueParamsOverrideLatAccelFactor")).toFloat();
const QString laf_unit = "m/s²";
float friction_param = QString::fromStdString(params.get("TorqueParamsOverrideFriction")).toFloat();
torqueParamsOverrideLatAccelFactor->setTitle(tr("Lateral Acceleration Factor") + "\n(" + (torque_override_param ? tr("Real-time and Offline") : tr("Offline Only")) + ")");
torqueParamsOverrideFriction->setTitle(tr("Friction") + "\n(" + (torque_override_param ? tr("Real-time and Offline") : tr("Offline Only")) + ")");
torqueParamsOverrideLatAccelFactor->setLabel(QString::number(laf_param, 'f', 2) + " " + laf_unit);
torqueParamsOverrideFriction->setLabel(QString::number(friction_param, 'f', 2));
}
@@ -0,0 +1,27 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/sunnypilot/ui.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/expandable_row.h"
class TorqueLateralControlCustomParams : public ExpandableToggleRow {
Q_OBJECT
public:
TorqueLateralControlCustomParams(const QString &param, const QString &title, const QString &description, const QString &icon, QWidget *parent = nullptr);
void refresh();
private:
Params params;
ParamControl *torqueLateralControlParamsOverride;
OptionControlSP *torqueParamsOverrideFriction;
OptionControlSP *torqueParamsOverrideLatAccelFactor;
};
@@ -0,0 +1,81 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
TorqueLateralControlSettings::TorqueLateralControlSettings(QWidget *parent) : QWidget(parent) {
QVBoxLayout *main_layout = new QVBoxLayout(this);
main_layout->setContentsMargins(50, 20, 50, 20);
main_layout->setSpacing(20);
// Back button
PanelBackButton *back = new PanelBackButton();
connect(back, &QPushButton::clicked, [=]() { emit backPress(); });
main_layout->addWidget(back, 0, Qt::AlignLeft);
ListWidget *list = new ListWidget(this, false);
// param, title, desc, icon
std::vector<std::tuple<QString, QString, QString, QString>> toggle_defs{
{
"LiveTorqueParamsToggle",
tr("Self-Tune"),
tr("Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default."),
"../assets/offroad/icon_blank.png",
},
{
"LiveTorqueParamsRelaxedToggle",
tr("Less Restrict Settings for Self-Tune (Beta)"),
tr("Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values."),
"../assets/offroad/icon_blank.png",
}
};
for (auto &[param, title, desc, icon] : toggle_defs) {
auto toggle = new ParamControlSP(param, title, desc, icon, this);
list->addItem(toggle);
toggles[param.toStdString()] = toggle;
}
torqueLateralControlCustomParams = new TorqueLateralControlCustomParams(
"CustomTorqueParams",
tr("Enable Custom Tuning"),
tr("Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within \"opendbc/car/torque_data\". "
"The values will also be used live when \"Manual Real-Time Tuning\" toggle is enabled."),
"../assets/offroad/icon_blank.png",
this);
list->addItem(torqueLateralControlCustomParams);
QObject::connect(uiState(), &UIState::offroadTransition, this, &TorqueLateralControlSettings::updateToggles);
QObject::connect(toggles["LiveTorqueParamsToggle"], &ParamControlSP::toggleFlipped, [=](bool state) {
if (!state) {
params.remove("LiveTorqueParamsRelaxedToggle");
toggles["LiveTorqueParamsRelaxedToggle"]->refresh();
}
updateToggles(offroad);
});
main_layout->addWidget(new ScrollViewSP(list, this));
}
void TorqueLateralControlSettings::showEvent(QShowEvent *event) {
updateToggles(offroad);
}
void TorqueLateralControlSettings::updateToggles(bool _offroad) {
bool live_toggle = toggles["LiveTorqueParamsToggle"]->isToggled();
toggles["LiveTorqueParamsToggle"]->setEnabled(_offroad);
toggles["LiveTorqueParamsRelaxedToggle"]->setEnabled(_offroad && live_toggle);
torqueLateralControlCustomParams->setEnabled(_offroad);
torqueLateralControlCustomParams->refresh();
offroad = _offroad;
}
@@ -0,0 +1,36 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/qt/util.h"
#include "selfdrive/ui/sunnypilot/ui.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_custom_params.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h"
class TorqueLateralControlSettings : public QWidget {
Q_OBJECT
public:
explicit TorqueLateralControlSettings(QWidget *parent = nullptr);
void showEvent(QShowEvent *event) override;
signals:
void backPress();
public slots:
void updateToggles(bool _offroad);
private:
Params params;
bool offroad;
std::map<std::string, ParamControlSP*> toggles;
TorqueLateralControlCustomParams *torqueLateralControlCustomParams;
};
@@ -75,6 +75,36 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
list->addItem(horizontal_line());
// Customized Torque Lateral Control
torqueLateralControlToggle = new ParamControl(
"EnforceTorqueControl",
tr("Enforce Torque Lateral Control"),
tr("Enable this to enforce sunnypilot to steer with Torque lateral control."),
"");
list->addItem(torqueLateralControlToggle);
torqueLateralControlSettingsButton = new PushButtonSP(tr("Customize Params"));
torqueLateralControlSettingsButton->setObjectName("torque_btn");
connect(torqueLateralControlSettingsButton, &QPushButton::clicked, [=]() {
sunnypilotScroller->setLastScrollPosition();
main_layout->setCurrentWidget(torqueLateralControlWidget);
});
QObject::connect(torqueLateralControlToggle, &ToggleControl::toggleFlipped, [=](bool state) {
torqueLateralControlSettingsButton->setEnabled(state);
nnlcToggle->updateToggle(offroad);
updateToggles(offroad);
});
torqueLateralControlWidget = new TorqueLateralControlSettings(this);
connect(torqueLateralControlWidget, &TorqueLateralControlSettings::backPress, [=]() {
sunnypilotScroller->restoreScrollPosition();
main_layout->setCurrentWidget(sunnypilotScreen);
});
list->addItem(torqueLateralControlSettingsButton);
list->addItem(vertical_space(0));
list->addItem(horizontal_line());
// Neural Network Lateral Control
nnlcToggle = new NeuralNetworkLateralControl();
list->addItem(nnlcToggle);
@@ -86,7 +116,8 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
nnlcToggle->hideDescription();
}
nnlcToggle->updateToggle();
nnlcToggle->updateToggle(offroad);
updateToggles(offroad);
});
#pragma region hkg angle tuning
@@ -119,9 +150,6 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
list->addItem(angleTuningSettingsButton);
#pragma endregion
toggleOffroadOnly = {
madsToggle, nnlcToggle,
};
QObject::connect(uiState(), &UIState::offroadTransition, this, &LateralPanel::updateToggles);
sunnypilotScroller = new ScrollViewSP(list, this);
@@ -131,6 +159,7 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
main_layout->addWidget(madsWidget);
main_layout->addWidget(angleTuningWidget);
main_layout->addWidget(laneChangeWidget);
main_layout->addWidget(torqueLateralControlWidget);
setStyleSheet(R"(
#back_btn {
@@ -151,7 +180,7 @@ LateralPanel::LateralPanel(SettingsWindowSP *parent) : QFrame(parent) {
}
void LateralPanel::showEvent(QShowEvent *event) {
nnlcToggle->updateToggle();
nnlcToggle->updateToggle(offroad);
updateToggles(offroad);
}
@@ -160,28 +189,41 @@ void LateralPanel::hideEvent(QHideEvent *event) {
}
void LateralPanel::updateToggles(bool _offroad) {
for (auto *toggle : toggleOffroadOnly) {
toggle->setEnabled(_offroad);
}
bool torque_allowed = true;
auto cp_bytes = params.get("CarParamsPersistent");
if (!cp_bytes.empty()) {
auto cp_sp_bytes = params.get("CarParamsSPPersistent");
if (!cp_bytes.empty() && !cp_sp_bytes.empty()) {
AlignedBuffer aligned_buf;
AlignedBuffer aligned_buf_sp;
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(cp_bytes.data(), cp_bytes.size()));
capnp::FlatArrayMessageReader cmsg_sp(aligned_buf_sp.align(cp_sp_bytes.data(), cp_sp_bytes.size()));
cereal::CarParams::Reader CP = cmsg.getRoot<cereal::CarParams>();
cereal::CarParamsSP::Reader CP_SP = cmsg_sp.getRoot<cereal::CarParamsSP>();
if (isBrandInList(CP.getBrand(), mads_limited_settings_brands)) {
if (madsLimitedSettings(CP, CP_SP)) {
madsToggle->setDescription(descriptionBuilder(STATUS_MADS_SETTINGS_LIMITED_COMPATIBILITY, MADS_BASE_DESC));
} else {
madsToggle->setDescription(descriptionBuilder(STATUS_MADS_SETTINGS_FULL_COMPATIBILITY, MADS_BASE_DESC));
}
if (CP.getSteerControlType() == cereal::CarParams::SteerControlType::ANGLE) {
params.remove("EnforceTorqueControl");
torque_allowed = false;
}
} else {
madsToggle->setDescription(descriptionBuilder(STATUS_MADS_CHECK_COMPATIBILITY, MADS_BASE_DESC));
params.remove("EnforceTorqueControl");
torque_allowed = false;
}
madsToggle->setEnabled(_offroad);
madsSettingsButton->setEnabled(madsToggle->isToggled());
// angleTuningSettingsButton->setEnabled(angleTuningToggle->isToggled());
torqueLateralControlToggle->setEnabled(_offroad && torque_allowed && !nnlcToggle->isToggled());
torqueLateralControlSettingsButton->setEnabled(torqueLateralControlToggle->isToggled());
blinkerPauseLateralSettings->refresh();
offroad = _offroad;
@@ -16,6 +16,7 @@
#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/sunnypilot/qt/offroad/settings/lateral/torque_lateral_control_settings.h"
#include "selfdrive/ui/qt/util.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
@@ -36,7 +37,6 @@ private:
QStackedLayout* main_layout = nullptr;
QWidget* sunnypilotScreen = nullptr;
ScrollViewSP *sunnypilotScroller = nullptr;
std::vector<ParamControl *> toggleOffroadOnly;
bool offroad;
ParamControl *madsToggle;
@@ -49,6 +49,9 @@ private:
LaneChangeSettings *laneChangeWidget = nullptr;
NeuralNetworkLateralControl *nnlcToggle = nullptr;
BlinkerPauseLateralSettings *blinkerPauseLateralSettings = nullptr;
ParamControl *torqueLateralControlToggle;
PushButtonSP *torqueLateralControlSettingsButton;
TorqueLateralControlSettings *torqueLateralControlWidget = nullptr;
const QString MADS_BASE_DESC = tr("Enables independent engagements of Automatic Lane Centering (ALC) and Adaptive Cruise Control (ACC).");
@@ -38,10 +38,12 @@ enum class SpeedLimitMode {
OFF,
INFORMATION,
WARNING,
ASSIST,
};
inline const QString SpeedLimitModeTexts[]{
QObject::tr("Off"),
QObject::tr("Information"),
QObject::tr("Warning"),
QObject::tr("Assist"),
};
@@ -28,6 +28,7 @@ SpeedLimitSettings::SpeedLimitSettings(QWidget *parent) : QStackedWidget(parent)
SpeedLimitModeTexts[static_cast<int>(SpeedLimitMode::OFF)],
SpeedLimitModeTexts[static_cast<int>(SpeedLimitMode::INFORMATION)],
SpeedLimitModeTexts[static_cast<int>(SpeedLimitMode::WARNING)],
SpeedLimitModeTexts[static_cast<int>(SpeedLimitMode::ASSIST)],
};
speed_limit_mode_settings = new ButtonParamControlSP(
"SpeedLimitMode",
@@ -35,7 +36,7 @@ SpeedLimitSettings::SpeedLimitSettings(QWidget *parent) : QStackedWidget(parent)
"",
"",
speed_limit_mode_texts,
385);
380);
list->addItem(speed_limit_mode_settings);
list->addItem(horizontal_line());
@@ -107,6 +108,25 @@ void SpeedLimitSettings::refresh() {
SpeedLimitOffsetType offset_type_param = static_cast<SpeedLimitOffsetType>(std::atoi(params.get("SpeedLimitOffsetType").c_str()));
QString offsetLabel = QString::fromStdString(params.get("SpeedLimitValueOffset"));
bool has_longitudinal_control;
bool intelligent_cruise_button_management_available;
auto cp_bytes = params.get("CarParamsPersistent");
auto cp_sp_bytes = params.get("CarParamsSPPersistent");
if (!cp_bytes.empty() && !cp_sp_bytes.empty()) {
AlignedBuffer aligned_buf;
AlignedBuffer aligned_buf_sp;
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(cp_bytes.data(), cp_bytes.size()));
capnp::FlatArrayMessageReader cmsg_sp(aligned_buf_sp.align(cp_sp_bytes.data(), cp_sp_bytes.size()));
cereal::CarParams::Reader CP = cmsg.getRoot<cereal::CarParams>();
cereal::CarParamsSP::Reader CP_SP = cmsg_sp.getRoot<cereal::CarParamsSP>();
has_longitudinal_control = hasLongitudinalControl(CP);
intelligent_cruise_button_management_available = CP_SP.getIntelligentCruiseButtonManagementAvailable();
} else {
has_longitudinal_control = false;
intelligent_cruise_button_management_available = false;
}
speed_limit_mode_settings->setDescription(modeDescription(speed_limit_mode_param));
speed_limit_offset->setDescription(offsetDescription(offset_type_param));
@@ -124,6 +144,13 @@ void SpeedLimitSettings::refresh() {
speed_limit_offset->showDescription();
}
if (has_longitudinal_control || intelligent_cruise_button_management_available) {
speed_limit_mode_settings->setEnableSelectedButtons(true, convertSpeedLimitModeValues(getSpeedLimitModeValues()));
} else {
speed_limit_mode_settings->setEnableSelectedButtons(true, convertSpeedLimitModeValues(
{SpeedLimitMode::OFF,SpeedLimitMode::INFORMATION, SpeedLimitMode::WARNING}));
}
speed_limit_mode_settings->showDescription();
speed_limit_offset->showDescription();
}
@@ -58,8 +58,11 @@ private:
QString off_str = tr("⦿ Off: Disables the Speed Limit functions.");
QString info_str = tr("⦿ Information: Displays the current road's speed limit.");
QString warning_str = tr("⦿ Warning: Provides a warning when exceeding the current road's speed limit.");
QString assist_str = tr("⦿ Assist: Adjusts the vehicle's cruise speed based on the current road's speed limit when operating the +/- buttons.");
if (mode == SpeedLimitMode::WARNING) {
if (mode == SpeedLimitMode::ASSIST) {
assist_str = "<font color='white'><b>" + assist_str + "</b></font>";
} else if (mode == SpeedLimitMode::WARNING) {
warning_str = "<font color='white'><b>" + warning_str + "</b></font>";
} else if (mode == SpeedLimitMode::INFORMATION) {
info_str = "<font color='white'><b>" + info_str + "</b></font>";
@@ -67,9 +70,27 @@ private:
off_str = "<font color='white'><b>" + off_str + "</b></font>";
}
return QString("%1<br>%2<br>%3")
return QString("%1<br>%2<br>%3<br>%4")
.arg(off_str)
.arg(info_str)
.arg(warning_str);
.arg(warning_str)
.arg(assist_str);
}
static std::vector<SpeedLimitMode> getSpeedLimitModeValues() {
std::vector<SpeedLimitMode> values;
for (int i = static_cast<int>(SpeedLimitMode::OFF);
i <= static_cast<int>(SpeedLimitMode::ASSIST); ++i) {
values.push_back(static_cast<SpeedLimitMode>(i));
}
return values;
}
static std::vector<int> convertSpeedLimitModeValues(const std::vector<SpeedLimitMode> &modes) {
std::vector<int> values;
for (const auto& mode : modes) {
values.push_back(static_cast<int>(mode));
}
return values;
}
};
@@ -87,7 +87,6 @@ void LongitudinalPanel::showEvent(QShowEvent *event) {
}
void LongitudinalPanel::refresh(bool _offroad) {
auto icbm_available = false;
auto cp_bytes = params.get("CarParamsPersistent");
auto cp_sp_bytes = params.get("CarParamsSPPersistent");
if (!cp_bytes.empty() && !cp_sp_bytes.empty()) {
@@ -100,12 +99,11 @@ void LongitudinalPanel::refresh(bool _offroad) {
has_longitudinal_control = hasLongitudinalControl(CP);
is_pcm_cruise = CP.getPcmCruise();
icbm_available = CP_SP.getIntelligentCruiseButtonManagementAvailable();
has_intelligent_cruise_button_management = hasIntelligentCruiseButtonManagement(CP_SP);
intelligent_cruise_button_management_available = CP_SP.getIntelligentCruiseButtonManagementAvailable();
} else {
has_longitudinal_control = false;
is_pcm_cruise = false;
has_intelligent_cruise_button_management = false;
intelligent_cruise_button_management_available = false;
}
QString accEnabledDescription = tr("Enable custom Short & Long press increments for cruise speed increase/decrease.");
@@ -117,7 +115,7 @@ void LongitudinalPanel::refresh(bool _offroad) {
customAccIncrement->setDescription(onroadOnlyDescription);
customAccIncrement->showDescription();
} else {
if (has_longitudinal_control || icbm_available) {
if (has_longitudinal_control || intelligent_cruise_button_management_available) {
if (is_pcm_cruise) {
customAccIncrement->setDescription(accPcmCruiseDisabledDescription);
customAccIncrement->showDescription();
@@ -134,7 +132,7 @@ void LongitudinalPanel::refresh(bool _offroad) {
}
}
bool icbm_allowed = has_intelligent_cruise_button_management && !has_longitudinal_control;
bool icbm_allowed = intelligent_cruise_button_management_available && !has_longitudinal_control;
intelligentCruiseButtonManagement->setEnabled(icbm_allowed && offroad);
// enable toggle when long is available and is not PCM cruise
@@ -7,7 +7,6 @@
#pragma once
#include "selfdrive/ui/sunnypilot/qt/util.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/custom_acc_increment.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/settings.h"
@@ -25,7 +24,7 @@ private:
Params params;
bool has_longitudinal_control = false;
bool is_pcm_cruise = false;
bool has_intelligent_cruise_button_management = false;;
bool intelligent_cruise_button_management_available = false;;
bool offroad = false;
QStackedLayout *main_layout = nullptr;
@@ -12,6 +12,7 @@
#include <string>
#include "common/swaglog.h"
#include "selfdrive/ui/sunnypilot/qt/util.h"
#include "selfdrive/ui/sunnypilot/qt/widgets/scrollview.h"
OsmPanel::OsmPanel(QWidget *parent) : QFrame(parent) {
@@ -91,24 +92,30 @@ ButtonControlSP *OsmPanel::setupOsmDownloadButton(QWidget *parent) {
locationTitles.push_back(std::get<0>(loc));
}
const QString selection = MultiOptionDialog::getSelection(tr("Country"), locationTitles, currentTitle, this);
if (!selection.isEmpty()) {
params.put("OsmLocal", "1");
params.put("OsmLocationTitle", selection.toStdString());
for (auto &loc: locations) {
if (std::get<0>(loc) == selection) {
params.put("OsmLocationName", std::get<1>(loc).toStdString());
break;
InputDialog d(tr("Search Country"), this, tr("Enter search keywords, or leave blank to list all countries."), false);
d.setMinLength(0);
const int ret = d.exec();
if (ret) {
const QString selection = search(d.text(), locationTitles, tr("Select Country"));
if (!selection.isEmpty()) {
params.put("OsmLocal", "1");
params.put("OsmLocationTitle", selection.toStdString());
for (auto &loc: locations) {
if (std::get<0>(loc) == selection) {
params.put("OsmLocationName", std::get<1>(loc).toStdString());
break;
}
}
}
if (params.get("OsmLocationName") == "US") {
usStatesBtn->click();
return;
} else if (selection != "== None ==") {
if (showConfirmationDialog(parent)) {
osm_download_in_progress = true;
params.putBool("OsmDbUpdatesCheck", true);
updateLabels();
if (params.get("OsmLocationName") == "US") {
usStatesBtn->click();
return;
}
if (selection != "== None ==") {
if (showConfirmationDialog(parent)) {
osm_download_in_progress = true;
params.putBool("OsmDbUpdatesCheck", true);
updateLabels();
}
}
}
}
@@ -135,20 +142,25 @@ ButtonControlSP *OsmPanel::setupUsStatesButton(QWidget *parent) {
locationTitles.push_back(std::get<0>(loc));
}
const QString selection = MultiOptionDialog::getSelection(tr("State"), locationTitles, currentTitle, this);
if (!selection.isEmpty()) {
params.put("OsmStateTitle", selection.toStdString());
for (auto &loc: locations) {
if (std::get<0>(loc) == selection) {
params.put("OsmStateName", std::get<1>(loc).toStdString());
break;
InputDialog d(tr("Search State"), this, tr("Enter search keywords, or leave blank to list all states."), false);
d.setMinLength(0);
const int ret = d.exec();
if (ret) {
const QString selection = search(d.text(), locationTitles, tr("Select State"));
if (!selection.isEmpty()) {
params.put("OsmStateTitle", selection.toStdString());
for (auto &loc: locations) {
if (std::get<0>(loc) == selection) {
params.put("OsmStateName", std::get<1>(loc).toStdString());
break;
}
}
usStatesBtn->setValue(selection);
if (showConfirmationDialog(parent)) {
osm_download_in_progress = true;
params.putBool("OsmDbUpdatesCheck", true);
updateLabels();
}
}
usStatesBtn->setValue(selection);
if (showConfirmationDialog(parent)) {
osm_download_in_progress = true;
params.putBool("OsmDbUpdatesCheck", true);
updateLabels();
}
}
updateLabels();
@@ -281,3 +293,15 @@ void OsmPanel::updateMapSize() {
mapSizeFuture = QtConcurrent::run(getDirSize, MAP_PATH);
}
}
QString OsmPanel::search(const QString &query, const QStringList &list, const QString &prompt_text) {
QStringList lst_results = searchFromList(query, list);
QString selection;
if (lst_results.isEmpty()) {
ConfirmationDialog::alert(tr("No results found for keywords: %1").arg(query), this);
return selection;
}
selection = MultiOptionDialog::getSelection(prompt_text, lst_results, "", this);
return selection;
}
@@ -76,6 +76,7 @@ private:
void updateDownloadProgress();
static int extractIntFromJson(const QJsonObject &json, const QString &key);
QString processUpdateStatus(bool pending_update_check, int total_files, int downloaded_files, const QJsonObject &json, bool failed_state);
QString search(const QString &query, const QStringList &list, const QString &prompt_text);
ConfirmationDialog *confirmationDialog;
LabelControlSP *mapdVersion;
@@ -13,6 +13,7 @@
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/developer_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/device_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/display_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/models_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.h"
#include "selfdrive/ui/sunnypilot/qt/offroad/settings/sunnylink_panel.h"
@@ -87,6 +88,7 @@ SettingsWindowSP::SettingsWindowSP(QWidget *parent) : SettingsWindow(parent) {
PanelInfo(" " + tr("Steering"), new LateralPanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_lateral.png"),
PanelInfo(" " + tr("Cruise"), new LongitudinalPanel(this), "../assets/icons/speed_limit.png"),
PanelInfo(" " + tr("Visuals"), new VisualsPanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_visuals.png"),
PanelInfo(" " + tr("Display"), new DisplayPanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_display.png"),
PanelInfo(" " + tr("OSM"), new OsmPanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_map.png"),
PanelInfo(" " + tr("Trips"), new TripsPanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_trips.png"),
PanelInfo(" " + tr("Vehicle"), new VehiclePanel(this), "../../sunnypilot/selfdrive/assets/offroad/icon_vehicle.png"),
@@ -49,6 +49,47 @@ VisualsPanel::VisualsPanel(QWidget *parent) : QWidget(parent) {
"",
false,
},
{
"GreenLightAlert",
tr("Green Traffic Light Alert (Beta)"),
QString("%1<br>"
"<h4>%2</h4><br>")
.arg(tr("A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you."))
.arg(tr("Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly.")),
"",
false,
},
{
"LeadDepartAlert",
tr("Lead Departure Alert (Beta)"),
QString("%1<br>"
"<h4>%2</h4><br>")
.arg(tr("A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving."))
.arg(tr("Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly.")),
"",
false,
},
{
"TrueVEgoUI",
tr("Speedometer: Always Display True Speed"),
tr("Always display the true vehicle current speed from wheel speed sensors."),
"",
false,
},
{
"HideVEgoUI",
tr("Speedometer: Hide from Onroad Screen"),
tr("When enabled, the speedometer on the onroad screen is not displayed."),
"",
false,
},
{
"ShowTurnSignals",
tr("Display Turn Signals"),
tr("When enabled, visual turn indicators are drawn on the HUD."),
"",
false,
},
};
// Add regular toggles first
+102
View File
@@ -0,0 +1,102 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#include "selfdrive/ui/sunnypilot/qt/onroad/alerts.h"
#include <QPainter>
#include <map>
#include <QRect>
#include <QFont>
OnroadAlerts::Alert OnroadAlertsSP::getAlert(const SubMaster &sm, uint64_t started_frame) {
OnroadAlerts::Alert alert = OnroadAlerts::getAlert(sm, started_frame);
alert.text1.replace("openpilot", "sunnypilot");
alert.text2.replace("openpilot", "sunnypilot");
return alert;
}
void OnroadAlertsSP::paintEvent(QPaintEvent *event) {
if (alert.size == cereal::SelfdriveState::AlertSize::NONE) {
return;
} else if (alert.size == cereal::SelfdriveState::AlertSize::FULL) {
OnroadAlerts::paintEvent(event);
return;
}
static std::map<cereal::SelfdriveState::AlertSize, const int> alert_heights = {
{cereal::SelfdriveState::AlertSize::SMALL, 271},
{cereal::SelfdriveState::AlertSize::MID, 420}
};
int h = alert_heights[alert.size];
QPainter p(this);
QFont topFont;
QFont bottomFont;
QRect topTextBoundingRect;
QRect bottomTextBoundingRect;
QRect rect;
int margin = 40;
int radius = 30;
const int dev_ui_info = uiStateSP()->scene.dev_ui_info;
const int v_adjustment = dev_ui_info > 1 && alert.size != cereal::SelfdriveState::AlertSize::FULL ? 40 : 0;
const int h_adjustment = dev_ui_info > 0 && alert.size != cereal::SelfdriveState::AlertSize::FULL ? 230 : 0;
if (alert.size == cereal::SelfdriveState::AlertSize::SMALL) {
topFont = InterFont(74, QFont::DemiBold);
QFontMetrics fmTop(topFont);
topTextBoundingRect = fmTop.boundingRect(
QRect(0 + margin, height() - h + margin - v_adjustment, width() - margin * 2 - h_adjustment, 0), Qt::TextWordWrap,
alert.text1);
h = topTextBoundingRect.height();
rect = QRect(0 + margin, height() - h - margin * 2 - v_adjustment, width() - margin * 2 - h_adjustment, h + margin);
} else if (alert.size == cereal::SelfdriveState::AlertSize::MID) {
topFont = InterFont(88, QFont::Bold);
bottomFont = InterFont(66);
QFontMetrics fmTop(topFont);
QFontMetrics fmBotton(bottomFont);
topTextBoundingRect = fmTop.boundingRect(
QRect(0 + margin, height() - h + margin - v_adjustment, width() - margin * 2 - h_adjustment, 0), Qt::TextWordWrap,
alert.text1);
bottomTextBoundingRect = fmBotton.boundingRect(
QRect(0 + margin, height() - h + margin - v_adjustment + topTextBoundingRect.height(),
width() - margin * 2 - h_adjustment, 0), Qt::TextWordWrap, alert.text2);
h = topTextBoundingRect.height() + bottomTextBoundingRect.height() + margin * 2;
rect = QRect(0 + margin, height() - h - margin * 2 - v_adjustment, width() - margin * 2 - h_adjustment, h + margin);
}
// draw background + gradient
// draw background + gradient
p.setPen(Qt::NoPen);
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
p.setBrush(QBrush(alert_colors[alert.status]));
p.drawRoundedRect(rect, radius, radius);
QLinearGradient g(0, rect.y(), 0, rect.bottom());
g.setColorAt(0, QColor::fromRgbF(0, 0, 0, 0.05));
g.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0.35));
p.setCompositionMode(QPainter::CompositionMode_DestinationOver);
p.setBrush(QBrush(g));
p.drawRoundedRect(rect, radius, radius);
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
// text
p.setPen(QColor(0xff, 0xff, 0xff));
p.setRenderHint(QPainter::TextAntialiasing);
p.setFont(topFont);
if (alert.size == cereal::SelfdriveState::AlertSize::SMALL) {
p.drawText(rect, Qt::AlignCenter | Qt::TextWordWrap, alert.text1);
} else if (alert.size == cereal::SelfdriveState::AlertSize::MID) {
QRect topText = QRect(rect.x(), rect.top() + margin, rect.width(), topTextBoundingRect.height());
p.drawText(topText, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap | Qt::AlignCenter, alert.text1);
p.setFont(bottomFont);
p.drawText(QRect(rect.x(), topText.bottom() + margin, rect.width(), bottomTextBoundingRect.height()),
Qt::AlignHCenter | Qt::TextWordWrap | Qt::AlignCenter, alert.text2);
}
}
@@ -0,0 +1,22 @@
/**
* Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
*
* This file is part of sunnypilot and is licensed under the MIT License.
* See the LICENSE.md file in the root directory for more details.
*/
#pragma once
#include "selfdrive/ui/qt/onroad/alerts.h"
#include "selfdrive/ui/sunnypilot/ui.h"
class OnroadAlertsSP : public OnroadAlerts {
Q_OBJECT
public:
OnroadAlertsSP(QWidget *parent = 0) : OnroadAlerts(parent) {}
protected:
void paintEvent(QPaintEvent *) override;
Alert getAlert(const SubMaster &sm, uint64_t started_frame);
};
+315 -61
View File
@@ -11,7 +11,17 @@
#include "selfdrive/ui/qt/util.h"
HudRendererSP::HudRendererSP() {}
HudRendererSP::HudRendererSP() {
plus_arrow_up_img = loadPixmap("../../sunnypilot/selfdrive/assets/img_plus_arrow_up", {105, 105});
minus_arrow_down_img = loadPixmap("../../sunnypilot/selfdrive/assets/img_minus_arrow_down", {105, 105});
int small_max = e2e_alert_small * 2 - 40;
int large_max = e2e_alert_large * 2 - 40;
green_light_alert_small_img = loadPixmap("../../sunnypilot/selfdrive/assets/images/green_light.png", {small_max, small_max});
green_light_alert_large_img = loadPixmap("../../sunnypilot/selfdrive/assets/images/green_light.png", {large_max, large_max});
lead_depart_alert_small_img = loadPixmap("../../sunnypilot/selfdrive/assets/images/lead_depart.png", {small_max, small_max});
lead_depart_alert_large_img = loadPixmap("../../sunnypilot/selfdrive/assets/images/lead_depart.png", {large_max, large_max});
}
void HudRendererSP::updateState(const UIState &s) {
HudRenderer::updateState(s);
@@ -30,10 +40,14 @@ void HudRendererSP::updateState(const UIState &s) {
float speedConv = is_metric ? MS_TO_KPH : MS_TO_MPH;
speedLimit = lp_sp.getSpeedLimit().getResolver().getSpeedLimit() * speedConv;
speedLimitLast = lp_sp.getSpeedLimit().getResolver().getSpeedLimitLast() * speedConv;
speedLimitOffset = lp_sp.getSpeedLimit().getResolver().getSpeedLimitOffset() * speedConv;
speedLimitValid = speedLimit > 0;
speedLimitLastValid = speedLimitLast > 0;
speedLimitValid = lp_sp.getSpeedLimit().getResolver().getSpeedLimitValid();
speedLimitLastValid = lp_sp.getSpeedLimit().getResolver().getSpeedLimitLastValid();
speedLimitFinalLast = lp_sp.getSpeedLimit().getResolver().getSpeedLimitFinalLast() * speedConv;
speedLimitMode = static_cast<SpeedLimitMode>(s.scene.speed_limit_mode);
speedLimitAssistState = lp_sp.getSpeedLimit().getAssist().getState();
speedLimitAssistActive = lp_sp.getSpeedLimit().getAssist().getActive();
roadName = s.scene.road_name;
if (sm.updated("liveMapDataSP")) {
roadNameStr = QString::fromStdString(lmd.getRoadName());
@@ -48,10 +62,6 @@ void HudRendererSP::updateState(const UIState &s) {
}
speedLimitAheadDistancePrev = speedLimitAheadDistance;
if (speedLimitValid) {
speedLimitLast = speedLimit;
}
static int reverse_delay = 0;
bool reverse_allowed = false;
if (int(car_state.getGearShifter()) != 4) {
@@ -97,15 +107,43 @@ void HudRendererSP::updateState(const UIState &s) {
standstillTimer = s.scene.standstill_timer;
isStandstill = car_state.getStandstill();
if (not s.scene.started) standstillElapsedTime = 0.0;
longOverride = car_control.getCruiseControl().getOverride();
smartCruiseControlVisionEnabled = lp_sp.getSmartCruiseControl().getVision().getEnabled();
smartCruiseControlVisionActive = lp_sp.getSmartCruiseControl().getVision().getActive();
smartCruiseControlMapEnabled = lp_sp.getSmartCruiseControl().getMap().getEnabled();
smartCruiseControlMapActive = lp_sp.getSmartCruiseControl().getMap().getActive();
greenLightAlert = lp_sp.getE2eAlerts().getGreenLightAlert();
leadDepartAlert = lp_sp.getE2eAlerts().getLeadDepartAlert();
// override stock current speed values
float v_ego = (v_ego_cluster_seen && !s.scene.trueVEgoUI) ? car_state.getVEgoCluster() : car_state.getVEgo();
speed = std::max<float>(0.0f, v_ego * (is_metric ? MS_TO_KPH : MS_TO_MPH));
hideVEgoUI = s.scene.hideVEgoUI;
leftBlinkerOn = car_state.getLeftBlinker();
rightBlinkerOn = car_state.getRightBlinker();
leftBlindspot = car_state.getLeftBlindspot();
rightBlindspot = car_state.getRightBlindspot();
showTurnSignals = s.scene.turn_signals;
}
void HudRendererSP::draw(QPainter &p, const QRect &surface_rect) {
HudRenderer::draw(p, surface_rect);
e2eAlertDisplayTimer = std::max(0, e2eAlertDisplayTimer - 1);
p.save();
if (is_cruise_available) {
drawSetSpeedSP(p, surface_rect);
}
if (!hideVEgoUI) {
drawCurrentSpeedSP(p, surface_rect);
}
if (!reversing) {
// Smart Cruise Control
int x_offset = -260;
@@ -148,20 +186,81 @@ void HudRendererSP::draw(QPainter &p, const QRect &surface_rect) {
drawRightDevUI(p, surface_rect.right() - 184 - UI_BORDER_SIZE * 2, UI_BORDER_SIZE * 2 + rect_right.height());
}
// Standstill Timer
if (standstillTimer) {
drawStandstillTimer(p, surface_rect.right() / 12 * 10, surface_rect.bottom() / 12 * 1.53);
// Speed Limit
bool showSpeedLimit;
bool speed_limit_assist_pre_active_pulse = pulseElement(speedLimitAssistFrame);
// Position speed limit sign next to set speed box
const int sign_width = is_metric ? 200 : 172;
const int sign_x = is_metric ? 280 : 272;
const int sign_y = 45;
const int sign_height = 204;
QRect sign_rect(sign_x, sign_y, sign_width, sign_height);
if (speedLimitAssistState == cereal::LongitudinalPlanSP::SpeedLimit::AssistState::PRE_ACTIVE) {
speedLimitAssistFrame++;
showSpeedLimit = speed_limit_assist_pre_active_pulse;
drawSpeedLimitPreActiveArrow(p, sign_rect);
} else {
speedLimitAssistFrame = 0;
showSpeedLimit = speedLimitMode != SpeedLimitMode::OFF;
}
// Speed Limit
if (speedLimitMode != SpeedLimitMode::OFF) {
drawSpeedLimitSigns(p);
drawUpcomingSpeedLimit(p);
if (showSpeedLimit) {
drawSpeedLimitSigns(p, sign_rect);
// do not show during SLA's preActive state
if (speedLimitAssistState != cereal::LongitudinalPlanSP::SpeedLimit::AssistState::PRE_ACTIVE) {
drawUpcomingSpeedLimit(p);
}
}
// Road Name
drawRoadName(p, surface_rect);
// Green Light & Lead Depart Alerts
if (greenLightAlert or leadDepartAlert) {
e2eAlertDisplayTimer = 3 * UI_FREQ;
// reset onroad sleep timer for e2e alerts
uiStateSP()->reset_onroad_sleep_timer();
}
if (e2eAlertDisplayTimer > 0) {
e2eAlertFrame++;
if (greenLightAlert) {
alert_text = tr("GREEN\nLIGHT");
alert_img = devUiInfo > 0 ? green_light_alert_small_img : green_light_alert_large_img;
}
else if (leadDepartAlert) {
alert_text = tr("LEAD VEHICLE\nDEPARTING");
alert_img = devUiInfo > 0 ? lead_depart_alert_small_img : lead_depart_alert_large_img;
}
drawE2eAlert(p, surface_rect);
}
// Standstill Timer
else if (standstillTimer && isStandstill) {
alert_img = QPixmap();
standstillElapsedTime += 1.0 / UI_FREQ;
int minute = static_cast<int>(standstillElapsedTime / 60);
int second = static_cast<int>(standstillElapsedTime - (minute * 60));
alert_text = QString("%1:%2").arg(minute, 1, 10, QChar('0')).arg(second, 2, 10, QChar('0'));
drawE2eAlert(p, surface_rect, tr("STOPPED"));
e2eAlertFrame++;
}
// No Alerts displayed
else {
e2eAlertFrame = 0;
if (not isStandstill) standstillElapsedTime = 0.0;
}
// Blinker
if (showTurnSignals) {
drawBlinker(p, surface_rect);
}
}
p.restore();
}
void HudRendererSP::drawText(QPainter &p, int x, int y, const QString &text, QColor color) {
@@ -316,47 +415,11 @@ void HudRendererSP::drawBottomDevUI(QPainter &p, int x, int y) {
rw += drawBottomDevUIElement(p, rw, y, altitudeElement.value, altitudeElement.label, altitudeElement.units, altitudeElement.color);
}
void HudRendererSP::drawStandstillTimer(QPainter &p, int x, int y) {
if (isStandstill) {
standstillElapsedTime += 1.0 / UI_FREQ;
int minute = static_cast<int>(standstillElapsedTime / 60);
int second = static_cast<int>(standstillElapsedTime - (minute * 60));
// stop sign for standstill timer
const int size = 190; // size
const float angle = M_PI / 8.0;
QPolygon octagon;
for (int i = 0; i < 8; i++) {
float curr_angle = angle + i * M_PI / 4.0;
int point_x = x + size / 2 * cos(curr_angle);
int point_y = y + size / 2 * sin(curr_angle);
octagon << QPoint(point_x, point_y);
}
p.setPen(QPen(Qt::white, 6));
p.setBrush(QColor(255, 90, 81, 200)); // red pastel
p.drawPolygon(octagon);
QString time_str = QString("%1:%2").arg(minute, 1, 10, QChar('0')).arg(second, 2, 10, QChar('0'));
p.setFont(InterFont(55, QFont::Bold));
p.setPen(Qt::white);
QRect timerTextRect = p.fontMetrics().boundingRect(QString(time_str));
timerTextRect.moveCenter({x, y});
p.drawText(timerTextRect, Qt::AlignCenter, QString(time_str));
} else {
standstillElapsedTime = 0.0;
}
}
void HudRendererSP::drawSpeedLimitSigns(QPainter &p) {
void HudRendererSP::drawSpeedLimitSigns(QPainter &p, QRect &sign_rect) {
bool speedLimitWarningEnabled = speedLimitMode >= SpeedLimitMode::WARNING; // TODO-SP: update to include SpeedLimitMode::ASSIST
bool hasSpeedLimit = speedLimitValid || speedLimitLastValid;
int speedLimitFinal = std::nearbyint(speedLimitValid ? speedLimit : speedLimitLast);
int speedLimitOffsetFinal = speedLimitFinal + std::nearbyint(speedLimitOffset);
bool overspeed = hasSpeedLimit && speedLimitOffsetFinal < std::nearbyint(speed);
bool speedLimitWarningEnabled = speedLimitMode == SpeedLimitMode::WARNING; // TODO-SP: update to include SpeedLimitMode::ASSIST
QString speedLimitStr = hasSpeedLimit ? QString::number(speedLimitFinal) : "---";
bool overspeed = hasSpeedLimit && std::nearbyint(speedLimitFinalLast) < std::nearbyint(speed);
QString speedLimitStr = hasSpeedLimit ? QString::number(std::nearbyint(speedLimitLast)) : "---";
// Offset display text
QString speedLimitSubText = "";
@@ -369,13 +432,6 @@ void HudRendererSP::drawSpeedLimitSigns(QPainter &p) {
speedLimitSubTextFactor = 0.475;
}
// Position next to MAX speed box
const int sign_width = is_metric ? 200 : 172;
const int sign_x = is_metric ? 280 : 272;
const int sign_y = 45;
const int sign_height = 204;
QRect sign_rect(sign_x, sign_y, sign_width, sign_height);
int alpha = 255;
QColor red_color = QColor(255, 0, 0, alpha);
QColor speed_color = (speedLimitWarningEnabled && overspeed) ? red_color :
@@ -577,3 +633,201 @@ void HudRendererSP::drawRoadName(QPainter &p, const QRect &surface_rect) {
QString truncated = fm.elidedText(roadNameStr, Qt::ElideRight, road_rect.width() - 20);
p.drawText(road_rect, Qt::AlignCenter, truncated);
}
void HudRendererSP::drawSpeedLimitPreActiveArrow(QPainter &p, QRect &sign_rect) {
const int sign_margin = 12;
const int arrow_spacing = sign_margin * 3;
int arrow_x = sign_rect.right() + arrow_spacing;
int _set_speed = std::nearbyint(set_speed);
int _speed_limit_final_last = std::nearbyint(speedLimitFinalLast);
// Calculate the vertical offset using a sinusoidal function for smooth bouncing
double bounce_frequency = 2.0 * M_PI / UI_FREQ; // 20 frames for one full oscillation
int bounce_offset = 20 * sin(speedLimitAssistFrame * bounce_frequency); // Adjust the amplitude (20 pixels) as needed
if (_set_speed < _speed_limit_final_last) {
QPoint iconPosition(arrow_x, sign_rect.center().y() - plus_arrow_up_img.height() / 2 + bounce_offset);
p.drawPixmap(iconPosition, plus_arrow_up_img);
} else if (_set_speed > _speed_limit_final_last) {
QPoint iconPosition(arrow_x, sign_rect.center().y() - minus_arrow_down_img.height() / 2 - bounce_offset);
p.drawPixmap(iconPosition, minus_arrow_down_img);
}
}
void HudRendererSP::drawSetSpeedSP(QPainter &p, const QRect &surface_rect) {
// Draw outer box + border to contain set speed
const QSize default_size = {172, 204};
QSize set_speed_size = is_metric ? QSize(200, 204) : default_size;
QRect set_speed_rect(QPoint(60 + (default_size.width() - set_speed_size.width()) / 2, 45), set_speed_size);
// Draw set speed box
p.setPen(QPen(QColor(255, 255, 255, 75), 6));
p.setBrush(QColor(0, 0, 0, 166));
p.drawRoundedRect(set_speed_rect, 32, 32);
// Colors based on status
QColor max_color = QColor(0xa6, 0xa6, 0xa6, 0xff);
QColor set_speed_color = QColor(0x72, 0x72, 0x72, 0xff);
if (is_cruise_set) {
set_speed_color = QColor(255, 255, 255);
if (speedLimitAssistActive) {
set_speed_color = longOverride ? QColor(0x91, 0x9b, 0x95, 0xff) : QColor(0, 0xff, 0, 0xff);
max_color = longOverride ? QColor(0x91, 0x9b, 0x95, 0xff) : QColor(0x80, 0xd8, 0xa6, 0xff);
} else {
if (status == STATUS_DISENGAGED) {
max_color = QColor(255, 255, 255);
} else if (status == STATUS_OVERRIDE) {
max_color = QColor(0x91, 0x9b, 0x95, 0xff);
} else {
max_color = QColor(0x80, 0xd8, 0xa6, 0xff);
}
}
}
// Draw "MAX" text
p.setFont(InterFont(40, QFont::DemiBold));
p.setPen(max_color);
p.drawText(set_speed_rect.adjusted(0, 27, 0, 0), Qt::AlignTop | Qt::AlignHCenter, tr("MAX"));
// Draw set speed
QString setSpeedStr = is_cruise_set ? QString::number(std::nearbyint(set_speed)) : "";
p.setFont(InterFont(90, QFont::Bold));
p.setPen(set_speed_color);
p.drawText(set_speed_rect.adjusted(0, 77, 0, 0), Qt::AlignTop | Qt::AlignHCenter, setSpeedStr);
}
void HudRendererSP::drawE2eAlert(QPainter &p, const QRect &surface_rect, const QString &alert_alt_text) {
int size = devUiInfo > 0 ? e2e_alert_small : e2e_alert_large;
int x = surface_rect.center().x() + surface_rect.width() / 4;
int y = surface_rect.center().y() + 40;
x += devUiInfo > 0 ? 0 : 50;
y += devUiInfo > 0 ? 0 : 80;
QRect alertRect(x - size, y - size, size * 2, size * 2);
// Alert Circle
QPoint center = alertRect.center();
QColor frameColor;
if (not alert_alt_text.isEmpty()) frameColor = QColor(255, 255, 255, 75);
else frameColor = pulseElement(e2eAlertFrame) ? QColor(255, 255, 255, 75) : QColor(0, 255, 0, 75);
p.setPen(QPen(frameColor, 15));
p.setBrush(QColor(0, 0, 0, 190));
p.drawEllipse(center, size, size);
// Alert Text
QColor txtColor;
QFont font;
int alert_bottom_adjustment;
if (not alert_alt_text.isEmpty()) {
font = InterFont(100, QFont::Bold);
alert_bottom_adjustment = 5;
txtColor = QColor(255, 255, 255, 255);
} else {
font = InterFont(48, QFont::Bold);
alert_bottom_adjustment = 7;
txtColor = pulseElement(e2eAlertFrame) ? QColor(255, 255, 255, 255) : QColor(0, 255, 0, 190);
}
p.setPen(txtColor);
p.setFont(font);
QFontMetrics fm(p.font());
QRect textRect = fm.boundingRect(alertRect, Qt::TextWordWrap, alert_text);
textRect.moveCenter({alertRect.center().x(), alertRect.center().y()});
textRect.moveBottom(alertRect.bottom() - alertRect.height() / alert_bottom_adjustment);
p.drawText(textRect, Qt::AlignCenter, alert_text);
if (not alert_alt_text.isEmpty()) {
// Alert Alternate Text
p.setFont(InterFont(80, QFont::Bold));
p.setPen(QColor(255, 175, 3, 240));
QFontMetrics fmt(p.font());
QRect topTextRect = fmt.boundingRect(alertRect, Qt::TextWordWrap, alert_alt_text);
topTextRect.moveCenter({alertRect.center().x(), alertRect.center().y()});
topTextRect.moveTop(alertRect.top() + alertRect.height() / 3.5);
p.drawText(topTextRect, Qt::AlignCenter, alert_alt_text);
} else {
// Alert Image instead of Top Text
QPointF pixmapCenterOffset = QPointF(alert_img.width() / 2.0, alert_img.height() / 2.0);
QPointF drawPoint = center - pixmapCenterOffset;
p.drawPixmap(drawPoint, alert_img);
}
}
void HudRendererSP::drawCurrentSpeedSP(QPainter &p, const QRect &surface_rect) {
QString speedStr = QString::number(std::nearbyint(speed));
p.setFont(InterFont(176, QFont::Bold));
HudRenderer::drawText(p, surface_rect.center().x(), 210, speedStr);
p.setFont(InterFont(66));
HudRenderer::drawText(p, surface_rect.center().x(), 290, is_metric ? tr("km/h") : tr("mph"), 200);
}
void HudRendererSP::drawBlinker(QPainter &p, const QRect &surface_rect) {
if (!leftBlinkerOn && !rightBlinkerOn) {
blinkerFrameCounter = 0;
return;
}
++blinkerFrameCounter;
const int circleRadius = 44;
const int arrowLength = 44;
const int x_gap = 180;
const int y_offset = 272;
const int centerX = surface_rect.center().x();
const bool hazard = leftBlinkerOn && rightBlinkerOn;
const QPen bgBorder(Qt::white, 5);
const QPen arrowPen(Qt::NoPen);
p.save();
auto drawArrow = [&](int cx, int cy, int dir, const QBrush &arrowBrush) {
const int bodyLength = arrowLength / 2;
const int bodyWidth = arrowLength / 2;
const int headLength = arrowLength / 2;
const int headWidth = arrowLength;
QPolygon arrow;
arrow.reserve(7);
arrow << QPoint(cx - dir * bodyLength, cy - bodyWidth / 2)
<< QPoint(cx, cy - bodyWidth / 2)
<< QPoint(cx, cy - headWidth / 2)
<< QPoint(cx + dir * headLength, cy)
<< QPoint(cx, cy + headWidth / 2)
<< QPoint(cx, cy + bodyWidth / 2)
<< QPoint(cx - dir * bodyLength, cy + bodyWidth / 2);
p.setPen(arrowPen);
p.setBrush(arrowBrush);
p.drawPolygon(arrow);
};
auto drawCircle = [&](int cx, int cy, const QBrush &bgBrush) {
p.setPen(bgBorder);
p.setBrush(bgBrush);
p.drawEllipse(QPoint(cx, cy), circleRadius, circleRadius);
};
struct BlinkerSide { bool on; int dir; bool blocked; int cx; };
const std::array<BlinkerSide, 2> sides = {{
{leftBlinkerOn, -1, hazard ? true : (leftBlinkerOn && leftBlindspot), centerX - x_gap},
{rightBlinkerOn, 1, hazard ? true : (rightBlinkerOn && rightBlindspot), centerX + x_gap},
}};
for (const auto &s: sides) {
if (!s.on) continue;
QColor bgColor = s.blocked ? QColor(135, 23, 23) : QColor(23, 134, 68);
QColor arrowColor = s.blocked ? QColor(66, 12, 12) : QColor(12, 67, 34);
if (pulseElement(blinkerFrameCounter)) arrowColor = Qt::white;
const QBrush bgBrush(bgColor);
const QBrush arrowBrush(arrowColor);
drawCircle(s.cx, y_offset, bgBrush);
drawArrow(s.cx, y_offset, s.dir, arrowBrush);
}
p.restore();
}
+31 -1
View File
@@ -31,9 +31,14 @@ private:
void drawStandstillTimer(QPainter &p, int x, int y);
bool pulseElement(int frame);
void drawSmartCruiseControlOnroadIcon(QPainter &p, const QRect &surface_rect, int x_offset, int y_offset, std::string name);
void drawSpeedLimitSigns(QPainter &p);
void drawSpeedLimitSigns(QPainter &p, QRect &sign_rect);
void drawUpcomingSpeedLimit(QPainter &p);
void drawRoadName(QPainter &p, const QRect &surface_rect);
void drawSpeedLimitPreActiveArrow(QPainter &p, QRect &sign_rect);
void drawSetSpeedSP(QPainter &p, const QRect &surface_rect);
void drawE2eAlert(QPainter &p, const QRect &surface_rect, const QString &alert_alt_text = "");
void drawCurrentSpeedSP(QPainter &p, const QRect &surface_rect);
void drawBlinker(QPainter &p, const QRect &surface_rect);
bool lead_status;
float lead_d_rel;
@@ -77,6 +82,7 @@ private:
float speedLimitOffset;
bool speedLimitValid;
bool speedLimitLastValid;
float speedLimitFinalLast;
bool speedLimitAheadValid;
float speedLimitAhead;
float speedLimitAheadDistance;
@@ -85,4 +91,28 @@ private:
SpeedLimitMode speedLimitMode = SpeedLimitMode::OFF;
bool roadName;
QString roadNameStr;
cereal::LongitudinalPlanSP::SpeedLimit::AssistState speedLimitAssistState;
bool speedLimitAssistActive;
int speedLimitAssistFrame;
QPixmap plus_arrow_up_img;
QPixmap minus_arrow_down_img;
int e2e_alert_small = 250;
int e2e_alert_large = 300;
QPixmap green_light_alert_small_img;
QPixmap green_light_alert_large_img;
bool greenLightAlert;
int e2eAlertFrame;
int e2eAlertDisplayTimer = 0;
bool leadDepartAlert;
QPixmap lead_depart_alert_small_img;
QPixmap lead_depart_alert_large_img;
QString alert_text;
QPixmap alert_img;
bool hideVEgoUI;
bool leftBlinkerOn;
bool rightBlinkerOn;
bool leftBlindspot;
bool rightBlindspot;
int blinkerFrameCounter;
bool showTurnSignals;
};
@@ -25,8 +25,10 @@ void OnroadWindowSP::updateState(const UIStateSP &s) {
void OnroadWindowSP::mousePressEvent(QMouseEvent *e) {
OnroadWindow::mousePressEvent(e);
uiStateSP()->reset_onroad_sleep_timer();
}
void OnroadWindowSP::offroadTransition(bool offroad) {
OnroadWindow::offroadTransition(offroad);
uiStateSP()->reset_onroad_sleep_timer();
}
+1 -6
View File
@@ -95,13 +95,12 @@ QStringList searchFromList(const QString &query, const QStringList &list) {
return list;
}
QStringList search_terms = query.simplified().toLower().split(" ", QString::SkipEmptyParts);
QStringList search_terms = query.simplified().toLower().replace(QRegularExpression("[^a-zA-Z0-9\\s]"), " ").split(" ", QString::SkipEmptyParts);
QStringList search_results;
for (const QString &element : list) {
if (std::all_of(search_terms.begin(), search_terms.end(), [&](const QString &term) {
QString normalized_term = term.normalized(QString::NormalizationForm_KD).toLower();
normalized_term.remove(QRegularExpression("[^a-zA-Z0-9\\s]"));
QString normalized_element = element.normalized(QString::NormalizationForm_KD).toLower();
return normalized_element.contains(normalized_term, Qt::CaseInsensitive);
})) {
@@ -123,7 +122,3 @@ std::optional<cereal::Event::Reader> loadCerealEvent(Params& params, const std::
return std::nullopt;
}
}
bool hasIntelligentCruiseButtonManagement(const cereal::CarParamsSP::Reader &car_params_sp) {
return car_params_sp.getIntelligentCruiseButtonManagementAvailable() && Params().getBool("IntelligentCruiseButtonManagement");
}
-1
View File
@@ -23,4 +23,3 @@ std::optional<QString> getParamIgnoringDefault(const std::string &param_name, co
QMap<QString, QVariantMap> loadPlatformList();
QStringList searchFromList(const QString &query, const QStringList &list);
std::optional<cereal::Event::Reader> loadCerealEvent(Params& params, const std::string& _param);
bool hasIntelligentCruiseButtonManagement(const cereal::CarParamsSP::Reader &car_params_sp);
@@ -7,6 +7,7 @@
#pragma once
#include <cmath>
#include <map>
#include <optional>
#include <string>
@@ -500,7 +501,7 @@ private:
int getParamValueScaled() {
const auto param_value = QString::fromStdString(params.get(key));
return static_cast<int>(param_value.toFloat() * 100);
return std::nearbyint(param_value.toFloat() * 100.0f);
}
void setParamValueScaled(const int new_value) {
@@ -544,10 +545,8 @@ public:
main_layout->removeWidget(title_label);
hlayout->addWidget(title_label, 1);
}
if (spacingItem != nullptr && main_layout->indexOf(spacingItem) != -1) {
main_layout->removeItem(spacingItem);
spacingItem = nullptr;
}
main_layout->removeItem(spacingItem);
spacingItem = nullptr;
}
label.setStyleSheet(label_enabled_style);
@@ -14,10 +14,10 @@ ExpandableToggleRow::ExpandableToggleRow(const QString &param, const QString &ti
QObject::connect(this, &ExpandableToggleRow::toggleFlipped, this, &ExpandableToggleRow::toggleClicked);
collapsibleWidget = new QFrame(this);
collapsibleWidget->setContentsMargins(0, 0, 0, 0);
collapsibleWidget->setVisible(false);
QVBoxLayout *collapsible_layout = new QVBoxLayout();
collapsibleWidget->setLayout(collapsible_layout);
collapsible_layout->setContentsMargins(0, 0, 0, 0);
list = new ListWidgetSP(this, false);
+27
View File
@@ -11,6 +11,15 @@
void UIStateSP::updateStatus() {
UIState::updateStatus();
if (scene.started && scene.onroadScreenOffControl) {
auto selfdriveState = (*sm)["selfdriveState"].getSelfdriveState();
if (selfdriveState.getAlertSize() != cereal::SelfdriveState::AlertSize::NONE) {
reset_onroad_sleep_timer();
} else if (scene.onroadScreenOffTimer > 0) {
scene.onroadScreenOffTimer--;
}
}
}
UIStateSP::UIStateSP(QObject *parent) : UIState(parent) {
@@ -55,6 +64,24 @@ void ui_update_params_sp(UIStateSP *s) {
s->scene.standstill_timer = params.getBool("StandstillTimer");
s->scene.speed_limit_mode = std::atoi(params.get("SpeedLimitMode").c_str());
s->scene.road_name = params.getBool("RoadNameToggle");
s->scene.trueVEgoUI = params.getBool("TrueVEgoUI");
s->scene.hideVEgoUI = params.getBool("HideVEgoUI");
// Onroad Screen Brightness
s->scene.onroadScreenOffBrightness = std::atoi(params.get("OnroadScreenOffBrightness").c_str());
s->scene.onroadScreenOffControl = params.getBool("OnroadScreenOffControl");
s->scene.onroadScreenOffTimerParam = std::atoi(params.get("OnroadScreenOffTimer").c_str());
s->reset_onroad_sleep_timer();
s->scene.turn_signals = params.getBool("ShowTurnSignals");
}
void UIStateSP::reset_onroad_sleep_timer() {
if (scene.onroadScreenOffTimerParam >= 0 and scene.onroadScreenOffControl) {
scene.onroadScreenOffTimer = scene.onroadScreenOffTimerParam * UI_FREQ;
} else {
scene.onroadScreenOffTimer = -1;
}
}
DeviceSP::DeviceSP(QObject *parent) : Device(parent) {
+1
View File
@@ -61,6 +61,7 @@ public:
return user.user_id.toLower() != "unregisteredsponsor" && user.user_id.toLower() != "temporarysponsor";
});
}
void reset_onroad_sleep_timer();
signals:
void sunnylinkRoleChanged(bool subscriber);
+6
View File
@@ -12,4 +12,10 @@ typedef struct UISceneSP : UIScene {
bool standstill_timer = false;
int speed_limit_mode = 0;
bool road_name = false;
int onroadScreenOffBrightness, onroadScreenOffTimer = 0;
bool onroadScreenOffControl;
int onroadScreenOffTimerParam;
bool trueVEgoUI;
bool hideVEgoUI;
bool turn_signals = false;
} UISceneSP;
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -464,15 +472,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">إعادة التشغيل</translation>
@@ -517,10 +516,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -533,6 +528,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -594,6 +617,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>تشغيل وضع الراحة</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">التحقق</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -649,6 +727,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>MAX</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">كم/س</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">ميل/س</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">MAX</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -767,6 +902,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -790,6 +937,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1048,6 +1223,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1169,10 +1356,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation>يتم تنزيل تحديث لنظام تشغيل جهازك في الخلفية. سيطلَب منك التحديث عندما يصبح جاهزاً للتثبيت.</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>محرك NVMe غير مثبَّت.</translation>
</message>
<message>
<source>Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.</source>
<translation type="unfinished"></translation>
@@ -1211,6 +1394,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1597,6 +1784,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1691,6 +1931,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished">المطور</translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1927,6 +2171,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished">السابق</translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished">السابق</translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2309,6 +2631,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2319,6 +2695,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished">إلغاء</translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2362,6 +2742,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -464,15 +472,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Neustart</translation>
@@ -517,10 +516,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -533,6 +528,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -594,6 +617,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>ENTSPANNTER MODUS AN</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">ÜBERPRÜFEN</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -645,6 +723,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>MAX</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">MAX</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -759,6 +894,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -782,6 +929,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1040,6 +1215,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1157,10 +1344,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation>Ein Update für das Betriebssystem deines Geräts wird im Hintergrund heruntergeladen. Du wirst aufgefordert, das Update zu installieren, sobald es bereit ist.</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>NVMe-Laufwerk nicht gemounted.</translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation>Gerätetemperatur zu hoch. Das System kühlt ab, bevor es startet. Aktuelle interne Komponententemperatur: %1</translation>
@@ -1203,6 +1386,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1577,6 +1764,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1671,6 +1911,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished">Entwickler</translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1909,6 +2153,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished">Zurück</translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished">Zurück</translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2291,6 +2613,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2301,6 +2677,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished">Abbrechen</translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2344,6 +2724,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -468,15 +476,6 @@ La calibración del retraso de la dirección está completa.</translation>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Reiniciar</translation>
@@ -521,10 +520,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -537,6 +532,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -598,6 +621,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>MODO CHILL</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">VERIFICAR</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -649,6 +727,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>MAX</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">MAX</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -763,6 +898,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -786,6 +933,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1044,6 +1219,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1165,10 +1352,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation>Se está descargando una actualización del sistema operativo de su dispositivo en segundo plano. Se le pedirá que actualice cuando esté listo para instalarse.</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>Unidad NVMe no montada.</translation>
</message>
<message>
<source>Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.</source>
<translation type="unfinished"></translation>
@@ -1207,6 +1390,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1581,6 +1768,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1675,6 +1915,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished">Desarrollador</translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1911,6 +2155,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2293,6 +2615,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2303,6 +2679,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2346,6 +2726,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -464,15 +472,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Redémarrer</translation>
@@ -517,10 +516,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -533,6 +528,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -594,6 +617,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>MODE DÉTENTE ACTIVÉ</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">VÉRIFIER</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -645,6 +723,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>MAX</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mi/h</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">MAX</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -759,6 +894,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -782,6 +929,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1040,6 +1215,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1161,10 +1348,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation>Une mise à jour du système d&apos;exploitation de votre appareil est en cours de téléchargement en arrière-plan. Vous serez invité à effectuer la mise à jour lorsqu&apos;elle sera prête à être installée.</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>Le disque NVMe n&apos;est pas monté.</translation>
</message>
<message>
<source>Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.</source>
<translation type="unfinished"></translation>
@@ -1203,6 +1386,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1577,6 +1764,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1671,6 +1911,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished">Dév.</translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1907,6 +2151,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished">Retour</translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished">Retour</translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2289,6 +2611,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2299,6 +2675,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished">Annuler</translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2342,6 +2722,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -468,15 +476,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
@@ -521,10 +520,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -537,6 +532,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -598,6 +621,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>CHILLモード</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -648,6 +726,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -761,6 +896,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -784,6 +931,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1042,6 +1217,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1159,10 +1346,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation></translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>SSDドライブ(NVMe)</translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation>: %1</translation>
@@ -1205,6 +1388,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1576,6 +1763,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1670,6 +1910,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1906,6 +2150,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2288,6 +2610,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2298,6 +2674,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2341,6 +2721,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+491 -26
View File
@@ -134,14 +134,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation> .</translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation> ()</translation>
@@ -150,6 +142,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -254,6 +254,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation> .&lt;br&gt; &apos; &apos; .</translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -472,16 +480,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation> </translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation> </translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation> .
.</translation>
</message>
<message>
<source>Reboot</source>
<translation></translation>
@@ -526,10 +524,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation> </translation>
</message>
<message>
<source>Always Offroad</source>
<translation> </translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation> 기본값: 기기가 / , .</translation>
@@ -542,6 +536,35 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation>/ .</translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"> .
.</translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -603,6 +626,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation> </translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -655,6 +733,63 @@ Firehose 모드를 사용하면 훈련 데이터 업로드를 극대화하여 op
<translation></translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -768,6 +903,18 @@ Firehose 모드를 사용하면 훈련 데이터 업로드를 극대화하여 op
<source>This platform supports limited MADS settings.</source>
<translation> MADS .</translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -791,6 +938,34 @@ Firehose 모드를 사용하면 훈련 데이터 업로드를 극대화하여 op
<source>Start the vehicle to check vehicle compatibility.</source>
<translation> .</translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1050,6 +1225,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1167,10 +1354,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation> . .</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>NVMe .</translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation> . . %1.</translation>
@@ -1215,6 +1398,10 @@ The default software delay value is 0.2</source>
%1</translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1590,6 +1777,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation>sunnypilot</translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1684,6 +1924,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1920,6 +2164,84 @@ Warning: You are on a metered connection!</source>
<translation> .</translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2302,6 +2624,60 @@ Warning: You are on a metered connection!</source>
<translation> sunnypilot () .</translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2312,6 +2688,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2355,6 +2735,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation> . (openpilot )</translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -468,15 +476,6 @@ A calibração do atraso da direção foi concluída.</translation>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Reiniciar</translation>
@@ -521,10 +520,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -537,6 +532,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -598,6 +621,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation>MODO CHILL ON</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">VERIFICAR</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -649,6 +727,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>LIMITE</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">LIMITE</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -763,6 +898,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -786,6 +933,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1044,6 +1219,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1161,10 +1348,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation>Uma atualização para o sistema operacional do seu dispositivo está sendo baixada em segundo plano. Você será solicitado a atualizar quando estiver pronto para instalar.</translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>Unidade NVMe não montada.</translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation>Temperatura do dispositivo muito alta. O sistema está sendo resfriado antes de iniciar. A temperatura atual do componente interno é: %1</translation>
@@ -1207,6 +1390,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1581,6 +1768,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1675,6 +1915,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished">Desenvdor</translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1911,6 +2155,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished">Voltar</translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished">Voltar</translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2293,6 +2615,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2303,6 +2679,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2346,6 +2726,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -464,15 +472,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
@@ -517,10 +516,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -533,6 +528,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -594,6 +617,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation></translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -644,6 +722,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">./.</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">/.</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -757,6 +892,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -780,6 +927,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1038,6 +1213,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1159,10 +1346,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation> </translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation> NVMe</translation>
</message>
<message>
<source>Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.</source>
<translation type="unfinished"></translation>
@@ -1201,6 +1384,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1572,6 +1759,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1666,6 +1906,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1902,6 +2146,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2284,6 +2606,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2294,6 +2670,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2337,6 +2717,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -464,15 +472,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished">Yeniden başlat</translation>
@@ -517,10 +516,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -533,6 +528,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -594,6 +617,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished">KONTROL ET</translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -644,6 +722,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation>MAX</translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished">MAX</translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -757,6 +892,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -780,6 +927,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1038,6 +1213,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1158,10 +1345,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Device failed to register with the comma.ai backend. It will not connect or upload to comma.ai servers, and receives no support from comma.ai. If this is a device purchased at comma.ai/shop, open a ticket at https://comma.ai/support.</source>
<translation type="unfinished"></translation>
@@ -1200,6 +1383,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1571,6 +1758,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1665,6 +1905,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1901,6 +2145,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2283,6 +2605,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2293,6 +2669,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2336,6 +2716,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -468,15 +476,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
@@ -521,10 +520,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -537,6 +532,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -598,6 +621,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation></translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -648,6 +726,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -761,6 +896,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -784,6 +931,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1042,6 +1217,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1159,10 +1346,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation></translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>NVMe固态硬盘未被挂载</translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation>%1</translation>
@@ -1205,6 +1388,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1576,6 +1763,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1670,6 +1910,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1906,6 +2150,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2288,6 +2610,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2298,6 +2674,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2341,6 +2721,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+490 -25
View File
@@ -133,14 +133,6 @@ Please use caution when using this feature. Only use the blinker when traffic an
</context>
<context>
<name>Brightness</name>
<message>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto (Dark)</source>
<translation type="unfinished"></translation>
@@ -149,6 +141,14 @@ Please use caution when using this feature. Only use the blinker when traffic an
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Global Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overrides the brightness of the device. This applies to both onroad and offroad screens. </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfirmationDialog</name>
@@ -250,6 +250,14 @@ This only toggles the visibility of the controls; it does not toggle the actual
<source>Quickboot mode requires updates to be disabled.&lt;br&gt;Enable &apos;Disable Updates&apos; in the Software panel first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Copyparty service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyparty is a very capable file server, you can use it to download your routes, view your logs and even make some edits on some files from your browser. Requires you to connect to your comma locally via it&apos;s IP.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DevicePanel</name>
@@ -468,15 +476,6 @@ Steering lag calibration is complete.</source>
<source>Wake-Up Behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reboot</source>
<translation type="unfinished"></translation>
@@ -521,10 +520,6 @@ This is the time after which settings UI closes automatically if user is not int
<source>Exit Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always Offroad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Default: Device will boot/wake-up normally &amp; will be ready to engage.</source>
<translation type="unfinished"></translation>
@@ -537,6 +532,34 @@ This is the time after which settings UI closes automatically if user is not int
<source>Controls state of the device after boot/sleep.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Onroad Uploads</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Always Offroad</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DisplayPanel</name>
<message>
<source>Onroad Screen: Reduced Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Turn off device screen or reduce brightness after driving starts. It automatically brightens again when screen is touched or a visible alert is displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Interactivity Timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply a custom timeout for settings UI.
This is the time after which settings UI closes automatically if user is not interacting with the screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DriveStats</name>
@@ -598,6 +621,61 @@ This is the time after which settings UI closes automatically if user is not int
<translation> ON</translation>
</message>
</context>
<context>
<name>ExternalStorageControl</name>
<message>
<source>External Storage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Extend your comma device&apos;s storage by inserting a USB drive into the aux port.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CHECK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UNMOUNT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FORMAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to format this drive? This will erase all data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>formatting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>insert drive</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>needs format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mounting</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmounting</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FirehosePanel</name>
<message>
@@ -648,6 +726,63 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<translation></translation>
</message>
</context>
<context>
<name>HudRendererSP</name>
<message>
<source>km/h</source>
<translation type="unfinished">km/h</translation>
</message>
<message>
<source>mph</source>
<translation type="unfinished">mph</translation>
</message>
<message>
<source>GREEN
LIGHT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LEAD VEHICLE
DEPARTING</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SPEED</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>LIMIT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Near</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>km</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>m</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>mi</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ft</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AHEAD</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MAX</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HyundaiSettings</name>
<message>
@@ -761,6 +896,18 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>This platform supports limited MADS settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforce Torque Lateral Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable this to enforce sunnypilot to steer with Torque lateral control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Params</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LongitudinalPanel</name>
@@ -784,6 +931,34 @@ Firehose Mode allows you to maximize your training data uploads to improve openp
<source>Start the vehicle to check vehicle compatibility.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Intelligent Cruise Button Management (ICBM) (Alpha)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>When enabled, sunnypilot will attempt to manage the built-in cruise control buttons by emulating button presses for limited longitudinal control.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Vision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use vision path predictions to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Smart Cruise Control - Map</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use map data to estimate the appropriate speed to drive through turns ahead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MadsSettings</name>
@@ -1042,6 +1217,18 @@ The default software delay value is 0.2</source>
<source>Total Delay:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Lane Turn Desires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adjust Lane Turn Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set the maximum speed for lane turn desires. Default is 19 %1.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiOptionDialog</name>
@@ -1159,10 +1346,6 @@ The default software delay value is 0.2</source>
<source>An update to your device&apos;s operating system is downloading in the background. You will be prompted to update when it&apos;s ready to install.</source>
<translation></translation>
</message>
<message>
<source>NVMe drive not mounted.</source>
<translation>NVMe </translation>
</message>
<message>
<source>Device temperature too high. System cooling down before starting. Current internal component temperature: %1</source>
<translation>%1</translation>
@@ -1205,6 +1388,10 @@ The default software delay value is 0.2</source>
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;b&gt;Unsupported branch detected&lt;/b&gt; - The current version of &lt;b&gt;&lt;u&gt;%1&lt;/u&gt;&lt;/b&gt; branch is no longer supported on the comma three. Please go to &lt;b&gt;[Device &gt; Software]&lt;/b&gt; and install a supported branch with &lt;b&gt;&lt;u&gt;-tici&lt;/u&gt;&lt;/b&gt; in the branch name for the comma three.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OffroadHome</name>
@@ -1576,6 +1763,59 @@ Warning: You are on a metered connection!</source>
<source>sunnypilot</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Percent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
Only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Car
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Map
First</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Combined
Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Off</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Assist</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsWindow</name>
@@ -1670,6 +1910,10 @@ Warning: You are on a metered connection!</source>
<source>Developer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SetupWidget</name>
@@ -1906,6 +2150,84 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitPolicy</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car Only: Use Speed Limit data only from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map Only: Use Speed Limit data only from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Map First: Use Speed Limit data from OpenStreetMaps if available, else use from Car</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Combined: Use combined Speed Limit data from Car &amp; OpenStreetMaps</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SpeedLimitSettings</name>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Customize Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Limit Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ None: No Offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Fixed: Adds a fixed offset [Speed Limit + Offset]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Off: Disables the Speed Limit functions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Information: Displays the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Warning: Provides a warning when exceeding the current road&apos;s speed limit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>⦿ Assist: Adjusts the vehicle&apos;s cruise speed based on the current road&apos;s speed limit when operating the +/- buttons.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SshControl</name>
<message>
@@ -2288,6 +2610,60 @@ Warning: You are on a metered connection!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlCustomParams</name>
<message>
<source>Manual Real-Time Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lateral Acceleration Factor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friction</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Real-time and Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Offline Only</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TorqueLateralControlSettings</name>
<message>
<source>Self-Tune</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less Restrict Settings for Self-Tune (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Custom Tuning</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enables custom tuning for Torque lateral control. Modifying Lateral Acceleration Factor and Friction below will override the offline values indicated in the YAML files within &quot;opendbc/car/torque_data&quot;. The values will also be used live when &quot;Manual Real-Time Tuning&quot; toggle is enabled.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TreeOptionDialog</name>
<message>
@@ -2298,6 +2674,10 @@ Warning: You are on a metered connection!</source>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>VisualsPanel</name>
@@ -2341,6 +2721,91 @@ Warning: You are on a metered connection!</source>
<source>Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Tesla Rainbow Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A beautiful rainbow effect on the path the model wants to take.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>It</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>does not</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>affect driving in any way.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enable Standstill Timer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a timer on the HUD when the car is at a standstill.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Road Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays the name of the road the car is traveling on. The OpenStreetMap database of the location must be downloaded from the OSM panel to fetch the road name.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Green Traffic Light Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when the traffic light you are waiting for turns green and you have no vehicle in front of you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note: This chime is only designed as a notification. It is the driver&apos;s responsibility to observe their environment and make decisions accordingly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lead Departure Alert (Beta)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Always Display True Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Always display the true vehicle current speed from wheel speed sensors.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speedometer: Hide from Onroad Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right &amp;&amp;
Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Developer UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display real-time parameters and metrics from various sources.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WiFiPromptWidget</name>
+7
View File
@@ -204,6 +204,13 @@ void Device::updateBrightness(const UIState &s) {
brightness = 0;
}
// Onroad Brightness Control
#ifdef SUNNYPILOT
if (awake && s.scene.started && s.scene.onroadScreenOffControl && s.scene.onroadScreenOffTimer == 0) {
brightness = s.scene.onroadScreenOffBrightness * 0.01 * brightness;
}
#endif
if (brightness != last_brightness) {
if (!brightness_future.isRunning()) {
brightness_future = QtConcurrent::run(Hardware::set_brightness, brightness);
+11
View File
@@ -4,4 +4,15 @@ 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.
"""
import hashlib
PARAMS_UPDATE_PERIOD = 3 # seconds
def get_file_hash(path: str) -> str:
sha256_hash = hashlib.sha256()
with open(path, "rb") as f:
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
+20 -8
View File
@@ -9,6 +9,10 @@ from openpilot.common.params import Params
from opendbc.car import structs
from opendbc.safety import ALTERNATIVE_EXPERIENCE
from opendbc.sunnypilot.car.hyundai.values import HyundaiFlagsSP, HyundaiSafetyFlagsSP
from opendbc.sunnypilot.car.tesla.values import TeslaFlagsSP
MADS_NO_ACC_MAIN_BUTTON = ("rivian", "tesla")
class MadsSteeringModeOnBrake:
@@ -17,20 +21,25 @@ class MadsSteeringModeOnBrake:
DISENGAGE = 2
def get_mads_limited_brands(CP: structs.CarParams) -> bool:
return CP.brand in ("rivian", "tesla")
def get_mads_limited_brands(CP: structs.CarParams, CP_SP: structs.CarParamsSP) -> bool:
if CP.brand == 'rivian':
return True
if CP.brand == 'tesla':
return not CP_SP.flags & TeslaFlagsSP.HAS_VEHICLE_BUS
return False
def read_steering_mode_param(CP: structs.CarParams, params: Params):
if get_mads_limited_brands(CP):
def read_steering_mode_param(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params: Params):
if get_mads_limited_brands(CP, CP_SP):
return MadsSteeringModeOnBrake.DISENGAGE
return params.get("MadsSteeringMode", return_default=True)
def set_alternative_experience(CP: structs.CarParams, params: Params):
def set_alternative_experience(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params: Params):
enabled = params.get_bool("Mads")
steering_mode = read_steering_mode_param(CP, params)
steering_mode = read_steering_mode_param(CP, CP_SP, params)
if enabled:
CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.ENABLE_MADS
@@ -53,9 +62,12 @@ def set_car_specific_params(CP: structs.CarParams, CP_SP: structs.CarParamsSP, p
# MADS Partial Support
# MADS is currently partially supported for these platforms due to lack of consistent states to engage controls
# Only MadsSteeringModeOnBrake.DISENGAGE is supported for these platforms
# TODO-SP: To enable MADS full support for Rivian/Tesla, identify consistent signals for MADS toggling
mads_partial_support = get_mads_limited_brands(CP)
# TODO-SP: To enable MADS full support for Rivian and most Tesla, identify consistent signals for MADS toggling
mads_partial_support = get_mads_limited_brands(CP, CP_SP)
if mads_partial_support:
params.put("MadsSteeringMode", 2)
params.put_bool("MadsUnifiedEngagementMode", True)
# no ACC MAIN button for these brands
if CP.brand in MADS_NO_ACC_MAIN_BUTTON:
params.remove("MadsMainCruiseAllowed")
+14 -9
View File
@@ -10,7 +10,7 @@ from cereal import log, custom
from opendbc.car import structs
from opendbc.car.hyundai.values import HyundaiFlags
from openpilot.common.params import Params
from openpilot.sunnypilot.mads.helpers import MadsSteeringModeOnBrake, read_steering_mode_param, get_mads_limited_brands
from openpilot.sunnypilot.mads.helpers import MadsSteeringModeOnBrake, read_steering_mode_param, MADS_NO_ACC_MAIN_BUTTON
from openpilot.sunnypilot.mads.state import StateMachine, GEARS_ALLOW_PAUSED_SILENT
State = custom.ModularAssistiveDrivingSystem.ModularAssistiveDrivingSystemState
@@ -27,6 +27,7 @@ IGNORED_SAFETY_MODES = (SafetyModel.silent, SafetyModel.noOutput)
class ModularAssistiveDrivingSystem:
def __init__(self, selfdrive):
self.CP = selfdrive.CP
self.CP_SP = selfdrive.CP_SP
self.params = selfdrive.params
self.enabled = False
@@ -43,14 +44,16 @@ class ModularAssistiveDrivingSystem:
if self.CP.brand == "hyundai":
if self.CP.flags & (HyundaiFlags.HAS_LDA_BUTTON | HyundaiFlags.CANFD):
self.allow_always = True
if self.CP.brand == "tesla":
self.allow_always = True
if get_mads_limited_brands(self.CP):
if self.CP.brand in MADS_NO_ACC_MAIN_BUTTON:
self.no_main_cruise = True
# read params on init
self.enabled_toggle = self.params.get_bool("Mads")
self.main_enabled_toggle = self.params.get_bool("MadsMainCruiseAllowed")
self.steering_mode_on_brake = read_steering_mode_param(self.CP, self.params)
self.steering_mode_on_brake = read_steering_mode_param(self.CP, self.CP_SP, self.params)
self.unified_engagement_mode = self.params.get_bool("MadsUnifiedEngagementMode")
def read_params(self):
@@ -58,6 +61,7 @@ class ModularAssistiveDrivingSystem:
self.unified_engagement_mode = self.params.get_bool("MadsUnifiedEngagementMode")
def pedal_pressed_non_gas_pressed(self, CS: structs.CarState) -> bool:
# ignore `pedalPressed` events caused by gas presses
if self.events.has(EventName.pedalPressed) and not (CS.gasPressed and not self.selfdrive.CS_prev.gasPressed and self.disengage_on_accelerator):
return True
@@ -102,12 +106,13 @@ class ModularAssistiveDrivingSystem:
def update_events(self, CS: structs.CarState):
if not self.selfdrive.enabled and self.enabled:
if self.events.has(EventName.doorOpen):
self.replace_event(EventName.doorOpen, EventNameSP.silentDoorOpen)
self.transition_paused_state()
if self.events.has(EventName.seatbeltNotLatched):
self.replace_event(EventName.seatbeltNotLatched, EventNameSP.silentSeatbeltNotLatched)
self.transition_paused_state()
if CS.standstill:
if self.events.has(EventName.doorOpen):
self.replace_event(EventName.doorOpen, EventNameSP.silentDoorOpen)
self.transition_paused_state()
if self.events.has(EventName.seatbeltNotLatched):
self.replace_event(EventName.seatbeltNotLatched, EventNameSP.silentSeatbeltNotLatched)
self.transition_paused_state()
if self.events.has(EventName.wrongGear) and (CS.vEgo < 2.5 or CS.gearShifter == GearShifter.reverse):
self.replace_event(EventName.wrongGear, EventNameSP.silentWrongGear)
self.transition_paused_state()
+1 -1
View File
@@ -22,7 +22,7 @@ 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.11.0'
VERSION = "v1.12.0"
URL = f"https://github.com/pfeiferj/openpilot-mapd/releases/download/{VERSION}/mapd"
View File
+1
View File
@@ -0,0 +1 @@
fdb3b49ee19956e6ce09fdc3373cbba557f1263b2180e9f344c1d4053852284b
@@ -0,0 +1,19 @@
"""
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.
"""
from openpilot.sunnypilot import get_file_hash
from openpilot.sunnypilot.mapd import MAPD_PATH
from openpilot.sunnypilot.mapd.update_version import MAPD_HASH_PATH
class TestMapdVersion:
def test_compare_versions(self):
mapd_hash = get_file_hash(MAPD_PATH)
with open(MAPD_HASH_PATH) as f:
current_hash = f.read().strip()
assert current_hash == mapd_hash, "Run sunnypilot/mapd/update_version.py to update the current mapd version and hash"
+97
View File
@@ -0,0 +1,97 @@
#!/usr/bin/env python3
"""
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.
"""
import argparse
import os
import re
from openpilot.sunnypilot import get_file_hash
from openpilot.common.basedir import BASEDIR
from openpilot.sunnypilot.mapd import MAPD_PATH
MAPD_HASH_PATH = os.path.join(BASEDIR, "sunnypilot", "mapd", "tests", "mapd_hash")
MAPD_VERSION_PATH = os.path.join(BASEDIR, "sunnypilot", "mapd", "mapd_installer.py")
def update_mapd_hash():
mapd_hash = get_file_hash(MAPD_PATH)
with open(MAPD_HASH_PATH, "w") as f:
f.write(mapd_hash)
print(f"Generated and updated new mapd hash to {MAPD_HASH_PATH}")
def get_current_mapd_version(path: str) -> str:
print("[GET CURRENT MAPD VERSION]")
with open(path) as f:
for line in f:
if line.strip().startswith("VERSION"):
# Match VERSION = 'v1.11.0' or VERSION="v1.11.0" (with optional spaces)
match = re.search(r'VERSION\s*=\s*[\'"]([^\'"]+)[\'"]', line)
if match:
ver = match.group(1)
print(f'Current mapd version: "{ver}"')
return ver
else:
print("[ERROR] VERSION line found but no quoted value detected.")
return ""
print("[ERROR] VERSION not found in file!")
return ""
def update_mapd_version(ver: str, path: str):
print("[CHANGE CURRENT MAPD VERSION]")
with open(path) as f:
lines = f.readlines()
found = False
new_lines = []
for line in lines:
if not found and line.startswith("VERSION ="):
new_lines.append(f'VERSION = "{ver}"\n')
found = True
new_lines.extend(lines[lines.index(line) + 1:])
break
else:
new_lines.append(line)
if not found:
print("[ERROR] VERSION line not found! Aborting without writing.")
return
with open(path, "w") as f:
f.writelines(new_lines)
print(f'New mapd version: "{ver}"')
print("[DONE]")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Update mapd version and hash")
parser.add_argument("--new_ver", type=str, help="New mapd version")
args = parser.parse_args()
if not args.new_ver:
print("Warning: No new mapd version provided. Use --new_ver to specify")
print("Example:")
print(" python sunnypilot/mapd/update_version.py --new_ver \"v1.12.0\"")
print("Current mapd version and hash will not be updated! (aborted)")
exit(0)
current_ver = get_current_mapd_version(MAPD_VERSION_PATH)
new_ver = f"{args.new_ver}"
if current_ver == new_ver:
print(f'Proposed mapd version: "{new_ver}"')
confirm = input("Proposed mapd version is the same as the current mapd version. Confirm? (y/n): ").upper().strip()
if confirm != "Y":
print("Current mapd version and hash will not be updated! (aborted)")
exit(0)
update_mapd_version(new_ver, MAPD_VERSION_PATH)
update_mapd_hash()
View File
+1 -8
View File
@@ -3,6 +3,7 @@ import os
import hashlib
from openpilot.common.basedir import BASEDIR
from openpilot.sunnypilot import get_file_hash
DEFAULT_MODEL_NAME_PATH = os.path.join(BASEDIR, "common", "model.h")
MODEL_HASH_PATH = os.path.join(BASEDIR, "sunnypilot", "models", "tests", "model_hash")
@@ -10,14 +11,6 @@ VISION_ONNX_PATH = os.path.join(BASEDIR, "selfdrive", "modeld", "models", "drivi
POLICY_ONNX_PATH = os.path.join(BASEDIR, "selfdrive", "modeld", "models", "driving_policy.onnx")
def get_file_hash(path: str) -> str:
sha256_hash = hashlib.sha256()
with open(path, "rb") as f:
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
def update_model_hash():
vision_hash = get_file_hash(VISION_ONNX_PATH)
policy_hash = get_file_hash(POLICY_ONNX_PATH)
@@ -1,4 +1,12 @@
from openpilot.sunnypilot.models.default_model import get_file_hash, MODEL_HASH_PATH, VISION_ONNX_PATH, POLICY_ONNX_PATH
"""
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.
"""
from openpilot.sunnypilot import get_file_hash
from openpilot.sunnypilot.models.default_model import MODEL_HASH_PATH, VISION_ONNX_PATH, POLICY_ONNX_PATH
import hashlib
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3aa5ec9ac1daee6a549e62647d90bcaa66d2485f7df7f386ff902fcfb04c1716
size 6583
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:087db35bd469e85aefe3b45636f11ab3e8b55ceb7bc94ea059cfd9a69c2f338f
size 8914
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0f4a0bf26cfd2c64939759d43bee839aadfd017a6f74065095a27b03615e55a4
size 26627
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3e451ff31e9b3f144822ab282b8e47cd5a603ca59ff94bd1849271181b86c6b1
size 29220
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:614767308d435d165a9ab78e3eac22ee15697d94066df8200ef32afb33ef8d60
size 5698
+8 -2
View File
@@ -18,9 +18,9 @@ GearShifter = structs.CarState.GearShifter
class CarSpecificEventsSP:
def __init__(self, CP: structs.CarParams, params):
def __init__(self, CP: structs.CarParams, CP_SP: structs.CarParamsSP):
self.CP = CP
self.params = params
self.CP_SP = CP_SP
self.low_speed_alert = False
@@ -42,4 +42,10 @@ class CarSpecificEventsSP:
if self.low_speed_alert:
events.add(EventName.belowSteerSpeed)
elif self.CP.brand == 'toyota':
if self.CP.openpilotLongitudinalControl:
if CS.cruiseState.standstill and not CS.brakePressed and self.CP_SP.enableGasInterceptor:
if events.has(EventName.resumeRequired):
events.remove(EventName.resumeRequired)
return events_sp
+49 -2
View File
@@ -6,18 +6,24 @@ See the LICENSE.md file in the root directory for more details.
"""
import numpy as np
from cereal import car
from cereal import car, custom
from opendbc.car import structs
from openpilot.common.constants import CV
from openpilot.common.params import Params
from openpilot.sunnypilot.selfdrive.car.intelligent_cruise_button_management.helpers import get_minimum_set_speed
from openpilot.sunnypilot.selfdrive.controls.lib.speed_limit.speed_limit_assist import ACTIVE_STATES as SLA_ACTIVE_STATES
from openpilot.sunnypilot.selfdrive.controls.lib.speed_limit.helpers import compare_cluster_target
ButtonType = car.CarState.ButtonEvent.Type
SpeedLimitAssistState = custom.LongitudinalPlanSP.SpeedLimit.AssistState
CRUISE_BUTTON_TIMER = {ButtonType.decelCruise: 0, ButtonType.accelCruise: 0,
ButtonType.setCruise: 0, ButtonType.resumeCruise: 0,
ButtonType.cancel: 0, ButtonType.mainCruise: 0}
V_CRUISE_MIN = 8
V_CRUISE_MAX = 145
V_CRUISE_UNSET = 255
def update_manual_button_timers(CS: car.CarState, button_timers: dict[car.CarState.ButtonEvent.Type, int]) -> None:
@@ -32,11 +38,12 @@ def update_manual_button_timers(CS: car.CarState, button_timers: dict[car.CarSta
button_timers[b.type.raw] = 1 if b.pressed else 0
class VCruiseHelperSP:
def __init__(self, CP: structs.CarParams, CP_SP: structs.CarParamsSP) -> None:
self.CP = CP
self.CP_SP = CP_SP
self.v_cruise_kph = V_CRUISE_UNSET
self.v_cruise_cluster_kph = V_CRUISE_UNSET
self.params = Params()
self.v_cruise_min = 0
self.enabled_prev = False
@@ -47,6 +54,16 @@ class VCruiseHelperSP:
self.enable_button_timers = CRUISE_BUTTON_TIMER
# Speed Limit Assist
self.sla_state = SpeedLimitAssistState.disabled
self.prev_sla_state = SpeedLimitAssistState.disabled
self.has_speed_limit = False
self.speed_limit_final_last = 0.
self.speed_limit_final_last_kph = 0.
self.prev_speed_limit_final_last_kph = 0.
self.req_plus = False
self.req_minus = False
def read_custom_set_speed_params(self) -> None:
self.custom_acc_enabled = self.params.get_bool("CustomAccIncrementsEnabled")
self.short_increment = self.params.get("CustomAccShortPressIncrement", return_default=True)
@@ -89,3 +106,33 @@ class VCruiseHelperSP:
return enabled and self.enabled_prev
return enabled
def update_speed_limit_assist(self, is_metric, LP_SP: custom.LongitudinalPlanSP) -> None:
resolver = LP_SP.speedLimit.resolver
self.has_speed_limit = resolver.speedLimitValid or resolver.speedLimitLastValid
self.speed_limit_final_last = LP_SP.speedLimit.resolver.speedLimitFinalLast
self.speed_limit_final_last_kph = self.speed_limit_final_last * CV.MS_TO_KPH
self.sla_state = LP_SP.speedLimit.assist.state
self.req_plus, self.req_minus = compare_cluster_target(self.v_cruise_cluster_kph * CV.KPH_TO_MS,
self.speed_limit_final_last, is_metric)
@property
def update_speed_limit_final_last_changed(self) -> bool:
return self.has_speed_limit and bool(self.speed_limit_final_last_kph != self.prev_speed_limit_final_last_kph)
def update_speed_limit_assist_pre_active_confirmed(self, button_type: car.CarState.ButtonEvent.Type) -> bool:
if self.sla_state == SpeedLimitAssistState.preActive or self.prev_sla_state == SpeedLimitAssistState.preActive:
if button_type == ButtonType.decelCruise and self.req_minus:
return True
if button_type == ButtonType.accelCruise and self.req_plus:
return True
return False
def update_speed_limit_assist_v_cruise_non_pcm(self) -> None:
if self.sla_state in SLA_ACTIVE_STATES and (self.prev_sla_state not in SLA_ACTIVE_STATES or
self.update_speed_limit_final_last_changed):
self.v_cruise_kph = np.clip(round(self.speed_limit_final_last_kph, 1), self.v_cruise_min, V_CRUISE_MAX)
self.prev_sla_state = self.sla_state
self.prev_speed_limit_final_last_kph = self.speed_limit_final_last_kph
+22 -6
View File
@@ -22,8 +22,18 @@ def log_fingerprint(CP: structs.CarParams) -> None:
sentry.capture_fingerprint(CP.carFingerprint, CP.brand)
def _initialize_neural_network_lateral_control(CI: CarInterfaceBase, CP: structs.CarParams, CP_SP: structs.CarParamsSP,
params: Params = None, enabled: bool = False) -> None:
def _enforce_torque_lateral_control(CP: structs.CarParams, params: Params = None, enabled: bool = False) -> bool:
if params is None:
params = Params()
if CP.steerControlType != structs.CarParams.SteerControlType.angle:
enabled = params.get_bool("EnforceTorqueControl")
return enabled
def _initialize_neural_network_lateral_control(CP: structs.CarParams, CP_SP: structs.CarParamsSP,
params: Params = None, enabled: bool = False) -> bool:
if params is None:
params = Params()
@@ -35,13 +45,12 @@ def _initialize_neural_network_lateral_control(CI: CarInterfaceBase, CP: structs
if nnlc_model_name != "MOCK" and CP.steerControlType != structs.CarParams.SteerControlType.angle:
enabled = params.get_bool("NeuralNetworkLateralControl")
if enabled:
CI.configure_torque_tune(CP.carFingerprint, CP.lateralTuning)
CP_SP.neuralNetworkLateralControl.model.path = nnlc_model_path
CP_SP.neuralNetworkLateralControl.model.name = nnlc_model_name
CP_SP.neuralNetworkLateralControl.fuzzyFingerprint = not exact_match
return enabled
def _initialize_intelligent_cruise_button_management(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params: Params = None) -> None:
if params is None:
@@ -52,12 +61,19 @@ def _initialize_intelligent_cruise_button_management(CP: structs.CarParams, CP_S
CP_SP.pcmCruiseSpeed = False
def _initialize_torque_lateral_control(CI: CarInterfaceBase, CP: structs.CarParams, enforce_torque: bool, nnlc_enabled: bool) -> None:
if nnlc_enabled or enforce_torque:
CI.configure_torque_tune(CP.carFingerprint, CP.lateralTuning)
def setup_interfaces(CI: CarInterfaceBase, params: Params = None) -> None:
CP = CI.CP
CP_SP = CI.CP_SP
_initialize_neural_network_lateral_control(CI, CP, CP_SP, params)
enforce_torque = _enforce_torque_lateral_control(CP, params)
nnlc_enabled = _initialize_neural_network_lateral_control(CP, CP_SP, params)
_initialize_intelligent_cruise_button_management(CP, CP_SP, params)
_initialize_torque_lateral_control(CI, CP, enforce_torque, nnlc_enabled)
def initialize_params(params) -> list[dict[str, Any]]:
@@ -10,7 +10,6 @@ from cereal import log, custom
from opendbc.car import structs
from openpilot.common.params import Params
from openpilot.common.swaglog import cloudlog
from openpilot.sunnypilot.selfdrive.controls.lib.param_store import ParamStore
from openpilot.sunnypilot.selfdrive.controls.lib.blinker_pause_lateral import BlinkerPauseLateral
@@ -19,7 +18,6 @@ class ControlsExt:
self.CP = CP
self.params = params
self.blinker_pause_lateral = BlinkerPauseLateral()
self.param_store = ParamStore(self.CP)
self.get_params_sp()
cloudlog.info("controlsd_ext is waiting for CarParamsSP")
@@ -30,7 +28,6 @@ class ControlsExt:
self.pm_services_ext = ['carControlSP']
def get_params_sp(self) -> None:
self.param_store.update(self.params)
self.blinker_pause_lateral.get_params()
def get_lat_active(self, sm: messaging.SubMaster) -> bool:
@@ -73,8 +70,6 @@ class ControlsExt:
# MADS state
CC_SP.mads = sm['selfdriveStateSP'].mads
CC_SP.params = self.param_store.param_list
CC_SP.intelligentCruiseButtonManagement = sm['selfdriveStateSP'].intelligentCruiseButtonManagement
return CC_SP
@@ -0,0 +1,58 @@
"""
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
This file is part of sunnypilot and is licensed under the MIT License.
See the LICENSE.md file in the root directory for more details.
"""
from cereal import messaging, custom
from openpilot.common.params import Params
from openpilot.common.realtime import DT_MDL
from openpilot.sunnypilot import PARAMS_UPDATE_PERIOD
from openpilot.sunnypilot.selfdrive.selfdrived.events import EventsSP
TRIGGER_THRESHOLD = 30
class E2EAlertsHelper:
def __init__(self):
self._params = Params()
self._frame = -1
self.green_light_alert = False
self.green_light_alert_enabled = self._params.get_bool("GreenLightAlert")
self.lead_depart_alert = False
self.lead_depart_alert_enabled = self._params.get_bool("LeadDepartAlert")
def _read_params(self) -> None:
if self._frame % int(PARAMS_UPDATE_PERIOD / DT_MDL) == 0:
self.green_light_alert_enabled = self._params.get_bool("GreenLightAlert")
self.lead_depart_alert_enabled = self._params.get_bool("LeadDepartAlert")
self._frame += 1
def update(self, sm: messaging.SubMaster, events_sp: EventsSP) -> None:
self._read_params()
if not (self.green_light_alert_enabled or self.lead_depart_alert_enabled):
return
CS = sm['carState']
CC = sm['carControl']
model_x = sm['modelV2'].position.x
max_idx = len(model_x) - 1
has_lead = sm['radarState'].leadOne.status
lead_vRel: float = sm['radarState'].leadOne.vRel
# Green light alert
self.green_light_alert = (self.green_light_alert_enabled and model_x[max_idx] > TRIGGER_THRESHOLD
and not has_lead and CS.standstill and not CS.gasPressed and not CC.enabled)
# Lead Departure Alert
self.lead_depart_alert = (self.lead_depart_alert_enabled and CS.standstill and model_x[max_idx] > 30
and has_lead and lead_vRel > 1 and not CS.gasPressed)
if self.green_light_alert or self.lead_depart_alert:
events_sp.add(custom.OnroadEventSP.EventName.e2eChime)
@@ -6,11 +6,13 @@ See the LICENSE.md file in the root directory for more details.
"""
from openpilot.sunnypilot.selfdrive.controls.lib.nnlc.nnlc import NeuralNetworkLateralControl
from openpilot.sunnypilot.selfdrive.controls.lib.latcontrol_torque_ext_override import LatControlTorqueExtOverride
class LatControlTorqueExt(NeuralNetworkLateralControl):
class LatControlTorqueExt(NeuralNetworkLateralControl, LatControlTorqueExtOverride):
def __init__(self, lac_torque, CP, CP_SP, CI):
super().__init__(lac_torque, CP, CP_SP, CI)
NeuralNetworkLateralControl.__init__(self, lac_torque, CP, CP_SP, CI)
LatControlTorqueExtOverride.__init__(self, CP)
def update(self, CS, VM, pid, params, ff, pid_log, setpoint, measurement, calibrated_pose, roll_compensation,
desired_lateral_accel, actual_lateral_accel, lateral_accel_deadzone, gravity_adjusted_lateral_accel,
@@ -58,7 +58,8 @@ class LatControlTorqueExtBase:
self.torque_from_lateral_accel_in_torque_space = CI.torque_from_lateral_accel_in_torque_space()
self._ff = 0.0
self._pid = PIDController(0.0, 0.0, k_f=0.0)
self._pid = PIDController(self.torque_params.kp, self.torque_params.ki,
k_f=self.torque_params.kf)
self._pid_log = None
self._setpoint = 0.0
self._measurement = 0.0
@@ -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.
"""
from openpilot.common.params import Params
class LatControlTorqueExtOverride:
def __init__(self, CP):
self.CP = CP
self.params = Params()
self.enforce_torque_control_toggle = self.params.get_bool("EnforceTorqueControl") # only during init
self.torque_override_enabled = self.params.get_bool("TorqueParamsOverrideEnabled")
self.frame = -1
def update_override_torque_params(self, torque_params) -> bool:
if not self.enforce_torque_control_toggle:
return False
self.frame += 1
if self.frame % 300 == 0:
self.torque_override_enabled = self.params.get_bool("TorqueParamsOverrideEnabled")
if not self.torque_override_enabled:
return False
torque_params.latAccelFactor = float(self.params.get("TorqueParamsOverrideLatAccelFactor", return_default=True))
torque_params.friction = float(self.params.get("TorqueParamsOverrideFriction", return_default=True))
return True
return False
@@ -7,22 +7,31 @@ See the LICENSE.md file in the root directory for more details.
from cereal import messaging, custom
from opendbc.car import structs
from openpilot.common.constants import CV
from openpilot.selfdrive.car.cruise import V_CRUISE_MAX
from openpilot.sunnypilot.selfdrive.controls.lib.dec.dec import DynamicExperimentalController
from openpilot.sunnypilot.selfdrive.controls.lib.e2e_alerts_helper import E2EAlertsHelper
from openpilot.sunnypilot.selfdrive.controls.lib.smart_cruise_control.smart_cruise_control import SmartCruiseControl
from openpilot.sunnypilot.selfdrive.controls.lib.speed_limit.speed_limit_assist import SpeedLimitAssist
from openpilot.sunnypilot.selfdrive.controls.lib.speed_limit.speed_limit_resolver import SpeedLimitResolver
from openpilot.sunnypilot.selfdrive.selfdrived.events import EventsSP
from openpilot.sunnypilot.models.helpers import get_active_bundle
DecState = custom.LongitudinalPlanSP.DynamicExperimentalControl.DynamicExperimentalControlState
Source = custom.LongitudinalPlanSP.LongitudinalPlanSource
LongitudinalPlanSource = custom.LongitudinalPlanSP.LongitudinalPlanSource
class LongitudinalPlannerSP:
def __init__(self, CP: structs.CarParams, mpc):
self.events_sp = EventsSP()
self.resolver = SpeedLimitResolver()
self.dec = DynamicExperimentalController(CP, mpc)
self.scc = SmartCruiseControl()
self.resolver = SpeedLimitResolver()
self.sla = SpeedLimitAssist(CP)
self.generation = int(model_bundle.generation) if (model_bundle := get_active_bundle()) else None
self.source = Source.cruise
self.source = LongitudinalPlanSource.cruise
self.e2e_alerts_helper = E2EAlertsHelper()
self.output_v_target = 0.
self.output_a_target = 0.
@@ -39,15 +48,29 @@ class LongitudinalPlannerSP:
return self.dec.mode()
def update_targets(self, sm: messaging.SubMaster, v_ego: float, a_ego: float, v_cruise: float) -> tuple[float, float]:
self.scc.update(sm, v_ego, a_ego, v_cruise)
CS = sm['carState']
v_cruise_cluster_kph = min(CS.vCruiseCluster, V_CRUISE_MAX)
v_cruise_cluster = v_cruise_cluster_kph * CV.KPH_TO_MS
long_enabled = sm['carControl'].enabled
long_override = sm['carControl'].cruiseControl.override
# Smart Cruise Control
self.scc.update(sm, long_enabled, long_override, v_ego, a_ego, v_cruise)
# Speed Limit Resolver
self.resolver.update(v_ego, sm)
# Speed Limit Assist
has_speed_limit = self.resolver.speed_limit_valid or self.resolver.speed_limit_last_valid
self.sla.update(long_enabled, long_override, v_ego, a_ego, v_cruise_cluster, self.resolver.speed_limit,
self.resolver.speed_limit_final_last, has_speed_limit, self.resolver.distance, self.events_sp)
targets = {
Source.cruise: (v_cruise, a_ego),
Source.sccVision: (self.scc.vision.output_v_target, self.scc.vision.output_a_target),
Source.sccMap: (self.scc.map.output_v_target, self.scc.map.output_a_target),
LongitudinalPlanSource.cruise: (v_cruise, a_ego),
LongitudinalPlanSource.sccVision: (self.scc.vision.output_v_target, self.scc.vision.output_a_target),
LongitudinalPlanSource.sccMap: (self.scc.map.output_v_target, self.scc.map.output_a_target),
LongitudinalPlanSource.speedLimitAssist: (self.sla.output_v_target, self.sla.output_a_target),
}
self.source = min(targets, key=lambda k: targets[k][0])
@@ -55,7 +78,9 @@ class LongitudinalPlannerSP:
return self.output_v_target, self.output_a_target
def update(self, sm: messaging.SubMaster) -> None:
self.events_sp.clear()
self.dec.update(sm)
self.e2e_alerts_helper.update(sm, self.events_sp)
def publish_longitudinal_plan_sp(self, sm: messaging.SubMaster, pm: messaging.PubMaster) -> None:
plan_sp_send = messaging.new_message('longitudinalPlanSP')
@@ -66,6 +91,7 @@ class LongitudinalPlannerSP:
longitudinalPlanSP.longitudinalPlanSource = self.source
longitudinalPlanSP.vTarget = float(self.output_v_target)
longitudinalPlanSP.aTarget = float(self.output_a_target)
longitudinalPlanSP.events = self.events_sp.to_msg()
# Dynamic Experimental Control
dec = longitudinalPlanSP.dec
@@ -96,8 +122,24 @@ class LongitudinalPlannerSP:
speedLimit = longitudinalPlanSP.speedLimit
resolver = speedLimit.resolver
resolver.speedLimit = float(self.resolver.speed_limit)
resolver.speedLimitLast = float(self.resolver.speed_limit_last)
resolver.speedLimitFinal = float(self.resolver.speed_limit_final)
resolver.speedLimitFinalLast = float(self.resolver.speed_limit_final_last)
resolver.speedLimitValid = self.resolver.speed_limit_valid
resolver.speedLimitLastValid = self.resolver.speed_limit_last_valid
resolver.speedLimitOffset = float(self.resolver.speed_limit_offset)
resolver.distToSpeedLimit = float(self.resolver.distance)
resolver.source = self.resolver.source
assist = speedLimit.assist
assist.state = self.sla.state
assist.enabled = self.sla.is_enabled
assist.active = self.sla.is_active
assist.vTarget = float(self.sla.output_v_target)
assist.aTarget = float(self.sla.output_a_target)
# E2E Alerts
e2eAlerts = longitudinalPlanSP.e2eAlerts
e2eAlerts.greenLightAlert = self.e2e_alerts_helper.green_light_alert
e2eAlerts.leadDepartAlert = self.e2e_alerts_helper.lead_depart_alert
pm.send('longitudinalPlanSP', plan_sp_send)
@@ -1,44 +0,0 @@
"""
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
This file is part of sunnypilot and is licensed under the MIT License.
See the LICENSE.md file in the root directory for more details.
"""
from cereal import custom
from opendbc.car import structs
from openpilot.common.params import Params
from sunnypilot.sunnylink.utils import get_param_as_byte
class ParamStore:
keys: list[str]
_params: dict[str, custom.CarControlSP.Param]
def __init__(self, CP: structs.CarParams):
universal_params: list[str] = []
brand_params: list[str] = []
self.keys = universal_params + brand_params
self._params = {}
self.frame = 0
def update(self, params: Params) -> None:
self.frame += 1
if self.frame % 300 != 0:
return
for key in self.keys:
param_type = params.get_type(key).name.lower() # Using string instead of number because its "loose" dependency, and could change by OP at anytime.
# Over engineering opportunity: It's possible this conversion is slow, we may check the value as params returns it for cache purposes. Not today.
param_value = get_param_as_byte(key, params)
if (existing_param := self._params.get(key)) is not None and existing_param.value == param_value:
continue
self._params[key] = custom.CarControlSP.Param(key=key, value=param_value, type=param_type)
@property
def param_list(self) -> list[custom.CarControlSP.Param]:
return [v for k,v in self._params.items()]
@@ -12,8 +12,8 @@ from openpilot.sunnypilot.selfdrive.controls.lib.smart_cruise_control import MIN
MapState = VisionState = custom.LongitudinalPlanSP.SmartCruiseControl.MapState
ACTIVE_STATES = (MapState.turning, MapState.overriding)
ENABLED_STATES = (MapState.enabled, *ACTIVE_STATES)
ACTIVE_STATES = (MapState.turning, )
ENABLED_STATES = (MapState.enabled, MapState.overriding, *ACTIVE_STATES)
R = 6373000.0 # approximate radius of earth in meters
TO_RADIANS = math.pi / 180
@@ -14,9 +14,6 @@ class SmartCruiseControl:
self.vision = SmartCruiseControlVision()
self.map = SmartCruiseControlMap()
def update(self, sm: messaging.SubMaster, v_ego: float, a_ego: float, v_cruise: float) -> None:
long_enabled = sm['carControl'].enabled
long_override = sm['carControl'].cruiseControl.override
def update(self, sm: messaging.SubMaster, long_enabled: bool, long_override: bool, v_ego: float, a_ego: float, v_cruise: float) -> None:
self.map.update(long_enabled, long_override, v_ego, a_ego, v_cruise)
self.vision.update(sm, long_enabled, long_override, v_ego, a_ego, v_cruise)

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