Compare commits

...

10 Commits

Author SHA1 Message Date
Jason Wen
4cf822a6cc chore: update CHANGELOG for 2026.001.002 2026-05-07 11:02:40 -04:00
Jason Wen
ac8af9aa94 release: ignore upstream IsReleaseBranch (#1831) 2026-05-07 11:01:33 -04:00
Jason Wen
1ac64f7360 chore: bump version to 2026.001.002 2026-05-07 11:01:27 -04:00
Jason Wen
505881cbc5 chore: update CHANGELOG for 2026.001.001 2026-05-06 22:15:17 -04:00
Jason Wen
a68ed2fd01 ui: update gates for certain toggles (#1830)
* don't use upstream's

* clean

* update schema

* fix

* mismatch test and fix
2026-05-06 21:41:18 -04:00
Jason Wen
2aa179bcac chore: bump version to 2026.001.001 2026-05-06 21:41:16 -04:00
Jason Wen
090b404fee Update CHANGELOG.md
(cherry picked from commit b9aa1962ca)
2026-05-05 23:00:00 -04:00
Jason Wen
4c36db0091 Revert "sunnylink: switch athena domain (#1826)"
This reverts commit 53e5ae0578.
2026-05-05 22:08:46 -04:00
Jason Wen
c25b581ae5 Default model: CD210 model 2026-05-05 22:08:29 -04:00
Jason Wen
2316b1142c Revert "POP model (#37727)"
This reverts commit 12f1be19cc.
2026-05-05 22:02:50 -04:00
19 changed files with 81 additions and 117 deletions

View File

@@ -1,3 +1,13 @@
sunnypilot Version 2026.001.002 (2026-05-07)
========================
* What's Changed (sunnypilot/sunnypilot)
* release: ignore upstream IsReleaseBranch by @sunnyhaibin
sunnypilot Version 2026.001.001 (2026-05-06)
========================
* What's Changed (sunnypilot/sunnypilot)
* ui: update gates for certain toggles by @sunnyhaibin
sunnypilot Version 2026.001.000 (2026-05-06)
========================
* What's Changed (sunnypilot/sunnypilot)
@@ -170,6 +180,20 @@ sunnypilot Version 2026.001.000 (2026-05-06)
* @royjr made their first contribution in "HKG: add KIA_FORTE_2019_NON_SCC fingerprint"
* @ssysm made their first contribution in "Tesla: remove `TESLA_MODEL_X` from `dashcamOnly`"
* Full Changelog: https://github.com/sunnypilot/sunnypilot/compare/v2025.002.000...v2026.001.000
************************
* Synced with commaai's openpilot (v0.11.1)
* master commit c001f3c9b490a80e69539f0af6022f6e07ceb721 (April 16, 2026)
* New driver monitoring model
* Improved image processing pipeline for driver camera
* Rivian R1S and R1T 2025 support thanks to lukasloetkolben!
* New driving model #36798
* Fully trained using a learned simulator
* Improved longitudinal performance in Experimental mode
* Reduce comma four standby power usage by 77% to 52 mW
* Kia K7 2017 support thanks to royjr!
* Lexus LS 2018 support thanks to Hacheoy!
* Improved inter-process communication memory efficiency
* comma four support
sunnypilot Version 2025.002.000 (2025-11-06)
========================

View File

@@ -1 +1 @@
#define DEFAULT_MODEL "POP model (Default)"
#define DEFAULT_MODEL "CD210 (Default)"

View File

@@ -86,7 +86,7 @@ class Car:
self.can_callbacks = can_comm_callbacks(self.can_sock, self.pm.sock['sendcan'])
is_release = self.params.get_bool("IsReleaseBranch")
is_release = False # self.params.get_bool("IsReleaseBranch")
is_release_sp = self.params.get_bool("IsReleaseSpBranch")
if CI is None:

View File

@@ -36,7 +36,7 @@ class DeveloperLayout(Widget):
def __init__(self):
super().__init__()
self._params = Params()
self._is_release = self._params.get_bool("IsReleaseBranch")
self._is_release = False # self._params.get_bool("IsReleaseBranch")
# Build items and keep references for callbacks/state updates
self._adb_toggle = toggle_item(

View File

@@ -42,7 +42,7 @@ class TogglesLayout(Widget):
def __init__(self):
super().__init__()
self._params = Params()
self._is_release = self._params.get_bool("IsReleaseBranch")
self._is_release = False # self._params.get_bool("IsReleaseBranch")
# param, title, desc, icon, needs_restart
self._toggle_defs = {

View File

@@ -159,7 +159,6 @@ class UIStateSP:
def _enforce_constraints(self) -> None:
has_long = self.has_longitudinal_control
has_icbm = self.has_icbm
CP = self.CP
if CP is not None:
@@ -168,8 +167,8 @@ class UIStateSP:
self.params.remove("EnforceTorqueControl")
self.params.remove("NeuralNetworkLateralControl")
# Alpha longitudinal: clear if not available or on release branch
if not CP.alphaLongitudinalAvailable or self.params.get_bool("IsReleaseBranch"):
# Alpha longitudinal: clear if not available
if not CP.alphaLongitudinalAvailable:
self.params.remove("AlphaLongitudinalEnabled")
# BSM not available: clear BSM-dependent settings
@@ -181,21 +180,23 @@ class UIStateSP:
self.params.remove("NeuralNetworkLateralControl")
self.params.remove("AlphaLongitudinalEnabled")
# No longitudinal control: no experimental mode
# No longitudinal control: no experimental mode or DEC
if not has_long:
self.params.remove("ExperimentalMode")
self.params.remove("DynamicExperimentalControl")
# ICBM: clear if not available or if full longitudinal control is active
if self.CP_SP is not None:
if not self.CP_SP.intelligentCruiseButtonManagementAvailable or has_long:
self.params.remove("IntelligentCruiseButtonManagement")
self.has_icbm = False
else:
self.params.remove("IntelligentCruiseButtonManagement")
self.has_icbm = False
# Cruise features requiring longitudinal or ICBM
if not (has_long or has_icbm):
if not (has_long or self.has_icbm):
self.params.remove("CustomAccIncrementsEnabled")
self.params.remove("DynamicExperimentalControl")
self.params.remove("SmartCruiseControlVision")
self.params.remove("SmartCruiseControlMap")

View File

@@ -74,7 +74,7 @@ class UIState(UIStateSP):
# Core state variables
self.is_metric: bool = self.params.get_bool("IsMetric")
self.is_release = self.params.get_bool("IsReleaseBranch")
self.is_release = False # self.params.get_bool("IsReleaseBranch")
self.always_on_dm: bool = self.params.get_bool("AlwaysOnDM")
self.started: bool = False
self.ignition: bool = False

View File

@@ -1 +1 @@
#define SUNNYPILOT_VERSION "2026.001.000"
#define SUNNYPILOT_VERSION "2026.001.002"

View File

@@ -1 +1 @@
5d4d21f1899de21137f69d74a4602c44cc5a6b04cf4e4aa9d0ec9206f8c30350
32f57bdc91f910df1f48ddae7c59aaf6e751f9df6756da481a210577dbce8bcf

View File

@@ -34,7 +34,7 @@ from openpilot.sunnypilot.sunnylink.utils import sunnylink_need_register, sunnyl
from openpilot.sunnypilot.sunnylink.capabilities import generate_capabilities, CAPABILITY_LABELS
from openpilot.sunnypilot.sunnylink.tools.generate_settings_schema import generate_schema
SUNNYLINK_ATHENA_HOST = os.getenv('SUNNYLINK_ATHENA_HOST', 'wss://athena.sunnylink.ai')
SUNNYLINK_ATHENA_HOST = os.getenv('SUNNYLINK_ATHENA_HOST', 'wss://ws.stg.api.sunnypilot.ai')
HANDLER_THREADS = int(os.getenv('HANDLER_THREADS', "4"))
LOCAL_PORT_WHITELIST = {8022}
SUNNYLINK_LOG_ATTR_NAME = "user.sunny.upload"

View File

@@ -94,7 +94,7 @@ def generate_capabilities(params: Params | None = None) -> dict:
# Hardware + boolean params (no CarParams dependency)
caps["device_type"] = HARDWARE.get_device_type()
caps["is_release"] = params.get_bool("IsReleaseBranch")
caps["is_release"] = False # params.get_bool("IsReleaseBranch")
caps["is_sp_release"] = params.get_bool("IsReleaseSpBranch")
caps["is_development"] = params.get_bool("IsDevelopmentBranch")
caps["stock_longitudinal"] = params.get_bool("ToyotaEnforceStockLongitudinal")

View File

@@ -574,19 +574,9 @@
"description": "Let the model decide when to use sunnypilot ACC or sunnypilot End to End Longitudinal.",
"visibility": [
{
"type": "any",
"conditions": [
{
"type": "capability",
"field": "has_longitudinal_control",
"equals": true
},
{
"type": "capability",
"field": "has_icbm",
"equals": true
}
]
"type": "capability",
"field": "has_longitudinal_control",
"equals": true
}
],
"enablement": [
@@ -1731,26 +1721,6 @@
"key": "JoystickDebugMode",
"widget": "toggle",
"title": "Joystick Debug Mode",
"visibility": [
{
"type": "not",
"condition": {
"type": "any",
"conditions": [
{
"type": "capability",
"field": "is_release",
"equals": true
},
{
"type": "capability",
"field": "is_sp_release",
"equals": true
}
]
}
}
],
"enablement": [
{
"type": "offroad_only"
@@ -1775,19 +1745,9 @@
{
"type": "not",
"condition": {
"type": "any",
"conditions": [
{
"type": "capability",
"field": "is_release",
"equals": true
},
{
"type": "capability",
"field": "is_sp_release",
"equals": true
}
]
"type": "capability",
"field": "has_icbm",
"equals": true
}
}
]
@@ -1900,19 +1860,9 @@
{
"type": "not",
"condition": {
"type": "any",
"conditions": [
{
"type": "capability",
"field": "is_release",
"equals": true
},
{
"type": "capability",
"field": "is_sp_release",
"equals": true
}
]
"type": "capability",
"field": "is_sp_release",
"equals": true
}
}
],
@@ -1947,11 +1897,6 @@
"condition": {
"type": "any",
"conditions": [
{
"type": "capability",
"field": "is_release",
"equals": true
},
{
"type": "capability",
"field": "is_sp_release",

View File

@@ -59,12 +59,7 @@ macros:
- type: not
condition: {type: capability, field: tesla_has_vehicle_bus, equals: true}
# Hide everything but a clearly-marked release branch (matches Raylib
# _is_release_branch = is_release OR is_sp_release).
# Hide on sunnypilot release branches (is_release is hardcoded False everywhere; is_sp_release is the active gate).
release_branches_hide:
- type: not
condition:
type: any
conditions:
- {type: capability, field: is_release, equals: true}
- {type: capability, field: is_sp_release, equals: true}
condition: {type: capability, field: is_sp_release, equals: true}

View File

@@ -21,14 +21,7 @@ sections:
title: Dynamic Experimental Control
description: Let the model decide when to use sunnypilot ACC or sunnypilot End to End Longitudinal.
visibility:
- type: any
conditions:
- type: capability
field: has_longitudinal_control
equals: true
- type: capability
field: has_icbm
equals: true
- $ref: '#/macros/longitudinal'
enablement:
- $ref: '#/macros/longitudinal'
- key: DisengageOnAccelerator

View File

@@ -26,8 +26,6 @@ sections:
- key: JoystickDebugMode
widget: toggle
title: Joystick Debug Mode
visibility:
- $ref: '#/macros/release_branches_hide'
enablement:
- $ref: '#/macros/offroad'
- key: AlphaLongitudinalEnabled
@@ -46,14 +44,9 @@ sections:
equals: true
- type: not
condition:
type: any
conditions:
- type: capability
field: is_release
equals: true
- type: capability
field: is_sp_release
equals: true
type: capability
field: has_icbm
equals: true
enablement:
- $ref: '#/macros/not_engaged'
- key: ShowDebugInfo
@@ -131,9 +124,6 @@ sections:
condition:
type: any
conditions:
- type: capability
field: is_release
equals: true
- type: capability
field: is_sp_release
equals: true

View File

@@ -15,6 +15,7 @@ compiled output once the compiler has produced it.
"""
from __future__ import annotations
import difflib
import json
import os
@@ -44,7 +45,16 @@ def committed() -> dict:
class TestRoundtrip:
def test_compiled_matches_committed(self, compiled, committed):
"""Compiled output must match the checked-in JSON."""
assert compiled == committed
if compiled == committed:
return
diff = "\n".join(difflib.unified_diff(
json.dumps(committed, indent=2).splitlines(),
json.dumps(compiled, indent=2).splitlines(),
fromfile="settings_ui.json (committed)",
tofile="settings_ui.json (freshly compiled)",
lineterm="",
))
pytest.fail(f"settings_ui.json schema mismatch — run compile_settings_ui.py\n\n{diff}")
def test_committed_file_is_canonical(self):
"""Compiled output must byte-match the checked-in file (including trailing newline).
@@ -53,7 +63,16 @@ class TestRoundtrip:
rendered = json.dumps(schema, indent=2) + "\n"
with open(DEFAULT_OUT) as f:
current = f.read()
assert current == rendered, "settings_ui.json out of sync — run compile_settings_ui.py"
if current == rendered:
return
diff = "\n".join(difflib.unified_diff(
current.splitlines(),
rendered.splitlines(),
fromfile="settings_ui.json (on disk)",
tofile="settings_ui.json (freshly compiled)",
lineterm="",
))
pytest.fail(f"settings_ui.json out of sync — run compile_settings_ui.py\n\n{diff}")
class TestRefResolution:

View File

@@ -181,17 +181,14 @@ class TestTorqueOptionGeneration:
class TestReleaseBranchGates:
@pytest.mark.parametrize("key", [
"JoystickDebugMode",
"AlphaLongitudinalEnabled",
"EnableGithubRunner",
"QuickBootToggle",
])
def test_sp_dev_items_gate_on_is_sp_release(self, schema, key):
"""SP dev items must hide on either release branch (is_release OR is_sp_release)."""
"""sunnypilot dev items must hide on sunnypilot release branches (is_sp_release gate)."""
item = _find_item(schema, key)
assert item is not None, f"{key} not found in schema"
rules = (item.get("visibility") or []) + (item.get("enablement") or [])
assert _references_capability_field(rules, "is_release"), f"{key} missing is_release gate"
assert _references_capability_field(rules, "is_sp_release"), f"{key} missing is_sp_release gate"