Changeset 364 for asp3_tinet_ecnl_arm/trunk/app2_light/src/echonet_main.c
- Timestamp:
- Feb 1, 2019, 9:57:09 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_arm/trunk/app2_light/src/echonet_main.c
r352 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 */ … … 127 127 { 128 128 /* サイズが1以外は受け付けない */ 129 if (size != 1)129 if (size != 1) 130 130 return 0; 131 131 132 132 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src); 133 133 134 switch (*(uint8_t *)src){134 switch (*(uint8_t *)src) { 135 135 /* ONの場合 */ 136 136 case 0x30: … … 163 163 { 164 164 /* サイズが1以外は受け付けない */ 165 if (size != 1)165 if (size != 1) 166 166 return 0; 167 167 168 168 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src); 169 169 170 switch (*(uint8_t *)src){170 switch (*(uint8_t *)src) { 171 171 /* 異常発生ありの場合 */ 172 172 case 0x41: … … 189 189 { 190 190 /* サイズが1以外は受け付けない */ 191 if (size != 1)192 return 0; 193 194 switch (*(uint8_t *)src){191 if (size != 1) 192 return 0; 193 194 switch (*(uint8_t *)src) { 195 195 /* 自動の場合 */ 196 196 case 0x41: … … 241 241 uint8_t data[2]; 242 242 243 if (size != 1)244 return 0; 245 246 switch (*(uint8_t *)src){243 if (size != 1) 244 return 0; 245 246 switch (*(uint8_t *)src) { 247 247 /* 人体検出ありの場合 */ 248 248 case 0x41: … … 253 253 data[1] = *(uint8_t *)src; 254 254 ret = ecn_brk_wai(data, sizeof(data)); 255 if (ret != E_OK){255 if (ret != E_OK) { 256 256 syslog(LOG_ERROR, "ecn_brk_wai"); 257 257 return 1; … … 266 266 data[1] = *(uint8_t *)src; 267 267 ret = ecn_brk_wai(data, sizeof(data)); 268 if (ret != E_OK){268 if (ret != E_OK) { 269 269 syslog(LOG_ERROR, "ecn_brk_wai"); 270 270 return 1; … … 288 288 struct tm _tm; 289 289 290 if (size != 2)290 if (size != 2) 291 291 return 0; 292 292 … … 315 315 struct tm _tm; 316 316 317 if (size != 2)317 if (size != 2) 318 318 return 0; 319 319 … … 338 338 struct tm _tm; 339 339 340 if (size != 4)340 if (size != 4) 341 341 return 0; 342 342 … … 365 365 struct tm _tm; 366 366 367 if (size != 4)367 if (size != 4) 368 368 return 0; 369 369 … … 403 403 404 404 ret2 = get_tim(&now); 405 if (ret2 != E_OK) {405 if (ret2 != E_OK) { 406 406 syslog(LOG_ERROR, "get_tim"); 407 407 return; 408 408 } 409 409 410 for (;;){410 for (;;) { 411 411 prev = now; 412 412 … … 416 416 /* 応答電文待ち */ 417 417 ret = ecn_trcv_esv(&esv, timer); 418 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) {418 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) { 419 419 syslog(LOG_ERROR, "ecn_trcv_esv"); 420 420 break; … … 422 422 423 423 ret2 = get_tim(&now); 424 if (ret2 != E_OK) {424 if (ret2 != E_OK) { 425 425 syslog(LOG_ERROR, "get_tim"); 426 426 break; … … 437 437 /* 領域解放 */ 438 438 ret = ecn_rel_esv(esv); 439 if (ret != E_OK) {439 if (ret != E_OK) { 440 440 syslog(LOG_ERROR, "ecn_rel_esv"); 441 441 break; … … 446 446 /* 応答電文待ちの割り込みデータ取得 */ 447 447 ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len); 448 if (ret != E_OK) {448 if (ret != E_OK) { 449 449 syslog(LOG_ERROR, "ecn_get_brk_dat"); 450 450 break; … … 456 456 /* 領域解放 */ 457 457 ret = ecn_rel_esv(esv); 458 if (ret != E_OK) {458 if (ret != E_OK) { 459 459 syslog(LOG_ERROR, "ecn_rel_esv"); 460 460 break; … … 467 467 } 468 468 469 bool_t started = false;470 471 469 void echonet_change_netif_link(uint8_t link_up, uint8_t up) 472 470 { … … 476 474 return; 477 475 478 if (up && !started) { 479 started = true; 480 481 /* ECHONETミドルウェアを起動 */ 482 ret = ecn_sta_svc(); 483 if (ret != E_OK) 484 return; 485 486 /* ECHONETミドルウェアを起動するのを待つ */ 487 dly_tsk(100); 476 if (up) { 477 /* インスタンスリスト通知の送信 */ 478 ret = ecn_ntf_inl(); 479 if (ret != E_OK) { 480 syslog(LOG_ERROR, "ecn_ntf_inl"); 481 } 488 482 } 489 483 … … 499 493 } 500 494 501 enum main_state_t{ 495 enum main_state_t { 496 main_state_start, 502 497 main_state_idle, 503 498 main_state_search, … … 506 501 int main_timer = TMO_FEVR; 507 502 int main_btn_timer = TMO_FEVR; 508 enum main_state_t main_state = main_state_ idle;503 enum main_state_t main_state = main_state_start; 509 504 bool_t main_btn1_state; 510 505 int main_btn1_count = 0; … … 535 530 gpio_write(&led_red, 0); 536 531 537 /* 1秒後に人体検知センサを検索*/538 main_state = main_state_s earch;532 /* ECHONETミドルウェアを起動するのを待つ */ 533 main_state = main_state_start; 539 534 main_timer = 1000 * 1000; 540 535 … … 548 543 main_btn2_state = btn2 != 0; 549 544 545 /* メインタスクを起動 */ 550 546 ER ret = act_tsk(MAIN_TASK); 551 547 if (ret != E_OK) { … … 561 557 int result = main_timer; 562 558 563 if ((result == TMO_FEVR)564 || ((main_btn_timer != TMO_FEVR) && (main_btn_timer < result))) {559 if ((result == TMO_FEVR) 560 || ((main_btn_timer != TMO_FEVR) && (main_btn_timer < result))) { 565 561 result = main_btn_timer; 566 562 } … … 574 570 static void main_progress(int interval) 575 571 { 576 if (main_timer != TMO_FEVR){572 if (main_timer != TMO_FEVR) { 577 573 main_timer -= interval; 578 if (main_timer < 0){574 if (main_timer < 0) { 579 575 main_timer = 0; 580 576 } 581 577 } 582 578 583 if (main_btn_timer != TMO_FEVR){579 if (main_btn_timer != TMO_FEVR) { 584 580 main_btn_timer -= interval; 585 if (main_btn_timer < 0){581 if (main_btn_timer < 0) { 586 582 main_btn_timer = 0; 587 583 } … … 602 598 603 599 eobjid = ecn_get_eobj(esv); 604 if (eobjid == EOBJ_NULL){600 if (eobjid == EOBJ_NULL) { 605 601 syslog(LOG_ERROR, "ecn_get_eobj"); 606 602 } 607 603 608 604 ret = ecn_itr_ini(&enm, esv); 609 if (ret != E_OK){605 if (ret != E_OK) { 610 606 syslog(LOG_ERROR, "ecn_itr_ini"); 611 607 return; 612 608 } 613 609 614 for (;;) {615 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {610 for (;;) { 611 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) { 616 612 switch (epc) { 617 613 case 0xD6: 618 switch (main_state){614 switch (main_state) { 619 615 case main_state_search: 620 616 if (eobjid == HUMAN_DETECTION_SENSER_ENOD) { … … 628 624 } 629 625 } 630 if (ret != E_BOVR){626 if (ret != E_BOVR) { 631 627 syslog(LOG_ERROR, "ecn_itr_nxt"); 632 628 break; 633 629 } 634 if (enm.is_eof)630 if (enm.is_eof) 635 631 break; 636 632 } … … 646 642 ER ret; 647 643 648 switch (main_state){644 switch (main_state) { 649 645 case main_state_idle: 650 646 if (len < 2) … … 670 666 static void main_timeout() 671 667 { 672 if (main_timer == 0){668 if (main_timer == 0) { 673 669 main_ontimer(); 674 670 } 675 671 676 if (main_btn_timer == 0){672 if (main_btn_timer == 0) { 677 673 main_btn_ontimer(); 678 674 } … … 683 679 static void main_ontimer() 684 680 { 685 switch(main_state){ 681 ER ret; 682 683 switch (main_state) { 684 case main_state_start: 685 /* ECHONETミドルウェアを起動 */ 686 ret = ecn_sta_svc(); 687 if (ret != E_OK) { 688 syslog(LOG_ERROR, "ecn_sta_svc"); 689 } 690 691 /* 1秒後に人体検知センサを検索 */ 692 main_state = main_state_search; 693 main_timer = 1000 * 1000; 694 break; 686 695 case main_state_search: 687 696 /* 人体検知センサ再検索 */ … … 700 709 /* 人体検知センサ検索 */ 701 710 ret = ecn_esv_inf_req(&esv, EOBJ_NULL, 0xD6); 702 if (ret != E_OK){711 if (ret != E_OK) { 703 712 syslog(LOG_ERROR, "ecn_esv_inf_req"); 704 713 return; … … 707 716 /* 電文送信 */ 708 717 ret = ecn_snd_esv(esv); 709 if (ret != E_OK){718 if (ret != E_OK) { 710 719 syslog(LOG_ERROR, "ecn_snd_esv"); 711 720 } … … 730 739 731 740 /* ボタン1の処理 */ 732 if ((btn1 != 0) && !main_btn1_state){741 if ((btn1 != 0) && !main_btn1_state) { 733 742 main_btn1_count++; 734 if (main_btn1_count > 10){743 if (main_btn1_count > 10) { 735 744 main_btn1_count = 0; 736 745 main_btn1_state = true; … … 739 748 } 740 749 } 741 else if ((btn1 == 0) && main_btn1_state){750 else if ((btn1 == 0) && main_btn1_state) { 742 751 main_btn1_count++; 743 if (main_btn1_count > 10){752 if (main_btn1_count > 10) { 744 753 main_btn1_count = 0; 745 754 main_btn1_state = false; … … 750 759 751 760 /* ボタン2の処理 */ 752 if ((btn2 != 0) && !main_btn2_state){761 if ((btn2 != 0) && !main_btn2_state) { 753 762 main_btn2_count++; 754 if (main_btn2_count > 10){763 if (main_btn2_count > 10) { 755 764 main_btn2_count = 0; 756 765 main_btn2_state = true; … … 759 768 } 760 769 } 761 else if ((btn2 == 0) && main_btn2_state){770 else if ((btn2 == 0) && main_btn2_state) { 762 771 main_btn2_count++; 763 if (main_btn2_count > 10){772 if (main_btn2_count > 10) { 764 773 main_btn2_count = 0; 765 774 main_btn2_state = false; … … 770 779 } 771 780 772 enum lighting_mode_t {781 enum lighting_mode_t { 773 782 lighting_mode_auto, /* 自動の場合 */ 774 783 lighting_mode_normal, /* 通常灯の場合 */ … … 789 798 790 799 /* 押されて戻った時に処理する */ 791 if (push)800 if (push) 792 801 return; 793 802 … … 798 807 /* プロパティ設定電文作成 */ 799 808 ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0x80, 1, p_edt); 800 if (ret != E_OK){809 if (ret != E_OK) { 801 810 syslog(LOG_ERROR, "ecn_esv_setc"); 802 811 return; … … 817 826 818 827 /* 押されて戻った時に処理する */ 819 if (push)828 if (push) 820 829 return; 821 830 822 831 /* 点灯モードの切り替え */ 823 switch (main_mode){832 switch (main_mode) { 824 833 /* 自動の場合 */ 825 834 case lighting_mode_auto: … … 851 860 /* プロパティ設定電文作成 */ 852 861 ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0xB6, 1, p_edt); 853 if (ret != E_OK){862 if (ret != E_OK) { 854 863 syslog(LOG_ERROR, "ecn_esv_setc"); 855 864 return; … … 867 876 868 877 /* 照明がOFFで人体検出ありの場合 */ 869 if (!main_on && state == 0x41){878 if (!main_on && state == 0x41) { 870 879 /* 照明をON */ 871 880 main_on = true; 872 881 } 873 882 /* 照明がOFFで人体検出ありの場合 */ 874 else if (main_on && state == 0x42){883 else if (main_on && state == 0x42) { 875 884 /* 照明をOFF */ 876 885 main_on = false; … … 883 892 /* プロパティ設定電文作成 */ 884 893 ret = ecn_esv_setc(&esv, GENERAL_LIGHTING_CLASS_EOBJ, 0x80, 1, p_edt); 885 if (ret != E_OK){894 if (ret != E_OK) { 886 895 syslog(LOG_ERROR, "ecn_esv_setc"); 887 896 return;
Note:
See TracChangeset
for help on using the changeset viewer.