diff --git a/CHANGELOGS.md b/CHANGELOGS.md index b35232716..1e4f3583b 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,4 +1,4 @@ -dragonpilot beta3 2023.07.27 +dragonpilot beta3 2023.08.07 ======================= * openpilot master branch on 2023.07.21. diff --git a/README.md b/README.md index 5428ea7a9..5978a0e5d 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![](https://i.imgur.com/b0ZyIx5.jpg) +![openpilot on the comma 3X](https://github.com/commaai/openpilot/assets/4038174/f1081737-8718-4241-a22a-3ceba526361a) Table of Contents ======================= @@ -39,8 +39,8 @@ Running on a dedicated device in a car ------ To use openpilot in a car, you need four things -* A supported device to run this software: a [comma three](https://comma.ai/shop/products/three). -* This software. The setup procedure of the comma three allows the user to enter a URL for custom software. +* A supported device to run this software: a [comma 3X](https://comma.ai/shop/comma-3x) or comma three. +* This software. The setup procedure of the comma 3/3X allows the user to enter a URL for custom software. The URL, openpilot.comma.ai will install the release version of openpilot. To install openpilot master, you can use installer.comma.ai/commaai/master, and replacing commaai with another GitHub username can install a fork. * One of [the 250+ supported cars](docs/CARS.md). We support Honda, Toyota, Hyundai, Nissan, Kia, Chrysler, Lexus, Acura, Audi, VW, Ford and more. If your car is not supported but has adaptive cruise control and lane-keeping assist, it's likely able to run openpilot. * A [car harness](https://comma.ai/shop/products/car-harness) to connect to your car. diff --git a/RELEASES.md b/RELEASES.md index 58b959368..b4dbc3ba6 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,5 +1,10 @@ +Version 0.9.5 (202X-XX-XX) +======================== + + Version 0.9.4 (2023-07-27) ======================== +* comma 3X support * Navigate on openpilot in Experimental mode * When navigation has a destination, openpilot will input the map information into the model, which provides useful context to help the model understand the scene * When navigating on openpilot, openpilot will keep left or right appropriately at forks and exits diff --git a/body/board/obj/body.bin b/body/board/obj/body.bin index 1cb4fc6f5..79b12901a 100755 Binary files a/body/board/obj/body.bin and b/body/board/obj/body.bin differ diff --git a/body/board/obj/body.bin.signed b/body/board/obj/body.bin.signed index 760f3bb26..e4adb5b2f 100644 Binary files a/body/board/obj/body.bin.signed and b/body/board/obj/body.bin.signed differ diff --git a/body/board/obj/body.elf b/body/board/obj/body.elf index 063d8eede..59fcf1e86 100755 Binary files a/body/board/obj/body.elf and b/body/board/obj/body.elf differ diff --git a/body/board/obj/bootstub.body.bin b/body/board/obj/bootstub.body.bin index f5e453818..f00d47e71 100755 Binary files a/body/board/obj/bootstub.body.bin and b/body/board/obj/bootstub.body.bin differ diff --git a/body/board/obj/bootstub.body.elf b/body/board/obj/bootstub.body.elf index 7d0b92fa9..483b6666e 100755 Binary files a/body/board/obj/bootstub.body.elf and b/body/board/obj/bootstub.body.elf differ diff --git a/body/board/obj/gitversion.h b/body/board/obj/gitversion.h index 65cacee7f..88843434d 100644 --- a/body/board/obj/gitversion.h +++ b/body/board/obj/gitversion.h @@ -1 +1 @@ -const uint8_t gitversion[8] = "7f50cb83"; +const uint8_t gitversion[8] = "9636978e"; diff --git a/cereal/custom.capnp b/cereal/custom.capnp index 31d55afe5..c322ec9e7 100644 --- a/cereal/custom.capnp +++ b/cereal/custom.capnp @@ -49,6 +49,7 @@ struct LongitudinalPlanExt @0xaedffd8f31e7b55d { dpE2EIsBlended @13 :Bool; longitudinalPlanExtSource @14 :LongitudinalPlanExtSource; + de2eIsEnabled @15 :Bool; enum LongitudinalPlanExtSource { cruise @0; @@ -81,7 +82,9 @@ struct LateralPlanExt @0xf35cc4560bbf6ec2 { dPathWLinesY @1 :List(Float32); } -struct CustomReserved3 @0xda96579883444c35 { +struct ControlsStateExt @0xda96579883444c35 { + alkaActive @0 :Bool; + alkaEnabled @1 :Bool; } struct CustomReserved4 @0x80ae746ee2596b11 { diff --git a/cereal/gen/cpp/custom.capnp.c++ b/cereal/gen/cpp/custom.capnp.c++ index c87df2e36..360039167 100644 --- a/cereal/gen/cpp/custom.capnp.c++ +++ b/cereal/gen/cpp/custom.capnp.c++ @@ -382,7 +382,7 @@ const ::capnp::_::RawSchema s_81c2f05a394cf4af = { 0, 20, i_81c2f05a394cf4af, nullptr, nullptr, { &s_81c2f05a394cf4af, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE -static const ::capnp::_::AlignedData<286> b_aedffd8f31e7b55d = { +static const ::capnp::_::AlignedData<302> b_aedffd8f31e7b55d = { { 0, 0, 0, 0, 5, 0, 6, 0, 93, 181, 231, 49, 143, 253, 223, 174, 13, 0, 0, 0, 1, 0, 5, 0, @@ -392,7 +392,7 @@ static const ::capnp::_::AlignedData<286> b_aedffd8f31e7b55d = { 21, 0, 0, 0, 10, 1, 0, 0, 37, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 0, 0, 0, 79, 3, 0, 0, + 101, 0, 0, 0, 135, 3, 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, @@ -418,112 +418,119 @@ static const ::capnp::_::AlignedData<286> b_aedffd8f31e7b55d = { 114, 110, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 83, 116, 97, 116, 101, 0, 0, 0, 0, 0, 0, 0, - 60, 0, 0, 0, 3, 0, 4, 0, + 64, 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, - 149, 1, 0, 0, 210, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 156, 1, 0, 0, 3, 0, 1, 0, - 168, 1, 0, 0, 2, 0, 1, 0, - 1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 165, 1, 0, 0, 130, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 164, 1, 0, 0, 3, 0, 1, 0, - 176, 1, 0, 0, 2, 0, 1, 0, - 2, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 173, 1, 0, 0, 186, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 176, 1, 0, 0, 3, 0, 1, 0, - 188, 1, 0, 0, 2, 0, 1, 0, - 3, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 1, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 185, 1, 0, 0, 90, 0, 0, 0, + 177, 1, 0, 0, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 1, 0, 0, 3, 0, 1, 0, 196, 1, 0, 0, 2, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 193, 1, 0, 0, 130, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 192, 1, 0, 0, 3, 0, 1, 0, + 204, 1, 0, 0, 2, 0, 1, 0, + 2, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 201, 1, 0, 0, 186, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 204, 1, 0, 0, 3, 0, 1, 0, + 216, 1, 0, 0, 2, 0, 1, 0, + 3, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 1, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 213, 1, 0, 0, 90, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 212, 1, 0, 0, 3, 0, 1, 0, + 224, 1, 0, 0, 2, 0, 1, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 193, 1, 0, 0, 138, 0, 0, 0, + 221, 1, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 196, 1, 0, 0, 3, 0, 1, 0, - 208, 1, 0, 0, 2, 0, 1, 0, + 224, 1, 0, 0, 3, 0, 1, 0, + 236, 1, 0, 0, 2, 0, 1, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 205, 1, 0, 0, 138, 0, 0, 0, + 233, 1, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 208, 1, 0, 0, 3, 0, 1, 0, - 220, 1, 0, 0, 2, 0, 1, 0, + 236, 1, 0, 0, 3, 0, 1, 0, + 248, 1, 0, 0, 2, 0, 1, 0, 6, 0, 0, 0, 160, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 217, 1, 0, 0, 130, 0, 0, 0, + 245, 1, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 216, 1, 0, 0, 3, 0, 1, 0, - 228, 1, 0, 0, 2, 0, 1, 0, + 244, 1, 0, 0, 3, 0, 1, 0, + 0, 2, 0, 0, 2, 0, 1, 0, 7, 0, 0, 0, 161, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 225, 1, 0, 0, 170, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 228, 1, 0, 0, 3, 0, 1, 0, - 240, 1, 0, 0, 2, 0, 1, 0, - 8, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 1, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 237, 1, 0, 0, 178, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 240, 1, 0, 0, 3, 0, 1, 0, - 252, 1, 0, 0, 2, 0, 1, 0, - 9, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 1, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 249, 1, 0, 0, 90, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 248, 1, 0, 0, 3, 0, 1, 0, - 4, 2, 0, 0, 2, 0, 1, 0, - 10, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 1, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 0, 0, 82, 0, 0, 0, + 253, 1, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 1, 0, 12, 2, 0, 0, 2, 0, 1, 0, - 11, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 1, 0, 11, 0, 0, 0, + 8, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 2, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 2, 0, 0, 3, 0, 1, 0, 24, 2, 0, 0, 2, 0, 1, 0, - 12, 0, 0, 0, 18, 0, 0, 0, - 0, 0, 1, 0, 12, 0, 0, 0, + 9, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 21, 2, 0, 0, 74, 0, 0, 0, + 21, 2, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 0, 0, 3, 0, 1, 0, 32, 2, 0, 0, 2, 0, 1, 0, - 13, 0, 0, 0, 162, 0, 0, 0, - 0, 0, 1, 0, 13, 0, 0, 0, + 10, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 29, 2, 0, 0, 122, 0, 0, 0, + 29, 2, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 2, 0, 0, 3, 0, 1, 0, 40, 2, 0, 0, 2, 0, 1, 0, + 11, 0, 0, 0, 11, 0, 0, 0, + 0, 0, 1, 0, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 37, 2, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 40, 2, 0, 0, 3, 0, 1, 0, + 52, 2, 0, 0, 2, 0, 1, 0, + 12, 0, 0, 0, 18, 0, 0, 0, + 0, 0, 1, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 49, 2, 0, 0, 74, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 48, 2, 0, 0, 3, 0, 1, 0, + 60, 2, 0, 0, 2, 0, 1, 0, + 13, 0, 0, 0, 162, 0, 0, 0, + 0, 0, 1, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 57, 2, 0, 0, 122, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 56, 2, 0, 0, 3, 0, 1, 0, + 68, 2, 0, 0, 2, 0, 1, 0, 14, 0, 0, 0, 19, 0, 0, 0, 0, 0, 1, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 37, 2, 0, 0, 210, 0, 0, 0, + 65, 2, 0, 0, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 44, 2, 0, 0, 3, 0, 1, 0, - 56, 2, 0, 0, 2, 0, 1, 0, + 72, 2, 0, 0, 3, 0, 1, 0, + 84, 2, 0, 0, 2, 0, 1, 0, + 15, 0, 0, 0, 163, 0, 0, 0, + 0, 0, 1, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 81, 2, 0, 0, 114, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 80, 2, 0, 0, 3, 0, 1, 0, + 92, 2, 0, 0, 2, 0, 1, 0, 118, 105, 115, 105, 111, 110, 84, 117, 114, 110, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 83, 116, 97, 116, @@ -667,6 +674,15 @@ static const ::capnp::_::AlignedData<286> b_aedffd8f31e7b55d = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 100, 101, 50, 101, 73, 115, 69, 110, + 97, 98, 108, 101, 100, 0, 0, 0, + 1, 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, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; @@ -677,11 +693,11 @@ static const ::capnp::_::RawSchema* const d_aedffd8f31e7b55d[] = { &s_b42a75baee731fce, &s_d1124e845254aeda, }; -static const uint16_t m_aedffd8f31e7b55d[] = {5, 9, 13, 6, 14, 3, 2, 4, 7, 8, 12, 10, 11, 0, 1}; -static const uint16_t i_aedffd8f31e7b55d[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; +static const uint16_t m_aedffd8f31e7b55d[] = {15, 5, 9, 13, 6, 14, 3, 2, 4, 7, 8, 12, 10, 11, 0, 1}; +static const uint16_t i_aedffd8f31e7b55d[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; const ::capnp::_::RawSchema s_aedffd8f31e7b55d = { - 0xaedffd8f31e7b55d, b_aedffd8f31e7b55d.words, 286, d_aedffd8f31e7b55d, m_aedffd8f31e7b55d, - 3, 15, i_aedffd8f31e7b55d, nullptr, nullptr, { &s_aedffd8f31e7b55d, nullptr, nullptr, 0, 0, nullptr } + 0xaedffd8f31e7b55d, b_aedffd8f31e7b55d.words, 302, d_aedffd8f31e7b55d, m_aedffd8f31e7b55d, + 3, 16, i_aedffd8f31e7b55d, nullptr, nullptr, { &s_aedffd8f31e7b55d, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<55> b_b42a75baee731fce = { @@ -921,30 +937,65 @@ const ::capnp::_::RawSchema s_f35cc4560bbf6ec2 = { 0, 2, i_f35cc4560bbf6ec2, nullptr, nullptr, { &s_f35cc4560bbf6ec2, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE -static const ::capnp::_::AlignedData<17> b_da96579883444c35 = { +static const ::capnp::_::AlignedData<50> b_da96579883444c35 = { { 0, 0, 0, 0, 5, 0, 6, 0, 53, 76, 68, 131, 152, 87, 150, 218, - 13, 0, 0, 0, 1, 0, 0, 0, + 13, 0, 0, 0, 1, 0, 1, 0, 89, 10, 85, 29, 102, 186, 38, 181, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 21, 0, 0, 0, 234, 0, 0, 0, + 21, 0, 0, 0, 242, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 119, 0, 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, - 97, 112, 110, 112, 58, 67, 117, 115, - 116, 111, 109, 82, 101, 115, 101, 114, - 118, 101, 100, 51, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, } + 97, 112, 110, 112, 58, 67, 111, 110, + 116, 114, 111, 108, 115, 83, 116, 97, + 116, 101, 69, 120, 116, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, + 8, 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, + 41, 0, 0, 0, 90, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 40, 0, 0, 0, 3, 0, 1, 0, + 52, 0, 0, 0, 2, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 49, 0, 0, 0, 98, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 48, 0, 0, 0, 3, 0, 1, 0, + 60, 0, 0, 0, 2, 0, 1, 0, + 97, 108, 107, 97, 65, 99, 116, 105, + 118, 101, 0, 0, 0, 0, 0, 0, + 1, 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, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 97, 108, 107, 97, 69, 110, 97, 98, + 108, 101, 100, 0, 0, 0, 0, 0, + 1, 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, + 1, 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_da96579883444c35 = b_da96579883444c35.words; #if !CAPNP_LITE +static const uint16_t m_da96579883444c35[] = {0, 1}; +static const uint16_t i_da96579883444c35[] = {0, 1}; const ::capnp::_::RawSchema s_da96579883444c35 = { - 0xda96579883444c35, b_da96579883444c35.words, 17, nullptr, nullptr, - 0, 0, nullptr, nullptr, nullptr, { &s_da96579883444c35, nullptr, nullptr, 0, 0, nullptr } + 0xda96579883444c35, b_da96579883444c35.words, 50, nullptr, m_da96579883444c35, + 0, 2, i_da96579883444c35, nullptr, nullptr, { &s_da96579883444c35, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<17> b_80ae746ee2596b11 = { @@ -1134,12 +1185,12 @@ constexpr ::capnp::Kind LateralPlanExt::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* LateralPlanExt::_capnpPrivate::schema; #endif // !CAPNP_LITE -// CustomReserved3 -constexpr uint16_t CustomReserved3::_capnpPrivate::dataWordSize; -constexpr uint16_t CustomReserved3::_capnpPrivate::pointerCount; +// ControlsStateExt +constexpr uint16_t ControlsStateExt::_capnpPrivate::dataWordSize; +constexpr uint16_t ControlsStateExt::_capnpPrivate::pointerCount; #if !CAPNP_LITE -constexpr ::capnp::Kind CustomReserved3::_capnpPrivate::kind; -constexpr ::capnp::_::RawSchema const* CustomReserved3::_capnpPrivate::schema; +constexpr ::capnp::Kind ControlsStateExt::_capnpPrivate::kind; +constexpr ::capnp::_::RawSchema const* ControlsStateExt::_capnpPrivate::schema; #endif // !CAPNP_LITE // CustomReserved4 diff --git a/cereal/gen/cpp/custom.capnp.h b/cereal/gen/cpp/custom.capnp.h index 856a99aac..30cfd1549 100644 --- a/cereal/gen/cpp/custom.capnp.h +++ b/cereal/gen/cpp/custom.capnp.h @@ -109,15 +109,15 @@ struct LateralPlanExt { }; }; -struct CustomReserved3 { - CustomReserved3() = delete; +struct ControlsStateExt { + ControlsStateExt() = delete; class Reader; class Builder; class Pipeline; struct _capnpPrivate { - CAPNP_DECLARE_STRUCT_HEADER(da96579883444c35, 0, 0) + CAPNP_DECLARE_STRUCT_HEADER(da96579883444c35, 1, 0) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE @@ -457,6 +457,8 @@ public: inline ::cereal::LongitudinalPlanExt::LongitudinalPlanExtSource getLongitudinalPlanExtSource() const; + inline bool getDe2eIsEnabled() const; + private: ::capnp::_::StructReader _reader; template @@ -530,6 +532,9 @@ public: inline ::cereal::LongitudinalPlanExt::LongitudinalPlanExtSource getLongitudinalPlanExtSource(); inline void setLongitudinalPlanExtSource( ::cereal::LongitudinalPlanExt::LongitudinalPlanExtSource value); + inline bool getDe2eIsEnabled(); + inline void setDe2eIsEnabled(bool value); + private: ::capnp::_::StructBuilder _builder; template @@ -649,9 +654,9 @@ private: }; #endif // !CAPNP_LITE -class CustomReserved3::Reader { +class ControlsStateExt::Reader { public: - typedef CustomReserved3 Reads; + typedef ControlsStateExt Reads; Reader() = default; inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} @@ -666,6 +671,10 @@ public: } #endif // !CAPNP_LITE + inline bool getAlkaActive() const; + + inline bool getAlkaEnabled() const; + private: ::capnp::_::StructReader _reader; template @@ -678,9 +687,9 @@ private: friend class ::capnp::Orphanage; }; -class CustomReserved3::Builder { +class ControlsStateExt::Builder { public: - typedef CustomReserved3 Builds; + typedef ControlsStateExt Builds; Builder() = delete; // Deleted to discourage incorrect usage. // You can explicitly initialize to nullptr instead. @@ -694,6 +703,12 @@ public: inline ::kj::StringTree toString() const { return asReader().toString(); } #endif // !CAPNP_LITE + inline bool getAlkaActive(); + inline void setAlkaActive(bool value); + + inline bool getAlkaEnabled(); + inline void setAlkaEnabled(bool value); + private: ::capnp::_::StructBuilder _builder; template @@ -704,9 +719,9 @@ private: }; #if !CAPNP_LITE -class CustomReserved3::Pipeline { +class ControlsStateExt::Pipeline { public: - typedef CustomReserved3 Pipelines; + typedef ControlsStateExt Pipelines; inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) @@ -1730,6 +1745,20 @@ inline void LongitudinalPlanExt::Builder::setLongitudinalPlanExtSource( ::cereal ::capnp::bounded<19>() * ::capnp::ELEMENTS, value); } +inline bool LongitudinalPlanExt::Reader::getDe2eIsEnabled() const { + return _reader.getDataField( + ::capnp::bounded<163>() * ::capnp::ELEMENTS); +} + +inline bool LongitudinalPlanExt::Builder::getDe2eIsEnabled() { + return _builder.getDataField( + ::capnp::bounded<163>() * ::capnp::ELEMENTS); +} +inline void LongitudinalPlanExt::Builder::setDe2eIsEnabled(bool value) { + _builder.setDataField( + ::capnp::bounded<163>() * ::capnp::ELEMENTS, value); +} + inline bool LateralPlanExt::Reader::hasDPathWLinesX() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); @@ -1806,5 +1835,33 @@ inline ::capnp::Orphan< ::capnp::List> Lateral ::capnp::bounded<1>() * ::capnp::POINTERS)); } +inline bool ControlsStateExt::Reader::getAlkaActive() const { + return _reader.getDataField( + ::capnp::bounded<0>() * ::capnp::ELEMENTS); +} + +inline bool ControlsStateExt::Builder::getAlkaActive() { + return _builder.getDataField( + ::capnp::bounded<0>() * ::capnp::ELEMENTS); +} +inline void ControlsStateExt::Builder::setAlkaActive(bool value) { + _builder.setDataField( + ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); +} + +inline bool ControlsStateExt::Reader::getAlkaEnabled() const { + return _reader.getDataField( + ::capnp::bounded<1>() * ::capnp::ELEMENTS); +} + +inline bool ControlsStateExt::Builder::getAlkaEnabled() { + return _builder.getDataField( + ::capnp::bounded<1>() * ::capnp::ELEMENTS); +} +inline void ControlsStateExt::Builder::setAlkaEnabled(bool value) { + _builder.setDataField( + ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); +} + } // namespace diff --git a/cereal/gen/cpp/log.capnp.c++ b/cereal/gen/cpp/log.capnp.c++ index 94fcb1ddb..a16d26e67 100644 --- a/cereal/gen/cpp/log.capnp.c++ +++ b/cereal/gen/cpp/log.capnp.c++ @@ -6553,7 +6553,7 @@ const ::capnp::_::RawSchema s_9a185389d6fdd05f = { 2, 13, i_9a185389d6fdd05f, nullptr, nullptr, { &s_9a185389d6fdd05f, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE -static const ::capnp::_::AlignedData<246> b_b96f3ad9170cf085 = { +static const ::capnp::_::AlignedData<262> b_b96f3ad9170cf085 = { { 0, 0, 0, 0, 5, 0, 6, 0, 133, 240, 12, 23, 217, 58, 111, 185, 21, 0, 0, 0, 1, 0, 7, 0, @@ -6563,7 +6563,7 @@ static const ::capnp::_::AlignedData<246> b_b96f3ad9170cf085 = { 21, 0, 0, 0, 242, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 29, 0, 0, 0, 79, 3, 0, 0, + 29, 0, 0, 0, 135, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 111, 103, 46, 99, 97, 112, 110, @@ -6571,112 +6571,119 @@ static const ::capnp::_::AlignedData<246> b_b96f3ad9170cf085 = { 116, 97, 116, 101, 46, 76, 101, 97, 100, 68, 97, 116, 97, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 60, 0, 0, 0, 3, 0, 4, 0, + 64, 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, - 149, 1, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 144, 1, 0, 0, 3, 0, 1, 0, - 156, 1, 0, 0, 2, 0, 1, 0, - 1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 153, 1, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 148, 1, 0, 0, 3, 0, 1, 0, - 160, 1, 0, 0, 2, 0, 1, 0, - 2, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 157, 1, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 152, 1, 0, 0, 3, 0, 1, 0, - 164, 1, 0, 0, 2, 0, 1, 0, - 3, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 1, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 161, 1, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 156, 1, 0, 0, 3, 0, 1, 0, - 168, 1, 0, 0, 2, 0, 1, 0, - 4, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 165, 1, 0, 0, 50, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 160, 1, 0, 0, 3, 0, 1, 0, - 172, 1, 0, 0, 2, 0, 1, 0, - 14, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 1, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 169, 1, 0, 0, 130, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 168, 1, 0, 0, 3, 0, 1, 0, - 180, 1, 0, 0, 2, 0, 1, 0, - 5, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 1, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 177, 1, 0, 0, 50, 0, 0, 0, + 177, 1, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 1, 0, 0, 3, 0, 1, 0, 184, 1, 0, 0, 2, 0, 1, 0, - 6, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 1, 0, 7, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 1, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 1, 0, 0, 3, 0, 1, 0, 188, 1, 0, 0, 2, 0, 1, 0, - 7, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 1, 0, 8, 0, 0, 0, + 2, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 185, 1, 0, 0, 58, 0, 0, 0, + 185, 1, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 1, 0, 0, 3, 0, 1, 0, 192, 1, 0, 0, 2, 0, 1, 0, - 8, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 1, 0, 9, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 189, 1, 0, 0, 58, 0, 0, 0, + 189, 1, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 1, 0, 0, 3, 0, 1, 0, 196, 1, 0, 0, 2, 0, 1, 0, - 9, 0, 0, 0, 64, 1, 0, 0, - 0, 0, 1, 0, 10, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 193, 1, 0, 0, 34, 0, 0, 0, + 193, 1, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 1, 0, 0, 3, 0, 1, 0, 200, 1, 0, 0, 2, 0, 1, 0, - 10, 0, 0, 0, 65, 1, 0, 0, - 0, 0, 1, 0, 11, 0, 0, 0, + 15, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 197, 1, 0, 0, 58, 0, 0, 0, + 197, 1, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 192, 1, 0, 0, 3, 0, 1, 0, - 204, 1, 0, 0, 2, 0, 1, 0, - 11, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 1, 0, 12, 0, 0, 0, + 196, 1, 0, 0, 3, 0, 1, 0, + 208, 1, 0, 0, 2, 0, 1, 0, + 5, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 201, 1, 0, 0, 74, 0, 0, 0, + 205, 1, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 1, 0, 0, 3, 0, 1, 0, 212, 1, 0, 0, 2, 0, 1, 0, - 12, 0, 0, 0, 12, 0, 0, 0, - 0, 0, 1, 0, 13, 0, 0, 0, + 6, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 209, 1, 0, 0, 82, 0, 0, 0, + 209, 1, 0, 0, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 204, 1, 0, 0, 3, 0, 1, 0, + 216, 1, 0, 0, 2, 0, 1, 0, + 7, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 1, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 213, 1, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 1, 0, 0, 3, 0, 1, 0, 220, 1, 0, 0, 2, 0, 1, 0, - 13, 0, 0, 0, 66, 1, 0, 0, - 0, 0, 1, 0, 14, 0, 0, 0, + 8, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 217, 1, 0, 0, 50, 0, 0, 0, + 217, 1, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 1, 0, 0, 3, 0, 1, 0, 224, 1, 0, 0, 2, 0, 1, 0, + 9, 0, 0, 0, 64, 1, 0, 0, + 0, 0, 1, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 221, 1, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 216, 1, 0, 0, 3, 0, 1, 0, + 228, 1, 0, 0, 2, 0, 1, 0, + 10, 0, 0, 0, 65, 1, 0, 0, + 0, 0, 1, 0, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 225, 1, 0, 0, 58, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 220, 1, 0, 0, 3, 0, 1, 0, + 232, 1, 0, 0, 2, 0, 1, 0, + 11, 0, 0, 0, 11, 0, 0, 0, + 0, 0, 1, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 229, 1, 0, 0, 74, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 228, 1, 0, 0, 3, 0, 1, 0, + 240, 1, 0, 0, 2, 0, 1, 0, + 12, 0, 0, 0, 12, 0, 0, 0, + 0, 0, 1, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 237, 1, 0, 0, 82, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 236, 1, 0, 0, 3, 0, 1, 0, + 248, 1, 0, 0, 2, 0, 1, 0, + 13, 0, 0, 0, 66, 1, 0, 0, + 0, 0, 1, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 245, 1, 0, 0, 50, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 240, 1, 0, 0, 3, 0, 1, 0, + 252, 1, 0, 0, 2, 0, 1, 0, + 14, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 1, 0, 15, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 249, 1, 0, 0, 106, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 248, 1, 0, 0, 3, 0, 1, 0, + 4, 2, 0, 0, 2, 0, 1, 0, 100, 82, 101, 108, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6799,15 +6806,24 @@ static const ::capnp::_::AlignedData<246> b_b96f3ad9170cf085 = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 114, 97, 100, 97, 114, 84, 114, 97, + 99, 107, 73, 100, 0, 0, 0, 0, + 4, 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, + 4, 0, 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; ::capnp::word const* const bp_b96f3ad9170cf085 = b_b96f3ad9170cf085.words; #if !CAPNP_LITE -static const uint16_t m_b96f3ad9170cf085[] = {5, 9, 12, 3, 6, 0, 10, 13, 14, 11, 7, 4, 8, 2, 1}; -static const uint16_t i_b96f3ad9170cf085[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; +static const uint16_t m_b96f3ad9170cf085[] = {5, 9, 12, 3, 6, 0, 10, 13, 14, 15, 11, 7, 4, 8, 2, 1}; +static const uint16_t i_b96f3ad9170cf085[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; const ::capnp::_::RawSchema s_b96f3ad9170cf085 = { - 0xb96f3ad9170cf085, b_b96f3ad9170cf085.words, 246, nullptr, m_b96f3ad9170cf085, - 0, 15, i_b96f3ad9170cf085, nullptr, nullptr, { &s_b96f3ad9170cf085, nullptr, nullptr, 0, 0, nullptr } + 0xb96f3ad9170cf085, b_b96f3ad9170cf085.words, 262, nullptr, m_b96f3ad9170cf085, + 0, 16, i_b96f3ad9170cf085, nullptr, nullptr, { &s_b96f3ad9170cf085, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<264> b_96df70754d8390bc = { @@ -25671,120 +25687,131 @@ const ::capnp::_::RawSchema s_de266b39b76b461e = { 0, 7, i_de266b39b76b461e, nullptr, nullptr, { &s_de266b39b76b461e, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE -static const ::capnp::_::AlignedData<230> b_c18216b27f8602af = { +static const ::capnp::_::AlignedData<254> b_c18216b27f8602af = { { 0, 0, 0, 0, 5, 0, 6, 0, 175, 2, 134, 127, 178, 22, 130, 193, 10, 0, 0, 0, 1, 0, 3, 0, 91, 40, 164, 37, 126, 241, 177, 243, - 5, 0, 7, 0, 0, 0, 0, 0, + 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 202, 0, 0, 0, - 33, 0, 0, 0, 55, 0, 0, 0, + 33, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 73, 0, 0, 0, 167, 2, 0, 0, + 89, 0, 0, 0, 223, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 111, 103, 46, 99, 97, 112, 110, 112, 58, 78, 97, 118, 73, 110, 115, 116, 114, 117, 99, 116, 105, 111, 110, 0, 0, 0, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 1, 0, 1, 0, + 16, 0, 0, 0, 1, 0, 1, 0, 217, 57, 164, 192, 137, 22, 205, 164, - 17, 0, 0, 0, 42, 0, 0, 0, + 25, 0, 0, 0, 42, 0, 0, 0, 146, 193, 229, 201, 216, 185, 165, 238, - 13, 0, 0, 0, 82, 0, 0, 0, + 21, 0, 0, 0, 82, 0, 0, 0, 102, 156, 208, 104, 165, 10, 110, 182, - 13, 0, 0, 0, 122, 0, 0, 0, + 21, 0, 0, 0, 122, 0, 0, 0, + 69, 10, 226, 108, 26, 74, 236, 179, + 21, 0, 0, 0, 74, 0, 0, 0, 76, 97, 110, 101, 0, 0, 0, 0, 68, 105, 114, 101, 99, 116, 105, 111, 110, 0, 0, 0, 0, 0, 0, 0, 83, 112, 101, 101, 100, 76, 105, 109, 105, 116, 83, 105, 103, 110, 0, 0, - 48, 0, 0, 0, 3, 0, 4, 0, + 77, 97, 110, 101, 117, 118, 101, 114, + 0, 0, 0, 0, 0, 0, 0, 0, + 52, 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, - 65, 1, 0, 0, 162, 0, 0, 0, + 93, 1, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 1, 0, 0, 3, 0, 1, 0, - 80, 1, 0, 0, 2, 0, 1, 0, + 96, 1, 0, 0, 3, 0, 1, 0, + 108, 1, 0, 0, 2, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 77, 1, 0, 0, 178, 0, 0, 0, + 105, 1, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 1, 0, 0, 3, 0, 1, 0, - 92, 1, 0, 0, 2, 0, 1, 0, + 108, 1, 0, 0, 3, 0, 1, 0, + 120, 1, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 1, 0, 0, 138, 0, 0, 0, + 117, 1, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 1, 0, 0, 3, 0, 1, 0, - 104, 1, 0, 0, 2, 0, 1, 0, + 120, 1, 0, 0, 3, 0, 1, 0, + 132, 1, 0, 0, 2, 0, 1, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 1, 0, 0, 106, 0, 0, 0, + 129, 1, 0, 0, 106, 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, + 128, 1, 0, 0, 3, 0, 1, 0, + 140, 1, 0, 0, 2, 0, 1, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 109, 1, 0, 0, 138, 0, 0, 0, + 137, 1, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 112, 1, 0, 0, 3, 0, 1, 0, - 124, 1, 0, 0, 2, 0, 1, 0, + 140, 1, 0, 0, 3, 0, 1, 0, + 152, 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, - 121, 1, 0, 0, 146, 0, 0, 0, + 149, 1, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 124, 1, 0, 0, 3, 0, 1, 0, - 136, 1, 0, 0, 2, 0, 1, 0, + 152, 1, 0, 0, 3, 0, 1, 0, + 164, 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, - 133, 1, 0, 0, 114, 0, 0, 0, + 161, 1, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 132, 1, 0, 0, 3, 0, 1, 0, - 144, 1, 0, 0, 2, 0, 1, 0, + 160, 1, 0, 0, 3, 0, 1, 0, + 172, 1, 0, 0, 2, 0, 1, 0, 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 141, 1, 0, 0, 170, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 144, 1, 0, 0, 3, 0, 1, 0, - 156, 1, 0, 0, 2, 0, 1, 0, - 8, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 1, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 153, 1, 0, 0, 50, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 148, 1, 0, 0, 3, 0, 1, 0, - 176, 1, 0, 0, 2, 0, 1, 0, - 9, 0, 0, 0, 128, 0, 0, 0, - 0, 0, 1, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 173, 1, 0, 0, 74, 0, 0, 0, + 169, 1, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 1, 0, 0, 3, 0, 1, 0, 184, 1, 0, 0, 2, 0, 1, 0, + 8, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 1, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 181, 1, 0, 0, 50, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 176, 1, 0, 0, 3, 0, 1, 0, + 204, 1, 0, 0, 2, 0, 1, 0, + 9, 0, 0, 0, 128, 0, 0, 0, + 0, 0, 1, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 201, 1, 0, 0, 74, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 200, 1, 0, 0, 3, 0, 1, 0, + 212, 1, 0, 0, 2, 0, 1, 0, 10, 0, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 181, 1, 0, 0, 90, 0, 0, 0, + 209, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 180, 1, 0, 0, 3, 0, 1, 0, - 192, 1, 0, 0, 2, 0, 1, 0, + 208, 1, 0, 0, 3, 0, 1, 0, + 220, 1, 0, 0, 2, 0, 1, 0, 11, 0, 0, 0, 9, 0, 0, 0, 0, 0, 1, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 189, 1, 0, 0, 122, 0, 0, 0, + 217, 1, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 188, 1, 0, 0, 3, 0, 1, 0, - 200, 1, 0, 0, 2, 0, 1, 0, + 216, 1, 0, 0, 3, 0, 1, 0, + 228, 1, 0, 0, 2, 0, 1, 0, + 12, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 1, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 225, 1, 0, 0, 106, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 224, 1, 0, 0, 3, 0, 1, 0, + 252, 1, 0, 0, 2, 0, 1, 0, 109, 97, 110, 101, 117, 118, 101, 114, 80, 114, 105, 109, 97, 114, 121, 84, 101, 120, 116, 0, 0, 0, 0, 0, @@ -25900,6 +25927,19 @@ static const ::capnp::_::AlignedData<230> b_c18216b27f8602af = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 97, 108, 108, 77, 97, 110, 101, 117, + 118, 101, 114, 115, 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, + 0, 0, 0, 0, 3, 0, 1, 0, + 16, 0, 0, 0, 0, 0, 0, 0, + 69, 10, 226, 108, 26, 74, 236, 179, + 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, } }; @@ -25907,13 +25947,14 @@ static const ::capnp::_::AlignedData<230> b_c18216b27f8602af = { #if !CAPNP_LITE static const ::capnp::_::RawSchema* const d_c18216b27f8602af[] = { &s_a4cd1689c0a439d9, + &s_b3ec4a1a6ce20a45, &s_b66e0aa568d09c66, }; -static const uint16_t m_c18216b27f8602af[] = {5, 8, 2, 4, 0, 1, 3, 9, 10, 11, 6, 7}; -static const uint16_t i_c18216b27f8602af[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; +static const uint16_t m_c18216b27f8602af[] = {12, 5, 8, 2, 4, 0, 1, 3, 9, 10, 11, 6, 7}; +static const uint16_t i_c18216b27f8602af[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; const ::capnp::_::RawSchema s_c18216b27f8602af = { - 0xc18216b27f8602af, b_c18216b27f8602af.words, 230, d_c18216b27f8602af, m_c18216b27f8602af, - 2, 12, i_c18216b27f8602af, nullptr, nullptr, { &s_c18216b27f8602af, nullptr, nullptr, 0, 0, nullptr } + 0xc18216b27f8602af, b_c18216b27f8602af.words, 254, d_c18216b27f8602af, m_c18216b27f8602af, + 3, 13, i_c18216b27f8602af, nullptr, nullptr, { &s_c18216b27f8602af, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE static const ::capnp::_::AlignedData<69> b_a4cd1689c0a439d9 = { @@ -26084,6 +26125,83 @@ const ::capnp::_::RawSchema s_b66e0aa568d09c66 = { }; #endif // !CAPNP_LITE CAPNP_DEFINE_ENUM(SpeedLimitSign_b66e0aa568d09c66, b66e0aa568d09c66); +static const ::capnp::_::AlignedData<66> b_b3ec4a1a6ce20a45 = { + { 0, 0, 0, 0, 5, 0, 6, 0, + 69, 10, 226, 108, 26, 74, 236, 179, + 25, 0, 0, 0, 1, 0, 1, 0, + 175, 2, 134, 127, 178, 22, 130, 193, + 2, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 18, 1, 0, 0, + 37, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 33, 0, 0, 0, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 108, 111, 103, 46, 99, 97, 112, 110, + 112, 58, 78, 97, 118, 73, 110, 115, + 116, 114, 117, 99, 116, 105, 111, 110, + 46, 77, 97, 110, 101, 117, 118, 101, + 114, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, + 12, 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, + 69, 0, 0, 0, 74, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 68, 0, 0, 0, 3, 0, 1, 0, + 80, 0, 0, 0, 2, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 77, 0, 0, 0, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 72, 0, 0, 0, 3, 0, 1, 0, + 84, 0, 0, 0, 2, 0, 1, 0, + 2, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 81, 0, 0, 0, 74, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 80, 0, 0, 0, 3, 0, 1, 0, + 92, 0, 0, 0, 2, 0, 1, 0, + 100, 105, 115, 116, 97, 110, 99, 101, + 0, 0, 0, 0, 0, 0, 0, 0, + 10, 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, + 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 116, 121, 112, 101, 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, + 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, + 109, 111, 100, 105, 102, 105, 101, 114, + 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, + 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_b3ec4a1a6ce20a45 = b_b3ec4a1a6ce20a45.words; +#if !CAPNP_LITE +static const uint16_t m_b3ec4a1a6ce20a45[] = {0, 2, 1}; +static const uint16_t i_b3ec4a1a6ce20a45[] = {0, 1, 2}; +const ::capnp::_::RawSchema s_b3ec4a1a6ce20a45 = { + 0xb3ec4a1a6ce20a45, b_b3ec4a1a6ce20a45.words, 66, nullptr, m_b3ec4a1a6ce20a45, + 0, 3, i_b3ec4a1a6ce20a45, nullptr, nullptr, { &s_b3ec4a1a6ce20a45, nullptr, nullptr, 0, 0, nullptr } +}; +#endif // !CAPNP_LITE static const ::capnp::_::AlignedData<41> b_a61452f6440d97d3 = { { 0, 0, 0, 0, 5, 0, 6, 0, 211, 151, 13, 68, 246, 82, 20, 166, @@ -26753,7 +26871,7 @@ const ::capnp::_::RawSchema s_dc24138990726023 = { 0, 4, i_dc24138990726023, nullptr, nullptr, { &s_dc24138990726023, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE -static const ::capnp::_::AlignedData<2093> b_d314cfd957229c11 = { +static const ::capnp::_::AlignedData<2094> b_d314cfd957229c11 = { { 0, 0, 0, 0, 5, 0, 6, 0, 17, 156, 34, 87, 217, 207, 20, 211, 10, 0, 0, 0, 1, 0, 2, 0, @@ -27543,94 +27661,94 @@ static const ::capnp::_::AlignedData<2093> b_d314cfd957229c11 = { 79, 0, 147, 255, 0, 0, 0, 0, 0, 0, 1, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 93, 18, 0, 0, 130, 0, 0, 0, + 93, 18, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 18, 0, 0, 3, 0, 1, 0, - 104, 18, 0, 0, 2, 0, 1, 0, + 96, 18, 0, 0, 3, 0, 1, 0, + 108, 18, 0, 0, 2, 0, 1, 0, 80, 0, 146, 255, 0, 0, 0, 0, 0, 0, 1, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 18, 0, 0, 130, 0, 0, 0, + 105, 18, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 100, 18, 0, 0, 3, 0, 1, 0, - 112, 18, 0, 0, 2, 0, 1, 0, + 104, 18, 0, 0, 3, 0, 1, 0, + 116, 18, 0, 0, 2, 0, 1, 0, 81, 0, 145, 255, 0, 0, 0, 0, 0, 0, 1, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 109, 18, 0, 0, 130, 0, 0, 0, + 113, 18, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 108, 18, 0, 0, 3, 0, 1, 0, - 120, 18, 0, 0, 2, 0, 1, 0, + 112, 18, 0, 0, 3, 0, 1, 0, + 124, 18, 0, 0, 2, 0, 1, 0, 82, 0, 144, 255, 0, 0, 0, 0, 0, 0, 1, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 18, 0, 0, 130, 0, 0, 0, + 121, 18, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 116, 18, 0, 0, 3, 0, 1, 0, - 128, 18, 0, 0, 2, 0, 1, 0, + 120, 18, 0, 0, 3, 0, 1, 0, + 132, 18, 0, 0, 2, 0, 1, 0, 83, 0, 143, 255, 0, 0, 0, 0, 0, 0, 1, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 125, 18, 0, 0, 130, 0, 0, 0, + 129, 18, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 124, 18, 0, 0, 3, 0, 1, 0, - 136, 18, 0, 0, 2, 0, 1, 0, + 128, 18, 0, 0, 3, 0, 1, 0, + 140, 18, 0, 0, 2, 0, 1, 0, 84, 0, 142, 255, 0, 0, 0, 0, 0, 0, 1, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 133, 18, 0, 0, 130, 0, 0, 0, + 137, 18, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 132, 18, 0, 0, 3, 0, 1, 0, - 144, 18, 0, 0, 2, 0, 1, 0, + 136, 18, 0, 0, 3, 0, 1, 0, + 148, 18, 0, 0, 2, 0, 1, 0, 85, 0, 141, 255, 0, 0, 0, 0, 0, 0, 1, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 141, 18, 0, 0, 130, 0, 0, 0, + 145, 18, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 140, 18, 0, 0, 3, 0, 1, 0, - 152, 18, 0, 0, 2, 0, 1, 0, + 144, 18, 0, 0, 3, 0, 1, 0, + 156, 18, 0, 0, 2, 0, 1, 0, 50, 0, 140, 255, 0, 0, 0, 0, 0, 0, 1, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 149, 18, 0, 0, 194, 0, 0, 0, + 153, 18, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 152, 18, 0, 0, 3, 0, 1, 0, - 164, 18, 0, 0, 2, 0, 1, 0, + 156, 18, 0, 0, 3, 0, 1, 0, + 168, 18, 0, 0, 2, 0, 1, 0, 51, 0, 139, 255, 0, 0, 0, 0, 0, 0, 1, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 161, 18, 0, 0, 226, 0, 0, 0, + 165, 18, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 168, 18, 0, 0, 3, 0, 1, 0, - 180, 18, 0, 0, 2, 0, 1, 0, + 172, 18, 0, 0, 3, 0, 1, 0, + 184, 18, 0, 0, 2, 0, 1, 0, 52, 0, 138, 255, 0, 0, 0, 0, 0, 0, 1, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 177, 18, 0, 0, 210, 0, 0, 0, + 181, 18, 0, 0, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 184, 18, 0, 0, 3, 0, 1, 0, - 196, 18, 0, 0, 2, 0, 1, 0, + 188, 18, 0, 0, 3, 0, 1, 0, + 200, 18, 0, 0, 2, 0, 1, 0, 73, 0, 137, 255, 0, 0, 0, 0, 0, 0, 1, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 193, 18, 0, 0, 202, 0, 0, 0, + 197, 18, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 200, 18, 0, 0, 3, 0, 1, 0, - 212, 18, 0, 0, 2, 0, 1, 0, + 204, 18, 0, 0, 3, 0, 1, 0, + 216, 18, 0, 0, 2, 0, 1, 0, 74, 0, 136, 255, 0, 0, 0, 0, 0, 0, 1, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 209, 18, 0, 0, 234, 0, 0, 0, + 213, 18, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 216, 18, 0, 0, 3, 0, 1, 0, - 228, 18, 0, 0, 2, 0, 1, 0, + 220, 18, 0, 0, 3, 0, 1, 0, + 232, 18, 0, 0, 2, 0, 1, 0, 75, 0, 135, 255, 0, 0, 0, 0, 0, 0, 1, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 225, 18, 0, 0, 218, 0, 0, 0, + 229, 18, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 232, 18, 0, 0, 3, 0, 1, 0, - 244, 18, 0, 0, 2, 0, 1, 0, + 236, 18, 0, 0, 3, 0, 1, 0, + 248, 18, 0, 0, 2, 0, 1, 0, 108, 111, 103, 77, 111, 110, 111, 84, 105, 109, 101, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, @@ -28719,8 +28837,9 @@ static const ::capnp::_::AlignedData<2093> b_d314cfd957229c11 = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 117, 115, 116, 111, 109, 82, 101, - 115, 101, 114, 118, 101, 100, 51, 0, + 99, 111, 110, 116, 114, 111, 108, 115, + 83, 116, 97, 116, 101, 69, 120, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 53, 76, 68, 131, 152, 87, 150, 218, 0, 0, 0, 0, 0, 0, 0, 0, @@ -28941,7 +29060,7 @@ static const ::capnp::_::RawSchema* const d_d314cfd957229c11[] = { static const uint16_t m_d314cfd957229c11[] = {98, 101, 30, 20, 55, 42, 60, 63, 5, 23, 68, 69, 22, 28, 35, 7, 110, 111, 112, 113, 114, 115, 116, 6, 70, 87, 76, 71, 59, 92, 85, 26, 10, 91, 21, 48, 3, 41, 40, 99, 100, 1, 65, 64, 109, 32, 96, 19, 8, 46, 25, 72, 51, 44, 37, 107, 62, 36, 61, 94, 16, 14, 122, 119, 120, 117, 121, 118, 49, 18, 0, 24, 108, 95, 78, 105, 103, 9, 75, 82, 104, 83, 38, 84, 27, 54, 58, 56, 47, 53, 45, 12, 81, 80, 33, 89, 90, 31, 13, 2, 86, 15, 17, 4, 11, 73, 97, 52, 66, 43, 34, 39, 102, 57, 50, 106, 79, 93, 67, 74, 88, 77, 29}; static const uint16_t i_d314cfd957229c11[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 0, 67}; const ::capnp::_::RawSchema s_d314cfd957229c11 = { - 0xd314cfd957229c11, b_d314cfd957229c11.words, 2093, d_d314cfd957229c11, m_d314cfd957229c11, + 0xd314cfd957229c11, b_d314cfd957229c11.words, 2094, d_d314cfd957229c11, m_d314cfd957229c11, 86, 123, i_d314cfd957229c11, nullptr, nullptr, { &s_d314cfd957229c11, nullptr, nullptr, 0, 0, nullptr } }; #endif // !CAPNP_LITE @@ -29736,6 +29855,14 @@ constexpr ::capnp::Kind NavInstruction::Lane::_capnpPrivate::kind; constexpr ::capnp::_::RawSchema const* NavInstruction::Lane::_capnpPrivate::schema; #endif // !CAPNP_LITE +// NavInstruction::Maneuver +constexpr uint16_t NavInstruction::Maneuver::_capnpPrivate::dataWordSize; +constexpr uint16_t NavInstruction::Maneuver::_capnpPrivate::pointerCount; +#if !CAPNP_LITE +constexpr ::capnp::Kind NavInstruction::Maneuver::_capnpPrivate::kind; +constexpr ::capnp::_::RawSchema const* NavInstruction::Maneuver::_capnpPrivate::schema; +#endif // !CAPNP_LITE + // NavRoute constexpr uint16_t NavRoute::_capnpPrivate::dataWordSize; constexpr uint16_t NavRoute::_capnpPrivate::pointerCount; diff --git a/cereal/gen/cpp/log.capnp.h b/cereal/gen/cpp/log.capnp.h index 0e0dbf7d7..1181581f2 100644 --- a/cereal/gen/cpp/log.capnp.h +++ b/cereal/gen/cpp/log.capnp.h @@ -479,6 +479,7 @@ enum class SpeedLimitSign_b66e0aa568d09c66: uint16_t { VIENNA, }; CAPNP_DECLARE_ENUM(SpeedLimitSign, b66e0aa568d09c66); +CAPNP_DECLARE_SCHEMA(b3ec4a1a6ce20a45); CAPNP_DECLARE_SCHEMA(a61452f6440d97d3); CAPNP_DECLARE_SCHEMA(c4c96f53ad1e7485); CAPNP_DECLARE_SCHEMA(a158dd2a4cfaa81b); @@ -2147,9 +2148,10 @@ struct NavInstruction { typedef ::capnp::schemas::SpeedLimitSign_b66e0aa568d09c66 SpeedLimitSign; + struct Maneuver; struct _capnpPrivate { - CAPNP_DECLARE_STRUCT_HEADER(c18216b27f8602af, 3, 5) + CAPNP_DECLARE_STRUCT_HEADER(c18216b27f8602af, 3, 6) #if !CAPNP_LITE static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } #endif // !CAPNP_LITE @@ -2171,6 +2173,21 @@ struct NavInstruction::Lane { }; }; +struct NavInstruction::Maneuver { + Maneuver() = delete; + + class Reader; + class Builder; + class Pipeline; + + struct _capnpPrivate { + CAPNP_DECLARE_STRUCT_HEADER(b3ec4a1a6ce20a45, 1, 2) + #if !CAPNP_LITE + static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } + #endif // !CAPNP_LITE + }; +}; + struct NavRoute { NavRoute() = delete; @@ -2408,7 +2425,7 @@ struct Event { LIVE_MAP_DATA, LONGITUDINAL_PLAN_EXT, LATERAL_PLAN_EXT, - CUSTOM_RESERVED3, + CONTROLS_STATE_EXT, CUSTOM_RESERVED4, CUSTOM_RESERVED5, CUSTOM_RESERVED6, @@ -6158,6 +6175,8 @@ public: inline bool getRadar() const; + inline ::int32_t getRadarTrackId() const; + private: ::capnp::_::StructReader _reader; template @@ -6231,6 +6250,9 @@ public: inline bool getRadar(); inline void setRadar(bool value); + inline ::int32_t getRadarTrackId(); + inline void setRadarTrackId( ::int32_t value); + private: ::capnp::_::StructBuilder _builder; template @@ -17274,6 +17296,9 @@ public: inline ::cereal::NavInstruction::SpeedLimitSign getSpeedLimitSign() const; + inline bool hasAllManeuvers() const; + inline ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>::Reader getAllManeuvers() const; + private: ::capnp::_::StructReader _reader; template @@ -17358,6 +17383,13 @@ public: inline ::cereal::NavInstruction::SpeedLimitSign getSpeedLimitSign(); inline void setSpeedLimitSign( ::cereal::NavInstruction::SpeedLimitSign value); + inline bool hasAllManeuvers(); + inline ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>::Builder getAllManeuvers(); + inline void setAllManeuvers( ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>::Reader value); + inline ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>::Builder initAllManeuvers(unsigned int size); + inline void adoptAllManeuvers(::capnp::Orphan< ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>>&& value); + inline ::capnp::Orphan< ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>> disownAllManeuvers(); + private: ::capnp::_::StructBuilder _builder; template @@ -17476,6 +17508,102 @@ private: }; #endif // !CAPNP_LITE +class NavInstruction::Maneuver::Reader { +public: + typedef Maneuver Reads; + + Reader() = default; + inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} + + inline ::capnp::MessageSize totalSize() const { + return _reader.totalSize().asPublic(); + } + +#if !CAPNP_LITE + inline ::kj::StringTree toString() const { + return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); + } +#endif // !CAPNP_LITE + + inline float getDistance() const; + + inline bool hasType() const; + inline ::capnp::Text::Reader getType() const; + + inline bool hasModifier() const; + inline ::capnp::Text::Reader getModifier() const; + +private: + ::capnp::_::StructReader _reader; + template + friend struct ::capnp::ToDynamic_; + template + friend struct ::capnp::_::PointerHelpers; + template + friend struct ::capnp::List; + friend class ::capnp::MessageBuilder; + friend class ::capnp::Orphanage; +}; + +class NavInstruction::Maneuver::Builder { +public: + typedef Maneuver Builds; + + Builder() = delete; // Deleted to discourage incorrect usage. + // You can explicitly initialize to nullptr instead. + inline Builder(decltype(nullptr)) {} + inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} + inline operator Reader() const { return Reader(_builder.asReader()); } + inline Reader asReader() const { return *this; } + + inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } +#if !CAPNP_LITE + inline ::kj::StringTree toString() const { return asReader().toString(); } +#endif // !CAPNP_LITE + + inline float getDistance(); + inline void setDistance(float value); + + inline bool hasType(); + inline ::capnp::Text::Builder getType(); + inline void setType( ::capnp::Text::Reader value); + inline ::capnp::Text::Builder initType(unsigned int size); + inline void adoptType(::capnp::Orphan< ::capnp::Text>&& value); + inline ::capnp::Orphan< ::capnp::Text> disownType(); + + inline bool hasModifier(); + inline ::capnp::Text::Builder getModifier(); + inline void setModifier( ::capnp::Text::Reader value); + inline ::capnp::Text::Builder initModifier(unsigned int size); + inline void adoptModifier(::capnp::Orphan< ::capnp::Text>&& value); + inline ::capnp::Orphan< ::capnp::Text> disownModifier(); + +private: + ::capnp::_::StructBuilder _builder; + template + friend struct ::capnp::ToDynamic_; + friend class ::capnp::Orphanage; + template + friend struct ::capnp::_::PointerHelpers; +}; + +#if !CAPNP_LITE +class NavInstruction::Maneuver::Pipeline { +public: + typedef Maneuver Pipelines; + + inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} + inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) + : _typeless(kj::mv(typeless)) {} + +private: + ::capnp::AnyPointer::Pipeline _typeless; + friend class ::capnp::PipelineHook; + template + friend struct ::capnp::ToDynamic_; +}; +#endif // !CAPNP_LITE + class NavRoute::Reader { public: typedef NavRoute Reads; @@ -18686,9 +18814,9 @@ public: inline bool hasLateralPlanExt() const; inline ::cereal::LateralPlanExt::Reader getLateralPlanExt() const; - inline bool isCustomReserved3() const; - inline bool hasCustomReserved3() const; - inline ::cereal::CustomReserved3::Reader getCustomReserved3() const; + inline bool isControlsStateExt() const; + inline bool hasControlsStateExt() const; + inline ::cereal::ControlsStateExt::Reader getControlsStateExt() const; inline bool isCustomReserved4() const; inline bool hasCustomReserved4() const; @@ -19637,13 +19765,13 @@ public: inline void adoptLateralPlanExt(::capnp::Orphan< ::cereal::LateralPlanExt>&& value); inline ::capnp::Orphan< ::cereal::LateralPlanExt> disownLateralPlanExt(); - inline bool isCustomReserved3(); - inline bool hasCustomReserved3(); - inline ::cereal::CustomReserved3::Builder getCustomReserved3(); - inline void setCustomReserved3( ::cereal::CustomReserved3::Reader value); - inline ::cereal::CustomReserved3::Builder initCustomReserved3(); - inline void adoptCustomReserved3(::capnp::Orphan< ::cereal::CustomReserved3>&& value); - inline ::capnp::Orphan< ::cereal::CustomReserved3> disownCustomReserved3(); + inline bool isControlsStateExt(); + inline bool hasControlsStateExt(); + inline ::cereal::ControlsStateExt::Builder getControlsStateExt(); + inline void setControlsStateExt( ::cereal::ControlsStateExt::Reader value); + inline ::cereal::ControlsStateExt::Builder initControlsStateExt(); + inline void adoptControlsStateExt(::capnp::Orphan< ::cereal::ControlsStateExt>&& value); + inline ::capnp::Orphan< ::cereal::ControlsStateExt> disownControlsStateExt(); inline bool isCustomReserved4(); inline bool hasCustomReserved4(); @@ -26290,6 +26418,20 @@ inline void RadarState::LeadData::Builder::setRadar(bool value) { ::capnp::bounded<322>() * ::capnp::ELEMENTS, value); } +inline ::int32_t RadarState::LeadData::Reader::getRadarTrackId() const { + return _reader.getDataField< ::int32_t>( + ::capnp::bounded<13>() * ::capnp::ELEMENTS, -1); +} + +inline ::int32_t RadarState::LeadData::Builder::getRadarTrackId() { + return _builder.getDataField< ::int32_t>( + ::capnp::bounded<13>() * ::capnp::ELEMENTS, -1); +} +inline void RadarState::LeadData::Builder::setRadarTrackId( ::int32_t value) { + _builder.setDataField< ::int32_t>( + ::capnp::bounded<13>() * ::capnp::ELEMENTS, value, -1); +} + inline bool LiveCalibrationData::Reader::hasWarpMatrixDEPRECATED() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); @@ -44491,6 +44633,40 @@ inline void NavInstruction::Builder::setSpeedLimitSign( ::cereal::NavInstruction ::capnp::bounded<9>() * ::capnp::ELEMENTS, value); } +inline bool NavInstruction::Reader::hasAllManeuvers() const { + return !_reader.getPointerField( + ::capnp::bounded<5>() * ::capnp::POINTERS).isNull(); +} +inline bool NavInstruction::Builder::hasAllManeuvers() { + return !_builder.getPointerField( + ::capnp::bounded<5>() * ::capnp::POINTERS).isNull(); +} +inline ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>::Reader NavInstruction::Reader::getAllManeuvers() const { + return ::capnp::_::PointerHelpers< ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>>::get(_reader.getPointerField( + ::capnp::bounded<5>() * ::capnp::POINTERS)); +} +inline ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>::Builder NavInstruction::Builder::getAllManeuvers() { + return ::capnp::_::PointerHelpers< ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>>::get(_builder.getPointerField( + ::capnp::bounded<5>() * ::capnp::POINTERS)); +} +inline void NavInstruction::Builder::setAllManeuvers( ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>::Reader value) { + ::capnp::_::PointerHelpers< ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>>::set(_builder.getPointerField( + ::capnp::bounded<5>() * ::capnp::POINTERS), value); +} +inline ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>::Builder NavInstruction::Builder::initAllManeuvers(unsigned int size) { + return ::capnp::_::PointerHelpers< ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>>::init(_builder.getPointerField( + ::capnp::bounded<5>() * ::capnp::POINTERS), size); +} +inline void NavInstruction::Builder::adoptAllManeuvers( + ::capnp::Orphan< ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>>&& value) { + ::capnp::_::PointerHelpers< ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>>::adopt(_builder.getPointerField( + ::capnp::bounded<5>() * ::capnp::POINTERS), kj::mv(value)); +} +inline ::capnp::Orphan< ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>> NavInstruction::Builder::disownAllManeuvers() { + return ::capnp::_::PointerHelpers< ::capnp::List< ::cereal::NavInstruction::Maneuver, ::capnp::Kind::STRUCT>>::disown(_builder.getPointerField( + ::capnp::bounded<5>() * ::capnp::POINTERS)); +} + inline bool NavInstruction::Lane::Reader::hasDirections() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); @@ -44557,6 +44733,88 @@ inline void NavInstruction::Lane::Builder::setActiveDirection( ::cereal::NavInst ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); } +inline float NavInstruction::Maneuver::Reader::getDistance() const { + return _reader.getDataField( + ::capnp::bounded<0>() * ::capnp::ELEMENTS); +} + +inline float NavInstruction::Maneuver::Builder::getDistance() { + return _builder.getDataField( + ::capnp::bounded<0>() * ::capnp::ELEMENTS); +} +inline void NavInstruction::Maneuver::Builder::setDistance(float value) { + _builder.setDataField( + ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); +} + +inline bool NavInstruction::Maneuver::Reader::hasType() const { + return !_reader.getPointerField( + ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); +} +inline bool NavInstruction::Maneuver::Builder::hasType() { + return !_builder.getPointerField( + ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); +} +inline ::capnp::Text::Reader NavInstruction::Maneuver::Reader::getType() const { + return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( + ::capnp::bounded<0>() * ::capnp::POINTERS)); +} +inline ::capnp::Text::Builder NavInstruction::Maneuver::Builder::getType() { + return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( + ::capnp::bounded<0>() * ::capnp::POINTERS)); +} +inline void NavInstruction::Maneuver::Builder::setType( ::capnp::Text::Reader value) { + ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( + ::capnp::bounded<0>() * ::capnp::POINTERS), value); +} +inline ::capnp::Text::Builder NavInstruction::Maneuver::Builder::initType(unsigned int size) { + return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( + ::capnp::bounded<0>() * ::capnp::POINTERS), size); +} +inline void NavInstruction::Maneuver::Builder::adoptType( + ::capnp::Orphan< ::capnp::Text>&& value) { + ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( + ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); +} +inline ::capnp::Orphan< ::capnp::Text> NavInstruction::Maneuver::Builder::disownType() { + return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( + ::capnp::bounded<0>() * ::capnp::POINTERS)); +} + +inline bool NavInstruction::Maneuver::Reader::hasModifier() const { + return !_reader.getPointerField( + ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); +} +inline bool NavInstruction::Maneuver::Builder::hasModifier() { + return !_builder.getPointerField( + ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); +} +inline ::capnp::Text::Reader NavInstruction::Maneuver::Reader::getModifier() const { + return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField( + ::capnp::bounded<1>() * ::capnp::POINTERS)); +} +inline ::capnp::Text::Builder NavInstruction::Maneuver::Builder::getModifier() { + return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField( + ::capnp::bounded<1>() * ::capnp::POINTERS)); +} +inline void NavInstruction::Maneuver::Builder::setModifier( ::capnp::Text::Reader value) { + ::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField( + ::capnp::bounded<1>() * ::capnp::POINTERS), value); +} +inline ::capnp::Text::Builder NavInstruction::Maneuver::Builder::initModifier(unsigned int size) { + return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField( + ::capnp::bounded<1>() * ::capnp::POINTERS), size); +} +inline void NavInstruction::Maneuver::Builder::adoptModifier( + ::capnp::Orphan< ::capnp::Text>&& value) { + ::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField( + ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); +} +inline ::capnp::Orphan< ::capnp::Text> NavInstruction::Maneuver::Builder::disownModifier() { + return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField( + ::capnp::bounded<1>() * ::capnp::POINTERS)); +} + inline bool NavRoute::Reader::hasCoordinates() const { return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); @@ -51030,57 +51288,57 @@ inline ::capnp::Orphan< ::cereal::LateralPlanExt> Event::Builder::disownLateralP ::capnp::bounded<0>() * ::capnp::POINTERS)); } -inline bool Event::Reader::isCustomReserved3() const { - return which() == Event::CUSTOM_RESERVED3; +inline bool Event::Reader::isControlsStateExt() const { + return which() == Event::CONTROLS_STATE_EXT; } -inline bool Event::Builder::isCustomReserved3() { - return which() == Event::CUSTOM_RESERVED3; +inline bool Event::Builder::isControlsStateExt() { + return which() == Event::CONTROLS_STATE_EXT; } -inline bool Event::Reader::hasCustomReserved3() const { - if (which() != Event::CUSTOM_RESERVED3) return false; +inline bool Event::Reader::hasControlsStateExt() const { + if (which() != Event::CONTROLS_STATE_EXT) return false; return !_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } -inline bool Event::Builder::hasCustomReserved3() { - if (which() != Event::CUSTOM_RESERVED3) return false; +inline bool Event::Builder::hasControlsStateExt() { + if (which() != Event::CONTROLS_STATE_EXT) return false; return !_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); } -inline ::cereal::CustomReserved3::Reader Event::Reader::getCustomReserved3() const { - KJ_IREQUIRE((which() == Event::CUSTOM_RESERVED3), +inline ::cereal::ControlsStateExt::Reader Event::Reader::getControlsStateExt() const { + KJ_IREQUIRE((which() == Event::CONTROLS_STATE_EXT), "Must check which() before get()ing a union member."); - return ::capnp::_::PointerHelpers< ::cereal::CustomReserved3>::get(_reader.getPointerField( + return ::capnp::_::PointerHelpers< ::cereal::ControlsStateExt>::get(_reader.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } -inline ::cereal::CustomReserved3::Builder Event::Builder::getCustomReserved3() { - KJ_IREQUIRE((which() == Event::CUSTOM_RESERVED3), +inline ::cereal::ControlsStateExt::Builder Event::Builder::getControlsStateExt() { + KJ_IREQUIRE((which() == Event::CONTROLS_STATE_EXT), "Must check which() before get()ing a union member."); - return ::capnp::_::PointerHelpers< ::cereal::CustomReserved3>::get(_builder.getPointerField( + return ::capnp::_::PointerHelpers< ::cereal::ControlsStateExt>::get(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } -inline void Event::Builder::setCustomReserved3( ::cereal::CustomReserved3::Reader value) { +inline void Event::Builder::setControlsStateExt( ::cereal::ControlsStateExt::Reader value) { _builder.setDataField( - ::capnp::bounded<4>() * ::capnp::ELEMENTS, Event::CUSTOM_RESERVED3); - ::capnp::_::PointerHelpers< ::cereal::CustomReserved3>::set(_builder.getPointerField( + ::capnp::bounded<4>() * ::capnp::ELEMENTS, Event::CONTROLS_STATE_EXT); + ::capnp::_::PointerHelpers< ::cereal::ControlsStateExt>::set(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), value); } -inline ::cereal::CustomReserved3::Builder Event::Builder::initCustomReserved3() { +inline ::cereal::ControlsStateExt::Builder Event::Builder::initControlsStateExt() { _builder.setDataField( - ::capnp::bounded<4>() * ::capnp::ELEMENTS, Event::CUSTOM_RESERVED3); - return ::capnp::_::PointerHelpers< ::cereal::CustomReserved3>::init(_builder.getPointerField( + ::capnp::bounded<4>() * ::capnp::ELEMENTS, Event::CONTROLS_STATE_EXT); + return ::capnp::_::PointerHelpers< ::cereal::ControlsStateExt>::init(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } -inline void Event::Builder::adoptCustomReserved3( - ::capnp::Orphan< ::cereal::CustomReserved3>&& value) { +inline void Event::Builder::adoptControlsStateExt( + ::capnp::Orphan< ::cereal::ControlsStateExt>&& value) { _builder.setDataField( - ::capnp::bounded<4>() * ::capnp::ELEMENTS, Event::CUSTOM_RESERVED3); - ::capnp::_::PointerHelpers< ::cereal::CustomReserved3>::adopt(_builder.getPointerField( + ::capnp::bounded<4>() * ::capnp::ELEMENTS, Event::CONTROLS_STATE_EXT); + ::capnp::_::PointerHelpers< ::cereal::ControlsStateExt>::adopt(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); } -inline ::capnp::Orphan< ::cereal::CustomReserved3> Event::Builder::disownCustomReserved3() { - KJ_IREQUIRE((which() == Event::CUSTOM_RESERVED3), +inline ::capnp::Orphan< ::cereal::ControlsStateExt> Event::Builder::disownControlsStateExt() { + KJ_IREQUIRE((which() == Event::CONTROLS_STATE_EXT), "Must check which() before get()ing a union member."); - return ::capnp::_::PointerHelpers< ::cereal::CustomReserved3>::disown(_builder.getPointerField( + return ::capnp::_::PointerHelpers< ::cereal::ControlsStateExt>::disown(_builder.getPointerField( ::capnp::bounded<0>() * ::capnp::POINTERS)); } diff --git a/cereal/libcereal_shared.so b/cereal/libcereal_shared.so index 8012fd9ed..aa3015932 100755 Binary files a/cereal/libcereal_shared.so and b/cereal/libcereal_shared.so differ diff --git a/cereal/log.capnp b/cereal/log.capnp index e958b084f..d36429c3d 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -586,6 +586,7 @@ struct RadarState @0x9a185389d6fdd05f { aLeadTau @12 :Float32; modelProb @13 :Float32; radar @14 :Bool; + radarTrackId @15 :Int32 = -1; aLeadDEPRECATED @5 :Float32; } @@ -2082,6 +2083,8 @@ struct NavInstruction { speedLimit @10 :Float32; # m/s speedLimitSign @11 :SpeedLimitSign; + allManeuvers @12 :List(Maneuver); + struct Lane { directions @0 :List(Direction); active @1 :Bool; @@ -2098,7 +2101,13 @@ struct NavInstruction { enum SpeedLimitSign { mutcd @0; # US Style vienna @1; # EU Style - } + } + + struct Maneuver { + distance @0 :Float32; + type @1 :Text; + modifier @2 :Text; + } } struct NavRoute { @@ -2257,7 +2266,7 @@ struct Event { liveMapData @107 :Custom.LiveMapData; longitudinalPlanExt @108 :Custom.LongitudinalPlanExt; lateralPlanExt @109 :Custom.LateralPlanExt; - customReserved3 @110 :Custom.CustomReserved3; + controlsStateExt @110 :Custom.ControlsStateExt; customReserved4 @111 :Custom.CustomReserved4; customReserved5 @112 :Custom.CustomReserved5; customReserved6 @113 :Custom.CustomReserved6; diff --git a/cereal/messaging/bridge b/cereal/messaging/bridge index 6769c9c19..5d639b72a 100755 Binary files a/cereal/messaging/bridge and b/cereal/messaging/bridge differ diff --git a/cereal/messaging/messaging_pyx.so b/cereal/messaging/messaging_pyx.so index 04529f8b7..cabadee24 100755 Binary files a/cereal/messaging/messaging_pyx.so and b/cereal/messaging/messaging_pyx.so differ diff --git a/cereal/services.h b/cereal/services.h index 986611d91..5999de9b7 100644 --- a/cereal/services.h +++ b/cereal/services.h @@ -75,8 +75,9 @@ static struct service services[] = { { "livestreamRoadEncodeData", 8071, false, 20, -1 }, { "livestreamDriverEncodeData", 8072, false, 20, -1 }, { "liveMapData", 8073, false, 0, -1 }, - { "longitudinalPlanExt", 8074, true, 20, 5 }, - { "lateralPlanExt", 8075, true, 20, 5 }, + { "longitudinalPlanExt", 8074, false, 20, 5 }, + { "lateralPlanExt", 8075, false, 20, 5 }, + { "controlsStateExt", 8076, false, 100, 10 }, }; #endif diff --git a/cereal/services.py b/cereal/services.py index 6e9f4dca1..bfd2eefb9 100755 --- a/cereal/services.py +++ b/cereal/services.py @@ -97,8 +97,9 @@ services = { # mapd "liveMapData": (False, 0.), - "longitudinalPlanExt": (True, 20., 5), - "lateralPlanExt": (True, 20., 5), + "longitudinalPlanExt": (False, 20., 5), + "lateralPlanExt": (False, 20., 5), + "controlsStateExt": (False, 100., 10), } service_list = {name: Service(new_port(idx), *vals) for # type: ignore idx, (name, vals) in enumerate(services.items())} diff --git a/cereal/visionipc/__init__.py b/cereal/visionipc/__init__.py index c6460600c..3e11bbbb7 100644 --- a/cereal/visionipc/__init__.py +++ b/cereal/visionipc/__init__.py @@ -1,4 +1,5 @@ -from cereal.visionipc.visionipc_pyx import VisionIpcClient, VisionIpcServer, VisionStreamType, get_endpoint_name # pylint: disable=no-name-in-module, import-error +from cereal.visionipc.visionipc_pyx import VisionBuf, VisionIpcClient, VisionIpcServer, VisionStreamType, get_endpoint_name # pylint: disable=no-name-in-module, import-error +assert VisionBuf assert VisionIpcClient assert VisionIpcServer assert VisionStreamType diff --git a/cereal/visionipc/visionipc.pxd b/cereal/visionipc/visionipc.pxd index 32baa9cc1..3151dfc7d 100644 --- a/cereal/visionipc/visionipc.pxd +++ b/cereal/visionipc/visionipc.pxd @@ -8,7 +8,12 @@ from libc.stdint cimport uint32_t, uint64_t from libcpp cimport bool, int cdef extern from "cereal/visionipc/visionbuf.h": + struct _cl_device_id + struct _cl_context struct _cl_mem + + ctypedef _cl_device_id * cl_device_id + ctypedef _cl_context * cl_context ctypedef _cl_mem * cl_mem cdef enum VisionStreamType: diff --git a/cereal/visionipc/visionipc_pyx.cpp b/cereal/visionipc/visionipc_pyx.cpp index 7d280f0f9..b4f356491 100644 --- a/cereal/visionipc/visionipc_pyx.cpp +++ b/cereal/visionipc/visionipc_pyx.cpp @@ -1431,6 +1431,7 @@ static const char *__pyx_f[] = { "cereal/visionipc/visionipc_pyx.pyx", "", "__init__.cython-30.pxd", + "cereal/visionipc/visionipc_pyx.pxd", "type.pxd", }; /* #### Code section: utility_code_proto_before_types ### */ @@ -1792,6 +1793,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do /* #### Code section: type_declarations ### */ /*--- Type declarations ---*/ +struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_CLContext; struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionBuf; struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer; struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient; @@ -1851,8 +1853,22 @@ enum __pyx_t_6cereal_9visionipc_13visionipc_pyx_VisionStreamType { __pyx_e_6cereal_9visionipc_13visionipc_pyx_VISION_STREAM_MAP }; -/* "cereal/visionipc/visionipc_pyx.pxd":6 - * from .visionipc cimport VisionBuf as cppVisionBuf +/* "cereal/visionipc/visionipc_pyx.pxd":7 + * from .visionipc cimport cl_device_id, cl_context + * + * cdef class CLContext: # <<<<<<<<<<<<<< + * cdef cl_device_id device_id + * cdef cl_context context + */ +struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_CLContext { + PyObject_HEAD + cl_device_id device_id; + cl_context context; +}; + + +/* "cereal/visionipc/visionipc_pyx.pxd":11 + * cdef cl_context context * * cdef class VisionBuf: # <<<<<<<<<<<<<< * cdef cppVisionBuf * buf @@ -3515,6 +3531,7 @@ static const char __pyx_k_IntEnum[] = "IntEnum"; static const char __pyx_k_IntFlag[] = "IntFlag"; static const char __pyx_k_asarray[] = "asarray"; static const char __pyx_k_connect[] = "connect"; +static const char __pyx_k_context[] = "context"; static const char __pyx_k_disable[] = "disable"; static const char __pyx_k_fortran[] = "fortran"; static const char __pyx_k_members[] = "__members__"; @@ -3536,6 +3553,7 @@ static const char __pyx_k_qualname[] = "__qualname__"; static const char __pyx_k_register[] = "register"; static const char __pyx_k_set_name[] = "__set_name__"; static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_CLContext[] = "CLContext"; static const char __pyx_k_TypeError[] = "TypeError"; static const char __pyx_k_VisionBuf[] = "VisionBuf"; static const char __pyx_k_enumerate[] = "enumerate"; @@ -3725,7 +3743,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcServer_8 static void __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcServer_10__dealloc__(struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcServer_12__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcServer_14__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ -static int __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient___cinit__(struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *__pyx_v_self, std::string __pyx_v_name, enum __pyx_t_6cereal_9visionipc_13visionipc_pyx_VisionStreamType __pyx_v_stream, bool __pyx_v_conflate); /* proto */ +static int __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient___cinit__(struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *__pyx_v_self, std::string __pyx_v_name, enum __pyx_t_6cereal_9visionipc_13visionipc_pyx_VisionStreamType __pyx_v_stream, bool __pyx_v_conflate, struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_CLContext *__pyx_v_context); /* proto */ static void __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_2__dealloc__(struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_5width___get__(struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6height___get__(struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *__pyx_v_self); /* proto */ @@ -3744,6 +3762,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_8 static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_10available_streams(std::string __pyx_v_name, bool __pyx_v_block); /* proto */ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_12__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_14__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_tp_new_6cereal_9visionipc_13visionipc_pyx_CLContext(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_6cereal_9visionipc_13visionipc_pyx_VisionBuf(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ @@ -3830,6 +3849,7 @@ typedef struct { #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE + PyObject *__pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext; PyObject *__pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionBuf; PyObject *__pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer; PyObject *__pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient; @@ -3839,6 +3859,7 @@ typedef struct { PyObject *__pyx_type___pyx_memoryview; PyObject *__pyx_type___pyx_memoryviewslice; #endif + PyTypeObject *__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext; PyTypeObject *__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionBuf; PyTypeObject *__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer; PyTypeObject *__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient; @@ -3853,6 +3874,7 @@ typedef struct { PyObject *__pyx_kp_s_All_dimensions_preceding_dimensi; PyObject *__pyx_n_s_AssertionError; PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; + PyObject *__pyx_n_s_CLContext; PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; PyObject *__pyx_kp_s_Cannot_assign_to_read_only_memor; PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; @@ -3953,6 +3975,7 @@ typedef struct { PyObject *__pyx_kp_s_collections_abc; PyObject *__pyx_n_s_conflate; PyObject *__pyx_n_s_connect; + PyObject *__pyx_n_s_context; PyObject *__pyx_kp_s_contiguous_and_direct; PyObject *__pyx_kp_s_contiguous_and_indirect; PyObject *__pyx_n_s_count; @@ -4206,6 +4229,8 @@ static int __pyx_m_clear(PyObject *m) { Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_flexible); Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_character); Py_CLEAR(clear_module_state->__pyx_ptype_5numpy_ufunc); + Py_CLEAR(clear_module_state->__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext); + Py_CLEAR(clear_module_state->__pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext); Py_CLEAR(clear_module_state->__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionBuf); Py_CLEAR(clear_module_state->__pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionBuf); Py_CLEAR(clear_module_state->__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer); @@ -4228,6 +4253,7 @@ static int __pyx_m_clear(PyObject *m) { Py_CLEAR(clear_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError); Py_CLEAR(clear_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_CLEAR(clear_module_state->__pyx_n_s_CLContext); Py_CLEAR(clear_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); @@ -4328,6 +4354,7 @@ static int __pyx_m_clear(PyObject *m) { Py_CLEAR(clear_module_state->__pyx_kp_s_collections_abc); Py_CLEAR(clear_module_state->__pyx_n_s_conflate); Py_CLEAR(clear_module_state->__pyx_n_s_connect); + Py_CLEAR(clear_module_state->__pyx_n_s_context); Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_direct); Py_CLEAR(clear_module_state->__pyx_kp_s_contiguous_and_indirect); Py_CLEAR(clear_module_state->__pyx_n_s_count); @@ -4559,6 +4586,8 @@ static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_flexible); Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_character); Py_VISIT(traverse_module_state->__pyx_ptype_5numpy_ufunc); + Py_VISIT(traverse_module_state->__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext); + Py_VISIT(traverse_module_state->__pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext); Py_VISIT(traverse_module_state->__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionBuf); Py_VISIT(traverse_module_state->__pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionBuf); Py_VISIT(traverse_module_state->__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer); @@ -4581,6 +4610,7 @@ static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { Py_VISIT(traverse_module_state->__pyx_kp_s_All_dimensions_preceding_dimensi); Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError); Py_VISIT(traverse_module_state->__pyx_kp_s_Buffer_view_does_not_expose_stri); + Py_VISIT(traverse_module_state->__pyx_n_s_CLContext); Py_VISIT(traverse_module_state->__pyx_kp_s_Can_only_create_a_buffer_that_is); Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_assign_to_read_only_memor); Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_create_writable_memory_vi); @@ -4681,6 +4711,7 @@ static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { Py_VISIT(traverse_module_state->__pyx_kp_s_collections_abc); Py_VISIT(traverse_module_state->__pyx_n_s_conflate); Py_VISIT(traverse_module_state->__pyx_n_s_connect); + Py_VISIT(traverse_module_state->__pyx_n_s_context); Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_direct); Py_VISIT(traverse_module_state->__pyx_kp_s_contiguous_and_indirect); Py_VISIT(traverse_module_state->__pyx_n_s_count); @@ -4955,6 +4986,7 @@ static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE +#define __pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext __pyx_mstate_global->__pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext #define __pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionBuf __pyx_mstate_global->__pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionBuf #define __pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer __pyx_mstate_global->__pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer #define __pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient __pyx_mstate_global->__pyx_type_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient @@ -4964,6 +4996,7 @@ static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { #define __pyx_type___pyx_memoryview __pyx_mstate_global->__pyx_type___pyx_memoryview #define __pyx_type___pyx_memoryviewslice __pyx_mstate_global->__pyx_type___pyx_memoryviewslice #endif +#define __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext __pyx_mstate_global->__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext #define __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionBuf __pyx_mstate_global->__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionBuf #define __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer __pyx_mstate_global->__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcServer #define __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient __pyx_mstate_global->__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient @@ -4978,6 +5011,7 @@ static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { #define __pyx_kp_s_All_dimensions_preceding_dimensi __pyx_mstate_global->__pyx_kp_s_All_dimensions_preceding_dimensi #define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError #define __pyx_kp_s_Buffer_view_does_not_expose_stri __pyx_mstate_global->__pyx_kp_s_Buffer_view_does_not_expose_stri +#define __pyx_n_s_CLContext __pyx_mstate_global->__pyx_n_s_CLContext #define __pyx_kp_s_Can_only_create_a_buffer_that_is __pyx_mstate_global->__pyx_kp_s_Can_only_create_a_buffer_that_is #define __pyx_kp_s_Cannot_assign_to_read_only_memor __pyx_mstate_global->__pyx_kp_s_Cannot_assign_to_read_only_memor #define __pyx_kp_s_Cannot_create_writable_memory_vi __pyx_mstate_global->__pyx_kp_s_Cannot_create_writable_memory_vi @@ -5078,6 +5112,7 @@ static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { #define __pyx_kp_s_collections_abc __pyx_mstate_global->__pyx_kp_s_collections_abc #define __pyx_n_s_conflate __pyx_mstate_global->__pyx_n_s_conflate #define __pyx_n_s_connect __pyx_mstate_global->__pyx_n_s_connect +#define __pyx_n_s_context __pyx_mstate_global->__pyx_n_s_context #define __pyx_kp_s_contiguous_and_direct __pyx_mstate_global->__pyx_kp_s_contiguous_and_direct #define __pyx_kp_s_contiguous_and_indirect __pyx_mstate_global->__pyx_kp_s_contiguous_and_indirect #define __pyx_n_s_count __pyx_mstate_global->__pyx_n_s_count @@ -24798,9 +24833,9 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcServer_1 /* "cereal/visionipc/visionipc_pyx.pyx":101 * cdef VisionIpcBufExtra extra * - * def __cinit__(self, string name, VisionStreamType stream, bool conflate): # <<<<<<<<<<<<<< - * self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) - * + * def __cinit__(self, string name, VisionStreamType stream, bool conflate, CLContext context = None): # <<<<<<<<<<<<<< + * if context: + * self.client = new cppVisionIpcClient(name, stream, conflate, context.device_id, context.context) */ /* Python wrapper */ @@ -24809,6 +24844,7 @@ static int __pyx_pw_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1__cini std::string __pyx_v_name; enum __pyx_t_6cereal_9visionipc_13visionipc_pyx_VisionStreamType __pyx_v_stream; bool __pyx_v_conflate; + struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_CLContext *__pyx_v_context = 0; CYTHON_UNUSED const Py_ssize_t __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); CYTHON_UNUSED PyObject *const *__pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); int __pyx_lineno = 0; @@ -24818,11 +24854,14 @@ static int __pyx_pw_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1__cini __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,&__pyx_n_s_stream,&__pyx_n_s_conflate,0}; - PyObject* values[3] = {0,0,0}; + PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,&__pyx_n_s_stream,&__pyx_n_s_conflate,&__pyx_n_s_context,0}; + PyObject* values[4] = {0,0,0,0}; + values[3] = (PyObject *)((struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_CLContext *)Py_None); if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); @@ -24843,76 +24882,134 @@ static int __pyx_pw_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1__cini if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_stream)) != 0)) kw_args--; else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 101, __pyx_L3_error) else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(0, 101, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 4, 1); __PYX_ERR(0, 101, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_conflate)) != 0)) kw_args--; else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 101, __pyx_L3_error) else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(0, 101, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 4, 2); __PYX_ERR(0, 101, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_context); + if (value) { values[3] = value; kw_args--; } + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 101, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(0, 101, __pyx_L3_error) } - } else if (unlikely(__pyx_nargs != 3)) { - goto __pyx_L5_argtuple_error; } else { - values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); - values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); - values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + switch (__pyx_nargs) { + case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); + values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); + values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } } __pyx_v_name = __pyx_convert_string_from_py_std__in_string(values[0]); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 101, __pyx_L3_error) __pyx_v_stream = ((enum __pyx_t_6cereal_9visionipc_13visionipc_pyx_VisionStreamType)__Pyx_PyInt_As_enum____pyx_t_6cereal_9visionipc_13visionipc_pyx_VisionStreamType(values[1])); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 101, __pyx_L3_error) __pyx_v_conflate = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_conflate == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 101, __pyx_L3_error) + __pyx_v_context = ((struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_CLContext *)values[3]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 101, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 4, __pyx_nargs); __PYX_ERR(0, 101, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("cereal.visionipc.visionipc_pyx.VisionIpcClient.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient___cinit__(((struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *)__pyx_v_self), __PYX_STD_MOVE_IF_SUPPORTED(__pyx_v_name), __pyx_v_stream, __pyx_v_conflate); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_context), __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext, 1, "context", 0))) __PYX_ERR(0, 101, __pyx_L1_error) + __pyx_r = __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient___cinit__(((struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *)__pyx_v_self), __PYX_STD_MOVE_IF_SUPPORTED(__pyx_v_name), __pyx_v_stream, __pyx_v_conflate, __pyx_v_context); /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } -static int __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient___cinit__(struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *__pyx_v_self, std::string __pyx_v_name, enum __pyx_t_6cereal_9visionipc_13visionipc_pyx_VisionStreamType __pyx_v_stream, bool __pyx_v_conflate) { +static int __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient___cinit__(struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient *__pyx_v_self, std::string __pyx_v_name, enum __pyx_t_6cereal_9visionipc_13visionipc_pyx_VisionStreamType __pyx_v_stream, bool __pyx_v_conflate, struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_CLContext *__pyx_v_context) { int __pyx_r; __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__cinit__", 0); /* "cereal/visionipc/visionipc_pyx.pyx":102 * - * def __cinit__(self, string name, VisionStreamType stream, bool conflate): - * self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) # <<<<<<<<<<<<<< + * def __cinit__(self, string name, VisionStreamType stream, bool conflate, CLContext context = None): + * if context: # <<<<<<<<<<<<<< + * self.client = new cppVisionIpcClient(name, stream, conflate, context.device_id, context.context) + * else: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_context)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 102, __pyx_L1_error) + if (__pyx_t_1) { + + /* "cereal/visionipc/visionipc_pyx.pyx":103 + * def __cinit__(self, string name, VisionStreamType stream, bool conflate, CLContext context = None): + * if context: + * self.client = new cppVisionIpcClient(name, stream, conflate, context.device_id, context.context) # <<<<<<<<<<<<<< + * else: + * self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) + */ + __pyx_v_self->client = new VisionIpcClient(__pyx_v_name, ((enum VisionStreamType)__pyx_v_stream), __pyx_v_conflate, __pyx_v_context->device_id, __pyx_v_context->context); + + /* "cereal/visionipc/visionipc_pyx.pyx":102 + * + * def __cinit__(self, string name, VisionStreamType stream, bool conflate, CLContext context = None): + * if context: # <<<<<<<<<<<<<< + * self.client = new cppVisionIpcClient(name, stream, conflate, context.device_id, context.context) + * else: + */ + goto __pyx_L3; + } + + /* "cereal/visionipc/visionipc_pyx.pyx":105 + * self.client = new cppVisionIpcClient(name, stream, conflate, context.device_id, context.context) + * else: + * self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) # <<<<<<<<<<<<<< * * def __dealloc__(self): */ - __pyx_v_self->client = new VisionIpcClient(__pyx_v_name, ((enum VisionStreamType)__pyx_v_stream), __pyx_v_conflate, NULL, NULL); + /*else*/ { + __pyx_v_self->client = new VisionIpcClient(__pyx_v_name, ((enum VisionStreamType)__pyx_v_stream), __pyx_v_conflate, NULL, NULL); + } + __pyx_L3:; /* "cereal/visionipc/visionipc_pyx.pyx":101 * cdef VisionIpcBufExtra extra * - * def __cinit__(self, string name, VisionStreamType stream, bool conflate): # <<<<<<<<<<<<<< - * self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) - * + * def __cinit__(self, string name, VisionStreamType stream, bool conflate, CLContext context = None): # <<<<<<<<<<<<<< + * if context: + * self.client = new cppVisionIpcClient(name, stream, conflate, context.device_id, context.context) */ /* function exit code */ __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("cereal.visionipc.visionipc_pyx.VisionIpcClient.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":104 - * self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) +/* "cereal/visionipc/visionipc_pyx.pyx":107 + * self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) * * def __dealloc__(self): # <<<<<<<<<<<<<< * del self.client @@ -24935,7 +25032,7 @@ static void __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_2__dea __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":105 + /* "cereal/visionipc/visionipc_pyx.pyx":108 * * def __dealloc__(self): * del self.client # <<<<<<<<<<<<<< @@ -24944,8 +25041,8 @@ static void __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_2__dea */ delete __pyx_v_self->client; - /* "cereal/visionipc/visionipc_pyx.pyx":104 - * self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) + /* "cereal/visionipc/visionipc_pyx.pyx":107 + * self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) * * def __dealloc__(self): # <<<<<<<<<<<<<< * del self.client @@ -24956,7 +25053,7 @@ static void __pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_2__dea __Pyx_RefNannyFinishContext(); } -/* "cereal/visionipc/visionipc_pyx.pyx":107 +/* "cereal/visionipc/visionipc_pyx.pyx":110 * del self.client * * @property # <<<<<<<<<<<<<< @@ -24988,7 +25085,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_5 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":109 + /* "cereal/visionipc/visionipc_pyx.pyx":112 * @property * def width(self): * return self.client.buffers[0].width if self.client.num_buffers else None # <<<<<<<<<<<<<< @@ -24997,7 +25094,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_5 */ __Pyx_XDECREF(__pyx_r); if ((__pyx_v_self->client->num_buffers != 0)) { - __pyx_t_2 = __Pyx_PyInt_FromSize_t((__pyx_v_self->client->buffers[0]).width); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 109, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_FromSize_t((__pyx_v_self->client->buffers[0]).width); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 112, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __pyx_t_2; __pyx_t_2 = 0; @@ -25009,7 +25106,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_5 __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":107 + /* "cereal/visionipc/visionipc_pyx.pyx":110 * del self.client * * @property # <<<<<<<<<<<<<< @@ -25029,7 +25126,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_5 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":111 +/* "cereal/visionipc/visionipc_pyx.pyx":114 * return self.client.buffers[0].width if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25061,7 +25158,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":113 + /* "cereal/visionipc/visionipc_pyx.pyx":116 * @property * def height(self): * return self.client.buffers[0].height if self.client.num_buffers else None # <<<<<<<<<<<<<< @@ -25070,7 +25167,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 */ __Pyx_XDECREF(__pyx_r); if ((__pyx_v_self->client->num_buffers != 0)) { - __pyx_t_2 = __Pyx_PyInt_FromSize_t((__pyx_v_self->client->buffers[0]).height); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 113, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_FromSize_t((__pyx_v_self->client->buffers[0]).height); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __pyx_t_2; __pyx_t_2 = 0; @@ -25082,7 +25179,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":111 + /* "cereal/visionipc/visionipc_pyx.pyx":114 * return self.client.buffers[0].width if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25102,7 +25199,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":115 +/* "cereal/visionipc/visionipc_pyx.pyx":118 * return self.client.buffers[0].height if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25134,7 +25231,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":117 + /* "cereal/visionipc/visionipc_pyx.pyx":120 * @property * def stride(self): * return self.client.buffers[0].stride if self.client.num_buffers else None # <<<<<<<<<<<<<< @@ -25143,7 +25240,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 */ __Pyx_XDECREF(__pyx_r); if ((__pyx_v_self->client->num_buffers != 0)) { - __pyx_t_2 = __Pyx_PyInt_FromSize_t((__pyx_v_self->client->buffers[0]).stride); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_FromSize_t((__pyx_v_self->client->buffers[0]).stride); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 120, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __pyx_t_2; __pyx_t_2 = 0; @@ -25155,7 +25252,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":115 + /* "cereal/visionipc/visionipc_pyx.pyx":118 * return self.client.buffers[0].height if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25175,7 +25272,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":119 +/* "cereal/visionipc/visionipc_pyx.pyx":122 * return self.client.buffers[0].stride if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25207,7 +25304,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_9 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":121 + /* "cereal/visionipc/visionipc_pyx.pyx":124 * @property * def uv_offset(self): * return self.client.buffers[0].uv_offset if self.client.num_buffers else None # <<<<<<<<<<<<<< @@ -25216,7 +25313,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_9 */ __Pyx_XDECREF(__pyx_r); if ((__pyx_v_self->client->num_buffers != 0)) { - __pyx_t_2 = __Pyx_PyInt_FromSize_t((__pyx_v_self->client->buffers[0]).uv_offset); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_FromSize_t((__pyx_v_self->client->buffers[0]).uv_offset); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __pyx_t_2; __pyx_t_2 = 0; @@ -25228,7 +25325,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_9 __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":119 + /* "cereal/visionipc/visionipc_pyx.pyx":122 * return self.client.buffers[0].stride if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25248,7 +25345,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_9 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":123 +/* "cereal/visionipc/visionipc_pyx.pyx":126 * return self.client.buffers[0].uv_offset if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25280,7 +25377,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_3 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":125 + /* "cereal/visionipc/visionipc_pyx.pyx":128 * @property * def rgb(self): * return self.client.buffers[0].rgb if self.client.num_buffers else None # <<<<<<<<<<<<<< @@ -25289,7 +25386,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_3 */ __Pyx_XDECREF(__pyx_r); if ((__pyx_v_self->client->num_buffers != 0)) { - __pyx_t_2 = __Pyx_PyBool_FromLong((__pyx_v_self->client->buffers[0]).rgb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong((__pyx_v_self->client->buffers[0]).rgb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 128, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __pyx_t_2; __pyx_t_2 = 0; @@ -25301,7 +25398,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_3 __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":123 + /* "cereal/visionipc/visionipc_pyx.pyx":126 * return self.client.buffers[0].uv_offset if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25321,7 +25418,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_3 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":127 +/* "cereal/visionipc/visionipc_pyx.pyx":130 * return self.client.buffers[0].rgb if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25353,7 +25450,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":129 + /* "cereal/visionipc/visionipc_pyx.pyx":132 * @property * def buffer_len(self): * return self.client.buffers[0].len if self.client.num_buffers else None # <<<<<<<<<<<<<< @@ -25362,7 +25459,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 */ __Pyx_XDECREF(__pyx_r); if ((__pyx_v_self->client->num_buffers != 0)) { - __pyx_t_2 = __Pyx_PyInt_FromSize_t((__pyx_v_self->client->buffers[0]).len); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 129, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_FromSize_t((__pyx_v_self->client->buffers[0]).len); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __pyx_t_2; __pyx_t_2 = 0; @@ -25374,7 +25471,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":127 + /* "cereal/visionipc/visionipc_pyx.pyx":130 * return self.client.buffers[0].rgb if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25394,7 +25491,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":131 +/* "cereal/visionipc/visionipc_pyx.pyx":134 * return self.client.buffers[0].len if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25425,7 +25522,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":133 + /* "cereal/visionipc/visionipc_pyx.pyx":136 * @property * def num_buffers(self): * return self.client.num_buffers # <<<<<<<<<<<<<< @@ -25433,13 +25530,13 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 * @property */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->client->num_buffers); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 133, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->client->num_buffers); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 136, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":131 + /* "cereal/visionipc/visionipc_pyx.pyx":134 * return self.client.buffers[0].len if self.client.num_buffers else None * * @property # <<<<<<<<<<<<<< @@ -25458,7 +25555,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":135 +/* "cereal/visionipc/visionipc_pyx.pyx":138 * return self.client.num_buffers * * @property # <<<<<<<<<<<<<< @@ -25489,7 +25586,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_8 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":137 + /* "cereal/visionipc/visionipc_pyx.pyx":140 * @property * def frame_id(self): * return self.extra.frame_id # <<<<<<<<<<<<<< @@ -25497,13 +25594,13 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_8 * @property */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_uint32_t(__pyx_v_self->extra.frame_id); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 137, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_uint32_t(__pyx_v_self->extra.frame_id); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":135 + /* "cereal/visionipc/visionipc_pyx.pyx":138 * return self.client.num_buffers * * @property # <<<<<<<<<<<<<< @@ -25522,7 +25619,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_8 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":139 +/* "cereal/visionipc/visionipc_pyx.pyx":142 * return self.extra.frame_id * * @property # <<<<<<<<<<<<<< @@ -25553,7 +25650,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":141 + /* "cereal/visionipc/visionipc_pyx.pyx":144 * @property * def timestamp_sof(self): * return self.extra.timestamp_sof # <<<<<<<<<<<<<< @@ -25561,13 +25658,13 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 * @property */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_self->extra.timestamp_sof); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 141, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_self->extra.timestamp_sof); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 144, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":139 + /* "cereal/visionipc/visionipc_pyx.pyx":142 * return self.extra.frame_id * * @property # <<<<<<<<<<<<<< @@ -25586,7 +25683,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":143 +/* "cereal/visionipc/visionipc_pyx.pyx":146 * return self.extra.timestamp_sof * * @property # <<<<<<<<<<<<<< @@ -25617,7 +25714,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":145 + /* "cereal/visionipc/visionipc_pyx.pyx":148 * @property * def timestamp_eof(self): * return self.extra.timestamp_eof # <<<<<<<<<<<<<< @@ -25625,13 +25722,13 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 * @property */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_self->extra.timestamp_eof); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_self->extra.timestamp_eof); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":143 + /* "cereal/visionipc/visionipc_pyx.pyx":146 * return self.extra.timestamp_sof * * @property # <<<<<<<<<<<<<< @@ -25650,7 +25747,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":147 +/* "cereal/visionipc/visionipc_pyx.pyx":150 * return self.extra.timestamp_eof * * @property # <<<<<<<<<<<<<< @@ -25681,7 +25778,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_5 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":149 + /* "cereal/visionipc/visionipc_pyx.pyx":152 * @property * def valid(self): * return self.extra.valid # <<<<<<<<<<<<<< @@ -25689,13 +25786,13 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_5 * def recv(self, int timeout_ms=100): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->extra.valid); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->extra.valid); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 152, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":147 + /* "cereal/visionipc/visionipc_pyx.pyx":150 * return self.extra.timestamp_eof * * @property # <<<<<<<<<<<<<< @@ -25714,7 +25811,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_5 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":151 +/* "cereal/visionipc/visionipc_pyx.pyx":154 * return self.extra.valid * * def recv(self, int timeout_ms=100): # <<<<<<<<<<<<<< @@ -25766,12 +25863,12 @@ PyObject *__pyx_args, PyObject *__pyx_kwds if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_timeout_ms); if (value) { values[0] = value; kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 151, __pyx_L3_error) + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 154, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "recv") < 0)) __PYX_ERR(0, 151, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "recv") < 0)) __PYX_ERR(0, 154, __pyx_L3_error) } } else { switch (__pyx_nargs) { @@ -25782,14 +25879,14 @@ PyObject *__pyx_args, PyObject *__pyx_kwds } } if (values[0]) { - __pyx_v_timeout_ms = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_timeout_ms == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 151, __pyx_L3_error) + __pyx_v_timeout_ms = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_timeout_ms == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 154, __pyx_L3_error) } else { __pyx_v_timeout_ms = ((int)0x64); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("recv", 0, 0, 1, __pyx_nargs); __PYX_ERR(0, 151, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("recv", 0, 0, 1, __pyx_nargs); __PYX_ERR(0, 154, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("cereal.visionipc.visionipc_pyx.VisionIpcClient.recv", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -25813,7 +25910,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_4 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("recv", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":152 + /* "cereal/visionipc/visionipc_pyx.pyx":155 * * def recv(self, int timeout_ms=100): * buf = self.client.recv(&self.extra, timeout_ms) # <<<<<<<<<<<<<< @@ -25822,7 +25919,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_4 */ __pyx_v_buf = __pyx_v_self->client->recv((&__pyx_v_self->extra), __pyx_v_timeout_ms); - /* "cereal/visionipc/visionipc_pyx.pyx":153 + /* "cereal/visionipc/visionipc_pyx.pyx":156 * def recv(self, int timeout_ms=100): * buf = self.client.recv(&self.extra, timeout_ms) * if not buf: # <<<<<<<<<<<<<< @@ -25832,7 +25929,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_4 __pyx_t_1 = (!(__pyx_v_buf != 0)); if (__pyx_t_1) { - /* "cereal/visionipc/visionipc_pyx.pyx":154 + /* "cereal/visionipc/visionipc_pyx.pyx":157 * buf = self.client.recv(&self.extra, timeout_ms) * if not buf: * return None # <<<<<<<<<<<<<< @@ -25843,7 +25940,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_4 __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":153 + /* "cereal/visionipc/visionipc_pyx.pyx":156 * def recv(self, int timeout_ms=100): * buf = self.client.recv(&self.extra, timeout_ms) * if not buf: # <<<<<<<<<<<<<< @@ -25852,7 +25949,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_4 */ } - /* "cereal/visionipc/visionipc_pyx.pyx":155 + /* "cereal/visionipc/visionipc_pyx.pyx":158 * if not buf: * return None * return VisionBuf.create(buf) # <<<<<<<<<<<<<< @@ -25860,13 +25957,13 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_4 * def connect(self, bool blocking): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_f_6cereal_9visionipc_13visionipc_pyx_9VisionBuf_create(__pyx_v_buf); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 155, __pyx_L1_error) + __pyx_t_2 = __pyx_f_6cereal_9visionipc_13visionipc_pyx_9VisionBuf_create(__pyx_v_buf); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 158, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":151 + /* "cereal/visionipc/visionipc_pyx.pyx":154 * return self.extra.valid * * def recv(self, int timeout_ms=100): # <<<<<<<<<<<<<< @@ -25885,7 +25982,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_4 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":157 +/* "cereal/visionipc/visionipc_pyx.pyx":160 * return VisionBuf.create(buf) * * def connect(self, bool blocking): # <<<<<<<<<<<<<< @@ -25935,23 +26032,23 @@ PyObject *__pyx_args, PyObject *__pyx_kwds switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_blocking)) != 0)) kw_args--; - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 157, __pyx_L3_error) + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "connect") < 0)) __PYX_ERR(0, 157, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "connect") < 0)) __PYX_ERR(0, 160, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } - __pyx_v_blocking = __Pyx_PyObject_IsTrue(values[0]); if (unlikely((__pyx_v_blocking == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 157, __pyx_L3_error) + __pyx_v_blocking = __Pyx_PyObject_IsTrue(values[0]); if (unlikely((__pyx_v_blocking == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("connect", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 157, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("connect", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 160, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("cereal.visionipc.visionipc_pyx.VisionIpcClient.connect", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -25973,7 +26070,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("connect", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":158 + /* "cereal/visionipc/visionipc_pyx.pyx":161 * * def connect(self, bool blocking): * return self.client.connect(blocking) # <<<<<<<<<<<<<< @@ -25981,13 +26078,13 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 * def is_connected(self): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->client->connect(__pyx_v_blocking)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 158, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->client->connect(__pyx_v_blocking)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":157 + /* "cereal/visionipc/visionipc_pyx.pyx":160 * return VisionBuf.create(buf) * * def connect(self, bool blocking): # <<<<<<<<<<<<<< @@ -26006,7 +26103,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_6 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":160 +/* "cereal/visionipc/visionipc_pyx.pyx":163 * return self.client.connect(blocking) * * def is_connected(self): # <<<<<<<<<<<<<< @@ -26056,7 +26153,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_8 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("is_connected", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":161 + /* "cereal/visionipc/visionipc_pyx.pyx":164 * * def is_connected(self): * return self.client.is_connected() # <<<<<<<<<<<<<< @@ -26064,13 +26161,13 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_8 * @staticmethod */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->client->is_connected()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->client->is_connected()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 164, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":160 + /* "cereal/visionipc/visionipc_pyx.pyx":163 * return self.client.connect(blocking) * * def is_connected(self): # <<<<<<<<<<<<<< @@ -26089,7 +26186,7 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_8 return __pyx_r; } -/* "cereal/visionipc/visionipc_pyx.pyx":163 +/* "cereal/visionipc/visionipc_pyx.pyx":166 * return self.client.is_connected() * * @staticmethod # <<<<<<<<<<<<<< @@ -26142,19 +26239,19 @@ PyObject *__pyx_args, PyObject *__pyx_kwds switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_name)) != 0)) kw_args--; - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 163, __pyx_L3_error) + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 166, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_block)) != 0)) kw_args--; - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 163, __pyx_L3_error) + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 166, __pyx_L3_error) else { - __Pyx_RaiseArgtupleInvalid("available_streams", 1, 2, 2, 1); __PYX_ERR(0, 163, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("available_streams", 1, 2, 2, 1); __PYX_ERR(0, 166, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "available_streams") < 0)) __PYX_ERR(0, 163, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "available_streams") < 0)) __PYX_ERR(0, 166, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 2)) { goto __pyx_L5_argtuple_error; @@ -26162,12 +26259,12 @@ PyObject *__pyx_args, PyObject *__pyx_kwds values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); } - __pyx_v_name = __pyx_convert_string_from_py_std__in_string(values[0]); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 164, __pyx_L3_error) - __pyx_v_block = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_block == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 164, __pyx_L3_error) + __pyx_v_name = __pyx_convert_string_from_py_std__in_string(values[0]); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 167, __pyx_L3_error) + __pyx_v_block = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_block == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 167, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("available_streams", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 163, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("available_streams", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 166, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("cereal.visionipc.visionipc_pyx.VisionIpcClient.available_streams", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -26189,19 +26286,19 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 int __pyx_clineno = 0; __Pyx_RefNannySetupContext("available_streams", 0); - /* "cereal/visionipc/visionipc_pyx.pyx":165 + /* "cereal/visionipc/visionipc_pyx.pyx":168 * @staticmethod * def available_streams(string name, bool block): * return cppVisionIpcClient.getAvailableStreams(name, block) # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_convert_set_to_py_enum__VisionStreamType(VisionIpcClient::getAvailableStreams(__pyx_v_name, __pyx_v_block)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_1 = __pyx_convert_set_to_py_enum__VisionStreamType(VisionIpcClient::getAvailableStreams(__pyx_v_name, __pyx_v_block)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 168, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "cereal/visionipc/visionipc_pyx.pyx":163 + /* "cereal/visionipc/visionipc_pyx.pyx":166 * return self.client.is_connected() * * @staticmethod # <<<<<<<<<<<<<< @@ -26400,6 +26497,129 @@ static PyObject *__pyx_pf_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_1 __Pyx_RefNannyFinishContext(); return __pyx_r; } + +static PyObject *__pyx_tp_new_6cereal_9visionipc_13visionipc_pyx_CLContext(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + PyObject *o; + #if CYTHON_COMPILING_IN_LIMITED_API + allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); + o = alloc_func(t, 0); + #else + if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + #endif + return o; +} + +static void __pyx_tp_dealloc_6cereal_9visionipc_13visionipc_pyx_CLContext(PyObject *o) { + #if CYTHON_USE_TP_FINALIZE + if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) { + if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_6cereal_9visionipc_13visionipc_pyx_CLContext) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + } + #endif + (*Py_TYPE(o)->tp_free)(o); +} +#if CYTHON_USE_TYPE_SPECS +static PyType_Slot __pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext_slots[] = { + {Py_tp_dealloc, (void *)__pyx_tp_dealloc_6cereal_9visionipc_13visionipc_pyx_CLContext}, + {Py_tp_new, (void *)__pyx_tp_new_6cereal_9visionipc_13visionipc_pyx_CLContext}, + {0, 0}, +}; +static PyType_Spec __pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext_spec = { + "cereal.visionipc.visionipc_pyx.CLContext", + sizeof(struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_CLContext), + 0, + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_FINALIZE, + __pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext_slots, +}; +#else + +static PyTypeObject __pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext = { + PyVarObject_HEAD_INIT(0, 0) + "cereal.visionipc.visionipc_pyx.""CLContext", /*tp_name*/ + sizeof(struct __pyx_obj_6cereal_9visionipc_13visionipc_pyx_CLContext), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_6cereal_9visionipc_13visionipc_pyx_CLContext, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + 0, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + #if !CYTHON_USE_TYPE_SPECS + 0, /*tp_dictoffset*/ + #endif + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_6cereal_9visionipc_13visionipc_pyx_CLContext, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + #if CYTHON_USE_TP_FINALIZE + 0, /*tp_finalize*/ + #else + NULL, /*tp_finalize*/ + #endif + #endif + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) + 0, /*tp_vectorcall*/ + #endif + #if __PYX_NEED_TP_PRINT_SLOT == 1 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030C0000 + 0, /*tp_watched*/ + #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 + 0, /*tp_pypy_flags*/ + #endif +}; +#endif static struct __pyx_vtabstruct_6cereal_9visionipc_13visionipc_pyx_VisionBuf __pyx_vtable_6cereal_9visionipc_13visionipc_pyx_VisionBuf; static PyObject *__pyx_tp_new_6cereal_9visionipc_13visionipc_pyx_VisionBuf(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { @@ -28017,6 +28237,7 @@ static int __Pyx_CreateStringTabAndInitStrings(void) { {&__pyx_kp_s_All_dimensions_preceding_dimensi, __pyx_k_All_dimensions_preceding_dimensi, sizeof(__pyx_k_All_dimensions_preceding_dimensi), 0, 0, 1, 0}, {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1}, {&__pyx_kp_s_Buffer_view_does_not_expose_stri, __pyx_k_Buffer_view_does_not_expose_stri, sizeof(__pyx_k_Buffer_view_does_not_expose_stri), 0, 0, 1, 0}, + {&__pyx_n_s_CLContext, __pyx_k_CLContext, sizeof(__pyx_k_CLContext), 0, 0, 1, 1}, {&__pyx_kp_s_Can_only_create_a_buffer_that_is, __pyx_k_Can_only_create_a_buffer_that_is, sizeof(__pyx_k_Can_only_create_a_buffer_that_is), 0, 0, 1, 0}, {&__pyx_kp_s_Cannot_assign_to_read_only_memor, __pyx_k_Cannot_assign_to_read_only_memor, sizeof(__pyx_k_Cannot_assign_to_read_only_memor), 0, 0, 1, 0}, {&__pyx_kp_s_Cannot_create_writable_memory_vi, __pyx_k_Cannot_create_writable_memory_vi, sizeof(__pyx_k_Cannot_create_writable_memory_vi), 0, 0, 1, 0}, @@ -28117,6 +28338,7 @@ static int __Pyx_CreateStringTabAndInitStrings(void) { {&__pyx_kp_s_collections_abc, __pyx_k_collections_abc, sizeof(__pyx_k_collections_abc), 0, 0, 1, 0}, {&__pyx_n_s_conflate, __pyx_k_conflate, sizeof(__pyx_k_conflate), 0, 0, 1, 1}, {&__pyx_n_s_connect, __pyx_k_connect, sizeof(__pyx_k_connect), 0, 0, 1, 1}, + {&__pyx_n_s_context, __pyx_k_context, sizeof(__pyx_k_context), 0, 0, 1, 1}, {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1}, @@ -28251,7 +28473,7 @@ static int __Pyx_CreateStringTabAndInitStrings(void) { } /* #### Code section: cached_builtins ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_staticmethod = __Pyx_GetBuiltinName(__pyx_n_s_staticmethod); if (!__pyx_builtin_staticmethod) __PYX_ERR(0, 163, __pyx_L1_error) + __pyx_builtin_staticmethod = __Pyx_GetBuiltinName(__pyx_n_s_staticmethod); if (!__pyx_builtin_staticmethod) __PYX_ERR(0, 166, __pyx_L1_error) __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error) __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(0, 79, __pyx_L1_error) __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 33, __pyx_L1_error) @@ -28627,53 +28849,53 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { */ __pyx_codeobj__57 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__57)) __PYX_ERR(1, 3, __pyx_L1_error) - /* "cereal/visionipc/visionipc_pyx.pyx":151 + /* "cereal/visionipc/visionipc_pyx.pyx":154 * return self.extra.valid * * def recv(self, int timeout_ms=100): # <<<<<<<<<<<<<< * buf = self.client.recv(&self.extra, timeout_ms) * if not buf: */ - __pyx_tuple__58 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_timeout_ms, __pyx_n_s_buf); if (unlikely(!__pyx_tuple__58)) __PYX_ERR(0, 151, __pyx_L1_error) + __pyx_tuple__58 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_timeout_ms, __pyx_n_s_buf); if (unlikely(!__pyx_tuple__58)) __PYX_ERR(0, 154, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__58); __Pyx_GIVEREF(__pyx_tuple__58); - __pyx_codeobj__59 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__58, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cereal_visionipc_visionipc_pyx_p, __pyx_n_s_recv, 151, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__59)) __PYX_ERR(0, 151, __pyx_L1_error) - __pyx_tuple__60 = PyTuple_Pack(1, __pyx_int_100); if (unlikely(!__pyx_tuple__60)) __PYX_ERR(0, 151, __pyx_L1_error) + __pyx_codeobj__59 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__58, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cereal_visionipc_visionipc_pyx_p, __pyx_n_s_recv, 154, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__59)) __PYX_ERR(0, 154, __pyx_L1_error) + __pyx_tuple__60 = PyTuple_Pack(1, __pyx_int_100); if (unlikely(!__pyx_tuple__60)) __PYX_ERR(0, 154, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__60); __Pyx_GIVEREF(__pyx_tuple__60); - /* "cereal/visionipc/visionipc_pyx.pyx":157 + /* "cereal/visionipc/visionipc_pyx.pyx":160 * return VisionBuf.create(buf) * * def connect(self, bool blocking): # <<<<<<<<<<<<<< * return self.client.connect(blocking) * */ - __pyx_tuple__61 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_blocking); if (unlikely(!__pyx_tuple__61)) __PYX_ERR(0, 157, __pyx_L1_error) + __pyx_tuple__61 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_blocking); if (unlikely(!__pyx_tuple__61)) __PYX_ERR(0, 160, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__61); __Pyx_GIVEREF(__pyx_tuple__61); - __pyx_codeobj__62 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__61, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cereal_visionipc_visionipc_pyx_p, __pyx_n_s_connect, 157, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__62)) __PYX_ERR(0, 157, __pyx_L1_error) + __pyx_codeobj__62 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__61, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cereal_visionipc_visionipc_pyx_p, __pyx_n_s_connect, 160, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__62)) __PYX_ERR(0, 160, __pyx_L1_error) - /* "cereal/visionipc/visionipc_pyx.pyx":160 + /* "cereal/visionipc/visionipc_pyx.pyx":163 * return self.client.connect(blocking) * * def is_connected(self): # <<<<<<<<<<<<<< * return self.client.is_connected() * */ - __pyx_codeobj__63 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cereal_visionipc_visionipc_pyx_p, __pyx_n_s_is_connected, 160, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__63)) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_codeobj__63 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cereal_visionipc_visionipc_pyx_p, __pyx_n_s_is_connected, 163, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__63)) __PYX_ERR(0, 163, __pyx_L1_error) - /* "cereal/visionipc/visionipc_pyx.pyx":163 + /* "cereal/visionipc/visionipc_pyx.pyx":166 * return self.client.is_connected() * * @staticmethod # <<<<<<<<<<<<<< * def available_streams(string name, bool block): * return cppVisionIpcClient.getAvailableStreams(name, block) */ - __pyx_tuple__64 = PyTuple_Pack(2, __pyx_n_s_name, __pyx_n_s_block); if (unlikely(!__pyx_tuple__64)) __PYX_ERR(0, 163, __pyx_L1_error) + __pyx_tuple__64 = PyTuple_Pack(2, __pyx_n_s_name, __pyx_n_s_block); if (unlikely(!__pyx_tuple__64)) __PYX_ERR(0, 166, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__64); __Pyx_GIVEREF(__pyx_tuple__64); - __pyx_codeobj__65 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__64, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cereal_visionipc_visionipc_pyx_p, __pyx_n_s_available_streams, 163, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__65)) __PYX_ERR(0, 163, __pyx_L1_error) + __pyx_codeobj__65 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__64, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cereal_visionipc_visionipc_pyx_p, __pyx_n_s_available_streams, 166, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__65)) __PYX_ERR(0, 166, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< @@ -28799,6 +29021,26 @@ static int __Pyx_modinit_type_init_code(void) { int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ + #if CYTHON_USE_TYPE_SPECS + __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext_spec, NULL); if (unlikely(!__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext)) __PYX_ERR(3, 7, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext_spec, __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext) < 0) __PYX_ERR(3, 7, __pyx_L1_error) + #else + __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext = &__pyx_type_6cereal_9visionipc_13visionipc_pyx_CLContext; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + #endif + #if !CYTHON_USE_TYPE_SPECS + if (__Pyx_PyType_Ready(__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext) < 0) __PYX_ERR(3, 7, __pyx_L1_error) + #endif + #if PY_MAJOR_VERSION < 3 + __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext->tp_print = 0; + #endif + #if !CYTHON_COMPILING_IN_LIMITED_API + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext->tp_dictoffset && __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext->tp_getattro == PyObject_GenericGetAttr)) { + __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext->tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #endif + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CLContext, (PyObject *) __pyx_ptype_6cereal_9visionipc_13visionipc_pyx_CLContext) < 0) __PYX_ERR(3, 7, __pyx_L1_error) __pyx_vtabptr_6cereal_9visionipc_13visionipc_pyx_VisionBuf = &__pyx_vtable_6cereal_9visionipc_13visionipc_pyx_VisionBuf; __pyx_vtable_6cereal_9visionipc_13visionipc_pyx_VisionBuf.create = (PyObject *(*)(VisionBuf *))__pyx_f_6cereal_9visionipc_13visionipc_pyx_9VisionBuf_create; #if CYTHON_USE_TYPE_SPECS @@ -29059,7 +29301,7 @@ static int __Pyx_modinit_type_import_code(void) { int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_0(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 @@ -29069,7 +29311,7 @@ static int __Pyx_modinit_type_import_code(void) { #else sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_0(PyHeapTypeObject), #endif - __Pyx_ImportType_CheckSize_Warn_3_0_0); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_ImportType_CheckSize_Warn_3_0_0); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(4, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 202, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); @@ -30818,64 +31060,64 @@ if (!__Pyx_RefNanny) { if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_10) < 0) __PYX_ERR(1, 3, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - /* "cereal/visionipc/visionipc_pyx.pyx":151 + /* "cereal/visionipc/visionipc_pyx.pyx":154 * return self.extra.valid * * def recv(self, int timeout_ms=100): # <<<<<<<<<<<<<< * buf = self.client.recv(&self.extra, timeout_ms) * if not buf: */ - __pyx_t_10 = __Pyx_CyFunction_New(&__pyx_mdef_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_5recv, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_VisionIpcClient_recv, NULL, __pyx_kp_s_cereal_visionipc_visionipc_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__59)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 151, __pyx_L1_error) + __pyx_t_10 = __Pyx_CyFunction_New(&__pyx_mdef_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_5recv, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_VisionIpcClient_recv, NULL, __pyx_kp_s_cereal_visionipc_visionipc_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__59)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 154, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_10, __pyx_tuple__60); - if (PyDict_SetItem((PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient->tp_dict, __pyx_n_s_recv, __pyx_t_10) < 0) __PYX_ERR(0, 151, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient->tp_dict, __pyx_n_s_recv, __pyx_t_10) < 0) __PYX_ERR(0, 154, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; PyType_Modified(__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient); - /* "cereal/visionipc/visionipc_pyx.pyx":157 + /* "cereal/visionipc/visionipc_pyx.pyx":160 * return VisionBuf.create(buf) * * def connect(self, bool blocking): # <<<<<<<<<<<<<< * return self.client.connect(blocking) * */ - __pyx_t_10 = __Pyx_CyFunction_New(&__pyx_mdef_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_7connect, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_VisionIpcClient_connect, NULL, __pyx_kp_s_cereal_visionipc_visionipc_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__62)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 157, __pyx_L1_error) + __pyx_t_10 = __Pyx_CyFunction_New(&__pyx_mdef_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_7connect, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_VisionIpcClient_connect, NULL, __pyx_kp_s_cereal_visionipc_visionipc_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__62)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 160, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - if (PyDict_SetItem((PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient->tp_dict, __pyx_n_s_connect, __pyx_t_10) < 0) __PYX_ERR(0, 157, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient->tp_dict, __pyx_n_s_connect, __pyx_t_10) < 0) __PYX_ERR(0, 160, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; PyType_Modified(__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient); - /* "cereal/visionipc/visionipc_pyx.pyx":160 + /* "cereal/visionipc/visionipc_pyx.pyx":163 * return self.client.connect(blocking) * * def is_connected(self): # <<<<<<<<<<<<<< * return self.client.is_connected() * */ - __pyx_t_10 = __Pyx_CyFunction_New(&__pyx_mdef_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_9is_connected, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_VisionIpcClient_is_connected, NULL, __pyx_kp_s_cereal_visionipc_visionipc_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__63)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_t_10 = __Pyx_CyFunction_New(&__pyx_mdef_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_9is_connected, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_VisionIpcClient_is_connected, NULL, __pyx_kp_s_cereal_visionipc_visionipc_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__63)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 163, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - if (PyDict_SetItem((PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient->tp_dict, __pyx_n_s_is_connected, __pyx_t_10) < 0) __PYX_ERR(0, 160, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient->tp_dict, __pyx_n_s_is_connected, __pyx_t_10) < 0) __PYX_ERR(0, 163, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; PyType_Modified(__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient); - /* "cereal/visionipc/visionipc_pyx.pyx":163 + /* "cereal/visionipc/visionipc_pyx.pyx":166 * return self.client.is_connected() * * @staticmethod # <<<<<<<<<<<<<< * def available_streams(string name, bool block): * return cppVisionIpcClient.getAvailableStreams(name, block) */ - __pyx_t_10 = __Pyx_CyFunction_New(&__pyx_mdef_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_11available_streams, __Pyx_CYFUNCTION_STATICMETHOD | __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_VisionIpcClient_available_stream, NULL, __pyx_kp_s_cereal_visionipc_visionipc_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__65)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 163, __pyx_L1_error) + __pyx_t_10 = __Pyx_CyFunction_New(&__pyx_mdef_6cereal_9visionipc_13visionipc_pyx_15VisionIpcClient_11available_streams, __Pyx_CYFUNCTION_STATICMETHOD | __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_VisionIpcClient_available_stream, NULL, __pyx_kp_s_cereal_visionipc_visionipc_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__65)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 166, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - if (PyDict_SetItem((PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient->tp_dict, __pyx_n_s_available_streams, __pyx_t_10) < 0) __PYX_ERR(0, 163, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient->tp_dict, __pyx_n_s_available_streams, __pyx_t_10) < 0) __PYX_ERR(0, 166, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; PyType_Modified(__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient); - __Pyx_GetNameInClass(__pyx_t_10, (PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient, __pyx_n_s_available_streams); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 163, __pyx_L1_error) + __Pyx_GetNameInClass(__pyx_t_10, (PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient, __pyx_n_s_available_streams); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 166, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_staticmethod, __pyx_t_10); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 163, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_staticmethod, __pyx_t_10); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 166, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - if (PyDict_SetItem((PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient->tp_dict, __pyx_n_s_available_streams, __pyx_t_3) < 0) __PYX_ERR(0, 163, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient->tp_dict, __pyx_n_s_available_streams, __pyx_t_3) < 0) __PYX_ERR(0, 166, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; PyType_Modified(__pyx_ptype_6cereal_9visionipc_13visionipc_pyx_VisionIpcClient); diff --git a/cereal/visionipc/visionipc_pyx.pxd b/cereal/visionipc/visionipc_pyx.pxd index 6e2d5ed05..ec431ceec 100644 --- a/cereal/visionipc/visionipc_pyx.pxd +++ b/cereal/visionipc/visionipc_pyx.pxd @@ -2,6 +2,11 @@ #cython: language_level=3 from .visionipc cimport VisionBuf as cppVisionBuf +from .visionipc cimport cl_device_id, cl_context + +cdef class CLContext: + cdef cl_device_id device_id + cdef cl_context context cdef class VisionBuf: cdef cppVisionBuf * buf diff --git a/cereal/visionipc/visionipc_pyx.pyx b/cereal/visionipc/visionipc_pyx.pyx index bcce534f8..0ff270efd 100644 --- a/cereal/visionipc/visionipc_pyx.pyx +++ b/cereal/visionipc/visionipc_pyx.pyx @@ -98,8 +98,11 @@ cdef class VisionIpcClient: cdef cppVisionIpcClient * client cdef VisionIpcBufExtra extra - def __cinit__(self, string name, VisionStreamType stream, bool conflate): - self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) + def __cinit__(self, string name, VisionStreamType stream, bool conflate, CLContext context = None): + if context: + self.client = new cppVisionIpcClient(name, stream, conflate, context.device_id, context.context) + else: + self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL) def __dealloc__(self): del self.client diff --git a/cereal/visionipc/visionipc_pyx.so b/cereal/visionipc/visionipc_pyx.so index 1d820a415..50776ccaf 100755 Binary files a/cereal/visionipc/visionipc_pyx.so and b/cereal/visionipc/visionipc_pyx.so differ diff --git a/cereal/visionipc/visionipc_server.h b/cereal/visionipc/visionipc_server.h index 4c23ff6f0..6ad86f146 100644 --- a/cereal/visionipc/visionipc_server.h +++ b/cereal/visionipc/visionipc_server.h @@ -23,7 +23,6 @@ class VisionIpcServer { std::map > cur_idx; std::map > buffers; - std::map > idxs; Context * msg_ctx; std::map sockets; diff --git a/common/gpio.py b/common/gpio.py index e31c8c52e..5ec23bf7b 100644 --- a/common/gpio.py +++ b/common/gpio.py @@ -25,6 +25,13 @@ def gpio_read(pin: int) -> Optional[bool]: return val +def gpio_export(pin: int) -> None: + try: + with open("/sys/class/gpio/export", 'w') as f: + f.write(str(pin)) + except Exception: + print(f"Failed to export gpio {pin}") + @lru_cache(maxsize=None) def get_irq_action(irq: int) -> List[str]: try: diff --git a/common/i18n.py b/common/i18n.py index a79a3fc35..2e4e03253 100644 --- a/common/i18n.py +++ b/common/i18n.py @@ -12,13 +12,14 @@ supported_languages = { } def events(): - locale = Params().get("LanguageSetting", encoding='utf8') + import sys try: - if locale is not None: - locale = supported_languages[locale.strip()] + if sys.argv[0] == "./manager.py": + lang = Params().get("LanguageSetting", encoding='utf8') else: - locale = "en-US" - except KeyError: + lang = "main_en" + locale = supported_languages[lang.strip()] + except: locale = "en-US" i18n = gettext.translation("events", localedir=locale_dir, fallback=True, languages=[locale]) i18n.install() diff --git a/common/params_pyx.so b/common/params_pyx.so index d88c329cb..5337950ab 100755 Binary files a/common/params_pyx.so and b/common/params_pyx.so differ diff --git a/common/swaglog.h b/common/swaglog.h index 25368501a..5a3434d62 100644 --- a/common/swaglog.h +++ b/common/swaglog.h @@ -9,14 +9,20 @@ #define CLOUDLOG_CRITICAL 50 +#ifdef __GNUC__ +#define SWAG_LOG_CHECK_FMT(a, b) __attribute__ ((format (printf, a, b))) +#else +#define SWAG_LOG_CHECK_FMT(a, b) +#endif + void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func, - const char* fmt, ...) /*__attribute__ ((format (printf, 6, 7)))*/; + const char* fmt, ...) SWAG_LOG_CHECK_FMT(5, 6); void cloudlog_te(int levelnum, const char* filename, int lineno, const char* func, - const char* fmt, ...) /*__attribute__ ((format (printf, 6, 7)))*/; + const char* fmt, ...) SWAG_LOG_CHECK_FMT(5, 6); void cloudlog_te(int levelnum, const char* filename, int lineno, const char* func, - uint32_t frame_id, const char* fmt, ...) /*__attribute__ ((format (printf, 6, 7)))*/; + uint32_t frame_id, const char* fmt, ...) SWAG_LOG_CHECK_FMT(6, 7); #define cloudlog(lvl, fmt, ...) cloudlog_e(lvl, __FILE__, __LINE__, \ diff --git a/common/version.h b/common/version.h index 745f52677..3114e1b5e 100644 --- a/common/version.h +++ b/common/version.h @@ -1 +1 @@ -#define COMMA_VERSION "2023.07.27" +#define COMMA_VERSION "2023.08.07" diff --git a/docs/CARS.md b/docs/CARS.md index 96eecd486..df938e8de 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -8,261 +8,261 @@ A supported vehicle is one that just works when you install a comma three. All s |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| -|Acura|ILX 2016-19|AcuraWatch Plus|openpilot|25 mph|25 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Acura|RDX 2016-18|AcuraWatch Plus|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 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)](##)|
View- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Audi|Q3 2019-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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Audi|RS3 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Audi|S3 2015-17|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Buick|LaCrosse 2017-19[4](#footnotes)|Driver Confidence Package 2|openpilot|18 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 OBD-II connector
- 1 comma three
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Cadillac|Escalade 2017[4](#footnotes)|Driver Assist Package|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 OBD-II connector
- 1 comma three
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Cadillac|Escalade ESV 2016[4](#footnotes)|Adaptive Cruise Control (ACC) & LKAS|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 OBD-II connector
- 1 comma three
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chevrolet|Bolt EUV 2022-23|Premier or Premier Redline Trim without Super Cruise Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 GM connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chevrolet|Bolt EV 2022-23|2LT Trim with Adaptive Cruise Control Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 GM connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chevrolet|Silverado 1500 2020-21|Safety Package II|openpilot available[1](#footnotes)|0 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 GM connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chevrolet|Trailblazer 2021-22|Adaptive Cruise Control (ACC)|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 GM connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chevrolet|Volt 2017-18[4](#footnotes)|Adaptive Cruise Control (ACC)|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 OBD-II connector
- 1 comma three
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chrysler|Pacifica 2017-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chrysler|Pacifica 2019-20|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chrysler|Pacifica 2021|All|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chrysler|Pacifica Hybrid 2017-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Chrysler|Pacifica Hybrid 2019-23|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Acura|ILX 2016-19|AcuraWatch Plus|openpilot|25 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Acura|RDX 2016-18|AcuraWatch Plus|openpilot|25 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 power v2
- 1 comma three
- 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 power v2
- 1 comma three
- 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|Q3 2019-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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|RS3 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|S3 2015-17|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Buick|LaCrosse 2017-19[4](#footnotes)|Driver Confidence Package 2|openpilot|18 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma three
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Cadillac|Escalade 2017[4](#footnotes)|Driver Assist Package|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma three
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Cadillac|Escalade ESV 2016[4](#footnotes)|Adaptive Cruise Control (ACC) & LKAS|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma three
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Chevrolet|Bolt EUV 2022-23|Premier or Premier Redline Trim without Super Cruise Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Chevrolet|Bolt EV 2022-23|2LT Trim with Adaptive Cruise Control Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Chevrolet|Silverado 1500 2020-21|Safety Package II|openpilot available[1](#footnotes)|0 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Chevrolet|Trailblazer 2021-22|Adaptive Cruise Control (ACC)|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Chevrolet|Volt 2017-18[4](#footnotes)|Adaptive Cruise Control (ACC)|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma three
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Chrysler|Pacifica 2017-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Chrysler|Pacifica 2019-20|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Chrysler|Pacifica 2021|All|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Chrysler|Pacifica Hybrid 2017-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Chrysler|Pacifica Hybrid 2019-23|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |comma|body|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|None|| -|Ford|Bronco Sport 2021-22|Co-Pilot360 Assist+|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Ford|Escape 2020-22|Co-Pilot360 Assist+|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Ford|Explorer 2020-22|Co-Pilot360 Assist+|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Ford|Focus 2018[3](#footnotes)|Adaptive Cruise Control with Lane Centering|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Ford|Kuga 2020-22|Adaptive Cruise Control with Lane Centering|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Ford|Maverick 2022-23|Co-Pilot360 Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|G70 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|G70 2020|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|G80 2017|All|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|G80 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|G90 2017-18|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|GV60 (Advanced Trim) 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|GV60 (Performance Trim) 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|GV70 (2.5T Trim) 2022-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|GV70 (3.5T Trim) 2022-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai M connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Genesis|GV80 2023[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai M connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|GMC|Acadia 2018[4](#footnotes)|Adaptive Cruise Control (ACC)|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 OBD-II connector
- 1 comma three
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|GMC|Sierra 1500 2020-21|Driver Alert Package II|openpilot available[1](#footnotes)|0 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 GM connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Accord 2018-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Accord Hybrid 2018-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Civic 2016-18|Honda Sensing|openpilot|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Civic 2019-21|All|openpilot available[1](#footnotes)|0 mph|2 mph[5](#footnotes)|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Civic 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Civic Hatchback 2017-21|Honda Sensing|openpilot available[1](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Civic Hatchback 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|CR-V 2015-16|Touring Trim|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|CR-V 2017-22|Honda Sensing|openpilot available[1](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|CR-V Hybrid 2017-19|Honda Sensing|openpilot available[1](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|e 2020|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Fit 2018-20|Honda Sensing|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Freed 2020|Honda Sensing|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|HR-V 2019-22|Honda Sensing|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|HR-V 2023|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Insight 2019-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Inspire 2018|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Odyssey 2018-20|Honda Sensing|openpilot|25 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Passport 2019-23|All|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Pilot 2016-22|Honda Sensing|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Honda|Ridgeline 2017-23|Honda Sensing|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Elantra 2017-19|Smart Cruise Control (SCC)|Stock|19 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Elantra 2021-23|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Elantra GT 2017-19|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Elantra Hybrid 2021-23|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Genesis 2015-16|Smart Cruise Control (SCC)|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|i30 2017-19|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq 5 (Southeast Asia only) 2022-23[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai Q connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq 5 (with HDA II) 2022-23[6](#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)](##)|
View- 1 Hyundai Q connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq 5 (without HDA II) 2022-23[6](#footnotes)|Highway Driving Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq Electric 2019|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq Electric 2020|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq Hybrid 2017-19|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq Hybrid 2020-22|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq Plug-in Hybrid 2019|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Ioniq Plug-in Hybrid 2020-22|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Kona 2020|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Kona Electric 2018-21|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai G connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Kona Electric 2022|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai O connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Kona Hybrid 2020|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai I connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Palisade 2020-22|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Santa Cruz 2022-23[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Santa Fe 2019-20|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Santa Fe 2021-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Santa Fe Hybrid 2022-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Santa Fe Plug-in Hybrid 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Sonata 2018-19|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Sonata 2020-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Sonata Hybrid 2020-23|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Tucson 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Tucson 2022[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Tucson 2023[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Tucson Diesel 2019|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Tucson Hybrid 2022-23[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Hyundai|Veloster 2019-20|Smart Cruise Control (SCC)|Stock|5 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Jeep|Grand Cherokee 2016-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|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)](##)|
View- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Carnival 2023[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Carnival (China only) 2023[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 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)](##)|
View- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|EV6 (Southeast Asia only) 2022-23[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai P connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|EV6 (with HDA II) 2022-23[6](#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)](##)|
View- 1 Hyundai P connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|EV6 (without HDA II) 2022-23[6](#footnotes)|Highway Driving Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Forte 2019-21|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai G connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Forte 2023|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|K5 2021-22|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|K5 Hybrid 2020|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro EV 2019|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro EV 2020|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro EV 2021|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro EV 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro EV 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro Hybrid 2021-22|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro Hybrid 2023[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro Plug-in Hybrid 2018-19|All|openpilot available[1](#footnotes)|10 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro Plug-in Hybrid 2020|All|openpilot available[1](#footnotes)|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Optima 2017|Advanced Smart Cruise Control|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Optima 2019-20|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai G connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Seltos 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sorento 2018|Advanced Smart Cruise Control|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sorento 2019|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai E connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sorento 2021-23[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sorento Plug-in Hybrid 2022-23[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sportage 2023[6](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Sportage Hybrid 2023[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Stinger 2018-20|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Stinger 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai K connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Telluride 2020-22|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|CT Hybrid 2017-18|Lexus Safety System+|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|ES 2017-18|All|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|ES 2019-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|ES Hybrid 2017-18|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|ES Hybrid 2019-23|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|IS 2017-19|All|Stock|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|NX 2018-19|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|NX 2020-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|NX Hybrid 2018-19|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|NX Hybrid 2020-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|RC 2018-20|All|Stock|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|RX 2016|Lexus Safety System+|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|RX 2017-19|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|RX 2020-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|RX Hybrid 2016|Lexus Safety System+|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|RX Hybrid 2017-19|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|RX Hybrid 2020-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lexus|UX Hybrid 2019-23|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Lincoln|Aviator 2020-21|Co-Pilot360 Plus|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|MAN|eTGE 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|MAN|TGE 2017-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Mazda|CX-5 2022-23|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Mazda connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Mazda|CX-9 2021-23|All|Stock|0 mph|28 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 Mazda connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Nissan|Altima 2019-20|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Nissan B connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Nissan|Leaf 2018-23|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Nissan A connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Nissan|Rogue 2018-20|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Nissan A connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Nissan|X-Trail 2017|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 Nissan A connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Ram|1500 2019-23|Adaptive Cruise Control (ACC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Ram connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|SEAT|Ateca 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|SEAT|Leon 2014-20|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|Ascent 2019-21|All[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|Crosstrek 2018-19|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|Crosstrek 2020-23|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|Forester 2019-21|All[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|Impreza 2017-19|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|Impreza 2020-22|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|Legacy 2020-22|All[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Subaru B connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|Outback 2020-22|All[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Subaru B connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|XV 2018-19|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Subaru|XV 2020-21|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Škoda|Fabia 2022-23[11](#footnotes)|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| -|Škoda|Kamiq 2021[9,11](#footnotes)|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| -|Škoda|Karoq 2019-21[11](#footnotes)|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Škoda|Kodiaq 2017-23[11](#footnotes)|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Škoda|Octavia 2015, 2018-19[11](#footnotes)|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Škoda|Octavia RS 2016[11](#footnotes)|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Škoda|Scala 2020-23[11](#footnotes)|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| -|Škoda|Superb 2015-22[11](#footnotes)|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Alphard 2019-20|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Alphard Hybrid 2021|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Avalon 2016|Toyota Safety Sense P|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Avalon 2017-18|All|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Avalon 2019-21|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Avalon 2022|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Avalon Hybrid 2019-21|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Avalon Hybrid 2022|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|C-HR 2017-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|C-HR 2021|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|C-HR Hybrid 2017-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|C-HR Hybrid 2021-22|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Camry 2018-20|All|Stock|0 mph[8](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Camry 2021-23|All|openpilot|0 mph[8](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Camry Hybrid 2018-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Camry Hybrid 2021-23|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Corolla 2017-19|All|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Corolla 2020-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Corolla Cross (Non-US only) 2020-23|All|openpilot|17 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Corolla Cross Hybrid (Non-US only) 2020-22|All|openpilot|17 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Corolla Hatchback 2019-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Corolla Hybrid 2020-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Corolla Hybrid (Non-US only) 2020-23|All|openpilot|17 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Highlander 2017-19|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Highlander 2020-23|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Highlander Hybrid 2017-19|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Highlander Hybrid 2020-23|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Mirai 2021|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Prius 2016|Toyota Safety Sense P|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Prius 2017-20|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Prius 2021-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Prius Prime 2017-20|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Prius Prime 2021-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|Prius v 2017|Toyota Safety Sense P|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 2016|Toyota Safety Sense P|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 2017-18|All|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 2022|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 Hybrid 2016|Toyota Safety Sense P|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 Hybrid 2017-18|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 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)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 Hybrid 2022|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 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-full.svg)](##)|
View- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Arteon R 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Atlas 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Atlas Cross Sport 2021-22|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|California 2021|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Caravelle 2020|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|CC 2018-22|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Crafter 2017-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|e-Crafter 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|e-Golf 2014-20|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf 2015-20|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-empty.svg)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf Alltrack 2015-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-empty.svg)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf GTD 2015-20|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf GTE 2015-20|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf GTI 2015-21|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-empty.svg)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf R 2015-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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Golf SportsVan 2015-20|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Grand California 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Jetta 2018-22|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Jetta GLI 2021-22|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Passat 2015-22[10](#footnotes)|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Passat Alltrack 2015-22|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Passat GTE 2015-22|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Polo 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| -|Volkswagen|Polo GTI 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| -|Volkswagen|T-Cross 2021|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| -|Volkswagen|T-Roc 2021|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| -|Volkswagen|Taos 2022-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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Teramont 2018-22|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Teramont Cross Sport 2021-22|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Teramont X 2021-22|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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Tiguan 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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Tiguan eHybrid 2021-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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Volkswagen|Touran 2016-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)](##)|
View- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Bronco Sport 2021-22|Co-Pilot360 Assist+|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Escape 2020-22|Co-Pilot360 Assist+|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Explorer 2020-22|Co-Pilot360 Assist+|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Focus 2018[3](#footnotes)|Adaptive Cruise Control with Lane Centering|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Kuga 2020-22|Adaptive Cruise Control with Lane Centering|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Maverick 2022-23|Co-Pilot360 Assist|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 angled mount (8 degrees)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G70 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G70 2020|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G80 2017|All|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G80 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|G90 2017-18|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|GV60 (Advanced Trim) 2023[6](#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 A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|GV60 (Performance Trim) 2023[6](#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 K connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|GV70 (2.5T Trim) 2022-23[6](#footnotes)|All|Stock|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|GV70 (3.5T Trim) 2022-23[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai M connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Genesis|GV80 2023[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai M connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|GMC|Acadia 2018[4](#footnotes)|Adaptive Cruise Control (ACC)|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma three
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|GMC|Sierra 1500 2020-21|Driver Alert Package II|openpilot available[1](#footnotes)|0 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Accord 2018-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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Accord Hybrid 2018-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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Civic 2016-18|Honda Sensing|openpilot|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Nidec connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Civic 2019-21|All|openpilot available[1](#footnotes)|0 mph|2 mph[5](#footnotes)|[![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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Civic 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Civic Hatchback 2017-21|Honda Sensing|openpilot available[1](#footnotes)|0 mph|12 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Civic Hatchback 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|CR-V 2015-16|Touring Trim|openpilot|25 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|CR-V 2017-22|Honda Sensing|openpilot available[1](#footnotes)|0 mph|12 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|CR-V Hybrid 2017-19|Honda Sensing|openpilot available[1](#footnotes)|0 mph|12 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|e 2020|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Fit 2018-20|Honda Sensing|openpilot|25 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Freed 2020|Honda Sensing|openpilot|25 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|HR-V 2019-22|Honda Sensing|openpilot|25 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|HR-V 2023|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Insight 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Inspire 2018|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Odyssey 2018-20|Honda Sensing|openpilot|25 mph|0 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Passport 2019-23|All|openpilot|25 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Pilot 2016-22|Honda Sensing|openpilot|25 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Honda|Ridgeline 2017-23|Honda Sensing|openpilot|25 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Elantra 2017-19|Smart Cruise Control (SCC)|Stock|19 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Elantra 2021-23|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Elantra GT 2017-19|Smart Cruise Control (SCC)|Stock|0 mph|32 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Elantra Hybrid 2021-23|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Genesis 2015-16|Smart Cruise Control (SCC)|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai J connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|i30 2017-19|Smart Cruise Control (SCC)|Stock|0 mph|32 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq 5 (Southeast Asia only) 2022-23[6](#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 Q connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq 5 (with HDA II) 2022-23[6](#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 Q connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq 5 (without HDA II) 2022-23[6](#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 K connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq Electric 2019|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq Electric 2020|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq Hybrid 2017-19|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq Hybrid 2020-22|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq Plug-in Hybrid 2019|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Ioniq Plug-in Hybrid 2020-22|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Kona 2020|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Kona Electric 2018-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 G connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Kona Electric 2022|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai O connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Kona Hybrid 2020|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai I connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Palisade 2020-22|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Santa Cruz 2022-23[6](#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 N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Santa Fe 2019-20|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Santa Fe 2021-23|All|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Santa Fe Hybrid 2022-23|All|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Santa Fe Plug-in 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 Hyundai L connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Sonata 2018-19|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Sonata 2020-23|All|openpilot available[1](#footnotes)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Sonata Hybrid 2020-23|All|openpilot available[1](#footnotes)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Tucson 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|19 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Tucson 2022[6](#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 N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Tucson 2023[6](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Tucson Diesel 2019|Smart Cruise Control (SCC)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Tucson Hybrid 2022-23[6](#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 N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Hyundai|Veloster 2019-20|Smart Cruise Control (SCC)|Stock|5 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Jeep|Grand Cherokee 2016-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 FCA connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Carnival 2023[6](#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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Carnival (China only) 2023[6](#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 power v2
- 1 comma three
- 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|EV6 (Southeast Asia only) 2022-23[6](#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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|EV6 (with HDA II) 2022-23[6](#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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|EV6 (without HDA II) 2022-23[6](#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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Forte 2019-21|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai G connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Forte 2023|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|K5 2021-22|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|K5 Hybrid 2020|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro EV 2019|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro EV 2020|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro EV 2021|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro EV 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro EV 2023[6](#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 A connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro Hybrid 2021-22|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro Hybrid 2023[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro Plug-in Hybrid 2018-19|All|openpilot available[1](#footnotes)|10 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro Plug-in Hybrid 2020|All|openpilot available[1](#footnotes)|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Optima 2017|Advanced Smart Cruise Control|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai B connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Optima 2019-20|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai G connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Seltos 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sorento 2018|Advanced Smart Cruise Control|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sorento 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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sorento 2021-23[6](#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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sorento Plug-in Hybrid 2022-23[6](#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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sportage 2023[6](#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 N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Sportage Hybrid 2023[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai N connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Stinger 2018-20|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Stinger 2022|All|openpilot available[1](#footnotes)|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 power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Telluride 2020-22|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|CT Hybrid 2017-18|Lexus Safety System+|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|ES 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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|ES 2019-22|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|ES Hybrid 2017-18|All|openpilot available[2](#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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|ES Hybrid 2019-23|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|IS 2017-19|All|Stock|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|NX 2018-19|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|NX 2020-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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|NX Hybrid 2018-19|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|NX Hybrid 2020-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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|RC 2018-20|All|Stock|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|RX 2016|Lexus Safety System+|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|RX 2017-19|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|RX 2020-22|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|RX Hybrid 2016|Lexus Safety System+|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|RX Hybrid 2017-19|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|RX Hybrid 2020-22|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lexus|UX Hybrid 2019-23|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Lincoln|Aviator 2020-21|Co-Pilot360 Plus|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Ford Q3 connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|MAN|eTGE 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|MAN|TGE 2017-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Mazda|CX-5 2022-23|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Mazda connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Mazda|CX-9 2021-23|All|Stock|0 mph|28 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Mazda connector
- 1 RJ45 cable (7 ft)
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Nissan|Altima 2019-20|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Nissan B connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Nissan|Leaf 2018-23|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Nissan A connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Nissan|Rogue 2018-20|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Nissan A connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Nissan|X-Trail 2017|ProPILOT Assist|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 Nissan A connector
- 1 RJ45 cable (7 ft)
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ram|1500 2019-23|Adaptive Cruise Control (ACC)|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Ram connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|SEAT|Ateca 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|SEAT|Leon 2014-20|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Subaru|Ascent 2019-21|All[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Crosstrek 2018-19|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Crosstrek 2020-23|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Forester 2019-21|All[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Impreza 2017-19|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Impreza 2020-22|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Legacy 2020-22|All[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru B connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|Outback 2020-22|All[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru B connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|XV 2018-19|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Subaru|XV 2020-21|EyeSight Driver Assistance[7](#footnotes)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Subaru A connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
Tools- 1 Pry Tool
- 1 Socket Wrench 8mm or 5/16" (deep)
|| +|Škoda|Fabia 2022-23[11](#footnotes)|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Škoda|Kamiq 2021[9,11](#footnotes)|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Škoda|Karoq 2019-21[11](#footnotes)|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Škoda|Kodiaq 2017-23[11](#footnotes)|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Škoda|Octavia 2015, 2018-19[11](#footnotes)|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Škoda|Octavia RS 2016[11](#footnotes)|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Škoda|Scala 2020-23[11](#footnotes)|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Škoda|Superb 2015-22[11](#footnotes)|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Alphard 2019-20|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Alphard Hybrid 2021|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Avalon 2016|Toyota Safety Sense P|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Avalon 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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Avalon 2019-21|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Avalon 2022|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Avalon Hybrid 2019-21|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Avalon Hybrid 2022|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|C-HR 2017-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|C-HR 2021|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|C-HR Hybrid 2017-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|C-HR Hybrid 2021-22|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Camry 2018-20|All|Stock|0 mph[8](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Camry 2021-23|All|openpilot|0 mph[8](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Camry Hybrid 2018-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Camry Hybrid 2021-23|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Corolla 2017-19|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Corolla 2020-22|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Corolla Cross (Non-US only) 2020-23|All|openpilot|17 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Corolla Cross Hybrid (Non-US only) 2020-22|All|openpilot|17 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Corolla Hatchback 2019-22|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Corolla Hybrid 2020-22|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Corolla Hybrid (Non-US only) 2020-23|All|openpilot|17 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Highlander 2017-19|All|openpilot available[2](#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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Highlander 2020-23|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Highlander Hybrid 2017-19|All|openpilot available[2](#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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Highlander Hybrid 2020-23|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Mirai 2021|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Prius 2016|Toyota Safety Sense P|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Prius 2017-20|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Prius 2021-22|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Prius Prime 2017-20|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Prius Prime 2021-22|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|Prius v 2017|Toyota Safety Sense P|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 2016|Toyota Safety Sense P|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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 2022|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 Hybrid 2016|Toyota Safety Sense P|openpilot available[2](#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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 Hybrid 2017-18|All|openpilot available[2](#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 connector
- 1 comma power v2
- 1 comma three
- 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 connector
- 1 comma power v2
- 1 comma three
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 Hybrid 2022|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 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-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota connector
- 1 comma power v2
- 1 comma three
- 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Arteon R 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Atlas 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Atlas Cross Sport 2021-22|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|California 2021|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Caravelle 2020|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|CC 2018-22|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Crafter 2017-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|e-Crafter 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|e-Golf 2014-20|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf 2015-20|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-empty.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf Alltrack 2015-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-empty.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf GTD 2015-20|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf GTE 2015-20|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf GTI 2015-21|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-empty.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf R 2015-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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Golf SportsVan 2015-20|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Grand California 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 angled mount (8 degrees)
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Jetta 2018-22|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Jetta GLI 2021-22|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Passat 2015-22[10](#footnotes)|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Passat Alltrack 2015-22|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Passat GTE 2015-22|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Polo 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Volkswagen|Polo GTI 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Volkswagen|T-Cross 2021|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Volkswagen|T-Roc 2021|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
[13](#footnotes)|| +|Volkswagen|Taos 2022-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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Teramont 2018-22|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Teramont Cross Sport 2021-22|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Teramont X 2021-22|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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Tiguan 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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Tiguan eHybrid 2021-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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Volkswagen|Touran 2016-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 J533 connector
- 1 USB-C coupler
- 1 comma three
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| ### Footnotes 1Experimental openpilot longitudinal control is available behind a toggle; the toggle is only available in non-release branches such as `devel` or `master-ci`.
@@ -270,7 +270,7 @@ A supported vehicle is one that just works when you install a comma three. All s 3Refers only to the Focus Mk4 (C519) available in Europe/China/Taiwan/Australasia, not the Focus Mk3 (C346) in North and South America/Southeast Asia.
4Requires a community built ASCM harness. NOTE: disconnecting the ASCM disables Automatic Emergency Braking (AEB).
52019 Honda Civic 1.6L Diesel Sedan does not have ALC below 12mph.
-6Requires a red panda for this CAN FD car. All the hardware needed is sold in the CAN FD kit.
+6Requires a comma 3X or CAN FD panda kit for this CAN FD car.
7In the non-US market, openpilot requires the car to come equipped with EyeSight with Lane Keep Assistance.
8openpilot operates above 28mph for Camry 4CYL L, 4CYL LE and 4CYL SE which don't have Full-Speed Range Dynamic Radar Cruise Control.
9Not including the China market Kamiq, which is based on the (currently) unsupported PQ34 platform.
@@ -311,7 +311,7 @@ All the cars that openpilot supports use a [CAN bus](https://en.wikipedia.org/wi ### Toyota Security openpilot does not yet support these Toyota models due to a new message authentication method. -[Vote](https://comma.ai/shop/products/vote) if you'd like to see openpilot support on these models. +[Vote](https://comma.ai/shop#toyota-security) if you'd like to see openpilot support on these models. * Toyota RAV4 Prime 2021+ * Toyota Sienna 2021+ diff --git a/opendbc/can/libdbc.so b/opendbc/can/libdbc.so index 3300e1ab5..c3ffc26f2 100755 Binary files a/opendbc/can/libdbc.so and b/opendbc/can/libdbc.so differ diff --git a/opendbc/can/packer_pyx.cpp b/opendbc/can/packer_pyx.cpp index 88dcb7c52..be4b130ce 100644 --- a/opendbc/can/packer_pyx.cpp +++ b/opendbc/can/packer_pyx.cpp @@ -2968,7 +2968,7 @@ static std::vector __pyx_f_7opendbc_3can_10packer_pyx_9CANPacker_pack( * * cpdef make_can_msg(self, name_or_addr, bus, values): # <<<<<<<<<<<<<< * cdef int addr - * if type(name_or_addr) == int: + * if isinstance(name_or_addr, int): */ static PyObject *__pyx_pw_7opendbc_3can_10packer_pyx_9CANPacker_3make_can_msg(PyObject *__pyx_v_self, @@ -3055,18 +3055,16 @@ static PyObject *__pyx_f_7opendbc_3can_10packer_pyx_9CANPacker_make_can_msg(stru /* "opendbc/can/packer_pyx.pyx":43 * cpdef make_can_msg(self, name_or_addr, bus, values): * cdef int addr - * if type(name_or_addr) == int: # <<<<<<<<<<<<<< + * if isinstance(name_or_addr, int): # <<<<<<<<<<<<<< * addr = name_or_addr * else: */ - __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_name_or_addr)), ((PyObject *)(&PyInt_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 43, __pyx_L1_error) - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 43, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_6 = PyInt_Check(__pyx_v_name_or_addr); if (__pyx_t_6) { /* "opendbc/can/packer_pyx.pyx":44 * cdef int addr - * if type(name_or_addr) == int: + * if isinstance(name_or_addr, int): * addr = name_or_addr # <<<<<<<<<<<<<< * else: * addr = self.name_to_address[name_or_addr.encode("utf8")] @@ -3077,7 +3075,7 @@ static PyObject *__pyx_f_7opendbc_3can_10packer_pyx_9CANPacker_make_can_msg(stru /* "opendbc/can/packer_pyx.pyx":43 * cpdef make_can_msg(self, name_or_addr, bus, values): * cdef int addr - * if type(name_or_addr) == int: # <<<<<<<<<<<<<< + * if isinstance(name_or_addr, int): # <<<<<<<<<<<<<< * addr = name_or_addr * else: */ @@ -3165,7 +3163,7 @@ static PyObject *__pyx_f_7opendbc_3can_10packer_pyx_9CANPacker_make_can_msg(stru * * cpdef make_can_msg(self, name_or_addr, bus, values): # <<<<<<<<<<<<<< * cdef int addr - * if type(name_or_addr) == int: + * if isinstance(name_or_addr, int): */ /* function exit code */ @@ -3702,7 +3700,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * * cpdef make_can_msg(self, name_or_addr, bus, values): # <<<<<<<<<<<<<< * cdef int addr - * if type(name_or_addr) == int: + * if isinstance(name_or_addr, int): */ __pyx_tuple_ = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_name_or_addr, __pyx_n_s_bus, __pyx_n_s_values); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 41, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); @@ -4136,7 +4134,7 @@ if (!__Pyx_RefNanny) { * * cpdef make_can_msg(self, name_or_addr, bus, values): # <<<<<<<<<<<<<< * cdef int addr - * if type(name_or_addr) == int: + * if isinstance(name_or_addr, int): */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7opendbc_3can_10packer_pyx_9CANPacker_3make_can_msg, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CANPacker_make_can_msg, NULL, __pyx_n_s_opendbc_can_packer_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__2)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 41, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); diff --git a/opendbc/can/packer_pyx.so b/opendbc/can/packer_pyx.so index f34df6697..f94bcbd86 100755 Binary files a/opendbc/can/packer_pyx.so and b/opendbc/can/packer_pyx.so differ diff --git a/opendbc/can/parser_pyx.cpp b/opendbc/can/parser_pyx.cpp index 242ad015b..e24fe9838 100644 --- a/opendbc/can/parser_pyx.cpp +++ b/opendbc/can/parser_pyx.cpp @@ -6773,7 +6773,7 @@ static int __pyx_pw_7opendbc_3can_10parser_pyx_9CANDefine_1__init__(PyObject *__ static int __pyx_pf_7opendbc_3can_10parser_pyx_9CANDefine___init__(struct __pyx_obj_7opendbc_3can_10parser_pyx_CANDefine *__pyx_v_self, PyObject *__pyx_v_dbc_name) { PyObject *__pyx_v_address_to_msg_name = NULL; - std::vector ::size_type __pyx_v_i; + std::vector ::size_type __pyx_v_i; struct Msg __pyx_v_msg; PyObject *__pyx_v_name = NULL; uint32_t __pyx_v_address; @@ -6795,7 +6795,7 @@ static int __pyx_pf_7opendbc_3can_10parser_pyx_9CANDefine___init__(struct __pyx_ PyObject *__pyx_t_6 = NULL; std::vector ::size_type __pyx_t_7; std::vector ::size_type __pyx_t_8; - std::vector ::size_type __pyx_t_9; + std::vector ::size_type __pyx_t_9; uint32_t __pyx_t_10; PyObject *__pyx_t_11 = NULL; int __pyx_t_12; @@ -6989,10 +6989,10 @@ static int __pyx_pf_7opendbc_3can_10parser_pyx_9CANDefine___init__(struct __pyx_ * val = self.dbc[0].vals[i] * */ - __pyx_t_9 = (__pyx_v_self->dbc[0]).vals.size(); - __pyx_t_13 = __pyx_t_9; - for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { - __pyx_v_i = __pyx_t_14; + __pyx_t_13 = (__pyx_v_self->dbc[0]).vals.size(); + __pyx_t_14 = __pyx_t_13; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_14; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; /* "opendbc/can/parser_pyx.pyx":168 * diff --git a/opendbc/can/parser_pyx.so b/opendbc/can/parser_pyx.so index 799140a93..943050310 100755 Binary files a/opendbc/can/parser_pyx.so and b/opendbc/can/parser_pyx.so differ diff --git a/panda/.gitignore b/panda/.gitignore index a3f6520bf..1f96749b0 100644 --- a/panda/.gitignore +++ b/panda/.gitignore @@ -12,7 +12,7 @@ a.out .#* dist/ pandacan.egg-info/ -board/obj/ +obj/ examples/output.csv .DS_Store .vscode* diff --git a/panda/__init__.py b/panda/__init__.py index dfb2bbf1c..e8e05c52d 100644 --- a/panda/__init__.py +++ b/panda/__init__.py @@ -1,6 +1,11 @@ from .python.constants import McuType, BASEDIR, FW_PATH, USBPACKET_MAX_SIZE # noqa: F401 from .python.spi import PandaSpiException, PandaProtocolMismatch # noqa: F401 from .python.serial import PandaSerial # noqa: F401 +from .python.canhandle import CanHandle # noqa: F401 from .python import (Panda, PandaDFU, # noqa: F401 pack_can_buffer, unpack_can_buffer, calculate_checksum, unpack_log, DLC_TO_LEN, LEN_TO_DLC, ALTERNATIVE_EXPERIENCE, CANPACKET_HEAD_SIZE) + + +# panda jungle +from .board.jungle import PandaJungle, PandaJungleDFU # noqa: F401 diff --git a/panda/board/jungle/__init__.py b/panda/board/jungle/__init__.py new file mode 100644 index 000000000..c6e005a59 --- /dev/null +++ b/panda/board/jungle/__init__.py @@ -0,0 +1,150 @@ +# python library to interface with panda +import os +import struct +from functools import wraps +from typing import Optional + +from panda import Panda, PandaDFU +from panda.python.constants import McuType + +BASEDIR = os.path.dirname(os.path.realpath(__file__)) +FW_PATH = os.path.join(BASEDIR, "obj/") + + +def ensure_jungle_health_packet_version(fn): + @wraps(fn) + def wrapper(self, *args, **kwargs): + if self.health_version != self.HEALTH_PACKET_VERSION: + raise RuntimeError(f"Jungle firmware ({self.health_version}) doesn't match the \ + library's health packet version ({self.HEALTH_PACKET_VERSION}). \ + Reflash jungle.") + return fn(self, *args, **kwargs) + return wrapper + + +class PandaJungleDFU(PandaDFU): + def recover(self): + fn = os.path.join(FW_PATH, self._mcu_type.config.bootstub_fn.replace("panda", "panda_jungle")) + with open(fn, "rb") as f: + code = f.read() + self.program_bootstub(code) + self.reset() + + +class PandaJungle(Panda): + USB_PIDS = (0xddef, 0xddcf) + + HW_TYPE_UNKNOWN = b'\x00' + HW_TYPE_V1 = b'\x01' + HW_TYPE_V2 = b'\x02' + + F4_DEVICES = [HW_TYPE_V1, ] + H7_DEVICES = [HW_TYPE_V2, ] + + HEALTH_PACKET_VERSION = 1 + HEALTH_STRUCT = struct.Struct(" bool: + dfu_serial = self.get_dfu_serial() + + if reset: + self.reset(enter_bootstub=True) + self.reset(enter_bootloader=True) + + if not self.wait_for_dfu(dfu_serial, timeout=timeout): + return False + + dfu = PandaJungleDFU(dfu_serial) + dfu.recover() + + # reflash after recover + self.connect(True, True) + self.flash() + return True + + def get_mcu_type(self) -> McuType: + hw_type = self.get_type() + if hw_type in PandaJungle.F4_DEVICES: + return McuType.F4 + elif hw_type in PandaJungle.H7_DEVICES: + return McuType.H7 + raise ValueError(f"unknown HW type: {hw_type}") + + def up_to_date(self) -> bool: + current = self.get_signature() + fn = os.path.join(FW_PATH, self.get_mcu_type().config.app_fn.replace("panda", "panda_jungle")) + expected = Panda.get_signature_from_firmware(fn) + return (current == expected) + + # ******************* health ******************* + + @ensure_jungle_health_packet_version + def health(self): + dat = self._handle.controlRead(PandaJungle.REQUEST_IN, 0xd2, 0, 0, self.HEALTH_STRUCT.size) + a = self.HEALTH_STRUCT.unpack(dat) + return { + "uptime": a[0], + "ch1_power": a[1], + "ch2_power": a[2], + "ch3_power": a[3], + "ch4_power": a[4], + "ch5_power": a[5], + "ch6_power": a[6], + "ch1_sbu1_voltage": a[7] / 1000.0, + "ch1_sbu2_voltage": a[8] / 1000.0, + "ch2_sbu1_voltage": a[9] / 1000.0, + "ch2_sbu2_voltage": a[10] / 1000.0, + "ch3_sbu1_voltage": a[11] / 1000.0, + "ch3_sbu2_voltage": a[12] / 1000.0, + "ch4_sbu1_voltage": a[13] / 1000.0, + "ch4_sbu2_voltage": a[14] / 1000.0, + "ch5_sbu1_voltage": a[15] / 1000.0, + "ch5_sbu2_voltage": a[16] / 1000.0, + "ch6_sbu1_voltage": a[17] / 1000.0, + "ch6_sbu2_voltage": a[18] / 1000.0, + } + + # ******************* control ******************* + + # Returns tuple with health packet version and CAN packet/USB packet version + def get_packets_versions(self): + dat = self._handle.controlRead(PandaJungle.REQUEST_IN, 0xdd, 0, 0, 3) + if dat and len(dat) == 3: + a = struct.unpack("BBB", dat) + return (a[0], a[1], a[2]) + return (-1, -1, -1) + + # ******************* jungle stuff ******************* + + def set_panda_power(self, enabled): + self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa0, int(enabled), 0, b'') + + def set_harness_orientation(self, mode): + self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa1, int(mode), 0, b'') + + def set_ignition(self, enabled): + self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa2, int(enabled), 0, b'') + + # ******************* serial ******************* + + def debug_read(self): + ret = [] + while 1: + lret = bytes(self._handle.controlRead(PandaJungle.REQUEST_IN, 0xe0, 0, 0, 0x40)) + if len(lret) == 0: + break + ret.append(lret) + return b''.join(ret) diff --git a/panda/board/obj/bootstub.panda.bin b/panda/board/obj/bootstub.panda.bin index 3c0dfa750..2b083ef99 100755 Binary files a/panda/board/obj/bootstub.panda.bin and b/panda/board/obj/bootstub.panda.bin differ diff --git a/panda/board/obj/panda.bin.signed b/panda/board/obj/panda.bin.signed index a8b789c26..1c8366a5e 100644 Binary files a/panda/board/obj/panda.bin.signed and b/panda/board/obj/panda.bin.signed differ diff --git a/panda/board/obj/panda_h7.bin.signed b/panda/board/obj/panda_h7.bin.signed index 1148d33bc..4cefdfa6e 100644 Binary files a/panda/board/obj/panda_h7.bin.signed and b/panda/board/obj/panda_h7.bin.signed differ diff --git a/panda/python/__init__.py b/panda/python/__init__.py index 8d93f8171..fbd16f15b 100644 --- a/panda/python/__init__.py +++ b/panda/python/__init__.py @@ -185,6 +185,7 @@ class Panda: GMLAN_CAN2 = 1 GMLAN_CAN3 = 2 + USB_PIDS = (0xddee, 0xddcc) REQUEST_IN = usb1.ENDPOINT_IN | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE REQUEST_OUT = usb1.ENDPOINT_OUT | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE @@ -205,9 +206,9 @@ class Panda: HEALTH_STRUCT = struct.Struct(" int: + def controlWrite(self, request_type: int, request: int, value: int, index: int, data, timeout: int = TIMEOUT, expect_disconnect: bool = False): ... @abstractmethod diff --git a/panda/python/canhandle.py b/panda/python/canhandle.py new file mode 100644 index 000000000..ff6e62555 --- /dev/null +++ b/panda/python/canhandle.py @@ -0,0 +1,53 @@ +import struct +import signal + +from .base import BaseHandle + + +class CanHandle(BaseHandle): + def __init__(self, p, bus): + self.p = p + self.bus = bus + + def transact(self, dat): + def _handle_timeout(signum, frame): + # will happen on reset or can error + raise TimeoutError + + signal.signal(signal.SIGALRM, _handle_timeout) + signal.alarm(1) + + try: + self.p.isotp_send(1, dat, self.bus, recvaddr=2) + finally: + signal.alarm(0) + + signal.signal(signal.SIGALRM, _handle_timeout) + signal.alarm(1) + try: + ret = self.p.isotp_recv(2, self.bus, sendaddr=1) + finally: + signal.alarm(0) + + return ret + + def close(self): + pass + + def controlWrite(self, request_type, request, value, index, data, timeout=0, expect_disconnect=False): + # ignore data in reply, panda doesn't use it + return self.controlRead(request_type, request, value, index, 0, timeout) + + def controlRead(self, request_type, request, value, index, length, timeout=0): + dat = struct.pack("HHBBHHH", 0, 0, request_type, request, value, index, length) + return self.transact(dat) + + def bulkWrite(self, endpoint, data, timeout=0): + if len(data) > 0x10: + raise ValueError("Data must not be longer than 0x10") + dat = struct.pack("HH", endpoint, len(data)) + data + return self.transact(dat) + + def bulkRead(self, endpoint, length, timeout=0): + dat = struct.pack("HH", endpoint, 0) + return self.transact(dat) diff --git a/rednose/helpers/ekf_sym_pyx.so b/rednose/helpers/ekf_sym_pyx.so index 07ca2bfd2..9a6d1b30c 100755 Binary files a/rednose/helpers/ekf_sym_pyx.so and b/rednose/helpers/ekf_sym_pyx.so differ diff --git a/selfdrive/assets/navigation/icon_directions_outlined.svg b/selfdrive/assets/navigation/icon_directions_outlined.svg index 4d31bfd93..5c0c2fa3b 100644 --- a/selfdrive/assets/navigation/icon_directions_outlined.svg +++ b/selfdrive/assets/navigation/icon_directions_outlined.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index 35a9eaf19..780d2ab90 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -43,7 +43,7 @@ from system.swaglog import SWAGLOG_DIR, cloudlog from system.version import get_commit, get_origin, get_short_branch, get_version -# missing in pysocket +# TODO: use socket constant when mypy recognizes this as a valid attribute TCP_USER_TIMEOUT = 18 ATHENA_HOST = os.getenv('ATHENA_HOST', 'wss://athena.comma.ai') @@ -821,10 +821,6 @@ def main(exit_event: Optional[threading.Event] = None): except (ConnectionError, TimeoutError, WebSocketException): conn_retries += 1 params.remove("LastAthenaPingTime") - # TODO: socket.timeout and TimeoutError are now the same exception since python3.10 - # Remove the socket.timeout case once we have fully moved to python3.11 - except socket.timeout: # pylint: disable=duplicate-except - params.remove("LastAthenaPingTime") except Exception: cloudlog.exception("athenad.main.exception") diff --git a/selfdrive/boardd/boardd b/selfdrive/boardd/boardd index 860335278..85b4023ba 100755 Binary files a/selfdrive/boardd/boardd and b/selfdrive/boardd/boardd differ diff --git a/selfdrive/boardd/boardd_api_impl.so b/selfdrive/boardd/boardd_api_impl.so index e36c3705f..18fd369de 100755 Binary files a/selfdrive/boardd/boardd_api_impl.so and b/selfdrive/boardd/boardd_api_impl.so differ diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index bb201bfe0..10da0dc56 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -132,6 +132,30 @@ def apply_std_steer_angle_limits(apply_angle, apply_angle_last, v_ego, LIMITS): return clip(apply_angle, apply_angle_last - angle_rate_lim, apply_angle_last + angle_rate_lim) +def common_fault_avoidance(measured_value: float, max_value: float, request: bool, above_limit_frames: int, + max_above_limit_frames: int, max_mismatching_frames: int = 1): + """ + Several cars have the ability to work around their EPS limits by cutting the + request bit of their LKAS message after a certain number of frames above the limit. + """ + + # Count up to max_above_limit_frames, at which point we need to cut the request for above_limit_frames to avoid a fault + if request and abs(measured_value) >= max_value: + above_limit_frames += 1 + else: + above_limit_frames = 0 + + # Once we cut the request bit, count additionally to max_mismatching_frames before setting the request bit high again. + # Some brands do not respect our workaround without multiple messages on the bus, for example + if above_limit_frames > max_above_limit_frames: + request = False + + if above_limit_frames >= max_above_limit_frames + max_mismatching_frames: + above_limit_frames = 0 + + return above_limit_frames, request + + def crc8_pedal(data): crc = 0xFF # standard init value poly = 0xD5 # standard crc8: x8+x7+x6+x4+x2+1 diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index bd72314bd..97205682e 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -179,7 +179,8 @@ def fingerprint(logcan, sendcan, num_pandas): source = car.CarParams.FingerprintSource.fixed cloudlog.event("fingerprinted", car_fingerprint=car_fingerprint, source=source, fuzzy=not exact_match, cached=cached, - fw_count=len(car_fw), ecu_responses=list(ecu_rx_addrs), vin_rx_addr=vin_rx_addr, error=True) + fw_count=len(car_fw), ecu_responses=list(ecu_rx_addrs), vin_rx_addr=vin_rx_addr, fingerprints=finger, + error=True) return car_fingerprint, finger, vin, car_fw, source, exact_match diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index b9ce596c9..28415da23 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -131,7 +131,7 @@ FINGERPRINTS = { 168: 8, 257: 5, 258: 8, 264: 8, 268: 8, 270: 8, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 291: 8, 292: 8, 294: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 368: 8, 376: 3, 384: 8, 388: 4, 448: 6, 450: 8, 456: 4, 464: 8, 469: 8, 480: 8, 500: 8, 501: 8, 512: 8, 514: 8, 515: 7, 516: 7, 517: 7, 518: 7, 520: 8, 524: 8, 526: 6, 528: 8, 532: 8, 542: 8, 544: 8, 557: 8, 559: 8, 560: 8, 564: 8, 571: 3, 579: 8, 584: 8, 608: 8, 624: 8, 625: 8, 632: 8, 639: 8, 650: 8, 653: 8, 654: 8, 655: 8, 656: 4, 658: 6, 660: 8, 669: 3, 671: 8, 672: 8, 678: 8, 680: 8, 683: 8, 701: 8, 703: 8, 704: 8, 705: 8, 706: 8, 709: 8, 710: 8, 711: 8, 719: 8, 720: 6, 729: 5, 736: 8, 737: 8, 738: 8, 746: 5, 752: 2, 754: 8, 760: 8, 764: 8, 766: 8, 770: 8, 773: 8, 779: 8, 782: 8, 784: 8, 792: 8, 793: 8, 794: 8, 795: 8, 796: 8, 797: 8, 798: 8, 799: 8, 800: 8, 801: 8, 802: 8, 803: 8, 804: 8, 805: 8, 807: 8, 808: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 832: 8, 838: 2, 848: 8, 853: 8, 856: 4, 860: 6, 863: 8, 878: 8, 882: 8, 886: 8, 897: 8, 906: 8, 908: 8, 924: 8, 926: 3, 937: 8, 938: 8, 939: 8, 940: 8, 941: 8, 942: 8, 943: 8, 947: 8, 948: 8, 958: 8, 959: 8, 962: 8, 969: 4, 973: 8, 974: 5, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1082: 8, 1083: 8, 1098: 8, 1100: 8, 1216: 8, 1218: 8, 1220: 8, 1225: 8, 1235: 8, 1242: 8, 1246: 8, 1250: 8, 1251: 8, 1252: 8, 1284: 8, 1568: 8, 1856: 8, 1858: 8, 1860: 8, 1863: 8, 1865: 8, 1875: 8, 1882: 8, 1886: 8, 1890: 8, 1891: 8, 1892: 8, 2018: 8, 2020: 8, 2026: 8, 2028: 8 }], CAR.JEEP_CHEROKEE: [{ - 55: 8, 168: 8, 181: 8, 256: 4, 257: 5, 258: 8, 264: 8, 268: 8, 272: 6, 273: 6, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 292: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 352: 8, 362: 8, 368: 8, 376: 3, 384: 8, 388: 4, 416: 7, 448: 6, 456: 4, 464: 8, 500: 8, 501: 8, 512: 8, 514: 8, 520: 8, 532: 8, 544: 8, 557: 8, 559: 8, 560: 4, 564: 4, 571: 3, 579: 8, 584: 8, 608: 8, 618: 8, 624: 8, 625: 8, 632: 8, 639: 8, 656: 4, 658: 6, 660: 8, 671: 8, 672: 8, 676: 8, 678: 8, 680: 8, 683: 8, 684: 8, 703: 8, 705: 8, 706: 8, 709: 8, 710: 8, 719: 8, 720: 6, 729: 5, 736: 8, 737: 8, 738: 8, 746: 5, 752: 2, 754: 8, 760: 8, 761: 8, 764: 8, 766: 8, 773: 8, 776: 8, 779: 8, 782: 8, 783: 8, 784: 8, 785: 8, 788: 3, 792: 8, 799: 8, 800: 8, 804: 8, 806: 2, 808: 8, 810: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 831: 6, 832: 8, 838: 2, 840: 8, 844: 5, 847: 1, 848: 8, 853: 8, 856: 4, 860: 6, 863: 8, 874: 2, 882: 8, 897: 8, 906: 8, 924: 8, 937: 8, 938: 8, 939: 8, 940: 8, 941: 8, 942: 8, 943: 8, 947: 8, 948: 8, 956: 8, 968: 8, 969: 4, 970: 8, 973: 8, 974: 5, 975: 8, 976: 8, 977: 4, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1062: 8, 1098: 8, 1100: 8, 1543: 8, 1562: 8, 2015: 8, 2016: 8, 2017: 8, 2024: 8, 2025: 8 + 55: 8, 168: 8, 181: 8, 256: 4, 257: 5, 258: 8, 264: 8, 268: 8, 272: 6, 273: 6, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 292: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 352: 8, 362: 8, 368: 8, 376: 3, 384: 8, 388: 4, 416: 7, 448: 6, 456: 4, 464: 8, 500: 8, 501: 8, 512: 8, 514: 8, 520: 8, 532: 8, 544: 8, 557: 8, 559: 8, 560: 4, 564: 4, 571: 3, 579: 8, 584: 8, 608: 8, 618: 8, 624: 8, 625: 8, 632: 8, 639: 8, 656: 4, 658: 6, 660: 8, 671: 8, 672: 8, 676: 8, 678: 8, 680: 8, 683: 8, 684: 8, 703: 8, 705: 8, 706: 8, 709: 8, 710: 8, 719: 8, 720: 6, 729: 5, 736: 8, 737: 8, 738: 8, 746: 5, 752: 2, 754: 8, 760: 8, 761: 8, 764: 8, 766: 8, 773: 8, 776: 8, 779: 8, 782: 8, 783: 8, 784: 8, 785: 8, 788: 3, 792: 8, 799: 8, 800: 8, 804: 8, 806: 2, 808: 8, 810: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 831: 6, 832: 8, 838: 2, 840: 8, 844: 5, 847: 1, 848: 8, 853: 8, 856: 4, 860: 6, 863: 8, 874: 2, 882: 8, 897: 8, 906: 8, 924: 8, 937: 8, 938: 8, 939: 8, 940: 8, 941: 8, 942: 8, 943: 8, 947: 8, 948: 8, 956: 8, 968: 8, 969: 4, 970: 8, 973: 8, 974: 5, 975: 8, 976: 8, 977: 4, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1062: 8, 1098: 8, 1100: 8, 1543: 8, 1562: 8, 1576: 8, 2015: 8, 2016: 8, 2017: 8, 2024: 8, 2025: 8 }, # Based on c88f65eeaee4003a|2022-08-04--15-37-16 { diff --git a/selfdrive/car/docs_definitions.py b/selfdrive/car/docs_definitions.py index 5db720b8f..e6d530e13 100644 --- a/selfdrive/car/docs_definitions.py +++ b/selfdrive/car/docs_definitions.py @@ -87,6 +87,8 @@ class CarHarness(EnumBase): toyota = BaseCarHarness("Toyota connector") subaru_a = BaseCarHarness("Subaru A connector") subaru_b = BaseCarHarness("Subaru B connector") + subaru_c = BaseCarHarness("Subaru C connector") + subaru_d = BaseCarHarness("Subaru D connector") fca = BaseCarHarness("FCA connector") ram = BaseCarHarness("Ram connector") vw = BaseCarHarness("VW connector") @@ -129,6 +131,11 @@ class Kit(EnumBase): red_panda_kit = BasePart("CAN FD panda kit", parts=[Device.red_panda, Accessory.harness_box, Cable.usb_a_2_a_cable, Cable.usbc_otg_cable, Cable.obd_c_cable_1_5ft]) +class Tool(EnumBase): + socket_8mm_deep = BasePart("Socket Wrench 8mm or 5/16\" (deep)") + pry_tool = BasePart("Pry Tool") + + class PartType(Enum): accessory = Accessory cable = Cable @@ -136,6 +143,7 @@ class PartType(Enum): device = Device kit = Kit mount = Mount + tool = Tool DEFAULT_CAR_PARTS: List[EnumBase] = [Device.three] @@ -265,10 +273,17 @@ class CarInfo: hardware_col = "None" if self.car_parts.parts: model_years = self.model + (' ' + self.years if self.years else '') - buy_link = f'Buy Here' - car_parts_docs = self.car_parts.all_parts() - parts = '
'.join([f"- {car_parts_docs.count(part)} {part.value.name}" for part in sorted(set(car_parts_docs), key=lambda part: str(part.value.name))]) - hardware_col = f'
View{parts}
{buy_link}
' + buy_link = f'Buy Here' + + tools_docs = [part for part in self.car_parts.all_parts() if isinstance(part, Tool)] + parts_docs = [part for part in self.car_parts.all_parts() if not isinstance(part, Tool)] + + def display_func(parts): + return '
'.join([f"- {parts.count(part)} {part.value.name}" for part in sorted(set(parts), key=lambda part: str(part.value.name))]) + + hardware_col = f'
Parts{display_func(parts_docs)}
{buy_link}
' + if len(tools_docs): + hardware_col += f'
Tools{display_func(tools_docs)}
' self.row: Dict[Enum, Union[str, Star]] = { Column.MAKE: self.make, @@ -320,8 +335,6 @@ class CarInfo: exp_link = "Experimental mode" if CP.openpilotLongitudinalControl or CP.experimentalLongitudinalAvailable: sentence_builder += f" Traffic light and stop sign handling is also available in {exp_link}." - else: - sentence_builder += f" {exp_link}, with traffic light and stop sign handling, is not currently available for this car, but may be added in a future software update." return sentence_builder.format(car_model=f"{self.make} {self.model}", alc=alc, acc=acc) diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index 5a7a2174c..87135ea9d 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -242,8 +242,9 @@ def get_fw_versions_ordered(logcan, sendcan, ecu_rx_addrs, timeout=0.1, num_pand car_fw = get_fw_versions(logcan, sendcan, query_brand=brand, timeout=timeout, num_pandas=num_pandas, debug=debug, progress=progress) all_car_fw.extend(car_fw) - # Try to match using FW returned from this brand only - matches = match_fw_to_car_exact(build_fw_dict(car_fw)) + + # If there is a match using this brand's FW alone, finish querying early + _, matches = match_fw_to_car(car_fw, log=False) if len(matches) == 1: break diff --git a/selfdrive/car/gm/carstate.py b/selfdrive/car/gm/carstate.py index 2f9c95287..69d34c09c 100644 --- a/selfdrive/car/gm/carstate.py +++ b/selfdrive/car/gm/carstate.py @@ -216,4 +216,4 @@ class CarState(CarStateBase): ("ASCMLKASteeringCmd", 0), ] - return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CanBus.LOOPBACK, enforce_checks=False) + return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CanBus.LOOPBACK) diff --git a/selfdrive/car/hyundai/carcontroller.py b/selfdrive/car/hyundai/carcontroller.py index b07522ed2..3e6c98355 100644 --- a/selfdrive/car/hyundai/carcontroller.py +++ b/selfdrive/car/hyundai/carcontroller.py @@ -3,7 +3,7 @@ from common.conversions import Conversions as CV from common.numpy_fast import clip from common.realtime import DT_CTRL from opendbc.can.packer import CANPacker -from selfdrive.car import apply_driver_steer_torque_limits +from selfdrive.car import apply_driver_steer_torque_limits, common_fault_avoidance from selfdrive.car.hyundai import hyundaicanfd, hyundaican from selfdrive.car.hyundai.hyundaicanfd import CanBus from selfdrive.car.hyundai.values import HyundaiFlags, Buttons, CarControllerParams, CANFD_CAR, CAR @@ -68,9 +68,17 @@ class CarController: # rick - from taco apply_steer = clip(apply_steer, -self.params.STEER_MAX, self.params.STEER_MAX) + # >90 degree steering fault prevention + self.angle_limit_counter, apply_steer_req = common_fault_avoidance(CS.out.steeringAngleDeg, MAX_ANGLE, CC.latActive, + self.angle_limit_counter, MAX_ANGLE_FRAMES, + MAX_ANGLE_CONSECUTIVE_FRAMES) + if not CC.latActive: apply_steer = 0 + # Hold torque with induced temporary fault when cutting the actuation bit + torque_fault = CC.latActive and not apply_steer_req + self.apply_steer_last = apply_steer # accel + longitudinal @@ -98,27 +106,13 @@ class CarController: if self.CP.flags & HyundaiFlags.ENABLE_BLINKERS: can_sends.append([0x7b1, 0, b"\x02\x3E\x80\x00\x00\x00\x00\x00", self.CAN.ECAN]) - # >90 degree steering fault prevention - # Count up to MAX_ANGLE_FRAMES, at which point we need to cut torque to avoid a steering fault - if CC.latActive and abs(CS.out.steeringAngleDeg) >= MAX_ANGLE: - self.angle_limit_counter += 1 - else: - self.angle_limit_counter = 0 - - # Cut steer actuation bit for two frames and hold torque with induced temporary fault - torque_fault = CC.latActive and self.angle_limit_counter > MAX_ANGLE_FRAMES - lat_active = CC.latActive and not torque_fault - - if self.angle_limit_counter >= MAX_ANGLE_FRAMES + MAX_ANGLE_CONSECUTIVE_FRAMES: - self.angle_limit_counter = 0 - # CAN-FD platforms if self.CP.carFingerprint in CANFD_CAR: hda2 = self.CP.flags & HyundaiFlags.CANFD_HDA2 hda2_long = hda2 and self.CP.openpilotLongitudinalControl # steering control - can_sends.extend(hyundaicanfd.create_steering_messages(self.packer, self.CP, self.CAN, CC.enabled, lat_active, apply_steer)) + can_sends.extend(hyundaicanfd.create_steering_messages(self.packer, self.CP, self.CAN, CC.enabled, apply_steer_req, apply_steer)) # disable LFA on HDA2 if self.frame % 5 == 0 and hda2: @@ -162,7 +156,7 @@ class CarController: can_sends.append(hyundaicanfd.create_buttons(self.packer, self.CP, self.CAN, CS.buttons_counter+1, Buttons.RES_ACCEL)) self.last_button_frame = self.frame else: - can_sends.append(hyundaican.create_lkas11(self.packer, self.frame, self.car_fingerprint, apply_steer, lat_active, + can_sends.append(hyundaican.create_lkas11(self.packer, self.frame, self.car_fingerprint, apply_steer, apply_steer_req, torque_fault, CS.lkas11, sys_warning, sys_state, CC.enabled, hud_control.leftLaneVisible, hud_control.rightLaneVisible, left_lane_warning, right_lane_warning)) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 1258554ac..047aa7e33 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -139,10 +139,9 @@ class CAR: class Footnote(Enum): - # footnotes which mention "red panda" will be replaced with the CAN FD panda kit on the shop page CANFD = CarFootnote( - "Requires a red panda for this CAN FD car. " + - "All the hardware needed is sold in the CAN FD kit.", + "Requires a comma 3X or CAN FD panda kit " + + "for this CAN FD car.", Column.MODEL, shop_footnote=True) diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index 71fd9f186..fbdf8961a 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -88,6 +88,7 @@ FW_VERSIONS = { (Ecu.engine, 0x7e0, None): [ b'PX2G-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2H-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2H-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX85-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'SH54-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PXFG-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -105,6 +106,7 @@ FW_VERSIONS = { ], (Ecu.transmission, 0x7e1, None): [ b'PYB2-21PS1-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB2-21PS1-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'SH51-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PXDL-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PXFG-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', diff --git a/selfdrive/car/nissan/interface.py b/selfdrive/car/nissan/interface.py index 573dff9f0..f26dea43a 100644 --- a/selfdrive/car/nissan/interface.py +++ b/selfdrive/car/nissan/interface.py @@ -47,7 +47,7 @@ class CarInterface(CarInterfaceBase): be.type = car.CarState.ButtonEvent.Type.accelCruise buttonEvents.append(be) - events = self.create_common_events(ret) + events = self.create_common_events(ret, extra_gears=[car.CarState.GearShifter.brake]) if self.CS.lkas_enabled: events.add(car.CarEvent.EventName.invalidLkasSetting) diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index f7698dbe7..b01d1eb3b 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -3,7 +3,7 @@ from cereal import car from panda import Panda from selfdrive.car import STD_CARGO_KG, get_safety_config from selfdrive.car.interfaces import CarInterfaceBase -from selfdrive.car.subaru.values import CAR, GLOBAL_GEN2, PREGLOBAL_CARS, SubaruFlags +from selfdrive.car.subaru.values import CAR, LKAS_ANGLE, GLOBAL_GEN2, PREGLOBAL_CARS, SubaruFlags class CarInterface(CarInterfaceBase): @@ -12,7 +12,7 @@ class CarInterface(CarInterfaceBase): def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "subaru" ret.radarUnavailable = True - ret.dashcamOnly = candidate in PREGLOBAL_CARS + ret.dashcamOnly = candidate in (PREGLOBAL_CARS | LKAS_ANGLE) ret.autoResumeSng = False # Detect infotainment message sent from the camera @@ -30,7 +30,11 @@ class CarInterface(CarInterfaceBase): ret.steerLimitTimer = 0.4 ret.steerActuatorDelay = 0.1 - CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + if candidate in LKAS_ANGLE: + ret.steerControlType = car.CarParams.SteerControlType.angle + else: + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) if candidate == CAR.ASCENT: ret.mass = 2031. + STD_CARGO_KG @@ -64,7 +68,7 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 14., 23.], [0., 14., 23.]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.045, 0.042, 0.20], [0.04, 0.035, 0.045]] - elif candidate == CAR.FORESTER: + elif candidate in (CAR.FORESTER, CAR.FORESTER_2022): ret.mass = 1568. + STD_CARGO_KG ret.wheelbase = 2.67 ret.centerToFront = ret.wheelbase * 0.5 @@ -74,13 +78,12 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 14., 23.], [0., 14., 23.]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.01, 0.065, 0.2], [0.001, 0.015, 0.025]] - elif candidate in (CAR.OUTBACK, CAR.LEGACY): + elif candidate in (CAR.OUTBACK, CAR.LEGACY, CAR.OUTBACK_2023): ret.mass = 1568. + STD_CARGO_KG ret.wheelbase = 2.67 ret.centerToFront = ret.wheelbase * 0.5 ret.steerRatio = 17 ret.steerActuatorDelay = 0.1 - CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate in (CAR.FORESTER_PREGLOBAL, CAR.OUTBACK_PREGLOBAL_2018): ret.safetyConfigs[0].safetyParam = 1 # Outback 2018-2019 and Forester have reversed driver torque signal @@ -101,7 +104,6 @@ class CarInterface(CarInterfaceBase): ret.wheelbase = 2.67 ret.centerToFront = ret.wheelbase * 0.5 ret.steerRatio = 20 # learned, 14 stock - else: raise ValueError(f"unknown car: {candidate}") diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 0e3f2e8d0..95708445a 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -5,7 +5,7 @@ from typing import Dict, List, Union from cereal import car from panda.python import uds from selfdrive.car import dbc_dict -from selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column +from selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Tool, Column from selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 Ecu = car.CarParams.Ecu @@ -48,6 +48,8 @@ class CAR: FORESTER = "SUBARU FORESTER 2019" OUTBACK = "SUBARU OUTBACK 6TH GEN" LEGACY = "SUBARU LEGACY 7TH GEN" + FORESTER_2022 = "SUBARU FORESTER 2022" + OUTBACK_2023 = "SUBARU OUTBACK 7TH GEN" # Pre-global FORESTER_PREGLOBAL = "SUBARU FORESTER 2017 - 2018" @@ -68,6 +70,8 @@ class SubaruCarInfo(CarInfo): car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.subaru_a])) footnotes: List[Enum] = field(default_factory=lambda: [Footnote.GLOBAL]) + def init_make(self, CP: car.CarParams): + self.car_parts.parts.extend([Tool.socket_8mm_deep, Tool.pry_tool]) CAR_INFO: Dict[str, Union[SubaruCarInfo, List[SubaruCarInfo]]] = { CAR.ASCENT: SubaruCarInfo("Subaru Ascent 2019-21", "All"), @@ -88,6 +92,8 @@ CAR_INFO: Dict[str, Union[SubaruCarInfo, List[SubaruCarInfo]]] = { CAR.LEGACY_PREGLOBAL: SubaruCarInfo("Subaru Legacy 2015-18"), CAR.OUTBACK_PREGLOBAL: SubaruCarInfo("Subaru Outback 2015-17"), CAR.OUTBACK_PREGLOBAL_2018: SubaruCarInfo("Subaru Outback 2018-19"), + CAR.FORESTER_2022: SubaruCarInfo("Subaru Forester 2022", "All", car_parts=CarParts.common([CarHarness.subaru_c])), + CAR.OUTBACK_2023: SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), } SUBARU_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ @@ -101,6 +107,11 @@ FW_QUERY_CONFIG = FwQueryConfig( [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], ), + # Some Eyesight modules fail on TESTER_PRESENT_REQUEST + Request( + [SUBARU_VERSION_REQUEST], + [SUBARU_VERSION_RESPONSE], + ), ], ) @@ -276,6 +287,7 @@ FW_VERSIONS = { b'\xf3"f@\x07', b'\xe6!fp\x07', b'\xf3"fp\x07', + b'\xe6"f0\x07', ], (Ecu.transmission, 0x7e1, None): [ b'\xe6\xf5\004\000\000', @@ -286,6 +298,7 @@ FW_VERSIONS = { b'\xe6\xf5D0\x00', b'\xe9\xf6F0\x00', b'\xe9\xf5B0\x00', + b'\xe9\xf6B0\x00', ], }, CAR.FORESTER: { @@ -536,6 +549,52 @@ FW_VERSIONS = { b'\xa5\xfe\xf8@\x00', ], }, + CAR.FORESTER_2022: { + (Ecu.abs, 0x7b0, None): [ + b'\xa3 !x\x00', + b'\xa3 !v\x00', + b'\xa3 "v\x00', + b'\xa3 "x\x00', + ], + (Ecu.eps, 0x746, None): [ + b'-\xc0%0', + b'-\xc0\x040', + b'=\xc0%\x02', + b'=\xc04\x02', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x04!\x01\x1eD\x07!\x00\x04,' + ], + (Ecu.engine, 0x7e0, None): [ + b'\xd5"a0\x07', + b'\xd5"`0\x07', + b'\xf1"aq\x07', + b'\xf1"`q\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\x1d\x86B0\x00', + b'\x1d\xf6B0\x00', + b'\x1e\x86B0\x00', + b'\x1e\xf6D0\x00', + ], + }, + CAR.OUTBACK_2023: { + (Ecu.abs, 0x7b0, None): [ + b'\xa1 #\x17\x00', + ], + (Ecu.eps, 0x746, None): [ + b'+\xc0\x12\x11\x00', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\t!\x08\x046\x05!\x08\x01/', + ], + (Ecu.engine, 0x7a2, None): [ + b'\xed,\xa2q\x07', + ], + (Ecu.transmission, 0x7a3, None): [ + b'\xa8\x8e\xf41\x00', + ] + } } DBC = { @@ -543,7 +602,9 @@ DBC = { CAR.IMPREZA: dbc_dict('subaru_global_2017_generated', None), CAR.IMPREZA_2020: dbc_dict('subaru_global_2017_generated', None), CAR.FORESTER: dbc_dict('subaru_global_2017_generated', None), + CAR.FORESTER_2022: dbc_dict('subaru_global_2017_generated', None), CAR.OUTBACK: dbc_dict('subaru_global_2017_generated', None), + CAR.OUTBACK_2023: dbc_dict('subaru_global_2017_generated', None), CAR.LEGACY: dbc_dict('subaru_global_2017_generated', None), CAR.FORESTER_PREGLOBAL: dbc_dict('subaru_forester_2017_generated', None), CAR.LEGACY_PREGLOBAL: dbc_dict('subaru_outback_2015_generated', None), @@ -551,5 +612,6 @@ DBC = { CAR.OUTBACK_PREGLOBAL_2018: dbc_dict('subaru_outback_2019_generated', None), } -GLOBAL_GEN2 = (CAR.OUTBACK, CAR.LEGACY) -PREGLOBAL_CARS = (CAR.FORESTER_PREGLOBAL, CAR.LEGACY_PREGLOBAL, CAR.OUTBACK_PREGLOBAL, CAR.OUTBACK_PREGLOBAL_2018) +LKAS_ANGLE = {CAR.FORESTER_2022, CAR.OUTBACK_2023} +GLOBAL_GEN2 = {CAR.OUTBACK, CAR.LEGACY, CAR.OUTBACK_2023} +PREGLOBAL_CARS = {CAR.FORESTER_PREGLOBAL, CAR.LEGACY_PREGLOBAL, CAR.OUTBACK_PREGLOBAL, CAR.OUTBACK_PREGLOBAL_2018} diff --git a/selfdrive/car/torque_data/override.yaml b/selfdrive/car/torque_data/override.yaml index 62d39171f..d56e96ca6 100644 --- a/selfdrive/car/torque_data/override.yaml +++ b/selfdrive/car/torque_data/override.yaml @@ -7,6 +7,10 @@ NISSAN LEAF 2018 Instrument Cluster: [.nan, 1.5, .nan] NISSAN LEAF 2018: [.nan, 1.5, .nan] NISSAN ROGUE 2019: [.nan, 1.5, .nan] +# New subarus angle based controllers +SUBARU FORESTER 2022: [.nan, 3.0, .nan] +SUBARU OUTBACK 7TH GEN: [.nan, 3.0, .nan] + # Toyota LTA also has torque TOYOTA RAV4 2023: [.nan, 3.0, .nan] TOYOTA RAV4 HYBRID 2023: [.nan, 3.0, .nan] diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index 57e0a6bff..fd8c7f6ac 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -1,6 +1,6 @@ from cereal import car from common.numpy_fast import clip, interp -from selfdrive.car import apply_meas_steer_torque_limits, apply_std_steer_angle_limits, \ +from selfdrive.car import apply_meas_steer_torque_limits, apply_std_steer_angle_limits, common_fault_avoidance, \ create_gas_interceptor_command, make_can_msg from selfdrive.car.toyota.toyotacan import create_steer_command, create_ui_command, \ create_accel_command, create_acc_cancel_command, \ @@ -153,25 +153,18 @@ class CarController: new_steer = int(round(actuators.steer * self.params.STEER_MAX)) apply_steer = apply_meas_steer_torque_limits(new_steer, self.last_steer, CS.out.steeringTorqueEps, self.params) - # Count up to MAX_STEER_RATE_FRAMES, at which point we need to cut torque to avoid a steering fault - if lat_active and abs(CS.out.steeringRateDeg) >= MAX_STEER_RATE: - self.steer_rate_counter += 1 - else: - self.steer_rate_counter = 0 + # >100 degree/sec steering fault prevention + self.steer_rate_counter, apply_steer_req = common_fault_avoidance(CS.out.steeringRateDeg, MAX_STEER_RATE, CC.latActive, + self.steer_rate_counter, MAX_STEER_RATE_FRAMES) - apply_steer_req = 1 - if not lat_active: + if not CC.latActive: apply_steer = 0 - apply_steer_req = 0 - elif self.steer_rate_counter > MAX_STEER_RATE_FRAMES: - apply_steer_req = 0 - self.steer_rate_counter = 0 # *** steer angle *** if self.CP.steerControlType == SteerControlType.angle: # If using LTA control, disable LKA and set steering angle command apply_steer = 0 - apply_steer_req = 0 + apply_steer_req = False if self.frame % 2 == 0: # EPS uses the torque sensor angle to control with, offset to compensate apply_angle = actuators.steeringAngleDeg + CS.out.steeringAngleOffsetDeg @@ -221,11 +214,13 @@ class CarController: pcm_cancel_cmd = 1 # on entering standstill, send standstill request - if not self.dp_toyota_sng and CS.out.standstill and not self.last_standstill and (self.CP.carFingerprint not in NO_STOP_TIMER_CAR or self.CP.enableGasInterceptor): + if CS.out.standstill and not self.last_standstill and (self.CP.carFingerprint not in NO_STOP_TIMER_CAR or self.CP.enableGasInterceptor): self.standstill_req = True if CS.pcm_acc_status != 8: # pcm entered standstill or it's disabled self.standstill_req = False + if self.dp_toyota_sng: + self.standstill_req = False self.last_standstill = CS.out.standstill diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 75f61609d..a7177cdc4 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -6,6 +6,7 @@ from selfdrive.car.toyota.values import Ecu, CAR, DBC, ToyotaFlags, CarControlle MIN_ACC_SPEED, EPS_SCALE, EV_HYBRID_CAR, UNSUPPORTED_DSU_CAR, NO_STOP_TIMER_CAR, ANGLE_CONTROL_CAR from selfdrive.car import STD_CARGO_KG, scale_tire_stiffness, get_safety_config from selfdrive.car.interfaces import CarInterfaceBase +from common.params import Params EventName = car.CarEvent.EventName SteerControlType = car.CarParams.SteerControlType @@ -238,6 +239,9 @@ class CarInterface(CarInterfaceBase): ret.openpilotLongitudinalControl = use_sdsu or ret.enableDsu or candidate in (TSS2_CAR - RADAR_ACC_CAR) ret.autoResumeSng = ret.openpilotLongitudinalControl and candidate in NO_STOP_TIMER_CAR + if Params().get_bool("dp_long_stock_mode"): + ret.openpilotLongitudinalControl = False + if not ret.openpilotLongitudinalControl: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_TOYOTA_STOCK_LONGITUDINAL diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 58e3464e3..21d61f1ee 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -745,6 +745,7 @@ FW_VERSIONS = { b'F152610040\x00\x00\x00\x00\x00\x00', b'F152610190\x00\x00\x00\x00\x00\x00', b'F152610200\x00\x00\x00\x00\x00\x00', + b'F152610220\x00\x00\x00\x00\x00\x00', b'F152610230\x00\x00\x00\x00\x00\x00', ], (Ecu.dsu, 0x791, None): [ diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index ac8005530..da984fd18 100755 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -1190,6 +1190,7 @@ FW_VERSIONS = { CAR.SKODA_KODIAQ_MK1: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704E906027DD\xf1\x893123', + b'\xf1\x8704E906027NB\xf1\x899504', b'\xf1\x8704E906027NB\xf1\x896517', b'\xf1\x8704L906026DE\xf1\x895418', b'\xf1\x8704L906026EJ\xf1\x893661', @@ -1332,6 +1333,7 @@ FW_VERSIONS = { b'\xf1\x875Q0959655AK\xf1\x890130\xf1\x82\022111200111121001121110012211292221111', b'\xf1\x875Q0959655AS\xf1\x890317\xf1\x82\x1331310031313100313131823133319331313100', b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\02331310031313100313131013141319331413100', + b'\xf1\x875Q0959655BK\xf1\x890336\xf1\x82\x1331310031313100313131013141319331413100', b'\xf1\x875Q0959655CA\xf1\x890403\xf1\x82\x1331310031313100313151013141319331423100', b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1333310031313100313152025350539331463100', b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1333310031313100313152855372539331463100', diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 7f06f72e6..83ebc7127 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -32,11 +32,17 @@ SOFT_DISABLE_TIME = 3 # seconds LDW_MIN_SPEED = 31 * CV.MPH_TO_MS LANE_DEPARTURE_THRESHOLD = 0.1 +dp_device_dm_unavailable = Params().get_bool("dp_device_dm_unavailable") + REPLAY = "REPLAY" in os.environ SIMULATION = "SIMULATION" in os.environ TESTING_CLOSET = "TESTING_CLOSET" in os.environ NOSENSOR = "NOSENSOR" in os.environ -IGNORE_PROCESSES = {"loggerd", "encoderd", "statsd", "mapd", "otisserv", "fileserv"} +IGNORE_PROCESSES = {"loggerd", "encoderd", "statsd"} +# dp related processes +IGNORE_PROCESSES.update({"mapd", "otisserv", "fileserv", "gpxd", "gpx_uploader"}) +if dp_device_dm_unavailable: + IGNORE_PROCESSES.update({"dmonitoringd", "dmonitoringmodeld"}) ThermalStatus = log.DeviceState.ThermalStatus State = log.ControlsState.OpenpilotState @@ -66,9 +72,13 @@ class Controls: self.pm = pm if self.pm is None: self.pm = messaging.PubMaster(['sendcan', 'controlsState', 'carState', - 'carControl', 'carEvents', 'carParams']) + 'carControl', 'carEvents', 'carParams', 'controlsStateExt']) self.camera_packets = ["roadCameraState", "driverCameraState", "wideRoadCameraState"] + self.dp_device_dm_unavailable_once = False + if dp_device_dm_unavailable: + self.dp_device_dm_unavailable_once = True + self.camera_packets.remove("driverCameraState") self.can_sock = can_sock if can_sock is None: @@ -78,16 +88,21 @@ class Controls: self.log_sock = messaging.sub_sock('androidLog') self.params = Params() - self.dp_alka = self.params.get_bool("dp_alka") + self._dp_alka = self.params.get_bool("dp_alka") + self._dp_alka_active = True + self._dp_alka_trigger_count = 0 + self._dp_alka_btn_block_frame = 0 self.dp_device_disable_temp_check = self.params.get_bool("dp_device_disable_temp_check") self.sm = sm if self.sm is None: ignore = ['testJoystick'] if SIMULATION: ignore += ['driverCameraState', 'managerState'] + if dp_device_dm_unavailable: + ignore += ['driverMonitoringState'] self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration', 'driverMonitoringState', 'longitudinalPlan', 'lateralPlan', 'liveLocationKalman', - 'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters', 'testJoystick'] + self.camera_packets, + 'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters', 'testJoystick', 'longitudinalPlanExt'] + self.camera_packets, ignore_alive=ignore, ignore_avg_freq=['radarState', 'testJoystick']) if CI is None: @@ -109,7 +124,7 @@ class Controls: if not self.disengage_on_accelerator: self.CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.DISABLE_DISENGAGE_ON_GAS - if self.dp_alka: + if self._dp_alka: self.CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.ALKA # read params @@ -236,6 +251,25 @@ class Controls: if self.read_only: return + # ALKA combination + if self._dp_alka and CS.brakePressed: + # rick - allow ALKA to be enabled/disabled when brake + main pressed twice in 0.5 secs + if self.CP.pcmCruise and CS.cruiseState.available != self.CS_prev.cruiseState.available: + self._dp_alka_trigger_count += 1 + if self._dp_alka_trigger_count == 2: + self._dp_alka_active = not self._dp_alka_active + if self.sm.frame % 50 == 0: + self._dp_alka_trigger_count = 0 + + # rick - allow ALKA to be enabled/disabled when brake + set is pressed + # some HKGs doesnt have main buttons like other cars (e.g. EV6) + if not self.CP.pcmCruise and self._dp_alka_btn_block_frame < self.sm.frame: + # set/- is pressed + if any(be.type in (ButtonType.decelCruise, ButtonType.setCruise) for be in CS.buttonEvents): + self._dp_alka_active = not self._dp_alka_active + # block activity for a sec + self._dp_alka_btn_block_frame = self.sm.frame + 100 + # Block resume if cruise never previously enabled resume_pressed = any(be.type in (ButtonType.accelCruise, ButtonType.resumeCruise) for be in CS.buttonEvents) if not self.CP.pcmCruise and not self.v_cruise_helper.v_cruise_initialized and resume_pressed: @@ -253,7 +287,7 @@ class Controls: if CS.gasPressed: self.events.add(EventName.gasPressedOverride) - if not self.CP.notCar: + if not dp_device_dm_unavailable and not self.CP.notCar: self.events.add_from_msg(self.sm['driverMonitoringState'].events) # Add car events, ignore if CAN isn't valid @@ -341,6 +375,9 @@ class Controls: if not SIMULATION and not self.rk.lagging: if not self.sm.all_alive(self.camera_packets): self.events.add(EventName.cameraMalfunction) + if not self.dp_device_dm_unavailable_once and not self.sm.all_alive(['driverCameraState']): + self.dp_device_dm_unavailable_once = True + self.params.put_bool("dp_device_dm_unavailable", True) elif not self.sm.all_freq_ok(self.camera_packets): self.events.add(EventName.cameraFrameRate) if not REPLAY and self.rk.lagging: @@ -591,7 +628,7 @@ class Controls: (not standstill or self.joystick_mode) CC.longActive = self.enabled and not self.events.any(ET.OVERRIDE_LONGITUDINAL) and self.CP.openpilotLongitudinalControl - if self.dp_alka and not standstill and CS.cruiseState.available: + if self._dp_alka_active and not standstill and CS.cruiseState.available: if self.sm['liveCalibration'].calStatus != log.LiveCalibrationData.Status.calibrated: pass elif CS.steerFaultTemporary or CS.steerFaultPermanent: @@ -767,7 +804,7 @@ class Controls: else: self.steer_limited = abs(CC.actuators.steer - CC.actuatorsOutput.steer) > 1e-2 - force_decel = (self.sm['driverMonitoringState'].awarenessStatus < 0.) or \ + force_decel = (not dp_device_dm_unavailable and self.sm['driverMonitoringState'].awarenessStatus < 0.) or \ (self.state == State.softDisabling) # Curvature & Steering angle @@ -825,6 +862,14 @@ class Controls: self.pm.send('controlsState', dat) + # controlsStateExt + dat = messaging.new_message('controlsStateExt') + dat.valid = CS.canValid + controlsStateExt = dat.controlsStateExt + controlsStateExt.alkaActive = self._dp_alka_active + controlsStateExt.alkaEnabled = self._dp_alka + self.pm.send('controlsStateExt', dat) + # carState car_events = self.events.to_msg() cs_send = messaging.new_message('carState') @@ -860,7 +905,12 @@ class Controls: self.prof.checkpoint("Ratekeeper", ignore=True) self.is_metric = self.params.get_bool("IsMetric") - self.experimental_mode = self.params.get_bool("ExperimentalMode") and self.CP.openpilotLongitudinalControl + self.dynamic_endtoend_controller = self.params.get_bool("dp_long_de2e") + if self.CP.openpilotLongitudinalControl: + if self.dynamic_endtoend_controller: + self.experimental_mode = self.sm['longitudinalPlanExt'].dpE2EIsBlended + else: + self.experimental_mode = self.params.get_bool("ExperimentalMode") # Sample data from sockets and get a carState CS = self.data_sample() diff --git a/selfdrive/controls/lib/accel_controller.py b/selfdrive/controls/lib/accel_controller.py index cf58f0ab7..d9b0beaee 100644 --- a/selfdrive/controls/lib/accel_controller.py +++ b/selfdrive/controls/lib/accel_controller.py @@ -1,5 +1,4 @@ from common.numpy_fast import interp -from common.params import Params DP_ACCEL_STOCK = 0 DP_ACCEL_ECO = 1 @@ -23,20 +22,20 @@ _DP_CRUISE_MAX_BP = [0., 3, 6., 8., 11., 15., 20., 25., 30., 55.] class AccelController: def __init__(self): - self._params = Params() - self._dp_long_accel_profile = DP_ACCEL_STOCK + # self._params = Params() + self._profile = DP_ACCEL_STOCK - def read_params(self): + def set_profile(self, profile): try: - self._dp_long_accel_profile = int(self._params.get("dp_long_accel_profile", encoding='utf-8')) - except (KeyError, TypeError, ValueError): - self._dp_long_accel_profile = DP_ACCEL_STOCK + self._profile = int(profile) if int(profile) in [DP_ACCEL_STOCK, DP_ACCEL_ECO, DP_ACCEL_NORMAL, DP_ACCEL_SPORT] else DP_ACCEL_STOCK + except: + self._profile = DP_ACCEL_STOCK def _dp_calc_cruise_accel_limits(self, v_ego): - if self._dp_long_accel_profile == DP_ACCEL_ECO: + if self._profile == DP_ACCEL_ECO: a_cruise_min = interp(v_ego, _DP_CRUISE_MIN_BP, _DP_CRUISE_MIN_V_ECO) a_cruise_max = interp(v_ego, _DP_CRUISE_MAX_BP, _DP_CRUISE_MAX_V_ECO) - elif self._dp_long_accel_profile == DP_ACCEL_SPORT: + elif self._profile == DP_ACCEL_SPORT: a_cruise_min = interp(v_ego, _DP_CRUISE_MIN_BP, _DP_CRUISE_MIN_V_SPORT) a_cruise_max = interp(v_ego, _DP_CRUISE_MAX_BP, _DP_CRUISE_MAX_V_SPORT) else: @@ -45,4 +44,4 @@ class AccelController: return a_cruise_min, a_cruise_max def get_accel_limits(self, v_ego, accel_limits): - return accel_limits if self._dp_long_accel_profile == DP_ACCEL_STOCK else self._dp_calc_cruise_accel_limits(v_ego) + return accel_limits if self._profile == DP_ACCEL_STOCK else self._dp_calc_cruise_accel_limits(v_ego) diff --git a/selfdrive/controls/lib/drive_helpers.py b/selfdrive/controls/lib/drive_helpers.py index b7fd05893..df812c608 100644 --- a/selfdrive/controls/lib/drive_helpers.py +++ b/selfdrive/controls/lib/drive_helpers.py @@ -13,7 +13,7 @@ V_CRUISE_MIN = 8 V_CRUISE_MAX = 145 V_CRUISE_UNSET = 255 V_CRUISE_INITIAL = 40 -V_CRUISE_INITIAL_EXPERIMENTAL_MODE = 105 +V_CRUISE_INITIAL_EXPERIMENTAL_MODE = 55 IMPERIAL_INCREMENT = 1.6 # should be CV.MPH_TO_KPH, but this causes rounding errors MIN_SPEED = 1.0 diff --git a/selfdrive/controls/lib/dynamic_endtoend_controller.py b/selfdrive/controls/lib/dynamic_endtoend_controller.py index a41234e65..0460b96b1 100644 --- a/selfdrive/controls/lib/dynamic_endtoend_controller.py +++ b/selfdrive/controls/lib/dynamic_endtoend_controller.py @@ -11,8 +11,8 @@ _DP_E2E_STOP_DIST = [10, 30., 50., 70., 80., 90., 120.] _DP_E2E_STOP_COUNT = 3 _DP_E2E_SNG_COUNT = 3 -_DP_E2E_SNG_ACC_COUNT = 5 -_DP_E2E_SWAP_COUNT = 10 +_DP_E2E_SNG_ACC_COUNT = 3 +_DP_E2E_SWAP_COUNT = 5 _DP_E2E_TF_COUNT = 5 @@ -21,8 +21,8 @@ class DynamicEndtoEndController: def __init__(self): self._params = Params() - self._dp_long_de2e = False - self._mode = 'blended' + self._is_enabled = False + self._mode = 'acc' # conditional e2e self.dp_e2e_has_lead = False @@ -36,11 +36,6 @@ class DynamicEndtoEndController: self.dp_e2e_tf_count = 0 pass - def read_params(self): - self._dp_long_de2e = self._params.get_bool('dp_long_de2e') - pass - - def _set_dp_e2e_mode(self, mode, force=False): if force: self.dp_e2e_swap_count = 0 @@ -57,7 +52,6 @@ class DynamicEndtoEndController: if self.dp_e2e_swap_count >= _DP_E2E_SWAP_COUNT: self._mode = mode - def _process_conditional_e2e(self, radar_unavailable, car_state, lead_one, md): v_ego_kph = car_state.vEgo * 3.6 @@ -91,20 +85,16 @@ class DynamicEndtoEndController: # when we see a lead # voacc cars only if radar_unavailable and self.dp_e2e_has_lead: - ttc = lead_one.dRel / lead_one.vRel - if ttc <= interp(car_state.vEgo, [0., 22.2, 25.], [.85, 1., 1.22]): + if lead_one.dRel <= car_state.vEgo * 1.22: self.dp_e2e_tf_count += 1 else: self.dp_e2e_tf_count = 0 if self.dp_e2e_tf_count > _DP_E2E_TF_COUNT: return self._set_dp_e2e_mode('blended', True) - # stop sign detection - if abs(car_state.steeringAngleDeg) <= 60 and len(md.orientation.x) == len(md.position.x) == TRAJECTORY_SIZE: - if md.position.x[TRAJECTORY_SIZE - 1] < interp(v_ego_kph, _DP_E2E_STOP_BP, _DP_E2E_STOP_DIST): - self.dp_e2e_stop_count += 1 - else: - self.dp_e2e_stop_count = 0 + # slow down detection + if len(md.orientation.x) == len(md.position.x) == TRAJECTORY_SIZE and md.position.x[TRAJECTORY_SIZE - 1] < interp(v_ego_kph, _DP_E2E_STOP_BP, _DP_E2E_STOP_DIST): + self.dp_e2e_stop_count += 1 else: self.dp_e2e_stop_count = 0 @@ -113,11 +103,15 @@ class DynamicEndtoEndController: return self._set_dp_e2e_mode('acc') - def set_mpc_mode(self, mode, radar_unavailable, car_state, lead_one, md): - if not self._dp_long_de2e: - return 'blended' - + def get_mpc_mode(self, mode, radar_unavailable, car_state, lead_one, md): self._mode = mode - self._process_conditional_e2e(radar_unavailable, car_state, lead_one, md) + if self._is_enabled: + self._process_conditional_e2e(radar_unavailable, car_state, lead_one, md) + return self._mode + def set_enabled(self, enabled): + self._is_enabled = enabled + + def is_enabled(self): + return self._is_enabled diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index 34ee744c1..248710034 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -554,7 +554,7 @@ EVENTS: Dict[int, Dict[str, Union[Alert, AlertCallbackType]]] = { _("Take Control"), _("Turn Exceeds Steering Limit"), AlertStatus.userPrompt, AlertSize.mid, - Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 1.), + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.), }, # Thrown when the fan is driven at >50% but is not rotating diff --git a/selfdrive/controls/lib/lateral_planner.py b/selfdrive/controls/lib/lateral_planner.py index e817b5b71..d2822df8c 100644 --- a/selfdrive/controls/lib/lateral_planner.py +++ b/selfdrive/controls/lib/lateral_planner.py @@ -37,7 +37,7 @@ class LateralPlanner: self._dp_lat_lane_priority_mode_active_prev = False self.LP = LanePlanner() # dp // mapd - for vision turn controller - self.d_path_w_lines_xyz = np.zeros((TRAJECTORY_SIZE, 3)) + self._d_path_w_lines_xyz = np.zeros((TRAJECTORY_SIZE, 3)) # Vehicle model parameters used to calculate lateral movement of car self.factor1 = CP.wheelbase - CP.centerToFront @@ -97,7 +97,7 @@ class LateralPlanner: self.DH.update(sm['carState'], sm['carControl'].latActive, lane_change_prob) path_xyz = self._get_laneless_laneline_d_path_xyz() if self._dp_lat_lane_priority_mode else self.path_xyz - self.d_path_w_lines_xyz = path_xyz + self._d_path_w_lines_xyz = path_xyz self.lat_mpc.set_weights(PATH_COST, LATERAL_MOTION_COST, LATERAL_ACCEL_COST, LATERAL_JERK_COST, @@ -171,8 +171,8 @@ class LateralPlanner: plan_ext_send = messaging.new_message('lateralPlanExt') lateralPlanExt = plan_ext_send.lateralPlanExt - lateralPlanExt.dPathWLinesX = [float(x) for x in self.d_path_w_lines_xyz[:, 0]] - lateralPlanExt.dPathWLinesY = [float(y) for y in self.d_path_w_lines_xyz[:, 1]] + lateralPlanExt.dPathWLinesX = [float(x) for x in self._d_path_w_lines_xyz[:, 0]] + lateralPlanExt.dPathWLinesY = [float(y) for y in self._d_path_w_lines_xyz[:, 1]] pm.send('lateralPlanExt', plan_ext_send) diff --git a/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py b/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py index 828e28a29..6d23d736e 100644 --- a/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py +++ b/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py @@ -7,6 +7,7 @@ from common.numpy_fast import clip from system.swaglog import cloudlog # WARNING: imports outside of constants will not trigger a rebuild from selfdrive.modeld.constants import index_function +from selfdrive.car.interfaces import ACCEL_MIN from selfdrive.controls.radard import _LEAD_ACCEL_TAU if __name__ == '__main__': # generating code @@ -52,8 +53,6 @@ T_IDXS_LST = [index_function(idx, max_val=MAX_T, max_idx=N) for idx in range(N+1 T_IDXS = np.array(T_IDXS_LST) FCW_IDXS = T_IDXS < 5.0 T_DIFFS = np.diff(T_IDXS, prepend=[0.]) -MIN_ACCEL = -3.5 -MAX_ACCEL = 2.0 COMFORT_BRAKE = 2.5 STOP_DISTANCE = 6.0 @@ -80,13 +79,13 @@ def get_T_FOLLOW(personality=log.LongitudinalPersonality.standard): def get_dynamic_follow(v_ego, personality=log.LongitudinalPersonality.standard): if personality==log.LongitudinalPersonality.relaxed: - x_vel = [0, 11, 13, 15, 25, 40] + x_vel = [0, 3.05, 3.61, 4.16, 7.14, 11.11] y_dist = [1.75, 1.75, 1.77, 1.75, 1.8, 1.8] elif personality==log.LongitudinalPersonality.standard: - x_vel = [0, 11, 13, 15, 25, 40] + x_vel = [0, 3.05, 3.61, 4.16, 7.14, 11.11] y_dist = [1.5, 1.5, 1.51, 1.5, 1.5, 1.45] elif personality==log.LongitudinalPersonality.aggressive: - x_vel = [0, 11, 13, 15, 25, 40] + x_vel = [0, 3.05, 3.61, 4.16, 7.14, 11.11] y_dist = [1.12, 1.12, 1.13, 1.12, 1.22, 1.22] else: raise NotImplementedError("Dynamic Follow personality not supported") @@ -330,7 +329,7 @@ class LongitudinalMpc: # MPC will not converge if immediate crash is expected # Clip lead distance to what is still possible to brake for - min_x_lead = ((v_ego + v_lead)/2) * (v_ego - v_lead) / (-MIN_ACCEL * 2) + min_x_lead = ((v_ego + v_lead)/2) * (v_ego - v_lead) / (-ACCEL_MIN * 2) x_lead = clip(x_lead, min_x_lead, 1e8) v_lead = clip(v_lead, 0.0, 1e8) a_lead = clip(a_lead, -10., 5.) @@ -359,7 +358,7 @@ class LongitudinalMpc: lead_0_obstacle = lead_xv_0[:,0] + get_stopped_equivalence_factor(lead_xv_0[:,1]) lead_1_obstacle = lead_xv_1[:,0] + get_stopped_equivalence_factor(lead_xv_1[:,1]) - self.params[:,0] = MIN_ACCEL + self.params[:,0] = ACCEL_MIN self.params[:,1] = self.max_a # Update in ACC mode or ACC/e2e blend diff --git a/selfdrive/controls/lib/longitudinal_planner.py b/selfdrive/controls/lib/longitudinal_planner.py index 248e18748..cbfcbc23b 100755 --- a/selfdrive/controls/lib/longitudinal_planner.py +++ b/selfdrive/controls/lib/longitudinal_planner.py @@ -10,8 +10,9 @@ from common.conversions import Conversions as CV from common.filter_simple import FirstOrderFilter from common.realtime import DT_MDL from selfdrive.modeld.constants import T_IDXS +from selfdrive.car.interfaces import ACCEL_MIN, ACCEL_MAX from selfdrive.controls.lib.longcontrol import LongCtrlState -from selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import LongitudinalMpc, MIN_ACCEL, MAX_ACCEL +from selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import LongitudinalMpc from selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import T_IDXS as T_IDXS_MPC from selfdrive.controls.lib.drive_helpers import V_CRUISE_MAX, CONTROL_N, get_speed_error from system.swaglog import cloudlog @@ -77,6 +78,7 @@ class LongitudinalPlanner: self.read_param() self.personality = log.LongitudinalPersonality.standard self.dp_long_use_df_tune = False + self.dp_long_taco = self.params.get_bool('dp_long_taco') def read_param(self): try: @@ -87,7 +89,7 @@ class LongitudinalPlanner: self.dp_long_use_df_tune = False @staticmethod - def parse_model(model_msg, model_error): + def parse_model(model_msg, model_error, v_ego, taco=False): if (len(model_msg.position.x) == 33 and len(model_msg.velocity.x) == 33 and len(model_msg.acceleration.x) == 33): @@ -100,16 +102,29 @@ class LongitudinalPlanner: v = np.zeros(len(T_IDXS_MPC)) a = np.zeros(len(T_IDXS_MPC)) j = np.zeros(len(T_IDXS_MPC)) + + # rick - taco tune + if taco: + max_lat_accel = interp(v_ego, [5, 10, 20], [1.5, 2.0, 3.0]) + curvatures = np.interp(T_IDXS_MPC, T_IDXS, model_msg.orientationRate.z) / np.clip(v, 0.3, 100.0) + max_v = np.sqrt(max_lat_accel / (np.abs(curvatures) + 1e-3)) - 2.0 + v = np.minimum(max_v, v) return x, v, a, j def update(self, sm): if self.param_read_counter % 50 == 0: self.read_param() - self.accel_controller.read_params() - self.dynamic_endtoend_controller.read_params() + + if self.param_read_counter % 300 == 0: + self.accel_controller.set_profile(self.params.get("dp_long_accel_profile", encoding='utf-8')) + self.vision_turn_controller.set_enabled(self.params.get_bool("dp_mapd_vision_turn_control")) + self.dynamic_endtoend_controller.set_enabled(self.params.get_bool("dp_long_de2e")) + self.param_read_counter += 1 - # self.mpc.mode = 'blended' if sm['controlsState'].experimentalMode else 'acc' - self.mpc.mode = self.dynamic_endtoend_controller.set_mpc_mode(self.mpc.mode, self.CP.radarUnavailable, sm['carState'], sm['radarState'].leadOne, sm['modelV2']) if sm['controlsState'].experimentalMode else 'acc' + if self.dynamic_endtoend_controller.is_enabled(): + self.mpc.mode = self.dynamic_endtoend_controller.get_mpc_mode(self.mpc.mode, self.CP.radarUnavailable, sm['carState'], sm['radarState'].leadOne, sm['modelV2']) + else: + self.mpc.mode = 'blended' if sm['controlsState'].experimentalMode else 'acc' v_ego = sm['carState'].vEgo v_cruise_kph = sm['controlsState'].vCruise @@ -129,8 +144,8 @@ class LongitudinalPlanner: accel_limits = [A_CRUISE_MIN, get_max_accel(v_ego)] accel_limits_turns = limit_accel_in_turns(v_ego, sm['carState'].steeringAngleDeg, accel_limits, self.CP) else: - accel_limits = [MIN_ACCEL, MAX_ACCEL] - accel_limits_turns = [MIN_ACCEL, MAX_ACCEL] + accel_limits = [ACCEL_MIN, ACCEL_MAX] + accel_limits_turns = [ACCEL_MIN, ACCEL_MAX] # dp - override accel using dp_long_accel_profile accel_limits = self.accel_controller.get_accel_limits(v_ego, accel_limits) @@ -157,7 +172,7 @@ class LongitudinalPlanner: self.mpc.set_weights(prev_accel_constraint, personality=self.personality) self.mpc.set_accel_limits(accel_limits_turns[0], accel_limits_turns[1]) self.mpc.set_cur_state(self.v_desired_filter.x, self.a_desired) - x, v, a, j = self.parse_model(sm['modelV2'], self.v_model_error) + x, v, a, j = self.parse_model(sm['modelV2'], self.v_model_error, v_ego, taco=self.dp_long_taco) self.mpc.update(sm['radarState'], v_cruise_sol, x, v, a, j, personality=self.personality, use_df_tune=self.dp_long_use_df_tune) self.v_desired_trajectory_full = np.interp(T_IDXS, T_IDXS_MPC, self.mpc.v_solution) @@ -218,6 +233,7 @@ class LongitudinalPlanner: longitudinalPlanExt.turnSign = int(self.turn_speed_controller.turn_sign) longitudinalPlanExt.dpE2EIsBlended = self.mpc.mode == 'blended' + longitudinalPlanExt.de2eIsEnabled = self.dynamic_endtoend_controller.is_enabled() longitudinalPlanExt.longitudinalPlanExtSource = self.mpc.source if self.mpc.source != 'cruise' else self.cruise_source pm.send('longitudinalPlanExt', plan_ext_send) diff --git a/selfdrive/controls/lib/vision_turn_controller.py b/selfdrive/controls/lib/vision_turn_controller.py index 2ec1720ad..d818f8708 100644 --- a/selfdrive/controls/lib/vision_turn_controller.py +++ b/selfdrive/controls/lib/vision_turn_controller.py @@ -2,7 +2,7 @@ import numpy as np import math from cereal import custom from common.numpy_fast import interp -from common.params import Params +# from common.params import Params # from common.realtime import sec_since_boot from common.conversions import Conversions as CV # from selfdrive.controls.lib.lane_planner import TRAJECTORY_SIZE @@ -94,11 +94,11 @@ def _description_for_state(turn_controller_state): class VisionTurnController(): def __init__(self, CP): - self._params = Params() + # self._params = Params() self._CP = CP self._op_enabled = False self._gas_pressed = False - self._is_enabled = self._params.get_bool("dp_mapd") and self._params.get_bool("dp_mapd_turn_vision_control") + self._is_enabled = False self._last_params_update = 0. self._v_cruise_setpoint = 0. self._v_ego = 0. @@ -144,12 +144,6 @@ class VisionTurnController(): self._v_overshoot_distance = 200. self._lat_acc_overshoot_ahead = False - # def _update_params(self): - # time = sec_since_boot() - # if time > self._last_params_update + 5.0: - # self._is_enabled = True #self._params.get_bool("TurnVisionControl") - # self._last_params_update = time - def _update_calculations(self, sm): # Get path polynomial aproximation for curvature estimation from model data. path_poly = None @@ -293,3 +287,6 @@ class VisionTurnController(): self._update_calculations(sm) self._state_transition() self._update_solution() + + def set_enabled(self, enabled): + self._is_enabled = enabled diff --git a/selfdrive/locationd/locationd b/selfdrive/locationd/locationd index 299d98ad5..9d4cf160c 100755 Binary files a/selfdrive/locationd/locationd and b/selfdrive/locationd/locationd differ diff --git a/selfdrive/locationd/models/generated/car.cpp b/selfdrive/locationd/models/generated/car.cpp index 568efa45e..d1f217881 100644 --- a/selfdrive/locationd/models/generated/car.cpp +++ b/selfdrive/locationd/models/generated/car.cpp @@ -45,326 +45,326 @@ const static double MAHA_THRESH_31 = 3.8414588206941227; * * * This file is part of 'ekf' * ******************************************************************************/ -void err_fun(double *nom_x, double *delta_x, double *out_3028736888961783120) { - out_3028736888961783120[0] = delta_x[0] + nom_x[0]; - out_3028736888961783120[1] = delta_x[1] + nom_x[1]; - out_3028736888961783120[2] = delta_x[2] + nom_x[2]; - out_3028736888961783120[3] = delta_x[3] + nom_x[3]; - out_3028736888961783120[4] = delta_x[4] + nom_x[4]; - out_3028736888961783120[5] = delta_x[5] + nom_x[5]; - out_3028736888961783120[6] = delta_x[6] + nom_x[6]; - out_3028736888961783120[7] = delta_x[7] + nom_x[7]; - out_3028736888961783120[8] = delta_x[8] + nom_x[8]; +void err_fun(double *nom_x, double *delta_x, double *out_4904502417690011868) { + out_4904502417690011868[0] = delta_x[0] + nom_x[0]; + out_4904502417690011868[1] = delta_x[1] + nom_x[1]; + out_4904502417690011868[2] = delta_x[2] + nom_x[2]; + out_4904502417690011868[3] = delta_x[3] + nom_x[3]; + out_4904502417690011868[4] = delta_x[4] + nom_x[4]; + out_4904502417690011868[5] = delta_x[5] + nom_x[5]; + out_4904502417690011868[6] = delta_x[6] + nom_x[6]; + out_4904502417690011868[7] = delta_x[7] + nom_x[7]; + out_4904502417690011868[8] = delta_x[8] + nom_x[8]; } -void inv_err_fun(double *nom_x, double *true_x, double *out_3218082572571671239) { - out_3218082572571671239[0] = -nom_x[0] + true_x[0]; - out_3218082572571671239[1] = -nom_x[1] + true_x[1]; - out_3218082572571671239[2] = -nom_x[2] + true_x[2]; - out_3218082572571671239[3] = -nom_x[3] + true_x[3]; - out_3218082572571671239[4] = -nom_x[4] + true_x[4]; - out_3218082572571671239[5] = -nom_x[5] + true_x[5]; - out_3218082572571671239[6] = -nom_x[6] + true_x[6]; - out_3218082572571671239[7] = -nom_x[7] + true_x[7]; - out_3218082572571671239[8] = -nom_x[8] + true_x[8]; +void inv_err_fun(double *nom_x, double *true_x, double *out_2523710226769313624) { + out_2523710226769313624[0] = -nom_x[0] + true_x[0]; + out_2523710226769313624[1] = -nom_x[1] + true_x[1]; + out_2523710226769313624[2] = -nom_x[2] + true_x[2]; + out_2523710226769313624[3] = -nom_x[3] + true_x[3]; + out_2523710226769313624[4] = -nom_x[4] + true_x[4]; + out_2523710226769313624[5] = -nom_x[5] + true_x[5]; + out_2523710226769313624[6] = -nom_x[6] + true_x[6]; + out_2523710226769313624[7] = -nom_x[7] + true_x[7]; + out_2523710226769313624[8] = -nom_x[8] + true_x[8]; } -void H_mod_fun(double *state, double *out_1114876351103919435) { - out_1114876351103919435[0] = 1.0; - out_1114876351103919435[1] = 0; - out_1114876351103919435[2] = 0; - out_1114876351103919435[3] = 0; - out_1114876351103919435[4] = 0; - out_1114876351103919435[5] = 0; - out_1114876351103919435[6] = 0; - out_1114876351103919435[7] = 0; - out_1114876351103919435[8] = 0; - out_1114876351103919435[9] = 0; - out_1114876351103919435[10] = 1.0; - out_1114876351103919435[11] = 0; - out_1114876351103919435[12] = 0; - out_1114876351103919435[13] = 0; - out_1114876351103919435[14] = 0; - out_1114876351103919435[15] = 0; - out_1114876351103919435[16] = 0; - out_1114876351103919435[17] = 0; - out_1114876351103919435[18] = 0; - out_1114876351103919435[19] = 0; - out_1114876351103919435[20] = 1.0; - out_1114876351103919435[21] = 0; - out_1114876351103919435[22] = 0; - out_1114876351103919435[23] = 0; - out_1114876351103919435[24] = 0; - out_1114876351103919435[25] = 0; - out_1114876351103919435[26] = 0; - out_1114876351103919435[27] = 0; - out_1114876351103919435[28] = 0; - out_1114876351103919435[29] = 0; - out_1114876351103919435[30] = 1.0; - out_1114876351103919435[31] = 0; - out_1114876351103919435[32] = 0; - out_1114876351103919435[33] = 0; - out_1114876351103919435[34] = 0; - out_1114876351103919435[35] = 0; - out_1114876351103919435[36] = 0; - out_1114876351103919435[37] = 0; - out_1114876351103919435[38] = 0; - out_1114876351103919435[39] = 0; - out_1114876351103919435[40] = 1.0; - out_1114876351103919435[41] = 0; - out_1114876351103919435[42] = 0; - out_1114876351103919435[43] = 0; - out_1114876351103919435[44] = 0; - out_1114876351103919435[45] = 0; - out_1114876351103919435[46] = 0; - out_1114876351103919435[47] = 0; - out_1114876351103919435[48] = 0; - out_1114876351103919435[49] = 0; - out_1114876351103919435[50] = 1.0; - out_1114876351103919435[51] = 0; - out_1114876351103919435[52] = 0; - out_1114876351103919435[53] = 0; - out_1114876351103919435[54] = 0; - out_1114876351103919435[55] = 0; - out_1114876351103919435[56] = 0; - out_1114876351103919435[57] = 0; - out_1114876351103919435[58] = 0; - out_1114876351103919435[59] = 0; - out_1114876351103919435[60] = 1.0; - out_1114876351103919435[61] = 0; - out_1114876351103919435[62] = 0; - out_1114876351103919435[63] = 0; - out_1114876351103919435[64] = 0; - out_1114876351103919435[65] = 0; - out_1114876351103919435[66] = 0; - out_1114876351103919435[67] = 0; - out_1114876351103919435[68] = 0; - out_1114876351103919435[69] = 0; - out_1114876351103919435[70] = 1.0; - out_1114876351103919435[71] = 0; - out_1114876351103919435[72] = 0; - out_1114876351103919435[73] = 0; - out_1114876351103919435[74] = 0; - out_1114876351103919435[75] = 0; - out_1114876351103919435[76] = 0; - out_1114876351103919435[77] = 0; - out_1114876351103919435[78] = 0; - out_1114876351103919435[79] = 0; - out_1114876351103919435[80] = 1.0; +void H_mod_fun(double *state, double *out_2102495077234161738) { + out_2102495077234161738[0] = 1.0; + out_2102495077234161738[1] = 0; + out_2102495077234161738[2] = 0; + out_2102495077234161738[3] = 0; + out_2102495077234161738[4] = 0; + out_2102495077234161738[5] = 0; + out_2102495077234161738[6] = 0; + out_2102495077234161738[7] = 0; + out_2102495077234161738[8] = 0; + out_2102495077234161738[9] = 0; + out_2102495077234161738[10] = 1.0; + out_2102495077234161738[11] = 0; + out_2102495077234161738[12] = 0; + out_2102495077234161738[13] = 0; + out_2102495077234161738[14] = 0; + out_2102495077234161738[15] = 0; + out_2102495077234161738[16] = 0; + out_2102495077234161738[17] = 0; + out_2102495077234161738[18] = 0; + out_2102495077234161738[19] = 0; + out_2102495077234161738[20] = 1.0; + out_2102495077234161738[21] = 0; + out_2102495077234161738[22] = 0; + out_2102495077234161738[23] = 0; + out_2102495077234161738[24] = 0; + out_2102495077234161738[25] = 0; + out_2102495077234161738[26] = 0; + out_2102495077234161738[27] = 0; + out_2102495077234161738[28] = 0; + out_2102495077234161738[29] = 0; + out_2102495077234161738[30] = 1.0; + out_2102495077234161738[31] = 0; + out_2102495077234161738[32] = 0; + out_2102495077234161738[33] = 0; + out_2102495077234161738[34] = 0; + out_2102495077234161738[35] = 0; + out_2102495077234161738[36] = 0; + out_2102495077234161738[37] = 0; + out_2102495077234161738[38] = 0; + out_2102495077234161738[39] = 0; + out_2102495077234161738[40] = 1.0; + out_2102495077234161738[41] = 0; + out_2102495077234161738[42] = 0; + out_2102495077234161738[43] = 0; + out_2102495077234161738[44] = 0; + out_2102495077234161738[45] = 0; + out_2102495077234161738[46] = 0; + out_2102495077234161738[47] = 0; + out_2102495077234161738[48] = 0; + out_2102495077234161738[49] = 0; + out_2102495077234161738[50] = 1.0; + out_2102495077234161738[51] = 0; + out_2102495077234161738[52] = 0; + out_2102495077234161738[53] = 0; + out_2102495077234161738[54] = 0; + out_2102495077234161738[55] = 0; + out_2102495077234161738[56] = 0; + out_2102495077234161738[57] = 0; + out_2102495077234161738[58] = 0; + out_2102495077234161738[59] = 0; + out_2102495077234161738[60] = 1.0; + out_2102495077234161738[61] = 0; + out_2102495077234161738[62] = 0; + out_2102495077234161738[63] = 0; + out_2102495077234161738[64] = 0; + out_2102495077234161738[65] = 0; + out_2102495077234161738[66] = 0; + out_2102495077234161738[67] = 0; + out_2102495077234161738[68] = 0; + out_2102495077234161738[69] = 0; + out_2102495077234161738[70] = 1.0; + out_2102495077234161738[71] = 0; + out_2102495077234161738[72] = 0; + out_2102495077234161738[73] = 0; + out_2102495077234161738[74] = 0; + out_2102495077234161738[75] = 0; + out_2102495077234161738[76] = 0; + out_2102495077234161738[77] = 0; + out_2102495077234161738[78] = 0; + out_2102495077234161738[79] = 0; + out_2102495077234161738[80] = 1.0; } -void f_fun(double *state, double dt, double *out_6826993337149264426) { - out_6826993337149264426[0] = state[0]; - out_6826993337149264426[1] = state[1]; - out_6826993337149264426[2] = state[2]; - out_6826993337149264426[3] = state[3]; - out_6826993337149264426[4] = state[4]; - out_6826993337149264426[5] = dt*((-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]))*state[6] - 9.8000000000000007*state[8] + stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*state[1]) + (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*state[4])) + state[5]; - out_6826993337149264426[6] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*state[4])) + state[6]; - out_6826993337149264426[7] = state[7]; - out_6826993337149264426[8] = state[8]; +void f_fun(double *state, double dt, double *out_2902792789409424078) { + out_2902792789409424078[0] = state[0]; + out_2902792789409424078[1] = state[1]; + out_2902792789409424078[2] = state[2]; + out_2902792789409424078[3] = state[3]; + out_2902792789409424078[4] = state[4]; + out_2902792789409424078[5] = dt*((-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]))*state[6] - 9.8000000000000007*state[8] + stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*state[1]) + (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*state[4])) + state[5]; + out_2902792789409424078[6] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*state[4])) + state[6]; + out_2902792789409424078[7] = state[7]; + out_2902792789409424078[8] = state[8]; } -void F_fun(double *state, double dt, double *out_5391441206083204607) { - out_5391441206083204607[0] = 1; - out_5391441206083204607[1] = 0; - out_5391441206083204607[2] = 0; - out_5391441206083204607[3] = 0; - out_5391441206083204607[4] = 0; - out_5391441206083204607[5] = 0; - out_5391441206083204607[6] = 0; - out_5391441206083204607[7] = 0; - out_5391441206083204607[8] = 0; - out_5391441206083204607[9] = 0; - out_5391441206083204607[10] = 1; - out_5391441206083204607[11] = 0; - out_5391441206083204607[12] = 0; - out_5391441206083204607[13] = 0; - out_5391441206083204607[14] = 0; - out_5391441206083204607[15] = 0; - out_5391441206083204607[16] = 0; - out_5391441206083204607[17] = 0; - out_5391441206083204607[18] = 0; - out_5391441206083204607[19] = 0; - out_5391441206083204607[20] = 1; - out_5391441206083204607[21] = 0; - out_5391441206083204607[22] = 0; - out_5391441206083204607[23] = 0; - out_5391441206083204607[24] = 0; - out_5391441206083204607[25] = 0; - out_5391441206083204607[26] = 0; - out_5391441206083204607[27] = 0; - out_5391441206083204607[28] = 0; - out_5391441206083204607[29] = 0; - out_5391441206083204607[30] = 1; - out_5391441206083204607[31] = 0; - out_5391441206083204607[32] = 0; - out_5391441206083204607[33] = 0; - out_5391441206083204607[34] = 0; - out_5391441206083204607[35] = 0; - out_5391441206083204607[36] = 0; - out_5391441206083204607[37] = 0; - out_5391441206083204607[38] = 0; - out_5391441206083204607[39] = 0; - out_5391441206083204607[40] = 1; - out_5391441206083204607[41] = 0; - out_5391441206083204607[42] = 0; - out_5391441206083204607[43] = 0; - out_5391441206083204607[44] = 0; - out_5391441206083204607[45] = dt*(stiffness_front*(-state[2] - state[3] + state[7])/(mass*state[1]) + (-stiffness_front - stiffness_rear)*state[5]/(mass*state[4]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[6]/(mass*state[4])); - out_5391441206083204607[46] = -dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*pow(state[1], 2)); - out_5391441206083204607[47] = -dt*stiffness_front*state[0]/(mass*state[1]); - out_5391441206083204607[48] = -dt*stiffness_front*state[0]/(mass*state[1]); - out_5391441206083204607[49] = dt*((-1 - (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*pow(state[4], 2)))*state[6] - (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*pow(state[4], 2))); - out_5391441206083204607[50] = dt*(-stiffness_front*state[0] - stiffness_rear*state[0])/(mass*state[4]) + 1; - out_5391441206083204607[51] = dt*(-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4])); - out_5391441206083204607[52] = dt*stiffness_front*state[0]/(mass*state[1]); - out_5391441206083204607[53] = -9.8000000000000007*dt; - out_5391441206083204607[54] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front - pow(center_to_rear, 2)*stiffness_rear)*state[6]/(rotational_inertia*state[4])); - out_5391441206083204607[55] = -center_to_front*dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*pow(state[1], 2)); - out_5391441206083204607[56] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]); - out_5391441206083204607[57] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]); - out_5391441206083204607[58] = dt*(-(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*pow(state[4], 2)) - (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*pow(state[4], 2))); - out_5391441206083204607[59] = dt*(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(rotational_inertia*state[4]); - out_5391441206083204607[60] = dt*(-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])/(rotational_inertia*state[4]) + 1; - out_5391441206083204607[61] = center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]); - out_5391441206083204607[62] = 0; - out_5391441206083204607[63] = 0; - out_5391441206083204607[64] = 0; - out_5391441206083204607[65] = 0; - out_5391441206083204607[66] = 0; - out_5391441206083204607[67] = 0; - out_5391441206083204607[68] = 0; - out_5391441206083204607[69] = 0; - out_5391441206083204607[70] = 1; - out_5391441206083204607[71] = 0; - out_5391441206083204607[72] = 0; - out_5391441206083204607[73] = 0; - out_5391441206083204607[74] = 0; - out_5391441206083204607[75] = 0; - out_5391441206083204607[76] = 0; - out_5391441206083204607[77] = 0; - out_5391441206083204607[78] = 0; - out_5391441206083204607[79] = 0; - out_5391441206083204607[80] = 1; +void F_fun(double *state, double dt, double *out_7384697533201998408) { + out_7384697533201998408[0] = 1; + out_7384697533201998408[1] = 0; + out_7384697533201998408[2] = 0; + out_7384697533201998408[3] = 0; + out_7384697533201998408[4] = 0; + out_7384697533201998408[5] = 0; + out_7384697533201998408[6] = 0; + out_7384697533201998408[7] = 0; + out_7384697533201998408[8] = 0; + out_7384697533201998408[9] = 0; + out_7384697533201998408[10] = 1; + out_7384697533201998408[11] = 0; + out_7384697533201998408[12] = 0; + out_7384697533201998408[13] = 0; + out_7384697533201998408[14] = 0; + out_7384697533201998408[15] = 0; + out_7384697533201998408[16] = 0; + out_7384697533201998408[17] = 0; + out_7384697533201998408[18] = 0; + out_7384697533201998408[19] = 0; + out_7384697533201998408[20] = 1; + out_7384697533201998408[21] = 0; + out_7384697533201998408[22] = 0; + out_7384697533201998408[23] = 0; + out_7384697533201998408[24] = 0; + out_7384697533201998408[25] = 0; + out_7384697533201998408[26] = 0; + out_7384697533201998408[27] = 0; + out_7384697533201998408[28] = 0; + out_7384697533201998408[29] = 0; + out_7384697533201998408[30] = 1; + out_7384697533201998408[31] = 0; + out_7384697533201998408[32] = 0; + out_7384697533201998408[33] = 0; + out_7384697533201998408[34] = 0; + out_7384697533201998408[35] = 0; + out_7384697533201998408[36] = 0; + out_7384697533201998408[37] = 0; + out_7384697533201998408[38] = 0; + out_7384697533201998408[39] = 0; + out_7384697533201998408[40] = 1; + out_7384697533201998408[41] = 0; + out_7384697533201998408[42] = 0; + out_7384697533201998408[43] = 0; + out_7384697533201998408[44] = 0; + out_7384697533201998408[45] = dt*(stiffness_front*(-state[2] - state[3] + state[7])/(mass*state[1]) + (-stiffness_front - stiffness_rear)*state[5]/(mass*state[4]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[6]/(mass*state[4])); + out_7384697533201998408[46] = -dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*pow(state[1], 2)); + out_7384697533201998408[47] = -dt*stiffness_front*state[0]/(mass*state[1]); + out_7384697533201998408[48] = -dt*stiffness_front*state[0]/(mass*state[1]); + out_7384697533201998408[49] = dt*((-1 - (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*pow(state[4], 2)))*state[6] - (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*pow(state[4], 2))); + out_7384697533201998408[50] = dt*(-stiffness_front*state[0] - stiffness_rear*state[0])/(mass*state[4]) + 1; + out_7384697533201998408[51] = dt*(-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4])); + out_7384697533201998408[52] = dt*stiffness_front*state[0]/(mass*state[1]); + out_7384697533201998408[53] = -9.8000000000000007*dt; + out_7384697533201998408[54] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front - pow(center_to_rear, 2)*stiffness_rear)*state[6]/(rotational_inertia*state[4])); + out_7384697533201998408[55] = -center_to_front*dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*pow(state[1], 2)); + out_7384697533201998408[56] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]); + out_7384697533201998408[57] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]); + out_7384697533201998408[58] = dt*(-(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*pow(state[4], 2)) - (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*pow(state[4], 2))); + out_7384697533201998408[59] = dt*(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(rotational_inertia*state[4]); + out_7384697533201998408[60] = dt*(-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])/(rotational_inertia*state[4]) + 1; + out_7384697533201998408[61] = center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]); + out_7384697533201998408[62] = 0; + out_7384697533201998408[63] = 0; + out_7384697533201998408[64] = 0; + out_7384697533201998408[65] = 0; + out_7384697533201998408[66] = 0; + out_7384697533201998408[67] = 0; + out_7384697533201998408[68] = 0; + out_7384697533201998408[69] = 0; + out_7384697533201998408[70] = 1; + out_7384697533201998408[71] = 0; + out_7384697533201998408[72] = 0; + out_7384697533201998408[73] = 0; + out_7384697533201998408[74] = 0; + out_7384697533201998408[75] = 0; + out_7384697533201998408[76] = 0; + out_7384697533201998408[77] = 0; + out_7384697533201998408[78] = 0; + out_7384697533201998408[79] = 0; + out_7384697533201998408[80] = 1; } -void h_25(double *state, double *unused, double *out_3881631893549789208) { - out_3881631893549789208[0] = state[6]; +void h_25(double *state, double *unused, double *out_6076734193594010054) { + out_6076734193594010054[0] = state[6]; } -void H_25(double *state, double *unused, double *out_7267345600465790480) { - out_7267345600465790480[0] = 0; - out_7267345600465790480[1] = 0; - out_7267345600465790480[2] = 0; - out_7267345600465790480[3] = 0; - out_7267345600465790480[4] = 0; - out_7267345600465790480[5] = 0; - out_7267345600465790480[6] = 1; - out_7267345600465790480[7] = 0; - out_7267345600465790480[8] = 0; +void H_25(double *state, double *unused, double *out_8386229354659032627) { + out_8386229354659032627[0] = 0; + out_8386229354659032627[1] = 0; + out_8386229354659032627[2] = 0; + out_8386229354659032627[3] = 0; + out_8386229354659032627[4] = 0; + out_8386229354659032627[5] = 0; + out_8386229354659032627[6] = 1; + out_8386229354659032627[7] = 0; + out_8386229354659032627[8] = 0; } -void h_24(double *state, double *unused, double *out_700870389243627536) { - out_700870389243627536[0] = state[4]; - out_700870389243627536[1] = state[5]; +void h_24(double *state, double *unused, double *out_3849361237634050377) { + out_3849361237634050377[0] = state[4]; + out_3849361237634050377[1] = state[5]; } -void H_24(double *state, double *unused, double *out_5094696001460290914) { - out_5094696001460290914[0] = 0; - out_5094696001460290914[1] = 0; - out_5094696001460290914[2] = 0; - out_5094696001460290914[3] = 0; - out_5094696001460290914[4] = 1; - out_5094696001460290914[5] = 0; - out_5094696001460290914[6] = 0; - out_5094696001460290914[7] = 0; - out_5094696001460290914[8] = 0; - out_5094696001460290914[9] = 0; - out_5094696001460290914[10] = 0; - out_5094696001460290914[11] = 0; - out_5094696001460290914[12] = 0; - out_5094696001460290914[13] = 0; - out_5094696001460290914[14] = 1; - out_5094696001460290914[15] = 0; - out_5094696001460290914[16] = 0; - out_5094696001460290914[17] = 0; +void H_24(double *state, double *unused, double *out_6058802640420010356) { + out_6058802640420010356[0] = 0; + out_6058802640420010356[1] = 0; + out_6058802640420010356[2] = 0; + out_6058802640420010356[3] = 0; + out_6058802640420010356[4] = 1; + out_6058802640420010356[5] = 0; + out_6058802640420010356[6] = 0; + out_6058802640420010356[7] = 0; + out_6058802640420010356[8] = 0; + out_6058802640420010356[9] = 0; + out_6058802640420010356[10] = 0; + out_6058802640420010356[11] = 0; + out_6058802640420010356[12] = 0; + out_6058802640420010356[13] = 0; + out_6058802640420010356[14] = 1; + out_6058802640420010356[15] = 0; + out_6058802640420010356[16] = 0; + out_6058802640420010356[17] = 0; } -void h_30(double *state, double *unused, double *out_6829357883905274169) { - out_6829357883905274169[0] = state[4]; +void h_30(double *state, double *unused, double *out_1686531063226662387) { + out_1686531063226662387[0] = state[4]; } -void H_30(double *state, double *unused, double *out_4262708131752144381) { - out_4262708131752144381[0] = 0; - out_4262708131752144381[1] = 0; - out_4262708131752144381[2] = 0; - out_4262708131752144381[3] = 0; - out_4262708131752144381[4] = 1; - out_4262708131752144381[5] = 0; - out_4262708131752144381[6] = 0; - out_4262708131752144381[7] = 0; - out_4262708131752144381[8] = 0; +void H_30(double *state, double *unused, double *out_3143824377558902234) { + out_3143824377558902234[0] = 0; + out_3143824377558902234[1] = 0; + out_3143824377558902234[2] = 0; + out_3143824377558902234[3] = 0; + out_3143824377558902234[4] = 1; + out_3143824377558902234[5] = 0; + out_3143824377558902234[6] = 0; + out_3143824377558902234[7] = 0; + out_3143824377558902234[8] = 0; } -void h_26(double *state, double *unused, double *out_1827684616244428524) { - out_1827684616244428524[0] = state[7]; +void h_26(double *state, double *unused, double *out_1350254988217670298) { + out_1350254988217670298[0] = state[7]; } -void H_26(double *state, double *unused, double *out_3525842281591734256) { - out_3525842281591734256[0] = 0; - out_3525842281591734256[1] = 0; - out_3525842281591734256[2] = 0; - out_3525842281591734256[3] = 0; - out_3525842281591734256[4] = 0; - out_3525842281591734256[5] = 0; - out_3525842281591734256[6] = 0; - out_3525842281591734256[7] = 1; - out_3525842281591734256[8] = 0; +void H_26(double *state, double *unused, double *out_4644726035784976403) { + out_4644726035784976403[0] = 0; + out_4644726035784976403[1] = 0; + out_4644726035784976403[2] = 0; + out_4644726035784976403[3] = 0; + out_4644726035784976403[4] = 0; + out_4644726035784976403[5] = 0; + out_4644726035784976403[6] = 0; + out_4644726035784976403[7] = 1; + out_4644726035784976403[8] = 0; } -void h_27(double *state, double *unused, double *out_6761232746364086773) { - out_6761232746364086773[0] = state[3]; +void h_27(double *state, double *unused, double *out_4717106662584640226) { + out_4717106662584640226[0] = state[3]; } -void H_27(double *state, double *unused, double *out_6437471443552569292) { - out_6437471443552569292[0] = 0; - out_6437471443552569292[1] = 0; - out_6437471443552569292[2] = 0; - out_6437471443552569292[3] = 1; - out_6437471443552569292[4] = 0; - out_6437471443552569292[5] = 0; - out_6437471443552569292[6] = 0; - out_6437471443552569292[7] = 0; - out_6437471443552569292[8] = 0; +void H_27(double *state, double *unused, double *out_5318587689359327145) { + out_5318587689359327145[0] = 0; + out_5318587689359327145[1] = 0; + out_5318587689359327145[2] = 0; + out_5318587689359327145[3] = 1; + out_5318587689359327145[4] = 0; + out_5318587689359327145[5] = 0; + out_5318587689359327145[6] = 0; + out_5318587689359327145[7] = 0; + out_5318587689359327145[8] = 0; } -void h_29(double *state, double *unused, double *out_6615712922143431802) { - out_6615712922143431802[0] = state[1]; +void h_29(double *state, double *unused, double *out_3506653136026194265) { + out_3506653136026194265[0] = state[1]; } -void H_29(double *state, double *unused, double *out_8150834170422120325) { - out_8150834170422120325[0] = 0; - out_8150834170422120325[1] = 1; - out_8150834170422120325[2] = 0; - out_8150834170422120325[3] = 0; - out_8150834170422120325[4] = 0; - out_8150834170422120325[5] = 0; - out_8150834170422120325[6] = 0; - out_8150834170422120325[7] = 0; - out_8150834170422120325[8] = 0; +void H_29(double *state, double *unused, double *out_2633593033244510050) { + out_2633593033244510050[0] = 0; + out_2633593033244510050[1] = 1; + out_2633593033244510050[2] = 0; + out_2633593033244510050[3] = 0; + out_2633593033244510050[4] = 0; + out_2633593033244510050[5] = 0; + out_2633593033244510050[6] = 0; + out_2633593033244510050[7] = 0; + out_2633593033244510050[8] = 0; } -void h_28(double *state, double *unused, double *out_1759559478703241128) { - out_1759559478703241128[0] = state[0]; +void h_28(double *state, double *unused, double *out_2096438289248014934) { + out_2096438289248014934[0] = state[0]; } -void H_28(double *state, double *unused, double *out_5213510886217900717) { - out_5213510886217900717[0] = 1; - out_5213510886217900717[1] = 0; - out_5213510886217900717[2] = 0; - out_5213510886217900717[3] = 0; - out_5213510886217900717[4] = 0; - out_5213510886217900717[5] = 0; - out_5213510886217900717[6] = 0; - out_5213510886217900717[7] = 0; - out_5213510886217900717[8] = 0; +void H_28(double *state, double *unused, double *out_7715992050314040624) { + out_7715992050314040624[0] = 1; + out_7715992050314040624[1] = 0; + out_7715992050314040624[2] = 0; + out_7715992050314040624[3] = 0; + out_7715992050314040624[4] = 0; + out_7715992050314040624[5] = 0; + out_7715992050314040624[6] = 0; + out_7715992050314040624[7] = 0; + out_7715992050314040624[8] = 0; } -void h_31(double *state, double *unused, double *out_3999640757204259977) { - out_3999640757204259977[0] = state[8]; +void h_31(double *state, double *unused, double *out_3232292595431690380) { + out_3232292595431690380[0] = state[8]; } -void H_31(double *state, double *unused, double *out_7297991562342750908) { - out_7297991562342750908[0] = 0; - out_7297991562342750908[1] = 0; - out_7297991562342750908[2] = 0; - out_7297991562342750908[3] = 0; - out_7297991562342750908[4] = 0; - out_7297991562342750908[5] = 0; - out_7297991562342750908[6] = 0; - out_7297991562342750908[7] = 0; - out_7297991562342750908[8] = 1; +void H_31(double *state, double *unused, double *out_8416875316535993055) { + out_8416875316535993055[0] = 0; + out_8416875316535993055[1] = 0; + out_8416875316535993055[2] = 0; + out_8416875316535993055[3] = 0; + out_8416875316535993055[4] = 0; + out_8416875316535993055[5] = 0; + out_8416875316535993055[6] = 0; + out_8416875316535993055[7] = 0; + out_8416875316535993055[8] = 1; } #include #include @@ -518,68 +518,68 @@ void car_update_28(double *in_x, double *in_P, double *in_z, double *in_R, doubl void car_update_31(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) { update<1, 3, 0>(in_x, in_P, h_31, H_31, NULL, in_z, in_R, in_ea, MAHA_THRESH_31); } -void car_err_fun(double *nom_x, double *delta_x, double *out_3028736888961783120) { - err_fun(nom_x, delta_x, out_3028736888961783120); +void car_err_fun(double *nom_x, double *delta_x, double *out_4904502417690011868) { + err_fun(nom_x, delta_x, out_4904502417690011868); } -void car_inv_err_fun(double *nom_x, double *true_x, double *out_3218082572571671239) { - inv_err_fun(nom_x, true_x, out_3218082572571671239); +void car_inv_err_fun(double *nom_x, double *true_x, double *out_2523710226769313624) { + inv_err_fun(nom_x, true_x, out_2523710226769313624); } -void car_H_mod_fun(double *state, double *out_1114876351103919435) { - H_mod_fun(state, out_1114876351103919435); +void car_H_mod_fun(double *state, double *out_2102495077234161738) { + H_mod_fun(state, out_2102495077234161738); } -void car_f_fun(double *state, double dt, double *out_6826993337149264426) { - f_fun(state, dt, out_6826993337149264426); +void car_f_fun(double *state, double dt, double *out_2902792789409424078) { + f_fun(state, dt, out_2902792789409424078); } -void car_F_fun(double *state, double dt, double *out_5391441206083204607) { - F_fun(state, dt, out_5391441206083204607); +void car_F_fun(double *state, double dt, double *out_7384697533201998408) { + F_fun(state, dt, out_7384697533201998408); } -void car_h_25(double *state, double *unused, double *out_3881631893549789208) { - h_25(state, unused, out_3881631893549789208); +void car_h_25(double *state, double *unused, double *out_6076734193594010054) { + h_25(state, unused, out_6076734193594010054); } -void car_H_25(double *state, double *unused, double *out_7267345600465790480) { - H_25(state, unused, out_7267345600465790480); +void car_H_25(double *state, double *unused, double *out_8386229354659032627) { + H_25(state, unused, out_8386229354659032627); } -void car_h_24(double *state, double *unused, double *out_700870389243627536) { - h_24(state, unused, out_700870389243627536); +void car_h_24(double *state, double *unused, double *out_3849361237634050377) { + h_24(state, unused, out_3849361237634050377); } -void car_H_24(double *state, double *unused, double *out_5094696001460290914) { - H_24(state, unused, out_5094696001460290914); +void car_H_24(double *state, double *unused, double *out_6058802640420010356) { + H_24(state, unused, out_6058802640420010356); } -void car_h_30(double *state, double *unused, double *out_6829357883905274169) { - h_30(state, unused, out_6829357883905274169); +void car_h_30(double *state, double *unused, double *out_1686531063226662387) { + h_30(state, unused, out_1686531063226662387); } -void car_H_30(double *state, double *unused, double *out_4262708131752144381) { - H_30(state, unused, out_4262708131752144381); +void car_H_30(double *state, double *unused, double *out_3143824377558902234) { + H_30(state, unused, out_3143824377558902234); } -void car_h_26(double *state, double *unused, double *out_1827684616244428524) { - h_26(state, unused, out_1827684616244428524); +void car_h_26(double *state, double *unused, double *out_1350254988217670298) { + h_26(state, unused, out_1350254988217670298); } -void car_H_26(double *state, double *unused, double *out_3525842281591734256) { - H_26(state, unused, out_3525842281591734256); +void car_H_26(double *state, double *unused, double *out_4644726035784976403) { + H_26(state, unused, out_4644726035784976403); } -void car_h_27(double *state, double *unused, double *out_6761232746364086773) { - h_27(state, unused, out_6761232746364086773); +void car_h_27(double *state, double *unused, double *out_4717106662584640226) { + h_27(state, unused, out_4717106662584640226); } -void car_H_27(double *state, double *unused, double *out_6437471443552569292) { - H_27(state, unused, out_6437471443552569292); +void car_H_27(double *state, double *unused, double *out_5318587689359327145) { + H_27(state, unused, out_5318587689359327145); } -void car_h_29(double *state, double *unused, double *out_6615712922143431802) { - h_29(state, unused, out_6615712922143431802); +void car_h_29(double *state, double *unused, double *out_3506653136026194265) { + h_29(state, unused, out_3506653136026194265); } -void car_H_29(double *state, double *unused, double *out_8150834170422120325) { - H_29(state, unused, out_8150834170422120325); +void car_H_29(double *state, double *unused, double *out_2633593033244510050) { + H_29(state, unused, out_2633593033244510050); } -void car_h_28(double *state, double *unused, double *out_1759559478703241128) { - h_28(state, unused, out_1759559478703241128); +void car_h_28(double *state, double *unused, double *out_2096438289248014934) { + h_28(state, unused, out_2096438289248014934); } -void car_H_28(double *state, double *unused, double *out_5213510886217900717) { - H_28(state, unused, out_5213510886217900717); +void car_H_28(double *state, double *unused, double *out_7715992050314040624) { + H_28(state, unused, out_7715992050314040624); } -void car_h_31(double *state, double *unused, double *out_3999640757204259977) { - h_31(state, unused, out_3999640757204259977); +void car_h_31(double *state, double *unused, double *out_3232292595431690380) { + h_31(state, unused, out_3232292595431690380); } -void car_H_31(double *state, double *unused, double *out_7297991562342750908) { - H_31(state, unused, out_7297991562342750908); +void car_H_31(double *state, double *unused, double *out_8416875316535993055) { + H_31(state, unused, out_8416875316535993055); } void car_predict(double *in_x, double *in_P, double *in_Q, double dt) { predict(in_x, in_P, in_Q, dt); diff --git a/selfdrive/locationd/models/generated/car.h b/selfdrive/locationd/models/generated/car.h index 59fd7b766..17ee22ada 100644 --- a/selfdrive/locationd/models/generated/car.h +++ b/selfdrive/locationd/models/generated/car.h @@ -9,27 +9,27 @@ void car_update_27(double *in_x, double *in_P, double *in_z, double *in_R, doubl void car_update_29(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea); void car_update_28(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea); void car_update_31(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea); -void car_err_fun(double *nom_x, double *delta_x, double *out_8452624162127135067); -void car_inv_err_fun(double *nom_x, double *true_x, double *out_7823778302228655464); -void car_H_mod_fun(double *state, double *out_7408182881780194727); -void car_f_fun(double *state, double dt, double *out_8553102301205751821); -void car_F_fun(double *state, double dt, double *out_7871600829975871160); -void car_h_25(double *state, double *unused, double *out_3221146209385952877); -void car_H_25(double *state, double *unused, double *out_3868364801350448310); -void car_h_24(double *state, double *unused, double *out_3852580440014561271); -void car_H_24(double *state, double *unused, double *out_1000450063677258542); -void car_h_30(double *state, double *unused, double *out_4660126441368096308); -void car_H_30(double *state, double *unused, double *out_659331528777159888); -void car_h_26(double *state, double *unused, double *out_8301533601000622853); -void car_H_26(double *state, double *unused, double *out_126861482476392086); -void car_h_27(double *state, double *unused, double *out_1870892342875456835); -void car_H_27(double *state, double *unused, double *out_2834094840577584799); -void car_h_29(double *state, double *unused, double *out_1595698280590950946); -void car_H_29(double *state, double *unused, double *out_149100184462767704); -void car_h_28(double *state, double *unused, double *out_4475297663684154486); -void car_H_28(double *state, double *unused, double *out_5231499201532298278); -void car_h_31(double *state, double *unused, double *out_5421934217907419313); -void car_H_31(double *state, double *unused, double *out_499346619756959390); +void car_err_fun(double *nom_x, double *delta_x, double *out_4904502417690011868); +void car_inv_err_fun(double *nom_x, double *true_x, double *out_2523710226769313624); +void car_H_mod_fun(double *state, double *out_2102495077234161738); +void car_f_fun(double *state, double dt, double *out_2902792789409424078); +void car_F_fun(double *state, double dt, double *out_7384697533201998408); +void car_h_25(double *state, double *unused, double *out_6076734193594010054); +void car_H_25(double *state, double *unused, double *out_8386229354659032627); +void car_h_24(double *state, double *unused, double *out_3849361237634050377); +void car_H_24(double *state, double *unused, double *out_6058802640420010356); +void car_h_30(double *state, double *unused, double *out_1686531063226662387); +void car_H_30(double *state, double *unused, double *out_3143824377558902234); +void car_h_26(double *state, double *unused, double *out_1350254988217670298); +void car_H_26(double *state, double *unused, double *out_4644726035784976403); +void car_h_27(double *state, double *unused, double *out_4717106662584640226); +void car_H_27(double *state, double *unused, double *out_5318587689359327145); +void car_h_29(double *state, double *unused, double *out_3506653136026194265); +void car_H_29(double *state, double *unused, double *out_2633593033244510050); +void car_h_28(double *state, double *unused, double *out_2096438289248014934); +void car_H_28(double *state, double *unused, double *out_7715992050314040624); +void car_h_31(double *state, double *unused, double *out_3232292595431690380); +void car_H_31(double *state, double *unused, double *out_8416875316535993055); void car_predict(double *in_x, double *in_P, double *in_Q, double dt); void car_set_mass(double x); void car_set_rotational_inertia(double x); diff --git a/selfdrive/locationd/models/generated/gnss.cpp b/selfdrive/locationd/models/generated/gnss.cpp index 9106038be..e3df158d1 100644 --- a/selfdrive/locationd/models/generated/gnss.cpp +++ b/selfdrive/locationd/models/generated/gnss.cpp @@ -17,354 +17,354 @@ const static double MAHA_THRESH_21 = 3.8414588206941227; * * * This file is part of 'ekf' * ******************************************************************************/ -void err_fun(double *nom_x, double *delta_x, double *out_8128068779397269674) { - out_8128068779397269674[0] = delta_x[0] + nom_x[0]; - out_8128068779397269674[1] = delta_x[1] + nom_x[1]; - out_8128068779397269674[2] = delta_x[2] + nom_x[2]; - out_8128068779397269674[3] = delta_x[3] + nom_x[3]; - out_8128068779397269674[4] = delta_x[4] + nom_x[4]; - out_8128068779397269674[5] = delta_x[5] + nom_x[5]; - out_8128068779397269674[6] = delta_x[6] + nom_x[6]; - out_8128068779397269674[7] = delta_x[7] + nom_x[7]; - out_8128068779397269674[8] = delta_x[8] + nom_x[8]; - out_8128068779397269674[9] = delta_x[9] + nom_x[9]; - out_8128068779397269674[10] = delta_x[10] + nom_x[10]; +void err_fun(double *nom_x, double *delta_x, double *out_5270397344340919402) { + out_5270397344340919402[0] = delta_x[0] + nom_x[0]; + out_5270397344340919402[1] = delta_x[1] + nom_x[1]; + out_5270397344340919402[2] = delta_x[2] + nom_x[2]; + out_5270397344340919402[3] = delta_x[3] + nom_x[3]; + out_5270397344340919402[4] = delta_x[4] + nom_x[4]; + out_5270397344340919402[5] = delta_x[5] + nom_x[5]; + out_5270397344340919402[6] = delta_x[6] + nom_x[6]; + out_5270397344340919402[7] = delta_x[7] + nom_x[7]; + out_5270397344340919402[8] = delta_x[8] + nom_x[8]; + out_5270397344340919402[9] = delta_x[9] + nom_x[9]; + out_5270397344340919402[10] = delta_x[10] + nom_x[10]; } -void inv_err_fun(double *nom_x, double *true_x, double *out_1141553057367786298) { - out_1141553057367786298[0] = -nom_x[0] + true_x[0]; - out_1141553057367786298[1] = -nom_x[1] + true_x[1]; - out_1141553057367786298[2] = -nom_x[2] + true_x[2]; - out_1141553057367786298[3] = -nom_x[3] + true_x[3]; - out_1141553057367786298[4] = -nom_x[4] + true_x[4]; - out_1141553057367786298[5] = -nom_x[5] + true_x[5]; - out_1141553057367786298[6] = -nom_x[6] + true_x[6]; - out_1141553057367786298[7] = -nom_x[7] + true_x[7]; - out_1141553057367786298[8] = -nom_x[8] + true_x[8]; - out_1141553057367786298[9] = -nom_x[9] + true_x[9]; - out_1141553057367786298[10] = -nom_x[10] + true_x[10]; +void inv_err_fun(double *nom_x, double *true_x, double *out_1512259161409062554) { + out_1512259161409062554[0] = -nom_x[0] + true_x[0]; + out_1512259161409062554[1] = -nom_x[1] + true_x[1]; + out_1512259161409062554[2] = -nom_x[2] + true_x[2]; + out_1512259161409062554[3] = -nom_x[3] + true_x[3]; + out_1512259161409062554[4] = -nom_x[4] + true_x[4]; + out_1512259161409062554[5] = -nom_x[5] + true_x[5]; + out_1512259161409062554[6] = -nom_x[6] + true_x[6]; + out_1512259161409062554[7] = -nom_x[7] + true_x[7]; + out_1512259161409062554[8] = -nom_x[8] + true_x[8]; + out_1512259161409062554[9] = -nom_x[9] + true_x[9]; + out_1512259161409062554[10] = -nom_x[10] + true_x[10]; } -void H_mod_fun(double *state, double *out_2327247742686327650) { - out_2327247742686327650[0] = 1.0; - out_2327247742686327650[1] = 0; - out_2327247742686327650[2] = 0; - out_2327247742686327650[3] = 0; - out_2327247742686327650[4] = 0; - out_2327247742686327650[5] = 0; - out_2327247742686327650[6] = 0; - out_2327247742686327650[7] = 0; - out_2327247742686327650[8] = 0; - out_2327247742686327650[9] = 0; - out_2327247742686327650[10] = 0; - out_2327247742686327650[11] = 0; - out_2327247742686327650[12] = 1.0; - out_2327247742686327650[13] = 0; - out_2327247742686327650[14] = 0; - out_2327247742686327650[15] = 0; - out_2327247742686327650[16] = 0; - out_2327247742686327650[17] = 0; - out_2327247742686327650[18] = 0; - out_2327247742686327650[19] = 0; - out_2327247742686327650[20] = 0; - out_2327247742686327650[21] = 0; - out_2327247742686327650[22] = 0; - out_2327247742686327650[23] = 0; - out_2327247742686327650[24] = 1.0; - out_2327247742686327650[25] = 0; - out_2327247742686327650[26] = 0; - out_2327247742686327650[27] = 0; - out_2327247742686327650[28] = 0; - out_2327247742686327650[29] = 0; - out_2327247742686327650[30] = 0; - out_2327247742686327650[31] = 0; - out_2327247742686327650[32] = 0; - out_2327247742686327650[33] = 0; - out_2327247742686327650[34] = 0; - out_2327247742686327650[35] = 0; - out_2327247742686327650[36] = 1.0; - out_2327247742686327650[37] = 0; - out_2327247742686327650[38] = 0; - out_2327247742686327650[39] = 0; - out_2327247742686327650[40] = 0; - out_2327247742686327650[41] = 0; - out_2327247742686327650[42] = 0; - out_2327247742686327650[43] = 0; - out_2327247742686327650[44] = 0; - out_2327247742686327650[45] = 0; - out_2327247742686327650[46] = 0; - out_2327247742686327650[47] = 0; - out_2327247742686327650[48] = 1.0; - out_2327247742686327650[49] = 0; - out_2327247742686327650[50] = 0; - out_2327247742686327650[51] = 0; - out_2327247742686327650[52] = 0; - out_2327247742686327650[53] = 0; - out_2327247742686327650[54] = 0; - out_2327247742686327650[55] = 0; - out_2327247742686327650[56] = 0; - out_2327247742686327650[57] = 0; - out_2327247742686327650[58] = 0; - out_2327247742686327650[59] = 0; - out_2327247742686327650[60] = 1.0; - out_2327247742686327650[61] = 0; - out_2327247742686327650[62] = 0; - out_2327247742686327650[63] = 0; - out_2327247742686327650[64] = 0; - out_2327247742686327650[65] = 0; - out_2327247742686327650[66] = 0; - out_2327247742686327650[67] = 0; - out_2327247742686327650[68] = 0; - out_2327247742686327650[69] = 0; - out_2327247742686327650[70] = 0; - out_2327247742686327650[71] = 0; - out_2327247742686327650[72] = 1.0; - out_2327247742686327650[73] = 0; - out_2327247742686327650[74] = 0; - out_2327247742686327650[75] = 0; - out_2327247742686327650[76] = 0; - out_2327247742686327650[77] = 0; - out_2327247742686327650[78] = 0; - out_2327247742686327650[79] = 0; - out_2327247742686327650[80] = 0; - out_2327247742686327650[81] = 0; - out_2327247742686327650[82] = 0; - out_2327247742686327650[83] = 0; - out_2327247742686327650[84] = 1.0; - out_2327247742686327650[85] = 0; - out_2327247742686327650[86] = 0; - out_2327247742686327650[87] = 0; - out_2327247742686327650[88] = 0; - out_2327247742686327650[89] = 0; - out_2327247742686327650[90] = 0; - out_2327247742686327650[91] = 0; - out_2327247742686327650[92] = 0; - out_2327247742686327650[93] = 0; - out_2327247742686327650[94] = 0; - out_2327247742686327650[95] = 0; - out_2327247742686327650[96] = 1.0; - out_2327247742686327650[97] = 0; - out_2327247742686327650[98] = 0; - out_2327247742686327650[99] = 0; - out_2327247742686327650[100] = 0; - out_2327247742686327650[101] = 0; - out_2327247742686327650[102] = 0; - out_2327247742686327650[103] = 0; - out_2327247742686327650[104] = 0; - out_2327247742686327650[105] = 0; - out_2327247742686327650[106] = 0; - out_2327247742686327650[107] = 0; - out_2327247742686327650[108] = 1.0; - out_2327247742686327650[109] = 0; - out_2327247742686327650[110] = 0; - out_2327247742686327650[111] = 0; - out_2327247742686327650[112] = 0; - out_2327247742686327650[113] = 0; - out_2327247742686327650[114] = 0; - out_2327247742686327650[115] = 0; - out_2327247742686327650[116] = 0; - out_2327247742686327650[117] = 0; - out_2327247742686327650[118] = 0; - out_2327247742686327650[119] = 0; - out_2327247742686327650[120] = 1.0; +void H_mod_fun(double *state, double *out_8413937430488034064) { + out_8413937430488034064[0] = 1.0; + out_8413937430488034064[1] = 0; + out_8413937430488034064[2] = 0; + out_8413937430488034064[3] = 0; + out_8413937430488034064[4] = 0; + out_8413937430488034064[5] = 0; + out_8413937430488034064[6] = 0; + out_8413937430488034064[7] = 0; + out_8413937430488034064[8] = 0; + out_8413937430488034064[9] = 0; + out_8413937430488034064[10] = 0; + out_8413937430488034064[11] = 0; + out_8413937430488034064[12] = 1.0; + out_8413937430488034064[13] = 0; + out_8413937430488034064[14] = 0; + out_8413937430488034064[15] = 0; + out_8413937430488034064[16] = 0; + out_8413937430488034064[17] = 0; + out_8413937430488034064[18] = 0; + out_8413937430488034064[19] = 0; + out_8413937430488034064[20] = 0; + out_8413937430488034064[21] = 0; + out_8413937430488034064[22] = 0; + out_8413937430488034064[23] = 0; + out_8413937430488034064[24] = 1.0; + out_8413937430488034064[25] = 0; + out_8413937430488034064[26] = 0; + out_8413937430488034064[27] = 0; + out_8413937430488034064[28] = 0; + out_8413937430488034064[29] = 0; + out_8413937430488034064[30] = 0; + out_8413937430488034064[31] = 0; + out_8413937430488034064[32] = 0; + out_8413937430488034064[33] = 0; + out_8413937430488034064[34] = 0; + out_8413937430488034064[35] = 0; + out_8413937430488034064[36] = 1.0; + out_8413937430488034064[37] = 0; + out_8413937430488034064[38] = 0; + out_8413937430488034064[39] = 0; + out_8413937430488034064[40] = 0; + out_8413937430488034064[41] = 0; + out_8413937430488034064[42] = 0; + out_8413937430488034064[43] = 0; + out_8413937430488034064[44] = 0; + out_8413937430488034064[45] = 0; + out_8413937430488034064[46] = 0; + out_8413937430488034064[47] = 0; + out_8413937430488034064[48] = 1.0; + out_8413937430488034064[49] = 0; + out_8413937430488034064[50] = 0; + out_8413937430488034064[51] = 0; + out_8413937430488034064[52] = 0; + out_8413937430488034064[53] = 0; + out_8413937430488034064[54] = 0; + out_8413937430488034064[55] = 0; + out_8413937430488034064[56] = 0; + out_8413937430488034064[57] = 0; + out_8413937430488034064[58] = 0; + out_8413937430488034064[59] = 0; + out_8413937430488034064[60] = 1.0; + out_8413937430488034064[61] = 0; + out_8413937430488034064[62] = 0; + out_8413937430488034064[63] = 0; + out_8413937430488034064[64] = 0; + out_8413937430488034064[65] = 0; + out_8413937430488034064[66] = 0; + out_8413937430488034064[67] = 0; + out_8413937430488034064[68] = 0; + out_8413937430488034064[69] = 0; + out_8413937430488034064[70] = 0; + out_8413937430488034064[71] = 0; + out_8413937430488034064[72] = 1.0; + out_8413937430488034064[73] = 0; + out_8413937430488034064[74] = 0; + out_8413937430488034064[75] = 0; + out_8413937430488034064[76] = 0; + out_8413937430488034064[77] = 0; + out_8413937430488034064[78] = 0; + out_8413937430488034064[79] = 0; + out_8413937430488034064[80] = 0; + out_8413937430488034064[81] = 0; + out_8413937430488034064[82] = 0; + out_8413937430488034064[83] = 0; + out_8413937430488034064[84] = 1.0; + out_8413937430488034064[85] = 0; + out_8413937430488034064[86] = 0; + out_8413937430488034064[87] = 0; + out_8413937430488034064[88] = 0; + out_8413937430488034064[89] = 0; + out_8413937430488034064[90] = 0; + out_8413937430488034064[91] = 0; + out_8413937430488034064[92] = 0; + out_8413937430488034064[93] = 0; + out_8413937430488034064[94] = 0; + out_8413937430488034064[95] = 0; + out_8413937430488034064[96] = 1.0; + out_8413937430488034064[97] = 0; + out_8413937430488034064[98] = 0; + out_8413937430488034064[99] = 0; + out_8413937430488034064[100] = 0; + out_8413937430488034064[101] = 0; + out_8413937430488034064[102] = 0; + out_8413937430488034064[103] = 0; + out_8413937430488034064[104] = 0; + out_8413937430488034064[105] = 0; + out_8413937430488034064[106] = 0; + out_8413937430488034064[107] = 0; + out_8413937430488034064[108] = 1.0; + out_8413937430488034064[109] = 0; + out_8413937430488034064[110] = 0; + out_8413937430488034064[111] = 0; + out_8413937430488034064[112] = 0; + out_8413937430488034064[113] = 0; + out_8413937430488034064[114] = 0; + out_8413937430488034064[115] = 0; + out_8413937430488034064[116] = 0; + out_8413937430488034064[117] = 0; + out_8413937430488034064[118] = 0; + out_8413937430488034064[119] = 0; + out_8413937430488034064[120] = 1.0; } -void f_fun(double *state, double dt, double *out_690824356618248952) { - out_690824356618248952[0] = dt*state[3] + state[0]; - out_690824356618248952[1] = dt*state[4] + state[1]; - out_690824356618248952[2] = dt*state[5] + state[2]; - out_690824356618248952[3] = state[3]; - out_690824356618248952[4] = state[4]; - out_690824356618248952[5] = state[5]; - out_690824356618248952[6] = dt*state[7] + state[6]; - out_690824356618248952[7] = dt*state[8] + state[7]; - out_690824356618248952[8] = state[8]; - out_690824356618248952[9] = state[9]; - out_690824356618248952[10] = state[10]; +void f_fun(double *state, double dt, double *out_8044790491496694058) { + out_8044790491496694058[0] = dt*state[3] + state[0]; + out_8044790491496694058[1] = dt*state[4] + state[1]; + out_8044790491496694058[2] = dt*state[5] + state[2]; + out_8044790491496694058[3] = state[3]; + out_8044790491496694058[4] = state[4]; + out_8044790491496694058[5] = state[5]; + out_8044790491496694058[6] = dt*state[7] + state[6]; + out_8044790491496694058[7] = dt*state[8] + state[7]; + out_8044790491496694058[8] = state[8]; + out_8044790491496694058[9] = state[9]; + out_8044790491496694058[10] = state[10]; } -void F_fun(double *state, double dt, double *out_2015156480179268251) { - out_2015156480179268251[0] = 1; - out_2015156480179268251[1] = 0; - out_2015156480179268251[2] = 0; - out_2015156480179268251[3] = dt; - out_2015156480179268251[4] = 0; - out_2015156480179268251[5] = 0; - out_2015156480179268251[6] = 0; - out_2015156480179268251[7] = 0; - out_2015156480179268251[8] = 0; - out_2015156480179268251[9] = 0; - out_2015156480179268251[10] = 0; - out_2015156480179268251[11] = 0; - out_2015156480179268251[12] = 1; - out_2015156480179268251[13] = 0; - out_2015156480179268251[14] = 0; - out_2015156480179268251[15] = dt; - out_2015156480179268251[16] = 0; - out_2015156480179268251[17] = 0; - out_2015156480179268251[18] = 0; - out_2015156480179268251[19] = 0; - out_2015156480179268251[20] = 0; - out_2015156480179268251[21] = 0; - out_2015156480179268251[22] = 0; - out_2015156480179268251[23] = 0; - out_2015156480179268251[24] = 1; - out_2015156480179268251[25] = 0; - out_2015156480179268251[26] = 0; - out_2015156480179268251[27] = dt; - out_2015156480179268251[28] = 0; - out_2015156480179268251[29] = 0; - out_2015156480179268251[30] = 0; - out_2015156480179268251[31] = 0; - out_2015156480179268251[32] = 0; - out_2015156480179268251[33] = 0; - out_2015156480179268251[34] = 0; - out_2015156480179268251[35] = 0; - out_2015156480179268251[36] = 1; - out_2015156480179268251[37] = 0; - out_2015156480179268251[38] = 0; - out_2015156480179268251[39] = 0; - out_2015156480179268251[40] = 0; - out_2015156480179268251[41] = 0; - out_2015156480179268251[42] = 0; - out_2015156480179268251[43] = 0; - out_2015156480179268251[44] = 0; - out_2015156480179268251[45] = 0; - out_2015156480179268251[46] = 0; - out_2015156480179268251[47] = 0; - out_2015156480179268251[48] = 1; - out_2015156480179268251[49] = 0; - out_2015156480179268251[50] = 0; - out_2015156480179268251[51] = 0; - out_2015156480179268251[52] = 0; - out_2015156480179268251[53] = 0; - out_2015156480179268251[54] = 0; - out_2015156480179268251[55] = 0; - out_2015156480179268251[56] = 0; - out_2015156480179268251[57] = 0; - out_2015156480179268251[58] = 0; - out_2015156480179268251[59] = 0; - out_2015156480179268251[60] = 1; - out_2015156480179268251[61] = 0; - out_2015156480179268251[62] = 0; - out_2015156480179268251[63] = 0; - out_2015156480179268251[64] = 0; - out_2015156480179268251[65] = 0; - out_2015156480179268251[66] = 0; - out_2015156480179268251[67] = 0; - out_2015156480179268251[68] = 0; - out_2015156480179268251[69] = 0; - out_2015156480179268251[70] = 0; - out_2015156480179268251[71] = 0; - out_2015156480179268251[72] = 1; - out_2015156480179268251[73] = dt; - out_2015156480179268251[74] = 0; - out_2015156480179268251[75] = 0; - out_2015156480179268251[76] = 0; - out_2015156480179268251[77] = 0; - out_2015156480179268251[78] = 0; - out_2015156480179268251[79] = 0; - out_2015156480179268251[80] = 0; - out_2015156480179268251[81] = 0; - out_2015156480179268251[82] = 0; - out_2015156480179268251[83] = 0; - out_2015156480179268251[84] = 1; - out_2015156480179268251[85] = dt; - out_2015156480179268251[86] = 0; - out_2015156480179268251[87] = 0; - out_2015156480179268251[88] = 0; - out_2015156480179268251[89] = 0; - out_2015156480179268251[90] = 0; - out_2015156480179268251[91] = 0; - out_2015156480179268251[92] = 0; - out_2015156480179268251[93] = 0; - out_2015156480179268251[94] = 0; - out_2015156480179268251[95] = 0; - out_2015156480179268251[96] = 1; - out_2015156480179268251[97] = 0; - out_2015156480179268251[98] = 0; - out_2015156480179268251[99] = 0; - out_2015156480179268251[100] = 0; - out_2015156480179268251[101] = 0; - out_2015156480179268251[102] = 0; - out_2015156480179268251[103] = 0; - out_2015156480179268251[104] = 0; - out_2015156480179268251[105] = 0; - out_2015156480179268251[106] = 0; - out_2015156480179268251[107] = 0; - out_2015156480179268251[108] = 1; - out_2015156480179268251[109] = 0; - out_2015156480179268251[110] = 0; - out_2015156480179268251[111] = 0; - out_2015156480179268251[112] = 0; - out_2015156480179268251[113] = 0; - out_2015156480179268251[114] = 0; - out_2015156480179268251[115] = 0; - out_2015156480179268251[116] = 0; - out_2015156480179268251[117] = 0; - out_2015156480179268251[118] = 0; - out_2015156480179268251[119] = 0; - out_2015156480179268251[120] = 1; +void F_fun(double *state, double dt, double *out_7107643139068643538) { + out_7107643139068643538[0] = 1; + out_7107643139068643538[1] = 0; + out_7107643139068643538[2] = 0; + out_7107643139068643538[3] = dt; + out_7107643139068643538[4] = 0; + out_7107643139068643538[5] = 0; + out_7107643139068643538[6] = 0; + out_7107643139068643538[7] = 0; + out_7107643139068643538[8] = 0; + out_7107643139068643538[9] = 0; + out_7107643139068643538[10] = 0; + out_7107643139068643538[11] = 0; + out_7107643139068643538[12] = 1; + out_7107643139068643538[13] = 0; + out_7107643139068643538[14] = 0; + out_7107643139068643538[15] = dt; + out_7107643139068643538[16] = 0; + out_7107643139068643538[17] = 0; + out_7107643139068643538[18] = 0; + out_7107643139068643538[19] = 0; + out_7107643139068643538[20] = 0; + out_7107643139068643538[21] = 0; + out_7107643139068643538[22] = 0; + out_7107643139068643538[23] = 0; + out_7107643139068643538[24] = 1; + out_7107643139068643538[25] = 0; + out_7107643139068643538[26] = 0; + out_7107643139068643538[27] = dt; + out_7107643139068643538[28] = 0; + out_7107643139068643538[29] = 0; + out_7107643139068643538[30] = 0; + out_7107643139068643538[31] = 0; + out_7107643139068643538[32] = 0; + out_7107643139068643538[33] = 0; + out_7107643139068643538[34] = 0; + out_7107643139068643538[35] = 0; + out_7107643139068643538[36] = 1; + out_7107643139068643538[37] = 0; + out_7107643139068643538[38] = 0; + out_7107643139068643538[39] = 0; + out_7107643139068643538[40] = 0; + out_7107643139068643538[41] = 0; + out_7107643139068643538[42] = 0; + out_7107643139068643538[43] = 0; + out_7107643139068643538[44] = 0; + out_7107643139068643538[45] = 0; + out_7107643139068643538[46] = 0; + out_7107643139068643538[47] = 0; + out_7107643139068643538[48] = 1; + out_7107643139068643538[49] = 0; + out_7107643139068643538[50] = 0; + out_7107643139068643538[51] = 0; + out_7107643139068643538[52] = 0; + out_7107643139068643538[53] = 0; + out_7107643139068643538[54] = 0; + out_7107643139068643538[55] = 0; + out_7107643139068643538[56] = 0; + out_7107643139068643538[57] = 0; + out_7107643139068643538[58] = 0; + out_7107643139068643538[59] = 0; + out_7107643139068643538[60] = 1; + out_7107643139068643538[61] = 0; + out_7107643139068643538[62] = 0; + out_7107643139068643538[63] = 0; + out_7107643139068643538[64] = 0; + out_7107643139068643538[65] = 0; + out_7107643139068643538[66] = 0; + out_7107643139068643538[67] = 0; + out_7107643139068643538[68] = 0; + out_7107643139068643538[69] = 0; + out_7107643139068643538[70] = 0; + out_7107643139068643538[71] = 0; + out_7107643139068643538[72] = 1; + out_7107643139068643538[73] = dt; + out_7107643139068643538[74] = 0; + out_7107643139068643538[75] = 0; + out_7107643139068643538[76] = 0; + out_7107643139068643538[77] = 0; + out_7107643139068643538[78] = 0; + out_7107643139068643538[79] = 0; + out_7107643139068643538[80] = 0; + out_7107643139068643538[81] = 0; + out_7107643139068643538[82] = 0; + out_7107643139068643538[83] = 0; + out_7107643139068643538[84] = 1; + out_7107643139068643538[85] = dt; + out_7107643139068643538[86] = 0; + out_7107643139068643538[87] = 0; + out_7107643139068643538[88] = 0; + out_7107643139068643538[89] = 0; + out_7107643139068643538[90] = 0; + out_7107643139068643538[91] = 0; + out_7107643139068643538[92] = 0; + out_7107643139068643538[93] = 0; + out_7107643139068643538[94] = 0; + out_7107643139068643538[95] = 0; + out_7107643139068643538[96] = 1; + out_7107643139068643538[97] = 0; + out_7107643139068643538[98] = 0; + out_7107643139068643538[99] = 0; + out_7107643139068643538[100] = 0; + out_7107643139068643538[101] = 0; + out_7107643139068643538[102] = 0; + out_7107643139068643538[103] = 0; + out_7107643139068643538[104] = 0; + out_7107643139068643538[105] = 0; + out_7107643139068643538[106] = 0; + out_7107643139068643538[107] = 0; + out_7107643139068643538[108] = 1; + out_7107643139068643538[109] = 0; + out_7107643139068643538[110] = 0; + out_7107643139068643538[111] = 0; + out_7107643139068643538[112] = 0; + out_7107643139068643538[113] = 0; + out_7107643139068643538[114] = 0; + out_7107643139068643538[115] = 0; + out_7107643139068643538[116] = 0; + out_7107643139068643538[117] = 0; + out_7107643139068643538[118] = 0; + out_7107643139068643538[119] = 0; + out_7107643139068643538[120] = 1; } -void h_6(double *state, double *sat_pos, double *out_5585365302508030232) { - out_5585365302508030232[0] = sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)) + state[6]; +void h_6(double *state, double *sat_pos, double *out_1014783744438669605) { + out_1014783744438669605[0] = sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)) + state[6]; } -void H_6(double *state, double *sat_pos, double *out_8739010288179210207) { - out_8739010288179210207[0] = (-sat_pos[0] + state[0])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); - out_8739010288179210207[1] = (-sat_pos[1] + state[1])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); - out_8739010288179210207[2] = (-sat_pos[2] + state[2])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); - out_8739010288179210207[3] = 0; - out_8739010288179210207[4] = 0; - out_8739010288179210207[5] = 0; - out_8739010288179210207[6] = 1; - out_8739010288179210207[7] = 0; - out_8739010288179210207[8] = 0; - out_8739010288179210207[9] = 0; - out_8739010288179210207[10] = 0; +void H_6(double *state, double *sat_pos, double *out_2647892629803094557) { + out_2647892629803094557[0] = (-sat_pos[0] + state[0])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); + out_2647892629803094557[1] = (-sat_pos[1] + state[1])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); + out_2647892629803094557[2] = (-sat_pos[2] + state[2])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); + out_2647892629803094557[3] = 0; + out_2647892629803094557[4] = 0; + out_2647892629803094557[5] = 0; + out_2647892629803094557[6] = 1; + out_2647892629803094557[7] = 0; + out_2647892629803094557[8] = 0; + out_2647892629803094557[9] = 0; + out_2647892629803094557[10] = 0; } -void h_20(double *state, double *sat_pos, double *out_8217292551938667710) { - out_8217292551938667710[0] = sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)) + sat_pos[3]*state[10] + state[6] + state[9]; +void h_20(double *state, double *sat_pos, double *out_4446463785726682298) { + out_4446463785726682298[0] = sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)) + sat_pos[3]*state[10] + state[6] + state[9]; } -void H_20(double *state, double *sat_pos, double *out_5820758707894519330) { - out_5820758707894519330[0] = (-sat_pos[0] + state[0])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); - out_5820758707894519330[1] = (-sat_pos[1] + state[1])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); - out_5820758707894519330[2] = (-sat_pos[2] + state[2])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); - out_5820758707894519330[3] = 0; - out_5820758707894519330[4] = 0; - out_5820758707894519330[5] = 0; - out_5820758707894519330[6] = 1; - out_5820758707894519330[7] = 0; - out_5820758707894519330[8] = 0; - out_5820758707894519330[9] = 1; - out_5820758707894519330[10] = sat_pos[3]; +void H_20(double *state, double *sat_pos, double *out_2058835805956563056) { + out_2058835805956563056[0] = (-sat_pos[0] + state[0])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); + out_2058835805956563056[1] = (-sat_pos[1] + state[1])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); + out_2058835805956563056[2] = (-sat_pos[2] + state[2])/sqrt(pow(-sat_pos[0] + state[0], 2) + pow(-sat_pos[1] + state[1], 2) + pow(-sat_pos[2] + state[2], 2)); + out_2058835805956563056[3] = 0; + out_2058835805956563056[4] = 0; + out_2058835805956563056[5] = 0; + out_2058835805956563056[6] = 1; + out_2058835805956563056[7] = 0; + out_2058835805956563056[8] = 0; + out_2058835805956563056[9] = 1; + out_2058835805956563056[10] = sat_pos[3]; } -void h_7(double *state, double *sat_pos_vel, double *out_1303955860558393099) { - out_1303955860558393099[0] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[3] - state[3])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[4] - state[4])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + (sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + state[7]; +void h_7(double *state, double *sat_pos_vel, double *out_6977013047509885177) { + out_6977013047509885177[0] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[3] - state[3])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[4] - state[4])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + (sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + state[7]; } -void H_7(double *state, double *sat_pos_vel, double *out_6257595943694472907) { - out_6257595943694472907[0] = pow(sat_pos_vel[0] - state[0], 2)*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[0] - state[0])*(sat_pos_vel[1] - state[1])*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[0] - state[0])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[3] - state[3])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[1] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[1] - state[1])*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + pow(sat_pos_vel[1] - state[1], 2)*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[4] - state[4])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[2] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + pow(sat_pos_vel[2] - state[2], 2)*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[5] - state[5])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[3] = -(sat_pos_vel[0] - state[0])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[4] = -(sat_pos_vel[1] - state[1])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[5] = -(sat_pos_vel[2] - state[2])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[6] = 0; - out_6257595943694472907[7] = 1; - out_6257595943694472907[8] = 0; - out_6257595943694472907[9] = 0; - out_6257595943694472907[10] = 0; +void H_7(double *state, double *sat_pos_vel, double *out_3396370189700754510) { + out_3396370189700754510[0] = pow(sat_pos_vel[0] - state[0], 2)*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[0] - state[0])*(sat_pos_vel[1] - state[1])*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[0] - state[0])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[3] - state[3])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[1] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[1] - state[1])*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + pow(sat_pos_vel[1] - state[1], 2)*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[4] - state[4])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[2] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + pow(sat_pos_vel[2] - state[2], 2)*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[5] - state[5])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[3] = -(sat_pos_vel[0] - state[0])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[4] = -(sat_pos_vel[1] - state[1])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[5] = -(sat_pos_vel[2] - state[2])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[6] = 0; + out_3396370189700754510[7] = 1; + out_3396370189700754510[8] = 0; + out_3396370189700754510[9] = 0; + out_3396370189700754510[10] = 0; } -void h_21(double *state, double *sat_pos_vel, double *out_1303955860558393099) { - out_1303955860558393099[0] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[3] - state[3])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[4] - state[4])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + (sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + state[7]; +void h_21(double *state, double *sat_pos_vel, double *out_6977013047509885177) { + out_6977013047509885177[0] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[3] - state[3])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[4] - state[4])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + (sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)) + state[7]; } -void H_21(double *state, double *sat_pos_vel, double *out_6257595943694472907) { - out_6257595943694472907[0] = pow(sat_pos_vel[0] - state[0], 2)*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[0] - state[0])*(sat_pos_vel[1] - state[1])*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[0] - state[0])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[3] - state[3])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[1] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[1] - state[1])*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + pow(sat_pos_vel[1] - state[1], 2)*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[4] - state[4])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[2] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + pow(sat_pos_vel[2] - state[2], 2)*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[5] - state[5])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[3] = -(sat_pos_vel[0] - state[0])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[4] = -(sat_pos_vel[1] - state[1])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[5] = -(sat_pos_vel[2] - state[2])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); - out_6257595943694472907[6] = 0; - out_6257595943694472907[7] = 1; - out_6257595943694472907[8] = 0; - out_6257595943694472907[9] = 0; - out_6257595943694472907[10] = 0; +void H_21(double *state, double *sat_pos_vel, double *out_3396370189700754510) { + out_3396370189700754510[0] = pow(sat_pos_vel[0] - state[0], 2)*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[0] - state[0])*(sat_pos_vel[1] - state[1])*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[0] - state[0])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[3] - state[3])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[1] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[1] - state[1])*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + pow(sat_pos_vel[1] - state[1], 2)*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[4] - state[4])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[2] = (sat_pos_vel[0] - state[0])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[3] - state[3])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + (sat_pos_vel[1] - state[1])*(sat_pos_vel[2] - state[2])*(sat_pos_vel[4] - state[4])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) + pow(sat_pos_vel[2] - state[2], 2)*(sat_pos_vel[5] - state[5])/pow(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2), 3.0/2.0) - (sat_pos_vel[5] - state[5])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[3] = -(sat_pos_vel[0] - state[0])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[4] = -(sat_pos_vel[1] - state[1])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[5] = -(sat_pos_vel[2] - state[2])/sqrt(pow(sat_pos_vel[0] - state[0], 2) + pow(sat_pos_vel[1] - state[1], 2) + pow(sat_pos_vel[2] - state[2], 2)); + out_3396370189700754510[6] = 0; + out_3396370189700754510[7] = 1; + out_3396370189700754510[8] = 0; + out_3396370189700754510[9] = 0; + out_3396370189700754510[10] = 0; } #include #include @@ -506,44 +506,44 @@ void gnss_update_7(double *in_x, double *in_P, double *in_z, double *in_R, doubl void gnss_update_21(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) { update<1, 3, 0>(in_x, in_P, h_21, H_21, NULL, in_z, in_R, in_ea, MAHA_THRESH_21); } -void gnss_err_fun(double *nom_x, double *delta_x, double *out_8128068779397269674) { - err_fun(nom_x, delta_x, out_8128068779397269674); +void gnss_err_fun(double *nom_x, double *delta_x, double *out_5270397344340919402) { + err_fun(nom_x, delta_x, out_5270397344340919402); } -void gnss_inv_err_fun(double *nom_x, double *true_x, double *out_1141553057367786298) { - inv_err_fun(nom_x, true_x, out_1141553057367786298); +void gnss_inv_err_fun(double *nom_x, double *true_x, double *out_1512259161409062554) { + inv_err_fun(nom_x, true_x, out_1512259161409062554); } -void gnss_H_mod_fun(double *state, double *out_2327247742686327650) { - H_mod_fun(state, out_2327247742686327650); +void gnss_H_mod_fun(double *state, double *out_8413937430488034064) { + H_mod_fun(state, out_8413937430488034064); } -void gnss_f_fun(double *state, double dt, double *out_690824356618248952) { - f_fun(state, dt, out_690824356618248952); +void gnss_f_fun(double *state, double dt, double *out_8044790491496694058) { + f_fun(state, dt, out_8044790491496694058); } -void gnss_F_fun(double *state, double dt, double *out_2015156480179268251) { - F_fun(state, dt, out_2015156480179268251); +void gnss_F_fun(double *state, double dt, double *out_7107643139068643538) { + F_fun(state, dt, out_7107643139068643538); } -void gnss_h_6(double *state, double *sat_pos, double *out_5585365302508030232) { - h_6(state, sat_pos, out_5585365302508030232); +void gnss_h_6(double *state, double *sat_pos, double *out_1014783744438669605) { + h_6(state, sat_pos, out_1014783744438669605); } -void gnss_H_6(double *state, double *sat_pos, double *out_8739010288179210207) { - H_6(state, sat_pos, out_8739010288179210207); +void gnss_H_6(double *state, double *sat_pos, double *out_2647892629803094557) { + H_6(state, sat_pos, out_2647892629803094557); } -void gnss_h_20(double *state, double *sat_pos, double *out_8217292551938667710) { - h_20(state, sat_pos, out_8217292551938667710); +void gnss_h_20(double *state, double *sat_pos, double *out_4446463785726682298) { + h_20(state, sat_pos, out_4446463785726682298); } -void gnss_H_20(double *state, double *sat_pos, double *out_5820758707894519330) { - H_20(state, sat_pos, out_5820758707894519330); +void gnss_H_20(double *state, double *sat_pos, double *out_2058835805956563056) { + H_20(state, sat_pos, out_2058835805956563056); } -void gnss_h_7(double *state, double *sat_pos_vel, double *out_1303955860558393099) { - h_7(state, sat_pos_vel, out_1303955860558393099); +void gnss_h_7(double *state, double *sat_pos_vel, double *out_6977013047509885177) { + h_7(state, sat_pos_vel, out_6977013047509885177); } -void gnss_H_7(double *state, double *sat_pos_vel, double *out_6257595943694472907) { - H_7(state, sat_pos_vel, out_6257595943694472907); +void gnss_H_7(double *state, double *sat_pos_vel, double *out_3396370189700754510) { + H_7(state, sat_pos_vel, out_3396370189700754510); } -void gnss_h_21(double *state, double *sat_pos_vel, double *out_1303955860558393099) { - h_21(state, sat_pos_vel, out_1303955860558393099); +void gnss_h_21(double *state, double *sat_pos_vel, double *out_6977013047509885177) { + h_21(state, sat_pos_vel, out_6977013047509885177); } -void gnss_H_21(double *state, double *sat_pos_vel, double *out_6257595943694472907) { - H_21(state, sat_pos_vel, out_6257595943694472907); +void gnss_H_21(double *state, double *sat_pos_vel, double *out_3396370189700754510) { + H_21(state, sat_pos_vel, out_3396370189700754510); } void gnss_predict(double *in_x, double *in_P, double *in_Q, double dt) { predict(in_x, in_P, in_Q, dt); diff --git a/selfdrive/locationd/models/generated/gnss.h b/selfdrive/locationd/models/generated/gnss.h index 4af696e32..d55128308 100644 --- a/selfdrive/locationd/models/generated/gnss.h +++ b/selfdrive/locationd/models/generated/gnss.h @@ -5,18 +5,18 @@ void gnss_update_6(double *in_x, double *in_P, double *in_z, double *in_R, doubl void gnss_update_20(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea); void gnss_update_7(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea); void gnss_update_21(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea); -void gnss_err_fun(double *nom_x, double *delta_x, double *out_8128068779397269674); -void gnss_inv_err_fun(double *nom_x, double *true_x, double *out_1141553057367786298); -void gnss_H_mod_fun(double *state, double *out_2327247742686327650); -void gnss_f_fun(double *state, double dt, double *out_690824356618248952); -void gnss_F_fun(double *state, double dt, double *out_2015156480179268251); -void gnss_h_6(double *state, double *sat_pos, double *out_5585365302508030232); -void gnss_H_6(double *state, double *sat_pos, double *out_8739010288179210207); -void gnss_h_20(double *state, double *sat_pos, double *out_8217292551938667710); -void gnss_H_20(double *state, double *sat_pos, double *out_5820758707894519330); -void gnss_h_7(double *state, double *sat_pos_vel, double *out_1303955860558393099); -void gnss_H_7(double *state, double *sat_pos_vel, double *out_6257595943694472907); -void gnss_h_21(double *state, double *sat_pos_vel, double *out_1303955860558393099); -void gnss_H_21(double *state, double *sat_pos_vel, double *out_6257595943694472907); +void gnss_err_fun(double *nom_x, double *delta_x, double *out_5270397344340919402); +void gnss_inv_err_fun(double *nom_x, double *true_x, double *out_1512259161409062554); +void gnss_H_mod_fun(double *state, double *out_8413937430488034064); +void gnss_f_fun(double *state, double dt, double *out_8044790491496694058); +void gnss_F_fun(double *state, double dt, double *out_7107643139068643538); +void gnss_h_6(double *state, double *sat_pos, double *out_1014783744438669605); +void gnss_H_6(double *state, double *sat_pos, double *out_2647892629803094557); +void gnss_h_20(double *state, double *sat_pos, double *out_4446463785726682298); +void gnss_H_20(double *state, double *sat_pos, double *out_2058835805956563056); +void gnss_h_7(double *state, double *sat_pos_vel, double *out_6977013047509885177); +void gnss_H_7(double *state, double *sat_pos_vel, double *out_3396370189700754510); +void gnss_h_21(double *state, double *sat_pos_vel, double *out_6977013047509885177); +void gnss_H_21(double *state, double *sat_pos_vel, double *out_3396370189700754510); void gnss_predict(double *in_x, double *in_P, double *in_Q, double dt); } \ No newline at end of file diff --git a/selfdrive/locationd/models/generated/libkf.so b/selfdrive/locationd/models/generated/libkf.so index ffee1b121..d254c3f69 100755 Binary files a/selfdrive/locationd/models/generated/libkf.so and b/selfdrive/locationd/models/generated/libkf.so differ diff --git a/selfdrive/locationd/models/generated/live.cpp b/selfdrive/locationd/models/generated/live.cpp index 6e559f076..36d1574d6 100644 --- a/selfdrive/locationd/models/generated/live.cpp +++ b/selfdrive/locationd/models/generated/live.cpp @@ -22,1683 +22,1683 @@ const static double MAHA_THRESH_33 = 7.814727903251177; * * * This file is part of 'ekf' * ******************************************************************************/ -void H(double *in_vec, double *out_409344677196790516) { - out_409344677196790516[0] = 0; - out_409344677196790516[1] = -sin(in_vec[1])*sin(in_vec[2])*in_vec[4] - sin(in_vec[1])*cos(in_vec[2])*in_vec[3] - cos(in_vec[1])*in_vec[5]; - out_409344677196790516[2] = -sin(in_vec[2])*cos(in_vec[1])*in_vec[3] + cos(in_vec[1])*cos(in_vec[2])*in_vec[4]; - out_409344677196790516[3] = cos(in_vec[1])*cos(in_vec[2]); - out_409344677196790516[4] = sin(in_vec[2])*cos(in_vec[1]); - out_409344677196790516[5] = -sin(in_vec[1]); - out_409344677196790516[6] = (sin(in_vec[0])*sin(in_vec[2]) + sin(in_vec[1])*cos(in_vec[0])*cos(in_vec[2]))*in_vec[3] + (-sin(in_vec[0])*cos(in_vec[2]) + sin(in_vec[1])*sin(in_vec[2])*cos(in_vec[0]))*in_vec[4] + cos(in_vec[0])*cos(in_vec[1])*in_vec[5]; - out_409344677196790516[7] = -sin(in_vec[0])*sin(in_vec[1])*in_vec[5] + sin(in_vec[0])*sin(in_vec[2])*cos(in_vec[1])*in_vec[4] + sin(in_vec[0])*cos(in_vec[1])*cos(in_vec[2])*in_vec[3]; - out_409344677196790516[8] = (-sin(in_vec[0])*sin(in_vec[1])*sin(in_vec[2]) - cos(in_vec[0])*cos(in_vec[2]))*in_vec[3] + (sin(in_vec[0])*sin(in_vec[1])*cos(in_vec[2]) - sin(in_vec[2])*cos(in_vec[0]))*in_vec[4]; - out_409344677196790516[9] = sin(in_vec[0])*sin(in_vec[1])*cos(in_vec[2]) - sin(in_vec[2])*cos(in_vec[0]); - out_409344677196790516[10] = sin(in_vec[0])*sin(in_vec[1])*sin(in_vec[2]) + cos(in_vec[0])*cos(in_vec[2]); - out_409344677196790516[11] = sin(in_vec[0])*cos(in_vec[1]); - out_409344677196790516[12] = (-sin(in_vec[0])*sin(in_vec[1])*sin(in_vec[2]) - cos(in_vec[0])*cos(in_vec[2]))*in_vec[4] + (-sin(in_vec[0])*sin(in_vec[1])*cos(in_vec[2]) + sin(in_vec[2])*cos(in_vec[0]))*in_vec[3] - sin(in_vec[0])*cos(in_vec[1])*in_vec[5]; - out_409344677196790516[13] = -sin(in_vec[1])*cos(in_vec[0])*in_vec[5] + sin(in_vec[2])*cos(in_vec[0])*cos(in_vec[1])*in_vec[4] + cos(in_vec[0])*cos(in_vec[1])*cos(in_vec[2])*in_vec[3]; - out_409344677196790516[14] = (sin(in_vec[0])*sin(in_vec[2]) + sin(in_vec[1])*cos(in_vec[0])*cos(in_vec[2]))*in_vec[4] + (sin(in_vec[0])*cos(in_vec[2]) - sin(in_vec[1])*sin(in_vec[2])*cos(in_vec[0]))*in_vec[3]; - out_409344677196790516[15] = sin(in_vec[0])*sin(in_vec[2]) + sin(in_vec[1])*cos(in_vec[0])*cos(in_vec[2]); - out_409344677196790516[16] = -sin(in_vec[0])*cos(in_vec[2]) + sin(in_vec[1])*sin(in_vec[2])*cos(in_vec[0]); - out_409344677196790516[17] = cos(in_vec[0])*cos(in_vec[1]); +void H(double *in_vec, double *out_2107061543090158966) { + out_2107061543090158966[0] = 0; + out_2107061543090158966[1] = -sin(in_vec[1])*sin(in_vec[2])*in_vec[4] - sin(in_vec[1])*cos(in_vec[2])*in_vec[3] - cos(in_vec[1])*in_vec[5]; + out_2107061543090158966[2] = -sin(in_vec[2])*cos(in_vec[1])*in_vec[3] + cos(in_vec[1])*cos(in_vec[2])*in_vec[4]; + out_2107061543090158966[3] = cos(in_vec[1])*cos(in_vec[2]); + out_2107061543090158966[4] = sin(in_vec[2])*cos(in_vec[1]); + out_2107061543090158966[5] = -sin(in_vec[1]); + out_2107061543090158966[6] = (sin(in_vec[0])*sin(in_vec[2]) + sin(in_vec[1])*cos(in_vec[0])*cos(in_vec[2]))*in_vec[3] + (-sin(in_vec[0])*cos(in_vec[2]) + sin(in_vec[1])*sin(in_vec[2])*cos(in_vec[0]))*in_vec[4] + cos(in_vec[0])*cos(in_vec[1])*in_vec[5]; + out_2107061543090158966[7] = -sin(in_vec[0])*sin(in_vec[1])*in_vec[5] + sin(in_vec[0])*sin(in_vec[2])*cos(in_vec[1])*in_vec[4] + sin(in_vec[0])*cos(in_vec[1])*cos(in_vec[2])*in_vec[3]; + out_2107061543090158966[8] = (-sin(in_vec[0])*sin(in_vec[1])*sin(in_vec[2]) - cos(in_vec[0])*cos(in_vec[2]))*in_vec[3] + (sin(in_vec[0])*sin(in_vec[1])*cos(in_vec[2]) - sin(in_vec[2])*cos(in_vec[0]))*in_vec[4]; + out_2107061543090158966[9] = sin(in_vec[0])*sin(in_vec[1])*cos(in_vec[2]) - sin(in_vec[2])*cos(in_vec[0]); + out_2107061543090158966[10] = sin(in_vec[0])*sin(in_vec[1])*sin(in_vec[2]) + cos(in_vec[0])*cos(in_vec[2]); + out_2107061543090158966[11] = sin(in_vec[0])*cos(in_vec[1]); + out_2107061543090158966[12] = (-sin(in_vec[0])*sin(in_vec[1])*sin(in_vec[2]) - cos(in_vec[0])*cos(in_vec[2]))*in_vec[4] + (-sin(in_vec[0])*sin(in_vec[1])*cos(in_vec[2]) + sin(in_vec[2])*cos(in_vec[0]))*in_vec[3] - sin(in_vec[0])*cos(in_vec[1])*in_vec[5]; + out_2107061543090158966[13] = -sin(in_vec[1])*cos(in_vec[0])*in_vec[5] + sin(in_vec[2])*cos(in_vec[0])*cos(in_vec[1])*in_vec[4] + cos(in_vec[0])*cos(in_vec[1])*cos(in_vec[2])*in_vec[3]; + out_2107061543090158966[14] = (sin(in_vec[0])*sin(in_vec[2]) + sin(in_vec[1])*cos(in_vec[0])*cos(in_vec[2]))*in_vec[4] + (sin(in_vec[0])*cos(in_vec[2]) - sin(in_vec[1])*sin(in_vec[2])*cos(in_vec[0]))*in_vec[3]; + out_2107061543090158966[15] = sin(in_vec[0])*sin(in_vec[2]) + sin(in_vec[1])*cos(in_vec[0])*cos(in_vec[2]); + out_2107061543090158966[16] = -sin(in_vec[0])*cos(in_vec[2]) + sin(in_vec[1])*sin(in_vec[2])*cos(in_vec[0]); + out_2107061543090158966[17] = cos(in_vec[0])*cos(in_vec[1]); } -void err_fun(double *nom_x, double *delta_x, double *out_5410019838797489797) { - out_5410019838797489797[0] = delta_x[0] + nom_x[0]; - out_5410019838797489797[1] = delta_x[1] + nom_x[1]; - out_5410019838797489797[2] = delta_x[2] + nom_x[2]; - out_5410019838797489797[3] = -0.5*delta_x[3]*nom_x[4] - 0.5*delta_x[4]*nom_x[5] - 0.5*delta_x[5]*nom_x[6] + 1.0*nom_x[3]; - out_5410019838797489797[4] = 0.5*delta_x[3]*nom_x[3] + 0.5*delta_x[4]*nom_x[6] - 0.5*delta_x[5]*nom_x[5] + 1.0*nom_x[4]; - out_5410019838797489797[5] = -0.5*delta_x[3]*nom_x[6] + 0.5*delta_x[4]*nom_x[3] + 0.5*delta_x[5]*nom_x[4] + 1.0*nom_x[5]; - out_5410019838797489797[6] = 0.5*delta_x[3]*nom_x[5] - 0.5*delta_x[4]*nom_x[4] + 0.5*delta_x[5]*nom_x[3] + 1.0*nom_x[6]; - out_5410019838797489797[7] = delta_x[6] + nom_x[7]; - out_5410019838797489797[8] = delta_x[7] + nom_x[8]; - out_5410019838797489797[9] = delta_x[8] + nom_x[9]; - out_5410019838797489797[10] = delta_x[9] + nom_x[10]; - out_5410019838797489797[11] = delta_x[10] + nom_x[11]; - out_5410019838797489797[12] = delta_x[11] + nom_x[12]; - out_5410019838797489797[13] = delta_x[12] + nom_x[13]; - out_5410019838797489797[14] = delta_x[13] + nom_x[14]; - out_5410019838797489797[15] = delta_x[14] + nom_x[15]; - out_5410019838797489797[16] = delta_x[15] + nom_x[16]; - out_5410019838797489797[17] = delta_x[16] + nom_x[17]; - out_5410019838797489797[18] = delta_x[17] + nom_x[18]; - out_5410019838797489797[19] = delta_x[18] + nom_x[19]; - out_5410019838797489797[20] = delta_x[19] + nom_x[20]; - out_5410019838797489797[21] = delta_x[20] + nom_x[21]; +void err_fun(double *nom_x, double *delta_x, double *out_1090842864546838841) { + out_1090842864546838841[0] = delta_x[0] + nom_x[0]; + out_1090842864546838841[1] = delta_x[1] + nom_x[1]; + out_1090842864546838841[2] = delta_x[2] + nom_x[2]; + out_1090842864546838841[3] = -0.5*delta_x[3]*nom_x[4] - 0.5*delta_x[4]*nom_x[5] - 0.5*delta_x[5]*nom_x[6] + 1.0*nom_x[3]; + out_1090842864546838841[4] = 0.5*delta_x[3]*nom_x[3] + 0.5*delta_x[4]*nom_x[6] - 0.5*delta_x[5]*nom_x[5] + 1.0*nom_x[4]; + out_1090842864546838841[5] = -0.5*delta_x[3]*nom_x[6] + 0.5*delta_x[4]*nom_x[3] + 0.5*delta_x[5]*nom_x[4] + 1.0*nom_x[5]; + out_1090842864546838841[6] = 0.5*delta_x[3]*nom_x[5] - 0.5*delta_x[4]*nom_x[4] + 0.5*delta_x[5]*nom_x[3] + 1.0*nom_x[6]; + out_1090842864546838841[7] = delta_x[6] + nom_x[7]; + out_1090842864546838841[8] = delta_x[7] + nom_x[8]; + out_1090842864546838841[9] = delta_x[8] + nom_x[9]; + out_1090842864546838841[10] = delta_x[9] + nom_x[10]; + out_1090842864546838841[11] = delta_x[10] + nom_x[11]; + out_1090842864546838841[12] = delta_x[11] + nom_x[12]; + out_1090842864546838841[13] = delta_x[12] + nom_x[13]; + out_1090842864546838841[14] = delta_x[13] + nom_x[14]; + out_1090842864546838841[15] = delta_x[14] + nom_x[15]; + out_1090842864546838841[16] = delta_x[15] + nom_x[16]; + out_1090842864546838841[17] = delta_x[16] + nom_x[17]; + out_1090842864546838841[18] = delta_x[17] + nom_x[18]; + out_1090842864546838841[19] = delta_x[18] + nom_x[19]; + out_1090842864546838841[20] = delta_x[19] + nom_x[20]; + out_1090842864546838841[21] = delta_x[20] + nom_x[21]; } -void inv_err_fun(double *nom_x, double *true_x, double *out_5107495764560298202) { - out_5107495764560298202[0] = -nom_x[0] + true_x[0]; - out_5107495764560298202[1] = -nom_x[1] + true_x[1]; - out_5107495764560298202[2] = -nom_x[2] + true_x[2]; - out_5107495764560298202[3] = 2*nom_x[3]*true_x[4] - 2*nom_x[4]*true_x[3] + 2*nom_x[5]*true_x[6] - 2*nom_x[6]*true_x[5]; - out_5107495764560298202[4] = 2*nom_x[3]*true_x[5] - 2*nom_x[4]*true_x[6] - 2*nom_x[5]*true_x[3] + 2*nom_x[6]*true_x[4]; - out_5107495764560298202[5] = 2*nom_x[3]*true_x[6] + 2*nom_x[4]*true_x[5] - 2*nom_x[5]*true_x[4] - 2*nom_x[6]*true_x[3]; - out_5107495764560298202[6] = -nom_x[7] + true_x[7]; - out_5107495764560298202[7] = -nom_x[8] + true_x[8]; - out_5107495764560298202[8] = -nom_x[9] + true_x[9]; - out_5107495764560298202[9] = -nom_x[10] + true_x[10]; - out_5107495764560298202[10] = -nom_x[11] + true_x[11]; - out_5107495764560298202[11] = -nom_x[12] + true_x[12]; - out_5107495764560298202[12] = -nom_x[13] + true_x[13]; - out_5107495764560298202[13] = -nom_x[14] + true_x[14]; - out_5107495764560298202[14] = -nom_x[15] + true_x[15]; - out_5107495764560298202[15] = -nom_x[16] + true_x[16]; - out_5107495764560298202[16] = -nom_x[17] + true_x[17]; - out_5107495764560298202[17] = -nom_x[18] + true_x[18]; - out_5107495764560298202[18] = -nom_x[19] + true_x[19]; - out_5107495764560298202[19] = -nom_x[20] + true_x[20]; - out_5107495764560298202[20] = -nom_x[21] + true_x[21]; +void inv_err_fun(double *nom_x, double *true_x, double *out_1751534880763809428) { + out_1751534880763809428[0] = -nom_x[0] + true_x[0]; + out_1751534880763809428[1] = -nom_x[1] + true_x[1]; + out_1751534880763809428[2] = -nom_x[2] + true_x[2]; + out_1751534880763809428[3] = 2*nom_x[3]*true_x[4] - 2*nom_x[4]*true_x[3] + 2*nom_x[5]*true_x[6] - 2*nom_x[6]*true_x[5]; + out_1751534880763809428[4] = 2*nom_x[3]*true_x[5] - 2*nom_x[4]*true_x[6] - 2*nom_x[5]*true_x[3] + 2*nom_x[6]*true_x[4]; + out_1751534880763809428[5] = 2*nom_x[3]*true_x[6] + 2*nom_x[4]*true_x[5] - 2*nom_x[5]*true_x[4] - 2*nom_x[6]*true_x[3]; + out_1751534880763809428[6] = -nom_x[7] + true_x[7]; + out_1751534880763809428[7] = -nom_x[8] + true_x[8]; + out_1751534880763809428[8] = -nom_x[9] + true_x[9]; + out_1751534880763809428[9] = -nom_x[10] + true_x[10]; + out_1751534880763809428[10] = -nom_x[11] + true_x[11]; + out_1751534880763809428[11] = -nom_x[12] + true_x[12]; + out_1751534880763809428[12] = -nom_x[13] + true_x[13]; + out_1751534880763809428[13] = -nom_x[14] + true_x[14]; + out_1751534880763809428[14] = -nom_x[15] + true_x[15]; + out_1751534880763809428[15] = -nom_x[16] + true_x[16]; + out_1751534880763809428[16] = -nom_x[17] + true_x[17]; + out_1751534880763809428[17] = -nom_x[18] + true_x[18]; + out_1751534880763809428[18] = -nom_x[19] + true_x[19]; + out_1751534880763809428[19] = -nom_x[20] + true_x[20]; + out_1751534880763809428[20] = -nom_x[21] + true_x[21]; } -void H_mod_fun(double *state, double *out_4893943347815461903) { - out_4893943347815461903[0] = 1.0; - out_4893943347815461903[1] = 0; - out_4893943347815461903[2] = 0; - out_4893943347815461903[3] = 0; - out_4893943347815461903[4] = 0; - out_4893943347815461903[5] = 0; - out_4893943347815461903[6] = 0; - out_4893943347815461903[7] = 0; - out_4893943347815461903[8] = 0; - out_4893943347815461903[9] = 0; - out_4893943347815461903[10] = 0; - out_4893943347815461903[11] = 0; - out_4893943347815461903[12] = 0; - out_4893943347815461903[13] = 0; - out_4893943347815461903[14] = 0; - out_4893943347815461903[15] = 0; - out_4893943347815461903[16] = 0; - out_4893943347815461903[17] = 0; - out_4893943347815461903[18] = 0; - out_4893943347815461903[19] = 0; - out_4893943347815461903[20] = 0; - out_4893943347815461903[21] = 0; - out_4893943347815461903[22] = 1.0; - out_4893943347815461903[23] = 0; - out_4893943347815461903[24] = 0; - out_4893943347815461903[25] = 0; - out_4893943347815461903[26] = 0; - out_4893943347815461903[27] = 0; - out_4893943347815461903[28] = 0; - out_4893943347815461903[29] = 0; - out_4893943347815461903[30] = 0; - out_4893943347815461903[31] = 0; - out_4893943347815461903[32] = 0; - out_4893943347815461903[33] = 0; - out_4893943347815461903[34] = 0; - out_4893943347815461903[35] = 0; - out_4893943347815461903[36] = 0; - out_4893943347815461903[37] = 0; - out_4893943347815461903[38] = 0; - out_4893943347815461903[39] = 0; - out_4893943347815461903[40] = 0; - out_4893943347815461903[41] = 0; - out_4893943347815461903[42] = 0; - out_4893943347815461903[43] = 0; - out_4893943347815461903[44] = 1.0; - out_4893943347815461903[45] = 0; - out_4893943347815461903[46] = 0; - out_4893943347815461903[47] = 0; - out_4893943347815461903[48] = 0; - out_4893943347815461903[49] = 0; - out_4893943347815461903[50] = 0; - out_4893943347815461903[51] = 0; - out_4893943347815461903[52] = 0; - out_4893943347815461903[53] = 0; - out_4893943347815461903[54] = 0; - out_4893943347815461903[55] = 0; - out_4893943347815461903[56] = 0; - out_4893943347815461903[57] = 0; - out_4893943347815461903[58] = 0; - out_4893943347815461903[59] = 0; - out_4893943347815461903[60] = 0; - out_4893943347815461903[61] = 0; - out_4893943347815461903[62] = 0; - out_4893943347815461903[63] = 0; - out_4893943347815461903[64] = 0; - out_4893943347815461903[65] = 0; - out_4893943347815461903[66] = -0.5*state[4]; - out_4893943347815461903[67] = -0.5*state[5]; - out_4893943347815461903[68] = -0.5*state[6]; - out_4893943347815461903[69] = 0; - out_4893943347815461903[70] = 0; - out_4893943347815461903[71] = 0; - out_4893943347815461903[72] = 0; - out_4893943347815461903[73] = 0; - out_4893943347815461903[74] = 0; - out_4893943347815461903[75] = 0; - out_4893943347815461903[76] = 0; - out_4893943347815461903[77] = 0; - out_4893943347815461903[78] = 0; - out_4893943347815461903[79] = 0; - out_4893943347815461903[80] = 0; - out_4893943347815461903[81] = 0; - out_4893943347815461903[82] = 0; - out_4893943347815461903[83] = 0; - out_4893943347815461903[84] = 0; - out_4893943347815461903[85] = 0; - out_4893943347815461903[86] = 0; - out_4893943347815461903[87] = 0.5*state[3]; - out_4893943347815461903[88] = 0.5*state[6]; - out_4893943347815461903[89] = -0.5*state[5]; - out_4893943347815461903[90] = 0; - out_4893943347815461903[91] = 0; - out_4893943347815461903[92] = 0; - out_4893943347815461903[93] = 0; - out_4893943347815461903[94] = 0; - out_4893943347815461903[95] = 0; - out_4893943347815461903[96] = 0; - out_4893943347815461903[97] = 0; - out_4893943347815461903[98] = 0; - out_4893943347815461903[99] = 0; - out_4893943347815461903[100] = 0; - out_4893943347815461903[101] = 0; - out_4893943347815461903[102] = 0; - out_4893943347815461903[103] = 0; - out_4893943347815461903[104] = 0; - out_4893943347815461903[105] = 0; - out_4893943347815461903[106] = 0; - out_4893943347815461903[107] = 0; - out_4893943347815461903[108] = -0.5*state[6]; - out_4893943347815461903[109] = 0.5*state[3]; - out_4893943347815461903[110] = 0.5*state[4]; - out_4893943347815461903[111] = 0; - out_4893943347815461903[112] = 0; - out_4893943347815461903[113] = 0; - out_4893943347815461903[114] = 0; - out_4893943347815461903[115] = 0; - out_4893943347815461903[116] = 0; - out_4893943347815461903[117] = 0; - out_4893943347815461903[118] = 0; - out_4893943347815461903[119] = 0; - out_4893943347815461903[120] = 0; - out_4893943347815461903[121] = 0; - out_4893943347815461903[122] = 0; - out_4893943347815461903[123] = 0; - out_4893943347815461903[124] = 0; - out_4893943347815461903[125] = 0; - out_4893943347815461903[126] = 0; - out_4893943347815461903[127] = 0; - out_4893943347815461903[128] = 0; - out_4893943347815461903[129] = 0.5*state[5]; - out_4893943347815461903[130] = -0.5*state[4]; - out_4893943347815461903[131] = 0.5*state[3]; - out_4893943347815461903[132] = 0; - out_4893943347815461903[133] = 0; - out_4893943347815461903[134] = 0; - out_4893943347815461903[135] = 0; - out_4893943347815461903[136] = 0; - out_4893943347815461903[137] = 0; - out_4893943347815461903[138] = 0; - out_4893943347815461903[139] = 0; - out_4893943347815461903[140] = 0; - out_4893943347815461903[141] = 0; - out_4893943347815461903[142] = 0; - out_4893943347815461903[143] = 0; - out_4893943347815461903[144] = 0; - out_4893943347815461903[145] = 0; - out_4893943347815461903[146] = 0; - out_4893943347815461903[147] = 0; - out_4893943347815461903[148] = 0; - out_4893943347815461903[149] = 0; - out_4893943347815461903[150] = 0; - out_4893943347815461903[151] = 0; - out_4893943347815461903[152] = 0; - out_4893943347815461903[153] = 1.0; - out_4893943347815461903[154] = 0; - out_4893943347815461903[155] = 0; - out_4893943347815461903[156] = 0; - out_4893943347815461903[157] = 0; - out_4893943347815461903[158] = 0; - out_4893943347815461903[159] = 0; - out_4893943347815461903[160] = 0; - out_4893943347815461903[161] = 0; - out_4893943347815461903[162] = 0; - out_4893943347815461903[163] = 0; - out_4893943347815461903[164] = 0; - out_4893943347815461903[165] = 0; - out_4893943347815461903[166] = 0; - out_4893943347815461903[167] = 0; - out_4893943347815461903[168] = 0; - out_4893943347815461903[169] = 0; - out_4893943347815461903[170] = 0; - out_4893943347815461903[171] = 0; - out_4893943347815461903[172] = 0; - out_4893943347815461903[173] = 0; - out_4893943347815461903[174] = 0; - out_4893943347815461903[175] = 1.0; - out_4893943347815461903[176] = 0; - out_4893943347815461903[177] = 0; - out_4893943347815461903[178] = 0; - out_4893943347815461903[179] = 0; - out_4893943347815461903[180] = 0; - out_4893943347815461903[181] = 0; - out_4893943347815461903[182] = 0; - out_4893943347815461903[183] = 0; - out_4893943347815461903[184] = 0; - out_4893943347815461903[185] = 0; - out_4893943347815461903[186] = 0; - out_4893943347815461903[187] = 0; - out_4893943347815461903[188] = 0; - out_4893943347815461903[189] = 0; - out_4893943347815461903[190] = 0; - out_4893943347815461903[191] = 0; - out_4893943347815461903[192] = 0; - out_4893943347815461903[193] = 0; - out_4893943347815461903[194] = 0; - out_4893943347815461903[195] = 0; - out_4893943347815461903[196] = 0; - out_4893943347815461903[197] = 1.0; - out_4893943347815461903[198] = 0; - out_4893943347815461903[199] = 0; - out_4893943347815461903[200] = 0; - out_4893943347815461903[201] = 0; - out_4893943347815461903[202] = 0; - out_4893943347815461903[203] = 0; - out_4893943347815461903[204] = 0; - out_4893943347815461903[205] = 0; - out_4893943347815461903[206] = 0; - out_4893943347815461903[207] = 0; - out_4893943347815461903[208] = 0; - out_4893943347815461903[209] = 0; - out_4893943347815461903[210] = 0; - out_4893943347815461903[211] = 0; - out_4893943347815461903[212] = 0; - out_4893943347815461903[213] = 0; - out_4893943347815461903[214] = 0; - out_4893943347815461903[215] = 0; - out_4893943347815461903[216] = 0; - out_4893943347815461903[217] = 0; - out_4893943347815461903[218] = 0; - out_4893943347815461903[219] = 1.0; - out_4893943347815461903[220] = 0; - out_4893943347815461903[221] = 0; - out_4893943347815461903[222] = 0; - out_4893943347815461903[223] = 0; - out_4893943347815461903[224] = 0; - out_4893943347815461903[225] = 0; - out_4893943347815461903[226] = 0; - out_4893943347815461903[227] = 0; - out_4893943347815461903[228] = 0; - out_4893943347815461903[229] = 0; - out_4893943347815461903[230] = 0; - out_4893943347815461903[231] = 0; - out_4893943347815461903[232] = 0; - out_4893943347815461903[233] = 0; - out_4893943347815461903[234] = 0; - out_4893943347815461903[235] = 0; - out_4893943347815461903[236] = 0; - out_4893943347815461903[237] = 0; - out_4893943347815461903[238] = 0; - out_4893943347815461903[239] = 0; - out_4893943347815461903[240] = 0; - out_4893943347815461903[241] = 1.0; - out_4893943347815461903[242] = 0; - out_4893943347815461903[243] = 0; - out_4893943347815461903[244] = 0; - out_4893943347815461903[245] = 0; - out_4893943347815461903[246] = 0; - out_4893943347815461903[247] = 0; - out_4893943347815461903[248] = 0; - out_4893943347815461903[249] = 0; - out_4893943347815461903[250] = 0; - out_4893943347815461903[251] = 0; - out_4893943347815461903[252] = 0; - out_4893943347815461903[253] = 0; - out_4893943347815461903[254] = 0; - out_4893943347815461903[255] = 0; - out_4893943347815461903[256] = 0; - out_4893943347815461903[257] = 0; - out_4893943347815461903[258] = 0; - out_4893943347815461903[259] = 0; - out_4893943347815461903[260] = 0; - out_4893943347815461903[261] = 0; - out_4893943347815461903[262] = 0; - out_4893943347815461903[263] = 1.0; - out_4893943347815461903[264] = 0; - out_4893943347815461903[265] = 0; - out_4893943347815461903[266] = 0; - out_4893943347815461903[267] = 0; - out_4893943347815461903[268] = 0; - out_4893943347815461903[269] = 0; - out_4893943347815461903[270] = 0; - out_4893943347815461903[271] = 0; - out_4893943347815461903[272] = 0; - out_4893943347815461903[273] = 0; - out_4893943347815461903[274] = 0; - out_4893943347815461903[275] = 0; - out_4893943347815461903[276] = 0; - out_4893943347815461903[277] = 0; - out_4893943347815461903[278] = 0; - out_4893943347815461903[279] = 0; - out_4893943347815461903[280] = 0; - out_4893943347815461903[281] = 0; - out_4893943347815461903[282] = 0; - out_4893943347815461903[283] = 0; - out_4893943347815461903[284] = 0; - out_4893943347815461903[285] = 1.0; - out_4893943347815461903[286] = 0; - out_4893943347815461903[287] = 0; - out_4893943347815461903[288] = 0; - out_4893943347815461903[289] = 0; - out_4893943347815461903[290] = 0; - out_4893943347815461903[291] = 0; - out_4893943347815461903[292] = 0; - out_4893943347815461903[293] = 0; - out_4893943347815461903[294] = 0; - out_4893943347815461903[295] = 0; - out_4893943347815461903[296] = 0; - out_4893943347815461903[297] = 0; - out_4893943347815461903[298] = 0; - out_4893943347815461903[299] = 0; - out_4893943347815461903[300] = 0; - out_4893943347815461903[301] = 0; - out_4893943347815461903[302] = 0; - out_4893943347815461903[303] = 0; - out_4893943347815461903[304] = 0; - out_4893943347815461903[305] = 0; - out_4893943347815461903[306] = 0; - out_4893943347815461903[307] = 1.0; - out_4893943347815461903[308] = 0; - out_4893943347815461903[309] = 0; - out_4893943347815461903[310] = 0; - out_4893943347815461903[311] = 0; - out_4893943347815461903[312] = 0; - out_4893943347815461903[313] = 0; - out_4893943347815461903[314] = 0; - out_4893943347815461903[315] = 0; - out_4893943347815461903[316] = 0; - out_4893943347815461903[317] = 0; - out_4893943347815461903[318] = 0; - out_4893943347815461903[319] = 0; - out_4893943347815461903[320] = 0; - out_4893943347815461903[321] = 0; - out_4893943347815461903[322] = 0; - out_4893943347815461903[323] = 0; - out_4893943347815461903[324] = 0; - out_4893943347815461903[325] = 0; - out_4893943347815461903[326] = 0; - out_4893943347815461903[327] = 0; - out_4893943347815461903[328] = 0; - out_4893943347815461903[329] = 1.0; - out_4893943347815461903[330] = 0; - out_4893943347815461903[331] = 0; - out_4893943347815461903[332] = 0; - out_4893943347815461903[333] = 0; - out_4893943347815461903[334] = 0; - out_4893943347815461903[335] = 0; - out_4893943347815461903[336] = 0; - out_4893943347815461903[337] = 0; - out_4893943347815461903[338] = 0; - out_4893943347815461903[339] = 0; - out_4893943347815461903[340] = 0; - out_4893943347815461903[341] = 0; - out_4893943347815461903[342] = 0; - out_4893943347815461903[343] = 0; - out_4893943347815461903[344] = 0; - out_4893943347815461903[345] = 0; - out_4893943347815461903[346] = 0; - out_4893943347815461903[347] = 0; - out_4893943347815461903[348] = 0; - out_4893943347815461903[349] = 0; - out_4893943347815461903[350] = 0; - out_4893943347815461903[351] = 1.0; - out_4893943347815461903[352] = 0; - out_4893943347815461903[353] = 0; - out_4893943347815461903[354] = 0; - out_4893943347815461903[355] = 0; - out_4893943347815461903[356] = 0; - out_4893943347815461903[357] = 0; - out_4893943347815461903[358] = 0; - out_4893943347815461903[359] = 0; - out_4893943347815461903[360] = 0; - out_4893943347815461903[361] = 0; - out_4893943347815461903[362] = 0; - out_4893943347815461903[363] = 0; - out_4893943347815461903[364] = 0; - out_4893943347815461903[365] = 0; - out_4893943347815461903[366] = 0; - out_4893943347815461903[367] = 0; - out_4893943347815461903[368] = 0; - out_4893943347815461903[369] = 0; - out_4893943347815461903[370] = 0; - out_4893943347815461903[371] = 0; - out_4893943347815461903[372] = 0; - out_4893943347815461903[373] = 1.0; - out_4893943347815461903[374] = 0; - out_4893943347815461903[375] = 0; - out_4893943347815461903[376] = 0; - out_4893943347815461903[377] = 0; - out_4893943347815461903[378] = 0; - out_4893943347815461903[379] = 0; - out_4893943347815461903[380] = 0; - out_4893943347815461903[381] = 0; - out_4893943347815461903[382] = 0; - out_4893943347815461903[383] = 0; - out_4893943347815461903[384] = 0; - out_4893943347815461903[385] = 0; - out_4893943347815461903[386] = 0; - out_4893943347815461903[387] = 0; - out_4893943347815461903[388] = 0; - out_4893943347815461903[389] = 0; - out_4893943347815461903[390] = 0; - out_4893943347815461903[391] = 0; - out_4893943347815461903[392] = 0; - out_4893943347815461903[393] = 0; - out_4893943347815461903[394] = 0; - out_4893943347815461903[395] = 1.0; - out_4893943347815461903[396] = 0; - out_4893943347815461903[397] = 0; - out_4893943347815461903[398] = 0; - out_4893943347815461903[399] = 0; - out_4893943347815461903[400] = 0; - out_4893943347815461903[401] = 0; - out_4893943347815461903[402] = 0; - out_4893943347815461903[403] = 0; - out_4893943347815461903[404] = 0; - out_4893943347815461903[405] = 0; - out_4893943347815461903[406] = 0; - out_4893943347815461903[407] = 0; - out_4893943347815461903[408] = 0; - out_4893943347815461903[409] = 0; - out_4893943347815461903[410] = 0; - out_4893943347815461903[411] = 0; - out_4893943347815461903[412] = 0; - out_4893943347815461903[413] = 0; - out_4893943347815461903[414] = 0; - out_4893943347815461903[415] = 0; - out_4893943347815461903[416] = 0; - out_4893943347815461903[417] = 1.0; - out_4893943347815461903[418] = 0; - out_4893943347815461903[419] = 0; - out_4893943347815461903[420] = 0; - out_4893943347815461903[421] = 0; - out_4893943347815461903[422] = 0; - out_4893943347815461903[423] = 0; - out_4893943347815461903[424] = 0; - out_4893943347815461903[425] = 0; - out_4893943347815461903[426] = 0; - out_4893943347815461903[427] = 0; - out_4893943347815461903[428] = 0; - out_4893943347815461903[429] = 0; - out_4893943347815461903[430] = 0; - out_4893943347815461903[431] = 0; - out_4893943347815461903[432] = 0; - out_4893943347815461903[433] = 0; - out_4893943347815461903[434] = 0; - out_4893943347815461903[435] = 0; - out_4893943347815461903[436] = 0; - out_4893943347815461903[437] = 0; - out_4893943347815461903[438] = 0; - out_4893943347815461903[439] = 1.0; - out_4893943347815461903[440] = 0; - out_4893943347815461903[441] = 0; - out_4893943347815461903[442] = 0; - out_4893943347815461903[443] = 0; - out_4893943347815461903[444] = 0; - out_4893943347815461903[445] = 0; - out_4893943347815461903[446] = 0; - out_4893943347815461903[447] = 0; - out_4893943347815461903[448] = 0; - out_4893943347815461903[449] = 0; - out_4893943347815461903[450] = 0; - out_4893943347815461903[451] = 0; - out_4893943347815461903[452] = 0; - out_4893943347815461903[453] = 0; - out_4893943347815461903[454] = 0; - out_4893943347815461903[455] = 0; - out_4893943347815461903[456] = 0; - out_4893943347815461903[457] = 0; - out_4893943347815461903[458] = 0; - out_4893943347815461903[459] = 0; - out_4893943347815461903[460] = 0; - out_4893943347815461903[461] = 1.0; +void H_mod_fun(double *state, double *out_2270168032272230264) { + out_2270168032272230264[0] = 1.0; + out_2270168032272230264[1] = 0; + out_2270168032272230264[2] = 0; + out_2270168032272230264[3] = 0; + out_2270168032272230264[4] = 0; + out_2270168032272230264[5] = 0; + out_2270168032272230264[6] = 0; + out_2270168032272230264[7] = 0; + out_2270168032272230264[8] = 0; + out_2270168032272230264[9] = 0; + out_2270168032272230264[10] = 0; + out_2270168032272230264[11] = 0; + out_2270168032272230264[12] = 0; + out_2270168032272230264[13] = 0; + out_2270168032272230264[14] = 0; + out_2270168032272230264[15] = 0; + out_2270168032272230264[16] = 0; + out_2270168032272230264[17] = 0; + out_2270168032272230264[18] = 0; + out_2270168032272230264[19] = 0; + out_2270168032272230264[20] = 0; + out_2270168032272230264[21] = 0; + out_2270168032272230264[22] = 1.0; + out_2270168032272230264[23] = 0; + out_2270168032272230264[24] = 0; + out_2270168032272230264[25] = 0; + out_2270168032272230264[26] = 0; + out_2270168032272230264[27] = 0; + out_2270168032272230264[28] = 0; + out_2270168032272230264[29] = 0; + out_2270168032272230264[30] = 0; + out_2270168032272230264[31] = 0; + out_2270168032272230264[32] = 0; + out_2270168032272230264[33] = 0; + out_2270168032272230264[34] = 0; + out_2270168032272230264[35] = 0; + out_2270168032272230264[36] = 0; + out_2270168032272230264[37] = 0; + out_2270168032272230264[38] = 0; + out_2270168032272230264[39] = 0; + out_2270168032272230264[40] = 0; + out_2270168032272230264[41] = 0; + out_2270168032272230264[42] = 0; + out_2270168032272230264[43] = 0; + out_2270168032272230264[44] = 1.0; + out_2270168032272230264[45] = 0; + out_2270168032272230264[46] = 0; + out_2270168032272230264[47] = 0; + out_2270168032272230264[48] = 0; + out_2270168032272230264[49] = 0; + out_2270168032272230264[50] = 0; + out_2270168032272230264[51] = 0; + out_2270168032272230264[52] = 0; + out_2270168032272230264[53] = 0; + out_2270168032272230264[54] = 0; + out_2270168032272230264[55] = 0; + out_2270168032272230264[56] = 0; + out_2270168032272230264[57] = 0; + out_2270168032272230264[58] = 0; + out_2270168032272230264[59] = 0; + out_2270168032272230264[60] = 0; + out_2270168032272230264[61] = 0; + out_2270168032272230264[62] = 0; + out_2270168032272230264[63] = 0; + out_2270168032272230264[64] = 0; + out_2270168032272230264[65] = 0; + out_2270168032272230264[66] = -0.5*state[4]; + out_2270168032272230264[67] = -0.5*state[5]; + out_2270168032272230264[68] = -0.5*state[6]; + out_2270168032272230264[69] = 0; + out_2270168032272230264[70] = 0; + out_2270168032272230264[71] = 0; + out_2270168032272230264[72] = 0; + out_2270168032272230264[73] = 0; + out_2270168032272230264[74] = 0; + out_2270168032272230264[75] = 0; + out_2270168032272230264[76] = 0; + out_2270168032272230264[77] = 0; + out_2270168032272230264[78] = 0; + out_2270168032272230264[79] = 0; + out_2270168032272230264[80] = 0; + out_2270168032272230264[81] = 0; + out_2270168032272230264[82] = 0; + out_2270168032272230264[83] = 0; + out_2270168032272230264[84] = 0; + out_2270168032272230264[85] = 0; + out_2270168032272230264[86] = 0; + out_2270168032272230264[87] = 0.5*state[3]; + out_2270168032272230264[88] = 0.5*state[6]; + out_2270168032272230264[89] = -0.5*state[5]; + out_2270168032272230264[90] = 0; + out_2270168032272230264[91] = 0; + out_2270168032272230264[92] = 0; + out_2270168032272230264[93] = 0; + out_2270168032272230264[94] = 0; + out_2270168032272230264[95] = 0; + out_2270168032272230264[96] = 0; + out_2270168032272230264[97] = 0; + out_2270168032272230264[98] = 0; + out_2270168032272230264[99] = 0; + out_2270168032272230264[100] = 0; + out_2270168032272230264[101] = 0; + out_2270168032272230264[102] = 0; + out_2270168032272230264[103] = 0; + out_2270168032272230264[104] = 0; + out_2270168032272230264[105] = 0; + out_2270168032272230264[106] = 0; + out_2270168032272230264[107] = 0; + out_2270168032272230264[108] = -0.5*state[6]; + out_2270168032272230264[109] = 0.5*state[3]; + out_2270168032272230264[110] = 0.5*state[4]; + out_2270168032272230264[111] = 0; + out_2270168032272230264[112] = 0; + out_2270168032272230264[113] = 0; + out_2270168032272230264[114] = 0; + out_2270168032272230264[115] = 0; + out_2270168032272230264[116] = 0; + out_2270168032272230264[117] = 0; + out_2270168032272230264[118] = 0; + out_2270168032272230264[119] = 0; + out_2270168032272230264[120] = 0; + out_2270168032272230264[121] = 0; + out_2270168032272230264[122] = 0; + out_2270168032272230264[123] = 0; + out_2270168032272230264[124] = 0; + out_2270168032272230264[125] = 0; + out_2270168032272230264[126] = 0; + out_2270168032272230264[127] = 0; + out_2270168032272230264[128] = 0; + out_2270168032272230264[129] = 0.5*state[5]; + out_2270168032272230264[130] = -0.5*state[4]; + out_2270168032272230264[131] = 0.5*state[3]; + out_2270168032272230264[132] = 0; + out_2270168032272230264[133] = 0; + out_2270168032272230264[134] = 0; + out_2270168032272230264[135] = 0; + out_2270168032272230264[136] = 0; + out_2270168032272230264[137] = 0; + out_2270168032272230264[138] = 0; + out_2270168032272230264[139] = 0; + out_2270168032272230264[140] = 0; + out_2270168032272230264[141] = 0; + out_2270168032272230264[142] = 0; + out_2270168032272230264[143] = 0; + out_2270168032272230264[144] = 0; + out_2270168032272230264[145] = 0; + out_2270168032272230264[146] = 0; + out_2270168032272230264[147] = 0; + out_2270168032272230264[148] = 0; + out_2270168032272230264[149] = 0; + out_2270168032272230264[150] = 0; + out_2270168032272230264[151] = 0; + out_2270168032272230264[152] = 0; + out_2270168032272230264[153] = 1.0; + out_2270168032272230264[154] = 0; + out_2270168032272230264[155] = 0; + out_2270168032272230264[156] = 0; + out_2270168032272230264[157] = 0; + out_2270168032272230264[158] = 0; + out_2270168032272230264[159] = 0; + out_2270168032272230264[160] = 0; + out_2270168032272230264[161] = 0; + out_2270168032272230264[162] = 0; + out_2270168032272230264[163] = 0; + out_2270168032272230264[164] = 0; + out_2270168032272230264[165] = 0; + out_2270168032272230264[166] = 0; + out_2270168032272230264[167] = 0; + out_2270168032272230264[168] = 0; + out_2270168032272230264[169] = 0; + out_2270168032272230264[170] = 0; + out_2270168032272230264[171] = 0; + out_2270168032272230264[172] = 0; + out_2270168032272230264[173] = 0; + out_2270168032272230264[174] = 0; + out_2270168032272230264[175] = 1.0; + out_2270168032272230264[176] = 0; + out_2270168032272230264[177] = 0; + out_2270168032272230264[178] = 0; + out_2270168032272230264[179] = 0; + out_2270168032272230264[180] = 0; + out_2270168032272230264[181] = 0; + out_2270168032272230264[182] = 0; + out_2270168032272230264[183] = 0; + out_2270168032272230264[184] = 0; + out_2270168032272230264[185] = 0; + out_2270168032272230264[186] = 0; + out_2270168032272230264[187] = 0; + out_2270168032272230264[188] = 0; + out_2270168032272230264[189] = 0; + out_2270168032272230264[190] = 0; + out_2270168032272230264[191] = 0; + out_2270168032272230264[192] = 0; + out_2270168032272230264[193] = 0; + out_2270168032272230264[194] = 0; + out_2270168032272230264[195] = 0; + out_2270168032272230264[196] = 0; + out_2270168032272230264[197] = 1.0; + out_2270168032272230264[198] = 0; + out_2270168032272230264[199] = 0; + out_2270168032272230264[200] = 0; + out_2270168032272230264[201] = 0; + out_2270168032272230264[202] = 0; + out_2270168032272230264[203] = 0; + out_2270168032272230264[204] = 0; + out_2270168032272230264[205] = 0; + out_2270168032272230264[206] = 0; + out_2270168032272230264[207] = 0; + out_2270168032272230264[208] = 0; + out_2270168032272230264[209] = 0; + out_2270168032272230264[210] = 0; + out_2270168032272230264[211] = 0; + out_2270168032272230264[212] = 0; + out_2270168032272230264[213] = 0; + out_2270168032272230264[214] = 0; + out_2270168032272230264[215] = 0; + out_2270168032272230264[216] = 0; + out_2270168032272230264[217] = 0; + out_2270168032272230264[218] = 0; + out_2270168032272230264[219] = 1.0; + out_2270168032272230264[220] = 0; + out_2270168032272230264[221] = 0; + out_2270168032272230264[222] = 0; + out_2270168032272230264[223] = 0; + out_2270168032272230264[224] = 0; + out_2270168032272230264[225] = 0; + out_2270168032272230264[226] = 0; + out_2270168032272230264[227] = 0; + out_2270168032272230264[228] = 0; + out_2270168032272230264[229] = 0; + out_2270168032272230264[230] = 0; + out_2270168032272230264[231] = 0; + out_2270168032272230264[232] = 0; + out_2270168032272230264[233] = 0; + out_2270168032272230264[234] = 0; + out_2270168032272230264[235] = 0; + out_2270168032272230264[236] = 0; + out_2270168032272230264[237] = 0; + out_2270168032272230264[238] = 0; + out_2270168032272230264[239] = 0; + out_2270168032272230264[240] = 0; + out_2270168032272230264[241] = 1.0; + out_2270168032272230264[242] = 0; + out_2270168032272230264[243] = 0; + out_2270168032272230264[244] = 0; + out_2270168032272230264[245] = 0; + out_2270168032272230264[246] = 0; + out_2270168032272230264[247] = 0; + out_2270168032272230264[248] = 0; + out_2270168032272230264[249] = 0; + out_2270168032272230264[250] = 0; + out_2270168032272230264[251] = 0; + out_2270168032272230264[252] = 0; + out_2270168032272230264[253] = 0; + out_2270168032272230264[254] = 0; + out_2270168032272230264[255] = 0; + out_2270168032272230264[256] = 0; + out_2270168032272230264[257] = 0; + out_2270168032272230264[258] = 0; + out_2270168032272230264[259] = 0; + out_2270168032272230264[260] = 0; + out_2270168032272230264[261] = 0; + out_2270168032272230264[262] = 0; + out_2270168032272230264[263] = 1.0; + out_2270168032272230264[264] = 0; + out_2270168032272230264[265] = 0; + out_2270168032272230264[266] = 0; + out_2270168032272230264[267] = 0; + out_2270168032272230264[268] = 0; + out_2270168032272230264[269] = 0; + out_2270168032272230264[270] = 0; + out_2270168032272230264[271] = 0; + out_2270168032272230264[272] = 0; + out_2270168032272230264[273] = 0; + out_2270168032272230264[274] = 0; + out_2270168032272230264[275] = 0; + out_2270168032272230264[276] = 0; + out_2270168032272230264[277] = 0; + out_2270168032272230264[278] = 0; + out_2270168032272230264[279] = 0; + out_2270168032272230264[280] = 0; + out_2270168032272230264[281] = 0; + out_2270168032272230264[282] = 0; + out_2270168032272230264[283] = 0; + out_2270168032272230264[284] = 0; + out_2270168032272230264[285] = 1.0; + out_2270168032272230264[286] = 0; + out_2270168032272230264[287] = 0; + out_2270168032272230264[288] = 0; + out_2270168032272230264[289] = 0; + out_2270168032272230264[290] = 0; + out_2270168032272230264[291] = 0; + out_2270168032272230264[292] = 0; + out_2270168032272230264[293] = 0; + out_2270168032272230264[294] = 0; + out_2270168032272230264[295] = 0; + out_2270168032272230264[296] = 0; + out_2270168032272230264[297] = 0; + out_2270168032272230264[298] = 0; + out_2270168032272230264[299] = 0; + out_2270168032272230264[300] = 0; + out_2270168032272230264[301] = 0; + out_2270168032272230264[302] = 0; + out_2270168032272230264[303] = 0; + out_2270168032272230264[304] = 0; + out_2270168032272230264[305] = 0; + out_2270168032272230264[306] = 0; + out_2270168032272230264[307] = 1.0; + out_2270168032272230264[308] = 0; + out_2270168032272230264[309] = 0; + out_2270168032272230264[310] = 0; + out_2270168032272230264[311] = 0; + out_2270168032272230264[312] = 0; + out_2270168032272230264[313] = 0; + out_2270168032272230264[314] = 0; + out_2270168032272230264[315] = 0; + out_2270168032272230264[316] = 0; + out_2270168032272230264[317] = 0; + out_2270168032272230264[318] = 0; + out_2270168032272230264[319] = 0; + out_2270168032272230264[320] = 0; + out_2270168032272230264[321] = 0; + out_2270168032272230264[322] = 0; + out_2270168032272230264[323] = 0; + out_2270168032272230264[324] = 0; + out_2270168032272230264[325] = 0; + out_2270168032272230264[326] = 0; + out_2270168032272230264[327] = 0; + out_2270168032272230264[328] = 0; + out_2270168032272230264[329] = 1.0; + out_2270168032272230264[330] = 0; + out_2270168032272230264[331] = 0; + out_2270168032272230264[332] = 0; + out_2270168032272230264[333] = 0; + out_2270168032272230264[334] = 0; + out_2270168032272230264[335] = 0; + out_2270168032272230264[336] = 0; + out_2270168032272230264[337] = 0; + out_2270168032272230264[338] = 0; + out_2270168032272230264[339] = 0; + out_2270168032272230264[340] = 0; + out_2270168032272230264[341] = 0; + out_2270168032272230264[342] = 0; + out_2270168032272230264[343] = 0; + out_2270168032272230264[344] = 0; + out_2270168032272230264[345] = 0; + out_2270168032272230264[346] = 0; + out_2270168032272230264[347] = 0; + out_2270168032272230264[348] = 0; + out_2270168032272230264[349] = 0; + out_2270168032272230264[350] = 0; + out_2270168032272230264[351] = 1.0; + out_2270168032272230264[352] = 0; + out_2270168032272230264[353] = 0; + out_2270168032272230264[354] = 0; + out_2270168032272230264[355] = 0; + out_2270168032272230264[356] = 0; + out_2270168032272230264[357] = 0; + out_2270168032272230264[358] = 0; + out_2270168032272230264[359] = 0; + out_2270168032272230264[360] = 0; + out_2270168032272230264[361] = 0; + out_2270168032272230264[362] = 0; + out_2270168032272230264[363] = 0; + out_2270168032272230264[364] = 0; + out_2270168032272230264[365] = 0; + out_2270168032272230264[366] = 0; + out_2270168032272230264[367] = 0; + out_2270168032272230264[368] = 0; + out_2270168032272230264[369] = 0; + out_2270168032272230264[370] = 0; + out_2270168032272230264[371] = 0; + out_2270168032272230264[372] = 0; + out_2270168032272230264[373] = 1.0; + out_2270168032272230264[374] = 0; + out_2270168032272230264[375] = 0; + out_2270168032272230264[376] = 0; + out_2270168032272230264[377] = 0; + out_2270168032272230264[378] = 0; + out_2270168032272230264[379] = 0; + out_2270168032272230264[380] = 0; + out_2270168032272230264[381] = 0; + out_2270168032272230264[382] = 0; + out_2270168032272230264[383] = 0; + out_2270168032272230264[384] = 0; + out_2270168032272230264[385] = 0; + out_2270168032272230264[386] = 0; + out_2270168032272230264[387] = 0; + out_2270168032272230264[388] = 0; + out_2270168032272230264[389] = 0; + out_2270168032272230264[390] = 0; + out_2270168032272230264[391] = 0; + out_2270168032272230264[392] = 0; + out_2270168032272230264[393] = 0; + out_2270168032272230264[394] = 0; + out_2270168032272230264[395] = 1.0; + out_2270168032272230264[396] = 0; + out_2270168032272230264[397] = 0; + out_2270168032272230264[398] = 0; + out_2270168032272230264[399] = 0; + out_2270168032272230264[400] = 0; + out_2270168032272230264[401] = 0; + out_2270168032272230264[402] = 0; + out_2270168032272230264[403] = 0; + out_2270168032272230264[404] = 0; + out_2270168032272230264[405] = 0; + out_2270168032272230264[406] = 0; + out_2270168032272230264[407] = 0; + out_2270168032272230264[408] = 0; + out_2270168032272230264[409] = 0; + out_2270168032272230264[410] = 0; + out_2270168032272230264[411] = 0; + out_2270168032272230264[412] = 0; + out_2270168032272230264[413] = 0; + out_2270168032272230264[414] = 0; + out_2270168032272230264[415] = 0; + out_2270168032272230264[416] = 0; + out_2270168032272230264[417] = 1.0; + out_2270168032272230264[418] = 0; + out_2270168032272230264[419] = 0; + out_2270168032272230264[420] = 0; + out_2270168032272230264[421] = 0; + out_2270168032272230264[422] = 0; + out_2270168032272230264[423] = 0; + out_2270168032272230264[424] = 0; + out_2270168032272230264[425] = 0; + out_2270168032272230264[426] = 0; + out_2270168032272230264[427] = 0; + out_2270168032272230264[428] = 0; + out_2270168032272230264[429] = 0; + out_2270168032272230264[430] = 0; + out_2270168032272230264[431] = 0; + out_2270168032272230264[432] = 0; + out_2270168032272230264[433] = 0; + out_2270168032272230264[434] = 0; + out_2270168032272230264[435] = 0; + out_2270168032272230264[436] = 0; + out_2270168032272230264[437] = 0; + out_2270168032272230264[438] = 0; + out_2270168032272230264[439] = 1.0; + out_2270168032272230264[440] = 0; + out_2270168032272230264[441] = 0; + out_2270168032272230264[442] = 0; + out_2270168032272230264[443] = 0; + out_2270168032272230264[444] = 0; + out_2270168032272230264[445] = 0; + out_2270168032272230264[446] = 0; + out_2270168032272230264[447] = 0; + out_2270168032272230264[448] = 0; + out_2270168032272230264[449] = 0; + out_2270168032272230264[450] = 0; + out_2270168032272230264[451] = 0; + out_2270168032272230264[452] = 0; + out_2270168032272230264[453] = 0; + out_2270168032272230264[454] = 0; + out_2270168032272230264[455] = 0; + out_2270168032272230264[456] = 0; + out_2270168032272230264[457] = 0; + out_2270168032272230264[458] = 0; + out_2270168032272230264[459] = 0; + out_2270168032272230264[460] = 0; + out_2270168032272230264[461] = 1.0; } -void f_fun(double *state, double dt, double *out_1490934551927816954) { - out_1490934551927816954[0] = dt*state[7] + state[0]; - out_1490934551927816954[1] = dt*state[8] + state[1]; - out_1490934551927816954[2] = dt*state[9] + state[2]; - out_1490934551927816954[3] = dt*(-0.5*state[4]*state[10] - 0.5*state[5]*state[11] - 0.5*state[6]*state[12]) + state[3]; - out_1490934551927816954[4] = dt*(0.5*state[3]*state[10] + 0.5*state[5]*state[12] - 0.5*state[6]*state[11]) + state[4]; - out_1490934551927816954[5] = dt*(0.5*state[3]*state[11] - 0.5*state[4]*state[12] + 0.5*state[6]*state[10]) + state[5]; - out_1490934551927816954[6] = dt*(0.5*state[3]*state[12] + 0.5*state[4]*state[11] - 0.5*state[5]*state[10]) + state[6]; - out_1490934551927816954[7] = dt*((2*state[3]*state[5] + 2*state[4]*state[6])*state[18] + (-2*state[3]*state[6] + 2*state[4]*state[5])*state[17] + (pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[16]) + state[7]; - out_1490934551927816954[8] = dt*((-2*state[3]*state[4] + 2*state[5]*state[6])*state[18] + (2*state[3]*state[6] + 2*state[4]*state[5])*state[16] + (pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[17]) + state[8]; - out_1490934551927816954[9] = dt*((2*state[3]*state[4] + 2*state[5]*state[6])*state[17] + (-2*state[3]*state[5] + 2*state[4]*state[6])*state[16] + (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[18]) + state[9]; - out_1490934551927816954[10] = state[10]; - out_1490934551927816954[11] = state[11]; - out_1490934551927816954[12] = state[12]; - out_1490934551927816954[13] = state[13]; - out_1490934551927816954[14] = state[14]; - out_1490934551927816954[15] = state[15]; - out_1490934551927816954[16] = state[16]; - out_1490934551927816954[17] = state[17]; - out_1490934551927816954[18] = state[18]; - out_1490934551927816954[19] = state[19]; - out_1490934551927816954[20] = state[20]; - out_1490934551927816954[21] = state[21]; +void f_fun(double *state, double dt, double *out_9047640957774126431) { + out_9047640957774126431[0] = dt*state[7] + state[0]; + out_9047640957774126431[1] = dt*state[8] + state[1]; + out_9047640957774126431[2] = dt*state[9] + state[2]; + out_9047640957774126431[3] = dt*(-0.5*state[4]*state[10] - 0.5*state[5]*state[11] - 0.5*state[6]*state[12]) + state[3]; + out_9047640957774126431[4] = dt*(0.5*state[3]*state[10] + 0.5*state[5]*state[12] - 0.5*state[6]*state[11]) + state[4]; + out_9047640957774126431[5] = dt*(0.5*state[3]*state[11] - 0.5*state[4]*state[12] + 0.5*state[6]*state[10]) + state[5]; + out_9047640957774126431[6] = dt*(0.5*state[3]*state[12] + 0.5*state[4]*state[11] - 0.5*state[5]*state[10]) + state[6]; + out_9047640957774126431[7] = dt*((2*state[3]*state[5] + 2*state[4]*state[6])*state[18] + (-2*state[3]*state[6] + 2*state[4]*state[5])*state[17] + (pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[16]) + state[7]; + out_9047640957774126431[8] = dt*((-2*state[3]*state[4] + 2*state[5]*state[6])*state[18] + (2*state[3]*state[6] + 2*state[4]*state[5])*state[16] + (pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[17]) + state[8]; + out_9047640957774126431[9] = dt*((2*state[3]*state[4] + 2*state[5]*state[6])*state[17] + (-2*state[3]*state[5] + 2*state[4]*state[6])*state[16] + (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[18]) + state[9]; + out_9047640957774126431[10] = state[10]; + out_9047640957774126431[11] = state[11]; + out_9047640957774126431[12] = state[12]; + out_9047640957774126431[13] = state[13]; + out_9047640957774126431[14] = state[14]; + out_9047640957774126431[15] = state[15]; + out_9047640957774126431[16] = state[16]; + out_9047640957774126431[17] = state[17]; + out_9047640957774126431[18] = state[18]; + out_9047640957774126431[19] = state[19]; + out_9047640957774126431[20] = state[20]; + out_9047640957774126431[21] = state[21]; } -void F_fun(double *state, double dt, double *out_2062859019570548817) { - out_2062859019570548817[0] = 1; - out_2062859019570548817[1] = 0; - out_2062859019570548817[2] = 0; - out_2062859019570548817[3] = 0; - out_2062859019570548817[4] = 0; - out_2062859019570548817[5] = 0; - out_2062859019570548817[6] = dt; - out_2062859019570548817[7] = 0; - out_2062859019570548817[8] = 0; - out_2062859019570548817[9] = 0; - out_2062859019570548817[10] = 0; - out_2062859019570548817[11] = 0; - out_2062859019570548817[12] = 0; - out_2062859019570548817[13] = 0; - out_2062859019570548817[14] = 0; - out_2062859019570548817[15] = 0; - out_2062859019570548817[16] = 0; - out_2062859019570548817[17] = 0; - out_2062859019570548817[18] = 0; - out_2062859019570548817[19] = 0; - out_2062859019570548817[20] = 0; - out_2062859019570548817[21] = 0; - out_2062859019570548817[22] = 1; - out_2062859019570548817[23] = 0; - out_2062859019570548817[24] = 0; - out_2062859019570548817[25] = 0; - out_2062859019570548817[26] = 0; - out_2062859019570548817[27] = 0; - out_2062859019570548817[28] = dt; - out_2062859019570548817[29] = 0; - out_2062859019570548817[30] = 0; - out_2062859019570548817[31] = 0; - out_2062859019570548817[32] = 0; - out_2062859019570548817[33] = 0; - out_2062859019570548817[34] = 0; - out_2062859019570548817[35] = 0; - out_2062859019570548817[36] = 0; - out_2062859019570548817[37] = 0; - out_2062859019570548817[38] = 0; - out_2062859019570548817[39] = 0; - out_2062859019570548817[40] = 0; - out_2062859019570548817[41] = 0; - out_2062859019570548817[42] = 0; - out_2062859019570548817[43] = 0; - out_2062859019570548817[44] = 1; - out_2062859019570548817[45] = 0; - out_2062859019570548817[46] = 0; - out_2062859019570548817[47] = 0; - out_2062859019570548817[48] = 0; - out_2062859019570548817[49] = 0; - out_2062859019570548817[50] = dt; - out_2062859019570548817[51] = 0; - out_2062859019570548817[52] = 0; - out_2062859019570548817[53] = 0; - out_2062859019570548817[54] = 0; - out_2062859019570548817[55] = 0; - out_2062859019570548817[56] = 0; - out_2062859019570548817[57] = 0; - out_2062859019570548817[58] = 0; - out_2062859019570548817[59] = 0; - out_2062859019570548817[60] = 0; - out_2062859019570548817[61] = 0; - out_2062859019570548817[62] = 0; - out_2062859019570548817[63] = 0; - out_2062859019570548817[64] = 0; - out_2062859019570548817[65] = 0; - out_2062859019570548817[66] = 1; - out_2062859019570548817[67] = dt*((2*state[3]*state[4] + 2*state[5]*state[6])*state[11] + (-2*state[3]*state[5] + 2*state[4]*state[6])*state[10] + (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[12]); - out_2062859019570548817[68] = dt*((2*state[3]*state[4] - 2*state[5]*state[6])*state[12] + (-2*state[3]*state[6] - 2*state[4]*state[5])*state[10] + (-pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[11]); - out_2062859019570548817[69] = 0; - out_2062859019570548817[70] = 0; - out_2062859019570548817[71] = 0; - out_2062859019570548817[72] = dt*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2)); - out_2062859019570548817[73] = dt*(-2*state[3]*state[6] + 2*state[4]*state[5]); - out_2062859019570548817[74] = dt*(2*state[3]*state[5] + 2*state[4]*state[6]); - out_2062859019570548817[75] = 0; - out_2062859019570548817[76] = 0; - out_2062859019570548817[77] = 0; - out_2062859019570548817[78] = 0; - out_2062859019570548817[79] = 0; - out_2062859019570548817[80] = 0; - out_2062859019570548817[81] = 0; - out_2062859019570548817[82] = 0; - out_2062859019570548817[83] = 0; - out_2062859019570548817[84] = 0; - out_2062859019570548817[85] = 0; - out_2062859019570548817[86] = 0; - out_2062859019570548817[87] = dt*(-(2*state[3]*state[4] + 2*state[5]*state[6])*state[11] - (-2*state[3]*state[5] + 2*state[4]*state[6])*state[10] - (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[12]); - out_2062859019570548817[88] = 1; - out_2062859019570548817[89] = dt*((2*state[3]*state[5] + 2*state[4]*state[6])*state[12] + (-2*state[3]*state[6] + 2*state[4]*state[5])*state[11] + (pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[10]); - out_2062859019570548817[90] = 0; - out_2062859019570548817[91] = 0; - out_2062859019570548817[92] = 0; - out_2062859019570548817[93] = dt*(2*state[3]*state[6] + 2*state[4]*state[5]); - out_2062859019570548817[94] = dt*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2)); - out_2062859019570548817[95] = dt*(-2*state[3]*state[4] + 2*state[5]*state[6]); - out_2062859019570548817[96] = 0; - out_2062859019570548817[97] = 0; - out_2062859019570548817[98] = 0; - out_2062859019570548817[99] = 0; - out_2062859019570548817[100] = 0; - out_2062859019570548817[101] = 0; - out_2062859019570548817[102] = 0; - out_2062859019570548817[103] = 0; - out_2062859019570548817[104] = 0; - out_2062859019570548817[105] = 0; - out_2062859019570548817[106] = 0; - out_2062859019570548817[107] = 0; - out_2062859019570548817[108] = dt*((-2*state[3]*state[4] + 2*state[5]*state[6])*state[12] + (2*state[3]*state[6] + 2*state[4]*state[5])*state[10] + (pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[11]); - out_2062859019570548817[109] = dt*((-2*state[3]*state[5] - 2*state[4]*state[6])*state[12] + (2*state[3]*state[6] - 2*state[4]*state[5])*state[11] + (-pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) + pow(state[6], 2))*state[10]); - out_2062859019570548817[110] = 1; - out_2062859019570548817[111] = 0; - out_2062859019570548817[112] = 0; - out_2062859019570548817[113] = 0; - out_2062859019570548817[114] = dt*(-2*state[3]*state[5] + 2*state[4]*state[6]); - out_2062859019570548817[115] = dt*(2*state[3]*state[4] + 2*state[5]*state[6]); - out_2062859019570548817[116] = dt*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2)); - out_2062859019570548817[117] = 0; - out_2062859019570548817[118] = 0; - out_2062859019570548817[119] = 0; - out_2062859019570548817[120] = 0; - out_2062859019570548817[121] = 0; - out_2062859019570548817[122] = 0; - out_2062859019570548817[123] = 0; - out_2062859019570548817[124] = 0; - out_2062859019570548817[125] = 0; - out_2062859019570548817[126] = 0; - out_2062859019570548817[127] = 0; - out_2062859019570548817[128] = 0; - out_2062859019570548817[129] = 0; - out_2062859019570548817[130] = dt*((2*state[3]*state[4] + 2*state[5]*state[6])*state[17] + (-2*state[3]*state[5] + 2*state[4]*state[6])*state[16] + (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[18]); - out_2062859019570548817[131] = dt*((2*state[3]*state[4] - 2*state[5]*state[6])*state[18] + (-2*state[3]*state[6] - 2*state[4]*state[5])*state[16] + (-pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[17]); - out_2062859019570548817[132] = 1; - out_2062859019570548817[133] = 0; - out_2062859019570548817[134] = 0; - out_2062859019570548817[135] = 0; - out_2062859019570548817[136] = 0; - out_2062859019570548817[137] = 0; - out_2062859019570548817[138] = 0; - out_2062859019570548817[139] = 0; - out_2062859019570548817[140] = 0; - out_2062859019570548817[141] = dt*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2)); - out_2062859019570548817[142] = dt*(-2*state[3]*state[6] + 2*state[4]*state[5]); - out_2062859019570548817[143] = dt*(2*state[3]*state[5] + 2*state[4]*state[6]); - out_2062859019570548817[144] = 0; - out_2062859019570548817[145] = 0; - out_2062859019570548817[146] = 0; - out_2062859019570548817[147] = 0; - out_2062859019570548817[148] = 0; - out_2062859019570548817[149] = 0; - out_2062859019570548817[150] = dt*(-(2*state[3]*state[4] + 2*state[5]*state[6])*state[17] - (-2*state[3]*state[5] + 2*state[4]*state[6])*state[16] - (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[18]); - out_2062859019570548817[151] = 0; - out_2062859019570548817[152] = dt*((2*state[3]*state[5] + 2*state[4]*state[6])*state[18] + (-2*state[3]*state[6] + 2*state[4]*state[5])*state[17] + (pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[16]); - out_2062859019570548817[153] = 0; - out_2062859019570548817[154] = 1; - out_2062859019570548817[155] = 0; - out_2062859019570548817[156] = 0; - out_2062859019570548817[157] = 0; - out_2062859019570548817[158] = 0; - out_2062859019570548817[159] = 0; - out_2062859019570548817[160] = 0; - out_2062859019570548817[161] = 0; - out_2062859019570548817[162] = dt*(2*state[3]*state[6] + 2*state[4]*state[5]); - out_2062859019570548817[163] = dt*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2)); - out_2062859019570548817[164] = dt*(-2*state[3]*state[4] + 2*state[5]*state[6]); - out_2062859019570548817[165] = 0; - out_2062859019570548817[166] = 0; - out_2062859019570548817[167] = 0; - out_2062859019570548817[168] = 0; - out_2062859019570548817[169] = 0; - out_2062859019570548817[170] = 0; - out_2062859019570548817[171] = dt*((-2*state[3]*state[4] + 2*state[5]*state[6])*state[18] + (2*state[3]*state[6] + 2*state[4]*state[5])*state[16] + (pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[17]); - out_2062859019570548817[172] = dt*((-2*state[3]*state[5] - 2*state[4]*state[6])*state[18] + (2*state[3]*state[6] - 2*state[4]*state[5])*state[17] + (-pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) + pow(state[6], 2))*state[16]); - out_2062859019570548817[173] = 0; - out_2062859019570548817[174] = 0; - out_2062859019570548817[175] = 0; - out_2062859019570548817[176] = 1; - out_2062859019570548817[177] = 0; - out_2062859019570548817[178] = 0; - out_2062859019570548817[179] = 0; - out_2062859019570548817[180] = 0; - out_2062859019570548817[181] = 0; - out_2062859019570548817[182] = 0; - out_2062859019570548817[183] = dt*(-2*state[3]*state[5] + 2*state[4]*state[6]); - out_2062859019570548817[184] = dt*(2*state[3]*state[4] + 2*state[5]*state[6]); - out_2062859019570548817[185] = dt*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2)); - out_2062859019570548817[186] = 0; - out_2062859019570548817[187] = 0; - out_2062859019570548817[188] = 0; - out_2062859019570548817[189] = 0; - out_2062859019570548817[190] = 0; - out_2062859019570548817[191] = 0; - out_2062859019570548817[192] = 0; - out_2062859019570548817[193] = 0; - out_2062859019570548817[194] = 0; - out_2062859019570548817[195] = 0; - out_2062859019570548817[196] = 0; - out_2062859019570548817[197] = 0; - out_2062859019570548817[198] = 1; - out_2062859019570548817[199] = 0; - out_2062859019570548817[200] = 0; - out_2062859019570548817[201] = 0; - out_2062859019570548817[202] = 0; - out_2062859019570548817[203] = 0; - out_2062859019570548817[204] = 0; - out_2062859019570548817[205] = 0; - out_2062859019570548817[206] = 0; - out_2062859019570548817[207] = 0; - out_2062859019570548817[208] = 0; - out_2062859019570548817[209] = 0; - out_2062859019570548817[210] = 0; - out_2062859019570548817[211] = 0; - out_2062859019570548817[212] = 0; - out_2062859019570548817[213] = 0; - out_2062859019570548817[214] = 0; - out_2062859019570548817[215] = 0; - out_2062859019570548817[216] = 0; - out_2062859019570548817[217] = 0; - out_2062859019570548817[218] = 0; - out_2062859019570548817[219] = 0; - out_2062859019570548817[220] = 1; - out_2062859019570548817[221] = 0; - out_2062859019570548817[222] = 0; - out_2062859019570548817[223] = 0; - out_2062859019570548817[224] = 0; - out_2062859019570548817[225] = 0; - out_2062859019570548817[226] = 0; - out_2062859019570548817[227] = 0; - out_2062859019570548817[228] = 0; - out_2062859019570548817[229] = 0; - out_2062859019570548817[230] = 0; - out_2062859019570548817[231] = 0; - out_2062859019570548817[232] = 0; - out_2062859019570548817[233] = 0; - out_2062859019570548817[234] = 0; - out_2062859019570548817[235] = 0; - out_2062859019570548817[236] = 0; - out_2062859019570548817[237] = 0; - out_2062859019570548817[238] = 0; - out_2062859019570548817[239] = 0; - out_2062859019570548817[240] = 0; - out_2062859019570548817[241] = 0; - out_2062859019570548817[242] = 1; - out_2062859019570548817[243] = 0; - out_2062859019570548817[244] = 0; - out_2062859019570548817[245] = 0; - out_2062859019570548817[246] = 0; - out_2062859019570548817[247] = 0; - out_2062859019570548817[248] = 0; - out_2062859019570548817[249] = 0; - out_2062859019570548817[250] = 0; - out_2062859019570548817[251] = 0; - out_2062859019570548817[252] = 0; - out_2062859019570548817[253] = 0; - out_2062859019570548817[254] = 0; - out_2062859019570548817[255] = 0; - out_2062859019570548817[256] = 0; - out_2062859019570548817[257] = 0; - out_2062859019570548817[258] = 0; - out_2062859019570548817[259] = 0; - out_2062859019570548817[260] = 0; - out_2062859019570548817[261] = 0; - out_2062859019570548817[262] = 0; - out_2062859019570548817[263] = 0; - out_2062859019570548817[264] = 1; - out_2062859019570548817[265] = 0; - out_2062859019570548817[266] = 0; - out_2062859019570548817[267] = 0; - out_2062859019570548817[268] = 0; - out_2062859019570548817[269] = 0; - out_2062859019570548817[270] = 0; - out_2062859019570548817[271] = 0; - out_2062859019570548817[272] = 0; - out_2062859019570548817[273] = 0; - out_2062859019570548817[274] = 0; - out_2062859019570548817[275] = 0; - out_2062859019570548817[276] = 0; - out_2062859019570548817[277] = 0; - out_2062859019570548817[278] = 0; - out_2062859019570548817[279] = 0; - out_2062859019570548817[280] = 0; - out_2062859019570548817[281] = 0; - out_2062859019570548817[282] = 0; - out_2062859019570548817[283] = 0; - out_2062859019570548817[284] = 0; - out_2062859019570548817[285] = 0; - out_2062859019570548817[286] = 1; - out_2062859019570548817[287] = 0; - out_2062859019570548817[288] = 0; - out_2062859019570548817[289] = 0; - out_2062859019570548817[290] = 0; - out_2062859019570548817[291] = 0; - out_2062859019570548817[292] = 0; - out_2062859019570548817[293] = 0; - out_2062859019570548817[294] = 0; - out_2062859019570548817[295] = 0; - out_2062859019570548817[296] = 0; - out_2062859019570548817[297] = 0; - out_2062859019570548817[298] = 0; - out_2062859019570548817[299] = 0; - out_2062859019570548817[300] = 0; - out_2062859019570548817[301] = 0; - out_2062859019570548817[302] = 0; - out_2062859019570548817[303] = 0; - out_2062859019570548817[304] = 0; - out_2062859019570548817[305] = 0; - out_2062859019570548817[306] = 0; - out_2062859019570548817[307] = 0; - out_2062859019570548817[308] = 1; - out_2062859019570548817[309] = 0; - out_2062859019570548817[310] = 0; - out_2062859019570548817[311] = 0; - out_2062859019570548817[312] = 0; - out_2062859019570548817[313] = 0; - out_2062859019570548817[314] = 0; - out_2062859019570548817[315] = 0; - out_2062859019570548817[316] = 0; - out_2062859019570548817[317] = 0; - out_2062859019570548817[318] = 0; - out_2062859019570548817[319] = 0; - out_2062859019570548817[320] = 0; - out_2062859019570548817[321] = 0; - out_2062859019570548817[322] = 0; - out_2062859019570548817[323] = 0; - out_2062859019570548817[324] = 0; - out_2062859019570548817[325] = 0; - out_2062859019570548817[326] = 0; - out_2062859019570548817[327] = 0; - out_2062859019570548817[328] = 0; - out_2062859019570548817[329] = 0; - out_2062859019570548817[330] = 1; - out_2062859019570548817[331] = 0; - out_2062859019570548817[332] = 0; - out_2062859019570548817[333] = 0; - out_2062859019570548817[334] = 0; - out_2062859019570548817[335] = 0; - out_2062859019570548817[336] = 0; - out_2062859019570548817[337] = 0; - out_2062859019570548817[338] = 0; - out_2062859019570548817[339] = 0; - out_2062859019570548817[340] = 0; - out_2062859019570548817[341] = 0; - out_2062859019570548817[342] = 0; - out_2062859019570548817[343] = 0; - out_2062859019570548817[344] = 0; - out_2062859019570548817[345] = 0; - out_2062859019570548817[346] = 0; - out_2062859019570548817[347] = 0; - out_2062859019570548817[348] = 0; - out_2062859019570548817[349] = 0; - out_2062859019570548817[350] = 0; - out_2062859019570548817[351] = 0; - out_2062859019570548817[352] = 1; - out_2062859019570548817[353] = 0; - out_2062859019570548817[354] = 0; - out_2062859019570548817[355] = 0; - out_2062859019570548817[356] = 0; - out_2062859019570548817[357] = 0; - out_2062859019570548817[358] = 0; - out_2062859019570548817[359] = 0; - out_2062859019570548817[360] = 0; - out_2062859019570548817[361] = 0; - out_2062859019570548817[362] = 0; - out_2062859019570548817[363] = 0; - out_2062859019570548817[364] = 0; - out_2062859019570548817[365] = 0; - out_2062859019570548817[366] = 0; - out_2062859019570548817[367] = 0; - out_2062859019570548817[368] = 0; - out_2062859019570548817[369] = 0; - out_2062859019570548817[370] = 0; - out_2062859019570548817[371] = 0; - out_2062859019570548817[372] = 0; - out_2062859019570548817[373] = 0; - out_2062859019570548817[374] = 1; - out_2062859019570548817[375] = 0; - out_2062859019570548817[376] = 0; - out_2062859019570548817[377] = 0; - out_2062859019570548817[378] = 0; - out_2062859019570548817[379] = 0; - out_2062859019570548817[380] = 0; - out_2062859019570548817[381] = 0; - out_2062859019570548817[382] = 0; - out_2062859019570548817[383] = 0; - out_2062859019570548817[384] = 0; - out_2062859019570548817[385] = 0; - out_2062859019570548817[386] = 0; - out_2062859019570548817[387] = 0; - out_2062859019570548817[388] = 0; - out_2062859019570548817[389] = 0; - out_2062859019570548817[390] = 0; - out_2062859019570548817[391] = 0; - out_2062859019570548817[392] = 0; - out_2062859019570548817[393] = 0; - out_2062859019570548817[394] = 0; - out_2062859019570548817[395] = 0; - out_2062859019570548817[396] = 1; - out_2062859019570548817[397] = 0; - out_2062859019570548817[398] = 0; - out_2062859019570548817[399] = 0; - out_2062859019570548817[400] = 0; - out_2062859019570548817[401] = 0; - out_2062859019570548817[402] = 0; - out_2062859019570548817[403] = 0; - out_2062859019570548817[404] = 0; - out_2062859019570548817[405] = 0; - out_2062859019570548817[406] = 0; - out_2062859019570548817[407] = 0; - out_2062859019570548817[408] = 0; - out_2062859019570548817[409] = 0; - out_2062859019570548817[410] = 0; - out_2062859019570548817[411] = 0; - out_2062859019570548817[412] = 0; - out_2062859019570548817[413] = 0; - out_2062859019570548817[414] = 0; - out_2062859019570548817[415] = 0; - out_2062859019570548817[416] = 0; - out_2062859019570548817[417] = 0; - out_2062859019570548817[418] = 1; - out_2062859019570548817[419] = 0; - out_2062859019570548817[420] = 0; - out_2062859019570548817[421] = 0; - out_2062859019570548817[422] = 0; - out_2062859019570548817[423] = 0; - out_2062859019570548817[424] = 0; - out_2062859019570548817[425] = 0; - out_2062859019570548817[426] = 0; - out_2062859019570548817[427] = 0; - out_2062859019570548817[428] = 0; - out_2062859019570548817[429] = 0; - out_2062859019570548817[430] = 0; - out_2062859019570548817[431] = 0; - out_2062859019570548817[432] = 0; - out_2062859019570548817[433] = 0; - out_2062859019570548817[434] = 0; - out_2062859019570548817[435] = 0; - out_2062859019570548817[436] = 0; - out_2062859019570548817[437] = 0; - out_2062859019570548817[438] = 0; - out_2062859019570548817[439] = 0; - out_2062859019570548817[440] = 1; +void F_fun(double *state, double dt, double *out_4752414459068816126) { + out_4752414459068816126[0] = 1; + out_4752414459068816126[1] = 0; + out_4752414459068816126[2] = 0; + out_4752414459068816126[3] = 0; + out_4752414459068816126[4] = 0; + out_4752414459068816126[5] = 0; + out_4752414459068816126[6] = dt; + out_4752414459068816126[7] = 0; + out_4752414459068816126[8] = 0; + out_4752414459068816126[9] = 0; + out_4752414459068816126[10] = 0; + out_4752414459068816126[11] = 0; + out_4752414459068816126[12] = 0; + out_4752414459068816126[13] = 0; + out_4752414459068816126[14] = 0; + out_4752414459068816126[15] = 0; + out_4752414459068816126[16] = 0; + out_4752414459068816126[17] = 0; + out_4752414459068816126[18] = 0; + out_4752414459068816126[19] = 0; + out_4752414459068816126[20] = 0; + out_4752414459068816126[21] = 0; + out_4752414459068816126[22] = 1; + out_4752414459068816126[23] = 0; + out_4752414459068816126[24] = 0; + out_4752414459068816126[25] = 0; + out_4752414459068816126[26] = 0; + out_4752414459068816126[27] = 0; + out_4752414459068816126[28] = dt; + out_4752414459068816126[29] = 0; + out_4752414459068816126[30] = 0; + out_4752414459068816126[31] = 0; + out_4752414459068816126[32] = 0; + out_4752414459068816126[33] = 0; + out_4752414459068816126[34] = 0; + out_4752414459068816126[35] = 0; + out_4752414459068816126[36] = 0; + out_4752414459068816126[37] = 0; + out_4752414459068816126[38] = 0; + out_4752414459068816126[39] = 0; + out_4752414459068816126[40] = 0; + out_4752414459068816126[41] = 0; + out_4752414459068816126[42] = 0; + out_4752414459068816126[43] = 0; + out_4752414459068816126[44] = 1; + out_4752414459068816126[45] = 0; + out_4752414459068816126[46] = 0; + out_4752414459068816126[47] = 0; + out_4752414459068816126[48] = 0; + out_4752414459068816126[49] = 0; + out_4752414459068816126[50] = dt; + out_4752414459068816126[51] = 0; + out_4752414459068816126[52] = 0; + out_4752414459068816126[53] = 0; + out_4752414459068816126[54] = 0; + out_4752414459068816126[55] = 0; + out_4752414459068816126[56] = 0; + out_4752414459068816126[57] = 0; + out_4752414459068816126[58] = 0; + out_4752414459068816126[59] = 0; + out_4752414459068816126[60] = 0; + out_4752414459068816126[61] = 0; + out_4752414459068816126[62] = 0; + out_4752414459068816126[63] = 0; + out_4752414459068816126[64] = 0; + out_4752414459068816126[65] = 0; + out_4752414459068816126[66] = 1; + out_4752414459068816126[67] = dt*((2*state[3]*state[4] + 2*state[5]*state[6])*state[11] + (-2*state[3]*state[5] + 2*state[4]*state[6])*state[10] + (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[12]); + out_4752414459068816126[68] = dt*((2*state[3]*state[4] - 2*state[5]*state[6])*state[12] + (-2*state[3]*state[6] - 2*state[4]*state[5])*state[10] + (-pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[11]); + out_4752414459068816126[69] = 0; + out_4752414459068816126[70] = 0; + out_4752414459068816126[71] = 0; + out_4752414459068816126[72] = dt*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2)); + out_4752414459068816126[73] = dt*(-2*state[3]*state[6] + 2*state[4]*state[5]); + out_4752414459068816126[74] = dt*(2*state[3]*state[5] + 2*state[4]*state[6]); + out_4752414459068816126[75] = 0; + out_4752414459068816126[76] = 0; + out_4752414459068816126[77] = 0; + out_4752414459068816126[78] = 0; + out_4752414459068816126[79] = 0; + out_4752414459068816126[80] = 0; + out_4752414459068816126[81] = 0; + out_4752414459068816126[82] = 0; + out_4752414459068816126[83] = 0; + out_4752414459068816126[84] = 0; + out_4752414459068816126[85] = 0; + out_4752414459068816126[86] = 0; + out_4752414459068816126[87] = dt*(-(2*state[3]*state[4] + 2*state[5]*state[6])*state[11] - (-2*state[3]*state[5] + 2*state[4]*state[6])*state[10] - (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[12]); + out_4752414459068816126[88] = 1; + out_4752414459068816126[89] = dt*((2*state[3]*state[5] + 2*state[4]*state[6])*state[12] + (-2*state[3]*state[6] + 2*state[4]*state[5])*state[11] + (pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[10]); + out_4752414459068816126[90] = 0; + out_4752414459068816126[91] = 0; + out_4752414459068816126[92] = 0; + out_4752414459068816126[93] = dt*(2*state[3]*state[6] + 2*state[4]*state[5]); + out_4752414459068816126[94] = dt*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2)); + out_4752414459068816126[95] = dt*(-2*state[3]*state[4] + 2*state[5]*state[6]); + out_4752414459068816126[96] = 0; + out_4752414459068816126[97] = 0; + out_4752414459068816126[98] = 0; + out_4752414459068816126[99] = 0; + out_4752414459068816126[100] = 0; + out_4752414459068816126[101] = 0; + out_4752414459068816126[102] = 0; + out_4752414459068816126[103] = 0; + out_4752414459068816126[104] = 0; + out_4752414459068816126[105] = 0; + out_4752414459068816126[106] = 0; + out_4752414459068816126[107] = 0; + out_4752414459068816126[108] = dt*((-2*state[3]*state[4] + 2*state[5]*state[6])*state[12] + (2*state[3]*state[6] + 2*state[4]*state[5])*state[10] + (pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[11]); + out_4752414459068816126[109] = dt*((-2*state[3]*state[5] - 2*state[4]*state[6])*state[12] + (2*state[3]*state[6] - 2*state[4]*state[5])*state[11] + (-pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) + pow(state[6], 2))*state[10]); + out_4752414459068816126[110] = 1; + out_4752414459068816126[111] = 0; + out_4752414459068816126[112] = 0; + out_4752414459068816126[113] = 0; + out_4752414459068816126[114] = dt*(-2*state[3]*state[5] + 2*state[4]*state[6]); + out_4752414459068816126[115] = dt*(2*state[3]*state[4] + 2*state[5]*state[6]); + out_4752414459068816126[116] = dt*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2)); + out_4752414459068816126[117] = 0; + out_4752414459068816126[118] = 0; + out_4752414459068816126[119] = 0; + out_4752414459068816126[120] = 0; + out_4752414459068816126[121] = 0; + out_4752414459068816126[122] = 0; + out_4752414459068816126[123] = 0; + out_4752414459068816126[124] = 0; + out_4752414459068816126[125] = 0; + out_4752414459068816126[126] = 0; + out_4752414459068816126[127] = 0; + out_4752414459068816126[128] = 0; + out_4752414459068816126[129] = 0; + out_4752414459068816126[130] = dt*((2*state[3]*state[4] + 2*state[5]*state[6])*state[17] + (-2*state[3]*state[5] + 2*state[4]*state[6])*state[16] + (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[18]); + out_4752414459068816126[131] = dt*((2*state[3]*state[4] - 2*state[5]*state[6])*state[18] + (-2*state[3]*state[6] - 2*state[4]*state[5])*state[16] + (-pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[17]); + out_4752414459068816126[132] = 1; + out_4752414459068816126[133] = 0; + out_4752414459068816126[134] = 0; + out_4752414459068816126[135] = 0; + out_4752414459068816126[136] = 0; + out_4752414459068816126[137] = 0; + out_4752414459068816126[138] = 0; + out_4752414459068816126[139] = 0; + out_4752414459068816126[140] = 0; + out_4752414459068816126[141] = dt*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2)); + out_4752414459068816126[142] = dt*(-2*state[3]*state[6] + 2*state[4]*state[5]); + out_4752414459068816126[143] = dt*(2*state[3]*state[5] + 2*state[4]*state[6]); + out_4752414459068816126[144] = 0; + out_4752414459068816126[145] = 0; + out_4752414459068816126[146] = 0; + out_4752414459068816126[147] = 0; + out_4752414459068816126[148] = 0; + out_4752414459068816126[149] = 0; + out_4752414459068816126[150] = dt*(-(2*state[3]*state[4] + 2*state[5]*state[6])*state[17] - (-2*state[3]*state[5] + 2*state[4]*state[6])*state[16] - (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[18]); + out_4752414459068816126[151] = 0; + out_4752414459068816126[152] = dt*((2*state[3]*state[5] + 2*state[4]*state[6])*state[18] + (-2*state[3]*state[6] + 2*state[4]*state[5])*state[17] + (pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[16]); + out_4752414459068816126[153] = 0; + out_4752414459068816126[154] = 1; + out_4752414459068816126[155] = 0; + out_4752414459068816126[156] = 0; + out_4752414459068816126[157] = 0; + out_4752414459068816126[158] = 0; + out_4752414459068816126[159] = 0; + out_4752414459068816126[160] = 0; + out_4752414459068816126[161] = 0; + out_4752414459068816126[162] = dt*(2*state[3]*state[6] + 2*state[4]*state[5]); + out_4752414459068816126[163] = dt*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2)); + out_4752414459068816126[164] = dt*(-2*state[3]*state[4] + 2*state[5]*state[6]); + out_4752414459068816126[165] = 0; + out_4752414459068816126[166] = 0; + out_4752414459068816126[167] = 0; + out_4752414459068816126[168] = 0; + out_4752414459068816126[169] = 0; + out_4752414459068816126[170] = 0; + out_4752414459068816126[171] = dt*((-2*state[3]*state[4] + 2*state[5]*state[6])*state[18] + (2*state[3]*state[6] + 2*state[4]*state[5])*state[16] + (pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[17]); + out_4752414459068816126[172] = dt*((-2*state[3]*state[5] - 2*state[4]*state[6])*state[18] + (2*state[3]*state[6] - 2*state[4]*state[5])*state[17] + (-pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) + pow(state[6], 2))*state[16]); + out_4752414459068816126[173] = 0; + out_4752414459068816126[174] = 0; + out_4752414459068816126[175] = 0; + out_4752414459068816126[176] = 1; + out_4752414459068816126[177] = 0; + out_4752414459068816126[178] = 0; + out_4752414459068816126[179] = 0; + out_4752414459068816126[180] = 0; + out_4752414459068816126[181] = 0; + out_4752414459068816126[182] = 0; + out_4752414459068816126[183] = dt*(-2*state[3]*state[5] + 2*state[4]*state[6]); + out_4752414459068816126[184] = dt*(2*state[3]*state[4] + 2*state[5]*state[6]); + out_4752414459068816126[185] = dt*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2)); + out_4752414459068816126[186] = 0; + out_4752414459068816126[187] = 0; + out_4752414459068816126[188] = 0; + out_4752414459068816126[189] = 0; + out_4752414459068816126[190] = 0; + out_4752414459068816126[191] = 0; + out_4752414459068816126[192] = 0; + out_4752414459068816126[193] = 0; + out_4752414459068816126[194] = 0; + out_4752414459068816126[195] = 0; + out_4752414459068816126[196] = 0; + out_4752414459068816126[197] = 0; + out_4752414459068816126[198] = 1; + out_4752414459068816126[199] = 0; + out_4752414459068816126[200] = 0; + out_4752414459068816126[201] = 0; + out_4752414459068816126[202] = 0; + out_4752414459068816126[203] = 0; + out_4752414459068816126[204] = 0; + out_4752414459068816126[205] = 0; + out_4752414459068816126[206] = 0; + out_4752414459068816126[207] = 0; + out_4752414459068816126[208] = 0; + out_4752414459068816126[209] = 0; + out_4752414459068816126[210] = 0; + out_4752414459068816126[211] = 0; + out_4752414459068816126[212] = 0; + out_4752414459068816126[213] = 0; + out_4752414459068816126[214] = 0; + out_4752414459068816126[215] = 0; + out_4752414459068816126[216] = 0; + out_4752414459068816126[217] = 0; + out_4752414459068816126[218] = 0; + out_4752414459068816126[219] = 0; + out_4752414459068816126[220] = 1; + out_4752414459068816126[221] = 0; + out_4752414459068816126[222] = 0; + out_4752414459068816126[223] = 0; + out_4752414459068816126[224] = 0; + out_4752414459068816126[225] = 0; + out_4752414459068816126[226] = 0; + out_4752414459068816126[227] = 0; + out_4752414459068816126[228] = 0; + out_4752414459068816126[229] = 0; + out_4752414459068816126[230] = 0; + out_4752414459068816126[231] = 0; + out_4752414459068816126[232] = 0; + out_4752414459068816126[233] = 0; + out_4752414459068816126[234] = 0; + out_4752414459068816126[235] = 0; + out_4752414459068816126[236] = 0; + out_4752414459068816126[237] = 0; + out_4752414459068816126[238] = 0; + out_4752414459068816126[239] = 0; + out_4752414459068816126[240] = 0; + out_4752414459068816126[241] = 0; + out_4752414459068816126[242] = 1; + out_4752414459068816126[243] = 0; + out_4752414459068816126[244] = 0; + out_4752414459068816126[245] = 0; + out_4752414459068816126[246] = 0; + out_4752414459068816126[247] = 0; + out_4752414459068816126[248] = 0; + out_4752414459068816126[249] = 0; + out_4752414459068816126[250] = 0; + out_4752414459068816126[251] = 0; + out_4752414459068816126[252] = 0; + out_4752414459068816126[253] = 0; + out_4752414459068816126[254] = 0; + out_4752414459068816126[255] = 0; + out_4752414459068816126[256] = 0; + out_4752414459068816126[257] = 0; + out_4752414459068816126[258] = 0; + out_4752414459068816126[259] = 0; + out_4752414459068816126[260] = 0; + out_4752414459068816126[261] = 0; + out_4752414459068816126[262] = 0; + out_4752414459068816126[263] = 0; + out_4752414459068816126[264] = 1; + out_4752414459068816126[265] = 0; + out_4752414459068816126[266] = 0; + out_4752414459068816126[267] = 0; + out_4752414459068816126[268] = 0; + out_4752414459068816126[269] = 0; + out_4752414459068816126[270] = 0; + out_4752414459068816126[271] = 0; + out_4752414459068816126[272] = 0; + out_4752414459068816126[273] = 0; + out_4752414459068816126[274] = 0; + out_4752414459068816126[275] = 0; + out_4752414459068816126[276] = 0; + out_4752414459068816126[277] = 0; + out_4752414459068816126[278] = 0; + out_4752414459068816126[279] = 0; + out_4752414459068816126[280] = 0; + out_4752414459068816126[281] = 0; + out_4752414459068816126[282] = 0; + out_4752414459068816126[283] = 0; + out_4752414459068816126[284] = 0; + out_4752414459068816126[285] = 0; + out_4752414459068816126[286] = 1; + out_4752414459068816126[287] = 0; + out_4752414459068816126[288] = 0; + out_4752414459068816126[289] = 0; + out_4752414459068816126[290] = 0; + out_4752414459068816126[291] = 0; + out_4752414459068816126[292] = 0; + out_4752414459068816126[293] = 0; + out_4752414459068816126[294] = 0; + out_4752414459068816126[295] = 0; + out_4752414459068816126[296] = 0; + out_4752414459068816126[297] = 0; + out_4752414459068816126[298] = 0; + out_4752414459068816126[299] = 0; + out_4752414459068816126[300] = 0; + out_4752414459068816126[301] = 0; + out_4752414459068816126[302] = 0; + out_4752414459068816126[303] = 0; + out_4752414459068816126[304] = 0; + out_4752414459068816126[305] = 0; + out_4752414459068816126[306] = 0; + out_4752414459068816126[307] = 0; + out_4752414459068816126[308] = 1; + out_4752414459068816126[309] = 0; + out_4752414459068816126[310] = 0; + out_4752414459068816126[311] = 0; + out_4752414459068816126[312] = 0; + out_4752414459068816126[313] = 0; + out_4752414459068816126[314] = 0; + out_4752414459068816126[315] = 0; + out_4752414459068816126[316] = 0; + out_4752414459068816126[317] = 0; + out_4752414459068816126[318] = 0; + out_4752414459068816126[319] = 0; + out_4752414459068816126[320] = 0; + out_4752414459068816126[321] = 0; + out_4752414459068816126[322] = 0; + out_4752414459068816126[323] = 0; + out_4752414459068816126[324] = 0; + out_4752414459068816126[325] = 0; + out_4752414459068816126[326] = 0; + out_4752414459068816126[327] = 0; + out_4752414459068816126[328] = 0; + out_4752414459068816126[329] = 0; + out_4752414459068816126[330] = 1; + out_4752414459068816126[331] = 0; + out_4752414459068816126[332] = 0; + out_4752414459068816126[333] = 0; + out_4752414459068816126[334] = 0; + out_4752414459068816126[335] = 0; + out_4752414459068816126[336] = 0; + out_4752414459068816126[337] = 0; + out_4752414459068816126[338] = 0; + out_4752414459068816126[339] = 0; + out_4752414459068816126[340] = 0; + out_4752414459068816126[341] = 0; + out_4752414459068816126[342] = 0; + out_4752414459068816126[343] = 0; + out_4752414459068816126[344] = 0; + out_4752414459068816126[345] = 0; + out_4752414459068816126[346] = 0; + out_4752414459068816126[347] = 0; + out_4752414459068816126[348] = 0; + out_4752414459068816126[349] = 0; + out_4752414459068816126[350] = 0; + out_4752414459068816126[351] = 0; + out_4752414459068816126[352] = 1; + out_4752414459068816126[353] = 0; + out_4752414459068816126[354] = 0; + out_4752414459068816126[355] = 0; + out_4752414459068816126[356] = 0; + out_4752414459068816126[357] = 0; + out_4752414459068816126[358] = 0; + out_4752414459068816126[359] = 0; + out_4752414459068816126[360] = 0; + out_4752414459068816126[361] = 0; + out_4752414459068816126[362] = 0; + out_4752414459068816126[363] = 0; + out_4752414459068816126[364] = 0; + out_4752414459068816126[365] = 0; + out_4752414459068816126[366] = 0; + out_4752414459068816126[367] = 0; + out_4752414459068816126[368] = 0; + out_4752414459068816126[369] = 0; + out_4752414459068816126[370] = 0; + out_4752414459068816126[371] = 0; + out_4752414459068816126[372] = 0; + out_4752414459068816126[373] = 0; + out_4752414459068816126[374] = 1; + out_4752414459068816126[375] = 0; + out_4752414459068816126[376] = 0; + out_4752414459068816126[377] = 0; + out_4752414459068816126[378] = 0; + out_4752414459068816126[379] = 0; + out_4752414459068816126[380] = 0; + out_4752414459068816126[381] = 0; + out_4752414459068816126[382] = 0; + out_4752414459068816126[383] = 0; + out_4752414459068816126[384] = 0; + out_4752414459068816126[385] = 0; + out_4752414459068816126[386] = 0; + out_4752414459068816126[387] = 0; + out_4752414459068816126[388] = 0; + out_4752414459068816126[389] = 0; + out_4752414459068816126[390] = 0; + out_4752414459068816126[391] = 0; + out_4752414459068816126[392] = 0; + out_4752414459068816126[393] = 0; + out_4752414459068816126[394] = 0; + out_4752414459068816126[395] = 0; + out_4752414459068816126[396] = 1; + out_4752414459068816126[397] = 0; + out_4752414459068816126[398] = 0; + out_4752414459068816126[399] = 0; + out_4752414459068816126[400] = 0; + out_4752414459068816126[401] = 0; + out_4752414459068816126[402] = 0; + out_4752414459068816126[403] = 0; + out_4752414459068816126[404] = 0; + out_4752414459068816126[405] = 0; + out_4752414459068816126[406] = 0; + out_4752414459068816126[407] = 0; + out_4752414459068816126[408] = 0; + out_4752414459068816126[409] = 0; + out_4752414459068816126[410] = 0; + out_4752414459068816126[411] = 0; + out_4752414459068816126[412] = 0; + out_4752414459068816126[413] = 0; + out_4752414459068816126[414] = 0; + out_4752414459068816126[415] = 0; + out_4752414459068816126[416] = 0; + out_4752414459068816126[417] = 0; + out_4752414459068816126[418] = 1; + out_4752414459068816126[419] = 0; + out_4752414459068816126[420] = 0; + out_4752414459068816126[421] = 0; + out_4752414459068816126[422] = 0; + out_4752414459068816126[423] = 0; + out_4752414459068816126[424] = 0; + out_4752414459068816126[425] = 0; + out_4752414459068816126[426] = 0; + out_4752414459068816126[427] = 0; + out_4752414459068816126[428] = 0; + out_4752414459068816126[429] = 0; + out_4752414459068816126[430] = 0; + out_4752414459068816126[431] = 0; + out_4752414459068816126[432] = 0; + out_4752414459068816126[433] = 0; + out_4752414459068816126[434] = 0; + out_4752414459068816126[435] = 0; + out_4752414459068816126[436] = 0; + out_4752414459068816126[437] = 0; + out_4752414459068816126[438] = 0; + out_4752414459068816126[439] = 0; + out_4752414459068816126[440] = 1; } -void h_4(double *state, double *unused, double *out_335431168283599212) { - out_335431168283599212[0] = state[10] + state[13]; - out_335431168283599212[1] = state[11] + state[14]; - out_335431168283599212[2] = state[12] + state[15]; +void h_4(double *state, double *unused, double *out_1938047718740512528) { + out_1938047718740512528[0] = state[10] + state[13]; + out_1938047718740512528[1] = state[11] + state[14]; + out_1938047718740512528[2] = state[12] + state[15]; } -void H_4(double *state, double *unused, double *out_4205541147974148351) { - out_4205541147974148351[0] = 0; - out_4205541147974148351[1] = 0; - out_4205541147974148351[2] = 0; - out_4205541147974148351[3] = 0; - out_4205541147974148351[4] = 0; - out_4205541147974148351[5] = 0; - out_4205541147974148351[6] = 0; - out_4205541147974148351[7] = 0; - out_4205541147974148351[8] = 0; - out_4205541147974148351[9] = 0; - out_4205541147974148351[10] = 1; - out_4205541147974148351[11] = 0; - out_4205541147974148351[12] = 0; - out_4205541147974148351[13] = 1; - out_4205541147974148351[14] = 0; - out_4205541147974148351[15] = 0; - out_4205541147974148351[16] = 0; - out_4205541147974148351[17] = 0; - out_4205541147974148351[18] = 0; - out_4205541147974148351[19] = 0; - out_4205541147974148351[20] = 0; - out_4205541147974148351[21] = 0; - out_4205541147974148351[22] = 0; - out_4205541147974148351[23] = 0; - out_4205541147974148351[24] = 0; - out_4205541147974148351[25] = 0; - out_4205541147974148351[26] = 0; - out_4205541147974148351[27] = 0; - out_4205541147974148351[28] = 0; - out_4205541147974148351[29] = 0; - out_4205541147974148351[30] = 0; - out_4205541147974148351[31] = 0; - out_4205541147974148351[32] = 0; - out_4205541147974148351[33] = 1; - out_4205541147974148351[34] = 0; - out_4205541147974148351[35] = 0; - out_4205541147974148351[36] = 1; - out_4205541147974148351[37] = 0; - out_4205541147974148351[38] = 0; - out_4205541147974148351[39] = 0; - out_4205541147974148351[40] = 0; - out_4205541147974148351[41] = 0; - out_4205541147974148351[42] = 0; - out_4205541147974148351[43] = 0; - out_4205541147974148351[44] = 0; - out_4205541147974148351[45] = 0; - out_4205541147974148351[46] = 0; - out_4205541147974148351[47] = 0; - out_4205541147974148351[48] = 0; - out_4205541147974148351[49] = 0; - out_4205541147974148351[50] = 0; - out_4205541147974148351[51] = 0; - out_4205541147974148351[52] = 0; - out_4205541147974148351[53] = 0; - out_4205541147974148351[54] = 0; - out_4205541147974148351[55] = 0; - out_4205541147974148351[56] = 1; - out_4205541147974148351[57] = 0; - out_4205541147974148351[58] = 0; - out_4205541147974148351[59] = 1; - out_4205541147974148351[60] = 0; - out_4205541147974148351[61] = 0; - out_4205541147974148351[62] = 0; - out_4205541147974148351[63] = 0; - out_4205541147974148351[64] = 0; - out_4205541147974148351[65] = 0; +void H_4(double *state, double *unused, double *out_8437989887064667391) { + out_8437989887064667391[0] = 0; + out_8437989887064667391[1] = 0; + out_8437989887064667391[2] = 0; + out_8437989887064667391[3] = 0; + out_8437989887064667391[4] = 0; + out_8437989887064667391[5] = 0; + out_8437989887064667391[6] = 0; + out_8437989887064667391[7] = 0; + out_8437989887064667391[8] = 0; + out_8437989887064667391[9] = 0; + out_8437989887064667391[10] = 1; + out_8437989887064667391[11] = 0; + out_8437989887064667391[12] = 0; + out_8437989887064667391[13] = 1; + out_8437989887064667391[14] = 0; + out_8437989887064667391[15] = 0; + out_8437989887064667391[16] = 0; + out_8437989887064667391[17] = 0; + out_8437989887064667391[18] = 0; + out_8437989887064667391[19] = 0; + out_8437989887064667391[20] = 0; + out_8437989887064667391[21] = 0; + out_8437989887064667391[22] = 0; + out_8437989887064667391[23] = 0; + out_8437989887064667391[24] = 0; + out_8437989887064667391[25] = 0; + out_8437989887064667391[26] = 0; + out_8437989887064667391[27] = 0; + out_8437989887064667391[28] = 0; + out_8437989887064667391[29] = 0; + out_8437989887064667391[30] = 0; + out_8437989887064667391[31] = 0; + out_8437989887064667391[32] = 0; + out_8437989887064667391[33] = 1; + out_8437989887064667391[34] = 0; + out_8437989887064667391[35] = 0; + out_8437989887064667391[36] = 1; + out_8437989887064667391[37] = 0; + out_8437989887064667391[38] = 0; + out_8437989887064667391[39] = 0; + out_8437989887064667391[40] = 0; + out_8437989887064667391[41] = 0; + out_8437989887064667391[42] = 0; + out_8437989887064667391[43] = 0; + out_8437989887064667391[44] = 0; + out_8437989887064667391[45] = 0; + out_8437989887064667391[46] = 0; + out_8437989887064667391[47] = 0; + out_8437989887064667391[48] = 0; + out_8437989887064667391[49] = 0; + out_8437989887064667391[50] = 0; + out_8437989887064667391[51] = 0; + out_8437989887064667391[52] = 0; + out_8437989887064667391[53] = 0; + out_8437989887064667391[54] = 0; + out_8437989887064667391[55] = 0; + out_8437989887064667391[56] = 1; + out_8437989887064667391[57] = 0; + out_8437989887064667391[58] = 0; + out_8437989887064667391[59] = 1; + out_8437989887064667391[60] = 0; + out_8437989887064667391[61] = 0; + out_8437989887064667391[62] = 0; + out_8437989887064667391[63] = 0; + out_8437989887064667391[64] = 0; + out_8437989887064667391[65] = 0; } -void h_9(double *state, double *unused, double *out_1746837330775165620) { - out_1746837330775165620[0] = state[10]; - out_1746837330775165620[1] = state[11]; - out_1746837330775165620[2] = state[12]; +void h_9(double *state, double *unused, double *out_2016376091952434025) { + out_2016376091952434025[0] = state[10]; + out_2016376091952434025[1] = state[11]; + out_2016376091952434025[2] = state[12]; } -void H_9(double *state, double *unused, double *out_3964351501344557706) { - out_3964351501344557706[0] = 0; - out_3964351501344557706[1] = 0; - out_3964351501344557706[2] = 0; - out_3964351501344557706[3] = 0; - out_3964351501344557706[4] = 0; - out_3964351501344557706[5] = 0; - out_3964351501344557706[6] = 0; - out_3964351501344557706[7] = 0; - out_3964351501344557706[8] = 0; - out_3964351501344557706[9] = 0; - out_3964351501344557706[10] = 1; - out_3964351501344557706[11] = 0; - out_3964351501344557706[12] = 0; - out_3964351501344557706[13] = 0; - out_3964351501344557706[14] = 0; - out_3964351501344557706[15] = 0; - out_3964351501344557706[16] = 0; - out_3964351501344557706[17] = 0; - out_3964351501344557706[18] = 0; - out_3964351501344557706[19] = 0; - out_3964351501344557706[20] = 0; - out_3964351501344557706[21] = 0; - out_3964351501344557706[22] = 0; - out_3964351501344557706[23] = 0; - out_3964351501344557706[24] = 0; - out_3964351501344557706[25] = 0; - out_3964351501344557706[26] = 0; - out_3964351501344557706[27] = 0; - out_3964351501344557706[28] = 0; - out_3964351501344557706[29] = 0; - out_3964351501344557706[30] = 0; - out_3964351501344557706[31] = 0; - out_3964351501344557706[32] = 0; - out_3964351501344557706[33] = 1; - out_3964351501344557706[34] = 0; - out_3964351501344557706[35] = 0; - out_3964351501344557706[36] = 0; - out_3964351501344557706[37] = 0; - out_3964351501344557706[38] = 0; - out_3964351501344557706[39] = 0; - out_3964351501344557706[40] = 0; - out_3964351501344557706[41] = 0; - out_3964351501344557706[42] = 0; - out_3964351501344557706[43] = 0; - out_3964351501344557706[44] = 0; - out_3964351501344557706[45] = 0; - out_3964351501344557706[46] = 0; - out_3964351501344557706[47] = 0; - out_3964351501344557706[48] = 0; - out_3964351501344557706[49] = 0; - out_3964351501344557706[50] = 0; - out_3964351501344557706[51] = 0; - out_3964351501344557706[52] = 0; - out_3964351501344557706[53] = 0; - out_3964351501344557706[54] = 0; - out_3964351501344557706[55] = 0; - out_3964351501344557706[56] = 1; - out_3964351501344557706[57] = 0; - out_3964351501344557706[58] = 0; - out_3964351501344557706[59] = 0; - out_3964351501344557706[60] = 0; - out_3964351501344557706[61] = 0; - out_3964351501344557706[62] = 0; - out_3964351501344557706[63] = 0; - out_3964351501344557706[64] = 0; - out_3964351501344557706[65] = 0; +void H_9(double *state, double *unused, double *out_2721535251380436755) { + out_2721535251380436755[0] = 0; + out_2721535251380436755[1] = 0; + out_2721535251380436755[2] = 0; + out_2721535251380436755[3] = 0; + out_2721535251380436755[4] = 0; + out_2721535251380436755[5] = 0; + out_2721535251380436755[6] = 0; + out_2721535251380436755[7] = 0; + out_2721535251380436755[8] = 0; + out_2721535251380436755[9] = 0; + out_2721535251380436755[10] = 1; + out_2721535251380436755[11] = 0; + out_2721535251380436755[12] = 0; + out_2721535251380436755[13] = 0; + out_2721535251380436755[14] = 0; + out_2721535251380436755[15] = 0; + out_2721535251380436755[16] = 0; + out_2721535251380436755[17] = 0; + out_2721535251380436755[18] = 0; + out_2721535251380436755[19] = 0; + out_2721535251380436755[20] = 0; + out_2721535251380436755[21] = 0; + out_2721535251380436755[22] = 0; + out_2721535251380436755[23] = 0; + out_2721535251380436755[24] = 0; + out_2721535251380436755[25] = 0; + out_2721535251380436755[26] = 0; + out_2721535251380436755[27] = 0; + out_2721535251380436755[28] = 0; + out_2721535251380436755[29] = 0; + out_2721535251380436755[30] = 0; + out_2721535251380436755[31] = 0; + out_2721535251380436755[32] = 0; + out_2721535251380436755[33] = 1; + out_2721535251380436755[34] = 0; + out_2721535251380436755[35] = 0; + out_2721535251380436755[36] = 0; + out_2721535251380436755[37] = 0; + out_2721535251380436755[38] = 0; + out_2721535251380436755[39] = 0; + out_2721535251380436755[40] = 0; + out_2721535251380436755[41] = 0; + out_2721535251380436755[42] = 0; + out_2721535251380436755[43] = 0; + out_2721535251380436755[44] = 0; + out_2721535251380436755[45] = 0; + out_2721535251380436755[46] = 0; + out_2721535251380436755[47] = 0; + out_2721535251380436755[48] = 0; + out_2721535251380436755[49] = 0; + out_2721535251380436755[50] = 0; + out_2721535251380436755[51] = 0; + out_2721535251380436755[52] = 0; + out_2721535251380436755[53] = 0; + out_2721535251380436755[54] = 0; + out_2721535251380436755[55] = 0; + out_2721535251380436755[56] = 1; + out_2721535251380436755[57] = 0; + out_2721535251380436755[58] = 0; + out_2721535251380436755[59] = 0; + out_2721535251380436755[60] = 0; + out_2721535251380436755[61] = 0; + out_2721535251380436755[62] = 0; + out_2721535251380436755[63] = 0; + out_2721535251380436755[64] = 0; + out_2721535251380436755[65] = 0; } -void h_10(double *state, double *unused, double *out_6389141055710814361) { - out_6389141055710814361[0] = 398600500000000.0*(-2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2] + 398600500000000.0*(2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1] + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[0] + state[16] + state[19]; - out_6389141055710814361[1] = 398600500000000.0*(2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2] + 398600500000000.0*(-2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0] + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[1] + state[17] + state[20]; - out_6389141055710814361[2] = 398600500000000.0*(-2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1] + 398600500000000.0*(2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0] + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[2] + state[18] + state[21]; +void h_10(double *state, double *unused, double *out_8252027734007822314) { + out_8252027734007822314[0] = 398600500000000.0*(-2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2] + 398600500000000.0*(2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1] + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[0] + state[16] + state[19]; + out_8252027734007822314[1] = 398600500000000.0*(2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2] + 398600500000000.0*(-2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0] + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[1] + state[17] + state[20]; + out_8252027734007822314[2] = 398600500000000.0*(-2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1] + 398600500000000.0*(2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0] + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[2] + state[18] + state[21]; } -void H_10(double *state, double *unused, double *out_394910773077939482) { - out_394910773077939482[0] = -1195801500000000.0*(-2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[2] - 1195801500000000.0*(2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[1] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*pow(state[0], 2) + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2)); - out_394910773077939482[1] = -1195801500000000.0*(-2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[1]*state[2] - 1195801500000000.0*(2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[1], 2) + 398600500000000.0*(2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[0]*state[1]; - out_394910773077939482[2] = -1195801500000000.0*(-2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[2], 2) + 398600500000000.0*(-2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*(2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[1]*state[2] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[0]*state[2]; - out_394910773077939482[3] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[3] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[6] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[5]; - out_394910773077939482[4] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[4] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[5] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[6]; - out_394910773077939482[5] = -797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[5] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[4] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[3]; - out_394910773077939482[6] = -797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[6] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[3] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[4]; - out_394910773077939482[7] = 0; - out_394910773077939482[8] = 0; - out_394910773077939482[9] = 0; - out_394910773077939482[10] = 0; - out_394910773077939482[11] = 0; - out_394910773077939482[12] = 0; - out_394910773077939482[13] = 0; - out_394910773077939482[14] = 0; - out_394910773077939482[15] = 0; - out_394910773077939482[16] = 1; - out_394910773077939482[17] = 0; - out_394910773077939482[18] = 0; - out_394910773077939482[19] = 1; - out_394910773077939482[20] = 0; - out_394910773077939482[21] = 0; - out_394910773077939482[22] = -1195801500000000.0*(2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[2] - 1195801500000000.0*(-2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[0], 2) + 398600500000000.0*(-2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[0]*state[1]; - out_394910773077939482[23] = -1195801500000000.0*(2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[1]*state[2] - 1195801500000000.0*(-2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[1] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*pow(state[1], 2) + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2)); - out_394910773077939482[24] = -1195801500000000.0*(2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[2], 2) + 398600500000000.0*(2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*(-2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[2] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[1]*state[2]; - out_394910773077939482[25] = -797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[6] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[3] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[4]; - out_394910773077939482[26] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[5] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[4] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[3]; - out_394910773077939482[27] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[4] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[5] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[6]; - out_394910773077939482[28] = -797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[3] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[6] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[5]; - out_394910773077939482[29] = 0; - out_394910773077939482[30] = 0; - out_394910773077939482[31] = 0; - out_394910773077939482[32] = 0; - out_394910773077939482[33] = 0; - out_394910773077939482[34] = 0; - out_394910773077939482[35] = 0; - out_394910773077939482[36] = 0; - out_394910773077939482[37] = 0; - out_394910773077939482[38] = 0; - out_394910773077939482[39] = 1; - out_394910773077939482[40] = 0; - out_394910773077939482[41] = 0; - out_394910773077939482[42] = 1; - out_394910773077939482[43] = 0; - out_394910773077939482[44] = -1195801500000000.0*(-2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[1] - 1195801500000000.0*(2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[0], 2) + 398600500000000.0*(2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[0]*state[2]; - out_394910773077939482[45] = -1195801500000000.0*(-2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[1], 2) + 398600500000000.0*(-2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*(2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[1] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[1]*state[2]; - out_394910773077939482[46] = -1195801500000000.0*(-2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[1]*state[2] - 1195801500000000.0*(2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[2] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*pow(state[2], 2) + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2)); - out_394910773077939482[47] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[5] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[4] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[3]; - out_394910773077939482[48] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[6] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[3] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[4]; - out_394910773077939482[49] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[3] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[6] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[5]; - out_394910773077939482[50] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[4] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[5] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[6]; - out_394910773077939482[51] = 0; - out_394910773077939482[52] = 0; - out_394910773077939482[53] = 0; - out_394910773077939482[54] = 0; - out_394910773077939482[55] = 0; - out_394910773077939482[56] = 0; - out_394910773077939482[57] = 0; - out_394910773077939482[58] = 0; - out_394910773077939482[59] = 0; - out_394910773077939482[60] = 0; - out_394910773077939482[61] = 0; - out_394910773077939482[62] = 1; - out_394910773077939482[63] = 0; - out_394910773077939482[64] = 0; - out_394910773077939482[65] = 1; +void H_10(double *state, double *unused, double *out_1022365631619946756) { + out_1022365631619946756[0] = -1195801500000000.0*(-2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[2] - 1195801500000000.0*(2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[1] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*pow(state[0], 2) + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2)); + out_1022365631619946756[1] = -1195801500000000.0*(-2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[1]*state[2] - 1195801500000000.0*(2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[1], 2) + 398600500000000.0*(2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[0]*state[1]; + out_1022365631619946756[2] = -1195801500000000.0*(-2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[2], 2) + 398600500000000.0*(-2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*(2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[1]*state[2] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[0]*state[2]; + out_1022365631619946756[3] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[3] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[6] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[5]; + out_1022365631619946756[4] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[4] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[5] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[6]; + out_1022365631619946756[5] = -797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[5] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[4] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[3]; + out_1022365631619946756[6] = -797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[6] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[3] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[4]; + out_1022365631619946756[7] = 0; + out_1022365631619946756[8] = 0; + out_1022365631619946756[9] = 0; + out_1022365631619946756[10] = 0; + out_1022365631619946756[11] = 0; + out_1022365631619946756[12] = 0; + out_1022365631619946756[13] = 0; + out_1022365631619946756[14] = 0; + out_1022365631619946756[15] = 0; + out_1022365631619946756[16] = 1; + out_1022365631619946756[17] = 0; + out_1022365631619946756[18] = 0; + out_1022365631619946756[19] = 1; + out_1022365631619946756[20] = 0; + out_1022365631619946756[21] = 0; + out_1022365631619946756[22] = -1195801500000000.0*(2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[2] - 1195801500000000.0*(-2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[0], 2) + 398600500000000.0*(-2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[0]*state[1]; + out_1022365631619946756[23] = -1195801500000000.0*(2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[1]*state[2] - 1195801500000000.0*(-2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[1] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*pow(state[1], 2) + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2)); + out_1022365631619946756[24] = -1195801500000000.0*(2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[2], 2) + 398600500000000.0*(2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*(-2*state[3]*state[6] + 2*state[4]*state[5])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[2] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[1]*state[2]; + out_1022365631619946756[25] = -797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[6] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[3] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[4]; + out_1022365631619946756[26] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[5] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[4] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[3]; + out_1022365631619946756[27] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[4] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[5] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[6]; + out_1022365631619946756[28] = -797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[3] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[6] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[5]; + out_1022365631619946756[29] = 0; + out_1022365631619946756[30] = 0; + out_1022365631619946756[31] = 0; + out_1022365631619946756[32] = 0; + out_1022365631619946756[33] = 0; + out_1022365631619946756[34] = 0; + out_1022365631619946756[35] = 0; + out_1022365631619946756[36] = 0; + out_1022365631619946756[37] = 0; + out_1022365631619946756[38] = 0; + out_1022365631619946756[39] = 1; + out_1022365631619946756[40] = 0; + out_1022365631619946756[41] = 0; + out_1022365631619946756[42] = 1; + out_1022365631619946756[43] = 0; + out_1022365631619946756[44] = -1195801500000000.0*(-2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[1] - 1195801500000000.0*(2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[0], 2) + 398600500000000.0*(2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[0]*state[2]; + out_1022365631619946756[45] = -1195801500000000.0*(-2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*pow(state[1], 2) + 398600500000000.0*(-2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5) - 1195801500000000.0*(2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[1] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[1]*state[2]; + out_1022365631619946756[46] = -1195801500000000.0*(-2*state[3]*state[4] + 2*state[5]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[1]*state[2] - 1195801500000000.0*(2*state[3]*state[5] + 2*state[4]*state[6])*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*state[0]*state[2] - 1195801500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -2.5)*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*pow(state[2], 2) + 398600500000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*(pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2)); + out_1022365631619946756[47] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[5] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[4] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[3]; + out_1022365631619946756[48] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[6] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[3] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[4]; + out_1022365631619946756[49] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[3] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[6] - 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[5]; + out_1022365631619946756[50] = 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[0]*state[4] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[1]*state[5] + 797201000000000.0*pow(pow(state[0], 2) + pow(state[1], 2) + pow(state[2], 2), -1.5)*state[2]*state[6]; + out_1022365631619946756[51] = 0; + out_1022365631619946756[52] = 0; + out_1022365631619946756[53] = 0; + out_1022365631619946756[54] = 0; + out_1022365631619946756[55] = 0; + out_1022365631619946756[56] = 0; + out_1022365631619946756[57] = 0; + out_1022365631619946756[58] = 0; + out_1022365631619946756[59] = 0; + out_1022365631619946756[60] = 0; + out_1022365631619946756[61] = 0; + out_1022365631619946756[62] = 1; + out_1022365631619946756[63] = 0; + out_1022365631619946756[64] = 0; + out_1022365631619946756[65] = 1; } -void h_12(double *state, double *unused, double *out_4800955541602290447) { - out_4800955541602290447[0] = state[0]; - out_4800955541602290447[1] = state[1]; - out_4800955541602290447[2] = state[2]; +void h_12(double *state, double *unused, double *out_490832941153373832) { + out_490832941153373832[0] = state[0]; + out_490832941153373832[1] = state[1]; + out_490832941153373832[2] = state[2]; } -void H_12(double *state, double *unused, double *out_813915260057813444) { - out_813915260057813444[0] = 1; - out_813915260057813444[1] = 0; - out_813915260057813444[2] = 0; - out_813915260057813444[3] = 0; - out_813915260057813444[4] = 0; - out_813915260057813444[5] = 0; - out_813915260057813444[6] = 0; - out_813915260057813444[7] = 0; - out_813915260057813444[8] = 0; - out_813915260057813444[9] = 0; - out_813915260057813444[10] = 0; - out_813915260057813444[11] = 0; - out_813915260057813444[12] = 0; - out_813915260057813444[13] = 0; - out_813915260057813444[14] = 0; - out_813915260057813444[15] = 0; - out_813915260057813444[16] = 0; - out_813915260057813444[17] = 0; - out_813915260057813444[18] = 0; - out_813915260057813444[19] = 0; - out_813915260057813444[20] = 0; - out_813915260057813444[21] = 0; - out_813915260057813444[22] = 0; - out_813915260057813444[23] = 1; - out_813915260057813444[24] = 0; - out_813915260057813444[25] = 0; - out_813915260057813444[26] = 0; - out_813915260057813444[27] = 0; - out_813915260057813444[28] = 0; - out_813915260057813444[29] = 0; - out_813915260057813444[30] = 0; - out_813915260057813444[31] = 0; - out_813915260057813444[32] = 0; - out_813915260057813444[33] = 0; - out_813915260057813444[34] = 0; - out_813915260057813444[35] = 0; - out_813915260057813444[36] = 0; - out_813915260057813444[37] = 0; - out_813915260057813444[38] = 0; - out_813915260057813444[39] = 0; - out_813915260057813444[40] = 0; - out_813915260057813444[41] = 0; - out_813915260057813444[42] = 0; - out_813915260057813444[43] = 0; - out_813915260057813444[44] = 0; - out_813915260057813444[45] = 0; - out_813915260057813444[46] = 1; - out_813915260057813444[47] = 0; - out_813915260057813444[48] = 0; - out_813915260057813444[49] = 0; - out_813915260057813444[50] = 0; - out_813915260057813444[51] = 0; - out_813915260057813444[52] = 0; - out_813915260057813444[53] = 0; - out_813915260057813444[54] = 0; - out_813915260057813444[55] = 0; - out_813915260057813444[56] = 0; - out_813915260057813444[57] = 0; - out_813915260057813444[58] = 0; - out_813915260057813444[59] = 0; - out_813915260057813444[60] = 0; - out_813915260057813444[61] = 0; - out_813915260057813444[62] = 0; - out_813915260057813444[63] = 0; - out_813915260057813444[64] = 0; - out_813915260057813444[65] = 0; +void H_12(double *state, double *unused, double *out_4989297778612922430) { + out_4989297778612922430[0] = 1; + out_4989297778612922430[1] = 0; + out_4989297778612922430[2] = 0; + out_4989297778612922430[3] = 0; + out_4989297778612922430[4] = 0; + out_4989297778612922430[5] = 0; + out_4989297778612922430[6] = 0; + out_4989297778612922430[7] = 0; + out_4989297778612922430[8] = 0; + out_4989297778612922430[9] = 0; + out_4989297778612922430[10] = 0; + out_4989297778612922430[11] = 0; + out_4989297778612922430[12] = 0; + out_4989297778612922430[13] = 0; + out_4989297778612922430[14] = 0; + out_4989297778612922430[15] = 0; + out_4989297778612922430[16] = 0; + out_4989297778612922430[17] = 0; + out_4989297778612922430[18] = 0; + out_4989297778612922430[19] = 0; + out_4989297778612922430[20] = 0; + out_4989297778612922430[21] = 0; + out_4989297778612922430[22] = 0; + out_4989297778612922430[23] = 1; + out_4989297778612922430[24] = 0; + out_4989297778612922430[25] = 0; + out_4989297778612922430[26] = 0; + out_4989297778612922430[27] = 0; + out_4989297778612922430[28] = 0; + out_4989297778612922430[29] = 0; + out_4989297778612922430[30] = 0; + out_4989297778612922430[31] = 0; + out_4989297778612922430[32] = 0; + out_4989297778612922430[33] = 0; + out_4989297778612922430[34] = 0; + out_4989297778612922430[35] = 0; + out_4989297778612922430[36] = 0; + out_4989297778612922430[37] = 0; + out_4989297778612922430[38] = 0; + out_4989297778612922430[39] = 0; + out_4989297778612922430[40] = 0; + out_4989297778612922430[41] = 0; + out_4989297778612922430[42] = 0; + out_4989297778612922430[43] = 0; + out_4989297778612922430[44] = 0; + out_4989297778612922430[45] = 0; + out_4989297778612922430[46] = 1; + out_4989297778612922430[47] = 0; + out_4989297778612922430[48] = 0; + out_4989297778612922430[49] = 0; + out_4989297778612922430[50] = 0; + out_4989297778612922430[51] = 0; + out_4989297778612922430[52] = 0; + out_4989297778612922430[53] = 0; + out_4989297778612922430[54] = 0; + out_4989297778612922430[55] = 0; + out_4989297778612922430[56] = 0; + out_4989297778612922430[57] = 0; + out_4989297778612922430[58] = 0; + out_4989297778612922430[59] = 0; + out_4989297778612922430[60] = 0; + out_4989297778612922430[61] = 0; + out_4989297778612922430[62] = 0; + out_4989297778612922430[63] = 0; + out_4989297778612922430[64] = 0; + out_4989297778612922430[65] = 0; } -void h_35(double *state, double *unused, double *out_8655348954820926857) { - out_8655348954820926857[0] = state[7]; - out_8655348954820926857[1] = state[8]; - out_8655348954820926857[2] = state[9]; +void h_35(double *state, double *unused, double *out_851812883202032952) { + out_851812883202032952[0] = state[7]; + out_851812883202032952[1] = state[8]; + out_851812883202032952[2] = state[9]; } -void H_35(double *state, double *unused, double *out_838879090601540975) { - out_838879090601540975[0] = 0; - out_838879090601540975[1] = 0; - out_838879090601540975[2] = 0; - out_838879090601540975[3] = 0; - out_838879090601540975[4] = 0; - out_838879090601540975[5] = 0; - out_838879090601540975[6] = 0; - out_838879090601540975[7] = 1; - out_838879090601540975[8] = 0; - out_838879090601540975[9] = 0; - out_838879090601540975[10] = 0; - out_838879090601540975[11] = 0; - out_838879090601540975[12] = 0; - out_838879090601540975[13] = 0; - out_838879090601540975[14] = 0; - out_838879090601540975[15] = 0; - out_838879090601540975[16] = 0; - out_838879090601540975[17] = 0; - out_838879090601540975[18] = 0; - out_838879090601540975[19] = 0; - out_838879090601540975[20] = 0; - out_838879090601540975[21] = 0; - out_838879090601540975[22] = 0; - out_838879090601540975[23] = 0; - out_838879090601540975[24] = 0; - out_838879090601540975[25] = 0; - out_838879090601540975[26] = 0; - out_838879090601540975[27] = 0; - out_838879090601540975[28] = 0; - out_838879090601540975[29] = 0; - out_838879090601540975[30] = 1; - out_838879090601540975[31] = 0; - out_838879090601540975[32] = 0; - out_838879090601540975[33] = 0; - out_838879090601540975[34] = 0; - out_838879090601540975[35] = 0; - out_838879090601540975[36] = 0; - out_838879090601540975[37] = 0; - out_838879090601540975[38] = 0; - out_838879090601540975[39] = 0; - out_838879090601540975[40] = 0; - out_838879090601540975[41] = 0; - out_838879090601540975[42] = 0; - out_838879090601540975[43] = 0; - out_838879090601540975[44] = 0; - out_838879090601540975[45] = 0; - out_838879090601540975[46] = 0; - out_838879090601540975[47] = 0; - out_838879090601540975[48] = 0; - out_838879090601540975[49] = 0; - out_838879090601540975[50] = 0; - out_838879090601540975[51] = 0; - out_838879090601540975[52] = 0; - out_838879090601540975[53] = 1; - out_838879090601540975[54] = 0; - out_838879090601540975[55] = 0; - out_838879090601540975[56] = 0; - out_838879090601540975[57] = 0; - out_838879090601540975[58] = 0; - out_838879090601540975[59] = 0; - out_838879090601540975[60] = 0; - out_838879090601540975[61] = 0; - out_838879090601540975[62] = 0; - out_838879090601540975[63] = 0; - out_838879090601540975[64] = 0; - out_838879090601540975[65] = 0; +void H_35(double *state, double *unused, double *out_6642092129272276849) { + out_6642092129272276849[0] = 0; + out_6642092129272276849[1] = 0; + out_6642092129272276849[2] = 0; + out_6642092129272276849[3] = 0; + out_6642092129272276849[4] = 0; + out_6642092129272276849[5] = 0; + out_6642092129272276849[6] = 0; + out_6642092129272276849[7] = 1; + out_6642092129272276849[8] = 0; + out_6642092129272276849[9] = 0; + out_6642092129272276849[10] = 0; + out_6642092129272276849[11] = 0; + out_6642092129272276849[12] = 0; + out_6642092129272276849[13] = 0; + out_6642092129272276849[14] = 0; + out_6642092129272276849[15] = 0; + out_6642092129272276849[16] = 0; + out_6642092129272276849[17] = 0; + out_6642092129272276849[18] = 0; + out_6642092129272276849[19] = 0; + out_6642092129272276849[20] = 0; + out_6642092129272276849[21] = 0; + out_6642092129272276849[22] = 0; + out_6642092129272276849[23] = 0; + out_6642092129272276849[24] = 0; + out_6642092129272276849[25] = 0; + out_6642092129272276849[26] = 0; + out_6642092129272276849[27] = 0; + out_6642092129272276849[28] = 0; + out_6642092129272276849[29] = 0; + out_6642092129272276849[30] = 1; + out_6642092129272276849[31] = 0; + out_6642092129272276849[32] = 0; + out_6642092129272276849[33] = 0; + out_6642092129272276849[34] = 0; + out_6642092129272276849[35] = 0; + out_6642092129272276849[36] = 0; + out_6642092129272276849[37] = 0; + out_6642092129272276849[38] = 0; + out_6642092129272276849[39] = 0; + out_6642092129272276849[40] = 0; + out_6642092129272276849[41] = 0; + out_6642092129272276849[42] = 0; + out_6642092129272276849[43] = 0; + out_6642092129272276849[44] = 0; + out_6642092129272276849[45] = 0; + out_6642092129272276849[46] = 0; + out_6642092129272276849[47] = 0; + out_6642092129272276849[48] = 0; + out_6642092129272276849[49] = 0; + out_6642092129272276849[50] = 0; + out_6642092129272276849[51] = 0; + out_6642092129272276849[52] = 0; + out_6642092129272276849[53] = 1; + out_6642092129272276849[54] = 0; + out_6642092129272276849[55] = 0; + out_6642092129272276849[56] = 0; + out_6642092129272276849[57] = 0; + out_6642092129272276849[58] = 0; + out_6642092129272276849[59] = 0; + out_6642092129272276849[60] = 0; + out_6642092129272276849[61] = 0; + out_6642092129272276849[62] = 0; + out_6642092129272276849[63] = 0; + out_6642092129272276849[64] = 0; + out_6642092129272276849[65] = 0; } -void h_32(double *state, double *unused, double *out_7002226014671976453) { - out_7002226014671976453[0] = state[3]; - out_7002226014671976453[1] = state[4]; - out_7002226014671976453[2] = state[5]; - out_7002226014671976453[3] = state[6]; +void h_32(double *state, double *unused, double *out_7198045605532929596) { + out_7198045605532929596[0] = state[3]; + out_7198045605532929596[1] = state[4]; + out_7198045605532929596[2] = state[5]; + out_7198045605532929596[3] = state[6]; } -void H_32(double *state, double *unused, double *out_707714305660800506) { - out_707714305660800506[0] = 0; - out_707714305660800506[1] = 0; - out_707714305660800506[2] = 0; - out_707714305660800506[3] = 1; - out_707714305660800506[4] = 0; - out_707714305660800506[5] = 0; - out_707714305660800506[6] = 0; - out_707714305660800506[7] = 0; - out_707714305660800506[8] = 0; - out_707714305660800506[9] = 0; - out_707714305660800506[10] = 0; - out_707714305660800506[11] = 0; - out_707714305660800506[12] = 0; - out_707714305660800506[13] = 0; - out_707714305660800506[14] = 0; - out_707714305660800506[15] = 0; - out_707714305660800506[16] = 0; - out_707714305660800506[17] = 0; - out_707714305660800506[18] = 0; - out_707714305660800506[19] = 0; - out_707714305660800506[20] = 0; - out_707714305660800506[21] = 0; - out_707714305660800506[22] = 0; - out_707714305660800506[23] = 0; - out_707714305660800506[24] = 0; - out_707714305660800506[25] = 0; - out_707714305660800506[26] = 1; - out_707714305660800506[27] = 0; - out_707714305660800506[28] = 0; - out_707714305660800506[29] = 0; - out_707714305660800506[30] = 0; - out_707714305660800506[31] = 0; - out_707714305660800506[32] = 0; - out_707714305660800506[33] = 0; - out_707714305660800506[34] = 0; - out_707714305660800506[35] = 0; - out_707714305660800506[36] = 0; - out_707714305660800506[37] = 0; - out_707714305660800506[38] = 0; - out_707714305660800506[39] = 0; - out_707714305660800506[40] = 0; - out_707714305660800506[41] = 0; - out_707714305660800506[42] = 0; - out_707714305660800506[43] = 0; - out_707714305660800506[44] = 0; - out_707714305660800506[45] = 0; - out_707714305660800506[46] = 0; - out_707714305660800506[47] = 0; - out_707714305660800506[48] = 0; - out_707714305660800506[49] = 1; - out_707714305660800506[50] = 0; - out_707714305660800506[51] = 0; - out_707714305660800506[52] = 0; - out_707714305660800506[53] = 0; - out_707714305660800506[54] = 0; - out_707714305660800506[55] = 0; - out_707714305660800506[56] = 0; - out_707714305660800506[57] = 0; - out_707714305660800506[58] = 0; - out_707714305660800506[59] = 0; - out_707714305660800506[60] = 0; - out_707714305660800506[61] = 0; - out_707714305660800506[62] = 0; - out_707714305660800506[63] = 0; - out_707714305660800506[64] = 0; - out_707714305660800506[65] = 0; - out_707714305660800506[66] = 0; - out_707714305660800506[67] = 0; - out_707714305660800506[68] = 0; - out_707714305660800506[69] = 0; - out_707714305660800506[70] = 0; - out_707714305660800506[71] = 0; - out_707714305660800506[72] = 1; - out_707714305660800506[73] = 0; - out_707714305660800506[74] = 0; - out_707714305660800506[75] = 0; - out_707714305660800506[76] = 0; - out_707714305660800506[77] = 0; - out_707714305660800506[78] = 0; - out_707714305660800506[79] = 0; - out_707714305660800506[80] = 0; - out_707714305660800506[81] = 0; - out_707714305660800506[82] = 0; - out_707714305660800506[83] = 0; - out_707714305660800506[84] = 0; - out_707714305660800506[85] = 0; - out_707714305660800506[86] = 0; - out_707714305660800506[87] = 0; +void H_32(double *state, double *unused, double *out_6510927344331536380) { + out_6510927344331536380[0] = 0; + out_6510927344331536380[1] = 0; + out_6510927344331536380[2] = 0; + out_6510927344331536380[3] = 1; + out_6510927344331536380[4] = 0; + out_6510927344331536380[5] = 0; + out_6510927344331536380[6] = 0; + out_6510927344331536380[7] = 0; + out_6510927344331536380[8] = 0; + out_6510927344331536380[9] = 0; + out_6510927344331536380[10] = 0; + out_6510927344331536380[11] = 0; + out_6510927344331536380[12] = 0; + out_6510927344331536380[13] = 0; + out_6510927344331536380[14] = 0; + out_6510927344331536380[15] = 0; + out_6510927344331536380[16] = 0; + out_6510927344331536380[17] = 0; + out_6510927344331536380[18] = 0; + out_6510927344331536380[19] = 0; + out_6510927344331536380[20] = 0; + out_6510927344331536380[21] = 0; + out_6510927344331536380[22] = 0; + out_6510927344331536380[23] = 0; + out_6510927344331536380[24] = 0; + out_6510927344331536380[25] = 0; + out_6510927344331536380[26] = 1; + out_6510927344331536380[27] = 0; + out_6510927344331536380[28] = 0; + out_6510927344331536380[29] = 0; + out_6510927344331536380[30] = 0; + out_6510927344331536380[31] = 0; + out_6510927344331536380[32] = 0; + out_6510927344331536380[33] = 0; + out_6510927344331536380[34] = 0; + out_6510927344331536380[35] = 0; + out_6510927344331536380[36] = 0; + out_6510927344331536380[37] = 0; + out_6510927344331536380[38] = 0; + out_6510927344331536380[39] = 0; + out_6510927344331536380[40] = 0; + out_6510927344331536380[41] = 0; + out_6510927344331536380[42] = 0; + out_6510927344331536380[43] = 0; + out_6510927344331536380[44] = 0; + out_6510927344331536380[45] = 0; + out_6510927344331536380[46] = 0; + out_6510927344331536380[47] = 0; + out_6510927344331536380[48] = 0; + out_6510927344331536380[49] = 1; + out_6510927344331536380[50] = 0; + out_6510927344331536380[51] = 0; + out_6510927344331536380[52] = 0; + out_6510927344331536380[53] = 0; + out_6510927344331536380[54] = 0; + out_6510927344331536380[55] = 0; + out_6510927344331536380[56] = 0; + out_6510927344331536380[57] = 0; + out_6510927344331536380[58] = 0; + out_6510927344331536380[59] = 0; + out_6510927344331536380[60] = 0; + out_6510927344331536380[61] = 0; + out_6510927344331536380[62] = 0; + out_6510927344331536380[63] = 0; + out_6510927344331536380[64] = 0; + out_6510927344331536380[65] = 0; + out_6510927344331536380[66] = 0; + out_6510927344331536380[67] = 0; + out_6510927344331536380[68] = 0; + out_6510927344331536380[69] = 0; + out_6510927344331536380[70] = 0; + out_6510927344331536380[71] = 0; + out_6510927344331536380[72] = 1; + out_6510927344331536380[73] = 0; + out_6510927344331536380[74] = 0; + out_6510927344331536380[75] = 0; + out_6510927344331536380[76] = 0; + out_6510927344331536380[77] = 0; + out_6510927344331536380[78] = 0; + out_6510927344331536380[79] = 0; + out_6510927344331536380[80] = 0; + out_6510927344331536380[81] = 0; + out_6510927344331536380[82] = 0; + out_6510927344331536380[83] = 0; + out_6510927344331536380[84] = 0; + out_6510927344331536380[85] = 0; + out_6510927344331536380[86] = 0; + out_6510927344331536380[87] = 0; } -void h_13(double *state, double *unused, double *out_6173959503153832213) { - out_6173959503153832213[0] = (-2*state[3]*state[5] + 2*state[4]*state[6])*state[9] + (2*state[3]*state[6] + 2*state[4]*state[5])*state[8] + (pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[7]; - out_6173959503153832213[1] = (2*state[3]*state[4] + 2*state[5]*state[6])*state[9] + (-2*state[3]*state[6] + 2*state[4]*state[5])*state[7] + (pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[8]; - out_6173959503153832213[2] = (-2*state[3]*state[4] + 2*state[5]*state[6])*state[8] + (2*state[3]*state[5] + 2*state[4]*state[6])*state[7] + (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[9]; +void h_13(double *state, double *unused, double *out_6813957582124674447) { + out_6813957582124674447[0] = (-2*state[3]*state[5] + 2*state[4]*state[6])*state[9] + (2*state[3]*state[6] + 2*state[4]*state[5])*state[8] + (pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2))*state[7]; + out_6813957582124674447[1] = (2*state[3]*state[4] + 2*state[5]*state[6])*state[9] + (-2*state[3]*state[6] + 2*state[4]*state[5])*state[7] + (pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2))*state[8]; + out_6813957582124674447[2] = (-2*state[3]*state[4] + 2*state[5]*state[6])*state[8] + (2*state[3]*state[5] + 2*state[4]*state[6])*state[7] + (pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2))*state[9]; } -void H_13(double *state, double *unused, double *out_1842862337219813003) { - out_1842862337219813003[0] = 0; - out_1842862337219813003[1] = 0; - out_1842862337219813003[2] = 0; - out_1842862337219813003[3] = 2*state[3]*state[7] - 2*state[5]*state[9] + 2*state[6]*state[8]; - out_1842862337219813003[4] = 2*state[4]*state[7] + 2*state[5]*state[8] + 2*state[6]*state[9]; - out_1842862337219813003[5] = -2*state[3]*state[9] + 2*state[4]*state[8] - 2*state[5]*state[7]; - out_1842862337219813003[6] = 2*state[3]*state[8] + 2*state[4]*state[9] - 2*state[6]*state[7]; - out_1842862337219813003[7] = pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2); - out_1842862337219813003[8] = 2*state[3]*state[6] + 2*state[4]*state[5]; - out_1842862337219813003[9] = -2*state[3]*state[5] + 2*state[4]*state[6]; - out_1842862337219813003[10] = 0; - out_1842862337219813003[11] = 0; - out_1842862337219813003[12] = 0; - out_1842862337219813003[13] = 0; - out_1842862337219813003[14] = 0; - out_1842862337219813003[15] = 0; - out_1842862337219813003[16] = 0; - out_1842862337219813003[17] = 0; - out_1842862337219813003[18] = 0; - out_1842862337219813003[19] = 0; - out_1842862337219813003[20] = 0; - out_1842862337219813003[21] = 0; - out_1842862337219813003[22] = 0; - out_1842862337219813003[23] = 0; - out_1842862337219813003[24] = 0; - out_1842862337219813003[25] = 2*state[3]*state[8] + 2*state[4]*state[9] - 2*state[6]*state[7]; - out_1842862337219813003[26] = 2*state[3]*state[9] - 2*state[4]*state[8] + 2*state[5]*state[7]; - out_1842862337219813003[27] = 2*state[4]*state[7] + 2*state[5]*state[8] + 2*state[6]*state[9]; - out_1842862337219813003[28] = -2*state[3]*state[7] + 2*state[5]*state[9] - 2*state[6]*state[8]; - out_1842862337219813003[29] = -2*state[3]*state[6] + 2*state[4]*state[5]; - out_1842862337219813003[30] = pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2); - out_1842862337219813003[31] = 2*state[3]*state[4] + 2*state[5]*state[6]; - out_1842862337219813003[32] = 0; - out_1842862337219813003[33] = 0; - out_1842862337219813003[34] = 0; - out_1842862337219813003[35] = 0; - out_1842862337219813003[36] = 0; - out_1842862337219813003[37] = 0; - out_1842862337219813003[38] = 0; - out_1842862337219813003[39] = 0; - out_1842862337219813003[40] = 0; - out_1842862337219813003[41] = 0; - out_1842862337219813003[42] = 0; - out_1842862337219813003[43] = 0; - out_1842862337219813003[44] = 0; - out_1842862337219813003[45] = 0; - out_1842862337219813003[46] = 0; - out_1842862337219813003[47] = 2*state[3]*state[9] - 2*state[4]*state[8] + 2*state[5]*state[7]; - out_1842862337219813003[48] = -2*state[3]*state[8] - 2*state[4]*state[9] + 2*state[6]*state[7]; - out_1842862337219813003[49] = 2*state[3]*state[7] - 2*state[5]*state[9] + 2*state[6]*state[8]; - out_1842862337219813003[50] = 2*state[4]*state[7] + 2*state[5]*state[8] + 2*state[6]*state[9]; - out_1842862337219813003[51] = 2*state[3]*state[5] + 2*state[4]*state[6]; - out_1842862337219813003[52] = -2*state[3]*state[4] + 2*state[5]*state[6]; - out_1842862337219813003[53] = pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2); - out_1842862337219813003[54] = 0; - out_1842862337219813003[55] = 0; - out_1842862337219813003[56] = 0; - out_1842862337219813003[57] = 0; - out_1842862337219813003[58] = 0; - out_1842862337219813003[59] = 0; - out_1842862337219813003[60] = 0; - out_1842862337219813003[61] = 0; - out_1842862337219813003[62] = 0; - out_1842862337219813003[63] = 0; - out_1842862337219813003[64] = 0; - out_1842862337219813003[65] = 0; +void H_13(double *state, double *unused, double *out_7851984426394690165) { + out_7851984426394690165[0] = 0; + out_7851984426394690165[1] = 0; + out_7851984426394690165[2] = 0; + out_7851984426394690165[3] = 2*state[3]*state[7] - 2*state[5]*state[9] + 2*state[6]*state[8]; + out_7851984426394690165[4] = 2*state[4]*state[7] + 2*state[5]*state[8] + 2*state[6]*state[9]; + out_7851984426394690165[5] = -2*state[3]*state[9] + 2*state[4]*state[8] - 2*state[5]*state[7]; + out_7851984426394690165[6] = 2*state[3]*state[8] + 2*state[4]*state[9] - 2*state[6]*state[7]; + out_7851984426394690165[7] = pow(state[3], 2) + pow(state[4], 2) - pow(state[5], 2) - pow(state[6], 2); + out_7851984426394690165[8] = 2*state[3]*state[6] + 2*state[4]*state[5]; + out_7851984426394690165[9] = -2*state[3]*state[5] + 2*state[4]*state[6]; + out_7851984426394690165[10] = 0; + out_7851984426394690165[11] = 0; + out_7851984426394690165[12] = 0; + out_7851984426394690165[13] = 0; + out_7851984426394690165[14] = 0; + out_7851984426394690165[15] = 0; + out_7851984426394690165[16] = 0; + out_7851984426394690165[17] = 0; + out_7851984426394690165[18] = 0; + out_7851984426394690165[19] = 0; + out_7851984426394690165[20] = 0; + out_7851984426394690165[21] = 0; + out_7851984426394690165[22] = 0; + out_7851984426394690165[23] = 0; + out_7851984426394690165[24] = 0; + out_7851984426394690165[25] = 2*state[3]*state[8] + 2*state[4]*state[9] - 2*state[6]*state[7]; + out_7851984426394690165[26] = 2*state[3]*state[9] - 2*state[4]*state[8] + 2*state[5]*state[7]; + out_7851984426394690165[27] = 2*state[4]*state[7] + 2*state[5]*state[8] + 2*state[6]*state[9]; + out_7851984426394690165[28] = -2*state[3]*state[7] + 2*state[5]*state[9] - 2*state[6]*state[8]; + out_7851984426394690165[29] = -2*state[3]*state[6] + 2*state[4]*state[5]; + out_7851984426394690165[30] = pow(state[3], 2) - pow(state[4], 2) + pow(state[5], 2) - pow(state[6], 2); + out_7851984426394690165[31] = 2*state[3]*state[4] + 2*state[5]*state[6]; + out_7851984426394690165[32] = 0; + out_7851984426394690165[33] = 0; + out_7851984426394690165[34] = 0; + out_7851984426394690165[35] = 0; + out_7851984426394690165[36] = 0; + out_7851984426394690165[37] = 0; + out_7851984426394690165[38] = 0; + out_7851984426394690165[39] = 0; + out_7851984426394690165[40] = 0; + out_7851984426394690165[41] = 0; + out_7851984426394690165[42] = 0; + out_7851984426394690165[43] = 0; + out_7851984426394690165[44] = 0; + out_7851984426394690165[45] = 0; + out_7851984426394690165[46] = 0; + out_7851984426394690165[47] = 2*state[3]*state[9] - 2*state[4]*state[8] + 2*state[5]*state[7]; + out_7851984426394690165[48] = -2*state[3]*state[8] - 2*state[4]*state[9] + 2*state[6]*state[7]; + out_7851984426394690165[49] = 2*state[3]*state[7] - 2*state[5]*state[9] + 2*state[6]*state[8]; + out_7851984426394690165[50] = 2*state[4]*state[7] + 2*state[5]*state[8] + 2*state[6]*state[9]; + out_7851984426394690165[51] = 2*state[3]*state[5] + 2*state[4]*state[6]; + out_7851984426394690165[52] = -2*state[3]*state[4] + 2*state[5]*state[6]; + out_7851984426394690165[53] = pow(state[3], 2) - pow(state[4], 2) - pow(state[5], 2) + pow(state[6], 2); + out_7851984426394690165[54] = 0; + out_7851984426394690165[55] = 0; + out_7851984426394690165[56] = 0; + out_7851984426394690165[57] = 0; + out_7851984426394690165[58] = 0; + out_7851984426394690165[59] = 0; + out_7851984426394690165[60] = 0; + out_7851984426394690165[61] = 0; + out_7851984426394690165[62] = 0; + out_7851984426394690165[63] = 0; + out_7851984426394690165[64] = 0; + out_7851984426394690165[65] = 0; } -void h_14(double *state, double *unused, double *out_1746837330775165620) { - out_1746837330775165620[0] = state[10]; - out_1746837330775165620[1] = state[11]; - out_1746837330775165620[2] = state[12]; +void h_14(double *state, double *unused, double *out_2016376091952434025) { + out_2016376091952434025[0] = state[10]; + out_2016376091952434025[1] = state[11]; + out_2016376091952434025[2] = state[12]; } -void H_14(double *state, double *unused, double *out_3964351501344557706) { - out_3964351501344557706[0] = 0; - out_3964351501344557706[1] = 0; - out_3964351501344557706[2] = 0; - out_3964351501344557706[3] = 0; - out_3964351501344557706[4] = 0; - out_3964351501344557706[5] = 0; - out_3964351501344557706[6] = 0; - out_3964351501344557706[7] = 0; - out_3964351501344557706[8] = 0; - out_3964351501344557706[9] = 0; - out_3964351501344557706[10] = 1; - out_3964351501344557706[11] = 0; - out_3964351501344557706[12] = 0; - out_3964351501344557706[13] = 0; - out_3964351501344557706[14] = 0; - out_3964351501344557706[15] = 0; - out_3964351501344557706[16] = 0; - out_3964351501344557706[17] = 0; - out_3964351501344557706[18] = 0; - out_3964351501344557706[19] = 0; - out_3964351501344557706[20] = 0; - out_3964351501344557706[21] = 0; - out_3964351501344557706[22] = 0; - out_3964351501344557706[23] = 0; - out_3964351501344557706[24] = 0; - out_3964351501344557706[25] = 0; - out_3964351501344557706[26] = 0; - out_3964351501344557706[27] = 0; - out_3964351501344557706[28] = 0; - out_3964351501344557706[29] = 0; - out_3964351501344557706[30] = 0; - out_3964351501344557706[31] = 0; - out_3964351501344557706[32] = 0; - out_3964351501344557706[33] = 1; - out_3964351501344557706[34] = 0; - out_3964351501344557706[35] = 0; - out_3964351501344557706[36] = 0; - out_3964351501344557706[37] = 0; - out_3964351501344557706[38] = 0; - out_3964351501344557706[39] = 0; - out_3964351501344557706[40] = 0; - out_3964351501344557706[41] = 0; - out_3964351501344557706[42] = 0; - out_3964351501344557706[43] = 0; - out_3964351501344557706[44] = 0; - out_3964351501344557706[45] = 0; - out_3964351501344557706[46] = 0; - out_3964351501344557706[47] = 0; - out_3964351501344557706[48] = 0; - out_3964351501344557706[49] = 0; - out_3964351501344557706[50] = 0; - out_3964351501344557706[51] = 0; - out_3964351501344557706[52] = 0; - out_3964351501344557706[53] = 0; - out_3964351501344557706[54] = 0; - out_3964351501344557706[55] = 0; - out_3964351501344557706[56] = 1; - out_3964351501344557706[57] = 0; - out_3964351501344557706[58] = 0; - out_3964351501344557706[59] = 0; - out_3964351501344557706[60] = 0; - out_3964351501344557706[61] = 0; - out_3964351501344557706[62] = 0; - out_3964351501344557706[63] = 0; - out_3964351501344557706[64] = 0; - out_3964351501344557706[65] = 0; +void H_14(double *state, double *unused, double *out_2721535251380436755) { + out_2721535251380436755[0] = 0; + out_2721535251380436755[1] = 0; + out_2721535251380436755[2] = 0; + out_2721535251380436755[3] = 0; + out_2721535251380436755[4] = 0; + out_2721535251380436755[5] = 0; + out_2721535251380436755[6] = 0; + out_2721535251380436755[7] = 0; + out_2721535251380436755[8] = 0; + out_2721535251380436755[9] = 0; + out_2721535251380436755[10] = 1; + out_2721535251380436755[11] = 0; + out_2721535251380436755[12] = 0; + out_2721535251380436755[13] = 0; + out_2721535251380436755[14] = 0; + out_2721535251380436755[15] = 0; + out_2721535251380436755[16] = 0; + out_2721535251380436755[17] = 0; + out_2721535251380436755[18] = 0; + out_2721535251380436755[19] = 0; + out_2721535251380436755[20] = 0; + out_2721535251380436755[21] = 0; + out_2721535251380436755[22] = 0; + out_2721535251380436755[23] = 0; + out_2721535251380436755[24] = 0; + out_2721535251380436755[25] = 0; + out_2721535251380436755[26] = 0; + out_2721535251380436755[27] = 0; + out_2721535251380436755[28] = 0; + out_2721535251380436755[29] = 0; + out_2721535251380436755[30] = 0; + out_2721535251380436755[31] = 0; + out_2721535251380436755[32] = 0; + out_2721535251380436755[33] = 1; + out_2721535251380436755[34] = 0; + out_2721535251380436755[35] = 0; + out_2721535251380436755[36] = 0; + out_2721535251380436755[37] = 0; + out_2721535251380436755[38] = 0; + out_2721535251380436755[39] = 0; + out_2721535251380436755[40] = 0; + out_2721535251380436755[41] = 0; + out_2721535251380436755[42] = 0; + out_2721535251380436755[43] = 0; + out_2721535251380436755[44] = 0; + out_2721535251380436755[45] = 0; + out_2721535251380436755[46] = 0; + out_2721535251380436755[47] = 0; + out_2721535251380436755[48] = 0; + out_2721535251380436755[49] = 0; + out_2721535251380436755[50] = 0; + out_2721535251380436755[51] = 0; + out_2721535251380436755[52] = 0; + out_2721535251380436755[53] = 0; + out_2721535251380436755[54] = 0; + out_2721535251380436755[55] = 0; + out_2721535251380436755[56] = 1; + out_2721535251380436755[57] = 0; + out_2721535251380436755[58] = 0; + out_2721535251380436755[59] = 0; + out_2721535251380436755[60] = 0; + out_2721535251380436755[61] = 0; + out_2721535251380436755[62] = 0; + out_2721535251380436755[63] = 0; + out_2721535251380436755[64] = 0; + out_2721535251380436755[65] = 0; } -void h_33(double *state, double *unused, double *out_5949943105988094266) { - out_5949943105988094266[0] = state[16]; - out_5949943105988094266[1] = state[17]; - out_5949943105988094266[2] = state[18]; +void h_33(double *state, double *unused, double *out_1521077794722315231) { + out_1521077794722315231[0] = state[16]; + out_1521077794722315231[1] = state[17]; + out_1521077794722315231[2] = state[18]; } -void H_33(double *state, double *unused, double *out_2311677914037316629) { - out_2311677914037316629[0] = 0; - out_2311677914037316629[1] = 0; - out_2311677914037316629[2] = 0; - out_2311677914037316629[3] = 0; - out_2311677914037316629[4] = 0; - out_2311677914037316629[5] = 0; - out_2311677914037316629[6] = 0; - out_2311677914037316629[7] = 0; - out_2311677914037316629[8] = 0; - out_2311677914037316629[9] = 0; - out_2311677914037316629[10] = 0; - out_2311677914037316629[11] = 0; - out_2311677914037316629[12] = 0; - out_2311677914037316629[13] = 0; - out_2311677914037316629[14] = 0; - out_2311677914037316629[15] = 0; - out_2311677914037316629[16] = 1; - out_2311677914037316629[17] = 0; - out_2311677914037316629[18] = 0; - out_2311677914037316629[19] = 0; - out_2311677914037316629[20] = 0; - out_2311677914037316629[21] = 0; - out_2311677914037316629[22] = 0; - out_2311677914037316629[23] = 0; - out_2311677914037316629[24] = 0; - out_2311677914037316629[25] = 0; - out_2311677914037316629[26] = 0; - out_2311677914037316629[27] = 0; - out_2311677914037316629[28] = 0; - out_2311677914037316629[29] = 0; - out_2311677914037316629[30] = 0; - out_2311677914037316629[31] = 0; - out_2311677914037316629[32] = 0; - out_2311677914037316629[33] = 0; - out_2311677914037316629[34] = 0; - out_2311677914037316629[35] = 0; - out_2311677914037316629[36] = 0; - out_2311677914037316629[37] = 0; - out_2311677914037316629[38] = 0; - out_2311677914037316629[39] = 1; - out_2311677914037316629[40] = 0; - out_2311677914037316629[41] = 0; - out_2311677914037316629[42] = 0; - out_2311677914037316629[43] = 0; - out_2311677914037316629[44] = 0; - out_2311677914037316629[45] = 0; - out_2311677914037316629[46] = 0; - out_2311677914037316629[47] = 0; - out_2311677914037316629[48] = 0; - out_2311677914037316629[49] = 0; - out_2311677914037316629[50] = 0; - out_2311677914037316629[51] = 0; - out_2311677914037316629[52] = 0; - out_2311677914037316629[53] = 0; - out_2311677914037316629[54] = 0; - out_2311677914037316629[55] = 0; - out_2311677914037316629[56] = 0; - out_2311677914037316629[57] = 0; - out_2311677914037316629[58] = 0; - out_2311677914037316629[59] = 0; - out_2311677914037316629[60] = 0; - out_2311677914037316629[61] = 0; - out_2311677914037316629[62] = 1; - out_2311677914037316629[63] = 0; - out_2311677914037316629[64] = 0; - out_2311677914037316629[65] = 0; +void H_33(double *state, double *unused, double *out_3491535124633419245) { + out_3491535124633419245[0] = 0; + out_3491535124633419245[1] = 0; + out_3491535124633419245[2] = 0; + out_3491535124633419245[3] = 0; + out_3491535124633419245[4] = 0; + out_3491535124633419245[5] = 0; + out_3491535124633419245[6] = 0; + out_3491535124633419245[7] = 0; + out_3491535124633419245[8] = 0; + out_3491535124633419245[9] = 0; + out_3491535124633419245[10] = 0; + out_3491535124633419245[11] = 0; + out_3491535124633419245[12] = 0; + out_3491535124633419245[13] = 0; + out_3491535124633419245[14] = 0; + out_3491535124633419245[15] = 0; + out_3491535124633419245[16] = 1; + out_3491535124633419245[17] = 0; + out_3491535124633419245[18] = 0; + out_3491535124633419245[19] = 0; + out_3491535124633419245[20] = 0; + out_3491535124633419245[21] = 0; + out_3491535124633419245[22] = 0; + out_3491535124633419245[23] = 0; + out_3491535124633419245[24] = 0; + out_3491535124633419245[25] = 0; + out_3491535124633419245[26] = 0; + out_3491535124633419245[27] = 0; + out_3491535124633419245[28] = 0; + out_3491535124633419245[29] = 0; + out_3491535124633419245[30] = 0; + out_3491535124633419245[31] = 0; + out_3491535124633419245[32] = 0; + out_3491535124633419245[33] = 0; + out_3491535124633419245[34] = 0; + out_3491535124633419245[35] = 0; + out_3491535124633419245[36] = 0; + out_3491535124633419245[37] = 0; + out_3491535124633419245[38] = 0; + out_3491535124633419245[39] = 1; + out_3491535124633419245[40] = 0; + out_3491535124633419245[41] = 0; + out_3491535124633419245[42] = 0; + out_3491535124633419245[43] = 0; + out_3491535124633419245[44] = 0; + out_3491535124633419245[45] = 0; + out_3491535124633419245[46] = 0; + out_3491535124633419245[47] = 0; + out_3491535124633419245[48] = 0; + out_3491535124633419245[49] = 0; + out_3491535124633419245[50] = 0; + out_3491535124633419245[51] = 0; + out_3491535124633419245[52] = 0; + out_3491535124633419245[53] = 0; + out_3491535124633419245[54] = 0; + out_3491535124633419245[55] = 0; + out_3491535124633419245[56] = 0; + out_3491535124633419245[57] = 0; + out_3491535124633419245[58] = 0; + out_3491535124633419245[59] = 0; + out_3491535124633419245[60] = 0; + out_3491535124633419245[61] = 0; + out_3491535124633419245[62] = 1; + out_3491535124633419245[63] = 0; + out_3491535124633419245[64] = 0; + out_3491535124633419245[65] = 0; } #include #include @@ -1855,77 +1855,77 @@ void live_update_14(double *in_x, double *in_P, double *in_z, double *in_R, doub void live_update_33(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) { update<3, 3, 0>(in_x, in_P, h_33, H_33, NULL, in_z, in_R, in_ea, MAHA_THRESH_33); } -void live_H(double *in_vec, double *out_409344677196790516) { - H(in_vec, out_409344677196790516); +void live_H(double *in_vec, double *out_2107061543090158966) { + H(in_vec, out_2107061543090158966); } -void live_err_fun(double *nom_x, double *delta_x, double *out_5410019838797489797) { - err_fun(nom_x, delta_x, out_5410019838797489797); +void live_err_fun(double *nom_x, double *delta_x, double *out_1090842864546838841) { + err_fun(nom_x, delta_x, out_1090842864546838841); } -void live_inv_err_fun(double *nom_x, double *true_x, double *out_5107495764560298202) { - inv_err_fun(nom_x, true_x, out_5107495764560298202); +void live_inv_err_fun(double *nom_x, double *true_x, double *out_1751534880763809428) { + inv_err_fun(nom_x, true_x, out_1751534880763809428); } -void live_H_mod_fun(double *state, double *out_4893943347815461903) { - H_mod_fun(state, out_4893943347815461903); +void live_H_mod_fun(double *state, double *out_2270168032272230264) { + H_mod_fun(state, out_2270168032272230264); } -void live_f_fun(double *state, double dt, double *out_1490934551927816954) { - f_fun(state, dt, out_1490934551927816954); +void live_f_fun(double *state, double dt, double *out_9047640957774126431) { + f_fun(state, dt, out_9047640957774126431); } -void live_F_fun(double *state, double dt, double *out_2062859019570548817) { - F_fun(state, dt, out_2062859019570548817); +void live_F_fun(double *state, double dt, double *out_4752414459068816126) { + F_fun(state, dt, out_4752414459068816126); } -void live_h_4(double *state, double *unused, double *out_335431168283599212) { - h_4(state, unused, out_335431168283599212); +void live_h_4(double *state, double *unused, double *out_1938047718740512528) { + h_4(state, unused, out_1938047718740512528); } -void live_H_4(double *state, double *unused, double *out_4205541147974148351) { - H_4(state, unused, out_4205541147974148351); +void live_H_4(double *state, double *unused, double *out_8437989887064667391) { + H_4(state, unused, out_8437989887064667391); } -void live_h_9(double *state, double *unused, double *out_1746837330775165620) { - h_9(state, unused, out_1746837330775165620); +void live_h_9(double *state, double *unused, double *out_2016376091952434025) { + h_9(state, unused, out_2016376091952434025); } -void live_H_9(double *state, double *unused, double *out_3964351501344557706) { - H_9(state, unused, out_3964351501344557706); +void live_H_9(double *state, double *unused, double *out_2721535251380436755) { + H_9(state, unused, out_2721535251380436755); } -void live_h_10(double *state, double *unused, double *out_6389141055710814361) { - h_10(state, unused, out_6389141055710814361); +void live_h_10(double *state, double *unused, double *out_8252027734007822314) { + h_10(state, unused, out_8252027734007822314); } -void live_H_10(double *state, double *unused, double *out_394910773077939482) { - H_10(state, unused, out_394910773077939482); +void live_H_10(double *state, double *unused, double *out_1022365631619946756) { + H_10(state, unused, out_1022365631619946756); } -void live_h_12(double *state, double *unused, double *out_4800955541602290447) { - h_12(state, unused, out_4800955541602290447); +void live_h_12(double *state, double *unused, double *out_490832941153373832) { + h_12(state, unused, out_490832941153373832); } -void live_H_12(double *state, double *unused, double *out_813915260057813444) { - H_12(state, unused, out_813915260057813444); +void live_H_12(double *state, double *unused, double *out_4989297778612922430) { + H_12(state, unused, out_4989297778612922430); } -void live_h_35(double *state, double *unused, double *out_8655348954820926857) { - h_35(state, unused, out_8655348954820926857); +void live_h_35(double *state, double *unused, double *out_851812883202032952) { + h_35(state, unused, out_851812883202032952); } -void live_H_35(double *state, double *unused, double *out_838879090601540975) { - H_35(state, unused, out_838879090601540975); +void live_H_35(double *state, double *unused, double *out_6642092129272276849) { + H_35(state, unused, out_6642092129272276849); } -void live_h_32(double *state, double *unused, double *out_7002226014671976453) { - h_32(state, unused, out_7002226014671976453); +void live_h_32(double *state, double *unused, double *out_7198045605532929596) { + h_32(state, unused, out_7198045605532929596); } -void live_H_32(double *state, double *unused, double *out_707714305660800506) { - H_32(state, unused, out_707714305660800506); +void live_H_32(double *state, double *unused, double *out_6510927344331536380) { + H_32(state, unused, out_6510927344331536380); } -void live_h_13(double *state, double *unused, double *out_6173959503153832213) { - h_13(state, unused, out_6173959503153832213); +void live_h_13(double *state, double *unused, double *out_6813957582124674447) { + h_13(state, unused, out_6813957582124674447); } -void live_H_13(double *state, double *unused, double *out_1842862337219813003) { - H_13(state, unused, out_1842862337219813003); +void live_H_13(double *state, double *unused, double *out_7851984426394690165) { + H_13(state, unused, out_7851984426394690165); } -void live_h_14(double *state, double *unused, double *out_1746837330775165620) { - h_14(state, unused, out_1746837330775165620); +void live_h_14(double *state, double *unused, double *out_2016376091952434025) { + h_14(state, unused, out_2016376091952434025); } -void live_H_14(double *state, double *unused, double *out_3964351501344557706) { - H_14(state, unused, out_3964351501344557706); +void live_H_14(double *state, double *unused, double *out_2721535251380436755) { + H_14(state, unused, out_2721535251380436755); } -void live_h_33(double *state, double *unused, double *out_5949943105988094266) { - h_33(state, unused, out_5949943105988094266); +void live_h_33(double *state, double *unused, double *out_1521077794722315231) { + h_33(state, unused, out_1521077794722315231); } -void live_H_33(double *state, double *unused, double *out_2311677914037316629) { - H_33(state, unused, out_2311677914037316629); +void live_H_33(double *state, double *unused, double *out_3491535124633419245) { + H_33(state, unused, out_3491535124633419245); } void live_predict(double *in_x, double *in_P, double *in_Q, double dt) { predict(in_x, in_P, in_Q, dt); diff --git a/selfdrive/locationd/models/generated/live.h b/selfdrive/locationd/models/generated/live.h index bb935ca4a..2c8518a9c 100644 --- a/selfdrive/locationd/models/generated/live.h +++ b/selfdrive/locationd/models/generated/live.h @@ -10,29 +10,29 @@ void live_update_32(double *in_x, double *in_P, double *in_z, double *in_R, doub void live_update_13(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea); void live_update_14(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea); void live_update_33(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea); -void live_H(double *in_vec, double *out_409344677196790516); -void live_err_fun(double *nom_x, double *delta_x, double *out_5410019838797489797); -void live_inv_err_fun(double *nom_x, double *true_x, double *out_5107495764560298202); -void live_H_mod_fun(double *state, double *out_4893943347815461903); -void live_f_fun(double *state, double dt, double *out_1490934551927816954); -void live_F_fun(double *state, double dt, double *out_2062859019570548817); -void live_h_4(double *state, double *unused, double *out_335431168283599212); -void live_H_4(double *state, double *unused, double *out_4205541147974148351); -void live_h_9(double *state, double *unused, double *out_1746837330775165620); -void live_H_9(double *state, double *unused, double *out_3964351501344557706); -void live_h_10(double *state, double *unused, double *out_6389141055710814361); -void live_H_10(double *state, double *unused, double *out_394910773077939482); -void live_h_12(double *state, double *unused, double *out_4800955541602290447); -void live_H_12(double *state, double *unused, double *out_813915260057813444); -void live_h_35(double *state, double *unused, double *out_8655348954820926857); -void live_H_35(double *state, double *unused, double *out_838879090601540975); -void live_h_32(double *state, double *unused, double *out_7002226014671976453); -void live_H_32(double *state, double *unused, double *out_707714305660800506); -void live_h_13(double *state, double *unused, double *out_6173959503153832213); -void live_H_13(double *state, double *unused, double *out_1842862337219813003); -void live_h_14(double *state, double *unused, double *out_1746837330775165620); -void live_H_14(double *state, double *unused, double *out_3964351501344557706); -void live_h_33(double *state, double *unused, double *out_5949943105988094266); -void live_H_33(double *state, double *unused, double *out_2311677914037316629); +void live_H(double *in_vec, double *out_2107061543090158966); +void live_err_fun(double *nom_x, double *delta_x, double *out_1090842864546838841); +void live_inv_err_fun(double *nom_x, double *true_x, double *out_1751534880763809428); +void live_H_mod_fun(double *state, double *out_2270168032272230264); +void live_f_fun(double *state, double dt, double *out_9047640957774126431); +void live_F_fun(double *state, double dt, double *out_4752414459068816126); +void live_h_4(double *state, double *unused, double *out_1938047718740512528); +void live_H_4(double *state, double *unused, double *out_8437989887064667391); +void live_h_9(double *state, double *unused, double *out_2016376091952434025); +void live_H_9(double *state, double *unused, double *out_2721535251380436755); +void live_h_10(double *state, double *unused, double *out_8252027734007822314); +void live_H_10(double *state, double *unused, double *out_1022365631619946756); +void live_h_12(double *state, double *unused, double *out_490832941153373832); +void live_H_12(double *state, double *unused, double *out_4989297778612922430); +void live_h_35(double *state, double *unused, double *out_851812883202032952); +void live_H_35(double *state, double *unused, double *out_6642092129272276849); +void live_h_32(double *state, double *unused, double *out_7198045605532929596); +void live_H_32(double *state, double *unused, double *out_6510927344331536380); +void live_h_13(double *state, double *unused, double *out_6813957582124674447); +void live_H_13(double *state, double *unused, double *out_7851984426394690165); +void live_h_14(double *state, double *unused, double *out_2016376091952434025); +void live_H_14(double *state, double *unused, double *out_2721535251380436755); +void live_h_33(double *state, double *unused, double *out_1521077794722315231); +void live_H_33(double *state, double *unused, double *out_3491535124633419245); void live_predict(double *in_x, double *in_P, double *in_Q, double dt); } \ No newline at end of file diff --git a/selfdrive/locationd/models/live_kf.py b/selfdrive/locationd/models/live_kf.py index 023479d10..dc439c23f 100755 --- a/selfdrive/locationd/models/live_kf.py +++ b/selfdrive/locationd/models/live_kf.py @@ -212,14 +212,14 @@ class LiveKalman(): live_kf_header = "#pragma once\n\n" live_kf_header += "#include \n" live_kf_header += "#include \n\n" - for state, slc in inspect.getmembers(States, lambda x: type(x) == slice): + for state, slc in inspect.getmembers(States, lambda x: isinstance(x, slice)): assert(slc.step is None) # unsupported live_kf_header += f'#define STATE_{state}_START {slc.start}\n' live_kf_header += f'#define STATE_{state}_END {slc.stop}\n' live_kf_header += f'#define STATE_{state}_LEN {slc.stop - slc.start}\n' live_kf_header += "\n" - for kind, val in inspect.getmembers(ObservationKind, lambda x: type(x) == int): + for kind, val in inspect.getmembers(ObservationKind, lambda x: isinstance(x, int)): live_kf_header += f'#define OBSERVATION_{kind} {val}\n' live_kf_header += "\n" diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index a63eaa4bf..e51c751e8 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -18,7 +18,7 @@ from system.hardware import HARDWARE, PC from selfdrive.manager.helpers import unblock_stdout, write_onroad_params from selfdrive.manager.process import ensure_running from selfdrive.manager.process_config import managed_processes -from selfdrive.athena.registration import register, UNREGISTERED_DONGLE_ID +from selfdrive.athena.registration import register, UNREGISTERED_DONGLE_ID, is_registered_device from system.swaglog import cloudlog, add_file_handler from system.version import is_dirty, get_commit, get_version, get_origin, get_short_branch, \ get_normalized_origin, terms_version, training_version, \ @@ -64,7 +64,7 @@ def manager_init() -> None: ("dp_toyota_enhanced_bsm", "0"), ("dp_lat_lane_priority_mode", "0"), ("dp_mapd", "0"), - ("dp_mapd_turn_vision_control", "0"), + ("dp_mapd_vision_turn_control", "0"), ("dp_mapd_speed_limit_control", "0"), ("dp_mapd_turn_speed_control", "0"), ("dp_fileserv", "0"), @@ -72,6 +72,9 @@ def manager_init() -> None: ("dp_long_accel_profile", "0"), ("dp_long_use_df_tune", "0"), ("dp_long_de2e", "0"), + ("dp_device_dm_unavailable", "0"), + ("dp_long_taco", "0"), + ("dp_long_stock_mode", "0"), ] if not PC: default_params.append(("LastUpdateTime", datetime.datetime.utcnow().isoformat().encode('utf8'))) @@ -175,6 +178,11 @@ def manager_thread() -> None: if not params.get_bool("dp_otisserv"): ignore += ["otisserv"] + if not is_registered_device(): + ignore += ["uploader"] + if params.get_bool("dp_device_dm_unavailable"): + ignore += ["dmonitoringd", "dmonitoringmodeld"] + sm = messaging.SubMaster(['deviceState', 'carParams'], poll=['deviceState']) pm = messaging.PubMaster(['managerState']) diff --git a/selfdrive/manager/process.py b/selfdrive/manager/process.py index d694388e9..5262ccf9f 100644 --- a/selfdrive/manager/process.py +++ b/selfdrive/manager/process.py @@ -17,7 +17,6 @@ from common.basedir import BASEDIR from common.params import Params from common.realtime import sec_since_boot from system.swaglog import cloudlog -from system.hardware import HARDWARE from cereal import log WATCHDOG_FN = "/dev/shm/wd_" @@ -67,7 +66,6 @@ def join_process(process: Process, timeout: float) -> None: class ManagerProcess(ABC): - unkillable = False daemon = False sigkill = False onroad = True @@ -132,22 +130,11 @@ class ManagerProcess(ABC): join_process(self.proc, 5) - # If process failed to die send SIGKILL or reboot + # If process failed to die send SIGKILL if self.proc.exitcode is None and retry: - if self.unkillable: - cloudlog.critical(f"unkillable process {self.name} failed to exit! rebooting in 15 if it doesn't die") - join_process(self.proc, 15) - - if self.proc.exitcode is None: - cloudlog.critical(f"unkillable process {self.name} failed to die!") - os.system("date >> /data/unkillable_reboot") - os.sync() - HARDWARE.reboot() - raise RuntimeError - else: - cloudlog.info(f"killing {self.name} with SIGKILL") - self.signal(signal.SIGKILL) - self.proc.join() + cloudlog.info(f"killing {self.name} with SIGKILL") + self.signal(signal.SIGKILL) + self.proc.join() ret = self.proc.exitcode cloudlog.info(f"{self.name} is dead with {ret}") @@ -196,6 +183,7 @@ class NativeProcess(ManagerProcess): self.unkillable = unkillable self.sigkill = sigkill self.watchdog_max_dt = watchdog_max_dt + self.launcher = nativelauncher def prepare(self) -> None: pass @@ -210,7 +198,7 @@ class NativeProcess(ManagerProcess): cwd = os.path.join(BASEDIR, self.cwd) cloudlog.info(f"starting process {self.name}") - self.proc = Process(name=self.name, target=nativelauncher, args=(self.cmdline, cwd, self.name)) + self.proc = Process(name=self.name, target=self.launcher, args=(self.cmdline, cwd, self.name)) self.proc.start() self.watchdog_seen = False self.shutting_down = False @@ -227,6 +215,7 @@ class PythonProcess(ManagerProcess): self.unkillable = unkillable self.sigkill = sigkill self.watchdog_max_dt = watchdog_max_dt + self.launcher = launcher def prepare(self) -> None: if self.enabled: @@ -247,7 +236,7 @@ class PythonProcess(ManagerProcess): return cloudlog.info(f"starting python {self.module}") - self.proc = Process(name=self.name, target=launcher, args=(self.module, self.name)) + self.proc = Process(name=self.name, target=self.launcher, args=(self.module, self.name)) self.proc.start() self.watchdog_seen = False self.shutting_down = False diff --git a/selfdrive/manager/process_config.py b/selfdrive/manager/process_config.py index 8a3c9079f..16928b294 100644 --- a/selfdrive/manager/process_config.py +++ b/selfdrive/manager/process_config.py @@ -30,8 +30,7 @@ def qcomgps(started, params, CP: car.CarParams) -> bool: return started and not ublox_available() procs = [ - # due to qualcomm kernel bugs SIGKILLing camerad sometimes causes page table corruption - NativeProcess("camerad", "system/camerad", ["./camerad"], unkillable=True, callback=driverview), + NativeProcess("camerad", "system/camerad", ["./camerad"], callback=driverview), NativeProcess("clocksd", "system/clocksd", ["./clocksd"]), NativeProcess("logcatd", "system/logcatd", ["./logcatd"]), NativeProcess("proclogd", "system/proclogd", ["./proclogd"]), @@ -73,7 +72,7 @@ procs = [ # debug procs NativeProcess("bridge", "cereal/messaging", ["./bridge"], onroad=False, callback=notcar), - PythonProcess("webjoystick", "tools.joystick.web", onroad=False, callback=notcar), + PythonProcess("webjoystick", "tools.bodyteleop.web", onroad=False, callback=notcar), # dp NativeProcess("otisserv", "selfdrive/dragonpilot", ['./otisserv'], offroad=True), diff --git a/selfdrive/modeld/_dmonitoringmodeld b/selfdrive/modeld/_dmonitoringmodeld index 73b449fde..dc8c38cba 100755 Binary files a/selfdrive/modeld/_dmonitoringmodeld and b/selfdrive/modeld/_dmonitoringmodeld differ diff --git a/selfdrive/modeld/_modeld b/selfdrive/modeld/_modeld index 0c5561d4e..d8105cc41 100755 Binary files a/selfdrive/modeld/_modeld and b/selfdrive/modeld/_modeld differ diff --git a/selfdrive/modeld/_navmodeld b/selfdrive/modeld/_navmodeld index 2de737801..54e5dc7ee 100755 Binary files a/selfdrive/modeld/_navmodeld and b/selfdrive/modeld/_navmodeld differ diff --git a/selfdrive/modeld/models/driving.h b/selfdrive/modeld/models/driving.h index f664a4f39..ac524e3d2 100644 --- a/selfdrive/modeld/models/driving.h +++ b/selfdrive/modeld/models/driving.h @@ -39,6 +39,10 @@ constexpr int LEAD_MHP_SELECTION = 3; // Padding to get output shape as multiple of 4 constexpr int PAD_SIZE = 2; +constexpr float FCW_THRESHOLD_5MS2_HIGH = 0.15; +constexpr float FCW_THRESHOLD_5MS2_LOW = 0.05; +constexpr float FCW_THRESHOLD_3MS2 = 0.7; + struct ModelOutputXYZ { float x; float y; @@ -262,7 +266,6 @@ struct ModelState { ModelFrame *frame = nullptr; ModelFrame *wide_frame = nullptr; std::array feature_buffer = {}; - std::array disengage_buffer = {}; std::array output = {}; std::unique_ptr m; #ifdef DESIRE @@ -280,12 +283,18 @@ struct ModelState { #endif }; +struct PublishState { + std::array disengage_buffer = {}; + std::array prev_brake_5ms2_probs = {}; + std::array prev_brake_3ms2_probs = {}; +}; + void model_init(ModelState* s, cl_device_id device_id, cl_context context); ModelOutput *model_eval_frame(ModelState* s, VisionBuf* buf, VisionBuf* buf_wide, const mat3 &transform, const mat3 &transform_wide, float *desire_in, bool is_rhd, float *driving_style, float *nav_features, bool prepare_only); void model_free(ModelState* s); -void model_publish(ModelState* s, PubMaster &pm, uint32_t vipc_frame_id, uint32_t vipc_frame_id_extra, uint32_t frame_id, float frame_drop, - const ModelOutput &net_outputs, uint64_t timestamp_eof, uint64_t timestamp_llk, +void model_publish(PubMaster &pm, uint32_t vipc_frame_id, uint32_t vipc_frame_id_extra, uint32_t frame_id, float frame_drop, + const ModelOutput &net_outputs, ModelState &s, PublishState &ps, uint64_t timestamp_eof, uint64_t timestamp_llk, float model_execution_time, const bool nav_enabled, const bool valid); void posenet_publish(PubMaster &pm, uint32_t vipc_frame_id, uint32_t vipc_dropped_frames, const ModelOutput &net_outputs, uint64_t timestamp_eof, const bool valid); diff --git a/selfdrive/modeld/models/supercombo.thneed b/selfdrive/modeld/models/supercombo.thneed index 6c07aa336..4293c3c84 100644 Binary files a/selfdrive/modeld/models/supercombo.thneed and b/selfdrive/modeld/models/supercombo.thneed differ diff --git a/selfdrive/navd/libmaprender.so b/selfdrive/navd/libmaprender.so index a3ed94d0d..296205753 100755 Binary files a/selfdrive/navd/libmaprender.so and b/selfdrive/navd/libmaprender.so differ diff --git a/selfdrive/navd/tests/test_map_renderer.py b/selfdrive/navd/tests/test_map_renderer.py index 934377fed..64e80f93d 100755 --- a/selfdrive/navd/tests/test_map_renderer.py +++ b/selfdrive/navd/tests/test_map_renderer.py @@ -1,28 +1,95 @@ #!/usr/bin/env python3 import os import unittest - +import requests +import threading +import http.server import cereal.messaging as messaging + +from typing import Any from cereal.visionipc import VisionIpcClient, VisionStreamType from selfdrive.manager.process_config import managed_processes LLK_DECIMATION = 10 CACHE_PATH = "/data/mbgl-cache-navd.db" -def gen_llk(): +LOCATION1 = (32.7174, -117.16277) +LOCATION2 = (32.7558, -117.2037) + +def gen_llk(location=LOCATION1): msg = messaging.new_message('liveLocationKalman') - msg.liveLocationKalman.positionGeodetic = {'value': [32.7174, -117.16277, 0], 'std': [0., 0., 0.], 'valid': True} + msg.liveLocationKalman.positionGeodetic = {'value': [*location, 0], 'std': [0., 0., 0.], 'valid': True} msg.liveLocationKalman.calibratedOrientationNED = {'value': [0., 0., 0.], 'std': [0., 0., 0.], 'valid': True} msg.liveLocationKalman.status = 'valid' return msg +class MapBoxInternetDisabledRequestHandler(http.server.BaseHTTPRequestHandler): + INTERNET_ACTIVE = True + + def setup(self): + if self.INTERNET_ACTIVE: + super().setup() + + def handle(self): + if self.INTERNET_ACTIVE: + super().handle() + + def finish(self): + if self.INTERNET_ACTIVE: + super().finish() + + def do_GET(self): + url = f'https://api.mapbox.com{self.path}' + + headers = dict(self.headers) + headers["Host"] = "api.mapbox.com" + + r = requests.get(url, headers=headers, timeout=5) + + self.send_response(r.status_code) + self.end_headers() + self.wfile.write(r.content) + + def log_message(self, *args: Any) -> None: + return + + def log_error(self, *args: Any) -> None: + return + + +class MapBoxInternetDisabledServer(threading.Thread): + def run(self): + self.server = http.server.HTTPServer(("127.0.0.1", 5000), MapBoxInternetDisabledRequestHandler) + self.server.serve_forever() + + def stop(self): + self.server.shutdown() + + def disable_internet(self): + MapBoxInternetDisabledRequestHandler.INTERNET_ACTIVE = False + + def enable_internet(self): + MapBoxInternetDisabledRequestHandler.INTERNET_ACTIVE = True + + class TestMapRenderer(unittest.TestCase): + server = MapBoxInternetDisabledServer() + @classmethod def setUpClass(cls): assert "MAPBOX_TOKEN" in os.environ + cls.original_token = os.environ["MAPBOX_TOKEN"] + cls.server.start() + + @classmethod + def tearDownClass(cls) -> None: + cls.server.stop() def setUp(self): + self.server.enable_internet() + os.environ['MAPS_HOST'] = 'http://localhost:5000' + self.sm = messaging.SubMaster(['mapRenderState']) self.pm = messaging.PubMaster(['liveLocationKalman']) self.vipc = VisionIpcClient("navd", VisionStreamType.VISION_STREAM_MAP, True) @@ -33,15 +100,22 @@ class TestMapRenderer(unittest.TestCase): def tearDown(self): managed_processes['mapsd'].stop() - def _run_test(self, expect_valid): + def _setup_test(self): # start + sync up managed_processes['mapsd'].start() + assert self.pm.wait_for_readers_to_update("liveLocationKalman", 10) assert VisionIpcClient.available_streams("navd", False) == {VisionStreamType.VISION_STREAM_MAP, } assert self.vipc.connect(False) self.vipc.recv() + + def _run_test(self, expect_valid, location=LOCATION1): + starting_frame_id = None + + self.location = location + # run test prev_frame_id = -1 for i in range(30*LLK_DECIMATION): @@ -51,21 +125,28 @@ class TestMapRenderer(unittest.TestCase): prev_valid = False prev_frame_id = -1 else: - prev_frame_id = self.sm['mapRenderState'].frameId prev_valid = self.sm.valid['mapRenderState'] + prev_frame_id = self.sm['mapRenderState'].frameId + + if starting_frame_id is None: + starting_frame_id = prev_frame_id - llk = gen_llk() + llk = gen_llk(self.location) self.pm.send("liveLocationKalman", llk) self.pm.wait_for_readers_to_update("liveLocationKalman", 10) self.sm.update(1000 if frame_expected else 0) assert self.sm.updated['mapRenderState'] == frame_expected, "renderer running at wrong frequency" if not frame_expected: - continue - # give a few frames to go valid - if expect_valid and not self.sm.valid['mapRenderState'] and not prev_valid and self.sm['mapRenderState'].frameId < 5: + frames_since_test_start = self.sm['mapRenderState'].frameId - starting_frame_id + + # give a few frames to switch from valid to invalid, or vice versa + invalid_and_not_previously_valid = (expect_valid and not self.sm.valid['mapRenderState'] and not prev_valid) + valid_and_not_previously_invalid = (not expect_valid and self.sm.valid['mapRenderState'] and prev_valid) + + if (invalid_and_not_previously_valid or valid_and_not_previously_invalid) and frames_since_test_start < 5: continue # check output @@ -84,15 +165,28 @@ class TestMapRenderer(unittest.TestCase): assert self.vipc.frame_id == self.sm['mapRenderState'].frameId def test_with_internet(self): + self._setup_test() self._run_test(True) def test_with_no_internet(self): - token = os.environ['MAPBOX_TOKEN'] - try: - os.environ['MAPBOX_TOKEN'] = 'invalid_token' - self._run_test(False) - finally: - os.environ['MAPBOX_TOKEN'] = token + self.server.disable_internet() + self._setup_test() + self._run_test(False) + + def test_recover_from_no_internet(self): + self._setup_test() + self._run_test(True) + + self.server.disable_internet() + + # change locations to force mapsd to refetch + self._run_test(False, LOCATION2) + + self.server.enable_internet() + self._run_test(True, LOCATION2) + + self.location = LOCATION1 + self._run_test(True, LOCATION2) if __name__ == "__main__": unittest.main() diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index ece6a7b57..2fbdfc5e9 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -163,6 +163,18 @@ def hw_state_thread(end_event, hw_queue): count += 1 time.sleep(DT_TRML) +def set_local_ip_addr(): + import socket + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + # doesn't even have to be reachable + s.connect(('10.255.255.255', 1)) + ip = s.getsockname()[0] + except: + ip = '' + finally: + s.close() + Params().put('dp_device_ip_addr', ip) def thermald_thread(end_event, hw_queue): pm = messaging.PubMaster(['deviceState']) @@ -209,10 +221,15 @@ def thermald_thread(end_event, hw_queue): dp_device_disable_temp_check = params.get_bool("dp_device_disable_temp_check") while not end_event.is_set(): + # rick - update IP every 10s + if count % int(10. / DT_TRML) == 0: + set_local_ip_addr() + sm.update(PANDA_STATES_TIMEOUT) pandaStates = sm['pandaStates'] peripheralState = sm['peripheralState'] + peripheral_panda_present = peripheralState.pandaType != log.PandaState.PandaType.unknown msg = read_thermal(thermal_config) @@ -226,7 +243,7 @@ def thermald_thread(end_event, hw_queue): in_car = pandaState.harnessStatus != log.PandaState.HarnessStatus.notConnected # Setup fan handler on first connect to panda - if fan_controller is None and peripheralState.pandaType != log.PandaState.PandaType.unknown: + if fan_controller is None and peripheral_panda_present: if TICI: fan_controller = TiciFanController() @@ -291,7 +308,7 @@ def thermald_thread(end_event, hw_queue): # Ensure date/time are valid now = datetime.datetime.utcnow() startup_conditions["time_valid"] = now > MIN_DATE - set_offroad_alert_if_changed("Offroad_InvalidTime", (not startup_conditions["time_valid"])) + set_offroad_alert_if_changed("Offroad_InvalidTime", (not startup_conditions["time_valid"]) and peripheral_panda_present) startup_conditions["up_to_date"] = params.get("Offroad_ConnectivityNeeded") is None or params.get_bool("DisableUpdates") or params.get_bool("SnoozeUpdate") startup_conditions["not_uninstalling"] = not params.get_bool("DoUninstall") diff --git a/selfdrive/ui/_ui b/selfdrive/ui/_ui index 25da54f6e..e36890865 100755 Binary files a/selfdrive/ui/_ui and b/selfdrive/ui/_ui differ diff --git a/selfdrive/ui/qt/spinner b/selfdrive/ui/qt/spinner index 004b85970..fb2d386ff 100755 Binary files a/selfdrive/ui/qt/spinner and b/selfdrive/ui/qt/spinner differ diff --git a/selfdrive/ui/qt/text b/selfdrive/ui/qt/text index 23a073dba..b8678ba96 100755 Binary files a/selfdrive/ui/qt/text and b/selfdrive/ui/qt/text differ diff --git a/selfdrive/ui/soundd/_soundd b/selfdrive/ui/soundd/_soundd index b62726542..8f92c67a8 100755 Binary files a/selfdrive/ui/soundd/_soundd and b/selfdrive/ui/soundd/_soundd differ diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index f3822b382..d03c27d17 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -297,6 +297,17 @@ Reboot Required. Reboot Required. + + Enable TACO Tune + + + + When enabled, openpilot will use slow down for turns from taco2 branch. +See https://github.com/commaai/openpilot/commit/7b97ddb3aacb222bfaf0b978c49cb5b756903ef7 for more information. +This is tune for KIA EV6 and may not work on your vehicle. +Reboot required. + + Enable Dynamic Following @@ -305,36 +316,26 @@ Reboot Required. When enabled, openpilot will dynamically adjust following distance based on your "Driving Personality" setting. + + Enable Dynamic End-to-End Longitudinal Control + + + + When enabled, openpilot will dynamically change between End-to-End or ACC mode. +Your vehicle must support openpilot longitudinal control. + + Enable Turn Speed Control - Vision - When enabled, openpilot will use vision path predictions to estimate the appropriate speed to drive through turns ahead. -Reboot required. + When enabled, openpilot will use path predictions from camera vision to estimate the appropriate speed to drive through turns ahead. - When enabled, openpilot will use move-fast's mapd module to control the vehicle speed. + When enabled, openpilot will display current road name on the screen. Author: https://github.com/move-fast/ -Reboot required. - - - - Speed Control - Map Path - - - - When enabled, openpilot will use the curvature info from map data to define speed limits to take turns ahead. -Reboot required. - - - - Speed Control - Map Sign - - - - When enabled, openpilot will use the speed limit signs information from map data to adjust cruise speed. Reboot required. @@ -361,6 +362,15 @@ NOR - Normal tune. SPT - Sport tune. + + Enable Stock Longitudinal Control + + + + When enabled, openpilot will not handle longitudinal control. +Reboot Required. + + DeclinePage @@ -1413,11 +1423,11 @@ This may take up to a minute. - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits/forks.These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. + When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - 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.When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. + 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. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 4067c9ba0..d9dd3e3d9 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -297,6 +297,17 @@ Reboot Required. Reboot Required. + + Enable TACO Tune + + + + When enabled, openpilot will use slow down for turns from taco2 branch. +See https://github.com/commaai/openpilot/commit/7b97ddb3aacb222bfaf0b978c49cb5b756903ef7 for more information. +This is tune for KIA EV6 and may not work on your vehicle. +Reboot required. + + Enable Dynamic Following @@ -305,36 +316,26 @@ Reboot Required. When enabled, openpilot will dynamically adjust following distance based on your "Driving Personality" setting. + + Enable Dynamic End-to-End Longitudinal Control + + + + When enabled, openpilot will dynamically change between End-to-End or ACC mode. +Your vehicle must support openpilot longitudinal control. + + Enable Turn Speed Control - Vision - When enabled, openpilot will use vision path predictions to estimate the appropriate speed to drive through turns ahead. -Reboot required. + When enabled, openpilot will use path predictions from camera vision to estimate the appropriate speed to drive through turns ahead. - When enabled, openpilot will use move-fast's mapd module to control the vehicle speed. + When enabled, openpilot will display current road name on the screen. Author: https://github.com/move-fast/ -Reboot required. - - - - Speed Control - Map Path - - - - When enabled, openpilot will use the curvature info from map data to define speed limits to take turns ahead. -Reboot required. - - - - Speed Control - Map Sign - - - - When enabled, openpilot will use the speed limit signs information from map data to adjust cruise speed. Reboot required. @@ -361,6 +362,15 @@ NOR - Normal tune. SPT - Sport tune. + + Enable Stock Longitudinal Control + + + + When enabled, openpilot will not handle longitudinal control. +Reboot Required. + + DeclinePage @@ -1405,11 +1415,11 @@ This may take up to a minute. - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits/forks.These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. + When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - 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.When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. + 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. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. diff --git a/selfdrive/ui/translations/main_ko.qm b/selfdrive/ui/translations/main_ko.qm index bad14eacf..9c0d314fb 100644 Binary files a/selfdrive/ui/translations/main_ko.qm and b/selfdrive/ui/translations/main_ko.qm differ diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index be6087481..acb932e7c 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -297,6 +297,17 @@ Reboot Required. Reboot Required. + + Enable TACO Tune + + + + When enabled, openpilot will use slow down for turns from taco2 branch. +See https://github.com/commaai/openpilot/commit/7b97ddb3aacb222bfaf0b978c49cb5b756903ef7 for more information. +This is tune for KIA EV6 and may not work on your vehicle. +Reboot required. + + Enable Dynamic Following @@ -305,36 +316,26 @@ Reboot Required. When enabled, openpilot will dynamically adjust following distance based on your "Driving Personality" setting. + + Enable Dynamic End-to-End Longitudinal Control + + + + When enabled, openpilot will dynamically change between End-to-End or ACC mode. +Your vehicle must support openpilot longitudinal control. + + Enable Turn Speed Control - Vision - When enabled, openpilot will use vision path predictions to estimate the appropriate speed to drive through turns ahead. -Reboot required. + When enabled, openpilot will use path predictions from camera vision to estimate the appropriate speed to drive through turns ahead. - When enabled, openpilot will use move-fast's mapd module to control the vehicle speed. + When enabled, openpilot will display current road name on the screen. Author: https://github.com/move-fast/ -Reboot required. - - - - Speed Control - Map Path - - - - When enabled, openpilot will use the curvature info from map data to define speed limits to take turns ahead. -Reboot required. - - - - Speed Control - Map Sign - - - - When enabled, openpilot will use the speed limit signs information from map data to adjust cruise speed. Reboot required. @@ -361,6 +362,15 @@ NOR - Normal tune. SPT - Sport tune. + + Enable Stock Longitudinal Control + + + + When enabled, openpilot will not handle longitudinal control. +Reboot Required. + + DeclinePage @@ -673,7 +683,7 @@ SPT - Sport tune. Waiting for route - + 경로를 기다리는중 @@ -1404,14 +1414,14 @@ This may take up to a minute. End-to-End Longitudinal Control + E2E 롱컨트롤 + + + When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits/forks.These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - - - - 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.When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. + 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. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. @@ -1466,11 +1476,11 @@ This may take up to a minute. Ready to upload - + 업로드 준비완료 Training data will be pulled periodically while your device is on Wi-Fi - + 기기가 wifi에 연결되어 있는 동안 트레이닝 데이터를 주기적으로 전송합니다. diff --git a/selfdrive/ui/translations/main_pt-BR.qm b/selfdrive/ui/translations/main_pt-BR.qm index 0b11674f4..5784d06ad 100644 Binary files a/selfdrive/ui/translations/main_pt-BR.qm and b/selfdrive/ui/translations/main_pt-BR.qm differ diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index 00243d737..06423de92 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -297,6 +297,17 @@ Reboot Required. Reboot Required. + + Enable TACO Tune + + + + When enabled, openpilot will use slow down for turns from taco2 branch. +See https://github.com/commaai/openpilot/commit/7b97ddb3aacb222bfaf0b978c49cb5b756903ef7 for more information. +This is tune for KIA EV6 and may not work on your vehicle. +Reboot required. + + Enable Dynamic Following @@ -305,36 +316,26 @@ Reboot Required. When enabled, openpilot will dynamically adjust following distance based on your "Driving Personality" setting. + + Enable Dynamic End-to-End Longitudinal Control + + + + When enabled, openpilot will dynamically change between End-to-End or ACC mode. +Your vehicle must support openpilot longitudinal control. + + Enable Turn Speed Control - Vision - When enabled, openpilot will use vision path predictions to estimate the appropriate speed to drive through turns ahead. -Reboot required. + When enabled, openpilot will use path predictions from camera vision to estimate the appropriate speed to drive through turns ahead. - When enabled, openpilot will use move-fast's mapd module to control the vehicle speed. + When enabled, openpilot will display current road name on the screen. Author: https://github.com/move-fast/ -Reboot required. - - - - Speed Control - Map Path - - - - When enabled, openpilot will use the curvature info from map data to define speed limits to take turns ahead. -Reboot required. - - - - Speed Control - Map Sign - - - - When enabled, openpilot will use the speed limit signs information from map data to adjust cruise speed. Reboot required. @@ -361,6 +362,15 @@ NOR - Normal tune. SPT - Sport tune. + + Enable Stock Longitudinal Control + + + + When enabled, openpilot will not handle longitudinal control. +Reboot Required. + + DeclinePage @@ -670,11 +680,11 @@ SPT - Sport tune. Waiting for GPS - Esperando por GPS + Aguardando GPS Waiting for route - + Aguardando rota @@ -1408,15 +1418,15 @@ Isso pode levar até um minuto. End-to-End Longitudinal Control - + Controle Longitudinal de Ponta a Ponta - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits/forks.These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - + When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. + Quando a navegação tem um destino, o openpilot insere as informações do mapa no modelo. Isso fornece contexto útil para o modelo e permite que o openpilot mantenha a esquerda ou a direita apropriadamente em bifurcações/saídas. O comportamento de mudança de faixa permanece inalterado e ainda é ativado somente pelo motorista. Este é um recurso de qualidade embrionária; erros devem ser esperados, principalmente em torno de saídas e bifurcações. Esses erros podem incluir travessias não intencionais na faixa de rodagem, saída tardia, condução em direção a barreiras divisórias nas áreas de marcas de canalização, etc. - 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.When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. - + 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. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. + A visualização de condução fará a transição para a câmera grande angular voltada para a estrada em baixas velocidades para mostrar melhor algumas curvas. O logotipo do modo Experimental também será mostrado no canto superior direito. Quando um destino de navegação é definido e o modelo de condução o utiliza como entrada o caminho de condução no mapa fica verde. @@ -1470,11 +1480,11 @@ Isso pode levar até um minuto. Ready to upload - + Pronto para upload Training data will be pulled periodically while your device is on Wi-Fi - + Os dados de treinamento serão extraídos periodicamente enquanto o dispositivo estiver no Wi-Fi diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index 75665eb84..843356c40 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -402,6 +402,10 @@ Waiting for GPS กำลังรอสัญญาณ GPS + + Waiting for route + กำลังรอเส้นทาง + MultiOptionDialog @@ -554,12 +558,16 @@ การเข้าถึงระยะไกล - 1 year of storage - จัดเก็บข้อมูลนาน 1 ปี + 24/7 LTE connectivity + การเชื่อมต่อ LTE แบบ 24/7 - Developer perks - สิทธิพิเศษสำหรับนักพัฒนา + 1 year of drive storage + จัดเก็บข้อมูลการขับขี่นาน 1 ปี + + + Turn-by-turn navigation + การนำทางแบบเลี้ยวต่อเลี้ยว @@ -1057,10 +1065,6 @@ This may take up to a minute. 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 จะขับใน<b>โหมดชิล</b> เปิดโหมดทดลองเพื่อใช้<b>ความสามารถในขั้นพัฒนา</b> ซึ่งยังไม่พร้อมสำหรับโหมดชิล ความสามารถในขั้นพัฒนามีดังนี้: - - 🌮 End-to-End Longitudinal Control 🌮 - 🌮 ควบคุมเร่ง/เบรคแบบ End-to-End 🌮 - 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. ให้ openpilot ควบคุมการเร่ง/เบรค โดย openpilot จะขับอย่างที่มนุษย์คิด รวมถึงการหยุดที่ไฟแดง และป้ายหยุดรถ เนื่องจาก openpilot จะกำหนดความเร็วในการขับด้วยตัวเอง การตั้งความเร็วจะเป็นเพียงการกำหนดความเร็วสูงสูดเท่านั้น ความสามารถนี้ยังอยู่ในขั้นพัฒนา อาจเกิดข้อผิดพลาดขึ้นได้ @@ -1069,10 +1073,6 @@ This may take up to a minute. New Driving Visualization การแสดงภาพการขับขี่แบบใหม่ - - 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 mode is currently unavailable on this car since the car's stock ACC is used for longitudinal control. ขณะนี้โหมดทดลองไม่สามารถใช้งานได้ในรถคันนี้ เนื่องจากเปิดใช้ระบบควบคุมการเร่ง/เบรคของรถที่ติดตั้งจากโรงงานอยู่ @@ -1081,10 +1081,6 @@ This may take up to a minute. openpilot longitudinal control may come in a future update. ระบบควบคุมการเร่ง/เบรคโดย openpilot อาจมาในการอัปเดตในอนาคต - - Enable experimental longitudinal control to allow Experimental mode. - เปิดระบบควบคุมการเร่ง/เบรคขั้นพัฒนาโดย openpilot เพื่อเปิดใช้งานโหมดทดลอง - openpilot Longitudinal Control (Alpha) ระบบควบคุมการเร่ง/เบรคโดย openpilot (Alpha) @@ -1121,6 +1117,26 @@ This may take up to a minute. An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. ระบบควบคุมการเร่ง/เบรคโดย openpilot เวอร์ชัน alpha สามารถทดสอบได้พร้อมกับโหมดการทดลอง บน branch ที่กำลังพัฒนา + + End-to-End Longitudinal Control + ควบคุมเร่ง/เบรคแบบ End-to-End + + + Navigate on openpilot + การนำทางบน openpilot + + + When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. + เมื่อการนำทางมีจุดหมายปลายทาง openpilot จะป้อนข้อมูลแผนที่เข้าไปยังโมเดล ซึ่งจะเป็นบริบทที่มีประโยชน์สำหรับโมเดลและจะทำให้ openpilot สามารถรักษาเลนซ้ายหรือขวาได้อย่างเหมาะสมบริเวณทางแยกหรือทางออก พฤติกรรมการเปลี่ยนเลนยังคงเหมือนเดิมและยังคงต้องถูกเริ่มโดยคนขับ ความสามารถนี้ยังอยู่ในระดับ alpha ซึ่งอาจะเกิดความผิดพลาดได้โดยเฉพาะบริเวณทางแยกหรือทางออก ความผิดพลาดที่อาจเกิดขึ้นได้อาจรวมถึงการข้ามเส้นแบ่งเลนโดยไม่ตั้งใจ, การเข้าช่องทางออกช้ากว่าปกติ, การขับเข้าหาแบริเออร์ในเขตปลอดภัย, ฯลฯ + + + 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. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. + การแสดงภาพการขับขี่จะเปลี่ยนไปใช้กล้องมุมกว้างที่หันหน้าไปทางถนนเมื่ออยู่ในความเร็วต่ำ เพื่อแสดงภาพการเลี้ยวที่ดีขึ้น โลโก้โหมดการทดลองจะแสดงที่มุมบนขวาด้วย เมื่อเป้าหมายการนำทางถูกเลือกและโมเดลการขับขี่กำลังใช้เป็นอินพุต เส้นทางการขับขี่บนแผนที่จะเปลี่ยนเป็นสีเขียว + + + Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. + เปิดระบบควบคุมการเร่ง/เบรคโดย openpilot (alpha) เพื่อเปิดใช้งานโหมดทดลอง + Updater @@ -1172,12 +1188,12 @@ This may take up to a minute. เปิดการตั้งค่า - Uploading training data - กำลังอัปโหลดข้อมูลสำหรับการฝึก + Ready to upload + พร้อมจะอัปโหลด - Your data is used to train driving models and help improve openpilot - ข้อมูลของคุณถูกใช้เพื่อฝึกโมเดลการขับขี่และช่วยปรับปรุง openpilot + Training data will be pulled periodically while your device is on Wi-Fi + ข้อมูลการฝึกฝนจะถูกดึงเป็นระยะระหว่างที่อุปกรณ์ของคุณเชื่อมต่อกับ Wi-Fi diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index c3fee0c86..5cdd3e4be 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -297,6 +297,17 @@ Reboot Required. Reboot Required. + + Enable TACO Tune + + + + When enabled, openpilot will use slow down for turns from taco2 branch. +See https://github.com/commaai/openpilot/commit/7b97ddb3aacb222bfaf0b978c49cb5b756903ef7 for more information. +This is tune for KIA EV6 and may not work on your vehicle. +Reboot required. + + Enable Dynamic Following @@ -305,36 +316,26 @@ Reboot Required. When enabled, openpilot will dynamically adjust following distance based on your "Driving Personality" setting. + + Enable Dynamic End-to-End Longitudinal Control + + + + When enabled, openpilot will dynamically change between End-to-End or ACC mode. +Your vehicle must support openpilot longitudinal control. + + Enable Turn Speed Control - Vision - When enabled, openpilot will use vision path predictions to estimate the appropriate speed to drive through turns ahead. -Reboot required. + When enabled, openpilot will use path predictions from camera vision to estimate the appropriate speed to drive through turns ahead. - When enabled, openpilot will use move-fast's mapd module to control the vehicle speed. + When enabled, openpilot will display current road name on the screen. Author: https://github.com/move-fast/ -Reboot required. - - - - Speed Control - Map Path - - - - When enabled, openpilot will use the curvature info from map data to define speed limits to take turns ahead. -Reboot required. - - - - Speed Control - Map Sign - - - - When enabled, openpilot will use the speed limit signs information from map data to adjust cruise speed. Reboot required. @@ -361,6 +362,15 @@ NOR - Normal tune. SPT - Sport tune. + + Enable Stock Longitudinal Control + + + + When enabled, openpilot will not handle longitudinal control. +Reboot Required. + + DeclinePage @@ -1405,11 +1415,11 @@ This may take up to a minute. - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits/forks.These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. + When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - 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.When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. + 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. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 3e410300a..340d0630b 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -297,6 +297,17 @@ Reboot Required. Reboot Required. + + Enable TACO Tune + + + + When enabled, openpilot will use slow down for turns from taco2 branch. +See https://github.com/commaai/openpilot/commit/7b97ddb3aacb222bfaf0b978c49cb5b756903ef7 for more information. +This is tune for KIA EV6 and may not work on your vehicle. +Reboot required. + + Enable Dynamic Following @@ -305,36 +316,26 @@ Reboot Required. When enabled, openpilot will dynamically adjust following distance based on your "Driving Personality" setting. + + Enable Dynamic End-to-End Longitudinal Control + + + + When enabled, openpilot will dynamically change between End-to-End or ACC mode. +Your vehicle must support openpilot longitudinal control. + + Enable Turn Speed Control - Vision - When enabled, openpilot will use vision path predictions to estimate the appropriate speed to drive through turns ahead. -Reboot required. + When enabled, openpilot will use path predictions from camera vision to estimate the appropriate speed to drive through turns ahead. - When enabled, openpilot will use move-fast's mapd module to control the vehicle speed. + When enabled, openpilot will display current road name on the screen. Author: https://github.com/move-fast/ -Reboot required. - - - - Speed Control - Map Path - - - - When enabled, openpilot will use the curvature info from map data to define speed limits to take turns ahead. -Reboot required. - - - - Speed Control - Map Sign - - - - When enabled, openpilot will use the speed limit signs information from map data to adjust cruise speed. Reboot required. @@ -361,6 +362,15 @@ NOR - Normal tune. SPT - Sport tune. + + Enable Stock Longitudinal Control + + + + When enabled, openpilot will not handle longitudinal control. +Reboot Required. + + DeclinePage @@ -1407,11 +1417,11 @@ This may take up to a minute. - When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits/forks.These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. + When navigation has a destination, openpilot will input the map information into the model. This provides useful context for the model and allows openpilot to keep left or right appropriately at forks/exits. Lane change behavior is unchanged and still activated by the driver. This is an alpha quality feature; mistakes should be expected, particularly around exits and forks. These mistakes can include unintended laneline crossings, late exit taking, driving towards dividing barriers in the gore areas, etc. - 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.When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. + 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. When a navigation destination is set and the driving model is using it as input, the driving path on the map will turn green. diff --git a/system/camerad/camerad b/system/camerad/camerad index 712ae8b35..e843021e7 100755 Binary files a/system/camerad/camerad and b/system/camerad/camerad differ diff --git a/system/clocksd/clocksd b/system/clocksd/clocksd index c326046e7..66282c454 100755 Binary files a/system/clocksd/clocksd and b/system/clocksd/clocksd differ diff --git a/system/hardware/tici/pins.py b/system/hardware/tici/pins.py index 082a402f1..5ac015808 100644 --- a/system/hardware/tici/pins.py +++ b/system/hardware/tici/pins.py @@ -10,6 +10,7 @@ class GPIO: STM_RST_N = 124 STM_BOOT0 = 134 + SIREN = 42 SOM_ST_IO = 49 LTE_RST_N = 50 diff --git a/system/logcatd/logcatd b/system/logcatd/logcatd index 3f80a4340..551da1120 100755 Binary files a/system/logcatd/logcatd and b/system/logcatd/logcatd differ diff --git a/system/loggerd/bootlog b/system/loggerd/bootlog index 0e90b5b62..e44806c50 100755 Binary files a/system/loggerd/bootlog and b/system/loggerd/bootlog differ diff --git a/system/loggerd/encoderd b/system/loggerd/encoderd index 7e96ae8a7..aa0efe27c 100755 Binary files a/system/loggerd/encoderd and b/system/loggerd/encoderd differ diff --git a/system/loggerd/loggerd b/system/loggerd/loggerd index 354b73c30..c3b3457eb 100755 Binary files a/system/loggerd/loggerd and b/system/loggerd/loggerd differ diff --git a/system/proclogd/proclogd b/system/proclogd/proclogd index 9606d47e8..ef19bfea3 100755 Binary files a/system/proclogd/proclogd and b/system/proclogd/proclogd differ diff --git a/system/sensord/_sensord b/system/sensord/_sensord index d9508d8c7..49ac27d62 100755 Binary files a/system/sensord/_sensord and b/system/sensord/_sensord differ diff --git a/system/sensord/rawgps/rawgpsd.py b/system/sensord/rawgps/rawgpsd.py index 5db6ad1cf..54106ca2f 100755 --- a/system/sensord/rawgps/rawgpsd.py +++ b/system/sensord/rawgps/rawgpsd.py @@ -6,6 +6,7 @@ import itertools import math import time import pycurl +import shutil import subprocess from datetime import datetime from multiprocessing import Process, Event @@ -144,9 +145,17 @@ def download_assistance(): def downloader_loop(event): if os.path.exists(ASSIST_DATA_FILE): os.remove(ASSIST_DATA_FILE) - while not os.path.exists(ASSIST_DATA_FILE) and not event.is_set(): - download_assistance() - time.sleep(10) + + alt_path = os.getenv("QCOM_ALT_ASSISTANCE_PATH", None) + if alt_path is not None and os.path.exists(alt_path): + shutil.copyfile(alt_path, ASSIST_DATA_FILE) + + try: + while not os.path.exists(ASSIST_DATA_FILE) and not event.is_set(): + download_assistance() + event.wait(timeout=10) + except KeyboardInterrupt: + pass def inject_assistance(): for _ in range(5): @@ -259,14 +268,20 @@ def main() -> NoReturn: stop_download_event = Event() assist_fetch_proc = Process(target=downloader_loop, args=(stop_download_event,)) assist_fetch_proc.start() - def cleanup(proc): + def cleanup(sig, frame): cloudlog.warning("caught sig disabling quectel gps") + gpio_set(GPIO.UBLOX_PWR_EN, False) teardown_quectel(diag) cloudlog.warning("quectel cleanup done") + + stop_download_event.set() + assist_fetch_proc.kill() + assist_fetch_proc.join() + sys.exit(0) - signal.signal(signal.SIGINT, lambda sig, frame: cleanup(assist_fetch_proc)) - signal.signal(signal.SIGTERM, lambda sig, frame: cleanup(assist_fetch_proc)) + signal.signal(signal.SIGINT, cleanup) + signal.signal(signal.SIGTERM, cleanup) # connect to modem diag = ModemDiag() diff --git a/system/ubloxd/ubloxd b/system/ubloxd/ubloxd index 3256d43e1..45712a166 100755 Binary files a/system/ubloxd/ubloxd and b/system/ubloxd/ubloxd differ diff --git a/third_party/acados/x86_64/lib/libacados.so b/third_party/acados/x86_64/lib/libacados.so deleted file mode 100644 index b8a6280d6..000000000 Binary files a/third_party/acados/x86_64/lib/libacados.so and /dev/null differ diff --git a/third_party/acados/x86_64/lib/libblasfeo.so b/third_party/acados/x86_64/lib/libblasfeo.so deleted file mode 100644 index e4a19caf1..000000000 Binary files a/third_party/acados/x86_64/lib/libblasfeo.so and /dev/null differ diff --git a/third_party/acados/x86_64/lib/libhpipm.so b/third_party/acados/x86_64/lib/libhpipm.so deleted file mode 100644 index 428c76a11..000000000 Binary files a/third_party/acados/x86_64/lib/libhpipm.so and /dev/null differ diff --git a/third_party/acados/x86_64/lib/libqpOASES_e.so b/third_party/acados/x86_64/lib/libqpOASES_e.so deleted file mode 120000 index 14048625a..000000000 --- a/third_party/acados/x86_64/lib/libqpOASES_e.so +++ /dev/null @@ -1 +0,0 @@ -libqpOASES_e.so.3.1 \ No newline at end of file diff --git a/third_party/acados/x86_64/lib/libqpOASES_e.so.3.1 b/third_party/acados/x86_64/lib/libqpOASES_e.so.3.1 deleted file mode 100644 index cf3604688..000000000 Binary files a/third_party/acados/x86_64/lib/libqpOASES_e.so.3.1 and /dev/null differ diff --git a/third_party/acados/x86_64/t_renderer b/third_party/acados/x86_64/t_renderer deleted file mode 100755 index 5ced89c28..000000000 Binary files a/third_party/acados/x86_64/t_renderer and /dev/null differ diff --git a/third_party/libyuv/lib/libyuv.a b/third_party/libyuv/lib/libyuv.a deleted file mode 100644 index 228de4d03..000000000 Binary files a/third_party/libyuv/lib/libyuv.a and /dev/null differ diff --git a/tools/bodyteleop/__pycache__/bodyav.cpython-311.pyc b/tools/bodyteleop/__pycache__/bodyav.cpython-311.pyc new file mode 100644 index 000000000..695c36a6c Binary files /dev/null and b/tools/bodyteleop/__pycache__/bodyav.cpython-311.pyc differ diff --git a/tools/bodyteleop/__pycache__/web.cpython-311.pyc b/tools/bodyteleop/__pycache__/web.cpython-311.pyc new file mode 100644 index 000000000..145ff0a09 Binary files /dev/null and b/tools/bodyteleop/__pycache__/web.cpython-311.pyc differ diff --git a/tools/bodyteleop/bodyav.py b/tools/bodyteleop/bodyav.py new file mode 100644 index 000000000..cb2ebb061 --- /dev/null +++ b/tools/bodyteleop/bodyav.py @@ -0,0 +1,158 @@ +import asyncio +import io +import numpy as np +import pyaudio +import wave + +from aiortc.contrib.media import MediaBlackhole +from aiortc.mediastreams import AudioStreamTrack, MediaStreamError, MediaStreamTrack +from aiortc.mediastreams import VIDEO_CLOCK_RATE, VIDEO_TIME_BASE +from aiortc.rtcrtpsender import RTCRtpSender +from av import CodecContext, Packet +from pydub import AudioSegment +import cereal.messaging as messaging + +AUDIO_RATE = 16000 +SOUNDS = { + 'engage': '../../selfdrive/assets/sounds/engage.wav', + 'disengage': '../../selfdrive/assets/sounds/disengage.wav', + 'error': '../../selfdrive/assets/sounds/warning_immediate.wav', +} + + +def force_codec(pc, sender, forced_codec='video/VP9', stream_type="video"): + codecs = RTCRtpSender.getCapabilities(stream_type).codecs + codec = [codec for codec in codecs if codec.mimeType == forced_codec] + transceiver = next(t for t in pc.getTransceivers() if t.sender == sender) + transceiver.setCodecPreferences(codec) + + +class EncodedBodyVideo(MediaStreamTrack): + kind = "video" + + _start: float + _timestamp: int + + def __init__(self): + super().__init__() + sock_name = 'livestreamDriverEncodeData' + messaging.context = messaging.Context() + self.sock = messaging.sub_sock(sock_name, None, conflate=True) + self.pts = 0 + + async def recv(self) -> Packet: + while True: + msg = messaging.recv_one_or_none(self.sock) + if msg is not None: + break + await asyncio.sleep(0.005) + + evta = getattr(msg, msg.which()) + self.last_idx = evta.idx.encodeId + + packet = Packet(evta.header + evta.data) + packet.time_base = VIDEO_TIME_BASE + packet.pts = self.pts + self.pts += 0.05 * VIDEO_CLOCK_RATE + return packet + + +class WebClientSpeaker(MediaBlackhole): + def __init__(self): + super().__init__() + self.p = pyaudio.PyAudio() + self.buffer = io.BytesIO() + self.channels = 2 + self.stream = self.p.open(format=pyaudio.paInt16, channels=self.channels, rate=48000, frames_per_buffer=9600, output=True, stream_callback=self.pyaudio_callback) + + def pyaudio_callback(self, in_data, frame_count, time_info, status): + if self.buffer.getbuffer().nbytes < frame_count * self.channels * 2: + buff = np.zeros((frame_count, 2), dtype=np.int16).tobytes() + elif self.buffer.getbuffer().nbytes > 115200: # 3x the usual read size + self.buffer.seek(0) + buff = self.buffer.read(frame_count * self.channels * 4) + buff = buff[:frame_count * self.channels * 2] + self.buffer.seek(2) + else: + self.buffer.seek(0) + buff = self.buffer.read(frame_count * self.channels * 2) + self.buffer.seek(2) + return (buff, pyaudio.paContinue) + + async def consume(self, track): + while True: + try: + frame = await track.recv() + except MediaStreamError: + return + bio = bytes(frame.planes[0]) + self.buffer.write(bio) + + async def start(self): + for track, task in self._MediaBlackhole__tracks.items(): # pylint: disable=access-member-before-definition + if task is None: + self._MediaBlackhole__tracks[track] = asyncio.ensure_future(self.consume(track)) + + async def stop(self): + for task in self._MediaBlackhole__tracks.values(): # pylint: disable=access-member-before-definition + if task is not None: + task.cancel() + self._MediaBlackhole__tracks = {} + self.stream.stop_stream() + self.stream.close() + self.p.terminate() + + +class BodyMic(AudioStreamTrack): + def __init__(self): + super().__init__() + + self.sample_rate = AUDIO_RATE + self.AUDIO_PTIME = 0.020 # 20ms audio packetization + self.samples = int(self.AUDIO_PTIME * self.sample_rate) + self.FORMAT = pyaudio.paInt16 + self.CHANNELS = 2 + self.RATE = self.sample_rate + self.CHUNK = int(AUDIO_RATE * 0.020) + self.p = pyaudio.PyAudio() + self.mic_stream = self.p.open(format=self.FORMAT, channels=1, rate=self.RATE, input=True, frames_per_buffer=self.CHUNK) + + self.codec = CodecContext.create('pcm_s16le', 'r') + self.codec.sample_rate = self.RATE + self.codec.channels = 2 + self.audio_samples = 0 + self.chunk_number = 0 + + async def recv(self): + mic_data = self.mic_stream.read(self.CHUNK) + mic_sound = AudioSegment(mic_data, sample_width=2, channels=1, frame_rate=self.RATE) + mic_sound = AudioSegment.from_mono_audiosegments(mic_sound, mic_sound) + mic_sound += 3 # increase volume by 3db + packet = Packet(mic_sound.raw_data) + frame = self.codec.decode(packet)[0] + frame.pts = self.audio_samples + self.audio_samples += frame.samples + self.chunk_number = self.chunk_number + 1 + return frame + + +async def play_sound(sound): + chunk = 5120 + with wave.open(SOUNDS[sound], 'rb') as wf: + def callback(in_data, frame_count, time_info, status): + data = wf.readframes(frame_count) + return data, pyaudio.paContinue + + p = pyaudio.PyAudio() + stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), + channels=wf.getnchannels(), + rate=wf.getframerate(), + output=True, + frames_per_buffer=chunk, + stream_callback=callback) + stream.start_stream() + while stream.is_active(): + await asyncio.sleep(0) + stream.stop_stream() + stream.close() + p.terminate() diff --git a/tools/bodyteleop/static/index.html b/tools/bodyteleop/static/index.html new file mode 100644 index 000000000..365476975 --- /dev/null +++ b/tools/bodyteleop/static/index.html @@ -0,0 +1,103 @@ + + + + + commabody + + + + + + + + + + +
+

comma body

+ + +
+
+
+
+
+ + + +
+

body

+
+
+
+ + +
+

you

+
+
+
+
+
+
+
+ - +
+

ping time

+
+
+
+ - +
+

battery

+
+
+
+ +
+
+
+
+
+
W
+
0,0x,y
+
+
+
A
+
S
+
D
+
+
+
+ + + + +
+
+
+
+
+
+

Play Sounds

+
+
+ + + +
+
+
+
+
+
+
+
+
+
+ + + diff --git a/tools/bodyteleop/static/js/controls.js b/tools/bodyteleop/static/js/controls.js new file mode 100644 index 000000000..b1e0e7ee7 --- /dev/null +++ b/tools/bodyteleop/static/js/controls.js @@ -0,0 +1,54 @@ +const keyVals = {w: 0, a: 0, s: 0, d: 0} + +export function getXY() { + let x = -keyVals.w + keyVals.s + let y = -keyVals.d + keyVals.a + return {x, y} +} + +export const handleKeyX = (key, setValue) => { + if (['w', 'a', 's', 'd'].includes(key)){ + keyVals[key] = setValue; + let color = "#333"; + if (setValue === 1){ + color = "#e74c3c"; + } + $("#key-"+key).css('background', color); + const {x, y} = getXY(); + $("#pos-vals").text(x+","+y); + } +}; + +export async function executePlan() { + let plan = $("#plan-text").val(); + const planList = []; + plan.split("\n").forEach(function(e){ + let line = e.split(",").map(k=>parseInt(k)); + if (line.length != 5 || line.slice(0, 4).map(e=>[1, 0].includes(e)).includes(false) || line[4] < 0 || line[4] > 10){ + console.log("invalid plan"); + } + else{ + planList.push(line) + } + }); + + async function execute() { + for (var i = 0; i < planList.length; i++) { + let [w, a, s, d, t] = planList[i]; + while(t > 0){ + console.log(w, a, s, d, t); + if(w==1){$("#key-w").mousedown();} + if(a==1){$("#key-a").mousedown();} + if(s==1){$("#key-s").mousedown();} + if(d==1){$("#key-d").mousedown();} + await sleep(50); + $("#key-w").mouseup(); + $("#key-a").mouseup(); + $("#key-s").mouseup(); + $("#key-d").mouseup(); + t = t - 0.05; + } + } + } + execute(); +} \ No newline at end of file diff --git a/tools/bodyteleop/static/js/jsmain.js b/tools/bodyteleop/static/js/jsmain.js new file mode 100644 index 000000000..f52190572 --- /dev/null +++ b/tools/bodyteleop/static/js/jsmain.js @@ -0,0 +1,23 @@ +import { handleKeyX, executePlan } from "./controls.js"; +import { start, stop, last_ping } from "./webrtc.js"; + +export var pc = null; +export var dc = null; + +document.addEventListener('keydown', (e)=>(handleKeyX(e.key.toLowerCase(), 1))); +document.addEventListener('keyup', (e)=>(handleKeyX(e.key.toLowerCase(), 0))); +$(".keys").bind("mousedown touchstart", (e)=>handleKeyX($(e.target).attr('id').replace('key-', ''), 1)); +$(".keys").bind("mouseup touchend", (e)=>handleKeyX($(e.target).attr('id').replace('key-', ''), 0)); +$("#plan-button").click(executePlan); + +setInterval( () => { + const dt = new Date().getTime(); + if ((dt - last_ping) > 1000) { + $(".pre-blob").removeClass('blob'); + $("#battery").text("-"); + $("#ping-time").text('-'); + $("video")[0].load(); + } +}, 5000); + +start(pc, dc); \ No newline at end of file diff --git a/tools/bodyteleop/static/js/plots.js b/tools/bodyteleop/static/js/plots.js new file mode 100644 index 000000000..5327bf71b --- /dev/null +++ b/tools/bodyteleop/static/js/plots.js @@ -0,0 +1,53 @@ +export const pingPoints = []; +export const batteryPoints = []; + +function getChartConfig(pts, color, title, ymax=100) { + return { + type: 'line', + data: { + datasets: [{ + label: title, + data: pts, + borderWidth: 1, + borderColor: color, + backgroundColor: color, + fill: 'origin' + }] + }, + options: { + scales: { + x: { + type: 'time', + time: { + unit: 'minute', + displayFormats: { + second: 'h:mm a' + } + }, + grid: { + color: '#222', // Grid lines color + }, + ticks: { + source: 'data', + fontColor: 'rgba(255, 255, 255, 1.0)', // Y-axis label color + } + }, + y: { + beginAtZero: true, + max: ymax, + grid: { + color: 'rgba(255, 255, 255, 0.1)', // Grid lines color + }, + ticks: { + fontColor: 'rgba(255, 255, 255, 0.7)', // Y-axis label color + } + } + } + } + } +} + +const ctxPing = document.getElementById('chart-ping'); +const ctxBattery = document.getElementById('chart-battery'); +export const chartPing = new Chart(ctxPing, getChartConfig(pingPoints, 'rgba(192, 57, 43, 0.7)', 'Controls Ping Time (ms)', 250)); +export const chartBattery = new Chart(ctxBattery, getChartConfig(batteryPoints, 'rgba(41, 128, 185, 0.7)', 'Battery %', 100)); diff --git a/tools/bodyteleop/static/js/webrtc.js b/tools/bodyteleop/static/js/webrtc.js new file mode 100644 index 000000000..8bc8e7731 --- /dev/null +++ b/tools/bodyteleop/static/js/webrtc.js @@ -0,0 +1,217 @@ +import { getXY } from "./controls.js"; +import { pingPoints, batteryPoints, chartPing, chartBattery } from "./plots.js"; + +export let dcInterval = null; +export let batteryInterval = null; +export let last_ping = null; + + +export function createPeerConnection(pc) { + var config = { + sdpSemantics: 'unified-plan' + }; + + pc = new RTCPeerConnection(config); + + // connect audio / video + pc.addEventListener('track', function(evt) { + console.log("Adding Tracks!") + if (evt.track.kind == 'video') + document.getElementById('video').srcObject = evt.streams[0]; + else + document.getElementById('audio').srcObject = evt.streams[0]; + }); + return pc; +} + + +export function negotiate(pc) { + return pc.createOffer({offerToReceiveAudio:true, offerToReceiveVideo:true}).then(function(offer) { + return pc.setLocalDescription(offer); + }).then(function() { + return new Promise(function(resolve) { + if (pc.iceGatheringState === 'complete') { + resolve(); + } + else { + function checkState() { + if (pc.iceGatheringState === 'complete') { + pc.removeEventListener('icegatheringstatechange', checkState); + resolve(); + } + } + pc.addEventListener('icegatheringstatechange', checkState); + } + }); + }).then(function() { + var offer = pc.localDescription; + return fetch('/offer', { + body: JSON.stringify({ + sdp: offer.sdp, + type: offer.type, + }), + headers: { + 'Content-Type': 'application/json' + }, + method: 'POST' + }); + }).then(function(response) { + console.log(response); + return response.json(); + }).then(function(answer) { + return pc.setRemoteDescription(answer); + }).catch(function(e) { + alert(e); + }); +} + + +function isMobile() { + let check = false; + (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); + return check; +}; + + +export const constraints = { + audio: { + autoGainControl: false, + sampleRate: 48000, + sampleSize: 16, + echoCancellation: true, + noiseSuppression: true, + channelCount: 1 + }, + video: isMobile() +}; + + +export function createDummyVideoTrack() { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + + const frameWidth = 5; // Set the width of the frame + const frameHeight = 5; // Set the height of the frame + canvas.width = frameWidth; + canvas.height = frameHeight; + + context.fillStyle = 'black'; + context.fillRect(0, 0, frameWidth, frameHeight); + + const stream = canvas.captureStream(); + const videoTrack = stream.getVideoTracks()[0]; + + return videoTrack; +} + + +export function start(pc, dc) { + pc = createPeerConnection(pc); + + if (constraints.audio || constraints.video) { + // add audio track + navigator.mediaDevices.getUserMedia(constraints).then(function(stream) { + stream.getTracks().forEach(function(track) { + pc.addTrack(track, stream); + // only audio? + // if (track.kind === 'audio'){ + // pc.addTrack(track, stream); + // } + }); + return negotiate(pc); + }, function(err) { + alert('Could not acquire media: ' + err); + }); + + // add a fake video? + // const dummyVideoTrack = createDummyVideoTrack(); + // const dummyMediaStream = new MediaStream(); + // dummyMediaStream.addTrack(dummyVideoTrack); + // pc.addTrack(dummyVideoTrack, dummyMediaStream); + + } else { + negotiate(pc); + } + + // setInterval(() => {pc.getStats(null).then((stats) => {stats.forEach((report) => console.log(report))})}, 10000) + // var video = document.querySelector('video'); + // var print = function (e, f){console.log(e, f); video.requestVideoFrameCallback(print);}; + // video.requestVideoFrameCallback(print); + + + var parameters = {"ordered": true}; + dc = pc.createDataChannel('data', parameters); + dc.onclose = function() { + console.log("data channel closed"); + clearInterval(dcInterval); + clearInterval(batteryInterval); + }; + function controlCommand() { + const {x, y} = getXY(); + const dt = new Date().getTime(); + var message = JSON.stringify({type: 'control_command', x, y, dt}); + dc.send(message); + } + + function batteryLevel() { + var message = JSON.stringify({type: 'battery_level'}); + dc.send(message); + } + + dc.onopen = function() { + dcInterval = setInterval(controlCommand, 50); + batteryInterval = setInterval(batteryLevel, 10000); + controlCommand(); + batteryLevel(); + $(".sound").click((e)=>{ + const sound = $(e.target).attr('id').replace('sound-', '') + dc.send(JSON.stringify({type: 'play_sound', sound})); + }); + }; + + let val_print_idx = 0; + dc.onmessage = function(evt) { + const data = JSON.parse(evt.data); + if(val_print_idx == 0 && data.type === 'ping_time') { + const dt = new Date().getTime(); + const pingtime = dt - data.incoming_time; + pingPoints.push({'x': dt, 'y': pingtime}); + if (pingPoints.length > 1000) { + pingPoints.shift(); + } + chartPing.update(); + $("#ping-time").text((pingtime) + "ms"); + last_ping = dt; + $(".pre-blob").addClass('blob'); + } + val_print_idx = (val_print_idx + 1 ) % 20; + if(data.type === 'battery_level') { + $("#battery").text(data.value + "%"); + batteryPoints.push({'x': new Date().getTime(), 'y': data.value}); + if (batteryPoints.length > 1000) { + batteryPoints.shift(); + } + chartBattery.update(); + } + }; +} + + +export function stop(pc, dc) { + if (dc) { + dc.close(); + } + if (pc.getTransceivers) { + pc.getTransceivers().forEach(function(transceiver) { + if (transceiver.stop) { + transceiver.stop(); + } + }); + } + pc.getSenders().forEach(function(sender) { + sender.track.stop(); + }); + setTimeout(function() { + pc.close(); + }, 500); +} diff --git a/tools/bodyteleop/static/main.css b/tools/bodyteleop/static/main.css new file mode 100644 index 000000000..1bfb5982b --- /dev/null +++ b/tools/bodyteleop/static/main.css @@ -0,0 +1,185 @@ +body { + background: #333 !important; + color: #fff !important; + display: flex; + justify-content: center; + align-items: start; +} + +p { + margin: 0px !important; +} + +i { + font-style: normal; +} + +.small { + font-size: 1em !important +} + +.jumbo { + font-size: 8rem; +} + + +@media (max-width: 600px) { + .small { + font-size: 0.5em !important + } + .jumbo { + display: none; + } + +} + +#main { + display: flex; + flex-direction: column; + align-content: center; + justify-content: center; + align-items: center; + font-size: 30px; + width: 100%; + max-width: 1200px; +} + +video { + width: 95%; +} + +.pre-blob { + display: flex; + background: #333; + border-radius: 50%; + margin: 10px; + height: 45px; + width: 45px; + justify-content: center; + align-items: center; + font-size: 1rem; +} + +.blob { + background: rgba(231, 76, 60,1.0); + box-shadow: 0 0 0 0 rgba(231, 76, 60,1.0); + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0% { + box-shadow: 0 0 0 0px rgba(192, 57, 43, 1); + } + 100% { + box-shadow: 0 0 0 20px rgba(192, 57, 43, 0); + } +} + + +.icon-sup-panel { + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: center; + background: #222; + border-radius: 10px; + padding: 5px; + margin: 5px 0px 5px 0px; +} + +.icon-sub-panel { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; +} + +#icon-panel { + display: flex; + width: 100%; + justify-content: space-between; + margin-top: 5px; +} + +.icon-sub-sub-panel { + display: flex; + flex-direction: row; +} + +.keys, #key-val { + background: #333; + padding: 2rem; + margin: 5px; + color: #fff; + display: flex; + justify-content: center; + align-items: center; + border-radius: 10px; + cursor: pointer; +} + +#key-val { + pointer-events: none; + background: #fff; + color: #333; + line-height: 1; + font-size: 20px; + flex-direction: column; +} + +.wasd-row { + display: flex; + flex-direction: row; + justify-content: center; + align-items: stretch; +} + +#wasd { + margin: 5px 0px 5px 0px; + background: #222; + border-radius: 10px; + width: 100%; + padding: 20px; + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: stretch; + + user-select: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + touch-action: manipulation; +} + +.panel { + display: flex; + justify-content: center; + margin: 5px 0px 5px 0px !important; + background: #222; + border-radius: 10px; + width: 100%; + padding: 10px; +} + +#ping-time, #battery { + font-size: 25px; +} + +#stop { + display: none; +} + +.plan-form { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; +} + +.details { + display: flex; + padding: 0px 10px 0px 10px; +} diff --git a/tools/bodyteleop/static/poster.png b/tools/bodyteleop/static/poster.png new file mode 100644 index 000000000..ba0e846b2 Binary files /dev/null and b/tools/bodyteleop/static/poster.png differ diff --git a/tools/bodyteleop/web.py b/tools/bodyteleop/web.py new file mode 100644 index 000000000..c8f5dfd76 --- /dev/null +++ b/tools/bodyteleop/web.py @@ -0,0 +1,201 @@ +import asyncio +import json +import logging +import os +import ssl +import uuid +import time + +from common.basedir import BASEDIR +from aiohttp import web +from aiortc import RTCPeerConnection, RTCSessionDescription + +import cereal.messaging as messaging +from tools.bodyteleop.bodyav import BodyMic, WebClientSpeaker, force_codec, play_sound, MediaBlackhole, EncodedBodyVideo + +logger = logging.getLogger("pc") +logging.basicConfig(level=logging.INFO) + +pcs = set() +pm, sm = None, None +TELEOPDIR = f"{BASEDIR}/tools/bodyteleop" + + +async def index(request): + content = open(TELEOPDIR + "/static/index.html", "r").read() + now = time.monotonic() + request.app['mutable_vals']['last_send_time'] = now + request.app['mutable_vals']['last_override_time'] = now + request.app['mutable_vals']['prev_command'] = [] + request.app['mutable_vals']['find_person'] = False + + return web.Response(content_type="text/html", text=content) + + +async def control_body(data, app): + now = time.monotonic() + if (data['type'] == 'dummy_controls') and (now < (app['mutable_vals']['last_send_time'] + 0.2)): + return + if (data['type'] == 'control_command') and (app['mutable_vals']['prev_command'] == [data['x'], data['y']] and data['x'] == 0 and data['y'] == 0): + return + + logger.info(str(data)) + x = max(-1.0, min(1.0, data['x'])) + y = max(-1.0, min(1.0, data['y'])) + dat = messaging.new_message('testJoystick') + dat.testJoystick.axes = [x, y] + dat.testJoystick.buttons = [False] + pm.send('testJoystick', dat) + app['mutable_vals']['last_send_time'] = now + if (data['type'] == 'control_command'): + app['mutable_vals']['last_override_time'] = now + app['mutable_vals']['prev_command'] = [data['x'], data['y']] + + +async def dummy_controls_msg(app): + while True: + if 'last_send_time' in app['mutable_vals']: + this_time = time.monotonic() + if (app['mutable_vals']['last_send_time'] + 0.2) < this_time: + await control_body({'type': 'dummy_controls', 'x': 0, 'y': 0}, app) + await asyncio.sleep(0.2) + + +async def start_background_tasks(app): + app['bgtask_dummy_controls_msg'] = asyncio.create_task(dummy_controls_msg(app)) + + +async def stop_background_tasks(app): + app['bgtask_dummy_controls_msg'].cancel() + await app['bgtask_dummy_controls_msg'] + + +async def offer(request): + logger.info("\n\n\nnewoffer!\n\n") + + params = await request.json() + offer = RTCSessionDescription(sdp=params["sdp"], type=params["type"]) + speaker = WebClientSpeaker() + blackhole = MediaBlackhole() + + pc = RTCPeerConnection() + pc_id = "PeerConnection(%s)" % uuid.uuid4() + pcs.add(pc) + + def log_info(msg, *args): + logger.info(pc_id + " " + msg, *args) + + log_info("Created for %s", request.remote) + + @pc.on("datachannel") + def on_datachannel(channel): + request.app['mutable_vals']['remote_channel'] = channel + + @channel.on("message") + async def on_message(message): + data = json.loads(message) + if data['type'] == 'control_command': + await control_body(data, request.app) + times = { + 'type': 'ping_time', + 'incoming_time': data['dt'], + 'outgoing_time': int(time.time() * 1000), + } + channel.send(json.dumps(times)) + if data['type'] == 'battery_level': + sm.update(timeout=0) + if sm.updated['carState']: + channel.send(json.dumps({'type': 'battery_level', 'value': int(sm['carState'].fuelGauge * 100)})) + if data['type'] == 'play_sound': + logger.info(f"Playing sound: {data['sound']}") + await play_sound(data['sound']) + if data['type'] == 'find_person': + request.app['mutable_vals']['find_person'] = data['value'] + + @pc.on("connectionstatechange") + async def on_connectionstatechange(): + log_info("Connection state is %s", pc.connectionState) + if pc.connectionState == "failed": + await pc.close() + pcs.discard(pc) + + @pc.on('track') + def on_track(track): + logger.info(f"Track received: {track.kind}") + if track.kind == "audio": + speaker.addTrack(track) + elif track.kind == "video": + blackhole.addTrack(track) + + @track.on("ended") + async def on_ended(): + log_info("Remote %s track ended", track.kind) + if track.kind == "audio": + await speaker.stop() + elif track.kind == "video": + await blackhole.stop() + + video_sender = pc.addTrack(EncodedBodyVideo()) + force_codec(pc, video_sender, forced_codec='video/H264') + _ = pc.addTrack(BodyMic()) + + await pc.setRemoteDescription(offer) + await speaker.start() + await blackhole.start() + answer = await pc.createAnswer() + await pc.setLocalDescription(answer) + + return web.Response( + content_type="application/json", + text=json.dumps( + {"sdp": pc.localDescription.sdp, "type": pc.localDescription.type} + ), + ) + + +async def on_shutdown(app): + coros = [pc.close() for pc in pcs] + await asyncio.gather(*coros) + pcs.clear() + + +async def run(cmd): + proc = await asyncio.create_subprocess_shell( + cmd, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE + ) + stdout, stderr = await proc.communicate() + logger.info("Created key and cert!") + if stdout: + logger.info(f'[stdout]\n{stdout.decode()}') + if stderr: + logger.info(f'[stderr]\n{stderr.decode()}') + + +def main(): + global pm, sm + pm = messaging.PubMaster(['testJoystick']) + sm = messaging.SubMaster(['carState', 'logMessage']) + # App needs to be HTTPS for microphone and audio autoplay to work on the browser + cert_path = TELEOPDIR + '/cert.pem' + key_path = TELEOPDIR + '/key.pem' + if (not os.path.exists(cert_path)) or (not os.path.exists(key_path)): + asyncio.run(run(f'openssl req -x509 -newkey rsa:4096 -nodes -out {cert_path} -keyout {key_path} -days 365 -subj "/C=US/ST=California/O=commaai/OU=comma body"')) + else: + logger.info("Certificate exists!") + ssl_context = ssl.SSLContext() + ssl_context.load_cert_chain(cert_path, key_path) + app = web.Application() + app['mutable_vals'] = {} + app.on_shutdown.append(on_shutdown) + app.router.add_post("/offer", offer) + app.router.add_get("/", index) + app.router.add_static('/static', TELEOPDIR + '/static') + app.on_startup.append(start_background_tasks) + app.on_cleanup.append(stop_background_tasks) + web.run_app(app, access_log=None, host="0.0.0.0", port=5000, ssl_context=ssl_context) + + +if __name__ == "__main__": + main() diff --git a/tools/joystick/web.py b/tools/joystick/web.py deleted file mode 100755 index 5cba4e938..000000000 --- a/tools/joystick/web.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -import time -import threading -from flask import Flask - -import cereal.messaging as messaging - -app = Flask(__name__) -pm = messaging.PubMaster(['testJoystick']) - -index = """ - - - - - -
- -""" - -@app.route("/") -def hello_world(): - return index - -last_send_time = time.monotonic() -@app.route("/control//") -def control(x, y): - global last_send_time - x,y = float(x), float(y) - x = max(-1, min(1, x)) - y = max(-1, min(1, y)) - dat = messaging.new_message('testJoystick') - dat.testJoystick.axes = [y,x] - dat.testJoystick.buttons = [False] - pm.send('testJoystick', dat) - last_send_time = time.monotonic() - return "" - -def handle_timeout(): - while 1: - this_time = time.monotonic() - if (last_send_time+0.5) < this_time: - #print("timeout, no web in %.2f s" % (this_time-last_send_time)) - dat = messaging.new_message('testJoystick') - dat.testJoystick.axes = [0,0] - dat.testJoystick.buttons = [False] - pm.send('testJoystick', dat) - time.sleep(0.1) - -def main(): - threading.Thread(target=handle_timeout, daemon=True).start() - app.run(host="0.0.0.0") - -if __name__ == '__main__': - main() diff --git a/tools/lib/README.md b/tools/lib/README.md index d77eef5ac..8f540a5c8 100644 --- a/tools/lib/README.md +++ b/tools/lib/README.md @@ -6,7 +6,7 @@ Route is a class for conveniently accessing all the [logs](/system/loggerd/) fro from tools.lib.route import Route from tools.lib.logreader import LogReader -r = Route("4cf7a6ad03080c90|2021-09-29--13-46-36") +r = Route("a2a0ccea32023010|2023-07-27--13-01-19") # get a list of paths for the route's rlog files print(r.log_paths()) @@ -41,7 +41,7 @@ from tools.lib.route import Route from tools.lib.logreader import MultiLogIterator # setup a MultiLogIterator to read all the logs in the route -r = Route("4cf7a6ad03080c90|2021-09-29--13-46-36") +r = Route("a2a0ccea32023010|2023-07-27--13-01-19") lr = MultiLogIterator(r.log_paths()) # print all the steering angles values from all the logs in the route diff --git a/tools/lib/tests/test_route_library.py b/tools/lib/tests/test_route_library.py index fbe7f3e77..814017c9c 100755 --- a/tools/lib/tests/test_route_library.py +++ b/tools/lib/tests/test_route_library.py @@ -8,13 +8,13 @@ class TestRouteLibrary(unittest.TestCase): def test_segment_name_formats(self): Case = namedtuple('Case', ['input', 'expected_route', 'expected_segment_num', 'expected_data_dir']) - cases = [ Case("4cf7a6ad03080c90|2021-09-29--13-46-36", "4cf7a6ad03080c90|2021-09-29--13-46-36", -1, None), - Case("4cf7a6ad03080c90/2021-09-29--13-46-36--1", "4cf7a6ad03080c90|2021-09-29--13-46-36", 1, None), - Case("4cf7a6ad03080c90|2021-09-29--13-46-36/2", "4cf7a6ad03080c90|2021-09-29--13-46-36", 2, None), - Case("4cf7a6ad03080c90/2021-09-29--13-46-36/3", "4cf7a6ad03080c90|2021-09-29--13-46-36", 3, None), - Case("/data/media/0/realdata/4cf7a6ad03080c90|2021-09-29--13-46-36", "4cf7a6ad03080c90|2021-09-29--13-46-36", -1, "/data/media/0/realdata"), - Case("/data/media/0/realdata/4cf7a6ad03080c90|2021-09-29--13-46-36--1", "4cf7a6ad03080c90|2021-09-29--13-46-36", 1, "/data/media/0/realdata"), - Case("/data/media/0/realdata/4cf7a6ad03080c90|2021-09-29--13-46-36/2", "4cf7a6ad03080c90|2021-09-29--13-46-36", 2, "/data/media/0/realdata") ] + cases = [ Case("a2a0ccea32023010|2023-07-27--13-01-19", "a2a0ccea32023010|2023-07-27--13-01-19", -1, None), + Case("a2a0ccea32023010/2023-07-27--13-01-19--1", "a2a0ccea32023010|2023-07-27--13-01-19", 1, None), + Case("a2a0ccea32023010|2023-07-27--13-01-19/2", "a2a0ccea32023010|2023-07-27--13-01-19", 2, None), + Case("a2a0ccea32023010/2023-07-27--13-01-19/3", "a2a0ccea32023010|2023-07-27--13-01-19", 3, None), + Case("/data/media/0/realdata/a2a0ccea32023010|2023-07-27--13-01-19", "a2a0ccea32023010|2023-07-27--13-01-19", -1, "/data/media/0/realdata"), + Case("/data/media/0/realdata/a2a0ccea32023010|2023-07-27--13-01-19--1", "a2a0ccea32023010|2023-07-27--13-01-19", 1, "/data/media/0/realdata"), + Case("/data/media/0/realdata/a2a0ccea32023010|2023-07-27--13-01-19/2", "a2a0ccea32023010|2023-07-27--13-01-19", 2, "/data/media/0/realdata") ] def _validate(case): route_or_segment_name = case.input diff --git a/tools/replay/replay.h b/tools/replay/replay.h index 4eb8e3ab3..a9a6bfd91 100644 --- a/tools/replay/replay.h +++ b/tools/replay/replay.h @@ -7,7 +7,7 @@ #include "tools/replay/camera.h" #include "tools/replay/route.h" -const QString DEMO_ROUTE = "4cf7a6ad03080c90|2021-09-29--13-46-36"; +const QString DEMO_ROUTE = "a2a0ccea32023010|2023-07-27--13-01-19"; // one segment uses about 100M of memory constexpr int MIN_SEGMENTS_CACHE = 5;