py-eb-model 1.0.0__py3-none-any.whl → 1.1.4__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.
Files changed (48) hide show
  1. eb_model/__init__.py +2 -1
  2. eb_model/cli/os_xdm_2_xls_cli.py +21 -12
  3. eb_model/cli/pref_system_importer_cli.py +94 -0
  4. py_eb_model/cli/os_xdm_2_xls_cli.py → eb_model/cli/rte_xdm_2_xls_cli.py +18 -9
  5. eb_model/models/__init__.py +2 -0
  6. eb_model/models/abstract.py +86 -13
  7. eb_model/models/eb_doc.py +55 -27
  8. eb_model/models/eclipse_project.py +8 -0
  9. eb_model/models/importer_xdm.py +115 -0
  10. eb_model/models/os_xdm.py +898 -99
  11. eb_model/models/rte_xdm.py +604 -0
  12. eb_model/parser/__init__.py +3 -0
  13. eb_model/parser/eb_parser.py +92 -39
  14. eb_model/parser/eb_parser_factory.py +29 -0
  15. eb_model/parser/os_xdm_parser.py +171 -28
  16. eb_model/parser/pref_xdm_parser.py +36 -0
  17. eb_model/parser/rte_xdm_parser.py +95 -0
  18. eb_model/reporter/excel_reporter/abstract.py +11 -11
  19. eb_model/reporter/excel_reporter/os_xdm.py +109 -12
  20. eb_model/reporter/excel_reporter/rte_xdm.py +87 -0
  21. eb_model/tests/models/test_eb_model.py +19 -1
  22. eb_model/tests/models/test_importer_xdm.py +61 -0
  23. eb_model/writer/__init__.py +2 -0
  24. eb_model/writer/project_writer.py +71 -0
  25. eb_model/writer/text_writer.py +28 -0
  26. py_eb_model-1.1.4.dist-info/METADATA +200 -0
  27. py_eb_model-1.1.4.dist-info/RECORD +38 -0
  28. py_eb_model-1.1.4.dist-info/entry_points.txt +5 -0
  29. py_eb_model/__init__.py +0 -3
  30. py_eb_model/cli/__init__.py +0 -0
  31. py_eb_model/models/__init__.py +0 -3
  32. py_eb_model/models/abstract.py +0 -66
  33. py_eb_model/models/eb_doc.py +0 -52
  34. py_eb_model/models/os_xdm.py +0 -220
  35. py_eb_model/parser/__init__.py +0 -1
  36. py_eb_model/parser/eb_parser.py +0 -147
  37. py_eb_model/parser/os_xdm_parser.py +0 -43
  38. py_eb_model/reporter/__init__.py +0 -1
  39. py_eb_model/reporter/excel_reporter/__init__.py +0 -0
  40. py_eb_model/reporter/excel_reporter/abstract.py +0 -43
  41. py_eb_model/reporter/excel_reporter/os_xdm.py +0 -44
  42. py_eb_model/reporter/markdown.py +0 -40
  43. py_eb_model-1.0.0.dist-info/METADATA +0 -16
  44. py_eb_model-1.0.0.dist-info/RECORD +0 -40
  45. py_eb_model-1.0.0.dist-info/entry_points.txt +0 -3
  46. {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.4.dist-info}/LICENSE +0 -0
  47. {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.4.dist-info}/WHEEL +0 -0
  48. {py_eb_model-1.0.0.dist-info → py_eb_model-1.1.4.dist-info}/top_level.txt +0 -0
@@ -1,21 +1,39 @@
1
- #from xml.etree import cElementTree as ET
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
- class EBModelParser(metaclass = ABCMeta):
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.ns = {}
14
+ self.nsmap = {}
12
15
 
13
- if type(self) == "EBModelParser":
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.ns[''], "datamodel")):
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.ns)
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
- if (tag.attrib['type'] == 'INTEGER'):
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.ns)
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
- return tag.attrib['value']
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.ns)
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) -> str:
62
- tag = parent.find(".//d:ref[@name='%s']" % name, self.ns)
63
- return self.read_ref_raw_value(tag.attrib['value'])
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) -> str:
66
- tag = parent.find(".//d:ref[@name='%s']" % name, self.ns)
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[str]:
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.ns):
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.ns)
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.ns)
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.ns)
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.ns)
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.ns)
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 _read_namespaces(self, xdm: str):
147
- self.ns = dict([node for _, node in ET.iterparse(xdm, events=['start-ns'])])
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)
@@ -1,43 +1,186 @@
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, OsApplication, OsCounter, OsResource, OsTask, OsIsr
8
- from .eb_parser import EBModelParser
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(EBModelParser):
9
+ class OsXdmParser(AbstractEbModelParser):
11
10
  def __init__(self, ) -> None:
12
11
  super().__init__()
13
12
 
14
- def parse(self, filename: str, doc: EBModel):
15
- self._read_namespaces(filename)
16
- tree = ET.parse(filename)
17
- self.root_tag = tree.getroot()
18
- self.validate_root(self.root_tag)
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.read_os_tasks(doc.getOs())
21
- self.read_os_isrs(doc.getOs())
23
+ self.logger.info("Parse Rte ARVersion:<%s> SwVersion:<%s>" % (os.getArVersion().getVersion(), os.getSwVersion().getVersion()))
22
24
 
23
- def read_os_tasks(self, os: Os):
24
- for ctr_tag in self.find_ctr_tag_list(self.root_tag, 'OsTask'):
25
- os_task = OsTask()
26
- os_task.setName(ctr_tag.attrib['name']) \
27
- .setOsTaskPriority(self.read_value(ctr_tag, "OsTaskPriority")) \
25
+ self.os = os
26
+
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(autostart)
41
+
42
+ def read_os_tasks(self, element: ET.Element, os: Os):
43
+ for ctr_tag in self.find_ctr_tag_list(element, "OsTask"):
44
+ os_task = OsTask(os, ctr_tag.attrib["name"])
45
+ os_task.setOsTaskPriority(int(self.read_value(ctr_tag, "OsTaskPriority"))) \
28
46
  .setOsTaskActivation(self.read_value(ctr_tag, "OsTaskActivation")) \
29
47
  .setOsTaskSchedule(self.read_value(ctr_tag, "OsTaskSchedule")) \
30
- .setOsStacksize(self.read_optional_value(ctr_tag, "OsStacksize", 0))
48
+ .setOsTaskType(self.read_optional_value(ctr_tag, "OsTaskType")) \
49
+ .setOsStacksize(int(self.read_optional_value(ctr_tag, "OsStacksize", 0)))
50
+
51
+ for resource_ref in self.read_ref_value_list(ctr_tag, "OsTaskResourceRef"):
52
+ os_task.addOsTaskResourceRef(resource_ref)
53
+
54
+ self.read_os_task_autostart(ctr_tag, os_task)
55
+
56
+ self.logger.debug("Read OsTask <%s>" % os_task.getName())
31
57
  os.addOsTask(os_task)
32
-
33
- def read_os_isrs(self, os: Os):
34
- for ctr_tag in self.find_ctr_tag_list(self.root_tag, 'OsIsr'):
35
- os_isr = OsIsr()
36
- os_isr.setName(ctr_tag.attrib['name']) \
37
- .setOsIsrCategory(self.read_value(ctr_tag, "OsIsrCategory")) \
58
+
59
+ def read_os_isrs(self, element: ET.Element, os: Os):
60
+ for ctr_tag in self.find_ctr_tag_list(element, "OsIsr"):
61
+ os_isr = OsIsr(os, ctr_tag.attrib["name"])
62
+ os_isr.setOsIsrCategory(self.read_value(ctr_tag, "OsIsrCategory")) \
38
63
  .setOsIsrPeriod(self.read_optional_value(ctr_tag, "OsIsrPeriod", 0.0)) \
39
- .setOsStacksize(self.read_value(ctr_tag, "OsStacksize")) \
64
+ .setOsStacksize(int(self.read_value(ctr_tag, "OsStacksize"))) \
40
65
  .setOsIsrPriority(self.read_optional_value(ctr_tag, "OsIsrPriority"))
66
+
67
+ # patch for the infineon Aurix
68
+ os_isr.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsTricoreIrqLevel"))
69
+ # patch for the ARM
70
+ os_isr.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsARMIrqLevel"))
71
+ os_isr.setOsIsrVector(self.read_optional_value(ctr_tag, "OsARMVector"))
41
72
 
73
+ self.logger.debug("Read OsIsr <%s>" % os_isr.getName())
42
74
  os.addOsIsr(os_isr)
43
-
75
+
76
+ def read_os_alarm_action(self, element: ET.Element, os_alarm: OsAlarm):
77
+ chc = self.read_choice_value(element, "OsAlarmAction")
78
+ if chc is None:
79
+ raise ValueError("OsAlarmAction is required.")
80
+ if chc == "OsAlarmActivateTask":
81
+ os_alarm_action = OsAlarmActivateTask(os_alarm, "OsAlarmActivateTask") \
82
+ .setOsAlarmActivateTaskRef(self.read_ref_value(element, "OsAlarmActivateTaskRef"))
83
+ elif chc == "OsAlarmIncrementCounter":
84
+ os_alarm_action = OsAlarmIncrementCounter(os_alarm, "OsAlarmIncrementCounter") \
85
+ .setOsAlarmIncrementCounterRef(self.read_ref_value(element, "OsAlarmIncrementCounterRef"))
86
+ elif chc == "OsAlarmSetEvent":
87
+ os_alarm_action = OsAlarmSetEvent(os_alarm, "OsAlarmSetEvent") \
88
+ .setOsAlarmSetEventRef(self.read_ref_value(element, "OsAlarmSetEventRef")) \
89
+ .setOsAlarmSetEventTaskRef(self.read_ref_value(element, "OsAlarmSetEventTaskRef"))
90
+ elif chc == "OsAlarmCallback":
91
+ os_alarm_action = OsAlarmCallback(os_alarm, "OsAlarmCallback") \
92
+ .setOsAlarmCallbackName(self.read_value(element, "OsAlarmCallbackName"))
93
+ else:
94
+ raise ValueError("Unsupported OsAlarmAction <%s>" % chc)
95
+ os_alarm.setOsAlarmAction(os_alarm_action)
96
+
97
+ def read_os_alarms(self, element: ET.Element, os: Os):
98
+ for ctr_tag in self.find_ctr_tag_list(element, "OsAlarm"):
99
+ os_alarm = OsAlarm(os, ctr_tag.attrib["name"]) \
100
+ .setOsAlarmCounterRef(self.read_ref_value(ctr_tag, "OsAlarmCounterRef"))
101
+
102
+ for ref in self.read_ref_value_list(ctr_tag, "OsAlarmAccessingApplication"):
103
+ os_alarm.addOsAlarmAccessingApplicationRef(ref)
104
+
105
+ self.read_os_alarm_action(ctr_tag, os_alarm)
106
+
107
+ self.logger.debug("Read OsAlarm <%s>" % os_alarm.getName())
108
+ os.addOsAlarm(os_alarm)
109
+
110
+ def read_os_schedule_table_event_settings(self, element: ET.Element, expiry_point: OsScheduleTableExpiryPoint):
111
+ for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTableEventSetting"):
112
+ event_setting = OsScheduleTableEventSetting(expiry_point, ctr_tag.attrib["name"]) \
113
+ .setOsScheduleTableSetEventRef(self.read_ref_value(ctr_tag, "OsScheduleTableSetEventRef")) \
114
+ .setOsScheduleTableSetEventTaskRef(self.read_ref_value(ctr_tag, "OsScheduleTableSetEventTaskRef"))
115
+
116
+ expiry_point.addOsScheduleTableEventSetting(event_setting)
117
+
118
+ def read_os_schedule_table_task_activations(self, element: ET.Element, expiry_point: OsScheduleTableExpiryPoint):
119
+ for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTableTaskActivation"):
120
+ activation = OsScheduleTableTaskActivation(expiry_point, ctr_tag.attrib["name"]) \
121
+ .setOsScheduleTableActivateTaskRef(self.read_ref_value(ctr_tag, "OsScheduleTableActivateTaskRef"))
122
+
123
+ expiry_point.addOsScheduleTableTaskActivation(activation)
124
+
125
+ def read_os_schedule_tbl_adjustable_exp_point(self, element: ET.Element, expiry_point: OsScheduleTableExpiryPoint):
126
+ ctr_tag = self.find_ctr_tag(element, "OsScheduleTblAdjustableExpPoint")
127
+ if ctr_tag is not None:
128
+ exp_point = OsScheduleTblAdjustableExpPoint(expiry_point, ctr_tag.attrib["name"]) \
129
+ .setOsScheduleTableMaxLengthen(self.read_ref_value(ctr_tag, "OsScheduleTableMaxLengthen")) \
130
+ .setOsScheduleTableMaxShorten(self.read_ref_value(ctr_tag, "OsScheduleTableMaxShorten"))
131
+
132
+ expiry_point.setOsScheduleTblAdjustableExpPoint(exp_point)
133
+
134
+ def read_os_schedule_table_expiry_points(self, element: ET.Element, os_schedule_table: OsScheduleTable):
135
+ for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTableExpiryPoint"):
136
+ expiry_point = OsScheduleTableExpiryPoint(os_schedule_table, ctr_tag.attrib["name"]) \
137
+ .setOsScheduleTblExpPointOffset(self.read_value(ctr_tag, "OsScheduleTblExpPointOffset")) \
138
+
139
+ self.read_os_schedule_table_event_settings(ctr_tag, expiry_point)
140
+ self.read_os_schedule_table_task_activations(ctr_tag, expiry_point)
141
+ self.read_os_schedule_tbl_adjustable_exp_point(ctr_tag, expiry_point)
142
+
143
+ os_schedule_table.addOsScheduleTableExpiryPoint(expiry_point)
144
+
145
+ def read_os_schedule_tables(self, element: ET.Element, os: Os):
146
+ for ctr_tag in self.find_ctr_tag_list(element, "OsScheduleTable"):
147
+ table = OsScheduleTable(os, ctr_tag.attrib["name"]) \
148
+ .setOsScheduleTableDuration(self.read_value(ctr_tag, "OsScheduleTableDuration")) \
149
+ .setOsScheduleTableRepeating(self.read_value(ctr_tag, "OsScheduleTableRepeating")) \
150
+ .setOsScheduleTableCounterRef(self.read_ref_value(ctr_tag, "OsScheduleTableCounterRef")) \
151
+ .setOsTimeUnit(self.read_optional_value(ctr_tag, "OsTimeUnit"))
152
+
153
+ self.read_os_schedule_table_expiry_points(ctr_tag, table)
154
+
155
+ self.logger.debug("Read OsScheduleTable <%s>" % table.getName())
156
+ os.addOsScheduleTable(table)
157
+
158
+ def read_os_counters(self, element: ET.Element, os: Os):
159
+ for ctr_tag in self.find_ctr_tag_list(element, "OsCounter"):
160
+ counter = OsCounter(os, ctr_tag.attrib["name"]) \
161
+ .setOsCounterMaxAllowedValue(self.read_value(ctr_tag, "OsCounterMaxAllowedValue")) \
162
+ .setOsCounterMinCycle(self.read_value(ctr_tag, "OsCounterMinCycle")) \
163
+ .setOsCounterTicksPerBase(self.read_value(ctr_tag, "OsCounterTicksPerBase")) \
164
+ .setOsCounterType(self.read_optional_value(ctr_tag, "OsCounterType")) \
165
+ .setOsSecondsPerTick(self.read_optional_value(ctr_tag, "OsSecondsPerTick")) \
166
+
167
+
168
+ self.logger.debug("Read OsCounter <%s>" % counter.getName())
169
+ os.addOsScheduleTable(counter)
170
+
171
+ def read_os_applications(self, element: ET.Element, os: Os):
172
+ for ctr_tag in self.find_ctr_tag_list(element, "OsApplication"):
173
+ os_app = OsApplication(os, ctr_tag.attrib["name"]) \
174
+ .setOsTrusted(self.read_value(ctr_tag, "OsTrusted"))
175
+
176
+ for ref in self.read_ref_value_list(ctr_tag, "OsAppResourceRef"):
177
+ os_app.addOsAppResourceRef(ref)
178
+
179
+ for ref in self.read_ref_value_list(ctr_tag, "OsAppTaskRef"):
180
+ os_app.addOsAppTaskRef(ref)
181
+
182
+ for ref in self.read_ref_value_list(ctr_tag, "OsAppIsrRef"):
183
+ os_app.addOsAppIsrRef(ref)
184
+
185
+ self.logger.debug("Read OsApplication <%s>" % os_app.getName())
186
+ 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._logger = logging.getLogger()
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)