source: atk2-sc3-1.4.0-ntisr/kernel/ioc.tf

Last change on this file was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

File size: 26.8 KB
Line 
1$
2$ TOPPERS ATK2
3$ Toyohashi Open Platform for Embedded Real-Time Systems
4$ Automotive Kernel Version 2
5$
6$ Copyright (C) 2012-2015 by Center for Embedded Computing Systems
7$ Graduate School of Information Science, Nagoya Univ., JAPAN
8$ Copyright (C) 2012-2015 by FUJI SOFT INCORPORATED, JAPAN
9$ Copyright (C) 2012-2013 by Spansion LLC, USA
10$ Copyright (C) 2012-2015 by NEC Communication Systems, Ltd., JAPAN
11$ Copyright (C) 2012-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12$ Copyright (C) 2012-2014 by Renesas Electronics Corporation, JAPAN
13$ Copyright (C) 2012-2015 by Sunny Giken Inc., JAPAN
14$ Copyright (C) 2012-2015 by TOSHIBA CORPORATION, JAPAN
15$ Copyright (C) 2012-2015 by Witz Corporation
16$ Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
17$ Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
18$ Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
19$ Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
20$
21$ 上記著作権者
22は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
23$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
24$ 変・再é…
25å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
26$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
27$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
28$ スコード中に含まれていること.
29$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
30$ 用できる形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
33$ 者
34マニュアルなど)に,上記の著作権表示,この利用条件および下記
35$ の無保証規定を掲載すること.
36$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
37$ 用できない形で再é…
38å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
39$ と.
40$ (a) 再é…
41å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
42マニュアルなど)に,上記の著
43$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
44$ (b) 再é…
45å¸ƒã®å½¢æ…
46‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
47$ 報告すること.
48$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
49$ 害からも,上記著作権者
50およびTOPPERSプロジェクトをå…
51è²¬ã™ã‚‹ã“と.
52$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
53$ 由に基づく請求からも,上記著作権者
54およびTOPPERSプロジェクトを
55$ å…
56è²¬ã™ã‚‹ã“と.
57$
58$ 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
59$ 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
60$ はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
61$ 用する者
62に対して,AUTOSARパートナーになることを求めている.
63$
64$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者
65お
66$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
67$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
68$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
69$ の責任を負わない.
70$
71$ $Id: ioc.tf 425 2015-12-07 08:06:19Z witz-itoyo $
72$
73
74$ =====================================================================
75$ IMPLEMENTATION_DATA_TYPE.CATEGORYの値を返す関数
76$ ARGV[1] = IMPLEMENTATION_DATA_TYPE.SHORT_NAME_PATH
77$ =====================================================================
78
79$FUNCTION GET_CATEGORY$
80 $datatypeid = 0$
81 $datatypecategory = "NULL"$
82
83 $FOREACH shortnamepath IMPLEMENTATION_DATA_TYPE.SHORT_NAME_PATH.ID_LIST$
84 $IF EQ(shortnamepath , ARGV[1]) && LENGTH(IMPLEMENTATION_DATA_TYPE.CATEGORY[datatypeid])$
85 $datatypecategory = IMPLEMENTATION_DATA_TYPE.CATEGORY[datatypeid]$
86 $END$
87 $datatypeid = datatypeid + 1$
88 $END$
89
90$ // 一致するCATEGORYが存在しないとエラー
91 $IF EQ(datatypecategory, "NULL")$
92 $ERROR ARGV[2]$$FORMAT(_("CATEGORY(%1%) is not defined"), ARGV[1])$$END$
93 $END$
94
95 $RESULT = datatypecategory$
96$END$
97
98$ =====================================================================
99$ IMPLEMENTATION_DATA_TYPE.SHORT_NAMEの値を返す関数
100$ ARGV[1] = IMPLEMENTATION_DATA_TYPE.SHORT_NAME_PATH
101$ =====================================================================
102
103$FUNCTION GET_SHORT_NAME$
104 $datatypeid = 0$
105 $datatypeshortname = "NULL"$
106
107 $FOREACH shortnamepath IMPLEMENTATION_DATA_TYPE.SHORT_NAME_PATH.ID_LIST$
108 $IF EQ(shortnamepath , ARGV[1])$
109 $datatypeshortname = IMPLEMENTATION_DATA_TYPE.SHORT_NAME[datatypeid]$
110 $END$
111 $datatypeid = datatypeid + 1$
112 $END$
113
114$ // 一致するIMPLEMENTATION_DATA_TYPEが存在しないとエラー
115 $IF EQ(datatypeshortname, "NULL")$
116 $ERROR ARGV[2]$$FORMAT(_("%1% is not defined"), ARGV[1])$$END$
117 $END$
118
119 $RESULT = datatypeshortname$
120$END$
121
122$ =====================================================================
123$ IOCのエラーチェックと内
124部データの生成
125$ =====================================================================
126$TRACE("IOC CHECK")$
127
128$
129$ IOCのOS内
130部で用いるIDを割り当てる
131$ キューあり通信からIDを割り当てる
132$
133$i = 0$
134$tnum_queioc = 0$
135$new_id_list = {}$
136$FOREACH iocid IOC.ID_LIST$
137 $IF !EQ(IOC.BUFLEN[iocid] ,"NULL")$
138 $IOC.ID[iocid] = i$
139 $i = i + 1$
140 $tnum_queioc = tnum_queioc + 1$
141 $new_id_list = APPEND(new_id_list, iocid)$
142 $END$
143$END$
144$FOREACH iocid IOC.ID_LIST$
145 $IF EQ(IOC.BUFLEN[iocid] ,"NULL")$
146 $IOC.ID[iocid] = i$
147 $i = i + 1$
148 $new_id_list = APPEND(new_id_list, iocid)$
149 $END$
150$END$
151$IOC.ID_LIST = new_id_list$
152
153$
154$ IOCとIOCDATAの関連付け
155$
156$ IOCDATA.IOCからIOC.IOCDATA_LISTの作成
157$FOREACH iocdataid IOCDATA.ID_LIST$
158 $iocid = IOCDATA.IOC[iocdataid]$
159 $IOC.IOCDATA_LIST[iocid] = APPEND(IOC.IOCDATA_LIST[iocid], VALUE(IOCDATA.ID_LIST[iocdataid], iocdataid))$
160$END$
161
162$
163$ IOCとIOCSNDの関連付け
164$
165$ IOCSND.IOCからIOC.IOCSND_LISTの作成
166$FOREACH iocsndid IOCSND.ID_LIST$
167 $iocid = IOCSND.IOC[iocsndid]$
168 $IOC.IOCSND_LIST[iocid] = APPEND(IOC.IOCSND_LIST[iocid], VALUE(IOCSND.ID_LIST[iocsndid], iocsndid))$
169$END$
170
171
172$
173$ IOCとIOCRCVの関連付け
174$
175$ IOCRCV.IOCからIOC.IOCRCV_LISTの作成
176$FOREACH iocrcvid IOCRCV.ID_LIST$
177 $iocid = IOCRCV.IOC[iocrcvid]$
178 $IOC.IOCRCV[iocid] = APPEND(IOC.IOCRCV[iocid], VALUE(IOCRCV.ID_LIST[iocrcvid], iocrcvid))$
179$END$
180
181
182$
183$ エラーチェック
184$
185$FOREACH iocid IOC.ID_LIST$
186$ // buflenに0を指定していないか
187 $IF IOC.BUFLEN[iocid] == 0 && !EQ(IOC.BUFLEN[iocid], "NULL")$
188 $ERROR IOC.TEXT_LINE[iocid]$$FORMAT(_("illegal %1% `%2%\'. Do not specify `0\'" ), "buflen", IOC.BUFLEN[iocid])$$END$
189 $END$
190
191$ // グループ通信の場合,indexで0が定義されていか.また,indexが省略されていないか
192 $IF LENGTH(IOC.IOCDATA_LIST[iocid]) > 1$
193 $FOREACH iocdataid IOC.IOCDATA_LIST[iocid]$
194 $IF EQ(IOCDATA.INDEX[iocdataid], "NULL")$
195 $ERROR IOCDATA.TEXT_LINE[iocdataid]$$FORMAT(_("illegal %1% `%2%\' if Group communication"), "index", IOCDATA.INDEX[iocdataid])$$END$
196 $END$
197 $END$
198 $END$
199
200$ // 1:1通信の場合,OsIocSenderPropertiesのsenderidがNULL以外ではないか
201 $IF LENGTH(IOC.IOCSND_LIST[iocid]) == 1$
202 $FOREACH iocsndid IOC.IOCSND_LIST[iocid]$
203 $IF !EQ(IOCSND.SENDERID[iocsndid], "NULL")$
204 $ERROR IOCSND.TEXT_LINE[iocsndid]$$FORMAT(_("illegal %1% `%2%\' if 1:1 communication"), "senderid", IOCSND.SENDERID[iocsndid])$$END$
205 $END$
206 $END$
207 $END$
208
209$ // N:1通信の場合,OsIocSenderPropertiesのsenderidが省略されていないか
210 $IF LENGTH(IOC.IOCSND_LIST[iocid]) > 1$
211 $FOREACH iocsndid IOC.IOCSND_LIST[iocid]$
212 $IF EQ(IOCSND.SENDERID[iocsndid], "NULL")$
213 $ERROR IOCSND.TEXT_LINE[iocsndid]$$FORMAT(_("illegal %1% `%2%\' if N:1 communication"), "senderid", IOCSND.SENDERID[iocsndid])$$END$
214 $END$
215 $END$
216 $END$
217
218$ // キュー無し通信の場合,初期化値を指定しているか
219 $IF IOC.ID[iocid] >= tnum_queioc$
220 $IF EQ(IOCDATA.INITVAL[IOC.IOCDATA_LIST[iocid]], "NULL")$
221 $ERROR IOC.TEXT_LINE[iocid]$$FORMAT(_("illegal %1% `%2%\' in case of using unqueued" ), "initval", IOCDATA.INITVAL[IOC.IOCDATA_LIST[iocid]])$$END$
222 $END$
223 $END$
224
225$ //1:1通信の場合,センダとレシーバが同一OSAPに所属していないか
226 $iocsnd = IOC.IOCSND_LIST[iocid]$
227 $IF LENGTH(IOC.IOCSND_LIST[iocid]) == 1$
228 $IF EQ(IOCSND.OSAPID[iocsnd], IOCRCV.OSAPID[IOC.IOCRCV[iocid]])$
229 $ERROR IOC.TEXT_LINE[iocsndid]$$FORMAT(_("Sender and receiver are refferenced the same osap `%1%`"), IOCSND.OSAPID[iocsnd])$$END$
230 $END$
231 $END$
232$END$
233
234$FOREACH iocsndid IOC.IOCSND_LIST$
235$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)以外はエラー
236 $IF !EQ(IOCSND.IMPLKIND[iocsndid], "FUNCTION")
237 && !EQ(IOCSND.IMPLKIND[iocsndid], "DO_NOT_CARE")
238 && !EQ(IOCSND.IMPLKIND[iocsndid], "NULL")
239 && !EQ(IOCSND.IMPLKIND[iocsndid], "MACRO")$
240 $ERROR IOCSND.TEXT_LINE[iocsndid]$$FORMAT(_("illegal %1% `%2%\'. Do not specify anything other than `FUNCTION\', `MACRO\', `DO_NOT_CARE\' and omission"), "implkind", IOCSND.IMPLKIND[iocsnd])$$END$
241 $END$
242$END$
243
244
245$
246$ グループ通信となるIOC.IOCDATA_LISTをIOCDATA.INDEXの順にソート
247$
248$FOREACH iocid IOC.ID_LIST$
249 $IF LENGTH(IOC.IOCDATA_LIST[iocid]) > 1$
250 $find = 0$
251 $new_list = {}$
252 $FOREACH index RANGE(0, LENGTH(IOC.IOCDATA_LIST[iocid])-1)$
253 $FOREACH iocdataid IOC.IOCDATA_LIST[iocid]$
254 $IF IOCDATA.INDEX[iocdataid] == index$
255 $new_list = APPEND(new_list, iocdataid)$
256 $find = find + 1$
257 $END$
258 $END$
259 $IF find == 0$
260 $ERROR IOCDATA.TEXT_LINE[iocdataid]$$FORMAT(_("OsIocDataPropertyIndex `%1%\' is missing for `%2%\'. These should be sequential."), index, IOCDATA.IOC[iocdataid])$$END$
261 $END$
262 $IF find > 1$
263 $ERROR IOCDATA.TEXT_LINE[iocdataid]$$FORMAT(_("OsIocDataPropertyIndex `%1%\' is duplicated for `%2%\'. These should be unique."), index, IOCDATA.IOC[iocdataid])$$END$
264 $END$
265 $find = 0$
266 $END$
267 $IOC.IOCDATA_LIST[iocid] = new_list$
268 $END$
269$END$
270
271
272$ =====================================================================
273$ Os_Lcfg.hの生成
274$ =====================================================================
275
276$FILE "Os_Lcfg.h"$
277
278/****** Object IOC ******/$NL$
279$IF LENGTH(IOC.ID_LIST)$
280$ // IOC IDの作成
281 /* IOC ID */$NL$
282 $FOREACH iocid IOC.ID_LIST$
283 #define $iocid$$TAB$UINT_C($IOC.ID[iocid]$)$NL$
284 $END$
285 $NL$
286
287$ // Wrapper IDの作成.IOCSNDのオブジェクト識別IDを使用する
288 /* Wrapper ID */$NL$
289 $FOREACH wrapperid RANGE(0, LENGTH(IOCSND.ID_LIST) - 1)$
290 #define IOC_WRAPPER_$wrapperid$$TAB$UINT_C($wrapperid$)$NL$
291 $END$
292 $NL$
293$END$
294
295 #define TNUM_IOC UINT_C($LENGTH(IOC.ID_LIST)$)$NL$
296 #define TNUM_QUEUEIOC UINT_C($tnum_queioc$)$NL$
297 #define TNUM_IOC_WRAPPER UINT_C($LENGTH(IOCSND.ID_LIST)$)$NL$
298
299
300$ =====================================================================
301$ Os_Lcfg.cの生成
302$ =====================================================================
303$FILE "Os_Lcfg.c"$
304
305 /****** Object IOC ******/$NL$
306 const IocType tnum_ioc = TNUM_IOC;$NL$
307 const IocType tnum_queueioc = TNUM_QUEUEIOC;$NL$
308 $NL$
309
310$IF LENGTH(IOC.ID_LIST)$
311$ // IOC初期化値
312 /*$NL$
313 $SPC$* IOC Initialize Value$NL$
314 $SPC$*/$NL$
315 $FOREACH iocid IOC.ID_LIST$
316 /* $iocid$ */$NL$
317 $IF IOC.ID[iocid] < tnum_queioc$
318 /* No initialize value because queue communication */$NL$
319 $ELSE$
320 $IF EQ(IOCDATA.INITVAL[IOC.IOCDATA_LIST[iocid]], "NULL")$
321$ // ここには来ない(エラーチェック処理で検出済み)
322 /* No initialize value */$NL$
323 $ELSE$
324 IOCMB_$iocid$ ioc_inival_$iocid$ = {$NL$
325 $JOINEACH iocdata IOC.IOCDATA_LIST[iocid] ",\n"$
326$ //OsIocInitValueは文字列型で読み込むため,arxmlでUを記載する方針とする
327 $TAB$$IOCDATA.INITVAL[iocdata]$
328 $END$
329 $NL$};$NL$
330 $END$
331 $END$
332 $NL$
333 $END$
334 $NL$
335
336$ // IOC初期化値テーブル
337 void *ioc_inival_table[TNUM_IOC] = {$NL$
338 $JOINEACH iocid IOC.ID_LIST ",\n"$
339 $IF IOC.ID[iocid] < tnum_queioc$
340 $TAB$NULL
341 $ELSE$
342 $IF EQ(IOCDATA.INITVAL[IOC.IOCDATA_LIST[iocid]], "NULL")$
343 $TAB$NULL
344 $ELSE$
345 $TAB$(void *)&ioc_inival_$iocid$
346 $END$
347 $END$
348 $END$
349 $NL$};$NL$
350 $NL$
351
352$ // IOC管理ブロックテーブル
353 $IF tnum_queioc > 0$
354 IOCCB ioccb_table[TNUM_QUEUEIOC];$NL$
355 $ELSE$
356 TOPPERS_EMPTY_LABEL(IOCCB, ioccb_table);$NL$
357 $END$
358 $NL$
359
360$ // IOCデータ管理ブロックテーブルの宣言
361 $FOREACH iocid IOC.ID_LIST$
362 $IF EQ(IOC.BUFLEN[iocid], "NULL")$
363 IOCMB_$iocid$ iocmb_table_$iocid$[1];$NL$
364 $ELSE$
365 IOCMB_$iocid$ iocmb_table_$iocid$[$IOC.BUFLEN[iocid]$];$NL$
366 $END$
367 $END$
368 $NL$
369
370$ // IOC初期化テーブル
371 const IOCINIB iocinib_table[TNUM_IOC] = {$NL$
372 $JOINEACH iocid IOC.ID_LIST ",\n"$
373 $TAB${$NL$
374 $TAB$$TAB$$+IOC.BUFLEN[iocid]$U,$NL$
375 $TAB$$TAB$sizeof(IOCMB_$iocid$),$NL$
376 $TAB$$TAB$alignof(IOCMB_$iocid$),$NL$
377 #ifdef CFG_USE_ERRORHOOK$NL$
378 $IF LENGTH(IOC.IOCDATA_LIST[iocid]) != 1$
379 $TAB$$TAB$TRUE,$NL$
380 $ELSE$
381 $TAB$$TAB$FALSE,$NL$
382 $END$
383 #endif /* CFG_USE_ERRORHOOK */$NL$
384 $TAB$$TAB$&osapcb_table[$IOCRCV.OSAPID[IOC.IOCRCV[iocid]]$],$NL$
385 $TAB$$TAB$&iocmb_table_$iocid$$NL$
386 $TAB$}
387 $END$
388 $NL$};$NL$
389 $NL$
390
391$ // IOCラッパー初期化テーブル
392 const IOCWRPINIB iocwrpinib_table[TNUM_IOC_WRAPPER] = {$NL$
393 $JOINEACH iocsndid IOCSND.ID_LIST ",\n"$
394 $TAB${$NL$
395 $TAB$$TAB$&iocinib_table[$IOCSND.IOC[iocsndid]$],$NL$
396 $TAB$$TAB$&osapcb_table[$IOCSND.OSAPID[iocsndid]$],$NL$
397 $IF EQ(IOCSND.SENDERID[iocsndid], "NULL")$
398 $TAB$0U$NL$
399 $ELSE$
400 $TAB$$TAB$$IOCSND.SENDERID[iocsndid]$U$NL$
401 $END$
402 $TAB$}
403 $END$
404 $NL$};$NL$
405 $NL$
406$ELSE$
407 TOPPERS_EMPTY_LABEL(void *, ioc_inival_table);$NL$
408 TOPPERS_EMPTY_LABEL(IOCCB, ioccb_table);$NL$
409 TOPPERS_EMPTY_LABEL(const IOCINIB, iocinib_table);$NL$
410 TOPPERS_EMPTY_LABEL(const IOCWRPINIB, iocwrpinib_table);$NL$
411
412$END$
413
414
415$ =====================================================================
416$ Ioc.hの生成
417$ =====================================================================
418$FILE "Ioc.h"$
419#ifndef TOPPERS_IOC_H$NL$
420#define TOPPERS_IOC_H$NL$
421$NL$
422
423#include "Os.h"$NL$
424#include "Os_Lcfg.h"$NL$
425$NL$
426
427$IF LENGTH(IOC.ID_LIST)$
428 /* IOC data management block */$NL$
429 $FOREACH iocid IOC.ID_LIST$
430 typedef struct ioc_data_management_block_$iocid$ {$NL$
431 $arg = 1$
432 $FOREACH iocdataid IOC.IOCDATA_LIST[iocid]$
433 $TAB$$GET_SHORT_NAME(IOCDATA.DATATYPE[iocdataid])$$TAB$data$arg$;$NL$
434 $arg = arg + 1$
435 $END$
436 }IOCMB_$iocid$;$NL$
437 $NL$
438 $END$
439$ELSE$
440 /* IOC is not used */
441$END$
442
443
444$ =====================================================================
445$ Ioc.cの生成
446$ =====================================================================
447$FILE "Ioc.c"$
448
449$IF LENGTH(IOC.ID_LIST)$
450 #include "Ioc.h"$NL$
451$ELSE$
452 /* IOC is not used */
453$END$
454
455$ =====================================================================
456$ APIの生成
457$ =====================================================================
458$IF LENGTH(IOC.ID_LIST)$
459 $FOREACH iocid IOC.ID_LIST$
460 $FILE "Ioc.h"$
461 $NL$
462 /* $iocid$ API */
463 $FILE "Ioc.c"$
464 $NL$
465
466 $shortname = GET_SHORT_NAME(IOCDATA.DATATYPE[IOC.IOCDATA_LIST[iocid]], iocid)$
467 $category = GET_CATEGORY(IOCDATA.DATATYPE[IOC.IOCDATA_LIST[iocid]], iocid)$
468 /* $iocid$ API */
469$ // 送信API
470$ // 1:1通信
471 $IF LENGTH(IOC.IOCSND_LIST[iocid]) == 1$
472$ // 1:1,単一データ通信
473 $IF LENGTH(IOC.IOCDATA_LIST[iocid]) == 1$
474$ // 1:1,単一データ通信,キュー無し
475 $IF EQ(IOC.BUFLEN[iocid], "NULL")$
476 $iocsender = "IocWrite"$
477 $iocsender_generic = "ioc_write_generic"$
478$ // 1:1,単一データ通信,キューあり
479 $ELSE$
480 $iocsender = "IocSend"$
481 $iocsender_generic = "ioc_send_generic"$
482 $END$
483$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)を判断してコードを生成
484 $FOREACH iocsnd IOC.IOCSND_LIST[iocid]$
485$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)以外のエラーチェックは確認済み
486 $IF !EQ(IOCSND.IMPLKIND[iocsnd], "MACRO")$
487 $FILE "Ioc.h"$
488 extern Std_ReturnType $iocsender$_$iocid$(
489 $IF !EQ(category, "VALUE")$
490 const $shortname$ *
491 $ELSE$
492 $shortname$$SPC$
493 $END$
494 in1);
495
496 $FILE "Ioc.c"$
497 Std_ReturnType$NL$
498 $iocsender$_$iocid$(
499 $IF !EQ(category, "VALUE")$
500 const $shortname$ *
501 $ELSE$
502 $shortname$$SPC$
503 $END$
504 in1)$NL$
505 {$NL$
506 $TAB$Std_ReturnType$TAB$ercd;$NL$
507 $TAB$IOCMB_$iocid$$TAB$in;$NL$
508 $TAB$in.data1 =$SPC$
509 $IF !EQ(category, "VALUE")$
510 *
511 $END$
512 in1;$NL$
513 $TAB$ercd = $iocsender_generic$(IOC_WRAPPER_$+iocsnd - 1$, (void *)(&in));$NL$
514 $TAB$return(ercd);$NL$
515 }$NL$
516 $ELSE$
517 $FILE "Ioc.h"$
518 LOCAL_INLINE Std_ReturnType$NL$
519 $iocsender$_$iocid$(
520 $IF !EQ(category, "VALUE")$
521 const $shortname$ *
522 $ELSE$
523 $shortname$$SPC$
524 $END$
525 in1)$NL$
526 {$NL$
527 $TAB$Std_ReturnType$TAB$ercd;$NL$
528 $TAB$IOCMB_$iocid$$TAB$in;$NL$
529 $TAB$in.data1 =$SPC$
530 $IF !EQ(category, "VALUE")$
531 *
532 $END$
533 in1;$NL$
534 $TAB$ercd = $iocsender_generic$(IOC_WRAPPER_$+iocsnd - 1$, (void *)(&in));$NL$
535 $TAB$return(ercd);$NL$
536 }$NL$
537 $END$
538 $END$
539$ // 1:1,グループ通信
540 $ELSE$
541$ // 1:1,グループ通信,キュー無し
542 $IF EQ(IOC.BUFLEN[iocid], "NULL")$
543 $iocsender = "IocWriteGroup"$
544 $iocsender_generic = "ioc_write_generic"$
545$ // 1:1,グループ通信,キューあり
546 $ELSE$
547 $iocsender = "IocSendGroup"$
548 $iocsender_generic = "ioc_send_generic"$
549 $END$
550$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)を判断してコードを生成
551 $FOREACH iocsnd IOC.IOCSND_LIST[iocid]$
552$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)以外のエラーチェックは確認済み
553 $IF !EQ(IOCSND.IMPLKIND[iocsnd], "MACRO")$
554 $FILE "Ioc.h"$
555 extern Std_ReturnType $iocsender$_$iocid$(
556 $arg = 1$
557 $JOINEACH iocdata IOC.IOCDATA_LIST[iocid] ", "$
558 $shortname = GET_SHORT_NAME(IOCDATA.DATATYPE[iocdata], iocid)$
559 $IF !EQ(GET_CATEGORY(IOCDATA.DATATYPE[iocdata], iocid), "VALUE")$
560 const $shortname$ *in$arg$
561 $ELSE$
562 $shortname$ in$arg$
563 $END$
564 $arg = arg + 1$
565 $END$
566 );
567 $FILE "Ioc.c"$
568 Std_ReturnType$NL$
569 $iocsender$_$iocid$(
570 $arg = 1$
571 $JOINEACH iocdata IOC.IOCDATA_LIST[iocid] ", "$
572 $shortname = GET_SHORT_NAME(IOCDATA.DATATYPE[iocdata], iocid)$
573 $IF !EQ(GET_CATEGORY(IOCDATA.DATATYPE[iocdata], iocid), "VALUE")$
574 const $shortname$ *in$arg$
575 $ELSE$
576 $shortname$ in$arg$
577 $END$
578 $arg = arg + 1$
579 $END$
580 )$NL$
581 {$NL$
582 $TAB$Std_ReturnType$TAB$ercd;$NL$
583 $TAB$IOCMB_$iocid$$TAB$in;$NL$
584 $arg = 1$
585 $FOREACH iocdata IOC.IOCDATA_LIST[iocid]$
586 $TAB$in.data$arg$ =$SPC$
587 $IF !EQ(GET_CATEGORY(IOCDATA.DATATYPE[iocdata], iocid), "VALUE")$
588 *
589 $END$
590 in$arg$;$NL$
591 $arg = arg + 1$
592 $END$
593 $TAB$ercd = $iocsender_generic$(IOC_WRAPPER_$+iocsnd - 1$, (void *)(&in));$NL$
594 $TAB$return(ercd);$NL$
595 }$NL$
596 $ELSE$
597 $FILE "Ioc.h"$
598 LOCAL_INLINE Std_ReturnType$NL$
599 $iocsender$_$iocid$(
600 $arg = 1$
601 $JOINEACH iocdata IOC.IOCDATA_LIST[iocid] ", "$
602 $shortname = GET_SHORT_NAME(IOCDATA.DATATYPE[iocdata], iocid)$
603 $IF !EQ(GET_CATEGORY(IOCDATA.DATATYPE[iocdata], iocid), "VALUE")$
604 const $shortname$ *in$arg$
605 $ELSE$
606 $shortname$ in$arg$
607 $END$
608 $arg = arg + 1$
609 $END$
610 )$NL$
611 {$NL$
612 $TAB$Std_ReturnType$TAB$ercd;$NL$
613 $TAB$IOCMB_$iocid$$TAB$in;$NL$
614 $arg = 1$
615 $FOREACH iocdata IOC.IOCDATA_LIST[iocid]$
616 $TAB$in.data$arg$ =$SPC$
617 $IF !EQ(GET_CATEGORY(IOCDATA.DATATYPE[iocdata], iocid), "VALUE")$
618 *
619 $END$
620 in$arg$;$NL$
621 $arg = arg + 1$
622 $END$
623 $TAB$ercd = $iocsender_generic$(IOC_WRAPPER_$+iocsnd - 1$, (void *)(&in));$NL$
624 $TAB$return(ercd);$NL$
625 }
626 $END$
627 $END$
628 $END$
629$ // N:1通信
630 $ELSE$
631$ // N:1,通常通信
632 $IF LENGTH(IOC.IOCDATA_LIST[iocid]) == 1$
633$ // N:1,単一データ通信,キュー無し
634 $IF EQ(IOC.BUFLEN[iocid], "NULL")$
635 $iocsender = "IocWrite"$
636 $iocsender_generic = "ioc_write_generic"$
637$ // N:1,単一データ通信,キューあり
638 $ELSE$
639 $iocsender = "IocSend"$
640 $iocsender_generic = "ioc_send_generic"$
641 $END$
642$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)を判断してコードを生成
643 $FOREACH iocsnd IOC.IOCSND_LIST[iocid]$
644$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)以外のエラーチェックは確認済み
645 $IF !EQ(IOCSND.IMPLKIND[iocsnd], "MACRO")$
646 $FILE "Ioc.h"$
647 extern Std_ReturnType $iocsender$_$iocid$_$IOCSND.SENDERID[iocsnd]$(
648 $IF !EQ(category, "VALUE")$
649 const $shortname$ *
650 $ELSE$
651 $shortname$$SPC$
652 $END$
653 in1);
654
655 $FILE "Ioc.c"$
656 Std_ReturnType$NL$
657 $iocsender$_$iocid$_$IOCSND.SENDERID[iocsnd]$(
658 $IF !EQ(category, "VALUE")$
659 const $shortname$ *
660 $ELSE$
661 $shortname$$SPC$
662 $END$
663 in1)$NL$
664 {$NL$
665 $TAB$Std_ReturnType$TAB$ercd;$NL$
666 $TAB$IOCMB_$iocid$$TAB$in;$NL$
667 $TAB$in.data1 =$SPC$
668 $IF !EQ(category, "VALUE")$
669 *
670 $END$
671 in1;$NL$
672 $TAB$ercd = $iocsender_generic$(IOC_WRAPPER_$+iocsnd - 1$, (void *)(&in));$NL$
673 $TAB$return(ercd);$NL$
674 }$NL$
675 $ELSE$
676 $FILE "Ioc.h"$
677 LOCAL_INLINE Std_ReturnType$NL$
678 $iocsender$_$iocid$_$IOCSND.SENDERID[iocsnd]$(
679 $IF !EQ(category, "VALUE")$
680 const $shortname$ *
681 $ELSE$
682 $shortname$$SPC$
683 $END$
684 in1)$NL$
685 {$NL$
686 $TAB$Std_ReturnType$TAB$ercd;$NL$
687 $TAB$IOCMB_$iocid$$TAB$in;$NL$
688 $TAB$in.data1 =$SPC$
689 $IF !EQ(category, "VALUE")$
690 *
691 $END$
692 in1;$NL$
693 $TAB$ercd = $iocsender_generic$(IOC_WRAPPER_$+iocsnd - 1$, (void *)(&in));$NL$
694 $TAB$return(ercd);$NL$
695 }
696 $END$
697 $END$
698$ // N:1,グループ通信のコンフィギュレーションはエラー
699 $ELSE$
700 $ERROR IOC.TEXT_LINE[iocid]$$FORMAT(_("N:1 and Group IOC can not be used."))$$END$
701 $END$
702 $END$
703
704$ // 受信API - 受信APIは1:1 or N:1によってAPI生成は変化しない
705$ // 単一データ通信
706 $IF LENGTH(IOC.IOCDATA_LIST[iocid]) == 1$
707$ // 単一データ通信,キュー無し
708 $IF EQ(IOC.BUFLEN[iocid], "NULL")$
709 $iocreceiver = "IocRead"$
710 $iocreceiver_generic = "ioc_read_generic"$
711 $iocerrorcheck = "ercd == IOC_E_OK"$
712$ // 単一データ通信,キューあり
713 $ELSE$
714 $iocreceiver = "IocReceive"$
715 $iocreceiver_generic = "ioc_receive_generic"$
716 $iocerrorcheck = "(ercd == IOC_E_OK) || (ercd == IOC_E_LOST_DATA)"$
717 $END$
718$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)を判断してコードを生成
719$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)以外のエラーチェックは確認済み
720 $IF !EQ(IOCRCV.IMPLKIND[IOC.IOCRCV[iocid]], "MACRO")$
721 $FILE "Ioc.h"$
722 extern Std_ReturnType $iocreceiver$_$iocid$($shortname$ *out1);
723
724 $FILE "Ioc.c"$
725 Std_ReturnType$NL$
726 $iocreceiver$_$iocid$($shortname$ *out1)$NL$
727 {$NL$
728 $TAB$Std_ReturnType$TAB$ercd;$NL$
729 $TAB$IOCMB_$iocid$$TAB$out;$NL$
730 $TAB$ercd = $iocreceiver_generic$($iocid$, (void *)(&out));$NL$
731 $TAB$if ($iocerrorcheck$) {$NL$
732 $TAB$$TAB$*out1 = out.data1;$NL$
733 $TAB$}$NL$
734 $TAB$return(ercd);$NL$
735 }$NL$
736 $ELSE$
737 $FILE "Ioc.h"$
738 LOCAL_INLINE Std_ReturnType$NL$
739 $iocreceiver$_$iocid$($shortname$ *out1)$NL$
740 {$NL$
741 $TAB$Std_ReturnType$TAB$ercd;$NL$
742 $TAB$IOCMB_$iocid$$TAB$out;$NL$
743 $TAB$ercd = $iocreceiver_generic$($iocid$, (void *)(&out));$NL$
744 $TAB$if ($iocerrorcheck$) {$NL$
745 $TAB$$TAB$*out1 = out.data1;$NL$
746 $TAB$}$NL$
747 $TAB$return(ercd);$NL$
748 }
749 $END$
750$ // グループ通信
751 $ELSE$
752$ // グループ通信,キュー無し
753 $IF EQ(IOC.BUFLEN[iocid], "NULL")$
754 $iocreceiver = "IocReadGroup"$
755 $iocreceiver_generic = "ioc_read_generic"$
756 $iocerrorcheck = "ercd == IOC_E_OK"$
757$ // グループ通信,キューあり
758 $ELSE$
759 $iocreceiver = "IocReceiveGroup"$
760 $iocreceiver_generic = "ioc_receive_generic"$
761 $iocerrorcheck = "(ercd == IOC_E_OK) || (ercd == IOC_E_LOST_DATA)"$
762 $END$
763$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)を判断してコードを生成
764$ // FUNCTION, MACRO, DO_NOT_CARE, 省略(NULL)以外のエラーチェックは確認済み
765 $IF !EQ(IOCRCV.IMPLKIND[IOC.IOCRCV[iocid]], "MACRO")$
766 $FILE "Ioc.h"$
767 extern Std_ReturnType $iocreceiver$_$iocid$(
768 $arg = 1$
769 $JOINEACH iocdata IOC.IOCDATA_LIST[iocid] ", "$
770 $shortname = GET_SHORT_NAME(IOCDATA.DATATYPE[iocdata], iocid)$
771 $shortname$$SPC$*out$arg$
772 $arg = arg + 1$
773 $END$
774 );
775
776 $FILE "Ioc.c"$
777 Std_ReturnType$NL$
778 $iocreceiver$_$iocid$(
779 $arg = 1$
780 $JOINEACH iocdata IOC.IOCDATA_LIST[iocid] ", "$
781 $shortname = GET_SHORT_NAME(IOCDATA.DATATYPE[iocdata], iocid)$
782 $shortname$$SPC$*out$arg$
783 $arg = arg + 1$
784 $END$
785 )$NL$
786 {$NL$
787 $TAB$Std_ReturnType$TAB$ercd;$NL$
788 $TAB$IOCMB_$iocid$$TAB$out;$NL$
789 $TAB$ercd = $iocreceiver_generic$($iocid$, (void *)(&out));$NL$
790 $TAB$if ($iocerrorcheck$) {$NL$
791 $arg = 1$
792 $FOREACH iocdata IOC.IOCDATA_LIST[iocid]$
793 $TAB$$TAB$*out$arg$ = out.data$arg$;$NL$
794 $arg = arg + 1$
795 $END$
796 $TAB$}$NL$
797 $TAB$return(ercd);$NL$
798 }$NL$
799 $ELSE$
800 $FILE "Ioc.h"$
801 LOCAL_INLINE Std_ReturnType$NL$
802 $iocreceiver$_$iocid$(
803 $arg = 1$
804 $JOINEACH iocdata IOC.IOCDATA_LIST[iocid] ", "$
805 $shortname = GET_SHORT_NAME(IOCDATA.DATATYPE[iocdata], iocid)$
806 $shortname$$SPC$*out$arg$
807 $arg = arg + 1$
808 $END$
809 )$NL$
810 {$NL$
811 $TAB$Std_ReturnType$TAB$ercd;$NL$
812 $TAB$IOCMB_$iocid$$TAB$out;$NL$
813 $TAB$ercd = $iocreceiver_generic$($iocid$, (void *)(&out));$NL$
814 $TAB$if ($iocerrorcheck$) {$NL$
815 $arg = 1$
816 $FOREACH iocdata IOC.IOCDATA_LIST[iocid]$
817 $TAB$$TAB$*out$arg$ = out.data$arg$;$NL$
818 $arg = arg + 1$
819 $END$
820 $TAB$}$NL$
821 $TAB$return(ercd);$NL$
822 }
823 $END$
824 $END$
825
826$ // queue empty API
827 $IF !EQ(IOC.BUFLEN[iocid], "NULL")$
828 $FILE "Ioc.h"$
829 extern Std_ReturnType IocEmptyQueue_$iocid$(void);
830
831 $FILE "Ioc.c"$
832 Std_ReturnType$NL$
833 IocEmptyQueue_$iocid$(void)$NL$
834 {$NL$
835 $TAB$Std_ReturnType ercd;$NL$
836 $TAB$ercd = ioc_empty_queue_generic($iocid$);$NL$
837 $TAB$return(ercd);$NL$
838 }$NL$
839 $END$
840 $END$
841$END$
842
843$FILE "Ioc.h"$
844$NL$
845#endif /* TOPPERS_IOC_H_ */$NL$
Note: See TracBrowser for help on using the repository browser.