diff --git a/cereal/messaging/bridge.cc b/cereal/messaging/bridge.cc index 93af988358..69ecd188e1 100644 --- a/cereal/messaging/bridge.cc +++ b/cereal/messaging/bridge.cc @@ -6,12 +6,12 @@ ExitHandler do_exit; -static std::vector get_services(std::string whitelist_str, bool zmq_to_msgq) { +static std::vector get_services(const std::string &whitelist_str, bool zmq_to_msgq) { std::vector service_list; for (const auto& it : services) { std::string name = it.second.name; bool in_whitelist = whitelist_str.find(name) != std::string::npos; - if (name == "plusFrame" || name == "uiLayoutState" || (zmq_to_msgq && !in_whitelist)) { + if (zmq_to_msgq && !in_whitelist) { continue; } service_list.push_back(name); diff --git a/common/logging_extra.py b/common/logging_extra.py index f53d503108..e921b140c2 100644 --- a/common/logging_extra.py +++ b/common/logging_extra.py @@ -8,6 +8,7 @@ import uuid import socket import logging import traceback +import numpy as np from threading import local from collections import OrderedDict from contextlib import contextmanager @@ -15,6 +16,8 @@ from contextlib import contextmanager LOG_TIMESTAMPS = "LOG_TIMESTAMPS" in os.environ def json_handler(obj): + if isinstance(obj, np.bool_): + return bool(obj) # if isinstance(obj, (datetime.date, datetime.time)): # return obj.isoformat() return repr(obj) diff --git a/common/params.cc b/common/params.cc index 989c8e1a90..e7b6b104d4 100644 --- a/common/params.cc +++ b/common/params.cc @@ -89,6 +89,7 @@ private: std::unordered_map keys = { {"AccessToken", CLEAR_ON_MANAGER_START | DONT_LOG}, + {"AdbEnabled", PERSISTENT}, {"AlwaysOnDM", PERSISTENT}, {"ApiCache_Device", PERSISTENT}, {"AssistNowToken", PERSISTENT}, diff --git a/docs/CARS.md b/docs/CARS.md index 331fae54f1..0cc23e138f 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -10,7 +10,7 @@ A supported vehicle is one that just works when you install a comma device. All |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| |Acura|ILX 2016-19|AcuraWatch Plus|openpilot|26 mph|25 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Acura|RDX 2016-18|AcuraWatch Plus|openpilot|26 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Acura|RDX 2019-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Acura|RDX 2019-21|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|A3 2014-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 USB-C coupler
- 1 VW J533 connector
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|A3 Sportback e-tron 2017-18|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 USB-C coupler
- 1 VW J533 connector
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|Q2 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 USB-C coupler
- 1 VW J533 connector
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -128,7 +128,7 @@ A supported vehicle is one that just works when you install a comma device. All |Jeep|Grand Cherokee 2019-21|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Carnival 2022-24[5](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Carnival (China only) 2023[5](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Ceed 2019|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Ceed 2019-21|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|EV6 (Southeast Asia only) 2022-24[5](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai P connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|EV6 (with HDA II) 2022-24[5](#footnotes)|Highway Driving Assist II|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai P connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|EV6 (without HDA II) 2022-24[5](#footnotes)|Highway Driving Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -260,7 +260,7 @@ A supported vehicle is one that just works when you install a comma device. All |Toyota|RAV4 Hybrid 2017-18|All|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|RAV4 Hybrid 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|RAV4 Hybrid 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 Hybrid 2023-24|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 Hybrid 2023-25|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|Sienna 2018-20|All|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Volkswagen|Arteon 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 USB-C coupler
- 1 VW J533 connector
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Volkswagen|Arteon eHybrid 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 USB-C coupler
- 1 VW J533 connector
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index d455fa6fd3..d4a9561f2c 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -63,3 +63,12 @@ A good pull request has all of the following: * Connect your device to Wi-Fi regularly, so that we can pull data for training better driving models. * Run the `nightly` branch and report issues. This branch is like `master` but it's built just like a release. * Annotate images in the [comma10k dataset](https://github.com/commaai/comma10k). + +## Contributing Training Data + +### A guide for forks + +In order for your fork's data to be eligible for the training set: +* **Your cereal messaging structs must be [compatible](../cereal#custom-forks)** +* **The definitions of all the stock messaging structs must not change**: Do not change how any of the fields are set, including everything from `selfdriveState.enabled` to `carState.steeringAngleDeg`. Instead, create your own structs and set them however you'd like. +* **Do not include cars that are not supported in upstream platforms**: Instead, create new opendbc platforms for cars that you'd like to support outside of upstream, even if it's just a trim-level difference. diff --git a/docs/how-to/connect-to-comma.md b/docs/how-to/connect-to-comma.md index 5797f8618f..469ef81672 100644 --- a/docs/how-to/connect-to-comma.md +++ b/docs/how-to/connect-to-comma.md @@ -29,6 +29,22 @@ Here's an example command for connecting to your device using its tethered conne For doing development work on device, it's recommended to use [SSH agent forwarding](https://docs.github.com/en/developers/overview/using-ssh-agent-forwarding). + +## ADB + +In order to use ADB on your device, you'll need to enable it in the device's settings. + +* Enable ADB in your device's settings +* Connect to your device + * `adb shell` over USB + * `adb connect` over WiFi + * Here's an example command for connecting to your device using its tethered connection: `adb connect 192.168.43.1:5555` + +> [!NOTE] +> The default port for ADB is 5555 on the comma 3/3X. + +For more info on ADB, see the [Android Debug Bridge (ADB) documentation](https://developer.android.com/tools/adb). + ### Notes The public keys are only fetched from your GitHub account once. In order to update your device's authorized keys, you'll need to re-enter your GitHub username. diff --git a/launch_env.sh b/launch_env.sh index 5f67052e67..c1cdb6708f 100755 --- a/launch_env.sh +++ b/launch_env.sh @@ -7,7 +7,7 @@ export OPENBLAS_NUM_THREADS=1 export VECLIB_MAXIMUM_THREADS=1 if [ -z "$AGNOS_VERSION" ]; then - export AGNOS_VERSION="11.4" + export AGNOS_VERSION="11.6" fi export STAGING_ROOT="/data/safe_staging" diff --git a/msgq_repo b/msgq_repo index 5bb86f8bc7..102befe731 160000 --- a/msgq_repo +++ b/msgq_repo @@ -1 +1 @@ -Subproject commit 5bb86f8bc7434048ab2d5ce0243a97d9848b34de +Subproject commit 102befe7316522c8a1aca539018188fd97858732 diff --git a/opendbc_repo b/opendbc_repo index 5e5885c75b..4fa4acd981 160000 --- a/opendbc_repo +++ b/opendbc_repo @@ -1 +1 @@ -Subproject commit 5e5885c75b0486c2ac4b75924a81412f65b09f57 +Subproject commit 4fa4acd981b681d01a0677319d5c8a7b5b1cb141 diff --git a/panda b/panda index 84836fd802..4ca963345a 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 84836fd802fa679ac637973be0c0118f7338a649 +Subproject commit 4ca963345a00eb7b11b1c7a3c23dd682578d44ef diff --git a/pyproject.toml b/pyproject.toml index 47a6a37cfe..0522d53e65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -165,7 +165,7 @@ testpaths = [ [tool.codespell] quiet-level = 3 # if you've got a short variable name that's getting flagged, add it here -ignore-words-list = "bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints,whit,indexIn,ws,uint,grey,deque,stdio,amin,BA,LITE,atEnd,UIs,errorString,arange,FocusIn,od,tim,relA,hist,copyable,jupyter,thead" +ignore-words-list = "bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints,whit,indexIn,ws,uint,grey,deque,stdio,amin,BA,LITE,atEnd,UIs,errorString,arange,FocusIn,od,tim,relA,hist,copyable,jupyter,thead,TGE,abl" builtin = "clear,rare,informal,code,names,en-GB_to_en-US" skip = "./third_party/*, ./tinygrad/*, ./tinygrad_repo/*, ./msgq/*, ./panda/*, ./opendbc/*, ./opendbc_repo/*, ./rednose/*, ./rednose_repo/*, ./teleoprtc/*, ./teleoprtc_repo/*, *.ts, uv.lock, *.onnx, ./cereal/gen/*, */c_generated_code/*" diff --git a/selfdrive/car/car_specific.py b/selfdrive/car/car_specific.py index 144f9f073b..eaa287b2f3 100644 --- a/selfdrive/car/car_specific.py +++ b/selfdrive/car/car_specific.py @@ -42,19 +42,19 @@ class CarSpecificEvents: self.cruise_buttons: deque = deque([], maxlen=HYUNDAI_PREV_BUTTON_SAMPLES) def update(self, CS: car.CarState, CS_prev: car.CarState, CC: car.CarControl): - if self.CP.carName in ('body', 'mock'): + if self.CP.brand in ('body', 'mock'): events = Events() - elif self.CP.carName in ('subaru', 'mazda'): + elif self.CP.brand in ('subaru', 'mazda'): events = self.create_common_events(CS, CS_prev) - elif self.CP.carName == 'ford': + elif self.CP.brand == 'ford': events = self.create_common_events(CS, CS_prev, extra_gears=[GearShifter.manumatic]) - elif self.CP.carName == 'nissan': + elif self.CP.brand == 'nissan': events = self.create_common_events(CS, CS_prev, extra_gears=[GearShifter.brake]) - elif self.CP.carName == 'chrysler': + elif self.CP.brand == 'chrysler': events = self.create_common_events(CS, CS_prev, extra_gears=[GearShifter.low]) # Low speed steer alert hysteresis logic @@ -65,7 +65,7 @@ class CarSpecificEvents: if self.low_speed_alert: events.add(EventName.belowSteerSpeed) - elif self.CP.carName == 'honda': + elif self.CP.brand == 'honda': events = self.create_common_events(CS, CS_prev, pcm_enable=False) if self.CP.pcmCruise and CS.vEgo < self.CP.minEnableSpeed: @@ -86,7 +86,7 @@ class CarSpecificEvents: if self.CP.minEnableSpeed > 0 and CS.vEgo < 0.001: events.add(EventName.manualRestart) - elif self.CP.carName == 'toyota': + elif self.CP.brand == 'toyota': events = self.create_common_events(CS, CS_prev) if self.CP.openpilotLongitudinalControl: @@ -101,7 +101,7 @@ class CarSpecificEvents: # while in standstill, send a user alert events.add(EventName.manualRestart) - elif self.CP.carName == 'gm': + elif self.CP.brand == 'gm': # The ECM allows enabling on falling edge of set, but only rising edge of resume events = self.create_common_events(CS, CS_prev, extra_gears=[GearShifter.sport, GearShifter.low, GearShifter.eco, GearShifter.manumatic], @@ -120,7 +120,7 @@ class CarSpecificEvents: if CS.vEgo < self.CP.minSteerSpeed: events.add(EventName.belowSteerSpeed) - elif self.CP.carName == 'volkswagen': + elif self.CP.brand == 'volkswagen': events = self.create_common_events(CS, CS_prev, extra_gears=[GearShifter.eco, GearShifter.sport, GearShifter.manumatic], pcm_enable=self.CP.pcmCruise, enable_buttons=(ButtonType.setCruise, ButtonType.resumeCruise)) @@ -143,7 +143,7 @@ class CarSpecificEvents: # if CC.eps_timer_soft_disable_alert: # type: ignore[attr-defined] # events.add(EventName.steerTimeLimit) - elif self.CP.carName == 'hyundai': + elif self.CP.brand == 'hyundai': # On some newer model years, the CANCEL button acts as a pause/resume button based on the PCM state # To avoid re-engaging when openpilot cancels, check user engagement intention via buttons # Main button also can trigger an engagement on these cars @@ -160,7 +160,7 @@ class CarSpecificEvents: events.add(EventName.belowSteerSpeed) else: - raise ValueError(f"Unsupported car: {self.CP.carName}") + raise ValueError(f"Unsupported car: {self.CP.brand}") return events diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index 62ecb1cbae..90195e09cb 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -199,7 +199,7 @@ class Car: # Update carState from CAN CS = self.CI.update(can_list) - if self.CP.carName == 'mock': + if self.CP.brand == 'mock': CS = self.mock_carstate.update(CS) # Update radar tracks from CAN diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 9214066ecb..7c2f748116 100644 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -367,11 +367,11 @@ class TestCarModelBase(unittest.TestCase): if self.safety.get_vehicle_moving() != prev_panda_vehicle_moving: self.assertEqual(not CS.standstill, self.safety.get_vehicle_moving()) - if not (self.CP.carName == "honda" and not (self.CP.flags & HondaFlags.BOSCH)): + if not (self.CP.brand == "honda" and not (self.CP.flags & HondaFlags.BOSCH)): if self.safety.get_cruise_engaged_prev() != prev_panda_cruise_engaged: self.assertEqual(CS.cruiseState.enabled, self.safety.get_cruise_engaged_prev()) - if self.CP.carName == "honda": + if self.CP.brand == "honda": if self.safety.get_acc_main_on() != prev_panda_acc_main_on: self.assertEqual(CS.cruiseState.available, self.safety.get_acc_main_on()) @@ -426,7 +426,7 @@ class TestCarModelBase(unittest.TestCase): # On most pcmCruise cars, openpilot's state is always tied to the PCM's cruise state. # On Honda Nidec, we always engage on the rising edge of the PCM cruise state, but # openpilot brakes to zero even if the min ACC speed is non-zero (i.e. the PCM disengages). - if self.CP.carName == "honda" and not (self.CP.flags & HondaFlags.BOSCH): + if self.CP.brand == "honda" and not (self.CP.flags & HondaFlags.BOSCH): # only the rising edges are expected to match if CS.cruiseState.enabled and not CS_prev.cruiseState.enabled: checks['controlsAllowed'] += not self.safety.get_controls_allowed() @@ -448,7 +448,7 @@ class TestCarModelBase(unittest.TestCase): if button_enable and not mismatch: self.safety.set_controls_allowed(False) - if self.CP.carName == "honda": + if self.CP.brand == "honda": checks['mainOn'] += CS.cruiseState.available != self.safety.get_acc_main_on() CS_prev = CS diff --git a/selfdrive/controls/plannerd.py b/selfdrive/controls/plannerd.py index 16ac80db60..99942f20d9 100755 --- a/selfdrive/controls/plannerd.py +++ b/selfdrive/controls/plannerd.py @@ -14,7 +14,7 @@ def main(): cloudlog.info("plannerd is waiting for CarParams") params = Params() CP = messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams) - cloudlog.info("plannerd got CarParams: %s", CP.carName) + cloudlog.info("plannerd got CarParams: %s", CP.brand) ldw = LaneDepartureWarning() longitudinal_planner = LongitudinalPlanner(CP) diff --git a/selfdrive/debug/adb.sh b/selfdrive/debug/adb.sh deleted file mode 100755 index 8fa267fd4d..0000000000 --- a/selfdrive/debug/adb.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash -set -e - -PORT=5555 - -setprop service.adb.tcp.port $PORT -sudo systemctl start adbd - -IP=$(echo $SSH_CONNECTION | awk '{ print $3}') -echo "then, connect on your computer:" -echo "adb connect $IP:$PORT" diff --git a/selfdrive/locationd/locationd.py b/selfdrive/locationd/locationd.py index f7780834b0..21f4b87529 100755 --- a/selfdrive/locationd/locationd.py +++ b/selfdrive/locationd/locationd.py @@ -24,14 +24,16 @@ MIN_STD_SANITY_CHECK = 1e-5 # m or rad MAX_FILTER_REWIND_TIME = 0.8 # s MAX_SENSOR_TIME_DIFF = 0.1 # s YAWRATE_CROSS_ERR_CHECK_FACTOR = 30 -INPUT_INVALID_THRESHOLD = 0.5 # 0 bad inputs ignored -TIMING_INVALID_THRESHOLD = 2.5 # 2 bad timings ignored -INPUT_INVALID_DECAY = 0.9993 # ~10 secs to resume after exceeding allowed bad inputs by one (at 100hz) -TIMING_INVALID_DECAY = 0.9990 # ~2 secs to resume after exceeding allowed bad timings by one (at 100hz) +INPUT_INVALID_LIMIT = 2.0 # 1 (camodo) / 9 (sensor) bad input[s] ignored +INPUT_INVALID_RECOVERY = 10.0 # ~10 secs to resume after exceeding allowed bad inputs by one POSENET_STD_INITIAL_VALUE = 10.0 POSENET_STD_HIST_HALF = 20 +def calculate_invalid_input_decay(invalid_limit, recovery_time, frequency): + return (1 - 1 / (2 * invalid_limit)) ** (1 / (recovery_time * frequency)) + + def init_xyz_measurement(measurement: capnp._DynamicStructBuilder, values: np.ndarray, stds: np.ndarray, valid: bool): assert len(values) == len(stds) == 3 measurement.x, measurement.y, measurement.z = map(float, values) @@ -269,11 +271,11 @@ def main(): filter_initialized = False critcal_services = ["accelerometer", "gyroscope", "cameraOdometry"] - observation_timing_invalid = defaultdict(int) observation_input_invalid = defaultdict(int) - input_invalid_decay = {s: INPUT_INVALID_DECAY ** (100. / SERVICE_LIST[s].frequency) for s in critcal_services} - timing_invalid_decay = {s: TIMING_INVALID_DECAY ** (100. / SERVICE_LIST[s].frequency) for s in critcal_services} + input_invalid_limit = {s: round(INPUT_INVALID_LIMIT * (SERVICE_LIST[s].frequency / 20.)) for s in critcal_services} + input_invalid_threshold = {s: input_invalid_limit[s] - 0.5 for s in critcal_services} + input_invalid_decay = {s: calculate_invalid_input_decay(input_invalid_limit[s], INPUT_INVALID_RECOVERY, SERVICE_LIST[s].frequency) for s in critcal_services} initial_pose = params.get("LocationFilterInitialState") if initial_pose is not None: @@ -306,19 +308,20 @@ def main(): continue if res == HandleLogResult.TIMING_INVALID: - observation_timing_invalid[which] += 1 + print(f"Observation {which} ignored due to failed timing check") + observation_input_invalid[which] += 1 + print(observation_input_invalid[which]) elif res == HandleLogResult.INPUT_INVALID: + print(f"Observation {which} ignored due to failed sanity check") observation_input_invalid[which] += 1 else: observation_input_invalid[which] *= input_invalid_decay[which] - observation_timing_invalid[which] *= timing_invalid_decay[which] else: filter_initialized = sm.all_checks() and sensor_all_checks(acc_msgs, gyro_msgs, sensor_valid, sensor_recv_time, sensor_alive, SIMULATION) if sm.updated["cameraOdometry"]: - critical_service_inputs_valid = all(observation_input_invalid[s] < INPUT_INVALID_THRESHOLD for s in critcal_services) - critical_service_timing_valid = all(observation_timing_invalid[s] < TIMING_INVALID_THRESHOLD for s in critcal_services) - inputs_valid = sm.all_valid() and critical_service_inputs_valid and critical_service_timing_valid + critical_service_inputs_valid = all(observation_input_invalid[s] < input_invalid_threshold[s] for s in critcal_services) + inputs_valid = sm.all_valid() and critical_service_inputs_valid sensors_valid = sensor_all_checks(acc_msgs, gyro_msgs, sensor_valid, sensor_recv_time, sensor_alive, SIMULATION) msg = estimator.get_msg(sensors_valid, inputs_valid, filter_initialized) diff --git a/selfdrive/locationd/test/test_locationd.py b/selfdrive/locationd/test/test_locationd.py deleted file mode 100644 index d0b1a82988..0000000000 --- a/selfdrive/locationd/test/test_locationd.py +++ /dev/null @@ -1,56 +0,0 @@ -import capnp - -import cereal.messaging as messaging -from openpilot.common.params import Params - -from openpilot.system.manager.process_config import managed_processes - - -class TestLocationdProc: - LLD_MSGS = ['gpsLocationExternal', 'cameraOdometry', 'carState', 'liveCalibration', - 'accelerometer', 'gyroscope', 'magnetometer'] - - def setup_method(self): - self.pm = messaging.PubMaster(self.LLD_MSGS) - - self.params = Params() - self.params.put_bool("UbloxAvailable", True) - managed_processes['locationd'].prepare() - managed_processes['locationd'].start() - - def teardown_method(self): - managed_processes['locationd'].stop() - - def get_msg(self, name, t): - try: - msg = messaging.new_message(name) - except capnp.lib.capnp.KjException: - msg = messaging.new_message(name, 0) - - if name == "gpsLocationExternal": - msg.gpsLocationExternal.flags = 1 - msg.gpsLocationExternal.hasFix = True - msg.gpsLocationExternal.verticalAccuracy = 1.0 - msg.gpsLocationExternal.speedAccuracy = 1.0 - msg.gpsLocationExternal.bearingAccuracyDeg = 1.0 - msg.gpsLocationExternal.vNED = [0.0, 0.0, 0.0] - msg.gpsLocationExternal.latitude = float(self.lat) - msg.gpsLocationExternal.longitude = float(self.lon) - msg.gpsLocationExternal.unixTimestampMillis = t * 1e6 - msg.gpsLocationExternal.altitude = float(self.alt) - #if name == "gnssMeasurements": - # msg.gnssMeasurements.measTime = t - # msg.gnssMeasurements.positionECEF.value = [self.x , self.y, self.z] - # msg.gnssMeasurements.positionECEF.std = [0,0,0] - # msg.gnssMeasurements.positionECEF.valid = True - # msg.gnssMeasurements.velocityECEF.value = [] - # msg.gnssMeasurements.velocityECEF.std = [0,0,0] - # msg.gnssMeasurements.velocityECEF.valid = True - elif name == 'cameraOdometry': - msg.cameraOdometry.rot = [0.0, 0.0, 0.0] - msg.cameraOdometry.rotStd = [0.0, 0.0, 0.0] - msg.cameraOdometry.trans = [0.0, 0.0, 0.0] - msg.cameraOdometry.transStd = [0.0, 0.0, 0.0] - msg.logMonoTime = t - msg.valid = True - return msg diff --git a/selfdrive/locationd/test/test_locationd_scenarios.py b/selfdrive/locationd/test/test_locationd_scenarios.py index bf5e571f27..0ea7ac183f 100644 --- a/selfdrive/locationd/test/test_locationd_scenarios.py +++ b/selfdrive/locationd/test/test_locationd_scenarios.py @@ -23,8 +23,10 @@ class Scenario(Enum): BASE = 'base' GYRO_OFF = 'gyro_off' GYRO_SPIKE_MIDWAY = 'gyro_spike_midway' + GYRO_CONSISTENT_SPIKES = 'gyro_consistent_spikes' ACCEL_OFF = 'accel_off' ACCEL_SPIKE_MIDWAY = 'accel_spike_midway' + ACCEL_CONSISTENT_SPIKES = 'accel_consistent_spikes' SENSOR_TIMING_SPIKE_MIDWAY = 'timing_spikes' SENSOR_TIMING_CONSISTENT_SPIKES = 'timing_consistent_spikes' @@ -63,18 +65,20 @@ def run_scenarios(scenario, logs): elif scenario == Scenario.GYRO_OFF: logs = sorted([x for x in logs if x.which() != 'gyroscope'], key=lambda x: x.logMonoTime) - elif scenario == Scenario.GYRO_SPIKE_MIDWAY: + elif scenario == Scenario.GYRO_SPIKE_MIDWAY or scenario == Scenario.GYRO_CONSISTENT_SPIKES: def gyro_spike(msg): msg.gyroscope.gyroUncalibrated.v[0] += 3.0 - logs = modify_logs_midway(logs, 'gyroscope', 1, gyro_spike) + count = 1 if scenario == Scenario.GYRO_SPIKE_MIDWAY else CONSISTENT_SPIKES_COUNT + logs = modify_logs_midway(logs, 'gyroscope', count, gyro_spike) elif scenario == Scenario.ACCEL_OFF: logs = sorted([x for x in logs if x.which() != 'accelerometer'], key=lambda x: x.logMonoTime) - elif scenario == Scenario.ACCEL_SPIKE_MIDWAY: + elif scenario == Scenario.ACCEL_SPIKE_MIDWAY or scenario == Scenario.ACCEL_CONSISTENT_SPIKES: def acc_spike(msg): - msg.accelerometer.acceleration.v[0] += 10.0 - logs = modify_logs_midway(logs, 'accelerometer', 1, acc_spike) + msg.accelerometer.acceleration.v[0] += 100.0 + count = 1 if scenario == Scenario.ACCEL_SPIKE_MIDWAY else CONSISTENT_SPIKES_COUNT + logs = modify_logs_midway(logs, 'accelerometer', count, acc_spike) elif scenario == Scenario.SENSOR_TIMING_SPIKE_MIDWAY or scenario == Scenario.SENSOR_TIMING_CONSISTENT_SPIKES: def timing_spike(msg): @@ -121,7 +125,7 @@ class TestLocationdScenarios: assert np.allclose(replayed_data['roll'], 0.0) assert np.all(replayed_data['sensors_flag'] == 0.0) - def test_gyro_spikes(self): + def test_gyro_spike(self): """ Test: a gyroscope spike in the middle of the segment Expected Result: @@ -132,8 +136,17 @@ class TestLocationdScenarios: orig_data, replayed_data = run_scenarios(Scenario.GYRO_SPIKE_MIDWAY, self.logs) assert np.allclose(orig_data['yaw_rate'], replayed_data['yaw_rate'], atol=np.radians(0.35)) assert np.allclose(orig_data['roll'], replayed_data['roll'], atol=np.radians(0.55)) - assert np.diff(replayed_data['inputs_flag'])[499] == -1.0 - assert np.diff(replayed_data['inputs_flag'])[704] == 1.0 + assert np.all(replayed_data['inputs_flag'] == orig_data['inputs_flag']) + assert np.all(replayed_data['sensors_flag'] == orig_data['sensors_flag']) + + def test_consistent_gyro_spikes(self): + """ + Test: consistent timing spikes for N gyroscope messages in the middle of the segment + Expected Result: inputsOK becomes False after N of bad measurements + """ + orig_data, replayed_data = run_scenarios(Scenario.GYRO_CONSISTENT_SPIKES, self.logs) + assert np.diff(replayed_data['inputs_flag'])[501] == -1.0 + assert np.diff(replayed_data['inputs_flag'])[708] == 1.0 def test_accel_off(self): """ @@ -148,7 +161,7 @@ class TestLocationdScenarios: assert np.allclose(replayed_data['roll'], 0.0) assert np.all(replayed_data['sensors_flag'] == 0.0) - def test_accel_spikes(self): + def test_accel_spike(self): """ ToDo: Test: an accelerometer spike in the middle of the segment @@ -173,5 +186,5 @@ class TestLocationdScenarios: Expected Result: inputsOK becomes False after N of bad measurements """ orig_data, replayed_data = run_scenarios(Scenario.SENSOR_TIMING_CONSISTENT_SPIKES, self.logs) - assert np.diff(replayed_data['inputs_flag'])[500] == -1.0 - assert np.diff(replayed_data['inputs_flag'])[787] == 1.0 + assert np.diff(replayed_data['inputs_flag'])[501] == -1.0 + assert np.diff(replayed_data['inputs_flag'])[707] == 1.0 diff --git a/selfdrive/locationd/torqued.py b/selfdrive/locationd/torqued.py index 2b7cc62527..986c5349f5 100755 --- a/selfdrive/locationd/torqued.py +++ b/selfdrive/locationd/torqued.py @@ -71,7 +71,7 @@ class TorqueEstimator(ParameterEstimator): self.offline_friction = 0.0 self.offline_latAccelFactor = 0.0 self.resets = 0.0 - self.use_params = CP.carName in ALLOWED_CARS and CP.lateralTuning.which() == 'torque' + self.use_params = CP.brand in ALLOWED_CARS and CP.lateralTuning.which() == 'torque' if CP.lateralTuning.which() == 'torque': self.offline_friction = CP.lateralTuning.torque.friction diff --git a/selfdrive/modeld/dmonitoringmodeld.py b/selfdrive/modeld/dmonitoringmodeld.py index ebc24ad024..e2dd6f71ca 100755 --- a/selfdrive/modeld/dmonitoringmodeld.py +++ b/selfdrive/modeld/dmonitoringmodeld.py @@ -26,6 +26,7 @@ from openpilot.common.transformations.model import dmonitoringmodel_intrinsics, from openpilot.common.transformations.camera import _ar_ox_fisheye, _os_fisheye from openpilot.selfdrive.modeld.models.commonmodel_pyx import CLContext, MonitoringModelFrame from openpilot.selfdrive.modeld.parse_model_outputs import sigmoid +from openpilot.system import sentry MODEL_WIDTH, MODEL_HEIGHT = DM_INPUT_SIZE CALIB_LEN = 3 @@ -37,6 +38,7 @@ SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') MODEL_PATH = Path(__file__).parent / 'models/dmonitoring_model.onnx' MODEL_PKL_PATH = Path(__file__).parent / 'models/dmonitoring_model_tinygrad.pkl' + class DriverStateResult(ctypes.Structure): _fields_ = [ ("face_orientation", ctypes.c_float*3), @@ -55,6 +57,7 @@ class DriverStateResult(ctypes.Structure): ("ready_prob", ctypes.c_float*4), ("not_ready_prob", ctypes.c_float*2)] + class DMonitoringModelResult(ctypes.Structure): _fields_ = [ ("driver_state_lhd", DriverStateResult), @@ -63,6 +66,7 @@ class DMonitoringModelResult(ctypes.Structure): ("wheel_on_right_prob", ctypes.c_float), ("features", ctypes.c_float*FEATURE_LEN)] + class ModelState: inputs: dict[str, np.ndarray] output: np.ndarray @@ -82,7 +86,7 @@ class ModelState: else: self.onnx_cpu_runner = make_onnx_cpu_runner(MODEL_PATH) - def run(self, buf:VisionBuf, calib:np.ndarray, transform:np.ndarray) -> tuple[np.ndarray, float]: + def run(self, buf: VisionBuf, calib: np.ndarray, transform: np.ndarray) -> tuple[np.ndarray, float]: self.numpy_inputs['calib'][0,:] = calib t1 = time.perf_counter() @@ -119,6 +123,7 @@ def fill_driver_state(msg, ds_result: DriverStateResult): msg.readyProb = [float(sigmoid(x)) for x in ds_result.ready_prob] msg.notReadyProb = [float(sigmoid(x)) for x in ds_result.not_ready_prob] + def get_driverstate_packet(model_output: np.ndarray, frame_id: int, location_ts: int, execution_time: float, gpu_execution_time: float): model_result = ctypes.cast(model_output.ctypes.data, ctypes.POINTER(DMonitoringModelResult)).contents msg = messaging.new_message('driverStateV2', valid=True) @@ -139,6 +144,9 @@ def main(): setproctitle(PROCESS_NAME) set_realtime_priority(1) + sentry.set_tag("daemon", PROCESS_NAME) + cloudlog.bind(daemon=PROCESS_NAME) + cl_context = CLContext() model = ModelState(cl_context) cloudlog.warning("models loaded, dmonitoringmodeld starting") @@ -177,4 +185,10 @@ def main(): if __name__ == "__main__": - main() + try: + main() + except KeyboardInterrupt: + cloudlog.warning(f"child {PROCESS_NAME} got SIGINT") + except Exception: + sentry.capture_exception() + raise diff --git a/selfdrive/modeld/fill_model_msg.py b/selfdrive/modeld/fill_model_msg.py index 3f5bf2f271..c17eddcfd9 100644 --- a/selfdrive/modeld/fill_model_msg.py +++ b/selfdrive/modeld/fill_model_msg.py @@ -93,9 +93,7 @@ def fill_model_msg(base_msg: capnp._DynamicStructBuilder, extended_msg: capnp._D driving_model_data.frameIdExtra = vipc_frame_id_extra driving_model_data.frameDropPerc = frame_drop_perc driving_model_data.modelExecutionTime = model_execution_time - - action = driving_model_data.action - action.desiredCurvature = desired_curvature + driving_model_data.action.desiredCurvature = desired_curvature modelV2 = extended_msg.modelV2 modelV2.frameId = vipc_frame_id @@ -106,16 +104,11 @@ def fill_model_msg(base_msg: capnp._DynamicStructBuilder, extended_msg: capnp._D modelV2.modelExecutionTime = model_execution_time # plan - position = modelV2.position - fill_xyzt(position, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.POSITION].T, *net_output_data['plan_stds'][0,:,Plan.POSITION].T) - velocity = modelV2.velocity - fill_xyzt(velocity, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.VELOCITY].T) - acceleration = modelV2.acceleration - fill_xyzt(acceleration, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.ACCELERATION].T) - orientation = modelV2.orientation - fill_xyzt(orientation, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.T_FROM_CURRENT_EULER].T) - orientation_rate = modelV2.orientationRate - fill_xyzt(orientation_rate, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.ORIENTATION_RATE].T) + fill_xyzt(modelV2.position, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.POSITION].T, *net_output_data['plan_stds'][0,:,Plan.POSITION].T) + fill_xyzt(modelV2.velocity, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.VELOCITY].T) + fill_xyzt(modelV2.acceleration, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.ACCELERATION].T) + fill_xyzt(modelV2.orientation, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.T_FROM_CURRENT_EULER].T) + fill_xyzt(modelV2.orientationRate, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.ORIENTATION_RATE].T) # temporal pose temporal_pose = modelV2.temporalPose @@ -125,12 +118,10 @@ def fill_model_msg(base_msg: capnp._DynamicStructBuilder, extended_msg: capnp._D temporal_pose.rotStd = net_output_data['plan_stds'][0,0,Plan.ORIENTATION_RATE].tolist() # poly path - poly_path = driving_model_data.path - fill_xyz_poly(poly_path, ModelConstants.POLY_PATH_DEGREE, *net_output_data['plan'][0,:,Plan.POSITION].T) + fill_xyz_poly(driving_model_data.path, ModelConstants.POLY_PATH_DEGREE, *net_output_data['plan'][0,:,Plan.POSITION].T) # lateral planning - action = modelV2.action - action.desiredCurvature = desired_curvature + modelV2.action.desiredCurvature = desired_curvature # times at X_IDXS according to model plan PLAN_T_IDXS = [np.nan] * ModelConstants.IDX_N @@ -159,8 +150,7 @@ def fill_model_msg(base_msg: capnp._DynamicStructBuilder, extended_msg: capnp._D modelV2.laneLineStds = net_output_data['lane_lines_stds'][0,:,0,0].tolist() modelV2.laneLineProbs = net_output_data['lane_lines_prob'][0,1::2].tolist() - lane_line_meta = driving_model_data.laneLineMeta - fill_lane_line_meta(lane_line_meta, modelV2.laneLines, modelV2.laneLineProbs) + fill_lane_line_meta(driving_model_data.laneLineMeta, modelV2.laneLines, modelV2.laneLineProbs) # road edges modelV2.init('roadEdges', 2) diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index 3d7e385d6f..9cbe847ab9 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -194,7 +194,7 @@ def main(demo=False): CP = get_demo_car_params() else: CP = messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams) - cloudlog.info("modeld got CarParams: %s", CP.carName) + cloudlog.info("modeld got CarParams: %s", CP.brand) # TODO this needs more thought, use .2s extra for now to estimate other delays steer_delay = CP.steerActuatorDelay + .2 diff --git a/selfdrive/pandad/pandad.cc b/selfdrive/pandad/pandad.cc index 7d3af5fe56..61da49470a 100644 --- a/selfdrive/pandad/pandad.cc +++ b/selfdrive/pandad/pandad.cc @@ -105,9 +105,6 @@ void can_send_thread(std::vector pandas, bool fake_send) { while (!do_exit && check_all_connected(pandas)) { std::unique_ptr msg(subscriber->receive()); if (!msg) { - if (errno == EINTR) { - do_exit = true; - } continue; } @@ -205,7 +202,7 @@ void fill_panda_can_state(cereal::PandaState::PandaCanState::Builder &cs, const cs.setCanCoreResetCnt(can_health.can_core_reset_cnt); } -std::optional send_panda_states(PubMaster *pm, const std::vector &pandas, bool spoofing_started, PandaSafety *panda_safety) { +std::optional send_panda_states(PubMaster *pm, const std::vector &pandas, bool spoofing_started, bool always_offroad) { bool ignition_local = false; const uint32_t pandas_cnt = pandas.size(); @@ -253,7 +250,7 @@ std::optional send_panda_states(PubMaster *pm, const std::vector health.ignition_line_pkt = 0; } - ignition_local |= ((health.ignition_line_pkt != 0) || (health.ignition_can_pkt != 0)) && !panda_safety->getOffroadMode(); + ignition_local |= ((health.ignition_line_pkt != 0) || (health.ignition_can_pkt != 0)) && !always_offroad; pandaStates.push_back(health); } @@ -340,16 +337,14 @@ void send_peripheral_state(Panda *panda, PubMaster *pm) { pm->send("peripheralState", msg); } -void process_panda_state(std::vector &pandas, PubMaster *pm, bool spoofing_started, PandaSafety *panda_safety) { - static SubMaster sm({"selfdriveState", "selfdriveStateSP", "carParams"}); - +void process_panda_state(std::vector &pandas, PubMaster *pm, bool engaged, bool engaged_mads, bool spoofing_started, bool always_offroad) { std::vector connected_serials; for (Panda *p : pandas) { connected_serials.push_back(p->hw_serial()); } { - auto ignition_opt = send_panda_states(pm, pandas, spoofing_started, panda_safety); + auto ignition_opt = send_panda_states(pm, pandas, spoofing_started, always_offroad); if (!ignition_opt) { LOGE("Failed to get ignition_opt"); return; @@ -378,9 +373,6 @@ void process_panda_state(std::vector &pandas, PubMaster *pm, bool spoof } } - sm.update(0); - const bool engaged = sm.allAliveAndValid({"selfdriveState"}) && sm["selfdriveState"].getSelfdriveState().getEnabled(); - const bool engaged_mads = process_mads_heartbeat(&sm); for (const auto &panda : pandas) { panda->send_heartbeat(engaged, engaged_mads); } @@ -446,9 +438,13 @@ void pandad_run(std::vector &pandas) { std::thread send_thread(can_send_thread, pandas, fake_send); RateKeeper rk("pandad", 100); + SubMaster sm({"selfdriveState", "selfdriveStateSP", "carParams"}); PubMaster pm({"can", "pandaStates", "peripheralState"}); PandaSafety panda_safety(pandas); Panda *peripheral_panda = pandas[0]; + bool engaged = false; + bool engaged_mads = false; + bool always_offroad = false; // Main loop: receive CAN data and process states while (!do_exit && check_all_connected(pandas)) { @@ -461,7 +457,11 @@ void pandad_run(std::vector &pandas) { // Process panda state at 10 Hz if (rk.frame() % 10 == 0) { - process_panda_state(pandas, &pm, spoofing_started, &panda_safety); + sm.update(0); + engaged = sm.allAliveAndValid({"selfdriveState"}) && sm["selfdriveState"].getSelfdriveState().getEnabled(); + engaged_mads = process_mads_heartbeat(&sm); + always_offroad = panda_safety.getOffroadMode(); + process_panda_state(pandas, &pm, engaged, engaged_mads, spoofing_started, always_offroad); panda_safety.configureSafetyMode(); } @@ -473,6 +473,16 @@ void pandad_run(std::vector &pandas) { rk.keepTime(); } + // Close relay on exit to prevent a fault + const bool is_onroad = Params().getBool("IsOnroad"); + if (is_onroad && !engaged) { + for (auto &p : pandas) { + if (p->connected()) { + p->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT); + } + } + } + send_thread.join(); } diff --git a/selfdrive/pandad/pandad.py b/selfdrive/pandad/pandad.py index 12accdbf5e..fd6668feba 100755 --- a/selfdrive/pandad/pandad.py +++ b/selfdrive/pandad/pandad.py @@ -3,8 +3,8 @@ import os import usb1 import time +import signal import subprocess -from typing import NoReturn from panda import Panda, PandaDFU, PandaProtocolMismatch, FW_PATH from openpilot.common.basedir import BASEDIR @@ -61,13 +61,25 @@ def flash_panda(panda_serial: str) -> Panda: return panda -def main() -> NoReturn: +def main() -> None: + # signal pandad to close the relay and exit + def signal_handler(signum, frame): + cloudlog.info(f"Caught signal {signum}, exiting") + nonlocal do_exit + do_exit = True + if process is not None: + process.send_signal(signal.SIGINT) + + process = None + do_exit = False + signal.signal(signal.SIGINT, signal_handler) + count = 0 first_run = True params = Params() no_internal_panda_count = 0 - while True: + while not do_exit: try: count += 1 cloudlog.event("pandad.flash_and_connect", count=count) @@ -159,8 +171,9 @@ def main() -> NoReturn: # run pandad with all connected serials as arguments os.environ['MANAGER_DAEMON'] = 'pandad' - os.chdir(os.path.join(BASEDIR, "selfdrive/pandad")) - subprocess.run(["./pandad", *panda_serials], check=True) + process = subprocess.Popen(["./pandad", *panda_serials], cwd=os.path.join(BASEDIR, "selfdrive/pandad")) + process.wait() + if __name__ == "__main__": main() diff --git a/selfdrive/selfdrived/events.py b/selfdrive/selfdrived/events.py index 3bc50cde18..f0194ef9f2 100755 --- a/selfdrive/selfdrived/events.py +++ b/selfdrive/selfdrived/events.py @@ -154,7 +154,7 @@ def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM def wrong_car_mode_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: text = "Enable Adaptive Cruise to Engage" - if CP.carName == "honda": + if CP.brand == "honda": text = "Enable Main Switch to Engage" return NoEntryAlert(text) diff --git a/selfdrive/selfdrived/selfdrived.py b/selfdrive/selfdrived/selfdrived.py index d352ca7c1b..d216290f98 100755 --- a/selfdrive/selfdrived/selfdrived.py +++ b/selfdrive/selfdrived/selfdrived.py @@ -99,7 +99,7 @@ class SelfdriveD(CruiseHelper): self.is_metric = self.params.get_bool("IsMetric") self.is_ldw_enabled = self.params.get_bool("IsLdwEnabled") - car_recognized = self.CP.carName != 'mock' + car_recognized = self.CP.brand != 'mock' # cleanup old params if not self.CP.experimentalLongitudinalAvailable: diff --git a/selfdrive/test/process_replay/migration.py b/selfdrive/test/process_replay/migration.py index 10a5cdf6ec..14934f8521 100644 --- a/selfdrive/test/process_replay/migration.py +++ b/selfdrive/test/process_replay/migration.py @@ -381,7 +381,7 @@ def migrate_carParams(msgs): CP = msg.as_builder() CP.carParams.carFingerprint = MIGRATION.get(CP.carParams.carFingerprint, CP.carParams.carFingerprint) for car_fw in CP.carParams.carFw: - car_fw.brand = CP.carParams.carName + car_fw.brand = CP.carParams.brand ops.append((index, CP.as_reader())) return ops, [], [] diff --git a/selfdrive/test/process_replay/model_replay.py b/selfdrive/test/process_replay/model_replay.py index f406b79e10..f594fcf682 100755 --- a/selfdrive/test/process_replay/model_replay.py +++ b/selfdrive/test/process_replay/model_replay.py @@ -8,6 +8,7 @@ from itertools import zip_longest import matplotlib.pyplot as plt import numpy as np +from tabulate import tabulate from openpilot.common.git import get_commit from openpilot.system.hardware import PC @@ -30,6 +31,11 @@ API_TOKEN = os.getenv("GITHUB_COMMENTS_TOKEN","") MODEL_REPLAY_BUCKET="model_replay_master" GITHUB = GithubUtils(API_TOKEN, DATA_TOKEN) +EXEC_TIMINGS = [ + # model, instant max, average max + ("modelV2", 0.03, 0.025), + ("driverStateV2", 0.02, 0.015), +] def get_log_fn(test_route, ref="master"): return f"{test_route}_model_tici_{ref}.zst" @@ -156,7 +162,33 @@ def model_replay(lr, frs): del frs['roadCameraState'].frames del frs['wideRoadCameraState'].frames dmonitoringmodeld_msgs = replay_process(dmonitoringmodeld, dmodeld_logs, frs) - return modeld_msgs + dmonitoringmodeld_msgs + + msgs = modeld_msgs + dmonitoringmodeld_msgs + + header = ['model', 'max instant', 'max instant allowed', 'average', 'max average allowed', 'test result'] + rows = [] + timings_ok = True + for (s, instant_max, avg_max) in EXEC_TIMINGS: + ts = [getattr(m, s).modelExecutionTime for m in msgs if m.which() == s] + # TODO some init can happen in first iteration + ts = ts[1:] + + errors = [] + if np.max(ts) > instant_max: + errors.append("❌ FAILED MAX TIMING CHECK ❌") + if np.mean(ts) > avg_max: + errors.append("❌ FAILED AVG TIMING CHECK ❌") + + timings_ok = not errors and timings_ok + rows.append([s, np.max(ts), instant_max, np.mean(ts), avg_max, "\n".join(errors) or "✅"]) + + print("------------------------------------------------") + print("----------------- Model Timing -----------------") + print("------------------------------------------------") + print(tabulate(rows, header, tablefmt="simple_grid", stralign="center", numalign="center", floatfmt=".4f")) + assert timings_ok + + return msgs def get_frames(): diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index 0d2ee4aa19..5acd2f9f3a 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -74,7 +74,6 @@ if GetOption('extras'): qt_src.remove("main.cc") # replaced by test_runner qt_env.Program('tests/test_translations', [asset_obj, 'tests/test_runner.cc', 'tests/test_translations.cc'] + qt_src, LIBS=qt_libs) -if GetOption('extras'): qt_env.SharedLibrary("qt/python_helpers", ["qt/qt_window.cc"], LIBS=qt_libs) # spinner and text window diff --git a/selfdrive/ui/installer/installer.cc b/selfdrive/ui/installer/installer.cc index 17f6ba19ab..84486e61be 100644 --- a/selfdrive/ui/installer/installer.cc +++ b/selfdrive/ui/installer/installer.cc @@ -1,4 +1,3 @@ -#include #include #include @@ -11,6 +10,7 @@ #include #include +#include "common/util.h" #include "selfdrive/ui/installer/installer.h" #include "selfdrive/ui/qt/util.h" #include "selfdrive/ui/qt/qt_window.h" @@ -36,14 +36,6 @@ const QString CACHE_PATH = "/data/openpilot.cache"; extern const uint8_t str_continue[] asm("_binary_selfdrive_ui_installer_continue_openpilot_sh_start"); extern const uint8_t str_continue_end[] asm("_binary_selfdrive_ui_installer_continue_openpilot_sh_end"); -bool time_valid() { - time_t rawtime; - time(&rawtime); - - struct tm * sys_time = gmtime(&rawtime); - return (1900 + sys_time->tm_year) >= 2020; -} - void run(const char* cmd) { int err = std::system(cmd); assert(err == 0); @@ -103,7 +95,7 @@ void Installer::updateProgress(int percent) { void Installer::doInstall() { // wait for valid time - while (!time_valid()) { + while (!util::system_time_valid()) { usleep(500 * 1000); qDebug() << "Waiting for valid time"; } diff --git a/selfdrive/ui/qt/home.cc b/selfdrive/ui/qt/home.cc index d2b0fa44d8..3f7457192e 100644 --- a/selfdrive/ui/qt/home.cc +++ b/selfdrive/ui/qt/home.cc @@ -29,6 +29,11 @@ HomeWindow::HomeWindow(QWidget* parent) : QWidget(parent) { body = new BodyWindow(this); slayout->addWidget(body); + driver_view = new DriverViewWindow(this); + connect(driver_view, &DriverViewWindow::done, [=] { + showDriverView(false); + }); + slayout->addWidget(driver_view); setAttribute(Qt::WA_NoSystemBackground); QObject::connect(uiState(), &UIState::uiUpdate, this, &HomeWindow::updateState); QObject::connect(uiState(), &UIState::offroadTransition, this, &HomeWindow::offroadTransition); @@ -59,6 +64,16 @@ void HomeWindow::offroadTransition(bool offroad) { } } +void HomeWindow::showDriverView(bool show) { + if (show) { + emit closeSettings(); + slayout->setCurrentWidget(driver_view); + } else { + slayout->setCurrentWidget(home); + } + sidebar->setVisible(show == false); +} + void HomeWindow::mousePressEvent(QMouseEvent* e) { // Handle sidebar collapsing if ((onroad->isVisible() || body->isVisible()) && (!sidebar->isVisible() || e->x() > sidebar->width())) { diff --git a/selfdrive/ui/qt/home.h b/selfdrive/ui/qt/home.h index c29ef4f2fe..b333624163 100644 --- a/selfdrive/ui/qt/home.h +++ b/selfdrive/ui/qt/home.h @@ -8,6 +8,7 @@ #include #include "selfdrive/ui/ui.h" +#include "selfdrive/ui/qt/offroad/driverview.h" #ifdef SUNNYPILOT #include "selfdrive/ui/sunnypilot/qt/widgets/controls.h" @@ -40,6 +41,7 @@ signals: public slots: void offroadTransition(bool offroad); + void showDriverView(bool show); void showSidebar(bool show); protected: @@ -50,6 +52,7 @@ protected: OffroadHome *home; OnroadWindow *onroad; BodyWindow *body; + DriverViewWindow *driver_view; QStackedLayout *slayout; protected slots: diff --git a/selfdrive/ui/qt/offroad/developer_panel.cc b/selfdrive/ui/qt/offroad/developer_panel.cc index 1a362f62c6..da45e1d7a3 100644 --- a/selfdrive/ui/qt/offroad/developer_panel.cc +++ b/selfdrive/ui/qt/offroad/developer_panel.cc @@ -1,4 +1,5 @@ #include +#include #include "selfdrive/ui/qt/offroad/developer_panel.h" #include "selfdrive/ui/qt/widgets/ssh_keys.h" @@ -11,6 +12,10 @@ #endif DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : ListWidget(parent) { + adbToggle = new ParamControl("AdbEnabled", tr("Enable ADB"), + tr("ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info."), ""); + addItem(adbToggle); + // SSH keys addItem(new SshToggle()); addItem(new SshControl()); @@ -29,6 +34,21 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : ListWidget(parent) { }); addItem(longManeuverToggle); + experimentalLongitudinalToggle = new ParamControl( + "ExperimentalLongitudinalEnabled", + tr("openpilot Longitudinal Control (Alpha)"), + QString("%1

%2") + .arg(tr("WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).")) + .arg(tr("On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. " + "Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.")), + "" + ); + experimentalLongitudinalToggle->setConfirmation(true, false); + QObject::connect(experimentalLongitudinalToggle, &ParamControl::toggleFlipped, [=]() { + updateToggles(offroad); + }); + addItem(experimentalLongitudinalToggle); + // TODO-SP: Move to Vehicles panel when ported back hyundaiRadarTracksToggle = new ParamControl( "HyundaiRadarTracksToggle", @@ -54,23 +74,44 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : ListWidget(parent) { void DeveloperPanel::updateToggles(bool _offroad) { for (auto btn : findChildren()) { btn->setVisible(!is_release); - btn->setEnabled(_offroad); + + /* + * experimentalLongitudinalToggle should be toggelable when: + * - visible, and + * - during onroad & offroad states + */ + if (btn != experimentalLongitudinalToggle) { + btn->setEnabled(_offroad); + } } - // longManeuverToggle should not be toggleable if the car don't have longitudinal control + // longManeuverToggle and experimentalLongitudinalToggle should not be toggleable if the car does not have longitudinal control auto cp_bytes = params.get("CarParamsPersistent"); if (!cp_bytes.empty()) { AlignedBuffer aligned_buf; capnp::FlatArrayMessageReader cmsg(aligned_buf.align(cp_bytes.data(), cp_bytes.size())); cereal::CarParams::Reader CP = cmsg.getRoot(); - auto hyundai = CP.getCarName() == "hyundai"; + auto hyundai = CP.getBrand() == "hyundai"; auto hyundai_mando_radar = hyundai && (CP.getFlags() & 4096); + if (!CP.getExperimentalLongitudinalAvailable() || is_release) { + params.remove("ExperimentalLongitudinalEnabled"); + experimentalLongitudinalToggle->setEnabled(false); + } + + /* + * experimentalLongitudinalToggle should be visible when: + * - is not a release branch, and + * - the car supports experimental longitudinal control (alpha) + */ + experimentalLongitudinalToggle->setVisible(CP.getExperimentalLongitudinalAvailable() && !is_release); + longManeuverToggle->setEnabled(hasLongitudinalControl(CP) && _offroad); hyundaiRadarTracksToggle->setVisible(hyundai_mando_radar && hasLongitudinalControl(CP)); } else { longManeuverToggle->setEnabled(false); + experimentalLongitudinalToggle->setVisible(false); hyundaiRadarTracksToggle->setVisible(false); } diff --git a/selfdrive/ui/qt/offroad/developer_panel.h b/selfdrive/ui/qt/offroad/developer_panel.h index 5dc5a5c494..cc80e4377d 100644 --- a/selfdrive/ui/qt/offroad/developer_panel.h +++ b/selfdrive/ui/qt/offroad/developer_panel.h @@ -14,8 +14,10 @@ public: private: Params params; + ParamControl* adbToggle; ParamControl* joystickToggle; ParamControl* longManeuverToggle; + ParamControl* experimentalLongitudinalToggle; ParamControl* hyundaiRadarTracksToggle; bool is_release; bool offroad; diff --git a/selfdrive/ui/qt/offroad/driverview.cc b/selfdrive/ui/qt/offroad/driverview.cc index a8d3151627..9010227f18 100644 --- a/selfdrive/ui/qt/offroad/driverview.cc +++ b/selfdrive/ui/qt/offroad/driverview.cc @@ -6,6 +6,24 @@ #include "selfdrive/ui/qt/util.h" DriverViewWindow::DriverViewWindow(QWidget* parent) : CameraWidget("camerad", VISION_STREAM_DRIVER, parent) { + QObject::connect(this, &CameraWidget::clicked, this, &DriverViewWindow::done); + QObject::connect(device(), &Device::interactiveTimeout, this, [this]() { + if (isVisible()) { + emit done(); + } + }); +} + +void DriverViewWindow::showEvent(QShowEvent* event) { + params.putBool("IsDriverViewEnabled", true); + device()->resetInteractiveTimeout(60); + CameraWidget::showEvent(event); +} + +void DriverViewWindow::hideEvent(QHideEvent* event) { + params.putBool("IsDriverViewEnabled", false); + stopVipcThread(); + CameraWidget::hideEvent(event); } void DriverViewWindow::paintGL() { @@ -62,20 +80,3 @@ mat4 DriverViewWindow::calcFrameMatrix() { 0.0, 0.0, 0.0, 1.0, }}; } - -DriverViewDialog::DriverViewDialog(QWidget *parent) : DialogBase(parent) { - Params().putBool("IsDriverViewEnabled", true); - device()->resetInteractiveTimeout(60); - - QVBoxLayout *main_layout = new QVBoxLayout(this); - main_layout->setContentsMargins(0, 0, 0, 0); - auto camera = new DriverViewWindow(this); - main_layout->addWidget(camera); - QObject::connect(camera, &DriverViewWindow::clicked, this, &DialogBase::accept); - QObject::connect(device(), &Device::interactiveTimeout, this, &DialogBase::accept); -} - -void DriverViewDialog::done(int r) { - Params().putBool("IsDriverViewEnabled", false); - QDialog::done(r); -} diff --git a/selfdrive/ui/qt/offroad/driverview.h b/selfdrive/ui/qt/offroad/driverview.h index 10a97c1da8..f6eb752fe6 100644 --- a/selfdrive/ui/qt/offroad/driverview.h +++ b/selfdrive/ui/qt/offroad/driverview.h @@ -2,20 +2,22 @@ #include "selfdrive/ui/qt/widgets/cameraview.h" #include "selfdrive/ui/qt/onroad/driver_monitoring.h" -#include "selfdrive/ui/qt/widgets/input.h" class DriverViewWindow : public CameraWidget { Q_OBJECT + public: explicit DriverViewWindow(QWidget *parent); - void paintGL() override; + +signals: + void done(); + +protected: mat4 calcFrameMatrix() override; + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; + void paintGL() override; + + Params params; DriverMonitorRenderer driver_monitor; }; - -class DriverViewDialog : public DialogBase { - Q_OBJECT -public: - DriverViewDialog(QWidget *parent); - void done(int r) override; -}; diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 0d7ecf671e..e94bdcbf23 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -8,7 +8,6 @@ #include "common/watchdog.h" #include "common/util.h" -#include "selfdrive/ui/qt/offroad/driverview.h" #include "selfdrive/ui/qt/network/networking.h" #include "selfdrive/ui/qt/offroad/settings.h" #include "selfdrive/ui/qt/qt_window.h" @@ -25,15 +24,6 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { tr("Use the openpilot system for adaptive cruise control and lane keep driver assistance. Your attention is required at all times to use this feature. Changing this setting takes effect when the car is powered off."), "../assets/img_chffr_wheel.png", }, - { - "ExperimentalLongitudinalEnabled", - tr("openpilot Longitudinal Control (Alpha)"), - QString("%1

%2") - .arg(tr("WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).")) - .arg(tr("On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. " - "Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha.")), - "../assets/offroad/icon_speed_limit.png", - }, { "ExperimentalMode", tr("Experimental Mode"), @@ -110,11 +100,6 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { toggles["ExperimentalMode"]->setActiveIcon("../assets/img_experimental.svg"); #endif toggles["ExperimentalMode"]->setConfirmation(true, true); - toggles["ExperimentalLongitudinalEnabled"]->setConfirmation(true, false); - - connect(toggles["ExperimentalLongitudinalEnabled"], &ToggleControl::toggleFlipped, [=]() { - updateToggles(); - }); } void TogglesPanel::updateState(const UIState &s) { @@ -139,7 +124,6 @@ void TogglesPanel::showEvent(QShowEvent *event) { void TogglesPanel::updateToggles() { auto experimental_mode_toggle = toggles["ExperimentalMode"]; - auto op_long_toggle = toggles["ExperimentalLongitudinalEnabled"]; const QString e2e_description = QString("%1
" "

%2


" "%3
" @@ -160,10 +144,6 @@ void TogglesPanel::updateToggles() { capnp::FlatArrayMessageReader cmsg(aligned_buf.align(cp_bytes.data(), cp_bytes.size())); cereal::CarParams::Reader CP = cmsg.getRoot(); - if (!CP.getExperimentalLongitudinalAvailable() || is_release) { - params.remove("ExperimentalLongitudinalEnabled"); - } - op_long_toggle->setVisible(CP.getExperimentalLongitudinalAvailable() && !is_release); if (hasLongitudinalControl(CP)) { // normal description and toggle experimental_mode_toggle->setEnabled(true); @@ -192,7 +172,6 @@ void TogglesPanel::updateToggles() { experimental_mode_toggle->refresh(); } else { experimental_mode_toggle->setDescription(e2e_description); - op_long_toggle->setVisible(false); } } @@ -218,12 +197,7 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { auto dcamBtn = new ButtonControl(tr("Driver Camera"), tr("PREVIEW"), tr("Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)")); - connect(dcamBtn, &ButtonControl::clicked, [this, dcamBtn]() { - dcamBtn->setEnabled(false); - DriverViewDialog driver_view(this); - driver_view.exec(); - dcamBtn->setEnabled(true); - }); + connect(dcamBtn, &ButtonControl::clicked, [=]() { emit showDriverView(); }); addItem(dcamBtn); #endif @@ -397,6 +371,7 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { // setup panels DevicePanel *device = new DevicePanel(this); QObject::connect(device, &DevicePanel::reviewTrainingGuide, this, &SettingsWindow::reviewTrainingGuide); + QObject::connect(device, &DevicePanel::showDriverView, this, &SettingsWindow::showDriverView); TogglesPanel *toggles = new TogglesPanel(this); QObject::connect(this, &SettingsWindow::expandToggleDescription, toggles, &TogglesPanel::expandToggleDescription); diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index b5b148e9a4..80e8ac54cf 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -40,6 +40,7 @@ protected: signals: void closeSettings(); void reviewTrainingGuide(); + void showDriverView(); void expandToggleDescription(const QString ¶m); protected: @@ -56,6 +57,7 @@ public: signals: void reviewTrainingGuide(); + void showDriverView(); protected slots: void poweroff(); diff --git a/selfdrive/ui/qt/setup/reset.cc b/selfdrive/ui/qt/setup/reset.cc index c9e0525784..82fd5a7820 100644 --- a/selfdrive/ui/qt/setup/reset.cc +++ b/selfdrive/ui/qt/setup/reset.cc @@ -97,6 +97,11 @@ Reset::Reset(ResetMode mode, QWidget *parent) : QWidget(parent) { body->setText(tr("Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device.")); } + // automatically start if we're just finishing up an ABL reset + if (mode == ResetMode::FORMAT) { + startReset(); + } + setStyleSheet(R"( * { font-family: Inter; @@ -124,6 +129,8 @@ int main(int argc, char *argv[]) { if (argc > 1) { if (strcmp(argv[1], "--recover") == 0) { mode = ResetMode::RECOVER; + } else if (strcmp(argv[1], "--format") == 0) { + mode = ResetMode::FORMAT; } } diff --git a/selfdrive/ui/qt/setup/reset.h b/selfdrive/ui/qt/setup/reset.h index 8bf368e3e8..2e0784cdc9 100644 --- a/selfdrive/ui/qt/setup/reset.h +++ b/selfdrive/ui/qt/setup/reset.h @@ -5,6 +5,7 @@ enum ResetMode { USER_RESET, // user initiated a factory reset from openpilot RECOVER, // userdata is corrupt for some reason, give a chance to recover + FORMAT, // finish up a factory reset from a tool that doesn't flash an empty partition to userdata }; class Reset : public QWidget { diff --git a/selfdrive/ui/qt/widgets/cameraview.cc b/selfdrive/ui/qt/widgets/cameraview.cc index 674e5e999c..81ef613393 100644 --- a/selfdrive/ui/qt/widgets/cameraview.cc +++ b/selfdrive/ui/qt/widgets/cameraview.cc @@ -79,7 +79,9 @@ CameraWidget::~CameraWidget() { glDeleteVertexArrays(1, &frame_vao); glDeleteBuffers(1, &frame_vbo); glDeleteBuffers(1, &frame_ibo); +#ifndef QCOM2 glDeleteTextures(2, textures); +#endif } doneCurrent(); } diff --git a/selfdrive/ui/qt/widgets/keyboard.cc b/selfdrive/ui/qt/widgets/keyboard.cc index 0583870245..9ead27b8d5 100644 --- a/selfdrive/ui/qt/widgets/keyboard.cc +++ b/selfdrive/ui/qt/widgets/keyboard.cc @@ -10,10 +10,12 @@ const QString BACKSPACE_KEY = "⌫"; const QString ENTER_KEY = "→"; +const QString SHIFT_KEY = "⇧"; +const QString CAPS_LOCK_KEY = "⇪"; const QMap KEY_STRETCH = {{" ", 3}, {ENTER_KEY, 2}}; -const QStringList CONTROL_BUTTONS = {"↑", "↓", "ABC", "#+=", "123", BACKSPACE_KEY, ENTER_KEY}; +const QStringList CONTROL_BUTTONS = {SHIFT_KEY, CAPS_LOCK_KEY, "ABC", "#+=", "123", BACKSPACE_KEY, ENTER_KEY}; const float key_spacing_vertical = 20; const float key_spacing_horizontal = 15; @@ -106,7 +108,7 @@ Keyboard::Keyboard(QWidget *parent) : QFrame(parent) { std::vector> lowercase = { {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}, {"a", "s", "d", "f", "g", "h", "j", "k", "l"}, - {"↑", "z", "x", "c", "v", "b", "n", "m", BACKSPACE_KEY}, + {SHIFT_KEY, "z", "x", "c", "v", "b", "n", "m", BACKSPACE_KEY}, {"123", "/", "-", " ", ".", ENTER_KEY}, }; main_layout->addWidget(new KeyboardLayout(this, lowercase)); @@ -115,7 +117,7 @@ Keyboard::Keyboard(QWidget *parent) : QFrame(parent) { std::vector> uppercase = { {"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"}, {"A", "S", "D", "F", "G", "H", "J", "K", "L"}, - {"↓", "Z", "X", "C", "V", "B", "N", "M", BACKSPACE_KEY}, + {SHIFT_KEY, "Z", "X", "C", "V", "B", "N", "M", BACKSPACE_KEY}, {"123", "/", "-", " ", ".", ENTER_KEY}, }; main_layout->addWidget(new KeyboardLayout(this, uppercase)); @@ -141,26 +143,39 @@ Keyboard::Keyboard(QWidget *parent) : QFrame(parent) { main_layout->setCurrentIndex(0); } +void Keyboard::handleCapsPress() { + shift_state = (shift_state + 1) % 3; + bool is_uppercase = shift_state > 0; + main_layout->setCurrentIndex(is_uppercase); + + for (KeyButton* btn : main_layout->currentWidget()->findChildren()) { + if (btn->text() == SHIFT_KEY || btn->text() == CAPS_LOCK_KEY) { + btn->setText(shift_state == 2 ? CAPS_LOCK_KEY : SHIFT_KEY); + btn->setStyleSheet(is_uppercase ? "background-color: #465BEA;" : ""); + } + } +} + void Keyboard::handleButton(QAbstractButton* btn) { const QString &key = btn->text(); if (CONTROL_BUTTONS.contains(key)) { - if (key == "↓" || key == "ABC") { - main_layout->setCurrentIndex(0); - } else if (key == "↑") { - main_layout->setCurrentIndex(1); - } else if (key == "123") { - main_layout->setCurrentIndex(2); - } else if (key == "#+=") { - main_layout->setCurrentIndex(3); + if (key == "ABC" || key == "123" || key == "#+=") { + int index = (key == "ABC") ? 0 : (key == "123" ? 2 : 3); + main_layout->setCurrentIndex(index); + shift_state = 0; + } else if (key == SHIFT_KEY || key == CAPS_LOCK_KEY) { + handleCapsPress(); } else if (key == ENTER_KEY) { main_layout->setCurrentIndex(0); + shift_state = 0; emit emitEnter(); } else if (key == BACKSPACE_KEY) { emit emitBackspace(); } } else { - if ("A" <= key && key <= "Z") { + if (shift_state == 1 && "A" <= key && key <= "Z") { main_layout->setCurrentIndex(0); + shift_state = 0; } emit emitKey(key); } diff --git a/selfdrive/ui/qt/widgets/keyboard.h b/selfdrive/ui/qt/widgets/keyboard.h index efc02d075d..e61617283a 100644 --- a/selfdrive/ui/qt/widgets/keyboard.h +++ b/selfdrive/ui/qt/widgets/keyboard.h @@ -29,9 +29,11 @@ public: private: QStackedLayout* main_layout; + int shift_state = 0; private slots: void handleButton(QAbstractButton* m_button); + void handleCapsPress(); signals: void emitKey(const QString &s); diff --git a/selfdrive/ui/qt/window.cc b/selfdrive/ui/qt/window.cc index 4479d4f79d..36f12c266b 100644 --- a/selfdrive/ui/qt/window.cc +++ b/selfdrive/ui/qt/window.cc @@ -23,6 +23,9 @@ MainWindow::MainWindow(QWidget *parent, HomeWindow *hw, SettingsWindow *sw) : onboardingWindow->showTrainingGuide(); main_layout->setCurrentWidget(onboardingWindow); }); + QObject::connect(settingsWindow, &SettingsWindow::showDriverView, [=] { + homeWindow->showDriverView(true); + }); onboardingWindow = new OnboardingWindow(this); main_layout->addWidget(onboardingWindow); diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/device_panel.cc b/selfdrive/ui/sunnypilot/qt/offroad/settings/device_panel.cc index 1d9e973b5d..5ca3d90323 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/device_panel.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/device_panel.cc @@ -8,7 +8,6 @@ #include "selfdrive/ui/sunnypilot/qt/offroad/settings/device_panel.h" #include "common/watchdog.h" -#include "selfdrive/ui/qt/offroad/driverview.h" #include "selfdrive/ui/qt/qt_window.h" DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) { @@ -41,12 +40,7 @@ DevicePanelSP::DevicePanelSP(SettingsWindowSP *parent) : DevicePanel(parent) { } } - connect(buttons["dcamBtn"], &PushButtonSP::clicked, [this]() { - buttons["dcamBtn"]->setEnabled(false); - DriverViewDialog driver_view(this); - driver_view.exec(); - buttons["dcamBtn"]->setEnabled(true); - }); + connect(buttons["dcamBtn"], &PushButtonSP::clicked, [=]() { emit showDriverView(); }); connect(buttons["retrainingBtn"], &PushButtonSP::clicked, [=]() { if (ConfirmationDialog::confirm(tr("Are you sure you want to review the training guide?"), tr("Review"), this)) { diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/settings/settings.cc index cb2258cca6..bdf4f626d7 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/settings.cc @@ -63,6 +63,7 @@ SettingsWindowSP::SettingsWindowSP(QWidget *parent) : SettingsWindow(parent) { // setup panels DevicePanelSP *device = new DevicePanelSP(this); QObject::connect(device, &DevicePanelSP::reviewTrainingGuide, this, &SettingsWindowSP::reviewTrainingGuide); + QObject::connect(device, &DevicePanelSP::showDriverView, this, &SettingsWindowSP::showDriverView); TogglesPanelSP *toggles = new TogglesPanelSP(this); QObject::connect(this, &SettingsWindowSP::expandToggleDescription, toggles, &TogglesPanel::expandToggleDescription); diff --git a/selfdrive/ui/tests/body.py b/selfdrive/ui/tests/body.py index 7e24c2beb7..07a2ef5128 100755 --- a/selfdrive/ui/tests/body.py +++ b/selfdrive/ui/tests/body.py @@ -8,7 +8,7 @@ if __name__ == "__main__": batt = 1. while True: msg = messaging.new_message('carParams') - msg.carParams.carName = "BODY" + msg.carParams.brand = "body" msg.carParams.notCar = True pm.send('carParams', msg) diff --git a/selfdrive/ui/tests/test_ui/run.py b/selfdrive/ui/tests/test_ui/run.py index 7803d1f3c4..7c3a095cfe 100644 --- a/selfdrive/ui/tests/test_ui/run.py +++ b/selfdrive/ui/tests/test_ui/run.py @@ -9,7 +9,7 @@ import pyautogui import pickle import time -from cereal import log +from cereal import car, log from msgq.visionipc import VisionIpcServer, VisionStreamType from cereal.messaging import PubMaster, log_from_bytes, sub_sock from openpilot.common.basedir import BASEDIR @@ -59,6 +59,10 @@ def setup_settings_software(click, pm: PubMaster, scroll=None): time.sleep(UI_DELAY) def setup_settings_developer(click, pm: PubMaster, scroll=None): + CP = car.CarParams() + CP.experimentalLongitudinalAvailable = True + Params().put("CarParamsPersistent", CP.to_bytes()) + setup_settings_device(click, pm) scroll(-400, 278, 962) click(278, 970) @@ -123,7 +127,7 @@ def setup_onroad_wide_sidebar(click, pm: PubMaster, scroll=None): setup_onroad_wide(click, pm) def setup_body(click, pm: PubMaster, scroll=None): - DATA['carParams'].carParams.carName = "BODY" + DATA['carParams'].carParams.brand = "body" DATA['carParams'].carParams.notCar = True DATA['carState'].carState.charging = True DATA['carState'].carState.fuelGauge = 50.0 @@ -131,9 +135,9 @@ def setup_body(click, pm: PubMaster, scroll=None): def setup_keyboard(click, pm: PubMaster, scroll=None): setup_settings_device(click, pm) - scroll(-100, 278, 962) + scroll(-400, 278, 962) click(278, 970) - click(1930, 228) + click(1930, 390) def setup_keyboard_uppercase(click, pm: PubMaster, scroll=None): setup_keyboard(click, pm, scroll) diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index ddfffa248c..50ea0539d0 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -124,11 +124,23 @@ وضع المناورة الطولية
- Enables or disables the github runner service. + openpilot Longitudinal Control (Alpha) + التحكم الطولي openpilot (ألفا) + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + تحذير: التحكم الطولي في openpilot في المرحلة ألفا لهذه السيارة، وسيقوم بتعطيل مكابح الطوارئ الآلية (AEB). + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + في هذه السيارة يعمل openpilot افتراضياً بالشكل المدمج في التحكم التكيفي في السرعة بدلاً من التحكم الطولي. قم بتمكين هذا الخيار من أجل الانتقال إلى التحكم الطولي. يوصى بتمكين الوضع التجريبي عند استخدام وضع التحكم الطولي ألفا من openpilot. + + + Enable ADB - Enable GitHub runner service + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. @@ -139,6 +151,14 @@ Enable this to attempt to enable radar tracks for Hyundai, Kia, and Genesis models equipped with the supported Mando SCC radar. This allows sunnypilot to use radar data for improved lead tracking and overall longitudinal performance. + + Enable GitHub runner service + + + + Enables or disables the github runner service. + + DevicePanel @@ -293,18 +313,14 @@ Training Guide - - Language - - - - Reboot - إعادة التشغيل - Regulatory التنظيمية + + Language + + Are you sure you want to review the training guide? هل أنت متأكد أنك تريد مراجعة دليل التدريب؟ @@ -317,6 +333,10 @@ Select a language اختر لغة + + Reboot + إعادة التشغيل + Power Off إيقاف التشغيل @@ -354,27 +374,27 @@ DriveStats Drives - القيادة + Hours - ساعات + ALL TIME - كامل الوقت + PAST WEEK - الأسبوع الماضي + KM - كم + Miles - ميل + @@ -441,6 +461,10 @@ Toggle with Main Cruise + + Note: For vehicles without LFA/LKAS button, disabling this will prevent lateral control engagement. + + Unified Engagement Mode (UEM) @@ -472,10 +496,6 @@ Remain Active: ALC will remain active even after the brake pedal is pressed. Pause Steering: ALC will be paused after the brake pedal is manually pressed. - - Note: For vehicles without LFA/LKAS button, disabling this will prevent lateral control engagement. - - MultiOptionDialog @@ -509,10 +529,6 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. NetworkingSP - - Advanced - متقدم - Scan @@ -633,7 +649,7 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. Please connect to Wi-Fi to complete initial pairing - + يرجى الاتصال بشبكة الواي فاي لإكمال الاقتران الأولي @@ -651,11 +667,11 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed.ParamControlSP Enable - تمكين + تمكين Cancel - إلغاء + إلغاء @@ -824,36 +840,32 @@ This may take up to a minute. SettingsWindowSP × - × + × Device - الجهاز + الجهاز Network - الشبكة - - - Toggles - المثبتتات - - - Software - البرنامج - - - Developer - المطور - - - sunnypilot - sunnypilot + الشبكة sunnylink + + Toggles + المثبتتات + + + Software + البرنامج + + + sunnypilot + + Trips @@ -862,6 +874,10 @@ This may take up to a minute. Vehicle + + Developer + المطور + Setup @@ -1152,32 +1168,16 @@ This may take up to a minute. SoftwarePanelSP + + Current Model + + SELECT اختيار - Reset Calibration - إعادة ضبط المعايرة - - - Warning: You are on a metered connection! - - - - Continue - متابعة - - - on Metered - - - - %1 model [%2] pending... - - - - Current Model + No custom model selected! @@ -1196,22 +1196,6 @@ This may take up to a minute. Downloading %1 model [%2]... (%3%) - - %1 model [%2] download failed - - - - Select a Model - - - - Fetching models... - - - - Model download has started in the background. - - %1 model [%2] %3 @@ -1228,12 +1212,24 @@ This may take up to a minute. from cache + + %1 model [%2] download failed + + + + %1 model [%2] pending... + + + + Fetching models... + + Use Default - No custom model selected! + Select a Model @@ -1241,11 +1237,7 @@ This may take up to a minute. - Cancel - إلغاء - - - Driving Model Selector + Model download has started in the background. @@ -1256,6 +1248,30 @@ This may take up to a minute. Would you like to do that now? + + Reset Calibration + إعادة ضبط المعايرة + + + Driving Model Selector + + + + Warning: You are on a metered connection! + + + + Continue + متابعة + + + on Metered + + + + Cancel + إلغاء + SshControl @@ -1314,11 +1330,11 @@ This may take up to a minute. - N/A - غير متاح + 🎉Welcome back! We're excited to see you've enabled sunnylink again! 🚀 + - 🎉Welcome back! We're excited to see you've enabled sunnylink again! 🚀 + 👋Not going to lie, it's sad to see you disabled sunnylink 😢, but we'll be here when you're ready to come back 🎉. @@ -1326,16 +1342,12 @@ This may take up to a minute. - 👋Not going to lie, it's sad to see you disabled sunnylink 😢, but we'll be here when you're ready to come back 🎉. - + N/A + غير متاح SunnypilotPanel - - Customize MADS - - Modular Assistive Driving System (MADS) @@ -1344,6 +1356,10 @@ This may take up to a minute. Enable the beloved MADS feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + Customize MADS + + TermsPage @@ -1406,18 +1422,6 @@ This may take up to a minute. When enabled, pressing the accelerator pedal will disengage openpilot. عند تمكين هذه الميزة، فإن الضغط على دواسة الوقود سيؤدي إلى فك ارتباط openpilot. - - openpilot Longitudinal Control (Alpha) - التحكم الطولي openpilot (ألفا) - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - تحذير: التحكم الطولي في openpilot في المرحلة ألفا لهذه السيارة، وسيقوم بتعطيل مكابح الطوارئ الآلية (AEB). - - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - في هذه السيارة يعمل openpilot افتراضياً بالشكل المدمج في التحكم التكيفي في السرعة بدلاً من التحكم الطولي. قم بتمكين هذا الخيار من أجل الانتقال إلى التحكم الطولي. يوصى بتمكين الوضع التجريبي عند استخدام وضع التحكم الطولي ألفا من openpilot. - Experimental Mode الوضع التجريبي diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index 3f495b7998..de38c13687 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -139,6 +139,26 @@ Enable this to attempt to enable radar tracks for Hyundai, Kia, and Genesis models equipped with the supported Mando SCC radar. This allows sunnypilot to use radar data for improved lead tracking and overall longitudinal performance. + + Enable ADB + + + + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. + + + + openpilot Longitudinal Control (Alpha) + + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + + DevicePanel @@ -505,10 +525,6 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. NetworkingSP - - Advanced - Erweitert - Scan @@ -1410,14 +1426,6 @@ This may take up to a minute. Experimental mode is currently unavailable on this car since the car's stock ACC is used for longitudinal control. Der experimentelle Modus ist momentan für dieses Auto nicht verfügbar da es den eingebauten adaptiven Tempomaten des Autos benutzt. - - openpilot Longitudinal Control (Alpha) - - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - - Aggressive @@ -1434,10 +1442,6 @@ This may take up to a minute. Driving Personality - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - - End-to-End Longitudinal Control diff --git a/selfdrive/ui/translations/main_es.ts b/selfdrive/ui/translations/main_es.ts index 86ea11fb4e..93ebf64b44 100644 --- a/selfdrive/ui/translations/main_es.ts +++ b/selfdrive/ui/translations/main_es.ts @@ -139,6 +139,26 @@ Enable this to attempt to enable radar tracks for Hyundai, Kia, and Genesis models equipped with the supported Mando SCC radar. This allows sunnypilot to use radar data for improved lead tracking and overall longitudinal performance. + + Enable ADB + + + + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. + + + + openpilot Longitudinal Control (Alpha) + Control longitudinal de openpilot (fase experimental) + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + AVISO: el control longitudinal de openpilot está en fase experimental para este automóvil y desactivará el Frenado Automático de Emergencia (AEB). + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + En este automóvil, openpilot se configura de manera predeterminada con el Autocrucero Adaptativo (ACC) incorporado en el automóvil en lugar del control longitudinal de openpilot. Habilita esta opción para cambiar al control longitudinal de openpilot. Se recomienda activar el modo experimental al habilitar el control longitudinal de openpilot (aún en fase experimental). + DevicePanel @@ -1354,18 +1374,6 @@ Esto puede tardar un minuto. Use the openpilot system for adaptive cruise control and lane keep driver assistance. Your attention is required at all times to use this feature. Changing this setting takes effect when the car is powered off. Utilice el sistema openpilot para acceder a un autocrucero adaptativo y asistencia al conductor para mantenerse en el carril. Se requiere su atención en todo momento para utilizar esta función. Cambiar esta configuración solo tendrá efecto con el auto apagado. - - openpilot Longitudinal Control (Alpha) - Control longitudinal de openpilot (fase experimental) - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - AVISO: el control longitudinal de openpilot está en fase experimental para este automóvil y desactivará el Frenado Automático de Emergencia (AEB). - - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - En este automóvil, openpilot se configura de manera predeterminada con el Autocrucero Adaptativo (ACC) incorporado en el automóvil en lugar del control longitudinal de openpilot. Habilita esta opción para cambiar al control longitudinal de openpilot. Se recomienda activar el modo experimental al habilitar el control longitudinal de openpilot (aún en fase experimental). - Experimental Mode Modo Experimental diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index 202f0b9027..00f8cfc02d 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -117,10 +117,30 @@ DeveloperPanel Joystick Debug Mode - + Mode débogage au joystick Longitudinal Maneuver Mode + Mode manœuvre longitudinale + + + openpilot Longitudinal Control (Alpha) + Contrôle longitudinal openpilot (Alpha) + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + ATTENTION : le contrôle longitudinal openpilot est en alpha pour cette voiture et désactivera le freinage d'urgence automatique (AEB). + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + Sur cette voiture, openpilot utilise par défaut le régulateur de vitesse adaptatif intégré à la voiture plutôt que le contrôle longitudinal d'openpilot. Activez ceci pour passer au contrôle longitudinal openpilot. Il est recommandé d'activer le mode expérimental lors de l'activation du contrôle longitudinal openpilot alpha. + + + Enable ADB + + + + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. @@ -276,11 +296,11 @@ Pair Device - + Associer l'appareil PAIR - + ASSOCIER @@ -505,10 +525,6 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. NetworkingSP - - Advanced - Avancé - Scan @@ -590,23 +606,23 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed.OnroadAlerts openpilot Unavailable - + openpilot indisponible TAKE CONTROL IMMEDIATELY - + REPRENEZ LE CONTRÔLE IMMÉDIATEMENT Reboot Device - + Redémarrer l'appareil Waiting to start - + En attente de démarrage System Unresponsive - + Système inopérant @@ -629,7 +645,7 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. Please connect to Wi-Fi to complete initial pairing - + Connectez-vous au Wi-Fi pour terminer l'appairage initial @@ -682,7 +698,7 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. Remote snapshots - + Captures à distance @@ -733,7 +749,7 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. now - + maintenant @@ -774,7 +790,7 @@ Cela peut prendre jusqu'à une minute. System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot. - + Réinitialisation système déclenchée. Appuyez sur confirmer pour effacer tout le contenu et les paramètres. Appuyez sur annuler pour reprendre le démarrage. @@ -801,7 +817,7 @@ Cela peut prendre jusqu'à une minute. Developer - + Dév. @@ -828,7 +844,7 @@ Cela peut prendre jusqu'à une minute. Developer - + Dév. sunnypilot @@ -931,15 +947,15 @@ Cela peut prendre jusqu'à une minute. Choose Software to Install - + Choisir le logiciel à installer openpilot - openpilot + openpilot Custom Software - + Logiciel personnalisé @@ -1358,18 +1374,6 @@ Cela peut prendre jusqu'à une minute. Use the openpilot system for adaptive cruise control and lane keep driver assistance. Your attention is required at all times to use this feature. Changing this setting takes effect when the car is powered off. Utilisez le système openpilot pour le régulateur de vitesse adaptatif et l'assistance au maintien de voie. Votre attention est requise en permanence pour utiliser cette fonctionnalité. La modification de ce paramètre prend effet lorsque la voiture est éteinte. - - openpilot Longitudinal Control (Alpha) - Contrôle longitudinal openpilot (Alpha) - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - ATTENTION : le contrôle longitudinal openpilot est en alpha pour cette voiture et désactivera le freinage d'urgence automatique (AEB). - - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - Sur cette voiture, openpilot utilise par défaut le régulateur de vitesse adaptatif intégré à la voiture plutôt que le contrôle longitudinal d'openpilot. Activez ceci pour passer au contrôle longitudinal openpilot. Il est recommandé d'activer le mode expérimental lors de l'activation du contrôle longitudinal openpilot alpha. - Experimental Mode Mode expérimental @@ -1456,7 +1460,7 @@ Cela peut prendre jusqu'à une minute. Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. - + Le mode Standard est recommandé. En mode Agressif, openpilot suivra les véhicules de plus près et sera plus dynamique avec l'accélérateur et le frein. En mode Détendu, openpilot maintiendra une distance plus importante avec les véhicules qui précèdent. Sur les véhicules compatibles, vous pouvez alterner entre ces personnalités à l'aide du bouton de distance au volant. The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. @@ -1464,11 +1468,11 @@ Cela peut prendre jusqu'à une minute. Always-On Driver Monitoring - + Surveillance continue du conducteur Enable driver monitoring even when openpilot is not engaged. - + Activer la surveillance conducteur lorsque openpilot n'est pas actif. Enable Dynamic Experimental Control diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 59cb8071b4..2792a5effe 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -24,11 +24,11 @@ Enable Tethering - テザリングを有効化 + テザリング有効 Tethering Password - テザリングパスワード + テザリングパスワード EDIT @@ -40,23 +40,23 @@ IP Address - IP アドレス + IPアドレス Enable Roaming - ローミングを有効化 + ローミング有効 APN Setting - APN 設定 + APN設定 Enter APN - APN を入力 + APNを入力 leave blank for automatic configuration - 自動で設定するには、空白のままにしてください。 + 自動で設定するには空白のままにしてください Cellular Metered @@ -64,27 +64,27 @@ Prevent large data uploads when on a metered connection - 大量のデータのアップロードを防止します。 + 大量のデータのアップロードを防止する Hidden Network - + ネットワーク非表示 CONNECT - 接続 + 接続 Enter SSID - SSID を入力 + SSIDを入力 Enter password - パスワードを入力 + パスワードを入力 for "%1" - ネットワーク名:%1 + [%1] @@ -102,7 +102,7 @@ DeclinePage You must accept the Terms and Conditions in order to use openpilot. - openpilot をご利用される前に、利用規約に同意する必要があります。 + openpilotを使用するためには利用規約に同意する必要があります Back @@ -110,17 +110,37 @@ Decline, uninstall %1 - 拒否して %1 をアンインストール + 同意しない(%1をアンインストール) DeveloperPanel Joystick Debug Mode - + ジョイスティックデバッグモード Longitudinal Maneuver Mode + アクセル制御マニューバー + + + openpilot Longitudinal Control (Alpha) + openpilotアクセル制御(Alpha) + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + この車ではopenpilotのアクセル制御はアルファ版であり、自動緊急ブレーキ(AEB)が無効化されます。 + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + この車では、openpilotは車両内蔵のACC(アダプティブクルーズコントロール)をデフォルトとして使用し、openpilotのアクセル制御は無効化されています。アクセル制御をopenpilotに切り替えるにはこの設定を有効にしてください。また同時にExperimentalモードを推奨します。 + + + Enable ADB + + + + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. @@ -144,11 +164,11 @@ DevicePanel Dongle ID - ドングル番号 (Dongle ID) + ドングルID N/A - N/A + 該当なし Serial @@ -164,47 +184,47 @@ Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off) - 車内カメラをプレビューして、ドライバー監視システムの視界を確認ができます。(車両の電源を切る必要があります) + 車内カメラでドライバー監視システムのカメラ画像を確認できます。(車両のパワーOFF時の機能です) Reset Calibration - キャリブレーションをリセット + キャリブレーションリセット RESET - リセット + リセット Are you sure you want to reset calibration? - キャリブレーションをリセットしてもよろしいですか? + キャリブレーションをリセットしますか? Review Training Guide - 使い方の確認 + トレーニングガイドを見る REVIEW - 見る + 確認 Review the rules, features, and limitations of openpilot - openpilot の特徴を見る + openpilotのルール、機能、および制限を確認してください Are you sure you want to review the training guide? - 使い方の確認をしますか? + トレーニングガイドを始めてもよろしいですか? Regulatory - 認証情報 + 規約 VIEW - 見る + 確認 Change Language - 言語を変更 + 多言語対応 CHANGE @@ -220,11 +240,11 @@ Power Off - 電源を切る + パワーオフ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - openpilotの本体は、左右4°以内、上5°、下9°以内の角度で取付ける必要があります。継続してキャリブレーションを続けているので、手動でリセットを行う必要はほぼありません。 + openpilotの本体は左右4°以内、上5°下9°以内の角度で取付ける必要があります。常にキャリブレーションされておりリセットはほとんど必要ありません。 Your device is pointed %1° %2 and %3° %4. @@ -252,15 +272,15 @@ Disengage to Reboot - openpilot をキャンセルして再起動ができます + 再起動するには車を一旦停止してください Are you sure you want to power off? - シャットダウンしてもよろしいですか? + パワーオフしてもよろしいですか? Disengage to Power Off - openpilot をキャンセルしてシャットダウンができます + パワーオフするには車を一旦停止してください Reset @@ -268,19 +288,19 @@ Review - 確認 + 見る Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. - デバイスを comma connect (connect.comma.ai)でペアリングし、comma primeの特典を申請してください。 + デバイスをcommaコネクト(connect.comma.ai)でペアリングしてcommaプライムの特典を受け取ってください。 Pair Device - + デバイスのペアリング PAIR - + OK @@ -381,18 +401,18 @@ DriverViewWindow camera starting - カメラを起動しています + カメラ起動中 ExperimentalModeButton EXPERIMENTAL MODE ON - 実験モード + EXPERIMENTALモード CHILL MODE ON - チルモード + CHILLモード @@ -407,7 +427,7 @@ MAX - 最高速度 + 最大速度 @@ -419,7 +439,7 @@ Need at least %n character(s)! - %n文字以上でお願いします! + %n文字以上にして下さい! @@ -427,7 +447,7 @@ Installer Installing... - インストールしています... + インストール中... @@ -495,19 +515,15 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. for "%1" - ネットワーク名:%1 + [%1] Wrong password - パスワードが間違っています + パスワードが違います NetworkingSP - - Advanced - 詳細 - Scan @@ -521,48 +537,49 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed.OffroadAlert Immediately connect to the internet to check for updates. If you do not connect to the internet, openpilot won't engage in %1 - + インターネットへ接続してアップデートを確認してください。未接続のままではopenpilotを使用できなくなります。あと[%1] Connect to internet to check for updates. openpilot won't automatically start until it connects to internet to check for updates. - + インターネットに接続してアップデートを確認してください。接続するまでopenpilotは使用できません。 Unable to download updates %1 - + 更新をダウンロードできませんでした +%1 Taking camera snapshots. System won't start until finished. - + スナップショットを撮影中です。完了するまでシステムは起動しません。 An update to your device's operating system is downloading in the background. You will be prompted to update when it's ready to install. - + オペレーティングシステムがバックグラウンドでダウンロードされています。インストールの準備が整うと更新を促されます。 Device failed to register. It will not connect to or upload to comma.ai servers, and receives no support from comma.ai. If this is an official device, visit https://comma.ai/support. - + 登録に失敗しました。このデバイスはcomma.aiのサーバーに接続したりデータをアップロードしたりできません。またcomma.aiのサポートも受けられません。公式デバイスである場合は https://comma.ai/support に問い合わせて下さい。 NVMe drive not mounted. - + SSDドライブ(NVMe)がマウントされていません。 Unsupported NVMe drive detected. Device may draw significantly more power and overheat due to the unsupported NVMe. - + 非サポートのSSDドライブ(NVMe)が検出されました。このドライブを使用するとデバイスが多大な電力を消費し過熱する可能性があります。 openpilot was unable to identify your car. Your car is either unsupported or its ECUs are not recognized. Please submit a pull request to add the firmware versions to the proper vehicle. Need help? Join discord.comma.ai. - + openpilotが車両を識別できませんでした。車が未対応またはECUが認識されていない可能性があります。該当車両のファームウェアバージョンを追加するためにプルリクエストしてください。サポートが必要な場合は discord.comma.ai に参加することができます。 openpilot detected a change in the device's mounting position. Ensure the device is fully seated in the mount and the mount is firmly secured to the windshield. - + openpilotがデバイスの取り付け位置にずれを検出しました。デバイスの固定とマウントがフロントガラスにしっかりと取り付けられていることを確認してください。 Device temperature too high. System cooling down before starting. Current internal component temperature: %1 - + デバイスの温度が高すぎるためシステム起動前の冷却中です。現在のデバイス内部温度: %1 sunnypilot is now in Always Offroad mode. sunnypilot won't start until Always Offroad mode is disabled. Go to "Settings" -> "Device" to exit Always Offroad mode. @@ -588,46 +605,46 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed.OnroadAlerts openpilot Unavailable - + openpilotは使用できません TAKE CONTROL IMMEDIATELY - + 直ちに車の運転に戻って下さい Reboot Device - + デバイスを再起動してください Waiting to start - + 始動を待機しています System Unresponsive - + システムが応答しません PairingPopup Pair your device to your comma account - デバイスと comma アカウントを連携する + デバイスとcommaアカウントを連携して下さい Go to https://connect.comma.ai on your phone - スマートフォンで「https://connect.comma.ai」にアクセスしてください。 + スマートフォンで https://connect.comma.ai にアクセスしてください Click "add new device" and scan the QR code on the right - 「新しいデバイスを追加」を押し、右側のQRコードをスキャンしてください。 + 「add new device」を押して右側のQRコードをスキャンしてください Bookmark connect.comma.ai to your home screen to use it like an app - 「connect.comma.ai」をホーム画面に追加して、アプリのように使うことができます。 + connect.comma.aiのサイトをホーム画面に追加して、アプリのように使うことができます。 Please connect to Wi-Fi to complete initial pairing - + 最初にペアリングするため、Wi-Fiに接続してください @@ -638,7 +655,7 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. Enable - を有効化 + 有効にする @@ -656,15 +673,15 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed.PrimeAdWidget Upgrade Now - 今すぐアップグレート + 今すぐアップグレード Become a comma prime member at connect.comma.ai - connect.comma.ai でプライム会員に登録できます + connect.comma.ai からプライム会員に登録できます PRIME FEATURES: - 特典: + 特典: Remote access @@ -672,26 +689,26 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. 24/7 LTE connectivity - + 24時間365日のLTE接続 1 year of drive storage - + 1年間分のドライブストレージ Remote snapshots - + リモートスナップショット PrimeUserWidget ✓ SUBSCRIBED - ✓ 入会しました + ✓ 有効です comma prime - comma prime + commaプライム @@ -711,24 +728,24 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. %n minute(s) ago - %n 分前 + %n分前 %n hour(s) ago - %n 時間前 + %n時間前 %n day(s) ago - %n 日前 + %n日前 now - + たった今 @@ -759,16 +776,17 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device. - + Dataパーティションをマウントできません。パーティションが破損している可能性があります。デバイスを消去してリセットしますので確認を押して下さい。 Resetting device... This may take up to a minute. - + デバイスをリセットしています… +この処理には最大で1分ほどかかる場合があります。 System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot. - + システムリセットの準備が整いました。すべてのデータと設定を消去するには「確認」を押してください。「キャンセル」を押すとブートを再開します。 @@ -783,19 +801,19 @@ This may take up to a minute. Network - ネットワーク + ネット Toggles - 機能設定 + 機能 Software - ソフトウェア + ソフト Developer - + 開発 @@ -822,7 +840,7 @@ This may take up to a minute. Developer - + 開発 sunnypilot @@ -845,11 +863,11 @@ This may take up to a minute. Setup WARNING: Low Voltage - 警告:低電圧 + 警告:電圧低下 Power your device in a car with a harness or proceed at your own risk. - 自己責任で実行を継続するか、ハーネスから電源を供給してください。 + ハーネスを使って車でデバイスに電源を供給するか、自己責任でこのまま継続して下さい。 Power off @@ -865,11 +883,11 @@ This may take up to a minute. Before we get on the road, let’s finish installation and cover some details. - 道路に向かう前に、インストールを完了して使い方を確認しましょう。 + 出発する前に、インストールを完了させて少し詳細を確認しましょう。 Connect to Wi-Fi - Wi-Fi に接続 + Wi-Fiに接続 Back @@ -877,7 +895,7 @@ This may take up to a minute. Continue without Wi-Fi - Wi-Fi に接続せずに続行 + Wi-Fiに接続せずに続行 Waiting for internet @@ -885,7 +903,7 @@ This may take up to a minute. Enter URL - URL を入力 + URLの入力 for Custom Software @@ -897,11 +915,11 @@ This may take up to a minute. Download Failed - ダウンロード失敗 + ダウンロードに失敗しました Ensure the entered URL is valid, and the device’s internet connection is good. - 入力された URL を確認し、デバイスがインターネットに接続されていることを確認してください。 + 入力されたURLが正しいかどうか、インターネットに正常に接続できているかを確認してください。 Reboot device @@ -909,15 +927,15 @@ This may take up to a minute. Start over - 最初からやり直す + やり直す No custom software found at this URL. - + このURLはカスタムソフトウェアではありません。 Something went wrong. Reboot the device. - + 何かの問題が発生しました。デバイスを再起動してください。 Select a language @@ -925,30 +943,30 @@ This may take up to a minute. Choose Software to Install - + インストールするソフトウェアを選択してください。 openpilot - openpilot + openpilot Custom Software - + カスタムソフトウェア SetupWidget Finish Setup - セットアップ完了 + セットアップの完了 Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. - デバイスを comma connect (connect.comma.ai)でペアリングし、comma primeの特典を申請してください。 + デバイスをcommaコネクト(connect.comma.ai)でペアリングしてcommaプライムの特典を受け取ってください。 Pair device - デバイスをペアリング + デバイスのペアリング @@ -1057,7 +1075,7 @@ This may take up to a minute. SoftwarePanel Updates are only downloaded while the car is off. - 車の電源がオフの間のみ、アップデートのダウンロードが行われます。 + 車の電源がオフの間のみアップデートがダウンロードできます。 Current Version @@ -1109,23 +1127,23 @@ This may take up to a minute. failed to check for update - + アップデートの確認に失敗しました。 up to date, last checked %1 - + 最新の状態です。最終確認日時:%1 DOWNLOAD - + ダウンロード update available - + アップデートが利用可能です never - + 無効 @@ -1263,7 +1281,7 @@ This may take up to a minute. Username '%1' has no keys on GitHub - ユーザー名 “%1” は GitHub に鍵がありません + ユーザー名“%1”は GitHub に公開鍵がありません Request timed out @@ -1271,14 +1289,14 @@ This may take up to a minute. Username '%1' doesn't exist on GitHub - ユーザー名 '%1' は GitHub に存在しません + ユーザー名”%1”は GitHub に存在しません SshToggle Enable SSH - SSH を有効化 + SSHの有効化 @@ -1350,19 +1368,19 @@ This may take up to a minute. Use the openpilot system for adaptive cruise control and lane keep driver assistance. Your attention is required at all times to use this feature. Changing this setting takes effect when the car is powered off. - openpilotによるアダプティブクルーズコントロールとレーンキーピングドライバーアシストを利用します。この機能を利用する際は、常に前方への注意が必要です。この設定を変更すると、車の電源が切れた時に反映されます。 + openpilotによるアダプティブクルーズコントロールとレーンキープアシストを利用します。この機能を利用する際は常に前方への注意が必要です。この設定を変更は車の電源が必要です。 Enable Lane Departure Warnings - 車線逸脱警報機能を有効化 + 車線逸脱警報機能の有効化 Receive alerts to steer back into the lane when your vehicle drifts over a detected lane line without a turn signal activated while driving over 31 mph (50 km/h). - 時速31マイル(50km)を超えるスピードで走行中、ウインカーを作動させずに検出された車線ライン上に車両が触れた場合、手動で車線内に戻るように警告を行います。 + 時速31マイル(50km)以上のスピードで走行中、ウインカーを作動させずに検出したレーン上に車両が触れた場合、手動で車線内に戻るように警告を行います。 Use Metric System - メートル法を使用 + メートル法の使用 Display speed in km/h instead of mph. @@ -1378,7 +1396,7 @@ This may take up to a minute. Disengage on Accelerator Pedal - アクセルを踏むと openpilot を中断 + アクセルを踏むと運転サポートを中断 When enabled, pressing the accelerator pedal will disengage openpilot. @@ -1386,11 +1404,11 @@ This may take up to a minute. Experimental Mode - 実験モード + Experimentalモード openpilot defaults to driving in <b>chill mode</b>. Experimental mode enables <b>alpha-level features</b> that aren't ready for chill mode. Experimental features are listed below: - openpilotは標準ではゆっくりとくつろげる運転を提供します。この実験モードを有効にすると、以下のくつろげる段階ではない開発中の機能を利用する事ができます。 + openpilotは標準ではゆっくりとくつろげる運転を提供します。このExperimental(実験)モードを有効にすると、以下のアグレッシブな開発中の機能を利用する事ができます。 Let the driving model control the gas and brakes. openpilot will drive as it thinks a human would, including stopping for red lights and stop signs. Since the driving model decides the speed to drive, the set speed will only act as an upper bound. This is an alpha quality feature; mistakes should be expected. @@ -1402,67 +1420,55 @@ This may take up to a minute. Experimental mode is currently unavailable on this car since the car's stock ACC is used for longitudinal control. - この車のACCがアクセル制御を行うため実験モードを利用することができません。 - - - openpilot Longitudinal Control (Alpha) - - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - + 車両の標準ACC(アダプティブ・クルーズ・コントロール)がアクセル制御に使用されているため、現在Experimentalモードは利用できません。 Aggressive - + アグレッシブ Standard - + 標準 Relaxed - + リラックス Driving Personality - - - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - + 運転傾向 End-to-End Longitudinal Control - + End-to-Endアクセル制御 openpilot longitudinal control may come in a future update. - + openpilotのアクセル制御は将来のアップデートで提供される可能性があります。 An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. - + openpilotのアルファ版アクセル制御は、Experimentalモードと共に非リリースのブランチでテストすることができます。 Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. - + openpilotのアクセル制御機能(アルファ)を有効にして、Experimentalモードを許可してください。 Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with your steering wheel distance button. - + 標準モードが推奨されます。アグレッシブモードではopenpilotは先行車に近づいて追従し、アクセルとブレーキがより強気になります。リラックスモードではopenpilotは先行車から距離を取って走行します。サポートされている車両ではステアリングホイールの距離ボタンでこれらのモードを切り替えることができます。 The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. The Experimental mode logo will also be shown in the top right corner. - + 運転時の画面効果として、低速時にカーブをより良く表示するために道路用の広角カメラに切り替わります。またExperimentalモードのロゴが右上隅に表示されます。 Always-On Driver Monitoring - + 運転者の常時モニタリング Enable driver monitoring even when openpilot is not engaged. - + openpilotが作動していない場合でも運転者モニタリングを有効にする。 Enable Dynamic Experimental Control @@ -1481,11 +1487,11 @@ This may take up to a minute. An operating system update is required. Connect your device to Wi-Fi for the fastest update experience. The download size is approximately 1GB. - オペレーティングシステムのアップデートが必要です。Wi-Fi に接続してアップデートする事をお勧めします。ダウンロードサイズは約 1GB です。 + OSのアップデートが必要です。Wi-Fiに接続してアップデートする事をお勧めします。ダウンロードサイズは約1GBです。 Connect to Wi-Fi - Wi-Fi に接続 + Wi-Fiに接続 Install @@ -1512,23 +1518,23 @@ This may take up to a minute. WiFiPromptWidget Setup Wi-Fi - + Wi-Fiセットアップ Connect to Wi-Fi to upload driving data and help improve openpilot - + ドライブデータをアップロードしてopenpilotの改善に役立てるためにWi-Fi接続してください Open Settings - + 設定を開く Ready to upload - + アップロード準備完了 Training data will be pulled periodically while your device is on Wi-Fi - + デバイスがWi-Fiに接続されている間、トレーニングデータが定期的に送信されます @@ -1547,7 +1553,7 @@ This may take up to a minute. Forget Wi-Fi Network "%1"? - Wi-Fiネットワーク%1を削除してもよろしいですか? + Wi-Fiネットワーク%1を削除してもよろしいですか? Forget diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index 2bac59dfc1..c7849a2903 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -139,6 +139,26 @@ Enable this to attempt to enable radar tracks for Hyundai, Kia, and Genesis models equipped with the supported Mando SCC radar. This allows sunnypilot to use radar data for improved lead tracking and overall longitudinal performance. + + Enable ADB + + + + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. + + + + openpilot Longitudinal Control (Alpha) + openpilot 가감속 제어 (알파) + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + 경고: openpilot 가감속 제어 알파 기능으로 차량의 자동긴급제동(AEB)을 비활성화합니다. + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + 이 차량은 openpilot 가감속 제어 대신 기본적으로 차량의 ACC로 가감속을 제어합니다. openpilot의 가감속 제어로 전환하려면 이 기능을 활성화하세요. openpilot 가감속 제어 알파를 활성화하는 경우 실험 모드 활성화를 권장합니다. + DevicePanel @@ -504,10 +524,6 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. NetworkingSP - - Advanced - 고급 설정 - Scan @@ -1410,18 +1426,6 @@ This may take up to a minute. openpilot longitudinal control may come in a future update. openpilot 가감속 제어는 향후 업데이트에서 지원될 수 있습니다. - - openpilot Longitudinal Control (Alpha) - openpilot 가감속 제어 (알파) - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - 경고: openpilot 가감속 제어 알파 기능으로 차량의 자동긴급제동(AEB)을 비활성화합니다. - - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - 이 차량은 openpilot 가감속 제어 대신 기본적으로 차량의 ACC로 가감속을 제어합니다. openpilot의 가감속 제어로 전환하려면 이 기능을 활성화하세요. openpilot 가감속 제어 알파를 활성화하는 경우 실험 모드 활성화를 권장합니다. - Aggressive 공격적 diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index 9c5f08036b..7355c10916 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -139,6 +139,26 @@ Enable this to attempt to enable radar tracks for Hyundai, Kia, and Genesis models equipped with the supported Mando SCC radar. This allows sunnypilot to use radar data for improved lead tracking and overall longitudinal performance. + + Enable ADB + + + + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. + + + + openpilot Longitudinal Control (Alpha) + Controle Longitudinal openpilot (Embrionário) + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + AVISO: o controle longitudinal openpilot está em estado embrionário para este carro e desativará a Frenagem Automática de Emergência (AEB). + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + Neste carro, o openpilot tem como padrão o ACC embutido do carro em vez do controle longitudinal do openpilot. Habilite isso para alternar para o controle longitudinal openpilot. Recomenda-se ativar o modo Experimental ao ativar o embrionário controle longitudinal openpilot. + DevicePanel @@ -505,10 +525,6 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. NetworkingSP - - Advanced - Avançado - Scan @@ -1414,18 +1430,6 @@ Isso pode levar até um minuto. openpilot longitudinal control may come in a future update. O controle longitudinal openpilot poderá vir em uma atualização futura. - - openpilot Longitudinal Control (Alpha) - Controle Longitudinal openpilot (Embrionário) - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - AVISO: o controle longitudinal openpilot está em estado embrionário para este carro e desativará a Frenagem Automática de Emergência (AEB). - - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - Neste carro, o openpilot tem como padrão o ACC embutido do carro em vez do controle longitudinal do openpilot. Habilite isso para alternar para o controle longitudinal openpilot. Recomenda-se ativar o modo Experimental ao ativar o embrionário controle longitudinal openpilot. - Aggressive Disputa diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index dd45f23fe9..977c4a9e4f 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -139,6 +139,26 @@ Enable this to attempt to enable radar tracks for Hyundai, Kia, and Genesis models equipped with the supported Mando SCC radar. This allows sunnypilot to use radar data for improved lead tracking and overall longitudinal performance. + + Enable ADB + + + + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. + + + + openpilot Longitudinal Control (Alpha) + ระบบควบคุมการเร่ง/เบรคโดย openpilot (Alpha) + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + คำเตือน: การควบคุมการเร่ง/เบรคโดย openpilot สำหรับรถคันนี้ยังอยู่ในสถานะ alpha และระบบเบรคฉุกเฉินอัตโนมัติ (AEB) จะถูกปิด + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + โดยปกติสำหรับรถคันนี้ openpilot จะควบคุมการเร่ง/เบรคด้วยระบบ ACC จากโรงงาน แทนการควยคุมโดย openpilot เปิดสวิตซ์นี้เพื่อให้ openpilot ควบคุมการเร่ง/เบรค แนะนำให้เปิดโหมดทดลองเมื่อต้องการให้ openpilot ควบคุมการเร่ง/เบรค ซึ่งอยู่ในสถานะ alpha + DevicePanel @@ -504,10 +524,6 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. NetworkingSP - - Advanced - ขั้นสูง - Scan @@ -1410,18 +1426,6 @@ This may take up to a minute. openpilot longitudinal control may come in a future update. ระบบควบคุมการเร่ง/เบรคโดย openpilot อาจมาในการอัปเดตในอนาคต - - openpilot Longitudinal Control (Alpha) - ระบบควบคุมการเร่ง/เบรคโดย openpilot (Alpha) - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - คำเตือน: การควบคุมการเร่ง/เบรคโดย openpilot สำหรับรถคันนี้ยังอยู่ในสถานะ alpha และระบบเบรคฉุกเฉินอัตโนมัติ (AEB) จะถูกปิด - - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - โดยปกติสำหรับรถคันนี้ openpilot จะควบคุมการเร่ง/เบรคด้วยระบบ ACC จากโรงงาน แทนการควยคุมโดย openpilot เปิดสวิตซ์นี้เพื่อให้ openpilot ควบคุมการเร่ง/เบรค แนะนำให้เปิดโหมดทดลองเมื่อต้องการให้ openpilot ควบคุมการเร่ง/เบรค ซึ่งอยู่ในสถานะ alpha - Aggressive ดุดัน diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index 4623e3e139..6e73e46d3b 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -139,6 +139,26 @@ Enable this to attempt to enable radar tracks for Hyundai, Kia, and Genesis models equipped with the supported Mando SCC radar. This allows sunnypilot to use radar data for improved lead tracking and overall longitudinal performance. + + Enable ADB + + + + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. + + + + openpilot Longitudinal Control (Alpha) + + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + + DevicePanel @@ -504,10 +524,6 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. NetworkingSP - - Advanced - Gelişmiş Seçenekler - Scan @@ -1380,14 +1396,6 @@ This may take up to a minute. When enabled, pressing the accelerator pedal will disengage openpilot. Aktifleştirilirse eğer gaz pedalına basınca openpilot devre dışı kalır. - - openpilot Longitudinal Control (Alpha) - - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - - Experimental Mode @@ -1412,10 +1420,6 @@ This may take up to a minute. Driving Personality - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - - openpilot defaults to driving in <b>chill mode</b>. Experimental mode enables <b>alpha-level features</b> that aren't ready for chill mode. Experimental features are listed below: diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index d84924e8be..2bd7e9ecc2 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -139,6 +139,26 @@ Enable this to attempt to enable radar tracks for Hyundai, Kia, and Genesis models equipped with the supported Mando SCC radar. This allows sunnypilot to use radar data for improved lead tracking and overall longitudinal performance. + + Enable ADB + + + + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. + + + + openpilot Longitudinal Control (Alpha) + openpilot纵向控制(Alpha 版) + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + 警告:此车辆的 openpilot 纵向控制功能目前处于Alpha版本,使用此功能将会停用自动紧急制动(AEB)功能。 + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + 在这辆车上,openpilot 默认使用车辆内建的主动巡航控制(ACC),而非 openpilot 的纵向控制。启用此项功能可切换至 openpilot 的纵向控制。当启用 openpilot 纵向控制 Alpha 版本时,建议同时启用实验性模式(Experimental mode)。 + DevicePanel @@ -504,10 +524,6 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. NetworkingSP - - Advanced - 高级 - Scan @@ -1410,18 +1426,6 @@ This may take up to a minute. openpilot longitudinal control may come in a future update. openpilot纵向控制可能会在未来的更新中提供。 - - openpilot Longitudinal Control (Alpha) - openpilot纵向控制(Alpha 版) - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - 警告:此车辆的 openpilot 纵向控制功能目前处于Alpha版本,使用此功能将会停用自动紧急制动(AEB)功能。 - - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - 在这辆车上,openpilot 默认使用车辆内建的主动巡航控制(ACC),而非 openpilot 的纵向控制。启用此项功能可切换至 openpilot 的纵向控制。当启用 openpilot 纵向控制 Alpha 版本时,建议同时启用实验性模式(Experimental mode)。 - Aggressive 积极 diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 88ba7c029f..5cc18511a1 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -139,6 +139,26 @@ Enable this to attempt to enable radar tracks for Hyundai, Kia, and Genesis models equipped with the supported Mando SCC radar. This allows sunnypilot to use radar data for improved lead tracking and overall longitudinal performance. + + Enable ADB + + + + ADB (Android Debug Bridge) allows connecting to your device over USB or over the network. See https://docs.comma.ai/how-to/connect-to-comma for more info. + + + + openpilot Longitudinal Control (Alpha) + openpilot 縱向控制 (Alpha 版) + + + WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). + 警告:此車輛的 openpilot 縱向控制功能目前處於 Alpha 版本,使用此功能將會停用自動緊急煞車(AEB)功能。 + + + On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. + 在這輛車上,openpilot 預設使用車輛內建的主動巡航控制(ACC),而非 openpilot 的縱向控制。啟用此項功能可切換至 openpilot 的縱向控制。當啟用 openpilot 縱向控制 Alpha 版本時,建議同時啟用實驗性模式(Experimental mode)。 + DevicePanel @@ -504,10 +524,6 @@ Pause Steering: ALC will be paused after the brake pedal is manually pressed. NetworkingSP - - Advanced - 進階 - Scan @@ -1410,18 +1426,6 @@ This may take up to a minute. openpilot longitudinal control may come in a future update. openpilot 縱向控制可能會在未來的更新中提供。 - - openpilot Longitudinal Control (Alpha) - openpilot 縱向控制 (Alpha 版) - - - WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB). - 警告:此車輛的 openpilot 縱向控制功能目前處於 Alpha 版本,使用此功能將會停用自動緊急煞車(AEB)功能。 - - - On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. - 在這輛車上,openpilot 預設使用車輛內建的主動巡航控制(ACC),而非 openpilot 的縱向控制。啟用此項功能可切換至 openpilot 的縱向控制。當啟用 openpilot 縱向控制 Alpha 版本時,建議同時啟用實驗性模式(Experimental mode)。 - Aggressive 積極 diff --git a/sunnypilot/mads/helpers.py b/sunnypilot/mads/helpers.py index 6d34757a07..3ceccfa025 100644 --- a/sunnypilot/mads/helpers.py +++ b/sunnypilot/mads/helpers.py @@ -49,7 +49,7 @@ class MadsParams: CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.DISENGAGE_LATERAL_ON_BRAKE def set_car_specific_params(self, CP, CP_SP): - if CP.carName == "hyundai": + if CP.brand == "hyundai": # TODO-SP: This should be separated from MADS module for future implementations # Use "HyundaiLongitudinalMainCruiseToggleable" param hyundai_cruise_main_toggleable = True @@ -59,5 +59,5 @@ class MadsParams: # MADS is currently not supported in Tesla due to lack of consistent states to engage controls # TODO-SP: To enable MADS for Tesla, identify consistent signals for MADS toggling - if CP.carName == "tesla": + if CP.brand == "tesla": self.params.remove("Mads") diff --git a/sunnypilot/mads/mads.py b/sunnypilot/mads/mads.py index 0e938b897d..5846dc4fda 100644 --- a/sunnypilot/mads/mads.py +++ b/sunnypilot/mads/mads.py @@ -56,7 +56,7 @@ class ModularAssistiveDrivingSystem: self.events = self.selfdrive.events self.events_sp = self.selfdrive.events_sp - if self.selfdrive.CP.carName == "hyundai": + if self.selfdrive.CP.brand == "hyundai": if (self.selfdrive.CP_SP.flags & HyundaiFlagsSP.HAS_LFA_BUTTON) or \ (self.selfdrive.CP.flags & HyundaiFlags.CANFD): self.allow_always = True diff --git a/sunnypilot/modeld/modeld.py b/sunnypilot/modeld/modeld.py index ff5b83def4..487d1fd842 100755 --- a/sunnypilot/modeld/modeld.py +++ b/sunnypilot/modeld/modeld.py @@ -182,7 +182,7 @@ def main(demo=False): else: CP = messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams) - cloudlog.info("modeld got CarParams: %s", CP.carName) + cloudlog.info("modeld got CarParams: %s", CP.brand) # TODO this needs more thought, use .2s extra for now to estimate other delays steer_delay = CP.steerActuatorDelay + .2 diff --git a/sunnypilot/selfdrive/car/car_specific.py b/sunnypilot/selfdrive/car/car_specific.py index a8ad11ae30..057f79cf0c 100644 --- a/sunnypilot/selfdrive/car/car_specific.py +++ b/sunnypilot/selfdrive/car/car_specific.py @@ -27,7 +27,7 @@ class CarSpecificEventsSP: def update(self): events = EventsSP() - if self.CP.carName == 'hyundai': + if self.CP.brand == 'hyundai': if self.hyundai_radar_tracks and not self.hyundai_radar_tracks_confirmed: events.add(EventNameSP.hyundaiRadarTracksConfirmed) diff --git a/sunnypilot/selfdrive/car/interfaces.py b/sunnypilot/selfdrive/car/interfaces.py index a41ec16a46..375ce7fa7f 100644 --- a/sunnypilot/selfdrive/car/interfaces.py +++ b/sunnypilot/selfdrive/car/interfaces.py @@ -19,11 +19,11 @@ def log_fingerprint(CP: structs.CarParams) -> None: if CP.carFingerprint == "MOCK": sentry.capture_fingerprint_mock() else: - sentry.capture_fingerprint(CP.carFingerprint, CP.carName) + sentry.capture_fingerprint(CP.carFingerprint, CP.brand) def setup_car_interface_sp(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params): - if CP.carName == 'hyundai': + if CP.brand == 'hyundai': if CP.flags & HyundaiFlags.MANDO_RADAR and CP.radarUnavailable: # Having this automatic without a toggle causes a weird process replay diff because # somehow it sees fewer logs than intended @@ -35,7 +35,7 @@ def setup_car_interface_sp(CP: structs.CarParams, CP_SP: structs.CarParamsSP, pa def initialize_car_interface_sp(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params, can_recv: CanRecvCallable, can_send: CanSendCallable): - if CP.carName == 'hyundai': + if CP.brand == 'hyundai': if CP_SP.flags & HyundaiFlagsSP.ENABLE_RADAR_TRACKS: can_recv() _, fingerprint = can_fingerprint(can_recv) diff --git a/system/camerad/cameras/camera_qcom2.cc b/system/camerad/cameras/camera_qcom2.cc index 72dfa5e2c3..dc388f1e36 100644 --- a/system/camerad/cameras/camera_qcom2.cc +++ b/system/camerad/cameras/camera_qcom2.cc @@ -55,7 +55,7 @@ public: float fl_pix = 0; - CameraState(SpectraMaster *master, const CameraConfig &config) : camera(master, config, config.stream_type == VISION_STREAM_ROAD) {}; + CameraState(SpectraMaster *master, const CameraConfig &config) : camera(master, config, true /*config.stream_type == VISION_STREAM_ROAD*/) {}; ~CameraState(); void init(VisionIpcServer *v, cl_device_id device_id, cl_context ctx); void update_exposure_score(float desired_ev, int exp_t, int exp_g_idx, float exp_gain); @@ -97,7 +97,7 @@ void CameraState::set_exposure_rect() { }; int h_ref = 1208; /* - exposure target intrinics is + exposure target intrinsics is [ [F, 0, 0.5*ae_xywh[2]] [0, F, 0.5*H-ae_xywh[1]] @@ -127,6 +127,8 @@ void CameraState::update_exposure_score(float desired_ev, int exp_t, int exp_g_i void CameraState::set_camera_exposure(float grey_frac) { if (!camera.enabled) return; + std::vector target_grey_minimums = {0.1, 0.1, 0.125}; // wide, road, driver + const float dt = 0.05; const float ts_grey = 10.0; @@ -143,8 +145,8 @@ void CameraState::set_camera_exposure(float grey_frac) { const auto &sensor = camera.sensor; const float cur_ev_ = cur_ev[camera.buf.cur_frame_data.frame_id % 3] * sensor->ev_scale; - // Scale target grey between 0.1 and 0.4 depending on lighting conditions - float new_target_grey = std::clamp(0.4 - 0.3 * log2(1.0 + sensor->target_grey_factor*cur_ev_) / log2(6000.0), 0.1, 0.4); + // Scale target grey between min and 0.4 depending on lighting conditions + float new_target_grey = std::clamp(0.4 - 0.3 * log2(1.0 + sensor->target_grey_factor*cur_ev_) / log2(6000.0), target_grey_minimums[camera.cc.camera_num], 0.4); float target_grey = (1.0 - k_grey) * target_grey_fraction + k_grey * new_target_grey; float desired_ev = std::clamp(cur_ev_ / sensor->ev_scale * target_grey / grey_frac, sensor->min_ev, sensor->max_ev); diff --git a/system/camerad/cameras/ife.h b/system/camerad/cameras/ife.h index c06aab1a5e..a0ffcfa1b5 100644 --- a/system/camerad/cameras/ife.h +++ b/system/camerad/cameras/ife.h @@ -1,3 +1,5 @@ +#pragma once + #include "cdm.h" #include "system/camerad/cameras/tici.h" diff --git a/system/camerad/cameras/spectra.cc b/system/camerad/cameras/spectra.cc index b347673b4f..267159107e 100644 --- a/system/camerad/cameras/spectra.cc +++ b/system/camerad/cameras/spectra.cc @@ -258,6 +258,10 @@ int SpectraCamera::clear_req_queue() { req_mgr_flush_request.flush_type = CAM_REQ_MGR_FLUSH_TYPE_ALL; int ret = do_cam_control(m->video0_fd, CAM_REQ_MGR_FLUSH_REQ, &req_mgr_flush_request, sizeof(req_mgr_flush_request)); // LOGD("flushed all req: %d", ret); + + for (int i = 0; i < MAX_IFE_BUFS; ++i) { + destroySyncObjectAt(i); + } return ret; } @@ -689,16 +693,7 @@ void SpectraCamera::enqueue_buffer(int i, bool dp) { buf.queue(i); } - // destroy old output fence - for (auto so : {sync_objs, sync_objs_bps_out}) { - if (so[i] == 0) continue; - struct cam_sync_info sync_destroy = {0}; - sync_destroy.sync_obj = so[i]; - ret = do_sync_control(m->cam_sync_fd, CAM_SYNC_DESTROY, &sync_destroy, sizeof(sync_destroy)); - if (ret != 0) { - LOGE("failed to destroy sync object: %d %d", ret, sync_destroy.sync_obj); - } - } + destroySyncObjectAt(i); } // create output fences @@ -736,6 +731,23 @@ void SpectraCamera::enqueue_buffer(int i, bool dp) { config_bps(i, request_id); } +void SpectraCamera::destroySyncObjectAt(int index) { + auto destroy_sync_obj = [](int cam_sync_fd, int32_t &sync_obj) { + if (sync_obj == 0) return; + + struct cam_sync_info sync_destroy = {.sync_obj = sync_obj}; + int ret = do_sync_control(cam_sync_fd, CAM_SYNC_DESTROY, &sync_destroy, sizeof(sync_destroy)); + if (ret != 0) { + LOGE("Failed to destroy sync object: %d, sync_obj: %d", ret, sync_destroy.sync_obj); + } + + sync_obj = 0; // Reset the sync object to 0 + }; + + destroy_sync_obj(m->cam_sync_fd, sync_objs[index]); + destroy_sync_obj(m->cam_sync_fd, sync_objs_bps_out[index]); +} + void SpectraCamera::camera_map_bufs() { int ret; for (int i = 0; i < ife_buf_depth; i++) { diff --git a/system/camerad/cameras/spectra.h b/system/camerad/cameras/spectra.h index 689fcb9cc3..fd68a4f995 100644 --- a/system/camerad/cameras/spectra.h +++ b/system/camerad/cameras/spectra.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -72,10 +73,21 @@ public: class SpectraBuf { public: + SpectraBuf() = default; + + ~SpectraBuf() { + if (video_fd >= 0 && ptr) { + munmap(ptr, mmap_size); + release(video_fd, handle); + } + } + void init(SpectraMaster *m, int s, int a, int flags, int mmu_hdl = 0, int mmu_hdl2 = 0, int count=1) { + video_fd = m->video0_fd; size = s; alignment = a; - void *p = alloc_w_mmu_hdl(m->video0_fd, ALIGNED_SIZE(size, alignment)*count, (uint32_t*)&handle, alignment, flags, mmu_hdl, mmu_hdl2); + mmap_size = aligned_size() * count; + void *p = alloc_w_mmu_hdl(video_fd, mmap_size, (uint32_t*)&handle, alignment, flags, mmu_hdl, mmu_hdl2); ptr = (unsigned char*)p; assert(ptr != NULL); }; @@ -84,8 +96,9 @@ public: return ALIGNED_SIZE(size, alignment); }; - unsigned char *ptr; - int size, alignment, handle; + int video_fd = -1; + unsigned char *ptr = nullptr; + int size = 0, alignment = 0, handle = 0, mmap_size = 0; }; class SpectraCamera { @@ -114,6 +127,7 @@ public: void configICP(); void configCSIPHY(); void linkDevices(); + void destroySyncObjectAt(int index); // *** state *** diff --git a/system/hardware/tici/agnos.json b/system/hardware/tici/agnos.json index d5002159d7..15470a1634 100644 --- a/system/hardware/tici/agnos.json +++ b/system/hardware/tici/agnos.json @@ -1,9 +1,9 @@ [ { "name": "boot", - "url": "https://commadist.azureedge.net/agnosupdate/boot-62d10fad3f057dad70a803c74b584296120ed4216a6b67c83f052f0186f73e50.img.xz", - "hash": "62d10fad3f057dad70a803c74b584296120ed4216a6b67c83f052f0186f73e50", - "hash_raw": "62d10fad3f057dad70a803c74b584296120ed4216a6b67c83f052f0186f73e50", + "url": "https://commadist.azureedge.net/agnosupdate/boot-5679a04c7cb08ab2f6bdb26b7f807d2a5819d2055151a9d3c89e65c7f24a85d8.img.xz", + "hash": "5679a04c7cb08ab2f6bdb26b7f807d2a5819d2055151a9d3c89e65c7f24a85d8", + "hash_raw": "5679a04c7cb08ab2f6bdb26b7f807d2a5819d2055151a9d3c89e65c7f24a85d8", "size": 16422912, "sparse": false, "full_check": true, @@ -11,9 +11,9 @@ }, { "name": "system", - "url": "https://commadist.azureedge.net/agnosupdate/system-70c493b8407ba3e315807042448cd957bcf53e81014440195e3dfd25fd60f53c.img.xz", - "hash": "70c493b8407ba3e315807042448cd957bcf53e81014440195e3dfd25fd60f53c", - "hash_raw": "70c493b8407ba3e315807042448cd957bcf53e81014440195e3dfd25fd60f53c", + "url": "https://commadist.azureedge.net/agnosupdate/system-5a11d6b2588ddb562b69cf2c27d7a8feae2ef0693f73a01cf6536b2cd9a09a29.img.xz", + "hash": "5a11d6b2588ddb562b69cf2c27d7a8feae2ef0693f73a01cf6536b2cd9a09a29", + "hash_raw": "5a11d6b2588ddb562b69cf2c27d7a8feae2ef0693f73a01cf6536b2cd9a09a29", "size": 4404019200, "sparse": false, "full_check": false, diff --git a/system/hardware/tici/hardware.h b/system/hardware/tici/hardware.h index fcfb07830a..00e7950ba2 100644 --- a/system/hardware/tici/hardware.h +++ b/system/hardware/tici/hardware.h @@ -61,20 +61,11 @@ public: static void reboot() { std::system("sudo reboot"); } static void poweroff() { std::system("sudo poweroff"); } static void set_brightness(int percent) { - std::string max = util::read_file("/sys/class/backlight/panel0-backlight/max_brightness"); - - std::ofstream brightness_control("/sys/class/backlight/panel0-backlight/brightness"); - if (brightness_control.is_open()) { - brightness_control << (int)(percent * (std::stof(max)/100.)) << "\n"; - brightness_control.close(); - } + float max = std::stof(util::read_file("/sys/class/backlight/panel0-backlight/max_brightness")); + std::ofstream("/sys/class/backlight/panel0-backlight/brightness") << int(percent * (max / 100.0f)) << "\n"; } static void set_display_power(bool on) { - std::ofstream bl_power_control("/sys/class/backlight/panel0-backlight/bl_power"); - if (bl_power_control.is_open()) { - bl_power_control << (on ? "0" : "4") << "\n"; - bl_power_control.close(); - } + std::ofstream("/sys/class/backlight/panel0-backlight/bl_power") << (on ? "0" : "4") << "\n"; } static void set_ir_power(int percent) { @@ -85,18 +76,8 @@ public: } int value = util::map_val(std::clamp(percent, 0, 100), 0, 100, 0, 255); - - std::ofstream torch_brightness("/sys/class/leds/led:torch_2/brightness"); - if (torch_brightness.is_open()) { - torch_brightness << value << "\n"; - torch_brightness.close(); - } - - std::ofstream switch_brightness("/sys/class/leds/led:switch_2/brightness"); - if (switch_brightness.is_open()) { - switch_brightness << value << "\n"; - switch_brightness.close(); - } + std::ofstream("/sys/class/leds/led:torch_2/brightness") << value << "\n"; + std::ofstream("/sys/class/leds/led:switch_2/brightness") << value << "\n"; } static std::map get_init_logs() { diff --git a/system/hardware/tici/hardware.py b/system/hardware/tici/hardware.py index 3409888b9d..dd3f36963c 100644 --- a/system/hardware/tici/hardware.py +++ b/system/hardware/tici/hardware.py @@ -205,6 +205,8 @@ class Tici(HardwareBase): return str(self.get_modem().Get(MM_MODEM, 'EquipmentIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) def get_network_info(self): + if self.get_device_type() == "mici": + return None try: modem = self.get_modem() info = modem.Command("AT+QNWINFO", math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) @@ -295,6 +297,8 @@ class Tici(HardwareBase): return None def get_modem_temperatures(self): + if self.get_device_type() == "mici": + return [] timeout = 0.2 # Default timeout is too short try: modem = self.get_modem() diff --git a/system/hardware/tici/tests/test_power_draw.py b/system/hardware/tici/tests/test_power_draw.py index e1b9845c4c..9835660327 100644 --- a/system/hardware/tici/tests/test_power_draw.py +++ b/system/hardware/tici/tests/test_power_draw.py @@ -31,7 +31,7 @@ class Proc: PROCS = [ - Proc(['camerad'], 1.75, msgs=['roadCameraState', 'wideRoadCameraState', 'driverCameraState']), + Proc(['camerad'], 2.1, msgs=['roadCameraState', 'wideRoadCameraState', 'driverCameraState']), Proc(['modeld'], 1.12, atol=0.2, msgs=['modelV2']), Proc(['dmonitoringmodeld'], 0.6, msgs=['driverStateV2']), Proc(['encoderd'], 0.23, msgs=[]), diff --git a/system/loggerd/encoder/encoder.cc b/system/loggerd/encoder/encoder.cc index a936d32b6e..e9fdc9c98c 100644 --- a/system/loggerd/encoder/encoder.cc +++ b/system/loggerd/encoder/encoder.cc @@ -33,7 +33,7 @@ void VideoEncoder::publisher_publish(int segment_num, uint32_t idx, VisionIpcBuf edata.setSegmentId(idx); edata.setFlags(flags); edata.setLen(dat.size()); - edat.setData(dat); + edat.adoptData(msg.getOrphanage().referenceExternalData(dat)); edat.setWidth(out_width); edat.setHeight(out_height); if (flags & V4L2_BUF_FLAG_KEYFRAME) edat.setHeader(header); diff --git a/system/manager/process_config.py b/system/manager/process_config.py index c23c6ca248..4473b77960 100644 --- a/system/manager/process_config.py +++ b/system/manager/process_config.py @@ -108,7 +108,7 @@ procs = [ NativeProcess("ui", "selfdrive/ui", ["./ui"], always_run, watchdog_max_dt=(5 if not PC else None)), PythonProcess("soundd", "selfdrive.ui.soundd", only_onroad), PythonProcess("locationd", "selfdrive.locationd.locationd", only_onroad), - NativeProcess("pandad", "selfdrive/pandad", ["./pandad"], always_run, enabled=False), + NativeProcess("_pandad", "selfdrive/pandad", ["./pandad"], always_run, enabled=False), PythonProcess("calibrationd", "selfdrive.locationd.calibrationd", only_onroad), PythonProcess("torqued", "selfdrive.locationd.torqued", only_onroad), PythonProcess("controlsd", "selfdrive.controls.controlsd", and_(not_joystick, iscar)), diff --git a/system/manager/test/test_manager.py b/system/manager/test/test_manager.py index b6f47fb75f..9c0b664006 100644 --- a/system/manager/test/test_manager.py +++ b/system/manager/test/test_manager.py @@ -7,7 +7,7 @@ from cereal import car from openpilot.common.params import Params import openpilot.system.manager.manager as manager from openpilot.system.manager.process import ensure_running -from openpilot.system.manager.process_config import managed_processes +from openpilot.system.manager.process_config import managed_processes, procs from openpilot.system.hardware import HARDWARE os.environ['FAKEUPLOAD'] = "1" @@ -31,6 +31,9 @@ class TestManager: os.environ['PREPAREONLY'] = '1' manager.main() + def test_duplicate_procs(self): + assert len(procs) == len(managed_processes), "Duplicate process names" + def test_blacklisted_procs(self): # TODO: ensure there are blacklisted procs until we have a dedicated test assert len(BLACKLIST_PROCS), "No blacklisted procs to test not_run" diff --git a/system/sensord/tests/test_sensord.py b/system/sensord/tests/test_sensord.py index 1871012dd6..15f1f2dc35 100644 --- a/system/sensord/tests/test_sensord.py +++ b/system/sensord/tests/test_sensord.py @@ -9,6 +9,7 @@ from cereal import log from cereal.services import SERVICE_LIST from openpilot.common.gpio import get_irqs_for_action from openpilot.common.timeout import Timeout +from openpilot.system.hardware import HARDWARE from openpilot.system.manager.process_config import managed_processes BMX = { @@ -29,12 +30,17 @@ MMC = { ('mmc5603nj', 'magneticUncalibrated'), } -SENSOR_CONFIGURATIONS = ( - (BMX | LSM), - (MMC | LSM), - (BMX | LSM_C), - (MMC| LSM_C), -) +SENSOR_CONFIGURATIONS: list[set] = [ + BMX | LSM, + MMC | LSM, + BMX | LSM_C, + MMC| LSM_C, +] +if HARDWARE.get_device_type() == "mici": + SENSOR_CONFIGURATIONS = [ + LSM, + LSM_C, + ] Sensor = log.SensorEventData.SensorSource SensorConfig = namedtuple('SensorConfig', ['type', 'sanity_min', 'sanity_max']) diff --git a/system/ubloxd/ubloxd.cc b/system/ubloxd/ubloxd.cc index 668c1a7ec0..4e7e91f830 100644 --- a/system/ubloxd/ubloxd.cc +++ b/system/ubloxd/ubloxd.cc @@ -26,9 +26,6 @@ int main() { while (!do_exit) { std::unique_ptr msg(subscriber->receive()); if (!msg) { - if (errno == EINTR) { - do_exit = true; - } continue; } diff --git a/system/updated/updated.py b/system/updated/updated.py index a1a74c322c..0759c0a7aa 100755 --- a/system/updated/updated.py +++ b/system/updated/updated.py @@ -172,7 +172,7 @@ def init_overlay() -> None: run(["sudo"] + mount_cmd) run(["sudo", "chmod", "755", os.path.join(OVERLAY_METADATA, "work")]) - git_diff = run(["git", "diff"], OVERLAY_MERGED) + git_diff = run(["git", "diff", "--submodule=diff"], OVERLAY_MERGED) params.put("GitDiff", git_diff) cloudlog.info(f"git diff output:\n{git_diff}") diff --git a/tools/op.sh b/tools/op.sh index f0f1308d44..12d998cb64 100755 --- a/tools/op.sh +++ b/tools/op.sh @@ -337,6 +337,27 @@ function op_switch() { git submodule foreach git clean -df } +function op_start() { + if [[ -f "/AGNOS" ]]; then + op_before_cmd + op_run_command sudo systemctl start comma $@ + fi +} + +function op_stop() { + if [[ -f "/AGNOS" ]]; then + op_before_cmd + op_run_command sudo systemctl stop comma $@ + fi +} + +function op_restart() { + if [[ -f "/AGNOS" ]]; then + op_before_cmd + op_run_command sudo systemctl restart comma $@ + fi +} + function op_default() { echo "An openpilot helper" echo "" @@ -359,6 +380,9 @@ function op_default() { echo -e " ${BOLD}build${NC} Run the openpilot build system in the current working directory" echo -e " ${BOLD}install${NC} Install the 'op' tool system wide" echo -e " ${BOLD}switch${NC} Switch to a different git branch with a clean slate (nukes any changes)" + echo -e " ${BOLD}start${NC} Starts openpilot" + echo -e " ${BOLD}stop${NC} Stops openpilot" + echo -e " ${BOLD}restart${NC} Restarts openpilot" echo "" echo -e "${BOLD}${UNDERLINE}Commands [Tooling]:${NC}" echo -e " ${BOLD}juggle${NC} Run PlotJuggler" @@ -415,6 +439,9 @@ function _op() { sim ) shift 1; op_sim "$@" ;; install ) shift 1; op_install "$@" ;; switch ) shift 1; op_switch "$@" ;; + start ) shift 1; op_start "$@" ;; + stop ) shift 1; op_stop "$@" ;; + restart ) shift 1; op_restart "$@" ;; post-commit ) shift 1; op_install_post_commit "$@" ;; * ) op_default "$@" ;; esac diff --git a/tools/plotjuggler/juggle.py b/tools/plotjuggler/juggle.py index 6f52e70006..7ca5c3641e 100755 --- a/tools/plotjuggler/juggle.py +++ b/tools/plotjuggler/juggle.py @@ -85,7 +85,7 @@ def juggle_route(route_or_segment_name, can, layout, dbc=None): if dbc is None: for cp in [m for m in all_data if m.which() == 'carParams']: try: - DBC = __import__(f"opendbc.car.{cp.carParams.carName}.values", fromlist=['DBC']).DBC + DBC = __import__(f"opendbc.car.{cp.carParams.brand}.values", fromlist=['DBC']).DBC fingerprint = cp.carParams.carFingerprint dbc = DBC[MIGRATION.get(fingerprint, fingerprint)]['pt'] except Exception: diff --git a/uv.lock b/uv.lock index 34ad0f580f..f5e8fd8666 100644 --- a/uv.lock +++ b/uv.lock @@ -313,11 +313,11 @@ wheels = [ [[package]] name = "codespell" -version = "2.3.0" +version = "2.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a0/a9/98353dfc7afcdf18cffd2dd3e959a25eaaf2728cf450caa59af89648a8e4/codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f", size = 329791 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/2f/706691245790ae6c63252d48b7ff5e3635951d55b3ce3c0ac13d898bf70b/codespell-2.4.0.tar.gz", hash = "sha256:587d45b14707fb8ce51339ba4cce50ae0e98ce228ef61f3c5e160e34f681be58", size = 344743 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/20/b6019add11e84f821184234cea0ad91442373489ef7ccfa3d73a71b908fa/codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1", size = 329167 }, + { url = "https://files.pythonhosted.org/packages/19/ce/39bfb82aa428a3ac4d94cc8c9faa3eadeadb2606eee3b584f68d9b575b43/codespell-2.4.0-py3-none-any.whl", hash = "sha256:b4c5b779f747dd481587aeecb5773301183f52b94b96ed51a28126d0482eec1d", size = 344508 }, ] [[package]] @@ -524,45 +524,45 @@ wheels = [ [[package]] name = "filelock" -version = "3.16.1" +version = "3.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } +sdist = { url = "https://files.pythonhosted.org/packages/dc/9c/0b15fb47b464e1b663b1acd1253a062aa5feecb07d4e597daea542ebd2b5/filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e", size = 18027 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, + { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 }, ] [[package]] name = "flatbuffers" -version = "24.12.23" +version = "25.1.21" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/83/9ae01534f7e92a0c04f86586a0d62a4a0266e51d8bb2bfd5b8ea8165abba/flatbuffers-24.12.23.tar.gz", hash = "sha256:2910b0bc6ae9b6db78dd2b18d0b7a0709ba240fb5585f286a3a2b30785c22dac", size = 22164 } +sdist = { url = "https://files.pythonhosted.org/packages/01/b2/efb0e62687d09538f60b83e82143d25ff4b4b097da9807e23648c723983c/flatbuffers-25.1.21.tar.gz", hash = "sha256:e24a34dcd9fb4e0ea8cc0fc8ef9c5cd61c9d21527a6d536967587a37a4ff9676", size = 22163 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/b4/31c461eef98b96b8ab736d97274548eaf2b2e349bf09e4de3902f7d53084/flatbuffers-24.12.23-py2.py3-none-any.whl", hash = "sha256:c418e0d48890f4142b92fd3e343e73a48f194e1f80075ddcc5793779b3585444", size = 30962 }, + { url = "https://files.pythonhosted.org/packages/55/75/ed93520bceceabd78305717b3500224625f92e03617ba1f8e08d60e8eefb/flatbuffers-25.1.21-py2.py3-none-any.whl", hash = "sha256:0e9736098ba8f4e48246a0640390f4992c0b1a734e7322a9463d5c3eea00558b", size = 30956 }, ] [[package]] name = "fonttools" -version = "4.55.3" +version = "4.55.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/61/a300d1574dc381393424047c0396a0e213db212e28361123af9830d71a8d/fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45", size = 3498155 } +sdist = { url = "https://files.pythonhosted.org/packages/13/8d/8912cdde6a2b4c19ced69ea5790cd17d1c095a3c0104c1c936a1de804a64/fonttools-4.55.4.tar.gz", hash = "sha256:9598af0af85073659facbe9612fcc56b071ef2f26e3819ebf9bd8c5d35f958c5", size = 3498560 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/18/14be25545600bd100e5b74a3ac39089b7c1cb403dc513b7ca348be3381bf/fonttools-4.55.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c4491699bad88efe95772543cd49870cf756b019ad56294f6498982408ab03e", size = 2771005 }, - { url = "https://files.pythonhosted.org/packages/b2/51/2e1a5d3871cd7c2ae2054b54e92604e7d6abc3fd3656e9583c399648fe1c/fonttools-4.55.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5323a22eabddf4b24f66d26894f1229261021dacd9d29e89f7872dd8c63f0b8b", size = 2300654 }, - { url = "https://files.pythonhosted.org/packages/73/1a/50109bb2703bc6f774b52ea081db21edf2a9fa4b6d7485faadf9d1b997e9/fonttools-4.55.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5480673f599ad410695ca2ddef2dfefe9df779a9a5cda89503881e503c9c7d90", size = 4877541 }, - { url = "https://files.pythonhosted.org/packages/5d/52/c0b9857fa075da1b8806c5dc2d8342918a8cc2065fd14fbddb3303282693/fonttools-4.55.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da9da6d65cd7aa6b0f806556f4985bcbf603bf0c5c590e61b43aa3e5a0f822d0", size = 4906304 }, - { url = "https://files.pythonhosted.org/packages/0b/1b/55f85c7e962d295e456d5209581c919620ee3e877b95cd86245187a5050f/fonttools-4.55.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e894b5bd60d9f473bed7a8f506515549cc194de08064d829464088d23097331b", size = 4888087 }, - { url = "https://files.pythonhosted.org/packages/83/13/6f2809c612ea2ac51391f92468ff861c63473601530fca96458b453212bf/fonttools-4.55.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aee3b57643827e237ff6ec6d28d9ff9766bd8b21e08cd13bff479e13d4b14765", size = 5056958 }, - { url = "https://files.pythonhosted.org/packages/c1/28/d0ea9e872fa4208b9dfca686e1dd9ca22f6c9ef33ecff2f0ebc2dbe7c29b/fonttools-4.55.3-cp311-cp311-win32.whl", hash = "sha256:eb6ca911c4c17eb51853143624d8dc87cdcdf12a711fc38bf5bd21521e79715f", size = 2173939 }, - { url = "https://files.pythonhosted.org/packages/be/36/d74ae1020bc41a1dff3e6f5a99f646563beecb97e386d27abdac3ba07650/fonttools-4.55.3-cp311-cp311-win_amd64.whl", hash = "sha256:6314bf82c54c53c71805318fcf6786d986461622dd926d92a465199ff54b1b72", size = 2220363 }, - { url = "https://files.pythonhosted.org/packages/89/58/fbcf5dff7e3ea844bb00c4d806ca1e339e1f2dce5529633bf4842c0c9a1f/fonttools-4.55.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9e736f60f4911061235603a6119e72053073a12c6d7904011df2d8fad2c0e35", size = 2765380 }, - { url = "https://files.pythonhosted.org/packages/81/dd/da6e329e51919b4f421c8738f3497e2ab08c168e76aaef7b6d5351862bdf/fonttools-4.55.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a8aa2c5e5b8b3bcb2e4538d929f6589a5c6bdb84fd16e2ed92649fb5454f11c", size = 2297940 }, - { url = "https://files.pythonhosted.org/packages/00/44/f5ee560858425c99ef07e04919e736db09d6416408e5a8d3bbfb4a6623fd/fonttools-4.55.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07f8288aacf0a38d174445fc78377a97fb0b83cfe352a90c9d9c1400571963c7", size = 4793327 }, - { url = "https://files.pythonhosted.org/packages/24/da/0a001926d791c55e29ac3c52964957a20dbc1963615446b568b7432891c3/fonttools-4.55.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8d5e8916c0970fbc0f6f1bece0063363bb5857a7f170121a4493e31c3db3314", size = 4865624 }, - { url = "https://files.pythonhosted.org/packages/3d/d8/1edd8b13a427a9fb6418373437caa586c0caa57f260af8e0548f4d11e340/fonttools-4.55.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae3b6600565b2d80b7c05acb8e24d2b26ac407b27a3f2e078229721ba5698427", size = 4774166 }, - { url = "https://files.pythonhosted.org/packages/9c/ec/ade054097976c3d6debc9032e09a351505a0196aa5493edf021be376f75e/fonttools-4.55.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:54153c49913f45065c8d9e6d0c101396725c5621c8aee744719300f79771d75a", size = 5001832 }, - { url = "https://files.pythonhosted.org/packages/e2/cd/233f0e31ad799bb91fc78099c8b4e5ec43b85a131688519640d6bae46f6a/fonttools-4.55.3-cp312-cp312-win32.whl", hash = "sha256:827e95fdbbd3e51f8b459af5ea10ecb4e30af50221ca103bea68218e9615de07", size = 2162228 }, - { url = "https://files.pythonhosted.org/packages/46/45/a498b5291f6c0d91b2394b1ed7447442a57d1c9b9cf8f439aee3c316a56e/fonttools-4.55.3-cp312-cp312-win_amd64.whl", hash = "sha256:e6e8766eeeb2de759e862004aa11a9ea3d6f6d5ec710551a88b476192b64fd54", size = 2209118 }, - { url = "https://files.pythonhosted.org/packages/99/3b/406d17b1f63e04a82aa621936e6e1c53a8c05458abd66300ac85ea7f9ae9/fonttools-4.55.3-py3-none-any.whl", hash = "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977", size = 1111638 }, + { url = "https://files.pythonhosted.org/packages/5c/22/cf0707f681486bf91f998c3a6a6492d806d1cf09445ce01b26a724917439/fonttools-4.55.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1605b28165c785bf26c2cbd205dc0822463e3f9f56f187049eb214dc5f4a59cb", size = 2775483 }, + { url = "https://files.pythonhosted.org/packages/09/79/11a07753a7b9ef46eaaa5e85b72558095713060aeca1393057a081fb21e3/fonttools-4.55.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d851d8b2fdb676507365d1430c3285d62c4039d0d7760d8cf2f2e5ea3aa19d73", size = 2303701 }, + { url = "https://files.pythonhosted.org/packages/93/67/173994471ddb0ff8cd45b0a2ff9fa03416152ca90bd14d1cbe1ff75fb66c/fonttools-4.55.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fb3cf1cddf08cec0338f238f950cb76fabab23a324a579e3e1f9b2ef2578329", size = 4891469 }, + { url = "https://files.pythonhosted.org/packages/16/b9/22e8be0fceaed86187ba35a1035b309e47575c68ee6ace3b66f146300f43/fonttools-4.55.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddd3208b06186ca00fbd329c0d0fed5ba209c99017cc46e2c4ea42233c2fbd00", size = 4920672 }, + { url = "https://files.pythonhosted.org/packages/cc/15/ed0f0a9d303419e7c885b3a71bfe70bb71c8f964e5b1d515056e38551c69/fonttools-4.55.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9bd98819cb585a894dda9dcb337afeb2601abf17da17de7bfbfc1bc2e4a062c7", size = 4899903 }, + { url = "https://files.pythonhosted.org/packages/b5/02/bd0da57dac3f44f37898b058659cf3beedbfd89b7d0f4b10761c9602dc1b/fonttools-4.55.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4877376c10541e8dccf14876c8476d5082338fa5d21103894894382cc245144b", size = 5067979 }, + { url = "https://files.pythonhosted.org/packages/a0/b9/c232b07c0ecaba9e522695780ca8d711b099bf87889a19a6b35a4ebfde90/fonttools-4.55.4-cp311-cp311-win32.whl", hash = "sha256:3a5e466894ec6d8a009b0eb8e02a6eb26959a318d5b7a906280c26bdadce6423", size = 2176681 }, + { url = "https://files.pythonhosted.org/packages/e3/50/2aa1cf2492e6aded4320122aed690268e97076aba1f418c0b4c68fb11a50/fonttools-4.55.4-cp311-cp311-win_amd64.whl", hash = "sha256:f595129e6f9c6402965d6295fe8c18c1945d27af0f90bdb52ff426226e647afc", size = 2223239 }, + { url = "https://files.pythonhosted.org/packages/7a/ee/c7f06da45f60c076677291470599eb9f8aae6605cbfbebbcb8ee12428e26/fonttools-4.55.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b3db72ad2d26a0e9ec694cbfb4485a8da9c095d29f66561cf935dbd19f3efcea", size = 2769913 }, + { url = "https://files.pythonhosted.org/packages/d9/a9/19aa6a9685d0bb285678850bfa22365a8376c590a7aaacc9f03d3a43beaa/fonttools-4.55.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87717808fd5953588c3ffaf512e8cab0e43c09c1da04e42ba87fa4c07d8170c7", size = 2301168 }, + { url = "https://files.pythonhosted.org/packages/00/63/88740f4333008336844aadbc9f7ef85d50e2eed779a5c33e13907a2439eb/fonttools-4.55.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f49dac626ad5bc1a0147b88e6157e3211fd440d00007f0da6c9e5f91dd5cb88e", size = 4806195 }, + { url = "https://files.pythonhosted.org/packages/7b/fa/1d103fe6e9bf174afd1c04772ca4f88e8f577f44d37b7cc8644fe5ff2620/fonttools-4.55.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d0ac8656ada8b604ae5da15d9aa075232f2181b95b51a3a2a55195222df7e7", size = 4877282 }, + { url = "https://files.pythonhosted.org/packages/b8/53/1cdd447f30598950e4bf8a2de8cd1f6573e6cb34b726cf23713a3cd8fb1e/fonttools-4.55.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:013c8b45873fa77a4ff6d25e43fecf1046cb7e8c6b32f1843117f98f3f8eac60", size = 4784688 }, + { url = "https://files.pythonhosted.org/packages/71/21/edfdcd85c1cce918d410909759a8db667f95bf3faed88141b1abfa2cefe1/fonttools-4.55.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94caad375d254a0332926512f06791f5e66c24a913ebecd6178b14f61d27c62f", size = 5012253 }, + { url = "https://files.pythonhosted.org/packages/7d/e7/7c16717b75e40f735e01d899ee152a0573e90be0e6b8fc2d47c16ba8239c/fonttools-4.55.4-cp312-cp312-win32.whl", hash = "sha256:cb3eb4bf3a0c4e431e1ccab7a33ef4f1bb32657133fff4a61dc4fcbd54b94d29", size = 2165283 }, + { url = "https://files.pythonhosted.org/packages/50/ff/85d1c1d396a3ceaabcf7cb543da56d2223d9b76429bafd6c87f4a4e880df/fonttools-4.55.4-cp312-cp312-win_amd64.whl", hash = "sha256:6914269f6ff6b20c6b5a9b19d0b752880bd8ee218d9a7d6afe9960bbf1922d98", size = 2212080 }, + { url = "https://files.pythonhosted.org/packages/f3/5d/29b126e12df844432e188d19e74f47c2578fa5a72a122b4f41819e1e0923/fonttools-4.55.4-py3-none-any.whl", hash = "sha256:d07ad8f31038c6394a0945752458313367a0ef8125d284ee59f99e68393a3c2d", size = 1111964 }, ] [[package]] @@ -1244,19 +1244,19 @@ wheels = [ [[package]] name = "opencv-python-headless" -version = "4.10.0.84" +version = "4.11.0.86" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/7e/d20f68a5f1487adf19d74378d349932a386b1ece3be9be9915e5986db468/opencv-python-headless-4.10.0.84.tar.gz", hash = "sha256:f2017c6101d7c2ef8d7bc3b414c37ff7f54d64413a1847d89970b6b7069b4e1a", size = 95117755 } +sdist = { url = "https://files.pythonhosted.org/packages/36/2f/5b2b3ba52c864848885ba988f24b7f105052f68da9ab0e693cc7c25b0b30/opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798", size = 95177929 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/9b/583c8d9259f6fc19413f83fd18dd8e6cbc8eefb0b4dc6da52dd151fe3272/opencv_python_headless-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:a4f4bcb07d8f8a7704d9c8564c224c8b064c63f430e95b61ac0bffaa374d330e", size = 54835657 }, - { url = "https://files.pythonhosted.org/packages/c0/7b/b4c67f5dad7a9a61c47f7a39e4050e8a4628bd64b3c3daaeb755d759f928/opencv_python_headless-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:5ae454ebac0eb0a0b932e3406370aaf4212e6a3fdb5038cc86c7aea15a6851da", size = 56475470 }, - { url = "https://files.pythonhosted.org/packages/91/61/f838ce2046f3ec3591ea59ea3549085e399525d3b4558c4ed60b55ed88c0/opencv_python_headless-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46071015ff9ab40fccd8a163da0ee14ce9846349f06c6c8c0f2870856ffa45db", size = 29329705 }, - { url = "https://files.pythonhosted.org/packages/d1/09/248f86a404567303cdf120e4a301f389b68e3b18e5c0cc428de327da609c/opencv_python_headless-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:377d08a7e48a1405b5e84afcbe4798464ce7ee17081c1c23619c8b398ff18295", size = 49858781 }, - { url = "https://files.pythonhosted.org/packages/30/c0/66f88d58500e990a9a0a5c06f98862edf1d0a3a430781218a8c193948438/opencv_python_headless-4.10.0.84-cp37-abi3-win32.whl", hash = "sha256:9092404b65458ed87ce932f613ffbb1106ed2c843577501e5768912360fc50ec", size = 28675298 }, - { url = "https://files.pythonhosted.org/packages/26/d0/22f68eb23eea053a31655960f133c0be9726c6a881547e6e9e7e2a946c4f/opencv_python_headless-4.10.0.84-cp37-abi3-win_amd64.whl", hash = "sha256:afcf28bd1209dd58810d33defb622b325d3cbe49dcd7a43a902982c33e5fad05", size = 38754031 }, + { url = "https://files.pythonhosted.org/packages/dc/53/2c50afa0b1e05ecdb4603818e85f7d174e683d874ef63a6abe3ac92220c8/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca", size = 37326460 }, + { url = "https://files.pythonhosted.org/packages/3b/43/68555327df94bb9b59a1fd645f63fafb0762515344d2046698762fc19d58/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:a66c1b286a9de872c343ee7c3553b084244299714ebb50fbdcd76f07ebbe6c81", size = 56723330 }, + { url = "https://files.pythonhosted.org/packages/45/be/1438ce43ebe65317344a87e4b150865c5585f4c0db880a34cdae5ac46881/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6efabcaa9df731f29e5ea9051776715b1bdd1845d7c9530065c7951d2a2899eb", size = 29487060 }, + { url = "https://files.pythonhosted.org/packages/dd/5c/c139a7876099916879609372bfa513b7f1257f7f1a908b0bdc1c2328241b/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0a27c19dd1f40ddff94976cfe43066fbbe9dfbb2ec1907d66c19caef42a57b", size = 49969856 }, + { url = "https://files.pythonhosted.org/packages/95/dd/ed1191c9dc91abcc9f752b499b7928aacabf10567bb2c2535944d848af18/opencv_python_headless-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:f447d8acbb0b6f2808da71fddd29c1cdd448d2bc98f72d9bb78a7a898fc9621b", size = 29324425 }, + { url = "https://files.pythonhosted.org/packages/86/8a/69176a64335aed183529207ba8bc3d329c2999d852b4f3818027203f50e6/opencv_python_headless-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:6c304df9caa7a6a5710b91709dd4786bf20a74d57672b3c31f7033cc638174ca", size = 39402386 }, ] [[package]] @@ -1639,24 +1639,24 @@ wheels = [ [[package]] name = "pyarrow" -version = "18.1.0" +version = "19.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7f/7b/640785a9062bb00314caa8a387abce547d2a420cf09bd6c715fe659ccffb/pyarrow-18.1.0.tar.gz", hash = "sha256:9386d3ca9c145b5539a1cfc75df07757dff870168c959b473a0bccbc3abc8c73", size = 1118671 } +sdist = { url = "https://files.pythonhosted.org/packages/7b/01/fe1fd04744c2aa038e5a11c7a4adb3d62bce09798695e54f7274b5977134/pyarrow-19.0.0.tar.gz", hash = "sha256:8d47c691765cf497aaeed4954d226568563f1b3b74ff61139f2d77876717084b", size = 1129096 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/4d/a4988e7d82f4fbc797715db4185939a658eeffb07a25bab7262bed1ea076/pyarrow-18.1.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:eaeabf638408de2772ce3d7793b2668d4bb93807deed1725413b70e3156a7854", size = 29554860 }, - { url = "https://files.pythonhosted.org/packages/59/03/3a42c5c1e4bd4c900ab62aa1ff6b472bdb159ba8f1c3e5deadab7222244f/pyarrow-18.1.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:3b2e2239339c538f3464308fd345113f886ad031ef8266c6f004d49769bb074c", size = 30867076 }, - { url = "https://files.pythonhosted.org/packages/75/7e/332055ac913373e89256dce9d14b7708f55f7bd5be631456c897f0237738/pyarrow-18.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f39a2e0ed32a0970e4e46c262753417a60c43a3246972cfc2d3eb85aedd01b21", size = 39212135 }, - { url = "https://files.pythonhosted.org/packages/8c/64/5099cdb325828722ef7ffeba9a4696f238eb0cdeae227f831c2d77fcf1bd/pyarrow-18.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31e9417ba9c42627574bdbfeada7217ad8a4cbbe45b9d6bdd4b62abbca4c6f6", size = 40125195 }, - { url = "https://files.pythonhosted.org/packages/83/88/1938d783727db1b178ff71bc6a6143d7939e406db83a9ec23cad3dad325c/pyarrow-18.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:01c034b576ce0eef554f7c3d8c341714954be9b3f5d5bc7117006b85fcf302fe", size = 38641884 }, - { url = "https://files.pythonhosted.org/packages/5e/b5/9e14e9f7590e0eaa435ecea84dabb137284a4dbba7b3c337b58b65b76d95/pyarrow-18.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f266a2c0fc31995a06ebd30bcfdb7f615d7278035ec5b1cd71c48d56daaf30b0", size = 40076877 }, - { url = "https://files.pythonhosted.org/packages/4d/a3/817ac7fe0891a2d66e247e223080f3a6a262d8aefd77e11e8c27e6acf4e1/pyarrow-18.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d4f13eee18433f99adefaeb7e01d83b59f73360c231d4782d9ddfaf1c3fbde0a", size = 25119811 }, - { url = "https://files.pythonhosted.org/packages/6a/50/12829e7111b932581e51dda51d5cb39207a056c30fe31ef43f14c63c4d7e/pyarrow-18.1.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9f3a76670b263dc41d0ae877f09124ab96ce10e4e48f3e3e4257273cee61ad0d", size = 29514620 }, - { url = "https://files.pythonhosted.org/packages/d1/41/468c944eab157702e96abab3d07b48b8424927d4933541ab43788bb6964d/pyarrow-18.1.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:da31fbca07c435be88a0c321402c4e31a2ba61593ec7473630769de8346b54ee", size = 30856494 }, - { url = "https://files.pythonhosted.org/packages/68/f9/29fb659b390312a7345aeb858a9d9c157552a8852522f2c8bad437c29c0a/pyarrow-18.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:543ad8459bc438efc46d29a759e1079436290bd583141384c6f7a1068ed6f992", size = 39203624 }, - { url = "https://files.pythonhosted.org/packages/6e/f6/19360dae44200e35753c5c2889dc478154cd78e61b1f738514c9f131734d/pyarrow-18.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0743e503c55be0fdb5c08e7d44853da27f19dc854531c0570f9f394ec9671d54", size = 40139341 }, - { url = "https://files.pythonhosted.org/packages/bb/e6/9b3afbbcf10cc724312e824af94a2e993d8ace22994d823f5c35324cebf5/pyarrow-18.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d4b3d2a34780645bed6414e22dda55a92e0fcd1b8a637fba86800ad737057e33", size = 38618629 }, - { url = "https://files.pythonhosted.org/packages/3a/2e/3b99f8a3d9e0ccae0e961978a0d0089b25fb46ebbcfb5ebae3cca179a5b3/pyarrow-18.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c52f81aa6f6575058d8e2c782bf79d4f9fdc89887f16825ec3a66607a5dd8e30", size = 40078661 }, - { url = "https://files.pythonhosted.org/packages/76/52/f8da04195000099d394012b8d42c503d7041b79f778d854f410e5f05049a/pyarrow-18.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ad4892617e1a6c7a551cfc827e072a633eaff758fa09f21c4ee548c30bcaf99", size = 25092330 }, + { url = "https://files.pythonhosted.org/packages/82/42/fba3a35bef5833bf88ed35e6a810dc1781236e1d4f808d2df824a7d21819/pyarrow-19.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8e3a839bf36ec03b4315dc924d36dcde5444a50066f1c10f8290293c0427b46a", size = 30711936 }, + { url = "https://files.pythonhosted.org/packages/88/7a/0da93a3eaaf251a30e32f3221e874263cdcd366c2cd6b7c05293aad91152/pyarrow-19.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ce42275097512d9e4e4a39aade58ef2b3798a93aa3026566b7892177c266f735", size = 32133182 }, + { url = "https://files.pythonhosted.org/packages/2f/df/fe43b1c50d3100d0de53f988344118bc20362d0de005f8a407454fa565f8/pyarrow-19.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9348a0137568c45601b031a8d118275069435f151cbb77e6a08a27e8125f59d4", size = 41145489 }, + { url = "https://files.pythonhosted.org/packages/45/bb/6f73b41b342a0342f2516a02db4aa97a4f9569cc35482a5c288090140cd4/pyarrow-19.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0144a712d990d60f7f42b7a31f0acaccf4c1e43e957f7b1ad58150d6f639c1", size = 42177823 }, + { url = "https://files.pythonhosted.org/packages/23/7b/f038a96f421e453a71bd7a0f78d62b1b2ae9bcac06ed51179ca532e6a0a2/pyarrow-19.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2a1a109dfda558eb011e5f6385837daffd920d54ca00669f7a11132d0b1e6042", size = 40530609 }, + { url = "https://files.pythonhosted.org/packages/b8/39/a2a6714b471c000e6dd6af4495dce00d7d1332351b8e3170dfb9f91dad1f/pyarrow-19.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:be686bf625aa7b9bada18defb3a3ea3981c1099697239788ff111d87f04cd263", size = 42081534 }, + { url = "https://files.pythonhosted.org/packages/6c/a3/8396fb06ca05d807e89980c177be26617aad15211ece3184e0caa730b8a6/pyarrow-19.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:239ca66d9a05844bdf5af128861af525e14df3c9591bcc05bac25918e650d3a2", size = 25281090 }, + { url = "https://files.pythonhosted.org/packages/bc/2e/152885f5ef421e80dae68b9c133ab261934f93a6d5e16b61d79c0ed597fb/pyarrow-19.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:a7bbe7109ab6198688b7079cbad5a8c22de4d47c4880d8e4847520a83b0d1b68", size = 30667964 }, + { url = "https://files.pythonhosted.org/packages/80/c2/08bbee9a8610a47c9a1466845f405baf53a639ddd947c5133d8ba13544b6/pyarrow-19.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:4624c89d6f777c580e8732c27bb8e77fd1433b89707f17c04af7635dd9638351", size = 32125039 }, + { url = "https://files.pythonhosted.org/packages/d2/56/06994df823212f5688d3c8bf4294928b12c9be36681872853655724d28c6/pyarrow-19.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b6d3ce4288793350dc2d08d1e184fd70631ea22a4ff9ea5c4ff182130249d9b", size = 41140729 }, + { url = "https://files.pythonhosted.org/packages/94/65/38ad577c98140a9db71e9e1e594b6adb58a7478a5afec6456a8ca2df7f70/pyarrow-19.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:450a7d27e840e4d9a384b5c77199d489b401529e75a3b7a3799d4cd7957f2f9c", size = 42202267 }, + { url = "https://files.pythonhosted.org/packages/b6/1f/966b722251a7354114ccbb71cf1a83922023e69efd8945ebf628a851ec4c/pyarrow-19.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a08e2a8a039a3f72afb67a6668180f09fddaa38fe0d21f13212b4aba4b5d2451", size = 40505858 }, + { url = "https://files.pythonhosted.org/packages/3b/5e/6bc81aa7fc9affc7d1c03b912fbcc984ca56c2a18513684da267715dab7b/pyarrow-19.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f43f5aef2a13d4d56adadae5720d1fed4c1356c993eda8b59dace4b5983843c1", size = 42084973 }, + { url = "https://files.pythonhosted.org/packages/53/c3/2f56da818b6a4758cbd514957c67bd0f078ebffa5390ee2e2bf0f9e8defc/pyarrow-19.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:2f672f5364b2d7829ef7c94be199bb88bf5661dd485e21d2d37de12ccb78a136", size = 25241976 }, ] [[package]] @@ -4231,25 +4231,25 @@ wheels = [ [[package]] name = "pyopencl" -version = "2024.3" +version = "2025.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "platformdirs" }, { name = "pytools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/28/4679ea08b84532a67fd2d270c8f87aec64dab9ab99e618927b6a26ea063e/pyopencl-2024.3.tar.gz", hash = "sha256:d5d08de9b0a6d85695caba1769aceae4e7661f06951c507bd1ce8fb7a89e2413", size = 422604 } +sdist = { url = "https://files.pythonhosted.org/packages/28/88/0ac460d3e2def08b2ad6345db6a13613815f616bbbd60c6f4bdf774f4c41/pyopencl-2025.1.tar.gz", hash = "sha256:0116736d7f7920f87b8db4b66a03f27b1d930d2e37ddd14518407cc22dd24779", size = 422510 } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/6e/1fd2b3613f2bbbded7d44ddb88c635b2122a7f2a43cb7b03e591ba4b7ee6/pyopencl-2024.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:66a69879968c872e74fbbb8ff9f88cf51761146e1b2c5eef98743e14e3f58254", size = 400548 }, - { url = "https://files.pythonhosted.org/packages/19/f7/04f3bd9c289b2dee3932d83c8775bbd6649ca329776aadd1b69c0951aa0f/pyopencl-2024.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:933b3be2e6145b8182e2706ed9586f5757a4f32bb48fb9a854e05c22e1fe7bab", size = 392032 }, - { url = "https://files.pythonhosted.org/packages/50/4a/6cf11136834b552f58b221c262b12db684ff0d311f9546afa88b7a936dcb/pyopencl-2024.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c05b833d0036b9ce10ccbadd0936c678eb050dbe575566d1be23d1a35d08ff1", size = 645641 }, - { url = "https://files.pythonhosted.org/packages/7e/c8/18b5ec320ae345ea50e75c8e92c9b7aaf127199a901bb2208ba182630e99/pyopencl-2024.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7a032add510dd74e57d43211ea3555b2ca51205db69306e7097f0deba3036e04", size = 1133913 }, - { url = "https://files.pythonhosted.org/packages/47/fa/41825250a5eafa9ab8df8b6968597c9717897b8ec8c3d77fedb59ce2c88c/pyopencl-2024.3-cp311-cp311-win_amd64.whl", hash = "sha256:e0a2b9ce59044762a81b9dda626bd5f3a190ae1370e74cb8306972867113b0be", size = 438489 }, - { url = "https://files.pythonhosted.org/packages/1a/3e/53b3099ba2cf41f98eb8de8937cb618f52bc8b0643c8828f4e2ae1273c28/pyopencl-2024.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:2b3b950adcfe979ed9ad4373b3d0690b4b40c1a6fa711f1be1c33aebe3ceb163", size = 399815 }, - { url = "https://files.pythonhosted.org/packages/27/4e/5ec6fce9dfbb3e1d1c7ccea1855be4a38c47316566060d863afd9a5f91ad/pyopencl-2024.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:92db9997ebb1845d2c83f232dc10381cbabf01791061bd470949d0f48eb2124c", size = 391705 }, - { url = "https://files.pythonhosted.org/packages/ad/4e/efe079bce9e6fcb32ab86b6c80d891414083c1c1fab38896786df08b64af/pyopencl-2024.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff5badff3e274878034976d06cde70ac0cbef367239a14f1c461dad126adbf2", size = 645354 }, - { url = "https://files.pythonhosted.org/packages/d4/01/1c6e47417f88afbcccf0db81f88351cb105270b2252ef691f507fe3434cb/pyopencl-2024.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:873af3af4477a93c1cd640dcf7e55f53c6e5a8477ea86f1b4cc56171a6b56cc7", size = 1133947 }, - { url = "https://files.pythonhosted.org/packages/84/1f/00ad0646cef56723c2bcf5b5f186870991d5d36fa1d85fe940ff95af778f/pyopencl-2024.3-cp312-cp312-win_amd64.whl", hash = "sha256:9371b4ce4e4598c9098b3feca161a75d30c79ff4f508529dbb7f43b05b6aea22", size = 439400 }, + { url = "https://files.pythonhosted.org/packages/99/ce/c40c6248b29195397a6e176615c24a8047cdd3afe847932a1f27603c1b14/pyopencl-2025.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:a302e4ee1bb19ff244f5ae2b5a83a98977daa13f31929a85f23723020a4bec01", size = 424117 }, + { url = "https://files.pythonhosted.org/packages/71/dd/8dd4e18396c705567be7eda65234932f8eb7e975cc15ae167265ed9c7d20/pyopencl-2025.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:48527fc5a250b9e89f2eaaa1c9423e1bc15ff181bd41ffa1e29e31890dc1d3b7", size = 408327 }, + { url = "https://files.pythonhosted.org/packages/47/7b/270c4e6765b675eaa97af8ff0c964e21dc74ac2a2f04e2c24431c91ce382/pyopencl-2025.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95490199c490e47b245b88e64e06f95272502d13810da172ac3b0f0340cf8715", size = 724636 }, + { url = "https://files.pythonhosted.org/packages/0d/55/996d7877793acfc340678a71dc98151a8c39dbb289cf24ecae08c0af68eb/pyopencl-2025.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cd2cb3c031beeec93cf660c8809d6ad58a2cde7dcd95ae12b4b2da6ac8e2da41", size = 1173429 }, + { url = "https://files.pythonhosted.org/packages/3d/7c/d2a89b1c24c318375856e8b7611bc03ddf687134f68ddbb387496453eda8/pyopencl-2025.1-cp311-cp311-win_amd64.whl", hash = "sha256:d8d3cdb02dc8750a9cc11c5b37f219da1f61b4216af4a830eb52b451a0e9f9a7", size = 457877 }, + { url = "https://files.pythonhosted.org/packages/02/c0/d9536211ecfddd3bdf7eaa1658d085fcd92120061ac6f4e662a5062660ff/pyopencl-2025.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:88c564d94a5067ab6b9429a7d92b655254da8b2b5a33c7e30e10c5a0cf3154e1", size = 425706 }, + { url = "https://files.pythonhosted.org/packages/63/b9/3e6dd574cc9ffb2271be135ecdb36cd6aea70a1f74e80539b048072a256a/pyopencl-2025.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f204cd6974ca19e7ffe14f21afac9967b06a6718f3aecbbc4a4df313e8e7ebc2", size = 408163 }, + { url = "https://files.pythonhosted.org/packages/a4/4d/7f6f2e24b12585b81fd49f689d21ba62187656d061e3cb43840f12097dad/pyopencl-2025.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce8d1b3fd2046e89377b754117fdb3505f45edacfda6ad2b3a29670c0526ad1", size = 719348 }, + { url = "https://files.pythonhosted.org/packages/f0/45/3c93510819859e047d494dd8f4ed80c26378bb964a8e5e850cc079cc1f6e/pyopencl-2025.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbb0b7b775424f0c4c929a00f09eb351075ea9e4d2b1c80afe37d09bec218ee9", size = 1170733 }, + { url = "https://files.pythonhosted.org/packages/91/ba/b745715085ef893fa7d1c7e04c95e3e554b6b27b2fb0800d6bbca563b43c/pyopencl-2025.1-cp312-cp312-win_amd64.whl", hash = "sha256:78f2a58d2e177793fb5a7b9c8a574e3a5f1d178c4df713969d1b08341c817d60", size = 457762 }, ] [[package]] @@ -4695,27 +4695,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.9.1" +version = "0.9.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/67/3e/e89f736f01aa9517a97e2e7e0ce8d34a4d8207087b3cfdec95133fee13b5/ruff-0.9.1.tar.gz", hash = "sha256:fd2b25ecaf907d6458fa842675382c8597b3c746a2dde6717fe3415425df0c17", size = 3498844 } +sdist = { url = "https://files.pythonhosted.org/packages/80/63/77ecca9d21177600f551d1c58ab0e5a0b260940ea7312195bd2a4798f8a8/ruff-0.9.2.tar.gz", hash = "sha256:b5eceb334d55fae5f316f783437392642ae18e16dcf4f1858d55d3c2a0f8f5d0", size = 3553799 } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/05/c3a2e0feb3d5d394cdfd552de01df9d3ec8a3a3771bbff247fab7e668653/ruff-0.9.1-py3-none-linux_armv6l.whl", hash = "sha256:84330dda7abcc270e6055551aca93fdde1b0685fc4fd358f26410f9349cf1743", size = 10645241 }, - { url = "https://files.pythonhosted.org/packages/dd/da/59f0a40e5f88ee5c054ad175caaa2319fc96571e1d29ab4730728f2aad4f/ruff-0.9.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3cae39ba5d137054b0e5b472aee3b78a7c884e61591b100aeb544bcd1fc38d4f", size = 10391066 }, - { url = "https://files.pythonhosted.org/packages/b7/fe/85e1c1acf0ba04a3f2d54ae61073da030f7a5dc386194f96f3c6ca444a78/ruff-0.9.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:50c647ff96f4ba288db0ad87048257753733763b409b2faf2ea78b45c8bb7fcb", size = 10012308 }, - { url = "https://files.pythonhosted.org/packages/6f/9b/780aa5d4bdca8dcea4309264b8faa304bac30e1ce0bcc910422bfcadd203/ruff-0.9.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c8b149e9c7353cace7d698e1656ffcf1e36e50f8ea3b5d5f7f87ff9986a7ca", size = 10881960 }, - { url = "https://files.pythonhosted.org/packages/12/f4/dac4361afbfe520afa7186439e8094e4884ae3b15c8fc75fb2e759c1f267/ruff-0.9.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:beb3298604540c884d8b282fe7625651378e1986c25df51dec5b2f60cafc31ce", size = 10414803 }, - { url = "https://files.pythonhosted.org/packages/f0/a2/057a3cb7999513cb78d6cb33a7d1cc6401c82d7332583786e4dad9e38e44/ruff-0.9.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39d0174ccc45c439093971cc06ed3ac4dc545f5e8bdacf9f067adf879544d969", size = 11464929 }, - { url = "https://files.pythonhosted.org/packages/eb/c6/1ccfcc209bee465ced4874dcfeaadc88aafcc1ea9c9f31ef66f063c187f0/ruff-0.9.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:69572926c0f0c9912288915214ca9b2809525ea263603370b9e00bed2ba56dbd", size = 12170717 }, - { url = "https://files.pythonhosted.org/packages/84/97/4a524027518525c7cf6931e9fd3b2382be5e4b75b2b61bec02681a7685a5/ruff-0.9.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:937267afce0c9170d6d29f01fcd1f4378172dec6760a9f4dface48cdabf9610a", size = 11708921 }, - { url = "https://files.pythonhosted.org/packages/a6/a4/4e77cf6065c700d5593b25fca6cf725b1ab6d70674904f876254d0112ed0/ruff-0.9.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:186c2313de946f2c22bdf5954b8dd083e124bcfb685732cfb0beae0c47233d9b", size = 13058074 }, - { url = "https://files.pythonhosted.org/packages/f9/d6/fcb78e0531e863d0a952c4c5600cc5cd317437f0e5f031cd2288b117bb37/ruff-0.9.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f94942a3bb767675d9a051867c036655fe9f6c8a491539156a6f7e6b5f31831", size = 11281093 }, - { url = "https://files.pythonhosted.org/packages/e4/3b/7235bbeff00c95dc2d073cfdbf2b871b5bbf476754c5d277815d286b4328/ruff-0.9.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:728d791b769cc28c05f12c280f99e8896932e9833fef1dd8756a6af2261fd1ab", size = 10882610 }, - { url = "https://files.pythonhosted.org/packages/2a/66/5599d23257c61cf038137f82999ca8f9d0080d9d5134440a461bef85b461/ruff-0.9.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2f312c86fb40c5c02b44a29a750ee3b21002bd813b5233facdaf63a51d9a85e1", size = 10489273 }, - { url = "https://files.pythonhosted.org/packages/78/85/de4aa057e2532db0f9761e2c2c13834991e087787b93e4aeb5f1cb10d2df/ruff-0.9.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ae017c3a29bee341ba584f3823f805abbe5fe9cd97f87ed07ecbf533c4c88366", size = 11003314 }, - { url = "https://files.pythonhosted.org/packages/00/42/afedcaa089116d81447347f76041ff46025849fedb0ed2b187d24cf70fca/ruff-0.9.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5dc40a378a0e21b4cfe2b8a0f1812a6572fc7b230ef12cd9fac9161aa91d807f", size = 11342982 }, - { url = "https://files.pythonhosted.org/packages/39/c6/fe45f3eb27e3948b41a305d8b768e949bf6a39310e9df73f6c576d7f1d9f/ruff-0.9.1-py3-none-win32.whl", hash = "sha256:46ebf5cc106cf7e7378ca3c28ce4293b61b449cd121b98699be727d40b79ba72", size = 8819750 }, - { url = "https://files.pythonhosted.org/packages/38/8d/580db77c3b9d5c3d9479e55b0b832d279c30c8f00ab0190d4cd8fc67831c/ruff-0.9.1-py3-none-win_amd64.whl", hash = "sha256:342a824b46ddbcdddd3abfbb332fa7fcaac5488bf18073e841236aadf4ad5c19", size = 9701331 }, - { url = "https://files.pythonhosted.org/packages/b2/94/0498cdb7316ed67a1928300dd87d659c933479f44dec51b4f62bfd1f8028/ruff-0.9.1-py3-none-win_arm64.whl", hash = "sha256:1cd76c7f9c679e6e8f2af8f778367dca82b95009bc7b1a85a47f1521ae524fa7", size = 9145708 }, + { url = "https://files.pythonhosted.org/packages/af/b9/0e168e4e7fb3af851f739e8f07889b91d1a33a30fca8c29fa3149d6b03ec/ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347", size = 11652408 }, + { url = "https://files.pythonhosted.org/packages/2c/22/08ede5db17cf701372a461d1cb8fdde037da1d4fa622b69ac21960e6237e/ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00", size = 11587553 }, + { url = "https://files.pythonhosted.org/packages/42/05/dedfc70f0bf010230229e33dec6e7b2235b2a1b8cbb2a991c710743e343f/ruff-0.9.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fbd337bac1cfa96be615f6efcd4bc4d077edbc127ef30e2b8ba2a27e18c054d4", size = 11020755 }, + { url = "https://files.pythonhosted.org/packages/df/9b/65d87ad9b2e3def67342830bd1af98803af731243da1255537ddb8f22209/ruff-0.9.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b35259b0cbf8daa22a498018e300b9bb0174c2bbb7bcba593935158a78054d", size = 11826502 }, + { url = "https://files.pythonhosted.org/packages/93/02/f2239f56786479e1a89c3da9bc9391120057fc6f4a8266a5b091314e72ce/ruff-0.9.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b6a9701d1e371bf41dca22015c3f89769da7576884d2add7317ec1ec8cb9c3c", size = 11390562 }, + { url = "https://files.pythonhosted.org/packages/c9/37/d3a854dba9931f8cb1b2a19509bfe59e00875f48ade632e95aefcb7a0aee/ruff-0.9.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc53e68b3c5ae41e8faf83a3b89f4a5d7b2cb666dff4b366bb86ed2a85b481f", size = 12548968 }, + { url = "https://files.pythonhosted.org/packages/fa/c3/c7b812bb256c7a1d5553433e95980934ffa85396d332401f6b391d3c4569/ruff-0.9.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8efd9da7a1ee314b910da155ca7e8953094a7c10d0c0a39bfde3fcfd2a015684", size = 13187155 }, + { url = "https://files.pythonhosted.org/packages/bd/5a/3c7f9696a7875522b66aa9bba9e326e4e5894b4366bd1dc32aa6791cb1ff/ruff-0.9.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3292c5a22ea9a5f9a185e2d131dc7f98f8534a32fb6d2ee7b9944569239c648d", size = 12704674 }, + { url = "https://files.pythonhosted.org/packages/be/d6/d908762257a96ce5912187ae9ae86792e677ca4f3dc973b71e7508ff6282/ruff-0.9.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a605fdcf6e8b2d39f9436d343d1f0ff70c365a1e681546de0104bef81ce88df", size = 14529328 }, + { url = "https://files.pythonhosted.org/packages/2d/c2/049f1e6755d12d9cd8823242fa105968f34ee4c669d04cac8cea51a50407/ruff-0.9.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547f7f256aa366834829a08375c297fa63386cbe5f1459efaf174086b564247", size = 12385955 }, + { url = "https://files.pythonhosted.org/packages/91/5a/a9bdb50e39810bd9627074e42743b00e6dc4009d42ae9f9351bc3dbc28e7/ruff-0.9.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d18bba3d3353ed916e882521bc3e0af403949dbada344c20c16ea78f47af965e", size = 11810149 }, + { url = "https://files.pythonhosted.org/packages/e5/fd/57df1a0543182f79a1236e82a79c68ce210efb00e97c30657d5bdb12b478/ruff-0.9.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b338edc4610142355ccf6b87bd356729b62bf1bc152a2fad5b0c7dc04af77bfe", size = 11479141 }, + { url = "https://files.pythonhosted.org/packages/dc/16/bc3fd1d38974f6775fc152a0554f8c210ff80f2764b43777163c3c45d61b/ruff-0.9.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:492a5e44ad9b22a0ea98cf72e40305cbdaf27fac0d927f8bc9e1df316dcc96eb", size = 12014073 }, + { url = "https://files.pythonhosted.org/packages/47/6b/e4ca048a8f2047eb652e1e8c755f384d1b7944f69ed69066a37acd4118b0/ruff-0.9.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:af1e9e9fe7b1f767264d26b1075ac4ad831c7db976911fa362d09b2d0356426a", size = 12435758 }, + { url = "https://files.pythonhosted.org/packages/c2/40/4d3d6c979c67ba24cf183d29f706051a53c36d78358036a9cd21421582ab/ruff-0.9.2-py3-none-win32.whl", hash = "sha256:71cbe22e178c5da20e1514e1e01029c73dc09288a8028a5d3446e6bba87a5145", size = 9796916 }, + { url = "https://files.pythonhosted.org/packages/c3/ef/7f548752bdb6867e6939489c87fe4da489ab36191525fadc5cede2a6e8e2/ruff-0.9.2-py3-none-win_amd64.whl", hash = "sha256:c5e1d6abc798419cf46eed03f54f2e0c3adb1ad4b801119dedf23fcaf69b55b5", size = 10773080 }, + { url = "https://files.pythonhosted.org/packages/0e/4e/33df635528292bd2d18404e4daabcd74ca8a9853b2e1df85ed3d32d24362/ruff-0.9.2-py3-none-win_arm64.whl", hash = "sha256:a1b63fa24149918f8b37cef2ee6fff81f24f0d74b6f0bdc37bc3e1f2143e41c6", size = 10001738 }, ] [[package]] @@ -4994,6 +4994,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, ] [[package]]