Compare commits

...

1 Commits

Author SHA1 Message Date
dragonpilot 5481370db3 version: dragonpilot development version for C3/C3X
date: 2024-03-12T10:58:15
commit: 1a6b7fc5410ebb87478d8bc0fc204d632e80e8c7
2024-03-12 10:58:30 -07:00
354 changed files with 9488 additions and 8368 deletions
-1
View File
@@ -10,7 +10,6 @@ venv/
.overlay_init .overlay_init
.overlay_consistent .overlay_consistent
.sconsign.dblite .sconsign.dblite
.vscode*
model2.png model2.png
a.out a.out
.hypothesis .hypothesis
+1 -1
View File
@@ -1,4 +1,4 @@
dragonpilot beta3 2024.02.13 dragonpilot beta3 2024.03.12
======================= =======================
* Comma 0.9.6 release * Comma 0.9.6 release
* New driving model (Los Angles V2) * New driving model (Los Angles V2)
+12 -1
View File
@@ -1,4 +1,9 @@
Version 0.9.6 (2024-02-XX) Version 0.9.7 (2024-XX-XX)
========================
* New driving model
* Support for hybrid variants of supported Ford models
Version 0.9.6 (2024-02-27)
======================== ========================
* New driving model * New driving model
* Vision model trained on more data * Vision model trained on more data
@@ -6,9 +11,15 @@ Version 0.9.6 (2024-02-XX)
* Directly outputs curvature for lateral control * Directly outputs curvature for lateral control
* New driver monitoring model * New driver monitoring model
* Trained on larger dataset * Trained on larger dataset
* Model path UI
* Shows where driving model wants to be
* Shows what model is seeing more clearly, but more jittery
* AGNOS 9 * AGNOS 9
* comma body streaming and controls over WebRTC * comma body streaming and controls over WebRTC
* Improved fuzzy fingerprinting for many makes and models * Improved fuzzy fingerprinting for many makes and models
* Alpha longitudinal support for new Toyota models
* Chevrolet Equinox 2019-22 support thanks to JasonJShuler and nworb-cire!
* Dodge Durango 2020-21 support
* Hyundai Staria 2023 support thanks to sunnyhaibin! * Hyundai Staria 2023 support thanks to sunnyhaibin!
* Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin! * Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin!
* Lexus LC 2024 support thanks to nelsonjchen! * Lexus LC 2024 support thanks to nelsonjchen!
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
const uint8_t gitversion[8] = "2ade7461"; const uint8_t gitversion[8] = "abf3d716";
-1
View File
@@ -1,4 +1,3 @@
# pylint: skip-file
import os import os
import capnp import capnp
+11 -5
View File
@@ -323,14 +323,12 @@ struct CarControl {
# Actuator commands as computed by controlsd # Actuator commands as computed by controlsd
actuators @6 :Actuators; actuators @6 :Actuators;
# moved to CarOutput
actuatorsOutputDEPRECATED @10 :Actuators;
leftBlinker @15: Bool; leftBlinker @15: Bool;
rightBlinker @16: Bool; rightBlinker @16: Bool;
# Any car specific rate limits or quirks applied by
# the CarController are reflected in actuatorsOutput
# and matches what is sent to the car
actuatorsOutput @10 :Actuators;
orientationNED @13 :List(Float32); orientationNED @13 :List(Float32);
angularVelocity @14 :List(Float32); angularVelocity @14 :List(Float32);
@@ -418,6 +416,13 @@ struct CarControl {
pitchDEPRECATED @9 :Float32; pitchDEPRECATED @9 :Float32;
} }
struct CarOutput {
# Any car specific rate limits or quirks applied by
# the CarController are reflected in actuatorsOutput
# and matches what is sent to the car
actuatorsOutput @0 :CarControl.Actuators;
}
# ****** car param ****** # ****** car param ******
struct CarParams { struct CarParams {
@@ -596,6 +601,7 @@ struct CarParams {
body @27; body @27;
hyundaiCanfd @28; hyundaiCanfd @28;
volkswagenMqbEvo @29; volkswagenMqbEvo @29;
chryslerCusw @30;
} }
enum SteerControlType { enum SteerControlType {
+133 -67
View File
@@ -2494,7 +2494,7 @@ const ::capnp::_::RawSchema s_8ff333ebac1fdf36 = {
0, 7, i_8ff333ebac1fdf36, nullptr, nullptr, { &s_8ff333ebac1fdf36, nullptr, nullptr, 0, 0, nullptr }, false 0, 7, i_8ff333ebac1fdf36, nullptr, nullptr, { &s_8ff333ebac1fdf36, nullptr, nullptr, 0, 0, nullptr }, false
}; };
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<311> b_f78829049ab814af = { static const ::capnp::_::AlignedData<313> b_f78829049ab814af = {
{ 0, 0, 0, 0, 5, 0, 6, 0, { 0, 0, 0, 0, 5, 0, 6, 0,
175, 20, 184, 154, 4, 41, 136, 247, 175, 20, 184, 154, 4, 41, 136, 247,
10, 0, 0, 0, 1, 0, 3, 0, 10, 0, 0, 0, 1, 0, 3, 0,
@@ -2594,55 +2594,55 @@ static const ::capnp::_::AlignedData<311> b_f78829049ab814af = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
28, 2, 0, 0, 3, 0, 1, 0, 28, 2, 0, 0, 3, 0, 1, 0,
40, 2, 0, 0, 2, 0, 1, 0, 40, 2, 0, 0, 2, 0, 1, 0,
6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0,
0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 1, 0, 10, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
37, 2, 0, 0, 130, 0, 0, 0, 37, 2, 0, 0, 210, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
36, 2, 0, 0, 3, 0, 1, 0,
48, 2, 0, 0, 2, 0, 1, 0,
1, 0, 0, 0, 2, 0, 0, 0,
0, 0, 1, 0, 11, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
45, 2, 0, 0, 82, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44, 2, 0, 0, 3, 0, 1, 0, 44, 2, 0, 0, 3, 0, 1, 0,
56, 2, 0, 0, 2, 0, 1, 0, 56, 2, 0, 0, 2, 0, 1, 0,
2, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0,
0, 0, 1, 0, 12, 0, 0, 0, 0, 0, 1, 0, 11, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53, 2, 0, 0, 90, 0, 0, 0, 53, 2, 0, 0, 82, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
52, 2, 0, 0, 3, 0, 1, 0, 52, 2, 0, 0, 3, 0, 1, 0,
64, 2, 0, 0, 2, 0, 1, 0, 64, 2, 0, 0, 2, 0, 1, 0,
2, 0, 0, 0, 3, 0, 0, 0,
0, 0, 1, 0, 12, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
61, 2, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
60, 2, 0, 0, 3, 0, 1, 0,
72, 2, 0, 0, 2, 0, 1, 0,
7, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0,
0, 0, 1, 0, 13, 0, 0, 0, 0, 0, 1, 0, 13, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
61, 2, 0, 0, 122, 0, 0, 0, 69, 2, 0, 0, 122, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60, 2, 0, 0, 3, 0, 1, 0, 68, 2, 0, 0, 3, 0, 1, 0,
88, 2, 0, 0, 2, 0, 1, 0, 96, 2, 0, 0, 2, 0, 1, 0,
8, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0,
0, 0, 1, 0, 14, 0, 0, 0, 0, 0, 1, 0, 14, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
85, 2, 0, 0, 130, 0, 0, 0, 93, 2, 0, 0, 130, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
84, 2, 0, 0, 3, 0, 1, 0, 92, 2, 0, 0, 3, 0, 1, 0,
112, 2, 0, 0, 2, 0, 1, 0, 120, 2, 0, 0, 2, 0, 1, 0,
4, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0,
0, 0, 1, 0, 15, 0, 0, 0, 0, 0, 1, 0, 15, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
109, 2, 0, 0, 98, 0, 0, 0, 117, 2, 0, 0, 98, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
108, 2, 0, 0, 3, 0, 1, 0,
120, 2, 0, 0, 2, 0, 1, 0,
5, 0, 0, 0, 5, 0, 0, 0,
0, 0, 1, 0, 16, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
117, 2, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
116, 2, 0, 0, 3, 0, 1, 0, 116, 2, 0, 0, 3, 0, 1, 0,
128, 2, 0, 0, 2, 0, 1, 0, 128, 2, 0, 0, 2, 0, 1, 0,
6, 0, 0, 0, 5, 0, 0, 0,
0, 0, 1, 0, 16, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
125, 2, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
124, 2, 0, 0, 3, 0, 1, 0,
136, 2, 0, 0, 2, 0, 1, 0,
101, 110, 97, 98, 108, 101, 100, 0, 101, 110, 97, 98, 108, 101, 100, 0,
1, 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,
@@ -2736,7 +2736,9 @@ static const ::capnp::_::AlignedData<311> b_f78829049ab814af = {
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, 0,
97, 99, 116, 117, 97, 116, 111, 114, 97, 99, 116, 117, 97, 116, 111, 114,
115, 79, 117, 116, 112, 117, 116, 0, 115, 79, 117, 116, 112, 117, 116, 68,
69, 80, 82, 69, 67, 65, 84, 69,
68, 0, 0, 0, 0, 0, 0, 0,
16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,
40, 40, 67, 25, 169, 117, 114, 233, 40, 40, 67, 25, 169, 117, 114, 233,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -2817,7 +2819,7 @@ static const ::capnp::_::RawSchema* const d_f78829049ab814af[] = {
static const uint16_t m_f78829049ab814af[] = {7, 6, 10, 14, 2, 4, 0, 1, 5, 11, 15, 12, 13, 9, 16, 8, 3}; static const uint16_t m_f78829049ab814af[] = {7, 6, 10, 14, 2, 4, 0, 1, 5, 11, 15, 12, 13, 9, 16, 8, 3};
static const uint16_t i_f78829049ab814af[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; static const uint16_t i_f78829049ab814af[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
const ::capnp::_::RawSchema s_f78829049ab814af = { const ::capnp::_::RawSchema s_f78829049ab814af = {
0xf78829049ab814af, b_f78829049ab814af.words, 311, d_f78829049ab814af, m_f78829049ab814af, 0xf78829049ab814af, b_f78829049ab814af.words, 313, d_f78829049ab814af, m_f78829049ab814af,
3, 17, i_f78829049ab814af, nullptr, nullptr, { &s_f78829049ab814af, nullptr, nullptr, 0, 0, nullptr }, false 3, 17, i_f78829049ab814af, nullptr, nullptr, { &s_f78829049ab814af, nullptr, nullptr, 0, 0, nullptr }, false
}; };
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
@@ -3503,6 +3505,53 @@ const ::capnp::_::RawSchema s_f5a5e26c954e339e = {
}; };
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(AudibleAlert_f5a5e26c954e339e, f5a5e26c954e339e); CAPNP_DEFINE_ENUM(AudibleAlert_f5a5e26c954e339e, f5a5e26c954e339e);
static const ::capnp::_::AlignedData<33> b_d817d6655115ca85 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
133, 202, 21, 81, 101, 214, 23, 216,
10, 0, 0, 0, 1, 0, 0, 0,
141, 139, 175, 8, 231, 241, 42, 142,
1, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 162, 0, 0, 0,
29, 0, 0, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
25, 0, 0, 0, 63, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
99, 97, 114, 46, 99, 97, 112, 110,
112, 58, 67, 97, 114, 79, 117, 116,
112, 117, 116, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0,
4, 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,
13, 0, 0, 0, 130, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
12, 0, 0, 0, 3, 0, 1, 0,
24, 0, 0, 0, 2, 0, 1, 0,
97, 99, 116, 117, 97, 116, 111, 114,
115, 79, 117, 116, 112, 117, 116, 0,
16, 0, 0, 0, 0, 0, 0, 0,
40, 40, 67, 25, 169, 117, 114, 233,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
16, 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_d817d6655115ca85 = b_d817d6655115ca85.words;
#if !CAPNP_LITE
static const ::capnp::_::RawSchema* const d_d817d6655115ca85[] = {
&s_e97275a919432828,
};
static const uint16_t m_d817d6655115ca85[] = {0};
static const uint16_t i_d817d6655115ca85[] = {0};
const ::capnp::_::RawSchema s_d817d6655115ca85 = {
0xd817d6655115ca85, b_d817d6655115ca85.words, 33, d_d817d6655115ca85, m_d817d6655115ca85,
1, 1, i_d817d6655115ca85, nullptr, nullptr, { &s_d817d6655115ca85, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<1284> b_8c69372490aaa9da = { static const ::capnp::_::AlignedData<1284> b_8c69372490aaa9da = {
{ 0, 0, 0, 0, 5, 0, 6, 0, { 0, 0, 0, 0, 5, 0, 6, 0,
218, 169, 170, 144, 36, 55, 105, 140, 218, 169, 170, 144, 36, 55, 105, 140,
@@ -5850,7 +5899,7 @@ const ::capnp::_::RawSchema s_9d151e3f28616a12 = {
0, 8, i_9d151e3f28616a12, nullptr, nullptr, { &s_9d151e3f28616a12, nullptr, nullptr, 0, 0, nullptr }, false 0, 8, i_9d151e3f28616a12, nullptr, nullptr, { &s_9d151e3f28616a12, nullptr, nullptr, 0, 0, nullptr }, false
}; };
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<158> b_95551e5b1edaf451 = { static const ::capnp::_::AlignedData<163> b_95551e5b1edaf451 = {
{ 0, 0, 0, 0, 5, 0, 6, 0, { 0, 0, 0, 0, 5, 0, 6, 0,
81, 244, 218, 30, 91, 30, 85, 149, 81, 244, 218, 30, 91, 30, 85, 149,
20, 0, 0, 0, 2, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0,
@@ -5860,7 +5909,7 @@ static const ::capnp::_::AlignedData<158> b_95551e5b1edaf451 = {
21, 0, 0, 0, 2, 1, 0, 0, 21, 0, 0, 0, 2, 1, 0, 0,
33, 0, 0, 0, 7, 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, 215, 2, 0, 0, 29, 0, 0, 0, 239, 2, 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, 0, 0, 0,
99, 97, 114, 46, 99, 97, 112, 110, 99, 97, 114, 46, 99, 97, 112, 110,
@@ -5868,96 +5917,99 @@ static const ::capnp::_::AlignedData<158> b_95551e5b1edaf451 = {
97, 109, 115, 46, 83, 97, 102, 101, 97, 109, 115, 46, 83, 97, 102, 101,
116, 121, 77, 111, 100, 101, 108, 0, 116, 121, 77, 111, 100, 101, 108, 0,
0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0,
120, 0, 0, 0, 1, 0, 2, 0, 124, 0, 0, 0, 1, 0, 2, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
97, 1, 0, 0, 58, 0, 0, 0, 109, 1, 0, 0, 58, 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, 1, 0, 0, 0, 0, 0, 0, 0,
89, 1, 0, 0, 90, 0, 0, 0, 101, 1, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
85, 1, 0, 0, 58, 0, 0, 0, 97, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
77, 1, 0, 0, 58, 0, 0, 0, 89, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
69, 1, 0, 0, 26, 0, 0, 0, 81, 1, 0, 0, 26, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0,
61, 1, 0, 0, 146, 0, 0, 0, 73, 1, 0, 0, 146, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
61, 1, 0, 0, 42, 0, 0, 0, 73, 1, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
53, 1, 0, 0, 74, 0, 0, 0, 65, 1, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
49, 1, 0, 0, 66, 0, 0, 0, 61, 1, 0, 0, 66, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
41, 1, 0, 0, 74, 0, 0, 0, 53, 1, 0, 0, 74, 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, 10, 0, 0, 0, 0, 0, 0, 0,
37, 1, 0, 0, 50, 0, 0, 0, 49, 1, 0, 0, 50, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0,
29, 1, 0, 0, 58, 0, 0, 0, 41, 1, 0, 0, 58, 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, 12, 0, 0, 0, 0, 0, 0, 0,
21, 1, 0, 0, 82, 0, 0, 0, 33, 1, 0, 0, 82, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
13, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0,
17, 1, 0, 0, 50, 0, 0, 0, 29, 1, 0, 0, 50, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0,
9, 1, 0, 0, 58, 0, 0, 0, 21, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
1, 1, 0, 0, 90, 0, 0, 0, 13, 1, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,
253, 0, 0, 0, 90, 0, 0, 0, 9, 1, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,
249, 0, 0, 0, 82, 0, 0, 0, 5, 1, 0, 0, 82, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
245, 0, 0, 0, 58, 0, 0, 0, 1, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0,
237, 0, 0, 0, 74, 0, 0, 0, 249, 0, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
20, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,
233, 0, 0, 0, 90, 0, 0, 0, 245, 0, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0,
229, 0, 0, 0, 106, 0, 0, 0, 241, 0, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
22, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0,
225, 0, 0, 0, 130, 0, 0, 0, 237, 0, 0, 0, 130, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
23, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0,
221, 0, 0, 0, 114, 0, 0, 0, 233, 0, 0, 0, 114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
24, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
217, 0, 0, 0, 138, 0, 0, 0, 229, 0, 0, 0, 138, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
25, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
217, 0, 0, 0, 114, 0, 0, 0, 229, 0, 0, 0, 114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
26, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0,
213, 0, 0, 0, 58, 0, 0, 0, 225, 0, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
27, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0,
205, 0, 0, 0, 42, 0, 0, 0, 217, 0, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
28, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
197, 0, 0, 0, 106, 0, 0, 0, 209, 0, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
29, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0,
193, 0, 0, 0, 138, 0, 0, 0, 205, 0, 0, 0, 138, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
30, 0, 0, 0, 0, 0, 0, 0,
205, 0, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
115, 105, 108, 101, 110, 116, 0, 0, 115, 105, 108, 101, 110, 116, 0, 0,
104, 111, 110, 100, 97, 78, 105, 100, 104, 111, 110, 100, 97, 78, 105, 100,
@@ -6008,14 +6060,16 @@ static const ::capnp::_::AlignedData<158> b_95551e5b1edaf451 = {
97, 110, 102, 100, 0, 0, 0, 0, 97, 110, 102, 100, 0, 0, 0, 0,
118, 111, 108, 107, 115, 119, 97, 103, 118, 111, 108, 107, 115, 119, 97, 103,
101, 110, 77, 113, 98, 69, 118, 111, 101, 110, 77, 113, 98, 69, 118, 111,
0, 0, 0, 0, 0, 0, 0, 0, } 0, 0, 0, 0, 0, 0, 0, 0,
99, 104, 114, 121, 115, 108, 101, 114,
67, 117, 115, 119, 0, 0, 0, 0, }
}; };
::capnp::word const* const bp_95551e5b1edaf451 = b_95551e5b1edaf451.words; ::capnp::word const* const bp_95551e5b1edaf451 = b_95551e5b1edaf451.words;
#if !CAPNP_LITE #if !CAPNP_LITE
static const uint16_t m_95551e5b1edaf451[] = {17, 27, 7, 9, 3, 6, 4, 18, 12, 20, 5, 1, 26, 8, 28, 24, 23, 13, 14, 19, 0, 11, 22, 10, 2, 16, 15, 25, 29, 21}; static const uint16_t m_95551e5b1edaf451[] = {17, 27, 7, 9, 30, 3, 6, 4, 18, 12, 20, 5, 1, 26, 8, 28, 24, 23, 13, 14, 19, 0, 11, 22, 10, 2, 16, 15, 25, 29, 21};
const ::capnp::_::RawSchema s_95551e5b1edaf451 = { const ::capnp::_::RawSchema s_95551e5b1edaf451 = {
0x95551e5b1edaf451, b_95551e5b1edaf451.words, 158, nullptr, m_95551e5b1edaf451, 0x95551e5b1edaf451, b_95551e5b1edaf451.words, 163, nullptr, m_95551e5b1edaf451,
0, 30, nullptr, nullptr, nullptr, { &s_95551e5b1edaf451, nullptr, nullptr, 0, 0, nullptr }, false 0, 31, nullptr, nullptr, nullptr, { &s_95551e5b1edaf451, nullptr, nullptr, 0, 0, nullptr }, false
}; };
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(SafetyModel_95551e5b1edaf451, 95551e5b1edaf451); CAPNP_DEFINE_ENUM(SafetyModel_95551e5b1edaf451, 95551e5b1edaf451);
@@ -6763,6 +6817,18 @@ constexpr ::capnp::_::RawSchema const* CarControl::HUDControl::_capnpPrivate::sc
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL #endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
// CarOutput
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CarOutput::_capnpPrivate::dataWordSize;
constexpr uint16_t CarOutput::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CarOutput::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CarOutput::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CarParams // CarParams
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL #if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CarParams::_capnpPrivate::dataWordSize; constexpr uint16_t CarParams::_capnpPrivate::dataWordSize;
+156 -18
View File
@@ -223,6 +223,7 @@ enum class AudibleAlert_f5a5e26c954e339e: uint16_t {
PROMPT_DISTRACTED, PROMPT_DISTRACTED,
}; };
CAPNP_DECLARE_ENUM(AudibleAlert, f5a5e26c954e339e); CAPNP_DECLARE_ENUM(AudibleAlert, f5a5e26c954e339e);
CAPNP_DECLARE_SCHEMA(d817d6655115ca85);
CAPNP_DECLARE_SCHEMA(8c69372490aaa9da); CAPNP_DECLARE_SCHEMA(8c69372490aaa9da);
CAPNP_DECLARE_SCHEMA(e836349c6056b0c9); CAPNP_DECLARE_SCHEMA(e836349c6056b0c9);
CAPNP_DECLARE_SCHEMA(b581b23b1c89dda3); CAPNP_DECLARE_SCHEMA(b581b23b1c89dda3);
@@ -263,6 +264,7 @@ enum class SafetyModel_95551e5b1edaf451: uint16_t {
BODY, BODY,
HYUNDAI_CANFD, HYUNDAI_CANFD,
VOLKSWAGEN_MQB_EVO, VOLKSWAGEN_MQB_EVO,
CHRYSLER_CUSW,
}; };
CAPNP_DECLARE_ENUM(SafetyModel, 95551e5b1edaf451); CAPNP_DECLARE_ENUM(SafetyModel, 95551e5b1edaf451);
CAPNP_DECLARE_SCHEMA(d661512be2def77f); CAPNP_DECLARE_SCHEMA(d661512be2def77f);
@@ -517,6 +519,21 @@ struct CarControl::HUDControl {
}; };
}; };
struct CarOutput {
CarOutput() = delete;
class Reader;
class Builder;
class Pipeline;
struct _capnpPrivate {
CAPNP_DECLARE_STRUCT_HEADER(d817d6655115ca85, 0, 1)
#if !CAPNP_LITE
static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; }
#endif // !CAPNP_LITE
};
};
struct CarParams { struct CarParams {
CarParams() = delete; CarParams() = delete;
@@ -1694,8 +1711,8 @@ public:
inline float getPitchDEPRECATED() const; inline float getPitchDEPRECATED() const;
inline bool hasActuatorsOutput() const; inline bool hasActuatorsOutputDEPRECATED() const;
inline ::cereal::CarControl::Actuators::Reader getActuatorsOutput() const; inline ::cereal::CarControl::Actuators::Reader getActuatorsOutputDEPRECATED() const;
inline bool getLatActive() const; inline bool getLatActive() const;
@@ -1781,12 +1798,12 @@ public:
inline float getPitchDEPRECATED(); inline float getPitchDEPRECATED();
inline void setPitchDEPRECATED(float value); inline void setPitchDEPRECATED(float value);
inline bool hasActuatorsOutput(); inline bool hasActuatorsOutputDEPRECATED();
inline ::cereal::CarControl::Actuators::Builder getActuatorsOutput(); inline ::cereal::CarControl::Actuators::Builder getActuatorsOutputDEPRECATED();
inline void setActuatorsOutput( ::cereal::CarControl::Actuators::Reader value); inline void setActuatorsOutputDEPRECATED( ::cereal::CarControl::Actuators::Reader value);
inline ::cereal::CarControl::Actuators::Builder initActuatorsOutput(); inline ::cereal::CarControl::Actuators::Builder initActuatorsOutputDEPRECATED();
inline void adoptActuatorsOutput(::capnp::Orphan< ::cereal::CarControl::Actuators>&& value); inline void adoptActuatorsOutputDEPRECATED(::capnp::Orphan< ::cereal::CarControl::Actuators>&& value);
inline ::capnp::Orphan< ::cereal::CarControl::Actuators> disownActuatorsOutput(); inline ::capnp::Orphan< ::cereal::CarControl::Actuators> disownActuatorsOutputDEPRECATED();
inline bool getLatActive(); inline bool getLatActive();
inline void setLatActive(bool value); inline void setLatActive(bool value);
@@ -1837,7 +1854,7 @@ public:
inline ::cereal::CarControl::CruiseControl::Pipeline getCruiseControl(); inline ::cereal::CarControl::CruiseControl::Pipeline getCruiseControl();
inline ::cereal::CarControl::HUDControl::Pipeline getHudControl(); inline ::cereal::CarControl::HUDControl::Pipeline getHudControl();
inline ::cereal::CarControl::Actuators::Pipeline getActuators(); inline ::cereal::CarControl::Actuators::Pipeline getActuators();
inline ::cereal::CarControl::Actuators::Pipeline getActuatorsOutput(); inline ::cereal::CarControl::Actuators::Pipeline getActuatorsOutputDEPRECATED();
private: private:
::capnp::AnyPointer::Pipeline _typeless; ::capnp::AnyPointer::Pipeline _typeless;
friend class ::capnp::PipelineHook; friend class ::capnp::PipelineHook;
@@ -2179,6 +2196,88 @@ private:
}; };
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
class CarOutput::Reader {
public:
typedef CarOutput 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 bool hasActuatorsOutput() const;
inline ::cereal::CarControl::Actuators::Reader getActuatorsOutput() const;
private:
::capnp::_::StructReader _reader;
template <typename, ::capnp::Kind>
friend struct ::capnp::ToDynamic_;
template <typename, ::capnp::Kind>
friend struct ::capnp::_::PointerHelpers;
template <typename, ::capnp::Kind>
friend struct ::capnp::List;
friend class ::capnp::MessageBuilder;
friend class ::capnp::Orphanage;
};
class CarOutput::Builder {
public:
typedef CarOutput 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 bool hasActuatorsOutput();
inline ::cereal::CarControl::Actuators::Builder getActuatorsOutput();
inline void setActuatorsOutput( ::cereal::CarControl::Actuators::Reader value);
inline ::cereal::CarControl::Actuators::Builder initActuatorsOutput();
inline void adoptActuatorsOutput(::capnp::Orphan< ::cereal::CarControl::Actuators>&& value);
inline ::capnp::Orphan< ::cereal::CarControl::Actuators> disownActuatorsOutput();
private:
::capnp::_::StructBuilder _builder;
template <typename, ::capnp::Kind>
friend struct ::capnp::ToDynamic_;
friend class ::capnp::Orphanage;
template <typename, ::capnp::Kind>
friend struct ::capnp::_::PointerHelpers;
};
#if !CAPNP_LITE
class CarOutput::Pipeline {
public:
typedef CarOutput Pipelines;
inline Pipeline(decltype(nullptr)): _typeless(nullptr) {}
inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless)
: _typeless(kj::mv(typeless)) {}
inline ::cereal::CarControl::Actuators::Pipeline getActuatorsOutput();
private:
::capnp::AnyPointer::Pipeline _typeless;
friend class ::capnp::PipelineHook;
template <typename, ::capnp::Kind>
friend struct ::capnp::ToDynamic_;
};
#endif // !CAPNP_LITE
class CarParams::Reader { class CarParams::Reader {
public: public:
typedef CarParams Reads; typedef CarParams Reads;
@@ -5385,41 +5484,41 @@ inline void CarControl::Builder::setPitchDEPRECATED(float value) {
::capnp::bounded<5>() * ::capnp::ELEMENTS, value); ::capnp::bounded<5>() * ::capnp::ELEMENTS, value);
} }
inline bool CarControl::Reader::hasActuatorsOutput() const { inline bool CarControl::Reader::hasActuatorsOutputDEPRECATED() const {
return !_reader.getPointerField( return !_reader.getPointerField(
::capnp::bounded<3>() * ::capnp::POINTERS).isNull(); ::capnp::bounded<3>() * ::capnp::POINTERS).isNull();
} }
inline bool CarControl::Builder::hasActuatorsOutput() { inline bool CarControl::Builder::hasActuatorsOutputDEPRECATED() {
return !_builder.getPointerField( return !_builder.getPointerField(
::capnp::bounded<3>() * ::capnp::POINTERS).isNull(); ::capnp::bounded<3>() * ::capnp::POINTERS).isNull();
} }
inline ::cereal::CarControl::Actuators::Reader CarControl::Reader::getActuatorsOutput() const { inline ::cereal::CarControl::Actuators::Reader CarControl::Reader::getActuatorsOutputDEPRECATED() const {
return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::get(_reader.getPointerField( return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::get(_reader.getPointerField(
::capnp::bounded<3>() * ::capnp::POINTERS)); ::capnp::bounded<3>() * ::capnp::POINTERS));
} }
inline ::cereal::CarControl::Actuators::Builder CarControl::Builder::getActuatorsOutput() { inline ::cereal::CarControl::Actuators::Builder CarControl::Builder::getActuatorsOutputDEPRECATED() {
return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::get(_builder.getPointerField( return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::get(_builder.getPointerField(
::capnp::bounded<3>() * ::capnp::POINTERS)); ::capnp::bounded<3>() * ::capnp::POINTERS));
} }
#if !CAPNP_LITE #if !CAPNP_LITE
inline ::cereal::CarControl::Actuators::Pipeline CarControl::Pipeline::getActuatorsOutput() { inline ::cereal::CarControl::Actuators::Pipeline CarControl::Pipeline::getActuatorsOutputDEPRECATED() {
return ::cereal::CarControl::Actuators::Pipeline(_typeless.getPointerField(3)); return ::cereal::CarControl::Actuators::Pipeline(_typeless.getPointerField(3));
} }
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
inline void CarControl::Builder::setActuatorsOutput( ::cereal::CarControl::Actuators::Reader value) { inline void CarControl::Builder::setActuatorsOutputDEPRECATED( ::cereal::CarControl::Actuators::Reader value) {
::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::set(_builder.getPointerField( ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::set(_builder.getPointerField(
::capnp::bounded<3>() * ::capnp::POINTERS), value); ::capnp::bounded<3>() * ::capnp::POINTERS), value);
} }
inline ::cereal::CarControl::Actuators::Builder CarControl::Builder::initActuatorsOutput() { inline ::cereal::CarControl::Actuators::Builder CarControl::Builder::initActuatorsOutputDEPRECATED() {
return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::init(_builder.getPointerField( return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::init(_builder.getPointerField(
::capnp::bounded<3>() * ::capnp::POINTERS)); ::capnp::bounded<3>() * ::capnp::POINTERS));
} }
inline void CarControl::Builder::adoptActuatorsOutput( inline void CarControl::Builder::adoptActuatorsOutputDEPRECATED(
::capnp::Orphan< ::cereal::CarControl::Actuators>&& value) { ::capnp::Orphan< ::cereal::CarControl::Actuators>&& value) {
::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::adopt(_builder.getPointerField( ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::adopt(_builder.getPointerField(
::capnp::bounded<3>() * ::capnp::POINTERS), kj::mv(value)); ::capnp::bounded<3>() * ::capnp::POINTERS), kj::mv(value));
} }
inline ::capnp::Orphan< ::cereal::CarControl::Actuators> CarControl::Builder::disownActuatorsOutput() { inline ::capnp::Orphan< ::cereal::CarControl::Actuators> CarControl::Builder::disownActuatorsOutputDEPRECATED() {
return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::disown(_builder.getPointerField( return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::disown(_builder.getPointerField(
::capnp::bounded<3>() * ::capnp::POINTERS)); ::capnp::bounded<3>() * ::capnp::POINTERS));
} }
@@ -5892,6 +5991,45 @@ inline void CarControl::HUDControl::Builder::setLeftLaneDepart(bool value) {
::capnp::bounded<6>() * ::capnp::ELEMENTS, value); ::capnp::bounded<6>() * ::capnp::ELEMENTS, value);
} }
inline bool CarOutput::Reader::hasActuatorsOutput() const {
return !_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
}
inline bool CarOutput::Builder::hasActuatorsOutput() {
return !_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
}
inline ::cereal::CarControl::Actuators::Reader CarOutput::Reader::getActuatorsOutput() const {
return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::get(_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline ::cereal::CarControl::Actuators::Builder CarOutput::Builder::getActuatorsOutput() {
return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::get(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
#if !CAPNP_LITE
inline ::cereal::CarControl::Actuators::Pipeline CarOutput::Pipeline::getActuatorsOutput() {
return ::cereal::CarControl::Actuators::Pipeline(_typeless.getPointerField(0));
}
#endif // !CAPNP_LITE
inline void CarOutput::Builder::setActuatorsOutput( ::cereal::CarControl::Actuators::Reader value) {
::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::set(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), value);
}
inline ::cereal::CarControl::Actuators::Builder CarOutput::Builder::initActuatorsOutput() {
return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::init(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline void CarOutput::Builder::adoptActuatorsOutput(
::capnp::Orphan< ::cereal::CarControl::Actuators>&& value) {
::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::adopt(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::cereal::CarControl::Actuators> CarOutput::Builder::disownActuatorsOutput() {
return ::capnp::_::PointerHelpers< ::cereal::CarControl::Actuators>::disown(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline bool CarParams::Reader::hasCarName() const { inline bool CarParams::Reader::hasCarName() const {
return !_reader.getPointerField( return !_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); ::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
File diff suppressed because it is too large Load Diff
+149 -37
View File
@@ -41,6 +41,7 @@ enum class DeviceType_9d5d7238eba86608: uint16_t {
TICI, TICI,
PC, PC,
TIZI, TIZI,
MICI,
}; };
CAPNP_DECLARE_ENUM(DeviceType, 9d5d7238eba86608); CAPNP_DECLARE_ENUM(DeviceType, 9d5d7238eba86608);
CAPNP_DECLARE_SCHEMA(e673e8725cdff0ad); CAPNP_DECLARE_SCHEMA(e673e8725cdff0ad);
@@ -589,7 +590,7 @@ struct InitData {
struct IosBuildInfo; struct IosBuildInfo;
struct _capnpPrivate { struct _capnpPrivate {
CAPNP_DECLARE_STRUCT_HEADER(e71008caeb3fb65c, 2, 17) CAPNP_DECLARE_STRUCT_HEADER(e71008caeb3fb65c, 2, 18)
#if !CAPNP_LITE #if !CAPNP_LITE
static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; }
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
@@ -2516,6 +2517,7 @@ struct Event {
CUSTOM_RESERVED_RAW_DATA0, CUSTOM_RESERVED_RAW_DATA0,
CUSTOM_RESERVED_RAW_DATA1, CUSTOM_RESERVED_RAW_DATA1,
CUSTOM_RESERVED_RAW_DATA2, CUSTOM_RESERVED_RAW_DATA2,
CAR_OUTPUT,
}; };
struct _capnpPrivate { struct _capnpPrivate {
@@ -2806,6 +2808,9 @@ public:
inline ::uint64_t getWallTimeNanos() const; inline ::uint64_t getWallTimeNanos() const;
inline bool hasGitCommitDate() const;
inline ::capnp::Text::Reader getGitCommitDate() const;
private: private:
::capnp::_::StructReader _reader; ::capnp::_::StructReader _reader;
template <typename, ::capnp::Kind> template <typename, ::capnp::Kind>
@@ -2966,6 +2971,13 @@ public:
inline ::uint64_t getWallTimeNanos(); inline ::uint64_t getWallTimeNanos();
inline void setWallTimeNanos( ::uint64_t value); inline void setWallTimeNanos( ::uint64_t value);
inline bool hasGitCommitDate();
inline ::capnp::Text::Builder getGitCommitDate();
inline void setGitCommitDate( ::capnp::Text::Reader value);
inline ::capnp::Text::Builder initGitCommitDate(unsigned int size);
inline void adoptGitCommitDate(::capnp::Orphan< ::capnp::Text>&& value);
inline ::capnp::Orphan< ::capnp::Text> disownGitCommitDate();
private: private:
::capnp::_::StructBuilder _builder; ::capnp::_::StructBuilder _builder;
template <typename, ::capnp::Kind> template <typename, ::capnp::Kind>
@@ -4622,7 +4634,7 @@ public:
inline float getBearingDeg() const; inline float getBearingDeg() const;
inline float getAccuracy() const; inline float getHorizontalAccuracy() const;
inline ::int64_t getUnixTimestampMillis() const; inline ::int64_t getUnixTimestampMillis() const;
@@ -4683,8 +4695,8 @@ public:
inline float getBearingDeg(); inline float getBearingDeg();
inline void setBearingDeg(float value); inline void setBearingDeg(float value);
inline float getAccuracy(); inline float getHorizontalAccuracy();
inline void setAccuracy(float value); inline void setHorizontalAccuracy(float value);
inline ::int64_t getUnixTimestampMillis(); inline ::int64_t getUnixTimestampMillis();
inline void setUnixTimestampMillis( ::int64_t value); inline void setUnixTimestampMillis( ::int64_t value);
@@ -4911,7 +4923,7 @@ public:
inline float getBatteryTempCDEPRECATED() const; inline float getBatteryTempCDEPRECATED() const;
inline float getAmbientTempC() const; inline float getAmbientTempCDEPRECATED() const;
inline bool hasNetworkInfo() const; inline bool hasNetworkInfo() const;
inline ::cereal::DeviceState::NetworkInfo::Reader getNetworkInfo() const; inline ::cereal::DeviceState::NetworkInfo::Reader getNetworkInfo() const;
@@ -5080,8 +5092,8 @@ public:
inline float getBatteryTempCDEPRECATED(); inline float getBatteryTempCDEPRECATED();
inline void setBatteryTempCDEPRECATED(float value); inline void setBatteryTempCDEPRECATED(float value);
inline float getAmbientTempC(); inline float getAmbientTempCDEPRECATED();
inline void setAmbientTempC(float value); inline void setAmbientTempCDEPRECATED(float value);
inline bool hasNetworkInfo(); inline bool hasNetworkInfo();
inline ::cereal::DeviceState::NetworkInfo::Builder getNetworkInfo(); inline ::cereal::DeviceState::NetworkInfo::Builder getNetworkInfo();
@@ -15195,15 +15207,15 @@ public:
} }
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
inline ::uint64_t getBootTimeNanos() const; inline ::uint64_t getBootTimeNanosDEPRECATED() const;
inline ::uint64_t getMonotonicNanos() const; inline ::uint64_t getMonotonicNanosDEPRECATED() const;
inline ::uint64_t getMonotonicRawNanos() const; inline ::uint64_t getMonotonicRawNanosDEPRECATD() const;
inline ::uint64_t getWallTimeNanos() const; inline ::uint64_t getWallTimeNanos() const;
inline ::uint64_t getModemUptimeMillis() const; inline ::uint64_t getModemUptimeMillisDEPRECATED() const;
private: private:
::capnp::_::StructReader _reader; ::capnp::_::StructReader _reader;
@@ -15233,20 +15245,20 @@ public:
inline ::kj::StringTree toString() const { return asReader().toString(); } inline ::kj::StringTree toString() const { return asReader().toString(); }
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
inline ::uint64_t getBootTimeNanos(); inline ::uint64_t getBootTimeNanosDEPRECATED();
inline void setBootTimeNanos( ::uint64_t value); inline void setBootTimeNanosDEPRECATED( ::uint64_t value);
inline ::uint64_t getMonotonicNanos(); inline ::uint64_t getMonotonicNanosDEPRECATED();
inline void setMonotonicNanos( ::uint64_t value); inline void setMonotonicNanosDEPRECATED( ::uint64_t value);
inline ::uint64_t getMonotonicRawNanos(); inline ::uint64_t getMonotonicRawNanosDEPRECATD();
inline void setMonotonicRawNanos( ::uint64_t value); inline void setMonotonicRawNanosDEPRECATD( ::uint64_t value);
inline ::uint64_t getWallTimeNanos(); inline ::uint64_t getWallTimeNanos();
inline void setWallTimeNanos( ::uint64_t value); inline void setWallTimeNanos( ::uint64_t value);
inline ::uint64_t getModemUptimeMillis(); inline ::uint64_t getModemUptimeMillisDEPRECATED();
inline void setModemUptimeMillis( ::uint64_t value); inline void setModemUptimeMillisDEPRECATED( ::uint64_t value);
private: private:
::capnp::_::StructBuilder _builder; ::capnp::_::StructBuilder _builder;
@@ -19247,6 +19259,10 @@ public:
inline bool hasCustomReservedRawData2() const; inline bool hasCustomReservedRawData2() const;
inline ::capnp::Data::Reader getCustomReservedRawData2() const; inline ::capnp::Data::Reader getCustomReservedRawData2() const;
inline bool isCarOutput() const;
inline bool hasCarOutput() const;
inline ::cereal::CarOutput::Reader getCarOutput() const;
private: private:
::capnp::_::StructReader _reader; ::capnp::_::StructReader _reader;
template <typename, ::capnp::Kind> template <typename, ::capnp::Kind>
@@ -20282,6 +20298,14 @@ public:
inline void adoptCustomReservedRawData2(::capnp::Orphan< ::capnp::Data>&& value); inline void adoptCustomReservedRawData2(::capnp::Orphan< ::capnp::Data>&& value);
inline ::capnp::Orphan< ::capnp::Data> disownCustomReservedRawData2(); inline ::capnp::Orphan< ::capnp::Data> disownCustomReservedRawData2();
inline bool isCarOutput();
inline bool hasCarOutput();
inline ::cereal::CarOutput::Builder getCarOutput();
inline void setCarOutput( ::cereal::CarOutput::Reader value);
inline ::cereal::CarOutput::Builder initCarOutput();
inline void adoptCarOutput(::capnp::Orphan< ::cereal::CarOutput>&& value);
inline ::capnp::Orphan< ::cereal::CarOutput> disownCarOutput();
private: private:
::capnp::_::StructBuilder _builder; ::capnp::_::StructBuilder _builder;
template <typename, ::capnp::Kind> template <typename, ::capnp::Kind>
@@ -21195,6 +21219,40 @@ inline void InitData::Builder::setWallTimeNanos( ::uint64_t value) {
::capnp::bounded<1>() * ::capnp::ELEMENTS, value); ::capnp::bounded<1>() * ::capnp::ELEMENTS, value);
} }
inline bool InitData::Reader::hasGitCommitDate() const {
return !_reader.getPointerField(
::capnp::bounded<17>() * ::capnp::POINTERS).isNull();
}
inline bool InitData::Builder::hasGitCommitDate() {
return !_builder.getPointerField(
::capnp::bounded<17>() * ::capnp::POINTERS).isNull();
}
inline ::capnp::Text::Reader InitData::Reader::getGitCommitDate() const {
return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField(
::capnp::bounded<17>() * ::capnp::POINTERS));
}
inline ::capnp::Text::Builder InitData::Builder::getGitCommitDate() {
return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField(
::capnp::bounded<17>() * ::capnp::POINTERS));
}
inline void InitData::Builder::setGitCommitDate( ::capnp::Text::Reader value) {
::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField(
::capnp::bounded<17>() * ::capnp::POINTERS), value);
}
inline ::capnp::Text::Builder InitData::Builder::initGitCommitDate(unsigned int size) {
return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField(
::capnp::bounded<17>() * ::capnp::POINTERS), size);
}
inline void InitData::Builder::adoptGitCommitDate(
::capnp::Orphan< ::capnp::Text>&& value) {
::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField(
::capnp::bounded<17>() * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::capnp::Text> InitData::Builder::disownGitCommitDate() {
return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField(
::capnp::bounded<17>() * ::capnp::POINTERS));
}
inline bool InitData::PandaInfo::Reader::getHasPanda() const { inline bool InitData::PandaInfo::Reader::getHasPanda() const {
return _reader.getDataField<bool>( return _reader.getDataField<bool>(
::capnp::bounded<0>() * ::capnp::ELEMENTS); ::capnp::bounded<0>() * ::capnp::ELEMENTS);
@@ -23994,16 +24052,16 @@ inline void GpsLocationData::Builder::setBearingDeg(float value) {
::capnp::bounded<8>() * ::capnp::ELEMENTS, value); ::capnp::bounded<8>() * ::capnp::ELEMENTS, value);
} }
inline float GpsLocationData::Reader::getAccuracy() const { inline float GpsLocationData::Reader::getHorizontalAccuracy() const {
return _reader.getDataField<float>( return _reader.getDataField<float>(
::capnp::bounded<9>() * ::capnp::ELEMENTS); ::capnp::bounded<9>() * ::capnp::ELEMENTS);
} }
inline float GpsLocationData::Builder::getAccuracy() { inline float GpsLocationData::Builder::getHorizontalAccuracy() {
return _builder.getDataField<float>( return _builder.getDataField<float>(
::capnp::bounded<9>() * ::capnp::ELEMENTS); ::capnp::bounded<9>() * ::capnp::ELEMENTS);
} }
inline void GpsLocationData::Builder::setAccuracy(float value) { inline void GpsLocationData::Builder::setHorizontalAccuracy(float value) {
_builder.setDataField<float>( _builder.setDataField<float>(
::capnp::bounded<9>() * ::capnp::ELEMENTS, value); ::capnp::bounded<9>() * ::capnp::ELEMENTS, value);
} }
@@ -24680,16 +24738,16 @@ inline void DeviceState::Builder::setBatteryTempCDEPRECATED(float value) {
::capnp::bounded<16>() * ::capnp::ELEMENTS, value); ::capnp::bounded<16>() * ::capnp::ELEMENTS, value);
} }
inline float DeviceState::Reader::getAmbientTempC() const { inline float DeviceState::Reader::getAmbientTempCDEPRECATED() const {
return _reader.getDataField<float>( return _reader.getDataField<float>(
::capnp::bounded<17>() * ::capnp::ELEMENTS); ::capnp::bounded<17>() * ::capnp::ELEMENTS);
} }
inline float DeviceState::Builder::getAmbientTempC() { inline float DeviceState::Builder::getAmbientTempCDEPRECATED() {
return _builder.getDataField<float>( return _builder.getDataField<float>(
::capnp::bounded<17>() * ::capnp::ELEMENTS); ::capnp::bounded<17>() * ::capnp::ELEMENTS);
} }
inline void DeviceState::Builder::setAmbientTempC(float value) { inline void DeviceState::Builder::setAmbientTempCDEPRECATED(float value) {
_builder.setDataField<float>( _builder.setDataField<float>(
::capnp::bounded<17>() * ::capnp::ELEMENTS, value); ::capnp::bounded<17>() * ::capnp::ELEMENTS, value);
} }
@@ -41644,44 +41702,44 @@ inline void QcomGnss::DrSvPolyReport::Builder::setGpsTow(double value) {
::capnp::bounded<7>() * ::capnp::ELEMENTS, value); ::capnp::bounded<7>() * ::capnp::ELEMENTS, value);
} }
inline ::uint64_t Clocks::Reader::getBootTimeNanos() const { inline ::uint64_t Clocks::Reader::getBootTimeNanosDEPRECATED() const {
return _reader.getDataField< ::uint64_t>( return _reader.getDataField< ::uint64_t>(
::capnp::bounded<0>() * ::capnp::ELEMENTS); ::capnp::bounded<0>() * ::capnp::ELEMENTS);
} }
inline ::uint64_t Clocks::Builder::getBootTimeNanos() { inline ::uint64_t Clocks::Builder::getBootTimeNanosDEPRECATED() {
return _builder.getDataField< ::uint64_t>( return _builder.getDataField< ::uint64_t>(
::capnp::bounded<0>() * ::capnp::ELEMENTS); ::capnp::bounded<0>() * ::capnp::ELEMENTS);
} }
inline void Clocks::Builder::setBootTimeNanos( ::uint64_t value) { inline void Clocks::Builder::setBootTimeNanosDEPRECATED( ::uint64_t value) {
_builder.setDataField< ::uint64_t>( _builder.setDataField< ::uint64_t>(
::capnp::bounded<0>() * ::capnp::ELEMENTS, value); ::capnp::bounded<0>() * ::capnp::ELEMENTS, value);
} }
inline ::uint64_t Clocks::Reader::getMonotonicNanos() const { inline ::uint64_t Clocks::Reader::getMonotonicNanosDEPRECATED() const {
return _reader.getDataField< ::uint64_t>( return _reader.getDataField< ::uint64_t>(
::capnp::bounded<1>() * ::capnp::ELEMENTS); ::capnp::bounded<1>() * ::capnp::ELEMENTS);
} }
inline ::uint64_t Clocks::Builder::getMonotonicNanos() { inline ::uint64_t Clocks::Builder::getMonotonicNanosDEPRECATED() {
return _builder.getDataField< ::uint64_t>( return _builder.getDataField< ::uint64_t>(
::capnp::bounded<1>() * ::capnp::ELEMENTS); ::capnp::bounded<1>() * ::capnp::ELEMENTS);
} }
inline void Clocks::Builder::setMonotonicNanos( ::uint64_t value) { inline void Clocks::Builder::setMonotonicNanosDEPRECATED( ::uint64_t value) {
_builder.setDataField< ::uint64_t>( _builder.setDataField< ::uint64_t>(
::capnp::bounded<1>() * ::capnp::ELEMENTS, value); ::capnp::bounded<1>() * ::capnp::ELEMENTS, value);
} }
inline ::uint64_t Clocks::Reader::getMonotonicRawNanos() const { inline ::uint64_t Clocks::Reader::getMonotonicRawNanosDEPRECATD() const {
return _reader.getDataField< ::uint64_t>( return _reader.getDataField< ::uint64_t>(
::capnp::bounded<2>() * ::capnp::ELEMENTS); ::capnp::bounded<2>() * ::capnp::ELEMENTS);
} }
inline ::uint64_t Clocks::Builder::getMonotonicRawNanos() { inline ::uint64_t Clocks::Builder::getMonotonicRawNanosDEPRECATD() {
return _builder.getDataField< ::uint64_t>( return _builder.getDataField< ::uint64_t>(
::capnp::bounded<2>() * ::capnp::ELEMENTS); ::capnp::bounded<2>() * ::capnp::ELEMENTS);
} }
inline void Clocks::Builder::setMonotonicRawNanos( ::uint64_t value) { inline void Clocks::Builder::setMonotonicRawNanosDEPRECATD( ::uint64_t value) {
_builder.setDataField< ::uint64_t>( _builder.setDataField< ::uint64_t>(
::capnp::bounded<2>() * ::capnp::ELEMENTS, value); ::capnp::bounded<2>() * ::capnp::ELEMENTS, value);
} }
@@ -41700,16 +41758,16 @@ inline void Clocks::Builder::setWallTimeNanos( ::uint64_t value) {
::capnp::bounded<3>() * ::capnp::ELEMENTS, value); ::capnp::bounded<3>() * ::capnp::ELEMENTS, value);
} }
inline ::uint64_t Clocks::Reader::getModemUptimeMillis() const { inline ::uint64_t Clocks::Reader::getModemUptimeMillisDEPRECATED() const {
return _reader.getDataField< ::uint64_t>( return _reader.getDataField< ::uint64_t>(
::capnp::bounded<4>() * ::capnp::ELEMENTS); ::capnp::bounded<4>() * ::capnp::ELEMENTS);
} }
inline ::uint64_t Clocks::Builder::getModemUptimeMillis() { inline ::uint64_t Clocks::Builder::getModemUptimeMillisDEPRECATED() {
return _builder.getDataField< ::uint64_t>( return _builder.getDataField< ::uint64_t>(
::capnp::bounded<4>() * ::capnp::ELEMENTS); ::capnp::bounded<4>() * ::capnp::ELEMENTS);
} }
inline void Clocks::Builder::setModemUptimeMillis( ::uint64_t value) { inline void Clocks::Builder::setModemUptimeMillisDEPRECATED( ::uint64_t value) {
_builder.setDataField< ::uint64_t>( _builder.setDataField< ::uint64_t>(
::capnp::bounded<4>() * ::capnp::ELEMENTS, value); ::capnp::bounded<4>() * ::capnp::ELEMENTS, value);
} }
@@ -53107,6 +53165,60 @@ inline ::capnp::Orphan< ::capnp::Data> Event::Builder::disownCustomReservedRawDa
::capnp::bounded<0>() * ::capnp::POINTERS)); ::capnp::bounded<0>() * ::capnp::POINTERS));
} }
inline bool Event::Reader::isCarOutput() const {
return which() == Event::CAR_OUTPUT;
}
inline bool Event::Builder::isCarOutput() {
return which() == Event::CAR_OUTPUT;
}
inline bool Event::Reader::hasCarOutput() const {
if (which() != Event::CAR_OUTPUT) return false;
return !_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
}
inline bool Event::Builder::hasCarOutput() {
if (which() != Event::CAR_OUTPUT) return false;
return !_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
}
inline ::cereal::CarOutput::Reader Event::Reader::getCarOutput() const {
KJ_IREQUIRE((which() == Event::CAR_OUTPUT),
"Must check which() before get()ing a union member.");
return ::capnp::_::PointerHelpers< ::cereal::CarOutput>::get(_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline ::cereal::CarOutput::Builder Event::Builder::getCarOutput() {
KJ_IREQUIRE((which() == Event::CAR_OUTPUT),
"Must check which() before get()ing a union member.");
return ::capnp::_::PointerHelpers< ::cereal::CarOutput>::get(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline void Event::Builder::setCarOutput( ::cereal::CarOutput::Reader value) {
_builder.setDataField<Event::Which>(
::capnp::bounded<4>() * ::capnp::ELEMENTS, Event::CAR_OUTPUT);
::capnp::_::PointerHelpers< ::cereal::CarOutput>::set(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), value);
}
inline ::cereal::CarOutput::Builder Event::Builder::initCarOutput() {
_builder.setDataField<Event::Which>(
::capnp::bounded<4>() * ::capnp::ELEMENTS, Event::CAR_OUTPUT);
return ::capnp::_::PointerHelpers< ::cereal::CarOutput>::init(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline void Event::Builder::adoptCarOutput(
::capnp::Orphan< ::cereal::CarOutput>&& value) {
_builder.setDataField<Event::Which>(
::capnp::bounded<4>() * ::capnp::ELEMENTS, Event::CAR_OUTPUT);
::capnp::_::PointerHelpers< ::cereal::CarOutput>::adopt(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::cereal::CarOutput> Event::Builder::disownCarOutput() {
KJ_IREQUIRE((which() == Event::CAR_OUTPUT),
"Must check which() before get()ing a union member.");
return ::capnp::_::PointerHelpers< ::cereal::CarOutput>::disown(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
} // namespace } // namespace
CAPNP_END_HEADER CAPNP_END_HEADER
Binary file not shown.
+12 -8
View File
@@ -33,6 +33,7 @@ struct InitData {
deviceType @3 :DeviceType; deviceType @3 :DeviceType;
version @4 :Text; version @4 :Text;
gitCommit @10 :Text; gitCommit @10 :Text;
gitCommitDate @21 :Text;
gitBranch @11 :Text; gitBranch @11 :Text;
gitRemote @13 :Text; gitRemote @13 :Text;
@@ -56,6 +57,7 @@ struct InitData {
tici @4; tici @4;
pc @5; pc @5;
tizi @6; tizi @6;
mici @7;
} }
struct PandaInfo { struct PandaInfo {
@@ -267,8 +269,8 @@ struct GpsLocationData {
# Represents heading in degrees. # Represents heading in degrees.
bearingDeg @5 :Float32; bearingDeg @5 :Float32;
# Represents expected accuracy in meters. (presumably 1 sigma?) # Represents expected horizontal accuracy in meters.
accuracy @6 :Float32; horizontalAccuracy @6 :Float32;
unixTimestampMillis @7 :Int64; unixTimestampMillis @7 :Int64;
@@ -356,7 +358,6 @@ struct DeviceState @0xa4d8b5af2aa492eb {
cpuTempC @26 :List(Float32); cpuTempC @26 :List(Float32);
gpuTempC @27 :List(Float32); gpuTempC @27 :List(Float32);
memoryTempC @28 :Float32; memoryTempC @28 :Float32;
ambientTempC @30 :Float32;
nvmeTempC @35 :List(Float32); nvmeTempC @35 :List(Float32);
modemTempC @36 :List(Float32); modemTempC @36 :List(Float32);
pmicTempC @39 :List(Float32); pmicTempC @39 :List(Float32);
@@ -429,6 +430,7 @@ struct DeviceState @0xa4d8b5af2aa492eb {
chargingErrorDEPRECATED @17 :Bool; chargingErrorDEPRECATED @17 :Bool;
chargingDisabledDEPRECATED @18 :Bool; chargingDisabledDEPRECATED @18 :Bool;
usbOnlineDEPRECATED @12 :Bool; usbOnlineDEPRECATED @12 :Bool;
ambientTempCDEPRECATED @30 :Float32;
} }
struct PandaState @0xa7649e2575e4591e { struct PandaState @0xa7649e2575e4591e {
@@ -1877,11 +1879,12 @@ struct QcomGnss @0xde94674b07ae51c1 {
} }
struct Clocks { struct Clocks {
bootTimeNanos @0 :UInt64; wallTimeNanos @3 :UInt64; # unix epoch time
monotonicNanos @1 :UInt64;
monotonicRawNanos @2 :UInt64; bootTimeNanosDEPRECATED @0 :UInt64;
wallTimeNanos @3 :UInt64; monotonicNanosDEPRECATED @1 :UInt64;
modemUptimeMillis @4 :UInt64; monotonicRawNanosDEPRECATD @2 :UInt64;
modemUptimeMillisDEPRECATED @4 :UInt64;
} }
struct LiveMpcData { struct LiveMpcData {
@@ -2248,6 +2251,7 @@ struct Event {
liveCalibration @19 :LiveCalibrationData; liveCalibration @19 :LiveCalibrationData;
carState @22 :Car.CarState; carState @22 :Car.CarState;
carControl @23 :Car.CarControl; carControl @23 :Car.CarControl;
carOutput @127 :Car.CarOutput;
longitudinalPlan @24 :LongitudinalPlan; longitudinalPlan @24 :LongitudinalPlan;
uiPlan @106 :UiPlan; uiPlan @106 :UiPlan;
ubloxGnss @34 :UbloxGnss; ubloxGnss @34 :UbloxGnss;
+82 -69
View File
@@ -22,7 +22,6 @@ assert delete_fake_prefix
assert wait_for_one_event assert wait_for_one_event
NO_TRAVERSAL_LIMIT = 2**64-1 NO_TRAVERSAL_LIMIT = 2**64-1
AVG_FREQ_HISTORY = 100
context = Context() context = Context()
@@ -117,14 +116,14 @@ def recv_sock(sock: SubSocket, wait: bool = False) -> Optional[capnp.lib.capnp._
while 1: while 1:
if wait and dat is None: if wait and dat is None:
rcv = sock.receive() recv = sock.receive()
else: else:
rcv = sock.receive(non_blocking=True) recv = sock.receive(non_blocking=True)
if rcv is None: # Timeout hit if recv is None: # Timeout hit
break break
dat = rcv dat = recv
if dat is not None: if dat is not None:
dat = log_from_bytes(dat) dat = log_from_bytes(dat)
@@ -155,55 +154,76 @@ def recv_one_retry(sock: SubSocket) -> capnp.lib.capnp._DynamicStructReader:
class SubMaster: class SubMaster:
def __init__(self, services: List[str], poll: Optional[List[str]] = None, def __init__(self, services: List[str], poll: Optional[str] = None,
ignore_alive: Optional[List[str]] = None, ignore_avg_freq: Optional[List[str]] = None, ignore_alive: Optional[List[str]] = None, ignore_avg_freq: Optional[List[str]] = None,
ignore_valid: Optional[List[str]] = None, addr: str = "127.0.0.1"): ignore_valid: Optional[List[str]] = None, addr: str = "127.0.0.1", frequency: Optional[float] = None):
self.frame = -1 self.frame = -1
self.seen = {s: False for s in services}
self.updated = {s: False for s in services} self.updated = {s: False for s in services}
self.rcv_time = {s: 0. for s in services} self.recv_time = {s: 0. for s in services}
self.rcv_frame = {s: 0 for s in services} self.recv_frame = {s: 0 for s in services}
self.alive = {s: False for s in services} self.alive = {s: False for s in services}
self.freq_ok = {s: False for s in services} self.freq_ok = {s: False for s in services}
self.recv_dts: Dict[str, Deque[float]] = {s: deque(maxlen=AVG_FREQ_HISTORY) for s in services} self.recv_dts: Dict[str, Deque[float]] = {}
self.sock = {} self.sock = {}
self.freq = {}
self.data = {} self.data = {}
self.valid = {} self.valid = {}
self.logMonoTime = {} self.logMonoTime = {}
self.max_freq = {}
self.min_freq = {}
self.poller = Poller() self.poller = Poller()
self.non_polled_services = [s for s in services if poll is not None and polled_services = set([poll, ] if poll is not None else services)
len(poll) and s not in poll] self.non_polled_services = set(services) - polled_services
self.ignore_average_freq = [] if ignore_avg_freq is None else ignore_avg_freq self.ignore_average_freq = [] if ignore_avg_freq is None else ignore_avg_freq
self.ignore_alive = [] if ignore_alive is None else ignore_alive self.ignore_alive = [] if ignore_alive is None else ignore_alive
self.ignore_valid = [] if ignore_valid is None else ignore_valid self.ignore_valid = [] if ignore_valid is None else ignore_valid
self.simulation = bool(int(os.getenv("SIMULATION", "0"))) if bool(int(os.getenv("SIMULATION", "0"))):
self.ignore_alive = services
self.ignore_average_freq = services
# if freq and poll aren't specified, assume the max to be conservative
assert frequency is None or poll is None, "Do not specify 'frequency' - frequency of the polled service will be used."
self.update_freq = frequency or max([SERVICE_LIST[s].frequency for s in polled_services])
for s in services: for s in services:
if addr is not None: p = self.poller if s not in self.non_polled_services else None
p = self.poller if s not in self.non_polled_services else None self.sock[s] = sub_sock(s, poller=p, addr=addr, conflate=True)
self.sock[s] = sub_sock(s, poller=p, addr=addr, conflate=True)
self.freq[s] = SERVICE_LIST[s].frequency
try: try:
data = new_message(s) data = new_message(s)
except capnp.lib.capnp.KjException: # pylint: disable=c-extension-no-member except capnp.lib.capnp.KjException:
data = new_message(s, 0) # lists data = new_message(s, 0) # lists
self.data[s] = getattr(data.as_reader(), s) self.data[s] = getattr(data.as_reader(), s)
self.logMonoTime[s] = 0 self.logMonoTime[s] = 0
# TODO: this should default to False self.valid[s] = True # FIXME: this should default to False
self.valid[s] = True
freq = max(min([SERVICE_LIST[s].frequency, self.update_freq]), 1.)
if s == poll:
max_freq = freq
min_freq = freq
else:
max_freq = min(freq, self.update_freq)
if SERVICE_LIST[s].frequency >= 2*self.update_freq:
min_freq = self.update_freq
elif self.update_freq >= 2*SERVICE_LIST[s].frequency:
min_freq = freq
else:
min_freq = min(freq, freq / 2.)
self.max_freq[s] = max_freq*1.2
self.min_freq[s] = min_freq*0.8
self.recv_dts[s] = deque(maxlen=int(10*freq))
def __getitem__(self, s: str) -> capnp.lib.capnp._DynamicStructReader: def __getitem__(self, s: str) -> capnp.lib.capnp._DynamicStructReader:
return self.data[s] return self.data[s]
def _check_avg_freq(self, s): def _check_avg_freq(self, s: str) -> bool:
return self.rcv_time[s] > 1e-5 and self.freq[s] > 1e-5 and (s not in self.non_polled_services) \ return SERVICE_LIST[s].frequency > 0.99 and (s not in self.ignore_average_freq) and (s not in self.ignore_alive)
and (s not in self.ignore_average_freq)
def update(self, timeout: int = 1000) -> None: def update(self, timeout: int = 100) -> None:
msgs = [] msgs = []
for sock in self.poller.poll(timeout): for sock in self.poller.poll(timeout):
msgs.append(recv_one_or_none(sock)) msgs.append(recv_one_or_none(sock))
@@ -221,64 +241,57 @@ class SubMaster:
continue continue
s = msg.which() s = msg.which()
self.seen[s] = True
self.updated[s] = True self.updated[s] = True
if self._check_avg_freq(s): if self.recv_time[s] > 1e-5:
self.recv_dts[s].append(cur_time - self.rcv_time[s]) self.recv_dts[s].append(cur_time - self.recv_time[s])
self.recv_time[s] = cur_time
self.rcv_time[s] = cur_time self.recv_frame[s] = self.frame
self.rcv_frame[s] = self.frame
self.data[s] = getattr(msg, s) self.data[s] = getattr(msg, s)
self.logMonoTime[s] = msg.logMonoTime self.logMonoTime[s] = msg.logMonoTime
self.valid[s] = msg.valid self.valid[s] = msg.valid
if self.simulation: for s in self.data:
if SERVICE_LIST[s].frequency > 1e-5:
# alive if delay is within 10x the expected frequency
self.alive[s] = (cur_time - self.recv_time[s]) < (10. / SERVICE_LIST[s].frequency)
# check average frequency; slow to fall, quick to recover
dts = self.recv_dts[s]
assert dts.maxlen is not None
recent_dts = list(dts)[-int(dts.maxlen / 10):]
try:
avg_freq = 1 / (sum(dts) / len(dts))
avg_freq_recent = 1 / (sum(recent_dts) / len(recent_dts))
except ZeroDivisionError:
avg_freq = 0
avg_freq_recent = 0
avg_freq_ok = self.min_freq[s] <= avg_freq <= self.max_freq[s]
recent_freq_ok = self.min_freq[s] <= avg_freq_recent <= self.max_freq[s]
self.freq_ok[s] = avg_freq_ok or recent_freq_ok
else:
self.freq_ok[s] = True self.freq_ok[s] = True
self.alive[s] = True self.alive[s] = True
if not self.simulation: def all_alive(self, service_list: Optional[List[str]] = None) -> bool:
for s in self.data: if service_list is None:
# arbitrary small number to avoid float comparison. If freq is 0, we can skip the check service_list = list(self.sock.keys())
if self.freq[s] > 1e-5:
# alive if delay is within 10x the expected frequency
self.alive[s] = (cur_time - self.rcv_time[s]) < (10. / self.freq[s])
# TODO: check if update frequency is high enough to not drop messages
# freq_ok if average frequency is higher than 90% of expected frequency
if self._check_avg_freq(s):
if len(self.recv_dts[s]) > 0:
avg_dt = sum(self.recv_dts[s]) / len(self.recv_dts[s])
expected_dt = 1 / (self.freq[s] * 0.90)
self.freq_ok[s] = (avg_dt < expected_dt)
else:
self.freq_ok[s] = False
else:
self.freq_ok[s] = True
else:
self.freq_ok[s] = True
self.alive[s] = True
def all_alive(self, service_list=None) -> bool:
if service_list is None: # check all
service_list = self.alive.keys()
return all(self.alive[s] for s in service_list if s not in self.ignore_alive) return all(self.alive[s] for s in service_list if s not in self.ignore_alive)
def all_freq_ok(self, service_list=None) -> bool: def all_freq_ok(self, service_list: Optional[List[str]] = None) -> bool:
if service_list is None: # check all if service_list is None:
service_list = self.alive.keys() service_list = list(self.sock.keys())
return all(self.freq_ok[s] for s in service_list if s not in self.ignore_alive) return all(self.freq_ok[s] for s in service_list if self._check_avg_freq(s))
def all_valid(self, service_list=None) -> bool: def all_valid(self, service_list: Optional[List[str]] = None) -> bool:
if service_list is None: # check all if service_list is None:
service_list = self.valid.keys() service_list = list(self.sock.keys())
return all(self.valid[s] for s in service_list if s not in self.ignore_valid) return all(self.valid[s] for s in service_list if s not in self.ignore_valid)
def all_checks(self, service_list=None) -> bool: def all_checks(self, service_list: Optional[List[str]] = None) -> bool:
if service_list is None: # check all return self.all_alive(service_list) and self.all_freq_ok(service_list) and self.all_valid(service_list)
service_list = self.alive.keys()
return self.all_alive(service_list=service_list) \
and self.all_freq_ok(service_list=service_list) \
and self.all_valid(service_list=service_list)
class PubMaster: class PubMaster:
Binary file not shown.
Binary file not shown.
+55 -54
View File
@@ -30,60 +30,61 @@ static std::map<std::string, service> services = {
{ "androidLog", {"androidLog", 8024, true, 0, -1}}, { "androidLog", {"androidLog", 8024, true, 0, -1}},
{ "carState", {"carState", 8025, true, 100, 10}}, { "carState", {"carState", 8025, true, 100, 10}},
{ "carControl", {"carControl", 8026, true, 100, 10}}, { "carControl", {"carControl", 8026, true, 100, 10}},
{ "longitudinalPlan", {"longitudinalPlan", 8027, true, 20, 5}}, { "carOutput", {"carOutput", 8027, true, 100, 10}},
{ "procLog", {"procLog", 8028, true, 0, 15}}, { "longitudinalPlan", {"longitudinalPlan", 8028, true, 20, 5}},
{ "gpsLocationExternal", {"gpsLocationExternal", 8029, true, 10, 10}}, { "procLog", {"procLog", 8029, true, 0, 15}},
{ "gpsLocation", {"gpsLocation", 8030, true, 1, 1}}, { "gpsLocationExternal", {"gpsLocationExternal", 8030, true, 10, 10}},
{ "ubloxGnss", {"ubloxGnss", 8031, true, 10, -1}}, { "gpsLocation", {"gpsLocation", 8031, true, 1, 1}},
{ "qcomGnss", {"qcomGnss", 8032, true, 2, -1}}, { "ubloxGnss", {"ubloxGnss", 8032, true, 10, -1}},
{ "gnssMeasurements", {"gnssMeasurements", 8033, true, 10, 10}}, { "qcomGnss", {"qcomGnss", 8033, true, 2, -1}},
{ "clocks", {"clocks", 8034, true, 1, 1}}, { "gnssMeasurements", {"gnssMeasurements", 8034, true, 10, 10}},
{ "ubloxRaw", {"ubloxRaw", 8035, true, 20, -1}}, { "clocks", {"clocks", 8035, true, 0, 1}},
{ "liveLocationKalman", {"liveLocationKalman", 8036, true, 20, 5}}, { "ubloxRaw", {"ubloxRaw", 8036, true, 20, -1}},
{ "liveParameters", {"liveParameters", 8037, true, 20, 5}}, { "liveLocationKalman", {"liveLocationKalman", 8037, true, 20, 5}},
{ "cameraOdometry", {"cameraOdometry", 8038, true, 20, 5}}, { "liveParameters", {"liveParameters", 8038, true, 20, 5}},
{ "thumbnail", {"thumbnail", 8039, true, 0, 1}}, { "cameraOdometry", {"cameraOdometry", 8039, true, 20, 5}},
{ "onroadEvents", {"onroadEvents", 8040, true, 1, 1}}, { "thumbnail", {"thumbnail", 8040, true, 0, 1}},
{ "carParams", {"carParams", 8041, true, 0, 1}}, { "onroadEvents", {"onroadEvents", 8041, true, 1, 1}},
{ "roadCameraState", {"roadCameraState", 8042, true, 20, 20}}, { "carParams", {"carParams", 8042, true, 0, 1}},
{ "driverCameraState", {"driverCameraState", 8043, true, 20, 20}}, { "roadCameraState", {"roadCameraState", 8043, true, 20, 20}},
{ "driverEncodeIdx", {"driverEncodeIdx", 8044, false, 20, 1}}, { "driverCameraState", {"driverCameraState", 8044, true, 20, 20}},
{ "driverStateV2", {"driverStateV2", 8045, true, 20, 10}}, { "driverEncodeIdx", {"driverEncodeIdx", 8045, false, 20, 1}},
{ "driverMonitoringState", {"driverMonitoringState", 8046, true, 20, 10}}, { "driverStateV2", {"driverStateV2", 8046, true, 20, 10}},
{ "wideRoadEncodeIdx", {"wideRoadEncodeIdx", 8047, false, 20, 1}}, { "driverMonitoringState", {"driverMonitoringState", 8047, true, 20, 10}},
{ "wideRoadCameraState", {"wideRoadCameraState", 8048, true, 20, 20}}, { "wideRoadEncodeIdx", {"wideRoadEncodeIdx", 8048, false, 20, 1}},
{ "modelV2", {"modelV2", 8049, true, 20, 40}}, { "wideRoadCameraState", {"wideRoadCameraState", 8049, true, 20, 20}},
{ "managerState", {"managerState", 8050, true, 2, 1}}, { "modelV2", {"modelV2", 8050, true, 20, 40}},
{ "uploaderState", {"uploaderState", 8051, true, 0, 1}}, { "managerState", {"managerState", 8051, true, 2, 1}},
{ "navInstruction", {"navInstruction", 8052, true, 1, 10}}, { "uploaderState", {"uploaderState", 8052, true, 0, 1}},
{ "navRoute", {"navRoute", 8053, true, 0, -1}}, { "navInstruction", {"navInstruction", 8053, true, 1, 10}},
{ "navThumbnail", {"navThumbnail", 8054, true, 0, -1}}, { "navRoute", {"navRoute", 8054, true, 0, -1}},
{ "navModel", {"navModel", 8055, true, 2, 4}}, { "navThumbnail", {"navThumbnail", 8055, true, 0, -1}},
{ "mapRenderState", {"mapRenderState", 8056, true, 2, 1}}, { "navModel", {"navModel", 8056, true, 2, 4}},
{ "uiPlan", {"uiPlan", 8057, true, 20, 40}}, { "mapRenderState", {"mapRenderState", 8057, true, 2, 1}},
{ "qRoadEncodeIdx", {"qRoadEncodeIdx", 8058, false, 20, -1}}, { "uiPlan", {"uiPlan", 8058, true, 20, 40}},
{ "userFlag", {"userFlag", 8059, true, 0, 1}}, { "qRoadEncodeIdx", {"qRoadEncodeIdx", 8059, false, 20, -1}},
{ "microphone", {"microphone", 8060, true, 10, 10}}, { "userFlag", {"userFlag", 8060, true, 0, 1}},
{ "uiDebug", {"uiDebug", 8061, true, 0, 1}}, { "microphone", {"microphone", 8061, true, 10, 10}},
{ "testJoystick", {"testJoystick", 8062, true, 0, -1}}, { "uiDebug", {"uiDebug", 8062, true, 0, 1}},
{ "roadEncodeData", {"roadEncodeData", 8063, false, 20, -1}}, { "testJoystick", {"testJoystick", 8063, true, 0, -1}},
{ "driverEncodeData", {"driverEncodeData", 8064, false, 20, -1}}, { "roadEncodeData", {"roadEncodeData", 8064, false, 20, -1}},
{ "wideRoadEncodeData", {"wideRoadEncodeData", 8065, false, 20, -1}}, { "driverEncodeData", {"driverEncodeData", 8065, false, 20, -1}},
{ "qRoadEncodeData", {"qRoadEncodeData", 8066, false, 20, -1}}, { "wideRoadEncodeData", {"wideRoadEncodeData", 8066, false, 20, -1}},
{ "livestreamWideRoadEncodeIdx", {"livestreamWideRoadEncodeIdx", 8067, false, 20, -1}}, { "qRoadEncodeData", {"qRoadEncodeData", 8067, false, 20, -1}},
{ "livestreamRoadEncodeIdx", {"livestreamRoadEncodeIdx", 8068, false, 20, -1}}, { "livestreamWideRoadEncodeIdx", {"livestreamWideRoadEncodeIdx", 8068, false, 20, -1}},
{ "livestreamDriverEncodeIdx", {"livestreamDriverEncodeIdx", 8069, false, 20, -1}}, { "livestreamRoadEncodeIdx", {"livestreamRoadEncodeIdx", 8069, false, 20, -1}},
{ "livestreamWideRoadEncodeData", {"livestreamWideRoadEncodeData", 8070, false, 20, -1}}, { "livestreamDriverEncodeIdx", {"livestreamDriverEncodeIdx", 8070, false, 20, -1}},
{ "livestreamRoadEncodeData", {"livestreamRoadEncodeData", 8071, false, 20, -1}}, { "livestreamWideRoadEncodeData", {"livestreamWideRoadEncodeData", 8071, false, 20, -1}},
{ "livestreamDriverEncodeData", {"livestreamDriverEncodeData", 8072, false, 20, -1}}, { "livestreamRoadEncodeData", {"livestreamRoadEncodeData", 8072, false, 20, -1}},
{ "customReservedRawData0", {"customReservedRawData0", 8073, true, 0, -1}}, { "livestreamDriverEncodeData", {"livestreamDriverEncodeData", 8073, false, 20, -1}},
{ "customReservedRawData1", {"customReservedRawData1", 8074, true, 0, -1}}, { "customReservedRawData0", {"customReservedRawData0", 8074, true, 0, -1}},
{ "customReservedRawData2", {"customReservedRawData2", 8075, true, 0, -1}}, { "customReservedRawData1", {"customReservedRawData1", 8075, true, 0, -1}},
{ "liveMapData", {"liveMapData", 8076, false, 0, -1}}, { "customReservedRawData2", {"customReservedRawData2", 8076, true, 0, -1}},
{ "longitudinalPlanExt", {"longitudinalPlanExt", 8077, false, 20, 5}}, { "liveMapData", {"liveMapData", 8077, false, 0, -1}},
{ "lateralPlanExt", {"lateralPlanExt", 8078, false, 20, 5}}, { "longitudinalPlanExt", {"longitudinalPlanExt", 8078, false, 20, 5}},
{ "controlsStateExt", {"controlsStateExt", 8079, false, 100, 10}}, { "lateralPlanExt", {"lateralPlanExt", 8079, false, 20, 5}},
{ "navInstructionExt", {"navInstructionExt", 8080, false, 0, -1}}, { "controlsStateExt", {"controlsStateExt", 8080, false, 100, 10}},
{ "navInstructionExt", {"navInstructionExt", 8081, false, 0, -1}},
}; };
#endif #endif
+2 -1
View File
@@ -46,6 +46,7 @@ services: dict[str, tuple] = {
"androidLog": (True, 0.), "androidLog": (True, 0.),
"carState": (True, 100., 10), "carState": (True, 100., 10),
"carControl": (True, 100., 10), "carControl": (True, 100., 10),
"carOutput": (True, 100., 10),
"longitudinalPlan": (True, 20., 5), "longitudinalPlan": (True, 20., 5),
"procLog": (True, 0.5, 15), "procLog": (True, 0.5, 15),
"gpsLocationExternal": (True, 10., 10), "gpsLocationExternal": (True, 10., 10),
@@ -53,7 +54,7 @@ services: dict[str, tuple] = {
"ubloxGnss": (True, 10.), "ubloxGnss": (True, 10.),
"qcomGnss": (True, 2.), "qcomGnss": (True, 2.),
"gnssMeasurements": (True, 10., 10), "gnssMeasurements": (True, 10., 10),
"clocks": (True, 1., 1), "clocks": (True, 0.1, 1),
"ubloxRaw": (True, 20.), "ubloxRaw": (True, 20.),
"liveLocationKalman": (True, 20., 5), "liveLocationKalman": (True, 20., 5),
"liveParameters": (True, 20., 5), "liveParameters": (True, 20., 5),
Binary file not shown.
+1 -2
View File
@@ -1,7 +1,6 @@
import os import os
import tempfile import tempfile
import contextlib import contextlib
from typing import Optional
class CallbackReader: class CallbackReader:
@@ -24,7 +23,7 @@ class CallbackReader:
@contextlib.contextmanager @contextlib.contextmanager
def atomic_write_in_dir(path: str, mode: str = 'w', buffering: int = -1, encoding: Optional[str] = None, newline: Optional[str] = None, def atomic_write_in_dir(path: str, mode: str = 'w', buffering: int = -1, encoding: str = None, newline: str = None,
overwrite: bool = False): overwrite: bool = False):
"""Write to a file atomically using a temporary file in the same directory as the destination file.""" """Write to a file atomically using a temporary file in the same directory as the destination file."""
dir_name = os.path.dirname(path) dir_name = os.path.dirname(path)
+3 -4
View File
@@ -1,6 +1,5 @@
import os import os
from functools import lru_cache from functools import lru_cache
from typing import Optional, List
def gpio_init(pin: int, output: bool) -> None: def gpio_init(pin: int, output: bool) -> None:
try: try:
@@ -16,7 +15,7 @@ def gpio_set(pin: int, high: bool) -> None:
except Exception as e: except Exception as e:
print(f"Failed to set gpio {pin} value: {e}") print(f"Failed to set gpio {pin} value: {e}")
def gpio_read(pin: int) -> Optional[bool]: def gpio_read(pin: int) -> bool | None:
val = None val = None
try: try:
with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f: with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f:
@@ -37,7 +36,7 @@ def gpio_export(pin: int) -> None:
print(f"Failed to export gpio {pin}") print(f"Failed to export gpio {pin}")
@lru_cache(maxsize=None) @lru_cache(maxsize=None)
def get_irq_action(irq: int) -> List[str]: def get_irq_action(irq: int) -> list[str]:
try: try:
with open(f"/sys/kernel/irq/{irq}/actions") as f: with open(f"/sys/kernel/irq/{irq}/actions") as f:
actions = f.read().strip().split(',') actions = f.read().strip().split(',')
@@ -45,7 +44,7 @@ def get_irq_action(irq: int) -> List[str]:
except FileNotFoundError: except FileNotFoundError:
return [] return []
def get_irqs_for_action(action: str) -> List[str]: def get_irqs_for_action(action: str) -> list[str]:
ret = [] ret = []
with open("/proc/interrupts") as f: with open("/proc/interrupts") as f:
for l in f.readlines(): for l in f.readlines():
+50
View File
@@ -0,0 +1,50 @@
"""
Utilities for generating mock messages for testing.
example in common/tests/test_mock.py
"""
import functools
import threading
from cereal.messaging import PubMaster
from cereal.services import SERVICE_LIST
from openpilot.common.mock.generators import generate_liveLocationKalman
from openpilot.common.realtime import Ratekeeper
MOCK_GENERATOR = {
"liveLocationKalman": generate_liveLocationKalman
}
def generate_messages_loop(services: list[str], done: threading.Event):
pm = PubMaster(services)
rk = Ratekeeper(100)
i = 0
while not done.is_set():
for s in services:
should_send = i % (100/SERVICE_LIST[s].frequency) == 0
if should_send:
message = MOCK_GENERATOR[s]()
pm.send(s, message)
i += 1
rk.keep_time()
def mock_messages(services: list[str] | str):
if isinstance(services, str):
services = [services]
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
done = threading.Event()
t = threading.Thread(target=generate_messages_loop, args=(services, done))
t.start()
try:
return func(*args, **kwargs)
finally:
done.set()
t.join()
return wrapper
return decorator
+20
View File
@@ -0,0 +1,20 @@
from cereal import messaging
LOCATION1 = (32.7174, -117.16277)
LOCATION2 = (32.7558, -117.2037)
LLK_DECIMATION = 10
RENDER_FRAMES = 15
DEFAULT_ITERATIONS = RENDER_FRAMES * LLK_DECIMATION
def generate_liveLocationKalman(location=LOCATION1):
msg = messaging.new_message('liveLocationKalman')
msg.liveLocationKalman.positionGeodetic = {'value': [*location, 0], 'std': [0., 0., 0.], 'valid': True}
msg.liveLocationKalman.positionECEF = {'value': [0., 0., 0.], 'std': [0., 0., 0.], 'valid': True}
msg.liveLocationKalman.calibratedOrientationNED = {'value': [0., 0., 0.], 'std': [0., 0., 0.], 'valid': True}
msg.liveLocationKalman.velocityCalibrated = {'value': [0., 0., 0.], 'std': [0., 0., 0.], 'valid': True}
msg.liveLocationKalman.status = 'valid'
msg.liveLocationKalman.gpsOK = True
return msg
+7 -7
View File
@@ -9,7 +9,7 @@
"language": "c++", "language": "c++",
"name": "common.params_pyx", "name": "common.params_pyx",
"sources": [ "sources": [
"/data/openpilot/common/params_pyx.pyx" "/data/dp-private/common/params_pyx.pyx"
] ]
}, },
"module_name": "common.params_pyx" "module_name": "common.params_pyx"
@@ -6883,7 +6883,7 @@ static PyObject *__pyx_unpickle___Pyx_EnumMeta__set_state(struct __pyx_obj___Pyx
* *
* *
* def ensure_bytes(v): # <<<<<<<<<<<<<< * def ensure_bytes(v): # <<<<<<<<<<<<<<
* return v.encode() if isinstance(v, str) else v; * return v.encode() if isinstance(v, str) else v
* *
*/ */
@@ -7000,7 +7000,7 @@ static PyObject *__pyx_pf_6common_10params_pyx_ensure_bytes(CYTHON_UNUSED PyObje
/* "common/params_pyx.pyx":32 /* "common/params_pyx.pyx":32
* *
* def ensure_bytes(v): * def ensure_bytes(v):
* return v.encode() if isinstance(v, str) else v; # <<<<<<<<<<<<<< * return v.encode() if isinstance(v, str) else v # <<<<<<<<<<<<<<
* *
* class UnknownKeyName(Exception): * class UnknownKeyName(Exception):
*/ */
@@ -7045,7 +7045,7 @@ static PyObject *__pyx_pf_6common_10params_pyx_ensure_bytes(CYTHON_UNUSED PyObje
* *
* *
* def ensure_bytes(v): # <<<<<<<<<<<<<< * def ensure_bytes(v): # <<<<<<<<<<<<<<
* return v.encode() if isinstance(v, str) else v; * return v.encode() if isinstance(v, str) else v
* *
*/ */
@@ -10657,7 +10657,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
* *
* *
* def ensure_bytes(v): # <<<<<<<<<<<<<< * def ensure_bytes(v): # <<<<<<<<<<<<<<
* return v.encode() if isinstance(v, str) else v; * return v.encode() if isinstance(v, str) else v
* *
*/ */
__pyx_tuple__20 = PyTuple_Pack(1, __pyx_n_s_v); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 31, __pyx_L1_error) __pyx_tuple__20 = PyTuple_Pack(1, __pyx_n_s_v); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 31, __pyx_L1_error)
@@ -12161,7 +12161,7 @@ if (!__Pyx_RefNanny) {
* *
* *
* def ensure_bytes(v): # <<<<<<<<<<<<<< * def ensure_bytes(v): # <<<<<<<<<<<<<<
* return v.encode() if isinstance(v, str) else v; * return v.encode() if isinstance(v, str) else v
* *
*/ */
__pyx_t_8 = __Pyx_CyFunction_New(&__pyx_mdef_6common_10params_pyx_1ensure_bytes, 0, __pyx_n_s_ensure_bytes, NULL, __pyx_kp_s_common_params_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__21)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 31, __pyx_L1_error) __pyx_t_8 = __Pyx_CyFunction_New(&__pyx_mdef_6common_10params_pyx_1ensure_bytes, 0, __pyx_n_s_ensure_bytes, NULL, __pyx_kp_s_common_params_pyx, __pyx_d, ((PyObject *)__pyx_codeobj__21)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 31, __pyx_L1_error)
@@ -12170,7 +12170,7 @@ if (!__Pyx_RefNanny) {
__Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
/* "common/params_pyx.pyx":34 /* "common/params_pyx.pyx":34
* return v.encode() if isinstance(v, str) else v; * return v.encode() if isinstance(v, str) else v
* *
* class UnknownKeyName(Exception): # <<<<<<<<<<<<<< * class UnknownKeyName(Exception): # <<<<<<<<<<<<<<
* pass * pass
+1 -1
View File
@@ -29,7 +29,7 @@ cdef extern from "common/params.h":
def ensure_bytes(v): def ensure_bytes(v):
return v.encode() if isinstance(v, str) else v; return v.encode() if isinstance(v, str) else v
class UnknownKeyName(Exception): class UnknownKeyName(Exception):
pass pass
Binary file not shown.
+1 -2
View File
@@ -2,14 +2,13 @@ import os
import shutil import shutil
import uuid import uuid
from typing import Optional
from openpilot.common.params import Params from openpilot.common.params import Params
from openpilot.system.hardware.hw import Paths from openpilot.system.hardware.hw import Paths
from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT
class OpenpilotPrefix: class OpenpilotPrefix:
def __init__(self, prefix: Optional[str] = None, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False): def __init__(self, prefix: str = None, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False):
self.prefix = prefix if prefix else str(uuid.uuid4().hex[0:15]) self.prefix = prefix if prefix else str(uuid.uuid4().hex[0:15])
self.msgq_path = os.path.join('/dev/shm', self.prefix) self.msgq_path = os.path.join('/dev/shm', self.prefix)
self.clean_dirs_on_exit = clean_dirs_on_exit self.clean_dirs_on_exit = clean_dirs_on_exit
+3 -4
View File
@@ -3,7 +3,6 @@ import gc
import os import os
import time import time
from collections import deque from collections import deque
from typing import Optional, List, Union
from setproctitle import getproctitle from setproctitle import getproctitle
@@ -33,12 +32,12 @@ def set_realtime_priority(level: int) -> None:
os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(level)) os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(level))
def set_core_affinity(cores: List[int]) -> None: def set_core_affinity(cores: list[int]) -> None:
if not PC: if not PC:
os.sched_setaffinity(0, cores) os.sched_setaffinity(0, cores)
def config_realtime_process(cores: Union[int, List[int]], priority: int) -> None: def config_realtime_process(cores: int | list[int], priority: int) -> None:
gc.disable() gc.disable()
set_realtime_priority(priority) set_realtime_priority(priority)
c = cores if isinstance(cores, list) else [cores, ] c = cores if isinstance(cores, list) else [cores, ]
@@ -46,7 +45,7 @@ def config_realtime_process(cores: Union[int, List[int]], priority: int) -> None
class Ratekeeper: class Ratekeeper:
def __init__(self, rate: float, print_delay_threshold: Optional[float] = 0.0) -> None: def __init__(self, rate: float, print_delay_threshold: float | None = 0.0) -> None:
"""Rate in Hz for ratekeeping. print_delay_threshold must be nonnegative.""" """Rate in Hz for ratekeeping. print_delay_threshold must be nonnegative."""
self._interval = 1. / rate self._interval = 1. / rate
self._next_frame_time = time.monotonic() + self._interval self._next_frame_time = time.monotonic() + self._interval
+1 -1
View File
@@ -1,5 +1,5 @@
import numpy as np import numpy as np
from typing import Callable from collections.abc import Callable
from openpilot.common.transformations.transformations import (ecef_euler_from_ned_single, from openpilot.common.transformations.transformations import (ecef_euler_from_ned_single,
euler2quat_single, euler2quat_single,
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,4 +1,4 @@
#cython: language_level=3 # cython: language_level=3
from libcpp cimport bool from libcpp cimport bool
cdef extern from "orientation.cc": cdef extern from "orientation.cc":
+3 -4
View File
@@ -17,7 +17,6 @@ from openpilot.common.transformations.transformations cimport ecef2geodetic as e
from openpilot.common.transformations.transformations cimport LocalCoord_c from openpilot.common.transformations.transformations cimport LocalCoord_c
import cython
import numpy as np import numpy as np
cimport numpy as np cimport numpy as np
@@ -34,14 +33,14 @@ cdef Matrix3 numpy2matrix(np.ndarray[double, ndim=2, mode="fortran"] m):
return Matrix3(<double*>m.data) return Matrix3(<double*>m.data)
cdef ECEF list2ecef(ecef): cdef ECEF list2ecef(ecef):
cdef ECEF e; cdef ECEF e
e.x = ecef[0] e.x = ecef[0]
e.y = ecef[1] e.y = ecef[1]
e.z = ecef[2] e.z = ecef[2]
return e return e
cdef NED list2ned(ned): cdef NED list2ned(ned):
cdef NED n; cdef NED n
n.n = ned[0] n.n = ned[0]
n.e = ned[1] n.e = ned[1]
n.d = ned[2] n.d = ned[2]
@@ -61,7 +60,7 @@ def euler2quat_single(euler):
def quat2euler_single(quat): def quat2euler_single(quat):
cdef Quaternion q = Quaternion(quat[0], quat[1], quat[2], quat[3]) cdef Quaternion q = Quaternion(quat[0], quat[1], quat[2], quat[3])
cdef Vector3 e = quat2euler_c(q); cdef Vector3 e = quat2euler_c(q)
return [e(0), e(1), e(2)] return [e(0), e(1), e(2)]
def quat2rot_single(quat): def quat2rot_single(quat):
Binary file not shown.
+11
View File
@@ -0,0 +1,11 @@
class Freezable:
_frozen: bool = False
def freeze(self):
if not self._frozen:
self._frozen = True
def __setattr__(self, *args, **kwargs):
if self._frozen:
raise Exception("cannot modify frozen object")
super().__setattr__(*args, **kwargs)
+1 -1
View File
@@ -1 +1 @@
#define COMMA_VERSION "2024.02.13" #define COMMA_VERSION "2024.03.12"
View File
+20 -8
View File
@@ -4,7 +4,7 @@
A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified. A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified.
# 277 Supported Cars # 288 Supported Cars
|Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|<a href="##"><img width=2000></a>Hardware Needed<br>&nbsp;|Video| |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|<a href="##"><img width=2000></a>Hardware Needed<br>&nbsp;|Video|
|---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
@@ -23,6 +23,7 @@ A supported vehicle is one that just works when you install a comma device. All
|Cadillac|Escalade ESV 2019[<sup>4</sup>](#footnotes)|Adaptive Cruise Control (ACC) & LKAS|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 OBD-II connector<br>- 1 comma 3X<br>- 2 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Cadillac&model=Escalade ESV 2019">Buy Here</a></sub></details>|| |Cadillac|Escalade ESV 2019[<sup>4</sup>](#footnotes)|Adaptive Cruise Control (ACC) & LKAS|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 OBD-II connector<br>- 1 comma 3X<br>- 2 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Cadillac&model=Escalade ESV 2019">Buy Here</a></sub></details>||
|Chevrolet|Bolt EUV 2022-23|Premier or Premier Redline Trim without Super Cruise Package|openpilot available[<sup>1</sup>](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 GM connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Bolt EUV 2022-23">Buy Here</a></sub></details>|<a href="https://youtu.be/xvwzGMUA210" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Chevrolet|Bolt EUV 2022-23|Premier or Premier Redline Trim without Super Cruise Package|openpilot available[<sup>1</sup>](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 GM connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Bolt EUV 2022-23">Buy Here</a></sub></details>|<a href="https://youtu.be/xvwzGMUA210" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Chevrolet|Bolt EV 2022-23|2LT Trim with Adaptive Cruise Control Package|openpilot available[<sup>1</sup>](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 GM connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Bolt EV 2022-23">Buy Here</a></sub></details>|| |Chevrolet|Bolt EV 2022-23|2LT Trim with Adaptive Cruise Control Package|openpilot available[<sup>1</sup>](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 GM connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Bolt EV 2022-23">Buy Here</a></sub></details>||
|Chevrolet|Equinox 2019-22|Adaptive Cruise Control (ACC)|openpilot available[<sup>1</sup>](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 GM connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Equinox 2019-22">Buy Here</a></sub></details>||
|Chevrolet|Silverado 1500 2020-21|Safety Package II|openpilot available[<sup>1</sup>](#footnotes)|0 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 GM connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Silverado 1500 2020-21">Buy Here</a></sub></details>|| |Chevrolet|Silverado 1500 2020-21|Safety Package II|openpilot available[<sup>1</sup>](#footnotes)|0 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 GM connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Silverado 1500 2020-21">Buy Here</a></sub></details>||
|Chevrolet|Trailblazer 2021-22|Adaptive Cruise Control (ACC)|openpilot available[<sup>1</sup>](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 GM connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Trailblazer 2021-22">Buy Here</a></sub></details>|| |Chevrolet|Trailblazer 2021-22|Adaptive Cruise Control (ACC)|openpilot available[<sup>1</sup>](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 GM connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Trailblazer 2021-22">Buy Here</a></sub></details>||
|Chevrolet|Volt 2017-18[<sup>4</sup>](#footnotes)|Adaptive Cruise Control (ACC)|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 OBD-II connector<br>- 1 comma 3X<br>- 2 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Volt 2017-18">Buy Here</a></sub></details>|<a href="https://youtu.be/QeMCN_4TFfQ" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Chevrolet|Volt 2017-18[<sup>4</sup>](#footnotes)|Adaptive Cruise Control (ACC)|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 OBD-II connector<br>- 1 comma 3X<br>- 2 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Volt 2017-18">Buy Here</a></sub></details>|<a href="https://youtu.be/QeMCN_4TFfQ" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
@@ -33,13 +34,22 @@ A supported vehicle is one that just works when you install a comma device. All
|Chrysler|Pacifica Hybrid 2018|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica Hybrid 2018">Buy Here</a></sub></details>|| |Chrysler|Pacifica Hybrid 2018|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica Hybrid 2018">Buy Here</a></sub></details>||
|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)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica Hybrid 2019-23">Buy Here</a></sub></details>|| |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)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica Hybrid 2019-23">Buy Here</a></sub></details>||
|comma|body|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|None|| |comma|body|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|None||
|Dodge|Durango 2020-21|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Dodge&model=Durango 2020-21">Buy Here</a></sub></details>||
|Ford|Bronco Sport 2021-22|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Bronco Sport 2021-22">Buy Here</a></sub></details>|| |Ford|Bronco Sport 2021-22|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Bronco Sport 2021-22">Buy Here</a></sub></details>||
|Ford|Escape 2020-22|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Escape 2020-22">Buy Here</a></sub></details>|| |Ford|Escape 2020-22|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Escape 2020-22">Buy Here</a></sub></details>||
|Ford|Escape Hybrid 2020-22|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Escape Hybrid 2020-22">Buy Here</a></sub></details>||
|Ford|Escape Plug-in Hybrid 2020-22|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Escape Plug-in Hybrid 2020-22">Buy Here</a></sub></details>||
|Ford|Explorer 2020-23|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Explorer 2020-23">Buy Here</a></sub></details>|| |Ford|Explorer 2020-23|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Explorer 2020-23">Buy Here</a></sub></details>||
|Ford|Explorer Hybrid 2020-23|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Explorer Hybrid 2020-23">Buy Here</a></sub></details>||
|Ford|Focus 2018[<sup>3</sup>](#footnotes)|Adaptive Cruise Control with Lane Centering|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Focus 2018">Buy Here</a></sub></details>|| |Ford|Focus 2018[<sup>3</sup>](#footnotes)|Adaptive Cruise Control with Lane Centering|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Focus 2018">Buy Here</a></sub></details>||
|Ford|Focus Hybrid 2018[<sup>3</sup>](#footnotes)|Adaptive Cruise Control with Lane Centering|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Focus Hybrid 2018">Buy Here</a></sub></details>||
|Ford|Kuga 2020-22|Adaptive Cruise Control with Lane Centering|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Kuga 2020-22">Buy Here</a></sub></details>|| |Ford|Kuga 2020-22|Adaptive Cruise Control with Lane Centering|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Kuga 2020-22">Buy Here</a></sub></details>||
|Ford|Kuga Hybrid 2020-22|Adaptive Cruise Control with Lane Centering|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Kuga Hybrid 2020-22">Buy Here</a></sub></details>||
|Ford|Kuga Plug-in Hybrid 2020-22|Adaptive Cruise Control with Lane Centering|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Kuga Plug-in Hybrid 2020-22">Buy Here</a></sub></details>||
|Ford|Maverick 2022|LARIAT Luxury|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Maverick 2022">Buy Here</a></sub></details>|| |Ford|Maverick 2022|LARIAT Luxury|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Maverick 2022">Buy Here</a></sub></details>||
|Ford|Maverick 2023|Co-Pilot360 Assist|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Maverick 2023">Buy Here</a></sub></details>|| |Ford|Maverick 2023|Co-Pilot360 Assist|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Maverick 2023">Buy Here</a></sub></details>||
|Ford|Maverick Hybrid 2022|LARIAT Luxury|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Maverick Hybrid 2022">Buy Here</a></sub></details>||
|Ford|Maverick Hybrid 2023|Co-Pilot360 Assist|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Maverick Hybrid 2023">Buy Here</a></sub></details>||
|Genesis|G70 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai F connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=G70 2018-19">Buy Here</a></sub></details>|| |Genesis|G70 2018-19|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai F connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=G70 2018-19">Buy Here</a></sub></details>||
|Genesis|G70 2020|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai F connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=G70 2020">Buy Here</a></sub></details>|| |Genesis|G70 2020|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai F connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=G70 2020">Buy Here</a></sub></details>||
|Genesis|G80 2017|All|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai J connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=G80 2017">Buy Here</a></sub></details>|| |Genesis|G80 2017|All|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai J connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=G80 2017">Buy Here</a></sub></details>||
@@ -175,7 +185,8 @@ A supported vehicle is one that just works when you install a comma device. All
|Lexus|RX Hybrid 2017-19|All|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=RX Hybrid 2017-19">Buy Here</a></sub></details>|| |Lexus|RX Hybrid 2017-19|All|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=RX Hybrid 2017-19">Buy Here</a></sub></details>||
|Lexus|RX Hybrid 2020-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=RX Hybrid 2020-22">Buy Here</a></sub></details>|| |Lexus|RX Hybrid 2020-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=RX Hybrid 2020-22">Buy Here</a></sub></details>||
|Lexus|UX Hybrid 2019-23|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=UX Hybrid 2019-23">Buy Here</a></sub></details>|| |Lexus|UX Hybrid 2019-23|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=UX Hybrid 2019-23">Buy Here</a></sub></details>||
|Lincoln|Aviator 2020-21|Co-Pilot360 Plus|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lincoln&model=Aviator 2020-21">Buy Here</a></sub></details>|| |Lincoln|Aviator 2020-23|Co-Pilot360 Plus|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lincoln&model=Aviator 2020-23">Buy Here</a></sub></details>||
|Lincoln|Aviator Plug-in Hybrid 2020-23|Co-Pilot360 Plus|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lincoln&model=Aviator Plug-in Hybrid 2020-23">Buy Here</a></sub></details>||
|MAN|eTGE 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,13</sup>](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 J533 connector<br>- 1 USB-C coupler<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=MAN&model=eTGE 2020-23">Buy Here</a></sub></details>|<a href="https://youtu.be/4100gLeabmo" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |MAN|eTGE 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,13</sup>](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 J533 connector<br>- 1 USB-C coupler<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=MAN&model=eTGE 2020-23">Buy Here</a></sub></details>|<a href="https://youtu.be/4100gLeabmo" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|MAN|TGE 2017-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,13</sup>](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 J533 connector<br>- 1 USB-C coupler<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=MAN&model=TGE 2017-23">Buy Here</a></sub></details>|<a href="https://youtu.be/4100gLeabmo" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |MAN|TGE 2017-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,13</sup>](#footnotes)|0 mph|31 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 J533 connector<br>- 1 USB-C coupler<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=MAN&model=TGE 2017-23">Buy Here</a></sub></details>|<a href="https://youtu.be/4100gLeabmo" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Mazda|CX-5 2022-24|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Mazda connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Mazda&model=CX-5 2022-24">Buy Here</a></sub></details>|| |Mazda|CX-5 2022-24|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Mazda connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Mazda&model=CX-5 2022-24">Buy Here</a></sub></details>||
@@ -214,9 +225,9 @@ A supported vehicle is one that just works when you install a comma device. All
|Toyota|Avalon Hybrid 2019-21|All|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Avalon Hybrid 2019-21">Buy Here</a></sub></details>|| |Toyota|Avalon Hybrid 2019-21|All|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Avalon Hybrid 2019-21">Buy Here</a></sub></details>||
|Toyota|Avalon Hybrid 2022|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Avalon Hybrid 2022">Buy Here</a></sub></details>|| |Toyota|Avalon Hybrid 2022|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Avalon Hybrid 2022">Buy Here</a></sub></details>||
|Toyota|C-HR 2017-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=C-HR 2017-20">Buy Here</a></sub></details>|| |Toyota|C-HR 2017-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=C-HR 2017-20">Buy Here</a></sub></details>||
|Toyota|C-HR 2021|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=C-HR 2021">Buy Here</a></sub></details>|| |Toyota|C-HR 2021|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=C-HR 2021">Buy Here</a></sub></details>||
|Toyota|C-HR Hybrid 2017-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=C-HR Hybrid 2017-20">Buy Here</a></sub></details>|| |Toyota|C-HR Hybrid 2017-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=C-HR Hybrid 2017-20">Buy Here</a></sub></details>||
|Toyota|C-HR Hybrid 2021-22|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=C-HR Hybrid 2021-22">Buy Here</a></sub></details>|| |Toyota|C-HR Hybrid 2021-22|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=C-HR Hybrid 2021-22">Buy Here</a></sub></details>||
|Toyota|Camry 2018-20|All|Stock|0 mph[<sup>9</sup>](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Camry 2018-20">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=fkcjviZY9CM" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Toyota|Camry 2018-20|All|Stock|0 mph[<sup>9</sup>](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Camry 2018-20">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=fkcjviZY9CM" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Toyota|Camry 2021-24|All|openpilot|0 mph[<sup>9</sup>](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Camry 2021-24">Buy Here</a></sub></details>|| |Toyota|Camry 2021-24|All|openpilot|0 mph[<sup>9</sup>](#footnotes)|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Camry 2021-24">Buy Here</a></sub></details>||
|Toyota|Camry Hybrid 2018-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Camry Hybrid 2018-20">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=Q2DYY0AWKgk" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Toyota|Camry Hybrid 2018-20|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Camry Hybrid 2018-20">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=Q2DYY0AWKgk" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
@@ -242,13 +253,13 @@ A supported vehicle is one that just works when you install a comma device. All
|Toyota|RAV4 2016|Toyota Safety Sense P|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2016">Buy Here</a></sub></details>|| |Toyota|RAV4 2016|Toyota Safety Sense P|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2016">Buy Here</a></sub></details>||
|Toyota|RAV4 2017-18|All|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2017-18">Buy Here</a></sub></details>|| |Toyota|RAV4 2017-18|All|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2017-18">Buy Here</a></sub></details>||
|Toyota|RAV4 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2019-21">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=wJxjDd42gGA" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Toyota|RAV4 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2019-21">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=wJxjDd42gGA" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Toyota|RAV4 2022|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2022">Buy Here</a></sub></details>|| |Toyota|RAV4 2022|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2022">Buy Here</a></sub></details>||
|Toyota|RAV4 2023-24|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2023-24">Buy Here</a></sub></details>|| |Toyota|RAV4 2023-24|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2023-24">Buy Here</a></sub></details>||
|Toyota|RAV4 Hybrid 2016|Toyota Safety Sense P|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2016">Buy Here</a></sub></details>|<a href="https://youtu.be/LhT5VzJVfNI?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Toyota|RAV4 Hybrid 2016|Toyota Safety Sense P|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2016">Buy Here</a></sub></details>|<a href="https://youtu.be/LhT5VzJVfNI?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Toyota|RAV4 Hybrid 2017-18|All|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2017-18">Buy Here</a></sub></details>|<a href="https://youtu.be/LhT5VzJVfNI?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Toyota|RAV4 Hybrid 2017-18|All|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2017-18">Buy Here</a></sub></details>|<a href="https://youtu.be/LhT5VzJVfNI?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Toyota|RAV4 Hybrid 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2019-21">Buy Here</a></sub></details>|| |Toyota|RAV4 Hybrid 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2019-21">Buy Here</a></sub></details>||
|Toyota|RAV4 Hybrid 2022|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2022">Buy Here</a></sub></details>|<a href="https://youtu.be/U0nH9cnrFB0" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Toyota|RAV4 Hybrid 2022|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2022">Buy Here</a></sub></details>|<a href="https://youtu.be/U0nH9cnrFB0" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Toyota|RAV4 Hybrid 2023-24|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2023-24">Buy Here</a></sub></details>|| |Toyota|RAV4 Hybrid 2023-24|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2023-24">Buy Here</a></sub></details>||
|Toyota|Sienna 2018-20|All|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Sienna 2018-20">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=q1UPOo4Sh68" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Toyota|Sienna 2018-20|All|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Sienna 2018-20">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=q1UPOo4Sh68" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Volkswagen|Arteon 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,13</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 J533 connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Arteon 2018-23">Buy Here</a></sub></details>|<a href="https://youtu.be/FAomFKPFlDA" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Volkswagen|Arteon 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,13</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 J533 connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Arteon 2018-23">Buy Here</a></sub></details>|<a href="https://youtu.be/FAomFKPFlDA" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Volkswagen|Arteon eHybrid 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,13</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 J533 connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Arteon eHybrid 2020-23">Buy Here</a></sub></details>|<a href="https://youtu.be/FAomFKPFlDA" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>| |Volkswagen|Arteon eHybrid 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,13</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 J533 connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Arteon eHybrid 2020-23">Buy Here</a></sub></details>|<a href="https://youtu.be/FAomFKPFlDA" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
@@ -341,6 +352,7 @@ openpilot does not yet support these Toyota models due to a new message authenti
* Toyota Venza 2021+ * Toyota Venza 2021+
* Toyota Sequoia 2023+ * Toyota Sequoia 2023+
* Toyota Tundra 2022+ * Toyota Tundra 2022+
* Toyota Highlander 2024+
* Toyota Corolla Cross 2022+ (only US model) * Toyota Corolla Cross 2022+ (only US model)
* Lexus NX 2022+ * Lexus NX 2022+
* Toyota bZ4x 2023+ * Toyota bZ4x 2023+
+1 -1
View File
@@ -62,4 +62,4 @@ A good pull request has all of the following:
* Consider opting into driver camera uploads to improve the driver monitoring model. * Consider opting into driver camera uploads to improve the driver monitoring model.
* Connect your device to Wi-Fi regularly, so that we can pull data for training better driving models. * Connect your device to Wi-Fi regularly, so that we can pull data for training better driving models.
* Run the `nightly` branch and report issues. This branch is like `master` but it's built just like a release. * Run the `nightly` branch and report issues. This branch is like `master` but it's built just like a release.
* Annotate images in the [comma10k dateset](https://github.com/commaai/comma10k). * Annotate images in the [comma10k dataset](https://github.com/commaai/comma10k).
+5
View File
@@ -21,6 +21,11 @@ function agnos_init {
# set success flag for current boot slot # set success flag for current boot slot
sudo abctl --set_success sudo abctl --set_success
# TODO: do this without udev in AGNOS
# udev does this, but sometimes we startup faster
sudo chgrp gpu /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0
sudo chmod 660 /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0
# Check if AGNOS update is required # Check if AGNOS update is required
if [ $(< /VERSION) != "$AGNOS_VERSION" ]; then if [ $(< /VERSION) != "$AGNOS_VERSION" ]; then
AGNOS_PY="$DIR/system/hardware/tici/agnos.py" AGNOS_PY="$DIR/system/hardware/tici/agnos.py"
+1 -1
View File
@@ -7,7 +7,7 @@ export OPENBLAS_NUM_THREADS=1
export VECLIB_MAXIMUM_THREADS=1 export VECLIB_MAXIMUM_THREADS=1
if [ -z "$AGNOS_VERSION" ]; then if [ -z "$AGNOS_VERSION" ]; then
export AGNOS_VERSION="9.6" export AGNOS_VERSION="9.7"
fi fi
export STAGING_ROOT="/data/safe_staging" export STAGING_ROOT="/data/safe_staging"
Binary file not shown.
+1 -1
View File
@@ -13,7 +13,7 @@
"language": "c++", "language": "c++",
"name": "opendbc.can.packer_pyx", "name": "opendbc.can.packer_pyx",
"sources": [ "sources": [
"/data/openpilot/opendbc/can/packer_pyx.pyx" "/data/dp-private/opendbc/can/packer_pyx.pyx"
] ]
}, },
"module_name": "opendbc.can.packer_pyx" "module_name": "opendbc.can.packer_pyx"
+1 -1
View File
@@ -13,7 +13,7 @@
"language": "c++", "language": "c++",
"name": "opendbc.can.parser_pyx", "name": "opendbc.can.parser_pyx",
"sources": [ "sources": [
"/data/openpilot/opendbc/can/parser_pyx.pyx" "/data/dp-private/opendbc/can/parser_pyx.pyx"
] ]
}, },
"module_name": "opendbc.can.parser_pyx" "module_name": "opendbc.can.parser_pyx"
Binary file not shown.
+3
View File
@@ -3608,6 +3608,9 @@ BO_ 922 DCACA_Data1_FD1: 8 GWM
SG_ DcacClntFlw_D_Rq : 5|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 SG_ DcacClntFlw_D_Rq : 5|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
SG_ CoolFanDcac_D_Rq : 7|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 SG_ CoolFanDcac_D_Rq : 7|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1
BO_ 1082 INSTRUMENT_PANEL: 8 GWM
SG_ METRIC_UNITS : 54|1@0+ (1,0) [0|1] "SED" IPMA,PCM,PCM_HEV
BO_TX_BU_ 2612224016 : ECM_Diesel,PCM,PCM_HEV; BO_TX_BU_ 2612224016 : ECM_Diesel,PCM,PCM_HEV;
BO_TX_BU_ 878 : PCM,PCM_HEV; BO_TX_BU_ 878 : PCM,PCM_HEV;
BO_TX_BU_ 1085 : ECM_Diesel,PCM; BO_TX_BU_ 1085 : ECM_Diesel,PCM;
@@ -188,6 +188,9 @@ BO_ 497 BCMGeneralPlatformStatus: 8 K9_BCM
SG_ SystemBackUpPowerMode : 5|2@0+ (1,0) [0|3] "" XXX SG_ SystemBackUpPowerMode : 5|2@0+ (1,0) [0|3] "" XXX
SG_ ParkBrakeSwActive : 36|1@0+ (1,0) [0|3] "" XXX SG_ ParkBrakeSwActive : 36|1@0+ (1,0) [0|3] "" XXX
BO_ 500 SportMode: 6 XXX
SG_ SportMode : 15|1@0+ (1,0) [0|1] "" XXX
BO_ 501 ECMPRDNL2: 8 K20_ECM BO_ 501 ECMPRDNL2: 8 K20_ECM
SG_ TransmissionState : 48|4@1+ (1,0) [0|7] "" NEO SG_ TransmissionState : 48|4@1+ (1,0) [0|7] "" NEO
SG_ PRNDL2 : 27|4@0+ (1,0) [0|255] "" NEO SG_ PRNDL2 : 27|4@0+ (1,0) [0|255] "" NEO
+1 -1
View File
@@ -263,7 +263,7 @@ BO_ 416 SCC_CONTROL: 32 ADRV
SG_ aReqValue : 128|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX SG_ aReqValue : 128|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX
SG_ ZEROS_7 : 63|8@0+ (1,0) [0|255] "" XXX SG_ ZEROS_7 : 63|8@0+ (1,0) [0|255] "" XXX
SG_ ACCMode : 68|3@1+ (1,0) [0|7] "" XXX SG_ ACCMode : 68|3@1+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_12 : 35|9@1+ (0.1,0) [0|255] "" XXX SG_ ACC_ObjRelSpd : 35|9@1+ (0.1,-16.4) [-16.4|34.7] "m/s" XXX
SG_ JerkLowerLimit : 166|7@0+ (0.1,0) [0|12.7] "m/s^3" XXX SG_ JerkLowerLimit : 166|7@0+ (0.1,0) [0|12.7] "m/s^3" XXX
SG_ StopReq : 184|1@0+ (1,0) [0|1] "" XXX SG_ StopReq : 184|1@0+ (1,0) [0|1] "" XXX
SG_ NEW_SIGNAL_15 : 192|11@1+ (0.1,0) [0|204.7] "m" XXX SG_ NEW_SIGNAL_15 : 192|11@1+ (0.1,0) [0|204.7] "m" XXX
+19
View File
@@ -131,6 +131,19 @@ BO_ 880 EPAS_sysStatus: 8 EPAS
SG_ EPAS_sysStatusCounter : 51|4@0+ (1,0) [0|15] "" NEO SG_ EPAS_sysStatusCounter : 51|4@0+ (1,0) [0|15] "" NEO
SG_ EPAS_torsionBarTorque : 19|12@0+ (0.01,-20.5) [0|0] "Nm" NEO SG_ EPAS_torsionBarTorque : 19|12@0+ (0.01,-20.5) [0|0] "Nm" NEO
BO_ 305 EPAS3P_sysStatus: 8 NEO
SG_ EPAS_currentTuneMode : 7|4@0+ (1,0) [0|0] "" NEO
SG_ EPAS_eacErrorCode : 23|4@0+ (1,0) [0|15] "" NEO
SG_ EPAS_eacStatus : 55|3@0+ (1,0) [0|7] "" NEO
SG_ EPAS_handsOnLevel : 39|2@0+ (1,0) [0|3] "" NEO
SG_ EPAS_internalSAS : 37|14@0+ (0.1,-819.2) [-819.2|819] "deg" NEO
SG_ EPAS_steeringFault : 2|1@0+ (1,0) [0|1] "" NEO
SG_ EPAS_steeringRackForce : 1|10@0+ (50,-25575) [-25575|25575] "N" NEO
SG_ EPAS_steeringReduced : 3|1@0+ (1,0) [0|1] "" NEO
SG_ EPAS_sysStatusChecksum : 63|8@0+ (1,0) [0|255] "" NEO
SG_ EPAS_sysStatusCounter : 51|4@0+ (1,0) [0|15] "" NEO
SG_ EPAS_torsionBarTorque : 19|12@0+ (0.01,-20.5) [-20.5|20.45] "Nm" NEO
BO_ 3 STW_ANGL_STAT: 8 STW BO_ 3 STW_ANGL_STAT: 8 STW
SG_ StW_Angl : 5|14@0+ (0.5,-2048) [0|0] "deg" NEO SG_ StW_Angl : 5|14@0+ (0.5,-2048) [0|0] "deg" NEO
SG_ StW_AnglSpd : 21|14@0+ (0.5,-2048) [0|0] "/s" NEO SG_ StW_AnglSpd : 21|14@0+ (0.5,-2048) [0|0] "/s" NEO
@@ -708,6 +721,10 @@ BO_ 1001 DAS_bodyControls: 8 XXX
SG_ DAS_bodyControlsCounter : 52|4@1+ (1,0) [0|15] "" XXX SG_ DAS_bodyControlsCounter : 52|4@1+ (1,0) [0|15] "" XXX
SG_ DAS_bodyControlsChecksum : 56|8@1+ (1,0) [0|255] "" XXX SG_ DAS_bodyControlsChecksum : 56|8@1+ (1,0) [0|255] "" XXX
BO_ 780 DriverSeat: 8 XXX
SG_ occupancyStatus : 16|3@1+ (1,0) [0|7] "" XXX
SG_ buckleStatus : 19|2@1+ (1,0) [0|3] "" XXX
VAL_ 3 StW_Angl 16383 "SNA" ; VAL_ 3 StW_Angl 16383 "SNA" ;
VAL_ 3 StW_AnglSens_Id 2 "MUST" 0 "PSBL" 1 "SELF" ; VAL_ 3 StW_AnglSens_Id 2 "MUST" 0 "PSBL" 1 "SELF" ;
VAL_ 3 StW_AnglSens_Stat 2 "ERR" 3 "ERR_INI" 1 "INI" 0 "OK" ; VAL_ 3 StW_AnglSens_Stat 2 "ERR" 3 "ERR_INI" 1 "INI" 0 "OK" ;
@@ -802,6 +819,8 @@ VAL_ 697 DAS_jerkMin 511 "SNA" ;
VAL_ 697 DAS_jerkMax 255 "SNA" ; VAL_ 697 DAS_jerkMax 255 "SNA" ;
VAL_ 697 DAS_accelMin 511 "SNA" ; VAL_ 697 DAS_accelMin 511 "SNA" ;
VAL_ 697 DAS_accelMax 511 "SNA" ; VAL_ 697 DAS_accelMax 511 "SNA" ;
VAL_ 780 occupancyStatus 1 "OCCUPIED" 0 "UNOCCUPIED" ;
VAL_ 780 buckleStatus 1 "LATCHED" 0 "UNLATCHED" ;
VAL_ 792 BOOT_STATE 2 "Init" 3 "SNA" 0 "closed" 1 "open" ; VAL_ 792 BOOT_STATE 2 "Init" 3 "SNA" 0 "closed" 1 "open" ;
VAL_ 792 CERRD 1 "CAN error detect" 0 "no Can error detected" ; VAL_ 792 CERRD 1 "CAN error detect" 0 "no Can error detected" ;
VAL_ 792 DAY 1 "Init" 0 "SNA" ; VAL_ 792 DAY 1 "Init" 0 "SNA" ;
+32 -9
View File
@@ -38,12 +38,6 @@ CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor th
BO_ 767 SDSU: 8 XXX BO_ 767 SDSU: 8 XXX
SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX
BO_ 1880 DEBUG: 8 XXX
SG_ BLINDSPOTSIDE : 7|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOT : 38|1@0+ (1,0) [0|15] "" XXX
SG_ BLINDSPOTD1 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOTD2 : 55|8@0+ (1,0) [0|255] "" XXX
CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS1 Toyotas. Learn more: https://github.com/wocsor/panda/tree/smart_dsu"; CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS1 Toyotas. Learn more: https://github.com/wocsor/panda/tree/smart_dsu";
CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu"; CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu";
@@ -208,15 +202,13 @@ BO_ 835 ACC_CONTROL: 8 DSU
SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU
SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX
SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU
SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU
SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX
SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 836 PRE_COLLISION_2: 8 DSU
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
BO_ 865 CLUTCH: 8 XXX BO_ 865 CLUTCH: 8 XXX
SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX
SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX
@@ -457,6 +449,7 @@ CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1";
CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1"; CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1";
CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1"; CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1";
CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect"; CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect";
CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles";
CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars"; CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars";
CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG."; CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG.";
CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file."; CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
@@ -564,6 +557,36 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left"; VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked"; VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked";
CM_ "Imported file _dp_debug_toyota.dbc starts here";
BO_ 1880 DEBUG: 8 XXX
SG_ BLINDSPOTSIDE : 7|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOT : 38|1@0+ (1,0) [0|15] "" XXX
SG_ BLINDSPOTD1 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOTD2 : 55|8@0+ (1,0) [0|255] "" XXX
BO_ 836 PRE_COLLISION_2: 8 DSU
SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX
SG_ DS1STAT2 : 13|3@0+ (1,0) [0|0] "" Vector__XXX
SG_ DS1STBK2 : 10|3@0+ (1,0) [0|0] "" Vector__XXX
SG_ PCSWAR : 18|1@0+ (1,0) [0|0] "" FCM
SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM
SG_ PCSOPR : 16|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PCSABK : 31|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX
SG_ PPTRGR : 28|1@0+ (1,0) [0|0] "" FCM
SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM
SG_ CLEXTRGR : 26|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ IRLT_REQ : 25|2@0+ (1,0) [0|0] "" Vector__XXX
SG_ BRKHLD : 37|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS
SG_ VGRSTRGR : 35|2@0+ (1,0) [0|0] "" Vector__XXX
SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PBRTRGR : 32|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PCSDIS : 43|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PBPREPMP : 40|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
CM_ "toyota_new_mc_pt.dbc starts here"; CM_ "toyota_new_mc_pt.dbc starts here";
BO_ 548 BRAKE_MODULE: 8 XXX BO_ 548 BRAKE_MODULE: 8 XXX
+32 -9
View File
@@ -38,12 +38,6 @@ CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor th
BO_ 767 SDSU: 8 XXX BO_ 767 SDSU: 8 XXX
SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX
BO_ 1880 DEBUG: 8 XXX
SG_ BLINDSPOTSIDE : 7|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOT : 38|1@0+ (1,0) [0|15] "" XXX
SG_ BLINDSPOTD1 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOTD2 : 55|8@0+ (1,0) [0|255] "" XXX
CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS1 Toyotas. Learn more: https://github.com/wocsor/panda/tree/smart_dsu"; CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS1 Toyotas. Learn more: https://github.com/wocsor/panda/tree/smart_dsu";
CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu"; CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu";
@@ -208,15 +202,13 @@ BO_ 835 ACC_CONTROL: 8 DSU
SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU
SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX
SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU
SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU
SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX
SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 836 PRE_COLLISION_2: 8 DSU
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
BO_ 865 CLUTCH: 8 XXX BO_ 865 CLUTCH: 8 XXX
SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX
SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX
@@ -457,6 +449,7 @@ CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1";
CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1"; CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1";
CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1"; CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1";
CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect"; CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect";
CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles";
CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars"; CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars";
CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG."; CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG.";
CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file."; CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
@@ -564,6 +557,36 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left"; VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked"; VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked";
CM_ "Imported file _dp_debug_toyota.dbc starts here";
BO_ 1880 DEBUG: 8 XXX
SG_ BLINDSPOTSIDE : 7|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOT : 38|1@0+ (1,0) [0|15] "" XXX
SG_ BLINDSPOTD1 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOTD2 : 55|8@0+ (1,0) [0|255] "" XXX
BO_ 836 PRE_COLLISION_2: 8 DSU
SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX
SG_ DS1STAT2 : 13|3@0+ (1,0) [0|0] "" Vector__XXX
SG_ DS1STBK2 : 10|3@0+ (1,0) [0|0] "" Vector__XXX
SG_ PCSWAR : 18|1@0+ (1,0) [0|0] "" FCM
SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM
SG_ PCSOPR : 16|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PCSABK : 31|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX
SG_ PPTRGR : 28|1@0+ (1,0) [0|0] "" FCM
SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM
SG_ CLEXTRGR : 26|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ IRLT_REQ : 25|2@0+ (1,0) [0|0] "" Vector__XXX
SG_ BRKHLD : 37|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS
SG_ VGRSTRGR : 35|2@0+ (1,0) [0|0] "" Vector__XXX
SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PBRTRGR : 32|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PCSDIS : 43|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PBPREPMP : 40|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
CM_ "toyota_nodsu_pt.dbc starts here"; CM_ "toyota_nodsu_pt.dbc starts here";
BO_ 401 STEERING_LTA: 8 XXX BO_ 401 STEERING_LTA: 8 XXX
+32 -9
View File
@@ -38,12 +38,6 @@ CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor th
BO_ 767 SDSU: 8 XXX BO_ 767 SDSU: 8 XXX
SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX
BO_ 1880 DEBUG: 8 XXX
SG_ BLINDSPOTSIDE : 7|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOT : 38|1@0+ (1,0) [0|15] "" XXX
SG_ BLINDSPOTD1 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOTD2 : 55|8@0+ (1,0) [0|255] "" XXX
CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS1 Toyotas. Learn more: https://github.com/wocsor/panda/tree/smart_dsu"; CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS1 Toyotas. Learn more: https://github.com/wocsor/panda/tree/smart_dsu";
CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu"; CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu";
@@ -208,15 +202,13 @@ BO_ 835 ACC_CONTROL: 8 DSU
SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU
SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX
SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU
SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU
SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX
SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 836 PRE_COLLISION_2: 8 DSU
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
BO_ 865 CLUTCH: 8 XXX BO_ 865 CLUTCH: 8 XXX
SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX
SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX
@@ -457,6 +449,7 @@ CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1";
CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1"; CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1";
CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1"; CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1";
CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect"; CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect";
CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles";
CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars"; CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars";
CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG."; CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG.";
CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file."; CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
@@ -564,6 +557,36 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left"; VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked"; VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked";
CM_ "Imported file _dp_debug_toyota.dbc starts here";
BO_ 1880 DEBUG: 8 XXX
SG_ BLINDSPOTSIDE : 7|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOT : 38|1@0+ (1,0) [0|15] "" XXX
SG_ BLINDSPOTD1 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ BLINDSPOTD2 : 55|8@0+ (1,0) [0|255] "" XXX
BO_ 836 PRE_COLLISION_2: 8 DSU
SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX
SG_ DS1STAT2 : 13|3@0+ (1,0) [0|0] "" Vector__XXX
SG_ DS1STBK2 : 10|3@0+ (1,0) [0|0] "" Vector__XXX
SG_ PCSWAR : 18|1@0+ (1,0) [0|0] "" FCM
SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM
SG_ PCSOPR : 16|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PCSABK : 31|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX
SG_ PPTRGR : 28|1@0+ (1,0) [0|0] "" FCM
SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM
SG_ CLEXTRGR : 26|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ IRLT_REQ : 25|2@0+ (1,0) [0|0] "" Vector__XXX
SG_ BRKHLD : 37|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS
SG_ VGRSTRGR : 35|2@0+ (1,0) [0|0] "" Vector__XXX
SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PBRTRGR : 32|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PCSDIS : 43|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ PBPREPMP : 40|1@0+ (1,0) [0|0] "" Vector__XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
CM_ "toyota_tnga_k_pt.dbc starts here"; CM_ "toyota_tnga_k_pt.dbc starts here";
BO_ 550 BRAKE_MODULE: 8 XXX BO_ 550 BRAKE_MODULE: 8 XXX
+7
View File
@@ -1518,8 +1518,15 @@ CM_ SG_ 912 BSK_HD_Hauptraste "Status of trunk lid main detent";
CM_ SG_ 1088 Zaehler_Getriebe_1 "Counter Getriebe_1"; CM_ SG_ 1088 Zaehler_Getriebe_1 "Counter Getriebe_1";
CM_ SG_ 1088 Waehlhebelposition__Getriebe_1_ "Gear Selector Position"; CM_ SG_ 1088 Waehlhebelposition__Getriebe_1_ "Gear Selector Position";
CM_ SG_ 1088 inneres_Soll_Motormoment "Desired Inner Torque"; CM_ SG_ 1088 inneres_Soll_Motormoment "Desired Inner Torque";
CM_ SG_ 1088 Gang_eingelegt "Gear Engaged";
CM_ SG_ 1088 Schaltabsicht "Shift Intent"; CM_ SG_ 1088 Schaltabsicht "Shift Intent";
CM_ SG_ 1088 Kuehlleistung "Cooling Power";
CM_ SG_ 1088 Wandlerverlustmoment "Converter Torque Loss"; CM_ SG_ 1088 Wandlerverlustmoment "Converter Torque Loss";
CM_ SG_ 1088 Getriebe_Notlauf "Transmission_Notlauf";
CM_ SG_ 1088 Zielgang_oder_eingelegter_Gang "target_gear_or_gear_in_engagement";
CM_ SG_ 1088 Uebertragungsfunktion "transfer function";
CM_ SG_ 1088 EGS_Anforderung "EGS Requirement";
CM_ SG_ 1088 Schaltung_aktiv__Getriebe_1_ "Shift Activity";
CM_ SG_ 1056 Fehlerstatus_Aussentemp__4_1 "ambient temp error"; CM_ SG_ 1056 Fehlerstatus_Aussentemp__4_1 "ambient temp error";
CM_ SG_ 1056 Fehlerstatus_Oeltemperatur_4_1 "oil temp error"; CM_ SG_ 1056 Fehlerstatus_Oeltemperatur_4_1 "oil temp error";
-3
View File
@@ -1,3 +0,0 @@
+1 -2
View File
@@ -2,7 +2,6 @@
import os import os
import struct import struct
from functools import wraps from functools import wraps
from typing import Optional
from panda import Panda, PandaDFU from panda import Panda, PandaDFU
from panda.python.constants import McuType from panda.python.constants import McuType
@@ -57,7 +56,7 @@ class PandaJungle(Panda):
fn = os.path.join(FW_PATH, self._mcu_type.config.app_fn.replace("panda", "panda_jungle")) fn = os.path.join(FW_PATH, self._mcu_type.config.app_fn.replace("panda", "panda_jungle"))
super().flash(fn=fn, code=code, reconnect=reconnect) super().flash(fn=fn, code=code, reconnect=reconnect)
def recover(self, timeout: Optional[int] = 60, reset: bool = True) -> bool: def recover(self, timeout: int | None = 60, reset: bool = True) -> bool:
dfu_serial = self.get_dfu_serial() dfu_serial = self.get_dfu_serial()
if reset: if reset:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -4,6 +4,6 @@ from panda import PandaJungle
if __name__ == "__main__": if __name__ == "__main__":
for p in PandaJungle.list(): for p in PandaJungle.list():
pp = PandaJungle(p) pp = PandaJungle(p)
print("%s: %s" % (pp.get_serial()[0], pp.get_version())) print(f"{pp.get_serial()[0]}: {pp.get_version()}")
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
const uint8_t gitversion[] = "DEV-2ade7461-DEBUG"; const uint8_t gitversion[] = "DEV-abf3d716-DEBUG";
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
DEV-2ade7461-DEBUG DEV-abf3d716-DEBUG
-1
View File
@@ -1 +0,0 @@
obj/*
-28
View File
@@ -1,28 +0,0 @@
# pedal
This is the firmware for the comma pedal.
The comma pedal is a gas pedal interceptor for Honda/Acura and Toyota/Lexus. It allows you to "virtually" press the pedal and borrows a lot from panda.
== Test Plan ==
* Startup
** Confirm STATE_FAULT_STARTUP
* Timeout
** Send value
** Confirm value is output
** Stop sending messages
** Confirm value is passthru after 100ms
** Confirm STATE_FAULT_TIMEOUT
* Random values
** Send random 6 byte messages
** Confirm random values cause passthru
** Confirm STATE_FAULT_BAD_CHECKSUM
* Same message lockout
** Send same message repeated
** Confirm timeout behavior
* Don't set enable
** Confirm no output
* Set enable and values
** Confirm output
-8
View File
@@ -1,8 +0,0 @@
#!/usr/bin/env sh
set -e
cd ..
scons -u -j$(nproc)
cd pedal
../../tests/pedal/enter_canloader.py obj/pedal.bin.signed
-316
View File
@@ -1,316 +0,0 @@
// ********************* Includes *********************
//#define PEDAL_USB
#include "../config.h"
#include "early_init.h"
#include "crc.h"
#define CAN CAN1
#ifdef PEDAL_USB
#include "drivers/usb.h"
#else
// no serial either
void print(const char *a) {
UNUSED(a);
}
void puth(unsigned int i) {
UNUSED(i);
}
void puth2(unsigned int i) {
UNUSED(i);
}
#endif
#define ENTER_BOOTLOADER_MAGIC 0xdeadbeefU
uint32_t enter_bootloader_mode;
// cppcheck-suppress unusedFunction ; used in headers not included in cppcheck
void __initialize_hardware_early(void) {
early_initialization();
}
// ********************* serial debugging *********************
#ifdef PEDAL_USB
void debug_ring_callback(uart_ring *ring) {
char rcv;
while (get_char(ring, &rcv) != 0) {
(void)put_char(ring, rcv);
}
}
int comms_can_read(uint8_t *data, uint32_t max_len) {
UNUSED(data);
UNUSED(max_len);
return 0;
}
void comms_can_write(const uint8_t *data, uint32_t len) {
UNUSED(data);
UNUSED(len);
}
void comms_endpoint2_write(const uint8_t *data, uint32_t len) {
UNUSED(data);
UNUSED(len);
}
void refresh_can_tx_slots_available(void) {}
int comms_control_handler(ControlPacket_t *req, uint8_t *resp) {
unsigned int resp_len = 0;
uart_ring *ur = NULL;
switch (req->request) {
// **** 0xc1: get hardware type
case 0xc1:
resp[0] = hw_type;
resp_len = 1;
break;
// **** 0xe0: uart read
case 0xe0:
ur = get_ring_by_number(req->param1);
if (!ur) {
break;
}
// read
while ((resp_len < MIN(req->length, USBPACKET_MAX_SIZE)) &&
get_char(ur, (char*)&resp[resp_len])) {
++resp_len;
}
break;
default:
print("NO HANDLER ");
puth(req->request);
print("\n");
break;
}
return resp_len;
}
#endif
// ***************************** can port *****************************
// addresses to be used on CAN
#define CAN_GAS_INPUT 0x200
#define CAN_GAS_OUTPUT 0x201UL
#define CAN_GAS_SIZE 6
#define COUNTER_CYCLE 0xFU
void CAN1_TX_IRQ_Handler(void) {
// clear interrupt
CAN->TSR |= CAN_TSR_RQCP0;
}
// two independent values
uint16_t gas_set_0 = 0;
uint16_t gas_set_1 = 0;
#define MAX_TIMEOUT 10U
uint32_t timeout = 0;
uint32_t current_index = 0;
#define NO_FAULT 0U
#define FAULT_BAD_CHECKSUM 1U
#define FAULT_SEND 2U
#define FAULT_SCE 3U
#define FAULT_STARTUP 4U
#define FAULT_TIMEOUT 5U
#define FAULT_INVALID 6U
uint8_t state = FAULT_STARTUP;
const uint8_t crc_poly = 0xD5U; // standard crc8
void CAN1_RX0_IRQ_Handler(void) {
while ((CAN->RF0R & CAN_RF0R_FMP0) != 0) {
#ifdef DEBUG
print("CAN RX\n");
#endif
int address = CAN->sFIFOMailBox[0].RIR >> 21;
if (address == CAN_GAS_INPUT) {
// softloader entry
if (GET_MAILBOX_BYTES_04(&CAN->sFIFOMailBox[0]) == 0xdeadfaceU) {
if (GET_MAILBOX_BYTES_48(&CAN->sFIFOMailBox[0]) == 0x0ab00b1e) {
enter_bootloader_mode = ENTER_SOFTLOADER_MAGIC;
NVIC_SystemReset();
} else if (GET_MAILBOX_BYTES_48(&CAN->sFIFOMailBox[0]) == 0x02b00b1e) {
enter_bootloader_mode = ENTER_BOOTLOADER_MAGIC;
NVIC_SystemReset();
} else {
print("Failed entering Softloader or Bootloader\n");
}
}
// normal packet
uint8_t dat[8];
for (int i=0; i<8; i++) {
dat[i] = GET_MAILBOX_BYTE(&CAN->sFIFOMailBox[0], i);
}
uint16_t value_0 = (dat[0] << 8) | dat[1];
uint16_t value_1 = (dat[2] << 8) | dat[3];
bool enable = ((dat[4] >> 7) & 1U) != 0U;
uint8_t index = dat[4] & COUNTER_CYCLE;
if (crc_checksum(dat, CAN_GAS_SIZE - 1, crc_poly) == dat[5]) {
if (((current_index + 1U) & COUNTER_CYCLE) == index) {
#ifdef DEBUG
print("setting gas ");
puth(value_0);
print("\n");
#endif
if (enable) {
gas_set_0 = value_0;
gas_set_1 = value_1;
} else {
// clear the fault state if values are 0
if ((value_0 == 0U) && (value_1 == 0U)) {
state = NO_FAULT;
} else {
state = FAULT_INVALID;
}
gas_set_0 = 0;
gas_set_1 = 0;
}
// clear the timeout
timeout = 0;
}
current_index = index;
} else {
// wrong checksum = fault
state = FAULT_BAD_CHECKSUM;
}
}
// next
CAN->RF0R |= CAN_RF0R_RFOM0;
}
}
void CAN1_SCE_IRQ_Handler(void) {
state = FAULT_SCE;
llcan_clear_send(CAN);
}
uint32_t pdl0 = 0;
uint32_t pdl1 = 0;
unsigned int pkt_idx = 0;
int led_value = 0;
void TIM3_IRQ_Handler(void) {
#ifdef DEBUG
puth(TIM3->CNT);
print(" ");
puth(pdl0);
print(" ");
puth(pdl1);
print("\n");
#endif
// check timer for sending the user pedal and clearing the CAN
if ((CAN->TSR & CAN_TSR_TME0) == CAN_TSR_TME0) {
uint8_t dat[8];
dat[0] = (pdl0 >> 8) & 0xFFU;
dat[1] = (pdl0 >> 0) & 0xFFU;
dat[2] = (pdl1 >> 8) & 0xFFU;
dat[3] = (pdl1 >> 0) & 0xFFU;
dat[4] = ((state & 0xFU) << 4) | pkt_idx;
dat[5] = crc_checksum(dat, CAN_GAS_SIZE - 1, crc_poly);
CAN->sTxMailBox[0].TDLR = dat[0] | (dat[1] << 8) | (dat[2] << 16) | (dat[3] << 24);
CAN->sTxMailBox[0].TDHR = dat[4] | (dat[5] << 8);
CAN->sTxMailBox[0].TDTR = 6; // len of packet is 5
CAN->sTxMailBox[0].TIR = (CAN_GAS_OUTPUT << 21) | 1U;
++pkt_idx;
pkt_idx &= COUNTER_CYCLE;
} else {
// old can packet hasn't sent!
state = FAULT_SEND;
#ifdef DEBUG
print("CAN MISS\n");
#endif
}
// blink the LED
current_board->set_led(LED_GREEN, led_value);
led_value = !led_value;
TIM3->SR = 0;
// up timeout for gas set
if (timeout == MAX_TIMEOUT) {
state = FAULT_TIMEOUT;
} else {
timeout += 1U;
}
}
// ***************************** main code *****************************
void pedal(void) {
// read/write
pdl0 = adc_get_raw(ADCCHAN_ACCEL0);
pdl1 = adc_get_raw(ADCCHAN_ACCEL1);
// write the pedal to the DAC
if (state == NO_FAULT) {
dac_set(0, MAX(gas_set_0, pdl0));
dac_set(1, MAX(gas_set_1, pdl1));
} else {
dac_set(0, pdl0);
dac_set(1, pdl1);
}
watchdog_feed();
}
int main(void) {
// Init interrupt table
init_interrupts(true);
REGISTER_INTERRUPT(CAN1_TX_IRQn, CAN1_TX_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_1)
REGISTER_INTERRUPT(CAN1_RX0_IRQn, CAN1_RX0_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_1)
REGISTER_INTERRUPT(CAN1_SCE_IRQn, CAN1_SCE_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_1)
// Should run at around 732Hz (see init below)
REGISTER_INTERRUPT(TIM3_IRQn, TIM3_IRQ_Handler, 1000U, FAULT_INTERRUPT_RATE_TIM3)
disable_interrupts();
// init devices
clock_init();
peripherals_init();
detect_board_type();
// init board
current_board->init();
#ifdef PEDAL_USB
// enable USB
usb_init();
#endif
// pedal stuff
dac_init();
adc_init();
// init can
bool llcan_speed_set = llcan_set_speed(CAN, 5000, false, false);
if (!llcan_speed_set) {
print("Failed to set llcan speed");
}
bool ret = llcan_init(CAN);
UNUSED(ret);
// 48mhz / 65536 ~= 732
timer_init(TIM3, 15);
NVIC_EnableIRQ(TIM3_IRQn);
watchdog_init(WATCHDOG_50_MS);
print("**** INTERRUPTS ON ****\n");
enable_interrupts();
// main pedal loop
while (1) {
pedal();
}
return 0;
}
-11
View File
@@ -1,11 +0,0 @@
// ******************** Prototypes ********************
void print(const char *a);
void puth(unsigned int i);
void puth2(unsigned int i);
void puth4(unsigned int i);
typedef struct board board;
typedef struct harness_configuration harness_configuration;
// ********************* Globals **********************
uint8_t hw_type = 0;
const board *current_board;
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-11
View File
@@ -1,11 +0,0 @@
#!/usr/bin/env sh
set -e
DFU_UTIL="dfu-util"
cd ..
scons -u -j$(nproc)
cd pedal
$DFU_UTIL -d 0483:df11 -a 0 -s 0x08004000 -D obj/pedal.bin.signed
$DFU_UTIL -d 0483:df11 -a 0 -s 0x08000000:leave -D obj/bootstub.pedal.bin
+6 -10
View File
@@ -9,7 +9,6 @@ import binascii
import datetime import datetime
import logging import logging
from functools import wraps, partial from functools import wraps, partial
from typing import Optional
from itertools import accumulate from itertools import accumulate
from .base import BaseHandle from .base import BaseHandle
@@ -176,7 +175,6 @@ class Panda:
HEALTH_STRUCT = struct.Struct("<IIIIIIIIIBBBBBHBBBHfBBHBHHB") HEALTH_STRUCT = struct.Struct("<IIIIIIIIIBBBBBHBBBHfBBHBHHB")
CAN_HEALTH_STRUCT = struct.Struct("<BIBBBBBBBBIIIIIIIHHBBBIIII") CAN_HEALTH_STRUCT = struct.Struct("<BIBBBBBBBBIIIIIIIHHBBBIIII")
F2_DEVICES = [HW_TYPE_PEDAL, ]
F4_DEVICES = [HW_TYPE_WHITE_PANDA, HW_TYPE_GREY_PANDA, HW_TYPE_BLACK_PANDA, HW_TYPE_UNO, HW_TYPE_DOS] F4_DEVICES = [HW_TYPE_WHITE_PANDA, HW_TYPE_GREY_PANDA, HW_TYPE_BLACK_PANDA, HW_TYPE_UNO, HW_TYPE_DOS]
H7_DEVICES = [HW_TYPE_RED_PANDA, HW_TYPE_RED_PANDA_V2, HW_TYPE_TRES, HW_TYPE_CUATRO] H7_DEVICES = [HW_TYPE_RED_PANDA, HW_TYPE_RED_PANDA_V2, HW_TYPE_TRES, HW_TYPE_CUATRO]
@@ -236,7 +234,7 @@ class Panda:
FLAG_FORD_LONG_CONTROL = 1 FLAG_FORD_LONG_CONTROL = 1
FLAG_FORD_CANFD = 2 FLAG_FORD_CANFD = 2
def __init__(self, serial: Optional[str] = None, claim: bool = True, disable_checks: bool = True, can_speed_kbps: int = 500): def __init__(self, serial: str | None = None, claim: bool = True, disable_checks: bool = True, can_speed_kbps: int = 500):
self._connect_serial = serial self._connect_serial = serial
self._disable_checks = disable_checks self._disable_checks = disable_checks
@@ -411,7 +409,7 @@ class Panda:
if device.getVendorID() == 0xbbaa and device.getProductID() in cls.USB_PIDS: if device.getVendorID() == 0xbbaa and device.getProductID() in cls.USB_PIDS:
try: try:
serial = device.getSerialNumber() serial = device.getSerialNumber()
if len(serial) == 24 or serial == "pedal": if len(serial) == 24:
ret.append(serial) ret.append(serial)
else: else:
logging.warning(f"found device with panda descriptors but invalid serial: {serial}", RuntimeWarning) logging.warning(f"found device with panda descriptors but invalid serial: {serial}", RuntimeWarning)
@@ -532,7 +530,7 @@ class Panda:
if reconnect: if reconnect:
self.reconnect() self.reconnect()
def recover(self, timeout: Optional[int] = 60, reset: bool = True) -> bool: def recover(self, timeout: int | None = 60, reset: bool = True) -> bool:
dfu_serial = self.get_dfu_serial() dfu_serial = self.get_dfu_serial()
if reset: if reset:
@@ -551,7 +549,7 @@ class Panda:
return True return True
@staticmethod @staticmethod
def wait_for_dfu(dfu_serial: Optional[str], timeout: Optional[int] = None) -> bool: def wait_for_dfu(dfu_serial: str | None, timeout: int | None = None) -> bool:
t_start = time.monotonic() t_start = time.monotonic()
dfu_list = PandaDFU.list() dfu_list = PandaDFU.list()
while (dfu_serial is None and len(dfu_list) == 0) or (dfu_serial is not None and dfu_serial not in dfu_list): while (dfu_serial is None and len(dfu_list) == 0) or (dfu_serial is not None and dfu_serial not in dfu_list):
@@ -563,7 +561,7 @@ class Panda:
return True return True
@staticmethod @staticmethod
def wait_for_panda(serial: Optional[str], timeout: int) -> bool: def wait_for_panda(serial: str | None, timeout: int) -> bool:
t_start = time.monotonic() t_start = time.monotonic()
serials = Panda.list() serials = Panda.list()
while (serial is None and len(serials) == 0) or (serial is not None and serial not in serials): while (serial is None and len(serials) == 0) or (serial is not None and serial not in serials):
@@ -699,9 +697,7 @@ class Panda:
def get_mcu_type(self) -> McuType: def get_mcu_type(self) -> McuType:
hw_type = self.get_type() hw_type = self.get_type()
if hw_type in Panda.F2_DEVICES: if hw_type in Panda.F4_DEVICES:
return McuType.F2
elif hw_type in Panda.F4_DEVICES:
return McuType.F4 return McuType.F4
elif hw_type in Panda.H7_DEVICES: elif hw_type in Panda.H7_DEVICES:
return McuType.H7 return McuType.H7
+7 -6
View File
@@ -1,6 +1,6 @@
import os import os
import enum import enum
from typing import List, NamedTuple from typing import NamedTuple
BASEDIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../") BASEDIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../")
FW_PATH = os.path.join(BASEDIR, "board/obj/") FW_PATH = os.path.join(BASEDIR, "board/obj/")
@@ -10,7 +10,7 @@ USBPACKET_MAX_SIZE = 0x40
class McuConfig(NamedTuple): class McuConfig(NamedTuple):
mcu: str mcu: str
mcu_idcode: int mcu_idcode: int
sector_sizes: List[int] sector_sizes: list[int]
sector_count: int # total sector count, used for MCU identification in DFU mode sector_count: int # total sector count, used for MCU identification in DFU mode
uid_address: int uid_address: int
block_size: int block_size: int
@@ -24,7 +24,11 @@ class McuConfig(NamedTuple):
# assume bootstub is in sector 0 # assume bootstub is in sector 0
return self.bootstub_address + sum(self.sector_sizes[:i]) return self.bootstub_address + sum(self.sector_sizes[:i])
Fx = ( F4Config = McuConfig(
"STM32F4",
0x463,
[0x4000 for _ in range(4)] + [0x10000] + [0x20000 for _ in range(11)],
16,
0x1FFF7A10, 0x1FFF7A10,
0x800, 0x800,
0x1FFF79C0, 0x1FFF79C0,
@@ -33,8 +37,6 @@ Fx = (
0x8000000, 0x8000000,
"bootstub.panda.bin", "bootstub.panda.bin",
) )
F2Config = McuConfig("STM32F2", 0x411, [0x4000 for _ in range(4)] + [0x10000] + [0x20000 for _ in range(7)], 12, *Fx)
F4Config = McuConfig("STM32F4", 0x463, [0x4000 for _ in range(4)] + [0x10000] + [0x20000 for _ in range(11)], 16, *Fx)
H7Config = McuConfig( H7Config = McuConfig(
"STM32H7", "STM32H7",
@@ -53,7 +55,6 @@ H7Config = McuConfig(
@enum.unique @enum.unique
class McuType(enum.Enum): class McuType(enum.Enum):
F2 = F2Config
F4 = F4Config F4 = F4Config
H7 = H7Config H7 = H7Config
+12 -13
View File
@@ -2,7 +2,6 @@ import os
import usb1 import usb1
import struct import struct
import binascii import binascii
from typing import List, Optional
from .base import BaseSTBootloaderHandle from .base import BaseSTBootloaderHandle
from .spi import STBootloaderSPIHandle, PandaSpiException from .spi import STBootloaderSPIHandle, PandaSpiException
@@ -11,9 +10,9 @@ from .constants import FW_PATH, McuType
class PandaDFU: class PandaDFU:
def __init__(self, dfu_serial: Optional[str]): def __init__(self, dfu_serial: str | None):
# try USB, then SPI # try USB, then SPI
handle: Optional[BaseSTBootloaderHandle] handle: BaseSTBootloaderHandle | None
self._context, handle = PandaDFU.usb_connect(dfu_serial) self._context, handle = PandaDFU.usb_connect(dfu_serial)
if handle is None: if handle is None:
self._context, handle = PandaDFU.spi_connect(dfu_serial) self._context, handle = PandaDFU.spi_connect(dfu_serial)
@@ -38,7 +37,7 @@ class PandaDFU:
self._context.close() self._context.close()
@staticmethod @staticmethod
def usb_connect(dfu_serial: Optional[str]): def usb_connect(dfu_serial: str | None):
handle = None handle = None
context = usb1.USBContext() context = usb1.USBContext()
context.open() context.open()
@@ -56,7 +55,7 @@ class PandaDFU:
return context, handle return context, handle
@staticmethod @staticmethod
def spi_connect(dfu_serial: Optional[str]): def spi_connect(dfu_serial: str | None):
handle = None handle = None
this_dfu_serial = None this_dfu_serial = None
@@ -72,13 +71,7 @@ class PandaDFU:
return None, handle return None, handle
@staticmethod @staticmethod
def list() -> List[str]: def usb_list() -> list[str]:
ret = PandaDFU.usb_list()
ret += PandaDFU.spi_list()
return list(set(ret))
@staticmethod
def usb_list() -> List[str]:
dfu_serials = [] dfu_serials = []
try: try:
with usb1.USBContext() as context: with usb1.USBContext() as context:
@@ -93,7 +86,7 @@ class PandaDFU:
return dfu_serials return dfu_serials
@staticmethod @staticmethod
def spi_list() -> List[str]: def spi_list() -> list[str]:
try: try:
_, h = PandaDFU.spi_connect(None) _, h = PandaDFU.spi_connect(None)
if h is not None: if h is not None:
@@ -134,3 +127,9 @@ class PandaDFU:
code = f.read() code = f.read()
self.program_bootstub(code) self.program_bootstub(code)
self.reset() self.reset()
@staticmethod
def list() -> list[str]:
ret = PandaDFU.usb_list()
ret += PandaDFU.spi_list()
return list(set(ret))

Some files were not shown because too many files have changed in this diff Show More