Index: asp3_tinet_ecnl_arm/trunk/app3_human_detec/src/echonet_main.c
===================================================================
--- asp3_tinet_ecnl_arm/trunk/app3_human_detec/src/echonet_main.c	(revision 359)
+++ asp3_tinet_ecnl_arm/trunk/app3_human_detec/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)の本体
  */
@@ -94,10 +94,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:
@@ -126,10 +126,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:
@@ -152,12 +152,12 @@
 {
 	/* サイズが1以外は受け付けない */
-	if(size != 1)
-		return 0;
-
-	if((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)){
+	if (size != 1)
+		return 0;
+
+	if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)) {
 		*((uint8_t *)item->exinf) = *((uint8_t *)src);
 	}
 	/* 上記以外は受け付けない */
-	else{
+	else {
 		return 0;
 	}
@@ -180,10 +180,10 @@
 
 	/* サイズが1以外は受け付けない */
-	if(size != 1)
+	if (size != 1)
 		return 0;
 
 	*anno = false;
 
-	if((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)){
+	if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)) {
 		/* 以前の検知レベルを保存 */
 		prev_state = eobj->state;
@@ -197,6 +197,5 @@
 
 		/* 人体検知状態に変化があった場合 */
-		if((prev_state < eobj->threshold) != (eobj->state < eobj->threshold))
-		{
+		if ((prev_state < eobj->threshold) != (eobj->state < eobj->threshold)) {
 			/* プロパティ通知 */
 			*anno = true;
@@ -204,5 +203,5 @@
 	}
 	/* 上記以外は受け付けない */
-	else{
+	else {
 		return 0;
 	}
@@ -211,5 +210,5 @@
 }
 
-/* 
+/*
  * 人体検知状態取得関数
  */
@@ -219,10 +218,10 @@
 
 	/* 閾値より検知レベルが低い場合 */
-	if(eobj->state < eobj->threshold){
+	if (eobj->state < eobj->threshold) {
 		/* 人体検知なし */
 		((uint8_t *)dst)[0] = 0x42;
 	}
 	/* 閾値より検知レベルが高い場合 */
-	else{
+	else {
 		/* 人体検知あり */
 		((uint8_t *)dst)[0] = 0x41;
@@ -255,10 +254,10 @@
 
 	ret2 = get_tim(&now);
-	if (ret2 != E_OK){
+	if (ret2 != E_OK) {
 		syslog(LOG_ERROR, "get_tim");
 		return;
 	}
 
-	for(;;){
+	for (;;) {
 		prev = now;
 
@@ -268,5 +267,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;
@@ -274,5 +273,5 @@
 
 		ret2 = get_tim(&now);
-		if (ret2 != E_OK){
+		if (ret2 != E_OK) {
 			syslog(LOG_ERROR, "get_tim");
 			break;
@@ -289,5 +288,5 @@
 			/* 領域解放 */
 			ret = ecn_rel_esv(esv);
-			if (ret != E_OK){
+			if (ret != E_OK) {
 				syslog(LOG_ERROR, "ecn_rel_esv");
 				break;
@@ -298,5 +297,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;
@@ -308,5 +307,5 @@
 			/* 領域解放 */
 			ret = ecn_rel_esv(esv);
-			if (ret != E_OK){
+			if (ret != E_OK) {
 				syslog(LOG_ERROR, "ecn_rel_esv");
 				break;
@@ -319,6 +318,4 @@
 }
 
-bool_t started = false;
-
 void echonet_change_netif_link(uint8_t link_up, uint8_t up)
 {
@@ -328,14 +325,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");
+		}
 	}
 
@@ -351,10 +344,11 @@
 }
 
-enum main_state_t{
+enum main_state_t {
+	main_state_start,
 	main_state_idle,
 };
 
 int main_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;
@@ -386,6 +380,7 @@
 	gpio_write(&led_red, 0);
 
-	/* 10ms後にボタン状態を確認 */
-	main_timer = 10 * 1000;
+	/* ECHONETミドルウェアを起動するのを待つ */
+	main_state = main_state_start;
+	main_timer = 1000 * 1000;
 
 	/* アナログ入力の初期化 */
@@ -398,4 +393,5 @@
 	main_btn2_state = btn2 != 0;
 
+	/* メインタスクを起動 */
 	ER ret = act_tsk(MAIN_TASK);
 	if (ret != E_OK) {
@@ -417,9 +413,9 @@
 static void main_progress(int interval)
 {
-	if(main_timer == TMO_FEVR)
+	if (main_timer == TMO_FEVR)
 		return;
 
 	main_timer -= interval;
-	if(main_timer < 0){
+	if (main_timer < 0) {
 		main_timer = 0;
 	}
@@ -438,11 +434,11 @@
 
 	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 0x80:
@@ -452,9 +448,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;
 	}
@@ -466,5 +462,5 @@
 static void main_break_wait(uint8_t *brkdat, int32_t len)
 {
-	switch(main_state){
+	switch (main_state) {
 	case main_state_idle:
 		break;
@@ -488,12 +484,24 @@
 static void main_timeout()
 {
+	ER ret;
 	uint8_t btn1, btn2;
 	uint16_t ad_value;
 	uint8_t ad_level;
 
-	if(main_timer != 0)
-		return;
-
-	switch(main_state){
+	if (main_timer != 0)
+		return;
+
+	switch (main_state) {
+	case main_state_start:
+		/* ECHONETミドルウェアを起動 */
+		ret = ecn_sta_svc();
+		if (ret != E_OK) {
+			syslog(LOG_ERROR, "ecn_sta_svc");
+		}
+
+		/* 10ms後にボタン状態を確認 */
+		main_state = main_state_idle;
+		main_timer = 10 * 1000;
+		break;
 	case main_state_idle:
 		/* 10ms後にボタン状態を確認 */
@@ -507,15 +515,15 @@
 
 		main_ad_pos++;
-		if(main_ad_pos >= main_ad_table_count){
+		if (main_ad_pos >= main_ad_table_count) {
 			main_ad_pos = 0;
 		}
 
-		ad_level = (((main_ad_avelage / main_ad_table_count) >> 9) & 0x7) + 1;
-		if(main_ad_level != ad_level){
+		ad_level = 8 - (((main_ad_avelage / main_ad_table_count) >> 9) & 0x7);
+		if (main_ad_level != ad_level) {
 			/* １秒変化が続いたら */
-			if(main_count < 100){
+			if (main_count < 100) {
 				main_count++;
 			}
-			else{
+			else {
 				main_ad_level = ad_level;
 
@@ -524,5 +532,5 @@
 			}
 		}
-		else{
+		else {
 			main_count = 0;
 		}
@@ -533,7 +541,7 @@
 
 		/* ボタン１の処理 */
-		if((btn1 != 0) && !main_btn1_state){
+		if ((btn1 != 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;
@@ -542,7 +550,7 @@
 			}
 		}
-		else if((btn1 == 0) && main_btn1_state){
+		else if ((btn1 == 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;
@@ -553,7 +561,7 @@
 
 		/* ボタン２の処理 */
-		if((btn2 != 0) && !main_btn2_state){
+		if ((btn2 != 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;
@@ -562,7 +570,7 @@
 			}
 		}
-		else if((btn2 == 0) && main_btn2_state){
+		else if ((btn2 == 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;
@@ -588,5 +596,5 @@
 	/* プロパティ設定電文作成 */
 	ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt);
-	if(ret != E_OK){
+	if (ret != E_OK) {
 		syslog(LOG_ERROR, "ecn_esv_setc");
 		return;
@@ -610,18 +618,18 @@
 
 	/* 押されて戻った時に処理する */
-	if(push)
+	if (push)
 		return;
 
 	/* 人体検知状態 */
-	if(!main_rev){
+	if (!main_rev) {
 		main_level--;
-		if(main_level < 1){
+		if (main_level < 1) {
 			main_level = 1;
 			main_rev = true;
 		}
 	}
-	else{
+	else {
 		main_level++;
-		if(main_level > 8){
+		if (main_level > 8) {
 			main_level = 8;
 			main_rev = false;
@@ -633,5 +641,5 @@
 	/* プロパティ設定電文作成 */
 	ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt);
-	if(ret != E_OK){
+	if (ret != E_OK) {
 		syslog(LOG_ERROR, "ecn_esv_setc");
 		return;
@@ -652,18 +660,18 @@
 
 	/* 押されて戻った時に処理する */
-	if(push)
+	if (push)
 		return;
 
 	/* 人体検知状態 */
-	if(!main_rev){
+	if (!main_rev) {
 		main_level++;
-		if(main_level > 8){
+		if (main_level > 8) {
 			main_level = 8;
 			main_rev = false;
 		}
 	}
-	else{
+	else {
 		main_level--;
-		if(main_level < 1){
+		if (main_level < 1) {
 			main_level = 1;
 			main_rev = true;
@@ -675,5 +683,5 @@
 	/* プロパティ設定電文作成 */
 	ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt);
-	if(ret != E_OK){
+	if (ret != E_OK) {
 		syslog(LOG_ERROR, "ecn_esv_setc");
 		return;
Index: asp3_tinet_ecnl_arm/trunk/app3_human_detec/src/main.c
===================================================================
--- asp3_tinet_ecnl_arm/trunk/app3_human_detec/src/main.c	(revision 359)
+++ asp3_tinet_ecnl_arm/trunk/app3_human_detec/src/main.c	(revision 364)
@@ -79,5 +79,7 @@
 
 ID ws_api_mailboxid = MAIN_DATAQUEUE;
+#ifndef NOUSE_MPF_NET_BUF
 ID ws_mempoolid = MPF_NET_BUF_256;
+#endif
 
 #ifdef IF_ETHER_BTUSB
@@ -111,7 +113,42 @@
 static void main_timeout();
 
+extern int ntshell_exit;
+
 int uart_read(char *buf, int cnt, void *extobj)
 {
-	return serial_rea_dat(SIO_PORTID, (char *)buf, cnt);
+	struct main_t *obj = (struct main_t *)extobj;
+	int result;
+	ER ret;
+	int timer;
+
+	obj->prev = obj->now;
+
+	/* タイマー取得 */
+	timer = main_get_timer();
+
+	/* 待ち */
+	ret = serial_trea_dat(SIO_PORTID, buf, cnt, timer);
+	if ((ret < 0) && (ret != E_OK) && (ret != E_TMOUT)) {
+		syslog(LOG_NOTICE, "tslp_tsk ret: %s %d", itron_strerror(ret), timer);
+		ntshell_exit = 1;
+		return -1;
+	}
+	result = (int)ret;
+
+	ret = get_tim(&obj->now);
+	if (ret != E_OK) {
+		syslog(LOG_NOTICE, "get_tim ret: %s", itron_strerror(ret));
+		ntshell_exit = 1;
+		return -1;
+	}
+
+			/* 時間経過 */
+	int elapse = obj->now - obj->prev;
+	main_progress(elapse);
+
+	/* タイムアウト処理 */
+	main_timeout();
+
+	return result;
 }
 
@@ -119,19 +156,4 @@
 {
 	return serial_wri_dat(SIO_PORTID, buf, cnt);
-}
-
-unsigned char ntstdio_xi(struct ntstdio_t *handle)
-{
-	char buf[1];
-	if(serial_rea_dat(SIO_PORTID, buf, 1) != 1)
-		return -EIO;
-	return buf[0];
-}
-
-void ntstdio_xo(struct ntstdio_t *handle, unsigned char c)
-{
-	char buf[1];
-	buf[0] = c;
-	serial_wri_dat(SIO_PORTID, buf, 1);
 }
 
@@ -150,5 +172,5 @@
 	main_initialize();
 
-	ntshell_init(&ntshell, uart_read, uart_write, cmd_execute, NULL);
+	ntshell_init(&ntshell, uart_read, uart_write, cmd_execute, &main_obj);
 	ntshell_set_prompt(&ntshell, "NTShell>");
 	ntshell_execute(&ntshell);
@@ -168,5 +190,10 @@
 	ER ret;
 
-	ntshell_task_init();
+#ifdef TOPPERS_OMIT_TECS
+	serial_opn_por(SIO_PORTID);
+#endif
+	serial_ctl_por(SIO_PORTID, IOCTL_FCSND | IOCTL_FCRCV);
+
+	ntshell_task_init(uart_read, uart_write, &main_obj);
 
 	main_obj.timer = TMO_FEVR;
Index: asp3_tinet_ecnl_arm/trunk/app3_human_detec/src/main.cfg
===================================================================
--- asp3_tinet_ecnl_arm/trunk/app3_human_detec/src/main.cfg	(revision 359)
+++ asp3_tinet_ecnl_arm/trunk/app3_human_detec/src/main.cfg	(revision 364)
@@ -54,5 +54,4 @@
 INCLUDE("tinet/tinet_asp.cfg");
 INCLUDE("tinet_main.cfg");
-INCLUDE("netinet/ip_igmp.cfg");
 
 /* DHCP クライアント */
