source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/tecsgen/tecslib/core/pluginModule.rb@ 374

Last change on this file since 374 was 374, checked in by coas-nagasima, 5 years ago

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
File size: 7.1 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2017 by TOPPERS Project
7#--
8# 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10# 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13# スコード中に含まれていること.
14# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17# の無保証規定を掲載すること.
18# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20# と.
21# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22# 作権表示,この利用条件および下記の無保証規定を掲載すること.
23# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24# 報告すること.
25# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28# 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29# 免責すること.
30#
31# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35# の責任を負わない.
36#
37# $Id$
38#++
39
40#== プラグインをロードする側のモジュール
41# @@loaded_plugin_list:: {Symbol=>Integer}
42module PluginModule
43
44 @@loaded_plugin_list = {}
45
46 #=== プラグインをロードする
47 # return:: PluginClass
48 # V1.4.1 まで return:: true : 成功、 false : 失敗
49 #
50 # #{plugin_name}.rb をロードし、plugin_name クラスのオブジェクトを生成する.
51 # plugin_name が MultiPlugin の場合、get_plugin により、superClass のプラグインオブジェクトをロードする.
52 #
53 # すでにロードされているものは、重複してロードしない
54 # load 時の例外はこのメソッドの中でキャッチされて false が返される
55 def load_plugin( plugin_name, superClass )
56
57 dbgPrint "PluginModule: load_plugin: #{plugin_name}\n"
58 begin
59 unless @@loaded_plugin_list[ plugin_name.to_sym ] then
60 @@loaded_plugin_list[ plugin_name.to_sym ] = 0
61 if ( $verbose ) then
62 print( "load '#{plugin_name}.rb'\n" )
63 end
64 # "#{plugin_name}.rb" をロード(システム用ではないので、fatal エラーにしない)
65 if require_tecsgen_lib( "#{plugin_name}.rb", false ) == false then
66 cdl_error( "P2001 $1.rb : fail to load plugin" , plugin_name )
67 return nil
68 end
69 end
70
71 plClass = Object.const_get plugin_name
72 if ( plClass <= superClass ) then # plClass inherits superClass
73 return plClass
74 elsif (plClass <= MultiPlugin) then # plClass inherits MultiPlugin
75 dbgPrint "pluginClass=#{plClass}\n"
76 plugin_object = plClass.get_plugin superClass
77 dbgPrint "pluginClass=#{plugin_object}\n"
78 if plugin_object == nil then
79 cdl_error( "P9999 '$1': MultiPlugin not support '$2'", plugin_name, superClass.name )
80 end
81 @@loaded_plugin_list[ plugin_name.to_sym ] = :MultiPlugin
82 return plugin_object
83 else
84 cdl_error( "P2002 $1: not kind of $2" , plugin_name, superClass.name )
85 return nil
86 end
87 rescue Exception => evar
88 if $debug then
89 p evar.class
90 pp evar.backtrace
91 end
92 cdl_error( "P2003 $1: load failed" , plugin_name )
93 return nil
94 end
95 # ここへは来ない
96 return nil
97 end
98
99 #=== プラグインの gen_cdl_file を呼びして cdl ファイルを生成させ、解釈を行う
100 def generate_and_parse plugin_object
101 if plugin_object == nil # プラグインのロードに失敗している(既にエラー)
102 return
103 end
104 plugin_name = plugin_object.class.name.to_sym
105 if @@loaded_plugin_list[ plugin_name ] == :MultiPlugin then
106 p "#{plugin_name}: MultiPlugin"
107 return
108 elsif @@loaded_plugin_list[ plugin_name ] == nil then
109 #raise "#{plugin_name} might have different name "
110 ## プラグインのファイル名と、プラグインのクラス名が相違する場合
111 #MultiPlugin の get_plugin で返されたケースでは nil になっている
112 @@loaded_plugin_list[ plugin_name ] = 0
113 end
114 count = @@loaded_plugin_list[ plugin_name ]
115 @@loaded_plugin_list[ plugin_name ] += 1
116 tmp_file_name = "#{$gen}/tmp_#{plugin_name}_#{count}.cdl"
117
118 begin
119 tmp_file = CFile.open( tmp_file_name, "w" )
120 rescue Exception => evar
121 cdl_error( "P2004 $1: open error \'$2\'" , plugin_name, tmp_file_name )
122 print_exception( evar )
123 end
124 dbgPrint "generate_and_parse: #{plugin_object.class}: gen_cdl_file\n"
125 begin
126 plugin_object.gen_cdl_file( tmp_file )
127 rescue Exception => evar
128 cdl_error( "P2005 $1: plugin error in gen_through_cell_code " , plugin_name )
129 print_exception( evar )
130 end
131 begin
132 tmp_file.close
133 rescue Exception => evar
134 cdl_error( "P2006 $1: close error \'$2\'" , plugin_name, tmp_file_name )
135 print_exception( evar )
136 end
137
138 generator = Generator.new
139 generator.set_plugin( plugin_object )
140 generator.parse( [ tmp_file_name ] )
141 generator.finalize
142 end
143
144 #=== プラグインが CDL の POST コードを生成
145 # tmp_plugin_post_code.cdl への出力
146 def self.gen_plugin_post_code file
147 dbgPrint "PluginModule #{@@loaded_plugin_list}\n"
148 @@loaded_plugin_list.each{ |plugin_name,count|
149 if count == :MultiPlugin then
150 next
151 end
152 dbgPrint "PluginModule: #{plugin_name}\n"
153 eval_str = "#{plugin_name}.gen_post_code( file )"
154 if $verbose then
155 print "gen_plugin_post_code: #{eval_str}\n"
156 end
157 begin
158 eval( eval_str )
159 rescue Exception => evar
160 Generator.error( "P2007 $1: fail to generate post code" , plugin_name )
161
162 print_exception( evar )
163 end
164 }
165 end
166
167end
Note: See TracBrowser for help on using the repository browser.