Changeset 364 for asp3_tinet_ecnl_rx/trunk/app4_aircon/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_rx/trunk/app4_aircon/src/echonet_main.c
r351 r364 1 1 /* 2 2 * TOPPERS ECHONET Lite Communication Middleware 3 * 4 * Copyright (C) 2014 Cores Co., Ltd. Japan5 * 3 * 4 * Copyright (C) 2014-2018 Cores Co., Ltd. Japan 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 */ … … 51 51 #include "echonet_cfg.h" 52 52 #include "target_kernel_impl.h" 53 #include "adafruit_ssd1306.h" 54 #include "draw_font.h" 53 55 54 56 /* TODO: メーカーコードを設定 */ … … 180 182 181 183 /* サイズが1以外は受け付けない */ 182 if (size != 1)184 if (size != 1) 183 185 return 0; 184 186 185 187 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src); 186 188 187 switch (*(uint8_t *)src){189 switch (*(uint8_t *)src) { 188 190 /* ONの場合 */ 189 191 case 0x30: … … 194 196 data[0] = 0x80; 195 197 ret = ecn_brk_wai(data, sizeof(data)); 196 if (ret != E_OK){198 if (ret != E_OK) { 197 199 syslog(LOG_ERROR, "ecn_brk_wai"); 198 200 return 2; … … 213 215 { 214 216 /* サイズが1以外は受け付けない */ 215 if (size != 1)217 if (size != 1) 216 218 return 0; 217 219 218 220 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src); 219 221 220 switch (*(uint8_t *)src){222 switch (*(uint8_t *)src) { 221 223 /* 異常発生ありの場合 */ 222 224 case 0x41: … … 242 244 243 245 /* サイズが1以外は受け付けない */ 244 if (size != 1)246 if (size != 1) 245 247 return 0; 246 248 247 switch (*(uint8_t *)src){249 switch (*(uint8_t *)src) { 248 250 /* 自動の場合 */ 249 251 case 0x41: … … 262 264 data[0] = 0xB0; 263 265 ret = ecn_brk_wai(data, sizeof(data)); 264 if (ret != E_OK){266 if (ret != E_OK) { 265 267 syslog(LOG_ERROR, "ecn_brk_wai"); 266 268 return 2; … … 284 286 285 287 /* サイズが1以外は受け付けない */ 286 if (size != 1)288 if (size != 1) 287 289 return 0; 288 290 289 291 /* 0℃~50℃ */ 290 if ((*(uint8_t *)src >= 0x00) && (*(uint8_t *)src <= 0x32)){292 if ((*(uint8_t *)src >= 0x00) && (*(uint8_t *)src <= 0x32)) { 291 293 *((uint8_t *)item->exinf) = *((uint8_t *)src); 292 294 /* メインタスクに通知 */ 293 295 data[0] = 0xB3; 294 296 ret = ecn_brk_wai(data, sizeof(data)); 295 if (ret != E_OK){297 if (ret != E_OK) { 296 298 syslog(LOG_ERROR, "ecn_brk_wai"); 297 299 return 2; … … 299 301 } 300 302 /* 上記以外は受け付けない */ 301 else {303 else { 302 304 return 0; 303 305 } … … 329 331 330 332 ret2 = get_tim(&now); 331 if (ret2 != E_OK) {333 if (ret2 != E_OK) { 332 334 syslog(LOG_ERROR, "get_tim"); 333 335 return; 334 336 } 335 337 336 for (;;){338 for (;;) { 337 339 prev = now; 338 340 … … 342 344 /* 応答電文待ち */ 343 345 ret = ecn_trcv_esv(&esv, timer); 344 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) {346 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) { 345 347 syslog(LOG_ERROR, "ecn_trcv_esv"); 346 348 break; … … 348 350 349 351 ret2 = get_tim(&now); 350 if (ret2 != E_OK) {352 if (ret2 != E_OK) { 351 353 syslog(LOG_ERROR, "get_tim"); 352 354 break; … … 363 365 /* 領域解放 */ 364 366 ret = ecn_rel_esv(esv); 365 if (ret != E_OK) {367 if (ret != E_OK) { 366 368 syslog(LOG_ERROR, "ecn_rel_esv"); 367 369 break; … … 372 374 /* 応答電文待ちの割り込みデータ取得 */ 373 375 ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len); 374 if (ret != E_OK) {376 if (ret != E_OK) { 375 377 syslog(LOG_ERROR, "ecn_get_brk_dat"); 376 378 break; … … 382 384 /* 領域解放 */ 383 385 ret = ecn_rel_esv(esv); 384 if (ret != E_OK) {386 if (ret != E_OK) { 385 387 syslog(LOG_ERROR, "ecn_rel_esv"); 386 388 break; … … 393 395 } 394 396 395 bool_t started = false;396 397 397 void echonet_change_netif_link(uint8_t link_up, uint8_t up) 398 398 { … … 402 402 return; 403 403 404 if (up && !started) { 405 started = true; 406 407 /* ECHONETミドルウェアを起動 */ 408 ret = ecn_sta_svc(); 409 if (ret != E_OK) 410 return; 411 412 /* ECHONETミドルウェアを起動するのを待つ */ 413 dly_tsk(100); 404 if (up) { 405 /* インスタンスリスト通知の送信 */ 406 ret = ecn_ntf_inl(); 407 if (ret != E_OK) { 408 syslog(LOG_ERROR, "ecn_ntf_inl"); 409 } 414 410 } 415 411 … … 425 421 } 426 422 427 enum main_state_t{ 423 enum main_state_t { 424 main_state_start, 428 425 main_state_idle, 429 426 main_state_search, … … 436 433 437 434 int main_timer = TMO_FEVR; 438 enum main_state_t main_state = main_state_ idle;435 enum main_state_t main_state = main_state_start; 439 436 int16_t main_ave_templ; 440 437 bool_t main_tmp_fan_on; … … 443 440 int main_btn_timer = TMO_FEVR; 444 441 445 enum main_led_state_t{ 446 main_led_state_idle, 447 main_led_state_on_o, 448 main_led_state_on_n, 449 main_led_state_off_o, 450 main_led_state_off_f1, 451 main_led_state_off_f2, 452 main_led_state_space1, 453 main_led_state_templ_10, 454 main_led_state_templ_1, 455 main_led_state_space2, 456 main_led_state_ave_templ_10, 457 main_led_state_ave_templ_1, 458 main_led_state_space3, 459 main_led_state_mode, 460 main_led_state_space4, 461 }; 462 463 int main_led_timer = TMO_FEVR; 464 enum main_led_state_t main_led_state = main_led_state_idle; 465 bool_t main_led_update; 442 int main_lcd_timer = TMO_FEVR; 443 int main_lcd_state = 0; 466 444 467 445 bool_t main_btn1_state; … … 470 448 int main_btn2_count = 0; 471 449 472 enum main_rly_state_t{ 450 LCD_Handler_t lcd; 451 452 enum main_rly_state_t { 473 453 main_rly_state_off, 474 454 main_rly_state_on … … 486 466 uint8_t btn1, btn2; 487 467 488 /* 7segを"0"と表示 */ 489 sil_wrb_mem((uint8_t *)0x0008C02D, 0xC0); 490 491 /* 1秒後に温度センサーを探す */ 468 /* ECHONETミドルウェアを起動するのを待つ */ 469 main_state = main_state_start; 492 470 main_timer = 1000 * 1000; 493 471 494 472 /* 10ms後にボタン状態を確認 */ 495 473 main_btn_timer = 10 * 1000; 496 497 if(home_air_conditioner_data.property80 == 0x30)498 main_led_state = main_led_state_on_o;499 else500 main_led_state = main_led_state_off_o;501 main_led_timer = 0;502 474 503 475 /* ボタン状態読み込み */ … … 507 479 main_btn2_state = (btn2 & 0x80) != 0; 508 480 481 i2c_init(&lcd.i2c, I2C_SDA, I2C_SCL); 482 i2c_frequency(&lcd.i2c, 100000); 483 484 lcd_init3(&lcd, NC); 485 486 lcd_begin(&lcd, SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS, true); 487 488 lcd_clearDisplay(&lcd); 489 490 lcd_display(&lcd); 491 492 /* 1秒後にLCD表示を更新 */ 493 main_lcd_state = 10; 494 main_lcd_timer = 1000 * 1000; 495 496 /* メインタスクを起動 */ 509 497 ER ret = act_tsk(MAIN_TASK); 510 498 if (ret != E_OK) { … … 520 508 int result = main_timer; 521 509 522 if ((result == TMO_FEVR)523 || ((main_btn_timer != TMO_FEVR) && (main_btn_timer < result))) {510 if ((result == TMO_FEVR) 511 || ((main_btn_timer != TMO_FEVR) && (main_btn_timer < result))) { 524 512 result = main_btn_timer; 525 513 } 526 514 527 if ((result == TMO_FEVR)528 || ((main_l ed_timer != TMO_FEVR) && (main_led_timer < result))){529 result = main_l ed_timer;530 } 531 532 if ((result == TMO_FEVR)533 || ((main_rly_timer != TMO_FEVR) && (main_rly_timer < result))) {515 if ((result == TMO_FEVR) 516 || ((main_lcd_timer != TMO_FEVR) && (main_lcd_timer < result))) { 517 result = main_lcd_timer; 518 } 519 520 if ((result == TMO_FEVR) 521 || ((main_rly_timer != TMO_FEVR) && (main_rly_timer < result))) { 534 522 result = main_rly_timer; 535 523 } … … 543 531 static void main_progress(int interval) 544 532 { 545 if (main_timer != TMO_FEVR){533 if (main_timer != TMO_FEVR) { 546 534 main_timer -= interval; 547 if (main_timer < 0){535 if (main_timer < 0) { 548 536 main_timer = 0; 549 537 } 550 538 } 551 539 552 if (main_btn_timer != TMO_FEVR){540 if (main_btn_timer != TMO_FEVR) { 553 541 main_btn_timer -= interval; 554 if (main_btn_timer < 0){542 if (main_btn_timer < 0) { 555 543 main_btn_timer = 0; 556 544 } 557 545 } 558 546 559 if (main_led_timer != TMO_FEVR){560 main_l ed_timer -= interval;561 if (main_led_timer < 0){562 main_l ed_timer = 0;563 } 564 } 565 566 if (main_rly_timer != TMO_FEVR){547 if (main_lcd_timer != TMO_FEVR) { 548 main_lcd_timer -= interval; 549 if (main_lcd_timer < 0) { 550 main_lcd_timer = 0; 551 } 552 } 553 554 if (main_rly_timer != TMO_FEVR) { 567 555 main_rly_timer -= interval; 568 if (main_rly_timer < 0){556 if (main_rly_timer < 0) { 569 557 main_rly_timer = 0; 570 558 } … … 588 576 589 577 eobjid = ecn_get_eobj(esv); 590 if (eobjid == EOBJ_NULL){578 if (eobjid == EOBJ_NULL) { 591 579 syslog(LOG_ERROR, "ecn_get_eobj"); 592 580 } 593 581 594 582 ret = ecn_itr_ini(&enm, esv); 595 if (ret != E_OK){583 if (ret != E_OK) { 596 584 syslog(LOG_ERROR, "ecn_itr_ini"); 597 585 return; 598 586 } 599 587 600 for (;;) {601 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {588 for (;;) { 589 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) { 602 590 switch (epc) { 603 591 case 0xD6: 604 switch (main_state){592 switch (main_state) { 605 593 case main_state_idle: 606 594 case main_state_search: … … 613 601 break; 614 602 case 0xE0: 615 switch (main_state){603 switch (main_state) { 616 604 case main_state_survey_01: 617 605 /* 温度センサー2温度監視 */ … … 643 631 } 644 632 } 645 if (ret != E_BOVR){633 if (ret != E_BOVR) { 646 634 syslog(LOG_ERROR, "ecn_itr_nxt"); 647 635 break; 648 636 } 649 if (enm.is_eof)637 if (enm.is_eof) 650 638 break; 651 639 } … … 668 656 /* 温度センサー動作状態取得電文作成 */ 669 657 ret = ecn_esv_get(&esv, senserids[no - 1], 0x80); 670 if (ret != E_OK){658 if (ret != E_OK) { 671 659 syslog(LOG_ERROR, "ecn_esv_get"); 672 660 return; … … 675 663 /* 温度計測値取得追加 */ 676 664 ret = ecn_add_epc(esv, 0xE0); 677 if (ret != E_OK){665 if (ret != E_OK) { 678 666 syslog(LOG_ERROR, "ecn_add_epc"); 679 667 680 668 ret = ecn_rel_esv(esv); 681 if (ret != E_OK){669 if (ret != E_OK) { 682 670 syslog(LOG_ERROR, "ecn_rel_esv"); 683 671 } … … 687 675 /* 電文送信 */ 688 676 ret = ecn_snd_esv(esv); 689 if (ret != E_OK){677 if (ret != E_OK) { 690 678 syslog(LOG_ERROR, "ecn_snd_esv"); 691 679 } … … 700 688 int templ = 0; 701 689 702 if (temp_sensor_01_data.property80 == 0x30){690 if (temp_sensor_01_data.property80 == 0x30) { 703 691 templ += ((((uint16_t)temp_sensor_01_data.propertyE0) & 0xFF) << 8) 704 692 | ((((uint16_t)temp_sensor_01_data.propertyE0) & 0xFF00) >> 8); 705 693 count++; 706 694 } 707 if (temp_sensor_02_data.property80 == 0x30){695 if (temp_sensor_02_data.property80 == 0x30) { 708 696 templ += ((((uint16_t)temp_sensor_02_data.propertyE0) & 0xFF) << 8) 709 697 | ((((uint16_t)temp_sensor_02_data.propertyE0) & 0xFF00) >> 8); 710 698 count++; 711 699 } 712 if (temp_sensor_03_data.property80 == 0x30){700 if (temp_sensor_03_data.property80 == 0x30) { 713 701 templ += ((((uint16_t)temp_sensor_03_data.propertyE0) & 0xFF) << 8) 714 702 | ((((uint16_t)temp_sensor_03_data.propertyE0) & 0xFF00) >> 8); 715 703 count++; 716 704 } 717 if (temp_sensor_04_data.property80 == 0x30){705 if (temp_sensor_04_data.property80 == 0x30) { 718 706 templ += ((((uint16_t)temp_sensor_04_data.propertyE0) & 0xFF) << 8) 719 707 | ((((uint16_t)temp_sensor_04_data.propertyE0) & 0xFF00) >> 8); … … 721 709 } 722 710 723 if (count > 0){711 if (count > 0) { 724 712 templ = templ / count; 725 if (templ < -2732)713 if (templ < -2732) 726 714 main_ave_templ = 0x8000; 727 else if (templ > 32766)715 else if (templ > 32766) 728 716 main_ave_templ = 0x7FFF; 729 717 else … … 731 719 732 720 /* FANが停止中の場合 */ 733 if (!main_tmp_fan_on){734 if (main_ave_templ > (10 * home_air_conditioner_data.propertyB3 + 5)){721 if (!main_tmp_fan_on) { 722 if (main_ave_templ > (10 * home_air_conditioner_data.propertyB3 + 5)) { 735 723 main_tmp_fan_on = true; 736 724 … … 741 729 } 742 730 /* FANが稼働中の場合 */ 743 else {744 if (main_ave_templ < (10 * home_air_conditioner_data.propertyB3 - 5)){731 else { 732 if (main_ave_templ < (10 * home_air_conditioner_data.propertyB3 - 5)) { 745 733 main_tmp_fan_on = false; 746 734 … … 760 748 static void main_break_wait(uint8_t *brkdat, int32_t len) 761 749 { 762 switch(main_led_state){ 763 case main_led_state_idle: 764 switch (brkdat[0]) { 765 case 0x01: 766 // Link up/down 767 break; 768 case 0x80: 769 case 0xB0: 770 case 0xB3: 771 if(home_air_conditioner_data.property80 == 0x30) 772 main_led_state = main_led_state_on_o; 773 else 774 main_led_state = main_led_state_off_o; 775 main_led_timer = 0; 776 break; 777 } 778 break; 779 default: 780 main_led_update = true; 781 break; 750 bool_t prev; 751 752 if (brkdat[0] == 0x01) { 753 // Link up/down 754 return; 782 755 } 783 756 784 757 /* 運転モードが送風の場合、温度によらずFANをON */ 785 if (*brkdat == 0xB0) { 786 bool_t prev = main_ctl_fan_on; 758 switch (*brkdat) { 759 case 0x80: 760 if (main_ctl_fan_on) { 761 /* リレー出力をON/OFF */ 762 main_rly_onoff(home_air_conditioner_data.property80 == 0x30); 763 } 764 break; 765 case 0xB0: 766 prev = main_ctl_fan_on; 787 767 main_ctl_fan_on = home_air_conditioner_data.propertyB0 == 0x45; 788 768 789 769 if (prev != main_ctl_fan_on) { 790 770 if (main_ctl_fan_on) { 791 /* リレー出力をON */ 792 if (!main_tmp_fan_on) 793 main_rly_onoff(true); 771 /* リレー出力をON/OFF */ 772 main_rly_onoff(home_air_conditioner_data.property80 == 0x30); 794 773 } 795 774 else { 796 /* リレー出力をOFF */ 797 if (!main_tmp_fan_on) 798 main_rly_onoff(false); 775 /* リレー出力をON/OFF */ 776 main_rly_onoff(main_tmp_fan_on); 799 777 } 800 778 } … … 804 782 static void main_ontimer(); 805 783 static void main_btn_ontimer(); 806 static void main_l ed_ontimer();784 static void main_lcd_ontimer(); 807 785 static void main_rly_ontimer(); 808 786 … … 812 790 static void main_timeout() 813 791 { 814 if (main_timer == 0){792 if (main_timer == 0) { 815 793 main_ontimer(); 816 794 } 817 795 818 if (main_btn_timer == 0){796 if (main_btn_timer == 0) { 819 797 main_btn_ontimer(); 820 798 } 821 799 822 if (main_led_timer == 0){823 main_l ed_ontimer();824 } 825 826 if (main_rly_timer == 0){800 if (main_lcd_timer == 0) { 801 main_lcd_ontimer(); 802 } 803 804 if (main_rly_timer == 0) { 827 805 main_rly_ontimer(); 828 806 } … … 833 811 static void main_ontimer() 834 812 { 835 switch(main_state){ 813 ER ret; 814 815 switch (main_state) { 816 case main_state_start: 817 /* ECHONETミドルウェアを起動 */ 818 ret = ecn_sta_svc(); 819 if (ret != E_OK) { 820 syslog(LOG_ERROR, "ecn_sta_svc"); 821 } 822 823 /* 1秒後に温度センサーを探す */ 824 main_state = main_state_idle; 825 main_timer = 1000 * 1000; 826 break; 836 827 case main_state_idle: 837 828 case main_state_search: … … 890 881 /* 温度センサー検索 */ 891 882 ret = ecn_esv_inf_req(&esv, EOBJ_NULL, 0xD6); 892 if (ret != E_OK){883 if (ret != E_OK) { 893 884 syslog(LOG_ERROR, "ecn_esv_inf_req"); 894 885 return; … … 897 888 /* 電文送信 */ 898 889 ret = ecn_snd_esv(esv); 899 if (ret != E_OK){890 if (ret != E_OK) { 900 891 syslog(LOG_ERROR, "ecn_snd_esv"); 901 892 } … … 917 908 918 909 /* ボタン1の処理 */ 919 if (((btn1 & 0x20) != 0) && !main_btn1_state){910 if (((btn1 & 0x20) != 0) && !main_btn1_state) { 920 911 main_btn1_count++; 921 if (main_btn1_count > 10){912 if (main_btn1_count > 10) { 922 913 main_btn1_count = 0; 923 914 main_btn1_state = true; … … 926 917 } 927 918 } 928 else if (((btn1 & 0x20) == 0) && main_btn1_state){919 else if (((btn1 & 0x20) == 0) && main_btn1_state) { 929 920 main_btn1_count++; 930 if (main_btn1_count > 10){921 if (main_btn1_count > 10) { 931 922 main_btn1_count = 0; 932 923 main_btn1_state = false; … … 937 928 938 929 /* ボタン2の処理 */ 939 if (((btn2 & 0x80) != 0) && !main_btn2_state){930 if (((btn2 & 0x80) != 0) && !main_btn2_state) { 940 931 main_btn2_count++; 941 if (main_btn2_count > 10){932 if (main_btn2_count > 10) { 942 933 main_btn2_count = 0; 943 934 main_btn2_state = true; … … 946 937 } 947 938 } 948 else if (((btn2 & 0x80) == 0) && main_btn2_state){939 else if (((btn2 & 0x80) == 0) && main_btn2_state) { 949 940 main_btn2_count++; 950 if (main_btn2_count > 10){941 if (main_btn2_count > 10) { 951 942 main_btn2_count = 0; 952 943 main_btn2_state = false; … … 957 948 } 958 949 959 uint8_t led_num[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 }; 960 uint8_t led_onf[] = { 0xA3, 0xAB, 0x8E }; 961 uint8_t led_abcdef[] = { 0xF7, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; 962 963 static void main_led_ontimer() 964 { 950 static void main_lcd_ontimer() 951 { 952 char power[] = "電源:off"; 953 char temp1[] = "設定温度:+00℃"; 954 char temp2[] = "測定温度:+00.0℃"; 955 char mode[] = "運転モード:自動 "; 956 char *mode_texts[] = { "その他", "自動 ", "冷房 ", "暖房 ", "除湿 ", "送風 " }; 957 char *btn_texts[] = { "none ", "down ", "left ", "select", "up ", "right " }; 965 958 int temp; 966 959 967 switch(main_led_state){ 968 case main_led_state_idle: 969 /* 7segに' 'を表示 */ 970 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 971 main_led_timer = TMO_FEVR; 972 return; 973 case main_led_state_on_o: 974 /* 7segに'o'を表示 */ 975 sil_wrb_mem((uint8_t *)0x0008C02D, led_onf[0]); 976 main_led_state = main_led_state_on_n; 977 break; 978 case main_led_state_on_n: 979 /* 7segに'n'を表示 */ 980 sil_wrb_mem((uint8_t *)0x0008C02D, led_onf[1]); 981 main_led_state = main_led_state_space1; 982 break; 983 case main_led_state_off_o: 984 /* 7segに'o'を表示 */ 985 sil_wrb_mem((uint8_t *)0x0008C02D, led_onf[0]); 986 main_led_state = main_led_state_off_f1; 987 break; 988 case main_led_state_off_f1: 989 /* 7segに'f'を表示 */ 990 sil_wrb_mem((uint8_t *)0x0008C02D, led_onf[2]); 991 main_led_state = main_led_state_off_f2; 992 break; 993 case main_led_state_off_f2: 994 /* 7segに'f'を表示 */ 995 sil_wrb_mem((uint8_t *)0x0008C02D, led_onf[2]); 996 main_led_state = main_led_state_space1; 997 break; 998 case main_led_state_space1: 999 /* 7segに' 'を表示 */ 1000 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 1001 main_led_state = main_led_state_templ_10; 1002 break; 1003 case main_led_state_templ_10: 960 switch (main_lcd_state) { 961 case 0: 962 if (home_air_conditioner_data.property80 == 0x30) { 963 power[9] = 'o'; 964 power[10] = 'n'; 965 power[11] = ' '; 966 } 967 else { 968 power[9] = 'o'; 969 power[10] = 'f'; 970 power[11] = 'f'; 971 } 972 lcd_drawString(&lcd, &power[9], X_LINE_HALF_TO_PIX(&lcd, 6), Y_ROW_TO_PIX(&lcd, main_lcd_state + 1), WHITE, BLACK); 973 main_lcd_state++; 974 break; 975 case 1: 976 temp1[15] = (home_air_conditioner_data.propertyB3 >= 0) ? ' ' : '-'; 1004 977 temp = (home_air_conditioner_data.propertyB3 / 10) % 10; 1005 if (temp < 0)978 if (temp < 0) 1006 979 temp = -temp; 1007 /* 7segに温度設定10の位を表示 */ 1008 sil_wrb_mem((uint8_t *)0x0008C02D, led_num[temp]); 1009 main_led_state = main_led_state_templ_1; 1010 break; 1011 case main_led_state_templ_1: 980 temp1[16] = '0' + temp; 1012 981 temp = (home_air_conditioner_data.propertyB3 / 1) % 10; 1013 if (temp < 0)982 if (temp < 0) 1014 983 temp = -temp; 1015 /* 7segに温度設定1の位を表示 */ 1016 sil_wrb_mem((uint8_t *)0x0008C02D, led_num[temp] & (~0x80)); 1017 main_led_state = main_led_state_space2; 1018 break; 1019 case main_led_state_space2: 1020 /* 7segに' 'を表示 */ 1021 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 1022 main_led_state = main_led_state_ave_templ_10; 1023 break; 1024 case main_led_state_ave_templ_10: 984 temp1[17] = '0' + temp; 985 lcd_drawString(&lcd, &temp1[15], X_LINE_HALF_TO_PIX(&lcd, 10), Y_ROW_TO_PIX(&lcd, main_lcd_state + 1), WHITE, BLACK); 986 main_lcd_state++; 987 break; 988 case 2: 989 temp2[15] = (main_ave_templ >= 0) ? ' ' : '-'; 1025 990 temp = (main_ave_templ / 100) % 10; 1026 if (temp < 0)991 if (temp < 0) 1027 992 temp = -temp; 1028 /* 7segに温度計測値10の位を表示 */ 1029 sil_wrb_mem((uint8_t *)0x0008C02D, led_num[temp]); 1030 main_led_state = main_led_state_ave_templ_1; 1031 break; 1032 case main_led_state_ave_templ_1: 993 temp2[16] = '0' + temp; 1033 994 temp = (main_ave_templ / 10) % 10; 1034 if (temp < 0)995 if (temp < 0) 1035 996 temp = -temp; 1036 /* 7segに温度計測値1の位を表示 */ 1037 sil_wrb_mem((uint8_t *)0x0008C02D, led_num[temp] & (~0x80)); 1038 main_led_state = main_led_state_space3; 1039 break; 1040 case main_led_state_space3: 1041 /* 7segに' 'を表示 */ 1042 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 1043 main_led_state = main_led_state_mode; 1044 break; 1045 case main_led_state_mode: 997 temp2[17] = '0' + temp; 998 temp = (main_ave_templ / 1) % 10; 999 if (temp < 0) 1000 temp = -temp; 1001 temp2[19] = '0' + temp; 1002 lcd_drawString(&lcd, &temp2[15], X_LINE_HALF_TO_PIX(&lcd, 10), Y_ROW_TO_PIX(&lcd, main_lcd_state + 1), WHITE, BLACK); 1003 main_lcd_state++; 1004 break; 1005 case 3: 1046 1006 temp = home_air_conditioner_data.propertyB0 - 0x40; 1047 /* 7segに運転モードを表示 */ 1048 sil_wrb_mem((uint8_t *)0x0008C02D, led_abcdef[temp]); 1049 main_led_state = main_led_state_space4; 1050 break; 1051 case main_led_state_space4: 1052 if(home_air_conditioner_data.property80 == 0x30) 1053 /* 7segに'.'を表示 */ 1054 sil_wrb_mem((uint8_t *)0x0008C02D, 0x7F); 1055 else 1056 /* 7segに' 'を表示 */ 1057 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 1058 1059 if(main_led_update){ 1060 main_led_update = false; 1061 1062 if(home_air_conditioner_data.property80 == 0x30) 1063 main_led_state = main_led_state_on_o; 1064 else 1065 main_led_state = main_led_state_off_o; 1066 } 1067 else{ 1068 main_led_state = main_led_state_idle; 1069 main_led_timer = TMO_FEVR; 1070 return; 1071 } 1007 lcd_drawString(&lcd, mode_texts[temp], X_LINE_HALF_TO_PIX(&lcd, 12), Y_ROW_TO_PIX(&lcd, main_lcd_state + 1), WHITE, BLACK); 1008 main_lcd_state++; 1009 break; 1010 case 4: 1011 case 5: 1012 case 6: 1013 main_lcd_state++; 1014 break; 1015 case 9: 1016 lcd_display(&lcd); 1017 main_lcd_state = 0; 1018 break; 1019 case 10: 1020 lcd_drawString(&lcd, "エアコン", X_LINE_TO_PIX(&lcd, 6), Y_ROW_TO_PIX(&lcd, 0), WHITE, BLACK); 1021 lcd_drawString(&lcd, power, X_LINE_TO_PIX(&lcd, 0), Y_ROW_TO_PIX(&lcd, 0 + 1), WHITE, BLACK); 1022 lcd_drawString(&lcd, temp1, X_LINE_TO_PIX(&lcd, 0), Y_ROW_TO_PIX(&lcd, 1 + 1), WHITE, BLACK); 1023 lcd_drawString(&lcd, temp2, X_LINE_TO_PIX(&lcd, 0), Y_ROW_TO_PIX(&lcd, 2 + 1), WHITE, BLACK); 1024 lcd_drawString(&lcd, mode, X_LINE_TO_PIX(&lcd, 0), Y_ROW_TO_PIX(&lcd, 3 + 1), WHITE, BLACK); 1025 lcd_display(&lcd); 1026 main_lcd_state = 0; 1072 1027 break; 1073 1028 default: 1074 /* 7segに' 'を表示 */ 1075 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 1076 main_led_state = main_led_state_idle; 1077 main_led_timer = TMO_FEVR; 1078 return; 1079 } 1080 1081 main_led_timer = 500 * 1000; 1029 main_lcd_state++; 1030 break; 1031 } 1032 1033 /* 100ms後にLCD表示を更新 */ 1034 main_lcd_timer = 100 * 1000; 1082 1035 } 1083 1036 … … 1094 1047 1095 1048 /* 押されて戻った時に処理する */ 1096 if (push)1049 if (push) 1097 1050 return; 1098 1051 1099 1052 /* 設定温度 */ 1100 if (main_templ > 0)1053 if (main_templ > 0) 1101 1054 main_templ--; /* - 1℃ */ 1102 1055 … … 1105 1058 /* プロパティ設定電文作成 */ 1106 1059 ret = ecn_esv_seti(&esv, HOME_AIR_CONDITIONER_EOBJ, 0xB3, 1, p_edt); 1107 if (ret != E_OK){1060 if (ret != E_OK) { 1108 1061 syslog(LOG_ERROR, "ecn_esv_seti"); 1109 1062 return; … … 1111 1064 1112 1065 /* 電文送信 */ 1113 ecn_snd_esv(esv);1114 if (ret != E_OK){1066 ret = ecn_snd_esv(esv); 1067 if (ret != E_OK) { 1115 1068 syslog(LOG_ERROR, "ecn_snd_esv"); 1116 1069 } … … 1127 1080 1128 1081 /* 押されて戻った時に処理する */ 1129 if (push)1082 if (push) 1130 1083 return; 1131 1084 1132 1085 /* 設定温度 */ 1133 if (main_templ < 50)1086 if (main_templ < 50) 1134 1087 main_templ++; /* + 1.0℃ */ 1135 1088 … … 1138 1091 /* プロパティ設定電文作成 */ 1139 1092 ret = ecn_esv_seti(&esv, HOME_AIR_CONDITIONER_EOBJ, 0xB3, 1, p_edt); 1140 if (ret != E_OK){1093 if (ret != E_OK) { 1141 1094 syslog(LOG_ERROR, "ecn_esv_seti"); 1142 1095 return; … … 1144 1097 1145 1098 /* 電文送信 */ 1146 ecn_snd_esv(esv);1147 if (ret != E_OK){1099 ret = ecn_snd_esv(esv); 1100 if (ret != E_OK) { 1148 1101 syslog(LOG_ERROR, "ecn_snd_esv"); 1149 1102 } … … 1152 1105 static void main_rly_onoff(bool_t onoff) 1153 1106 { 1154 if (onoff){1107 if (onoff) { 1155 1108 /* リレー出力をON */ 1156 1109 sil_wrb_mem((uint8_t *)0x0008C022, sil_reb_mem((uint8_t *)0x0008C022) | 0x20); 1157 1110 } 1158 else {1111 else { 1159 1112 /* リレー出力をOFF */ 1160 1113 sil_wrb_mem((uint8_t *)0x0008C022, sil_reb_mem((uint8_t *)0x0008C022) & ~0x20); … … 1182 1135 static void main_rly_ontimer() 1183 1136 { 1184 switch(main_rly_state) 1185 { 1137 switch (main_rly_state) { 1186 1138 case main_rly_state_off: 1187 1139 main_rly_timer = TMO_FEVR;
Note:
See TracChangeset
for help on using the changeset viewer.