source: asp3_tinet_ecnl_rx/trunk/ntshell/echonet/echonet.trb@ 337

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

ASP3版ECNLを追加

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