Skip to content

Commit ad922bc

Browse files
committed
improvement for issue #363
1 parent 10a5358 commit ad922bc

File tree

2 files changed

+166
-28
lines changed

2 files changed

+166
-28
lines changed

src/canmatrix/formats/arxml.py

+32-27
Original file line numberDiff line numberDiff line change
@@ -1316,33 +1316,38 @@ def get_frame(frame_triggering, root_or_cache, multiplex_translation, ns, float_
13161316
new_frame.add_attribute("GenMsgCycleTime", str(int(float_factory(value.text) * 1000)))
13171317

13181318

1319-
# pdu_sig_mappings = get_child(pdu, "SIGNAL-TO-PDU-MAPPINGS", arDict, ns)
1320-
# if not pdu_sig_mappings:
1321-
# logger.debug("Frame %s no SIGNAL-TO-PDU-MAPPINGS found", new_frame.name)
1322-
pdu_sig_mapping = get_children(pdu, "I-SIGNAL-TO-I-PDU-MAPPING", root_or_cache, ns)
1323-
if pdu_sig_mapping:
1324-
get_signals(pdu_sig_mapping, new_frame, root_or_cache, ns, None, float_factory)
1325-
1326-
# Seen some pdu_sig_mapping being [] and not None with some arxml 4.2
1327-
else: # AR 4.2
1328-
pdu_trigs = get_children(frame_triggering, "PDU-TRIGGERINGS", root_or_cache, ns)
1329-
if pdu_trigs is not None:
1330-
for pdu_trig in pdu_trigs:
1331-
trig_ref_cond = get_child(pdu_trig, "PDU-TRIGGERING-REF-CONDITIONAL", root_or_cache, ns)
1332-
trigs = get_child(trig_ref_cond, "PDU-TRIGGERING", root_or_cache, ns)
1333-
ipdus = get_child(trigs, "I-PDU", root_or_cache, ns)
1334-
1335-
signal_to_pdu_maps = get_child(ipdus, "I-SIGNAL-TO-PDU-MAPPINGS", root_or_cache, ns)
1336-
if signal_to_pdu_maps is None:
1337-
signal_to_pdu_maps = get_child(ipdus, "I-SIGNAL-TO-I-PDU-MAPPINGS", root_or_cache, ns)
1338-
1339-
if signal_to_pdu_maps is None:
1340-
logger.debug("AR4.x PDU %s no SIGNAL-TO-PDU-MAPPINGS found - no signal extraction!",
1341-
get_element_name(ipdus, ns))
1342-
# signal_to_pdu_map = get_children(signal_to_pdu_maps, "I-SIGNAL-TO-I-PDU-MAPPING", arDict, ns)
1343-
get_signals(signal_to_pdu_maps, new_frame, root_or_cache, ns, None, float_factory) # todo BUG expects list, not item
1344-
else:
1345-
logger.debug("Frame %s (assuming AR4.2) no PDU-TRIGGERINGS found", new_frame.name)
1319+
if pdu.tag == "CONTAINER-I-PDU":
1320+
pdus = get_children(pdu, "CONTAINED-PDU-TRIGGERING", root_or_cache, ns)
1321+
for pdu in pdus:
1322+
ipdu = get_child(pdu, "I-PDU", root_or_cache, ns)
1323+
pdu_sig_mapping = get_children(ipdu, "I-SIGNAL-IN-I-PDU", root_or_cache, ns)
1324+
# TODO
1325+
if pdu_sig_mapping:
1326+
get_signals(pdu_sig_mapping, new_frame, root_or_cache, ns, None, float_factory)
1327+
else:
1328+
pdu_sig_mapping = get_children(pdu, "I-SIGNAL-TO-I-PDU-MAPPING", root_or_cache, ns)
1329+
if pdu_sig_mapping:
1330+
get_signals(pdu_sig_mapping, new_frame, root_or_cache, ns, None, float_factory)
1331+
# Seen some pdu_sig_mapping being [] and not None with some arxml 4.2
1332+
else: # AR 4.2
1333+
pdu_trigs = get_children(frame_triggering, "PDU-TRIGGERINGS", root_or_cache, ns)
1334+
if pdu_trigs is not None:
1335+
for pdu_trig in pdu_trigs:
1336+
trig_ref_cond = get_child(pdu_trig, "PDU-TRIGGERING-REF-CONDITIONAL", root_or_cache, ns)
1337+
trigs = get_child(trig_ref_cond, "PDU-TRIGGERING", root_or_cache, ns)
1338+
ipdus = get_child(trigs, "I-PDU", root_or_cache, ns)
1339+
1340+
signal_to_pdu_maps = get_child(ipdus, "I-SIGNAL-TO-PDU-MAPPINGS", root_or_cache, ns)
1341+
if signal_to_pdu_maps is None:
1342+
signal_to_pdu_maps = get_child(ipdus, "I-SIGNAL-TO-I-PDU-MAPPINGS", root_or_cache, ns)
1343+
1344+
if signal_to_pdu_maps is None:
1345+
logger.debug("AR4.x PDU %s no SIGNAL-TO-PDU-MAPPINGS found - no signal extraction!",
1346+
get_element_name(ipdus, ns))
1347+
# signal_to_pdu_map = get_children(signal_to_pdu_maps, "I-SIGNAL-TO-I-PDU-MAPPING", arDict, ns)
1348+
get_signals(signal_to_pdu_maps, new_frame, root_or_cache, ns, None, float_factory) # todo BUG expects list, not item
1349+
else:
1350+
logger.debug("Frame %s (assuming AR4.2) no PDU-TRIGGERINGS found", new_frame.name)
13461351
return new_frame
13471352

13481353

src/canmatrix/tests/test_arxml.py

+134-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# -*- coding: utf-8 -*-
22
import canmatrix.formats.arxml
33
import pathlib2
4-
4+
import io
5+
import textwrap
56

67
def test_ecu_extract():
78
here = pathlib2.Path(__file__).parent
@@ -11,3 +12,135 @@ def test_ecu_extract():
1112
assert len(db.frames) == 2
1213
assert len(db.frames[0].signals) == 3
1314
assert len(db.frames[1].signals) == 1
15+
16+
17+
def test_get_signals_from_container_i_pdu():
18+
arxml = io.BytesIO(textwrap.dedent(u'''\
19+
<ARXML>
20+
<AR-PACKAGE>
21+
<SHORT-NAME>B</SHORT-NAME>
22+
<CAN-FRAME>
23+
<SHORT-NAME>CAN_FRAME_FD</SHORT-NAME>
24+
<FRAME-LENGTH>64</FRAME-LENGTH>
25+
<PDU-TO-FRAME-MAPPINGS>
26+
<PDU-TO-FRAME-MAPPING>
27+
<SHORT-NAME>CAN_FRAME_FD_PDU_MAPPING</SHORT-NAME>
28+
<PACKING-BYTE-ORDER>MOST-SIGNIFICANT-BYTE-LAST</PACKING-BYTE-ORDER>
29+
<PDU-REF DEST="SIGNAL-I-PDU">/A/Frame_FD_CONTAINER</PDU-REF>
30+
<START-POSITION>0</START-POSITION>
31+
</PDU-TO-FRAME-MAPPING>
32+
</PDU-TO-FRAME-MAPPINGS>
33+
</CAN-FRAME>
34+
<I-SIGNAL-I-PDU>
35+
<SHORT-NAME>PDU1</SHORT-NAME>
36+
<SOME>
37+
<TRANSMISSION-MODE-CONDITION>
38+
<I-SIGNAL-IN-I-PDU-REF>/A/SignalIPDUAssignment1</I-SIGNAL-IN-I-PDU-REF>
39+
</TRANSMISSION-MODE-CONDITION>
40+
</SOME>
41+
</I-SIGNAL-I-PDU>
42+
<I-SIGNAL-I-PDU>
43+
<SHORT-NAME>PDU2</SHORT-NAME>
44+
<SOME>
45+
<TRANSMISSION-MODE-CONDITION>
46+
<I-SIGNAL-IN-I-PDU-REF>/A/SignalIPDUAssignment2</I-SIGNAL-IN-I-PDU-REF>
47+
</TRANSMISSION-MODE-CONDITION>
48+
</SOME>
49+
</I-SIGNAL-I-PDU>
50+
51+
<SYSTEM-SIGNAL>
52+
<SHORT-NAME>Enable_command</SHORT-NAME>
53+
<LENGTH>22</LENGTH>
54+
</SYSTEM-SIGNAL>
55+
<SYSTEM-SIGNAL>
56+
<SHORT-NAME>FaultClear_command</SHORT-NAME>
57+
<LENGTH>2</LENGTH>
58+
</SYSTEM-SIGNAL>
59+
60+
61+
</AR-PACKAGE>
62+
63+
<AR-PACKAGE>
64+
<SHORT-NAME>A</SHORT-NAME>
65+
<CAN-CLUSTER>
66+
<SHORT-NAME>CAN</SHORT-NAME>
67+
<PHYSICAL-CHANNELS>
68+
<PHYSICAL-CHANNEL>
69+
<SHORT-NAME>CAN</SHORT-NAME>
70+
<FRAME-TRIGGERINGSS>
71+
<CAN-FRAME-TRIGGERING>
72+
<SHORT-NAME>someFrame</SHORT-NAME>
73+
<FRAME-PORT-REFS/>
74+
<FRAME-REF>/B/CAN_FRAME_FD</FRAME-REF>
75+
<I-PDU-TRIGGERING-REFS>
76+
<I-PDU-TRIGGERING-REF DEST="I-PDU-TRIGGERING">/Cluster/CAN/IPDUTRIGG_CommandModeControl</I-PDU-TRIGGERING-REF>
77+
</I-PDU-TRIGGERING-REFS>
78+
<CAN-ADDRESSING-MODE>EXTENDED</CAN-ADDRESSING-MODE>
79+
<IDENTIFIER>16755521</IDENTIFIER>
80+
</CAN-FRAME-TRIGGERING>
81+
</FRAME-TRIGGERINGSS>
82+
</PHYSICAL-CHANNEL>
83+
</PHYSICAL-CHANNELS>
84+
</CAN-CLUSTER>
85+
86+
<I-SIGNAL>
87+
<SHORT-NAME>Enable_command</SHORT-NAME>
88+
<SYSTEM-SIGNAL-REF>/B/Enable_command</SYSTEM-SIGNAL-REF>
89+
</I-SIGNAL>
90+
<I-SIGNAL>
91+
<SHORT-NAME>FaultClear_command</SHORT-NAME>
92+
<SYSTEM-SIGNAL-REF>/B/FaultClear_command</SYSTEM-SIGNAL-REF>
93+
</I-SIGNAL>
94+
95+
<I-SIGNAL-TO-I-PDU-MAPPING>
96+
<SHORT-NAME>SignalIPDUAssignment1</SHORT-NAME>
97+
<I-SIGNAL-REF>/A/Enable_command</I-SIGNAL-REF>
98+
<START-POSITION>63</START-POSITION>
99+
<PACKING-BYTE-ORDER>MOST-SIGNIFICANT-BYTE-FIRST</PACKING-BYTE-ORDER>
100+
</I-SIGNAL-TO-I-PDU-MAPPING>
101+
<I-SIGNAL-TO-I-PDU-MAPPING>
102+
<SHORT-NAME>SignalIPDUAssignment2</SHORT-NAME>
103+
<I-SIGNAL-REF>/A/FaultClear_command</I-SIGNAL-REF>
104+
<START-POSITION>63</START-POSITION>
105+
<PACKING-BYTE-ORDER>MOST-SIGNIFICANT-BYTE-FIRST</PACKING-BYTE-ORDER>
106+
</I-SIGNAL-TO-I-PDU-MAPPING>
107+
108+
109+
110+
<CONTAINER-I-PDU>
111+
<SHORT-NAME>Frame_FD_CONTAINER</SHORT-NAME>
112+
<LENGTH>54</LENGTH>
113+
<CONTAINED-PDU-TRIGGERING-REFS>
114+
<CONTAINED-PDU-TRIGGERING-REF>/A/PT_PDU1</CONTAINED-PDU-TRIGGERING-REF>
115+
<CONTAINED-PDU-TRIGGERING-REF>/A/PT_PDU2</CONTAINED-PDU-TRIGGERING-REF>
116+
</CONTAINED-PDU-TRIGGERING-REFS>
117+
</CONTAINER-I-PDU>
118+
119+
<PDU-TRIGGERING>
120+
<SHORT-NAME>PT_PDU1</SHORT-NAME>
121+
<I-PDU-REF>/B/PDU1</I-PDU-REF>
122+
</PDU-TRIGGERING>
123+
<PDU-TRIGGERING>
124+
<SHORT-NAME>PT_PDU2</SHORT-NAME>
125+
<I-PDU-REF>/B/PDU2</I-PDU-REF>
126+
</PDU-TRIGGERING>
127+
128+
</AR-PACKAGE>
129+
</ARXML>
130+
131+
''').encode('utf-8'))
132+
matrix = canmatrix.formats.arxml.load(arxml, dbcImportEncoding="utf8")
133+
assert matrix.frames[0].is_j1939 == True
134+
135+
# negative test
136+
dbc = io.BytesIO(textwrap.dedent(u'''\
137+
BU_: someOtherEcu
138+
139+
BO_ 2147483648 someFrame: 1 someOtherEcu
140+
SG_ someSignal: 1|2@0+ (1,0) [0|0] "" CCL_TEST
141+
142+
BA_DEF_ BO_ "VFrameFormat" ENUM "StandardCAN","ExtendedCAN","J1939PG";
143+
BA_ "VFrameFormat" BO_ 2147483648 0;
144+
''').encode('utf-8'))
145+
matrix = canmatrix.formats.dbc.load(dbc, dbcImportEncoding="utf8")
146+
assert matrix.frames[0].is_j1939 == False

0 commit comments

Comments
 (0)