py-eb-model 1.1.5__py3-none-any.whl → 1.1.7__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/cli/nvm_xdm_2_xls_cli.py +63 -0
- eb_model/cli/rte_xdm_2_xls_cli.py +28 -27
- eb_model/models/abstract.py +26 -9
- eb_model/models/eb_doc.py +13 -4
- eb_model/models/nvm_xdm.py +347 -0
- eb_model/models/os_xdm.py +355 -53
- eb_model/models/rte_xdm.py +16 -11
- eb_model/parser/__init__.py +2 -1
- eb_model/parser/eb_parser.py +31 -21
- eb_model/parser/nvm_xdm_parser.py +44 -0
- eb_model/parser/os_xdm_parser.py +61 -5
- eb_model/parser/rte_xdm_parser.py +11 -11
- eb_model/reporter/__init__.py +2 -1
- eb_model/reporter/excel_reporter/abstract.py +19 -11
- eb_model/reporter/excel_reporter/nvm_xdm.py +40 -0
- eb_model/reporter/excel_reporter/os_xdm.py +104 -20
- eb_model/reporter/excel_reporter/rte_xdm.py +19 -6
- eb_model/tests/models/test_abstract.py +201 -0
- eb_model/tests/models/test_eb_doc.py +66 -0
- eb_model/tests/models/test_eclipse_project.py +21 -0
- eb_model/tests/models/test_importer_xdm.py +45 -40
- eb_model/tests/parser/__init__.py +0 -0
- eb_model/tests/parser/test_os_xdm_parser.py +150 -0
- {py_eb_model-1.1.5.dist-info → py_eb_model-1.1.7.dist-info}/METADATA +26 -3
- py_eb_model-1.1.7.dist-info/RECORD +47 -0
- {py_eb_model-1.1.5.dist-info → py_eb_model-1.1.7.dist-info}/entry_points.txt +1 -0
- py_eb_model-1.1.5.dist-info/RECORD +0 -38
- {py_eb_model-1.1.5.dist-info → py_eb_model-1.1.7.dist-info}/LICENSE +0 -0
- {py_eb_model-1.1.5.dist-info → py_eb_model-1.1.7.dist-info}/WHEEL +0 -0
- {py_eb_model-1.1.5.dist-info → py_eb_model-1.1.7.dist-info}/top_level.txt +0 -0
eb_model/parser/eb_parser.py
CHANGED
@@ -8,14 +8,15 @@ from typing import List
|
|
8
8
|
from ..models.eb_doc import EBModel, PreferenceModel
|
9
9
|
from ..models.abstract import EcucRefType, Module
|
10
10
|
|
11
|
-
|
11
|
+
|
12
|
+
class AbstractEbModelParser(metaclass=ABCMeta):
|
12
13
|
|
13
14
|
def __init__(self) -> None:
|
14
15
|
self.nsmap = {}
|
15
16
|
|
16
17
|
self.logger = logging.getLogger()
|
17
18
|
|
18
|
-
if type(self)
|
19
|
+
if type(self) is AbstractEbModelParser:
|
19
20
|
raise ValueError("Abstract EBModelParser cannot be initialized.")
|
20
21
|
|
21
22
|
def validate_root(self, element: ET.Element):
|
@@ -39,7 +40,6 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
39
40
|
'''
|
40
41
|
Internal function and please call _read_ref_value instead of it
|
41
42
|
'''
|
42
|
-
#match = re.match(r'ASPath.*\/(.*)', value)
|
43
43
|
match = re.match(r'ASPath:(.*)', value)
|
44
44
|
if (match):
|
45
45
|
return match.group(1)
|
@@ -60,18 +60,20 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
60
60
|
|
61
61
|
def read_value(self, parent: ET.Element, name: str) -> str:
|
62
62
|
tag = parent.find(".//d:var[@name='%s']" % name, self.nsmap)
|
63
|
-
if tag
|
63
|
+
if tag is None:
|
64
64
|
raise KeyError("XPath d:var[@name='%s'] is invalid" % name)
|
65
65
|
return self._convert_value(tag)
|
66
66
|
|
67
|
-
def read_optional_value(self, parent: ET.Element, name: str, default_value
|
67
|
+
def read_optional_value(self, parent: ET.Element, name: str, default_value=None) -> str:
|
68
68
|
tag = parent.find(".//d:var[@name='%s']" % name, self.nsmap)
|
69
69
|
if tag is None:
|
70
70
|
return default_value
|
71
|
-
if
|
71
|
+
if 'value' not in tag.attrib:
|
72
72
|
return default_value
|
73
73
|
enable = self.read_attrib(tag, 'ENABLE')
|
74
|
-
if
|
74
|
+
if enable is None:
|
75
|
+
return default_value
|
76
|
+
if enable.upper() == "FALSE":
|
75
77
|
return default_value
|
76
78
|
return self._convert_value(tag)
|
77
79
|
|
@@ -85,14 +87,19 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
85
87
|
def read_ref_value(self, parent: ET.Element, name: str) -> EcucRefType:
|
86
88
|
tag = parent.find(".//d:ref[@name='%s']" % name, self.nsmap)
|
87
89
|
if tag is None:
|
88
|
-
|
89
|
-
|
90
|
+
raise KeyError("XPath d:ref[@name='%s'] is invalid" % name)
|
91
|
+
if 'value' in tag.attrib:
|
92
|
+
return EcucRefType(self.read_ref_raw_value(tag.attrib['value']))
|
93
|
+
return None
|
90
94
|
|
91
95
|
def read_optional_ref_value(self, parent: ET.Element, name: str) -> EcucRefType:
|
92
96
|
tag = parent.find(".//d:ref[@name='%s']" % name, self.nsmap)
|
93
97
|
enable = self.read_attrib(tag, 'ENABLE')
|
94
|
-
if
|
98
|
+
if enable is None:
|
99
|
+
return None
|
100
|
+
if enable.upper() == "FALSE":
|
95
101
|
return None
|
102
|
+
|
96
103
|
return EcucRefType(self.read_ref_raw_value(tag.attrib['value']))
|
97
104
|
|
98
105
|
def read_ref_value_list(self, parent: ET.Element, name: str) -> List[EcucRefType]:
|
@@ -100,7 +107,7 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
100
107
|
for tag in parent.findall(".//d:lst[@name='%s']/d:ref" % name, self.nsmap):
|
101
108
|
ref_value_list.append(EcucRefType(self.read_ref_raw_value(tag.attrib['value'])))
|
102
109
|
return ref_value_list
|
103
|
-
|
110
|
+
|
104
111
|
def find_ctr_tag_list(self, parent: ET.Element, name: str) -> List[ET.Element]:
|
105
112
|
return parent.findall(".//d:lst[@name='%s']/d:ctr" % name, self.nsmap)
|
106
113
|
|
@@ -109,26 +116,26 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
109
116
|
|
110
117
|
def find_ctr_tag(self, parent: ET.Element, name: str) -> ET.Element:
|
111
118
|
'''
|
112
|
-
Read the child ctr tag.
|
119
|
+
Read the child ctr tag.
|
113
120
|
'''
|
114
121
|
tag = parent.find(".//d:ctr[@name='%s']" % name, self.nsmap)
|
115
122
|
if tag is None:
|
116
123
|
return None
|
117
124
|
enable = self.read_attrib(tag, 'ENABLE')
|
118
|
-
# ctr has the value if
|
125
|
+
# ctr has the value if
|
119
126
|
# 1. enable attribute do not exist
|
120
127
|
# 2. enable attribute is not false
|
121
|
-
if enable is not None and enable == "
|
128
|
+
if enable is not None and enable.upper() == "FALSE":
|
122
129
|
return None
|
123
130
|
return tag
|
124
131
|
|
125
|
-
def create_ctr_tag(self, name: str, type: str)-> ET.Element:
|
132
|
+
def create_ctr_tag(self, name: str, type: str) -> ET.Element:
|
126
133
|
ctr_tag = ET.Element("d:ctr")
|
127
134
|
ctr_tag.attrib['name'] = name
|
128
135
|
ctr_tag.attrib['type'] = type
|
129
136
|
return ctr_tag
|
130
137
|
|
131
|
-
def create_ref_tag(self, name:str, type: str, value = "")-> ET.Element:
|
138
|
+
def create_ref_tag(self, name: str, type: str, value: str = "") -> ET.Element:
|
132
139
|
ref_tag = ET.Element("d:ref")
|
133
140
|
ref_tag.attrib['name'] = name
|
134
141
|
ref_tag.attrib['type'] = type
|
@@ -136,20 +143,20 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
136
143
|
ref_tag.attrib['value'] = "ASPath:%s" % value
|
137
144
|
return ref_tag
|
138
145
|
|
139
|
-
def create_choice_tag(self, name:str, type:str, value: str)-> ET.Element:
|
146
|
+
def create_choice_tag(self, name: str, type: str, value: str) -> ET.Element:
|
140
147
|
choice_tag = ET.Element("d:chc")
|
141
148
|
choice_tag.attrib['name'] = name
|
142
149
|
choice_tag.attrib['type'] = type
|
143
150
|
choice_tag.attrib['value'] = value
|
144
151
|
return choice_tag
|
145
152
|
|
146
|
-
def create_attrib_tag(self, name:str, value: str) -> ET.Element:
|
153
|
+
def create_attrib_tag(self, name: str, value: str) -> ET.Element:
|
147
154
|
attrib_tag = ET.Element("a:a")
|
148
155
|
attrib_tag.attrib['name'] = name
|
149
156
|
attrib_tag.attrib['value'] = value
|
150
157
|
return attrib_tag
|
151
158
|
|
152
|
-
def create_ref_lst_tag(self, name:str, type:str = "", ref_list: List[str] = []) -> ET.Element:
|
159
|
+
def create_ref_lst_tag(self, name: str, type: str = "", ref_list: List[str] = []) -> ET.Element:
|
153
160
|
lst_tag = ET.Element("d:lst")
|
154
161
|
lst_tag.attrib['name'] = name
|
155
162
|
for ref in ref_list:
|
@@ -167,7 +174,7 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
167
174
|
return parent.find(".//d:lst[@name='%s']" % name, self.nsmap)
|
168
175
|
|
169
176
|
def read_attrib(self, parent: ET.Element, name: str) -> str:
|
170
|
-
attrib_tag = parent.find("
|
177
|
+
attrib_tag = parent.find("a:a[@name='%s']" % name, self.nsmap)
|
171
178
|
if attrib_tag is None:
|
172
179
|
return None
|
173
180
|
return attrib_tag.attrib['value']
|
@@ -175,6 +182,9 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
175
182
|
def read_namespaces(self, xdm: str):
|
176
183
|
self.nsmap = dict([node for _, node in ET.iterparse(xdm, events=['start-ns'])])
|
177
184
|
|
185
|
+
# def set_namespace(self, key: str, value: str):
|
186
|
+
# self.nsmap[key] = value
|
187
|
+
|
178
188
|
def parse(self, element: ET.Element, doc: EBModel):
|
179
189
|
pass
|
180
190
|
|
@@ -197,4 +207,4 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
197
207
|
|
198
208
|
def parse_preference_xdm(self, filename: str, doc: EBModel):
|
199
209
|
root_tag = self.load_xdm(filename)
|
200
|
-
self.parse_preference(root_tag, doc)
|
210
|
+
self.parse_preference(root_tag, doc)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
import xml.etree.ElementTree as ET
|
2
|
+
|
3
|
+
from ..models.nvm_xdm import NvM, NvMBlockDescriptor
|
4
|
+
from ..models.eb_doc import EBModel
|
5
|
+
from ..parser.eb_parser import AbstractEbModelParser
|
6
|
+
|
7
|
+
|
8
|
+
class NvMXdmParser(AbstractEbModelParser):
|
9
|
+
def __init__(self, ) -> None:
|
10
|
+
super().__init__()
|
11
|
+
|
12
|
+
self.nvm = None
|
13
|
+
|
14
|
+
def parse(self, element: ET.Element, doc: EBModel):
|
15
|
+
if self.get_component_name(element) != "NvM":
|
16
|
+
raise ValueError("Invalid <%s> xdm file" % "NvM")
|
17
|
+
|
18
|
+
nvm = doc.getNvM()
|
19
|
+
|
20
|
+
self.read_version(element, nvm)
|
21
|
+
|
22
|
+
self.logger.info("Parse NvM ARVersion:<%s> SwVersion:<%s>" % (nvm.getArVersion().getVersion(), nvm.getSwVersion().getVersion()))
|
23
|
+
|
24
|
+
self.nvm = nvm
|
25
|
+
|
26
|
+
self.read_nvm_block_descriptors(element, nvm)
|
27
|
+
|
28
|
+
def read_nvm_block_descriptors(self, element: ET.Element, nvm: NvM):
|
29
|
+
for ctr_tag in self.find_ctr_tag_list(element, "NvMBlockDescriptor"):
|
30
|
+
nvm_block = NvMBlockDescriptor(nvm, ctr_tag.attrib["name"])
|
31
|
+
nvm_block.setNvMBlockCrcType(self.read_optional_value(ctr_tag, "NvMBlockCrcType")) \
|
32
|
+
.setNvMBlockEcucPartitionRef(self.read_ref_value(ctr_tag, "NvMBlockEcucPartitionRef")) \
|
33
|
+
.setNvMNvramBlockIdentifier(self.read_value(ctr_tag, "NvMNvramBlockIdentifier")) \
|
34
|
+
.setNvMRamBlockDataAddress(self.read_optional_value(ctr_tag, "NvMRamBlockDataAddress")) \
|
35
|
+
.setNvMRomBlockDataAddress(self.read_optional_value(ctr_tag, "NvMRomBlockDataAddress")) \
|
36
|
+
.setNvMRomBlockNum(self.read_value(ctr_tag, "NvMRomBlockNum")) \
|
37
|
+
.setNvMBlockManagementType(self.read_value(ctr_tag, "NvMBlockManagementType")) \
|
38
|
+
.setNvMNvBlockLength(self.read_value(ctr_tag, "NvMNvBlockLength")) \
|
39
|
+
.setNvMNvBlockNum(self.read_value(ctr_tag, "NvMNvBlockNum")) \
|
40
|
+
.setNvMSelectBlockForReadAll(self.read_value(ctr_tag, "NvMSelectBlockForReadAll")) \
|
41
|
+
.setNvMSelectBlockForWriteAll(self.read_value(ctr_tag, "NvMSelectBlockForWriteAll"))
|
42
|
+
|
43
|
+
nvm.addNvMBlockDescriptor(nvm_block)
|
44
|
+
|
eb_model/parser/os_xdm_parser.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
import xml.etree.ElementTree as ET
|
2
2
|
from ..models.eb_doc import EBModel
|
3
|
-
from ..models.os_xdm import Os, OsAlarm, OsAlarmActivateTask, OsAlarmCallback, OsAlarmIncrementCounter, OsAlarmSetEvent, OsCounter,
|
3
|
+
from ..models.os_xdm import Os, OsAlarm, OsAlarmActivateTask, OsAlarmCallback, OsAlarmIncrementCounter, OsAlarmSetEvent, OsCounter, OsResource
|
4
|
+
from ..models.os_xdm import OsScheduleTable
|
4
5
|
from ..models.os_xdm import OsTask, OsIsr, OsApplication, OsScheduleTableEventSetting, OsScheduleTableExpiryPoint, OsScheduleTableTaskActivation
|
5
|
-
from ..models.os_xdm import OsScheduleTblAdjustableExpPoint, OsTaskAutostart
|
6
|
+
from ..models.os_xdm import OsScheduleTblAdjustableExpPoint, OsTaskAutostart, OsMicrokernel, MkMemoryProtection, MkMemoryRegion
|
6
7
|
from ..parser.eb_parser import AbstractEbModelParser
|
7
8
|
|
8
9
|
|
@@ -20,7 +21,7 @@ class OsXdmParser(AbstractEbModelParser):
|
|
20
21
|
|
21
22
|
self.read_version(element, os)
|
22
23
|
|
23
|
-
self.logger.info("Parse
|
24
|
+
self.logger.info("Parse Os ARVersion:<%s> SwVersion:<%s>" % (os.getArVersion().getVersion(), os.getSwVersion().getVersion()))
|
24
25
|
|
25
26
|
self.os = os
|
26
27
|
|
@@ -30,6 +31,8 @@ class OsXdmParser(AbstractEbModelParser):
|
|
30
31
|
self.read_os_schedule_tables(element, os)
|
31
32
|
self.read_os_counters(element, os)
|
32
33
|
self.read_os_applications(element, os)
|
34
|
+
self.read_os_resources(element, os)
|
35
|
+
self.read_os_microkernel(element, os)
|
33
36
|
|
34
37
|
def read_os_task_autostart(self, element: ET.Element, os_task: OsTask):
|
35
38
|
ctr_tag = self.find_ctr_tag(element, "OsTaskAutostart")
|
@@ -64,11 +67,21 @@ class OsXdmParser(AbstractEbModelParser):
|
|
64
67
|
.setOsStacksize(int(self.read_value(ctr_tag, "OsStacksize"))) \
|
65
68
|
.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsIsrPriority"))
|
66
69
|
|
67
|
-
#
|
70
|
+
# Infineon Aurix Tricore
|
68
71
|
os_isr.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsTricoreIrqLevel"))
|
69
|
-
|
72
|
+
os_isr.setOsIsrVector(self.read_optional_value(ctr_tag, "OsTricoreVector"))
|
73
|
+
os_isr.setOsTricoreIrqLevel(self.read_optional_value(ctr_tag, "OsTricoreIrqLevel"))
|
74
|
+
os_isr.setOsTricoreVector(self.read_optional_value(ctr_tag, "OsTricoreVector"))
|
75
|
+
|
76
|
+
# ARM Core
|
70
77
|
os_isr.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsARMIrqLevel"))
|
71
78
|
os_isr.setOsIsrVector(self.read_optional_value(ctr_tag, "OsARMVector"))
|
79
|
+
os_isr.setOsARMIrqLevel(self.read_optional_value(ctr_tag, "OsARMIrqLevel"))
|
80
|
+
os_isr.setOsARMVector(self.read_optional_value(ctr_tag, "OsARMVector"))
|
81
|
+
|
82
|
+
# EB Safety OS
|
83
|
+
for ref in self.read_ref_value_list(ctr_tag, "OsIsrMkMemoryRegionRef"):
|
84
|
+
os_isr.addOsIsrMkMemoryRegionRef(ref)
|
72
85
|
|
73
86
|
self.logger.debug("Read OsIsr <%s>" % os_isr.getName())
|
74
87
|
os.addOsIsr(os_isr)
|
@@ -184,3 +197,46 @@ class OsXdmParser(AbstractEbModelParser):
|
|
184
197
|
|
185
198
|
self.logger.debug("Read OsApplication <%s>" % os_app.getName())
|
186
199
|
os.addOsApplication(os_app)
|
200
|
+
|
201
|
+
def read_os_resources(self, element: ET.Element, os: Os):
|
202
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsResource"):
|
203
|
+
os_res = OsResource(os, ctr_tag.attrib["name"])
|
204
|
+
os_res.setImporterInfo(self.read_attrib(ctr_tag, "IMPORTER_INFO"))
|
205
|
+
os_res.setOsResourceProperty(self.read_value(ctr_tag, "OsResourceProperty"))
|
206
|
+
|
207
|
+
for ref in self.read_ref_value_list(ctr_tag, "OsResourceAccessingApplication"):
|
208
|
+
os_res.addOsResourceAccessingApplicationRefs(ref)
|
209
|
+
|
210
|
+
os.addOsResource(os_res)
|
211
|
+
|
212
|
+
def read_mk_memory_regions(self, element: ET.Element, protection: MkMemoryProtection):
|
213
|
+
for ctr_tag in self.find_ctr_tag_list(element, "MkMemoryRegion"):
|
214
|
+
# self.logger.info("Read MkMemoryRegion %s" % ctr_tag.attrib["name"])
|
215
|
+
region = MkMemoryRegion(protection, ctr_tag.attrib["name"])
|
216
|
+
region.setMkMemoryRegionFlags(self.read_value(ctr_tag, "MkMemoryRegionFlags"))
|
217
|
+
region.setMkMemoryRegionInitialize(self.read_value(ctr_tag, "MkMemoryRegionInitialize"))
|
218
|
+
region.setMkMemoryRegionGlobal(self.read_value(ctr_tag, "MkMemoryRegionGlobal"))
|
219
|
+
region.setMkMemoryRegionInitThreadAccess(self.read_value(ctr_tag, "MkMemoryRegionInitThreadAccess"))
|
220
|
+
region.setMkMemoryRegionIdleThreadAccess(self.read_value(ctr_tag, "MkMemoryRegionIdleThreadAccess"))
|
221
|
+
region.setMkMemoryRegionOsThreadAccess(self.read_value(ctr_tag, "MkMemoryRegionOsThreadAccess"))
|
222
|
+
region.setMkMemoryRegionErrorHookAccess(self.read_value(ctr_tag, "MkMemoryRegionErrorHookAccess"))
|
223
|
+
region.setMkMemoryRegionProtHookAccess(self.read_value(ctr_tag, "MkMemoryRegionProtHookAccess"))
|
224
|
+
region.setMkMemoryRegionShutdownHookAccess(self.read_value(ctr_tag, "MkMemoryRegionShutdownHookAccess"))
|
225
|
+
region.setMkMemoryRegionShutdownAccess(self.read_value(ctr_tag, "MkMemoryRegionShutdownAccess"))
|
226
|
+
region.setMkMemoryRegionInitializePerCore(self.read_value(ctr_tag, "MkMemoryRegionInitializePerCore"))
|
227
|
+
protection.addMkMemoryRegion(region)
|
228
|
+
|
229
|
+
def read_mk_memory_protection(self, element: ET.Element, kernel: OsMicrokernel):
|
230
|
+
ctr_tag = self.find_ctr_tag(element, "MkMemoryProtection")
|
231
|
+
if ctr_tag is not None:
|
232
|
+
# self.logger.info("Read MkMemoryProtection")
|
233
|
+
protection = MkMemoryProtection(kernel, ctr_tag.attrib["name"])
|
234
|
+
self.read_mk_memory_regions(ctr_tag, protection)
|
235
|
+
kernel.setMkMemoryProtection(protection)
|
236
|
+
|
237
|
+
def read_os_microkernel(self, element: ET.Element, os: Os):
|
238
|
+
ctr_tag = self.find_ctr_tag(element, "OsMicrokernel")
|
239
|
+
if ctr_tag is not None:
|
240
|
+
kernel = OsMicrokernel(os, ctr_tag.attrib["name"])
|
241
|
+
self.read_mk_memory_protection(ctr_tag, kernel)
|
242
|
+
os.setOsMicrokernel(kernel)
|
@@ -1,9 +1,11 @@
|
|
1
1
|
import xml.etree.ElementTree as ET
|
2
2
|
|
3
|
-
from ..models.rte_xdm import Rte, RteBswEventToTaskMapping, RteBswEventToTaskMappingV3, RteBswEventToTaskMappingV4, RteBswModuleInstance
|
3
|
+
from ..models.rte_xdm import Rte, RteBswEventToTaskMapping, RteBswEventToTaskMappingV3, RteBswEventToTaskMappingV4, RteBswModuleInstance
|
4
|
+
from ..models.rte_xdm import RteEventToTaskMapping, RteEventToTaskMappingV3, RteEventToTaskMappingV4, RteSwComponentInstance
|
4
5
|
from ..models.eb_doc import EBModel
|
5
6
|
from ..parser.eb_parser import AbstractEbModelParser
|
6
7
|
|
8
|
+
|
7
9
|
class RteXdmParser(AbstractEbModelParser):
|
8
10
|
def __init__(self, ) -> None:
|
9
11
|
super().__init__()
|
@@ -16,16 +18,12 @@ class RteXdmParser(AbstractEbModelParser):
|
|
16
18
|
rte = doc.getRte()
|
17
19
|
self.read_version(element, rte)
|
18
20
|
|
19
|
-
self.logger.info("Parse Rte ARVersion:<%s> SwVersion:<%s>" %
|
20
|
-
(rte.getArVersion().getVersion(), rte.getSwVersion().getVersion()))
|
21
|
-
|
21
|
+
self.logger.info("Parse Rte ARVersion:<%s> SwVersion:<%s>" % (rte.getArVersion().getVersion(), rte.getSwVersion().getVersion()))
|
22
22
|
self.rte = rte
|
23
23
|
|
24
24
|
self.read_rte_bsw_module_instances(element, rte)
|
25
25
|
self.read_rte_sw_component_instances(element, rte)
|
26
26
|
|
27
|
-
|
28
|
-
|
29
27
|
def read_rte_bsw_module_instance_event_to_task_mappings(self, element: ET.Element, instance: RteBswModuleInstance):
|
30
28
|
for ctr_tag in self.find_ctr_tag_list(element, "RteBswEventToTaskMapping"):
|
31
29
|
self.logger.debug("Read RteBswEventToTaskMapping <%s>" % ctr_tag.attrib['name'])
|
@@ -38,7 +36,7 @@ class RteXdmParser(AbstractEbModelParser):
|
|
38
36
|
mapping.setRteBswActivationOffset(self.read_optional_value(ctr_tag, "RteBswActivationOffset")) \
|
39
37
|
.setRteBswEventPeriod(self.read_optional_value(ctr_tag, "RteBswPeriod")) \
|
40
38
|
.setRteBswPositionInTask(self.read_optional_value(ctr_tag, "RteBswPositionInTask")) \
|
41
|
-
.setRteBswServerQueueLength(self.read_optional_value(ctr_tag, "RteBswServerQueueLength"))
|
39
|
+
.setRteBswServerQueueLength(self.read_optional_value(ctr_tag, "RteBswServerQueueLength"))
|
42
40
|
|
43
41
|
if isinstance(mapping, RteBswEventToTaskMappingV4):
|
44
42
|
for resource_ref in self.read_ref_value_list(ctr_tag, "RteBswEventRef"):
|
@@ -56,7 +54,7 @@ class RteXdmParser(AbstractEbModelParser):
|
|
56
54
|
instance = RteBswModuleInstance(rte, ctr_tag.attrib['name'])
|
57
55
|
instance.setRteBswImplementationRef(self.read_ref_value(ctr_tag, "RteBswImplementationRef")) \
|
58
56
|
.setRteMappedToOsApplicationRef(self.read_optional_ref_value(ctr_tag, "RteMappedToOsApplicationRef"))
|
59
|
-
|
57
|
+
|
60
58
|
self.read_rte_bsw_module_instance_event_to_task_mappings(ctr_tag, instance)
|
61
59
|
rte.addRteBswModuleInstance(instance)
|
62
60
|
|
@@ -71,7 +69,7 @@ class RteXdmParser(AbstractEbModelParser):
|
|
71
69
|
mapping.setRteActivationOffset(self.read_optional_value(ctr_tag, "RteActivationOffset")) \
|
72
70
|
.setRtePeriod(self.read_optional_value(ctr_tag, "RtePeriod")) \
|
73
71
|
.setRtePositionInTask(self.read_optional_value(ctr_tag, "RtePositionInTask")) \
|
74
|
-
.setRteServerQueueLength(self.read_optional_value(ctr_tag, "RteServerQueueLength"))
|
72
|
+
.setRteServerQueueLength(self.read_optional_value(ctr_tag, "RteServerQueueLength"))
|
75
73
|
|
76
74
|
if isinstance(mapping, RteEventToTaskMappingV4):
|
77
75
|
for resource_ref in self.read_ref_value_list(ctr_tag, "RteEventRef"):
|
@@ -80,6 +78,8 @@ class RteXdmParser(AbstractEbModelParser):
|
|
80
78
|
mapping.setRteEventRef(self.read_ref_value(ctr_tag, "RteEventRef"))
|
81
79
|
|
82
80
|
mapping.setRteMappedToTaskRef(self.read_optional_ref_value(ctr_tag, "RteMappedToTaskRef"))
|
81
|
+
|
82
|
+
self.logger.debug("Rte Event %s" % mapping.getRteEventRef().getShortName())
|
83
83
|
|
84
84
|
instance.addRteEventToTaskMapping(mapping)
|
85
85
|
|
@@ -89,7 +89,7 @@ class RteXdmParser(AbstractEbModelParser):
|
|
89
89
|
|
90
90
|
instance = RteSwComponentInstance(rte, ctr_tag.attrib['name'])
|
91
91
|
instance.setMappedToOsApplicationRef(self.read_optional_ref_value(ctr_tag, "MappedToOsApplicationRef")) \
|
92
|
-
|
92
|
+
.setRteSoftwareComponentInstanceRef(self.read_optional_ref_value(ctr_tag, "RteSoftwareComponentInstanceRef"))
|
93
93
|
|
94
94
|
self.read_rte_sw_component_instance_event_to_task_mappings(ctr_tag, instance)
|
95
|
-
rte.addRteSwComponentInstance(instance)
|
95
|
+
rte.addRteSwComponentInstance(instance)
|
eb_model/reporter/__init__.py
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
from .excel_reporter.os_xdm import *
|
1
|
+
from .excel_reporter.os_xdm import *
|
2
|
+
from .excel_reporter.nvm_xdm import *
|
@@ -1,43 +1,51 @@
|
|
1
1
|
import logging
|
2
2
|
from openpyxl import Workbook
|
3
3
|
from openpyxl.cell import Cell
|
4
|
-
from openpyxl.styles import Alignment
|
5
4
|
from openpyxl.worksheet.worksheet import Worksheet
|
5
|
+
from openpyxl.styles import Alignment
|
6
|
+
|
6
7
|
|
7
8
|
class ExcelReporter:
|
8
9
|
def __init__(self) -> None:
|
9
10
|
self.wb = Workbook()
|
10
11
|
self.logger = logging.getLogger()
|
11
12
|
|
12
|
-
def auto_width(self, worksheet
|
13
|
+
def auto_width(self, worksheet, customized={}):
|
13
14
|
dims = {}
|
14
15
|
for row in worksheet.rows:
|
15
16
|
for cell in row:
|
16
17
|
if cell.value:
|
17
|
-
alignment = cell.alignment # type: Alignment
|
18
|
-
if (alignment.wrapText == True):
|
19
|
-
continue
|
20
18
|
dims[cell.column_letter] = max((dims.get(cell.column_letter, 0), len(str(cell.value))))
|
21
19
|
|
22
20
|
for col, value in dims.items():
|
23
|
-
|
24
|
-
|
21
|
+
self.logger.debug("Sheet:%s , column: %s, width: %d" % (str(worksheet), col, value))
|
22
|
+
if col in customized:
|
23
|
+
if customized[col] != 0:
|
24
|
+
worksheet.column_dimensions[col].width = customized[col]
|
25
|
+
else:
|
26
|
+
worksheet.column_dimensions[col].width = value + 4
|
25
27
|
|
26
28
|
def write_title_row(self, sheet: Worksheet, title_row):
|
27
29
|
for idx in range(0, len(title_row)):
|
28
30
|
cell = sheet.cell(row=1, column=idx + 1)
|
29
31
|
cell.value = title_row[idx]
|
32
|
+
cell.alignment = Alignment(horizontal="center")
|
30
33
|
|
31
|
-
def write_cell(self, sheet, row, column, value, format
|
32
|
-
cell = sheet.cell(row
|
34
|
+
def write_cell(self, sheet: Worksheet, row: int, column: int, value, format=None) -> Cell:
|
35
|
+
cell = sheet.cell(row=row, column=column) # type: Cell
|
33
36
|
cell.value = value
|
34
|
-
if (format
|
37
|
+
if (format is not None):
|
35
38
|
if ('alignment' in format):
|
36
39
|
cell.alignment = format['alignment']
|
37
40
|
if ('number_format' in format):
|
38
41
|
cell.number_format = format['number_format']
|
39
42
|
return cell
|
43
|
+
|
44
|
+
def format_boolean(self, value: bool) -> str:
|
45
|
+
if value is True:
|
46
|
+
return "Y"
|
47
|
+
else:
|
48
|
+
return "N"
|
40
49
|
|
41
50
|
def save(self, name: str):
|
42
51
|
self.wb.save(name)
|
43
|
-
|
@@ -0,0 +1,40 @@
|
|
1
|
+
from ...models.eb_doc import EBModel
|
2
|
+
from ...reporter.excel_reporter.abstract import ExcelReporter
|
3
|
+
|
4
|
+
|
5
|
+
class NvMXdmXlsWriter(ExcelReporter):
|
6
|
+
def __init__(self) -> None:
|
7
|
+
super().__init__()
|
8
|
+
|
9
|
+
def write_nvm_block_descriptors(self, doc: EBModel):
|
10
|
+
sheet = self.wb.create_sheet("NvMBlock", 0)
|
11
|
+
|
12
|
+
title_row = [
|
13
|
+
"BlockId", "Name", "NvMBlockEcucPartitionRef", "NvMRamBlockDataAddress", "NvMRomBlockDataAddress",
|
14
|
+
"NvMBlockManagementType", "NvMNvBlockLength", "NvMNvBlockNum", "NvMSelectBlockForReadAll", "NvMSelectBlockForWriteAll"]
|
15
|
+
self.write_title_row(sheet, title_row)
|
16
|
+
|
17
|
+
row = 2
|
18
|
+
for nvm_block in doc.getNvM().getNvMBlockDescriptorList():
|
19
|
+
self.write_cell(sheet, row, 1, nvm_block.getNvMNvramBlockIdentifier())
|
20
|
+
self.write_cell(sheet, row, 2, nvm_block.getName())
|
21
|
+
self.write_cell(sheet, row, 3, nvm_block.getNvMBlockEcucPartitionRef())
|
22
|
+
self.write_cell(sheet, row, 4, nvm_block.getNvMRamBlockDataAddress())
|
23
|
+
self.write_cell(sheet, row, 5, nvm_block.getNvMRomBlockDataAddress())
|
24
|
+
self.write_cell(sheet, row, 6, nvm_block.getNvMBlockManagementType())
|
25
|
+
self.write_cell(sheet, row, 7, nvm_block.getNvMNvBlockLength())
|
26
|
+
self.write_cell(sheet, row, 8, nvm_block.getNvMNvBlockNum())
|
27
|
+
|
28
|
+
|
29
|
+
row += 1
|
30
|
+
|
31
|
+
self.logger.debug("Write NvM Block <%s>" % nvm_block.getName())
|
32
|
+
|
33
|
+
self.auto_width(sheet)
|
34
|
+
|
35
|
+
def write(self, filename, doc: EBModel, options):
|
36
|
+
self.logger.info("Writing <%s>" % filename)
|
37
|
+
|
38
|
+
self.write_nvm_block_descriptors(doc)
|
39
|
+
|
40
|
+
self.save(filename)
|