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.
@@ -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
- class AbstractEbModelParser(metaclass = ABCMeta):
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) == "AbstractEBModelParser":
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 == None:
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 = None) -> str:
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 ('value' not in tag.attrib):
71
+ if 'value' not in tag.attrib:
72
72
  return default_value
73
73
  enable = self.read_attrib(tag, 'ENABLE')
74
- if (enable == 'false'):
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
- raise KeyError("XPath d:ref[@name='%s'] is invalid" % name)
89
- return EcucRefType(self.read_ref_raw_value(tag.attrib['value']))
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 (enable == 'false'):
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 == "false":
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(".//a:a[@name='%s']" % name, self.nsmap)
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
+
@@ -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, OsScheduleTable
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 Rte ARVersion:<%s> SwVersion:<%s>" % (os.getArVersion().getVersion(), os.getSwVersion().getVersion()))
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
- # patch for the infineon Aurix
70
+ # Infineon Aurix Tricore
68
71
  os_isr.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsTricoreIrqLevel"))
69
- # patch for the ARM
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, RteEventToTaskMapping, RteEventToTaskMappingV3, RteEventToTaskMappingV4, RteSwComponentInstance
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
- .setRteSoftwareComponentInstanceRef(self.read_optional_ref_value(ctr_tag, "RteSoftwareComponentInstanceRef"))
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)
@@ -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: 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
- #worksheet.column_dimensions[col].width = (value + 2) + 2
24
- worksheet.column_dimensions[col].width = (value + 2)
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 = None) -> Cell:
32
- cell = sheet.cell(row = row, column=column) # type: Cell
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 != None):
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)