mirror of
https://github.com/dragonpilot/dragonpilot.git
synced 2026-07-08 22:42:05 +08:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5481370db3 |
@@ -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
@@ -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
@@ -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 @@
|
|||||||
const uint8_t gitversion[8] = "2ade7461";
|
const uint8_t gitversion[8] = "abf3d716";
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
# pylint: skip-file
|
|
||||||
import os
|
import os
|
||||||
import capnp
|
import capnp
|
||||||
|
|
||||||
|
|||||||
+11
-5
@@ -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
@@ -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
@@ -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();
|
||||||
|
|||||||
+855
-811
File diff suppressed because it is too large
Load Diff
+149
-37
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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,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
@@ -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():
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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,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,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":
|
||||||
|
|||||||
@@ -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.
@@ -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
@@ -1 +1 @@
|
|||||||
#define COMMA_VERSION "2024.02.13"
|
#define COMMA_VERSION "2024.03.12"
|
||||||
|
|||||||
+20
-8
@@ -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> |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> |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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|None||
|
|comma|body|All|openpilot|0 mph|0 mph|[](##)|[](##)|None||
|
||||||
|
|Dodge|Durango 2020-21|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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|[](##)|[](##)|<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+
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
@@ -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
@@ -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.
@@ -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"
|
||||||
|
|||||||
@@ -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.
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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" ;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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.
@@ -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 @@
|
|||||||
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 @@
|
|||||||
DEV-2ade7461-DEBUG
|
DEV-abf3d716-DEBUG
|
||||||
@@ -1 +0,0 @@
|
|||||||
obj/*
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -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.
@@ -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
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
Reference in New Issue
Block a user