source: EcnlProtoTool/trunk/mrbgems/mruby-ecnl/src/mrb_ecnl.c@ 270

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

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 53.6 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2016 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者
7は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9 * 変・再é…
10å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再é…
16å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
17å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
18 * 者
19マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
24 * と.
25 * (a) 再é…
26å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
27マニュアルなど)に,上記の著
28 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
29 * (b) 再é…
30å¸ƒã®å½¢æ…
31‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
32 * 報告すること.
33 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34 * 害からも,上記著作権者
35およびTOPPERSプロジェクトをå…
36è²¬ã™ã‚‹ã“と.
37 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
38 * 由に基づく請求からも,上記著作権者
39およびTOPPERSプロジェクトを
40 * å…
41è²¬ã™ã‚‹ã“と.
42 *
43 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
44お
45 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
46 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
47 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
48 * の責任を負わない.
49 *
50 */
51
52#include <stddef.h>
53#include <stdint.h>
54#include <string.h>
55#include <mruby.h>
56#include <mruby/array.h>
57#include <mruby/data.h>
58#include <mruby/class.h>
59#include <mruby/string.h>
60#include <mruby/hash.h>
61#include <mruby/variable.h>
62#include "echonet.h"
63#include "echonet_fbs.h"
64#include "echonet_agent.h"
65#include "echonet_task.h"
66#include "echonet_lcl_task.h"
67#include "mrb_ecnl.h"
68
69struct RClass *_module_ecnl;
70struct RClass *_class_object;
71struct RClass *_class_node;
72struct RClass *_class_property;
73struct RClass *_class_data;
74struct RClass *_class_iterator;
75struct RClass *_class_svctask;
76
77static void mrb_ecnl_eobject_free(mrb_state *mrb, void *ptr);
78static void mrb_ecnl_enode_free(mrb_state *mrb, void *ptr);
79static void mrb_ecnl_eproperty_free(mrb_state *mrb, void *ptr);
80static void mrb_ecnl_edata_free(mrb_state *mrb, void *ptr);
81static void mrb_ecnl_eiterator_free(mrb_state *mrb, void *ptr);
82static void mrb_ecnl_svctask_free(mrb_state *mrb, void *ptr);
83
84const static struct mrb_data_type mrb_ecnl_eobject_type = { "EObject", mrb_ecnl_eobject_free };
85const static struct mrb_data_type mrb_ecnl_enode_type = { "ENode", mrb_ecnl_enode_free };
86const static struct mrb_data_type mrb_ecnl_eproperty_type = { "EProperty", mrb_ecnl_eproperty_free };
87const static struct mrb_data_type mrb_ecnl_edata_type = { "EData", mrb_ecnl_edata_free };
88const static struct mrb_data_type mrb_ecnl_eiterator_type = { "EIterator", mrb_ecnl_eiterator_free };
89const static struct mrb_data_type mrb_ecnl_svctask_type = { "SvcTask", mrb_ecnl_svctask_free };
90
91static int anno_prpmap_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
92static int set_prpmap_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
93static int get_prpmap_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
94static int inst_count_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
95static int class_count_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
96static int inst_list_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
97static int inst_lists_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
98static int class_lists_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
99
100const static EPRPINIB auto_eproperties[] = {
101 {0x9D, EPC_RULE_GET, 255, 0, NULL, anno_prpmap_prop_get},
102 {0x9E, EPC_RULE_GET, 255, 0, NULL, set_prpmap_prop_get},
103 {0x9F, EPC_RULE_GET, 255, 0, NULL, get_prpmap_prop_get},
104 {0xD3, EPC_RULE_GET, 255, 0, NULL, inst_count_prop_get},
105 {0xD4, EPC_RULE_GET, 255, 0, NULL, class_count_prop_get},
106 {0xD5, EPC_RULE_ANNO, 255, 0, NULL, inst_list_prop_get},
107 {0xD6, EPC_RULE_GET, 255, 0, NULL, inst_lists_prop_get},
108 {0xD7, EPC_RULE_GET, 255, 0, NULL, class_lists_prop_get},
109};
110
111static T_MRB_ECNL_EPROPERTY *cast_prop(const EPRPINIB *inib)
112{
113 return (T_MRB_ECNL_EPROPERTY *)((intptr_t)inib - offsetof(T_MRB_ECNL_EPROPERTY, inib));
114}
115
116static mrb_value mrb_ecnl_eobject_initialize(mrb_state *mrb, mrb_value self)
117{
118 ecn_device_t *obj;
119 mrb_value node;
120 mrb_int eojx1;
121 mrb_int eojx2;
122 mrb_int eojx3;
123 mrb_value props;
124 const mrb_value *rprop;
125 const EPRPINIB **eprp;
126 EPRPINIB *aprops;
127 int i, count, icnt;
128
129 mrb_get_args(mrb, "iiioA", &eojx1, &eojx2, &eojx3, &node, &props);
130
131 if (!mrb_obj_is_kind_of(mrb, node, _class_node)) {
132 mrb_raise(mrb, E_RUNTIME_ERROR, "EObject.new");
133 return mrb_nil_value();
134 }
135
136 rprop = RARRAY_PTR(props);
137 icnt = RARRAY_LEN(props);
138 count = icnt + 3; /* プロパティマップ分 */
139
140 for (i = 0; i < icnt; i++) {
141 T_MRB_ECNL_EPROPERTY *prop;
142
143 if (!mrb_obj_is_kind_of(mrb, rprop[i], _class_property)) {
144 mrb_raise(mrb, E_RUNTIME_ERROR, "eprpinib_table");
145 return mrb_nil_value();
146 }
147
148 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(rprop[i]);
149
150 /* プロパティマップの場合は減算 */
151 switch (prop->inib.eprpcd) {
152 case 0x9D: case 0x9E: case 0x9F:
153 count--;
154 break;
155 }
156 }
157
158 obj = (ecn_device_t *)mrb_calloc(mrb, 1, sizeof(ecn_device_t) + count * sizeof(EPRPINIB *)
159 + (sizeof(EPRPINIB) * 3));
160 DATA_TYPE(self) = &mrb_ecnl_eobject_type;
161 DATA_PTR(self) = obj;
162
163 eprp = (const EPRPINIB **)&obj[1];
164 aprops = (EPRPINIB *)&eprp[count];
165
166 obj->base.inib.eobjatr = EOBJ_DEVICE;
167 obj->base.inib.enodid = 0;
168 obj->base.inib.exinf = (intptr_t)NULL;
169 obj->base.inib.eojx1 = eojx1;
170 obj->base.inib.eojx2 = eojx2;
171 obj->base.inib.eojx3 = eojx3;
172 obj->base.inib.eprp = eprp;
173 obj->base.inib.eprpcnt = count;
174 obj->base.eprpcnt = count;
175
176 obj->node = (ecn_node_t *)DATA_PTR(node);
177
178 count = 0;
179 for (i = 0; i < icnt; i++) {
180 T_MRB_ECNL_EPROPERTY *prop;
181 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(rprop[i]);
182
183 /* プロパティマップの場合は無視 */
184 switch (prop->inib.eprpcd) {
185 case 0x9D: case 0x9E: case 0x9F:
186 continue;
187 }
188
189 prop->eobj = self;
190 eprp[count++] = &prop->inib;
191 }
192
193 for (int j = 0; j < 3; j++) {
194 EPRPINIB *prop = &aprops[j];
195
196 memcpy(prop, &auto_eproperties[j], sizeof(*prop));
197
198 prop->exinf = (intptr_t)obj;
199 eprp[count++] = prop;
200 }
201
202 return self;
203}
204
205static void mrb_ecnl_eobject_free(mrb_state *mrb, void *ptr)
206{
207 ecn_device_t *obj = (ecn_device_t *)ptr;
208 T_MRB_ECNL_EPROPERTY *prop;
209
210 /* 機器オブジェクトの設定として取り込まれた場合は破棄しない */
211 if (obj->base.svc != NULL)
212 return;
213
214 for (int i = 0; i < obj->base.eprpcnt; i++) {
215 const EPRPINIB *eprp = obj->base.inib.eprp[i];
216
217 switch (eprp->eprpcd) {
218 case 0x9D: case 0x9E: case 0x9F:
219 continue;
220 }
221
222 prop = cast_prop(eprp);
223
224 mrb_free(mrb, prop);
225 }
226
227 mrb_free(mrb, obj);
228}
229
230static mrb_value mrb_ecnl_eobject_data_prop_set(mrb_state *mrb, mrb_value self)
231{
232 mrb_value rprp;
233 mrb_value rdat;
234 mrb_value data;
235 T_MRB_ECNL_EPROPERTY *prop;
236
237 mrb_get_args(mrb, "oS", &rprp, &rdat);
238
239 if (!mrb_obj_is_kind_of(mrb, rprp, _class_property)) {
240 mrb_raise(mrb, E_RUNTIME_ERROR, "data_prop_set");
241 return mrb_fixnum_value(0);
242 }
243
244 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(rprp);
245 data = mrb_iv_get(mrb, self, prop->exinf);
246
247 prop->anno = !mrb_str_equal(mrb, data, rdat);
248
249 mrb_iv_set(mrb, self, prop->exinf, rdat);
250
251 return mrb_fixnum_value(RSTRING_LEN(rdat));
252}
253
254static mrb_value mrb_ecnl_eobject_data_prop_get(mrb_state *mrb, mrb_value self)
255{
256 mrb_value rprp;
257 mrb_value rsiz;
258 mrb_value rdat;
259 T_MRB_ECNL_EPROPERTY *prop;
260 int size;
261
262 mrb_get_args(mrb, "oi", &rprp, &rsiz);
263
264 if (!mrb_obj_is_kind_of(mrb, rprp, _class_property)) {
265 mrb_raise(mrb, E_RUNTIME_ERROR, "data_prop_get");
266 return mrb_fixnum_value(0);
267 }
268
269 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(rprp);
270 size = mrb_fixnum(rsiz);
271
272 rdat = mrb_iv_get(mrb, self, prop->exinf);
273 if (RSTRING_LEN(rdat) != size) {
274 mrb_raise(mrb, E_RUNTIME_ERROR, "data_prop_get");
275 return mrb_nil_value();
276 }
277
278 return rdat;
279}
280
281static mrb_value mrb_ecnl_enode_initialize(mrb_state *mrb, mrb_value self)
282{
283 ecn_node_t *nod;
284 mrb_int eojx3;
285 mrb_value props;
286 const mrb_value *rprop;
287 int i, count, icnt;
288 const EPRPINIB **eprp;
289 EPRPINIB *aprops;
290
291 mrb_get_args(mrb, "iA", &eojx3, &props);
292
293 rprop = RARRAY_PTR(props);
294 icnt = RARRAY_LEN(props);
295 count = icnt + 8; /* インスタンスリストなどの分 */
296
297 for (i = 0; i < icnt; i++) {
298 T_MRB_ECNL_EPROPERTY *prop;
299
300 if (!mrb_obj_is_kind_of(mrb, rprop[i], _class_property)) {
301 mrb_raise(mrb, E_RUNTIME_ERROR, "eprpinib_table");
302 return mrb_nil_value();
303 }
304
305 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(rprop[i]);
306
307 /* インスタンスリストなどの場合は減算 */
308 switch (prop->inib.eprpcd) {
309 case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD7:
310 case 0x9D: case 0x9E: case 0x9F:
311 count--;
312 break;
313 }
314 }
315
316 nod = (ecn_node_t *)mrb_calloc(mrb, 1, sizeof(ecn_node_t) + count * sizeof(EPRPINIB *)
317 + (sizeof(EPRPINIB) * 8)/* インスタンスリストなどの分 */);
318 DATA_TYPE(self) = &mrb_ecnl_enode_type;
319 DATA_PTR(self) = nod;
320
321 eprp = (const EPRPINIB **)&nod[1];
322 aprops = (EPRPINIB *)&eprp[count];
323
324 nod->base.inib.eobjatr = EOBJ_LOCAL_NODE;
325 nod->base.inib.enodid = 0;
326 nod->base.inib.exinf = (intptr_t)NULL;
327 nod->base.inib.eojx1 = EOJ_X1_PROFILE;
328 nod->base.inib.eojx2 = EOJ_X2_NODE_PROFILE;
329 nod->base.inib.eojx3 = eojx3;
330 nod->base.inib.eprp = eprp;
331 nod->base.inib.eprpcnt = count;
332 nod->base.eprpcnt = count;
333
334 count = 0;
335 for (i = 0; i < icnt; i++) {
336 T_MRB_ECNL_EPROPERTY *prop;
337 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(rprop[i]);
338
339 /* インスタンスリストなどの場合は無視 */
340 switch (prop->inib.eprpcd) {
341 case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD7:
342 case 0x9D: case 0x9E: case 0x9F:
343 continue;
344 }
345
346 prop->eobj = self;
347 eprp[count++] = &prop->inib;
348 }
349
350 for (int j = 0; j < 8; j++) {
351 EPRPINIB *prop = &aprops[j];
352
353 memcpy(prop, &auto_eproperties[j], sizeof(*prop));
354
355 prop->exinf = (intptr_t)nod;
356 eprp[count++] = prop;
357 }
358
359 return self;
360}
361
362static void mrb_ecnl_enode_free(mrb_state *mrb, void *ptr)
363{
364 ecn_node_t *nod = (ecn_node_t *)ptr;
365 T_MRB_ECNL_EPROPERTY *prop;
366
367 /* ノードの設定として取り込まれた場合は破棄しない */
368 if (nod->base.svc != NULL)
369 return;
370
371 for (int i = 0; i < nod->base.eprpcnt; i++) {
372 const EPRPINIB *eprp = nod->base.inib.eprp[i];
373
374 switch (eprp->eprpcd) {
375 case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD7:
376 case 0x9D: case 0x9E: case 0x9F:
377 continue;
378 }
379
380 prop = cast_prop(eprp);
381
382 mrb_free(mrb, prop);
383 }
384
385 mrb_free(mrb, nod);
386}
387
388static int anno_prpmap_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size)
389{
390 ecn_obj_t *obj = (ecn_obj_t *)item->exinf;
391 uint8_t *dmap = &((uint8_t *)dst)[1];
392 uint8_t count;
393
394 count = obj->annocnt;
395 *(uint8_t *)dst = count;
396 if (count < 16) {
397 memcpy(dmap, obj->pmapAnno, count);
398 return count + 1;
399 }
400 else {
401 memcpy(dmap, obj->pmapAnno, 16);
402 return 17;
403 }
404}
405
406static int set_prpmap_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size)
407{
408 ecn_obj_t *obj = (ecn_obj_t *)item->exinf;
409 uint8_t *dmap = &((uint8_t *)dst)[1];
410 uint8_t count;
411
412 count = obj->setcnt;
413 *(uint8_t *)dst = count;
414 if (count < 16) {
415 memcpy(dmap, obj->pmapSet, count);
416 return count + 1;
417 }
418 else {
419 memcpy(dmap, obj->pmapSet, 16);
420 return 17;
421 }
422}
423
424static int get_prpmap_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size)
425{
426 ecn_obj_t *obj = (ecn_obj_t *)item->exinf;
427 uint8_t *dmap = &((uint8_t *)dst)[1];
428 uint8_t count;
429
430 count = obj->getcnt;
431 *(uint8_t *)dst = count;
432 if (count < 16) {
433 memcpy(dmap, obj->pmapGet, count);
434 return count + 1;
435 }
436 else {
437 memcpy(dmap, obj->pmapGet, 16);
438 return 17;
439 }
440}
441
442static int inst_count_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size)
443{
444 ecn_node_t *nod = (ecn_node_t *)item->exinf;
445 uint8_t *pos = dst;
446 EOBJCB *obj = &svc->eobjcb_table[nod->base.eobjId - 1];
447 int count = obj->eobjcnt;
448
449 pos[0] = count >> 16;
450 pos[1] = count >> 8;
451 pos[2] = count;
452
453 return 3;
454}
455
456static int class_count_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size)
457{
458 ecn_node_t *nod = (ecn_node_t *)item->exinf;
459 uint8_t *pos = dst;
460 int count = svc->eclscnt;
461
462 pos[0] = count >> 8;
463 pos[1] = count;
464
465 return 2;
466}
467
468static int inst_list_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size)
469{
470 ecn_node_t *nod = (ecn_node_t *)item->exinf;
471 uint8_t *pos = dst;
472 EOBJCB *obj = &svc->eobjcb_table[nod->base.eobjId - 1];
473 const EOBJINIB **eobjs = obj->eobjs;
474 int eobjcnt = obj->eobjcnt;
475 int inst_list_pos = svc->inst_list_pos;
476 int count = 0;
477
478 /* 通知数の位置を空けておく */
479 pos++;
480 for (int i = inst_list_pos; (i < eobjcnt) && (count < 84); i++) {
481 const EOBJINIB *eobj = eobjs[i];
482
483 *pos++ = eobj->eojx1;
484 *pos++ = eobj->eojx2;
485 *pos++ = eobj->eojx3;
486 count++;
487 }
488 *(uint8_t *)dst = count;
489
490 inst_list_pos += count;
491 /* 最後まで送信し終わっていたら初めから */
492 if (inst_list_pos >= eobjcnt)
493 inst_list_pos = 0;
494
495 svc->inst_list_pos = inst_list_pos;
496
497 return (int)pos - (int)dst;
498}
499
500static int inst_lists_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size)
501{
502 ecn_node_t *nod = (ecn_node_t *)item->exinf;
503 uint8_t *pos = dst;
504 EOBJCB *obj = &svc->eobjcb_table[nod->base.eobjId - 1];
505 const EOBJINIB **eobjs = obj->eobjs;
506 int eobjcnt = obj->eobjcnt;
507
508 if (eobjcnt < 255)
509 *pos++ = eobjcnt;
510 else
511 *pos++ = 255; /*オーバーフロー*/
512
513 for (int i = 0; (i < eobjcnt) && (i < 84); i++) {
514 const EOBJINIB *eobj = eobjs[i];
515
516 *pos++ = eobj->eojx1;
517 *pos++ = eobj->eojx2;
518 *pos++ = eobj->eojx3;
519 }
520
521 return (int)pos - (int)dst;
522}
523
524static int class_lists_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size)
525{
526 uint8_t *pos = dst;
527 int eclscnt = svc->eclscnt, len;
528
529 if (eclscnt < 255)
530 *pos++ = eclscnt;
531 else
532 *pos++ = 255; /*オーバーフロー*/
533
534 len = 2 * eclscnt;
535 memcpy(pos, svc->eclslst, len);
536 pos += len;
537
538 return (int)pos - (int)dst;
539}
540
541static int mrb_ecnl_prop_set(ecnl_svc_task_t *svc, const EPRPINIB *item, const void *src, int size, bool_t *anno);
542static int mrb_ecnl_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
543
544static mrb_value mrb_ecnl_eproperty_initialize(mrb_state *mrb, mrb_value self)
545{
546 T_MRB_ECNL_EPROPERTY *prop;
547 mrb_value exinf;
548 mrb_value eprpset;
549 mrb_value eprpget;
550 mrb_int eprpcd;
551 mrb_int eprpatr;
552 mrb_int eprpsz;
553 mrb_sym ei, set, get;
554
555 mrb_get_args(mrb, "iiiooo", &eprpcd, &eprpatr, &eprpsz, &exinf, &eprpset, &eprpget);
556
557 if (mrb_type(exinf) == MRB_TT_SYMBOL) {
558 ei = mrb_symbol(exinf);
559 }
560 else if (mrb_type(exinf) == MRB_TT_FALSE) {
561 ei = 0;
562 }
563 else {
564 mrb_raise(mrb, E_RUNTIME_ERROR, "EProperty.new");
565 return mrb_nil_value();
566 }
567
568 if (mrb_type(eprpset) == MRB_TT_SYMBOL) {
569 set = mrb_symbol(eprpset);
570 }
571 else if (mrb_type(eprpset) == MRB_TT_FALSE) {
572 set = 0;
573 }
574 else {
575 mrb_raise(mrb, E_RUNTIME_ERROR, "EProperty.new");
576 return mrb_nil_value();
577 }
578
579 if (mrb_type(eprpget) == MRB_TT_SYMBOL) {
580 get = mrb_symbol(eprpget);
581 }
582 else if (mrb_type(eprpget) == MRB_TT_FALSE) {
583 get = 0;
584 }
585 else {
586 mrb_raise(mrb, E_RUNTIME_ERROR, "EProperty.new");
587 return mrb_nil_value();
588 }
589
590 prop = (T_MRB_ECNL_EPROPERTY *)mrb_malloc(mrb, sizeof(T_MRB_ECNL_EPROPERTY));
591 DATA_TYPE(self) = &mrb_ecnl_eproperty_type;
592 DATA_PTR(self) = prop;
593
594 prop->inib.eprpcd = eprpcd;
595 prop->inib.eprpatr = eprpatr;
596 prop->inib.eprpsz = eprpsz;
597 prop->inib.exinf = 0;
598 prop->inib.eprpset = mrb_ecnl_prop_set;
599 prop->inib.eprpget = mrb_ecnl_prop_get;
600 prop->exinf = ei;
601 prop->eprpset = set;
602 prop->eprpget = get;
603 prop->anno = false;
604
605 return self;
606}
607
608static void mrb_ecnl_eproperty_free(mrb_state *mrb, void *ptr)
609{
610 T_MRB_ECNL_EPROPERTY *prop = (T_MRB_ECNL_EPROPERTY *)ptr;
611 ecn_obj_t *eobj;
612
613 if (ptr == NULL)
614 return;
615
616 if (mrb_type(prop->eobj) == MRB_TT_DATA) {
617 eobj = (ecn_obj_t *)DATA_PTR(prop->eobj);
618
619 /* プロパティの設定として取り込まれた場合は破棄しない */
620 if (eobj != NULL)
621 return;
622 }
623
624 mrb_free(mrb, prop);
625}
626
627/* ECHONET Lite プロパティコード */
628static mrb_value mrb_ecnl_eproperty_get_pcd(mrb_state *mrb, mrb_value self)
629{
630 T_MRB_ECNL_EPROPERTY *prop;
631
632 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(self);
633
634 return mrb_fixnum_value(prop->inib.eprpcd);
635}
636
637/* ECHONET Lite プロパティ属性 */
638static mrb_value mrb_ecnl_eproperty_get_atr(mrb_state *mrb, mrb_value self)
639{
640 T_MRB_ECNL_EPROPERTY *prop;
641
642 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(self);
643
644 return mrb_fixnum_value(prop->inib.eprpatr);
645}
646
647/* ECHONET Lite プロパティのサイズ */
648static mrb_value mrb_ecnl_eproperty_get_sz(mrb_state *mrb, mrb_value self)
649{
650 T_MRB_ECNL_EPROPERTY *prop;
651
652 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(self);
653
654 return mrb_fixnum_value(prop->inib.eprpsz);
655}
656
657/* ECHONET Lite プロパティの拡張情
658å ± */
659static mrb_value mrb_ecnl_eproperty_get_exinf(mrb_state *mrb, mrb_value self)
660{
661 T_MRB_ECNL_EPROPERTY *prop;
662
663 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(self);
664
665 return mrb_iv_get(mrb, prop->eobj, prop->exinf);
666}
667
668/* ECHONET Lite プロパティの拡張情
669報設定 */
670static mrb_value mrb_ecnl_eproperty_set_exinf(mrb_state *mrb, mrb_value self)
671{
672 T_MRB_ECNL_EPROPERTY *prop;
673 mrb_value exinf;
674
675 mrb_get_args(mrb, "o", &exinf);
676
677 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(self);
678
679 mrb_iv_set(mrb, prop->eobj, prop->exinf, exinf);
680
681 return exinf;
682}
683
684/* ECHONET Lite プロパティの設定関数 */
685static mrb_value mrb_ecnl_eproperty_get_setcb(mrb_state *mrb, mrb_value self)
686{
687 T_MRB_ECNL_EPROPERTY *prop;
688
689 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(self);
690
691 if (prop->eprpset == 0)
692 return mrb_nil_value();
693
694 return mrb_symbol_value(prop->eprpset);
695}
696
697/* ECHONET Lite プロパティの取得関数 */
698static mrb_value mrb_ecnl_eproperty_get_getcb(mrb_state *mrb, mrb_value self)
699{
700 T_MRB_ECNL_EPROPERTY *prop;
701
702 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(self);
703
704 if (prop->eprpget == 0)
705 return mrb_nil_value();
706
707 return mrb_symbol_value(prop->eprpget);
708}
709
710/* ECHONET Lite プロパティの通知有無 */
711static mrb_value mrb_ecnl_eproperty_get_anno(mrb_state *mrb, mrb_value self)
712{
713 T_MRB_ECNL_EPROPERTY *prop;
714
715 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(self);
716
717 if (prop->anno)
718 return mrb_true_value();
719
720 return mrb_false_value();
721}
722
723/* ECHONET Lite プロパティの通知有無設定 */
724static mrb_value mrb_ecnl_eproperty_set_anno(mrb_state *mrb, mrb_value self)
725{
726 T_MRB_ECNL_EPROPERTY *prop;
727 mrb_value anno;
728
729 mrb_get_args(mrb, "b", &anno);
730
731 prop = (T_MRB_ECNL_EPROPERTY *)DATA_PTR(self);
732
733 prop->anno = mrb_type(anno) != MRB_TT_FALSE;
734
735 return anno;
736}
737
738/*
739 * データ設定関数
740 */
741static int mrb_ecnl_prop_set(ecnl_svc_task_t *svc, const EPRPINIB *item, const void *src, int size, bool_t *anno)
742{
743 mrb_state *mrb = svc->mrb;
744 T_MRB_ECNL_EPROPERTY *prop = cast_prop(item);
745 mrb_value args[2];
746 mrb_value ret;
747
748 if (prop->eprpset == 0)
749 return 0;
750
751 prop->anno = *anno;
752
753 args[0] = mrb_obj_value(mrb_obj_alloc(mrb, MRB_TT_DATA, _class_property));
754 DATA_TYPE(args[0]) = &mrb_ecnl_eproperty_type;
755 DATA_PTR(args[0]) = prop;
756
757 args[1] = mrb_str_new_static(mrb, src, size);
758
759 ret = mrb_funcall_argv(mrb, prop->eobj, prop->eprpset, 2, args);
760
761 if (mrb_type(ret) != MRB_TT_FIXNUM) {
762 //mrb_raise(mrb, E_RUNTIME_ERROR, "eprpset");
763 return 0;
764 }
765
766 if (*anno)
767 *anno = prop->anno;
768
769 return mrb_fixnum(ret);
770}
771
772/*
773 * データ取得関数
774 */
775static int mrb_ecnl_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size)
776{
777 mrb_state *mrb = svc->mrb;
778 T_MRB_ECNL_EPROPERTY *prop = cast_prop(item);
779 mrb_value args[2];
780 mrb_value ret;
781 int len;
782
783 if (prop->eprpget == 0)
784 return 0;
785
786 args[0] = mrb_obj_value(mrb_obj_alloc(mrb, MRB_TT_DATA, _class_property));
787 DATA_TYPE(args[0]) = &mrb_ecnl_eproperty_type;
788 DATA_PTR(args[0]) = prop;
789
790 args[1] = mrb_fixnum_value(size);
791
792 ret = mrb_funcall_argv(mrb, prop->eobj, prop->eprpget, 2, args);
793
794 if (mrb_type(ret) != MRB_TT_STRING) {
795 //mrb_raise(mrb, E_RUNTIME_ERROR, "eprpget");
796 return 0;
797 }
798
799 len = RSTRING_LEN(ret);
800 if (size > len)
801 size = len;
802
803 memcpy(dst, RSTRING_PTR(ret), size);
804
805 return size;
806}
807
808static mrb_value mrb_ecnl_edata_initialize(mrb_state *mrb, mrb_value self)
809{
810 T_EDATA *dat;
811
812 dat = (T_EDATA *)mrb_malloc(mrb, sizeof(T_EDATA));
813 dat->trn_pos = -1;
814 DATA_TYPE(self) = &mrb_ecnl_edata_type;
815 DATA_PTR(self) = dat;
816
817 return self;
818}
819
820static void mrb_ecnl_edata_free(mrb_state *mrb, void *ptr)
821{
822 T_EDATA *dat = (T_EDATA *)ptr;
823 mrb_free(mrb, dat);
824}
825
826mrb_value mrb_ecnl_edata_new(mrb_state *mrb, T_EDATA *data)
827{
828 mrb_value resv;
829
830 resv = mrb_obj_value(mrb_obj_alloc(mrb, MRB_TT_DATA, _class_data));
831 DATA_TYPE(resv) = &mrb_ecnl_edata_type;
832 DATA_PTR(resv) = data;
833
834 return resv;
835}
836
837/* プロパティ値書き込み・読み出し要求電文折り返し指定 */
838static mrb_value mrb_ecnl_trn_set_get(mrb_state *mrb, mrb_value self)
839{
840 T_EDATA *edat;
841 ER ret;
842
843 edat = (T_EDATA *)DATA_PTR(self);
844 ret = ecn_trn_set_get(mrb, edat, &edat->trn_pos);
845 if (ret != E_OK) {
846 mrb_raise(mrb, E_RUNTIME_ERROR, "trn_set_get");
847 return self;
848 }
849
850 return self;
851}
852
853/* 要求電文へのプロパティ指定追加 */
854static mrb_value mrb_ecnl_add_epc(mrb_state *mrb, mrb_value self)
855{
856 mrb_int epc;
857 T_EDATA *edat;
858 ER ret;
859
860 mrb_get_args(mrb, "i", &epc);
861
862 edat = (T_EDATA *)DATA_PTR(self);
863 ret = ecn_add_epc(mrb, edat, epc);
864 if (ret != E_OK) {
865 mrb_raise(mrb, E_RUNTIME_ERROR, "add_epc");
866 return self;
867 }
868
869 return self;
870}
871
872/* 要求電文へのプロパティデータ追加 */
873static mrb_value mrb_ecnl_add_edt(mrb_state *mrb, mrb_value self)
874{
875 mrb_int epc;
876 mrb_value redt;
877 T_EDATA *edat;
878 ER ret;
879
880 mrb_get_args(mrb, "iS", &epc, &redt);
881
882 edat = (T_EDATA *)DATA_PTR(self);
883 ret = ecn_add_edt(mrb, edat, epc, RSTRING_LEN(redt), RSTRING_PTR(redt));
884 if (ret != E_OK) {
885 mrb_raise(mrb, E_RUNTIME_ERROR, "add_edt");
886 return self;
887 }
888
889 return self;
890}
891
892static mrb_value mrb_ecnl_get_esv(mrb_state *mrb, mrb_value self)
893{
894 mrb_value result;
895 T_EDATA *edat;
896
897 edat = (T_EDATA *)DATA_PTR(self);
898 result = mrb_fixnum_value(edat->hdr.edata.esv);
899
900 return result;
901}
902
903static mrb_value mrb_ecnl_eiterator_initialize(mrb_state *mrb, mrb_value self)
904{
905 T_MRB_ECNL_EITERATOR *itr;
906
907 itr = (T_MRB_ECNL_EITERATOR *)mrb_malloc(mrb, sizeof(T_MRB_ECNL_EITERATOR));
908 DATA_TYPE(self) = &mrb_ecnl_eiterator_type;
909 DATA_PTR(self) = itr;
910
911 return self;
912}
913
914static void mrb_ecnl_eiterator_free(mrb_state *mrb, void *ptr)
915{
916 T_MRB_ECNL_EITERATOR *itr = (T_MRB_ECNL_EITERATOR *)ptr;
917 mrb_free(mrb, itr);
918}
919
920
921/* 応答電文解析イテレーター初期化 */
922static mrb_value mrb_ecnl_itr_ini(mrb_state *mrb, mrb_value self)
923{
924 mrb_value ritr;
925 T_EDATA *edat;
926 T_MRB_ECNL_EITERATOR *eitr;
927 ER ret;
928
929 ritr = mrb_obj_new(mrb, _class_iterator, 0, NULL);
930 eitr = (T_MRB_ECNL_EITERATOR *)DATA_PTR(ritr);
931 eitr->state = 0;
932 eitr->is_eof = false;
933
934 edat = (T_EDATA *)DATA_PTR(self);
935 ret = ecn_itr_ini(&eitr->itr, edat);
936 if (ret != E_OK) {
937 mrb_raise(mrb, E_RUNTIME_ERROR, "itr_ini");
938 return self;
939 }
940
941 return ritr;
942}
943
944/* 応答電文解析イテレーターインクリメント */
945static mrb_value mrb_ecnl_itr_nxt(mrb_state *mrb, mrb_value self)
946{
947 T_MRB_ECNL_EITERATOR *eitr;
948 ER ret;
949
950 eitr = (T_MRB_ECNL_EITERATOR *)DATA_PTR(self);
951 ret = ecn_itr_nxt(mrb, &eitr->itr, &eitr->epc, &eitr->pdc, &eitr->edt);
952 if (ret == E_BOVR) {
953 eitr->state++;
954 eitr->is_eof = eitr->itr.is_eof;
955 }
956 else if (ret != E_OK) {
957 mrb_raise(mrb, E_RUNTIME_ERROR, "itr_nxt");
958 return self;
959 }
960
961 return self;
962}
963
964static mrb_value mrb_ecnl_iterator_get_epc(mrb_state *mrb, mrb_value self)
965{
966 mrb_value result;
967 T_MRB_ECNL_EITERATOR *eitr;
968
969 eitr = (T_MRB_ECNL_EITERATOR *)DATA_PTR(self);
970 result = mrb_fixnum_value(eitr->epc);
971
972 return result;
973}
974
975static mrb_value mrb_ecnl_iterator_get_edt(mrb_state *mrb, mrb_value self)
976{
977 mrb_value result;
978 T_MRB_ECNL_EITERATOR *eitr;
979
980 eitr = (T_MRB_ECNL_EITERATOR *)DATA_PTR(self);
981 result = mrb_str_new(mrb, (char *)eitr->edt, eitr->pdc);
982
983 return result;
984}
985
986static mrb_value mrb_ecnl_iterator_get_state(mrb_state *mrb, mrb_value self)
987{
988 mrb_value result;
989 T_MRB_ECNL_EITERATOR *eitr;
990
991 eitr = (T_MRB_ECNL_EITERATOR *)DATA_PTR(self);
992 result = mrb_fixnum_value(eitr->state);
993
994 return result;
995}
996
997static mrb_value mrb_ecnl_iterator_is_eof(mrb_state *mrb, mrb_value self)
998{
999 mrb_value result;
1000 T_MRB_ECNL_EITERATOR *eitr;
1001
1002 eitr = (T_MRB_ECNL_EITERATOR *)DATA_PTR(self);
1003 result = eitr->is_eof ? mrb_true_value() : mrb_false_value();
1004
1005 return result;
1006}
1007
1008void make_prop_map(ecn_obj_t *eobj, uint8_t *prpmap, int count, ATR flag)
1009{
1010 if (count < 16) {
1011 uint8_t *pos = prpmap;
1012 for (int i = 0; i < eobj->eprpcnt; i++) {
1013 const EPRPINIB *eprp = eobj->inib.eprp[i];
1014 if ((eprp->eprpatr & flag) == 0)
1015 continue;
1016
1017 *pos++ = eprp->eprpcd;
1018 }
1019 }
1020 else {
1021 for (int i = 0; i < eobj->eprpcnt; i++) {
1022 const EPRPINIB *eprp = eobj->inib.eprp[i];
1023 if ((eprp->eprpatr & flag) == 0)
1024 continue;
1025
1026 ecn_agent_set_epc_to_prop_map(eobj->inib.eprp[i]->eprpcd, prpmap);
1027 }
1028 }
1029}
1030
1031void make_obj_prop_map(ecn_obj_t *eobj)
1032{
1033 int annocnt = 0, setcnt = 0, getcnt = 0;
1034
1035 for (int i = 0; i < eobj->eprpcnt; i++) {
1036 ATR eprpatr = eobj->inib.eprp[i]->eprpatr;
1037 if (eprpatr & EPC_RULE_ANNO)
1038 annocnt++;
1039 if (eprpatr & EPC_RULE_SET)
1040 setcnt++;
1041 if (eprpatr & EPC_RULE_GET)
1042 getcnt++;
1043 }
1044 eobj->annocnt = annocnt;
1045 eobj->setcnt = setcnt;
1046 eobj->getcnt = getcnt;
1047
1048 make_prop_map(eobj, eobj->pmapAnno, annocnt, EPC_RULE_ANNO);
1049 make_prop_map(eobj, eobj->pmapSet, setcnt, EPC_RULE_SET);
1050 make_prop_map(eobj, eobj->pmapGet, getcnt, EPC_RULE_GET);
1051}
1052
1053static mrb_value mrb_ecnl_svctask_initialize(mrb_state *mrb, mrb_value self)
1054{
1055 ecnl_svc_task_t *svc;
1056 mrb_value profile;
1057 ecn_node_t *node;
1058 mrb_value devices;
1059 const mrb_value *eobjs;
1060 ecn_device_t *device;
1061 EOBJCB *eobjcb;
1062 int i, eobjcnt;
1063 ID id = 1;
1064 ER ret;
1065
1066 profile = mrb_iv_get(mrb, self, mrb_intern_cstr(mrb, "@profile"));
1067 if (mrb_type(profile) == MRB_TT_FALSE) {
1068 mrb_raise(mrb, E_RUNTIME_ERROR, "@profile");
1069 return mrb_nil_value();
1070 }
1071
1072 if (!mrb_obj_is_kind_of(mrb, profile, _class_node)) {
1073 mrb_raise(mrb, E_RUNTIME_ERROR, "@profile");
1074 return mrb_nil_value();
1075 }
1076
1077 devices = mrb_iv_get(mrb, self, mrb_intern_cstr(mrb, "@devices"));
1078 if (mrb_type(devices) == MRB_TT_FALSE) {
1079 mrb_raise(mrb, E_RUNTIME_ERROR, "@devices");
1080 return mrb_nil_value();
1081 }
1082
1083 if (mrb_type(devices) != MRB_TT_ARRAY) {
1084 mrb_raise(mrb, E_RUNTIME_ERROR, "@devices");
1085 return mrb_nil_value();
1086 }
1087
1088 node = (ecn_node_t *)DATA_PTR(profile);
1089 eobjs = RARRAY_PTR(devices);
1090 eobjcnt = RARRAY_LEN(devices);
1091
1092 svc = (ecnl_svc_task_t *)mrb_calloc(mrb, 1, sizeof(ecnl_svc_task_t)
1093 + (1 + eobjcnt) * sizeof(EOBJINIB *)
1094 + (2 * eobjcnt)/*クラスリスト用*/);
1095 DATA_TYPE(self) = &mrb_ecnl_svctask_type;
1096 DATA_PTR(self) = svc;
1097
1098 svc->eobjlist_need_init = 1;
1099 svc->current_tid = 1;
1100
1101 svc->mrb = mrb;
1102 svc->self = self;
1103 svc->tnum_enodid = 1; /* この版ではローカルノード1つ */
1104 svc->tmax_eobjid = 1 + 1 + eobjcnt;
1105 svc->eobjinib_table = (const EOBJINIB **)&svc[1];
1106 svc->eobjinib_table[0] = &node->base.inib;
1107
1108 eobjcb = &svc->eobjcb_table[0];
1109 eobjcb->eobjs = &svc->eobjinib_table[1];
1110
1111 node->base.svc = svc;
1112 node->base.eobjId = id++;
1113 node->base.inib.enodid = 0;
1114 eobjcb->profile = &node->base.inib;
1115 eobjcb->eobjcnt = eobjcnt;
1116 make_obj_prop_map(&node->base);
1117
1118 for (i = 0; i < eobjcnt; i++) {
1119 if (!mrb_obj_is_kind_of(mrb, eobjs[i], _class_object)) {
1120 mrb_raise(mrb, E_RUNTIME_ERROR, "devices");
1121 goto error;
1122 }
1123 device = (ecn_device_t *)DATA_PTR(eobjs[i]);
1124 device->base.svc = svc;
1125 device->base.eobjId = id++;
1126 device->base.inib.enodid = node->base.eobjId;
1127 eobjcb->eobjs[i] = &device->base.inib;
1128 make_obj_prop_map(&device->base);
1129 }
1130
1131 /* クラスリストの作成 */
1132 svc->eclslst = (uint8_t *)&svc->eobjinib_table[1 + eobjcnt];
1133 uint8_t *pos = svc->eclslst;
1134 int eclscnt = 0;
1135 for (i = 0; i < eobjcnt; i++) {
1136 const EOBJINIB *eobj = eobjcb->eobjs[i];
1137
1138 uint8_t *pos2 = svc->eclslst;
1139 bool_t match = false;
1140 for (int j = 0; j < eclscnt; j++, pos2 += 2) {
1141 const EOBJINIB *eobj2 = eobjcb->eobjs[j];
1142
1143 match = (pos2[0] == eobj2->eojx1) && (pos2[1] = eobj2->eojx2);
1144 if (match)
1145 break;
1146 }
1147 if (match)
1148 continue;
1149
1150 *pos++ = eobj->eojx1;
1151 *pos++ = eobj->eojx2;
1152 eclscnt++;
1153 }
1154 svc->eclscnt = eclscnt;
1155
1156 /* ECHONETミドルウェアを起動 */
1157 ret = ecn_sta_svc(svc);
1158 if (ret != E_OK) {
1159 mrb_raise(mrb, E_RUNTIME_ERROR, "SvcTask.new");
1160 goto error;
1161 }
1162
1163 return self;
1164error:
1165 self = mrb_nil_value();
1166 mrb_free(mrb, svc);
1167
1168 return self;
1169}
1170
1171static ecn_obj_t *cast_obj2(const EOBJINIB *inib)
1172{
1173 return (ecn_obj_t *)((intptr_t)inib - offsetof(ecn_obj_t, inib));
1174}
1175
1176static void mrb_ecnl_svctask_free(mrb_state *mrb, void *ptr)
1177{
1178 ecnl_svc_task_t *svc = (ecnl_svc_task_t *)ptr;
1179#if 0 /* どこかで解放しているらしい・・・ */
1180 const EOBJINIB **table = svc->eobjinib_table;
1181 const EOBJINIB **end = &table[svc->tmax_eobjid];
1182
1183 for (; table < end; table++) {
1184 mrb_free(mrb, cast_obj2(*table));
1185 }
1186#endif
1187 mrb_free(mrb, svc);
1188}
1189
1190const EOBJINIB *echonet_svctask_get_eobjinib(ecnl_svc_task_t *svc, ID eobjid)
1191{
1192 return svc->eobjinib_table[eobjid - 1];
1193}
1194
1195ID echonet_svctask_get_eobjid(ecnl_svc_task_t *svc, const EOBJINIB *eobjinib)
1196{
1197 int i, count = svc->tmax_eobjid;
1198
1199 for (i = 0; i < count; i++) {
1200 if (svc->eobjinib_table[i] == eobjinib) {
1201 return i + 1;
1202 }
1203 }
1204
1205 return 0;
1206}
1207
1208/* プロパティ値書き込み要求(応答不要)電文作成 */
1209static mrb_value mrb_ecnl_esv_set_i(mrb_state *mrb, mrb_value self)
1210{
1211 mrb_value resv;
1212 mrb_value reobj;
1213 mrb_int epc;
1214 mrb_value redt;
1215 T_EDATA *edat;
1216 ecn_device_t *eobj;
1217 ER ret;
1218 ID eobjid;
1219 ecnl_svc_task_t *svc;
1220
1221 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1222 svc->mrb = mrb;
1223
1224 mrb_get_args(mrb, "oiS", &reobj, &epc, &redt);
1225
1226 if (mrb_nil_p(reobj)) {
1227 eobjid = EOBJ_NULL;
1228 }
1229 else {
1230 eobj = (ecn_device_t *)DATA_PTR(reobj);
1231 eobjid = eobj->base.eobjId;
1232 }
1233
1234 ret = ecn_esv_seti(svc, &edat, eobjid, epc, RSTRING_LEN(redt), RSTRING_PTR(redt));
1235 if (ret != E_OK) {
1236 mrb_raise(mrb, E_RUNTIME_ERROR, "esv_set_i");
1237 return self;
1238 }
1239
1240 resv = mrb_obj_value(mrb_obj_alloc(mrb, MRB_TT_DATA, _class_data));
1241 DATA_TYPE(resv) = &mrb_ecnl_edata_type;
1242 DATA_PTR(resv) = edat;
1243
1244 return resv;
1245}
1246
1247/* プロパティ値書き込み要求(応答要)電文作成 */
1248static mrb_value mrb_ecnl_esv_set_c(mrb_state *mrb, mrb_value self)
1249{
1250 mrb_value resv;
1251 mrb_value reobj;
1252 mrb_int epc;
1253 mrb_int pdc;
1254 mrb_value redt;
1255 T_EDATA *edat;
1256 ecn_device_t *eobj;
1257 ER ret;
1258 ID eobjid;
1259 ecnl_svc_task_t *svc;
1260
1261 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1262 svc->mrb = mrb;
1263
1264 mrb_get_args(mrb, "oiS", &reobj, &epc, &pdc, &redt);
1265
1266 if (mrb_nil_p(reobj)) {
1267 eobjid = EOBJ_NULL;
1268 }
1269 else {
1270 eobj = (ecn_device_t *)DATA_PTR(reobj);
1271 eobjid = eobj->base.eobjId;
1272 }
1273
1274 ret = ecn_esv_setc(svc, &edat, eobjid, epc, RSTRING_LEN(redt), RSTRING_PTR(redt));
1275 if (ret != E_OK) {
1276 mrb_raise(mrb, E_RUNTIME_ERROR, "esv_set_c");
1277 return self;
1278 }
1279
1280 resv = mrb_obj_value(mrb_obj_alloc(mrb, MRB_TT_DATA, _class_data));
1281 DATA_TYPE(resv) = &mrb_ecnl_edata_type;
1282 DATA_PTR(resv) = edat;
1283
1284 return resv;
1285}
1286
1287/* プロパティ値読み出し要求電文作成 */
1288static mrb_value mrb_ecnl_esv_get(mrb_state *mrb, mrb_value self)
1289{
1290 mrb_value resv;
1291 mrb_value reobj;
1292 mrb_int epc;
1293 T_EDATA *edat;
1294 ecn_device_t *eobj;
1295 ER ret;
1296 ID eobjid;
1297 ecnl_svc_task_t *svc;
1298
1299 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1300 svc->mrb = mrb;
1301
1302 mrb_get_args(mrb, "oi", &reobj, &epc);
1303
1304 if (mrb_nil_p(reobj)) {
1305 eobjid = EOBJ_NULL;
1306 }
1307 else {
1308 eobj = (ecn_device_t *)DATA_PTR(reobj);
1309 eobjid = eobj->base.eobjId;
1310 }
1311
1312 ret = ecn_esv_get(svc, &edat, eobjid, epc);
1313 if (ret != E_OK) {
1314 mrb_raise(mrb, E_RUNTIME_ERROR, "esv_get");
1315 return self;
1316 }
1317
1318 resv = mrb_obj_value(mrb_obj_alloc(mrb, MRB_TT_DATA, _class_data));
1319 DATA_TYPE(resv) = &mrb_ecnl_edata_type;
1320 DATA_PTR(resv) = edat;
1321
1322 return resv;
1323}
1324
1325/* プロパティ値通知要求電文作成 */
1326static mrb_value mrb_ecnl_esv_inf_req(mrb_state *mrb, mrb_value self)
1327{
1328 mrb_value resv;
1329 mrb_value reobj;
1330 mrb_int epc;
1331 T_EDATA *edat;
1332 ecn_device_t *eobj;
1333 ER ret;
1334 ID eobjid;
1335 ecnl_svc_task_t *svc;
1336
1337 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1338 svc->mrb = mrb;
1339
1340 mrb_get_args(mrb, "oi", &reobj, &epc);
1341
1342 if (mrb_nil_p(reobj)) {
1343 eobjid = EOBJ_NULL;
1344 }
1345 else {
1346 eobj = (ecn_device_t *)DATA_PTR(reobj);
1347 eobjid = eobj->base.eobjId;
1348 }
1349
1350 ret = ecn_esv_inf_req(svc, &edat, eobjid, epc);
1351 if (ret != E_OK) {
1352 mrb_raise(mrb, E_RUNTIME_ERROR, "esv_inf_req");
1353 return self;
1354 }
1355
1356 resv = mrb_obj_value(mrb_obj_alloc(mrb, MRB_TT_DATA, _class_data));
1357 DATA_TYPE(resv) = &mrb_ecnl_edata_type;
1358 DATA_PTR(resv) = edat;
1359
1360 return resv;
1361}
1362
1363/* プロパティ値書き込み・読み出し要求電文作成 */
1364static mrb_value mrb_ecnl_esv_set_get(mrb_state *mrb, mrb_value self)
1365{
1366 mrb_value resv;
1367 mrb_value reobj;
1368 mrb_int epc;
1369 mrb_value redt;
1370 T_EDATA *edat;
1371 ecn_device_t *eobj;
1372 ER ret;
1373 ID eobjid;
1374 ecnl_svc_task_t *svc;
1375
1376 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1377 svc->mrb = mrb;
1378
1379 mrb_get_args(mrb, "oiS", &reobj, &epc, &redt);
1380
1381 if (mrb_nil_p(reobj)) {
1382 eobjid = EOBJ_NULL;
1383 }
1384 else {
1385 eobj = (ecn_device_t *)DATA_PTR(reobj);
1386 eobjid = eobj->base.eobjId;
1387 }
1388
1389 ret = ecn_esv_set_get(svc, &edat, eobjid, epc, RSTRING_LEN(redt), RSTRING_PTR(redt));
1390 if (ret != E_OK) {
1391 mrb_raise(mrb, E_RUNTIME_ERROR, "esv_set_get");
1392 return self;
1393 }
1394
1395 resv = mrb_obj_value(mrb_obj_alloc(mrb, MRB_TT_DATA, _class_data));
1396 DATA_TYPE(resv) = &mrb_ecnl_edata_type;
1397 DATA_PTR(resv) = edat;
1398
1399 return resv;
1400}
1401
1402/* プロパティ値通知(応答要)電文作成 */
1403static mrb_value mrb_ecnl_esv_infc(mrb_state *mrb, mrb_value self)
1404{
1405 mrb_value resv;
1406 mrb_value reobj;
1407 mrb_value rseobj;
1408 mrb_int sepc;
1409 T_EDATA *edat;
1410 ecn_device_t *eobj;
1411 ecn_device_t *seobj;
1412 ER ret;
1413 ID eobjid, seobjid;
1414 ecnl_svc_task_t *svc;
1415
1416 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1417 svc->mrb = mrb;
1418
1419 mrb_get_args(mrb, "ooi", &reobj, &rseobj, &sepc);
1420
1421 if (mrb_nil_p(reobj)) {
1422 eobjid = EOBJ_NULL;
1423 }
1424 else {
1425 eobj = (ecn_device_t *)DATA_PTR(reobj);
1426 eobjid = eobj->base.eobjId;
1427 }
1428
1429 if (mrb_nil_p(rseobj)) {
1430 seobjid = EOBJ_NULL;
1431 }
1432 else {
1433 seobj = (ecn_device_t *)DATA_PTR(rseobj);
1434 seobjid = seobj->base.eobjId;
1435 }
1436
1437 ret = ecn_esv_infc(svc, &edat, eobjid, seobjid, sepc);
1438 if (ret != E_OK) {
1439 mrb_raise(mrb, E_RUNTIME_ERROR, "esv_infc");
1440 return self;
1441 }
1442
1443 resv = mrb_obj_value(mrb_obj_alloc(mrb, MRB_TT_DATA, _class_data));
1444 DATA_TYPE(resv) = &mrb_ecnl_edata_type;
1445 DATA_PTR(resv) = edat;
1446
1447 return resv;
1448}
1449
1450/* 要求電文の送信 */
1451static mrb_value mrb_ecnl_snd_esv(mrb_state *mrb, mrb_value self)
1452{
1453 mrb_value resv;
1454 T_EDATA *edat;
1455 ER ret;
1456 ecnl_svc_task_t *svc;
1457
1458 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1459 svc->mrb = mrb;
1460
1461 mrb_get_args(mrb, "o", &resv);
1462
1463 if (!mrb_obj_is_kind_of(mrb, resv, _class_data)) {
1464 mrb_raise(mrb, E_RUNTIME_ERROR, "snd_esv");
1465 return mrb_nil_value();
1466 }
1467
1468 edat = (T_EDATA *)DATA_PTR(resv);
1469 DATA_PTR(resv) = NULL;
1470
1471 if (edat->trn_pos != -1) {
1472 ret = ecn_end_set_get(mrb, edat, edat->trn_pos);
1473 if (ret != E_OK) {
1474 mrb_raise(mrb, E_RUNTIME_ERROR, "end_set_get");
1475 return self;
1476 }
1477 }
1478
1479 ret = ecn_snd_esv(svc, edat);
1480 if (ret != E_OK) {
1481 mrb_raise(mrb, E_RUNTIME_ERROR, "snd_esv");
1482 return self;
1483 }
1484
1485 return self;
1486}
1487
1488/* 電文の破棄 */
1489static mrb_value mrb_ecnl_rel_esv(mrb_state *mrb, mrb_value self)
1490{
1491 mrb_value resv;
1492 T_EDATA *edat;
1493 ER ret;
1494 ecnl_svc_task_t *svc;
1495
1496 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1497 svc->mrb = mrb;
1498
1499 mrb_get_args(mrb, "o", &resv);
1500
1501 if (!mrb_obj_is_kind_of(mrb, resv, _class_data)) {
1502 mrb_raise(mrb, E_RUNTIME_ERROR, "rel_esv");
1503 return mrb_nil_value();
1504 }
1505
1506 edat = (T_EDATA *)DATA_PTR(resv);
1507 DATA_PTR(resv) = NULL;
1508
1509 ret = ecn_rel_esv(mrb, edat);
1510 if (ret != E_OK) {
1511 mrb_raise(mrb, E_RUNTIME_ERROR, "rel_esv");
1512 return self;
1513 }
1514
1515 return self;
1516}
1517
1518static mrb_value mrb_ecnl_svctask_ntf_inl(mrb_state *mrb, mrb_value self)
1519{
1520 ER ret;
1521 ecnl_svc_task_t *svc;
1522
1523 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1524 svc->mrb = mrb;
1525
1526 /* インスタンスリスト通知の送信 */
1527 ret = _ecn_tsk_ntf_inl(svc);
1528 if (ret != E_OK) {
1529 mrb_raise(mrb, E_RUNTIME_ERROR, "ntf_inl");
1530 return self;
1531 }
1532
1533 return self;
1534}
1535
1536static mrb_value mrb_ecnl_svctask_set_timer(mrb_state *mrb, mrb_value self)
1537{
1538 TMO timer;
1539 ecnl_svc_task_t *svc;
1540
1541 mrb_get_args(mrb, "i", &timer);
1542
1543 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1544 svc->api_timer = timer;
1545
1546 return self;
1547}
1548
1549static mrb_value mrb_ecnl_svctask_get_timer(mrb_state *mrb, mrb_value self)
1550{
1551 TMO timer1, timer2;
1552 ecnl_svc_task_t *svc;
1553
1554 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1555 svc->mrb = mrb;
1556
1557 timer1 = echonet_svctask_get_timer(svc);
1558
1559 timer2 = echonet_lcltask_get_timer(svc);
1560 if ((timer1 == TMO_FEVR) || (timer1 > timer2))
1561 timer1 = timer2;
1562
1563 timer2 = svc->api_timer;
1564 if ((timer1 == TMO_FEVR) || (timer1 > timer2))
1565 timer1 = timer2;
1566
1567 return mrb_fixnum_value(timer1);
1568}
1569
1570static mrb_value mrb_ecnl_svctask_progress(mrb_state *mrb, mrb_value self)
1571{
1572 ecnl_svc_task_t *svc;
1573 TMO interval;
1574
1575 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1576 svc->mrb = mrb;
1577
1578 mrb_get_args(mrb, "i", &interval);
1579
1580 echonet_svctask_progress(svc, interval);
1581 echonet_lcltask_progress(svc, interval);
1582
1583 svc->api_timer -= interval;
1584 if (svc->api_timer < 0) {
1585 svc->api_timer = 0;
1586 }
1587
1588 return mrb_nil_value();
1589}
1590
1591/*
1592 * Echonet電文受信処理
1593 */
1594static void main_recv_esv(ecnl_svc_task_t *svc, T_EDATA *esv)
1595{
1596 mrb_state *mrb = svc->mrb;
1597 mrb_value resv;
1598
1599 resv = mrb_ecnl_edata_new(mrb, esv);
1600
1601 mrb_funcall(mrb, svc->self, "recv_esv", 1, resv);
1602}
1603
1604/*
1605 * 応答電文待
1606ちの割り込み処理
1607 */
1608static void main_break_wait(ecnl_svc_task_t *svc, uint8_t *brkdat, int32_t len)
1609{
1610 mrb_state *mrb = svc->mrb;
1611 mrb_value str;
1612
1613 str = mrb_str_new(mrb, (char *)brkdat, len);
1614
1615 mrb_funcall(mrb, svc->self, "break_wait", 1, str);
1616}
1617
1618void echonet_apptask_recv_msg(ecnl_svc_task_t *svc, T_ECN_FST_BLK *p_msg)
1619{
1620 mrb_state *mrb = svc->mrb;
1621 uint8_t brkdat[64];
1622 int len;
1623 ER ret;
1624
1625 /* Echonet電文受信の場合 */
1626 if ((p_msg)->hdr.type == ECN_MSG_ECHONET) {
1627 /* Echonet電文受信処理 */
1628 main_recv_esv(svc, (T_EDATA *)p_msg);
1629
1630 /* 領域解放はGCに任せる
1631 ret = ecn_rel_esv(mrb, (T_EDATA *)p_msg);
1632 if (ret != E_OK) {
1633 mrb_raise(mrb, E_RUNTIME_ERROR, "ecn_rel_esv");
1634 return;
1635 } */
1636 }
1637 /* 応答電文待
1638ちの割り込みの場合 */
1639 else if ((p_msg)->hdr.type == ECN_MSG_INTERNAL) {
1640 /* 応答電文待
1641ちの割り込みデータ取得 */
1642 ret = ecn_get_brk_dat(mrb, (T_EDATA *)p_msg, brkdat, sizeof(brkdat), &len);
1643 if (ret != E_OK) {
1644 mrb_raise(mrb, E_RUNTIME_ERROR, "ecn_get_brk_dat");
1645 return;
1646 }
1647
1648 /* 応答電文待
1649ちの割り込み処理 */
1650 main_break_wait(svc, brkdat, len);
1651
1652 /* 領域解放 */
1653 ret = ecn_rel_esv(mrb, (T_EDATA *)p_msg);
1654 if (ret != E_OK) {
1655 mrb_raise(mrb, E_RUNTIME_ERROR, "ecn_rel_esv");
1656 return;
1657 }
1658 }
1659}
1660
1661static void mrb_ecnl_svctask_proccess(ecnl_svc_task_t *svc)
1662{
1663 T_ECN_FST_BLK *p_msg = NULL;
1664 ER ret;
1665 int i;
1666
1667 do {
1668 i = 0;
1669
1670 ret = ecn_fbs_dequeue(&svc->svc_mbxid, &p_msg);
1671 if (ret == E_OK) {
1672 echonet_svctask_recv_msg(svc, p_msg);
1673 i++;
1674 }
1675
1676 ret = ecn_fbs_dequeue(&svc->lcl_mbxid, &p_msg);
1677 if (ret == E_OK) {
1678 echonet_lcltask_recv_msg(svc, p_msg);
1679 i++;
1680 }
1681
1682 ret = ecn_fbs_dequeue(&svc->api_mbxid, &p_msg);
1683 if (ret == E_OK) {
1684 echonet_apptask_recv_msg(svc, p_msg);
1685 i++;
1686 }
1687 } while (i != 0);
1688}
1689
1690/* 通信レイヤーからのå…
1691¥åŠ› */
1692static mrb_value mrb_ecnl_svctask_recv_msg(mrb_state *mrb, mrb_value self)
1693{
1694 ecnl_svc_task_t *svc;
1695 mrb_value ep;
1696 mrb_value data;
1697
1698 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1699 svc->mrb = mrb;
1700
1701 mrb_get_args(mrb, "oS", &ep, &data);
1702
1703 echonet_lcl_input_msg(svc, ep, data);
1704
1705 mrb_ecnl_svctask_proccess(svc);
1706
1707 return mrb_nil_value();
1708}
1709
1710static mrb_value mrb_ecnl_svctask_call_timeout(mrb_state *mrb, mrb_value self)
1711{
1712 ecnl_svc_task_t *svc;
1713
1714 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1715 svc->mrb = mrb;
1716
1717 echonet_svctask_timeout(svc);
1718 echonet_lcltask_timeout(svc);
1719
1720 if (svc->api_timer == 0) {
1721 svc->api_timer = -1;
1722
1723 mrb_funcall(mrb, svc->self, "timeout", 0);
1724 }
1725
1726 mrb_ecnl_svctask_proccess(svc);
1727
1728 return mrb_nil_value();
1729}
1730
1731static mrb_value mrb_ecnl_svctask_is_match(mrb_state *mrb, mrb_value self)
1732{
1733 ecnl_svc_task_t *svc;
1734 mrb_value enod;
1735 EOBJCB *enodcb;
1736 mrb_value edata;
1737 T_EDATA *edat;
1738 mrb_value ep;
1739 bool_t ret;
1740
1741 svc = (ecnl_svc_task_t *)DATA_PTR(self);
1742 svc->mrb = mrb;
1743
1744 mrb_get_args(mrb, "ooo", &enod, &edata, &ep);
1745
1746 enodcb = (EOBJCB *)DATA_PTR(enod);
1747 edat = (T_EDATA *)DATA_PTR(edata);
1748
1749 ret = ecn_is_match(svc, enodcb, edat, ep);
1750
1751 return mrb_bool_value(ret);
1752}
1753
1754bool_t lcl_is_local_addr(ecnl_svc_task_t *svc, mrb_value ep)
1755{
1756 mrb_state *mrb = svc->mrb;
1757 mrb_value ret;
1758
1759 ret = mrb_funcall(mrb, svc->self, "is_local_addr", 1, ep);
1760
1761 if (mrb_type(ret) == MRB_TT_TRUE)
1762 return true;
1763
1764 if (mrb_type(ret) == MRB_TT_FALSE)
1765 return false;
1766
1767 mrb_raise(mrb, E_RUNTIME_ERROR, "is_local_addr");
1768 return false;
1769}
1770
1771bool_t lcl_is_multicast_addr(ecnl_svc_task_t *svc, mrb_value ep)
1772{
1773 mrb_state *mrb = svc->mrb;
1774 mrb_value ret;
1775
1776 ret = mrb_funcall(mrb, svc->self, "is_multicast_addr", 1, ep);
1777
1778 if (mrb_type(ret) == MRB_TT_TRUE)
1779 return true;
1780
1781 if (mrb_type(ret) == MRB_TT_FALSE)
1782 return false;
1783
1784 mrb_raise(mrb, E_RUNTIME_ERROR, "is_multicast_addr");
1785 return false;
1786}
1787
1788bool_t lcl_is_valid_addrid(ecnl_svc_task_t *svc, ECN_ENOD_ID id)
1789{
1790 mrb_state *mrb = svc->mrb;
1791 mrb_value ret;
1792
1793 ret = mrb_funcall(mrb, svc->self, "is_valid_addrid", 1, mrb_fixnum_value(id));
1794
1795 if (mrb_type(ret) == MRB_TT_TRUE)
1796 return true;
1797
1798 if (mrb_type(ret) == MRB_TT_FALSE)
1799 return false;
1800
1801 mrb_raise(mrb, E_RUNTIME_ERROR, "is_valid_addrid");
1802 return false;
1803}
1804
1805mrb_value lcl_get_local_addr(ecnl_svc_task_t *svc)
1806{
1807 return mrb_funcall(svc->mrb, svc->self, "get_local_addr", 0);
1808}
1809
1810mrb_value lcl_get_multicast_addr(ecnl_svc_task_t *svc)
1811{
1812 return mrb_funcall(svc->mrb, svc->self, "get_multicast_addr", 0);
1813}
1814
1815mrb_value lcl_get_remote_addr(ecnl_svc_task_t *svc, ECN_ENOD_ID id)
1816{
1817 return mrb_funcall(svc->mrb, svc->self, "get_remote_addr", 1, mrb_fixnum_value(id));
1818}
1819
1820ECN_ENOD_ID lcl_get_remote_id(ecnl_svc_task_t *svc, const mrb_value ep)
1821{
1822 mrb_state *mrb = svc->mrb;
1823 mrb_value ret;
1824
1825 ret = mrb_funcall(mrb, svc->self, "get_remote_id", 1, ep);
1826
1827 if (mrb_type(ret) == MRB_TT_FALSE)
1828 return ENOD_NOT_MATCH_ID;
1829
1830 if (mrb_type(ret) == MRB_TT_FIXNUM)
1831 return (ECN_ENOD_ID)mrb_fixnum(ret);
1832
1833 return ENOD_NOT_MATCH_ID;
1834}
1835
1836ECN_ENOD_ID lcl_set_remote_addr(ecnl_svc_task_t *svc, T_EDATA *edata, mrb_value ep)
1837{
1838 mrb_state *mrb = svc->mrb;
1839 mrb_value edat = mrb_obj_value(edata);
1840 mrb_value ret;
1841
1842 ret = mrb_funcall(mrb, svc->self, "set_remote_addr", 2, edat, ep);
1843
1844 if (mrb_type(ret) == MRB_TT_FALSE)
1845 return ENOD_NOT_MATCH_ID;
1846
1847 if (mrb_type(ret) == MRB_TT_FIXNUM)
1848 return (ECN_ENOD_ID)mrb_fixnum(ret);
1849
1850 return ENOD_NOT_MATCH_ID;
1851}
1852
1853ECN_ENOD_ID lcl_add_remote_addr(ecnl_svc_task_t *svc, T_EDATA *edata, mrb_value ep)
1854{
1855 mrb_state *mrb = svc->mrb;
1856 mrb_value edat = mrb_obj_value(edata);
1857 mrb_value ret;
1858
1859 ret = mrb_funcall(mrb, svc->self, "add_remote_addr", 2, edat, ep);
1860
1861 if (mrb_type(ret) == MRB_TT_FALSE)
1862 return ENOD_NOT_MATCH_ID;
1863
1864 if (mrb_type(ret) == MRB_TT_FIXNUM)
1865 return (ECN_ENOD_ID)mrb_fixnum(ret);
1866
1867 return ENOD_NOT_MATCH_ID;
1868}
1869
1870ER lcl_snd_msg(ecnl_svc_task_t *svc, mrb_value ep, mrb_value msg)
1871{
1872 mrb_funcall(svc->mrb, svc->self, "snd_msg", 2, ep, msg);
1873
1874 return E_OK;
1875}
1876
1877void mrb_mruby_ecnl_gem_init(mrb_state *mrb)
1878{
1879 _module_ecnl = mrb_define_module(mrb, "ECNL");
1880
1881 /* 未設定 */
1882 mrb_define_const(mrb, _module_ecnl, "EPC_NONE", mrb_fixnum_value(EPC_NONE));
1883 /* アクセスルール Set */
1884 mrb_define_const(mrb, _module_ecnl, "EPC_RULE_SET", mrb_fixnum_value(EPC_RULE_SET));
1885 /* アクセスルール Get */
1886 mrb_define_const(mrb, _module_ecnl, "EPC_RULE_GET", mrb_fixnum_value(EPC_RULE_GET));
1887 /* アクセスルール Anno */
1888 mrb_define_const(mrb, _module_ecnl, "EPC_RULE_ANNO", mrb_fixnum_value(EPC_RULE_ANNO));
1889 /* 状æ…
1890‹å¤‰åŒ–時通知 */
1891 mrb_define_const(mrb, _module_ecnl, "EPC_ANNOUNCE", mrb_fixnum_value(EPC_ANNOUNCE));
1892 /* 可変長データ */
1893 mrb_define_const(mrb, _module_ecnl, "EPC_VARIABLE", mrb_fixnum_value(EPC_VARIABLE));
1894
1895 /* プロパティ値書き込み要求(応答不要) */
1896 mrb_define_const(mrb, _module_ecnl, "ESV_SET_I", mrb_fixnum_value(ESV_SET_I));
1897 /* プロパティ値書き込み要求(応答要) */
1898 mrb_define_const(mrb, _module_ecnl, "ESV_SET_C", mrb_fixnum_value(ESV_SET_C));
1899 /* プロパティ値読み出し要求 */
1900 mrb_define_const(mrb, _module_ecnl, "ESV_GET", mrb_fixnum_value(ESV_GET));
1901 /* プロパティ値通知要求 */
1902 mrb_define_const(mrb, _module_ecnl, "ESV_INF_REQ", mrb_fixnum_value(ESV_INF_REQ));
1903 /* プロパティ値書き込み・読み出し要求 */
1904 mrb_define_const(mrb, _module_ecnl, "ESV_SET_GET", mrb_fixnum_value(ESV_SET_GET));
1905 /* プロパティ値書き込み応答 */
1906 mrb_define_const(mrb, _module_ecnl, "ESV_SET_RES", mrb_fixnum_value(ESV_SET_RES));
1907 /* プロパティ値読み出し応答 */
1908 mrb_define_const(mrb, _module_ecnl, "ESV_GET_RES", mrb_fixnum_value(ESV_GET_RES));
1909 /* プロパティ値通知 */
1910 mrb_define_const(mrb, _module_ecnl, "ESV_INF", mrb_fixnum_value(ESV_INF));
1911 /* プロパティ値通知(応答要) */
1912 mrb_define_const(mrb, _module_ecnl, "ESV_INFC", mrb_fixnum_value(ESV_INFC));
1913 /* プロパティ値通知応答 */
1914 mrb_define_const(mrb, _module_ecnl, "ESV_INFC_RES", mrb_fixnum_value(ESV_INFC_RES));
1915 /* プロパティ値書き込み・読み出し応答 */
1916 mrb_define_const(mrb, _module_ecnl, "ESV_SET_GET_RES", mrb_fixnum_value(ESV_SET_GET_RES));
1917 /* プロパティ値書き込み要求不可応答 */
1918 mrb_define_const(mrb, _module_ecnl, "ESV_SET_I_SNA", mrb_fixnum_value(ESV_SET_I_SNA));
1919 /* プロパティ値書き込み要求不可応答 */
1920 mrb_define_const(mrb, _module_ecnl, "ESV_SET_C_SNA", mrb_fixnum_value(ESV_SET_C_SNA));
1921 /* プロパティ値読み出し不可応答 */
1922 mrb_define_const(mrb, _module_ecnl, "ESV_GET_SNA", mrb_fixnum_value(ESV_GET_SNA));
1923 /* プロパティ値通知不可応答 */
1924 mrb_define_const(mrb, _module_ecnl, "ESV_INF_SNA", mrb_fixnum_value(ESV_INF_SNA));
1925 /* プロパティ値書き込み・読み出し不可応答 */
1926 mrb_define_const(mrb, _module_ecnl, "ESV_SET_GET_SNA", mrb_fixnum_value(ESV_SET_GET_SNA));
1927
1928 /* アドレスID登録なし */
1929 mrb_define_const(mrb, _module_ecnl, "ENOD_NOT_MATCH_ID", mrb_fixnum_value(ENOD_NOT_MATCH_ID));
1930 /* マルチキャストアドレスID */
1931 mrb_define_const(mrb, _module_ecnl, "ENOD_MULTICAST_ID", mrb_fixnum_value(ENOD_MULTICAST_ID));
1932 /* 自ノードアドレスID */
1933 mrb_define_const(mrb, _module_ecnl, "ENOD_LOCAL_ID", mrb_fixnum_value(ENOD_LOCAL_ID));
1934 /* APIアドレスID */
1935 mrb_define_const(mrb, _module_ecnl, "ENOD_API_ID", mrb_fixnum_value(ENOD_API_ID));
1936 /* 他ノードID */
1937 mrb_define_const(mrb, _module_ecnl, "ENOD_REMOTE_ID", mrb_fixnum_value(ENOD_REMOTE_ID));
1938
1939 _class_object = mrb_define_class_under(mrb, _module_ecnl, "EObject", mrb->object_class);
1940 MRB_SET_INSTANCE_TT(_class_object, MRB_TT_DATA);
1941 mrb_define_method(mrb, _class_object, "initialize", mrb_ecnl_eobject_initialize, MRB_ARGS_REQ(5));
1942
1943 /* プロパティ値書き込み */
1944 mrb_define_method(mrb, _class_object, "data_prop_set", mrb_ecnl_eobject_data_prop_set, MRB_ARGS_REQ(4));
1945
1946 /* プロパティ値読み出し */
1947 mrb_define_method(mrb, _class_object, "data_prop_get", mrb_ecnl_eobject_data_prop_get, MRB_ARGS_REQ(3));
1948
1949 _class_node = mrb_define_class_under(mrb, _module_ecnl, "ENode", mrb->object_class);
1950 MRB_SET_INSTANCE_TT(_class_node, MRB_TT_DATA);
1951 mrb_define_method(mrb, _class_node, "initialize", mrb_ecnl_enode_initialize, MRB_ARGS_REQ(2));
1952
1953 /* プロパティ値書き込み */
1954 mrb_define_method(mrb, _class_node, "data_prop_set", mrb_ecnl_eobject_data_prop_set, MRB_ARGS_REQ(4));
1955
1956 /* プロパティ値読み出し */
1957 mrb_define_method(mrb, _class_node, "data_prop_get", mrb_ecnl_eobject_data_prop_get, MRB_ARGS_REQ(3));
1958
1959 _class_property = mrb_define_class_under(mrb, _module_ecnl, "EProperty", mrb->object_class);
1960 MRB_SET_INSTANCE_TT(_class_property, MRB_TT_DATA);
1961 mrb_define_method(mrb, _class_property, "initialize", mrb_ecnl_eproperty_initialize, MRB_ARGS_REQ(6));
1962
1963 /* ECHONET Lite プロパティコード */
1964 mrb_define_method(mrb, _class_property, "pcd", mrb_ecnl_eproperty_get_pcd, MRB_ARGS_NONE());
1965 /* ECHONET Lite プロパティ属性 */
1966 mrb_define_method(mrb, _class_property, "atr", mrb_ecnl_eproperty_get_atr, MRB_ARGS_NONE());
1967 /* ECHONET Lite プロパティのサイズ */
1968 mrb_define_method(mrb, _class_property, "sz", mrb_ecnl_eproperty_get_sz, MRB_ARGS_NONE());
1969 /* ECHONET Lite プロパティの拡張情
1970å ± */
1971 mrb_define_method(mrb, _class_property, "exinf", mrb_ecnl_eproperty_get_exinf, MRB_ARGS_NONE());
1972 mrb_define_method(mrb, _class_property, "set_exinf", mrb_ecnl_eproperty_set_exinf, MRB_ARGS_REQ(1));
1973 /* ECHONET Lite プロパティの設定関数 */
1974 mrb_define_method(mrb, _class_property, "setcb", mrb_ecnl_eproperty_get_setcb, MRB_ARGS_NONE());
1975 /* ECHONET Lite プロパティの取得関数 */
1976 mrb_define_method(mrb, _class_property, "getcb", mrb_ecnl_eproperty_get_getcb, MRB_ARGS_NONE());
1977 /* ECHONET Lite プロパティの通知有無 */
1978 mrb_define_method(mrb, _class_property, "anno", mrb_ecnl_eproperty_get_anno, MRB_ARGS_NONE());
1979 mrb_define_method(mrb, _class_property, "set_anno", mrb_ecnl_eproperty_set_anno, MRB_ARGS_REQ(1));
1980
1981 _class_data = mrb_define_class_under(mrb, _module_ecnl, "EData", mrb->object_class);
1982 MRB_SET_INSTANCE_TT(_class_data, MRB_TT_DATA);
1983 mrb_define_method(mrb, _class_data, "initialize", mrb_ecnl_edata_initialize, MRB_ARGS_NONE());
1984
1985 /* プロパティ値書き込み・読み出し要求電文折り返し指定 */
1986 mrb_define_method(mrb, _class_data, "trn_set_get", mrb_ecnl_trn_set_get, MRB_ARGS_NONE());
1987
1988 /* 要求電文へのプロパティ指定追加 */
1989 mrb_define_method(mrb, _class_data, "add_epc", mrb_ecnl_add_epc, MRB_ARGS_REQ(1));
1990
1991 /* 要求電文へのプロパティデータ追加 */
1992 mrb_define_method(mrb, _class_data, "add_edt", mrb_ecnl_add_edt, MRB_ARGS_REQ(2));
1993
1994 /* 応答電文サービスコード取得 */
1995 mrb_define_method(mrb, _class_data, "esv", mrb_ecnl_get_esv, MRB_ARGS_NONE());
1996
1997 /* 応答電文解析イテレーター初期化 */
1998 mrb_define_method(mrb, _class_data, "itr_ini", mrb_ecnl_itr_ini, MRB_ARGS_NONE());
1999
2000 _class_iterator = mrb_define_class_under(mrb, _module_ecnl, "EIterator", mrb->object_class);
2001 MRB_SET_INSTANCE_TT(_class_iterator, MRB_TT_DATA);
2002 mrb_define_method(mrb, _class_iterator, "initialize", mrb_ecnl_eiterator_initialize, MRB_ARGS_NONE());
2003
2004 /* 応答電文解析イテレーターインクリメント */
2005 mrb_define_method(mrb, _class_iterator, "itr_nxt", mrb_ecnl_itr_nxt, MRB_ARGS_NONE());
2006
2007 mrb_define_method(mrb, _class_iterator, "epc", mrb_ecnl_iterator_get_epc, MRB_ARGS_NONE());
2008 mrb_define_method(mrb, _class_iterator, "edt", mrb_ecnl_iterator_get_edt, MRB_ARGS_NONE());
2009 mrb_define_method(mrb, _class_iterator, "state", mrb_ecnl_iterator_get_state, MRB_ARGS_NONE());
2010 mrb_define_method(mrb, _class_iterator, "is_eof", mrb_ecnl_iterator_is_eof, MRB_ARGS_NONE());
2011
2012 _class_svctask = mrb_define_class_under(mrb, _module_ecnl, "SvcTask", mrb->object_class);
2013 MRB_SET_INSTANCE_TT(_class_svctask, MRB_TT_DATA);
2014 mrb_define_method(mrb, _class_svctask, "initialize", mrb_ecnl_svctask_initialize, MRB_ARGS_NONE());
2015
2016 /* プロパティ値書き込み要求(応答不要)電文作成 */
2017 mrb_define_method(mrb, _class_svctask, "esv_set_i", mrb_ecnl_esv_set_i, MRB_ARGS_REQ(3));
2018
2019 /* プロパティ値書き込み要求(応答要)電文作成 */
2020 mrb_define_method(mrb, _class_svctask, "esv_set_c", mrb_ecnl_esv_set_c, MRB_ARGS_REQ(3));
2021
2022 /* プロパティ値読み出し要求電文作成 */
2023 mrb_define_method(mrb, _class_svctask, "esv_get", mrb_ecnl_esv_get, MRB_ARGS_REQ(2));
2024
2025 /* プロパティ値通知要求電文作成 */
2026 mrb_define_method(mrb, _class_svctask, "esv_inf_req", mrb_ecnl_esv_inf_req, MRB_ARGS_REQ(2));
2027
2028 /* プロパティ値書き込み・読み出し要求電文作成 */
2029 mrb_define_method(mrb, _class_svctask, "esv_set_get", mrb_ecnl_esv_set_get, MRB_ARGS_REQ(3));
2030
2031 /* プロパティ値通知(応答要)電文作成 */
2032 mrb_define_method(mrb, _class_svctask, "esv_infc", mrb_ecnl_esv_infc, MRB_ARGS_REQ(3));
2033
2034 /* 要求電文の送信 */
2035 mrb_define_method(mrb, _class_svctask, "snd_esv", mrb_ecnl_snd_esv, MRB_ARGS_REQ(1));
2036
2037 /* 電文の破棄 */
2038 mrb_define_method(mrb, _class_svctask, "rel_esv", mrb_ecnl_rel_esv, MRB_ARGS_REQ(1));
2039
2040 /* インスタンスリスト通知の送信 */
2041 mrb_define_method(mrb, _class_svctask, "ntf_inl", mrb_ecnl_svctask_ntf_inl, MRB_ARGS_NONE());
2042
2043 /* メッセージ処理ループ */
2044 mrb_define_method(mrb, _class_svctask, "set_timer", mrb_ecnl_svctask_set_timer, MRB_ARGS_REQ(1));
2045 mrb_define_method(mrb, _class_svctask, "timer", mrb_ecnl_svctask_get_timer, MRB_ARGS_NONE());
2046 mrb_define_method(mrb, _class_svctask, "progress", mrb_ecnl_svctask_progress, MRB_ARGS_REQ(1));
2047 mrb_define_method(mrb, _class_svctask, "recv_msg", mrb_ecnl_svctask_recv_msg, MRB_ARGS_REQ(2));
2048 mrb_define_method(mrb, _class_svctask, "call_timeout", mrb_ecnl_svctask_call_timeout, MRB_ARGS_NONE());
2049
2050 /* リモートECHONETノードの適合確認 */
2051 mrb_define_method(mrb, _class_svctask, "is_match", mrb_ecnl_svctask_is_match, MRB_ARGS_REQ(3));
2052}
2053
2054void mrb_mruby_ecnl_gem_final(mrb_state *mrb)
2055{
2056}
Note: See TracBrowser for help on using the repository browser.