@@ -107,6 +107,37 @@ def create_signal_ref(parent, signal_ref_id):
107107 signal_ref .set ("ID-REF" , "SIG_" + signal_ref_id )
108108 return signal_ref
109109
110+ def create_signal_group_element (parent , frame , sig_group ):
111+ # type: (_Element, Frame, typing.Any) -> _Element
112+ signal_group_element = create_sub_element_fx (parent , "SIGNAL-GROUP" )
113+ sig_group_id = f"SIGGRP_{ frame .name } _{ sig_group .name } "
114+ signal_group_element .set ("ID" , sig_group_id )
115+ create_short_name_desc (signal_group_element , sig_group .name , "" )
116+
117+ sig_group_dbc_id = getattr (sig_group , "id" , None )
118+ if sig_group_dbc_id is not None :
119+ identifier = create_sub_element_fx (signal_group_element , "IDENTIFIER" )
120+ create_sub_element_fx (identifier , "IDENTIFIER-VALUE" , str (sig_group_dbc_id ))
121+
122+ member_signals = getattr (sig_group , "signals" , None ) or []
123+ if member_signals :
124+ ordered_signals = create_sub_element_fx (signal_group_element , "ORDERED-SIGNALS" )
125+ for seq_num , signal in enumerate (member_signals , start = 1 ):
126+ if isinstance (signal , str ):
127+ signal_obj = frame .signal_by_name (signal )
128+ if signal_obj is None :
129+ print (f"Warning: Signal '{ signal } ' in group '{ sig_group .name } ' "
130+ f"not found in frame '{ frame .name } ' - skipping" )
131+ continue
132+ else :
133+ signal_obj = signal
134+
135+ ordered_signal = create_sub_element_fx (ordered_signals , "ORDERED-SIGNAL" )
136+ create_sub_element_fx (ordered_signal , "SEQUENCE-NUMBER" , str (seq_num ))
137+ create_signal_ref (ordered_signal , create_signal_id (frame , signal_obj ))
138+
139+ return signal_group_element
140+
110141
111142def bits_to_byte_str (bits , name ):
112143 b = int (bits )
@@ -1015,5 +1046,14 @@ def dump(db, f, **options):
10151046 # REQUIREMENTS
10161047 #
10171048 # requirements = createSubElementFx(elements, "REQUIREMENTS")
1049+ has_signal_groups = any (
1050+ getattr (frame , "signalGroups" , None ) for frame in db .frames
1051+ )
1052+ if has_signal_groups :
1053+ requirements = create_sub_element_fx (root , "REQUIREMENTS" )
1054+ signal_groups_element = create_sub_element_fx (requirements , "SIGNAL-GROUPS" )
1055+ for frame in db .frames :
1056+ for sig_group in getattr (frame , "signalGroups" , []) or []:
1057+ create_signal_group_element (signal_groups_element , frame , sig_group )
10181058
10191059 f .write (lxml .etree .tostring (root , pretty_print = True ))
0 commit comments