Add VW MEB can ignition (#3387)

* move can ignition to opendbc

* more tests

* init counters for deterministic test

* Revert "init counters for deterministic test"

This reverts commit d2abb4a9a6c3fde3bc4f4c4a396f62f4fab42de1.

* rm

* use getter/setter

* clean tests

* fix test

* add loop

* split into brand tests

* add vw meb can ignition

* smol

* bump
This commit is contained in:
Daniel Koepping
2026-05-13 15:04:20 -07:00
committed by GitHub
parent 31f5c16f54
commit 17286eba40
2 changed files with 53 additions and 0 deletions

View File

@@ -53,6 +53,19 @@ void ignition_can_hook(const CANPacket_t *msg) {
ignition_can = (msg->data[0] >> 5) == 0x6U; ignition_can = (msg->data[0] >> 5) == 0x6U;
ignition_can_cnt = 0U; ignition_can_cnt = 0U;
} }
// Volkswagen MEB exception
if ((msg->addr == 0x3C0U) && (len == 4)) {
int counter = msg->data[1] & 0xFU;
static int prev_counter_vw_meb = -1;
if ((counter == ((prev_counter_vw_meb + 1) % 16)) && (prev_counter_vw_meb != -1)) {
// Klemmen_Status_01->ZAS_Kl_15
ignition_can = ((msg->data[2] >> 1) & 1U) != 0U;
ignition_can_cnt = 0U;
}
prev_counter_vw_meb = counter;
}
} }
// TODO: this is too loose, Teslas have 0x222 // TODO: this is too loose, Teslas have 0x222

View File

@@ -0,0 +1,40 @@
#!/usr/bin/env python3
import unittest
from opendbc.safety.tests.libsafety import libsafety_py
from opendbc.safety.tests.common import CANPackerSafety
class TestVolkswagenMebIgnition(unittest.TestCase):
TX_MSGS: list = []
def setUp(self):
self.safety = libsafety_py.libsafety
self.safety.init_tests()
self.packer = CANPackerSafety("vw_meb")
def _msg(self, counter, ign):
return self.packer.make_can_msg_safety("Klemmen_Status_01", 0,
{"Klemmen_Status_01_BZ": counter,
"ZAS_Kl_15": ign})
# ZAS_Kl_15=1
def test_ignition_on(self):
for i in range(16):
self.safety.init_tests()
self.safety.ignition_can_hook(self._msg(i, 1))
self.assertFalse(self.safety.get_ignition_can())
self.safety.ignition_can_hook(self._msg((i + 1) % 16, 1))
self.assertTrue(self.safety.get_ignition_can())
def test_ignition_off(self):
self.safety.ignition_can_hook(self._msg(0, 1))
self.safety.ignition_can_hook(self._msg(1, 1))
self.assertTrue(self.safety.get_ignition_can())
self.safety.ignition_can_hook(self._msg(2, 0))
self.safety.ignition_can_hook(self._msg(3, 0))
self.assertFalse(self.safety.get_ignition_can())
if __name__ == "__main__":
unittest.main()