source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/C2TECSBridgePlugin.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: 7.9 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2015 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#== C => TECS 受け口呼び出しのプラグイン
56class C2TECSBridgePlugin < SignaturePlugin
57#@signature:: Signature プラグインの対象となるシグニチャ
58#@option:: String '"', '"' で囲まれた文字列
59
60 # プラグイン引数名と Proc
61 C2TECSBridgePluginArgProc = {
62 "prefix" => Proc.new { |obj,rhs| obj.set_prefix rhs },
63 "suffix" => Proc.new { |obj,rhs| obj.set_suffix rhs },
64 "header_name" => Proc.new { |obj,rhs| obj.set_header_name rhs },
65 }
66
67
68 @@signature_list = { }
69
70 #signature:: Signature シグニチャ(インスタンス)
71 def initialize( signature, option )
72 super
73
74 @signature = signature
75 @header_name = "#{$gen}/C2TECS_#{@signature.get_global_name}.h"
76 @prefix = ""
77 @suffix = ""
78 @celltype_name = :"t#{@signature.get_global_name}"
79 @plugin_arg_check_proc_tab = C2TECSBridgePluginArgProc
80 parse_plugin_arg
81 end
82
83 def gen_cdl_file file
84 if @@signature_list[ @signature.get_global_name ] then
85 @@signature_list[ @signature.get_global_name ] << self
86 cdl_warning( "C2TW001 signature '$1' duplicate. ignored current one", @signature.get_namespace_path )
87 return
88 end
89
90 @@signature_list[ @signature.get_global_name ] = [ self ]
91 print_msg " C2TECSBridgePlugin: [celltype] C2TECS::#{@celltype_name}. Create cell then join the call port 'cCall' to the target cell\n"
92 file.print <<EOT
93namespace nC2TECS{
94 [singleton, active] // this celltype is not active actually. 'active' is specified to prevent W1002.
95 celltype #{@celltype_name} {
96 call #{@signature.get_namespace_path} cCall;
97 };
98};
99EOT
100 end
101
102 #=== 後ろのコードを生成
103 #プラグインの後ろのコードを生成
104 #file:: File:
105 def self.gen_post_code( file )
106 # 複数のプラグインの post_code が一つのファイルに含まれるため、以下のような見出しをつけること
107 # file.print "/* '#{self.class.name}' post code */\n"
108 end
109
110 #=== 受け口関数の本体(C言語)を生成する
111 # 通常であれば、ジェネレータは受け口関数のテンプレートを生成する
112 # プラグインの場合、変更する必
113要のないセルタイプコードを生成する
114 #file:: FILE 出力å…
115ˆãƒ•ã‚¡ã‚¤ãƒ«
116 #b_singleton:: bool true if singleton
117 #ct_name:: Symbol
118 #global_ct_name:: string
119 #sig_name:: string
120 #ep_name:: string
121 #func_name:: string
122 #func_global_name:: string
123 #func_type:: class derived from Type
124 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 )
125
126 # nothing to do
127
128 end
129
130
131 def gen_postamble( file, b_singleton, ct_name, global_name )
132
133 header_file = open( @header_name, "w" )
134
135 header_comment =<<EOT
136/*
137 * This file was generated by C2TECSBridgePlugin and has prototype
138 * decalarations of functions in signature '#{@signature.get_namespace_path}'
139 */
140
141EOT
142
143 file.print header_comment
144 header_file.print header_comment
145 header_file.print <<EOT
146#ifndef #{@signature.get_global_name}__h
147#define #{@signature.get_global_name}__h
148
149/*
150 * function prototype declarations
151 * signature: '#{@signature.get_namespace_path}'
152 *
153 * These functions can be called from C sources directly.
154 * If function name collides, please consider to specify 'prefix' option for C2TECSBridgePlugin.
155 */
156EOT
157
158 # generate C functions calling function of call port
159 @signature.get_function_head_array.each { |func_head|
160 func_name = func_head.get_name
161 ret_type = func_head.get_return_type
162 params = func_head.get_paramlist.get_items
163
164 # p "celltype_name, sig_name, func_name, func_global_name"
165 # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
166
167 # function header
168 file.print( "#{ret_type.get_type_str}\n" )
169 header_file.printf( "%-16s", ret_type.get_type_str )
170 file.print( "#{@prefix}#{func_name}#{@suffix}(" )
171 header_file.print( "#{@prefix}#{func_name}#{@suffix}(" )
172
173 delim = ""
174 params.each{ |param|
175 file.printf( "#{delim} #{param.get_type.get_type_str} #{param.get_name}#{param.get_type.get_type_str_post}" )
176 header_file.printf( "#{delim} #{param.get_type.get_type_str} #{param.get_name}#{param.get_type.get_type_str_post}" )
177 delim = ","
178 }
179 file.print( " )\n{\n" )
180 header_file.print( " );\n" )
181
182 # call function in call port
183 if ! ret_type.is_void? then
184 file.print( " #{ret_type.get_type_str} retval;\n" )
185 file.print( " retval = " )
186 else
187 file.print( " " )
188 end
189
190 file.print( "cCall_#{func_name}(" )
191
192 delim = ""
193 params.each{ |param|
194 file.printf( "#{delim} #{param.get_name}" )
195 delim = ","
196 }
197 file.print( " );\n" )
198
199 if ! ret_type.is_void? then
200 file.print( " return retval;\n" )
201 end
202 file.print( "}\n\n" )
203 }
204
205 header_file.print <<EOT
206
207#endif /* #{@signature.get_global_name}__h */
208
209EOT
210
211 header_file.close
212 end
213
214 #=== set_prefix - prefix プラグインオプション
215 def set_prefix rhs
216 @prefix = rhs.to_s
217 end
218 #=== set_suffix - suffix プラグインオプション
219 def set_suffix rhs
220 @suffix = rhs.to_s
221 end
222 #=== set_header_name - header_name プラグインオプション
223 def set_header_name rhs
224 @header_name = "#{$gen}/" + rhs.to_s
225 if ! ( @header_name =~ /\.h\Z/ ) then
226 @header_name += ".h"
227 end
228 end
229
230end
231
Note: See TracBrowser for help on using the repository browser.