Add CAN1 100 ms heartbeat with verified firmware and updated protocol PDF

This commit is contained in:
shenlefengnai-rgb
2026-10-04 19:00:32 +08:00
parent 1e7b2e7f96
commit dba8aa5ea9
21 changed files with 1398 additions and 28 deletions
+15 -6
View File
@@ -73,28 +73,37 @@ 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), 0x183:(False,8), 0x300:(False,8), 0x6A0:(False,8), 0x6A1:(False,2),
expected = {0x182:(False,8), 0x183:(False,8), 0x300:(False,8), 0x301:(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) == 12
assert sum(len(m.signals) for m in db.messages) == 49
assert len(db.messages) == 13
assert sum(len(m.signals) for m in db.messages) == 53
for m in db.messages:
if m.frame_id == 0x300:
if m.frame_id in (0x300, 0x301):
assert m.senders == ['AMI'] and m.receivers == {'VCU'}
else:
assert m.receivers == {'AMI'}
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), (0x183,100), (0x6A0,100), (0x6A1,500), (0x6A2,20)]:
for ident, cycle in [(0x301,100), (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)
assert len(db2.messages) == 12
assert all(m.frame_id != 0x301 for m in db2.messages)
heartbeat = db.get_message_by_frame_id(0x301)
for sequence, uptime in ((0,100), (65535,4294967295), (0,0)):
values = dict(Protocol_Version=1, Reserved=0,
Heartbeat_Sequence=sequence, MCU_Uptime=uptime)
raw = bytes([1,0]) + sequence.to_bytes(2,'little') + uptime.to_bytes(4,'little')
assert heartbeat.encode(values) == raw
assert heartbeat.decode(raw) == values
checks = []
def decode(ident, data):
checks.append({'id':hex(ident),'data':data})
@@ -239,7 +248,7 @@ def main():
db2.decode_message(ident, payload, decode_choices=decode_choices)
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,
'ports_bitrate':bitrates,'shared_dbc_layouts_and_payloads_match':True, 'heartbeat_can1_only':True,
'firmware_and_ioc_bit_timing_match':True,
'firmware_ids_match':True,'sdc_source_layout_match':source_check,
'display_sender_known_bytes_and_argument_rejection':True,