Compare commits

..

53 Commits

Author SHA1 Message Date
James Vecellio-Grant 3629ca27a4 no 2026-10-18 22:10:56 -07:00
James Vecellio-Grant 7f9439e89e Merge branch 'master' into validate-fusion 2026-10-18 22:10:28 -07:00
Kumar 0dacd0eec4 Revert "mapd: disable map-based Smart Cruise Control and speed limit sources until mapd has a position source" (#2065)
This reverts commit b6170ac5e9.
2026-10-18 19:25:14 -07:00
Kumar 09b2f4bbe0 mapd: fix mapd GPS position handling (#2064)
* mapd: restore the position mapd reads from llk

* turn it on

* mapd ui

* Revert "mapd ui"

This reverts commit 857d430297.

* Revert "turn it on"

This reverts commit 2a5d9a62be.
2026-10-18 19:07:32 -07:00
Amy Jeanes 0120b66f05 modeld: set AM_PERF_LEVEL to high for perf (#2061)
set AM_PERF_LEVEL to high for perf

Co-authored-by: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com>
2026-10-18 16:16:49 -07:00
James Vecellio-Grant f09b04c267 ci: upload big model over lfs (#2063)
ci: push chestnut via lfs
2026-10-18 16:14:06 -07:00
James Vecellio-Grant f0617e11a6 ci: fix default models (#2062)
* ci: fix default models

* shouldnt of been deleted

* skip dm warp as well
2026-10-18 15:30:33 -07:00
James Vecellio-Grant 9a013d56f9 reason the sync made models slower 2026-10-18 13:50:48 -07:00
James Vecellio-Grant 4674f5bbec Mergr 2026-10-18 13:43:45 -07:00
James Vecellio-Grant 662b29eb6b Merge branch 'master' into validate-fusion 2026-10-18 13:42:42 -07:00
discountchubbs d811c8ddde modeld_v2: check fusion validation speed 2026-10-18 12:12:34 -07:00
discountchubbs e693544fd7 this gets ignored, just to pass lint 2026-10-16 20:51:10 -07:00
discountchubbs f9c876ca2d upstream sync stuffs 2026-10-16 20:50:25 -07:00
discountchubbs 046a3ead4e https://github.com/commaai/openpilot/commit/2b09bc94a9f52206173cece3b517a2a3262c258f 2026-10-16 20:39:51 -07:00
James Vecellio-Grant 723ebf374e Merge branch 'rebuild-deep-rl' into comma-pkl-converter 2026-10-16 10:09:15 -07:00
James Vecellio-Grant b24f546a0f Merge branch 'master' into rebuild-deep-rl 2026-10-16 10:08:54 -07:00
discountchubbs 3163577bc9 Merge remote-tracking branch 'origin/rebuild-deep-rl' into comma-pkl-converter 2026-10-15 20:50:51 -07:00
James Vecellio-Grant 84fda467b5 caught on new icm comparison tool 2026-10-15 20:49:35 -07:00
discountchubbs 04a8fb81ab Merge remote-tracking branch 'origin/rebuild-deep-rl' into comma-pkl-converter 2026-10-15 08:15:22 -07:00
discountchubbs 05099ae19c Merge remote-tracking branch 'origin/master' into rebuild-deep-rl 2026-10-15 08:14:23 -07:00
discountchubbs e6d035b639 fix ci 2026-10-14 10:40:10 -07:00
discountchubbs 45bfd88e7e no more fw fetching just use decompress 2026-10-14 10:02:32 -07:00
discountchubbs 86f2e7b255 fw fetch to kernel 2026-10-14 09:53:31 -07:00
discountchubbs eb7a6fc0f8 converter fix 2026-10-14 09:18:40 -07:00
discountchubbs 033ba0d973 pkl warmup 2026-10-14 08:38:18 -07:00
discountchubbs 32460cd5b1 Merge remote-tracking branch 'origin/rebuild-deep-rl' into comma-pkl-converter 2026-10-14 08:10:34 -07:00
discountchubbs 0042016791 conflict res 2026-10-14 08:06:36 -07:00
discountchubbs f6e2fb1c33 Merge remote-tracking branch 'origin/master' into rebuild-deep-rl 2026-10-14 08:04:54 -07:00
James Vecellio-Grant 43cbdc65cd more 2026-10-13 23:32:01 -07:00
discountchubbs 5823cf4f84 lowers chestnut loading to 3ms faster than stock 2026-10-13 23:27:24 -07:00
discountchubbs 023ef9419a one packed contiguous buffer submit 2026-10-13 22:58:19 -07:00
discountchubbs 374659bf43 exec 2026-10-13 20:45:53 -07:00
James Vecellio-Grant 07f755a4c7 Merge branch 'rebuild-deep-rl' into comma-pkl-converter 2026-10-13 20:40:20 -07:00
James Vecellio-Grant f4996a0529 lint 2026-10-13 20:39:15 -07:00
discountchubbs 2f6e2560ea modeld_v2: create a compiled pkl -> gpu kernel artifact converter 2026-10-13 20:36:57 -07:00
James Vecellio-Grant 0414843e2f method() persistent_load 2026-10-13 20:09:00 -07:00
James Vecellio-Grant 5acb9d2c8e whoops 2026-10-13 20:01:23 -07:00
discountchubbs 2bf8f88978 bump 2026-10-13 14:39:33 -07:00
discountchubbs e6e5b1c165 bump tg to upstream tg/tg:master. no rebuild needed 2026-10-13 14:36:10 -07:00
discountchubbs b7d06aa440 publish faster 2026-10-13 11:21:32 -07:00
discountchubbs a9ccd8fedf zed compress 2026-10-13 10:44:41 -07:00
discountchubbs 6220734b2d parallel 2026-10-13 08:56:33 -07:00
discountchubbs f3f7296776 stream chunks for big models to save oom 2026-10-13 08:04:31 -07:00
discountchubbs 9f3a2607ee dedup chestnutty 2026-10-12 23:31:56 -07:00
discountchubbs b4c3a19db1 skip out on op modules 2026-10-12 23:22:02 -07:00
discountchubbs 04098893d9 run as bash: for when i wake up:
these models will fail, look at workflow, likely need env setup now that we use recursion
2026-10-12 23:14:11 -07:00
discountchubbs bc064e892f standin for chestnut linear_compile 2026-10-12 23:09:55 -07:00
discountchubbs be51bc793d 5ms speed up on qcom 2026-10-12 22:36:27 -07:00
discountchubbs f7c65f7d6a lint 2026-10-12 20:55:33 -07:00
discountchubbs bd27f3b54f offroad proc for cache warmup 2026-10-12 19:53:39 -07:00
discountchubbs d7c1827134 new revolution 2026-10-12 17:02:05 -07:00
discountchubbs 1344824746 modeld_v2: shes deeeeeep 2026-10-12 16:34:00 -07:00
discountchubbs 75b5926f4f models: fix qcom float16 overflow 2026-10-09 12:36:31 -07:00
21 changed files with 126 additions and 157 deletions
+4 -3
View File
@@ -115,7 +115,7 @@ jobs:
env ${TG_FLAGS} python3 ${{ github.workspace }}/${{ env.COMPILER }}/compile_onnx.py \
${{ github.workspace }}/${{ env.SMALL_ONNX }} \
${{ github.workspace }}/${{ env.SMALL_PKL }} \
--device-input "*" --out-of-band --benchmark-runs 1
--out-of-band --benchmark-runs 1
- name: Prepare output
env:
@@ -440,9 +440,10 @@ jobs:
TG_FLAGS="DEV=QCOM IMAGE=1 FLOAT16=1 NOLOCALS=1 JIT_BATCH_SIZE=0 OPENPILOT_HACKS=1"
taskset -c 7 env ${TG_FLAGS} python3 \
${{ github.workspace }}/tinygrad_repo/examples/openpilot/compile3.py \
${{ github.workspace }}/tinygrad_repo/examples/openpilot/compile_onnx.py \
${{ github.workspace }}/${{ env.DM_ONNX }} \
${{ github.workspace }}/${{ env.DM_PKL }}
${{ github.workspace }}/${{ env.DM_PKL }} \
--out-of-band --benchmark-runs 1
- name: Compile DM warp
run: |
@@ -594,8 +594,14 @@ jobs:
- name: Publish chestnut branch
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HF_TOKEN: ${{ secrets.HF_TOKEN }}
run: |
CHESTNUT_BRANCH="${{ needs.prepare_strategy.outputs.new_branch }}-chestnut"
cp .lfsconfig "${{ env.OUTPUT_DIR }}/"
echo 'openpilot/selfdrive/modeld/models/big_*_tinygrad.pkl filter=lfs diff=lfs merge=lfs -text' > "${{ env.OUTPUT_DIR }}/.gitattributes"
git lfs install
git config --global credential.helper store
echo "https://user:${HF_TOKEN}@huggingface.co" > ~/.git-credentials
${{ env.CI_DIR }}/publish.sh \
"${{ github.workspace }}" \
@@ -4,7 +4,6 @@ from openpilot.common.realtime import DT_CTRL
from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N
from openpilot.common.pid import PIDController
from openpilot.selfdrive.modeld.constants import ModelConstants
from openpilot.sunnypilot.selfdrive.controls.lib.longcontrol import LongControlSP
CONTROL_N_T_IDX = ModelConstants.T_IDXS[:CONTROL_N]
@@ -40,8 +39,7 @@ def long_control_state_trans(CP_SP, active, long_control_state,
return long_control_state
class LongControl(LongControlSP):
class LongControl:
def __init__(self, CP, CP_SP):
self.CP = CP
self.CP_SP = CP_SP
@@ -70,7 +68,7 @@ class LongControl(LongControlSP):
if output_accel > self.CP.stopAccel:
output_accel = min(output_accel, 0.0)
# TODO: can we just go straight to stopAccel?
output_accel -= self.stopping_decel_rate(CS.vEgo) * DT_CTRL
output_accel -= 1.0 * DT_CTRL # m/s^2/s while trying to stop
self.reset()
else: # LongCtrlState.pid
@@ -1,10 +1,6 @@
from types import SimpleNamespace
from typing import cast
from openpilot.common.test import OpenpilotTestCase
from openpilot.cereal import custom
from openpilot.selfdrive.controls.lib.longcontrol import LongCtrlState, long_control_state_trans
from openpilot.sunnypilot.selfdrive.controls.lib.longcontrol import LongControlSP
class TestLongControlStateTransition(OpenpilotTestCase):
@@ -46,21 +42,3 @@ class TestLongControlStateTransition(OpenpilotTestCase):
next_state = long_control_state_trans(CP_SP, active, current_state,
should_stop=False, brake_pressed=False, cruise_standstill=False)
assert next_state == LongCtrlState.pid
class TestStoppingHold:
def test_weak_brake_does_not_hold_stopping(self):
control = SimpleNamespace(last_output_accel=-0.109)
car_state = SimpleNamespace(vEgo=0.277, aEgo=-0.406)
assert not LongControlSP.should_hold_stopping(cast(LongControlSP, control), car_state, -0.072)
def test_sufficient_brake_holds_stopping(self):
control = SimpleNamespace(last_output_accel=-0.543)
car_state = SimpleNamespace(vEgo=0.209, aEgo=-0.534)
assert LongControlSP.should_hold_stopping(cast(LongControlSP, control), car_state, -0.469)
def test_stopping_decel_rate_is_smooth_while_rolling(self):
assert LongControlSP.stopping_decel_rate(0.1) == 0.3
def test_stopping_decel_rate_builds_holding_brake_at_stop(self):
assert LongControlSP.stopping_decel_rate(0.0) == 2.0
+4 -3
View File
@@ -48,8 +48,9 @@ def compile_model(onnx_path, pkl_path):
Action(cmd, " [ONNX] $TARGET"),
)
compile_model('models/dmonitoring_model.onnx', 'models/dmonitoring_model_tinygrad.pkl')
compile_model('models/driving_supercombo.onnx', 'models/driving_tinygrad.pkl')
if not os.getenv('SKIP_TINYGRAD_COMPILE'):
compile_model('models/dmonitoring_model.onnx', 'models/dmonitoring_model_tinygrad.pkl')
compile_model('models/driving_supercombo.onnx', 'models/driving_tinygrad.pkl')
model_w, model_h = MEDMODEL_INPUT_SIZE
for cam_w, cam_h in camera_configs:
@@ -62,7 +63,7 @@ for cam_w, cam_h in camera_configs:
lenv.Command(warp_pkl_path, tinygrad_files + warp_deps + [Value(cmd)], cmd)
dm_w, dm_h = DM_INPUT_SIZE
for cam_w, cam_h in camera_configs:
for cam_w, cam_h in [] if os.getenv('SKIP_TINYGRAD_COMPILE') else camera_configs:
dm_pkl_path = File(f"models/dm_warp_{cam_w}x{cam_h}_tinygrad.pkl").abspath
stride, y_height, uv_height, frame_size = get_nv12_info(cam_w, cam_h)
cmd = (f'{tg_flags} {mac_brew_string} python3 "{compiler}/compile_warp.py" '
+1
View File
@@ -7,6 +7,7 @@ from functools import cached_property
import os
os.environ['GMMU'] = '0' # for chestnut fast loading, noop for qcom
os.environ.setdefault('AM_POWER_LIMIT', '100')
os.environ.setdefault('AM_PERF_LEVEL', 'high')
from tinygrad.device import Buffer, Device
from tinygrad.dtype import DType, dtypes
from tinygrad.engine.realize import lower_and_compile
@@ -8,7 +8,6 @@ from enum import IntEnum
from openpilot.selfdrive.ui.sunnypilot.layouts.settings.cruise_sub_layouts.speed_limit_settings import SpeedLimitSettingsLayout
from openpilot.selfdrive.ui.ui_state import ui_state
from openpilot.sunnypilot.mapd import MAPD_AVAILABLE
from openpilot.system.ui.lib.multilang import tr, tr_noop
from openpilot.system.ui.sunnypilot.widgets.list_view import toggle_item_sp, option_item_sp, simple_button_item_sp
from openpilot.system.ui.widgets import Widget
@@ -30,7 +29,6 @@ ACC_ENABLED_DESCRIPTION = tr_noop("Enable custom Short & Long press increments f
ACC_NOLONG_DESCRIPTION = tr_noop("This feature can only be used with sunnypilot longitudinal control enabled.")
ACC_PCMCRUISE_DISABLED_DESCRIPTION = tr_noop("This feature is not supported on this platform due to vehicle limitations.")
ONROAD_ONLY_DESCRIPTION = tr_noop("Start the vehicle to check vehicle compatibility.")
MAP_UNAVAILABLE_DESCRIPTION = tr_noop("Map data is temporarily unavailable.")
class CruiseLayout(Widget):
@@ -56,8 +54,7 @@ class CruiseLayout(Widget):
self.scc_m_toggle = toggle_item_sp(
title=tr("Smart Cruise Control - Map"),
description=(f"<b>{tr(MAP_UNAVAILABLE_DESCRIPTION)}</b>\n\n" if not MAPD_AVAILABLE else "") +
tr("Use map data to estimate the appropriate speed to drive through turns ahead."),
description=tr("Use map data to estimate the appropriate speed to drive through turns ahead."),
param="SmartCruiseControlMap")
self.custom_acc_toggle = toggle_item_sp(
@@ -142,7 +139,7 @@ class CruiseLayout(Widget):
if has_long or has_icbm:
self.custom_acc_toggle.action_item.set_enabled(((has_long and not ui_state.CP.pcmCruise) or has_icbm) and ui_state.is_offroad())
self.scc_v_toggle.action_item.set_enabled(True)
self.scc_m_toggle.action_item.set_enabled(MAPD_AVAILABLE)
self.scc_m_toggle.action_item.set_enabled(True)
else:
ui_state.params.remove("CustomAccIncrementsEnabled")
ui_state.params.remove("SmartCruiseControlVision")
@@ -8,8 +8,6 @@ from collections.abc import Callable
import pyray as rl
from openpilot.selfdrive.ui.ui_state import ui_state
from openpilot.sunnypilot.mapd import MAPD_AVAILABLE
from openpilot.sunnypilot.selfdrive.controls.lib.speed_limit.common import Policy
from openpilot.system.ui.lib.multilang import tr
from openpilot.system.ui.sunnypilot.widgets.list_view import multiple_button_item_sp
from openpilot.system.ui.widgets.network import NavButton
@@ -45,8 +43,6 @@ class SpeedLimitPolicyLayout(Widget):
param="SpeedLimitPolicy",
button_width=250,
)
if not MAPD_AVAILABLE:
self._speed_limit_policy.action_item.set_enabled_buttons({Policy.car_state_only})
items = [
self._speed_limit_policy
@@ -55,8 +51,6 @@ class SpeedLimitPolicyLayout(Widget):
@staticmethod
def _get_policy_description():
if not MAPD_AVAILABLE:
return f"<b>{tr('Map data is temporarily unavailable. Using Speed Limit data only from Car.')}</b>"
return get_highlighted_description(ui_state.params, "SpeedLimitPolicy", SPEED_LIMIT_POLICY_DESCRIPTIONS)
def _render(self, rect):
-4
View File
@@ -3,7 +3,3 @@ from openpilot.common.basedir import BASEDIR
MAPD_BIN_DIR = os.path.join(BASEDIR, 'openpilot', 'third_party/mapd_pfeiferj')
MAPD_PATH = os.path.join(MAPD_BIN_DIR, 'mapd')
# mapd still runs (OSM downloads) but has no position source since ubloxd owns LastGPSPosition;
# map-based features stay off until mapd is rebuilt
MAPD_AVAILABLE = False
@@ -4,6 +4,7 @@ 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 json
import math
import platform
@@ -26,6 +27,21 @@ class OsmMapData(BaseMapData):
self.last_bearing = math.degrees(location.calibratedOrientationNED.value[2])
self.last_position = Coordinate(location.positionGeodetic.value[0], location.positionGeodetic.value[1])
if self.last_position is None:
return
params = {
"latitude": self.last_position.latitude,
"longitude": self.last_position.longitude,
}
if self.last_bearing is not None:
params['bearing'] = self.last_bearing
# mapd reads its position from the memory params as JSON, so write it for the mapd binary.
# LastGPSPosition is registered as BYTES (ubloxd owns the persistent copy for pigeond),
# so the JSON payload has to be encoded here.
self.mem_params.put("LastGPSPosition", json.dumps(params).encode(), block=True)
def get_current_speed_limit(self) -> float:
return float(self.mem_params.get("MapSpeedLimit") or 0.0)
@@ -121,6 +121,10 @@ def update_osm_db() -> None:
if not mem_params.get("OSMDownloadBounds"):
mem_params.put("OSMDownloadBounds", "", block=True)
# mapd reads LastGPSPosition from the memory params as JSON, and it is registered as BYTES upstream
if not mem_params.get("LastGPSPosition"):
mem_params.put("LastGPSPosition", b"{}", block=True)
def main_thread():
update_installed_version(VERSION, params)
@@ -0,0 +1,70 @@
"""
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 json
import math
import platform
import openpilot.cereal.messaging as messaging
from openpilot.cereal import log
from openpilot.common.params import Params
from openpilot.common.test import OpenpilotTestCase
from openpilot.sunnypilot.mapd.live_map_data.osm_map_data import OsmMapData
class TestOsmMapData(OpenpilotTestCase):
"""The mapd binary reads its position from the memory params as JSON, so mapd_manager has to feed it."""
LATITUDE = 32.875134
LONGITUDE = -117.209777
ALTITUDE = 42.0
BEARING = 90.0
def setup_method(self):
self.mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else Params()
self.mem_params.remove("LastGPSPosition")
self.map_data = OsmMapData()
self.pm = messaging.PubMaster(['liveLocationKalman'])
def location_message(self, status: log.LiveLocationKalman.Status, position_valid: bool):
msg = messaging.new_message('liveLocationKalman', valid=True)
location = msg.liveLocationKalman
location.status = status
location.positionGeodetic = {'value': [self.LATITUDE, self.LONGITUDE, self.ALTITUDE], 'valid': position_valid}
location.calibratedOrientationNED = {'value': [0.0, 0.0, math.radians(self.BEARING)], 'valid': True}
return msg
def send_location(self, status: log.LiveLocationKalman.Status, position_valid: bool) -> None:
# the first exchange synchronizes the PUB/SUB connection, the second one is actually received
self.pm.send('liveLocationKalman', self.location_message(status, position_valid))
self.map_data.sm.update(1000)
self.pm.send('liveLocationKalman', self.location_message(status, position_valid))
self.map_data.sm.update(1000)
def read_position(self) -> dict:
value = self.mem_params.get("LastGPSPosition")
self.assertIsNotNone(value, "LastGPSPosition was not written for mapd")
return json.loads(value)
def test_writes_position_for_mapd(self):
self.send_location(log.LiveLocationKalman.Status.valid, True)
self.map_data.tick()
position = self.read_position()
self.assertAlmostEqual(position['latitude'], self.LATITUDE, delta=1e-6)
self.assertAlmostEqual(position['longitude'], self.LONGITUDE, delta=1e-6)
self.assertAlmostEqual(position['bearing'], self.BEARING, delta=1e-6)
def test_invalid_localizer_keeps_last_known_position(self):
self.send_location(log.LiveLocationKalman.Status.valid, True)
self.map_data.tick()
self.send_location(log.LiveLocationKalman.Status.uninitialized, False)
self.map_data.tick()
position = self.read_position()
self.assertAlmostEqual(position['latitude'], self.LATITUDE, delta=1e-6)
self.assertAlmostEqual(position['longitude'], self.LONGITUDE, delta=1e-6)
+8 -3
View File
@@ -10,6 +10,7 @@ import builtins
import contextlib
import dataclasses
import functools
import gc
import hashlib
import io
import itertools
@@ -111,17 +112,21 @@ def read_parts(path: str) -> tuple[dict, dict]:
return parts, _MetadataUnpickler(io.BytesIO(bytes(blob[slice(*header["extras"])]))).load()
def _extended(path: str, extend) -> tuple[dict, dict, str]:
def _extended(path: str, extend) -> tuple[dict, dict, str, dict]:
parts, extras = read_parts(path)
added = extend(parts, extras) if extend else {}
return parts | added, extras, _parts_digest(added) if added else ""
return parts | added, extras, _parts_digest(added) if added else "", {key: parts[key] for key in added if key in parts}
def load_model(path: str, device_map: dict | None = None, verify: bool = True, cache: bool = True, extend=None) -> dict:
parts, extras, extra = _extended(path, extend)
parts, extras, extra, replaced = _extended(path, extend)
if cache and (cached := _read_cache(path, parts, device_map, extra)) is not None:
return extras | cached
shared: dict = {}
if verify and replaced:
for header, blob in replaced.values():
PlainJit(header, blob, device_map, verify, shared)
gc.collect()
jits = {key: PlainJit(header, blob, device_map, verify, shared) for key, (header, blob) in parts.items()}
if cache:
_write_cache(path, jits, device_map, extra)
@@ -1,25 +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.
"""
import numpy as np
STOPPING_DISTANCE = 1.5
STOPPED_SPEED = 0.02
STOPPING_TIME = 2.5
MIN_STOPPING_HOLD_ACCEL = -0.2
STOPPING_DECEL_RATE = 0.3
STOPPED_DECEL_RATE = 0.05
class LongControlSP:
def should_hold_stopping(self, CS, a_target: float) -> bool:
return (self.last_output_accel <= MIN_STOPPING_HOLD_ACCEL and a_target >= self.last_output_accel and CS.vEgo > STOPPED_SPEED and CS.aEgo < 0.0
and CS.vEgo <= -CS.aEgo * STOPPING_TIME and CS.vEgo ** 2 <= -2.0 * CS.aEgo * STOPPING_DISTANCE)
@staticmethod
def stopping_decel_rate(v_ego: float) -> float:
return float(np.interp(v_ego, [0.0, 0.5, 1.5], [STOPPED_DECEL_RATE, 0.15, STOPPING_DECEL_RATE]))
@@ -9,7 +9,6 @@ from openpilot.common.params import Params
from openpilot.common.realtime import DT_MDL
from openpilot.selfdrive.car.cruise import V_CRUISE_UNSET
from openpilot.sunnypilot import PARAMS_UPDATE_PERIOD
from openpilot.sunnypilot.mapd import MAPD_AVAILABLE
from openpilot.sunnypilot.navd.helpers import Coordinate
from openpilot.sunnypilot.selfdrive.controls.lib.smart_cruise_control import MIN_V
@@ -76,7 +75,7 @@ class SmartCruiseControlMap:
def __init__(self):
self.params = Params()
self.mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else self.params
self.enabled = MAPD_AVAILABLE and self.params.get_bool("SmartCruiseControlMap")
self.enabled = self.params.get_bool("SmartCruiseControlMap")
self.long_enabled = False
self.long_override = False
self.is_enabled = False
@@ -102,7 +101,7 @@ class SmartCruiseControlMap:
def update_params(self):
if self.frame % int(PARAMS_UPDATE_PERIOD / DT_MDL) == 0:
self.enabled = MAPD_AVAILABLE and self.params.get_bool("SmartCruiseControlMap")
self.enabled = self.params.get_bool("SmartCruiseControlMap")
def update_calculations(self, sm: messaging.SubMaster) -> None:
gps = sm[self.gps_location_service]
@@ -8,7 +8,7 @@ import json
import math
import platform
from types import SimpleNamespace
from unittest.mock import MagicMock, patch
from unittest.mock import MagicMock
from openpilot.cereal import custom
from openpilot.common.params import Params
@@ -23,8 +23,6 @@ MapState = VisionState = custom.LongitudinalPlanSP.SmartCruiseControl.MapState
class TestSmartCruiseControlMap(OpenpilotTestCase):
def setup_method(self):
self.mapd_patch = patch("openpilot.sunnypilot.selfdrive.controls.lib.smart_cruise_control.map_controller.MAPD_AVAILABLE", True)
self.mapd_patch.start()
self.params = Params()
self.mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else self.params
self.reset_params()
@@ -32,9 +30,6 @@ class TestSmartCruiseControlMap(OpenpilotTestCase):
self.sm = MagicMock()
self.sm.__getitem__.return_value = SimpleNamespace(latitude=0.0, longitude=0.0)
def teardown_method(self):
self.mapd_patch.stop()
def reset_params(self):
self.params.put_bool("SmartCruiseControlMap", True, block=True)
@@ -55,14 +50,6 @@ class TestSmartCruiseControlMap(OpenpilotTestCase):
assert self.scc_m.state == VisionState.disabled
assert not self.scc_m.is_active
def test_mapd_unavailable(self):
self.mapd_patch.stop()
self.scc_m = SmartCruiseControlMap()
for _ in range(int(10. / DT_MDL)):
self.scc_m.update(self.sm, True, False, 0., 0., 0.)
assert self.scc_m.state == VisionState.disabled
self.mapd_patch.start()
def test_disabled(self):
for _ in range(int(10. / DT_MDL)):
self.scc_m.update(self.sm, False, False, 0., 0., 0.)
@@ -13,7 +13,6 @@ from openpilot.common.gps import get_gps_location_service
from openpilot.common.params import Params
from openpilot.common.realtime import DT_MDL
from openpilot.sunnypilot import PARAMS_UPDATE_PERIOD, get_sanitize_int_param
from openpilot.sunnypilot.mapd import MAPD_AVAILABLE
from openpilot.sunnypilot.selfdrive.controls.lib.speed_limit import LIMIT_MAX_MAP_DATA_AGE, LIMIT_ADAPT_ACC
from openpilot.sunnypilot.selfdrive.controls.lib.speed_limit.common import Policy, OffsetType
@@ -49,8 +48,6 @@ class SpeedLimitResolver:
Policy.max().value,
self.params
)
if not MAPD_AVAILABLE:
self.policy = Policy.car_state_only
self._policy_to_sources_map = {
Policy.car_state_only: [SpeedLimitSource.car],
Policy.map_data_only: [SpeedLimitSource.map],
@@ -94,7 +91,7 @@ class SpeedLimitResolver:
def update_params(self):
if self.frame % int(PARAMS_UPDATE_PERIOD / DT_MDL) == 0:
self.policy = self.params.get("SpeedLimitPolicy", return_default=True) if MAPD_AVAILABLE else Policy.car_state_only
self.policy = self.params.get("SpeedLimitPolicy", return_default=True)
self.is_metric = self.params.get_bool("IsMetric")
self.offset_type = self.params.get("SpeedLimitOffsetType", return_default=True)
self.offset_value = self.params.get("SpeedLimitValueOffset", return_default=True)
@@ -15,7 +15,6 @@ from opendbc.sunnypilot.car.tesla.values import TeslaFlagsSP
from openpilot.common.params import Params
from openpilot.common.swaglog import cloudlog
from openpilot.common.hardware import HARDWARE
from openpilot.sunnypilot.mapd import MAPD_AVAILABLE
# Wire-protocol version for the capabilities payload. Bump on breaking changes
@@ -44,7 +43,6 @@ CAPABILITY_FIELDS = (
"device_type",
"subaru_has_sng",
"hyundai_alpha_long_available",
"mapd_available",
)
CAPABILITY_LABELS: dict[str, str] = {
@@ -67,7 +65,6 @@ CAPABILITY_LABELS: dict[str, str] = {
"device_type": "Device type",
"subaru_has_sng": "Subaru Stop-and-Go available",
"hyundai_alpha_long_available": "Hyundai Alpha Longitudinal available",
"mapd_available": "Map data available",
}
# Explicit defaults for non-boolean capability fields
@@ -135,7 +132,6 @@ def generate_capabilities(params: Params | None = None) -> dict:
caps["is_sp_release"] = params.get_bool("IsReleaseSpBranch")
caps["is_development"] = params.get_bool("IsDevelopmentBranch")
caps["stock_longitudinal"] = params.get_bool("ToyotaEnforceStockLongitudinal")
caps["mapd_available"] = MAPD_AVAILABLE
bundle = params.get("CarPlatformBundle")
bundle_brand = _bundle_field(bundle, "brand")
@@ -156,7 +156,7 @@ The tables below describe the **compiled** `settings_ui.json` schema — what th
**Enablement rules**: Grayed out (disabled) when rules fail. Frontend shows a contextual badge explaining why.
**Capability fields** (referenced in rules): `has_longitudinal_control`, `has_icbm`, `icbm_available`, `torque_allowed`, `brand`, `pcm_cruise`, `alpha_long_available`, `steer_control_type`, `has_bsm`, `is_release`, `is_sp_release`, `is_development`, `tesla_has_vehicle_bus`, `has_stop_and_go`, `stock_longitudinal`, `mapd_available`
**Capability fields** (referenced in rules): `has_longitudinal_control`, `has_icbm`, `icbm_available`, `torque_allowed`, `brand`, `pcm_cruise`, `alpha_long_available`, `steer_control_type`, `has_bsm`, `is_release`, `is_sp_release`, `is_development`, `tesla_has_vehicle_bus`, `has_stop_and_go`, `stock_longitudinal`
---
@@ -857,47 +857,19 @@
},
{
"value": 1,
"label": "Map Data Only",
"enablement": [
{
"type": "capability",
"field": "mapd_available",
"equals": true
}
]
"label": "Map Data Only"
},
{
"value": 2,
"label": "Car State Priority",
"enablement": [
{
"type": "capability",
"field": "mapd_available",
"equals": true
}
]
"label": "Car State Priority"
},
{
"value": 3,
"label": "Map Data Priority",
"enablement": [
{
"type": "capability",
"field": "mapd_available",
"equals": true
}
]
"label": "Map Data Priority"
},
{
"value": 4,
"label": "Combined",
"enablement": [
{
"type": "capability",
"field": "mapd_available",
"equals": true
}
]
"label": "Combined"
}
]
},
@@ -1029,11 +1001,6 @@
}
],
"enablement": [
{
"type": "capability",
"field": "mapd_available",
"equals": true
},
{
"type": "any",
"conditions": [
@@ -167,28 +167,12 @@ sections:
label: Car State Only
- value: 1
label: Map Data Only
enablement:
- type: capability
field: mapd_available
equals: true
- value: 2
label: Car State Priority
enablement:
- type: capability
field: mapd_available
equals: true
- value: 3
label: Map Data Priority
enablement:
- type: capability
field: mapd_available
equals: true
- value: 4
label: Combined
enablement:
- type: capability
field: mapd_available
equals: true
- key: SpeedLimitOffsetType
widget: multiple_button
title: Speed Limit Offset Type
@@ -262,9 +246,6 @@ sections:
field: has_icbm
equals: true
enablement:
- type: capability
field: mapd_available
equals: true
- type: any
conditions:
- type: capability