@@ -365,6 +365,13 @@ def create_sub_element(parent, element_name, text=None, dest=None):
365365 sn .set ("DEST" , dest )
366366 return sn
367367
368+ def element_exists (parent , element_name , short_name ):
369+ for element in parent .iter (element_name ):
370+ for item in element .iter ('SHORT-NAME' ):
371+ if item .text == short_name :
372+ return True
373+ return False
374+
368375
369376def get_base_type_of_signal (signal ):
370377 # type: (Signal.Signal) -> typing.Tuple[str, int]
@@ -673,7 +680,8 @@ def dump(dbs, f, **options):
673680 signal_to_pdu_mapping ,
674681 'PACKING-BYTE-ORDER' ,
675682 'MOST-SIGNIFICANT-BYTE-FIRST' )
676- signal_ref .text = "/ISignal/{0}" .format (signal .name , dest = 'I-SIGNAL' )
683+ signal_ref .text = "/ISignal/{0}" .format (signal .name )
684+ signal_ref .set ('DEST' , 'I-SIGNAL' )
677685
678686 create_sub_element (signal_to_pdu_mapping , 'START-POSITION' ,
679687 str (signal .get_startbit (bit_numbering = 1 )))
@@ -699,6 +707,9 @@ def dump(dbs, f, **options):
699707 continue
700708
701709 for signal in frame .signals :
710+ if element_exists (elements , 'I-SIGNAL' , signal .name ):
711+ continue
712+
702713 signal_ele = create_sub_element (elements , 'I-SIGNAL' )
703714 create_sub_element (signal_ele , 'SHORT-NAME' , signal .name )
704715 if ar_version [0 ] == "4" :
@@ -748,6 +759,9 @@ def dump(dbs, f, **options):
748759 continue
749760
750761 for signal in frame .signals :
762+ if element_exists (elements , 'SYSTEM-SIGNAL' , signal .name ):
763+ continue
764+
751765 signal_ele = create_sub_element (elements , 'SYSTEM-SIGNAL' )
752766 create_sub_element (signal_ele , 'SHORT-NAME' , signal .name )
753767 if signal .comment :
@@ -841,13 +855,29 @@ def dump(dbs, f, **options):
841855 continue
842856
843857 for signal in frame .signals :
858+ if element_exists (elements , 'COMPU-METHOD' , signal .name ):
859+ continue
860+
844861 compu_method = create_sub_element (elements , 'COMPU-METHOD' )
845862 create_sub_element (compu_method , 'SHORT-NAME' , signal .name )
846- # missing: UNIT-REF
863+ if len (signal .values ) == 0 :
864+ create_sub_element (compu_method , 'CATEGORY' , 'SCALE_LINEAR' )
865+ create_sub_element (compu_method , 'UNIT-REF' , text = "/DataType/Unit/{}" .format (signal .name ), dest = 'UNIT' )
847866 compu_int_to_phys = create_sub_element (
848867 compu_method , 'COMPU-INTERNAL-TO-PHYS' )
849868 compu_scales = create_sub_element (compu_int_to_phys , 'COMPU-SCALES' )
850- for value in sorted (signal .values ):
869+ if len (signal .values ) == 0 :
870+ compu_scale = create_sub_element (compu_scales , 'COMPU-SCALE' )
871+ create_sub_element (compu_scale , 'SHORT-LABEL' , 'Linear_scale' )
872+ create_sub_element (compu_scale , 'LOWER-LIMIT' , "%.1f" % signal .min )
873+ create_sub_element (compu_scale , 'UPPER-LIMIT' , "%.1f" % signal .max )
874+ compu_rationsl_coeff = create_sub_element (compu_scale , 'COMPU-RATIONAL-COEFFS' )
875+ compu_numerator = create_sub_element (compu_rationsl_coeff , 'COMPU-NUMERATOR' )
876+ create_sub_element (compu_numerator , 'V' , "%.1f" % signal .offset )
877+ create_sub_element (compu_numerator , 'V' , "%.1f" % signal .factor )
878+ compu_denomiator = create_sub_element (compu_rationsl_coeff , 'COMPU-DENOMINATOR' )
879+ create_sub_element (compu_denomiator , 'V' , "1" )
880+ for i , value in enumerate (sorted (signal .values )):
851881 compu_scale = create_sub_element (compu_scales , 'COMPU-SCALE' )
852882 desc = create_sub_element (compu_scale , 'DESC' )
853883 l2 = create_sub_element (desc , 'L-2' )
@@ -856,17 +886,8 @@ def dump(dbs, f, **options):
856886 create_sub_element (compu_scale , 'LOWER-LIMIT' , str (value ))
857887 create_sub_element (compu_scale , 'UPPER-LIMIT' , str (value ))
858888 compu_const = create_sub_element (compu_scale , 'COMPU-CONST' )
859- create_sub_element (compu_const , 'VT' , signal .values [value ])
860- else :
861- compu_scale = create_sub_element (compu_scales , 'COMPU-SCALE' )
862- # createSubElement(compuScale, 'LOWER-LIMIT', str(#TODO))
863- # createSubElement(compuScale, 'UPPER-LIMIT', str(#TODO))
864- compu_rationsl_coeff = create_sub_element (compu_scale , 'COMPU-RATIONAL-COEFFS' )
865- compu_numerator = create_sub_element (compu_rationsl_coeff , 'COMPU-NUMERATOR' )
866- create_sub_element (compu_numerator , 'V' , "%g" % signal .offset )
867- create_sub_element (compu_numerator , 'V' , "%g" % signal .factor )
868- compu_denomiator = create_sub_element (compu_rationsl_coeff , 'COMPU-DENOMINATOR' )
869- create_sub_element (compu_denomiator , 'V' , "1" )
889+ create_sub_element (compu_const , 'VT' , 'cm_' + str (i ) + '_'
890+ + re .sub (r'[^\w]' , '' , signal .values [value ].replace (' ' , '_' )))
870891
871892 ar_package = create_sub_element (subpackages , 'AR-PACKAGE' )
872893 create_sub_element (ar_package , 'SHORT-NAME' , 'Unit' )
@@ -878,6 +899,9 @@ def dump(dbs, f, **options):
878899 continue
879900
880901 for signal in frame .signals :
902+ if element_exists (elements , 'UNIT' , signal .name ):
903+ continue
904+
881905 unit = create_sub_element (elements , 'UNIT' )
882906 create_sub_element (unit , 'SHORT-NAME' , signal .name )
883907 create_sub_element (unit , 'DISPLAY-NAME' , signal .unit )
0 commit comments