source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/C2TECSBridgePlugin.rb@ 389

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

ビルドが通るよう更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
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# 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10# 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13# スコード中に含まれていること.
14# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17# の無保証規定を掲載すること.
18# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20# と.
21# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22# 作権表示,この利用条件および下記の無保証規定を掲載すること.
23# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24# 報告すること.
25# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28# 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29# 免責すること.
30#
31# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35# の責任を負わない.
36#
37# $Id$
38#++
39
40#== C => TECS 受け口呼び出しのプラグイン
41class C2TECSBridgePlugin < SignaturePlugin
42#@signature:: Signature プラグインの対象となるシグニチャ
43#@option:: String '"', '"' で囲まれた文字列
44
45 # プラグイン引数名と Proc
46 C2TECSBridgePluginArgProc = {
47 "prefix" => Proc.new { |obj,rhs| obj.set_prefix rhs },
48 "suffix" => Proc.new { |obj,rhs| obj.set_suffix rhs },
49 "header_name" => Proc.new { |obj,rhs| obj.set_header_name rhs },
50 }
51
52
53 @@signature_list = { }
54
55 #signature:: Signature シグニチャ(インスタンス)
56 def initialize( signature, option )
57 super
58
59 @signature = signature
60 @header_name = "#{$gen}/C2TECS_#{@signature.get_global_name}.h"
61 @prefix = ""
62 @suffix = ""
63 @celltype_name = :"t#{@signature.get_global_name}"
64 @plugin_arg_check_proc_tab = C2TECSBridgePluginArgProc
65 parse_plugin_arg
66 end
67
68 def gen_cdl_file file
69 if @@signature_list[ @signature.get_global_name ] then
70 @@signature_list[ @signature.get_global_name ] << self
71 cdl_warning( "C2TW001 signature '$1' duplicate. ignored current one", @signature.get_namespace_path )
72 return
73 end
74
75 @@signature_list[ @signature.get_global_name ] = [ self ]
76 print_msg " C2TECSBridgePlugin: [celltype] C2TECS::#{@celltype_name}. Create cell then join the call port 'cCall' to the target cell\n"
77 file.print <<EOT
78namespace nC2TECS{
79 [singleton, active] // this celltype is not active actually. 'active' is specified to prevent W1002.
80 celltype #{@celltype_name} {
81 call #{@signature.get_namespace_path} cCall;
82 };
83};
84EOT
85 end
86
87 #=== 後ろのコードを生成
88 #プラグインの後ろのコードを生成
89 #file:: File:
90 def self.gen_post_code( file )
91 # 複数のプラグインの post_code が一つのファイルに含まれるため、以下のような見出しをつけること
92 # file.print "/* '#{self.class.name}' post code */\n"
93 end
94
95 #=== 受け口関数の本体(C言語)を生成する
96 # 通常であれば、ジェネレータは受け口関数のテンプレートを生成する
97 # プラグインの場合、変更する必要のないセルタイプコードを生成する
98 #file:: FILE 出力先ファイル
99 #b_singleton:: bool true if singleton
100 #ct_name:: Symbol
101 #global_ct_name:: string
102 #sig_name:: string
103 #ep_name:: string
104 #func_name:: string
105 #func_global_name:: string
106 #func_type:: class derived from Type
107 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 )
108
109 # nothing to do
110
111 end
112
113
114 def gen_postamble( file, b_singleton, ct_name, global_name )
115
116 header_file = open( @header_name, "w" )
117
118 header_comment =<<EOT
119/*
120 * This file was generated by C2TECSBridgePlugin and has prototype
121 * decalarations of functions in signature '#{@signature.get_namespace_path}'
122 */
123
124EOT
125
126 file.print header_comment
127 header_file.print header_comment
128 header_file.print <<EOT
129#ifndef #{@signature.get_global_name}__h
130#define #{@signature.get_global_name}__h
131
132/*
133 * function prototype declarations
134 * signature: '#{@signature.get_namespace_path}'
135 *
136 * These functions can be called from C sources directly.
137 * If function name collides, please consider to specify 'prefix' option for C2TECSBridgePlugin.
138 */
139EOT
140
141 # generate C functions calling function of call port
142 @signature.get_function_head_array.each { |func_head|
143 func_name = func_head.get_name
144 ret_type = func_head.get_return_type
145 params = func_head.get_paramlist.get_items
146
147 # p "celltype_name, sig_name, func_name, func_global_name"
148 # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
149
150 # function header
151 file.print( "#{ret_type.get_type_str}\n" )
152 header_file.printf( "%-16s", ret_type.get_type_str )
153 file.print( "#{@prefix}#{func_name}#{@suffix}(" )
154 header_file.print( "#{@prefix}#{func_name}#{@suffix}(" )
155
156 delim = ""
157 params.each{ |param|
158 file.printf( "#{delim} #{param.get_type.get_type_str} #{param.get_name}#{param.get_type.get_type_str_post}" )
159 header_file.printf( "#{delim} #{param.get_type.get_type_str} #{param.get_name}#{param.get_type.get_type_str_post}" )
160 delim = ","
161 }
162 file.print( " )\n{\n" )
163 header_file.print( " );\n" )
164
165 # call function in call port
166 if ! ret_type.is_void? then
167 file.print( " #{ret_type.get_type_str} retval;\n" )
168 file.print( " retval = " )
169 else
170 file.print( " " )
171 end
172
173 file.print( "cCall_#{func_name}(" )
174
175 delim = ""
176 params.each{ |param|
177 file.printf( "#{delim} #{param.get_name}" )
178 delim = ","
179 }
180 file.print( " );\n" )
181
182 if ! ret_type.is_void? then
183 file.print( " return retval;\n" )
184 end
185 file.print( "}\n\n" )
186 }
187
188 header_file.print <<EOT
189
190#endif /* #{@signature.get_global_name}__h */
191
192EOT
193
194 header_file.close
195 end
196
197 #=== set_prefix - prefix プラグインオプション
198 def set_prefix rhs
199 @prefix = rhs.to_s
200 end
201 #=== set_suffix - suffix プラグインオプション
202 def set_suffix rhs
203 @suffix = rhs.to_s
204 end
205 #=== set_header_name - header_name プラグインオプション
206 def set_header_name rhs
207 @header_name = "#{$gen}/" + rhs.to_s
208 if ! ( @header_name =~ /\.h\Z/ ) then
209 @header_name += ".h"
210 end
211 end
212
213end
214
Note: See TracBrowser for help on using the repository browser.