source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/RPCPlugin.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: 10.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$
53#++
54
55require_tecsgen_lib "lib/GenTransparentMarshaler.rb"
56require_tecsgen_lib "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
76class RPCPlugin < ThroughPlugin
77
78 include GenTransparentMarshaler
79 include GenParamCopy
80
81 # RPCPlugin 専用のオプション
82 TransparentRPCPluginArgProc = RPCPluginArgProc.dup # 複製を作ってå…
83ƒã‚’変更しないようにする
84 TransparentRPCPluginArgProc[ "noClientSemaphore" ] = Proc.new { |obj,rhs| obj.set_noClientSemaphore rhs }
85 TransparentRPCPluginArgProc[ "semaphoreCelltype" ] = Proc.new { |obj,rhs| obj.set_semaphoreCelltype rhs }
86
87 #=== RPCPlugin の initialize
88 # 説明は ThroughPlugin (plugin.rb) を参ç…
89§
90 def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, next_cell_port_subscript, signature, celltype, caller_cell )
91 super
92 @b_noClientSemaphore = false
93 @semaphoreCelltype = "tSemaphore"
94 initialize_transparent_marshaler cell_name
95
96 # オプション:GenTransparentMarshaler 参ç…
97§
98 @plugin_arg_check_proc_tab = TransparentRPCPluginArgProc
99 parse_plugin_arg
100
101 @rpc_channel_celltype_name = "tRPCPlugin_#{@TDRCelltype}_#{@channelCelltype}_#{@signature.get_global_name}"
102 @rpc_channel_celltype_file_name = "#{$gen}/#{@rpc_channel_celltype_name}.cdl"
103
104 if @signature.need_PPAllocator? then
105 if @PPAllocatorSize == nil then
106 cdl_error( "PPAllocatorSize must be speicified for oneway [in] array" )
107 # @PPAllocatorSize = 0 # 仮に 0 としておく (cdl の構文エラーを避けるため)
108 end
109 end
110
111# @signature.each_param{ |func_decl, param_decl|
112# if func_decl.get_type.is_oneway? then
113# if ( param_decl.get_size || param_decl.get_count ) && param_decl.get_string then
114# cdl_error( "array of string not supported for oneway function in Transparent RPC" ) # mikan 文字列のé…
115åˆ—
116# elsif param_decl.get_string == -1 then
117# cdl_error( "length unspecified string is not permited for oneway function in Transparent RPC" ) # mikan 長さ未指定文字列
118# end
119# end
120# }
121 end
122
123 #=== plugin の宣言コード (celltype の定義) 生成
124 def gen_plugin_decl_code( file )
125
126 ct_name = "#{@ct_name}_#{@channelCelltype}"
127
128 # このセルタイプ(同じシグニチャ)は既に生成されているか?
129 if @@generated_celltype[ ct_name ] == nil then
130 @@generated_celltype[ ct_name ] = [ self ]
131 else
132 @@generated_celltype[ ct_name ] << self
133 return
134 end
135
136 gen_marshaler_celltype
137
138 if @PPAllocatorSize then
139 alloc_cell = " cell tPPAllocator PPAllocator {\n heapSize = #{@PPAllocatorSize};\n };\n"
140 alloc_call_port_join = " cPPAllocator = PPAllocator.ePPAllocator;\n"
141 else
142 alloc_cell = ""
143 alloc_call_port_join = ""
144 end
145
146 if @b_noClientSemaphore == false then
147 semaphore1 = <<EOT
148 // Semaphore for Multi-task use ("specify noClientSemaphore" option to delete this)
149 cell #{@semaphoreCelltype} Semaphore {
150 count = 1;
151 attribute = C_EXP( "TA_NULL" );
152 };
153EOT
154 semaphore2 = " cLockChannel = Semaphore.eSemaphore;\n"
155 else
156 semaphore1 = ""
157 semaphore2 = ""
158 end
159
160 f = CFile.open( @rpc_channel_celltype_file_name, "w" )
161 # 同じ内
162容を二度書く可能性あり (AppFile は不可)
163
164 f.print <<EOT
165import( "#{@marshaler_celltype_file_name}" );
166
167[active]
168composite #{@rpc_channel_celltype_name} {
169 /* Interface */
170 attr {
171 PRI taskPriority;
172 };
173 call #{@signature.get_namespace_path} #{@call_port_name};
174 entry #{@signature.get_namespace_path} eThroughEntry;
175 call sTDR cTDR;
176 call sEventflag cEventflag;
177
178 /* Implementation */
179#{semaphore1}
180 cell #{@marshaler_celltype_name} #{@signature.get_global_name}_marshaler{
181 cTDR => composite.cTDR;
182 cEventflag => composite.cEventflag;
183#{semaphore2} };
184#{alloc_cell} cell #{@unmarshaler_celltype_name} #{@signature.get_global_name}_unmarshaler{
185 cTDR => composite.cTDR;
186 cEventflag => composite.cEventflag;
187 cServerCall => composite.#{@call_port_name};
188#{alloc_call_port_join} };
189 cell tRPCDedicatedTaskMain RPCTaskMain{
190 cMain = #{@signature.get_global_name}_unmarshaler.eUnmarshalAndCallFunction;
191 };
192 cell tTask Task {
193 cBody = RPCTaskMain.eMain;
194 priority = taskPriority;
195 taskAttribute = C_EXP( "TA_ACT" ); /* mikan : marshaler starts at the beginning */
196 stackSize = 4096;
197 };
198 composite.eThroughEntry => #{@signature.get_global_name}_marshaler.eClientEntry;
199};
200EOT
201 # mikan stackSize option & 最新 tecs_package 対応
202
203 f.close
204 end
205
206 #=== through cell コードを生成
207 #
208 #
209 def gen_through_cell_code( file )
210
211 gen_plugin_decl_code( file )
212
213 # セルを探す
214 # path =["::",@next_cell.get_global_name]
215 # cell = Namespace.find( path )
216 cell = Namespace.find( @next_cell.get_namespace_path )
217
218 file.print <<EOT
219import( "#{@rpc_channel_celltype_file_name}" );
220
221EOT
222
223 nest = @region.gen_region_str_pre file
224 indent_str = " " * nest
225 if @next_cell_port_subscript then
226 subscript = '[' + @next_cell_port_subscript.to_s + ']'
227 else
228 subscript = ""
229 end
230
231 file.print <<EOT
232#{indent_str}// 一方向チャンネルセル
233#{indent_str}cell #{@channelCelltype} #{@channelCellName} {
234#{indent_str}};
235
236#{indent_str}// RPC チャンネルセル
237EOT
238
239 # #473 が解決された場合、composite リレーアロケータに変更すべき
240 # アロケータの指定があるか?
241 if cell.get_allocator_list.length > 0 then
242
243 file.print "#{indent_str}[allocator("
244
245 delim = ""
246 cell.get_allocator_list.each do |type, eport, subsc, func, buf, alloc|
247
248 file.print delim
249 delim = ",\n#{indent_str} " # 最終行には出さない
250
251 if subsc then # é…
252åˆ—添数
253 subsc_str = '[#{subsc}]'
254 else
255 subsc_str = ""
256 end
257
258 eport = "eThroughEntry" #RPCの受け口名に変更
259 file.print "#{eport}#{subsc_str}.#{func}.#{buf} = #{alloc}"
260 end
261
262 file.puts ")]"
263 end
264
265 file.print <<EOT
266#{indent_str}cell #{@rpc_channel_celltype_name} #{@cell_name} {
267#{indent_str} #{@call_port_name} = #{@next_cell.get_name}.#{@next_cell_port_name}#{subscript};
268#{indent_str} cTDR = #{@channelCellName}.eTDR;
269#{indent_str} cEventflag = #{@channelCellName}.eEventflag;
270#{indent_str} taskPriority = #{@task_priority};
271#{indent_str}};
272EOT
273 @region.gen_region_str_post file
274 end
275
276
277 #=== プラグイン引数 noClientSemaphore のチェック
278 def set_noClientSemaphore rhs
279 rhs = rhs.to_sym
280 if rhs == :true then
281 @b_noClientSemaphore = true
282 elsif rhs == :false then
283 @b_noClientSemaphore = false
284 else
285 cdl_error( "RPCPlugin: specify true or false for noClientSemaphore" )
286 end
287 end
288
289 #=== プラグイン引数 semaphoreCelltype のチェック
290 def set_semaphoreCelltype rhs
291 @semaphoreCelltype = rhs.to_sym
292 nsp = NamespacePath.analyze( @semaphoreCelltype.to_s )
293 obj = Namespace.find( nsp )
294 if ! obj.instance_of?( Celltype ) && ! obj.instance_of?( CompositeCelltype ) then
295 cdl_error( "RPCPlugin: semaphoreCelltype '#{rhs}' not celltype or not defined" )
296 end
297 end
298end
299
300
Note: See TracBrowser for help on using the repository browser.