- Timestamp:
- Feb 1, 2019, 9:57:09 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_rx/trunk/app3_human_detec/src/echonet_main.c
r351 r364 1 1 /* 2 2 * TOPPERS ECHONET Lite Communication Middleware 3 * 3 * 4 4 * Copyright (C) 2014-2018 Cores Co., Ltd. Japan 5 * 5 * 6 6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 7 7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 … … 26 26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 27 27 * 免責すること. 28 * 28 * 29 29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 30 30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 … … 32 32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 33 33 * の責任を負わない. 34 * 34 * 35 35 * @(#) $Id$ 36 36 */ 37 37 38 /* 38 /* 39 39 * サンプルプログラム(1)の本体 40 40 */ … … 85 85 { 86 86 /* サイズが1以外は受け付けない */ 87 if (size != 1)87 if (size != 1) 88 88 return 0; 89 89 90 90 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src); 91 91 92 switch (*(uint8_t *)src){92 switch (*(uint8_t *)src) { 93 93 /* ONの場合 */ 94 94 case 0x30: … … 117 117 { 118 118 /* サイズが1以外は受け付けない */ 119 if (size != 1)119 if (size != 1) 120 120 return 0; 121 121 122 122 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src); 123 123 124 switch (*(uint8_t *)src){124 switch (*(uint8_t *)src) { 125 125 /* 異常発生ありの場合 */ 126 126 case 0x41: … … 143 143 { 144 144 /* サイズが1以外は受け付けない */ 145 if (size != 1)146 return 0; 147 148 if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)){145 if (size != 1) 146 return 0; 147 148 if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)) { 149 149 *((uint8_t *)item->exinf) = *((uint8_t *)src); 150 150 } 151 151 /* 上記以外は受け付けない */ 152 else {152 else { 153 153 return 0; 154 154 } … … 171 171 172 172 /* サイズが1以外は受け付けない */ 173 if (size != 1)173 if (size != 1) 174 174 return 0; 175 175 176 176 *anno = false; 177 177 178 if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)){178 if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)) { 179 179 /* 以前の検知レベルを保存 */ 180 180 prev_state = eobj->state; … … 185 185 186 186 /* 人体検知状態に変化があった場合 */ 187 if((prev_state < eobj->threshold) != (eobj->state < eobj->threshold)) 188 { 187 if ((prev_state < eobj->threshold) != (eobj->state < eobj->threshold)) { 189 188 /* プロパティ通知 */ 190 189 *anno = true; … … 192 191 } 193 192 /* 上記以外は受け付けない */ 194 else {193 else { 195 194 return 0; 196 195 } … … 199 198 } 200 199 201 /* 200 /* 202 201 * 人体検知状態取得関数 203 202 */ … … 207 206 208 207 /* 閾値より検知レベルが低い場合 */ 209 if (eobj->state < eobj->threshold){208 if (eobj->state < eobj->threshold) { 210 209 /* 人体検知なし */ 211 210 ((uint8_t *)dst)[0] = 0x42; 212 211 } 213 212 /* 閾値より検知レベルが高い場合 */ 214 else {213 else { 215 214 /* 人体検知あり */ 216 215 ((uint8_t *)dst)[0] = 0x41; … … 243 242 244 243 ret2 = get_tim(&now); 245 if (ret2 != E_OK) {244 if (ret2 != E_OK) { 246 245 syslog(LOG_ERROR, "get_tim"); 247 246 return; 248 247 } 249 248 250 for (;;){249 for (;;) { 251 250 prev = now; 252 251 … … 256 255 /* 応答電文待ち */ 257 256 ret = ecn_trcv_esv(&esv, timer); 258 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) {257 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) { 259 258 syslog(LOG_ERROR, "ecn_trcv_esv"); 260 259 break; … … 262 261 263 262 ret2 = get_tim(&now); 264 if (ret2 != E_OK) {263 if (ret2 != E_OK) { 265 264 syslog(LOG_ERROR, "get_tim"); 266 265 break; … … 277 276 /* 領域解放 */ 278 277 ret = ecn_rel_esv(esv); 279 if (ret != E_OK) {278 if (ret != E_OK) { 280 279 syslog(LOG_ERROR, "ecn_rel_esv"); 281 280 break; … … 286 285 /* 応答電文待ちの割り込みデータ取得 */ 287 286 ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len); 288 if (ret != E_OK) {287 if (ret != E_OK) { 289 288 syslog(LOG_ERROR, "ecn_get_brk_dat"); 290 289 break; … … 296 295 /* 領域解放 */ 297 296 ret = ecn_rel_esv(esv); 298 if (ret != E_OK) {297 if (ret != E_OK) { 299 298 syslog(LOG_ERROR, "ecn_rel_esv"); 300 299 break; … … 307 306 } 308 307 309 bool_t started = false;310 311 308 void echonet_change_netif_link(uint8_t link_up, uint8_t up) 312 309 { … … 316 313 return; 317 314 318 if (up && !started) { 319 started = true; 320 321 /* ECHONETミドルウェアを起動 */ 322 ret = ecn_sta_svc(); 323 if (ret != E_OK) 324 return; 325 326 /* ECHONETミドルウェアを起動するのを待つ */ 327 dly_tsk(100); 315 if (up) { 316 /* インスタンスリスト通知の送信 */ 317 ret = ecn_ntf_inl(); 318 if (ret != E_OK) { 319 syslog(LOG_ERROR, "ecn_ntf_inl"); 320 } 328 321 } 329 322 … … 339 332 } 340 333 341 enum main_state_t{ 334 enum main_state_t { 335 main_state_start, 342 336 main_state_idle, 343 337 }; 344 338 345 339 int main_timer = TMO_FEVR; 346 enum main_state_t main_state = main_state_ idle;340 enum main_state_t main_state = main_state_start; 347 341 bool_t main_btn1_state; 348 342 int main_btn1_count = 0; … … 368 362 sil_wrb_mem((uint8_t *)0x0008C02A, 0x00); 369 363 370 /* 10ms後にボタン状態を確認 */ 371 main_timer = 10 * 1000; 364 /* ECHONETミドルウェアを起動するのを待つ */ 365 main_state = main_state_start; 366 main_timer = 1000 * 1000; 372 367 373 368 /* 12bitADC初期化 */ … … 382 377 main_btn2_state = (btn2 & 0x80) != 0; 383 378 379 /* メインタスクを起動 */ 384 380 ER ret = act_tsk(MAIN_TASK); 385 381 if (ret != E_OK) { … … 401 397 static void main_progress(int interval) 402 398 { 403 if (main_timer == TMO_FEVR)399 if (main_timer == TMO_FEVR) 404 400 return; 405 401 406 402 main_timer -= interval; 407 if (main_timer < 0){403 if (main_timer < 0) { 408 404 main_timer = 0; 409 405 } … … 422 418 423 419 ret = ecn_itr_ini(&enm, esv); 424 if (ret != E_OK){420 if (ret != E_OK) { 425 421 syslog(LOG_ERROR, "ecn_itr_ini"); 426 422 return; 427 423 } 428 424 429 for (;;) {430 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {425 for (;;) { 426 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) { 431 427 switch (epc) { 432 428 case 0x80: … … 436 432 } 437 433 } 438 if (ret != E_BOVR){434 if (ret != E_BOVR) { 439 435 syslog(LOG_ERROR, "ecn_itr_nxt"); 440 436 break; 441 437 } 442 if (enm.is_eof)438 if (enm.is_eof) 443 439 break; 444 440 } … … 450 446 static void main_break_wait(uint8_t *brkdat, int32_t len) 451 447 { 452 switch (main_state){448 switch (main_state) { 453 449 case main_state_idle: 454 450 break; … … 472 468 static void main_timeout() 473 469 { 470 ER ret; 474 471 uint8_t btn1, btn2; 475 472 uint16_t ad_value; 476 473 uint8_t ad_level; 477 474 478 if(main_timer != 0) 479 return; 480 481 switch(main_state){ 475 if (main_timer != 0) 476 return; 477 478 switch (main_state) { 479 case main_state_start: 480 /* ECHONETミドルウェアを起動 */ 481 ret = ecn_sta_svc(); 482 if (ret != E_OK) { 483 syslog(LOG_ERROR, "ecn_sta_svc"); 484 } 485 486 /* 10ms後にボタン状態を確認 */ 487 main_state = main_state_idle; 488 main_timer = 10 * 1000; 489 break; 482 490 case main_state_idle: 483 491 /* 10ms後にボタン状態を確認 */ … … 485 493 486 494 /* ADCの変換結果取得 */ 487 if ((sil_reb_mem((uint8_t *)S12AD_ADCSR_ADDR) & S12AD_ADCSR_ADST_BIT) == 0){495 if ((sil_reb_mem((uint8_t *)S12AD_ADCSR_ADDR) & S12AD_ADCSR_ADST_BIT) == 0) { 488 496 main_ad_avelage -= main_ad_table[main_ad_pos]; 489 497 ad_value = sil_reh_mem((uint16_t *)S12AD_ADDR0_ADDR); … … 492 500 493 501 main_ad_pos++; 494 if (main_ad_pos >= main_ad_table_count){502 if (main_ad_pos >= main_ad_table_count) { 495 503 main_ad_pos = 0; 496 504 } 497 505 498 506 ad_level = (((main_ad_avelage / main_ad_table_count) >> 9) & 0x7) + 1; 499 if (main_ad_level != ad_level){507 if (main_ad_level != ad_level) { 500 508 /* 1秒変化が続いたら */ 501 if (main_count < 100){509 if (main_count < 100) { 502 510 main_count++; 503 511 } 504 else {512 else { 505 513 main_ad_level = ad_level; 506 514 … … 509 517 } 510 518 } 511 else {519 else { 512 520 main_count = 0; 513 521 } … … 518 526 519 527 /* ボタン状態読み込み */ 520 btn1 = sil_reb_mem((uint8_t *) 521 btn2 = sil_reb_mem((uint8_t *) 528 btn1 = sil_reb_mem((uint8_t *)0x0008C04A); 529 btn2 = sil_reb_mem((uint8_t *)0x0008C040); 522 530 523 531 /* ボタン1の処理 */ 524 if (((btn1 & 0x80) != 0) && !main_btn1_state){532 if (((btn1 & 0x80) != 0) && !main_btn1_state) { 525 533 main_btn1_count++; 526 if (main_btn1_count > 10){534 if (main_btn1_count > 10) { 527 535 main_btn1_count = 0; 528 536 main_btn1_state = true; … … 531 539 } 532 540 } 533 else if (((btn1 & 0x80) == 0) && main_btn1_state){541 else if (((btn1 & 0x80) == 0) && main_btn1_state) { 534 542 main_btn1_count++; 535 if (main_btn1_count > 10){543 if (main_btn1_count > 10) { 536 544 main_btn1_count = 0; 537 545 main_btn1_state = false; … … 542 550 543 551 /* ボタン2の処理 */ 544 if (((btn2 & 0x80) != 0) && !main_btn2_state){552 if (((btn2 & 0x80) != 0) && !main_btn2_state) { 545 553 main_btn2_count++; 546 if (main_btn2_count > 10){554 if (main_btn2_count > 10) { 547 555 main_btn2_count = 0; 548 556 main_btn2_state = true; … … 551 559 } 552 560 } 553 else if (((btn2 & 0x80) == 0) && main_btn2_state){561 else if (((btn2 & 0x80) == 0) && main_btn2_state) { 554 562 main_btn2_count++; 555 if (main_btn2_count > 10){563 if (main_btn2_count > 10) { 556 564 main_btn2_count = 0; 557 565 main_btn2_state = false; … … 577 585 /* プロパティ設定電文作成 */ 578 586 ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt); 579 if (ret != E_OK){587 if (ret != E_OK) { 580 588 syslog(LOG_ERROR, "ecn_esv_setc"); 581 589 return; … … 599 607 600 608 /* 押されて戻った時に処理する */ 601 if (push)609 if (push) 602 610 return; 603 611 604 612 /* 人体検知状態 */ 605 if (!main_rev){613 if (!main_rev) { 606 614 main_level--; 607 if (main_level < 1){615 if (main_level < 1) { 608 616 main_level = 1; 609 617 main_rev = true; 610 618 } 611 619 } 612 else {620 else { 613 621 main_level++; 614 if (main_level > 8){622 if (main_level > 8) { 615 623 main_level = 8; 616 624 main_rev = false; … … 622 630 /* プロパティ設定電文作成 */ 623 631 ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt); 624 if (ret != E_OK){632 if (ret != E_OK) { 625 633 syslog(LOG_ERROR, "ecn_esv_setc"); 626 634 return; … … 641 649 642 650 /* 押されて戻った時に処理する */ 643 if (push)651 if (push) 644 652 return; 645 653 646 654 /* 人体検知状態 */ 647 if (!main_rev){655 if (!main_rev) { 648 656 main_level++; 649 if (main_level > 8){657 if (main_level > 8) { 650 658 main_level = 8; 651 659 main_rev = false; 652 660 } 653 661 } 654 else {662 else { 655 663 main_level--; 656 if (main_level < 1){664 if (main_level < 1) { 657 665 main_level = 1; 658 666 main_rev = true; … … 664 672 /* プロパティ設定電文作成 */ 665 673 ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt); 666 if (ret != E_OK){674 if (ret != E_OK) { 667 675 syslog(LOG_ERROR, "ecn_esv_setc"); 668 676 return;
Note:
See TracChangeset
for help on using the changeset viewer.