feat: add VCU status feedback and map DEBUG safety inputs
This commit is contained in:
+25
-6
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user