py-eb-model 1.0.0__py3-none-any.whl → 1.1.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- eb_model/__init__.py +2 -1
- eb_model/cli/os_xdm_2_xls_cli.py +21 -12
- eb_model/cli/pref_system_importer_cli.py +94 -0
- py_eb_model/cli/os_xdm_2_xls_cli.py → eb_model/cli/rte_xdm_2_xls_cli.py +18 -9
- eb_model/models/__init__.py +2 -0
- eb_model/models/abstract.py +86 -13
- eb_model/models/eb_doc.py +55 -27
- eb_model/models/eclipse_project.py +8 -0
- eb_model/models/importer_xdm.py +115 -0
- eb_model/models/os_xdm.py +893 -98
- eb_model/models/rte_xdm.py +604 -0
- eb_model/parser/__init__.py +3 -0
- eb_model/parser/eb_parser.py +92 -39
- eb_model/parser/eb_parser_factory.py +29 -0
- eb_model/parser/os_xdm_parser.py +173 -28
- eb_model/parser/pref_xdm_parser.py +36 -0
- eb_model/parser/rte_xdm_parser.py +95 -0
- eb_model/reporter/excel_reporter/abstract.py +11 -11
- eb_model/reporter/excel_reporter/os_xdm.py +109 -12
- eb_model/reporter/excel_reporter/rte_xdm.py +87 -0
- eb_model/tests/models/test_eb_model.py +19 -1
- eb_model/tests/models/test_importer_xdm.py +61 -0
- eb_model/writer/__init__.py +2 -0
- eb_model/writer/project_writer.py +71 -0
- eb_model/writer/text_writer.py +28 -0
- py_eb_model-1.1.3.dist-info/METADATA +194 -0
- py_eb_model-1.1.3.dist-info/RECORD +38 -0
- py_eb_model-1.1.3.dist-info/entry_points.txt +5 -0
- py_eb_model/__init__.py +0 -3
- py_eb_model/cli/__init__.py +0 -0
- py_eb_model/models/__init__.py +0 -3
- py_eb_model/models/abstract.py +0 -66
- py_eb_model/models/eb_doc.py +0 -52
- py_eb_model/models/os_xdm.py +0 -220
- py_eb_model/parser/__init__.py +0 -1
- py_eb_model/parser/eb_parser.py +0 -147
- py_eb_model/parser/os_xdm_parser.py +0 -43
- py_eb_model/reporter/__init__.py +0 -1
- py_eb_model/reporter/excel_reporter/__init__.py +0 -0
- py_eb_model/reporter/excel_reporter/abstract.py +0 -43
- py_eb_model/reporter/excel_reporter/os_xdm.py +0 -44
- py_eb_model/reporter/markdown.py +0 -40
- py_eb_model-1.0.0.dist-info/METADATA +0 -16
- py_eb_model-1.0.0.dist-info/RECORD +0 -40
- py_eb_model-1.0.0.dist-info/entry_points.txt +0 -3
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.3.dist-info}/LICENSE +0 -0
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.3.dist-info}/WHEEL +0 -0
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.3.dist-info}/top_level.txt +0 -0
eb_model/parser/eb_parser.py
CHANGED
@@ -1,21 +1,39 @@
|
|
1
|
-
|
1
|
+
import logging
|
2
2
|
import xml.etree.ElementTree as ET
|
3
3
|
import re
|
4
4
|
|
5
5
|
from abc import ABCMeta
|
6
6
|
from typing import List
|
7
7
|
|
8
|
-
|
8
|
+
from ..models.eb_doc import EBModel, PreferenceModel
|
9
|
+
from ..models.abstract import EcucRefType, Module
|
10
|
+
|
11
|
+
class AbstractEbModelParser(metaclass = ABCMeta):
|
9
12
|
|
10
13
|
def __init__(self) -> None:
|
11
|
-
self.
|
14
|
+
self.nsmap = {}
|
12
15
|
|
13
|
-
|
14
|
-
raise ValueError("Abstract EBModelParser cannot be initialized.")
|
16
|
+
self.logger = logging.getLogger()
|
15
17
|
|
18
|
+
if type(self) == "AbstractEBModelParser":
|
19
|
+
raise ValueError("Abstract EBModelParser cannot be initialized.")
|
20
|
+
|
16
21
|
def validate_root(self, element: ET.Element):
|
17
|
-
if (element.tag != "{%s}%s" % (self.
|
22
|
+
if (element.tag != "{%s}%s" % (self.nsmap[''], "datamodel")):
|
18
23
|
raise ValueError("This document <%s> is not EB xdm format" % element.tag)
|
24
|
+
|
25
|
+
def read_version(self, parent: ET.Element, module: Module):
|
26
|
+
ctr_tag = self.find_ctr_tag(parent, "CommonPublishedInformation")
|
27
|
+
if ctr_tag is not None:
|
28
|
+
ar_version = module.getArVersion()
|
29
|
+
ar_version.setMajorVersion(self.read_value(ctr_tag, "ArMajorVersion"))
|
30
|
+
ar_version.setMinorVersion(self.read_value(ctr_tag, "ArMinorVersion"))
|
31
|
+
ar_version.setPatchVersion(self.read_value(ctr_tag, "ArPatchVersion"))
|
32
|
+
|
33
|
+
sw_version = module.getSwVersion()
|
34
|
+
sw_version.setMajorVersion(self.read_value(ctr_tag, "SwMajorVersion"))
|
35
|
+
sw_version.setMinorVersion(self.read_value(ctr_tag, "SwMinorVersion"))
|
36
|
+
sw_version.setPatchVersion(self.read_value(ctr_tag, "SwPatchVersion"))
|
19
37
|
|
20
38
|
def read_ref_raw_value(self, value):
|
21
39
|
'''
|
@@ -27,66 +45,73 @@ class EBModelParser(metaclass = ABCMeta):
|
|
27
45
|
return match.group(1)
|
28
46
|
return value
|
29
47
|
|
48
|
+
def _convert_value(self, tag: ET.Element):
|
49
|
+
if 'type' in tag.attrib:
|
50
|
+
if (tag.attrib['type'] == 'INTEGER'):
|
51
|
+
return int(tag.attrib['value'])
|
52
|
+
elif (tag.attrib['type'] == "FLOAT"):
|
53
|
+
return float(tag.attrib['value'])
|
54
|
+
elif (tag.attrib['type'] == 'BOOLEAN'):
|
55
|
+
if (tag.attrib['value'] == 'true'):
|
56
|
+
return True
|
57
|
+
else:
|
58
|
+
return False
|
59
|
+
return tag.attrib['value']
|
60
|
+
|
30
61
|
def read_value(self, parent: ET.Element, name: str) -> str:
|
31
|
-
tag = parent.find(".//d:var[@name='%s']" % name, self.
|
62
|
+
tag = parent.find(".//d:var[@name='%s']" % name, self.nsmap)
|
32
63
|
if tag == None:
|
33
64
|
raise KeyError("XPath d:var[@name='%s'] is invalid" % name)
|
34
|
-
|
35
|
-
return int(tag.attrib['value'])
|
36
|
-
elif (tag.attrib['type'] == "FLOAT"):
|
37
|
-
return float(tag.attrib['value'])
|
38
|
-
elif (tag.attrib['type'] == 'BOOLEAN'):
|
39
|
-
if (tag.attrib['value'] == 'true'):
|
40
|
-
return True
|
41
|
-
else:
|
42
|
-
return False
|
43
|
-
else:
|
44
|
-
return tag.attrib['value']
|
65
|
+
return self._convert_value(tag)
|
45
66
|
|
46
67
|
def read_optional_value(self, parent: ET.Element, name: str, default_value = None) -> str:
|
47
|
-
tag = parent.find(".//d:var[@name='%s']" % name, self.
|
68
|
+
tag = parent.find(".//d:var[@name='%s']" % name, self.nsmap)
|
48
69
|
if tag is None:
|
49
70
|
return default_value
|
50
71
|
if ('value' not in tag.attrib):
|
51
72
|
return default_value
|
52
|
-
|
73
|
+
enable = self.read_attrib(tag, 'ENABLE')
|
74
|
+
if (enable == 'false'):
|
75
|
+
return default_value
|
76
|
+
return self._convert_value(tag)
|
53
77
|
|
54
78
|
def find_choice_tag(self, parent: ET.Element, name: str) -> ET.Element:
|
55
|
-
return parent.find(".//d:chc[@name='%s']" % name, self.
|
79
|
+
return parent.find(".//d:chc[@name='%s']" % name, self.nsmap)
|
56
80
|
|
57
81
|
def read_choice_value(self, parent: ET.Element, name: str) -> str:
|
58
82
|
tag = self.find_choice_tag(parent, name)
|
59
83
|
return tag.attrib['value']
|
60
84
|
|
61
|
-
def read_ref_value(self, parent: ET.Element, name: str) ->
|
62
|
-
tag = parent.find(".//d:ref[@name='%s']" % name, self.
|
63
|
-
|
85
|
+
def read_ref_value(self, parent: ET.Element, name: str) -> EcucRefType:
|
86
|
+
tag = parent.find(".//d:ref[@name='%s']" % name, self.nsmap)
|
87
|
+
if tag is None:
|
88
|
+
raise KeyError("XPath d:ref[@name='%s'] is invalid" % name)
|
89
|
+
return EcucRefType(self.read_ref_raw_value(tag.attrib['value']))
|
64
90
|
|
65
|
-
def read_optional_ref_value(self, parent: ET.Element, name: str) ->
|
66
|
-
tag = parent.find(".//d:ref[@name='%s']" % name, self.
|
91
|
+
def read_optional_ref_value(self, parent: ET.Element, name: str) -> EcucRefType:
|
92
|
+
tag = parent.find(".//d:ref[@name='%s']" % name, self.nsmap)
|
67
93
|
enable = self.read_attrib(tag, 'ENABLE')
|
68
94
|
if (enable == 'false'):
|
69
|
-
return
|
70
|
-
return self.read_ref_raw_value(tag.attrib['value'])
|
95
|
+
return None
|
96
|
+
return EcucRefType(self.read_ref_raw_value(tag.attrib['value']))
|
71
97
|
|
72
|
-
def read_ref_value_list(self, parent: ET.Element, name: str) -> List[
|
98
|
+
def read_ref_value_list(self, parent: ET.Element, name: str) -> List[EcucRefType]:
|
73
99
|
ref_value_list = []
|
74
|
-
for tag in parent.findall(".//d:lst[@name='%s']/d:ref" % name, self.
|
75
|
-
ref_value_list.append(
|
76
|
-
self.read_ref_raw_value(tag.attrib['value']))
|
100
|
+
for tag in parent.findall(".//d:lst[@name='%s']/d:ref" % name, self.nsmap):
|
101
|
+
ref_value_list.append(EcucRefType(self.read_ref_raw_value(tag.attrib['value'])))
|
77
102
|
return ref_value_list
|
78
103
|
|
79
104
|
def find_ctr_tag_list(self, parent: ET.Element, name: str) -> List[ET.Element]:
|
80
|
-
return parent.findall(".//d:lst[@name='%s']/d:ctr" % name, self.
|
105
|
+
return parent.findall(".//d:lst[@name='%s']/d:ctr" % name, self.nsmap)
|
81
106
|
|
82
107
|
def find_chc_tag_list(self, parent: ET.Element, name: str) -> List[ET.Element]:
|
83
|
-
return parent.findall(".//d:lst[@name='%s']/d:chc" % name, self.
|
108
|
+
return parent.findall(".//d:lst[@name='%s']/d:chc" % name, self.nsmap)
|
84
109
|
|
85
110
|
def find_ctr_tag(self, parent: ET.Element, name: str) -> ET.Element:
|
86
111
|
'''
|
87
112
|
Read the child ctr tag.
|
88
113
|
'''
|
89
|
-
tag = parent.find(".//d:ctr[@name='%s']" % name, self.
|
114
|
+
tag = parent.find(".//d:ctr[@name='%s']" % name, self.nsmap)
|
90
115
|
if tag is None:
|
91
116
|
return None
|
92
117
|
enable = self.read_attrib(tag, 'ENABLE')
|
@@ -133,15 +158,43 @@ class EBModelParser(metaclass = ABCMeta):
|
|
133
158
|
ref_tag.attrib['value'] = "ASPath:%s" % ref
|
134
159
|
lst_tag.append(ref_tag)
|
135
160
|
return lst_tag
|
161
|
+
|
162
|
+
def get_component_name(self, parent: ET.Element) -> str:
|
163
|
+
tag = parent.find(".//d:chc[@type='AR-ELEMENT'][@value='MODULE-CONFIGURATION']", self.nsmap)
|
164
|
+
return tag.attrib['name']
|
136
165
|
|
137
166
|
def find_lst_tag(self, parent: ET.Element, name: str) -> ET.Element:
|
138
|
-
return parent.find(".//d:lst[@name='%s']" % name, self.
|
167
|
+
return parent.find(".//d:lst[@name='%s']" % name, self.nsmap)
|
139
168
|
|
140
169
|
def read_attrib(self, parent: ET.Element, name: str) -> str:
|
141
|
-
attrib_tag = parent.find(".//a:a[@name='%s']" % name, self.
|
170
|
+
attrib_tag = parent.find(".//a:a[@name='%s']" % name, self.nsmap)
|
142
171
|
if attrib_tag is None:
|
143
172
|
return None
|
144
173
|
return attrib_tag.attrib['value']
|
145
174
|
|
146
|
-
def
|
147
|
-
self.
|
175
|
+
def read_namespaces(self, xdm: str):
|
176
|
+
self.nsmap = dict([node for _, node in ET.iterparse(xdm, events=['start-ns'])])
|
177
|
+
|
178
|
+
def parse(self, element: ET.Element, doc: EBModel):
|
179
|
+
pass
|
180
|
+
|
181
|
+
def parse_preference(self, element: ET.Element, doc: PreferenceModel):
|
182
|
+
pass
|
183
|
+
|
184
|
+
def load_xdm(self, filename: str) -> ET.Element:
|
185
|
+
self.logger.info("Loading <%s>" % filename)
|
186
|
+
|
187
|
+
self.read_namespaces(filename)
|
188
|
+
tree = ET.parse(filename)
|
189
|
+
self.root_tag = tree.getroot()
|
190
|
+
self.validate_root(self.root_tag)
|
191
|
+
|
192
|
+
return self.root_tag
|
193
|
+
|
194
|
+
def parse_xdm(self, filename: str, doc: EBModel):
|
195
|
+
root_tag = self.load_xdm(filename)
|
196
|
+
self.parse(root_tag, doc)
|
197
|
+
|
198
|
+
def parse_preference_xdm(self, filename: str, doc: EBModel):
|
199
|
+
root_tag = self.load_xdm(filename)
|
200
|
+
self.parse_preference(root_tag, doc)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import logging
|
2
|
+
import xml.etree.cElementTree as ET
|
3
|
+
|
4
|
+
from .rte_xdm_parser import RteXdmParser
|
5
|
+
from .eb_parser import AbstractEbModelParser
|
6
|
+
from .os_xdm_parser import OsXdmParser
|
7
|
+
|
8
|
+
|
9
|
+
class EbParserFactory:
|
10
|
+
|
11
|
+
@classmethod
|
12
|
+
def get_component_name(cls, filename: str) -> str:
|
13
|
+
tree = ET.parse(filename)
|
14
|
+
ns = dict([node for _, node in ET.iterparse(filename, events=['start-ns'])])
|
15
|
+
tag = tree.getroot().find(".//d:chc[@type='AR-ELEMENT'][@value='MODULE-CONFIGURATION']", ns)
|
16
|
+
return tag.attrib['name']
|
17
|
+
|
18
|
+
@classmethod
|
19
|
+
def create(self, xdm: str) -> AbstractEbModelParser:
|
20
|
+
logging.getLogger().info("Analyzing file <%s>" % xdm)
|
21
|
+
|
22
|
+
name = EbParserFactory.get_component_name(xdm)
|
23
|
+
|
24
|
+
if name == "Os":
|
25
|
+
return OsXdmParser()
|
26
|
+
elif name == "Rte":
|
27
|
+
return RteXdmParser()
|
28
|
+
else:
|
29
|
+
raise NotImplementedError("Unsupported EB xdm file <%s>" % name)
|
eb_model/parser/os_xdm_parser.py
CHANGED
@@ -1,43 +1,188 @@
|
|
1
|
-
from typing import List, Dict
|
2
1
|
import xml.etree.ElementTree as ET
|
3
|
-
import re
|
4
|
-
|
5
|
-
from ..models.abstract import EcucContainer, EcucObject
|
6
2
|
from ..models.eb_doc import EBModel
|
7
|
-
from ..models.os_xdm import Os,
|
8
|
-
from .
|
3
|
+
from ..models.os_xdm import Os, OsAlarm, OsAlarmActivateTask, OsAlarmCallback, OsAlarmIncrementCounter, OsAlarmSetEvent, OsCounter, OsScheduleTable
|
4
|
+
from ..models.os_xdm import OsTask, OsIsr, OsApplication, OsScheduleTableEventSetting, OsScheduleTableExpiryPoint, OsScheduleTableTaskActivation
|
5
|
+
from ..models.os_xdm import OsScheduleTblAdjustableExpPoint, OsTaskAutostart
|
6
|
+
from ..parser.eb_parser import AbstractEbModelParser
|
7
|
+
|
9
8
|
|
10
|
-
class OsXdmParser(
|
9
|
+
class OsXdmParser(AbstractEbModelParser):
|
11
10
|
def __init__(self, ) -> None:
|
12
11
|
super().__init__()
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
self.
|
18
|
-
|
13
|
+
self.os = None
|
14
|
+
|
15
|
+
def parse(self, element: ET.Element, doc: EBModel):
|
16
|
+
if self.get_component_name(element) != "Os":
|
17
|
+
raise ValueError("Invalid <%s> xdm file" % "Os")
|
18
|
+
|
19
|
+
os = doc.getOs()
|
20
|
+
|
21
|
+
self.read_version(element, os)
|
19
22
|
|
20
|
-
self.
|
21
|
-
|
23
|
+
self.logger.info("Parse Rte ARVersion:<%s> SwVersion:<%s>" % (os.getArVersion().getVersion(), os.getSwVersion().getVersion()))
|
24
|
+
|
25
|
+
self.os = os
|
22
26
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
27
|
+
self.read_os_tasks(element, os)
|
28
|
+
self.read_os_isrs(element, os)
|
29
|
+
self.read_os_alarms(element, os)
|
30
|
+
self.read_os_schedule_tables(element, os)
|
31
|
+
self.read_os_counters(element, os)
|
32
|
+
self.read_os_applications(element, os)
|
33
|
+
|
34
|
+
def read_os_task_autostart(self, element: ET.Element, os_task: OsTask):
|
35
|
+
ctr_tag = self.find_ctr_tag(element, "OsTaskAutostart")
|
36
|
+
if ctr_tag is not None:
|
37
|
+
autostart = OsTaskAutostart(os_task, ctr_tag.attrib["name"])
|
38
|
+
for app_mode_ref in self.read_ref_value_list(ctr_tag, "OsTaskAppModeRef"):
|
39
|
+
autostart.addOsTaskAppModeRef(app_mode_ref)
|
40
|
+
os_task.setOsTaskAutostart(True)
|
41
|
+
else:
|
42
|
+
os_task.setOsTaskAutostart(False)
|
43
|
+
|
44
|
+
def read_os_tasks(self, element: ET.Element, os: Os):
|
45
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsTask"):
|
46
|
+
os_task = OsTask(os, ctr_tag.attrib["name"])
|
47
|
+
os_task.setOsTaskPriority(int(self.read_value(ctr_tag, "OsTaskPriority"))) \
|
28
48
|
.setOsTaskActivation(self.read_value(ctr_tag, "OsTaskActivation")) \
|
29
49
|
.setOsTaskSchedule(self.read_value(ctr_tag, "OsTaskSchedule")) \
|
30
|
-
.
|
50
|
+
.setOsTaskType(self.read_optional_value(ctr_tag, "OsTaskType")) \
|
51
|
+
.setOsStacksize(int(self.read_optional_value(ctr_tag, "OsStacksize", 0)))
|
52
|
+
|
53
|
+
for resource_ref in self.read_ref_value_list(ctr_tag, "OsTaskResourceRef"):
|
54
|
+
os_task.addOsTaskResourceRef(resource_ref)
|
55
|
+
|
56
|
+
self.read_os_task_autostart(ctr_tag, os_task)
|
57
|
+
|
58
|
+
self.logger.debug("Read OsTask <%s>" % os_task.getName())
|
31
59
|
os.addOsTask(os_task)
|
32
|
-
|
33
|
-
def read_os_isrs(self, os: Os):
|
34
|
-
for ctr_tag in self.find_ctr_tag_list(
|
35
|
-
os_isr = OsIsr()
|
36
|
-
os_isr.
|
37
|
-
.setOsIsrCategory(self.read_value(ctr_tag, "OsIsrCategory")) \
|
60
|
+
|
61
|
+
def read_os_isrs(self, element: ET.Element, os: Os):
|
62
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsIsr"):
|
63
|
+
os_isr = OsIsr(os, ctr_tag.attrib["name"])
|
64
|
+
os_isr.setOsIsrCategory(self.read_value(ctr_tag, "OsIsrCategory")) \
|
38
65
|
.setOsIsrPeriod(self.read_optional_value(ctr_tag, "OsIsrPeriod", 0.0)) \
|
39
|
-
.setOsStacksize(self.read_value(ctr_tag, "OsStacksize")) \
|
66
|
+
.setOsStacksize(int(self.read_value(ctr_tag, "OsStacksize"))) \
|
40
67
|
.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsIsrPriority"))
|
68
|
+
|
69
|
+
# patch for the infineon Aurix
|
70
|
+
os_isr.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsTricoreIrqLevel"))
|
71
|
+
# patch for the ARM
|
72
|
+
os_isr.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsARMIrqLevel"))
|
73
|
+
os_isr.setOsIsrVector(self.read_optional_value(ctr_tag, "OsARMVector"))
|
41
74
|
|
75
|
+
self.logger.debug("Read OsIsr <%s>" % os_isr.getName())
|
42
76
|
os.addOsIsr(os_isr)
|
43
|
-
|
77
|
+
|
78
|
+
def read_os_alarm_action(self, element: ET.Element, os_alarm: OsAlarm):
|
79
|
+
chc = self.read_choice_value(element, "OsAlarmAction")
|
80
|
+
if chc is None:
|
81
|
+
raise ValueError("OsAlarmAction is required.")
|
82
|
+
if chc == "OsAlarmActivateTask":
|
83
|
+
os_alarm_action = OsAlarmActivateTask(os_alarm, "OsAlarmActivateTask") \
|
84
|
+
.setOsAlarmActivateTaskRef(self.read_ref_value(element, "OsAlarmActivateTaskRef"))
|
85
|
+
elif chc == "OsAlarmIncrementCounter":
|
86
|
+
os_alarm_action = OsAlarmIncrementCounter(os_alarm, "OsAlarmIncrementCounter") \
|
87
|
+
.setOsAlarmIncrementCounterRef(self.read_ref_value(element, "OsAlarmIncrementCounterRef"))
|
88
|
+
elif chc == "OsAlarmSetEvent":
|
89
|
+
os_alarm_action = OsAlarmSetEvent(os_alarm, "OsAlarmSetEvent") \
|
90
|
+
.setOsAlarmSetEventRef(self.read_ref_value(element, "OsAlarmSetEventRef")) \
|
91
|
+
.setOsAlarmSetEventTaskRef(self.read_ref_value(element, "OsAlarmSetEventTaskRef"))
|
92
|
+
elif chc == "OsAlarmCallback":
|
93
|
+
os_alarm_action = OsAlarmCallback(os_alarm, "OsAlarmCallback") \
|
94
|
+
.setOsAlarmCallbackName(self.read_value(element, "OsAlarmCallbackName"))
|
95
|
+
else:
|
96
|
+
raise ValueError("Unsupported OsAlarmAction <%s>" % chc)
|
97
|
+
os_alarm.setOsAlarmAction(os_alarm_action)
|
98
|
+
|
99
|
+
def read_os_alarms(self, element: ET.Element, os: Os):
|
100
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsAlarm"):
|
101
|
+
os_alarm = OsAlarm(os, ctr_tag.attrib["name"]) \
|
102
|
+
.setOsAlarmCounterRef(self.read_ref_value(ctr_tag, "OsAlarmCounterRef"))
|
103
|
+
|
104
|
+
for ref in self.read_ref_value_list(ctr_tag, "OsAlarmAccessingApplication"):
|
105
|
+
os_alarm.addOsAlarmAccessingApplicationRef(ref)
|
106
|
+
|
107
|
+
self.read_os_alarm_action(ctr_tag, os_alarm)
|
108
|
+
|
109
|
+
self.logger.debug("Read OsAlarm <%s>" % os_alarm.getName())
|
110
|
+
os.addOsAlarm(os_alarm)
|
111
|
+
|
112
|
+
def read_os_schedule_table_event_settings(self, element: ET.Element, expiry_point: OsScheduleTableExpiryPoint):
|
113
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTableEventSetting"):
|
114
|
+
event_setting = OsScheduleTableEventSetting(expiry_point, ctr_tag.attrib["name"]) \
|
115
|
+
.setOsScheduleTableSetEventRef(self.read_ref_value(ctr_tag, "OsScheduleTableSetEventRef")) \
|
116
|
+
.setOsScheduleTableSetEventTaskRef(self.read_ref_value(ctr_tag, "OsScheduleTableSetEventTaskRef"))
|
117
|
+
|
118
|
+
expiry_point.addOsScheduleTableEventSetting(event_setting)
|
119
|
+
|
120
|
+
def read_os_schedule_table_task_activations(self, element: ET.Element, expiry_point: OsScheduleTableExpiryPoint):
|
121
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTableTaskActivation"):
|
122
|
+
activation = OsScheduleTableTaskActivation(expiry_point, ctr_tag.attrib["name"]) \
|
123
|
+
.setOsScheduleTableActivateTaskRef(self.read_ref_value(ctr_tag, "OsScheduleTableActivateTaskRef"))
|
124
|
+
|
125
|
+
expiry_point.addOsScheduleTableTaskActivation(activation)
|
126
|
+
|
127
|
+
def read_os_schedule_tbl_adjustable_exp_point(self, element: ET.Element, expiry_point: OsScheduleTableExpiryPoint):
|
128
|
+
ctr_tag = self.find_ctr_tag(element, "OsScheduleTblAdjustableExpPoint")
|
129
|
+
if ctr_tag is not None:
|
130
|
+
exp_point = OsScheduleTblAdjustableExpPoint(expiry_point, ctr_tag.attrib["name"]) \
|
131
|
+
.setOsScheduleTableMaxLengthen(self.read_ref_value(ctr_tag, "OsScheduleTableMaxLengthen")) \
|
132
|
+
.setOsScheduleTableMaxShorten(self.read_ref_value(ctr_tag, "OsScheduleTableMaxShorten"))
|
133
|
+
|
134
|
+
expiry_point.setOsScheduleTblAdjustableExpPoint(exp_point)
|
135
|
+
|
136
|
+
def read_os_schedule_table_expiry_points(self, element: ET.Element, os_schedule_table: OsScheduleTable):
|
137
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTableExpiryPoint"):
|
138
|
+
expiry_point = OsScheduleTableExpiryPoint(os_schedule_table, ctr_tag.attrib["name"]) \
|
139
|
+
.setOsScheduleTblExpPointOffset(self.read_value(ctr_tag, "OsScheduleTblExpPointOffset")) \
|
140
|
+
|
141
|
+
self.read_os_schedule_table_event_settings(ctr_tag, expiry_point)
|
142
|
+
self.read_os_schedule_table_task_activations(ctr_tag, expiry_point)
|
143
|
+
self.read_os_schedule_tbl_adjustable_exp_point(ctr_tag, expiry_point)
|
144
|
+
|
145
|
+
os_schedule_table.addOsScheduleTableExpiryPoint(expiry_point)
|
146
|
+
|
147
|
+
def read_os_schedule_tables(self, element: ET.Element, os: Os):
|
148
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTable"):
|
149
|
+
table = OsScheduleTable(os, ctr_tag.attrib["name"]) \
|
150
|
+
.setOsScheduleTableDuration(self.read_value(ctr_tag, "OsScheduleTableDuration")) \
|
151
|
+
.setOsScheduleTableRepeating(self.read_value(ctr_tag, "OsScheduleTableRepeating")) \
|
152
|
+
.setOsScheduleTableCounterRef(self.read_ref_value(ctr_tag, "OsScheduleTableCounterRef")) \
|
153
|
+
.setOsTimeUnit(self.read_optional_value(ctr_tag, "OsTimeUnit"))
|
154
|
+
|
155
|
+
self.read_os_schedule_table_expiry_points(ctr_tag, table)
|
156
|
+
|
157
|
+
self.logger.debug("Read OsScheduleTable <%s>" % table.getName())
|
158
|
+
os.addOsScheduleTable(table)
|
159
|
+
|
160
|
+
def read_os_counters(self, element: ET.Element, os: Os):
|
161
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsCounter"):
|
162
|
+
counter = OsCounter(os, ctr_tag.attrib["name"]) \
|
163
|
+
.setOsCounterMaxAllowedValue(self.read_value(ctr_tag, "OsCounterMaxAllowedValue")) \
|
164
|
+
.setOsCounterMinCycle(self.read_value(ctr_tag, "OsCounterMinCycle")) \
|
165
|
+
.setOsCounterTicksPerBase(self.read_value(ctr_tag, "OsCounterTicksPerBase")) \
|
166
|
+
.setOsCounterType(self.read_optional_value(ctr_tag, "OsCounterType")) \
|
167
|
+
.setOsSecondsPerTick(self.read_optional_value(ctr_tag, "OsSecondsPerTick")) \
|
168
|
+
|
169
|
+
|
170
|
+
self.logger.debug("Read OsCounter <%s>" % counter.getName())
|
171
|
+
os.addOsScheduleTable(counter)
|
172
|
+
|
173
|
+
def read_os_applications(self, element: ET.Element, os: Os):
|
174
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsApplication"):
|
175
|
+
os_app = OsApplication(os, ctr_tag.attrib["name"]) \
|
176
|
+
.setOsTrusted(self.read_value(ctr_tag, "OsTrusted"))
|
177
|
+
|
178
|
+
for ref in self.read_ref_value_list(ctr_tag, "OsAppResourceRef"):
|
179
|
+
os_app.addOsAppResourceRef(ref)
|
180
|
+
|
181
|
+
for ref in self.read_ref_value_list(ctr_tag, "OsAppTaskRef"):
|
182
|
+
os_app.addOsAppTaskRef(ref)
|
183
|
+
|
184
|
+
for ref in self.read_ref_value_list(ctr_tag, "OsAppIsrRef"):
|
185
|
+
os_app.addOsAppIsrRef(ref)
|
186
|
+
|
187
|
+
self.logger.debug("Read OsApplication <%s>" % os_app.getName())
|
188
|
+
os.addOsApplication(os_app)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import xml.etree.ElementTree as ET
|
2
|
+
import logging
|
3
|
+
import os
|
4
|
+
from ..models.eb_doc import PreferenceModel
|
5
|
+
from ..models.importer_xdm import SystemDescriptionImporter
|
6
|
+
from . import AbstractEbModelParser
|
7
|
+
|
8
|
+
class PerfXdmParser(AbstractEbModelParser):
|
9
|
+
def __init__(self, ) -> None:
|
10
|
+
super().__init__()
|
11
|
+
|
12
|
+
self.logger = logging.getLogger()
|
13
|
+
|
14
|
+
def parse_input_files(self, element: ET.Element, importer: SystemDescriptionImporter):
|
15
|
+
for ctr_tag in self.find_ctr_tag_list(element, "InputFiles"):
|
16
|
+
file_name = self.read_value(ctr_tag, "FileName")
|
17
|
+
self.logger.debug("Add the file <%s>" % file_name)
|
18
|
+
importer.addInputFile(file_name)
|
19
|
+
|
20
|
+
def parse_preference(self, element: ET.Element, doc: PreferenceModel):
|
21
|
+
importer = doc.getSystemDescriptionImporter()
|
22
|
+
|
23
|
+
for ctr_tag in self.find_ctr_tag_list(element, "SystemDescriptionImporters"):
|
24
|
+
self.logger.info("Parse SystemDescriptionImporters: <%s>" % ctr_tag.attrib["name"])
|
25
|
+
self.parse_input_files(ctr_tag, importer)
|
26
|
+
#importer.addInputFile()
|
27
|
+
|
28
|
+
def add_ecu_extract(self, doc: PreferenceModel, params = {'base_path': None, 'wildcard': None, "project": None}):
|
29
|
+
importer = doc.getSystemDescriptionImporter()
|
30
|
+
|
31
|
+
#if params['base_path'] is None:
|
32
|
+
# raise ValueError("Please specify the base path")
|
33
|
+
|
34
|
+
#ecu_extract_path = os.path.join(params['base_path'], '')
|
35
|
+
|
36
|
+
importer.addInputFile('systemmod/EcuExtract.arxml')
|
@@ -0,0 +1,95 @@
|
|
1
|
+
import xml.etree.ElementTree as ET
|
2
|
+
|
3
|
+
from ..models.rte_xdm import Rte, RteBswEventToTaskMapping, RteBswEventToTaskMappingV3, RteBswEventToTaskMappingV4, RteBswModuleInstance, RteEventToTaskMapping, RteEventToTaskMappingV3, RteEventToTaskMappingV4, RteSwComponentInstance
|
4
|
+
from ..models.eb_doc import EBModel
|
5
|
+
from ..parser.eb_parser import AbstractEbModelParser
|
6
|
+
|
7
|
+
class RteXdmParser(AbstractEbModelParser):
|
8
|
+
def __init__(self, ) -> None:
|
9
|
+
super().__init__()
|
10
|
+
self.rte = None
|
11
|
+
|
12
|
+
def parse(self, element: ET.Element, doc: EBModel):
|
13
|
+
if self.get_component_name(element) != "Rte":
|
14
|
+
raise ValueError("Invalid <%s> xdm file" % "Rte")
|
15
|
+
|
16
|
+
rte = doc.getRte()
|
17
|
+
self.read_version(element, rte)
|
18
|
+
|
19
|
+
self.logger.info("Parse Rte ARVersion:<%s> SwVersion:<%s>" %
|
20
|
+
(rte.getArVersion().getVersion(), rte.getSwVersion().getVersion()))
|
21
|
+
|
22
|
+
self.rte = rte
|
23
|
+
|
24
|
+
self.read_rte_bsw_module_instances(element, rte)
|
25
|
+
self.read_rte_sw_component_instances(element, rte)
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
def read_rte_bsw_module_instance_event_to_task_mappings(self, element: ET.Element, instance: RteBswModuleInstance):
|
30
|
+
for ctr_tag in self.find_ctr_tag_list(element, "RteBswEventToTaskMapping"):
|
31
|
+
self.logger.debug("Read RteBswEventToTaskMapping <%s>" % ctr_tag.attrib['name'])
|
32
|
+
|
33
|
+
if self.rte.getArVersion().getMajorVersion() >= 4:
|
34
|
+
mapping = RteBswEventToTaskMappingV4(instance, ctr_tag.attrib['name'])
|
35
|
+
else:
|
36
|
+
mapping = RteBswEventToTaskMappingV3(instance, ctr_tag.attrib['name'])
|
37
|
+
|
38
|
+
mapping.setRteBswActivationOffset(self.read_optional_value(ctr_tag, "RteBswActivationOffset")) \
|
39
|
+
.setRteBswEventPeriod(self.read_optional_value(ctr_tag, "RteBswPeriod")) \
|
40
|
+
.setRteBswPositionInTask(self.read_optional_value(ctr_tag, "RteBswPositionInTask")) \
|
41
|
+
.setRteBswServerQueueLength(self.read_optional_value(ctr_tag, "RteBswServerQueueLength"))
|
42
|
+
|
43
|
+
if isinstance(mapping, RteBswEventToTaskMappingV4):
|
44
|
+
for resource_ref in self.read_ref_value_list(ctr_tag, "RteBswEventRef"):
|
45
|
+
mapping.addRteBswEventRef(resource_ref)
|
46
|
+
elif isinstance(mapping, RteBswEventToTaskMappingV3):
|
47
|
+
mapping.setRteBswEventRef(self.read_ref_value(ctr_tag, "RteBswEventRef"))
|
48
|
+
|
49
|
+
mapping.setRteBswMappedToTaskRef(self.read_optional_ref_value(ctr_tag, "RteBswMappedToTaskRef"))
|
50
|
+
instance.addRteBswEventToTaskMapping(mapping)
|
51
|
+
|
52
|
+
def read_rte_bsw_module_instances(self, element: ET.Element, rte: Rte):
|
53
|
+
for ctr_tag in self.find_ctr_tag_list(element, 'RteBswModuleInstance'):
|
54
|
+
self.logger.debug("Read RteBswModuleInstance <%s>" % ctr_tag.attrib['name'])
|
55
|
+
|
56
|
+
instance = RteBswModuleInstance(rte, ctr_tag.attrib['name'])
|
57
|
+
instance.setRteBswImplementationRef(self.read_ref_value(ctr_tag, "RteBswImplementationRef")) \
|
58
|
+
.setRteMappedToOsApplicationRef(self.read_optional_ref_value(ctr_tag, "RteMappedToOsApplicationRef"))
|
59
|
+
|
60
|
+
self.read_rte_bsw_module_instance_event_to_task_mappings(ctr_tag, instance)
|
61
|
+
rte.addRteBswModuleInstance(instance)
|
62
|
+
|
63
|
+
def read_rte_sw_component_instance_event_to_task_mappings(self, element: ET.Element, instance: RteSwComponentInstance):
|
64
|
+
for ctr_tag in self.find_ctr_tag_list(element, "RteEventToTaskMapping"):
|
65
|
+
|
66
|
+
if self.rte.getArVersion().getMajorVersion() >= 4:
|
67
|
+
mapping = RteEventToTaskMappingV4(instance, ctr_tag.attrib['name'])
|
68
|
+
else:
|
69
|
+
mapping = RteEventToTaskMappingV3(instance, ctr_tag.attrib['name'])
|
70
|
+
|
71
|
+
mapping.setRteActivationOffset(self.read_optional_value(ctr_tag, "RteActivationOffset")) \
|
72
|
+
.setRtePeriod(self.read_optional_value(ctr_tag, "RtePeriod")) \
|
73
|
+
.setRtePositionInTask(self.read_optional_value(ctr_tag, "RtePositionInTask")) \
|
74
|
+
.setRteServerQueueLength(self.read_optional_value(ctr_tag, "RteServerQueueLength"))
|
75
|
+
|
76
|
+
if isinstance(mapping, RteEventToTaskMappingV4):
|
77
|
+
for resource_ref in self.read_ref_value_list(ctr_tag, "RteEventRef"):
|
78
|
+
mapping.addRteEventRef(resource_ref)
|
79
|
+
elif isinstance(mapping, RteEventToTaskMappingV3):
|
80
|
+
mapping.setRteEventRef(self.read_ref_value(ctr_tag, "RteEventRef"))
|
81
|
+
|
82
|
+
mapping.setRteMappedToTaskRef(self.read_optional_ref_value(ctr_tag, "RteMappedToTaskRef"))
|
83
|
+
|
84
|
+
instance.addRteEventToTaskMapping(mapping)
|
85
|
+
|
86
|
+
def read_rte_sw_component_instances(self, element: ET.Element, rte: Rte):
|
87
|
+
for ctr_tag in self.find_ctr_tag_list(element, 'RteSwComponentInstance'):
|
88
|
+
self.logger.debug("Read RteSwComponentInstance <%s>" % ctr_tag.attrib['name'])
|
89
|
+
|
90
|
+
instance = RteSwComponentInstance(rte, ctr_tag.attrib['name'])
|
91
|
+
instance.setMappedToOsApplicationRef(self.read_optional_ref_value(ctr_tag, "MappedToOsApplicationRef")) \
|
92
|
+
.setRteSoftwareComponentInstanceRef(self.read_optional_ref_value(ctr_tag, "RteSoftwareComponentInstanceRef"))
|
93
|
+
|
94
|
+
self.read_rte_sw_component_instance_event_to_task_mappings(ctr_tag, instance)
|
95
|
+
rte.addRteSwComponentInstance(instance)
|
@@ -1,42 +1,42 @@
|
|
1
1
|
import logging
|
2
2
|
from openpyxl import Workbook
|
3
|
+
from openpyxl.cell import Cell
|
4
|
+
from openpyxl.styles import Alignment
|
3
5
|
from openpyxl.worksheet.worksheet import Worksheet
|
4
6
|
|
5
7
|
class ExcelReporter:
|
6
8
|
def __init__(self) -> None:
|
7
9
|
self.wb = Workbook()
|
8
|
-
self.
|
10
|
+
self.logger = logging.getLogger()
|
9
11
|
|
10
|
-
def write_revision(self):
|
11
|
-
sheet = self.wb['Sheet']
|
12
|
-
sheet.title = "History"
|
13
|
-
|
14
|
-
title_rows = ["When", "Who", "Version", "History"]
|
15
|
-
self.write_title_row(sheet, title_rows)
|
16
|
-
|
17
12
|
def auto_width(self, worksheet: Worksheet):
|
18
13
|
dims = {}
|
19
14
|
for row in worksheet.rows:
|
20
15
|
for cell in row:
|
21
16
|
if cell.value:
|
17
|
+
alignment = cell.alignment # type: Alignment
|
18
|
+
if (alignment.wrapText == True):
|
19
|
+
continue
|
22
20
|
dims[cell.column_letter] = max((dims.get(cell.column_letter, 0), len(str(cell.value))))
|
23
21
|
|
24
22
|
for col, value in dims.items():
|
25
|
-
worksheet.column_dimensions[col].width = (value + 2) + 2
|
23
|
+
#worksheet.column_dimensions[col].width = (value + 2) + 2
|
24
|
+
worksheet.column_dimensions[col].width = (value + 2)
|
26
25
|
|
27
26
|
def write_title_row(self, sheet: Worksheet, title_row):
|
28
27
|
for idx in range(0, len(title_row)):
|
29
28
|
cell = sheet.cell(row=1, column=idx + 1)
|
30
29
|
cell.value = title_row[idx]
|
31
30
|
|
32
|
-
def write_cell(self, sheet, row, column, value, format = None):
|
33
|
-
cell = sheet.cell(row = row, column=column)
|
31
|
+
def write_cell(self, sheet, row, column, value, format = None) -> Cell:
|
32
|
+
cell = sheet.cell(row = row, column=column) # type: Cell
|
34
33
|
cell.value = value
|
35
34
|
if (format != None):
|
36
35
|
if ('alignment' in format):
|
37
36
|
cell.alignment = format['alignment']
|
38
37
|
if ('number_format' in format):
|
39
38
|
cell.number_format = format['number_format']
|
39
|
+
return cell
|
40
40
|
|
41
41
|
def save(self, name: str):
|
42
42
|
self.wb.save(name)
|