feat: add AS status feedback for both HMI sizes with verified v2.7 release

This commit is contained in:
shenlefengnai-rgb
2026-10-07 16:32:42 +08:00
parent dba8aa5ea9
commit e6556fc218
245 changed files with 21470 additions and 159 deletions
+28 -7
View File
@@ -74,7 +74,7 @@ def main():
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), 0x301:(False,8), 0x6A0:(False,8), 0x6A1:(False,2),
0x6A2:(False,8), 0x6A4:(False,4), 0x6A6:(False,8),
0x6A2:(False,4), 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}
@@ -90,12 +90,13 @@ def main():
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 [(0x301,100), (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), (0x6A6,1000)]:
assert db.get_message_by_frame_id(ident).cycle_time == cycle
for ident in [0x300,0x6A4,0x6A6,0x140,0x156,0x186040F3,0x186140F3]:
for ident in [0x300,0x6A4,0x140,0x156,0x186040F3,0x186140F3]:
assert db.get_message_by_frame_id(ident).cycle_time in (None,0)
assert len(db2.messages) == 12
assert sum(len(m.signals) for m in db2.messages) == 49
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)):
@@ -119,9 +120,17 @@ def main():
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
assert build_vcu_payload(task_id,task_id&1,(task_id+1)&1,flags,255,version=1)==raw
for as_state in range(6):
for flags in range(16):
raw = build_vcu_payload(2, 1, 1, flags, 255, as_state)
values = decode(0x183, raw.hex(' '))
assert values['AS_State'] == as_state and values['AS_Valid'] == ((flags >> 3) & 1)
assert values['Reserved'] == 0 and values['Protocol_Version'] == 2
assert status.encode(values) == raw
assert db2.get_message_by_frame_id(0x183).encode(values) == 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)):
(2,1,1,16,0), (2,1,1,7,256)):
try:
build_vcu_payload(*arguments)
except ValueError:
@@ -177,8 +186,20 @@ def main():
assert heartbeat['Board_Identifier']==0xA1 and heartbeat['Protocol_Version']==1
assert heartbeat['Heartbeat_Sequence']==0x1234
near(heartbeat['Uptime'],1.0)
freq=decode(0x6A2,'32 00 64 00 96 00 C8 00')
assert list(freq.values()) == [50,100,150,200]
wheel = db.get_message_by_frame_id(0x6A2)
assert wheel.name == 'SDC_WheelSpeed'
for raw, speeds in [('00 00 00 00',(0,0)), ('10 27 F8 2A',(10,11)),
('FF FF FF FF',(65.535,65.535)), ('00 00 FF FF',(0,65.535))]:
values = decode(0x6A2,raw)
for actual, expected_speed in zip(values.values(),speeds,strict=True):
near(actual,expected_speed)
assert wheel.encode(values) == bytes.fromhex(raw)
try:
wheel.decode(bytes.fromhex('32 00 64 00 96 00 C8 00'),allow_excess=False)
except cantools.database.DecodeError:
pass
else:
raise AssertionError('Old DLC 8 wheel-frequency payload accepted')
gpio=decode(0x6A6,'AA 55 FF 7F E8 03 00 00')
assert gpio['SDC_Input_State']==0x55AA and gpio['SDC_Changed_Mask']==0x7fff
near(gpio['Timestamp'],1.0)