source: EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRP2RPCPlugin.rb@ 270

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

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 11.5 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2014 by TOPPERS Project
7#--
8# 上記著作権者
9は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11# 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15# スコード中に含まれていること.
16# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17# 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20# 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22# の無保証規定を掲載すること.
23# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24# 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26# と.
27# (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30# 作権表示,この利用条件および下記の無保証規定を掲載すること.
31# (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34# 報告すること.
35# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36# 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40# 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42# å…
43è²¬ã™ã‚‹ã“と.
44#
45# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50# の責任を負わない.
51#
52#++
53
54require_tecsgen_lib "lib/GenHRP2Marshaler.rb"
55
56# require_tecsgen_lib "GenParamCopy.rb"
57
58#= Transparent RPC プラグイン
59# Transparent RPC チャンネルを生成する
60# プラグイン引数は以下の RPCPluginArgProc を参ç…
61§
62
63# mikan through plugin: namespace が考æ…
64®ã•ã‚Œã¦ã„ない
65# これを利用する場合、以下のように toppers_jsp.cdl sChannel.cdl を指定する必
66要がある
67# tecsgen toppers_jsp.cdl sChannel.cdl your_description.cdl
68
69# 以下を仮定(制限事項
70)
71# 呼びå…
72ƒã€å‘¼ã³å…
73ˆã®ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã€char, short, int_t, long_t, intptr_t のサイズが同じ
74# 有符号、無符号でサイズが同じ
75
76#
77# RPCを用いたドメイン間通信の
78# throughプラグイン
79# HRP2ドメインプラグインによって挿å…
80¥ã•ã‚Œã‚‹
81#
82class HRP2RPCPlugin < ThroughPlugin
83
84 include GenTransparentMarshaler
85 # include GenParamCopy
86
87 # RPCPlugin 専用のオプション
88 TransparentRPCPluginArgProc = RPCPluginArgProc.dup # 複製を作ってå…
89ƒã‚’変更しないようにする
90 TransparentRPCPluginArgProc[ "noClientSemaphore" ] = Proc.new { |obj,rhs| obj.set_noClientSemaphore rhs }
91 TransparentRPCPluginArgProc[ "semaphoreCelltype" ] = Proc.new { |obj,rhs| obj.set_semaphoreCelltype rhs }
92
93 #=== RPCPlugin の initialize
94 # 説明は ThroughPlugin (plugin.rb) を参ç…
95§
96 def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, signature, celltype, caller_cell )
97 super
98 @b_noClientSemaphore = false
99 @semaphoreCelltype = "tSemaphore"
100 initialize_transparent_marshaler cell_name
101
102 # オプション:GenTransparentMarshaler 参ç…
103§
104 @plugin_arg_check_proc_tab = TransparentRPCPluginArgProc
105 parse_plugin_arg
106
107 @rpc_channel_celltype_name = "tRPCPlugin_#{@TDRCelltype}_#{@channelCelltype}_#{@signature.get_name}"
108 @rpc_channel_celltype_file_name = "#{$gen}/#{@rpc_channel_celltype_name}.cdl"
109
110 if @signature.need_PPAllocator? then
111 if @PPAllocatorSize == nil then
112 cdl_error( "PPAllocatorSize must be speicified for oneway [in] array" )
113 # @PPAllocatorSize = 0 # 仮に 0 としておく (cdl の構文エラーを避けるため)
114 end
115 end
116
117# @signature.each_param{ |func_decl, param_decl|
118# if func_decl.get_type.is_oneway? then
119# if ( param_decl.get_size || param_decl.get_count ) && param_decl.get_string then
120# cdl_error( "array of string not supported for oneway function in Transparent RPC" ) # mikan 文字列のé…
121åˆ—
122# elsif param_decl.get_string == -1 then
123# cdl_error( "length unspecified string is not permited for oneway function in Transparent RPC" ) # mikan 長さ未指定文字列
124# end
125# end
126# }
127 end
128
129 #=== plugin の宣言コード (celltype の定義) 生成
130 def gen_plugin_decl_code( file )
131
132 ct_name = "#{@ct_name}_#{@channelCelltype}"
133
134 # このセルタイプ(同じシグニチャ)は既に生成されているか?
135 if @@generated_celltype[ ct_name ] == nil then
136 @@generated_celltype[ ct_name ] = [ self ]
137 else
138 @@generated_celltype[ ct_name ] << self
139 return
140 end
141
142 gen_marshaler_celltype
143
144 if @PPAllocatorSize then
145 alloc_cell = " cell tPPAllocator PPAllocator {\n heapSize = #{@PPAllocatorSize};\n };\n"
146 alloc_call_port_join = " cPPAllocator = PPAllocator.ePPAllocator;\n"
147 else
148 alloc_cell = ""
149 alloc_call_port_join = ""
150 end
151
152 if @b_noClientSemaphore == false then
153 semaphore1 = <<EOT
154 // Semaphore for Multi-task use ("specify noClientSemaphore" option to delete this)
155 cell #{@semaphoreCelltype} Semaphore {
156 count = 1;
157 attribute = C_EXP( "TA_NULL" );
158 };
159EOT
160 semaphore2 = " cLockChannel = Semaphore.eSemaphore;\n"
161 else
162 semaphore1 = ""
163 semaphore2 = ""
164 end
165
166 f = CFile.open( @rpc_channel_celltype_file_name, "w" )
167 # 同じ内
168容を二度書く可能性あり (AppFile は不可)
169
170 f.print <<EOT
171import( "#{@marshaler_celltype_file_name}" );
172
173composite #{@rpc_channel_celltype_name}Client {
174 /* Interface */
175 entry #{@signature.get_name} eThroughEntry;
176 //call sTDR cTDR;
177 call sEventflag cEventflag;
178 call sSemaphore cSemaphore;
179 call sMessageBuffer cMessageBuffer;
180
181 /* Implementation */
182#{semaphore1}
183 cell #{@marshaler_celltype_name} #{@signature.get_name}_marshaler{
184 //cTDR => composite.cTDR;
185 cEventflag => composite.cEventflag;
186 cSemaphore => composite.cSemaphore;
187 cMessageBuffer => composite.cMessageBuffer;
188#{semaphore2} };
189 composite.eThroughEntry => #{@signature.get_name}_marshaler.eClientEntry;
190};
191
192[active]
193composite #{@rpc_channel_celltype_name}Server {
194 /* Interface */
195 attr {
196 PRI taskPriority;
197 };
198 call #{@signature.get_name} #{@call_port_name};
199 //call sTDR cTDR;
200 call sEventflag cEventflag;
201 call sSemaphore cSemaphore;
202 call sMessageBuffer cMessageBuffer;
203
204 /* Implementation */
205#{alloc_cell} cell #{@unmarshaler_celltype_name} #{@signature.get_name}_unmarshaler{
206 //cTDR => composite.cTDR;
207 cEventflag => composite.cEventflag;
208 cSemaphore => composite.cSemaphore;
209 cMessageBuffer => composite.cMessageBuffer;
210 cServerCall => composite.#{@call_port_name};
211#{alloc_call_port_join} };
212 cell tRPCDedicatedTaskMain RPCTaskMain{
213 cMain = #{@signature.get_name}_unmarshaler.eUnmarshalAndCallFunction;
214 };
215 cell tTask Task {
216 cBody = RPCTaskMain.eMain;
217 priority = taskPriority;
218 taskAttribute = C_EXP( "TA_ACT" ); /* mikan : marshaler starts at the beginning */
219 //stackSize = 4096;
220 userStackSize = 4096;
221 };
222};
223EOT
224 # mikan stackSize option & 最新 tecs_package 対応
225
226 f.close
227 end
228
229 #=== through cell コードを生成
230 #
231 #
232 def gen_through_cell_code( file )
233
234 gen_plugin_decl_code( file )
235
236 # セルを探す
237 # path =["::",@next_cell.get_name]
238 # cell = Namespace.find( path )
239 cell = Namespace.find( @next_cell.get_namespace_path )
240
241 file.print <<EOT
242import( "#{@rpc_channel_celltype_file_name}" );
243EOT
244
245 #nest = @end_region.gen_region_str_pre file
246 indent_str = ""
247
248 file.print <<EOT
249#{indent_str}// one way channel cell
250#{indent_str}cell #{@channelCelltype} #{@channelCellName} {
251#{indent_str}};
252
253#{indent_str}// RPC channel cell
254EOT
255
256 nest = @start_region.gen_region_str_pre file
257 indent_str = " " * nest
258
259 # #473 が解決された場合、composite リレーアロケータに変更すべき
260 # アロケータの指定があるか?
261 if cell.get_allocator_list.length > 0 then
262
263 dbgPrint "make allocator"
264 file.print "#{indent_str}[allocator("
265
266 delim = ""
267 cell.get_allocator_list.each do |type, eport, subsc, func, buf, alloc|
268
269 file.print delim
270 delim = ",\n#{indent_str} " # 最終行には出さない
271
272 if subsc then # é…
273åˆ—添数
274 subsc_str = '[#{subsc}]'
275 else
276 subsc_str = ""
277 end
278
279 eport = "eThroughEntry" #RPCの受け口名に変更
280 file.print "#{eport}#{subsc_str}.#{func}.#{buf} = #{alloc}"
281 end
282
283 file.puts ")]"
284 end
285
286 file.print <<EOT
287#{indent_str}cell #{@rpc_channel_celltype_name}Client #{@cell_name} {
288#{indent_str} //cTDR = #{@channelCellName}.eTDR;
289#{indent_str} cEventflag = #{@channelCellName}.eEventflag;
290#{indent_str} cSemaphore = #{@channelCellName}.eSemaphore;
291#{indent_str} cMessageBuffer = #{@channelCellName}.eMessageBuffer;
292#{indent_str}};
293EOT
294
295 @start_region.gen_region_str_post file
296
297 nest = @end_region.gen_region_str_pre file
298 indent_str = " " * nest
299
300 file.print <<EOT
301#{indent_str}cell #{@rpc_channel_celltype_name}Server #{@cell_name}Body {
302#{indent_str} #{@call_port_name} = #{@next_cell.get_namespace_path.get_path_str}.#{@next_cell_port_name};
303//#{indent_str} #{@call_port_name} = #{@next_cell.get_name}.#{@next_cell_port_name};
304#{indent_str} //cTDR = #{@channelCellName}.eTDR;
305#{indent_str} cEventflag = #{@channelCellName}.eEventflag;
306#{indent_str} cSemaphore = #{@channelCellName}.eSemaphore;
307#{indent_str} cMessageBuffer = #{@channelCellName}.eMessageBuffer;
308#{indent_str} taskPriority = #{@task_priority};
309#{indent_str}};
310EOT
311
312 @end_region.gen_region_str_post file
313 end
314
315
316 #=== プラグイン引数 noClientSemaphore のチェック
317 def set_noClientSemaphore rhs
318 rhs = rhs.to_sym
319 if rhs == :true then
320 @b_noClientSemaphore = true
321 elsif rhs == :false then
322 @b_noClientSemaphore = false
323 else
324 cdl_error( "RPCPlugin: specify true or false for noClientSemaphore" )
325 end
326 end
327
328 #=== プラグイン引数 semaphoreCelltype のチェック
329 def set_semaphoreCelltype rhs
330 @semaphoreCelltype = rhs.to_sym
331 nsp = NamespacePath.analyze( @semaphoreCelltype.to_s )
332 obj = Namespace.find( nsp )
333 if ! obj.instance_of?( Celltype ) && ! obj.instance_of?( CompositeCelltype ) then
334 cdl_error( "RPCPlugin: semaphoreCelltype '#{rhs}' not celltype or not defined" )
335 end
336 end
337
338 #=== NamespacePath を得る
339 # 生成するセルの namespace path を生成する
340 def get_cell_namespace_path
341# nsp = @region.get_namespace.get_namespace_path
342 nsp = @start_region.get_namespace_path
343 return nsp.append( @cell_name )
344 end
345
346end
347
348
Note: See TracBrowser for help on using the repository browser.