source: UsbWattMeter/trunk/ecnl_lwip/echonet.tf@ 473

Last change on this file since 473 was 167, checked in by coas-nagasima, 8 years ago

MIMEにSJISを設定

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/plain; charset=SHIFT_JIS
File size: 20.2 KB
Line 
1$ =====================================================================
2$
3$ TOPPERS ECHONET Lite Communication Middleware
4$
5$ Copyright (C) 2014-2016 Cores Co., Ltd. Japan
6$
7$ 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
8$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9$ 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
10$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
11$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
12$ スコード中に含まれていること.
13$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
14$ 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
15$ 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
16$ の無保証規定を掲載すること.
17$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
18$ 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
19$ と.
20$ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
21$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
22$ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
23$ 報告すること.
24$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
25$ 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
26$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
27$ 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
28$ 免責すること.
29$
30$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
31$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
32$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
33$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
34$ の責任を負わない.
35$
36$ @(#) $Id: echonet.tf 167 2016-03-08 11:37:45Z coas-nagasima $
37$
38$ =====================================================================
39
40$ =====================================================================
41$ echonet_cfg.hの生成
42$ =====================================================================
43
44$FILE "echonet_cfg.h"$
45/* echonet_cfg.h */$NL$
46#ifndef TOPPERS_ECHONET_CFG_H$NL$
47#define TOPPERS_ECHONET_CFG_H$NL$
48$NL$
49
50#include "echonet_app_config.h"$NL$
51$NL$
52
53$ ノードリストの作成
54$ENOD.LIST = {}$
55$LOCAL_NODE = {}$
56$REMOTE_NODE = {}$
57
58$FOREACH eobjid EOBJ.ORDER_LIST$
59$ // ノードプロファイルオブジェクトの場合
60 $IF (EOBJ.EOBJATR[eobjid] & EOBJ_LOCAL_NODE) != 0$
61 $LOCAL_NODE = APPEND(LOCAL_NODE, eobjid)$
62$ // 機器オブジェクトの場合
63 $ELIF (EOBJ.EOBJATR[eobjid] & (EOBJ_SYNC_REMOTE_NODE|EOBJ_ASYNC_REMOTE_NODE)) != 0$
64 $REMOTE_NODE = APPEND(REMOTE_NODE, eobjid)$
65 $END$
66$END$
67
68$ // ローカルのノードプロファイルは1つだけ
69$IF LENGTH(LOCAL_NODE) != 1$
70 $ERROR$Local node must be only one.$END$
71$END$
72
73$ENOD.LIST = APPEND(LOCAL_NODE, REMOTE_NODE)$
74
75#define TNUM_ENODID $LENGTH(ENOD.LIST)$$NL$
76$NL$
77
78#define TNUM_EOBJID $LENGTH(EOBJ.ID_LIST)$$NL$
79$NL$
80$FOREACH id EOBJ.ID_LIST$
81 #define $id$ $+id$$NL$
82$END$
83$NL$
84
85$FOREACH eobjid EOBJ.ID_LIST$
86 $eprp_list = {}$
87 $prp_map_cnt = 3$
88$ // ノードプロファイルの場合
89 $IF (EOBJ.EOBJATR[eobjid] & (EOBJ_LOCAL_NODE|EOBJ_SYNC_REMOTE_NODE|EOBJ_ASYNC_REMOTE_NODE)) != 0$
90 $prp_map_cnt = prp_map_cnt + 5$
91 $END$
92
93 $FOREACH eprpno EPRP.ID_LIST$
94 $IF EQ(EPRP.EOBJID[eprpno], eobjid)$
95 $eprp_list = APPEND(eprp_list, eprpno)$
96 $END$
97
98 $IF (EPRP.EPRPCD[eprpno] == 0x9D) || (EPRP.EPRPCD[eprpno] == 0x9E) || (EPRP.EPRPCD[eprpno] == 0x9F)$
99 $prp_map_cnt = prp_map_cnt - 1$
100 $END$
101
102$ // ノードプロファイルの場合
103 $IF (EOBJ.EOBJATR[eobjid] & (EOBJ_LOCAL_NODE|EOBJ_SYNC_REMOTE_NODE|EOBJ_ASYNC_REMOTE_NODE)) != 0$
104 $IF (EPRP.EPRPCD[eprpno] >= 0xD3) && (EPRP.EPRPCD[eprpno] <= 0xD7)$
105 $prp_map_cnt = prp_map_cnt - 1$
106 $END$
107 $END$
108 $END$
109
110 #define TNUM_$EOBJ.EOBJID[eobjid]$_EPRPNO $LENGTH(eprp_list) + prp_map_cnt$$NL$
111$END$$NL$
112
113$FOREACH enodid ENOD.LIST$
114 $eobj_count = 0$
115
116 $FOREACH eobjid EOBJ.ID_LIST$
117 $IF EQ(EOBJ.ENODID[eobjid], enodid)$
118 $eobj_count = eobj_count + 1$
119 $END$
120 $END$
121
122 #define TNUM_$EOBJ.EOBJID[enodid]$_EOBJNO $eobj_count$$NL$
123$END$$NL$
124
125#ifndef TNUM_ENODADR$NL$
126#define TNUM_ENODADR 100$NL$
127#endif$NL$
128$NL$
129
130#endif /* TOPPERS_ECHONET_CFG_H */$NL$
131
132$ =====================================================================
133$ echonet_cfg.cの生成
134$ =====================================================================
135
136$FILE "echonet_cfg.c"$
137/* echonet_cfg.c */$NL$
138#include "echonet.h"$NL$
139#include "echonet_cfg.h"$NL$
140$NL$
141
142$
143$ インクルードディレクティブ(#include)
144$
145/*$NL$
146$SPC$* Include Directives (#include)$NL$
147$SPC$*/$NL$
148$NL$
149$INCLUDES$
150$NL$
151
152$
153$ オブジェクトのID番号を保持する変数
154$
155$IF USE_EXTERNAL_ID$
156 /*$NL$
157 $SPC$* Variables for Object ID$NL$
158 $SPC$*/$NL$
159 $NL$
160 $FOREACH id EOBJ.ID_LIST$
161 const ID $id$_id$SPC$=$SPC$$+id$;$NL$
162 $END$
163$END$
164
165$
166$ ECHONET Liteプロパティ
167$
168/*$NL$
169$SPC$* ECHONET Lite Property Functions$NL$
170$SPC$*/$NL$
171$NL$
172
173$INCLUDE "echonet_chk.tf"$
174
175$ ECHONET Liteプロパティ初期化ブロックの生成
176$IF LENGTH(EOBJ.ID_LIST) && LENGTH(EPRP.ID_LIST)$
177 $FOREACH enodid ENOD.LIST$
178 $INST_LIST = {}$
179 $CLASS_LIST = {}$
180
181 $FOREACH eobjid EOBJ.ID_LIST$
182 $IF EQ(EOBJ.ENODID[eobjid], enodid)$
183 $INST_LIST = APPEND(INST_LIST, eobjid)$
184
185 $M = -1$
186 $FOREACH id CLASS_LIST$
187 $IF (EOBJ.EOJX1[eobjid] == EOBJ.EOJX1[id]) && (EOBJ.EOJX2[eobjid] == EOBJ.EOJX2[id])$
188 $M = id$
189 $END$
190 $END$
191 $IF M == -1$
192 $CLASS_LIST = APPEND(CLASS_LIST, eobjid)$
193 $END$
194 $END$
195 $END$
196
197 /*$NL$
198 $SPC$* インスタンス数$NL$
199 $SPC$*/$NL$
200 $inst_list_len = LENGTH(INST_LIST)$
201 const uint8_t _echonet_$EOBJ.EOBJID[enodid]$_inst_count[] = {$NL$
202 $TAB$$FORMAT("0x%1$x, 0x%2$x, 0x%3$x", (inst_list_len & 0xFF0000) >> 16, (inst_list_len & 0xFF00) >> 8, inst_list_len & 0xFF)$$NL$
203 };$NL$
204 $NL$
205
206 /*$NL$
207 $SPC$* クラス数$NL$
208 $SPC$*/$NL$
209$ // ノードプロファイルも含める( + 1)
210 $class_list_len = LENGTH(CLASS_LIST) + 1$
211 const uint8_t _echonet_$EOBJ.EOBJID[enodid]$_class_count[] = {$NL$
212 $TAB$$FORMAT("0x%1$x, 0x%2$x", (class_list_len & 0xFF00) >> 8, class_list_len & 0xFF)$$NL$
213 };$NL$
214 $NL$
215
216 /*$NL$
217 $SPC$* インスタンスリスト$NL$
218 $SPC$*/$NL$
219 $pos = 0$
220 $IF inst_list_len > 84$
221 $ERROR EPRP.TEXT_LINE[eprpno]$E_PAR: $FORMAT(_("instance list count overflow, %1% %2% > 84"), enodid, inst_list_len)$$END$
222 $END$
223 const uint8_t _echonet_$EOBJ.EOBJID[enodid]$_inst_list[] = {$NL$
224 $IF inst_list_len > 0xFE$
225 $TAB$0xFF,
226 $ELSE$
227 $TAB$$FORMAT("0x%1$x, ", inst_list_len)$
228 $END$
229 $JOINEACH id INST_LIST ", "$
230 $FORMAT("0x%1$x, 0x%2$x, 0x%3$x", +EOBJ.EOJX1[id], +EOBJ.EOJX2[id], +EOBJ.EOJX3[id])$
231 $END$$NL$
232 };$NL$
233 $NL$
234
235 /*$NL$
236 $SPC$* クラスリスト$NL$
237 $SPC$*/$NL$
238 $pos = 0$
239 $class_list_len = LENGTH(CLASS_LIST)$
240 $IF class_list_len > 84$
241 $ERROR EPRP.TEXT_LINE[eprpno]$E_PAR: $FORMAT(_("class list count overflow, %1% %2% > 84"), enodid, class_list_len)$$END$
242 $END$
243 const uint8_t _echonet_$EOBJ.EOBJID[enodid]$_class_list[] = {$NL$
244 $IF class_list_len > 0xFE$
245 $TAB$0xFF,
246 $ELSE$
247 $TAB$$FORMAT("0x%1$x, ", class_list_len)$
248 $END$
249 $JOINEACH id CLASS_LIST ", "$
250 $FORMAT("0x%1$x, 0x%2$x", +EOBJ.EOJX1[id], +EOBJ.EOJX2[id])$
251 $END$$NL$
252 };$NL$
253 $NL$
254 $END$
255
256 $FOREACH eobjid EOBJ.ID_LIST$
257 $eprp_list = {}$
258 $anno_list = {}$
259 $set_list = {}$
260 $get_list = { 0x9D, 0x9E, 0x9F }$
261 $FOREACH i { 0 , 1 , ... , 15 }$
262 $anno_map[i] = 0x00$
263 $set_map[i] = 0x00$
264 $get_map[i] = 0x00$
265 $END$
266$ // 0x9D、0x9E、0x9FはONにしておく
267 $FOREACH i { 13 , 14 , 15 }$
268 $anno_map[i] = anno_map[i] | 0x02$
269 $get_map[i] = get_map[i] | 0x02$
270 $END$
271$ // ノードプロファイルの場合
272 $IF (EOBJ.EOBJATR[eobjid] & (EOBJ_LOCAL_NODE|EOBJ_SYNC_REMOTE_NODE|EOBJ_ASYNC_REMOTE_NODE)) != 0$
273 $anno_map[5] = anno_map[5] | 0x20$
274 $anno_list = APPEND(anno_list, { 0xD5 })$
275 $FOREACH i { 3 , 4 , 6 , 7 }$
276 $get_map[i] = get_map[i] | 0x20$
277 $END$
278 $get_list = APPEND(get_list, { 0xD3, 0xD4, 0xD6, 0xD7 })$
279 $END$
280
281 $FOREACH eprpno EPRP.ID_LIST$
282 $IF EQ(EPRP.EOBJID[eprpno], eobjid)$
283$ // (0x80 <= eprpcd && eprpcd <= 0xFF)でない場合(E_PAR)
284 $IF !(0x80 <= EPRP.EPRPCD[eprpno] && EPRP.EPRPCD[eprpno] <= 0xFF)$
285 $ERROR EPRP.TEXT_LINE[eprpno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "eprpcd", EPRP.EPRPCD[eprpno], eprpno, "ECN_DEF_EPRP")$$END$
286 $END$
287
288$ // eprpatrが([EPC_RULE_SET] | [EPC_RULE_GET] | [EPC_RULE_ANNO] | [EPC_ANNOUNCE]| [EPC_VARIABLE])でない場合(E_RSATR)
289 $IF (EPRP.EPRPATR[eprpno] & ~(EPC_RULE_SET|EPC_RULE_GET|EPC_RULE_ANNO|EPC_ANNOUNCE|EPC_VARIABLE)) != 0$
290 $ERROR EPRP.TEXT_LINE[eprpno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "eprpatr", EPRP.EPRPATR[eprpno], eprpno, "ECN_DEF_EPRP")$$END$
291 $END$
292
293$ // (0 <= eprpsz && eprpsz <= 255)でない場合(E_PAR)
294 $IF !(0 <= EPRP.EPRPSZ[eprpno] && EPRP.EPRPSZ[eprpno] <= 255)$
295 $ERROR EPRP.TEXT_LINE[eprpno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "eprpsz", EPRP.EPRPSZ[eprpno], eprpno, "ECN_DEF_EPRP")$$END$
296 $END$
297
298$ // プロパティマップに設定
299 $pos = EPRP.EPRPCD[eprpno] & 0xF$
300 $bit = (EPRP.EPRPCD[eprpno] >> 4) - 8$
301 $IF (EPRP.EPRPATR[eprpno] & EPC_ANNOUNCE) != 0$
302 $anno_list = APPEND(anno_list, EPRP.EPRPCD[eprpno])$
303 $anno_map[pos] = anno_map[pos] | (1 << bit)$
304 $END$
305 $IF (EPRP.EPRPATR[eprpno] & EPC_RULE_SET) != 0$
306 $set_list = APPEND(set_list, EPRP.EPRPCD[eprpno])$
307 $set_map[pos] = set_map[pos] | (1 << bit)$
308 $END$
309 $IF (EPRP.EPRPATR[eprpno] & EPC_RULE_GET) != 0$
310 $get_list = APPEND(get_list, EPRP.EPRPCD[eprpno])$
311 $get_map[pos] = get_map[pos] | (1 << bit)$
312 $END$
313
314 $eprp_list = APPEND(eprp_list, eprpno)$
315 $END$
316 $END$
317
318$ // 必須アナウンスプロパティがあるかチェック
319 $must_anno_map = GetPropertyInfo(EOBJ.EOJX1[eobjid], EOBJ.EOJX2[eobjid], EPC_ANNOUNCE)$
320 $i = 0$
321 $WHILE i < LENGTH(ResultOfGetPropertyInfo)$
322 $j = FIND(anno_list, +AT(ResultOfGetPropertyInfo, i))$
323 $IF !LENGTH(j)$
324 $ERROR$$FORMAT("Required announce property (0x%1$x) of %2% is not defined.", +AT(ResultOfGetPropertyInfo, i), eobjid)$$END$
325 $END$
326 $i = i + 1$
327 $END$
328
329$ // 必須SETプロパティがあるかチェック
330 $must_set_map = GetPropertyInfo(EOBJ.EOJX1[eobjid], EOBJ.EOJX2[eobjid], EPC_RULE_SET)$
331 $i = 0$
332 $WHILE i < LENGTH(ResultOfGetPropertyInfo)$
333 $j = FIND(set_list, +AT(ResultOfGetPropertyInfo, i))$
334 $IF !LENGTH(j)$
335 $ERROR$$FORMAT("Required set property (0x%1$x) of %2% is not defined.", +AT(ResultOfGetPropertyInfo, i), eobjid)$$END$
336 $END$
337 $i = i + 1$
338 $END$
339
340$ // 必須GETプロパティがあるかチェック
341 $must_get_map = GetPropertyInfo(EOBJ.EOJX1[eobjid], EOBJ.EOJX2[eobjid], EPC_RULE_GET)$
342 $i = 0$
343 $WHILE i < LENGTH(ResultOfGetPropertyInfo)$
344 $j = FIND(get_list, +AT(ResultOfGetPropertyInfo, i))$
345 $IF !LENGTH(j)$
346 $ERROR$$FORMAT("Required get property (0x%1$x) of %2% is not defined.", +AT(ResultOfGetPropertyInfo, i), eobjid)$$END$
347 $END$
348 $i = i + 1$
349 $END$
350
351 /*$NL$
352 $SPC$* アナウンスプロパティマップ$NL$
353 $SPC$*/$NL$
354 $anno_list = LSORT(anno_list, "compare")$
355 $anno_len = LENGTH(anno_list)$
356 const uint8_t _echonet_$EOBJ.EOBJID[eobjid]$_anno_prpmap[] = {$NL$
357 $TAB$$FORMAT("0x%1$x" , +anno_len)$,
358 $IF anno_len < 16$
359 $JOINEACH eprpcd anno_list ", "$
360 $FORMAT("0x%1$x" , +eprpcd)$
361 $END$$NL$
362 $anno_len = anno_len + 1$
363 $ELSE$
364 $JOINEACH i anno_map ", "$
365 $FORMAT("0x%1$x" , +anno_map[i])$
366 $END$$NL$
367 $anno_len = 17$
368 $END$
369 };$NL$
370 $NL$
371
372 /*$NL$
373 $SPC$* SETプロパティマップ$NL$
374 $SPC$*/$NL$
375 $set_list = LSORT(set_list, "compare")$
376 $set_len = LENGTH(set_list)$
377 const uint8_t _echonet_$EOBJ.EOBJID[eobjid]$_set_prpmap[] = {$NL$
378 $TAB$$FORMAT("0x%1$x" , +set_len)$,
379 $IF set_len < 16$
380 $JOINEACH eprpcd set_list ", "$
381 $FORMAT("0x%1$x" , +eprpcd)$
382 $END$$NL$
383 $set_len = set_len + 1$
384 $ELSE$
385 $JOINEACH i set_map ", "$
386 $FORMAT("0x%1$x" , +set_map[i])$
387 $END$$NL$
388 $set_len = 17$
389 $END$
390 };$NL$
391 $NL$
392
393 /*$NL$
394 $SPC$* GETプロパティマップ$NL$
395 $SPC$*/$NL$
396 $get_list = LSORT(get_list, "compare")$
397 $get_len = LENGTH(get_list)$
398 const uint8_t _echonet_$EOBJ.EOBJID[eobjid]$_get_prpmap[] = {$NL$
399 $TAB$$FORMAT("0x%1$x" , +get_len)$,
400 $IF get_len < 16$
401 $JOINEACH eprpcd get_list ", "$
402 $FORMAT("0x%1$x" , +eprpcd)$
403 $END$$NL$
404 $get_len = get_len + 1$
405 $ELSE$
406 $JOINEACH i { 0 , 1 , ... , 15 } ", "$
407 $FORMAT("0x%1$x" , +get_map[i])$
408 $END$$NL$
409 $get_len = 17$
410 $END$
411 };$NL$
412 $NL$
413
414 /*$NL$
415 $SPC$* プロパティ定義$NL$
416 $SPC$*/$NL$
417 const EPRPINIB _echonet_$EOBJ.EOBJID[eobjid]$_eprpinib_table[TNUM_$EOBJ.EOBJID[eobjid]$_EPRPNO] = {$NL$
418 $FOREACH eprpno eprp_list$
419$ // ECHONET Liteプロパティ初期化ブロック
420 $TAB${ ($EPRP.EPRPCD[eprpno]$), ($EPRP.EPRPATR[eprpno]$), ($EPRP.EPRPSZ[eprpno]$), ($EPRP.EXINF[eprpno]$), ($EPRP.EPRPSET[eprpno]$), ($EPRP.EPRPGET[eprpno]$) },$NL$
421 $END$
422$ // 状態アナウンスプロパティマップ
423 $TAB${ (0x9D), (EPC_RULE_GET), $FORMAT("0x%1$x" , +anno_len)$, (intptr_t)_echonet_$EOBJ.EOBJID[eobjid]$_anno_prpmap, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },$NL$
424$ // Setプロパティマップ
425 $TAB${ (0x9E), (EPC_RULE_GET), $FORMAT("0x%1$x" , +set_len)$, (intptr_t)_echonet_$EOBJ.EOBJID[eobjid]$_set_prpmap, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },$NL$
426$ // Getプロパティマップ
427 $TAB${ (0x9F), (EPC_RULE_GET), $FORMAT("0x%1$x" , +get_len)$, (intptr_t)_echonet_$EOBJ.EOBJID[eobjid]$_get_prpmap, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) }
428$ // ノードプロファイルの場合
429 $IF (EOBJ.EOBJATR[eobjid] & (EOBJ_LOCAL_NODE|EOBJ_SYNC_REMOTE_NODE|EOBJ_ASYNC_REMOTE_NODE)) != 0$
430 ,$NL$
431$ // インスタンス数
432 $TAB${ (0xD3), (EPC_RULE_GET), (3), (intptr_t)_echonet_$EOBJ.EOBJID[eobjid]$_inst_count, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },$NL$
433$ // クラス数
434 $TAB${ (0xD4), (EPC_RULE_GET), (2), (intptr_t)_echonet_$EOBJ.EOBJID[eobjid]$_class_count, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },$NL$
435$ // インスタンスリスト通知
436 $TAB${ (0xD5), (EPC_RULE_ANNO), sizeof(_echonet_$EOBJ.EOBJID[eobjid]$_inst_list), (intptr_t)_echonet_$EOBJ.EOBJID[eobjid]$_inst_list, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },$NL$
437$ // インスタンスリストS
438 $TAB${ (0xD6), (EPC_RULE_GET), sizeof(_echonet_$EOBJ.EOBJID[eobjid]$_inst_list), (intptr_t)_echonet_$EOBJ.EOBJID[eobjid]$_inst_list, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },$NL$
439$ // クラスリストS
440 $TAB${ (0xD7), (EPC_RULE_GET), sizeof(_echonet_$EOBJ.EOBJID[eobjid]$_class_list), (intptr_t)_echonet_$EOBJ.EOBJID[eobjid]$_class_list, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) }$NL$
441 $ELSE$
442 $NL$
443 $END$
444 };$NL$
445 $NL$
446 $END$$NL$
447
448$ELSE$
449 TOPPERS_EMPTY_LABEL(const EPRPINIB, _echonet_eprpinib_table);$NL$
450$END$
451
452$
453$ ECHONET Liteオブジェクト
454$
455/*$NL$
456$SPC$* ECHONET Lite Object Functions$NL$
457$SPC$*/$NL$
458$NL$
459
460$ ECHONET LiteオブジェクトID番号の最大値
461const ID _echonet_tmax_eobjid = (TMIN_EOBJID + TNUM_EOBJID - 1);$NL$
462$NL$
463
464$ ECHONET Liteオブジェクト初期化ブロックの生成
465$IF LENGTH(EOBJ.ID_LIST)$
466 const EOBJINIB _echonet_eobjinib_table[TNUM_EOBJID] = {$NL$
467 $JOINEACH eobjid EOBJ.ID_LIST ",\n"$
468$ // eobjatrが([EOBJ_LOCAL_NODE] | [EOBJ_SYNC_REMOTE_NODE] | [EOBJ_ASYNC_REMOTE_NODE] | [EOBJ_DEVICE])でない場合(E_RSATR)
469 $IF (EOBJ.EOBJATR[eobjid] & ~(EOBJ_LOCAL_NODE|EOBJ_SYNC_REMOTE_NODE|EOBJ_ASYNC_REMOTE_NODE|EOBJ_DEVICE)) != 0$
470 $ERROR EOBJ.TEXT_LINE[eobjid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "eobjatr", EOBJ.EOBJATR[eobjid], eobjid, "ECN_CRE_EOBJ")$$END$
471 $END$
472
473$ // ノードプロファイルオブジェクトの場合
474 $IF (EOBJ.EOBJATR[eobjid] & (EOBJ_LOCAL_NODE|EOBJ_SYNC_REMOTE_NODE|EOBJ_ASYNC_REMOTE_NODE)) != 0$
475$ // (enodid == EOBJ_NULL)でない場合(E_PAR)
476 $IF !EQ(EOBJ.ENODID[eobjid], EOBJ_NULL)$
477 $ERROR EOBJ.TEXT_LINE[eobjid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "enodid", EOBJ.ENODID[eobjid], eobjid, "ECN_CRE_EOBJ")$$END$
478 $END$
479
480$ // (eojx1 == EOJ_X1_PROFILE)でない場合(E_PAR)
481 $IF EOBJ.EOJX1[eobjid] != EOJ_X1_PROFILE$
482 $ERROR EOBJ.TEXT_LINE[eobjid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "eojx1", EOBJ.EOJX1[eobjid], eobjid, "ECN_CRE_EOBJ")$$END$
483 $END$
484
485$ // (eojx2 == EOJ_X2_NODE_PROFILE)でない場合(E_PAR)
486 $IF EOBJ.EOJX2[eobjid] != EOJ_X2_NODE_PROFILE$
487 $ERROR EOBJ.TEXT_LINE[eobjid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "eojx2", EOBJ.EOJX2[eobjid], eobjid, "ECN_CRE_EOBJ")$$END$
488 $END$
489
490$ // (1 <= eojx3 && eojx3 <= 2)でない場合(E_PAR)
491 $IF !(1 <= EOBJ.EOJX3[eobjid] && EOBJ.EOJX3[eobjid] <= 2)$
492 $ERROR EOBJ.TEXT_LINE[eobjid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "eojx3", EOBJ.EOJX3[eobjid], eobjid, "ECN_CRE_EOBJ")$$END$
493 $END$
494$ // 機器オブジェクトの場合
495 $ELSE$
496$ // (enodid != EOBJ_NULL)でない場合(E_PAR)
497 $IF EQ(EOBJ.ENODID[eobjid], EOBJ_NULL)$
498 $ERROR EOBJ.TEXT_LINE[eobjid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "enodid", EOBJ.ENODID[eobjid], eobjid, "ECN_CRE_EOBJ")$$END$
499 $END$
500
501$ // (0 <= eojx1 && eojx1 <= 255)でない場合(E_PAR)
502 $IF !(0 <= EOBJ.EOJX1[eobjid] && EOBJ.EOJX1[eobjid] <= 255)$
503 $ERROR EOBJ.TEXT_LINE[eobjid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "eojx1", EOBJ.EOJX1[eobjid], eobjid, "ECN_CRE_EOBJ")$$END$
504 $END$
505
506$ // (0 <= eojx2 && eojx2 <= 255)でない場合(E_PAR)
507 $IF !(0 <= EOBJ.EOJX2[eobjid] && EOBJ.EOJX2[eobjid] <= 255)$
508 $ERROR EOBJ.TEXT_LINE[eobjid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "eojx2", EOBJ.EOJX2[eobjid], eobjid, "ECN_CRE_EOBJ")$$END$
509 $END$
510
511$ // (0 <= eojx3 && eojx3 <= 255)でない場合(E_PAR)
512 $IF !(0 <= EOBJ.EOJX3[eobjid] && EOBJ.EOJX3[eobjid] <= 255)$
513 $ERROR EOBJ.TEXT_LINE[eobjid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "eojx3", EOBJ.EOJX3[eobjid], eobjid, "ECN_CRE_EOBJ")$$END$
514 $END$
515 $END$
516
517$ // ECHONET Liteオブジェクト初期化ブロック
518 $TAB${ ($EOBJ.EOBJATR[eobjid]$), ($EOBJ.ENODID[eobjid]$), ($EOBJ.EXINF[eobjid]$), ($EOBJ.EOJX1[eobjid]$), ($EOBJ.EOJX2[eobjid]$), ($EOBJ.EOJX3[eobjid]$), _echonet_$EOBJ.EOBJID[eobjid]$_eprpinib_table, TNUM_$EOBJ.EOBJID[eobjid]$_EPRPNO }
519 $END$$NL$
520 };$NL$
521 $NL$
522$ELSE$
523 TOPPERS_EMPTY_LABEL(const EOBJINIB, _echonet_eobjinib_table);$NL$
524$END$
525$NL$
526
527$ ECHONET Liteノード管理ブロックの数
528const int _echonet_tnum_enodid = TNUM_ENODID;$NL$
529$NL$
530
531$
532$ ECHONET Liteノード管理ブロック
533$
534/*$NL$
535$SPC$* ECHONET Lite Node Functions$NL$
536$SPC$*/$NL$
537$NL$
538$ ECHONET LiteノードとIPアドレスの対応情報ブロックの生成
539$FOREACH enodid ENOD.LIST$
540 $eobj_list = {}$
541 $FOREACH eobjid EOBJ.ID_LIST$
542 $IF EQ(EOBJ.ENODID[eobjid], enodid)$
543 $eobj_list = APPEND(eobj_list, eobjid)$
544 $END$
545 $END$
546 /*$NL$
547 $SPC$* ノードに所属する機器オブジェクトの一覧$NL$
548 $SPC$*/$NL$
549 const EOBJINIB *_echonet_$EOBJ.EOBJID[enodid]$_eobjinib_table[TNUM_$EOBJ.EOBJID[enodid]$_EOBJNO] = {$NL$
550 $JOINEACH eobjid eobj_list ",\n"$
551 $TAB${ &_echonet_eobjinib_table[$eobjid$ - 1] }
552 $END$$NL$
553 };$NL$
554$END$$NL$
555
556$IF LENGTH(ENOD.LIST)$
557 /*$NL$
558 $SPC$* ECHONET Liteノード管理ブロック$NL$
559 $SPC$*/$NL$
560 EOBJCB _echonet_eobjcb_table[TNUM_ENODID] = {$NL$
561 $JOINEACH enodid ENOD.LIST ",\n"$
562 $TAB${ &_echonet_eobjinib_table[$enodid$ - 1], _echonet_$EOBJ.EOBJID[enodid]$_eobjinib_table, TNUM_$EOBJ.EOBJID[enodid]$_EOBJNO }
563 $END$$NL$
564 };$NL$
565$ELSE$
566 TOPPERS_EMPTY_LABEL(EOBJCB, _echonet_eobjcb_table);$NL$
567$END$
568$NL$
569
570$ ECHONET LiteノードとIPアドレスの対応情報の数
571const int _echonet_tnum_enodadr = TNUM_ENODADR;$NL$
572$NL$
573
574$
575$ ECHONET LiteノードとIPアドレスの対応情報
576$
577/*$NL$
578$SPC$* ECHONET Lite Node Functions$NL$
579$SPC$*/$NL$
580$NL$
581$ ECHONET LiteノードとIPアドレスの対応情報ブロックの生成
582$IF LENGTH(EOBJ.ID_LIST)$
583 ENODADRB _echonet_enodadrb_table[TNUM_ENODADR] = {$NL$
584 $JOINEACH enodid ENOD.LIST ",\n"$
585 $IF enodid == 1$
586 $TAB$/* ENOD_MULTICAST_ID $TAB$*/ { true, ECHONET_MULTICAST_ADDR },$NL$
587 $TAB$/* ENOD_LOCAL_ID $TAB$*/ { true, },$NL$
588 $TAB$/* ENOD_API_ID $TAB$*/ { true, }
589 $ELSE$
590 $TAB$/* ENOD_REMOTE_ID + $enodid - 4$$TAB$*/ { true, }
591 $END$
592 $END$$NL$
593 };$NL$
594$ELSE$
595 TOPPERS_EMPTY_LABEL(ENODADRB, _echonet_enodadrb_table);$NL$
596$END$
597$NL$
598
599$NL$
600#include "kernel_cfg.h"$NL$
601$NL$
602
603$
604$ ECHONET Lite カーネルオブジェクトID
605$
606const ID _echonet_ecn_svc_taskid = ECHONET_SVC_TASK;$NL$
607const ID _echonet_ecn_udp_taskid = ECHONET_UDP_TASK;$NL$
608const ID _echonet_ecn_api_mailboxid = ECHONET_API_MAILBOX;$NL$
609const ID _echonet_ecn_svc_mailboxid = ECHONET_SVC_MAILBOX;$NL$
610const ID _echonet_ecn_udp_mailboxid = ECHONET_UDP_MAILBOX;$NL$
611const ID _echonet_ecn_mem_semid = ECHONET_MEM_SEMAPHORE;$NL$
612$NL$
613
Note: See TracBrowser for help on using the repository browser.