feat: add VCU status feedback and map DEBUG safety inputs

This commit is contained in:
shenlefengnai-rgb
2026-10-03 21:52:14 +08:00
parent dbbda5624a
commit 1e7b2e7f96
305 changed files with 32906 additions and 68 deletions
+25 -6
View File
@@ -12,6 +12,7 @@ import re
import cantools
from export_dbc_docs import can2_dbc_text
from send_drivetrain_can import build_payload
from send_vcu_status_can import build_payload as build_vcu_payload
ROOT = Path(__file__).resolve().parents[1]
@@ -72,24 +73,24 @@ def main():
header = (ROOT / 'firmware/Core/Inc/ami_protocol.h').read_text(encoding='utf-8')
identifiers = {int(value, 16) for value in re.findall(
r'^#define\s+AMI_CAN_ID_\w+\s+(0x[\dA-Fa-f]+)', header, re.MULTILINE)}
expected = {0x182:(False,8), 0x300:(False,8), 0x6A0:(False,8), 0x6A1:(False,2),
expected = {0x182:(False,8), 0x183:(False,8), 0x300:(False,8), 0x6A0:(False,8), 0x6A1:(False,2),
0x6A2:(False,8), 0x6A4:(False,4), 0x6A6:(False,8),
0x140:(False,8), 0x156:(False,8),
0x186040F3:(True,8), 0x186140F3:(True,8)}
actual = {m.frame_id:(m.is_extended_frame,m.length) for m in db.messages}
assert actual == expected, actual
assert set(actual) == identifiers, (actual, identifiers)
assert len(db.messages) == 11
assert sum(len(m.signals) for m in db.messages) == 40
assert len(db.messages) == 12
assert sum(len(m.signals) for m in db.messages) == 49
for m in db.messages:
if m.frame_id == 0x300:
assert m.senders == ['AMI'] and m.receivers == {'VCU'}
else:
assert m.receivers == {'AMI'}
assert m.senders == (['VCU'] if m.frame_id == 0x182 else
assert m.senders == (['VCU'] if m.frame_id in (0x182,0x183) else
['SDC_ACQ_DAC'] if 0x6A0 <= m.frame_id <= 0x6A6 else ['BMS'])
assert db.dbc.attributes['Baudrate'].value == 500000
for ident, cycle in [(0x182,100), (0x6A0,100), (0x6A1,500), (0x6A2,20)]:
for ident, cycle in [(0x182,100), (0x183,100), (0x6A0,100), (0x6A1,500), (0x6A2,20)]:
assert db.get_message_by_frame_id(ident).cycle_time == cycle
for ident in [0x300,0x6A4,0x6A6,0x140,0x156,0x186040F3,0x186140F3]:
assert db.get_message_by_frame_id(ident).cycle_time in (None,0)
@@ -100,6 +101,24 @@ def main():
return db.decode_message(ident, bytes.fromhex(data), decode_choices=False)
display = db.get_message_by_frame_id(0x182)
status = db.get_message_by_frame_id(0x183)
for task_id in range(7):
for flags in range(8):
raw=bytes([task_id,task_id&1,(task_id+1)&1,flags,255,0,0,1])
values=decode(0x183,raw.hex(' '))
assert values['Current_Task']==task_id and values['Locked']==(task_id&1)
assert values['EBS_Normal']==((task_id+1)&1)
assert status.encode(values)==raw
assert db2.get_message_by_frame_id(0x183).encode(values)==raw
assert build_vcu_payload(task_id,task_id&1,(task_id+1)&1,flags,255)==raw
for arguments in ((7,1,1,7,0), (2,2,1,7,0), (2,1,2,7,0),
(2,1,1,8,0), (2,1,1,7,256)):
try:
build_vcu_payload(*arguments)
except ValueError:
pass
else:
raise AssertionError(f'Invalid VCU sender arguments accepted: {arguments}')
for raw, torque, motor, mcu, flags in [
('F4 01 C2 01 90 01 07 01',500,45,40,7),
('0C FE 9B FF 33 FF 07 01',-500,-10.1,-20.5,7),
@@ -218,7 +237,7 @@ def main():
for decode_choices in (False, True):
assert db.decode_message(ident, payload, decode_choices=decode_choices) == \
db2.decode_message(ident, payload, decode_choices=decode_choices)
print(json.dumps({'result':'passed','messages':len(db.messages),'signals':40,
print(json.dumps({'result':'passed','messages':len(db.messages),'signals':sum(len(m.signals) for m in db.messages),
'known_payload_checks':len(checks),'all_task_ids_and_counter_edges':True,
'ports_bitrate':bitrates,'both_dbc_layouts_and_payloads_match':True,
'firmware_and_ioc_bit_timing_match':True,