py-eb-model 1.0.0__py3-none-any.whl → 1.0.2__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/os_xdm_2_xls_cli.py +3 -2
- eb_model/cli/rte_xdm_2_xls_cli.py +68 -0
- eb_model/models/__init__.py +1 -0
- eb_model/models/abstract.py +29 -11
- eb_model/models/eb_doc.py +7 -9
- eb_model/models/os_xdm.py +846 -97
- eb_model/models/rte_xdm.py +556 -0
- eb_model/parser/__init__.py +1 -0
- eb_model/parser/eb_parser.py +63 -30
- eb_model/parser/eb_parser_factory.py +29 -0
- eb_model/parser/os_xdm_parser.py +138 -28
- eb_model/parser/rte_xdm_parser.py +63 -0
- eb_model/reporter/excel_reporter/abstract.py +11 -11
- eb_model/reporter/excel_reporter/os_xdm.py +84 -2
- eb_model/reporter/excel_reporter/rte_xdm.py +87 -0
- eb_model/tests/models/test_eb_model.py +5 -0
- py_eb_model-1.0.2.dist-info/METADATA +97 -0
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.0.2.dist-info}/RECORD +22 -17
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.0.2.dist-info}/entry_points.txt +1 -0
- py_eb_model-1.0.0.dist-info/METADATA +0 -16
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.0.2.dist-info}/LICENSE +0 -0
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.0.2.dist-info}/WHEEL +0 -0
- {py_eb_model-1.0.0.dist-info → py_eb_model-1.0.2.dist-info}/top_level.txt +0 -0
eb_model/parser/eb_parser.py
CHANGED
@@ -1,20 +1,25 @@
|
|
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
|
9
|
+
from ..models.abstract import EcucRefType
|
10
|
+
|
11
|
+
class AbstractEbModelParser(metaclass = ABCMeta):
|
9
12
|
|
10
13
|
def __init__(self) -> None:
|
11
|
-
self.
|
14
|
+
self.nsmap = {}
|
15
|
+
|
16
|
+
self.logger = logging.getLogger()
|
12
17
|
|
13
|
-
if type(self) == "
|
18
|
+
if type(self) == "AbstractEBModelParser":
|
14
19
|
raise ValueError("Abstract EBModelParser cannot be initialized.")
|
15
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)
|
19
24
|
|
20
25
|
def read_ref_raw_value(self, value):
|
@@ -27,10 +32,7 @@ class EBModelParser(metaclass = ABCMeta):
|
|
27
32
|
return match.group(1)
|
28
33
|
return value
|
29
34
|
|
30
|
-
def
|
31
|
-
tag = parent.find(".//d:var[@name='%s']" % name, self.ns)
|
32
|
-
if tag == None:
|
33
|
-
raise KeyError("XPath d:var[@name='%s'] is invalid" % name)
|
35
|
+
def _convert_value(self, tag):
|
34
36
|
if (tag.attrib['type'] == 'INTEGER'):
|
35
37
|
return int(tag.attrib['value'])
|
36
38
|
elif (tag.attrib['type'] == "FLOAT"):
|
@@ -43,50 +45,60 @@ class EBModelParser(metaclass = ABCMeta):
|
|
43
45
|
else:
|
44
46
|
return tag.attrib['value']
|
45
47
|
|
48
|
+
def read_value(self, parent: ET.Element, name: str) -> str:
|
49
|
+
tag = parent.find(".//d:var[@name='%s']" % name, self.nsmap)
|
50
|
+
if tag == None:
|
51
|
+
raise KeyError("XPath d:var[@name='%s'] is invalid" % name)
|
52
|
+
return self._convert_value(tag)
|
53
|
+
|
46
54
|
def read_optional_value(self, parent: ET.Element, name: str, default_value = None) -> str:
|
47
|
-
tag = parent.find(".//d:var[@name='%s']" % name, self.
|
55
|
+
tag = parent.find(".//d:var[@name='%s']" % name, self.nsmap)
|
48
56
|
if tag is None:
|
49
57
|
return default_value
|
50
58
|
if ('value' not in tag.attrib):
|
51
59
|
return default_value
|
52
|
-
|
60
|
+
enable = self.read_attrib(tag, 'ENABLE')
|
61
|
+
if (enable == 'false'):
|
62
|
+
return default_value
|
63
|
+
return self._convert_value(tag)
|
53
64
|
|
54
65
|
def find_choice_tag(self, parent: ET.Element, name: str) -> ET.Element:
|
55
|
-
return parent.find(".//d:chc[@name='%s']" % name, self.
|
66
|
+
return parent.find(".//d:chc[@name='%s']" % name, self.nsmap)
|
56
67
|
|
57
68
|
def read_choice_value(self, parent: ET.Element, name: str) -> str:
|
58
69
|
tag = self.find_choice_tag(parent, name)
|
59
70
|
return tag.attrib['value']
|
60
71
|
|
61
|
-
def read_ref_value(self, parent: ET.Element, name: str) ->
|
62
|
-
tag = parent.find(".//d:ref[@name='%s']" % name, self.
|
63
|
-
|
72
|
+
def read_ref_value(self, parent: ET.Element, name: str) -> EcucRefType:
|
73
|
+
tag = parent.find(".//d:ref[@name='%s']" % name, self.nsmap)
|
74
|
+
if tag is None:
|
75
|
+
raise KeyError("XPath d:ref[@name='%s'] is invalid" % name)
|
76
|
+
return EcucRefType(self.read_ref_raw_value(tag.attrib['value']))
|
64
77
|
|
65
|
-
def read_optional_ref_value(self, parent: ET.Element, name: str) ->
|
66
|
-
tag = parent.find(".//d:ref[@name='%s']" % name, self.
|
78
|
+
def read_optional_ref_value(self, parent: ET.Element, name: str) -> EcucRefType:
|
79
|
+
tag = parent.find(".//d:ref[@name='%s']" % name, self.nsmap)
|
67
80
|
enable = self.read_attrib(tag, 'ENABLE')
|
68
81
|
if (enable == 'false'):
|
69
|
-
return
|
70
|
-
return self.read_ref_raw_value(tag.attrib['value'])
|
82
|
+
return None
|
83
|
+
return EcucRefType(self.read_ref_raw_value(tag.attrib['value']))
|
71
84
|
|
72
|
-
def read_ref_value_list(self, parent: ET.Element, name: str) -> List[
|
85
|
+
def read_ref_value_list(self, parent: ET.Element, name: str) -> List[EcucRefType]:
|
73
86
|
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']))
|
87
|
+
for tag in parent.findall(".//d:lst[@name='%s']/d:ref" % name, self.nsmap):
|
88
|
+
ref_value_list.append(EcucRefType(self.read_ref_raw_value(tag.attrib['value'])))
|
77
89
|
return ref_value_list
|
78
90
|
|
79
91
|
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.
|
92
|
+
return parent.findall(".//d:lst[@name='%s']/d:ctr" % name, self.nsmap)
|
81
93
|
|
82
94
|
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.
|
95
|
+
return parent.findall(".//d:lst[@name='%s']/d:chc" % name, self.nsmap)
|
84
96
|
|
85
97
|
def find_ctr_tag(self, parent: ET.Element, name: str) -> ET.Element:
|
86
98
|
'''
|
87
99
|
Read the child ctr tag.
|
88
100
|
'''
|
89
|
-
tag = parent.find(".//d:ctr[@name='%s']" % name, self.
|
101
|
+
tag = parent.find(".//d:ctr[@name='%s']" % name, self.nsmap)
|
90
102
|
if tag is None:
|
91
103
|
return None
|
92
104
|
enable = self.read_attrib(tag, 'ENABLE')
|
@@ -133,15 +145,36 @@ class EBModelParser(metaclass = ABCMeta):
|
|
133
145
|
ref_tag.attrib['value'] = "ASPath:%s" % ref
|
134
146
|
lst_tag.append(ref_tag)
|
135
147
|
return lst_tag
|
148
|
+
|
149
|
+
def get_component_name(self, parent: ET.Element) -> str:
|
150
|
+
tag = parent.find(".//d:chc[@type='AR-ELEMENT'][@value='MODULE-CONFIGURATION']", self.nsmap)
|
151
|
+
return tag.attrib['name']
|
136
152
|
|
137
153
|
def find_lst_tag(self, parent: ET.Element, name: str) -> ET.Element:
|
138
|
-
return parent.find(".//d:lst[@name='%s']" % name, self.
|
154
|
+
return parent.find(".//d:lst[@name='%s']" % name, self.nsmap)
|
139
155
|
|
140
156
|
def read_attrib(self, parent: ET.Element, name: str) -> str:
|
141
|
-
attrib_tag = parent.find(".//a:a[@name='%s']" % name, self.
|
157
|
+
attrib_tag = parent.find(".//a:a[@name='%s']" % name, self.nsmap)
|
142
158
|
if attrib_tag is None:
|
143
159
|
return None
|
144
160
|
return attrib_tag.attrib['value']
|
145
161
|
|
146
|
-
def
|
147
|
-
self.
|
162
|
+
def read_namespaces(self, xdm: str):
|
163
|
+
self.nsmap = dict([node for _, node in ET.iterparse(xdm, events=['start-ns'])])
|
164
|
+
|
165
|
+
def parse(self, element: ET.Element, doc: EBModel):
|
166
|
+
pass
|
167
|
+
|
168
|
+
def load_xdm(self, filename: str) -> ET.Element:
|
169
|
+
self.logger.info("Loading <%s>" % filename)
|
170
|
+
|
171
|
+
self.read_namespaces(filename)
|
172
|
+
tree = ET.parse(filename)
|
173
|
+
self.root_tag = tree.getroot()
|
174
|
+
self.validate_root(self.root_tag)
|
175
|
+
|
176
|
+
return self.root_tag
|
177
|
+
|
178
|
+
def parse_xdm(self, filename: str, doc: EBModel):
|
179
|
+
root_tag = self.load_xdm(filename)
|
180
|
+
self.parse(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,153 @@
|
|
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, OsScheduleTableEventSetting, OsScheduleTableExpiryPoint, OsScheduleTableTaskActivation, OsScheduleTblAdjustableExpPoint
|
4
|
+
from ..models.os_xdm import OsTask, OsIsr, OsApplication
|
5
|
+
from .eb_parser import AbstractEbModelParser
|
9
6
|
|
10
|
-
class OsXdmParser(
|
7
|
+
class OsXdmParser(AbstractEbModelParser):
|
11
8
|
def __init__(self, ) -> None:
|
12
9
|
super().__init__()
|
13
10
|
|
14
|
-
def parse(self,
|
15
|
-
self.
|
16
|
-
|
17
|
-
|
18
|
-
|
11
|
+
def parse(self, element: ET.Element, doc: EBModel):
|
12
|
+
if self.get_component_name(element) != "Os":
|
13
|
+
raise ValueError("Invalid <%s> xdm file" % "Os")
|
14
|
+
|
15
|
+
os = doc.getOs()
|
19
16
|
|
20
|
-
self.read_os_tasks(
|
21
|
-
self.read_os_isrs(
|
17
|
+
self.read_os_tasks(element, os)
|
18
|
+
self.read_os_isrs(element, os)
|
19
|
+
self.read_os_alarms(element, os)
|
20
|
+
self.read_os_schedule_tables(element, os)
|
21
|
+
self.read_os_counters(element, os)
|
22
|
+
self.read_os_applications(element, os)
|
22
23
|
|
23
|
-
def read_os_tasks(self, os: Os):
|
24
|
-
for ctr_tag in self.find_ctr_tag_list(
|
25
|
-
os_task = OsTask()
|
26
|
-
os_task.
|
27
|
-
.setOsTaskPriority(self.read_value(ctr_tag, "OsTaskPriority")) \
|
24
|
+
def read_os_tasks(self, element: ET.Element, os: Os):
|
25
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsTask"):
|
26
|
+
os_task = OsTask(os, ctr_tag.attrib["name"])
|
27
|
+
os_task.setOsTaskPriority(int(self.read_value(ctr_tag, "OsTaskPriority"))) \
|
28
28
|
.setOsTaskActivation(self.read_value(ctr_tag, "OsTaskActivation")) \
|
29
29
|
.setOsTaskSchedule(self.read_value(ctr_tag, "OsTaskSchedule")) \
|
30
|
-
.setOsStacksize(self.read_optional_value(ctr_tag, "OsStacksize", 0))
|
30
|
+
.setOsStacksize(int(self.read_optional_value(ctr_tag, "OsStacksize", 0)))
|
31
|
+
|
32
|
+
for resource_ref in self.read_ref_value_list(ctr_tag, "OsTaskResourceRef"):
|
33
|
+
os_task.addOsTaskResourceRef(resource_ref)
|
34
|
+
|
35
|
+
self.logger.debug("Read OsTask <%s>" % os_task.getName())
|
31
36
|
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")) \
|
37
|
+
|
38
|
+
def read_os_isrs(self, element: ET.Element, os: Os):
|
39
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsIsr"):
|
40
|
+
os_isr = OsIsr(os, ctr_tag.attrib["name"])
|
41
|
+
os_isr.setOsIsrCategory(self.read_value(ctr_tag, "OsIsrCategory")) \
|
38
42
|
.setOsIsrPeriod(self.read_optional_value(ctr_tag, "OsIsrPeriod", 0.0)) \
|
39
|
-
.setOsStacksize(self.read_value(ctr_tag, "OsStacksize")) \
|
43
|
+
.setOsStacksize(int(self.read_value(ctr_tag, "OsStacksize"))) \
|
40
44
|
.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsIsrPriority"))
|
41
45
|
|
46
|
+
self.logger.debug("Read OsIsr <%s>" % os_isr.getName())
|
42
47
|
os.addOsIsr(os_isr)
|
43
|
-
|
48
|
+
|
49
|
+
def read_os_alarm_action(self, element: ET.Element, os_alarm: OsAlarm):
|
50
|
+
chc = self.read_choice_value(element, "OsAlarmAction")
|
51
|
+
if chc is None:
|
52
|
+
raise ValueError("OsAlarmAction is required.")
|
53
|
+
if chc == "OsAlarmActivateTask":
|
54
|
+
os_alarm_action = OsAlarmActivateTask(os_alarm, "OsAlarmActivateTask") \
|
55
|
+
.setOsAlarmActivateTaskRef(self.read_ref_value(element, "OsAlarmActivateTaskRef"))
|
56
|
+
elif chc == "OsAlarmIncrementCounter":
|
57
|
+
os_alarm_action = OsAlarmIncrementCounter(os_alarm, "OsAlarmIncrementCounter") \
|
58
|
+
.setOsAlarmIncrementCounterRef(self.read_ref_value(element, "OsAlarmIncrementCounterRef"))
|
59
|
+
elif chc == "OsAlarmSetEvent":
|
60
|
+
os_alarm_action = OsAlarmSetEvent(os_alarm, "OsAlarmSetEvent") \
|
61
|
+
.setOsAlarmSetEventRef(self.read_ref_value(element, "OsAlarmSetEventRef")) \
|
62
|
+
.setOsAlarmSetEventTaskRef(self.read_ref_value(element, "OsAlarmSetEventTaskRef"))
|
63
|
+
elif chc == "OsAlarmCallback":
|
64
|
+
os_alarm_action = OsAlarmCallback(os_alarm, "OsAlarmCallback") \
|
65
|
+
.setOsAlarmCallbackName(self.read_value(element, "OsAlarmCallbackName"))
|
66
|
+
else:
|
67
|
+
raise ValueError("Unsupported OsAlarmAction <%s>" % chc)
|
68
|
+
os_alarm.setOsAlarmAction(os_alarm_action)
|
69
|
+
|
70
|
+
def read_os_alarms(self, element: ET.Element, os: Os):
|
71
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsAlarm"):
|
72
|
+
os_alarm = OsAlarm(os, ctr_tag.attrib["name"]) \
|
73
|
+
.setOsAlarmCounterRef(self.read_ref_value(ctr_tag, "OsAlarmCounterRef"))
|
74
|
+
|
75
|
+
for ref in self.read_ref_value_list(ctr_tag, "OsAlarmAccessingApplication"):
|
76
|
+
os_alarm.addOsAlarmAccessingApplicationRef(ref)
|
77
|
+
|
78
|
+
self.read_os_alarm_action(ctr_tag, os_alarm)
|
79
|
+
|
80
|
+
self.logger.debug("Read OsAlarm <%s>" % os_alarm.getName())
|
81
|
+
os.addOsAlarm(os_alarm)
|
82
|
+
|
83
|
+
def read_os_schedule_table_event_settings(self, element: ET.Element, expiry_point: OsScheduleTableExpiryPoint):
|
84
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTableEventSetting"):
|
85
|
+
event_setting = OsScheduleTableEventSetting(expiry_point, ctr_tag.attrib["name"]) \
|
86
|
+
.setOsScheduleTableSetEventRef(self.read_ref_value(ctr_tag, "OsScheduleTableSetEventRef")) \
|
87
|
+
.setOsScheduleTableSetEventTaskRef(self.read_ref_value(ctr_tag, "OsScheduleTableSetEventTaskRef"))
|
88
|
+
|
89
|
+
expiry_point.addOsScheduleTableEventSetting(event_setting)
|
90
|
+
|
91
|
+
def read_os_schedule_table_task_activations(self, element: ET.Element, expiry_point: OsScheduleTableExpiryPoint):
|
92
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTableTaskActivation"):
|
93
|
+
activation = OsScheduleTableTaskActivation(expiry_point, ctr_tag.attrib["name"]) \
|
94
|
+
.setOsScheduleTableActivateTaskRef(self.read_ref_value(ctr_tag, "OsScheduleTableActivateTaskRef"))
|
95
|
+
|
96
|
+
expiry_point.addOsScheduleTableTaskActivation(activation)
|
97
|
+
|
98
|
+
def read_os_schedule_tbl_adjustable_exp_point(self, element: ET.Element, expiry_point: OsScheduleTableExpiryPoint):
|
99
|
+
ctr_tag = self.find_ctr_tag(element, "OsScheduleTblAdjustableExpPoint")
|
100
|
+
if ctr_tag is not None:
|
101
|
+
exp_point = OsScheduleTblAdjustableExpPoint(expiry_point, ctr_tag.attrib["name"]) \
|
102
|
+
.setOsScheduleTableMaxLengthen(self.read_ref_value(ctr_tag, "OsScheduleTableMaxLengthen")) \
|
103
|
+
.setOsScheduleTableMaxShorten(self.read_ref_value(ctr_tag, "OsScheduleTableMaxShorten"))
|
104
|
+
|
105
|
+
expiry_point.setOsScheduleTblAdjustableExpPoint(exp_point)
|
106
|
+
|
107
|
+
def read_os_schedule_table_expiry_points(self, element: ET.Element, os_schedule_table: OsScheduleTable):
|
108
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTableExpiryPoint"):
|
109
|
+
expiry_point = OsScheduleTableExpiryPoint(os_schedule_table, ctr_tag.attrib["name"]) \
|
110
|
+
.setOsScheduleTblExpPointOffset(self.read_value(ctr_tag, "OsScheduleTblExpPointOffset")) \
|
111
|
+
|
112
|
+
self.read_os_schedule_table_event_settings(ctr_tag, expiry_point)
|
113
|
+
self.read_os_schedule_table_task_activations(ctr_tag, expiry_point)
|
114
|
+
self.read_os_schedule_tbl_adjustable_exp_point(ctr_tag, expiry_point)
|
115
|
+
|
116
|
+
os_schedule_table.addOsScheduleTableExpiryPoint(expiry_point)
|
117
|
+
|
118
|
+
def read_os_schedule_tables(self, element: ET.Element, os: Os):
|
119
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTable"):
|
120
|
+
table = OsScheduleTable(os, ctr_tag.attrib["name"]) \
|
121
|
+
.setOsScheduleTableDuration(self.read_value(ctr_tag, "OsScheduleTableDuration")) \
|
122
|
+
.setOsScheduleTableRepeating(self.read_value(ctr_tag, "OsScheduleTableRepeating")) \
|
123
|
+
.setOsScheduleTableCounterRef(self.read_ref_value(ctr_tag, "OsScheduleTableCounterRef")) \
|
124
|
+
.setOsTimeUnit(self.read_optional_value(ctr_tag, "OsTimeUnit"))
|
125
|
+
|
126
|
+
self.read_os_schedule_table_expiry_points(ctr_tag, table)
|
127
|
+
|
128
|
+
self.logger.debug("Read OsScheduleTable <%s>" % table.getName())
|
129
|
+
os.addOsScheduleTable(table)
|
130
|
+
|
131
|
+
def read_os_counters(self, element: ET.Element, os: Os):
|
132
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsCounter"):
|
133
|
+
counter = OsCounter(os, ctr_tag.attrib["name"]) \
|
134
|
+
.setOsCounterMaxAllowedValue(self.read_value(ctr_tag, "OsCounterMaxAllowedValue")) \
|
135
|
+
.setOsCounterMinCycle(self.read_value(ctr_tag, "OsCounterMinCycle")) \
|
136
|
+
.setOsCounterTicksPerBase(self.read_value(ctr_tag, "OsCounterTicksPerBase")) \
|
137
|
+
.setOsCounterType(self.read_optional_value(ctr_tag, "OsCounterType")) \
|
138
|
+
.setOsSecondsPerTick(self.read_optional_value(ctr_tag, "OsSecondsPerTick")) \
|
139
|
+
|
140
|
+
|
141
|
+
self.logger.debug("Read OsCounter <%s>" % counter.getName())
|
142
|
+
os.addOsScheduleTable(counter)
|
143
|
+
|
144
|
+
def read_os_applications(self, element: ET.Element, os: Os):
|
145
|
+
for ctr_tag in self.find_ctr_tag_list(element, "OsApplication"):
|
146
|
+
os_app = OsApplication(os, ctr_tag.attrib["name"]) \
|
147
|
+
.setOsTrusted(self.read_value(ctr_tag, "OsTrusted"))
|
148
|
+
|
149
|
+
for ref in self.read_ref_value_list(ctr_tag, "OsAppResourceRef"):
|
150
|
+
os_app.addOsAppResourceRef(ref)
|
151
|
+
|
152
|
+
self.logger.debug("Read OsApplication <%s>" % os_app.getName())
|
153
|
+
os.addOsApplication(os_app)
|
@@ -0,0 +1,63 @@
|
|
1
|
+
import xml.etree.ElementTree as ET
|
2
|
+
|
3
|
+
from ..models.rte_xdm import Rte, RteBswEventToTaskMapping, RteBswModuleInstance, RteEventToTaskMapping, RteSwComponentInstance
|
4
|
+
from ..models.eb_doc import EBModel
|
5
|
+
from .eb_parser import AbstractEbModelParser
|
6
|
+
|
7
|
+
class RteXdmParser(AbstractEbModelParser):
|
8
|
+
def __init__(self, ) -> None:
|
9
|
+
super().__init__()
|
10
|
+
|
11
|
+
def parse(self, element: ET.Element, doc: EBModel):
|
12
|
+
if self.get_component_name(element) != "Rte":
|
13
|
+
raise ValueError("Invalid <%s> xdm file" % "Rte")
|
14
|
+
|
15
|
+
self.read_rte_bsw_module_instances(element, doc.getRte())
|
16
|
+
self.read_rte_sw_component_instances(element, doc.getRte())
|
17
|
+
|
18
|
+
def read_rte_bsw_module_instance_event_to_task_mappings(self, element: ET.Element, instance: RteBswModuleInstance):
|
19
|
+
for ctr_tag in self.find_ctr_tag_list(element, "RteBswEventToTaskMapping"):
|
20
|
+
mapping = RteBswEventToTaskMapping(instance, ctr_tag.attrib['name'])
|
21
|
+
mapping.setRteBswActivationOffset(self.read_optional_value(ctr_tag, "RteBswActivationOffset")) \
|
22
|
+
.setRteBswEventPeriod(self.read_optional_value(ctr_tag, "RteBswPeriod")) \
|
23
|
+
.setRteBswPositionInTask(self.read_optional_value(ctr_tag, "RteBswPositionInTask")) \
|
24
|
+
.setRteBswServerQueueLength(self.read_optional_value(ctr_tag, "RteBswServerQueueLength")) \
|
25
|
+
.setRteBswEventRef(self.read_ref_value(ctr_tag, "RteBswEventRef")) \
|
26
|
+
.setRteBswMappedToTaskRef(self.read_optional_ref_value(ctr_tag, "RteBswMappedToTaskRef"))
|
27
|
+
instance.addRteBswEventToTaskMapping(mapping)
|
28
|
+
|
29
|
+
def read_rte_bsw_module_instances(self, element: ET.Element, rte: Rte):
|
30
|
+
for ctr_tag in self.find_ctr_tag_list(element, 'RteBswModuleInstance'):
|
31
|
+
instance = RteBswModuleInstance(rte, ctr_tag.attrib['name'])
|
32
|
+
instance.setRteBswImplementationRef(self.read_ref_value(ctr_tag, "RteBswImplementationRef")) \
|
33
|
+
.setRteMappedToOsApplicationRef(self.read_optional_ref_value(ctr_tag, "RteMappedToOsApplicationRef"))
|
34
|
+
|
35
|
+
self.read_rte_bsw_module_instance_event_to_task_mappings(ctr_tag, instance)
|
36
|
+
|
37
|
+
self.logger.debug("Add the RteBswModuleInstance <%s>" % instance.getName())
|
38
|
+
|
39
|
+
rte.addRteBswModuleInstance(instance)
|
40
|
+
|
41
|
+
def read_rte_sw_component_instance_event_to_task_mappings(self, element: ET.Element, instance: RteSwComponentInstance):
|
42
|
+
for ctr_tag in self.find_ctr_tag_list(element, "RteEventToTaskMapping"):
|
43
|
+
mapping = RteEventToTaskMapping(instance, ctr_tag.attrib['name'])
|
44
|
+
mapping.setRteActivationOffset(self.read_optional_value(ctr_tag, "RteActivationOffset")) \
|
45
|
+
.setRtePeriod(self.read_optional_value(ctr_tag, "RtePeriod")) \
|
46
|
+
.setRtePositionInTask(self.read_optional_value(ctr_tag, "RtePositionInTask")) \
|
47
|
+
.setRteServerQueueLength(self.read_optional_value(ctr_tag, "RteServerQueueLength")) \
|
48
|
+
.setRteEventRef(self.read_ref_value(ctr_tag, "RteEventRef")) \
|
49
|
+
.setRteMappedToTaskRef(self.read_optional_ref_value(ctr_tag, "RteMappedToTaskRef"))
|
50
|
+
|
51
|
+
instance.addRteEventToTaskMapping(mapping)
|
52
|
+
|
53
|
+
def read_rte_sw_component_instances(self, element: ET.Element, rte: Rte):
|
54
|
+
for ctr_tag in self.find_ctr_tag_list(element, 'RteSwComponentInstance'):
|
55
|
+
instance = RteSwComponentInstance(rte, ctr_tag.attrib['name'])
|
56
|
+
instance.setMappedToOsApplicationRef(self.read_optional_ref_value(ctr_tag, "MappedToOsApplicationRef")) \
|
57
|
+
.setRteSoftwareComponentInstanceRef(self.read_optional_ref_value(ctr_tag, "RteSoftwareComponentInstanceRef"))
|
58
|
+
|
59
|
+
self.read_rte_sw_component_instance_event_to_task_mappings(ctr_tag, instance)
|
60
|
+
|
61
|
+
self.logger.debug("Add the RteSwComponentInstance <%s>" % instance.getName())
|
62
|
+
|
63
|
+
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)
|
@@ -1,5 +1,9 @@
|
|
1
|
+
from typing import List
|
2
|
+
|
3
|
+
from ...models.os_xdm import OsScheduleTableExpiryPoint
|
1
4
|
from ...models.eb_doc import EBModel
|
2
5
|
from .abstract import ExcelReporter
|
6
|
+
from openpyxl.styles import Alignment
|
3
7
|
|
4
8
|
class OsXdmXlsWriter(ExcelReporter):
|
5
9
|
def __init__(self) -> None:
|
@@ -8,7 +12,7 @@ class OsXdmXlsWriter(ExcelReporter):
|
|
8
12
|
def write_os_tasks(self, doc: EBModel):
|
9
13
|
sheet = self.wb.create_sheet("OsTask", 0)
|
10
14
|
|
11
|
-
title_row = ["Name", "OsTaskActivation", "OsTaskPriority", "OsTaskSchedule", "OsStacksize"]
|
15
|
+
title_row = ["Name", "OsTaskActivation", "OsTaskPriority", "OsTaskSchedule", "OsStacksize", "OsResourceRef"]
|
12
16
|
self.write_title_row(sheet, title_row)
|
13
17
|
|
14
18
|
row = 2
|
@@ -18,12 +22,24 @@ class OsXdmXlsWriter(ExcelReporter):
|
|
18
22
|
self.write_cell(sheet, row, 3, os_task.getOsTaskPriority())
|
19
23
|
self.write_cell(sheet, row, 4, os_task.getOsTaskSchedule())
|
20
24
|
self.write_cell(sheet, row, 5, os_task.getOsStacksize())
|
25
|
+
resources = []
|
26
|
+
for resource_ref in os_task.getOsTaskResourceRefList():
|
27
|
+
resources.append(resource_ref.getValue())
|
28
|
+
total_resources = len(resources)
|
29
|
+
if total_resources > 10:
|
30
|
+
cell = self.write_cell(sheet, row, 6, "Total: %d OsResources" % (total_resources))
|
31
|
+
else:
|
32
|
+
cell = self.write_cell(sheet, row, 6, "\n".join(resources))
|
33
|
+
if total_resources > 1 and total_resources < 10:
|
34
|
+
cell.alignment = Alignment(wrapText = True)
|
21
35
|
row += 1
|
22
36
|
|
37
|
+
self.logger.debug("Write OsTask <%s>" % os_task.getName())
|
38
|
+
|
23
39
|
self.auto_width(sheet)
|
24
40
|
|
25
41
|
def write_os_isrs(self, doc: EBModel):
|
26
|
-
sheet = self.wb.create_sheet("OsIsr",
|
42
|
+
sheet = self.wb.create_sheet("OsIsr", 1)
|
27
43
|
|
28
44
|
title_row = ["Name", "OsIsrCategory", "OsStacksize"]
|
29
45
|
self.write_title_row(sheet, title_row)
|
@@ -35,10 +51,76 @@ class OsXdmXlsWriter(ExcelReporter):
|
|
35
51
|
self.write_cell(sheet, row, 3, os_isr.getOsStacksize())
|
36
52
|
row += 1
|
37
53
|
|
54
|
+
self.logger.debug("Write OsIsr <%s>" % os_isr.getName())
|
55
|
+
|
56
|
+
self.auto_width(sheet)
|
57
|
+
|
58
|
+
def write_os_schedule_tables(self, doc: EBModel):
|
59
|
+
sheet = self.wb.create_sheet("OsScheduleTable", 2)
|
60
|
+
|
61
|
+
title_row = ["Name", "Duration", "Repeating", "OsCount"]
|
62
|
+
self.write_title_row(sheet, title_row)
|
63
|
+
|
64
|
+
row = 2
|
65
|
+
for os_schedule_table in doc.getOs().getOsScheduleTableList():
|
66
|
+
self.write_cell(sheet, row, 1, os_schedule_table.getName())
|
67
|
+
self.write_cell(sheet, row, 2, os_schedule_table.getOsScheduleTableDuration())
|
68
|
+
self.write_cell(sheet, row, 3, os_schedule_table.getOsScheduleTableRepeating())
|
69
|
+
self.write_cell(sheet, row, 4, os_schedule_table.getOsScheduleTableCounterRef().getShortName())
|
70
|
+
row += 1
|
71
|
+
|
72
|
+
self.logger.debug("Write OsScheduleTable <%s>" % os_schedule_table.getName())
|
73
|
+
|
74
|
+
self.auto_width(sheet)
|
75
|
+
|
76
|
+
def write_os_counters(self, doc: EBModel):
|
77
|
+
sheet = self.wb.create_sheet("OsCounter", 3)
|
78
|
+
|
79
|
+
title_row = ["Name", "MaxAllowedValue", "MinCycle", "TicksPerBase", "Type", "SecondsPerTick"]
|
80
|
+
self.write_title_row(sheet, title_row)
|
81
|
+
|
82
|
+
row = 2
|
83
|
+
for os_counter in doc.getOs().getOsCounterList():
|
84
|
+
self.write_cell(sheet, row, 1, os_counter.getName())
|
85
|
+
self.write_cell(sheet, row, 2, os_counter.getOsCounterMaxAllowedValue())
|
86
|
+
self.write_cell(sheet, row, 3, os_counter.getOsCounterMinCycle())
|
87
|
+
self.write_cell(sheet, row, 4, os_counter.getOsCounterTicksPerBase())
|
88
|
+
self.write_cell(sheet, row, 5, os_counter.getOsCounterType())
|
89
|
+
self.write_cell(sheet, row, 6, os_counter.getOsSecondsPerTick())
|
90
|
+
row += 1
|
91
|
+
|
92
|
+
self.logger.debug("Write OsScheduleTable <%s>" % os_counter.getName())
|
93
|
+
|
94
|
+
self.auto_width(sheet)
|
95
|
+
|
96
|
+
def write_expiry_points(self, doc: EBModel):
|
97
|
+
sheet = self.wb.create_sheet("OsScheduleTableExpiryPoint", 4)
|
98
|
+
|
99
|
+
title_row = ["ExpiryPoint", "OsScheduleTable", "OsCounter" "Offset (ms)", "Task"]
|
100
|
+
self.write_title_row(sheet, title_row)
|
101
|
+
|
102
|
+
row = 2
|
103
|
+
for table in doc.getOs().getOsScheduleTableList():
|
104
|
+
expiry_point_list = sorted(table.getOsScheduleTableExpiryPointList(), key = lambda o: o.getOsScheduleTblExpPointOffset()) # type: List[OsScheduleTableExpiryPoint]
|
105
|
+
for expiry_point in expiry_point_list:
|
106
|
+
self.write_cell(sheet, row, 1, expiry_point.getName())
|
107
|
+
self.write_cell(sheet, row, 2, table.getName())
|
108
|
+
self.write_cell(sheet, row, 3, table.getOsScheduleTableCounterRef().getShortName())
|
109
|
+
self.write_cell(sheet, row, 4, expiry_point.getOsScheduleTblExpPointOffset())
|
110
|
+
self.write_cell(sheet, row, 5, len(expiry_point.getOsScheduleTableTaskActivationList()))
|
111
|
+
row += 1
|
112
|
+
|
113
|
+
self.logger.debug("Write OsScheduleTable <%s>" % table.getName())
|
114
|
+
|
38
115
|
self.auto_width(sheet)
|
39
116
|
|
40
117
|
def write(self, filename, doc: EBModel):
|
118
|
+
self.logger.info("Writing <%s>" % filename)
|
119
|
+
|
41
120
|
self.write_os_tasks(doc)
|
42
121
|
self.write_os_isrs(doc)
|
122
|
+
self.write_os_schedule_tables(doc)
|
123
|
+
self.write_os_counters(doc)
|
124
|
+
self.write_expiry_points(doc)
|
43
125
|
|
44
126
|
self.save(filename)
|