- Timestamp:
- Feb 1, 2019, 9:57:09 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_arm/trunk/app3_human_detec/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 */ … … 94 94 { 95 95 /* サイズが1以外は受け付けない */ 96 if (size != 1)96 if (size != 1) 97 97 return 0; 98 98 99 99 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src); 100 100 101 switch (*(uint8_t *)src){101 switch (*(uint8_t *)src) { 102 102 /* ONの場合 */ 103 103 case 0x30: … … 126 126 { 127 127 /* サイズが1以外は受け付けない */ 128 if (size != 1)128 if (size != 1) 129 129 return 0; 130 130 131 131 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src); 132 132 133 switch (*(uint8_t *)src){133 switch (*(uint8_t *)src) { 134 134 /* 異常発生ありの場合 */ 135 135 case 0x41: … … 152 152 { 153 153 /* サイズが1以外は受け付けない */ 154 if (size != 1)155 return 0; 156 157 if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)){154 if (size != 1) 155 return 0; 156 157 if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)) { 158 158 *((uint8_t *)item->exinf) = *((uint8_t *)src); 159 159 } 160 160 /* 上記以外は受け付けない */ 161 else {161 else { 162 162 return 0; 163 163 } … … 180 180 181 181 /* サイズが1以外は受け付けない */ 182 if (size != 1)182 if (size != 1) 183 183 return 0; 184 184 185 185 *anno = false; 186 186 187 if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)){187 if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)) { 188 188 /* 以前の検知レベルを保存 */ 189 189 prev_state = eobj->state; … … 197 197 198 198 /* 人体検知状態に変化があった場合 */ 199 if((prev_state < eobj->threshold) != (eobj->state < eobj->threshold)) 200 { 199 if ((prev_state < eobj->threshold) != (eobj->state < eobj->threshold)) { 201 200 /* プロパティ通知 */ 202 201 *anno = true; … … 204 203 } 205 204 /* 上記以外は受け付けない */ 206 else {205 else { 207 206 return 0; 208 207 } … … 211 210 } 212 211 213 /* 212 /* 214 213 * 人体検知状態取得関数 215 214 */ … … 219 218 220 219 /* 閾値より検知レベルが低い場合 */ 221 if (eobj->state < eobj->threshold){220 if (eobj->state < eobj->threshold) { 222 221 /* 人体検知なし */ 223 222 ((uint8_t *)dst)[0] = 0x42; 224 223 } 225 224 /* 閾値より検知レベルが高い場合 */ 226 else {225 else { 227 226 /* 人体検知あり */ 228 227 ((uint8_t *)dst)[0] = 0x41; … … 255 254 256 255 ret2 = get_tim(&now); 257 if (ret2 != E_OK) {256 if (ret2 != E_OK) { 258 257 syslog(LOG_ERROR, "get_tim"); 259 258 return; 260 259 } 261 260 262 for (;;){261 for (;;) { 263 262 prev = now; 264 263 … … 268 267 /* 応答電文待ち */ 269 268 ret = ecn_trcv_esv(&esv, timer); 270 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) {269 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) { 271 270 syslog(LOG_ERROR, "ecn_trcv_esv"); 272 271 break; … … 274 273 275 274 ret2 = get_tim(&now); 276 if (ret2 != E_OK) {275 if (ret2 != E_OK) { 277 276 syslog(LOG_ERROR, "get_tim"); 278 277 break; … … 289 288 /* 領域解放 */ 290 289 ret = ecn_rel_esv(esv); 291 if (ret != E_OK) {290 if (ret != E_OK) { 292 291 syslog(LOG_ERROR, "ecn_rel_esv"); 293 292 break; … … 298 297 /* 応答電文待ちの割り込みデータ取得 */ 299 298 ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len); 300 if (ret != E_OK) {299 if (ret != E_OK) { 301 300 syslog(LOG_ERROR, "ecn_get_brk_dat"); 302 301 break; … … 308 307 /* 領域解放 */ 309 308 ret = ecn_rel_esv(esv); 310 if (ret != E_OK) {309 if (ret != E_OK) { 311 310 syslog(LOG_ERROR, "ecn_rel_esv"); 312 311 break; … … 319 318 } 320 319 321 bool_t started = false;322 323 320 void echonet_change_netif_link(uint8_t link_up, uint8_t up) 324 321 { … … 328 325 return; 329 326 330 if (up && !started) { 331 started = true; 332 333 /* ECHONETミドルウェアを起動 */ 334 ret = ecn_sta_svc(); 335 if (ret != E_OK) 336 return; 337 338 /* ECHONETミドルウェアを起動するのを待つ */ 339 dly_tsk(100); 327 if (up) { 328 /* インスタンスリスト通知の送信 */ 329 ret = ecn_ntf_inl(); 330 if (ret != E_OK) { 331 syslog(LOG_ERROR, "ecn_ntf_inl"); 332 } 340 333 } 341 334 … … 351 344 } 352 345 353 enum main_state_t{ 346 enum main_state_t { 347 main_state_start, 354 348 main_state_idle, 355 349 }; 356 350 357 351 int main_timer = TMO_FEVR; 358 enum main_state_t main_state = main_state_ idle;352 enum main_state_t main_state = main_state_start; 359 353 bool_t main_btn1_state; 360 354 int main_btn1_count = 0; … … 386 380 gpio_write(&led_red, 0); 387 381 388 /* 10ms後にボタン状態を確認 */ 389 main_timer = 10 * 1000; 382 /* ECHONETミドルウェアを起動するのを待つ */ 383 main_state = main_state_start; 384 main_timer = 1000 * 1000; 390 385 391 386 /* アナログ入力の初期化 */ … … 398 393 main_btn2_state = btn2 != 0; 399 394 395 /* メインタスクを起動 */ 400 396 ER ret = act_tsk(MAIN_TASK); 401 397 if (ret != E_OK) { … … 417 413 static void main_progress(int interval) 418 414 { 419 if (main_timer == TMO_FEVR)415 if (main_timer == TMO_FEVR) 420 416 return; 421 417 422 418 main_timer -= interval; 423 if (main_timer < 0){419 if (main_timer < 0) { 424 420 main_timer = 0; 425 421 } … … 438 434 439 435 ret = ecn_itr_ini(&enm, esv); 440 if (ret != E_OK){436 if (ret != E_OK) { 441 437 syslog(LOG_ERROR, "ecn_itr_ini"); 442 438 return; 443 439 } 444 440 445 for (;;) {446 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {441 for (;;) { 442 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) { 447 443 switch (epc) { 448 444 case 0x80: … … 452 448 } 453 449 } 454 if (ret != E_BOVR){450 if (ret != E_BOVR) { 455 451 syslog(LOG_ERROR, "ecn_itr_nxt"); 456 452 break; 457 453 } 458 if (enm.is_eof)454 if (enm.is_eof) 459 455 break; 460 456 } … … 466 462 static void main_break_wait(uint8_t *brkdat, int32_t len) 467 463 { 468 switch (main_state){464 switch (main_state) { 469 465 case main_state_idle: 470 466 break; … … 488 484 static void main_timeout() 489 485 { 486 ER ret; 490 487 uint8_t btn1, btn2; 491 488 uint16_t ad_value; 492 489 uint8_t ad_level; 493 490 494 if(main_timer != 0) 495 return; 496 497 switch(main_state){ 491 if (main_timer != 0) 492 return; 493 494 switch (main_state) { 495 case main_state_start: 496 /* ECHONETミドルウェアを起動 */ 497 ret = ecn_sta_svc(); 498 if (ret != E_OK) { 499 syslog(LOG_ERROR, "ecn_sta_svc"); 500 } 501 502 /* 10ms後にボタン状態を確認 */ 503 main_state = main_state_idle; 504 main_timer = 10 * 1000; 505 break; 498 506 case main_state_idle: 499 507 /* 10ms後にボタン状態を確認 */ … … 507 515 508 516 main_ad_pos++; 509 if (main_ad_pos >= main_ad_table_count){517 if (main_ad_pos >= main_ad_table_count) { 510 518 main_ad_pos = 0; 511 519 } 512 520 513 ad_level = (((main_ad_avelage / main_ad_table_count) >> 9) & 0x7) + 1;514 if (main_ad_level != ad_level){521 ad_level = 8 - (((main_ad_avelage / main_ad_table_count) >> 9) & 0x7); 522 if (main_ad_level != ad_level) { 515 523 /* 1秒変化が続いたら */ 516 if (main_count < 100){524 if (main_count < 100) { 517 525 main_count++; 518 526 } 519 else {527 else { 520 528 main_ad_level = ad_level; 521 529 … … 524 532 } 525 533 } 526 else {534 else { 527 535 main_count = 0; 528 536 } … … 533 541 534 542 /* ボタン1の処理 */ 535 if ((btn1 != 0) && !main_btn1_state){543 if ((btn1 != 0) && !main_btn1_state) { 536 544 main_btn1_count++; 537 if (main_btn1_count > 10){545 if (main_btn1_count > 10) { 538 546 main_btn1_count = 0; 539 547 main_btn1_state = true; … … 542 550 } 543 551 } 544 else if ((btn1 == 0) && main_btn1_state){552 else if ((btn1 == 0) && main_btn1_state) { 545 553 main_btn1_count++; 546 if (main_btn1_count > 10){554 if (main_btn1_count > 10) { 547 555 main_btn1_count = 0; 548 556 main_btn1_state = false; … … 553 561 554 562 /* ボタン2の処理 */ 555 if ((btn2 != 0) && !main_btn2_state){563 if ((btn2 != 0) && !main_btn2_state) { 556 564 main_btn2_count++; 557 if (main_btn2_count > 10){565 if (main_btn2_count > 10) { 558 566 main_btn2_count = 0; 559 567 main_btn2_state = true; … … 562 570 } 563 571 } 564 else if ((btn2 == 0) && main_btn2_state){572 else if ((btn2 == 0) && main_btn2_state) { 565 573 main_btn2_count++; 566 if (main_btn2_count > 10){574 if (main_btn2_count > 10) { 567 575 main_btn2_count = 0; 568 576 main_btn2_state = false; … … 588 596 /* プロパティ設定電文作成 */ 589 597 ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt); 590 if (ret != E_OK){598 if (ret != E_OK) { 591 599 syslog(LOG_ERROR, "ecn_esv_setc"); 592 600 return; … … 610 618 611 619 /* 押されて戻った時に処理する */ 612 if (push)620 if (push) 613 621 return; 614 622 615 623 /* 人体検知状態 */ 616 if (!main_rev){624 if (!main_rev) { 617 625 main_level--; 618 if (main_level < 1){626 if (main_level < 1) { 619 627 main_level = 1; 620 628 main_rev = true; 621 629 } 622 630 } 623 else {631 else { 624 632 main_level++; 625 if (main_level > 8){633 if (main_level > 8) { 626 634 main_level = 8; 627 635 main_rev = false; … … 633 641 /* プロパティ設定電文作成 */ 634 642 ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt); 635 if (ret != E_OK){643 if (ret != E_OK) { 636 644 syslog(LOG_ERROR, "ecn_esv_setc"); 637 645 return; … … 652 660 653 661 /* 押されて戻った時に処理する */ 654 if (push)662 if (push) 655 663 return; 656 664 657 665 /* 人体検知状態 */ 658 if (!main_rev){666 if (!main_rev) { 659 667 main_level++; 660 if (main_level > 8){668 if (main_level > 8) { 661 669 main_level = 8; 662 670 main_rev = false; 663 671 } 664 672 } 665 else {673 else { 666 674 main_level--; 667 if (main_level < 1){675 if (main_level < 1) { 668 676 main_level = 1; 669 677 main_rev = true; … … 675 683 /* プロパティ設定電文作成 */ 676 684 ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt); 677 if (ret != E_OK){685 if (ret != E_OK) { 678 686 syslog(LOG_ERROR, "ecn_esv_setc"); 679 687 return;
Note:
See TracChangeset
for help on using the changeset viewer.