From 37b4e61b005a80187023c49429b2bcc1efd667aa Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 16 Jan 2025 14:22:02 -0800 Subject: [PATCH 01/10] Allow brake hold (#34384) * allow brake hold * rev --- selfdrive/car/car_specific.py | 2 +- selfdrive/selfdrived/events.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/car_specific.py b/selfdrive/car/car_specific.py index cd2d66228c..144f9f073b 100644 --- a/selfdrive/car/car_specific.py +++ b/selfdrive/car/car_specific.py @@ -191,7 +191,7 @@ class CarSpecificEvents: events.add(EventName.speedTooHigh) if CS.cruiseState.nonAdaptive: events.add(EventName.wrongCruiseMode) - if CS.brakeHoldActive and self.CP.openpilotLongitudinalControl and self.CP.carName != 'toyota': + if CS.brakeHoldActive and self.CP.openpilotLongitudinalControl: events.add(EventName.brakeHold) if CS.parkingBrake: events.add(EventName.parkBrake) diff --git a/selfdrive/selfdrived/events.py b/selfdrive/selfdrived/events.py index cdc23e53c9..41f08007d6 100755 --- a/selfdrive/selfdrived/events.py +++ b/selfdrive/selfdrived/events.py @@ -634,8 +634,11 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.brakeHold: { - ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), - ET.NO_ENTRY: NoEntryAlert("Brake Hold Active"), + ET.WARNING: Alert( + "Press Resume to Exit Brake Hold", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), }, EventName.parkBrake: { From 1d919221e4ee4cbb2cbfc63481538d9a52fa1e87 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 16 Jan 2025 14:52:26 -0800 Subject: [PATCH 02/10] Update build.py --- system/manager/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/manager/build.py b/system/manager/build.py index 956336a604..d4961850ca 100755 --- a/system/manager/build.py +++ b/system/manager/build.py @@ -14,7 +14,7 @@ from openpilot.system.version import get_build_metadata MAX_CACHE_SIZE = 4e9 if "CI" in os.environ else 2e9 CACHE_DIR = Path("/data/scons_cache" if AGNOS else "/tmp/scons_cache") -TOTAL_SCONS_NODES = 2820 +TOTAL_SCONS_NODES = 3130 MAX_BUILD_PROGRESS = 100 def build(spinner: Spinner, dirty: bool = False, minimal: bool = False) -> None: From 733206fdd9dcd23bfa726a066b88674abcb87ad0 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 16 Jan 2025 16:06:11 -0800 Subject: [PATCH 03/10] fix joystick --- tools/joystick/joystick_control.py | 4 ++-- tools/joystick/joystickd.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/joystick/joystick_control.py b/tools/joystick/joystick_control.py index 60131ba370..74d034d505 100755 --- a/tools/joystick/joystick_control.py +++ b/tools/joystick/joystick_control.py @@ -34,7 +34,7 @@ class Keyboard: elif key in self.axes_map: axis = self.axes_map[key] incr = self.axis_increment if key in ['w', 'a'] else -self.axis_increment - self.axes_values[axis] = np.clip(self.axes_values[axis] + incr, -1, 1) + self.axes_values[axis] = float(np.clip(self.axes_values[axis] + incr, -1, 1)) else: return False return True @@ -83,7 +83,7 @@ class Joystick: self.max_axis_value[event[0]] = max(event[1], self.max_axis_value[event[0]]) self.min_axis_value[event[0]] = min(event[1], self.min_axis_value[event[0]]) - norm = -np.interp(event[1], [self.min_axis_value[event[0]], self.max_axis_value[event[0]]], [-1., 1.]) + norm = -float(np.interp(event[1], [self.min_axis_value[event[0]], self.max_axis_value[event[0]]], [-1., 1.])) norm = norm if abs(norm) > 0.03 else 0. # center can be noisy, deadzone of 3% self.axes_values[event[0]] = EXPO * norm ** 3 + (1 - EXPO) * norm # less action near center for fine control else: diff --git a/tools/joystick/joystickd.py b/tools/joystick/joystickd.py index 21d10b36d4..8348ad82b5 100755 --- a/tools/joystick/joystickd.py +++ b/tools/joystick/joystickd.py @@ -45,13 +45,13 @@ def joystickd_thread(): joystick_axes = [0.0, 0.0] if CC.longActive: - actuators.accel = 4.0 * np.clip(joystick_axes[0], -1, 1) + actuators.accel = 4.0 * float(np.clip(joystick_axes[0], -1, 1)) if CC.latActive: max_curvature = MAX_LAT_ACCEL / max(sm['carState'].vEgo ** 2, 5) max_angle = math.degrees(VM.get_steer_from_curvature(max_curvature, sm['carState'].vEgo, sm['liveParameters'].roll)) - actuators.steer = np.clip(joystick_axes[1], -1, 1) + actuators.steer = float(np.clip(joystick_axes[1], -1, 1)) actuators.steeringAngleDeg, actuators.curvature = actuators.steer * max_angle, actuators.steer * -max_curvature pm.send('carControl', cc_msg) From c5150215762099526e8d518f8ce53923d59ed812 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 16 Jan 2025 16:07:56 -0800 Subject: [PATCH 04/10] joystick: fix long control state --- tools/joystick/joystickd.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/joystick/joystickd.py b/tools/joystick/joystickd.py index 8348ad82b5..d52e80af86 100755 --- a/tools/joystick/joystickd.py +++ b/tools/joystick/joystickd.py @@ -9,6 +9,7 @@ from openpilot.common.params import Params from openpilot.common.swaglog import cloudlog from openpilot.selfdrive.controls.lib.vehicle_model import VehicleModel +LongCtrlState = car.CarControl.Actuators.LongControlState MAX_LAT_ACCEL = 2.5 @@ -46,6 +47,7 @@ def joystickd_thread(): if CC.longActive: actuators.accel = 4.0 * float(np.clip(joystick_axes[0], -1, 1)) + actuators.longControlState = LongCtrlState.pid if sm['carState'].vEgo > CP.vEgoStopping else LongCtrlState.stopping if CC.latActive: max_curvature = MAX_LAT_ACCEL / max(sm['carState'].vEgo ** 2, 5) From 4dc95f60649da3e876ae1149ef398d7ca30ecf54 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 17 Jan 2025 20:39:14 -0800 Subject: [PATCH 05/10] bump msgq (#34410) * bump msgq * bump --- msgq_repo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 895c78b09aa3d3d6466205bd85aec78299a95b27 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 17 Jan 2025 21:17:05 -0800 Subject: [PATCH 06/10] Revert "bump msgq (#34410)" This reverts commit 4dc95f60649da3e876ae1149ef398d7ca30ecf54. --- msgq_repo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msgq_repo b/msgq_repo index 102befe731..5bb86f8bc7 160000 --- a/msgq_repo +++ b/msgq_repo @@ -1 +1 @@ -Subproject commit 102befe7316522c8a1aca539018188fd97858732 +Subproject commit 5bb86f8bc7434048ab2d5ce0243a97d9848b34de From 7a1bf26aa5f178319436b2d111dadcf32ed22435 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sun, 19 Jan 2025 03:18:45 +0800 Subject: [PATCH 07/10] ui: prevent device pairing if no internet or system time is invalid (#34403) * gate pairing device if system time is invalid * update translations * Check for internet connectivity * Update selfdrive/ui/qt/widgets/prime.cc * Update selfdrive/ui/qt/widgets/prime.cc --------- Co-authored-by: Adeeb Shihadeh --- common/util.cc | 13 +++++++++++++ common/util.h | 2 ++ selfdrive/ui/qt/widgets/prime.cc | 8 ++++++++ selfdrive/ui/qt/widgets/prime.h | 1 + selfdrive/ui/translations/main_ar.ts | 4 ++++ selfdrive/ui/translations/main_de.ts | 4 ++++ selfdrive/ui/translations/main_es.ts | 4 ++++ selfdrive/ui/translations/main_fr.ts | 4 ++++ selfdrive/ui/translations/main_ja.ts | 4 ++++ selfdrive/ui/translations/main_ko.ts | 4 ++++ selfdrive/ui/translations/main_pt-BR.ts | 4 ++++ selfdrive/ui/translations/main_th.ts | 4 ++++ selfdrive/ui/translations/main_tr.ts | 4 ++++ selfdrive/ui/translations/main_zh-CHS.ts | 4 ++++ selfdrive/ui/translations/main_zh-CHT.ts | 4 ++++ 15 files changed, 68 insertions(+) diff --git a/common/util.cc b/common/util.cc index f4c69eb269..096df85634 100644 --- a/common/util.cc +++ b/common/util.cc @@ -294,4 +294,17 @@ std::string check_output(const std::string& command) { return result; } +bool system_time_valid() { + // Default to August 26, 2024 + tm min_tm = {.tm_year = 2024 - 1900, .tm_mon = 7, .tm_mday = 26}; + time_t min_date = mktime(&min_tm); + + struct stat st; + if (stat("/lib/systemd/systemd", &st) == 0) { + min_date = std::max(min_date, st.st_mtime + 86400); // Add 1 day (86400 seconds) + } + + return time(nullptr) > min_date; +} + } // namespace util diff --git a/common/util.h b/common/util.h index d4106b5002..4fb4b13fae 100644 --- a/common/util.h +++ b/common/util.h @@ -96,6 +96,8 @@ bool create_directories(const std::string &dir, mode_t mode); std::string check_output(const std::string& command); +bool system_time_valid(); + inline void sleep_for(const int milliseconds) { if (milliseconds > 0) { std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds)); diff --git a/selfdrive/ui/qt/widgets/prime.cc b/selfdrive/ui/qt/widgets/prime.cc index 62f5c0ab50..ee820c46a3 100644 --- a/selfdrive/ui/qt/widgets/prime.cc +++ b/selfdrive/ui/qt/widgets/prime.cc @@ -116,6 +116,14 @@ PairingPopup::PairingPopup(QWidget *parent) : DialogBase(parent) { hlayout->addWidget(qr, 1); } +int PairingPopup::exec() { + if (!util::system_time_valid()) { + ConfirmationDialog::alert(tr("Please connect to Wi-Fi to complete initial pairing"), parentWidget()); + return QDialog::Rejected; + } + return DialogBase::exec(); +} + PrimeUserWidget::PrimeUserWidget(QWidget *parent) : QFrame(parent) { setObjectName("primeWidget"); diff --git a/selfdrive/ui/qt/widgets/prime.h b/selfdrive/ui/qt/widgets/prime.h index d1ba334e81..266a90a92c 100644 --- a/selfdrive/ui/qt/widgets/prime.h +++ b/selfdrive/ui/qt/widgets/prime.h @@ -33,6 +33,7 @@ class PairingPopup : public DialogBase { public: explicit PairingPopup(QWidget* parent); + int exec() override; }; diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 2315268a72..39ccf57e7c 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -460,6 +460,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app اجعل لـconnect.comma.ai إشارة مرجعية على شاشتك الرئيسية من أجل استخدامه مثل أي تطبيق + + Please connect to Wi-Fi to complete initial pairing + + ParamControl diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index 2abed6e305..6112e84a2a 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -455,6 +455,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app Füge connect.comma.ai als Lesezeichen auf deinem Homescreen hinzu um es wie eine App zu verwenden + + Please connect to Wi-Fi to complete initial pairing + + ParamControl diff --git a/selfdrive/ui/translations/main_es.ts b/selfdrive/ui/translations/main_es.ts index 38ba964f11..0b6754358b 100644 --- a/selfdrive/ui/translations/main_es.ts +++ b/selfdrive/ui/translations/main_es.ts @@ -456,6 +456,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app Añada connect.comma.ai a su pantalla de inicio para usarlo como una aplicación + + Please connect to Wi-Fi to complete initial pairing + + ParamControl diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index f4251bc41d..ab69c34dc5 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -456,6 +456,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app Ajoutez connect.comma.ai à votre écran d'accueil pour l'utiliser comme une application + + Please connect to Wi-Fi to complete initial pairing + + ParamControl diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index bc83d3f9ae..e4565a5c4d 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -454,6 +454,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app 「connect.comma.ai」をホーム画面に追加して、アプリのように使うことができます。 + + Please connect to Wi-Fi to complete initial pairing + + ParamControl diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index 1d2a753e1f..72bce9f144 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -455,6 +455,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app connect.comma.ai를 앱처럼 사용하려면 홈 화면에 바로가기를 만드세요 + + Please connect to Wi-Fi to complete initial pairing + + ParamControl diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index a89c85510e..41d40c5d12 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -456,6 +456,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app Salve connect.comma.ai como sua página inicial para utilizar como um app + + Please connect to Wi-Fi to complete initial pairing + + ParamControl diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index c2b2771830..3919bb70f1 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -455,6 +455,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app จดจำ connect.comma.ai โดยการเพิ่มไปยังหน้าจอโฮม เพื่อใช้งานเหมือนเป็นแอปพลิเคชัน + + Please connect to Wi-Fi to complete initial pairing + + ParamControl diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index 9a53449276..f18923cc7b 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -454,6 +454,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app Uygulama gibi kullanmak için connect.comma.ai sitesini yer işaretlerine ekleyin. + + Please connect to Wi-Fi to complete initial pairing + + ParamControl diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index f061322c45..6cdbc90e70 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -455,6 +455,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app 将 connect.comma.ai 收藏到您的主屏幕,以便像应用程序一样使用它 + + Please connect to Wi-Fi to complete initial pairing + + ParamControl diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 04e76a8d95..eed7e809dd 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -455,6 +455,10 @@ Bookmark connect.comma.ai to your home screen to use it like an app 將 connect.comma.ai 加入您的主螢幕,以便像手機 App 一樣使用它 + + Please connect to Wi-Fi to complete initial pairing + + ParamControl From 5509850986968caa141cb7b5604d181a6712e2fb Mon Sep 17 00:00:00 2001 From: Calvin Park Date: Sat, 18 Jan 2025 11:25:07 -0800 Subject: [PATCH 08/10] Install user SecOCKey to params (#34401) * Install user SecOCKey to params * Move it to launch_chffrplus.sh/launch * Move it to card.py * Basic error check * Catch Exception to suppress the linter * Make it local to secOC section --- selfdrive/car/card.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index 3ed835a1f5..db89da262f 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -125,6 +125,15 @@ class Car: self.CP.safetyConfigs = [safety_config] if self.CP.secOcRequired and not self.params.get_bool("IsReleaseBranch"): + # Copy user key if available + try: + with open("/cache/params/SecOCKey") as f: + user_key = f.readline().strip() + if len(user_key) == 32: + self.params.put("SecOCKey", user_key) + except Exception: + pass + secoc_key = self.params.get("SecOCKey", encoding='utf8') if secoc_key is not None: saved_secoc_key = bytes.fromhex(secoc_key.strip()) From f0257a847dde3829270470771399d5a03c4b5c25 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sat, 18 Jan 2025 13:27:11 -0800 Subject: [PATCH 09/10] Update README.md --- cereal/README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/cereal/README.md b/cereal/README.md index ad940facdc..45e859c09c 100644 --- a/cereal/README.md +++ b/cereal/README.md @@ -29,6 +29,50 @@ then means breaking backwards-compatibility with all old logs of your fork. So w [custom.capnp](custom.capnp) that we will leave empty in mainline cereal/openpilot. **If you only modify those, you can ensure your fork will remain backwards-compatible with all versions of mainline openpilot and your fork.** +An example of compatible changes: +```diff +diff --git a/cereal/custom.capnp b/cereal/custom.capnp +index 3348e859e..3365c7b98 100644 +--- a/cereal/custom.capnp ++++ b/cereal/custom.capnp +@@ -10,7 +10,11 @@ $Cxx.namespace("cereal"); + # DO rename the structs + # DON'T change the identifier (e.g. @0x81c2f05a394cf4af) + +-struct CustomReserved0 @0x81c2f05a394cf4af { ++struct SteeringInfo @0x81c2f05a394cf4af { ++ active @0 :Bool; ++ steeringAngleDeg @1 :Float32; ++ steeringRateDeg @2 :Float32; ++ steeringAccelDeg @3 :Float32; + } + + struct CustomReserved1 @0xaedffd8f31e7b55d { +diff --git a/cereal/log.capnp b/cereal/log.capnp +index 1209f3fd9..b189f58b6 100644 +--- a/cereal/log.capnp ++++ b/cereal/log.capnp +@@ -2558,14 +2558,14 @@ struct Event { + + # DO change the name of the field + # DON'T change anything after the "@" +- customReservedRawData0 @124 :Data; ++ rawCanData @124 :Data; + customReservedRawData1 @125 :Data; + customReservedRawData2 @126 :Data; + + # DO change the name of the field and struct + # DON'T change the ID (e.g. @107) + # DON'T change which struct it points to +- customReserved0 @107 :Custom.CustomReserved0; ++ steeringInfo @107 :Custom.SteeringInfo; + customReserved1 @108 :Custom.CustomReserved1; + customReserved2 @109 :Custom.CustomReserved2; + customReserved3 @110 :Custom.CustomReserved3; +``` + +--- + Example --- ```python From ae58be87bce08f03389eb13f60e4496e0da40400 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sat, 18 Jan 2025 13:29:02 -0800 Subject: [PATCH 10/10] cereal fork compatibility (#34414) * more custom * cleanup * lil more --- cereal/custom.capnp | 34 +++++++++++++++++++++++++++++++++- cereal/log.capnp | 18 +++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/cereal/custom.capnp b/cereal/custom.capnp index 369222add8..3348e859ef 100644 --- a/cereal/custom.capnp +++ b/cereal/custom.capnp @@ -7,7 +7,9 @@ $Cxx.namespace("cereal"); # These structs are guaranteed to remain reserved and empty in mainline # cereal, so use these if you want custom events in your fork. -# you can rename the struct, but don't change the identifier +# DO rename the structs +# DON'T change the identifier (e.g. @0x81c2f05a394cf4af) + struct CustomReserved0 @0x81c2f05a394cf4af { } @@ -37,3 +39,33 @@ struct CustomReserved8 @0xf416ec09499d9d19 { struct CustomReserved9 @0xa1680744031fdb2d { } + +struct CustomReserved10 @0xcb9fd56c7057593a { +} + +struct CustomReserved11 @0xc2243c65e0340384 { +} + +struct CustomReserved12 @0x9ccdc8676701b412 { +} + +struct CustomReserved13 @0xcd96dafb67a082d0 { +} + +struct CustomReserved14 @0xb057204d7deadf3f { +} + +struct CustomReserved15 @0xbd443b539493bc68 { +} + +struct CustomReserved16 @0xfc6241ed8877b611 { +} + +struct CustomReserved17 @0xa30662f84033036c { +} + +struct CustomReserved18 @0xc86a3d38d13eb3ef { +} + +struct CustomReserved19 @0xa4f1eb3323f5f582 { +} diff --git a/cereal/log.capnp b/cereal/log.capnp index 83e64b5a85..1209f3fd95 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -2554,11 +2554,17 @@ struct Event { livestreamWideRoadEncodeData @121 :EncodeData; livestreamDriverEncodeData @122 :EncodeData; + # *********** Custom: reserved for forks *********** + + # DO change the name of the field + # DON'T change anything after the "@" customReservedRawData0 @124 :Data; customReservedRawData1 @125 :Data; customReservedRawData2 @126 :Data; - # *********** Custom: reserved for forks *********** + # DO change the name of the field and struct + # DON'T change the ID (e.g. @107) + # DON'T change which struct it points to customReserved0 @107 :Custom.CustomReserved0; customReserved1 @108 :Custom.CustomReserved1; customReserved2 @109 :Custom.CustomReserved2; @@ -2569,6 +2575,16 @@ struct Event { customReserved7 @114 :Custom.CustomReserved7; customReserved8 @115 :Custom.CustomReserved8; customReserved9 @116 :Custom.CustomReserved9; + customReserved10 @136 :Custom.CustomReserved10; + customReserved11 @137 :Custom.CustomReserved11; + customReserved12 @138 :Custom.CustomReserved12; + customReserved13 @139 :Custom.CustomReserved13; + customReserved14 @140 :Custom.CustomReserved14; + customReserved15 @141 :Custom.CustomReserved15; + customReserved16 @142 :Custom.CustomReserved16; + customReserved17 @143 :Custom.CustomReserved17; + customReserved18 @144 :Custom.CustomReserved18; + customReserved19 @145 :Custom.CustomReserved19; # *********** legacy + deprecated *********** model @9 :Legacy.ModelData; # TODO: rename modelV2 and mark this as deprecated