[388] | 1 | # =====================================================================
|
---|
| 2 | #
|
---|
| 3 | # TOPPERS ECHONET Lite Communication Middleware
|
---|
| 4 | #
|
---|
[400] | 5 | # Copyright (C) 2014-2019 Cores Co., Ltd. Japan
|
---|
[388] | 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"
|
---|
| 51 | EOS
|
---|
| 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
|
---|
| 66 | end
|
---|
| 67 |
|
---|
| 68 | # ローカルのノードプロファイルは1つだけ
|
---|
| 69 | if $LOCAL_NODE.length != 1
|
---|
| 70 | error_exit("Local node must be only one.")
|
---|
| 71 | end
|
---|
| 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}")
|
---|
| 81 | end
|
---|
| 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}")
|
---|
| 110 | end
|
---|
| 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}")
|
---|
| 124 | end
|
---|
| 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 */
|
---|
| 133 | EOS
|
---|
| 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"
|
---|
| 145 | EOS
|
---|
| 146 |
|
---|
| 147 | #
|
---|
| 148 | # インクルードディレクティブ(#include)
|
---|
| 149 | #
|
---|
| 150 | $echonetCfgC.add(<<EOS)
|
---|
| 151 | /*
|
---|
| 152 | * Include Directives (#include)
|
---|
| 153 | */
|
---|
| 154 | EOS
|
---|
| 155 | $includeFiles.each do |file|
|
---|
| 156 | $echonetCfgC.add("#include #{file}")
|
---|
| 157 | end
|
---|
| 158 | $echonetCfgC.add(<<EOS)
|
---|
| 159 | #include "echonet_cfg.h"
|
---|
| 160 | #include "kernel_cfg.h"
|
---|
| 161 |
|
---|
| 162 | EOS
|
---|
| 163 |
|
---|
| 164 | #
|
---|
| 165 | # オブジェクトのID番号を保持する変数
|
---|
| 166 | #
|
---|
| 167 | if $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
|
---|
| 175 | end
|
---|
| 176 |
|
---|
| 177 | #
|
---|
| 178 | # ECHONET Liteプロパティ
|
---|
| 179 | #
|
---|
| 180 | $echonetCfgC.add(<<EOS)
|
---|
| 181 | /*
|
---|
| 182 | * ECHONET Lite Property Functions
|
---|
| 183 | */
|
---|
| 184 | EOS
|
---|
| 185 |
|
---|
| 186 | IncludeTrb("echonet_chk.trb")
|
---|
| 187 |
|
---|
| 188 | # ECHONET Liteプロパティ初期化ブロックの生成
|
---|
| 189 | if $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
|
---|
| 470 | else
|
---|
| 471 | $echonetCfgC.add("TOPPERS_EMPTY_LABEL(const EPRPINIB, _echonet_eprpinib_table);")
|
---|
| 472 | end
|
---|
| 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オブジェクト初期化ブロックの生成
|
---|
| 487 | if $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("};")
|
---|
| 545 | else
|
---|
| 546 | $echonetCfgC.add("TOPPERS_EMPTY_LABEL(const EOBJINIB, _echonet_eobjinib_table);")
|
---|
| 547 | end
|
---|
| 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("};")
|
---|
| 579 | end
|
---|
| 580 | $echonetCfgC.add
|
---|
| 581 |
|
---|
| 582 | if $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("};")
|
---|
| 593 | else
|
---|
| 594 | $echonetCfgC.add("TOPPERS_EMPTY_LABEL(EOBJCB, _echonet_eobjcb_table);")
|
---|
| 595 | end
|
---|
| 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アドレスの対応情報ブロックの生成
|
---|
| 611 | if $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("};")
|
---|
| 625 | else
|
---|
| 626 | $echonetCfgC.add("TOPPERS_EMPTY_LABEL(ENODADRB, _echonet_enodadrb_table);")
|
---|
| 627 | end
|
---|
| 628 | $echonetCfgC.add
|
---|
| 629 |
|
---|
| 630 | #
|
---|
| 631 | # ECHONET Lite カーネルオブジェクトID
|
---|
| 632 | #
|
---|
| 633 | $echonetCfgC.add(<<EOS)
|
---|
| 634 | const ID _echonet_ecn_svc_taskid = ECHONET_SVC_TASK;
|
---|
| 635 | const ID _echonet_ecn_udp_taskid = ECHONET_UDP_TASK;
|
---|
| 636 | const ID _echonet_ecn_api_dataqueueid = ECHONET_API_DATAQUEUE;
|
---|
| 637 | const ID _echonet_ecn_svc_dataqueueid = ECHONET_SVC_DATAQUEUE;
|
---|
| 638 | const ID _echonet_ecn_udp_dataqueueid = ECHONET_UDP_DATAQUEUE;
|
---|
| 639 | #ifndef ECHONET_USE_MALLOC
|
---|
| 640 | const ID _echonet_ecn_mempoolid = ECHONET_MEMPOOL;
|
---|
| 641 | #endif
|
---|
| 642 | EOS
|
---|
| 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;")
|
---|