source: atk2-sc3-1.4.0-ntisr/utils/abrex/abrex.rb@ 172

Last change on this file since 172 was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

  • Property svn:executable set to *
File size: 38.0 KB
Line 
1#!ruby -Ku
2#
3# ABREX
4# AUTOSAR BSW and RTE XML Generator
5#
6# Copyright (C) 2013-2015 by Center for Embedded Computing Systems
7# Graduate School of Information Science, Nagoya Univ., JAPAN
8# Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
9# Copyright (C) 2013-2015 by FUJI SOFT INCORPORATED, JAPAN
10# Copyright (C) 2014-2015 by NEC Communication Systems, Ltd., JAPAN
11# Copyright (C) 2013-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12# Copyright (C) 2013-2014 by Renesas Electronics Corporation, JAPAN
13# Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
14# Copyright (C) 2013-2015 by Sunny Giken Inc., JAPAN
15# Copyright (C) 2013-2015 by TOSHIBA CORPORATION, JAPAN
16# Copyright (C) 2013-2015 by Witz Corporation
17# Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
18#
19# 上記著作権者
20は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
21# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
22# 変・再é…
23å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
24# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
25# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
26# スコード中に含まれていること.
27# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
28# 用できる形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
31# 者
32マニュアルなど)に,上記の著作権表示,この利用条件および下記
33# の無保証規定を掲載すること.
34# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
35# 用できない形で再é…
36å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
37# と.
38# (a) 再é…
39å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
40マニュアルなど)に,上記の著
41# 作権表示,この利用条件および下記の無保証規定を掲載すること.
42# (b) 再é…
43å¸ƒã®å½¢æ…
44‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
45# 報告すること.
46# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
47# 害からも,上記著作権者
48およびTOPPERSプロジェクトをå…
49è²¬ã™ã‚‹ã“と.
50# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
51# 由に基づく請求からも,上記著作権者
52およびTOPPERSプロジェクトを
53# å…
54è²¬ã™ã‚‹ã“と.
55#
56# 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
57# 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
58# はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
59# 用する者
60に対して,AUTOSARパートナーになることを求めている.
61#
62# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
63お
64# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
65# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
66# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
67# の責任を負わない.
68#
69# $Id: abrex.rb 571 2015-12-21 05:01:59Z t_ishikawa $
70#
71
72if ($0 == __FILE__)
73 TOOL_ROOT = File.expand_path(File.dirname(__FILE__) + "/")
74 $LOAD_PATH.unshift(TOOL_ROOT)
75end
76
77require "pp"
78require "yaml"
79require "optparse"
80require "kconv.rb"
81require "rexml/document.rb"
82include REXML
83
84######################################################################
85# 定数定義
86######################################################################
87VERSION = "1.1.0"
88VER_INFO = " Generated by ABREX Ver. #{VERSION} "
89XML_ROOT_PATH = "/AUTOSAR/EcucDefs/"
90XML_EDITION = "4.2.0"
91XML_SNAME = "SHORT-NAME"
92XML_PARAM = "PARAMETER-VALUES"
93XML_REFER = "REFERENCE-VALUES"
94XML_SUB = "SUB-CONTAINERS"
95XML_AUTOSAR_FIXED_ATT = {"xmlns" => "http://autosar.org/schema/r4.0",
96 "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
97 "xsi:schemaLocation" => "http://autosar.org/schema/r4.0 AUTOSAR_4-0-3_STRICT.xsd"}
98
99# パラメータデータ型種別格納ハッシュ
100# (これ以外はすべてECUC-NUMERICAL-PARAM-VALUE)
101XML_VALUE_TYPE = {"ECUC-REFERENCE-DEF" => "ECUC-REFERENCE-VALUE",
102 "ECUC-FOREIGN-REFERENCE-DEF" => "ECUC-REFERENCE-VALUE",
103 "ECUC-SYMBOLIC-NAME-REFERENCE-DEF" => "ECUC-REFERENCE-VALUE",
104 "ECUC-INSTANCE-REFERENCE-DEF" => "ECUC-INSTANCE-REFERENCE-VALUE",
105 "ECUC-CHOICE-REFERENCE-DEF" => "ECUC-CHOICE-REFERENCE-DEF",
106 "ECUC-ENUMERATION-PARAM-DEF" => "ECUC-TEXTUAL-PARAM-VALUE",
107 "ECUC-STRING-PARAM-DEF" => "ECUC-TEXTUAL-PARAM-VALUE",
108 "ECUC-MULTILINE-STRING-PARAM-DEF" => "ECUC-TEXTUAL-PARAM-VALUE",
109 "ECUC-FUNCTION-NAME-DEF" => "ECUC-TEXTUAL-PARAM-VALUE",
110 "ECUC-LINKER-SYMBOL-DEF" => "ECUC-TEXTUAL-PARAM-VALUE"}
111
112# インスタンス参ç…
113§åž‹ã®ç‰¹åˆ¥ã‚³ãƒ³ãƒ†ãƒŠ
114XML_INSTANCE_REF_CONTAINER = {"EcucPartitionSoftwareComponentInstanceRef" =>
115 {"CONTEXT-ELEMENT-REF" => "ROOT-SW-COMPOSITION-PROTOTYPE",
116 "TARGET-REF" => "SW-COMPONENT-PROTOTYPE"}}
117
118######################################################################
119# YAML → XML 実行機能
120######################################################################
121def YamlToXml(aArgData, sEcuExtractRef)
122 # 各パラメータのデータ型定義(-pオプションで生成したものを使用する)
123 sFileName = "#{TOOL_ROOT}/param_info.yaml"
124 if (!File.exist?(sFileName))
125 abort("#{sFileName} not found !!")
126 end
127 hParamInfo = YAML.load_file(sFileName)
128 # ハッシュでない(YAMLでない)場合エラー
129 if (!hParamInfo.is_a?(Hash))
130 abort("not YAML file !! [#{sFileName}]")
131 end
132
133 # 外部参ç…
134§å…
135ˆã®ãƒ‡ãƒ¼ã‚¿åž‹æ ¼ç´ãƒãƒƒã‚·ãƒ¥ã‚’分離
136 $hForeignRefType = hParamInfo.delete(:FOREIGN_REF_TYPE)
137
138 # 選択型のコンテナ格納é…
139åˆ—を分離
140 $aChoiceContainer = hParamInfo.delete(:ECUC_CHOICE_CONTAINER_DEF)
141
142 # インスタンス参ç…
143§å…
144ˆã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚’保持
145 $aInstanceRefType = hParamInfo["ECUC-INSTANCE-REFERENCE-DEF"]
146
147 # コンテナ名変換テーブル
148 $hEcuc = {}
149 $hDest = {}
150
151 hParamInfo.each{|sType, aParam|
152 aParam.each{|sName|
153 if (XML_VALUE_TYPE.has_key?(sType))
154 $hEcuc[sName] = XML_VALUE_TYPE[sType]
155 else
156 $hEcuc[sName] = "ECUC-NUMERICAL-PARAM-VALUE"
157 end
158 $hDest[sName] = sType
159 }
160 }
161
162 # 参ç…
163§åž‹ã®ãƒ‘ラメータ一覧
164 $hReferenceParam = hParamInfo["ECUC-REFERENCE-DEF"] + hParamInfo["ECUC-FOREIGN-REFERENCE-DEF"] + hParamInfo["ECUC-SYMBOLIC-NAME-REFERENCE-DEF"] + hParamInfo["ECUC-INSTANCE-REFERENCE-DEF"]
165
166 # 与えられたå…
167¨YAMLをマージする
168 hYaml = {}
169 sArxmlName = nil
170 aArgData.each{|sFileName|
171 # ファイルが存在しない場合エラー
172 if (!File.exist?(sFileName))
173 abort("Argument error !! [#{sFileName}]")
174 end
175
176 # 出力ファイル名作成(複数ある場合,最初のファイル名を採用する)
177 if (File.extname(sFileName) == ".yaml")
178 if (sArxmlName.nil?())
179 sArxmlName = File.dirname(sFileName) + "/" + File.basename(sFileName, ".yaml") + ".arxml"
180 end
181 else
182 abort("not YAML file name !! [#{sFileName}]")
183 end
184
185 hTmpData = YAML.load(File.read(sFileName).toutf8())
186 # ハッシュでない(YAMLでない)場合エラー
187 if (!hTmpData.is_a?(Hash))
188 abort("not YAML file !! [#{sFileName}]")
189 end
190
191 # 読み込んだデータをマージしていく
192 YamlToXml_merge_hash(hYaml, hTmpData)
193 }
194
195 cXmlInfo = Document.new()
196 cXmlInfo.add(XMLDecl.new("1.0", "UTF-8"))
197 REXML::Comment.new(VER_INFO, cXmlInfo)
198 cXmlAutosar = cXmlInfo.add_element("AUTOSAR", XML_AUTOSAR_FIXED_ATT)
199 cXmlArPackages = cXmlAutosar.add_element("AR-PACKAGES")
200
201 # IMPLEMENTATION-DATA-TYPE格納ハッシュを分離してå…
202ˆã«ç™»éŒ²
203 hImplDataType = hYaml.delete("IMPLEMENTATION-DATA-TYPE")
204 if (!hImplDataType.nil?())
205 cXmlArPackage = cXmlArPackages.add_element("AR-PACKAGE")
206 cXmlArPackage.add_element(XML_SNAME).add_text("ImplementationDataTypes")
207 cXmlElements = cXmlArPackage.add_element("ELEMENTS")
208 hImplDataType.each{|sShortName, hData|
209 cXmlEcucModuleConfVal = cXmlElements.add_element("IMPLEMENTATION-DATA-TYPE")
210 cXmlEcucModuleConfVal.add_element(XML_SNAME).add_text(sShortName)
211 cXmlEcucModuleConfVal.add_element("CATEGORY").add_text(hData["CATEGORY"])
212 }
213 end
214
215 aModulePaths = []
216 hYaml.each{|sPackageName, hPackageData|
217 cXmlArPackage = cXmlArPackages.add_element("AR-PACKAGE")
218 cXmlArPackage.add_element(XML_SNAME).add_text(sPackageName)
219 cXmlElements = cXmlArPackage.add_element("ELEMENTS")
220
221 hPackageData.each{|sEcucModuleName, hEcucModuleData|
222 aModulePaths.push("/#{sPackageName}/#{sEcucModuleName}")
223 cXmlEcucModuleConfVal = cXmlElements.add_element("ECUC-MODULE-CONFIGURATION-VALUES")
224 cXmlEcucModuleConfVal.add_element(XML_SNAME).add_text(sEcucModuleName)
225 cXmlEcucModuleConfVal.add_element("DEFINITION-REF", {"DEST" => "ECUC-MODULE-DEF"}).add_text(XML_ROOT_PATH + sEcucModuleName)
226 cXmlEcucModuleConfVal.add_element("ECUC-DEF-EDITION").add_text(XML_EDITION)
227 cXmlEcucModuleConfVal.add_element("IMPLEMENTATION-CONFIG-VARIANT").add_text("VARIANT-PRE-COMPILE")
228 cXmlContainers = cXmlEcucModuleConfVal.add_element("CONTAINERS")
229
230 # 各パラメータ用コンテナを作成する
231 hEcucModuleData.each{|sShortName, hParamInfo|
232 # DefinitionRef補完
233 if (!hParamInfo.has_key?("DefinitionRef"))
234 hParamInfo["DefinitionRef"] = sShortName
235 end
236
237 cContainer = YamlToXml_make_container(sShortName, hParamInfo, XML_ROOT_PATH + sEcucModuleName)
238 cXmlContainers.add_element(cContainer)
239 }
240 }
241 }
242
243 # ECU-EXTRACT-REF指定がある場合、<ECUC-VALUE-COLLECTION>を追加する
244 if (!sEcuExtractRef.nil?())
245 cXmlArPackage = cXmlArPackages.add_element("AR-PACKAGE")
246 cXmlArPackage.add_element(XML_SNAME).add_text("EcucValueCollection")
247 cXmlElements = cXmlArPackage.add_element("ELEMENTS")
248 cXmlEcucValueCollection = cXmlElements.add_element("ECUC-VALUE-COLLECTION")
249 cXmlEcucValueCollection.add_element(XML_SNAME).add_text("EcucValueCollection")
250 cXmlEcucValueCollection.add_element("ECU-EXTRACT-REF", {"DEST" => "SYSTEM"}).add_text(sEcuExtractRef)
251 cXmlEcucValues = cXmlEcucValueCollection.add_element("ECUC-VALUES")
252 aModulePaths.each{|sPath|
253 cTemp = cXmlEcucValues.add_element("ECUC-MODULE-CONFIGURATION-VALUES-REF-CONDITIONAL")
254 cTemp.add_element("ECUC-MODULE-CONFIGURATION-VALUES-REF", {"DEST" => "ECUC-MODULE-CONFIGURATION-VALUES"}).add_text(sPath)
255 }
256 end
257
258 # XML文字列生成
259 sXmlCode = String.new()
260 cXmlInfo.write(sXmlCode, 2, false)
261
262 # XML宣言の属性のコーテーションをダブルに出来ない(?)ため,ここで置換する
263 sXmlCode.gsub!("'", "\"")
264
265 # ダブルコーテーションが&quot;に変換されるのを抑止できない(?)ため,ここで置換する
266 sXmlCode.gsub!("&quot;", "\"")
267
268 # 値を定義する部分だけインデントをå…
269¥ã‚Œãªã„ように出来ない(?)ため,ここで置換する
270 sXmlCode.gsub!(/>\n[\s]+([\w\.\[\]\(\)\+-\/\*~&;\s]*?)\n[\s]+</, ">\\1<")
271
272 # インデントをタブに出来ない(?)ため,ここで置換する
273 sXmlCode.gsub!(" ", "\t")
274
275 # ファイル出力
276 #puts(sXmlCode)
277 File.open(sArxmlName, "w") {|io|
278 io.puts(sXmlCode)
279 }
280
281 puts("Generated #{sArxmlName}")
282end
283
284# ハッシュマージ関数
285def YamlToXml_merge_hash(hBase, hAdd)
286 hAdd.each{|sKey, xVal|
287 # 追加å…
288ˆã«ã‚­ãƒ¼ãŒå­˜åœ¨ã—なければ,そのまま追加するのみ
289 if (!hBase.has_key?(sKey))
290 hBase[sKey] = xVal
291 # 同じキーで値が違う場合
292 elsif (hBase[sKey] != hAdd[sKey])
293 # ハッシュ同士であれば,再帰で追加
294 if (hBase[sKey].is_a?(Hash) && hAdd[sKey].is_a?(Hash))
295 YamlToXml_merge_hash(hBase[sKey], hAdd[sKey])
296 # 追加å…
297ˆãŒé…
298åˆ—であれば,é…
299åˆ—に合わせて追加
300 elsif (hBase[sKey].is_a?(Array))
301 if (hAdd[sKey].is_a?(Array))
302 hBase[sKey].concat(hAdd[sKey])
303 else
304 hBase[sKey].push(hAdd[sKey])
305 end
306 # 追加å…
307ˆãŒé…
308åˆ—でなければ,é…
309åˆ—にしてから追加
310 elsif (hAdd[sKey].is_a?(Array))
311 hBase[sKey] = [hBase[sKey]]
312 hBase[sKey].concat(hAdd[sKey])
313 # どちらもé…
314åˆ—でない場合,é…
315åˆ—として両方をマージ
316 else
317 hBase[sKey] = [hBase[sKey]]
318 hBase[sKey].push(hAdd[sKey])
319 end
320 else
321 # 同じパラメータの場合,何もしない
322 end
323 }
324end
325
326# コンテナ作成関数
327def YamlToXml_make_container(sShortName, hParamInfo, sPath)
328 # 一律"ECUC-CONTAINER-VALUE"をå…
329¥ã‚ŒãŸçŠ¶æ…
330‹ã§åˆæœŸåŒ–
331 cContainer = Element.new().add_element("ECUC-CONTAINER-VALUE")
332
333 # ショートネーム追加
334 cContainer.add_element(XML_SNAME).add_text(sShortName)
335
336 # コンテナまでのパス追加
337 if ($aChoiceContainer.include?(hParamInfo["DefinitionRef"]))
338 cContainer.add_element("DEFINITION-REF", {"DEST" => "ECUC-CHOICE-CONTAINER-DEF"}).add_text("#{sPath}/#{hParamInfo["DefinitionRef"]}")
339 else
340 cContainer.add_element("DEFINITION-REF", {"DEST" => "ECUC-PARAM-CONF-CONTAINER-DEF"}).add_text("#{sPath}/#{hParamInfo["DefinitionRef"]}")
341 end
342
343 # 各パラメータ設定(パラメータが無い場合は不要)
344 hCheck= {}
345 if (hParamInfo.size() != 1)
346 hCheck[XML_PARAM] = false
347 hCheck[XML_REFER] = false
348 hCheck[XML_SUB] = false
349
350 # まず参ç…
351§åž‹ï¼Œã‚µãƒ–コンテナ以外を生成(AUTOSARスキーマ制約)
352 hParamInfo.each{|sParamName, sahValue|
353 if ((sParamName == "DefinitionRef") || (sahValue.is_a?(Hash)))
354 next
355 end
356
357 # 参ç…
358§åž‹ï¼Œã‚µãƒ–コンテナ以外のパラメータ
359 if (!$hReferenceParam.include?(sParamName))
360 # パラメータ名チェック
361 if (!$hEcuc.has_key?(sParamName) || !$hDest.has_key?(sParamName))
362 abort("Unknown parameter: #{sParamName}")
363 end
364
365 if (hCheck[XML_PARAM] == false)
366 cContainer.add_element(XML_PARAM)
367 hCheck[XML_PARAM] = true
368 end
369
370 # 多重度*対応
371 aTemp = []
372 if (sahValue.is_a?(Array))
373 aTemp = sahValue
374 else
375 aTemp.push(sahValue)
376 end
377 aTemp.each{|sVal|
378 cParamContainer_ = Element.new()
379 cParamContainer = cParamContainer_.add_element($hEcuc[sParamName])
380 cParamContainer.add_element("DEFINITION-REF", {"DEST" => $hDest[sParamName]}).add_text("#{sPath}/#{hParamInfo["DefinitionRef"]}/#{sParamName}")
381 cParamContainer.add_element("VALUE").add_text(sVal.to_s())
382 cContainer.elements[XML_PARAM].add_element(cParamContainer)
383 }
384 end
385 }
386
387 # 次に参ç…
388§åž‹ã‚’生成(AUTOSARスキーマ制約)
389 hParamInfo.each{|sParamName, sahValue|
390 if ((sParamName == "DefinitionRef") || (sahValue.is_a?(Hash)))
391 next
392 end
393
394 # インスタンス参ç…
395§åž‹ã®å ´åˆ
396 if ($aInstanceRefType.include?(sParamName))
397 if (!sahValue.is_a?(Array))
398 abort("#{sParamName} must be Array !!")
399 end
400 # 未サポートコンテナは生成できないためエラーとする
401 if (!XML_INSTANCE_REF_CONTAINER.has_key?(sParamName))
402 abort("#{sParamName} is not supported !!")
403 end
404 if (hCheck[XML_REFER] == false)
405 cContainer.add_element(XML_REFER)
406 hCheck[XML_REFER] = true
407 end
408
409 # 多重度*対応(2次å…
410ƒé…
411åˆ—かチェック)
412 aTemp = []
413 if (sahValue[0].is_a?(Array))
414 aTemp = sahValue
415 else
416 aTemp.push(sahValue)
417 end
418 aTemp.each{|aVal|
419 cParamContainer_ = Element.new()
420 cParamContainer = cParamContainer_.add_element($hEcuc[sParamName])
421 cParamContainer.add_element("DEFINITION-REF", {"DEST" => $hDest[sParamName]}).add_text("#{sPath}/#{hParamInfo["DefinitionRef"]}/#{sParamName}")
422 cInstanceRef = cParamContainer.add_element("VALUE-IREF")
423 aVal.each{|hVal|
424 XML_INSTANCE_REF_CONTAINER[sParamName].each{|sParam, sDest|
425 if (hVal.has_key?(sParam))
426 cInstanceRef.add_element(sParam, {"DEST" => sDest}).add_text(hVal[sParam].to_s())
427 end
428 }
429 }
430 cContainer.elements[XML_REFER].add_element(cParamContainer)
431 }
432
433 # 参ç…
434§åž‹ã®å ´åˆ
435 elsif ($hReferenceParam.include?(sParamName))
436 if (hCheck[XML_REFER] == false)
437 cContainer.add_element(XML_REFER)
438 hCheck[XML_REFER] = true
439 end
440
441 # 多重度*対応
442 aTemp = []
443 if (sahValue.is_a?(Array))
444 aTemp = sahValue
445 else
446 aTemp.push(sahValue)
447 end
448 aTemp.each{|sVal|
449 cParamContainer_ = Element.new()
450 cParamContainer = cParamContainer_.add_element($hEcuc[sParamName])
451 cParamContainer.add_element("DEFINITION-REF", {"DEST" => $hDest[sParamName]}).add_text("#{sPath}/#{hParamInfo["DefinitionRef"]}/#{sParamName}")
452 if (!$hForeignRefType.nil? && $hForeignRefType.has_key?(sParamName))
453 cParamContainer.add_element("VALUE-REF", {"DEST" => $hForeignRefType[sParamName]}).add_text(sVal.to_s())
454 else
455 cParamContainer.add_element("VALUE-REF", {"DEST" => "ECUC-CONTAINER-VALUE"}).add_text(sVal.to_s())
456 end
457 cContainer.elements[XML_REFER].add_element(cParamContainer)
458 }
459 end
460 }
461
462 # 最後にサブコンテナを生成
463 hParamInfo.each{|sParamName, sahValue|
464 if ((sParamName == "DefinitionRef") || (!sahValue.is_a?(Hash)))
465 next
466 end
467
468 if (hCheck[XML_SUB] == false)
469 cContainer.add_element(XML_SUB)
470 hCheck[XML_SUB] = true
471 end
472
473 # DefinitionRef補完
474 if (!sahValue.has_key?("DefinitionRef"))
475 sahValue["DefinitionRef"] = sParamName
476 end
477
478 # 再帰でサブコンテナを作成する
479 cContainer.elements[XML_SUB].add_element(YamlToXml_make_container(sParamName, sahValue, "#{sPath}/#{hParamInfo["DefinitionRef"]}"))
480 }
481 end
482
483 return cContainer
484end
485
486
487######################################################################
488# XML → YAML 実行機能
489######################################################################
490def XmlToYaml(sFirstFile, aExtraFile)
491 aExtraFile.unshift(sFirstFile)
492 aExtraFile.each{|sFileName|
493 # ファイルが存在しない場合エラー
494 if (!File.exist?(sFileName))
495 abort("Argument error !! [#{sFileName}]")
496 end
497
498 # 出力ファイル名作成
499 if (File.extname(sFileName) == ".arxml")
500 sYamlName = File.dirname(sFileName) + "/" + File.basename(sFileName, ".arxml") + ".yaml"
501 else
502 abort("not ARXML file !! [#{sFileName}]")
503 end
504
505 # XMLライブラリでの読み込み
506 cXmlData = REXML::Document.new(open(sFileName))
507
508 hResult = {}
509
510 cXmlData.elements.each("AUTOSAR/AR-PACKAGES/AR-PACKAGE"){|cElement1|
511 cElement1.elements.each("ELEMENTS/ECUC-MODULE-CONFIGURATION-VALUES"){|cElement2|
512 sPackageName = cElement1.elements["SHORT-NAME"].text()
513 if (!hResult.has_key?(sPackageName))
514 hResult[sPackageName] = {}
515 end
516
517 sModuleName = cElement2.elements["SHORT-NAME"].text()
518 hResult[sPackageName][sModuleName] = {}
519
520 cElement2.elements.each("CONTAINERS/ECUC-CONTAINER-VALUE"){|cElement3|
521 XmlToYaml_parse_parameter(cElement3, hResult[sPackageName][sModuleName])
522 }
523 }
524 }
525
526 # YAMLファイル出力
527 open(sYamlName, "w") do |io|
528 YAML.dump(hResult, io)
529 end
530
531 # YAML整形処理
532 # ・å…
533ˆé ­ã®åŒºåˆ‡ã‚Šæ–‡å­—削除
534 # ・コーテーションの削除
535 # ・é…
536åˆ—のインデント整列
537 sFileData = File.read(sYamlName)
538 sFileData.gsub!(/^---$/, "")
539 sFileData.gsub!("'", "")
540 sFileData.gsub!(/^(\s+)-(\s.*)$/, "\\1 -\\2")
541 File.write(sYamlName, sFileData)
542
543 puts("Generated #{sYamlName}")
544 }
545end
546
547# コンテナパース関数
548def XmlToYaml_parse_parameter(cElement, hTarget)
549 sParamShortName = cElement.elements["SHORT-NAME"].text()
550 sParamDefName = cElement.elements["DEFINITION-REF"].text().split("/")[-1]
551 hTarget[sParamShortName] = {}
552 if (sParamShortName != sParamDefName)
553 hTarget[sParamShortName]["DefinitionRef"] = sParamDefName
554 end
555
556 # パラメータ
557 cElement.elements.each("PARAMETER-VALUES"){|cElementC|
558 ["ECUC-NUMERICAL-PARAM-VALUE", "ECUC-TEXTUAL-PARAM-VALUE"].each{|sParamValue|
559 cElementC.elements.each(sParamValue){|cElementG|
560 sName = cElementG.elements["DEFINITION-REF"].text().split("/")[-1]
561 sValue = cElementG.elements["VALUE"].text()
562 # 複数多重度対応
563 if (hTarget[sParamShortName].has_key?(sName))
564 if (hTarget[sParamShortName][sName].is_a?(Array))
565 # 既に複数ある場合はé…
566åˆ—に追加
567 hTarget[sParamShortName][sName].push(sValue)
568 else
569 # 1つだけ定義されていた場合はé…
570åˆ—に変更
571 sTemp = hTarget[sParamShortName][sName]
572 hTarget[sParamShortName][sName] = [sTemp, sValue]
573 end
574 else
575 hTarget[sParamShortName][sName] = sValue
576 end
577 }
578 }
579 }
580
581 # 参ç…
582§ï¼Œå¤–部参ç…
583§ï¼Œé¸æŠžå‚ç…
584§
585 cElement.elements.each("REFERENCE-VALUES/ECUC-REFERENCE-VALUE"){|cElementC|
586 sName = cElementC.elements["DEFINITION-REF"].text().split("/")[-1]
587 if (cElementC.elements["VALUE-REF"].nil?)
588 abort("<VALUE> is not found in '#{sParamShortName}'")
589 end
590 sValue = cElementC.elements["VALUE-REF"].text()
591 # 複数多重度対応
592 if (hTarget[sParamShortName].has_key?(sName))
593 if (hTarget[sParamShortName][sName].is_a?(Array))
594 # 既に複数ある場合はé…
595åˆ—に追加
596 hTarget[sParamShortName][sName].push(sValue)
597 else
598 # 1つだけ定義されていた場合はé…
599åˆ—に変更
600 sTemp = hTarget[sParamShortName][sName]
601 hTarget[sParamShortName][sName] = [sTemp, sValue]
602 end
603 else
604 hTarget[sParamShortName][sName] = sValue
605 end
606 }
607
608 # インスタンス参ç…
609§
610 cElement.elements.each("REFERENCE-VALUES/ECUC-INSTANCE-REFERENCE-VALUE"){|cElementC|
611 sName = cElementC.elements["DEFINITION-REF"].text().split("/")[-1]
612 hTarget[sParamShortName][sName] = []
613 hTarget[sParamShortName][sName].push({"CONTEXT-ELEMENT-REF" => cElementC.elements["VALUE-IREF"].elements["CONTEXT-ELEMENT-REF"].text()})
614 hTarget[sParamShortName][sName].push({"TARGET-REF" => cElementC.elements["VALUE-IREF"].elements["TARGET-REF"].text()})
615 }
616
617 # サブコンテナ(再帰呼出し)
618 cElement.elements.each("SUB-CONTAINERS/ECUC-CONTAINER-VALUE"){|cElementC|
619 XmlToYaml_parse_parameter(cElementC, hTarget[sParamShortName])
620 }
621end
622
623
624######################################################################
625# AUTOSARパラメータ情
626報ファイル作成
627######################################################################
628def MakeParamInfo(sFileName)
629 # ファイルが存在しない場合エラー
630 if (!File.exist?(sFileName))
631 abort("Argument error !! [#{sFileName}]")
632 end
633
634 sParamFileName = File.dirname(sFileName) + "/param_info.yaml"
635
636 # 読み込み対象モジュール
637 aTargetModule = ["Rte", "Os", "Com", "PduR", "CanIf", "Can", "EcuC", "EcuM", "WdgM", "WdgIf", "Wdg", "Dem"]
638
639 # XMLライブラリでの読み込み
640 cXmlData = REXML::Document.new(open(sFileName))
641
642 # 外部参ç…
643§å…
644ˆã®ãƒ‡ãƒ¼ã‚¿åž‹æ ¼ç´ãƒãƒƒã‚·ãƒ¥
645 $hForeignRefType = {}
646
647 # 選択型のコンテナ格納é…
648åˆ—
649 $aChoiceContainer = []
650
651 # パース結果格納ハッシュ初期化(NCES仕様コンテナは予め設定)
652 sNcesContainer = <<-EOS
653ECUC-ENUMERATION-PARAM-DEF:
654 - OsMemorySectionInitialize
655 - OsIsrInterruptSource
656 - OsInterCoreInterruptInterruptSource
657 - OsSpinlockLockMethod
658 - WdgTriggerMode
659 - WdgTimeoutReaction
660ECUC-INTEGER-PARAM-DEF:
661 - OsMasterCoreId
662 - OsHookStackSize
663 - OsHookStackCoreAssignment
664 - OsOsStackSize
665 - OsOsStackCoreAssignment
666 - OsNonTrustedHookStackSize
667 - OsNonTrustedHookStackCoreAssignment
668 - OsTaskStackSize
669 - OsTaskSystemStackSize
670 - OsIsrInterruptNumber
671 - OsIsrInterruptPriority
672 - OsIsrStackSize
673 - OsTrustedFunctionStackSize
674 - OsInterCoreInterruptStackSize
675 - OsMemoryRegionSize
676 - OsMemoryRegionStartAddress
677 - OsMemoryAreaSize
678 - OsStandardMemoryCoreAssignment
679 - OsIsrMaxFrequency
680 - WdgWindowOpenRate
681ECUC-STRING-PARAM-DEF:
682 - OsIncludeFileName
683 - OsMemoryRegionName
684 - OsMemoryAreaStartAddress
685 - OsMemorySectionName
686 - OsMemoryModuleName
687 - OsLinkSectionName
688 - OsIocPrimitiveDataType
689 - OsIocIncludeFile
690 - OsHookStackStartAddress
691 - OsOsStackStartAddress
692 - OsNonTrustedHookStackStartAddress
693 - OsTaskStackStartAddress
694 - OsTaskSystemStackStartAddress
695 - OsInterCoreInterruptStackStartAddress
696ECUC-BOOLEAN-PARAM-DEF:
697 - OsMemoryRegionWriteable
698 - OsMemoryAreaWriteable
699 - OsMemoryAreaReadable
700 - OsMemoryAreaExecutable
701 - OsMemoryAreaCacheable
702 - OsMemoryAreaDevice
703 - OsMemorySectionWriteable
704 - OsMemorySectionReadable
705 - OsMemorySectionExecutable
706 - OsMemorySectionShort
707 - OsMemorySectionCacheable
708 - OsMemorySectionDevice
709 - OsMemorySectionExport
710 - OsMemoryModuleExport
711 - OsTaskOsInterruptLockMonitor
712 - OsTaskResourceLockMonitor
713ECUC-REFERENCE-DEF:
714 - OsStandardMemoryRomRegionRef
715 - OsStandardMemoryRamRegionRef
716 - OsAppStandardMemoryRomRegionRef
717 - OsAppStandardMemoryRamRegionRef
718 - OsMemorySectionMemoryRegionRef
719 - OsLinkSectionMemoryRegionRef
720 - OsResourceLinkedResourceRef
721 - OsCounterIsrRef
722 - OsAppMemorySectionRef
723 - OsAppMemoryModuleRef
724 - OsAppMemoryAreaRef
725 - OsAppInterCoreInterruptRef
726 - OsInterCoreInterruptAccessingApplication
727 - OsInterCoreInterruptResourceRef
728 - WdgMOsCounterRef
729 - OsSystemCycleTimeWindowRef
730ECUC-FLOAT-PARAM-DEF:
731 - OsSystemCycleTime
732 - OsSystemCycleTimeWindowStart
733 - OsSystemCycleTimeWindowLength
734 - OsOsInterruptLockBudget
735 - OsResourceLockBudget
736 - OsTrustedFunctionExecutionBudget
737 - WdgTimeout
738 - WdgTriggerInterruptPeriod
739EOS
740 $hResult = YAML.load(sNcesContainer)
741
742 cXmlData.elements.each("AUTOSAR/AR-PACKAGES/AR-PACKAGE/AR-PACKAGES/AR-PACKAGE/ELEMENTS/ECUC-MODULE-DEF"){|cElement1|
743 # 対象モジュールのみを処理する
744 if (!aTargetModule.include?(cElement1.elements["SHORT-NAME"].text()))
745 next
746 end
747
748 cElement1.elements.each("CONTAINERS/ECUC-PARAM-CONF-CONTAINER-DEF"){|cElement2|
749 MakeParamInfo_parse_parameter(cElement2)
750 }
751 }
752
753 # パラメータ名でソートと重複除去
754 hResultSort = {}
755 $hResult.each{|sType, aParam|
756 hResultSort[sType] = aParam.uniq().sort()
757 }
758
759 # 外部参ç…
760§å…
761ˆã®ãƒ‡ãƒ¼ã‚¿åž‹æ ¼ç´ãƒãƒƒã‚·ãƒ¥ã‚’結合
762 if (!$hForeignRefType.empty?())
763 hResultSort[:FOREIGN_REF_TYPE] = $hForeignRefType
764 end
765
766 # 選択型のコンテナ格納é…
767åˆ—を追加
768 if (!$aChoiceContainer.empty?())
769 hResultSort[:ECUC_CHOICE_CONTAINER_DEF] = $aChoiceContainer
770 end
771
772 # RteSoftwareComponentInstanceRefは外部参ç…
773§ã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å‚ç…
774§ã®
775 # 両方に含まれるが,外部参ç…
776§ã¨ã—て扱う
777 hResultSort["ECUC-INSTANCE-REFERENCE-DEF"].delete("RteSoftwareComponentInstanceRef")
778
779 # YAMLファイル出力
780 open(sParamFileName, "w") do |io|
781 YAML.dump(hResultSort, io)
782 end
783
784 puts("Generated #{sParamFileName}")
785end
786
787# サブコンテナ再帰パース関数
788def MakeParamInfo_parse_sub_container(cElement)
789 # "ECUC-PARAM-CONF-CONTAINER-DEF"が登場するまで再帰する
790 cElement.elements.each{|cElementC|
791 # CHOICEはさらにネストする
792 if (cElementC.name == "ECUC-CHOICE-CONTAINER-DEF")
793 $aChoiceContainer.push(cElementC.elements[XML_SNAME].text())
794 MakeParamInfo_parse_sub_container(cElementC)
795 elsif (cElementC.name == "ECUC-PARAM-CONF-CONTAINER-DEF")
796 MakeParamInfo_parse_parameter(cElementC)
797 else
798 MakeParamInfo_parse_sub_container(cElementC)
799 end
800 }
801end
802
803# コンテナパース関数
804def MakeParamInfo_parse_parameter(cElement)
805 # パラメータ
806 cElement.elements.each("PARAMETERS"){|cElementC|
807 cElementC.elements.each{|cElementG|
808 # 初出のデータ型処理
809 if (!$hResult.has_key?(cElementG.name))
810 $hResult[cElementG.name] = []
811 end
812
813 # 取得したパラメータ名を格納する
814 $hResult[cElementG.name].push(cElementG.elements["SHORT-NAME"].text())
815 }
816 }
817
818 # 参ç…
819§
820 cElement.elements.each("REFERENCES/ECUC-REFERENCE-DEF"){|cElementC|
821 $hResult["ECUC-REFERENCE-DEF"].push(cElementC.elements["SHORT-NAME"].text())
822 }
823
824 # 外部参ç…
825§
826 cElement.elements.each("REFERENCES/ECUC-FOREIGN-REFERENCE-DEF"){|cElementC|
827 # 初出のデータ型処理
828 if (!$hResult.has_key?("ECUC-FOREIGN-REFERENCE-DEF"))
829 $hResult["ECUC-FOREIGN-REFERENCE-DEF"] = []
830 end
831 $hResult["ECUC-FOREIGN-REFERENCE-DEF"].push(cElementC.elements["SHORT-NAME"].text())
832 $hForeignRefType[cElementC.elements["SHORT-NAME"].text()] = cElementC.elements["DESTINATION-TYPE"].text()
833 }
834
835 # 選択参ç…
836§
837 cElement.elements.each("REFERENCES/ECUC-CHOICE-REFERENCE-DEF"){|cElementC|
838 # 初出のデータ型処理
839 if (!$hResult.has_key?("ECUC-CHOICE-REFERENCE-DEF"))
840 $hResult["ECUC-CHOICE-REFERENCE-DEF"] = []
841 end
842 $hResult["ECUC-CHOICE-REFERENCE-DEF"].push(cElementC.elements["SHORT-NAME"].text())
843 }
844
845 # シンボル参ç…
846§
847 cElement.elements.each("REFERENCES/ECUC-SYMBOLIC-NAME-REFERENCE-DEF"){|cElementC|
848 # 初出のデータ型処理
849 if (!$hResult.has_key?("ECUC-SYMBOLIC-NAME-REFERENCE-DEF"))
850 $hResult["ECUC-SYMBOLIC-NAME-REFERENCE-DEF"] = []
851 end
852 $hResult["ECUC-SYMBOLIC-NAME-REFERENCE-DEF"].push(cElementC.elements["SHORT-NAME"].text())
853 }
854
855 # インスタンス参ç…
856§
857 cElement.elements.each("REFERENCES/ECUC-INSTANCE-REFERENCE-DEF"){|cElementC|
858 # 初出のデータ型処理
859 if (!$hResult.has_key?("ECUC-INSTANCE-REFERENCE-DEF"))
860 $hResult["ECUC-INSTANCE-REFERENCE-DEF"] = []
861 end
862 $hResult["ECUC-INSTANCE-REFERENCE-DEF"].push(cElementC.elements["SHORT-NAME"].text())
863 }
864
865 # サブコンテナ(再帰呼出し)
866 cElement.elements.each("SUB-CONTAINERS"){|cElementC|
867 MakeParamInfo_parse_sub_container(cElementC)
868 }
869end
870
871
872######################################################################
873# ジェネレータ用csvファイルの生成
874######################################################################
875def MakeCsv(sFileName, sTargetModule)
876 # ファイルが存在しない場合エラー
877 if (!File.exist?(sFileName))
878 abort("Argument error !! [#{sFileName}]")
879 end
880
881 sCsvFileName = File.dirname(sFileName) + "/" + sTargetModule + ".csv"
882
883 # XMLライブラリでの読み込み
884 cXmlData = REXML::Document.new(open(sFileName))
885
886 $hResult = {}
887 $sNowContainer = ""
888
889 cXmlData.elements.each("AUTOSAR/AR-PACKAGES/AR-PACKAGE/AR-PACKAGES/AR-PACKAGE/ELEMENTS/ECUC-MODULE-DEF"){|cElement1|
890 # 対象モジュールのみを処理する
891 if (cElement1.elements["SHORT-NAME"].text() != sTargetModule)
892 next
893 end
894
895 cElement1.elements.each("CONTAINERS/ECUC-PARAM-CONF-CONTAINER-DEF"){|cElement2|
896 $sContainer = cElement2.elements["SHORT-NAME"].text()
897 $hResult[$sContainer] = MakeCsv_add_parameter_info(cElement2, nil)
898 MakeCsv_parse_parameter(cElement2)
899 }
900 }
901
902 sModulePath = "/AUTOSAR/EcucDefs/#{sTargetModule}"
903 sCsvData = "#{sModulePath},,,1\n"
904
905 hDataTypeTable = {"ECUC-REFERENCE-DEF" => "REF",
906 "ECUC-FOREIGN-REFERENCE-DEF" => "REF",
907 "ECUC-CHOICE-REFERENCE-DEF" => "REF",
908 "ECUC-SYMBOLIC-NAME-REFERENCE-DEF" => "REF",
909 "ECUC-INSTANCE-REFERENCE-DEF" => "REF",
910 "ECUC-BOOLEAN-PARAM-DEF" => "BOOLEAN",
911 "ECUC-INTEGER-PARAM-DEF" => "INT",
912 "ECUC-FUNCTION-NAME-DEF" => "FUNCTION",
913 "ECUC-ENUMERATION-PARAM-DEF" => "ENUM",
914 "ECUC-STRING-PARAM-DEF" => "STRING",
915 "ECUC-FLOAT-PARAM-DEF" => "FLOAT",
916 "ECUC-LINKER-SYMBOL-DEF" => "STRING",
917 nil => ""}
918
919 $hResult.each{|sParam, aInfo|
920 if (!hDataTypeTable.has_key?(aInfo[0]))
921 abort("[#{__FILE__}] #{__LINE__}: #{aInfo[0]}")
922 end
923 if ((aInfo[1] == "1") && (aInfo[2] == "1"))
924 sCsvData += "#{sModulePath}/#{sParam},#{sParam.split("/")[-1]},#{hDataTypeTable[aInfo[0]]},1\n"
925 else
926 sCsvData += "#{sModulePath}/#{sParam},#{sParam.split("/")[-1]},#{hDataTypeTable[aInfo[0]]},#{aInfo[1]},#{aInfo[2]}\n"
927 end
928 }
929
930 File.open(sCsvFileName, "w") {|io|
931 io.puts(sCsvData)
932 }
933
934 puts("Generated #{sCsvFileName}")
935end
936
937# パラメータ情
938報追加関数
939def MakeCsv_add_parameter_info(cElement, sName = cElement.name)
940 # パラメータ毎に,型・多重度下限,上限の情
941報を取得
942 sLower = nil
943 if (!cElement.elements["LOWER-MULTIPLICITY"].nil?)
944 sLower = cElement.elements["LOWER-MULTIPLICITY"].text()
945 else
946 abort("[#{__FILE__}] #{__LINE__}")
947 end
948 sUpper = nil
949 if (!cElement.elements["UPPER-MULTIPLICITY"].nil?)
950 sUpper = cElement.elements["UPPER-MULTIPLICITY"].text()
951 elsif (!cElement.elements["UPPER-MULTIPLICITY-INFINITE"].nil? && (cElement.elements["UPPER-MULTIPLICITY-INFINITE"].text() == "true"))
952 sUpper = "*"
953 else
954 abort("[#{__FILE__}] #{__LINE__}")
955 end
956
957 return [sName, sLower, sUpper]
958end
959
960# サブコンテナ再帰パース関数
961def MakeCsv_parse_sub_container(cElement)
962 # "ECUC-PARAM-CONF-CONTAINER-DEF"が登場するまで再帰する
963 cElement.elements.each{|cElementC|
964 # CHOICEはさらにネストする
965 if (cElementC.name == "ECUC-CHOICE-CONTAINER-DEF")
966 $sContainer += "/#{cElementC.elements["SHORT-NAME"].text()}"
967 $hResult[$sContainer] = MakeCsv_add_parameter_info(cElementC, nil)
968 MakeCsv_parse_sub_container(cElementC)
969
970 aTemp = $sContainer.split("/")
971 aTemp.pop()
972 $sContainer = aTemp.join("/")
973 elsif (cElementC.name == "ECUC-PARAM-CONF-CONTAINER-DEF")
974 $sContainer += "/#{cElementC.elements["SHORT-NAME"].text()}"
975 $hResult[$sContainer] = MakeCsv_add_parameter_info(cElementC, nil)
976 MakeCsv_parse_parameter(cElementC)
977
978 aTemp = $sContainer.split("/")
979 aTemp.pop()
980 $sContainer = aTemp.join("/")
981 else
982 MakeCsv_parse_sub_container(cElementC)
983 end
984 }
985end
986
987# コンテナパース関数
988def MakeCsv_parse_parameter(cElement)
989 # パラメータ
990 cElement.elements.each("PARAMETERS"){|cElementC|
991 cElementC.elements.each{|cElementG|
992 sParamName = "#{$sContainer}/#{cElementG.elements["SHORT-NAME"].text()}"
993 $hResult[sParamName] = MakeCsv_add_parameter_info(cElementG)
994 }
995 }
996
997 # 参ç…
998§
999 cElement.elements.each("REFERENCES/ECUC-REFERENCE-DEF"){|cElementC|
1000 sParamName = "#{$sContainer}/#{cElementC.elements["SHORT-NAME"].text()}"
1001 $hResult[sParamName] = MakeCsv_add_parameter_info(cElementC)
1002 }
1003
1004 # 外部参ç…
1005§
1006 cElement.elements.each("REFERENCES/ECUC-FOREIGN-REFERENCE-DEF"){|cElementC|
1007 sParamName = "#{$sContainer}/#{cElementC.elements["SHORT-NAME"].text()}"
1008 $hResult[sParamName] = MakeCsv_add_parameter_info(cElementC)
1009 }
1010
1011 # 選択参ç…
1012§
1013 cElement.elements.each("REFERENCES/ECUC-CHOICE-REFERENCE-DEF"){|cElementC|
1014 sParamName = "#{$sContainer}/#{cElementC.elements["SHORT-NAME"].text()}"
1015 $hResult[sParamName] = MakeCsv_add_parameter_info(cElementC)
1016 }
1017
1018 # シンボルネーム参ç…
1019§
1020 cElement.elements.each("REFERENCES/ECUC-SYMBOLIC-NAME-REFERENCE-DEF"){|cElementC|
1021 sParamName = "#{$sContainer}/#{cElementC.elements["SHORT-NAME"].text()}"
1022 $hResult[sParamName] = MakeCsv_add_parameter_info(cElementC)
1023 }
1024
1025 # インスタンス参ç…
1026§
1027 cElement.elements.each("REFERENCES/ECUC-INSTANCE-REFERENCE-DEF"){|cElementC|
1028 sParamName = "#{$sContainer}/#{cElementC.elements["SHORT-NAME"].text()}"
1029 $hResult[sParamName] = MakeCsv_add_parameter_info(cElementC)
1030 }
1031
1032 # サブコンテナ(再帰呼出し)
1033 cElement.elements.each("SUB-CONTAINERS"){|cElementC|
1034 MakeCsv_parse_sub_container(cElementC)
1035 }
1036end
1037
1038
1039######################################################################
1040# オプション処理
1041######################################################################
1042lMode = :YamlToXml
1043sEcuExtractRef = nil
1044cOpt = OptionParser.new(banner="Usage: abrex.rb [options]... [yaml|xml files]...", 18)
1045cOpt.version = VERSION
1046sOptData = nil
1047sBswName = nil
1048cOpt.on("-i XML_FILE", "ARXML to YAML conversion") {|xVal|
1049 sOptData = xVal
1050 lMode = :XmlToYaml
1051}
1052cOpt.on("-p XML_FILE", "Generate 'param_info.yaml' from AUTOSAR Ecu Configuration Parameters file") {|xVal|
1053 sOptData = xVal
1054 lMode = :MakeParamInfo
1055}
1056cOpt.on("-c XML_FILE", "Generate '{BSW_NAME}.csv' from AUTOSAR Ecu Configuration Parameters file") {|xVal|
1057 sOptData = xVal
1058 lMode = :MakeCsv
1059}
1060cOpt.on("-b BSW_NAME", "set a BSW Module Name (for '-c' additional optipn)") {|xVal|
1061 sBswName = xVal
1062 lMode = :MakeCsv
1063}
1064cOpt.on("-e ECU-EXTRACT-REF", "set a ECU-EXTRACT-REF path if <ECUC-VALUE-COLLECTION> is needed") {|xVal|
1065 sEcuExtractRef = xVal
1066 lMode = :YamlToXml
1067}
1068cOpt.on("-v", "--version", "show version information"){
1069 puts(cOpt.ver())
1070 exit(1)
1071}
1072cOpt.on("-h", "--help", "show help (this)"){
1073 puts(cOpt.help())
1074 exit(1)
1075}
1076
1077begin
1078 aArgData = cOpt.parse(ARGV)
1079rescue OptionParser::ParseError
1080 puts(cOpt.help())
1081 exit(1)
1082end
1083
1084if (((lMode == :YamlToXml) && aArgData.empty?()) ||
1085 ((lMode != :YamlToXml) && sOptData.nil?()))
1086 puts(cOpt.help())
1087 exit(1)
1088end
1089
1090if ((lMode == :MakeCsv) && sBswName.nil?())
1091 puts(cOpt.help())
1092 exit(1)
1093end
1094
1095
1096######################################################################
1097# オプションに従って各処理を実行
1098######################################################################
1099case lMode
1100 when :YamlToXml
1101 YamlToXml(aArgData, sEcuExtractRef)
1102 when :XmlToYaml
1103 XmlToYaml(sOptData, aArgData)
1104 when :MakeParamInfo
1105 MakeParamInfo(sOptData)
1106 when :MakeCsv
1107 MakeCsv(sOptData, sBswName)
1108end
Note: See TracBrowser for help on using the repository browser.