source: uKadecot/trunk/src/ukadecot/main.c@ 125

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

ECHONET Lite規格に準拠していない動作を修正。
WebSocketの接続先URLを/webapi.ashxから/webapiに変更。
DHCPのリトライ処理が行われていなかったのを修正。
DHCPの有効/無効設定を追加し、固定IPアドレスを設定できるよう変更。

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=SHIFT_JIS
File size: 30.4 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 * @(#) $Id: main.c 125 2015-07-23 06:21:02Z coas-nagasima $
36 */
37
38/*
39 * サンプルプログラム(1)の本体
40 */
41
42#include <kernel.h>
43#include <t_syslog.h>
44#include <sil.h>
45#include "syssvc/serial.h"
46#include "syssvc/syslog.h"
47#include "kernel_cfg.h"
48#include "main.h"
49#include "echonet_cfg.h"
50#ifdef __RX
51#include "rx630_ccrx/rx630.h"
52#else
53#include "rx630_msvc/rx630.h"
54#endif
55#include <uip.h>
56#include <pt.h>
57#include "uip_adpt.h"
58#include "wamp.h"
59// TODO:コントローラ向けヘッダーファイルを作成する
60#include "echonet_task.h"
61#include "echonet_agent.h"
62#include "echonet_lcl_task.h"
63#include "arduino.h"
64#include "data_flash.h"
65
66uint8_t mac_addr[6] = { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xB8 };
67bool_t dhcp_enable = true;
68
69#define MAKER_CODE 0x00, 0x00, 0xB3 /* TOPPERSプロジェクト */
70
71/* ノードプロファイルオブジェクト */
72struct node_profile_object_t local_node_data = {
73 0x30, /* 動作状態 */
74 { 0x01, 0x0A, 0x01, 0x00 }, /* Version情報 */
75 {
76 0xFE, /* 下位通信層IDフィールド */
77 { MAKER_CODE }, /* メーカーコード */
78 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, /* ユニークID部(メーカー独自) */
79 },
80 0x0000, /* 異常内容 */
81 { MAKER_CODE }, /* メーカーコード */
82};
83
84/* コントローラークラス */
85struct controller_t controller_class_data = {
86 0x30, /* 動作状態 */
87 0x00, /* 設置場所 */
88 { 0x00, 0x00, 'C', 0x00 }, /* 規格Version情報 */
89 0x41, /* 異常発生状態 */
90 { MAKER_CODE }, /* メーカーコード */
91};
92
93/*
94 * 動作状態ON/OFF設定関数(0x30, 0x31のみ受け付け)
95 */
96int onoff_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
97{
98 /* サイズが1以外は受け付けない */
99 if(size != 1)
100 return 0;
101
102 *anno = *((uint8_t*)item->exinf) != *((uint8_t*)src);
103
104 switch(*(uint8_t *)src){
105 /* ONの場合 */
106 case 0x30:
107 *((uint8_t *)item->exinf) = *((uint8_t *)src);
108 /* LEDの"."をON */
109 sil_wrb_mem((uint8_t *)0x0008C02A, sil_reb_mem((uint8_t *)0x0008C02A) | 0x40);
110 break;
111 /* OFFの場合 */
112 case 0x31:
113 *((uint8_t *)item->exinf) = *((uint8_t *)src);
114 /* LEDの"."をOFF */
115 sil_wrb_mem((uint8_t *)0x0008C02A, sil_reb_mem((uint8_t *)0x0008C02A) & ~0x40);
116 break;
117 /* 0x30か0x31以外は受け付けない */
118 default:
119 return 0;
120 }
121
122 return 1;
123}
124
125/*
126 * 異常内容設定関数
127 */
128int node_profile_object_fault_content_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
129{
130 /* サイズが2以外は受け付けない */
131 if(size != 2)
132 return 0;
133
134 if((*(uint16_t *)src >= 0x0) && (*(uint16_t *)src <= 0x3ec)){
135 *((uint16_t *)item->exinf) = *((uint16_t *)src);
136 /* TODO: このの場合の処理*/
137 }
138 /* 上記以外は受け付けない */
139 else{
140 return 0;
141 }
142
143 return 2;
144}
145
146/*
147 * 異常発生状態設定関数(0x41, 0x42のみ受け付け)
148 */
149int alarm_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
150{
151 /* サイズが1以外は受け付けない */
152 if(size != 1)
153 return 0;
154
155 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
156
157 switch(*(uint8_t *)src){
158 /* 異常発生ありの場合 */
159 case 0x41:
160 /* 異常発生なしの場合 */
161 case 0x42:
162 *((uint8_t *)item->exinf) = *((uint8_t *)src);
163 break;
164 /* 0x41か0x42以外は受け付けない */
165 default:
166 return 0;
167 }
168
169 return 1;
170}
171
172/*
173 * 現在時刻設定関数
174 */
175int time_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
176{
177 uint8_t *p_src;
178
179 if(size != 2)
180 return 0;
181
182 /* 時刻設定 */
183 p_src = (uint8_t *)src;
184 sil_wrb_mem((uint8_t *)RTC_RHRCNT_ADDR, *p_src++);
185 sil_wrb_mem((uint8_t *)RTC_RMINCNT_ADDR, *p_src++);
186 sil_wrb_mem((uint8_t *)RTC_RSECCNT_ADDR, 0x00);
187
188 return (intptr_t)p_src - (intptr_t)src;
189}
190
191/*
192 * 現在時刻取得関数
193 */
194int time_prop_get(const EPRPINIB *item, void *dst, int size)
195{
196 uint8_t *p_dst;
197
198 if(size != 2)
199 return 0;
200
201 /* 時刻設定 */
202 p_dst = (uint8_t *)dst;
203 *p_dst++ = sil_reb_mem((uint8_t *)RTC_RHRCNT_ADDR);
204 *p_dst++ = sil_reb_mem((uint8_t *)RTC_RMINCNT_ADDR);
205
206 return (intptr_t)p_dst - (intptr_t)dst;
207}
208
209/*
210 * 現在年月日設定関数
211 */
212int date_prop_set(const EPRPINIB *item, const void *src, int size, bool_t *anno)
213{
214 uint8_t *p_src;
215
216 if(size != 4)
217 return 0;
218
219 /* 年月日設定 */
220 p_src = (uint8_t *)src;
221 p_src++; /* 20XX */
222 sil_wrb_mem((uint8_t *)RTC_RYRCNT_ADDR, *p_src++);
223 sil_wrb_mem((uint8_t *)RTC_RMONCNT_ADDR, *p_src++);
224 sil_wrb_mem((uint8_t *)RTC_RDAYCNT_ADDR, *p_src++);
225
226 return (intptr_t)p_src - (intptr_t)src;
227}
228
229/*
230 * 現在年月日取得関数
231 */
232int date_prop_get(const EPRPINIB *item, void *dst, int size)
233{
234 uint8_t *p_dst;
235
236 if(size != 4)
237 return 0;
238
239 p_dst = (uint8_t *)dst;
240 *p_dst++ = 0x20;
241 *p_dst++ = sil_reb_mem((uint8_t *)RTC_RYRCNT_ADDR);
242 *p_dst++ = sil_reb_mem((uint8_t *)RTC_RMONCNT_ADDR);
243 *p_dst++ = sil_reb_mem((uint8_t *)RTC_RDAYCNT_ADDR);
244
245 return (intptr_t)p_dst - (intptr_t)dst;
246}
247
248/*
249 * uIP タスク初期化処理
250 */
251void uip_task_init(intptr_t exinf)
252{
253 httpd_init();
254}
255
256static void main_initialize();
257static TMO main_get_timer();
258static void main_progress(TMO interval);
259static void main_recv_esv(T_EDATA *esv);
260static bool_t main_wbs_msg(ECN_FBS_ID msg);
261static bool_t main_wbs_que_msg();
262static void main_int_msg(ECN_FBS_ID msg);
263static void main_break_wait(uint8_t *brkdat, int32_t len);
264static void main_timeout();
265static void main_start_service();
266static void main_get_device_list_res(ECN_FBS_ID msg);
267static void main_get_ipaddr_res(ECN_FBS_ID msg);
268static void main_get_device_info_res(ECN_FBS_ID msg);
269static void main_kadecot_set_res(T_EDATA *esv);
270static void main_kadecot_get_res(T_EDATA *esv);
271static void main_ecnl_set_res(T_EDATA *esv);
272static void main_ecnl_get_res(T_EDATA *esv);
273static void main_ecnl_setget_res(T_EDATA *esv);
274static void main_publish(T_EDATA *esv);
275
276struct pt main_pt;
277struct uip_timer main_pt_timer;
278T_ECN_FBS_QUEUE wbs_queue;
279
280/*
281 * メインタスク
282 */
283static
284PT_THREAD(main_task_pt(void))
285{
286 ER ret, ret2;
287 static SYSTIM prev, now;
288 TMO timer;
289 T_EDATA *esv;
290 uint8_t brkdat[64];
291 int32_t len;
292
293 PT_BEGIN(&main_pt);
294
295 /* 初期化 */
296 main_initialize();
297
298 ret2 = get_tim(&now);
299 if (ret2 != E_OK){
300 syslog(LOG_ERROR, "get_tim");
301 PT_EXIT(&main_pt);
302 }
303
304 for(;;){
305 prev = now;
306
307 /* タイマー取得 */
308 timer = main_get_timer();
309 timer_set(&main_pt_timer, timer);
310
311 /* 応答電文待ち */
312 PT_WAIT_UNTIL(&main_pt, (((ret = ecn_prcv_esv(&esv)) == E_OK) || (ret == E_BRK)
313 || ((ret = timer_expired(&main_pt_timer) ? E_TMOUT : E_WBLK) == E_TMOUT)));
314 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)){
315 syslog(LOG_ERROR, "ecn_trcv_esv");
316 PT_EXIT(&main_pt);
317 }
318
319 ret2 = get_tim(&now);
320 if (ret2 != E_OK){
321 syslog(LOG_ERROR, "get_tim");
322 PT_EXIT(&main_pt);
323 }
324
325 /* 時間経過 */
326 main_progress(now - prev);
327
328 /* Echonet電文受信の場合 */
329 if (ret == E_OK) {
330 /* Echonet電文受信処理 */
331 main_recv_esv(esv);
332
333 /* 領域解放 */
334 ret = ecn_rel_esv(esv);
335 if (ret != E_OK){
336 syslog(LOG_ERROR, "ecn_rel_esv");
337 PT_EXIT(&main_pt);
338 }
339 }
340 /* 応答電文待ちの割り込みの場合 */
341 else if (ret == E_BRK) {
342 ECN_FBS_ID msg = { (T_ECN_FST_BLK *)esv };
343 bool_t rel_msg = true;
344 switch (msg.ptr->hdr.type) {
345 case 0:
346 rel_msg = main_wbs_msg(msg);
347 break;
348 case 1/*ECN_MSG_INTERNAL*/:
349 main_int_msg(msg);
350 break;
351 case 3/*ECN_MSG_USER_BREAK*/:
352 /* 応答電文待ちの割り込みデータ取得 */
353 ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len);
354 if (ret != E_OK){
355 syslog(LOG_ERROR, "ecn_get_brk_dat");
356 PT_EXIT(&main_pt);
357 }
358
359 /* 応答電文待ちの割り込み処理 */
360 main_break_wait(brkdat, len);
361 break;
362 }
363
364 /* 領域解放 */
365 if (rel_msg) {
366 ret = ecn_rel_esv(esv);
367 if (ret != E_OK){
368 syslog(LOG_ERROR, "ecn_rel_esv");
369 PT_EXIT(&main_pt);
370 }
371 }
372 }
373
374 /* タイムアウト処理 */
375 main_timeout();
376
377 /* キューに溜まったメッセージを処理 */
378 while(main_wbs_que_msg());
379 }
380
381 PT_END(&main_pt);
382}
383
384void main_task(intptr_t exinf)
385{
386 main_task_pt();
387}
388
389void main_task_cychdr(intptr_t exinf)
390{
391 (void)iact_tsk((ID)exinf);
392}
393
394enum main_state_t {
395 main_state_start,
396 main_state_idle,
397};
398
399TMO main_timer = TMO_FEVR;
400enum main_state_t main_state = main_state_start;
401bool_t main_btn1_state;
402int main_btn1_count = 0;
403bool_t main_btn2_state;
404int main_btn2_count = 0;
405
406enum request_info_state_t {
407 request_info_state_idle,
408 request_info_state_search_device,
409 request_info_state_get_device_list,
410 request_info_state_get_ipaddr,
411 request_info_state_get_device_info,
412 request_info_state_kadecot_set,
413 request_info_state_kadecot_get,
414 request_info_state_ecnl_set,
415 request_info_state_ecnl_get,
416 request_info_state_ecnl_setget,
417};
418
419typedef struct request_info {
420 enum request_info_state_t state;
421 TMO timer;
422 unsigned int requestId;
423 struct wamp_dealer *dealer;
424 ID eobjid;
425 uint8_t epc;
426} request_info_t;
427
428request_info_t request_infos[1];
429wamp_state_t wamp;
430
431/*
432 * 初期化
433 */
434static void main_initialize()
435{
436 extern u8_t my_ip[4];
437 extern u8_t my_netmask[4];
438 extern u8_t my_default_router[4];
439 uint8_t btn1, btn2;
440 uint8_t data[32], c;
441 int i, j;
442 bool_t dflt_addr = true;
443 ER ret;
444
445 /* LEDを"000"と表示 */
446 sil_wrb_mem((uint8_t *)0x0008C02A, 0x00);
447
448 ret = data_flash_init();
449 while(ret == E_OK){
450 ret = data_flash_read(0, data);
451 if(ret != E_OK){
452 break;
453 }
454
455 dflt_addr = false;
456 memcpy(mac_addr, data, sizeof(mac_addr));
457 dhcp_enable = data[sizeof(mac_addr)] != 0;
458 memcpy(my_ip, &data[sizeof(mac_addr) + 1], sizeof(my_ip));
459 memcpy(my_netmask, &data[sizeof(mac_addr) + 5], sizeof(my_netmask));
460 memcpy(my_default_router, &data[sizeof(mac_addr) + 9], sizeof(my_default_router));
461 break;
462 }
463
464 for(i = 0, j = 0; i < sizeof(mac_addr); i++){
465 c = mac_addr[i] >> 4;
466 data[j++] = (c < 10) ? ('0' + c) : ('A' - 10 + c);
467 c = mac_addr[i] & 0xF;
468 data[j++] = (c < 10) ? ('0' + c) : ('A' - 10 + c);
469 data[j++] = ':';
470 }
471 data[--j] = '\0';
472
473 syslog(LOG_INFO, "mac_addr %s %s %s", data, dflt_addr ? "default" : "flash-rom", dhcp_enable ? "dhcp" : "static");
474
475 /* uIPを開始 */
476 uip_start();
477
478 wamp_init(&wamp);
479
480 /* 10ms後にボタン状態を確認 */
481 main_state = main_state_start;
482 main_timer = TMO_FEVR;
483
484 /* Arduino互換機能初期化 */
485 arduino_init();
486
487 /* ボタン状態読み込み */
488 btn1 = sil_reb_mem((uint8_t *)0x0008C04A);
489 /*btn1 = sil_reb_mem((uint8_t *)0x0008C040);*/
490 btn2 = sil_reb_mem((uint8_t *) 0x0008C040);
491 main_btn1_state = (btn1 & 0x80/*0x0x20*/) != 0;
492 main_btn2_state = (btn2 & 0x80) != 0;
493
494 for (i = 0; i< sizeof(request_infos) / sizeof(request_infos[0]); i++) {
495 request_infos[i].timer = TMO_FEVR;
496 }
497}
498
499/*
500 * タイマー取得
501 */
502static TMO main_get_timer()
503{
504 int i;
505 TMO timer = main_timer, temp;
506
507 for (i = 0; i< sizeof(request_infos) / sizeof(request_infos[0]); i++) {
508 temp = request_infos[i].timer;
509 if (temp != TMO_FEVR) {
510 if ((timer == TMO_FEVR) || (temp < timer)) {
511 timer = temp;
512 }
513 }
514 }
515
516 return timer;
517}
518
519/*
520 * 時間経過
521 */
522static void main_progress(TMO interval)
523{
524 int i;
525 TMO temp;
526
527 if (main_timer != TMO_FEVR) {
528 main_timer -= interval;
529 if(main_timer < 0){
530 main_timer = 0;
531 }
532 }
533
534 for (i = 0; i< sizeof(request_infos) / sizeof(request_infos[0]); i++) {
535 temp = request_infos[i].timer;
536 if (temp != TMO_FEVR) {
537 temp -= interval;
538 if(temp < 0){
539 temp = 0;
540 }
541 request_infos[i].timer = temp;
542 }
543 }
544}
545
546static void main_self_msg(T_EDATA *esv);
547
548/*
549 * Echonet電文受信処理
550 */
551static void main_recv_esv(T_EDATA *esv)
552{
553 request_info_t *request_info = &request_infos[0];
554
555 switch(esv->hdr.edata.esv){
556 case ESV_SET_RES:
557 case ESV_SET_C_SNA:
558 if (request_info->eobjid != ecn_get_eobj(esv)) {
559 main_self_msg(esv);
560 break;
561 }
562
563 switch(request_info->state){
564 case request_info_state_kadecot_set:
565 main_kadecot_set_res(esv);
566 break;
567 case request_info_state_ecnl_set:
568 main_ecnl_set_res(esv);
569 break;
570 }
571 break;
572 case ESV_GET_RES:
573 case ESV_GET_SNA:
574 if (request_info->eobjid != ecn_get_eobj(esv)) {
575 main_self_msg(esv);
576 break;
577 }
578
579 switch(request_info->state){
580 case request_info_state_kadecot_get:
581 main_kadecot_get_res(esv);
582 break;
583 case request_info_state_ecnl_get:
584 main_ecnl_get_res(esv);
585 break;
586 }
587 break;
588 case ESV_SET_GET_RES:
589 case ESV_SET_GET_SNA:
590 if (request_info->eobjid != ecn_get_eobj(esv)) {
591 main_self_msg(esv);
592 break;
593 }
594
595 switch(request_info->state){
596 case request_info_state_ecnl_setget:
597 main_ecnl_setget_res(esv);
598 break;
599 }
600 break;
601 case ESV_INF:
602 main_self_msg(esv);
603 main_publish(esv);
604 break;
605 default:
606 main_self_msg(esv);
607 break;
608 }
609}
610
611/*
612 * WebSocketメッセージ受信処理
613 */
614static bool_t main_wbs_msg(ECN_FBS_ID msg)
615{
616 request_info_t *request_info = &request_infos[0];
617
618 if (request_info->state != request_info_state_idle) {
619 ecn_fbs_enqueue(&wbs_queue, msg.ptr);
620 return false;
621 }
622
623 wamp_put_msg(&wamp, msg, ((ID *)msg.ptr->_gap)[0]);
624 return true;
625}
626
627static bool_t main_wbs_que_msg()
628{
629 request_info_t *request_info = &request_infos[0];
630 ECN_FBS_ID msg;
631 ER ret;
632
633 if (request_info->state != request_info_state_idle)
634 return false;
635
636 ret = ecn_fbs_dequeue(&wbs_queue, &msg.ptr);
637 if (ret == E_TMOUT)
638 return false;
639
640 wamp_put_msg(&wamp, msg, ((ID *)msg.ptr->_gap)[0]);
641
642 _ecn_fbs_del(msg);
643
644 return true;
645}
646
647/*
648 * 割り込みメッセージ受信処理
649 */
650static void main_int_msg(ECN_FBS_ID msg)
651{
652 ER ret;
653 uint8_t cmd;
654 ECN_FBS_SSIZE_T len;
655
656 ret = _ecn_fbs_get_data(msg, &cmd, 1, &len);
657 if (ret != E_OK) {
658 return;
659 }
660
661 switch(cmd){
662 case ECN_INM_GET_DEVICE_LIST_RES:
663 main_get_device_list_res(msg);
664 break;
665 case ECN_INM_GET_DEVICE_INFO_RES:
666 main_get_device_info_res(msg);
667 break;
668 case ECN_UDP_MSG_GET_IPADDR_RES:
669 main_get_ipaddr_res(msg);
670 break;
671 }
672}
673
674/*
675 * 応答電文待ちの割り込み処理
676 */
677static void main_break_wait(uint8_t *brkdat, int32_t len)
678{
679 switch(main_state){
680 case main_state_start:
681 main_start_service();
682 main_state = main_state_idle;
683 main_timer = 10;
684 break;
685 case main_state_idle:
686 break;
687 }
688}
689
690/*
691 * 応答電文待ちの割り込み処理
692 */
693void main_set_addr_callback()
694{
695 ER ret;
696 uint8_t data[1];
697
698 /* メインタスクに通知 */
699 data[0] = 0x01;
700 ret = ecn_brk_wai(data, sizeof(data));
701 if(ret != E_OK){
702 syslog(LOG_ERROR, "ecn_brk_wai");
703 }
704}
705
706/*
707 * 応答電文待ちの割り込み処理
708 */
709static void main_start_service()
710{
711 char ip_addr[16], netmask[16], gateway[16];
712 ER ret;
713
714 ip2str(ip_addr, uip_hostaddr);
715 ip2str(netmask, uip_netmask);
716 ip2str(gateway, uip_draddr);
717 syslog(LOG_INFO, "ip_addr %s, netmask %s, gateway %s", ip_addr, netmask, gateway);
718
719 /* ECHONETミドルウェアを起動 */
720 ret = ecn_sta_svc();
721 if(ret != E_OK)
722 return;
723}
724
725static void main_btn_timeout();
726static void main_request_info_timeout(request_info_t *request_info);
727
728/*
729 * タイムアウト処理
730 */
731static void main_timeout()
732{
733 int i;
734 TMO temp;
735
736 if (main_timer == 0) {
737 main_btn_timeout();
738 }
739
740 for (i = 0; i< sizeof(request_infos) / sizeof(request_infos[0]); i++) {
741 temp = request_infos[i].timer;
742 if (temp != 0)
743 continue;
744
745 main_request_info_timeout(&request_infos[i]);;
746 }
747}
748
749static void main_btn1_change(bool_t push);
750static void main_btn2_change(bool_t push);
751static ER main_search_device();
752
753static void main_btn_timeout()
754{
755 uint8_t btn1, btn2;
756
757 if(main_timer != 0)
758 return;
759
760 switch(main_state){
761 case main_state_idle:
762 /* 10ms後にボタン状態を確認 */
763 main_timer = 10;
764
765 arduino_tick();
766
767 /* ボタン状態読み込み */
768 btn1 = sil_reb_mem((uint8_t *)0x0008C04A);
769 /*btn1 = sil_reb_mem((uint8_t *)0x0008C040);*/
770 btn2 = sil_reb_mem((uint8_t *) 0x0008C040);
771
772 /* ボタン1の処理 */
773 if(((btn1 & 0x80/*0x20*/) != 0) && !main_btn1_state){
774 main_btn1_count++;
775 if(main_btn1_count > 10){
776 main_btn1_count = 0;
777 main_btn1_state = true;
778
779 main_btn1_change(true);
780 }
781 }
782 else if(((btn1 & 0x80/*0x20*/) == 0) && main_btn1_state){
783 main_btn1_count++;
784 if(main_btn1_count > 10){
785 main_btn1_count = 0;
786 main_btn1_state = false;
787
788 main_btn1_change(false);
789 }
790 }
791 else{
792 main_btn1_count = 0;
793 }
794
795 /* ボタン2の処理 */
796 if(((btn2 & 0x80) != 0) && !main_btn2_state){
797 main_btn2_count++;
798 if(main_btn2_count > 10){
799 main_btn2_count = 0;
800 main_btn2_state = true;
801
802 main_btn2_change(true);
803 }
804 }
805 else if(((btn2 & 0x80) == 0) && main_btn2_state){
806 main_btn2_count++;
807 if(main_btn2_count > 10){
808 main_btn2_count = 0;
809 main_btn2_state = false;
810
811 main_btn2_change(false);
812 }
813 }
814 else{
815 main_btn2_count = 0;
816 }
817 break;
818 }
819}
820
821static void main_self_msg(T_EDATA *esv)
822{
823 ER ret;
824 uint8_t epc;
825 uint8_t pdc;
826 uint8_t p_edt[256];
827 T_ENUM_EPC enm;
828
829 ret = ecn_itr_ini(&enm, esv);
830 if(ret != E_OK){
831 syslog(LOG_ERROR, "ecn_itr_ini");
832 return;
833 }
834
835 for(;;) {
836 while((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
837 switch (epc) {
838 case 0x80:
839 break;
840 case 0x81:
841 break;
842 }
843 }
844 if(ret != E_BOVR){
845 syslog(LOG_ERROR, "ecn_itr_nxt");
846 break;
847 }
848 if(enm.is_eof)
849 break;
850 }
851}
852
853/*
854 * ボタン1状態変化処理
855 */
856static void main_btn1_change(bool_t push)
857{
858 /* 押されて戻った時に処理する */
859 if(push)
860 return;
861
862 /* 機器の検索 */
863 main_search_device();
864}
865
866/*
867 * ボタン2状態変化処理
868 */
869static void main_btn2_change(bool_t push)
870{
871}
872
873/*
874 * 機器の検索
875 */
876static ER main_search_device()
877{
878 ER ret;
879 T_EDATA *esv;
880
881 /* 機器の検索 */
882 ret = ecn_esv_inf_req(&esv, EOBJ_NULL, 0xD6);
883 if(ret != E_OK){
884 syslog(LOG_ERROR, "ecn_esv_inf_req");
885 return ret;
886 }
887
888 /* 電文送信 */
889 ret = ecn_snd_esv(esv);
890 if(ret != E_OK){
891 syslog(LOG_ERROR, "ecn_snd_esv");
892 return ret;
893 }
894
895 return E_OK;
896}
897
898extern int ws_out_req;
899
900ER main_send_message(ECN_FBS_ID msg, ID wbsid)
901{
902 ER ret;
903
904 ((ID *)msg.ptr->_gap)[0] = wbsid;
905
906 ret = psnd_dtq(WEBSOCKET_MBXID, (intptr_t)msg.ptr);
907 if(ret != E_OK){
908 syslog(LOG_ERROR, "psnd_dtq(WEBSOCKET_MBXID) : result=%d", ret);
909 _ecn_fbs_del(msg);
910 return ret;
911 }
912
913 ws_out_req++;
914 act_tsk(UIP_TASK);
915
916 return ret;
917}
918
919ER main_get_device_list(unsigned int requestId, struct wamp_dealer *dealer)
920{
921 request_info_t *request_info = &request_infos[0];
922 ER ret;
923
924 if(request_info->requestId != 0)
925 return E_QOVR;
926
927 /* 機器の検索 */
928 ret = main_search_device();
929 if(ret != E_OK){
930 return ret;
931 }
932
933 request_info->state = request_info_state_search_device;
934 request_info->timer = (TMO)5000;
935 request_info->requestId = requestId;
936 request_info->dealer = dealer;
937
938 return E_OK;
939}
940
941static void main_search_device_timeout()
942{
943 request_info_t *request_info = &request_infos[0];
944 ER ret;
945 ECN_FBS_ID req;
946
947 for (;;) {
948 ret = ecn_agent_get_device_list(ECHONET_API_MAILBOX, request_info->requestId, &req);
949 if(ret != E_OK){
950 syslog(LOG_ERROR, "ecn_agent_get_device_list");
951 break;
952 }
953
954 ret = psnd_dtq(req.ptr->hdr.target_mbxid, (intptr_t)req.ptr);
955 if (ret != E_OK) {
956 syslog(LOG_ERROR, "psnd_dtq");
957 _ecn_fbs_del(req);
958 break;
959 }
960
961 request_info->state = request_info_state_get_device_list;
962 request_info->timer = (TMO)1000;
963 return;
964 }
965
966 wamp_dealer_get_devicelist_timeout(request_info->dealer);
967
968 request_info->state = request_info_state_idle;
969 request_info->timer = TMO_FEVR;
970 request_info->requestId = 0;
971 request_info->dealer = NULL;
972}
973
974static void main_get_device_list_res(ECN_FBS_ID msg)
975{
976 request_info_t *request_info = &request_infos[0];
977 ER ret;
978 unsigned int requestId;
979 struct wamp_dealer *dealer;
980 ECN_FBS_SSIZE_T len;
981
982 ret = _ecn_fbs_get_data(msg, &requestId, sizeof(requestId), &len);
983 if (ret != E_OK) {
984 syslog(LOG_ERROR, "_ecn_fbs_get_data");
985 return;
986 }
987
988 if (request_info->requestId != requestId)
989 return;
990
991 dealer = request_info->dealer;
992 request_info->state = request_info_state_idle;
993 request_info->timer = TMO_FEVR;
994 request_info->requestId = 0;
995 request_info->dealer = NULL;
996
997 wamp_dealer_set_devicelist(dealer, msg);
998}
999
1000ER main_get_device_ipaddr(unsigned int requestId, struct wamp_dealer *dealer, ECN_ENOD_ID addrid)
1001{
1002 request_info_t *request_info = &request_infos[0];
1003 ER ret;
1004 ECN_FBS_ID req;
1005
1006 if(request_info->requestId != 0)
1007 return E_QOVR;
1008
1009 ret = ecn_udp_get_ipaddr(ECHONET_API_MAILBOX, requestId, addrid, &req);
1010 if(ret != E_OK){
1011 return ret;
1012 }
1013
1014 ret = psnd_dtq(req.ptr->hdr.target_mbxid, (intptr_t)req.ptr);
1015 if (ret != E_OK) {
1016 syslog(LOG_ERROR, "psnd_dtq");
1017 _ecn_fbs_del(req);
1018 return ret;
1019 }
1020
1021 request_info->state = request_info_state_get_ipaddr;
1022 request_info->timer = (TMO)1000;
1023 request_info->requestId = requestId;
1024 request_info->dealer = dealer;
1025
1026 return E_OK;
1027}
1028
1029static void main_get_ipaddr_res(ECN_FBS_ID msg)
1030{
1031 request_info_t *request_info = &request_infos[0];
1032 ER ret;
1033 struct wamp_dealer *dealer;
1034 ECN_FBS_SSIZE_T len;
1035 ecn_udp_msg_get_ipaddr_res_t ipaddr;
1036 char str[16];
1037
1038 ret = _ecn_fbs_get_data(msg, &ipaddr, sizeof(ipaddr), &len);
1039 if (ret || (len != sizeof(ipaddr))) {
1040 syslog(LOG_ERROR, "_ecn_fbs_get_data");
1041 return;
1042 }
1043
1044 if (request_info->requestId != ipaddr.requestid)
1045 return;
1046
1047 dealer = request_info->dealer;
1048 request_info->state = request_info_state_idle;
1049 request_info->timer = TMO_FEVR;
1050 request_info->requestId = 0;
1051 request_info->dealer = NULL;
1052
1053 ipaddr2str(str, sizeof(str), ipaddr.enodadrb.ipaddr);
1054
1055 wamp_dealer_set_ipaddr(dealer, str);
1056}
1057
1058ER main_get_device_info(unsigned int requestId, struct wamp_dealer *dealer, ID eobjid)
1059{
1060 request_info_t *request_info = &request_infos[0];
1061 ER ret;
1062 ECN_FBS_ID req;
1063
1064 if(request_info->requestId != 0)
1065 return E_QOVR;
1066
1067 ret = ecn_agent_get_device_info(ECHONET_API_MAILBOX, requestId, eobjid, &req);
1068 if(ret != E_OK){
1069 return ret;
1070 }
1071
1072 ret = psnd_dtq(req.ptr->hdr.target_mbxid, (intptr_t)req.ptr);
1073 if (ret != E_OK) {
1074 syslog(LOG_ERROR, "psnd_dtq");
1075 _ecn_fbs_del(req);
1076 return ret;
1077 }
1078
1079 request_info->state = request_info_state_get_device_info;
1080 request_info->timer = (TMO)1000;
1081 request_info->requestId = requestId;
1082 request_info->dealer = dealer;
1083
1084 return E_OK;
1085}
1086
1087static void main_get_device_info_res(ECN_FBS_ID msg)
1088{
1089 request_info_t *request_info = &request_infos[0];
1090 ER ret;
1091 struct wamp_dealer *dealer;
1092 ecn_inm_get_device_info_res_t rmsg;
1093 ECN_FBS_SSIZE_T len;
1094
1095 ret = _ecn_fbs_get_data(msg, &rmsg, sizeof(rmsg), &len);
1096 if (ret != E_OK) {
1097 syslog(LOG_ERROR, "_ecn_fbs_get_data");
1098 return;
1099 }
1100
1101 if (request_info->requestId != rmsg.requestid)
1102 return;
1103
1104 dealer = request_info->dealer;
1105 request_info->state = request_info_state_idle;
1106 request_info->timer = TMO_FEVR;
1107 request_info->requestId = 0;
1108 request_info->dealer = NULL;
1109
1110 wamp_dealer_set_deviceinfo(dealer, rmsg.eobjid, rmsg.pmapSet, rmsg.pmapGet, rmsg.pmapAnno);
1111}
1112
1113ER main_kadecot_get(unsigned int requestId, struct wamp_dealer *dealer, ID eobjid, uint8_t epc)
1114{
1115 request_info_t *request_info = &request_infos[0];
1116 ER ret;
1117 T_EDATA *esv;
1118
1119 if(request_info->requestId != 0)
1120 return E_QOVR;
1121
1122 /* プロパティ取得電文作成 */
1123 ret = ecn_esv_get(&esv, eobjid, epc);
1124 if(ret != E_OK){
1125 syslog(LOG_ERROR, "ecn_esv_get");
1126 return ret;
1127 }
1128
1129 /* 電文送信 */
1130 ret = ecn_snd_esv(esv);
1131 if(ret != E_OK){
1132 syslog(LOG_ERROR, "ecn_snd_esv");
1133 return ret;
1134 }
1135
1136 request_info->state = request_info_state_kadecot_get;
1137 request_info->timer = (TMO)5000;
1138 request_info->requestId = requestId;
1139 request_info->dealer = dealer;
1140 request_info->eobjid = eobjid;
1141 request_info->epc = epc;
1142
1143 return E_OK;
1144}
1145
1146static void main_kadecot_get_res(T_EDATA *esv)
1147{
1148 request_info_t *request_info = &request_infos[0];
1149 ER ret;
1150 ID eobjid = ecn_get_eobj(esv);
1151 struct wamp_dealer *dealer = request_info->dealer;
1152 uint8_t epc;
1153 uint8_t pdc;
1154 uint8_t p_edt[256];
1155 T_ENUM_EPC enm;
1156
1157 if(request_info->eobjid != eobjid)
1158 return;
1159
1160 dealer = request_info->dealer;
1161 request_info->state = request_info_state_idle;
1162 request_info->timer = TMO_FEVR;
1163 request_info->requestId = 0;
1164 request_info->dealer = NULL;
1165
1166 ret = ecn_itr_ini(&enm, esv);
1167 if(ret != E_OK){
1168 syslog(LOG_ERROR, "ecn_itr_ini");
1169 return;
1170 }
1171
1172 for(;;) {
1173 while((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
1174 if (request_info->epc == epc) {
1175 wamp_dealer_kadecot_get(dealer, eobjid, epc, pdc, p_edt);
1176 }
1177 }
1178 if(ret != E_BOVR){
1179 syslog(LOG_ERROR, "ecn_itr_nxt");
1180 break;
1181 }
1182 if(enm.is_eof)
1183 break;
1184 }
1185}
1186
1187ER main_kadecot_set(unsigned int requestId, struct wamp_dealer *dealer, ID eobjid, uint8_t epc,
1188 uint8_t pdc, uint8_t *edt)
1189{
1190 request_info_t *request_info = &request_infos[0];
1191 ER ret;
1192 T_EDATA *esv;
1193
1194 if(request_info->requestId != 0)
1195 return E_QOVR;
1196
1197 /* プロパティ取得電文作成 */
1198 ret = ecn_esv_setc(&esv, eobjid, epc, pdc, edt);
1199 if(ret != E_OK){
1200 syslog(LOG_ERROR, "ecn_esv_setc");
1201 return ret;
1202 }
1203
1204 /* 電文送信 */
1205 ret = ecn_snd_esv(esv);
1206 if(ret != E_OK){
1207 syslog(LOG_ERROR, "ecn_snd_esv");
1208 return ret;
1209 }
1210
1211 request_info->state = request_info_state_kadecot_set;
1212 request_info->timer = (TMO)5000;
1213 request_info->requestId = requestId;
1214 request_info->dealer = dealer;
1215 request_info->eobjid = eobjid;
1216 request_info->epc = epc;
1217
1218 return E_OK;
1219}
1220
1221static void main_kadecot_set_res(T_EDATA *esv)
1222{
1223 request_info_t *request_info = &request_infos[0];
1224 ER ret;
1225 ID eobjid = ecn_get_eobj(esv);
1226 struct wamp_dealer *dealer = request_info->dealer;
1227 uint8_t epc;
1228 uint8_t pdc;
1229 uint8_t p_edt[256];
1230 T_ENUM_EPC enm;
1231
1232 if (dealer == NULL)
1233 return;
1234
1235 if(request_info->eobjid != eobjid)
1236 return;
1237
1238 request_info->state = request_info_state_idle;
1239 request_info->timer = TMO_FEVR;
1240 request_info->requestId = 0;
1241 request_info->dealer = NULL;
1242
1243 ret = ecn_itr_ini(&enm, esv);
1244 if(ret != E_OK){
1245 syslog(LOG_ERROR, "ecn_itr_ini");
1246 return;
1247 }
1248
1249 for(;;) {
1250 while((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
1251 if (request_info->epc == epc) {
1252 wamp_dealer_kadecot_set(dealer, eobjid, epc);
1253 }
1254 }
1255 if(ret != E_BOVR){
1256 syslog(LOG_ERROR, "ecn_itr_nxt");
1257 break;
1258 }
1259 if(enm.is_eof)
1260 break;
1261 }
1262}
1263
1264ER main_ecnl_get(unsigned int requestId, struct wamp_dealer *dealer, ID eobjid, T_EDATA *esv)
1265{
1266 request_info_t *request_info = &request_infos[0];
1267 ER ret;
1268
1269 if(request_info->requestId != 0)
1270 return E_QOVR;
1271
1272 /* 電文送信 */
1273 ret = ecn_snd_esv(esv);
1274 if(ret != E_OK){
1275 syslog(LOG_ERROR, "ecn_snd_esv");
1276 return ret;
1277 }
1278
1279 request_info->state = request_info_state_ecnl_get;
1280 request_info->timer = (TMO)5000;
1281 request_info->requestId = requestId;
1282 request_info->dealer = dealer;
1283 request_info->eobjid = eobjid;
1284
1285 return E_OK;
1286}
1287
1288static void main_ecnl_get_res(T_EDATA *esv)
1289{
1290 request_info_t *request_info = &request_infos[0];
1291
1292 wamp_dealer_ecnl_get_res(request_info->dealer, esv);
1293
1294 request_info->state = request_info_state_idle;
1295 request_info->timer = TMO_FEVR;
1296 request_info->requestId = 0;
1297 request_info->dealer = NULL;
1298}
1299
1300ER main_ecnl_set(unsigned int requestId, struct wamp_dealer *dealer, ID eobjid, T_EDATA *esv)
1301{
1302 request_info_t *request_info = &request_infos[0];
1303 ER ret;
1304
1305 if(request_info->requestId != 0)
1306 return E_QOVR;
1307
1308 /* 電文送信 */
1309 ret = ecn_snd_esv(esv);
1310 if(ret != E_OK){
1311 syslog(LOG_ERROR, "ecn_snd_esv");
1312 return ret;
1313 }
1314
1315 request_info->state = request_info_state_ecnl_set;
1316 request_info->timer = (TMO)5000;
1317 request_info->requestId = requestId;
1318 request_info->dealer = dealer;
1319 request_info->eobjid = eobjid;
1320
1321 return E_OK;
1322}
1323
1324static void main_ecnl_set_res(T_EDATA *esv)
1325{
1326 request_info_t *request_info = &request_infos[0];
1327
1328 wamp_dealer_ecnl_set_res(request_info->dealer, esv);
1329
1330 request_info->state = request_info_state_idle;
1331 request_info->timer = TMO_FEVR;
1332 request_info->requestId = 0;
1333 request_info->dealer = NULL;
1334}
1335
1336ER main_ecnl_setget(unsigned int requestId, struct wamp_dealer *dealer, ID eobjid, T_EDATA *esv)
1337{
1338 request_info_t *request_info = &request_infos[0];
1339 ER ret;
1340
1341 if(request_info->requestId != 0)
1342 return E_QOVR;
1343
1344 /* 電文送信 */
1345 ret = ecn_snd_esv(esv);
1346 if(ret != E_OK){
1347 syslog(LOG_ERROR, "ecn_snd_esv");
1348 return ret;
1349 }
1350
1351 request_info->state = request_info_state_ecnl_setget;
1352 request_info->timer = (TMO)5000;
1353 request_info->requestId = requestId;
1354 request_info->dealer = dealer;
1355 request_info->eobjid = eobjid;
1356
1357 return E_OK;
1358}
1359
1360static void main_ecnl_setget_res(T_EDATA *esv)
1361{
1362 request_info_t *request_info = &request_infos[0];
1363
1364 wamp_dealer_ecnl_setget_res(request_info->dealer, esv);
1365
1366 request_info->state = request_info_state_idle;
1367 request_info->timer = TMO_FEVR;
1368 request_info->requestId = 0;
1369 request_info->dealer = NULL;
1370}
1371
1372static void main_request_info_timeout(request_info_t *request_info)
1373{
1374 struct wamp_dealer *dealer = request_info->dealer;
1375
1376 switch(request_info->state) {
1377 case request_info_state_search_device:
1378 main_search_device_timeout();
1379 return;
1380 case request_info_state_get_device_list:
1381 wamp_dealer_get_devicelist_timeout(dealer);
1382 break;
1383 case request_info_state_get_ipaddr:
1384 wamp_dealer_get_ipaddr_timeout(dealer);
1385 break;
1386 case request_info_state_get_device_info:
1387 wamp_dealer_get_deviceinfo_timeout(dealer);
1388 break;
1389 case request_info_state_kadecot_set:
1390 wamp_dealer_kadecot_set_timeout(dealer);
1391 break;
1392 case request_info_state_kadecot_get:
1393 wamp_dealer_kadecot_get_timeout(dealer);
1394 break;
1395 case request_info_state_ecnl_set:
1396 wamp_dealer_ecnl_set_timeout(dealer);
1397 break;
1398 case request_info_state_ecnl_get:
1399 wamp_dealer_ecnl_get_timeout(dealer);
1400 break;
1401 case request_info_state_ecnl_setget:
1402 wamp_dealer_ecnl_setget_timeout(dealer);
1403 break;
1404 }
1405
1406 request_info->state = request_info_state_idle;
1407 request_info->timer = TMO_FEVR;
1408 request_info->requestId = 0;
1409 request_info->dealer = NULL;
1410}
1411
1412static void main_publish(T_EDATA *esv)
1413{
1414 ID eobjid = ecn_get_eobj(esv);
1415 uint16_t devType = (esv->hdr.edata.seoj.eojx1 << 8) | esv->hdr.edata.seoj.eojx2;
1416 uint8_t epc;
1417 uint8_t pdc;
1418 uint8_t p_edt[256];
1419 T_ENUM_EPC enm;
1420 ER ret;
1421
1422 ret = ecn_itr_ini(&enm, esv);
1423 if(ret != E_OK){
1424 syslog(LOG_ERROR, "ecn_itr_ini");
1425 return;
1426 }
1427
1428 for(;;) {
1429 while((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
1430 wamp_broker_publish_inf(&wamp.broker, esv->hdr.ecn_hdr.tid, eobjid,
1431 devType, epc, pdc, p_edt);
1432 }
1433 if(ret != E_BOVR){
1434 syslog(LOG_ERROR, "ecn_itr_nxt");
1435 break;
1436 }
1437 if(enm.is_eof)
1438 break;
1439 }
1440}
Note: See TracBrowser for help on using the repository browser.