source: atk2-sc3_fl850f1l/kernel/ioc.tf@ 165

Last change on this file since 165 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

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