Index: asp3_tinet_ecnl_rx/trunk/app2_light/src/echonet_main.c
===================================================================
--- asp3_tinet_ecnl_rx/trunk/app2_light/src/echonet_main.c	(revision 351)
+++ asp3_tinet_ecnl_rx/trunk/app2_light/src/echonet_main.c	(revision 364)
@@ -1,7 +1,7 @@
 /*
  *  TOPPERS ECHONET Lite Communication Middleware
- * 
+ *
  *  Copyright (C) 2014-2018 Cores Co., Ltd. Japan
- * 
+ *
  *  上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
  *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
@@ -26,5 +26,5 @@
  *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
  *      免責すること．
- * 
+ *
  *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
  *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
@@ -32,9 +32,9 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
  *  の責任を負わない．
- * 
+ *
  *  @(#) $Id$
  */
 
-/* 
+/*
  *  サンプルプログラム(1)の本体
  */
@@ -116,10 +116,10 @@
 {
 	/* サイズが１以外は受け付けない */
-	if(size != 1)
+	if (size != 1)
 		return 0;
 
 	*anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
 
-	switch(*(uint8_t *)src){
+	switch (*(uint8_t *)src) {
 	/* ONの場合 */
 	case 0x30:
@@ -152,10 +152,10 @@
 {
 	/* サイズが１以外は受け付けない */
-	if(size != 1)
+	if (size != 1)
 		return 0;
 
 	*anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
 
-	switch(*(uint8_t *)src){
+	switch (*(uint8_t *)src) {
 	/* 異常発生ありの場合 */
 	case 0x41:
@@ -180,8 +180,8 @@
 
 	/* サイズが1以外は受け付けない */
-	if(size != 1)
-		return 0;
-
-	switch(*(uint8_t *)src){
+	if (size != 1)
+		return 0;
+
+	switch (*(uint8_t *)src) {
 	/* 自動の場合 */
 	case 0x41:
@@ -224,8 +224,8 @@
 	uint8_t data[2];
 
-	if(size != 1)
-		return 0;
-
-	switch(*(uint8_t *)src){
+	if (size != 1)
+		return 0;
+
+	switch (*(uint8_t *)src) {
 	/* 人体検出ありの場合 */
 	case 0x41:
@@ -236,5 +236,5 @@
 		data[1] = *(uint8_t *)src;
 		ret = ecn_brk_wai(data, sizeof(data));
-		if(ret != E_OK){
+		if (ret != E_OK) {
 			syslog(LOG_ERROR, "ecn_brk_wai");
 			return 1;
@@ -249,5 +249,5 @@
 		data[1] = *(uint8_t *)src;
 		ret = ecn_brk_wai(data, sizeof(data));
-		if(ret != E_OK){
+		if (ret != E_OK) {
 			syslog(LOG_ERROR, "ecn_brk_wai");
 			return 1;
@@ -269,5 +269,5 @@
 	uint8_t *p_src;
 
-	if(size != 2)
+	if (size != 2)
 		return 0;
 
@@ -288,5 +288,5 @@
 	uint8_t *p_dst;
 
-	if(size != 2)
+	if (size != 2)
 		return 0;
 
@@ -306,5 +306,5 @@
 	uint8_t *p_src;
 
-	if(size != 4)
+	if (size != 4)
 		return 0;
 
@@ -326,5 +326,5 @@
 	uint8_t *p_dst;
 
-	if(size != 4)
+	if (size != 4)
 		return 0;
 
@@ -361,10 +361,10 @@
 
 	ret2 = get_tim(&now);
-	if (ret2 != E_OK){
+	if (ret2 != E_OK) {
 		syslog(LOG_ERROR, "get_tim");
 		return;
 	}
 
-	for(;;){
+	for (;;) {
 		prev = now;
 
@@ -374,5 +374,5 @@
 		/* 応答電文待ち */
 		ret = ecn_trcv_esv(&esv, timer);
-		if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)){
+		if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) {
 			syslog(LOG_ERROR, "ecn_trcv_esv");
 			break;
@@ -380,5 +380,5 @@
 
 		ret2 = get_tim(&now);
-		if (ret2 != E_OK){
+		if (ret2 != E_OK) {
 			syslog(LOG_ERROR, "get_tim");
 			break;
@@ -395,5 +395,5 @@
 			/* 領域解放 */
 			ret = ecn_rel_esv(esv);
-			if (ret != E_OK){
+			if (ret != E_OK) {
 				syslog(LOG_ERROR, "ecn_rel_esv");
 				break;
@@ -404,5 +404,5 @@
 			/* 応答電文待ちの割り込みデータ取得 */
 			ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len);
-			if (ret != E_OK){
+			if (ret != E_OK) {
 				syslog(LOG_ERROR, "ecn_get_brk_dat");
 				break;
@@ -414,5 +414,5 @@
 			/* 領域解放 */
 			ret = ecn_rel_esv(esv);
-			if (ret != E_OK){
+			if (ret != E_OK) {
 				syslog(LOG_ERROR, "ecn_rel_esv");
 				break;
@@ -425,6 +425,4 @@
 }
 
-bool_t started = false;
-
 void echonet_change_netif_link(uint8_t link_up, uint8_t up)
 {
@@ -434,14 +432,10 @@
 		return;
 
-	if (up && !started) {
-		started = true;
-
-		/* ECHONETミドルウェアを起動 */
-		ret = ecn_sta_svc();
-		if (ret != E_OK)
-			return;
-
-		/* ECHONETミドルウェアを起動するのを待つ */
-		dly_tsk(100);
+	if (up) {
+		/* インスタンスリスト通知の送信 */
+		ret = ecn_ntf_inl();
+		if (ret != E_OK) {
+			syslog(LOG_ERROR, "ecn_ntf_inl");
+		}
 	}
 
@@ -457,5 +451,6 @@
 }
 
-enum main_state_t{
+enum main_state_t {
+	main_state_start,
 	main_state_idle,
 	main_state_search,
@@ -464,5 +459,5 @@
 int main_timer = TMO_FEVR;
 int main_btn_timer = TMO_FEVR;
-enum main_state_t main_state = main_state_idle;
+enum main_state_t main_state = main_state_start;
 bool_t main_btn1_state;
 int main_btn1_count = 0;
@@ -480,6 +475,6 @@
 	sil_wrb_mem((uint8_t *)0x0008C02A, 0x00);
 
-	/* １秒後に人体検知センサを検索 */
-	main_state = main_state_search;
+	/* ECHONETミドルウェアを起動するのを待つ */
+	main_state = main_state_start;
 	main_timer = 1000 * 1000;
 
@@ -490,8 +485,9 @@
 	btn1 = sil_reb_mem((uint8_t *)0x0008C04A);
 	/*btn1 = sil_reb_mem((uint8_t *)0x0008C040);*/
-	btn2 = sil_reb_mem((uint8_t *) 0x0008C040);
+	btn2 = sil_reb_mem((uint8_t *)0x0008C040);
 	main_btn1_state = (btn1 & 0x80/*0x0x20*/) != 0;
 	main_btn2_state = (btn2 & 0x80) != 0;
 
+	/* メインタスクを起動 */
 	ER ret = act_tsk(MAIN_TASK);
 	if (ret != E_OK) {
@@ -507,6 +503,6 @@
 	int result = main_timer;
 
-	if((result == TMO_FEVR)
-		|| ((main_btn_timer != TMO_FEVR) && (main_btn_timer < result))){
+	if ((result == TMO_FEVR)
+		|| ((main_btn_timer != TMO_FEVR) && (main_btn_timer < result))) {
 		result = main_btn_timer;
 	}
@@ -520,14 +516,14 @@
 static void main_progress(int interval)
 {
-	if(main_timer != TMO_FEVR){
+	if (main_timer != TMO_FEVR) {
 		main_timer -= interval;
-		if(main_timer < 0){
+		if (main_timer < 0) {
 			main_timer = 0;
 		}
 	}
 
-	if(main_btn_timer != TMO_FEVR){
+	if (main_btn_timer != TMO_FEVR) {
 		main_btn_timer -= interval;
-		if(main_btn_timer < 0){
+		if (main_btn_timer < 0) {
 			main_btn_timer = 0;
 		}
@@ -548,19 +544,19 @@
 
 	eobjid = ecn_get_eobj(esv);
-	if(eobjid == EOBJ_NULL){
+	if (eobjid == EOBJ_NULL) {
 		syslog(LOG_ERROR, "ecn_get_eobj");
 	}
 
 	ret = ecn_itr_ini(&enm, esv);
-	if(ret != E_OK){
+	if (ret != E_OK) {
 		syslog(LOG_ERROR, "ecn_itr_ini");
 		return;
 	}
 
-	for(;;) {
-		while((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
+	for (;;) {
+		while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
 			switch (epc) {
 			case 0xD6:
-				switch(main_state){
+				switch (main_state) {
 				case main_state_search:
 					if (eobjid == HUMAN_DETECTION_SENSER_ENOD) {
@@ -574,9 +570,9 @@
 			}
 		}
-		if(ret != E_BOVR){
+		if (ret != E_BOVR) {
 			syslog(LOG_ERROR, "ecn_itr_nxt");
 			break;
 		}
-		if(enm.is_eof)
+		if (enm.is_eof)
 			break;
 	}
@@ -592,5 +588,5 @@
 	ER ret;
 
-	switch(main_state){
+	switch (main_state) {
 	case main_state_idle:
 		if (len < 2)
@@ -616,9 +612,9 @@
 static void main_timeout()
 {
-	if(main_timer == 0){
+	if (main_timer == 0) {
 		main_ontimer();
 	}
 
-	if(main_btn_timer == 0){
+	if (main_btn_timer == 0) {
 		main_btn_ontimer();
 	}
@@ -629,5 +625,18 @@
 static void main_ontimer()
 {
-	switch(main_state){
+	ER ret;
+
+	switch (main_state) {
+	case main_state_start:
+		/* ECHONETミドルウェアを起動 */
+		ret = ecn_sta_svc();
+		if (ret != E_OK) {
+			syslog(LOG_ERROR, "ecn_sta_svc");
+		}
+
+		/* １秒後に人体検知センサを検索 */
+		main_state = main_state_search;
+		main_timer = 1000 * 1000;
+		break;
 	case main_state_search:
 		/* 人体検知センサ再検索 */
@@ -646,5 +655,5 @@
 	/* 人体検知センサ検索 */
 	ret = ecn_esv_inf_req(&esv, EOBJ_NULL, 0xD6);
-	if(ret != E_OK){
+	if (ret != E_OK) {
 		syslog(LOG_ERROR, "ecn_esv_inf_req");
 		return;
@@ -653,5 +662,5 @@
 	/* 電文送信 */
 	ret = ecn_snd_esv(esv);
-	if(ret != E_OK){
+	if (ret != E_OK) {
 		syslog(LOG_ERROR, "ecn_snd_esv");
 	}
@@ -674,10 +683,10 @@
 	btn1 = sil_reb_mem((uint8_t *)0x0008C04A);
 	/*btn1 = sil_reb_mem((uint8_t *)0x0008C040);*/
-	btn2 = sil_reb_mem((uint8_t *) 0x0008C040);
+	btn2 = sil_reb_mem((uint8_t *)0x0008C040);
 
 	/* ボタン１の処理 */
-	if(((btn1 & 0x80/*0x20*/) != 0) && !main_btn1_state){
+	if (((btn1 & 0x80/*0x20*/) != 0) && !main_btn1_state) {
 		main_btn1_count++;
-		if(main_btn1_count > 10){
+		if (main_btn1_count > 10) {
 			main_btn1_count = 0;
 			main_btn1_state = true;
@@ -686,7 +695,7 @@
 		}
 	}
-	else if(((btn1 & 0x80/*0x20*/) == 0) && main_btn1_state){
+	else if (((btn1 & 0x80/*0x20*/) == 0) && main_btn1_state) {
 		main_btn1_count++;
-		if(main_btn1_count > 10){
+		if (main_btn1_count > 10) {
 			main_btn1_count = 0;
 			main_btn1_state = false;
@@ -697,7 +706,7 @@
 
 	/* ボタン２の処理 */
-	if(((btn2 & 0x80) != 0) && !main_btn2_state){
+	if (((btn2 & 0x80) != 0) && !main_btn2_state) {
 		main_btn2_count++;
-		if(main_btn2_count > 10){
+		if (main_btn2_count > 10) {
 			main_btn2_count = 0;
 			main_btn2_state = true;
@@ -706,7 +715,7 @@
 		}
 	}
-	else if(((btn2 & 0x80) == 0) && main_btn2_state){
+	else if (((btn2 & 0x80) == 0) && main_btn2_state) {
 		main_btn2_count++;
-		if(main_btn2_count > 10){
+		if (main_btn2_count > 10) {
 			main_btn2_count = 0;
 			main_btn2_state = false;
@@ -717,5 +726,5 @@
 }
 
-enum lighting_mode_t{
+enum lighting_mode_t {
 	lighting_mode_auto,		/* 自動の場合 */
 	lighting_mode_normal,	/* 通常灯の場合 */
@@ -736,5 +745,5 @@
 
 	/* 押されて戻った時に処理する */
-	if(push)
+	if (push)
 		return;
 
@@ -745,5 +754,5 @@
 	/* プロパティ設定電文作成 */
 	ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0x80, 1, p_edt);
-	if(ret != E_OK){
+	if (ret != E_OK) {
 		syslog(LOG_ERROR, "ecn_esv_setc");
 		return;
@@ -764,9 +773,9 @@
 
 	/* 押されて戻った時に処理する */
-	if(push)
+	if (push)
 		return;
 
 	/* 点灯モードの切り替え */
-	switch(main_mode){
+	switch (main_mode) {
 	/* 自動の場合 */
 	case lighting_mode_auto:
@@ -798,5 +807,5 @@
 	/* プロパティ設定電文作成 */
 	ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0xB6, 1, p_edt);
-	if(ret != E_OK){
+	if (ret != E_OK) {
 		syslog(LOG_ERROR, "ecn_esv_setc");
 		return;
@@ -814,10 +823,10 @@
 
 	/* 照明がOFFで人体検出ありの場合 */
-	if(!main_on && state == 0x41){
+	if (!main_on && state == 0x41) {
 		/* 照明をON */
 		main_on = true;
 	}
 	/* 照明がOFFで人体検出ありの場合 */
-	else if(main_on && state == 0x42){
+	else if (main_on && state == 0x42) {
 		/* 照明をOFF */
 		main_on = false;
@@ -830,5 +839,5 @@
 	/* プロパティ設定電文作成 */
 	ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0x80, 1, p_edt);
-	if(ret != E_OK){
+	if (ret != E_OK) {
 		syslog(LOG_ERROR, "ecn_esv_setc");
 		return;
