Skip to content

Commit b500e79

Browse files
authored
Merge pull request #905 from davdep3834/feature/arxml_dump_fix
Fixed arxml output format - Removed duplicated signals and compu-methods Thanks !!!
2 parents ffea69b + f0195d0 commit b500e79

1 file changed

Lines changed: 38 additions & 14 deletions

File tree

src/canmatrix/formats/arxml.py

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

369376
def 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

Comments
 (0)