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.
@@ -1,20 +1,25 @@
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
9
+ from ..models.abstract import EcucRefType
10
+
11
+ class AbstractEbModelParser(metaclass = ABCMeta):
9
12
 
10
13
  def __init__(self) -> None:
11
- self.ns = {}
14
+ self.nsmap = {}
15
+
16
+ self.logger = logging.getLogger()
12
17
 
13
- if type(self) == "EBModelParser":
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.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)
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 read_value(self, parent: ET.Element, name: str) -> str:
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.ns)
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
- return tag.attrib['value']
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.ns)
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) -> str:
62
- tag = parent.find(".//d:ref[@name='%s']" % name, self.ns)
63
- return self.read_ref_raw_value(tag.attrib['value'])
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) -> str:
66
- tag = parent.find(".//d:ref[@name='%s']" % name, self.ns)
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[str]:
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.ns):
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.ns)
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.ns)
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.ns)
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.ns)
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.ns)
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 _read_namespaces(self, xdm: str):
147
- self.ns = dict([node for _, node in ET.iterparse(xdm, events=['start-ns'])])
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)
@@ -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, 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, OsScheduleTableEventSetting, OsScheduleTableExpiryPoint, OsScheduleTableTaskActivation, OsScheduleTblAdjustableExpPoint
4
+ from ..models.os_xdm import OsTask, OsIsr, OsApplication
5
+ from .eb_parser import AbstractEbModelParser
9
6
 
10
- class OsXdmParser(EBModelParser):
7
+ class OsXdmParser(AbstractEbModelParser):
11
8
  def __init__(self, ) -> None:
12
9
  super().__init__()
13
10
 
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)
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(doc.getOs())
21
- self.read_os_isrs(doc.getOs())
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(self.root_tag, 'OsTask'):
25
- os_task = OsTask()
26
- os_task.setName(ctr_tag.attrib['name']) \
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(self.root_tag, 'OsIsr'):
35
- os_isr = OsIsr()
36
- os_isr.setName(ctr_tag.attrib['name']) \
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._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)
@@ -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", 0)
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)