source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/OpaqueRPCPlugin.rb@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 11.2 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$
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, next_cell_port_subscript, 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 if @next_cell_port_subscript then
280 subscript = '[' + @next_cell_port_subscript.to_s + ']'
281 else
282 subscript = ""
283 end
284
285 if @serverErrorHandler then
286 serverErrorHandler_str = "#{nest_str} cErrorHandler = #{@serverErrorHandler};\n"
287 else
288 serverErrorHandler_str = ""
289 end
290
291 if @b_genOpener then
292 opener = "#{nest_str} cOpener = #{@serverChannelCell}.eOpener;\n"
293 else
294 opener = ""
295 end
296
297 # サーバー側チャンネル (TINET, Socket など)
298 file.print <<EOT
299
300#{nest_str} // Server Side Channel
301#{nest_str} cell #{@serverChannelCelltype} #{@serverChannelCell}{
302#{nest_str} #{@serverChannelInitializer}
303#{nest_str} };
304EOT
305
306 # サーバー側チャンネル (アンマーシャラ+TDR)
307 file.print <<EOT
308
309#{nest_str} // Unmarshaler
310#{nest_str} cell #{@rpc_server_channel_celltype_name} #{@serverChannelCell}_Unmarshaler {
311#{nest_str} cChannel = #{@serverChannelCell}.eC1;
312#{nest_str} #{@call_port_name} = #{@next_cell.get_namespace_path.get_path_str}.#{@next_cell_port_name}#{subscript};
313#{serverErrorHandler_str}#{nest_str} };
314EOT
315
316 # サーバー側タスクメイン
317 file.print <<EOT
318
319#{nest_str} // Unmarshaler Task Main
320#{nest_str} cell #{@taskMainCelltype} #{@serverChannelCell}_TaskMain {
321#{nest_str} cMain = #{@serverChannelCell}_Unmarshaler.eService;
322#{opener}#{nest_str} };
323EOT
324
325 # サーバー側タスク
326 file.print <<EOT
327
328#{nest_str} // Unmarshaler Task
329#{nest_str} cell #{@taskCelltype} #{@serverChannelCell}_Task {
330#{nest_str} cBody = #{@serverChannelCell}_TaskMain.eMain;
331#{nest_str} priority = #{@taskPriority};
332#{nest_str} stackSize = #{@stackSize};
333#{nest_str} taskAttribute = C_EXP( "TA_ACT" ); /* mikan : marshaler task starts at beginning */
334#{nest_str} };
335EOT
336 @end_region.gen_region_str_post file
337 end
338
339 #=== プラグイン引数 noClientSemaphore のチェック
340 def set_noClientSemaphore rhs
341 rhs = rhs.to_sym
342 if rhs == :true then
343 @b_noClientSemaphore = true
344 elsif rhs == :false then
345 @b_noClientSemaphore = false
346 else
347 cdl_error( "RPCPlugin: specify true or false for noClientSemaphore" )
348 end
349 end
350end
351
352
Note: See TracBrowser for help on using the repository browser.