From abb964649999e15192f67e1c8f3b2b526d16a564 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Fri, 16 Oct 2026 09:47:39 -0500 Subject: [PATCH] FLM Calibration Lifecycle Keep bounded automatic learning collection through valid live calibration refinements. Retire generations on resets or invalid calibration, preserve live physical transforms and existing controller tunes, and validate fitted coefficient bounds before publication. Exercise the current controller and historical wire paths. --- openpilot/cereal/custom.capnp | 1 + openpilot/cereal/gen/cpp/custom.capnp.c++ | 107 ++++--- openpilot/cereal/gen/cpp/custom.capnp.h | 46 ++- openpilot/cereal/libcereal.a | Bin 1252296 -> 1252552 bytes openpilot/selfdrive/pandad/pandad | Bin 5373192 -> 5373192 bytes .../starpilot/flm/calibration_lifecycle.py | 109 +++++++ openpilot/starpilot/flm/global_runtime.py | 35 ++- openpilot/starpilot/flm/learning_wire.py | 27 +- .../starpilot/flm/runtime_adapter_registry.py | 23 +- openpilot/starpilot/flm/steerlearnerd.py | 37 ++- .../flm/tests/test_automatic_integration.py | 281 ++++++------------ .../flm/tests/test_automatic_learning_wire.py | 14 +- .../flm/tests/test_calibration_lifecycle.py | 263 ++++++++++++++++ .../flm/tests/test_live_calibration_paths.py | 191 ++++++++++++ openpilot/tools/replay/replay | Bin 11542720 -> 11542808 bytes panda/board/obj/body_h7.bin.signed | Bin 210540 -> 210540 bytes panda/board/obj/bootstub.body_h7.bin | Bin 12040 -> 12040 bytes panda/board/obj/bootstub.panda.bin | Bin 11176 -> 11176 bytes .../obj/bootstub.panda_can_ignition_only.bin | Bin 11176 -> 11176 bytes panda/board/obj/bootstub.panda_h7.bin | Bin 18824 -> 18824 bytes .../bootstub.panda_h7_can_ignition_only.bin | Bin 18824 -> 18824 bytes .../obj/bootstub.panda_h7_hkg_remote.bin | Bin 18824 -> 18824 bytes ....panda_h7_hkg_remote_can_ignition_only.bin | Bin 18824 -> 18824 bytes panda/board/obj/bootstub.panda_h7_remote.bin | Bin 18824 -> 18824 bytes ...stub.panda_h7_remote_can_ignition_only.bin | Bin 18824 -> 18824 bytes .../obj/bootstub.panda_h7_tesla_wake.bin | Bin 18824 -> 18824 bytes ....panda_h7_tesla_wake_can_ignition_only.bin | Bin 18824 -> 18824 bytes panda/board/obj/bootstub.panda_hkg_remote.bin | Bin 11176 -> 11176 bytes ...tub.panda_hkg_remote_can_ignition_only.bin | Bin 11176 -> 11176 bytes panda/board/obj/bootstub.panda_remote.bin | Bin 11176 -> 11176 bytes ...ootstub.panda_remote_can_ignition_only.bin | Bin 11176 -> 11176 bytes panda/board/obj/bootstub.panda_tesla_wake.bin | Bin 11176 -> 11176 bytes ...tub.panda_tesla_wake_can_ignition_only.bin | Bin 11176 -> 11176 bytes panda/board/obj/gitversion.h | 2 +- panda/board/obj/panda.bin.signed | Bin 201952 -> 201952 bytes .../obj/panda_can_ignition_only.bin.signed | Bin 201928 -> 201928 bytes panda/board/obj/panda_h7.bin.signed | Bin 211268 -> 211268 bytes .../obj/panda_h7_can_ignition_only.bin.signed | Bin 211244 -> 211244 bytes .../board/obj/panda_h7_hkg_remote.bin.signed | Bin 211352 -> 211352 bytes ...h7_hkg_remote_can_ignition_only.bin.signed | Bin 211336 -> 211336 bytes panda/board/obj/panda_h7_remote.bin.signed | Bin 211268 -> 211268 bytes ...nda_h7_remote_can_ignition_only.bin.signed | Bin 211244 -> 211244 bytes .../board/obj/panda_h7_tesla_wake.bin.signed | Bin 211404 -> 211404 bytes ...h7_tesla_wake_can_ignition_only.bin.signed | Bin 211380 -> 211380 bytes panda/board/obj/panda_hkg_remote.bin.signed | Bin 202036 -> 202036 bytes ...da_hkg_remote_can_ignition_only.bin.signed | Bin 202020 -> 202020 bytes panda/board/obj/panda_remote.bin.signed | Bin 201948 -> 201948 bytes .../panda_remote_can_ignition_only.bin.signed | Bin 201924 -> 201924 bytes panda/board/obj/panda_tesla_wake.bin.signed | Bin 202084 -> 202084 bytes ...da_tesla_wake_can_ignition_only.bin.signed | Bin 202060 -> 202060 bytes panda/board/obj/version | 2 +- prebuilt.json | 2 +- 52 files changed, 872 insertions(+), 268 deletions(-) create mode 100644 openpilot/starpilot/flm/calibration_lifecycle.py create mode 100644 openpilot/starpilot/flm/tests/test_calibration_lifecycle.py create mode 100644 openpilot/starpilot/flm/tests/test_live_calibration_paths.py diff --git a/openpilot/cereal/custom.capnp b/openpilot/cereal/custom.capnp index 9ce42edb2f..38ec63cff8 100644 --- a/openpilot/cereal/custom.capnp +++ b/openpilot/cereal/custom.capnp @@ -1233,6 +1233,7 @@ struct AutomaticLearningSourceReceipt { validUntilMonoTime @6 :UInt64; cpSha256 @7 :Text; calibrationBasis @8 :List(Float64); + calibrationGeneration @9 :Text; } struct LearningApplication { diff --git a/openpilot/cereal/gen/cpp/custom.capnp.c++ b/openpilot/cereal/gen/cpp/custom.capnp.c++ index 77dbc8ea44..1f0b10b95d 100644 --- a/openpilot/cereal/gen/cpp/custom.capnp.c++ +++ b/openpilot/cereal/gen/cpp/custom.capnp.c++ @@ -16136,17 +16136,17 @@ const ::capnp::_::RawSchema s_ccffb4ab144bf131 = { 0, 2, i_ccffb4ab144bf131, nullptr, nullptr, { &s_ccffb4ab144bf131, nullptr, nullptr, 0, 0, nullptr }, false }; #endif // !CAPNP_LITE -static const ::capnp::_::AlignedData<168> b_9fe2d23e75805149 = { +static const ::capnp::_::AlignedData<185> b_9fe2d23e75805149 = { { 0, 0, 0, 0, 5, 0, 6, 0, 73, 81, 128, 117, 62, 210, 226, 159, 13, 0, 0, 0, 1, 0, 3, 0, 89, 10, 85, 29, 102, 186, 38, 181, - 4, 0, 7, 0, 0, 0, 0, 0, + 5, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 98, 1, 0, 0, 41, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 37, 0, 0, 0, 255, 1, 0, 0, + 37, 0, 0, 0, 55, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 117, 115, 116, 111, 109, 46, 99, @@ -16156,70 +16156,77 @@ static const ::capnp::_::AlignedData<168> b_9fe2d23e75805149 = { 117, 114, 99, 101, 82, 101, 99, 101, 105, 112, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 36, 0, 0, 0, 3, 0, 4, 0, + 40, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 0, 66, 0, 0, 0, + 9, 1, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 232, 0, 0, 0, 3, 0, 1, 0, - 244, 0, 0, 0, 2, 0, 1, 0, + 4, 1, 0, 0, 3, 0, 1, 0, + 16, 1, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 16, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 241, 0, 0, 0, 66, 0, 0, 0, + 13, 1, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 236, 0, 0, 0, 3, 0, 1, 0, - 248, 0, 0, 0, 2, 0, 1, 0, + 8, 1, 0, 0, 3, 0, 1, 0, + 20, 1, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 245, 0, 0, 0, 58, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 0, 3, 0, 1, 0, - 252, 0, 0, 0, 2, 0, 1, 0, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 249, 0, 0, 0, 130, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 248, 0, 0, 0, 3, 0, 1, 0, - 4, 1, 0, 0, 2, 0, 1, 0, - 4, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 98, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 3, 0, 1, 0, - 12, 1, 0, 0, 2, 0, 1, 0, - 5, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 1, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 9, 1, 0, 0, 138, 0, 0, 0, + 17, 1, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 1, 0, 0, 3, 0, 1, 0, 24, 1, 0, 0, 2, 0, 1, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 21, 1, 0, 0, 130, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 20, 1, 0, 0, 3, 0, 1, 0, + 32, 1, 0, 0, 2, 0, 1, 0, + 4, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 29, 1, 0, 0, 98, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 28, 1, 0, 0, 3, 0, 1, 0, + 40, 1, 0, 0, 2, 0, 1, 0, + 5, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 37, 1, 0, 0, 138, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 40, 1, 0, 0, 3, 0, 1, 0, + 52, 1, 0, 0, 2, 0, 1, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 21, 1, 0, 0, 154, 0, 0, 0, + 49, 1, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 24, 1, 0, 0, 3, 0, 1, 0, - 36, 1, 0, 0, 2, 0, 1, 0, + 52, 1, 0, 0, 3, 0, 1, 0, + 64, 1, 0, 0, 2, 0, 1, 0, 7, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 33, 1, 0, 0, 74, 0, 0, 0, + 61, 1, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 1, 0, 0, 3, 0, 1, 0, - 44, 1, 0, 0, 2, 0, 1, 0, + 60, 1, 0, 0, 3, 0, 1, 0, + 72, 1, 0, 0, 2, 0, 1, 0, 8, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 41, 1, 0, 0, 138, 0, 0, 0, + 69, 1, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 44, 1, 0, 0, 3, 0, 1, 0, - 72, 1, 0, 0, 2, 0, 1, 0, + 72, 1, 0, 0, 3, 0, 1, 0, + 100, 1, 0, 0, 2, 0, 1, 0, + 9, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 1, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 97, 1, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 100, 1, 0, 0, 3, 0, 1, 0, + 112, 1, 0, 0, 2, 0, 1, 0, 118, 101, 114, 115, 105, 111, 110, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -16303,16 +16310,26 @@ static const ::capnp::_::AlignedData<168> b_9fe2d23e75805149 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 99, 97, 108, 105, 98, 114, 97, 116, + 105, 111, 110, 71, 101, 110, 101, 114, + 97, 116, 105, 111, 110, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_9fe2d23e75805149 = b_9fe2d23e75805149.words; #if !CAPNP_LITE -static const uint16_t m_9fe2d23e75805149[] = {8, 7, 1, 2, 5, 3, 4, 6, 0}; -static const uint16_t i_9fe2d23e75805149[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; +static const uint16_t m_9fe2d23e75805149[] = {8, 9, 7, 1, 2, 5, 3, 4, 6, 0}; +static const uint16_t i_9fe2d23e75805149[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const ::capnp::_::RawSchema s_9fe2d23e75805149 = { - 0x9fe2d23e75805149, b_9fe2d23e75805149.words, 168, nullptr, m_9fe2d23e75805149, - 0, 9, i_9fe2d23e75805149, nullptr, nullptr, { &s_9fe2d23e75805149, nullptr, nullptr, 0, 0, nullptr }, false + 0x9fe2d23e75805149, b_9fe2d23e75805149.words, 185, nullptr, m_9fe2d23e75805149, + 0, 10, i_9fe2d23e75805149, nullptr, nullptr, { &s_9fe2d23e75805149, nullptr, nullptr, 0, 0, nullptr }, false }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<168> b_82b6c8ea6a6efabd = { diff --git a/openpilot/cereal/gen/cpp/custom.capnp.h b/openpilot/cereal/gen/cpp/custom.capnp.h index cddfc7387e..ea8f135c62 100644 --- a/openpilot/cereal/gen/cpp/custom.capnp.h +++ b/openpilot/cereal/gen/cpp/custom.capnp.h @@ -1502,7 +1502,7 @@ struct AutomaticLearningSourceReceipt { class Pipeline; struct _capnpPrivate { - CAPNP_DECLARE_STRUCT_HEADER(9fe2d23e75805149, 3, 4) + CAPNP_DECLARE_STRUCT_HEADER(9fe2d23e75805149, 3, 5) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE @@ -10792,6 +10792,9 @@ public: inline bool hasCalibrationBasis() const; inline ::capnp::List::Reader getCalibrationBasis() const; + inline bool hasCalibrationGeneration() const; + inline ::capnp::Text::Reader getCalibrationGeneration() const; + private: ::capnp::_::StructReader _reader; template @@ -10864,6 +10867,13 @@ public: inline void adoptCalibrationBasis(::capnp::Orphan< ::capnp::List>&& value); inline ::capnp::Orphan< ::capnp::List> disownCalibrationBasis(); + inline bool hasCalibrationGeneration(); + inline ::capnp::Text::Builder getCalibrationGeneration(); + inline void setCalibrationGeneration( ::capnp::Text::Reader value); + inline ::capnp::Text::Builder initCalibrationGeneration(unsigned int size); + inline void adoptCalibrationGeneration(::capnp::Orphan< ::capnp::Text>&& value); + inline ::capnp::Orphan< ::capnp::Text> disownCalibrationGeneration(); + private: ::capnp::_::StructBuilder _builder; template @@ -26365,6 +26375,40 @@ inline ::capnp::Orphan< ::capnp::List> Automa ::capnp::bounded<3>() * ::capnp::POINTERS)); } +inline bool AutomaticLearningSourceReceipt::Reader::hasCalibrationGeneration() const { + return !_reader.getPointerField( + ::capnp::bounded<4>() * ::capnp::POINTERS).isNull(); +} +inline bool AutomaticLearningSourceReceipt::Builder::hasCalibrationGeneration() { + return !_builder.getPointerField( + ::capnp::bounded<4>() * ::capnp::POINTERS).isNull(); +} +inline ::capnp::Text::Reader AutomaticLearningSourceReceipt::Reader::getCalibrationGeneration() const { + return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( + ::capnp::bounded<4>() * ::capnp::POINTERS)); +} +inline ::capnp::Text::Builder AutomaticLearningSourceReceipt::Builder::getCalibrationGeneration() { + return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( + ::capnp::bounded<4>() * ::capnp::POINTERS)); +} +inline void AutomaticLearningSourceReceipt::Builder::setCalibrationGeneration( ::capnp::Text::Reader value) { + ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( + ::capnp::bounded<4>() * ::capnp::POINTERS), value); +} +inline ::capnp::Text::Builder AutomaticLearningSourceReceipt::Builder::initCalibrationGeneration(unsigned int size) { + return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( + ::capnp::bounded<4>() * ::capnp::POINTERS), size); +} +inline void AutomaticLearningSourceReceipt::Builder::adoptCalibrationGeneration( + ::capnp::Orphan< ::capnp::Text>&& value) { + ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( + ::capnp::bounded<4>() * ::capnp::POINTERS), kj::mv(value)); +} +inline ::capnp::Orphan< ::capnp::Text> AutomaticLearningSourceReceipt::Builder::disownCalibrationGeneration() { + return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( + ::capnp::bounded<4>() * ::capnp::POINTERS)); +} + inline ::uint16_t LearningApplication::Reader::getVersion() const { return _reader.getDataField< ::uint16_t>( ::capnp::bounded<0>() * ::capnp::ELEMENTS); diff --git a/openpilot/cereal/libcereal.a b/openpilot/cereal/libcereal.a index c0d4180ae7e7f799722a05b32874f35c165c564a..d5a6a17a7ad62baba747d1f26921e2450be9b793 100644 GIT binary patch delta 21250 zcmds-U8=&=fB1F(UsjH~-Tzm;@87#en?VCoL!YAtI{32MP|v$%X}N>FW? zeknrCPy9Gy^Msc|L~HV;oZBh19WvT)zA-aoLO2PMZ!Qg~FB3Ne@y!dChP+RvRm}<6 zTs0@O=+(dRp#xB zRD=$DbHw9AMhqD_;B6eqXMYHJ zbaTw;us7S$P90?C$6@u{1x+o>dYO8xFcyA89S^1+(vciB(<}aBtfQa7wWm5(a z*@ySl3bCoDazEZ*E1`fYDQ-SMOOJx84&;Nh)D=)|Fdw3ok$~#2@K?1m8c<^>AEuR_ zfz%WA8h>3YF9D+8;KQ}@V-WS!9Kqkz%5gxgRQ{G$_6Ji>%t$^;E5*Uo?Wz4XAFZX1 zm8i${4j-eXL_nRfe4JK34Wpjeclmg&6aeZ@;AvW^7EV3&-s5hqL<8!l^NCt11T>h$ zCu?OtpyB&`idHT}P*0<&e419=mqCp)_;f8TsZ2d_Gx$s`EeG5;i)U(OYZdBgGMmrQ z$}T|DEIwB&R{_oD@%dW00cgH}FVxD?s?^hB5tmw71!$Sg7i(oc;6` z3~IHE=V)nGb?RxooUhP@<^%4}j9^fKK`RORb~;62IbKYh@6i^A=v9l^K9Xw(@VZk_mWp8~;`-gKANa`?2kO zhnC&|b=k>xX(=1fbvNImm8F2k3;B0iDFSrc%lB!e81Te?UZj=OziXv2pywa_v{rfoUOdCkY9$%a>m2_R3eNvzQ1W?x zK}%BsFJ0uNy3h(h?@Ro$Ry=^0ukfo{85>JIeXjBATA2XodxPK9${&D!xAKXWNz<*lm3m9Y(n-E>>k^0m#m=c>2QxG_W z6Fb1DZv$Vki5+OvF~C;^v4f2IJ8)<)u`3z%EO1x|u|thIy8+JsYhlC=H*z-k^$21| z8hH=!jmpHXV${9B;Z=!U&8WA4BdQa-hEe|pz8OXAXrnf3L_MiBiCxR6_XFRGA$Dz} zz6BiVB6b~eL*IYLf=9&?yRMO6YD_(E*CTd)Q#b`Ux&g5p8uc>pokqlNY}8x8F>%Dc z A>KWUF*iDUE7dWmNv6~z9I`G{V#BOQSyK%VxjgKdGD_M^s-1fD`3BX$>~zXzU5x)S?wqfZ1+Bi)Gogwa22&O909 zNn$@`^gQr%@-(r#8@*2p=9xiy5c?UUr+{Y?cM`FmHHK$eGS4jX9I>A_hUdYVX8~rWtT+)ZweT}{pJdgAvc7LNU2hVqt z6k-oBhL)|EX8{>V>_NuR9=wnYCiW1cPXR9?uMqoHqfZA*GL+cEj2_aOd9ulC#D3lA zRltkM8^j)N^bz1CWCXF_H2O%ednrjJ_FKlV9vREXNMesNhK=AH@;0$Y8$J4d=2=eO zA@&%f$AVXovBVx{^pppfCzrfS?D0k)1on^##7;B%S8bW+1M(iR-A3QlmbpDENjkA7 z8p9nJR*^}>o@@;Fz^lpo#GYdG``R(j8ZwpG(~RB>yq07Td%Dq|2d^VDh&|KjFM>ZL zvxuE(^bGL-$ZTTIG5XAQZsz%jWD$F=G5iU`$7CL{=NrRC@OrX<*b9w*s{`|FAd84C zjs7qA6Ov8r#YXS>5cA}bCB$B8^q0UJ$ueT+7=0f2Q?i`cD~!I#jf~GoF0nnvu(Tud zd`>jkBr_C{3ZFA z*z1kH1N;@)K`JC9BjJ_MZm3%?$%|_n~ z{)Xfe`%9ybOJtsHk3yglVGxKaGTZ#RR*4@@!Wb7c@i2bcGRDXCcBBf$LKbA4=E(}cSc{+m3a!uUSjVv`UdcKWIqWk zBIBB2w5O`^hgP@R-3t%u_^uC4tAuKBW$0 zo&)402`nLhDqP4s-;+}$@HcW(VK(y=lix|;9|jjQ&p~pU1fC(JIn))*^8-0Y#Gj;& zLKk74ABp=s5f?~PmC+Cxhe#H9SJ@|s#8(J@F?(E zJd%lM+F1F=fzOdzRK(D(ikZzkf0Ei%xaf0=D}m3GI#k3O4zY3nxj^btQIGahhRQHp zBn_x&NGB-n0xl(usAy~&^fdSqiKF5^swd0a;LD^56-{Y|@{b2!A4~2ZKw)#0pBA}QSmf=O!4Po%=0hlPDKxzr1)#_f8-e|k_>MF zr_*Ptc#i6;Z98}(eV&RJXdmUT5sqyD?McOphTT!fm`r<7kxYjwgA4pV?M=nYbgJUL z;3>2Z6@3lw15c&>sOV4UDg7XL8XZ8zK)O+JX#}L-cW>7KRa5i`` zok7J+I$ZgegO|`uDrTcY>iKVWb>>-0=TMPl3d{vBqjRa4XLuesht8*B0iCG=WP_K} zMN~+mUj?tA*;Fj1A1eJeIF~M^Vwt%N>qlW5Ky#>AZbqmn_yf9vid?$Ut%kT6GFIYM zhxmXNssOFQtLQ2!R+~w=7`&RUp<=D!CEzu59Tgv%NtO#)Hjs8Z(@8-^#1OAr&LB(kke;0T=Jwx5% zEZwLo*pG}I^iL|zn{!mDHnsuu0u>j{ViXSEMN6r;WH9*nuf^ONB^PXuHi=D{q!Cc|I$jW z5uh2kh+0e#rtf6Ezy~O0g0cIQ-Vgje4Pe4%dTp2jE~bG@2==(rXMqpWU?wWD!HU;_ zf1vJACc@ZcmGN#YHUu=Bi3r2v!G~xh6P4KT_)Z|595%Efk?GYns{!@{v@;WrFnwoT)Bx-MdHN_5kC_Y!!v$J-nGyO9TuPr{;z_1AD8=AQ^eHBuHu`PwW!jyI9_%sIfd9Z(Xc808 zGQD=RXoUR$eU6Fe*&wC2YJ~Ow8hwF@o+hI;4A<$4O!Q)JDnonl4f+xjy-k2o;G6Vi zCi*bFMSBN)i}q!rpW!j!zi59ZQkb6gY2e#*022dE`Ij4GKR^dDG1#1fer{ykp+lH> z#bopc|3hD8Vkpzs{Sfe7I*f_eOn|H4d-QcC-eCH=zXAT24rgM7;hW(9=$lNWvP{*1 zf57Q%Bom{|DUFT8et^Br#Ax=B(%p@bF^P>~Vyv0fH^GzHI40g@`p$O;{5~7c#010t zfTyrDCf;M;sQ~0Y><3sn6BA7XW`d`&NlZ*OJPVw`-e+P8JFEQjz|+|@CNgw~+}0et zsF=Z~Gckkdd;dJ}Og58=S%&9>XR%BsX0w0?5MVJllVve6*9`gB;Mr^*6Z2U;rEdq% zVGEg9WUhj0cu$eVBoo=Jv(lr%bJ=1hmMF&hTN4@c*it5zvF^$c3!cxGGqJ+V>Sw?U zSS}MDrWd0Z!3)_3Osq7ME*-pxtzu#|dtH^E29|6s6YI<=`v@;Wve}1B{Lfsr8^DX% zM@)PSR_p&K$XLSGGqHiqPysf9m$E!2HZr{h>(>JN0rn{qpBe5C&S9T3v5DzT=n(L7 z_5~B0ncjpx+Y=E#4wu_0~W&~2fYuFwp3YlID#(>wd@0i$YCS4AA9oxsm zezsdRU={d7c7TcRnOomVTj5R0|5z~-2bq4dX$$^{{lLVJhTDNZW`~$K%>GaT62R-( zPfQ#&6-)zfU_UeQi{T9LC+rv#zcShe{@LI>c7lnM=9Glt#mYuj!o(@JsUQ*=pR(VW z_}y@2@Mr7~CQh?h6(9=yIXlb5Id6}_7=0$r8-5G?1-rn+MfR}rj{$FHmzcP0Cg~^O ze0GJ2tA_KyU$SdVxUZYV>d;Uvhj)sK7joI`;Q5WPg6V$yp2&V7}w7cTiRkjz&Lk{0KP^Ub|7Or zv$+T~yc3Kw&P5RaROx%cJ6RLQ|--;RD)a+*ATtslaJU0dJVUb)^ z=6Va(8eGV#a8Z@(<+&&LJ66rjMRl$xRUc&RWi_~n;(BqJ0p7==xv0sDRRiXN_p=x- zYIA*`xBxC{6KEUd7QIG4@?{)|52UvYB8t~Az(C>naSwk)w8NLTT$lQ&& zh~v@9z#hVefHmQwsp&y4@Qhs>el8v` zyb$~oYr{ob-c$LPf{(KHTs+A2VwBSn`vEuWz{Nv+lrrQZ;}_PEiv+_S@G1)Bivd&yQ!u3_NEdl!h_9z#RnGx9qKEb+h(be#7@JaSK7v1=BRenFXggwc{Q)Yxa zJdE}K6nmPB?k3|QWc(4Ch%27Xu7` z2fn}taxsYOhtu!D7ujGghH!mn9G{5&0DFatR}D`9Ut&YK7{+g_3MPRsv)8$J!wmUf zov|Na!?_s2YqW!Yr?VRy0`?{ssV3te7_PCmxERUnD+751`vLYg7o$ypsK>A$VDE4- zhCib8THu>(EEnSp$AE9KcexnP^_Hw27*{YCXm zgU6Jox2W1MvPKVeI547WqsYd(rdOi8b-x-D8Jn!cS+SMtR*Sojr>{b5L&GkkqA+!6 zRUarP><^1|zoIIs)}}3Aq3RCNXhreEB!dRzM-N2a0dml)`8|0LhXGrxnuo|*byR?L zf}bFX#Bs&JRP30JJEpVbD058zs8BXu$eB=8)RJssT_j1|vCSZ`#XGhH$90_y4Rl`^>^Il)e=@e08U71POR zb);iGNt0_it_wC?O&nJ{$Mq6T3{WmNrpW=EE!c)Tws##{3f(50VA&Kd>9|%ou2*Sn zsN-6t#&x^n`rdJkpoQhJ7OPmLEwLpw?Z4yL#?ZL((QgP>2;S;=JE@LzCnwO`<&$-V zYJC&O)y{EEp-JV#dS1C+a9jh7%Z;mO7ELL)T~xM_j?L`^TZng1PA3nm(a&;RIgV=y zZ6D;g)~Zf!a9m$Iu9bLlH!e3u|92Iv$g%z6*f!9T@`l}24ZGmDZac2cG`@Vm8o^Wz zuRzRz)l)|puv&Z@z3nus4m|gJJ?=xKlh+i*chS`HIekFYm*j-%>$rZPN#*r5f$3ex zG|e#`qlx7wC_{zHc3i6+*E#AwS{~~mxV~^)I~>Op?hBKm(@I38!lAS;y zEIrII6{`zlnB#g!yYNUB#jD`Gl4CoiX2Sx<=5d0>u&nY4_=9qN>bSmfT=iLE`Bj#o zCSbASI_|iduq$S?Q2zmPLJikt$9C7TwPUg64f{h?8H&ehGh8**kshvxnWgU~`c{&w zVl{PK?H$)MEV=y3_((PE321H;>_x|x%<{{}z8zd|JFzA@rnm57&Ka<}FwJvJD;(21 zEUA1(>{ZRmb6f>wE;o0x`0|-LRoMBK9v=gUy6S#*G0$mx7SsR&tX@bX1U-A z#`B};V0Cq*M{5Ba8|;|AcdLPD?ARV~Y&k5syo*g?dd@NRcT8)TRX(Pz3m>&Pv?n^Xsm%1>)(-j9685q(|%w%PkLfNVyt1uGWsLl;xHW*aI*<>X?!o(_L0r zK44#Bz}#ejV;kYv2p?Oy{2ZxedzRx`?6`t?YI%(h7Jg>a*M^xhvJFef_ zsP#|xF_uR}IW&kB@3)KvJ-*L@#Tu<<%^7D9JwQHs0%5z*v+$x_s>8i$W z+v5IXnt#Bt_2q@-)AdVbJLv?w=(t|v8I_y?yQ&&?&v6Cg;l&KtD4reRxaO-98K*Qo zU~SZq*?&#qh2A4Y1q)FVlqJ@|2b z;gd%-lh~?(yiR50 zxzqzk9rd5V)v2qn5q@G?;HMUij%kauCW(uU4y1KDDRmrT)pAneFL0pKQ%tY^huw+sjxa{1vNNlrMl%> z;a6;|3F@uCrH?hha_#i9ZZl0aEj{Yv46$72{hZlVeA+S!W9qa8r^snbL(3IW&pT>v z-Rwl)^K#B|wJnpi8s|HxLo8PxKQ+0QPo1yB>eLzFQ|J9Y$J}yFDhuJQA693st@E)4 zS*~?uR^66u!l$+I!|sM&nwjS>JbB#hH_3 z&H#q5lb?FqcmA*NX_By9L;RdczTnA_8 zeUMLY8>0vJ{NyO#b2!Ly)o)-b_V&NTx8}P(T?n&WPk60nq~d*tqLJkqQKss<$Zek{ z*0Egk%0zwcQhn#~0aJ-v7pr8s^8KtyzO^*5T*v*?MBf3=uw1O6?SGu3jfb^FPMzL&w@maC{t)o1XEPrWY7b+t^?Cva@A&k20S=^wgR z8C!`s-|i**bii#jwOk$jWXpG?u=cnH`pI#=!@SyZW%#K_eY=0ma&7QayZLs1y5%|) z=Xd{!_nkXkE!Q2t!X>_Ee}d(Tz0bE(xxQszuv}gJRi7?f4_L0(%T#m!FZAv5gT8~; z(sIo$^O|w4>^sh=)VWaVS+31~)>Pk0TUf4N{nR|&;IjS4i{iq^QJ_^IwIzEkdBpK8LfQS`H}^SySfVP1UWCnx!yp4Tkb zX+PESJ@e_7s}lCLYT+qc|9mIamzJxQSN85nEBTDYTfV2Kn&s-{XU&fAu~zXtJ-A}h z{H%p)lVLzvQ8+)gML%BycWm)i@ss}lRw&q4g)$q2uV z=5aw_{M0#y9~T7Nf97+0nU0`@F!f_KUBK;?74sHyJF`OQmWw$4QbsjNmotT1 zN)#sAsX|!zLpb~w{Eo?Lx|rM9Wr5It)kxFzrc1cJ!oOOtu$0?bWkq~Tv|PsV$2d-G zZv%30a!dotN1^F*Zm-csCr`y5iq5X!_T?i^A55Ebx!sYJXR0HsrH9+WKAFb(0mt8{ zRB+z6lIv%;RXk`~{AzCDzk8L%S$5U=xqJKkfAdZJxUKBpr&43-u3ovOjGGZ2Azr*&94ek8KuvbS68T{CQw+D1=B~uc^Yi=GfGCUzlemo;QiDb!pGs5TKkBBp8 zhW97QvUFy6OA;?@&kBE>q{|_*kar1`*)t1tPUfg2PM$W@e6F^Po(oH{JUkb{Zp(mq zpeu67JZOn>y`o$hI$u|mFdvjIbLK(HDT_esYCr9T%%ayAY zMah8Wpj6pLB{&z$k(n!ZEk}Vu8M*?AkUdu*vqWxM0ZY6*t&&7pEf<;Sa4szQvOp2q z;sLdnLsW89uJ`D2p&y{YI+^eRC|2eu%92GY$&>et)_f)Cw(P5tbux1$ocXeJr4H6+ z6_P@kwn}FnR|)#J8ku==ib;x)1SOp!dY}ts?KR;wnpE|UdMfrtYSeFqn2fUgHkD0& z)LGeYO?dU_;83F@TYo~mdW_6OIGTJ>u2~b_BD#gwhDBR{ZU>n#xHMqHCl0<;m6d@DvTUUuIK zikCySqCmRbr83iH=r`eGqR-)Nh5BqW?X(DnHV}*p@*5rf-Zv;Kng$eCGHF>uie=_^=*ew)_&b!jE!*rx zrB~$oy@-27?%IpYMA>j30wv0x`=I5@qJ3y`ZoUkgjV9mS7aossXudyuE$#NTJTXO7 zmlyYkr(pQH7r~dlQ!bwi--M#@ZqeC$Oy#-Z{*B0%$BWR2SlRG^PKF-{A5+u%!I<(Q z{LQ#g{(B(2YjpgNCO;l?Rej2O6fgUJAO3iB${~}TS3ypZ1(4O8D@Nav<&a`@s!$#; zMu!XK&0=U*WWqt+{hkLwi84n~qTHk?Ro**@!AO16mJm@_UJ)0OJ}<_vicuIO!-O?GMxe|eki zdl+)ro&HJ%`KT;7jMigP9Y&Whsg7U_O5_le>^g#>I42W+f_6^!{3*PD^wlrJHAfwIAkLos$K8m92Wa&{9T_*#6M&>rz{b$fNIpk+u$*!MaDUk`kpm!ze|MP)Q zevE(E5?S;Mnjc%o$n9(U%dxWgF+@(3qmStcx%wDF;wJwqC|h>_6_g}*DN2$z6~)To z$3eKsA4jbzZB5vtb^ODo$mS;ycBmYE0xcaX51&BMeA)dZnx8L+oJ1z}6ekhroVt!0o`2#lhwaLrs3%tTJ&$@~ z<>>R!vSfjxEO}T_o~(TVlqcI<(B;w;t&* zRoi!)=2$H&wmlOvM!B>UZO2l5Nf%vsNsq-%MJaOlWdur*Q!XP=-Z2v>7XN92?;v37 z02$5fdj)1}YOcUswgrf7?Qc$!rB_hhEm`|&cuR^EzsFUq_)%v~===)qV3~FmF=OOH z<;KFl`)YU#mEJ zdwJz`73A0CaL8nyoYF6%W%L(bSAGT830b6qT=mM^D#+3Do|2o5H%%z4Aip4+_lNwd zS1zs~&yjumN3IC|yo* zL(7&$Ze+&Fd&pEz_WjZ$)RTQ?I&!fARSBMb(ov#NcAp5kBGXiY*99s`mB%MS%aaL{ zK*e(SB+xopqzKEJq72!0GH9F3R0;NVlX2nUrNLxWUm|P24+|a=-Up49yHt`dL#OB{ z!>8zSIa9Rrw8|`zU8W)v%dbijH)rX_ubu@$lQKc=Wp|Yvl?yXY=&Ozhb%i39pi5D$dh>|aNsRX^9i%e|yOtMKO zN%G!YM7brK&%-5Awq~b>o7+*@HYZs2gd(6i@v249AuAo@+#3p-kx&5`{momfv2+gJxE* zkhq}0cvI}1`B%5sktNVs;X_>h(<>w)D9x*#lAV)7+R>B*xu`VaVVcr<+L6)-d?Pm> KDXo01`Tqk}jy;k9 delta 20929 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 diff --git a/openpilot/selfdrive/pandad/pandad b/openpilot/selfdrive/pandad/pandad index 63396812685f115498aba746c3c8ab157bcb54ee..9af5a51d8f557c0df4b5b5d318e788b96a111a01 100755 GIT binary patch delta 1741 zcmZ9~eN2^g6bJC1VYD+|8=#jd)w~qlC7Qn9K8e$)yW@8?L48aJp5OTP0Yjey{=jApip5F$jW<@HhlR z2yB8-cmg(i+$#T4Oy{KX7>Cnlkz<^jb=X>ytSTQ2`YV4>Thw+`#i?4YO=y1V+ibEf zq1o!&ye!dnZlM(EwzFwlnAV=6DrG}HoAr9;?CiIT&dYo?+la;NVoMNPH-1Ha^{s)@ z+RrA>_b%=sGRyn5oJX2;)v}A4#azdS=vz;H9oqvaRp!3ra0zYT3<{V020lvRo~sS~ zmr6H0?O$*XQK|&?uUh zBw>tC&=qMOL-VH0jc@EfTxHnT~nAAXQcVJ|3|8%H61Vlg?m2r)tyEG1Xz5 zvT5cl;*QS1}NL(r}F`EphFD>so$>s_Zr9 z*S!a{XvWBqAk-r?{L^l9Z7_{=!a=RIIhYeL>(%m=;sr1lf?TgH6S zn=fkrAb()YX;I!=T* zPPK6b^3f8Xag^#YS*qeVy|(%1sH<;Ws;_?hPWl*2o$6WrZA`Trr_Oq>(5Uwy?=|L) zYr8nrE-wc?msNrN&f*_0E62A delta 1741 zcmZ9~drXye7zgn8d68=%@PwvBiJ+8(0g{5shQ=Q@# z#whejaK#9=)~pU}@%~Y>2&uL3p99GzZQL(j8f`WzY@;uivvuA-K6}RVeSVko{-|I6 zNv#Lx6*Vlrz-v=XXV-=9jvGg;nV&b!H2+oYaH@4qm0-1c!6xtqAMgb~@P`0+2m&Dp zHbXFkK&atV`Ij4BxQn+(m83E;C$+l(Frs! zO41~sqEF?@B%0sJok`B78 z%y0xs#4P`agQjP>h^l1&944#e>>Soz5Z`$|PKH#>FV@M>D#l9nC1uW=2Urn#rEccS|A< zt4f|{GqL1LOqO{z^Nr~x4ko)r+mfm(wdLyvwxPaHb!x0d`}r+ZQF^Hg`#IDCEfrH& z%~J(h_9a@qc7@i6e8`+vXnN6FUaFlye$SkjYW9r{YP22<1Xh@?QKKDLKftNwr>RPu zId{4bXw_D*KF^%Dx-ZzN#bEtubKYrp4_wo#G0Uf?$Op}N z)A}wBwNFpURFzqC-ly9){t4RjJJ`VcRns-v+#6iiU&aQz&G~hGW4%kSMQ%0cE_Xhm ze}UX)&L`?_KVWzm!e9$*g-2i;Y=>}o6e8d;cpP>>B=hYYYlCOiwz!Si5+EO-I3;RxhFF62Qz P6hI*yHEusB+Cl#TOId(? diff --git a/openpilot/starpilot/flm/calibration_lifecycle.py b/openpilot/starpilot/flm/calibration_lifecycle.py new file mode 100644 index 0000000000..a97d7a537a --- /dev/null +++ b/openpilot/starpilot/flm/calibration_lifecycle.py @@ -0,0 +1,109 @@ +"""Calibration estimates share a vehicle frame until the producer resets it.""" +import math +import uuid + + +def calibrated_basis(message): + try: + basis_values, spread_values = message.rpyCalib, message.rpyCalibSpread + if len(basis_values) != 3 or len(spread_values) != 3: + return None + basis = tuple(float(v) for v in basis_values) + blocks = message.validBlocks + if type(blocks) is not int: + return None + spread = tuple(float(v) for v in spread_values) + if (str(message.calStatus) != 'calibrated' or blocks < 5 or blocks > 50 or + len(basis) != 3 or not all(math.isfinite(v) for v in basis) or + len(spread) != 3 or not all(math.isfinite(v) and v >= 0 for v in spread) or + spread[1] > math.radians(4) or spread[2] > math.radians(2)): + return None + return basis, blocks + except (AttributeError, TypeError, ValueError, OverflowError): + return None + + +def generation_valid(value): + return type(value) is str and len(value) == 32 and all(c in '0123456789abcdef' for c in value) + + +class ProducerCalibrationLifecycle: + def __init__(self, token_factory=lambda: uuid.uuid4().hex): + self.token_factory = token_factory + self.token = '' + self.blocks = None + self.issued = set() + + def observe(self, message, *, current): + value = calibrated_basis(message) if current else None + if value is None: + self.token = '' + self.blocks = None + return None + basis, blocks = value + if self.blocks is not None and blocks < self.blocks: + self.token = '' + if not self.token: + if len(self.issued) >= 32: + return None # Bounded reset history; never recycle an old generation. + try: + token = self.token_factory() + except Exception: + return None + if not generation_valid(token) or token in self.issued: + return None + self.token = token + self.issued.add(token) + self.blocks = blocks + return self.token, basis + + +class ConsumerCalibrationLifecycle: + def __init__(self): + self.generation = '' + self.blocks = None + self.rejected = set() + self.exhausted = False + self.current = False + self.last_invalid_ns = 0 + + def retire(self, generation): + if generation and generation not in self.rejected: + if len(self.rejected) >= 32: + self.exhausted = True + else: + self.rejected.add(generation) + + def capture(self, generation): + if not generation_valid(generation): + return False + if self.generation and generation != self.generation: + self.retire(self.generation) + self.generation = generation + return not self.exhausted and generation not in self.rejected + + def reject(self, *, now_ns=0): + self.retire(self.generation) + if type(now_ns) is int and now_ns > self.last_invalid_ns: + self.last_invalid_ns = now_ns + self.blocks = None + self.current = False + + def observe(self, message, *, current, now_ns=0): + value = calibrated_basis(message) if current else None + if value is None: + self.reject(now_ns=now_ns) + return False + _, blocks = value + if self.blocks is not None and blocks < self.blocks: + self.reject(now_ns=now_ns) + self.blocks = blocks + self.current = True + return True + + def admit(self, generation, observed_ns): + if (not self.current or self.exhausted or not generation_valid(generation) or + type(observed_ns) is not int or observed_ns <= self.last_invalid_ns or + generation in self.rejected): + return False + return self.capture(generation) diff --git a/openpilot/starpilot/flm/global_runtime.py b/openpilot/starpilot/flm/global_runtime.py index 8629c5b974..5fce413636 100644 --- a/openpilot/starpilot/flm/global_runtime.py +++ b/openpilot/starpilot/flm/global_runtime.py @@ -42,6 +42,8 @@ class GlobalRuntime: def __init__(self, cp, ci, controller): # Construct AFTER actual LaC selection, startup native/manual configuration. self.cp, self.ci, self.controller = cp, ci, controller + from openpilot.starpilot.flm.calibration_lifecycle import ConsumerCalibrationLifecycle + self._calibration_lifecycle = ConsumerCalibrationLifecycle() self.health_services = ('carState', 'modelV2', 'vehicleParameters', 'lateralDelay', 'driverMonitoringState', 'extrinsicsCalibration') try: self.descriptor = selected_descriptor(cp, ci, controller) @@ -114,6 +116,29 @@ class GlobalRuntime: """Bounded current source/admission checks; invoked immediately before LaC.""" self.used, self.stage, self.frame, self.eligible = False, None, None, False self.source = None + # Capture a fresh V2 generation and calibration interruption before ANY + # unrelated adapter/native/vehicle health gate can return. + tracker = self._calibration_lifecycle + early_source = None + try: + if (type(now_ns) is int and now_ns > 0 and self.descriptor is not None and + sm.seen[SERVICE] and sm.alive[SERVICE] and sm.valid[SERVICE] and sm.freq_ok[SERVICE] and + 0 <= now_ns - int(sm.recv_time[SERVICE] * 1e9) <= SOURCE_LEASE_NS): + envelope = sm[SERVICE] + if envelope.learning.sourceReceipt.version == 2: + early_source = read_source_receipt(SimpleNamespace(valid=True, autoSteeringLearning=envelope), + now_ns=now_ns, cp_sha256=self.descriptor.cp_sha256) + if early_source is not None and not tracker.generation: + tracker.capture(early_source.calibration_generation) + stamp = int(sm.logMonoTime['extrinsicsCalibration']) + receipt = int(sm.recv_time['extrinsicsCalibration'] * 1e9) + current_calibration = bool(type(now_ns) is int and now_ns > 0 and + sm.all_checks(['extrinsicsCalibration']) and + 0 < stamp <= now_ns <= stamp + 500_000_000 and + 0 < receipt <= now_ns <= receipt + 500_000_000) + tracker.observe(sm['extrinsicsCalibration'], current=current_calibration, now_ns=now_ns) + except (AttributeError, KeyError, TypeError, ValueError, OverflowError): + tracker.reject(now_ns=now_ns) self.outcome = None self.centre_frame = None self.centre_raw = () @@ -167,6 +192,8 @@ class GlobalRuntime: stamp = int(sm.logMonoTime[service]) receipt = int(sm.recv_time[service] * 1e9) if not (sm.seen[service] and 0 < stamp <= now_ns <= stamp + maximum and 0 < receipt <= now_ns <= receipt + maximum): + if service == 'extrinsicsCalibration' and hasattr(self, '_calibration_lifecycle'): + self._calibration_lifecycle.reject() raise ValueError('stale_original_source') if self.controller.sat_time > 0: raise ValueError('controller_saturation') @@ -177,7 +204,7 @@ class GlobalRuntime: raise ValueError('stale_receipt') envelope = sm[SERVICE] event = SimpleNamespace(valid=True, autoSteeringLearning=envelope) - source = read_source_receipt(event, now_ns=now_ns, cp_sha256=self.descriptor.cp_sha256) + source = early_source if early_source is not None else read_source_receipt(event, now_ns=now_ns, cp_sha256=self.descriptor.cp_sha256) if ( source is None or source.cp_sha256 != self.descriptor.cp_sha256 @@ -185,7 +212,11 @@ class GlobalRuntime: ): raise ValueError('source_identity_or_clock') calibration = sm['extrinsicsCalibration'] - if str(calibration.calStatus) != 'calibrated' or source.calibration != tuple(float(value) for value in calibration.rpyCalib): + if source.calibration_generation: + if (len(source.calibration) != 3 or not all(math.isfinite(value) for value in source.calibration) or + not tracker.admit(source.calibration_generation, source.observed_ns)): + raise ValueError('calibration_identity_changed') + elif str(calibration.calStatus) != 'calibrated' or source.calibration != tuple(float(value) for value in calibration.rpyCalib): raise ValueError('calibration_identity_changed') if not self.settings_cache.install(source, received_ns=received) or self.settings_cache.current(now_ns=now_ns) is None: raise ValueError('source_cache') diff --git a/openpilot/starpilot/flm/learning_wire.py b/openpilot/starpilot/flm/learning_wire.py index 706fd5bb84..0f8408ba15 100644 --- a/openpilot/starpilot/flm/learning_wire.py +++ b/openpilot/starpilot/flm/learning_wire.py @@ -223,6 +223,11 @@ def result_message(result, session, sequence, now_ns, *, replay_validation=None) raise ValueError('profile bound') if any(not finite(p.excitation_floor) or p.excitation_floor <= 0 for p in profile.parameters): raise ValueError('profile excitation floor') + if any(not all(finite(v) for v in (p.low, p.high, p.max_step, p.slew_per_s, coefficient)) + or p.low > p.high or p.max_step <= 0 or p.slew_per_s <= 0 + or not p.low <= coefficient <= p.high or abs(coefficient) > p.max_step + for p, coefficient in zip(profile.parameters, profile.coefficients, strict=True)): + raise ValueError('profile parameter bound') if not replay_accepts(replay_validation, profile): raise ValueError('actual replay validation required') value.status = 'qualifiedFit' if result.status == 'qualified' else 'rejected' @@ -331,10 +336,12 @@ def write_source_receipt(event, source): not identity(source.cp_sha256) or type(source.observed_ns) is not int or not 0 < source.observed_ns <= source.expires_ns <= source.observed_ns + 500_000_000 ): raise ValueError('source receipt bounds') + if source.calibration_generation and not _calibration_generation(source.calibration_generation): + raise ValueError('calibration lifecycle generation') if source.enabled and (not identity(source.source_epoch) or not source.reset): raise ValueError('enabled source receipt identity') event.autoSteeringLearning.learning.sourceReceipt = { - 'version': VERSION, + 'version': 2 if source.calibration_generation else VERSION, 'enabled': source.enabled, 'manual': source.manual, 'resetGeneration': source.reset, @@ -343,11 +350,13 @@ def write_source_receipt(event, source): 'validUntilMonoTime': source.expires_ns, 'cpSha256': source.cp_sha256, 'calibrationBasis': source.calibration, + 'calibrationGeneration': source.calibration_generation, } def _read_native_source_receipt(row, now_ns, cp_sha256, source_type): - if row.version != VERSION: + version = row.version + if version not in (VERSION, 2): return None cp = str(row.cpSha256) if cp != cp_sha256 or not identity(cp): @@ -382,7 +391,14 @@ def _read_native_source_receipt(row, now_ns, cp_sha256, source_type): manual = bool(row.manual) if not enabled: epoch = str(row.sourceEpoch) - return source_type(enabled, manual, reset, epoch, observed, expires, cp, tuple(calibration)) + generation = str(row.calibrationGeneration) if version == 2 else '' + if version == 2 and not _calibration_generation(generation): + return None + return source_type(enabled, manual, reset, epoch, observed, expires, cp, tuple(calibration), generation) + + +def _calibration_generation(value): + return type(value) is str and len(value) == 32 and all(c in '0123456789abcdef' for c in value) def read_source_receipt(event, *, now_ns, cp_sha256): @@ -394,8 +410,11 @@ def read_source_receipt(event, *, now_ns, cp_sha256): if (type(row) is _DynamicStructReader and row.schema == custom.AutomaticLearningSourceReceipt.schema and type(now_ns) is int and type(cp_sha256) is str): return _read_native_source_receipt(row, now_ns, cp_sha256, SourceState) + version = row.version + if version == 2: + return _read_native_source_receipt(row, now_ns, cp_sha256, SourceState) if ( - row.version != VERSION + version != VERSION or str(row.cpSha256) != cp_sha256 or not identity(str(row.cpSha256)) or not 0 < row.observedMonoTime <= now_ns <= row.validUntilMonoTime <= row.observedMonoTime + 500_000_000 diff --git a/openpilot/starpilot/flm/runtime_adapter_registry.py b/openpilot/starpilot/flm/runtime_adapter_registry.py index 4521c7c677..325821ed9e 100644 --- a/openpilot/starpilot/flm/runtime_adapter_registry.py +++ b/openpilot/starpilot/flm/runtime_adapter_registry.py @@ -235,9 +235,10 @@ class SourceState: expires_ns: int cp_sha256: str calibration: tuple[float, ...] = () + calibration_generation: str = '' -def read_source(cp, params, *, now_ns, cp_sha256=None, calibration=(), vehicle_session=""): +def read_source(cp, params, *, now_ns, cp_sha256=None, calibration=(), vehicle_session="", calibration_generation=''): """Only startup/separate-process settings work; errors disable learning.""" cp_sha256 = car_params_digest(cp) if cp_sha256 is None else cp_sha256 try: @@ -294,8 +295,13 @@ def read_source(cp, params, *, now_ns, cp_sha256=None, calibration=(), vehicle_s unit = vehicle_session else: unit = vin - epoch = digest((tuple((key, None if raw is None else raw.hex()) for key, raw in snapshots), calibration, unit)) - return SourceState(bool(preference.valid and preference.enabled), manual, reset, epoch, now_ns, now_ns + SOURCE_LEASE_NS, cp_sha256, calibration) + if type(calibration_generation) is not str or (calibration_generation and ( + len(calibration_generation) != 32 or any(c not in '0123456789abcdef' for c in calibration_generation))): + raise ValueError('invalid calibration lifecycle') + frame_identity = calibration if not calibration_generation else ('live_vehicle_frame_v2', calibration_generation) + epoch = digest((tuple((key, None if raw is None else raw.hex()) for key, raw in snapshots), frame_identity, unit)) + return SourceState(bool(preference.valid and preference.enabled), manual, reset, epoch, now_ns, + now_ns + SOURCE_LEASE_NS, cp_sha256, calibration, calibration_generation) except (AttributeError, UnicodeError, TypeError, ValueError, OSError, OverflowError): return SourceState(False, False, '', '', now_ns, now_ns + SOURCE_LEASE_NS, cp_sha256) @@ -464,12 +470,19 @@ def physical_observer(sm, cp, collector, now_ns): state_ns, delay_ns = int(sm.logMonoTime['carState']), int(sm.logMonoTime['lateralDelay']) if not 0 < state_ns <= now_ns or now_ns - state_ns > 100_000_000 or not 0 < delay_ns <= now_ns or now_ns - delay_ns > 500_000_000: return None + from openpilot.starpilot.flm.calibration_lifecycle import calibrated_basis generation = digest(tuple(float(v) for v in calibration.rpyCalib)) + estimate = generation + lifecycle = getattr(collector, '_calibration_generation', '') + if lifecycle: + if calibrated_basis(calibration) is None: + return None + generation = digest(('live_vehicle_frame_v2', lifecycle)) cache = getattr(collector, '_physical_calibrator', None) - if cache is None or cache[0] != generation: + if cache is None or cache[0] != estimate: calibrator = PoseCalibrator() calibrator.feed_extrinsics_calibration(calibration) - collector._physical_calibrator = (generation, calibrator) + collector._physical_calibrator = (estimate, calibrator) calibrator = collector._physical_calibrator[1] if not calibrator.calib_valid: return None diff --git a/openpilot/starpilot/flm/steerlearnerd.py b/openpilot/starpilot/flm/steerlearnerd.py index 1a538d0d9d..72143a8908 100644 --- a/openpilot/starpilot/flm/steerlearnerd.py +++ b/openpilot/starpilot/flm/steerlearnerd.py @@ -125,6 +125,7 @@ def run( unavailable_reason = 'actual_adapter_unavailable' return collector = FullrateCollector(adapter) + collector._calibration_generation = source.calibration_generation collector.adapter.select_objective(active_key) # This records primitive actual frames/checkpoints ONLY. No selected # controller update, baseline probes or numerical fitting at100Hz. @@ -260,26 +261,34 @@ def main(): cp_sha256 = car_params_digest(CP) source_cache = [None] vehicle_session = uuid.uuid4().hex + from openpilot.starpilot.flm.calibration_lifecycle import ProducerCalibrationLifecycle + calibration_lifecycle = ProducerCalibrationLifecycle() - def calibration_basis(): - calibration = sm["extrinsicsCalibration"] - if not ( - sm.seen["extrinsicsCalibration"] - and sm.valid["extrinsicsCalibration"] - and sm.alive["extrinsicsCalibration"] - and str(calibration.calStatus) == "calibrated" - ): - return () - return tuple(float(value) for value in calibration.rpyCalib) + def calibration_frame(now): + stamp = int(sm.logMonoTime['extrinsicsCalibration']) + receipt = int(sm.recv_time['extrinsicsCalibration'] * 1e9) + current = bool(sm.all_checks(['extrinsicsCalibration']) and + 0 < stamp <= now <= stamp + 500_000_000 and + 0 < receipt <= now <= receipt + 500_000_000) + return calibration_lifecycle.observe(sm['extrinsicsCalibration'], current=current) + + def current_source(now, frame): + return read_source(CP, params, now_ns=now, cp_sha256=cp_sha256, + calibration=() if frame is None else frame[1], vehicle_session=vehicle_session, + calibration_generation='' if frame is None else frame[0]) def source_reader(now): - # Read once each4Hz receipt renewal, outside all controller/torqued processes. - if source_cache[0] is None or now - source_cache[0].observed_ns >= 250_000_000: - source_cache[0] = read_source(CP, params, now_ns=now, cp_sha256=cp_sha256, calibration=calibration_basis(), vehicle_session=vehicle_session) + # Observe resets on every loop, but keep settings reads at receipt-renewal rate. + frame = calibration_frame(now) + generation = '' if frame is None else frame[0] + if (source_cache[0] is None or generation != source_cache[0].calibration_generation or + now - source_cache[0].observed_ns >= 250_000_000): + source_cache[0] = current_source(now, frame) return source_cache[0] def current_sources(identity, epoch): - current = read_source(CP, params, now_ns=time.monotonic_ns(), cp_sha256=cp_sha256, calibration=calibration_basis(), vehicle_session=vehicle_session) + now = time.monotonic_ns() + current = current_source(now, calibration_frame(now)) return (identity if persistent_unit and epoch == current.source_epoch else '', current.enabled, current.manual, current.reset) persistence = PersistenceModule(params, current_sources) diff --git a/openpilot/starpilot/flm/tests/test_automatic_integration.py b/openpilot/starpilot/flm/tests/test_automatic_integration.py index 06eaa5cef5..35b72e1e1b 100644 --- a/openpilot/starpilot/flm/tests/test_automatic_integration.py +++ b/openpilot/starpilot/flm/tests/test_automatic_integration.py @@ -1,225 +1,130 @@ -"""Composed automatic fit application; synthetic evidence, actual owners and wire.""" - -from contextlib import contextmanager +"""Independent physical fit/replay into current bounded Controls learning stages.""" from dataclasses import replace import json import math -import os from pathlib import Path -import struct import unittest -from unittest import mock from opendbc.car.car_helpers import interfaces -from opendbc.car.gm.values import CAR as GM -from opendbc.car.hyundai.values import CAR as HKG -from openpilot.cereal import messaging -from openpilot.common.params import Params -from openpilot.common.prefix import OpenpilotPrefix -from openpilot.selfdrive.controls.controlsd import Controls -from openpilot.starpilot.flm.automatic import identity_digest -from openpilot.starpilot.flm.learning_producer import AutomaticLearningProducer -from openpilot.starpilot.flm.learning_source import ( - AutomaticLearningConsumer, MAX_AGE_NS, RESET_KEY, SERVICE, learning_payload, -) -from openpilot.starpilot.flm.tests import test_automatic as evidence -from openpilot.starpilot.lateral.controller_selection import ControllerMode, DOCUMENT_KEY as CONTROLLER_KEY, policy_for, replace_mode +from opendbc.car.toyota.values import CAR +from openpilot.starpilot.flm.learning_wire import result_message +from openpilot.starpilot.flm.tests.test_registered_controls_global import controls_for +from openpilot.starpilot.flm.tests.test_registered_accepted_profile import computed_registered_fit +from openpilot.starpilot.flm.tests.test_live_calibration_paths import live_frame, BASE from openpilot.starpilot.lateral.learning_preferences import KEY as PREFERENCE_KEY, replace_preference -from openpilot.starpilot.lateral.tests.test_lane_runtime import feed, publish_corolla_params from openpilot.starpilot.lateral.torque_settings import DOCUMENT_KEY as TORQUE_KEY, replace_field, serialize_document -NOW = 400_000_000_000 + +def current_fit(controls): + for tick in range(30): + live_frame(controls, tick, 'a' * 32) + return computed_registered_fit(controls.CP, controls.global_learning, BASE + 300_000_000) -def float32(value): - """The controller's CarParams torque fields are Float32, not Python doubles.""" - return struct.unpack('= 30: + assert runtime.eligible and runtime.reason != 'qualified', (tick, runtime.reason, vars(runtime._calibration_lifecycle)) + identity = runtime.identity if identity is None else identity + assert runtime.identity == identity + assert controls.LaC.torque_params.to_dict() == tune + assert controls.global_learning.applied_coordinates == (0., 0.) + + +@pytest.mark.parametrize('initial', [True, False]) +def test_actual_core_rejects_old_generation_after_calibration_failure_even_on_other_health_return(initial): + cp = interfaces[CAR.TOYOTA_RAV4_TSS2].get_non_essential_params(CAR.TOYOTA_RAV4_TSS2) + with controls_for(cp, 'standard', True) as controls: + if not initial: + for tick in range(30): + live_frame(controls, tick, 'a' * 32) + start = 0 if initial else 30 + live_frame(controls, start, 'a' * 32, status='recalibrating', blocks=1, healthy=False) + for tick in range(start + 1, start + 31): + live_frame(controls, tick, 'a' * 32) + assert not controls.global_learning.eligible + for tick in range(start + 31, start + 91): + live_frame(controls, tick, 'b' * 32) + assert controls.global_learning.eligible, (controls.global_learning.reason, vars(controls.global_learning._calibration_lifecycle)) + live_frame(controls, start + 91, 'a' * 32, publish=True) + assert not controls.global_learning.eligible + + +def test_actual_core_rejects_calibration_block_regression_until_new_generation(): + cp = interfaces[CAR.TOYOTA_RAV4_TSS2].get_non_essential_params(CAR.TOYOTA_RAV4_TSS2) + with controls_for(cp, 'standard', True) as controls: + for tick in range(30): + live_frame(controls, tick, 'a' * 32) + live_frame(controls, 30, 'a' * 32, blocks=5) + assert not controls.global_learning.eligible + for tick in range(31, 201): + live_frame(controls, tick, 'b' * 32, blocks=5) + assert controls.global_learning.eligible, (controls.global_learning.reason, vars(controls.global_learning._calibration_lifecycle)) + + +class PhysicalSources: + def __init__(self, messages, now): + self.messages = messages + self.logMonoTime = dict.fromkeys(messages, now) + self.recv_time = dict.fromkeys(messages, now / 1e9) + + def __getitem__(self, name): + return self.messages[name] + + def all_checks(self, services): + return True + + +def physical_frame(collector, basis, now=BASE): + motion = messaging.new_message('deviceMotion').deviceMotion + motion.timestamp = now + motion.inputsOK = motion.sensorsOK = motion.posenetOK = True + for name, xyz in (('angularVelocityDevice', (.05, .1, .02)), + ('orientationNED', (.01, .02, .03))): + value = getattr(motion, name) + value.valid = True + value.x, value.y, value.z = xyz + cal = messaging.new_message('extrinsicsCalibration').extrinsicsCalibration + cal.calStatus = 'calibrated' + cal.validBlocks = 50 + cal.rpyCalib, cal.rpyCalibSpread = basis, [0., .001, .001] + cs = SimpleNamespace(steeringPressed=False, brakePressed=False, gasPressed=False, + regenBraking=False, buttonEvents=(), canTimeout=False, canValid=True, + steerFaultTemporary=False, steerFaultPermanent=False, accFaulted=False) + sm = PhysicalSources({'deviceMotion': motion, 'extrinsicsCalibration': cal, + 'carState': cs, 'lateralDelay': SimpleNamespace(lateralDelay=.1), + 'driverMonitoringState': SimpleNamespace(noResponseForceDecel=False)}, now) + cp = SimpleNamespace(steerRatio=14., wheelbase=2.9, centerToFront=1.2, mass=2000.) + with mock.patch('openpilot.starpilot.flm.runtime_adapter_registry.time.monotonic_ns', return_value=now), \ + mock.patch('openpilot.starpilot.flm.runtime_adapter_registry.time.clock_gettime_ns', return_value=now): + return physical_observer(sm, cp, collector, now) + + +def test_actual_physical_observer_updates_live_transform_without_splitting_generation(): + command = SimpleNamespace(native_identity='current-native', state_ns=BASE, + replay_inputs=(('vm.sR', 14.), ('vm.cF', 100000.), ('vm.cR', 100000.), + ('vEgo', 30.), ('steeringAngleDeg', 0.))) + collector = SimpleNamespace(context=('identity', 1, 'normalized_torque', 'stage', 'response', 'a' * 64), + _calibration_generation='b' * 32, _learning_current_native_allowed=True, + ready=[(command, SimpleNamespace(native_allowed=True, apply_ns=BASE))], + adapter=SimpleNamespace(command_domain='normalized_torque')) + first = physical_frame(collector, (0., 0., 0.)) + next_frame = physical_frame(collector, (0., .002, .001)) + assert first is not None and next_frame is not None + assert first.calibration == next_frame.calibration + assert first.yaw_rate != next_frame.yaw_rate + assert first.roll_rad != next_frame.roll_rad + assert first.native_allowed and next_frame.native_allowed + + +def test_new_generation_at_block_regression_is_not_permanently_retired(): + cp = interfaces[CAR.TOYOTA_RAV4_TSS2].get_non_essential_params(CAR.TOYOTA_RAV4_TSS2) + with controls_for(cp, 'standard', True) as controls: + for tick in range(30): + live_frame(controls, tick, 'a' * 32) + live_frame(controls, 30, 'b' * 32, blocks=5, publish=True) + # The first reset observation may pause learning, but its new generation + # must be usable on a subsequent fresh receipt. + for tick in range(31, 201): + live_frame(controls, tick, 'b' * 32, blocks=5) + assert controls.global_learning.eligible, (controls.global_learning.reason, vars(controls.global_learning._calibration_lifecycle)) + + +def test_computed_registered_correction_reaches_controller_with_live_calibration_generation(): + from openpilot.starpilot.flm.tests.test_registered_accepted_profile import computed_registered_fit + + cp = interfaces[CAR.TOYOTA_RAV4_TSS2].get_non_essential_params(CAR.TOYOTA_RAV4_TSS2) + with controls_for(cp, 'standard', True) as controls: + for tick in range(30): + live_frame(controls, tick, 'a' * 32) + runtime = controls.global_learning + identity = runtime.identity + tune = controls.LaC.torque_params.to_dict() + result, validation = computed_registered_fit(controls.CP, runtime, BASE + 300_000_000) + assert result.profile is not None and validation is not None + for tick in range(30, 71): + live_frame(controls, tick, 'a' * 32, basis=(0., .00002, -.00002), + result=result, validation=validation, publish=tick % 25 == 0) + assert runtime.identity == identity + assert runtime.reason == 'qualified' + assert any(value != 0 for value in runtime.applied_coordinates) + assert controls.LaC.torque_params.to_dict() == tune diff --git a/openpilot/tools/replay/replay b/openpilot/tools/replay/replay index 50dc343735202431697a2654eb9eded459693c5b..fac50d6ac238bc74445792bd8dafce9dd05146b6 100755 GIT binary patch delta 92274 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

!%JhWW6@ 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 delta 91157 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 z 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 OzBC7VKFDVVQvp26P)Y^> diff --git a/panda/board/obj/bootstub.body_h7.bin b/panda/board/obj/bootstub.body_h7.bin index ebf456f2c38b8abaf9a8e277937e575cda34b839..cbc7c5bbcd8949f6f2b6e7aab6c708b8255dd186 100755 GIT binary patch delta 21 ccmeB(>xkQsti@rTYG#~lYHGYWTWc;008*6)00000 delta 21 ccmeB(>xkQsti@qwY+zuKYH6}LTWc;008j4*&Hw-a diff --git a/panda/board/obj/bootstub.panda.bin b/panda/board/obj/bootstub.panda.bin index 75b9124ae048c1d46e93d4160c9798fa1478ddff..ff4194a6de2176bfdb2ee604c2ceac09cf85162b 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}xeR5RmbQ&Z#3JJsH^003P72p9kW delta 21 dcmZ1xz9M|XMl}vIV*>+=R7;c1JJsH^003H92j&0( diff --git a/panda/board/obj/bootstub.panda_can_ignition_only.bin b/panda/board/obj/bootstub.panda_can_ignition_only.bin index 75b9124ae048c1d46e93d4160c9798fa1478ddff..ff4194a6de2176bfdb2ee604c2ceac09cf85162b 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}xeR5RmbQ&Z#3JJsH^003P72p9kW delta 21 dcmZ1xz9M|XMl}vIV*>+=R7;c1JJsH^003H92j&0( diff --git a/panda/board/obj/bootstub.panda_h7.bin b/panda/board/obj/bootstub.panda_h7.bin index 8d36904eb3a40e043e0ced7171150319f3f24df8..84fadf4a07052cf58731df403a4b0ca1e8c7d0cc 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4)atq<787)*X1oY> delta 23 fcmeB}%-AuRal=k$4l`o|1B+Bklg$U6kFx>*WEKcR diff --git a/panda/board/obj/bootstub.panda_h7_can_ignition_only.bin b/panda/board/obj/bootstub.panda_h7_can_ignition_only.bin index 8d36904eb3a40e043e0ced7171150319f3f24df8..84fadf4a07052cf58731df403a4b0ca1e8c7d0cc 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4)atq<787)*X1oY> delta 23 fcmeB}%-AuRal=k$4l`o|1B+Bklg$U6kFx>*WEKcR diff --git a/panda/board/obj/bootstub.panda_h7_hkg_remote.bin b/panda/board/obj/bootstub.panda_h7_hkg_remote.bin index 8d36904eb3a40e043e0ced7171150319f3f24df8..84fadf4a07052cf58731df403a4b0ca1e8c7d0cc 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4)atq<787)*X1oY> delta 23 fcmeB}%-AuRal=k$4l`o|1B+Bklg$U6kFx>*WEKcR diff --git a/panda/board/obj/bootstub.panda_h7_hkg_remote_can_ignition_only.bin b/panda/board/obj/bootstub.panda_h7_hkg_remote_can_ignition_only.bin index 8d36904eb3a40e043e0ced7171150319f3f24df8..84fadf4a07052cf58731df403a4b0ca1e8c7d0cc 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4)atq<787)*X1oY> delta 23 fcmeB}%-AuRal=k$4l`o|1B+Bklg$U6kFx>*WEKcR diff --git a/panda/board/obj/bootstub.panda_h7_remote.bin b/panda/board/obj/bootstub.panda_h7_remote.bin index 8d36904eb3a40e043e0ced7171150319f3f24df8..84fadf4a07052cf58731df403a4b0ca1e8c7d0cc 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4)atq<787)*X1oY> delta 23 fcmeB}%-AuRal=k$4l`o|1B+Bklg$U6kFx>*WEKcR diff --git a/panda/board/obj/bootstub.panda_h7_remote_can_ignition_only.bin b/panda/board/obj/bootstub.panda_h7_remote_can_ignition_only.bin index 8d36904eb3a40e043e0ced7171150319f3f24df8..84fadf4a07052cf58731df403a4b0ca1e8c7d0cc 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4)atq<787)*X1oY> delta 23 fcmeB}%-AuRal=k$4l`o|1B+Bklg$U6kFx>*WEKcR diff --git a/panda/board/obj/bootstub.panda_h7_tesla_wake.bin b/panda/board/obj/bootstub.panda_h7_tesla_wake.bin index 8d36904eb3a40e043e0ced7171150319f3f24df8..84fadf4a07052cf58731df403a4b0ca1e8c7d0cc 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4)atq<787)*X1oY> delta 23 fcmeB}%-AuRal=k$4l`o|1B+Bklg$U6kFx>*WEKcR diff --git a/panda/board/obj/bootstub.panda_h7_tesla_wake_can_ignition_only.bin b/panda/board/obj/bootstub.panda_h7_tesla_wake_can_ignition_only.bin index 8d36904eb3a40e043e0ced7171150319f3f24df8..84fadf4a07052cf58731df403a4b0ca1e8c7d0cc 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4)atq<787)*X1oY> delta 23 fcmeB}%-AuRal=k$4l`o|1B+Bklg$U6kFx>*WEKcR diff --git a/panda/board/obj/bootstub.panda_hkg_remote.bin b/panda/board/obj/bootstub.panda_hkg_remote.bin index 75b9124ae048c1d46e93d4160c9798fa1478ddff..ff4194a6de2176bfdb2ee604c2ceac09cf85162b 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}xeR5RmbQ&Z#3JJsH^003P72p9kW delta 21 dcmZ1xz9M|XMl}vIV*>+=R7;c1JJsH^003H92j&0( diff --git a/panda/board/obj/bootstub.panda_hkg_remote_can_ignition_only.bin b/panda/board/obj/bootstub.panda_hkg_remote_can_ignition_only.bin index 75b9124ae048c1d46e93d4160c9798fa1478ddff..ff4194a6de2176bfdb2ee604c2ceac09cf85162b 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}xeR5RmbQ&Z#3JJsH^003P72p9kW delta 21 dcmZ1xz9M|XMl}vIV*>+=R7;c1JJsH^003H92j&0( diff --git a/panda/board/obj/bootstub.panda_remote.bin b/panda/board/obj/bootstub.panda_remote.bin index 75b9124ae048c1d46e93d4160c9798fa1478ddff..ff4194a6de2176bfdb2ee604c2ceac09cf85162b 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}xeR5RmbQ&Z#3JJsH^003P72p9kW delta 21 dcmZ1xz9M|XMl}vIV*>+=R7;c1JJsH^003H92j&0( diff --git a/panda/board/obj/bootstub.panda_remote_can_ignition_only.bin b/panda/board/obj/bootstub.panda_remote_can_ignition_only.bin index 75b9124ae048c1d46e93d4160c9798fa1478ddff..ff4194a6de2176bfdb2ee604c2ceac09cf85162b 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}xeR5RmbQ&Z#3JJsH^003P72p9kW delta 21 dcmZ1xz9M|XMl}vIV*>+=R7;c1JJsH^003H92j&0( diff --git a/panda/board/obj/bootstub.panda_tesla_wake.bin b/panda/board/obj/bootstub.panda_tesla_wake.bin index 75b9124ae048c1d46e93d4160c9798fa1478ddff..ff4194a6de2176bfdb2ee604c2ceac09cf85162b 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}xeR5RmbQ&Z#3JJsH^003P72p9kW delta 21 dcmZ1xz9M|XMl}vIV*>+=R7;c1JJsH^003H92j&0( diff --git a/panda/board/obj/bootstub.panda_tesla_wake_can_ignition_only.bin b/panda/board/obj/bootstub.panda_tesla_wake_can_ignition_only.bin index 75b9124ae048c1d46e93d4160c9798fa1478ddff..ff4194a6de2176bfdb2ee604c2ceac09cf85162b 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}xeR5RmbQ&Z#3JJsH^003P72p9kW delta 21 dcmZ1xz9M|XMl}vIV*>+=R7;c1JJsH^003H92j&0( diff --git a/panda/board/obj/gitversion.h b/panda/board/obj/gitversion.h index e8c3c5b153..4e90c83bc0 100644 --- a/panda/board/obj/gitversion.h +++ b/panda/board/obj/gitversion.h @@ -1,4 +1,4 @@ #pragma once extern const uint8_t gitversion[29]; -const uint8_t gitversion[29] = "DEV-63008e94-P92eb5651-DEBUG"; +const uint8_t gitversion[29] = "DEV-7e63c553-P92eb5651-DEBUG"; diff --git a/panda/board/obj/panda.bin.signed b/panda/board/obj/panda.bin.signed index 769d6c3e25047d4d450521e08f60d20183e90537..6a00b3a9151871056da1cdb87b9a2f88dd654ed2 100644 GIT binary patch delta 160 zcmV;R0AK&$sSMz$41lx&EcXaEWi~ToH8nGbH1`3wH1`559eGgv8BL71&N?jz|GA}-wg1c2LH$&VPON#YiD!`#xDJ^eI`sO;e zKJUOX0FZ$YJdDw3mwPcjUCkF^w&o5vC#*qNYE9sd5`s*iGY`3sV%7=}_*LOQJ>HV1 Od@BPTbeg;~76BNSUPe~{ diff --git a/panda/board/obj/panda_can_ignition_only.bin.signed b/panda/board/obj/panda_can_ignition_only.bin.signed index d00cd2ae1c593f676f3b8884250fcfaf918018af..0e771ab0e996d9f2cd8c13bfa0177eab614a137f 100644 GIT binary patch delta 160 zcmV;R0AK&esSL=e41lx&6!!=>Wi~ToH8nGb9QOgY9QOh&9e-+axxXsZXP?W$f8(OB z#d5f0eb{x3cGEkJ4R53S!w1_mH#EjU$*58CS?OU-rX^|5sbO025~1HWmxHtrg(?1R zb}mH%lec5g$Gn%luxBv3AE=Tpw}4$u<7#RUGBK3FnRT-Deq_~Le_q``pFL;-IG_tx O@-kI!URlnJrvXCXIZQMF delta 160 zcmV;R0AK&esSL=e41lx&6!!==GcYhXWjQp59QOgY9QOh&9e*rY%_vp%j?)`vSOceQ z4o-~pepQqu8P?J4IVc2!lZi#j<&XFquc*yZd2Myz3-marmNsywS`NnYLV)w&A&=2 OXg+IGuc1d>eF0?saY=mu diff --git a/panda/board/obj/panda_h7.bin.signed b/panda/board/obj/panda_h7.bin.signed index bec5cddc5feb0473f161bab8cbec342bf4741291..f61d24f47e1a3f87c81c41d645c865d31487512b 100644 GIT binary patch delta 162 zcmV;T0A2sY@(jfC41k0Iv;s&P2sdRmGh;P1Glx(b0=G~a19TpLG#8u}FE>b0ayRz0 zEX(*GB5B>)5k delta 162 zcmV;T0A2sY@(jfC41k0Iv;s&P2sSe?FgRs7G>1?c0=G~a19TpLPA8-~jZB=!m%GsK z9y+M6PNRU2X=2hBEi^19PujKkLII2W72y3S|+v;O$z%Z$^#4be?Y`MYQL{ zq=w6aBf<_=u?=^%bO+JjBHj;Q;phI`|J#{?0y>)hRr*ok8g)96Jhx$Mf(~4awQ`tL Qx|xB-+~6fhj&J_~tCk&1fdBvi diff --git a/panda/board/obj/panda_h7_can_ignition_only.bin.signed b/panda/board/obj/panda_h7_can_ignition_only.bin.signed index e8a1c36a75c490173f154d8feeb3454c34bce116..1ad9eb1b29f9cce11da01a0519c74ed25a05a7a7 100644 GIT binary patch delta 162 zcmV;T0A2sA@(ir<41k0Iv;r_12sdRmGh;P1Glw`D0=GCC19TpLNCWMGHo$Y>_ZN^n z*lezcaP&e)1Q>?hELc7>w~oT*6s*{%iJahP(&Z>Hnz1m~M#yo|kv QA@CpZ%XDZ_5c6? delta 162 zcmV;T0A2sA@(ir<41k0Iv;r_12sSe?FgRs7G>14E0=GCC19TpLZA7y3Bg&|B7%Ybv zwqtON%d~JdFhQ%Z0LG)60m=4D&U)d@!{Cy`N3Q0GB*w(x0AY6KT0&SSHS!#qvMxwR z&OHce+%0EJ`oA$urqxI?San}mshsCdFp)NNBr5;todW<#YK`_3zbq#tD^Q6bDm6xq QIcfAjFXx&cCTeQ|`{v?Bng9R* diff --git a/panda/board/obj/panda_h7_hkg_remote.bin.signed b/panda/board/obj/panda_h7_hkg_remote.bin.signed index e1e00549d77039e5280a09dc3fd825547893cf1c..44bc022ac2302b5263e42a5b44959371c46eead1 100644 GIT binary patch delta 162 zcmV;T0A2r>^9-2t41k0Iv;v$O2sdRmGh;P1Gl!%a0=J|Z19TpLI=6;ZIxQ`K#go%a zOzkaaK+q^+z;C2B{AlX^?iVB<*9B&dbW@75>8kb9NjS?2VFSz7>(}5{^ze=ptcq<` z31&`BDTk(&3nhmy@efig0YBo5(^+Cpb-X!+=gUY)Uk&?FD#aM?%#Rc}957V)I;3TD QD>g#n$Pq88#NB}bkbad&b^rhX delta 162 zcmV;T0A2r>^9-2t41k0Iv;v$O2sSe?FgRs7G>4=b0=J|Z19TpLgnU{r;A^I;M%gJ9 z^~g;AmX+o5`cl=jVlAp%W=vwj3xM@q3*DiDCyS7VEo+7QppP&Z$ZI?TcJVqj#%~6; z*I4tBI1Zf#yw?7WF1&lsbAOHXW delta 162 zcmV;T0A2rx^9+dd41k0Iv;vG82sSe?FgRs7G>4QL0=JYJ19TpLO71$TIZKhJihVmz zkl_i=2W-2HCbE)%wVg}vv14{<7*KvhvVnp%jFArYdlcOH3jPXe_4i&nne4${PlzrAtv{WCQzE2=q? z8eRAgUrjzasGMJZ^67mP!x-I;0>J`M4A2p9ZEk(i2wiq delta 162 zcmV;T0A2sY@(jfC41k0Iv;s&P2sSe?FgRs7G>1?c0=G~a19TpLxAE_;0cwdOJEGdF z)**Qj(RdBfZcyt=PSSC*k?g}v=FKi*6AkYTw=-ZN)gNH#%T zXc}#y7y^rIxsehT<1Jwa*|Ujq0i_;i^$Ro5k#Y0{E{7KW*_8}SN*03Q80@1UHMpfK Q;PwXQxCAnF&67+4sNQr*ZU6uP diff --git a/panda/board/obj/panda_h7_remote_can_ignition_only.bin.signed b/panda/board/obj/panda_h7_remote_can_ignition_only.bin.signed index a1fe1abcb7be5982679e4a65452eb554063a2313..e3d422c48e8c3828ab7411db9abfb6263e56eb99 100644 GIT binary patch delta 162 zcmV;T0A2sA@(ir<41k0Iv;r_12sdRmGh;P1Glw`D0=GCC19TpLDa$^W8>SnbP%{}l zH${4}=j1wC0~aEEtY6G)CTzC;QC;$ zLBqzBM%4dDq{G$)X;ufKir<{N{EVrR$8#^_nOI2&tHI>iCtjshw1oh5ysp`us}92D Q?#yu?>r;&!l14E0=GCC19TpLwlSCPj*SYAFN%+? ztlh`!W5D8f5&NY)B3ZQFWhI8|FFMm`7L~q>yhO`-euE|SL QrHaJ$vJwOaagH diff --git a/panda/board/obj/panda_h7_tesla_wake.bin.signed b/panda/board/obj/panda_h7_tesla_wake.bin.signed index 39806534c3c804ba30038b748359c558e5a5a288..541aebf44532687e8b9b02e7e8441bdbe9475cad 100644 GIT binary patch delta 162 zcmV;T0A2sg^9;=M41k0Iv;xc;2sdRmGh;P1Gl$d~0=Lu}19%>PZ=OHc4Cmbv8%COi zi_DTBvP_3)L)M2>r$LKHgxKNGv!wSh5;4Nd8y#>n+a delta 162 zcmV;T0A2sg^9;=M41k0Iv;xc;2sSe?FgRs7G>6n00=Lu}19%>Pk$fAy1h+O^Is*_W zmWzP@F=o?J`Yj^aLHo{HjT%lxFweIC=T!83YlQB!Ex+d@P6TDH&NPi-aKL3bbh_1H zoaq7NEzr>lPYf{uf4#;uLVUpN|LpFYx_E^`F2%ZZFi(Rv1Xdzd!F QKMEDwiaf`GKN@2Jr1H&53jhEB diff --git a/panda/board/obj/panda_h7_tesla_wake_can_ignition_only.bin.signed b/panda/board/obj/panda_h7_tesla_wake_can_ignition_only.bin.signed index 4261a7ac1a1c6075db56e72f991bb63286a890bf..86c97e7fcd4cf1f150ceec29fc4a14e868e2e709 100644 GIT binary patch delta 162 zcmV;T0A2sI^9;1}41k0Iv;wpm2sdRmGh;P1Gl#qy0=K*x19%>PfBJE&{Y8s|1v2lo zQ|DL&G+t^-yi7!Fr@R1D_*0bfjD=Ye`2?>CnR#>_O8&`4Zf0Owt`{wUhg9nTjs^G@ z!nDhE!~>cpebL{II~9d@cK_<<_Iox_BqYt@l1O$McC$cux{u+tF2$761SM delta 162 zcmV;T0A2sI^9;1}41k0Iv;wpm2sSe?FgRs7G>5zz0=K*x19%>Pr5)h1M;(eYS6iE9 z%sO%!*iqJ%TWaS$pDgJm<>btmYv~Tm6yCDHG}F!n@@2<}8`j=QV|R!|=Z;kr76%|X z@oc>7zn$im8Tu@WD>+ZJeZ(oK!j*LbO(1Y_o?W%leqfV>#mMX9+;L_93#OQ=QB!Yk^;T-&+a_ zndUl5OdWB&^A*1MY@}&pu>%Tf5vQeNST>rSHs52jPoH_;HJY10@-(Ya6CcR*Y~e_1 O>0^e0OE{}eGXVr{K}tLT delta 160 zcmV;R0AK&KstmNM41lx&fcFSCGcYhXWjQp5i1z`vi1z|49e)|_f(W=z-dx|hd}GNg zDt!l#U0BB34ruX0rl{;FrE1IVJboqb=EjjSmjqxxyilL-L-n7h#7I@VI zs_mXF!n@#o{6$}WdW**}vf>a*I}y-)G|NU(F=WlwY(Ys#}0YO1r?2;gQKvuUJ^p)*b-IBYd<(K5MK34Wm)>(^q%LWnxFG{)-N5_ Ovjp)HW2 delta 160 zcmV;R0AK&4stly641lx&aQ6r{GcYhXWjQp5c=rLfc=rM<9e-44L5l9e`AjJ%eKmLk zFN}Z|3>%gp*CJ&-#-0?TrbZYP{l;Vi>+`m0!yc$#&bIz&A_xP|RapL(is#2g}?R5wl?_;t#4#L4}@U-$JVwg(QrO^fZtKy7V!bIaln$&p2s~dH5&? O;n|db)Y-HF7Xi+NCP(-H diff --git a/panda/board/obj/panda_remote.bin.signed b/panda/board/obj/panda_remote.bin.signed index d65c079d609150ef97e81d03da119449612c9377..585b17c7a28e48bfbf951c24709bb10edbaf187b 100644 GIT binary patch delta 160 zcmV;R0AK&ysSMny41lx&DEA0AWi~ToH8nGbF!uqsF!us19e*dSU~NY?m;yy3W+7Uw z1)hJ5|K3x1i`6U7<3HO^6^CdBiv9-gjXeDex0&TbZw)`ty1=NmiYVGLB)!r1sDv*% z^+pJ-x|p8N?I*OGrqEc%94koxCgee>$X~5Dc7dHQ)9Q6IEp4ZhJUOmL%@8A4#fPRC OB_xJ0jnyNC)B$sFHc0~j delta 160 zcmV;R0AK&ysSMny41lx&DEA09GcYhXWjQp5F!uqsF!us19eY`_iM{w7bmKL2n1MwIde7$-NI*LBJ*QOA+*vem5D zl(TZ6dK+(6%mGR>SWKzOHnSu$&t5>o1B;7`p&5A+t~-oG*6p7-C^*wkl$h4QsP}Zn Ot_p0N_KhNZi~$jmyiD!@ diff --git a/panda/board/obj/panda_tesla_wake.bin.signed b/panda/board/obj/panda_tesla_wake.bin.signed index b96a979e2486a0e81940531394f83f3257f03f27..50251eabc80cd77fe561974be044e20b3966b3f6 100644 GIT binary patch delta 160 zcmV;R0AK&)stn|+41lx&toH~vWi~ToH8nGbwD$qGwD$rq9e-t8sB;}(^6!D#Ui6EJ zCqf%JB>tTNLKly~YvJzb^TZJPuj%KlVz^b~^I^nz%M1Pxw18yKjLSq334w?pH#~8b ze#0jHHka{%!ayhm+1?^3M-gax9&Zr4MKn)n3u??z87FYoL4r#GaO`|9G#qxXYg=F? OGKPGM=RueDJppnemr2wB delta 160 zcmV;R0AK&)stn|+41lx&toH~uGcYhXWjQp5wD$qGwD$rq9e=Ji-{5Aq#KzPxu_5mq z88l<6E#zr>49LiqK6zhW40<1Q~+jeIkx?~sOHA0>g2sK0&I&jKUyBj OLy7S-j=!H&{{c$~%1y`s delta 160 zcmV;R0AK&istnAk41lx&l=lcWGcYhXWjQp5oc95@oc97S9e)wYCtSu4CjzbbfdJuV z2lI;rTp&t0XiVCfnHwVGg2KYzRR#Feyq27mwFRzZ6wOC*G8J7C;o|t=umqyuOnb&N zftb17c)>{oLq>H-OLx6snk+8w29&+|hUOFL$EkPHbJjdC;{dUc)lq@RfrUZ&7nk?G O>}_8aNUz@)Y5~6P9!$9a diff --git a/panda/board/obj/version b/panda/board/obj/version index 83833eb2f7..0789174b57 100644 --- a/panda/board/obj/version +++ b/panda/board/obj/version @@ -1 +1 @@ -DEV-63008e94-P92eb5651-DEBUG \ No newline at end of file +DEV-7e63c553-P92eb5651-DEBUG \ No newline at end of file diff --git a/prebuilt.json b/prebuilt.json index afcec04b4e..79c19dc413 100644 --- a/prebuilt.json +++ b/prebuilt.json @@ -1 +1 @@ -{"protected_inventory_sha256": "0f7ccdbebc3383a1c589b1b73d5e36f6083dc63c14a3d4a25a6f994834ed0fbc", "schema_version": 1} +{"protected_inventory_sha256": "7598dc8a2d426e413747c501920f079c3426a7c37816fcc80fadaccb6ffffcb0", "schema_version": 1}