openpilot v0.2.7 release

old-commit-hash: c6ba5dc539
commatwo_master v0.2.7
Vehicle Researcher 8 years ago
parent 0e4a7b247e
commit a1b1c64bb5
  1. 2
      README.md
  2. 6
      RELEASES.md
  3. 12
      cereal/gen/c/log.capnp.c
  4. 9
      cereal/gen/c/log.capnp.h
  5. 257
      cereal/gen/cpp/log.capnp.c++
  6. 109
      cereal/gen/cpp/log.capnp.h
  7. 2
      cereal/log.capnp
  8. 2
      common/realtime.py
  9. 4
      common/services.py
  10. 6
      selfdrive/boardd/boardd.cc
  11. 2
      selfdrive/car/honda/carcontroller.py
  12. 2
      selfdrive/common/version.h
  13. 7
      selfdrive/controls/controlsd.py
  14. 16
      selfdrive/controls/lib/alertmanager.py
  15. 6
      selfdrive/manager.py
  16. 2
      selfdrive/thermal.py
  17. 2
      selfdrive/visiond/visiond

@ -20,7 +20,7 @@ Supported Cars
- Acura ILX 2016 with AcuraWatch Plus - Acura ILX 2016 with AcuraWatch Plus
- Limitations: Due to use of the cruise control for gas, it can only be enabled above 25 mph - Limitations: Due to use of the cruise control for gas, it can only be enabled above 25 mph
- Honda Civic 2016 Touring Edition - Honda Civic 2016 with Honda Sensing
- Limitations: Due to limitations in steering firmware, steering is disabled below 18 mph - Limitations: Due to limitations in steering firmware, steering is disabled below 18 mph
Directory structure Directory structure

@ -1,3 +1,9 @@
Version 0.2.7 (2017-02-08)
===========================
* Better performance and pictures at night
* Fix ptr alignment issue in boardd
* Fix brake error light, fix crash if too cold
Version 0.2.6 (2017-01-31) Version 0.2.6 (2017-01-31)
=========================== ===========================
* Fix bug in visiond model execution * Fix bug in visiond model execution

@ -280,12 +280,12 @@ void cereal_set_CanData(const struct cereal_CanData *s, cereal_CanData_list l, i
cereal_ThermalData_ptr cereal_new_ThermalData(struct capn_segment *s) { cereal_ThermalData_ptr cereal_new_ThermalData(struct capn_segment *s) {
cereal_ThermalData_ptr p; cereal_ThermalData_ptr p;
p.p = capn_new_struct(s, 24, 0); p.p = capn_new_struct(s, 24, 1);
return p; return p;
} }
cereal_ThermalData_list cereal_new_ThermalData_list(struct capn_segment *s, int len) { cereal_ThermalData_list cereal_new_ThermalData_list(struct capn_segment *s, int len) {
cereal_ThermalData_list p; cereal_ThermalData_list p;
p.p = capn_new_list(s, len, 24, 0); p.p = capn_new_list(s, len, 24, 1);
return p; return p;
} }
void cereal_read_ThermalData(struct cereal_ThermalData *s, cereal_ThermalData_ptr p) { void cereal_read_ThermalData(struct cereal_ThermalData *s, cereal_ThermalData_ptr p) {
@ -299,6 +299,7 @@ void cereal_read_ThermalData(struct cereal_ThermalData *s, cereal_ThermalData_pt
s->bat = capn_read32(p.p, 12); s->bat = capn_read32(p.p, 12);
s->freeSpace = capn_to_f32(capn_read32(p.p, 16)); s->freeSpace = capn_to_f32(capn_read32(p.p, 16));
s->batteryPercent = (int16_t) ((int16_t)capn_read16(p.p, 20)); s->batteryPercent = (int16_t) ((int16_t)capn_read16(p.p, 20));
s->batteryStatus = capn_get_text(p.p, 0, capn_val0);
} }
void cereal_write_ThermalData(const struct cereal_ThermalData *s, cereal_ThermalData_ptr p) { void cereal_write_ThermalData(const struct cereal_ThermalData *s, cereal_ThermalData_ptr p) {
capn_resolve(&p.p); capn_resolve(&p.p);
@ -311,6 +312,7 @@ void cereal_write_ThermalData(const struct cereal_ThermalData *s, cereal_Thermal
capn_write32(p.p, 12, s->bat); capn_write32(p.p, 12, s->bat);
capn_write32(p.p, 16, capn_from_f32(s->freeSpace)); capn_write32(p.p, 16, capn_from_f32(s->freeSpace));
capn_write16(p.p, 20, (uint16_t) (s->batteryPercent)); capn_write16(p.p, 20, (uint16_t) (s->batteryPercent));
capn_set_text(p.p, 0, s->batteryStatus);
} }
void cereal_get_ThermalData(struct cereal_ThermalData *s, cereal_ThermalData_list l, int i) { void cereal_get_ThermalData(struct cereal_ThermalData *s, cereal_ThermalData_list l, int i) {
cereal_ThermalData_ptr p; cereal_ThermalData_ptr p;
@ -1018,7 +1020,8 @@ void cereal_read_Event(struct cereal_Event *s, cereal_Event_ptr p) {
case cereal_Event_androidLogEntry: case cereal_Event_androidLogEntry:
case cereal_Event_gpsLocation: case cereal_Event_gpsLocation:
case cereal_Event_carState: case cereal_Event_carState:
s->carState.p = capn_getp(p.p, 0, 0); case cereal_Event_carControl:
s->carControl.p = capn_getp(p.p, 0, 0);
break; break;
default: default:
break; break;
@ -1053,7 +1056,8 @@ void cereal_write_Event(const struct cereal_Event *s, cereal_Event_ptr p) {
case cereal_Event_androidLogEntry: case cereal_Event_androidLogEntry:
case cereal_Event_gpsLocation: case cereal_Event_gpsLocation:
case cereal_Event_carState: case cereal_Event_carState:
capn_setp(p.p, 0, s->carState.p); case cereal_Event_carControl:
capn_setp(p.p, 0, s->carControl.p);
break; break;
default: default:
break; break;

@ -224,13 +224,14 @@ struct cereal_ThermalData {
uint32_t bat; uint32_t bat;
float freeSpace; float freeSpace;
int16_t batteryPercent; int16_t batteryPercent;
capn_text batteryStatus;
}; };
static const size_t cereal_ThermalData_word_count = 3; static const size_t cereal_ThermalData_word_count = 3;
static const size_t cereal_ThermalData_pointer_count = 0; static const size_t cereal_ThermalData_pointer_count = 1;
static const size_t cereal_ThermalData_struct_bytes_count = 24; static const size_t cereal_ThermalData_struct_bytes_count = 32;
struct cereal_HealthData { struct cereal_HealthData {
uint32_t voltage; uint32_t voltage;
@ -509,7 +510,8 @@ enum cereal_Event_which {
cereal_Event_liveCalibration = 18, cereal_Event_liveCalibration = 18,
cereal_Event_androidLogEntry = 19, cereal_Event_androidLogEntry = 19,
cereal_Event_gpsLocation = 20, cereal_Event_gpsLocation = 20,
cereal_Event_carState = 21 cereal_Event_carState = 21,
cereal_Event_carControl = 22
}; };
struct cereal_Event { struct cereal_Event {
@ -538,6 +540,7 @@ struct cereal_Event {
cereal_AndroidLogEntry_ptr androidLogEntry; cereal_AndroidLogEntry_ptr androidLogEntry;
cereal_GpsLocationData_ptr gpsLocation; cereal_GpsLocationData_ptr gpsLocation;
cereal_CarState_ptr carState; cereal_CarState_ptr carState;
cereal_CarControl_ptr carControl;
}; };
}; };

@ -862,87 +862,94 @@ const ::capnp::_::RawSchema s_8785009a964c7c59 = {
0, 4, i_8785009a964c7c59, nullptr, nullptr, { &s_8785009a964c7c59, nullptr, nullptr, 0, 0, nullptr } 0, 4, i_8785009a964c7c59, nullptr, nullptr, { &s_8785009a964c7c59, nullptr, nullptr, 0, 0, nullptr }
}; };
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<154> b_8d8231a40b7fe6e0 = { static const ::capnp::_::AlignedData<170> b_8d8231a40b7fe6e0 = {
{ 0, 0, 0, 0, 5, 0, 6, 0, { 0, 0, 0, 0, 5, 0, 6, 0,
224, 230, 127, 11, 164, 49, 130, 141, 224, 230, 127, 11, 164, 49, 130, 141,
10, 0, 0, 0, 1, 0, 3, 0, 10, 0, 0, 0, 1, 0, 3, 0,
91, 40, 164, 37, 126, 241, 177, 243, 91, 40, 164, 37, 126, 241, 177, 243,
0, 0, 7, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 178, 0, 0, 0, 21, 0, 0, 0, 178, 0, 0, 0,
29, 0, 0, 0, 7, 0, 0, 0, 29, 0, 0, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
25, 0, 0, 0, 255, 1, 0, 0, 25, 0, 0, 0, 55, 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,
108, 111, 103, 46, 99, 97, 112, 110, 108, 111, 103, 46, 99, 97, 112, 110,
112, 58, 84, 104, 101, 114, 109, 97, 112, 58, 84, 104, 101, 114, 109, 97,
108, 68, 97, 116, 97, 0, 0, 0, 108, 68, 97, 116, 97, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0,
36, 0, 0, 0, 3, 0, 4, 0, 40, 0, 0, 0, 3, 0, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 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,
237, 0, 0, 0, 42, 0, 0, 0, 9, 1, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
232, 0, 0, 0, 3, 0, 1, 0, 4, 1, 0, 0, 3, 0, 1, 0,
244, 0, 0, 0, 2, 0, 1, 0, 16, 1, 0, 0, 2, 0, 1, 0,
1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
241, 0, 0, 0, 42, 0, 0, 0, 13, 1, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
236, 0, 0, 0, 3, 0, 1, 0, 8, 1, 0, 0, 3, 0, 1, 0,
248, 0, 0, 0, 2, 0, 1, 0, 20, 1, 0, 0, 2, 0, 1, 0,
2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0,
0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
245, 0, 0, 0, 42, 0, 0, 0, 17, 1, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
240, 0, 0, 0, 3, 0, 1, 0, 12, 1, 0, 0, 3, 0, 1, 0,
252, 0, 0, 0, 2, 0, 1, 0, 24, 1, 0, 0, 2, 0, 1, 0,
3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0,
0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
249, 0, 0, 0, 42, 0, 0, 0, 21, 1, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
244, 0, 0, 0, 3, 0, 1, 0, 16, 1, 0, 0, 3, 0, 1, 0,
0, 1, 0, 0, 2, 0, 1, 0, 28, 1, 0, 0, 2, 0, 1, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
253, 0, 0, 0, 34, 0, 0, 0, 25, 1, 0, 0, 34, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
248, 0, 0, 0, 3, 0, 1, 0, 20, 1, 0, 0, 3, 0, 1, 0,
4, 1, 0, 0, 2, 0, 1, 0, 32, 1, 0, 0, 2, 0, 1, 0,
5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0,
0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 0, 0, 34, 0, 0, 0, 29, 1, 0, 0, 34, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
252, 0, 0, 0, 3, 0, 1, 0, 24, 1, 0, 0, 3, 0, 1, 0,
8, 1, 0, 0, 2, 0, 1, 0, 36, 1, 0, 0, 2, 0, 1, 0,
6, 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0,
0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5, 1, 0, 0, 34, 0, 0, 0, 33, 1, 0, 0, 34, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 3, 0, 1, 0, 28, 1, 0, 0, 3, 0, 1, 0,
12, 1, 0, 0, 2, 0, 1, 0, 40, 1, 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, 7, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9, 1, 0, 0, 82, 0, 0, 0, 37, 1, 0, 0, 82, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8, 1, 0, 0, 3, 0, 1, 0, 36, 1, 0, 0, 3, 0, 1, 0,
20, 1, 0, 0, 2, 0, 1, 0, 48, 1, 0, 0, 2, 0, 1, 0,
8, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0,
0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17, 1, 0, 0, 122, 0, 0, 0, 45, 1, 0, 0, 122, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
16, 1, 0, 0, 3, 0, 1, 0, 44, 1, 0, 0, 3, 0, 1, 0,
28, 1, 0, 0, 2, 0, 1, 0, 56, 1, 0, 0, 2, 0, 1, 0,
9, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
53, 1, 0, 0, 114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
52, 1, 0, 0, 3, 0, 1, 0,
64, 1, 0, 0, 2, 0, 1, 0,
99, 112, 117, 48, 0, 0, 0, 0, 99, 112, 117, 48, 0, 0, 0, 0,
7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@ -1015,16 +1022,25 @@ static const ::capnp::_::AlignedData<154> b_8d8231a40b7fe6e0 = {
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,
3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
98, 97, 116, 116, 101, 114, 121, 83,
116, 97, 116, 117, 115, 0, 0, 0,
12, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
12, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, } 0, 0, 0, 0, 0, 0, 0, 0, }
}; };
::capnp::word const* const bp_8d8231a40b7fe6e0 = b_8d8231a40b7fe6e0.words; ::capnp::word const* const bp_8d8231a40b7fe6e0 = b_8d8231a40b7fe6e0.words;
#if !CAPNP_LITE #if !CAPNP_LITE
static const uint16_t m_8d8231a40b7fe6e0[] = {6, 8, 0, 1, 2, 3, 7, 5, 4}; static const uint16_t m_8d8231a40b7fe6e0[] = {6, 8, 9, 0, 1, 2, 3, 7, 5, 4};
static const uint16_t i_8d8231a40b7fe6e0[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; static const uint16_t i_8d8231a40b7fe6e0[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
const ::capnp::_::RawSchema s_8d8231a40b7fe6e0 = { const ::capnp::_::RawSchema s_8d8231a40b7fe6e0 = {
0x8d8231a40b7fe6e0, b_8d8231a40b7fe6e0.words, 154, nullptr, m_8d8231a40b7fe6e0, 0x8d8231a40b7fe6e0, b_8d8231a40b7fe6e0.words, 170, nullptr, m_8d8231a40b7fe6e0,
0, 9, i_8d8231a40b7fe6e0, nullptr, nullptr, { &s_8d8231a40b7fe6e0, nullptr, nullptr, 0, 0, nullptr } 0, 10, i_8d8231a40b7fe6e0, nullptr, nullptr, { &s_8d8231a40b7fe6e0, nullptr, nullptr, 0, 0, nullptr }
}; };
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<112> b_cfa2b0c2c82af1e4 = { static const ::capnp::_::AlignedData<112> b_cfa2b0c2c82af1e4 = {
@ -3339,184 +3355,191 @@ const ::capnp::_::RawSchema s_9811e1f38f62f2d1 = {
0, 2, i_9811e1f38f62f2d1, nullptr, nullptr, { &s_9811e1f38f62f2d1, nullptr, nullptr, 0, 0, nullptr } 0, 2, i_9811e1f38f62f2d1, nullptr, nullptr, { &s_9811e1f38f62f2d1, nullptr, nullptr, 0, 0, nullptr }
}; };
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<398> b_d314cfd957229c11 = { static const ::capnp::_::AlignedData<414> b_d314cfd957229c11 = {
{ 0, 0, 0, 0, 5, 0, 6, 0, { 0, 0, 0, 0, 5, 0, 6, 0,
17, 156, 34, 87, 217, 207, 20, 211, 17, 156, 34, 87, 217, 207, 20, 211,
10, 0, 0, 0, 1, 0, 2, 0, 10, 0, 0, 0, 1, 0, 2, 0,
91, 40, 164, 37, 126, 241, 177, 243, 91, 40, 164, 37, 126, 241, 177, 243,
1, 0, 7, 0, 0, 0, 22, 0, 1, 0, 7, 0, 0, 0, 23, 0,
4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 130, 0, 0, 0, 21, 0, 0, 0, 130, 0, 0, 0,
25, 0, 0, 0, 7, 0, 0, 0, 25, 0, 0, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 15, 5, 0, 0, 21, 0, 0, 0, 71, 5, 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,
108, 111, 103, 46, 99, 97, 112, 110, 108, 111, 103, 46, 99, 97, 112, 110,
112, 58, 69, 118, 101, 110, 116, 0, 112, 58, 69, 118, 101, 110, 116, 0,
0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0,
92, 0, 0, 0, 3, 0, 4, 0, 96, 0, 0, 0, 3, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
117, 2, 0, 0, 98, 0, 0, 0, 145, 2, 0, 0, 98, 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, 144, 2, 0, 0, 3, 0, 1, 0,
128, 2, 0, 0, 2, 0, 1, 0, 156, 2, 0, 0, 2, 0, 1, 0,
1, 0, 255, 255, 0, 0, 0, 0, 1, 0, 255, 255, 0, 0, 0, 0,
0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
125, 2, 0, 0, 74, 0, 0, 0, 153, 2, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
124, 2, 0, 0, 3, 0, 1, 0, 152, 2, 0, 0, 3, 0, 1, 0,
136, 2, 0, 0, 2, 0, 1, 0, 164, 2, 0, 0, 2, 0, 1, 0,
2, 0, 254, 255, 0, 0, 0, 0, 2, 0, 254, 255, 0, 0, 0, 0,
0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
133, 2, 0, 0, 50, 0, 0, 0, 161, 2, 0, 0, 50, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
128, 2, 0, 0, 3, 0, 1, 0, 156, 2, 0, 0, 3, 0, 1, 0,
140, 2, 0, 0, 2, 0, 1, 0, 168, 2, 0, 0, 2, 0, 1, 0,
3, 0, 253, 255, 0, 0, 0, 0, 3, 0, 253, 255, 0, 0, 0, 0,
0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
137, 2, 0, 0, 66, 0, 0, 0, 165, 2, 0, 0, 66, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
132, 2, 0, 0, 3, 0, 1, 0, 160, 2, 0, 0, 3, 0, 1, 0,
144, 2, 0, 0, 2, 0, 1, 0, 172, 2, 0, 0, 2, 0, 1, 0,
4, 0, 252, 255, 0, 0, 0, 0, 4, 0, 252, 255, 0, 0, 0, 0,
0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
141, 2, 0, 0, 178, 0, 0, 0, 169, 2, 0, 0, 178, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
144, 2, 0, 0, 3, 0, 1, 0, 172, 2, 0, 0, 3, 0, 1, 0,
156, 2, 0, 0, 2, 0, 1, 0, 184, 2, 0, 0, 2, 0, 1, 0,
5, 0, 251, 255, 0, 0, 0, 0, 5, 0, 251, 255, 0, 0, 0, 0,
0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
153, 2, 0, 0, 34, 0, 0, 0, 181, 2, 0, 0, 34, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
148, 2, 0, 0, 3, 0, 1, 0, 176, 2, 0, 0, 3, 0, 1, 0,
176, 2, 0, 0, 2, 0, 1, 0, 204, 2, 0, 0, 2, 0, 1, 0,
6, 0, 250, 255, 0, 0, 0, 0, 6, 0, 250, 255, 0, 0, 0, 0,
0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
173, 2, 0, 0, 66, 0, 0, 0, 201, 2, 0, 0, 66, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
168, 2, 0, 0, 3, 0, 1, 0, 196, 2, 0, 0, 3, 0, 1, 0,
180, 2, 0, 0, 2, 0, 1, 0, 208, 2, 0, 0, 2, 0, 1, 0,
7, 0, 249, 255, 0, 0, 0, 0, 7, 0, 249, 255, 0, 0, 0, 0,
0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
177, 2, 0, 0, 66, 0, 0, 0, 205, 2, 0, 0, 66, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
172, 2, 0, 0, 3, 0, 1, 0, 200, 2, 0, 0, 3, 0, 1, 0,
184, 2, 0, 0, 2, 0, 1, 0, 212, 2, 0, 0, 2, 0, 1, 0,
8, 0, 248, 255, 0, 0, 0, 0, 8, 0, 248, 255, 0, 0, 0, 0,
0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
181, 2, 0, 0, 162, 0, 0, 0, 209, 2, 0, 0, 162, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
184, 2, 0, 0, 3, 0, 1, 0, 212, 2, 0, 0, 3, 0, 1, 0,
212, 2, 0, 0, 2, 0, 1, 0, 240, 2, 0, 0, 2, 0, 1, 0,
9, 0, 247, 255, 0, 0, 0, 0, 9, 0, 247, 255, 0, 0, 0, 0,
0, 0, 1, 0, 9, 0, 0, 0, 0, 0, 1, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
209, 2, 0, 0, 50, 0, 0, 0, 237, 2, 0, 0, 50, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
204, 2, 0, 0, 3, 0, 1, 0, 232, 2, 0, 0, 3, 0, 1, 0,
216, 2, 0, 0, 2, 0, 1, 0, 244, 2, 0, 0, 2, 0, 1, 0,
10, 0, 246, 255, 0, 0, 0, 0, 10, 0, 246, 255, 0, 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,
213, 2, 0, 0, 74, 0, 0, 0, 241, 2, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
212, 2, 0, 0, 3, 0, 1, 0, 240, 2, 0, 0, 3, 0, 1, 0,
224, 2, 0, 0, 2, 0, 1, 0, 252, 2, 0, 0, 2, 0, 1, 0,
11, 0, 245, 255, 0, 0, 0, 0, 11, 0, 245, 255, 0, 0, 0, 0,
0, 0, 1, 0, 11, 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,
221, 2, 0, 0, 106, 0, 0, 0, 249, 2, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
220, 2, 0, 0, 3, 0, 1, 0, 248, 2, 0, 0, 3, 0, 1, 0,
248, 2, 0, 0, 2, 0, 1, 0, 20, 3, 0, 0, 2, 0, 1, 0,
12, 0, 244, 255, 0, 0, 0, 0, 12, 0, 244, 255, 0, 0, 0, 0,
0, 0, 1, 0, 12, 0, 0, 0, 0, 0, 1, 0, 12, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
245, 2, 0, 0, 58, 0, 0, 0, 17, 3, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
240, 2, 0, 0, 3, 0, 1, 0, 12, 3, 0, 0, 3, 0, 1, 0,
252, 2, 0, 0, 2, 0, 1, 0, 24, 3, 0, 0, 2, 0, 1, 0,
13, 0, 243, 255, 0, 0, 0, 0, 13, 0, 243, 255, 0, 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,
249, 2, 0, 0, 58, 0, 0, 0, 21, 3, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
244, 2, 0, 0, 3, 0, 1, 0, 16, 3, 0, 0, 3, 0, 1, 0,
0, 3, 0, 0, 2, 0, 1, 0, 28, 3, 0, 0, 2, 0, 1, 0,
14, 0, 242, 255, 0, 0, 0, 0, 14, 0, 242, 255, 0, 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,
253, 2, 0, 0, 138, 0, 0, 0, 25, 3, 0, 0, 138, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 3, 0, 0, 3, 0, 1, 0, 28, 3, 0, 0, 3, 0, 1, 0,
12, 3, 0, 0, 2, 0, 1, 0, 40, 3, 0, 0, 2, 0, 1, 0,
15, 0, 241, 255, 0, 0, 0, 0, 15, 0, 241, 255, 0, 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,
9, 3, 0, 0, 82, 0, 0, 0, 37, 3, 0, 0, 82, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8, 3, 0, 0, 3, 0, 1, 0, 36, 3, 0, 0, 3, 0, 1, 0,
20, 3, 0, 0, 2, 0, 1, 0, 48, 3, 0, 0, 2, 0, 1, 0,
16, 0, 240, 255, 0, 0, 0, 0, 16, 0, 240, 255, 0, 0, 0, 0,
0, 0, 1, 0, 16, 0, 0, 0, 0, 0, 1, 0, 16, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17, 3, 0, 0, 90, 0, 0, 0, 45, 3, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
16, 3, 0, 0, 3, 0, 1, 0, 44, 3, 0, 0, 3, 0, 1, 0,
44, 3, 0, 0, 2, 0, 1, 0, 72, 3, 0, 0, 2, 0, 1, 0,
17, 0, 239, 255, 0, 0, 0, 0, 17, 0, 239, 255, 0, 0, 0, 0,
0, 0, 1, 0, 17, 0, 0, 0, 0, 0, 1, 0, 17, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
41, 3, 0, 0, 66, 0, 0, 0, 69, 3, 0, 0, 66, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
36, 3, 0, 0, 3, 0, 1, 0, 64, 3, 0, 0, 3, 0, 1, 0,
64, 3, 0, 0, 2, 0, 1, 0, 92, 3, 0, 0, 2, 0, 1, 0,
18, 0, 238, 255, 0, 0, 0, 0, 18, 0, 238, 255, 0, 0, 0, 0,
0, 0, 1, 0, 18, 0, 0, 0, 0, 0, 1, 0, 18, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
61, 3, 0, 0, 90, 0, 0, 0, 89, 3, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60, 3, 0, 0, 3, 0, 1, 0, 88, 3, 0, 0, 3, 0, 1, 0,
72, 3, 0, 0, 2, 0, 1, 0, 100, 3, 0, 0, 2, 0, 1, 0,
19, 0, 237, 255, 0, 0, 0, 0, 19, 0, 237, 255, 0, 0, 0, 0,
0, 0, 1, 0, 19, 0, 0, 0, 0, 0, 1, 0, 19, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
69, 3, 0, 0, 130, 0, 0, 0, 97, 3, 0, 0, 130, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
68, 3, 0, 0, 3, 0, 1, 0, 96, 3, 0, 0, 3, 0, 1, 0,
80, 3, 0, 0, 2, 0, 1, 0, 108, 3, 0, 0, 2, 0, 1, 0,
20, 0, 236, 255, 0, 0, 0, 0, 20, 0, 236, 255, 0, 0, 0, 0,
0, 0, 1, 0, 20, 0, 0, 0, 0, 0, 1, 0, 20, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
77, 3, 0, 0, 130, 0, 0, 0, 105, 3, 0, 0, 130, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
76, 3, 0, 0, 3, 0, 1, 0, 104, 3, 0, 0, 3, 0, 1, 0,
88, 3, 0, 0, 2, 0, 1, 0, 116, 3, 0, 0, 2, 0, 1, 0,
21, 0, 235, 255, 0, 0, 0, 0, 21, 0, 235, 255, 0, 0, 0, 0,
0, 0, 1, 0, 21, 0, 0, 0, 0, 0, 1, 0, 21, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
85, 3, 0, 0, 98, 0, 0, 0, 113, 3, 0, 0, 98, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
84, 3, 0, 0, 3, 0, 1, 0, 112, 3, 0, 0, 3, 0, 1, 0,
96, 3, 0, 0, 2, 0, 1, 0, 124, 3, 0, 0, 2, 0, 1, 0,
22, 0, 234, 255, 0, 0, 0, 0, 22, 0, 234, 255, 0, 0, 0, 0,
0, 0, 1, 0, 22, 0, 0, 0, 0, 0, 1, 0, 22, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
93, 3, 0, 0, 74, 0, 0, 0, 121, 3, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
120, 3, 0, 0, 3, 0, 1, 0,
132, 3, 0, 0, 2, 0, 1, 0,
23, 0, 233, 255, 0, 0, 0, 0,
0, 0, 1, 0, 23, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
129, 3, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
92, 3, 0, 0, 3, 0, 1, 0, 128, 3, 0, 0, 3, 0, 1, 0,
104, 3, 0, 0, 2, 0, 1, 0, 140, 3, 0, 0, 2, 0, 1, 0,
108, 111, 103, 77, 111, 110, 111, 84, 108, 111, 103, 77, 111, 110, 111, 84,
105, 109, 101, 0, 0, 0, 0, 0, 105, 109, 101, 0, 0, 0, 0, 0,
9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
@ -3735,6 +3758,15 @@ static const ::capnp::_::AlignedData<398> b_d314cfd957229c11 = {
60, 144, 82, 224, 9, 250, 164, 157, 60, 144, 82, 224, 9, 250, 164, 157,
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,
16, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
99, 97, 114, 67, 111, 110, 116, 114,
111, 108, 0, 0, 0, 0, 0, 0,
16, 0, 0, 0, 0, 0, 0, 0,
175, 20, 184, 154, 4, 41, 136, 247,
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,
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, }
@ -3761,12 +3793,13 @@ static const ::capnp::_::RawSchema* const d_d314cfd957229c11[] = {
&s_e946524859add50e, &s_e946524859add50e,
&s_ea0245f695ae0a33, &s_ea0245f695ae0a33,
&s_ea095da1894f7d85, &s_ea095da1894f7d85,
&s_f78829049ab814af,
}; };
static const uint16_t m_d314cfd957229c11[] = {20, 5, 22, 15, 10, 2, 21, 3, 12, 1, 7, 13, 19, 8, 16, 14, 18, 0, 9, 17, 4, 11, 6}; static const uint16_t m_d314cfd957229c11[] = {20, 5, 23, 22, 15, 10, 2, 21, 3, 12, 1, 7, 13, 19, 8, 16, 14, 18, 0, 9, 17, 4, 11, 6};
static const uint16_t i_d314cfd957229c11[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0}; static const uint16_t i_d314cfd957229c11[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0};
const ::capnp::_::RawSchema s_d314cfd957229c11 = { const ::capnp::_::RawSchema s_d314cfd957229c11 = {
0xd314cfd957229c11, b_d314cfd957229c11.words, 398, d_d314cfd957229c11, m_d314cfd957229c11, 0xd314cfd957229c11, b_d314cfd957229c11.words, 414, d_d314cfd957229c11, m_d314cfd957229c11,
19, 23, i_d314cfd957229c11, nullptr, nullptr, { &s_d314cfd957229c11, nullptr, nullptr, 0, 0, nullptr } 20, 24, i_d314cfd957229c11, nullptr, nullptr, { &s_d314cfd957229c11, nullptr, nullptr, 0, 0, nullptr }
}; };
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
} // namespace schemas } // namespace schemas

@ -185,7 +185,7 @@ struct ThermalData {
class Pipeline; class Pipeline;
struct _capnpPrivate { struct _capnpPrivate {
CAPNP_DECLARE_STRUCT_HEADER(8d8231a40b7fe6e0, 3, 0) CAPNP_DECLARE_STRUCT_HEADER(8d8231a40b7fe6e0, 3, 1)
#if !CAPNP_LITE #if !CAPNP_LITE
static constexpr ::capnp::_::RawBrandedSchema const* brand = &schema->defaultBrand; static constexpr ::capnp::_::RawBrandedSchema const* brand = &schema->defaultBrand;
#endif // !CAPNP_LITE #endif // !CAPNP_LITE
@ -467,6 +467,7 @@ struct Event {
ANDROID_LOG_ENTRY, ANDROID_LOG_ENTRY,
GPS_LOCATION, GPS_LOCATION,
CAR_STATE, CAR_STATE,
CAR_CONTROL,
}; };
struct _capnpPrivate { struct _capnpPrivate {
@ -1258,6 +1259,9 @@ public:
inline ::int16_t getBatteryPercent() const; inline ::int16_t getBatteryPercent() const;
inline bool hasBatteryStatus() const;
inline ::capnp::Text::Reader getBatteryStatus() const;
private: private:
::capnp::_::StructReader _reader; ::capnp::_::StructReader _reader;
template <typename, ::capnp::Kind> template <typename, ::capnp::Kind>
@ -1313,6 +1317,13 @@ public:
inline ::int16_t getBatteryPercent(); inline ::int16_t getBatteryPercent();
inline void setBatteryPercent( ::int16_t value); inline void setBatteryPercent( ::int16_t value);
inline bool hasBatteryStatus();
inline ::capnp::Text::Builder getBatteryStatus();
inline void setBatteryStatus( ::capnp::Text::Reader value);
inline ::capnp::Text::Builder initBatteryStatus(unsigned int size);
inline void adoptBatteryStatus(::capnp::Orphan< ::capnp::Text>&& value);
inline ::capnp::Orphan< ::capnp::Text> disownBatteryStatus();
private: private:
::capnp::_::StructBuilder _builder; ::capnp::_::StructBuilder _builder;
template <typename, ::capnp::Kind> template <typename, ::capnp::Kind>
@ -3285,6 +3296,10 @@ public:
inline bool hasCarState() const; inline bool hasCarState() const;
inline ::cereal::CarState::Reader getCarState() const; inline ::cereal::CarState::Reader getCarState() const;
inline bool isCarControl() const;
inline bool hasCarControl() const;
inline ::cereal::CarControl::Reader getCarControl() const;
private: private:
::capnp::_::StructReader _reader; ::capnp::_::StructReader _reader;
template <typename, ::capnp::Kind> template <typename, ::capnp::Kind>
@ -3493,6 +3508,14 @@ public:
inline void adoptCarState(::capnp::Orphan< ::cereal::CarState>&& value); inline void adoptCarState(::capnp::Orphan< ::cereal::CarState>&& value);
inline ::capnp::Orphan< ::cereal::CarState> disownCarState(); inline ::capnp::Orphan< ::cereal::CarState> disownCarState();
inline bool isCarControl();
inline bool hasCarControl();
inline ::cereal::CarControl::Builder getCarControl();
inline void setCarControl( ::cereal::CarControl::Reader value);
inline ::cereal::CarControl::Builder initCarControl();
inline void adoptCarControl(::capnp::Orphan< ::cereal::CarControl>&& value);
inline ::capnp::Orphan< ::cereal::CarControl> disownCarControl();
private: private:
::capnp::_::StructBuilder _builder; ::capnp::_::StructBuilder _builder;
template <typename, ::capnp::Kind> template <typename, ::capnp::Kind>
@ -4444,6 +4467,38 @@ inline void ThermalData::Builder::setBatteryPercent( ::int16_t value) {
10 * ::capnp::ELEMENTS, value); 10 * ::capnp::ELEMENTS, value);
} }
inline bool ThermalData::Reader::hasBatteryStatus() const {
return !_reader.getPointerField(0 * ::capnp::POINTERS).isNull();
}
inline bool ThermalData::Builder::hasBatteryStatus() {
return !_builder.getPointerField(0 * ::capnp::POINTERS).isNull();
}
inline ::capnp::Text::Reader ThermalData::Reader::getBatteryStatus() const {
return ::capnp::_::PointerHelpers< ::capnp::Text>::get(
_reader.getPointerField(0 * ::capnp::POINTERS));
}
inline ::capnp::Text::Builder ThermalData::Builder::getBatteryStatus() {
return ::capnp::_::PointerHelpers< ::capnp::Text>::get(
_builder.getPointerField(0 * ::capnp::POINTERS));
}
inline void ThermalData::Builder::setBatteryStatus( ::capnp::Text::Reader value) {
::capnp::_::PointerHelpers< ::capnp::Text>::set(
_builder.getPointerField(0 * ::capnp::POINTERS), value);
}
inline ::capnp::Text::Builder ThermalData::Builder::initBatteryStatus(unsigned int size) {
return ::capnp::_::PointerHelpers< ::capnp::Text>::init(
_builder.getPointerField(0 * ::capnp::POINTERS), size);
}
inline void ThermalData::Builder::adoptBatteryStatus(
::capnp::Orphan< ::capnp::Text>&& value) {
::capnp::_::PointerHelpers< ::capnp::Text>::adopt(
_builder.getPointerField(0 * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::capnp::Text> ThermalData::Builder::disownBatteryStatus() {
return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(
_builder.getPointerField(0 * ::capnp::POINTERS));
}
inline ::uint32_t HealthData::Reader::getVoltage() const { inline ::uint32_t HealthData::Reader::getVoltage() const {
return _reader.getDataField< ::uint32_t>( return _reader.getDataField< ::uint32_t>(
0 * ::capnp::ELEMENTS); 0 * ::capnp::ELEMENTS);
@ -7702,6 +7757,58 @@ inline ::capnp::Orphan< ::cereal::CarState> Event::Builder::disownCarState() {
_builder.getPointerField(0 * ::capnp::POINTERS)); _builder.getPointerField(0 * ::capnp::POINTERS));
} }
inline bool Event::Reader::isCarControl() const {
return which() == Event::CAR_CONTROL;
}
inline bool Event::Builder::isCarControl() {
return which() == Event::CAR_CONTROL;
}
inline bool Event::Reader::hasCarControl() const {
if (which() != Event::CAR_CONTROL) return false;
return !_reader.getPointerField(0 * ::capnp::POINTERS).isNull();
}
inline bool Event::Builder::hasCarControl() {
if (which() != Event::CAR_CONTROL) return false;
return !_builder.getPointerField(0 * ::capnp::POINTERS).isNull();
}
inline ::cereal::CarControl::Reader Event::Reader::getCarControl() const {
KJ_IREQUIRE(which() == Event::CAR_CONTROL,
"Must check which() before get()ing a union member.");
return ::capnp::_::PointerHelpers< ::cereal::CarControl>::get(
_reader.getPointerField(0 * ::capnp::POINTERS));
}
inline ::cereal::CarControl::Builder Event::Builder::getCarControl() {
KJ_IREQUIRE(which() == Event::CAR_CONTROL,
"Must check which() before get()ing a union member.");
return ::capnp::_::PointerHelpers< ::cereal::CarControl>::get(
_builder.getPointerField(0 * ::capnp::POINTERS));
}
inline void Event::Builder::setCarControl( ::cereal::CarControl::Reader value) {
_builder.setDataField<Event::Which>(
4 * ::capnp::ELEMENTS, Event::CAR_CONTROL);
::capnp::_::PointerHelpers< ::cereal::CarControl>::set(
_builder.getPointerField(0 * ::capnp::POINTERS), value);
}
inline ::cereal::CarControl::Builder Event::Builder::initCarControl() {
_builder.setDataField<Event::Which>(
4 * ::capnp::ELEMENTS, Event::CAR_CONTROL);
return ::capnp::_::PointerHelpers< ::cereal::CarControl>::init(
_builder.getPointerField(0 * ::capnp::POINTERS));
}
inline void Event::Builder::adoptCarControl(
::capnp::Orphan< ::cereal::CarControl>&& value) {
_builder.setDataField<Event::Which>(
4 * ::capnp::ELEMENTS, Event::CAR_CONTROL);
::capnp::_::PointerHelpers< ::cereal::CarControl>::adopt(
_builder.getPointerField(0 * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::cereal::CarControl> Event::Builder::disownCarControl() {
KJ_IREQUIRE(which() == Event::CAR_CONTROL,
"Must check which() before get()ing a union member.");
return ::capnp::_::PointerHelpers< ::cereal::CarControl>::disown(
_builder.getPointerField(0 * ::capnp::POINTERS));
}
} // namespace } // namespace
#endif // CAPNP_INCLUDED_f3b1f17e25a4285b_ #endif // CAPNP_INCLUDED_f3b1f17e25a4285b_

@ -103,6 +103,7 @@ struct ThermalData {
# not thermal # not thermal
freeSpace @7 :Float32; freeSpace @7 :Float32;
batteryPercent @8 :Int16; batteryPercent @8 :Int16;
batteryStatus @9: Text;
} }
struct HealthData { struct HealthData {
@ -313,5 +314,6 @@ struct Event {
androidLogEntry @20 :AndroidLogEntry; androidLogEntry @20 :AndroidLogEntry;
gpsLocation @21 :GpsLocationData; gpsLocation @21 :GpsLocationData;
carState @22 :Car.CarState; carState @22 :Car.CarState;
carControl @23 :Car.CarControl;
} }
} }

@ -96,7 +96,7 @@ class Ratekeeper(object):
remaining = self._next_frame_time - sec_since_boot() remaining = self._next_frame_time - sec_since_boot()
self._next_frame_time += self._interval self._next_frame_time += self._interval
if remaining < -self._print_delay_threshold: if remaining < -self._print_delay_threshold:
print(self._process_name, "lagging by", round(-remaining * 1000, 2), "ms") print("%s lagging by %.2f ms" % (self._process_name, -remaining * 1000))
lagged = True lagged = True
self._frame += 1 self._frame += 1
self._remaining = remaining self._remaining = remaining

@ -34,6 +34,8 @@ service_list = {
"liveCalibration": Service(8019, True), "liveCalibration": Service(8019, True),
"androidLog": Service(8020, True), "androidLog": Service(8020, True),
"carState": Service(8021, True), "carState": Service(8021, True),
# 8022 is reserved for sshd
"carControl": Service(8023, True),
} }
# manager -- base process to manage starting and stopping of all others # manager -- base process to manage starting and stopping of all others
@ -57,7 +59,7 @@ service_list = {
# controlsd -- actually drives the car # controlsd -- actually drives the car
# subscribes: can, thermal, model, live20 # subscribes: can, thermal, model, live20
# publishes: carState, sendcan, live100 # publishes: carState, carControl, sendcan, live100
# radard -- processes the radar data # radard -- processes the radar data
# subscribes: can, live100, model # subscribes: can, live100, model

@ -177,8 +177,10 @@ void can_send(void *s) {
err = zmq_msg_recv(&msg, s, 0); err = zmq_msg_recv(&msg, s, 0);
assert(err >= 0); assert(err >= 0);
// format for board // format for board, make copy due to alignment issues, will be freed on out of scope
auto amsg = kj::arrayPtr((const capnp::word*)zmq_msg_data(&msg), zmq_msg_size(&msg)); auto amsg = kj::heapArray<capnp::word>((zmq_msg_size(&msg) / sizeof(capnp::word)) + 1);
memcpy(amsg.begin(), zmq_msg_data(&msg), zmq_msg_size(&msg));
capnp::FlatArrayMessageReader cmsg(amsg); capnp::FlatArrayMessageReader cmsg(amsg);
cereal::Event::Reader event = cmsg.getRoot<cereal::Event>(); cereal::Event::Reader event = cmsg.getRoot<cereal::Event>();
int msg_count = event.getCan().size(); int msg_count = event.getCan().size();

@ -90,7 +90,7 @@ class CarController(object):
#print chime, alert_id, hud_alert #print chime, alert_id, hud_alert
fcw_display, steer_required, acc_alert = process_hud_alert(hud_alert) fcw_display, steer_required, acc_alert = process_hud_alert(hud_alert)
hud = HUDData(int(pcm_accel), int(hud_v_cruise), 0x41, hud_car, hud = HUDData(int(pcm_accel), int(hud_v_cruise), 0x01, hud_car,
0xc1, 0x41, hud_lanes + steer_required, 0xc1, 0x41, hud_lanes + steer_required,
int(snd_beep), 0x48, (snd_chime << 5) + fcw_display, acc_alert) int(snd_beep), 0x48, (snd_chime << 5) + fcw_display, acc_alert)

@ -1 +1 @@
const char *openpilot_version = "0.2.6"; const char *openpilot_version = "0.2.7";

@ -39,6 +39,7 @@ def controlsd_thread(gctx, rate=100): #rate in Hz
context = zmq.Context() context = zmq.Context()
live100 = messaging.pub_sock(context, service_list['live100'].port) live100 = messaging.pub_sock(context, service_list['live100'].port)
carstate = messaging.pub_sock(context, service_list['carState'].port) carstate = messaging.pub_sock(context, service_list['carState'].port)
carcontrol = messaging.pub_sock(context, service_list['carControl'].port)
thermal = messaging.sub_sock(context, service_list['thermal'].port) thermal = messaging.sub_sock(context, service_list['thermal'].port)
live20 = messaging.sub_sock(context, service_list['live20'].port) live20 = messaging.sub_sock(context, service_list['live20'].port)
@ -297,6 +298,12 @@ def controlsd_thread(gctx, rate=100): #rate in Hz
if not CI.apply(CC): if not CI.apply(CC):
AM.add("controlsFailed", enabled) AM.add("controlsFailed", enabled)
# broadcast carControl
cc_send = messaging.new_message()
cc_send.init('carControl')
cc_send.carControl = CC # copy?
carcontrol.send(cc_send.to_bytes())
prof.checkpoint("CarControl") prof.checkpoint("CarControl")
# ***** publish state to logger ***** # ***** publish state to logger *****

@ -1,4 +1,5 @@
from cereal import car from cereal import car
from selfdrive.swaglog import cloudlog
class ET: class ET:
ENABLE = 0 ENABLE = 0
@ -24,7 +25,7 @@ class alert(object):
tst = car.CarControl.new_message() tst = car.CarControl.new_message()
tst.hudControl.visualAlert = self.visual_alert tst.hudControl.visualAlert = self.visual_alert
tst.hudControl.audibleAlert = self.audible_alert tst.hudControl.audibleAlert = self.audible_alert
def __str__(self): def __str__(self):
return self.alert_text_1 + "/" + self.alert_text_2 + " " + str(self.alert_type) + " " + str(self.visual_alert) + " " + str(self.audible_alert) return self.alert_text_1 + "/" + self.alert_text_2 + " " + str(self.alert_type) + " " + str(self.visual_alert) + " " + str(self.audible_alert)
@ -74,7 +75,8 @@ class AlertManager(object):
return len(self.activealerts) > 0 and self.activealerts[0].alert_type >= ET.IMMEDIATE_DISABLE return len(self.activealerts) > 0 and self.activealerts[0].alert_type >= ET.IMMEDIATE_DISABLE
def add(self, alert_type, enabled = True): def add(self, alert_type, enabled = True):
this_alert = self.alerts[str(alert_type)] alert_type = str(alert_type)
this_alert = self.alerts[alert_type]
# downgrade the alert if we aren't enabled # downgrade the alert if we aren't enabled
if not enabled and this_alert.alert_type > ET.NO_ENTRY: if not enabled and this_alert.alert_type > ET.NO_ENTRY:
@ -84,6 +86,12 @@ class AlertManager(object):
if enabled and this_alert.alert_type < ET.WARNING: if enabled and this_alert.alert_type < ET.WARNING:
return return
# if new alert is different, log it
if self.current_alert is None or self.current_alert.alert_text_2 != this_alert.alert_text_2:
cloudlog.event('alert_add',
alert_type=alert_type,
enabled=enabled)
self.activealerts.append(this_alert) self.activealerts.append(this_alert)
self.activealerts.sort() self.activealerts.sort()
@ -110,6 +118,10 @@ class AlertManager(object):
alert_text_1 = self.current_alert.alert_text_1 alert_text_1 = self.current_alert.alert_text_1
alert_text_2 = self.current_alert.alert_text_2 alert_text_2 = self.current_alert.alert_text_2
# disable current alert
if self.alert_start_time + max(self.current_alert.duration_sound, self.current_alert.duration_hud_alert, self.current_alert.duration_text) < cur_time:
self.current_alert = None
# reset # reset
self.activealerts = [] self.activealerts = []

@ -211,6 +211,8 @@ def manager_thread():
msg.thermal.freeSpace = avail msg.thermal.freeSpace = avail
with open("/sys/class/power_supply/battery/capacity") as f: with open("/sys/class/power_supply/battery/capacity") as f:
msg.thermal.batteryPercent = int(f.read()) msg.thermal.batteryPercent = int(f.read())
with open("/sys/class/power_supply/battery/status") as f:
msg.thermal.batteryStatus = f.read().strip()
thermal_sock.send(msg.to_bytes()) thermal_sock.send(msg.to_bytes())
print msg print msg
@ -242,6 +244,10 @@ def manager_thread():
for p in car_started_processes: for p in car_started_processes:
kill_managed_process(p) kill_managed_process(p)
# shutdown if the battery gets lower than 10%, we aren't running, and we are discharging
if msg.thermal.batteryPercent < 5 and msg.thermal.batteryStatus == "Discharging":
os.system('LD_LIBRARY_PATH="" svc power shutdown')
# check the status of all processes, did any of them die? # check the status of all processes, did any of them die?
for p in running: for p in running:
cloudlog.debug(" running %s %s" % (p, running[p])) cloudlog.debug(" running %s %s" % (p, running[p]))

@ -3,7 +3,7 @@ import selfdrive.messaging as messaging
def read_tz(x): def read_tz(x):
with open("/sys/devices/virtual/thermal/thermal_zone%d/temp" % x) as f: with open("/sys/devices/virtual/thermal/thermal_zone%d/temp" % x) as f:
ret = int(f.read()) ret = max(0, int(f.read()))
return ret return ret
def read_thermal(): def read_thermal():

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:d7f447e6fe2a6c835360b89e746a4279d8e746f4fd5fa6cc63ba1233b610b454 oid sha256:da4a68e55f9861526f5543e561898b3d56b0ab8e57e90ec2e23d7adf79b2d337
size 14736912 size 14736912

Loading…
Cancel
Save