source: EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/OpaqueRPCPlugin.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.1 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# $Id: OpaqueRPCPlugin.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
53#++
54
55# 以下を仮定(制限事項
56)
57# 呼びå…
58ƒã€å‘¼ã³å…
59ˆã®ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã€char, short, int_t, long_t, intptr_t のサイズが同じ
60# 有符号、無符号でサイズが同じ
61
62require_tecsgen_lib "lib/GenOpaqueMarshaler.rb"
63require_tecsgen_lib "lib/GenParamCopy.rb"
64
65class OpaqueRPCPlugin < ThroughPlugin
66
67 include GenOpaqueMarshaler
68 include GenParamCopy
69
70 # OpaqueRPCPlugin 専用のオプション
71 OpaqueRPCPluginArgProc = RPCPluginArgProc.dup # 複製を作ってå…
72ƒã‚’変更しないようにする
73 OpaqueRPCPluginArgProc[ "noClientSemaphore" ] = Proc.new { |obj,rhs| obj.set_noClientSemaphore rhs }
74
75 #=== RPCPlugin の initialize
76 # 説明は ThroughPlugin (plugin.rb) を参ç…
77§
78 def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, signature, celltype, caller_cell )
79 super
80 @b_noClientSemaphore = false
81 initialize_opaque_marshaler
82
83 @plugin_arg_check_proc_tab = OpaqueRPCPluginArgProc
84 parse_plugin_arg
85 check_opener_code
86 check_PPAllocator
87
88 print "OpaqueRPCPlugin: #{@clientChannelCell}\n"
89
90 @rpc_server_channel_celltype_name = "tOpaqueRPCPlugin_#{@TDRCelltype}_#{@serverChannelCelltype}_#{@signature.get_global_name}"
91 @rpc_server_channel_celltype_file_name = "#{$gen}/#{@rpc_server_channel_celltype_name}.cdl"
92 @rpc_client_channel_celltype_name = "tOpaqueRPCPlugin_#{@TDRCelltype}_#{@clientChannelCelltype}_#{@signature.get_global_name}"
93 @rpc_client_channel_celltype_file_name = "#{$gen}/#{@rpc_client_channel_celltype_name}.cdl"
94 end
95
96 def gen_plugin_decl_code( file )
97
98 gen_marshaler_celltype
99
100 # チャンネル composite セルタイプの生成
101 # ここで生成された CDL ファイルは、tecsgen が直接 import するのではなく
102 # セルコードの CDL から import される
103
104 f = CFile.open( @rpc_client_channel_celltype_file_name, "w" )
105 # 同じ内
106容を二度書く可能性あり (AppFile は不可)
107
108 f.print <<EOT
109import( "#{@marshaler_celltype_file_name}" );
110
111/* RPC Client side composite celltype */
112composite #{@rpc_client_channel_celltype_name} {
113 /* marshaler entry port */
114 entry #{@signature.get_namespace_path} eThroughEntry;
115 call sChannel cChannel;
116 [optional]
117 call sRPCErrorHandler cErrorHandler;
118 [optional]
119 call sSemaphore cLockChannel;
120
121 cell #{@TDRCelltype} TDR {
122 cChannel => composite.cChannel;
123 };
124 cell #{@marshaler_celltype_name} Marshaler{
125 cTDR = TDR.eTDR;
126 cErrorHandler => composite.cErrorHandler;
127 cLockChannel => composite.cLockChannel;
128 };
129
130 composite.eThroughEntry => Marshaler.eClientEntry;
131};
132EOT
133 f.close
134
135 if @PPAllocatorSize then
136 alloc_cell = " cell tPPAllocator PPAllocator {\n heapSize = #{@PPAllocatorSize};\n };\n"
137 alloc_call_port_join = " cPPAllocator = PPAllocator.ePPAllocator;\n"
138 else
139 alloc_cell = ""
140 alloc_call_port_join = ""
141 end
142
143 f = CFile.open( @rpc_server_channel_celltype_file_name, "w" )
144 # 同じ内
145容を二度書く可能性あり (AppFile は不可)
146
147 f.print <<EOT
148import( "#{@marshaler_celltype_file_name}" );
149
150/* RPC Server side composite celltype */
151composite #{@rpc_server_channel_celltype_name} {
152 /* Interface */
153 call #{@signature.get_namespace_path} #{@call_port_name};
154 call sChannel cChannel;
155 [optional]
156 call sRPCErrorHandler cErrorHandler;
157 entry sUnmarshalerMain eService;
158
159 /* Implementation */
160 cell #{@TDRCelltype} TDR {
161 cChannel => composite.cChannel;
162 };
163#{alloc_cell} cell #{@unmarshaler_celltype_name} Unmarshaler{
164 cTDR = TDR.eTDR;
165 cErrorHandler => composite.cErrorHandler;
166 cServerCall => composite.#{@call_port_name};
167#{alloc_call_port_join} };
168 composite.eService => Unmarshaler.eService;
169};
170EOT
171
172 f.close
173 end
174
175 #=== through cell コードを生成
176 #
177 #
178 def gen_through_cell_code( file )
179
180 gen_plugin_decl_code( file )
181
182 # セルを探す
183 # path =["::",@next_cell.get_name] # mikan namespace
184 # cell = Namespace.find( path )
185 cell = Namespace.find( @next_cell.get_namespace_path )
186
187 file.print <<EOT
188import( "#{@rpc_client_channel_celltype_file_name}" );
189import( "#{@rpc_server_channel_celltype_file_name}" );
190
191EOT
192
193 ##### クライアント側のセルの生成 #####
194 nest = @start_region.gen_region_str_pre file
195 nest_str = " " * nest
196
197 # セマフォの生成
198 if @b_noClientSemaphore == false then
199 file.print <<EOT
200
201#{nest_str} // Semaphore for Multi-task use ("specify noClientSemaphore" option to delete this)
202#{nest_str} cell #{@semaphoreCelltype} #{@serverChannelCell}_Semaphore{
203#{nest_str} #{@semaphoreInitializer}
204#{nest_str} };
205EOT
206 end
207
208 # クライアント側チャンネル (TINET, Socket など)の生成
209 file.print <<EOT
210#{nest_str} // Client Side Channel
211#{nest_str} cell #{@clientChannelCelltype} #{@clientChannelCell}{
212#{nest_str} #{@clientChannelInitializer}
213#{nest_str} };
214
215#{nest_str} // Marshaler
216EOT
217
218 # セマフォの結合文
219 if @b_noClientSemaphore == false then
220 semaphore = "#{nest_str} cLockChannel = #{@serverChannelCell}_Semaphore.eSemaphore;\n"
221 else
222 semaphore = ""
223 end
224
225 ### クライアント側チャンネル (マーシャラ+TDR)の生成 ###
226 # アロケータの指定があるか?
227 if cell.get_allocator_list.length > 0 then
228
229 file.print nest_str
230 file.print "[allocator("
231
232 delim = ""
233 cell.get_allocator_list.each do |type, eport, subsc, func, buf, alloc|
234
235 alloc_str = alloc.to_s
236 subst = @substituteAllocator[alloc_str.to_sym]
237 if subst then
238 alloc_str = subst[2]+"."+subst[3]
239 end
240
241 file.print delim
242 delim = ",\n" # 最終行には出さない
243
244 if subsc then # é…
245åˆ—添数
246 subsc_str = '[#{subsc}]'
247 else
248 subsc_str = ""
249 end
250
251 eport = "eThroughEntry" #RPCの受け口名に変更
252 file.print nest_str
253 file.print "#{eport}#{subsc_str}.#{func}.#{buf} = #{alloc_str}"
254 end
255
256 file.puts ")]"
257 end
258
259 if @clientErrorHandler then
260 clientErrorHandler_str = "#{nest_str} cErrorHandler = #{@clientErrorHandler};\n"
261 else
262 clientErrorHandler_str = ""
263 end
264
265 file.print <<EOT
266#{nest_str} cell #{@rpc_client_channel_celltype_name} #{@cell_name} {
267#{nest_str} cChannel = #{@clientChannelCell}.eC0;
268#{clientErrorHandler_str}#{semaphore}#{nest_str} };
269
270EOT
271 ### END: クライアント側チャンネル (マーシャラ+TDR)の生成 ###
272
273 @start_region.gen_region_str_post file
274 file.print "\n\n"
275
276 ##### サーバー側のセルの生成 #####
277 nest = @end_region.gen_region_str_pre file
278 nest_str = " " * nest
279
280 if @serverErrorHandler then
281 serverErrorHandler_str = "#{nest_str} cErrorHandler = #{@serverErrorHandler};\n"
282 else
283 serverErrorHandler_str = ""
284 end
285
286 if @b_genOpener then
287 opener = "#{nest_str} cOpener = #{@serverChannelCell}.eOpener;\n"
288 else
289 opener = ""
290 end
291
292 # サーバー側チャンネル (TINET, Socket など)
293 file.print <<EOT
294
295#{nest_str} // Server Side Channel
296#{nest_str} cell #{@serverChannelCelltype} #{@serverChannelCell}{
297#{nest_str} #{@serverChannelInitializer}
298#{nest_str} };
299EOT
300
301 # サーバー側チャンネル (アンマーシャラ+TDR)
302 file.print <<EOT
303
304#{nest_str} // Unmarshaler
305#{nest_str} cell #{@rpc_server_channel_celltype_name} #{@serverChannelCell}_Unmarshaler {
306#{nest_str} cChannel = #{@serverChannelCell}.eC1;
307#{nest_str} #{@call_port_name} = #{@next_cell.get_namespace_path.get_path_str}.#{@next_cell_port_name};
308#{serverErrorHandler_str}#{nest_str} };
309EOT
310
311 # サーバー側タスクメイン
312 file.print <<EOT
313
314#{nest_str} // Unmarshaler Task Main
315#{nest_str} cell #{@taskMainCelltype} #{@serverChannelCell}_TaskMain {
316#{nest_str} cMain = #{@serverChannelCell}_Unmarshaler.eService;
317#{opener}#{nest_str} };
318EOT
319
320 # サーバー側タスク
321 file.print <<EOT
322
323#{nest_str} // Unmarshaler Task
324#{nest_str} cell #{@taskCelltype} #{@serverChannelCell}_Task {
325#{nest_str} cBody = #{@serverChannelCell}_TaskMain.eMain;
326#{nest_str} priority = #{@taskPriority};
327#{nest_str} stackSize = #{@stackSize};
328#{nest_str} taskAttribute = C_EXP( "TA_ACT" ); /* mikan : marshaler task starts at beginning */
329#{nest_str} };
330EOT
331 @end_region.gen_region_str_post file
332 end
333
334 #=== プラグイン引数 noClientSemaphore のチェック
335 def set_noClientSemaphore rhs
336 rhs = rhs.to_sym
337 if rhs == :true then
338 @b_noClientSemaphore = true
339 elsif rhs == :false then
340 @b_noClientSemaphore = false
341 else
342 cdl_error( "RPCPlugin: specify true or false for noClientSemaphore" )
343 end
344 end
345end
346
347
Note: See TracBrowser for help on using the repository browser.