source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRP2SVCPlugin.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: 15.6 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# mikan through plugin: namespace が考æ…
56®ã•ã‚Œã¦ã„ない
57# これを利用する場合、以下のように toppers_jsp.cdl sChannel.cdl を指定する必
58要がある
59# tecsgen toppers_jsp.cdl sChannel.cdl your_description.cdl
60
61# 以下を仮定(制限事項
62)
63# 呼びå…
64ƒã€å‘¼ã³å…
65ˆã®ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã€char, short, int_t, long_t, intptr_t のサイズが同じ
66# 有符号、無符号でサイズが同じ
67
68class SVCManage
69 # TODO: デフォルトの拡張サービスコール分を予約しておく
70 # デフォルトの拡張サービスコール(syslogなど)もコンポーネント化するまで
71 @@id = 20
72 @@func_ids = {}
73 def self.get_func_id func_name
74 return @@func_ids[ func_name ]
75 end
76 def self.set_func_id func_name
77 @@func_ids[ func_name ] = self.assign_id
78 puts @@func_ids[ func_name ]
79 end
80 def self.include_func_id? func_name
81 return @@func_ids.has_key?( func_name )
82 end
83 def self.get_id
84 return @@id
85 end
86 def self.set_id id
87 @@id = id
88 end
89 def self.assign_id
90 @@id += 1
91 return @@id
92 end
93end
94
95#
96# 拡張サービスコールを用いたドメイン間通信の
97# throughプラグイン
98# HRP2ドメインプラグインによって挿å…
99¥ã•ã‚Œã‚‹
100#
101class HRP2SVCPlugin < ThroughPlugin
102
103 #=== RPCPlugin の initialize
104 # 説明は ThroughPlugin (plugin.rb) を参ç…
105§
106 @@generated_celltype_header = {}
107
108 def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, next_cell_port_subscript, signature, celltype, caller_cell )
109 super
110 @ct_name_body = "#{@ct_name}SVCBody_#{@next_cell.get_name}_#{@next_cell_port_name}".to_sym
111 @ct_name = "#{@ct_name}SVCCaller_#{@next_cell.get_name}_#{@next_cell_port_name}".to_sym
112 @cell_name_body = "#{@cell_name}SVCBody".to_sym
113 @cell_name = "#{@cell_name}SVCCaller".to_sym
114 puts "%%%% "
115 p @next_cell.get_name
116 p @caller_cell.get_name
117 end
118
119 #=== NamespacePath を得る
120 # 生成するセルの namespace path を生成する
121 def get_cell_namespace_path
122# nsp = @region.get_namespace.get_namespace_path
123 nsp = @start_region.get_namespace_path
124 return nsp.append( @cell_name )
125 end
126
127 def gen_plugin_decl_code( file )
128
129 # このセルタイプ(同じシグニチャ)は既に生成されているか?
130 if !HRP2KernelObjectPlugin.include_celltype?(@next_cell.get_celltype)
131 if @@generated_celltype[ @ct_name_body ] == nil then
132 @@generated_celltype[ @ct_name_body ] = [ self ]
133 file2 = CFile.open( "#{$gen}/#{@ct_name_body}.cdl", "w" )
134 file2.print <<EOT
135[active]
136celltype #{@ct_name_body} {
137 call #{@signature.get_name} #{@call_port_name};
138};
139EOT
140 file2.close
141 else
142 @@generated_celltype[ @ct_name_body ] << self
143 end
144 file.print "import( \"#{$gen}/#{@ct_name_body}.cdl\" );\n"
145 end
146
147 # このセルタイプ(同じシグニチャ)は既に生成されているか?
148 if @@generated_celltype[ @ct_name ] == nil then
149 @@generated_celltype[ @ct_name ] = [ self ]
150 file2 = CFile.open( "#{$gen}/#{@ct_name}.cdl", "w" )
151 if !HRP2KernelObjectPlugin.include_celltype?(@next_cell.get_celltype)
152 file2.print <<EOT
153celltype #{@ct_name} {
154 entry #{@signature.get_name} #{@entry_port_name};
155};
156EOT
157 else
158 # TODO inlineにした方が効率がよいが,tecsgenの生成したヘッダファイルの
159 # 読込順のためにエラーとなる
160 file2.print <<EOT
161celltype #{@ct_name} {
162 //[inline] entry #{@signature.get_name} #{@entry_port_name};
163 entry #{@signature.get_name} #{@entry_port_name};
164 call #{@signature.get_name} #{@call_port_name};
165};
166EOT
167 end
168
169 file2.close
170 else
171 @@generated_celltype[ @ct_name ] << self
172 end
173 file.print "import( \"#{$gen}/#{@ct_name}.cdl\" );\n"
174
175=begin
176 # TODO: send. receive 対応
177 send_receive = []
178 if @signature != nil then
179 @signature.each_param{ |fd,param|
180 dir =param.get_direction
181 case dir
182 when :SEND, :RECEIVE
183 send_receive << [ dir, fd, param ]
184 end
185 }
186 end
187=end
188
189=begin
190composite #{@ct_name} {
191 entry #{@signature.get_name} #{@entry_port_name};
192 call #{@signature.get_name} #{@call_port_name};
193
194 cell #{@ct_name}Client #{@cell_name}Client{
195 };
196
197 [active]
198 cell #{@ct_name}Server #{@cell_name}Server{
199 #{@call_port_name} => composite.#{@call_port_name};
200 };
201
202 composite.#{@entry_port_name} => #{@cell_name}.#{@entry_port_name};
203};
204=end
205
206 end
207
208 #=== through cell コードを生成
209 #
210 #
211 def gen_through_cell_code( file )
212 #require "HRP2Cache"
213
214 gen_plugin_decl_code( file )
215
216 if !HRP2KernelObjectPlugin.include_celltype?(@next_cell.get_celltype)
217 # セルを探す
218 # path =["::",@next_cell.get_name] # mikan namespace
219 # cell = Namespace.find( path )
220 # cell = Namespace.find( @next_cell.get_namespace_path )
221
222 ##### クライアント側のセルの生成 #####
223 # file.print "[domain(HRP2, \"trusted\")]"
224 nest = @start_region.gen_region_str_pre file
225 nest_str = " " * nest
226
227 # クライアント側チャンネルの生成
228 # 拡張サービスコール呼出し
229 file.print <<EOT
230#{nest_str} // Client Side Channel
231#{nest_str} cell #{@ct_name} #{@cell_name}{
232#{nest_str} };
233
234EOT
235
236 @start_region.gen_region_str_post file
237 file.print "\n\n"
238
239 ##### サーバー側のセルの生成 #####
240 nest = @end_region.gen_region_str_pre file
241 nest_str = " " * nest
242 if @next_cell_port_subscript then
243 subscript = '[' + @next_cell_port_subscript.to_s + ']'
244 else
245 subscript = ""
246 end
247
248 # サーバー側チャンネルの生成
249 # 拡張サービスコール本体
250 file.print <<EOT
251
252#{nest_str} // Server Side Channel
253#{nest_str} cell #{@ct_name_body} #{@cell_name_body}{
254#{nest_str} #{@call_port_name} = #{@next_cell.get_namespace_path.get_path_str}.#{@next_cell_port_name}#{subscript};
255#{nest_str} };
256EOT
257
258 @end_region.gen_region_str_post file
259
260 file2 = AppFile.open( "#{$gen}/tecsgen.cfg" )
261 file2.print "\n/* Generated by HRP2SVCPlugin */\n\n"
262 file2.print <<EOT
263#include "#{@ct_name_body}_factory.h"
264EOT
265 file2.close
266 else
267
268 ##### クライアント側のセルの生成 #####
269 nest = @start_region.gen_region_str_pre file
270 nest_str = " " * nest
271 if @next_cell_port_subscript then
272 subscript = '[' + @next_cell_port_subscript.to_s + ']'
273 else
274 subscript = ""
275 end
276
277 # クライアント側チャンネルの生成
278 # 拡張サービスコール呼出し
279 file.print <<EOT
280#{nest_str} // Client Side Channel
281#{nest_str} cell #{@ct_name} #{@cell_name}{
282#{nest_str} #{@call_port_name} = #{@next_cell.get_namespace_path.get_path_str}.#{@next_cell_port_name}#{subscript};
283#{nest_str} };
284
285EOT
286
287 @start_region.gen_region_str_post file
288 file.print "\n\n"
289
290 end
291 end
292
293 #=== 受け口関数の本体(C言語)を生成する
294 # 通常であれば、ジェネレータは受け口関数のテンプレートを生成する
295 # プラグインの場合、変更する必
296要のないセルタイプコードを生成する
297 #file:: FILE 出力å…
298ˆãƒ•ã‚¡ã‚¤ãƒ«
299 #b_singleton:: bool true if singleton
300 #ct_name:: Symbol
301 #global_ct_name:: string
302 #sig_name:: string
303 #ep_name:: string
304 #func_name:: string
305 #func_global_name:: string
306 #func_type:: class derived from Type
307 def gen_ep_func_body( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
308 puts "generate ep_func for #{ct_name}"
309
310 if !HRP2KernelObjectPlugin.include_celltype?(@next_cell.get_celltype)
311 # 拡張サービスコール呼出し
312 if ! func_type.get_type.kind_of?( VoidType ) then
313 file.print( " #{func_type.get_type_str} retval;\n" )
314 end
315
316 if ! b_singleton then
317
318 file.print <<EOT
319 #{ct_name}_CB *p_cellcb;
320 if( VALID_IDX( idx ) ){
321 p_cellcb = #{global_ct_name}_GET_CELLCB(idx);
322 }else{
323 /* エラー処理コードをここに記述 */
324 }
325
326EOT
327 end
328
329 # p "celltype_name, sig_name, func_name, func_global_name"
330 # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
331
332 delim = ""
333 if ! func_type.get_type.kind_of?( VoidType ) then
334 file.print( " retval = (#{func_type.get_type_str})" )
335 else
336 file.print( " " )
337 end
338
339 #file.print( "#{@call_port_name}_#{func_name}(" )
340 # svcid = SVCManage.assign_id
341 new_func = false
342 if SVCManage.include_func_id?( "#{@ct_name_body}_#{func_name}" ) == false
343 new_func = true
344 SVCManage.set_func_id( "#{@ct_name_body}_#{func_name}" )
345 end
346 svcid = SVCManage.get_func_id( "#{@ct_name_body}_#{func_name}" )
347 #file.print( "cal_svc( #{@ct_name_body}_#{func_name}" )
348 file.print( "cal_svc( #{svcid.to_s}" )
349
350 # if ( ! b_singleton ) then
351 # file.print( " tecs_this" )
352 # delim = ","
353 # end
354
355 i = 0
356 params.each{ |param|
357 delim = ","
358 file.printf( "#{delim} #{param.get_name}" )
359 i += 1
360 }
361
362 while(i < 5) do
363 delim = ","
364 file.printf( "#{delim} 0" )
365 i += 1
366 end
367
368 file.print( " );\n" )
369
370 if ! func_type.get_type.kind_of?( VoidType ) then
371 file.print( " return retval;\n" )
372 end
373
374 # 拡張サービスコール本体
375 if new_func
376 file2 = AppFile.open( "#{$gen}/#{@ct_name_body}.c" )
377
378# if @@generated_celltype_header[ @ct_name_body ].nil?
379# @@generated_celltype_header[ @ct_name_body ] = true
380# p @@generated_celltype_header[ @ct_name_body ]
381# file2.print <<EOT
382# /*
383# * このファイルは tecsgen により自動生成されました
384# * このファイルを編集して使用することは、意図されていません
385# */
386# /* #[<PREAMBLE>]#
387# * #[<...>]# から #[</...>]# で囲まれたコメントは編集しないでください
388# * tecsmerge によるマージに使用されます
389# *
390# * #[</PREAMBLE>]# */
391#
392# /* プロトタイプ宣言や変数の定義をここに書きます #_PAC_# */
393# #include "#{@ct_name_body}_tecsgen.h"
394#
395# #ifndef E_OK
396# #define E_OK 0 /* success */
397# #define E_ID (-18) /* illegal ID */
398# #endif
399#
400# EOT
401# end
402
403 if func_type.get_type.kind_of?( VoidType ) then
404 retval_assign = ""
405 retval_return = ""
406 else
407 retval_assign = "retval = (ER_UINT)"
408 retval_return = "retval"
409 end
410
411 file2.print <<EOT
412ER_UINT
413#{@ct_name_body}_#{func_name}(intptr_t par1, intptr_t par2, intptr_t par3, intptr_t par4, intptr_t par5, ID cdmid)
414{
415 #{@ct_name_body}_CB *p_cellcb;
416#if 0
417 if( VALID_IDX( idx ) ){
418 p_cellcb = #{@ct_name_body}_GET_CELLCB(idx);
419 }else{
420 /* エラー処理コードをここに記述 */
421 }
422#else
423 p_cellcb = NULL;
424#endif
425
426 ER_UINT retval = 0;
427
428EOT
429
430 num = 1
431 params.each{ |param|
432 if param.get_declarator.get_ptr_level > 0 then
433 if param.get_direction == :IN then
434 file2.print <<EOT
435 if(prb_mem((void *)par#{num.to_s}, sizeof(#{param.get_type.get_type_str}), TSK_SELF, TPM_READ) != E_OK){
436 return E_MACV;
437 }
438EOT
439
440 elsif param.get_direction == :OUT then
441 file2.print <<EOT
442 if(prb_mem((void *)par#{num.to_s}, sizeof(#{param.get_type.get_type_str}), TSK_SELF, TPM_WRITE) != E_OK){
443 return E_MACV;
444 }
445EOT
446
447 end
448 end
449 num += 1
450 }
451
452 file2.print" #{retval_assign}#{@call_port_name}_#{func_name}("
453
454 delim = ""
455 num = 1
456 params.each{ |param|
457 file2.print "#{delim}"
458 delim = ", "
459 file2.print "(#{param.get_type.get_type_str})"
460 file2.print "par" + num.to_s
461 file2.print param.get_type.get_type_str_post
462 num += 1
463 }
464
465 file2.print ");\n"
466
467 if !func_type.get_type.kind_of?( VoidType ) then
468 file2.print "\n return #{retval_return};\n"
469 end
470 file2.print "}\n\n"
471
472 file2.close
473
474 file2 = AppFile.open( "#{$gen}/tecsgen.cfg" )
475 file2.print "\n/* Generated by HRP2SVCPlugin */\n\n"
476 # TODO: スタックサイズは適当
477 file2.print <<EOT
478KERNEL_DOMAIN{
479 DEF_SVC( #{svcid.to_s}, { TA_NULL, #{@ct_name_body}_#{func_name}, 256 } );
480}
481EOT
482 file2.close
483
484 file2 = AppFile.open( "#{$gen}/#{@ct_name_body}_factory.h" )
485 file2.print "\n/* Generated by HRP2SVCPlugin */\n\n"
486 file2.print <<EOT
487extern ER_UINT #{@ct_name_body}_#{func_name}(intptr_t par1, intptr_t par2, intptr_t par3, intptr_t par4, intptr_t par5, ID cdmid);
488EOT
489 file2.close
490 end
491 else
492 # カーネルドメインのセルは特別なことは何もせず,普通に呼び出す
493 super
494 end
495 end
496end
497
498
Note: See TracBrowser for help on using the repository browser.