source: azure_iot_hub/trunk/ntshell/echonet/echonet.trb@ 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: 23.3 KB
Line 
1# =====================================================================
2#
3# TOPPERS ECHONET Lite Communication Middleware
4#
5# Copyright (C) 2014-2017 Cores Co., Ltd. Japan
6#
7# 上記著作権者
8は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10# 変・再é…
11å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
12# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14# スコード中に含まれていること.
15# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16# 用できる形で再é…
17å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
18å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
19# 者
20マニュアルなど)に,上記の著作権表示,この利用条件および下記
21# の無保証規定を掲載すること.
22# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23# 用できない形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
25# と.
26# (a) 再é…
27å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
28マニュアルなど)に,上記の著
29# 作権表示,この利用条件および下記の無保証規定を掲載すること.
30# (b) 再é…
31å¸ƒã®å½¢æ…
32‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
33# 報告すること.
34# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
35# 害からも,上記著作権者
36およびTOPPERSプロジェクトをå…
37è²¬ã™ã‚‹ã“と.
38# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
39# 由に基づく請求からも,上記著作権者
40およびTOPPERSプロジェクトを
41# å…
42è²¬ã™ã‚‹ã“と.
43#
44# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
47# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
48# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
49# の責任を負わない.
50#
51# @(#) $Id$
52#
53# =====================================================================
54
55# =====================================================================
56# echonet_cfg.hの生成
57# =====================================================================
58
59$echonetCfgH = GenFile.new("echonet_cfg.h")
60$echonetCfgH.add(<<EOS)
61/* echonet_cfg.h */
62#ifndef TOPPERS_ECHONET_CFG_H
63#define TOPPERS_ECHONET_CFG_H
64
65#include "echonet_app_config.h"
66EOS
67
68# ノードリストの作成
69$ENOD_LIST = []
70$LOCAL_NODE = []
71$REMOTE_NODE = []
72
73$cfgData[:ECN_CRE_EOBJ].sort.each do |key, params|
74 # ノードプロファイルオブジェクトの場合
75 if (params[:eobjatr] & $EOBJ_LOCAL_NODE) != 0
76 $LOCAL_NODE << key
77 # 機器オブジェクトの場合
78 elsif (params[:eobjatr] & ($EOBJ_SYNC_REMOTE_NODE | $EOBJ_ASYNC_REMOTE_NODE)) != 0
79 $REMOTE_NODE << key
80 end
81end
82
83# ローカルのノードプロファイルは1つだけ
84if $LOCAL_NODE.length != 1
85 error_exit("Local node must be only one.")
86end
87
88$ENOD_LIST.concat($LOCAL_NODE)
89$ENOD_LIST.concat($REMOTE_NODE)
90
91$echonetCfgH.add2("#define TNUM_ENODID #{$ENOD_LIST.length}")
92
93$echonetCfgH.add2("#define TNUM_EOBJID #{$cfgData[:ECN_CRE_EOBJ].length}")
94$cfgData[:ECN_CRE_EOBJ].each do |key, params|
95 $echonetCfgH.add("#define #{params[:eobjid]} #{key}")
96end
97$echonetCfgH.add
98
99$cfgData[:ECN_CRE_EOBJ].each do |key, params|
100 eprp_list = []
101 prp_map_cnt = 3
102 # ノードプロファイルの場合
103 if (params[:eobjatr] & ($EOBJ_LOCAL_NODE | $EOBJ_SYNC_REMOTE_NODE | $EOBJ_ASYNC_REMOTE_NODE)) != 0
104 prp_map_cnt = prp_map_cnt + 5
105 end
106
107 $cfgData[:ECN_DEF_EPRP].each do |key2, params2|
108 if params2[:eobjid] == params[:eobjid].str
109 eprp_list << params2[:eprpcd].val
110 end
111
112 if (params2[:eprpcd] == 0x9D) || (params2[:eprpcd] == 0x9E) || (params2[:eprpcd] == 0x9F)
113 prp_map_cnt = prp_map_cnt - 1
114 end
115
116 # ノードプロファイルの場合
117 if (params[:eobjatr] & ($EOBJ_LOCAL_NODE | $EOBJ_SYNC_REMOTE_NODE | $EOBJ_ASYNC_REMOTE_NODE)) != 0
118 if (params2[:eprpcd] >= 0xD3) && (params2[:eprpcd] <= 0xD7)
119 prp_map_cnt = prp_map_cnt - 1
120 end
121 end
122 end
123
124 $echonetCfgH.add("#define TNUM_#{params[:eobjid]}_EPRPNO #{eprp_list.length + prp_map_cnt}")
125end
126$echonetCfgH.add
127
128$ENOD_LIST.each do |enodid|
129 eobj_count = 0
130 eobjid = $cfgData[:ECN_CRE_EOBJ][enodid][:eobjid].str
131
132 $cfgData[:ECN_CRE_EOBJ].each do |key2, params2|
133 if params2[:enodid] == eobjid
134 eobj_count = eobj_count + 1
135 end
136 end
137
138 $echonetCfgH.add("#define TNUM_#{$cfgData[:ECN_CRE_EOBJ][enodid][:eobjid]}_EOBJNO #{eobj_count}")
139end
140$echonetCfgH.add
141
142$echonetCfgH.add(<<EOS)
143#ifndef TNUM_ENODADR
144#define TNUM_ENODADR 100
145#endif
146
147#endif /* TOPPERS_ECHONET_CFG_H */
148EOS
149
150# =====================================================================
151# echonet_cfg.cの生成
152# =====================================================================
153
154$echonetCfgC = GenFile.new("echonet_cfg.c")
155$echonetCfgC.add(<<EOS)
156/* echonet_cfg.c */
157#include <kernel.h>
158#include <sil.h>
159#include "echonet.h"
160EOS
161
162#
163# インクルードディレクティブ(#include)
164#
165$echonetCfgC.add(<<EOS)
166/*
167 * Include Directives (#include)
168 */
169EOS
170$includeFiles.each do |file|
171 $echonetCfgC.add("#include #{file}")
172end
173$echonetCfgC.add(<<EOS)
174#include "echonet_cfg.h"
175#include "kernel_cfg.h"
176
177EOS
178
179#
180# オブジェクトのID番号を保持する変数
181#
182if $USE_EXTERNAL_ID
183 $echonetCfgC.add("/*")
184 $echonetCfgC.add(" * Variables for Object ID")
185 $echonetCfgC.add(" */")
186 $echonetCfgC.add
187 $cfgData[:ECN_CRE_EOBJ].each do |key, params|
188 $echonetCfgC.add("const ID #{params[:eobjid]}_id = #{params[:eobjid].val};")
189 end
190end
191
192#
193# ECHONET Liteプロパティ
194#
195$echonetCfgC.add(<<EOS)
196/*
197 * ECHONET Lite Property Functions
198 */
199EOS
200
201IncludeTrb("echonet_chk.trb")
202
203# ECHONET Liteプロパティ初期化ブロックの生成
204if $cfgData[:ECN_CRE_EOBJ].length > 0 && $cfgData[:ECN_DEF_EPRP].length > 0
205 $ENOD_LIST.each do |enodid|
206 $INST_LIST = []
207 $CLASS_LIST = []
208 eobjid = $cfgData[:ECN_CRE_EOBJ][enodid][:eobjid].str
209
210 $cfgData[:ECN_CRE_EOBJ].each do |key, params|
211 if params[:enodid] == eobjid
212 $INST_LIST << key
213
214 m = -1
215 $CLASS_LIST.each do |id|
216 if (params[:eojx1] == $cfgData[:ECN_CRE_EOBJ][id][:eojx1]) && (params[:eojx2] == $cfgData[:ECN_CRE_EOBJ][id][:eojx2])
217 m = id
218 end
219 end
220 if m == -1
221 $CLASS_LIST << key
222 end
223 end
224 end
225
226 $echonetCfgC.add("/*")
227 $echonetCfgC.add(" * インスタンス数")
228 $echonetCfgC.add(" */")
229 inst_list_len = $INST_LIST.length
230 $echonetCfgC.add("const uint8_t _echonet_#{$cfgData[:ECN_CRE_EOBJ][enodid][:eobjid]}_inst_count[] = {")
231 $echonetCfgC.add(" #{sprintf("0x%1$x, 0x%2$x, 0x%3$x", (inst_list_len & 0xFF0000) >> 16, (inst_list_len & 0xFF00) >> 8, inst_list_len & 0xFF)}")
232 $echonetCfgC.add2("};")
233
234 $echonetCfgC.add("/*")
235 $echonetCfgC.add(" * クラス数")
236 $echonetCfgC.add(" */")
237 # ノードプロファイルも含める( + 1)
238 class_list_len = $CLASS_LIST.length + 1
239 $echonetCfgC.add("const uint8_t _echonet_#{$cfgData[:ECN_CRE_EOBJ][enodid][:eobjid]}_class_count[] = {")
240 $echonetCfgC.add(" #{sprintf("0x%1$x, 0x%2$x", (class_list_len & 0xFF00) >> 8, class_list_len & 0xFF)}")
241 $echonetCfgC.add2("};")
242
243 $echonetCfgC.add("/*")
244 $echonetCfgC.add(" * インスタンスリスト")
245 $echonetCfgC.add(" */")
246 pos = 0
247 if inst_list_len > 84
248 error_illegal("E_PAR", $cfgData[:ECN_DEF_EPRP][eprpno], "eprpno", sprintf("instance list count overflow, %1% %2% > 84", enodid, inst_list_len))
249 end
250 $echonetCfgC.add("const uint8_t _echonet_#{$cfgData[:ECN_CRE_EOBJ][enodid][:eobjid]}_inst_list[] = {")
251 if inst_list_len > 0xFE
252 $echonetCfgC.append(" 0xFF, ")
253 else
254 $echonetCfgC.append(sprintf(" 0x%1$x, ", inst_list_len))
255 end
256 $INST_LIST.each_with_index do |id, index|
257 $echonetCfgC.append(", ") if index > 0
258 $echonetCfgC.append(sprintf("0x%1$x, 0x%2$x, 0x%3$x", $cfgData[:ECN_CRE_EOBJ][id][:eojx1].val, $cfgData[:ECN_CRE_EOBJ][id][:eojx2].val, $cfgData[:ECN_CRE_EOBJ][id][:eojx3].val))
259 end
260 $echonetCfgC.add
261 $echonetCfgC.add2("};")
262
263 $echonetCfgC.add("/*")
264 $echonetCfgC.add(" * クラスリスト")
265 $echonetCfgC.add(" */")
266 pos = 0
267 class_list_len = $CLASS_LIST.length
268 if class_list_len > 84
269 error_illegal("E_PAR", $cfgData[:ECN_DEF_EPRP][eprpno], "eprpno", sprintf("class list count overflow, %1% %2% > 84", enodid, class_list_len))
270 end
271 $echonetCfgC.add("const uint8_t _echonet_#{$cfgData[:ECN_CRE_EOBJ][enodid][:eobjid]}_class_list[] = {")
272 if class_list_len > 0xFE
273 $echonetCfgC.append(" 0xFF, ")
274 else
275 $echonetCfgC.append(" #{sprintf("0x%1$x, ", class_list_len)}")
276 end
277 $CLASS_LIST.each_with_index do |id, index|
278 $echonetCfgC.append(", ") if index > 0
279 $echonetCfgC.append(sprintf("0x%1$x, 0x%2$x", $cfgData[:ECN_CRE_EOBJ][id][:eojx1].val, $cfgData[:ECN_CRE_EOBJ][id][:eojx2].val))
280 end
281 $echonetCfgC.add
282 $echonetCfgC.add2("};")
283 end
284
285 $cfgData[:ECN_CRE_EOBJ].each do |key, params|
286 eprp_list = []
287 anno_list = []
288 set_list = []
289 get_list = [ 0x9D, 0x9E, 0x9F ]
290 anno_map = []
291 set_map = []
292 get_map = []
293 for i in 0..15 do
294 anno_map[i] = 0x00
295 set_map[i] = 0x00
296 get_map[i] = 0x00
297 end
298 # 0x9D、0x9E、0x9FはONにしておく
299 for i in 13..15 do
300 anno_map[i] = anno_map[i] | 0x02
301 get_map[i] = get_map[i] | 0x02
302 end
303 # ノードプロファイルの場合
304 if (params[:eobjatr] & ($EOBJ_LOCAL_NODE | $EOBJ_SYNC_REMOTE_NODE | $EOBJ_ASYNC_REMOTE_NODE)) != 0
305 anno_map[5] = anno_map[5] | 0x20
306 anno_list << 0xD5
307 for i in [ 3, 4, 6, 7] do
308 get_map[i] = get_map[i] | 0x20
309 end
310 get_list.concat([ 0xD3, 0xD4, 0xD6, 0xD7 ])
311 end
312
313 $cfgData[:ECN_DEF_EPRP].each do |key2, params2|
314 if params2[:eobjid] == params[:eobjid].str
315 # (0x80 <= eprpcd && eprpcd <= 0xFF)でない場合(E_PAR)
316 if !(0x80 <= params2[:eprpcd] && params2[:eprpcd] <= 0xFF)
317 error_illegal_sym("E_PAR", params2, :eprpcd, :eprpno)
318 end
319
320 # eprpatrが([EPC_RULE_SET] | [EPC_RULE_GET] | [EPC_RULE_ANNO] | [EPC_ANNOUNCE]| [EPC_VARIABLE])でない場合(E_RSATR)
321 if (params2[:eprpatr] & ~($EPC_RULE_SET | $EPC_RULE_GET | $EPC_RULE_ANNO | $EPC_ANNOUNCE | $EPC_VARIABLE)) != 0
322 error_illegal_sym("E_RSATR", params2, :eprpatr, :eprpno)
323 end
324
325 # (0 <= eprpsz && eprpsz <= 255)でない場合(E_PAR)
326 if !(0 <= params2[:eprpsz] && params2[:eprpsz] <= 255)
327 error_illegal_sym("E_PAR", params2, :eprpsz, :eprpno)
328 end
329
330 # プロパティマップに設定
331 pos = params2[:eprpcd] & 0xF
332 bit = (params2[:eprpcd] >> 4) - 8
333 if (params2[:eprpatr] & $EPC_ANNOUNCE) != 0
334 anno_list << params2[:eprpcd].val
335 anno_map[pos] |= (1 << bit)
336 end
337 if (params2[:eprpatr] & $EPC_RULE_SET) != 0
338 set_list << params2[:eprpcd].val
339 set_map[pos] |= (1 << bit)
340 end
341 if (params2[:eprpatr] & $EPC_RULE_GET) != 0
342 get_list << params2[:eprpcd].val
343 get_map[pos] |= (1 << bit)
344 end
345
346 eprp_list << key2
347 end
348 end
349
350 # 必
351須アナウンスプロパティがあるかチェック
352 must_anno_map = getPropertyInfo(params[:eojx1], params[:eojx2], $EPC_ANNOUNCE)
353 i = 0
354 while i < must_anno_map.length do
355 if !anno_list.include?(must_anno_map[i])
356 error_exit(sprintf("Required announce property (0x%1$x) of %2% is not defined.", must_anno_map[i].val, key))
357 end
358 i = i + 1
359 end
360
361 # 必
362須SETプロパティがあるかチェック
363 must_set_map = getPropertyInfo(params[:eojx1], params[:eojx2], $EPC_RULE_SET)
364 i = 0
365 while i < must_set_map.length
366 if !set_list.include?(must_set_map[i])
367 error_exit(sprintf("Required set property (0x%1$x) of %2% is not defined.", must_set_map[i].val, key))
368 end
369 i = i + 1
370 end
371
372 # 必
373須GETプロパティがあるかチェック
374 must_get_map = getPropertyInfo(params[:eojx1], params[:eojx2], $EPC_RULE_GET)
375 i = 0
376 while i < must_get_map.length
377 if !get_list.include?(must_get_map[i])
378 error_exit(sprintf("Required get property (0x%0x) of %s is not defined.", must_get_map[i], params[:eobjno]))
379 end
380 i = i + 1
381 end
382
383 $echonetCfgC.add("/*")
384 $echonetCfgC.add(" * アナウンスプロパティマップ")
385 $echonetCfgC.add(" */")
386 anno_list = anno_list.sort
387 anno_len = anno_list.length
388 $echonetCfgC.add("const uint8_t _echonet_#{params[:eobjid]}_anno_prpmap[] = {")
389 $echonetCfgC.append(" #{sprintf("0x%1$x" , +anno_len)}, ")
390 if anno_len < 16
391 anno_list.each_with_index do |eprpcd, index|
392 $echonetCfgC.append(", ") if index > 0
393 $echonetCfgC.append(sprintf("0x%1$x" , eprpcd))
394 end
395 $echonetCfgC.add
396 anno_len = anno_len + 1
397 else
398 anno_map.each_with_index do |i, index|
399 $echonetCfgC.append(", ") if index > 0
400 $echonetCfgC.append(sprintf("0x%1$x" , anno_map[i].val))
401 end
402 $echonetCfgC.add
403 anno_len = 17
404 end
405 $echonetCfgC.add2("};")
406
407 $echonetCfgC.add("/*")
408 $echonetCfgC.add(" * SETプロパティマップ")
409 $echonetCfgC.add(" */")
410 set_list = set_list.sort
411 set_len = set_list.length
412 $echonetCfgC.add("const uint8_t _echonet_#{params[:eobjid]}_set_prpmap[] = {")
413 $echonetCfgC.append(" #{sprintf("0x%1$x", set_len)}, ")
414 if set_len < 16
415 set_list.each_with_index do |eprpcd, index|
416 $echonetCfgC.append(", ") if index > 0
417 $echonetCfgC.append(sprintf("0x%1$x", eprpcd))
418 end
419 $echonetCfgC.add
420 set_len = set_len + 1
421 else
422 set_map.each do |i|
423 $echonetCfgC.append(", ") if index > 0
424 $echonetCfgC.append(sprintf("0x%1$x", set_map[i].val))
425 end
426 $echonetCfgC.add
427 set_len = 17
428 end
429 $echonetCfgC.add2("};")
430
431 $echonetCfgC.add("/*")
432 $echonetCfgC.add(" * GETプロパティマップ")
433 $echonetCfgC.add(" */")
434 get_list = get_list.sort
435 get_len = get_list.length
436 $echonetCfgC.add("const uint8_t _echonet_#{params[:eobjid]}_get_prpmap[] = {")
437 $echonetCfgC.append(" #{sprintf("0x%1$x", get_len)}, ")
438 if get_len < 16
439 get_list.each_with_index do |eprpcd, index|
440 $echonetCfgC.append(", ") if index > 0
441 $echonetCfgC.append(sprintf("0x%1$x", eprpcd))
442 end
443 $echonetCfgC.add
444 get_len = get_len + 1
445 else
446 for i in [ 0..15 ] do
447 $echonetCfgC.append(", ") if index > 0
448 $echonetCfgC.append(sprintf("0x%1$x", get_map[i].val))
449 end
450 $echonetCfgC.add
451 get_len = 17
452 end
453 $echonetCfgC.add2("};")
454
455 $echonetCfgC.add("/*")
456 $echonetCfgC.add(" * プロパティ定義")
457 $echonetCfgC.add(" */")
458 $echonetCfgC.add("const EPRPINIB _echonet_#{params[:eobjid]}_eprpinib_table[TNUM_#{params[:eobjid]}_EPRPNO] = {")
459 eprp_list.each do |eprpno|
460 # ECHONET Liteプロパティ初期化ブロック
461 $echonetCfgC.add(" { (#{$cfgData[:ECN_DEF_EPRP][eprpno][:eprpcd]}), (#{$cfgData[:ECN_DEF_EPRP][eprpno][:eprpatr]}), (#{$cfgData[:ECN_DEF_EPRP][eprpno][:eprpsz]}), (#{$cfgData[:ECN_DEF_EPRP][eprpno][:exinf]}), (#{$cfgData[:ECN_DEF_EPRP][eprpno][:eprpset]}), (#{$cfgData[:ECN_DEF_EPRP][eprpno][:eprpget]}) },")
462 end
463 # 状æ…
464‹ã‚¢ãƒŠã‚¦ãƒ³ã‚¹ãƒ—ロパティマップ
465 $echonetCfgC.add(" { (0x9D), (EPC_RULE_GET), #{sprintf("0x%1$x", anno_len)}, (intptr_t)_echonet_#{params[:eobjid]}_anno_prpmap, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },")
466 # Setプロパティマップ
467 $echonetCfgC.add(" { (0x9E), (EPC_RULE_GET), #{sprintf("0x%1$x", set_len)}, (intptr_t)_echonet_#{params[:eobjid]}_set_prpmap, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },")
468 # Getプロパティマップ
469 $echonetCfgC.append(" { (0x9F), (EPC_RULE_GET), #{sprintf("0x%1$x", get_len)}, (intptr_t)_echonet_#{params[:eobjid]}_get_prpmap, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) }")
470 # ノードプロファイルの場合
471 if (params[:eobjatr] & ($EOBJ_LOCAL_NODE | $EOBJ_SYNC_REMOTE_NODE | $EOBJ_ASYNC_REMOTE_NODE)) != 0
472 $echonetCfgC.add(",")
473 # インスタンス数
474 $echonetCfgC.add(" { (0xD3), (EPC_RULE_GET), (3), (intptr_t)_echonet_#{params[:eobjid]}_inst_count, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },")
475 # クラス数
476 $echonetCfgC.add(" { (0xD4), (EPC_RULE_GET), (2), (intptr_t)_echonet_#{params[:eobjid]}_class_count, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },")
477 # インスタンスリスト通知
478 $echonetCfgC.add(" { (0xD5), (EPC_RULE_ANNO), sizeof(_echonet_#{params[:eobjid]}_inst_list), (intptr_t)_echonet_#{params[:eobjid]}_inst_list, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },")
479 # インスタンスリストS
480 $echonetCfgC.add(" { (0xD6), (EPC_RULE_GET), sizeof(_echonet_#{params[:eobjid]}_inst_list), (intptr_t)_echonet_#{params[:eobjid]}_inst_list, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) },")
481 # クラスリストS
482 $echonetCfgC.add(" { (0xD7), (EPC_RULE_GET), sizeof(_echonet_#{params[:eobjid]}_class_list), (intptr_t)_echonet_#{params[:eobjid]}_class_list, ((EPRP_SETTER *)NULL), ((EPRP_GETTER *)ecn_data_prop_get) }")
483 else
484 $echonetCfgC.add
485 end
486 $echonetCfgC.add2("};")
487 end
488 $echonetCfgC.add
489else
490 $echonetCfgC.add("TOPPERS_EMPTY_LABEL(const EPRPINIB, _echonet_eprpinib_table);")
491end
492
493#
494# ECHONET Liteオブジェクト
495#
496$echonetCfgC.add("/*")
497$echonetCfgC.add(" * ECHONET Lite Object Functions")
498$echonetCfgC.add(" */")
499$echonetCfgC.add
500
501# ECHONET LiteオブジェクトID番号の最大値
502$echonetCfgC.add("const ID _echonet_tmax_eobjid = (TMIN_EOBJID + TNUM_EOBJID - 1);")
503$echonetCfgC.add
504
505# ECHONET Liteオブジェクト初期化ブロックの生成
506if $cfgData[:ECN_CRE_EOBJ].length > 0
507 $echonetCfgC.add("const EOBJINIB _echonet_eobjinib_table[TNUM_EOBJID] = {")
508 $cfgData[:ECN_CRE_EOBJ].each_with_index do |(key, params), index|
509 $echonetCfgC.add(",") if index > 0
510 # eobjatrが([EOBJ_LOCAL_NODE] | [EOBJ_SYNC_REMOTE_NODE] | [EOBJ_ASYNC_REMOTE_NODE] | [EOBJ_DEVICE])でない場合(E_RSATR)
511 if (params[:eobjatr] & ~($EOBJ_LOCAL_NODE | $EOBJ_SYNC_REMOTE_NODE | $EOBJ_ASYNC_REMOTE_NODE | $EOBJ_DEVICE)) != 0
512 error_illegal_sym("E_RSATR", params, :eobjatr, :eobjid)
513 end
514
515 # ノードプロファイルオブジェクトの場合
516 if (params[:eobjatr] & ($EOBJ_LOCAL_NODE | $EOBJ_SYNC_REMOTE_NODE | $EOBJ_ASYNC_REMOTE_NODE)) != 0
517 # (enodid == EOBJ_NULL)でない場合(E_PAR)
518 if params[:enodid] != "EOBJ_NULL"
519 error_illegal_sym("E_PAR", params, :enodid, :eobjid)
520 end
521
522 # (eojx1 == EOJ_X1_PROFILE)でない場合(E_PAR)
523 if params[:eojx1] != $EOJ_X1_PROFILE
524 error_illegal_sym("E_PAR", params, :eojx1, :eobjid)
525 end
526
527 # (eojx2 == EOJ_X2_NODE_PROFILE)でない場合(E_PAR)
528 if params[:eojx2] != $EOJ_X2_NODE_PROFILE
529 error_illegal_sym("E_PAR", params, :eojx2, :eobjid)
530 end
531
532 # (1 <= eojx3 && eojx3 <= 2)でない場合(E_PAR)
533 if !(1 <= params[:eojx3] && params[:eojx3] <= 2)
534 error_illegal_sym("E_PAR", params, :eojx3, :eobjid)
535 end
536 # 機器オブジェクトの場合
537 else
538 # (enodid != EOBJ_NULL)でない場合(E_PAR)
539 if params[:enodid] == "EOBJ_NULL"
540 error_illegal_sym("E_PAR", params, :enodid, :eobjid)
541 end
542
543 # (0 <= eojx1 && eojx1 <= 255)でない場合(E_PAR)
544 if !(0 <= params[:eojx1] && params[:eojx1] <= 255)
545 error_illegal_sym("E_PAR", params, :eojx1, :eobjid)
546 end
547
548 # (0 <= eojx2 && eojx2 <= 255)でない場合(E_PAR)
549 if !(0 <= params[:eojx2] && params[:eojx2] <= 255)
550 error_illegal_sym("E_PAR", params, :eojx2, :eobjid)
551 end
552
553 # (0 <= eojx3 && eojx3 <= 255)でない場合(E_PAR)
554 if !(0 <= params[:eojx3] && params[:eojx3] <= 255)
555 error_illegal_sym("E_PAR", params, :eojx3, :eobjid)
556 end
557 end
558
559 # ECHONET Liteオブジェクト初期化ブロック
560 $echonetCfgC.append(" { (#{params[:eobjatr]}), (#{params[:enodid]}), (#{params[:exinf]}), (#{params[:eojx1]}), (#{params[:eojx2]}), (#{params[:eojx3]}), _echonet_#{params[:eobjid]}_eprpinib_table, TNUM_#{params[:eobjid]}_EPRPNO }")
561 end
562 $echonetCfgC.add
563 $echonetCfgC.add2("};")
564else
565 $echonetCfgC.add("TOPPERS_EMPTY_LABEL(const EOBJINIB, _echonet_eobjinib_table);")
566end
567$echonetCfgC.add
568
569# ECHONET Liteノード管理ブロックの数
570$echonetCfgC.add2("const int _echonet_tnum_enodid = TNUM_ENODID;")
571
572#
573# ECHONET Liteノード管理ブロック
574#
575$echonetCfgC.add("/*")
576$echonetCfgC.add(" * ECHONET Lite Node Functions")
577$echonetCfgC.add(" */")
578$echonetCfgC.add
579# ECHONET LiteノードとIPアドレスの対応情
580報ブロックの生成
581$ENOD_LIST.each do |enodid|
582 eobjid = $cfgData[:ECN_CRE_EOBJ][enodid][:eobjid].str
583 eobj_list = []
584 $cfgData[:ECN_CRE_EOBJ].each do |key, params|
585 if params[:enodid] == eobjid
586 eobj_list << params[:eobjid]
587 end
588 end
589 $echonetCfgC.add("/*")
590 $echonetCfgC.add(" * ノードに所属する機器オブジェクトの一覧")
591 $echonetCfgC.add(" */")
592 $echonetCfgC.add("const EOBJINIB *_echonet_#{$cfgData[:ECN_CRE_EOBJ][enodid][:eobjid]}_eobjinib_table[TNUM_#{$cfgData[:ECN_CRE_EOBJ][enodid][:eobjid]}_EOBJNO] = {")
593 eobj_list.each_with_index do |eobjid, index|
594 $echonetCfgC.add(",") if index > 0
595 $echonetCfgC.append(" { &_echonet_eobjinib_table[#{eobjid} - 1] }")
596 end
597 $echonetCfgC.add
598 $echonetCfgC.add("};")
599end
600$echonetCfgC.add
601
602if $ENOD_LIST.length > 0
603 $echonetCfgC.add("/*")
604 $echonetCfgC.add(" * ECHONET Liteノード管理ブロック")
605 $echonetCfgC.add(" */")
606 $echonetCfgC.add("EOBJCB _echonet_eobjcb_table[TNUM_ENODID] = {")
607 $ENOD_LIST.each_with_index do |enodid, index|
608 $echonetCfgC.add(",") if index > 0
609 $echonetCfgC.append(" { &_echonet_eobjinib_table[#{$cfgData[:ECN_CRE_EOBJ][enodid][:eobjid].str} - 1], _echonet_#{$cfgData[:ECN_CRE_EOBJ][enodid][:eobjid]}_eobjinib_table, TNUM_#{$cfgData[:ECN_CRE_EOBJ][enodid][:eobjid]}_EOBJNO }")
610 end
611 $echonetCfgC.add
612 $echonetCfgC.add("};")
613else
614 $echonetCfgC.add("TOPPERS_EMPTY_LABEL(EOBJCB, _echonet_eobjcb_table);")
615end
616$echonetCfgC.add
617
618# ECHONET LiteノードとIPアドレスの対応情
619報の数
620$echonetCfgC.add("const int _echonet_tnum_enodadr = TNUM_ENODADR;")
621$echonetCfgC.add
622
623#
624# ECHONET LiteノードとIPアドレスの対応情
625å ±
626#
627$echonetCfgC.add("/*")
628$echonetCfgC.add(" * ECHONET Lite Node Functions")
629$echonetCfgC.add(" */")
630$echonetCfgC.add
631
632# ECHONET LiteノードとIPアドレスの対応情
633報ブロックの生成
634if $cfgData[:ECN_CRE_EOBJ].length > 0
635 $echonetCfgC.add("ENODADRB _echonet_enodadrb_table[TNUM_ENODADR] = {")
636 $ENOD_LIST.each_with_index do |enodid, index|
637 $echonetCfgC.add(",") if index > 0
638 if enodid == 1
639 $echonetCfgC.add(" /* ENOD_MULTICAST_ID */ { true, ECHONET_MULTICAST_ADDR },")
640 $echonetCfgC.add(" /* ENOD_LOCAL_ID */ { true, },")
641 $echonetCfgC.append(" /* ENOD_API_ID */ { true, }")
642 else
643 $echonetCfgC.append(" /* ENOD_REMOTE_ID + #{enodid - 4} */ { true, }")
644 end
645 end
646 $echonetCfgC.add
647 $echonetCfgC.add("};")
648else
649 $echonetCfgC.add("TOPPERS_EMPTY_LABEL(ENODADRB, _echonet_enodadrb_table);")
650end
651$echonetCfgC.add
652
653#
654# ECHONET Lite カーネルオブジェクトID
655#
656$echonetCfgC.add(<<EOS)
657const ID _echonet_ecn_svc_taskid = ECHONET_SVC_TASK;
658const ID _echonet_ecn_udp_taskid = ECHONET_UDP_TASK;
659const ID _echonet_ecn_api_dataqueueid = ECHONET_API_DATAQUEUE;
660const ID _echonet_ecn_svc_dataqueueid = ECHONET_SVC_DATAQUEUE;
661const ID _echonet_ecn_udp_dataqueueid = ECHONET_UDP_DATAQUEUE;
662#ifndef ECHONET_USE_MALLOC
663const ID _echonet_ecn_mempoolid = ECHONET_MEMPOOL;
664#endif
665EOS
666
667$echonetCfgC.add
668$echonetCfgC.add("#include \"tinet_cfg.h\"")
669$echonetCfgC.add
670
671#
672# ECHONET Lite TINETオブジェクトID
673#
674$echonetCfgC.add2("const ID _echonet_ecn_udp_cepid = ECHONET_UDP_CEPID;")
Note: See TracBrowser for help on using the repository browser.