- Timestamp:
- Feb 1, 2019, 9:57:09 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_rx/trunk/app5_temp_sensor/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 */ … … 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: メーカーコードを設定 */ … … 107 109 108 110 /* サイズが1以外は受け付けない */ 109 if (size != 1)111 if (size != 1) 110 112 return 0; 111 113 112 114 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src); 113 115 114 switch (*(uint8_t *)src){116 switch (*(uint8_t *)src) { 115 117 /* ONの場合 */ 116 118 case 0x30: … … 122 124 data[1] = *(uint8_t *)src; 123 125 ret = ecn_brk_wai(data, sizeof(data)); 124 if (ret != E_OK){126 if (ret != E_OK) { 125 127 syslog(LOG_ERROR, "ecn_brk_wai"); 126 128 return 1; … … 141 143 { 142 144 /* サイズが1以外は受け付けない */ 143 if (size != 1)145 if (size != 1) 144 146 return 0; 145 147 146 148 *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src); 147 149 148 switch (*(uint8_t *)src){150 switch (*(uint8_t *)src) { 149 151 /* 異常発生ありの場合 */ 150 152 case 0x41: … … 172 174 173 175 /* サイズが2以外は受け付けない */ 174 if (size != 2)176 if (size != 2) 175 177 return 0; 176 178 177 179 value = (((uint8_t *)src)[0] << 8) | (((uint8_t *)src)[1] & 0xFF); 178 180 179 if ((value >= -2732) && (value <= 32766)){181 if ((value >= -2732) && (value <= 32766)) { 180 182 eobj->propertyE0 = value; 181 183 /* メインタスクに通知 */ 182 184 data[0] = 0xE0; 183 185 ret = ecn_brk_wai(data, sizeof(data)); 184 if (ret != E_OK){186 if (ret != E_OK) { 185 187 syslog(LOG_ERROR, "ecn_brk_wai"); 186 188 return 2; … … 188 190 } 189 191 /* 上記以外は受け付けない */ 190 else {192 else { 191 193 return 0; 192 194 } … … 195 197 } 196 198 197 /* 199 /* 198 200 * 温度計測値取得関数 199 201 */ … … 204 206 205 207 /* サイズが2以外は受け付けない */ 206 if (size != 2)208 if (size != 2) 207 209 return 0; 208 210 … … 236 238 237 239 ret2 = get_tim(&now); 238 if (ret2 != E_OK) {240 if (ret2 != E_OK) { 239 241 syslog(LOG_ERROR, "get_tim"); 240 242 return; 241 243 } 242 244 243 for (;;){245 for (;;) { 244 246 prev = now; 245 247 … … 249 251 /* 応答電文待ち */ 250 252 ret = ecn_trcv_esv(&esv, timer); 251 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) {253 if ((ret != E_OK) && (ret != E_BRK) && (ret != E_TMOUT)) { 252 254 syslog(LOG_ERROR, "ecn_trcv_esv"); 253 255 break; … … 255 257 256 258 ret2 = get_tim(&now); 257 if (ret2 != E_OK) {259 if (ret2 != E_OK) { 258 260 syslog(LOG_ERROR, "get_tim"); 259 261 break; … … 270 272 /* 領域解放 */ 271 273 ret = ecn_rel_esv(esv); 272 if (ret != E_OK) {274 if (ret != E_OK) { 273 275 syslog(LOG_ERROR, "ecn_rel_esv"); 274 276 break; … … 279 281 /* 応答電文待ちの割り込みデータ取得 */ 280 282 ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len); 281 if (ret != E_OK) {283 if (ret != E_OK) { 282 284 syslog(LOG_ERROR, "ecn_get_brk_dat"); 283 285 break; … … 289 291 /* 領域解放 */ 290 292 ret = ecn_rel_esv(esv); 291 if (ret != E_OK) {293 if (ret != E_OK) { 292 294 syslog(LOG_ERROR, "ecn_rel_esv"); 293 295 break; … … 300 302 } 301 303 302 bool_t started = false;303 304 304 void echonet_change_netif_link(uint8_t link_up, uint8_t up) 305 305 { … … 309 309 return; 310 310 311 if (up && !started) { 312 started = true; 313 314 /* ECHONETミドルウェアを起動 */ 315 ret = ecn_sta_svc(); 316 if (ret != E_OK) 317 return; 318 319 /* ECHONETミドルウェアを起動するのを待つ */ 320 dly_tsk(100); 311 if (up) { 312 /* インスタンスリスト通知の送信 */ 313 ret = ecn_ntf_inl(); 314 if (ret != E_OK) { 315 syslog(LOG_ERROR, "ecn_ntf_inl"); 316 } 321 317 } 322 318 … … 332 328 } 333 329 334 enum main_state_t{ 330 enum main_state_t { 331 main_state_start, 335 332 main_state_idle, 336 333 }; 337 334 338 335 int main_timer = TMO_FEVR; 339 enum main_state_t main_state = main_state_idle; 340 341 enum main_led_state_t{ 342 main_led_state_idle, 343 main_led_state_on_o, 344 main_led_state_on_n, 345 main_led_state_off_o, 346 main_led_state_off_f1, 347 main_led_state_off_f2, 348 main_led_state_space1, 349 main_led_state_tmpr_minus, 350 main_led_state_tmpr_100, 351 main_led_state_tmpr_10, 352 main_led_state_tmpr_1, 353 main_led_state_space2, 354 main_led_state_humid_10, 355 main_led_state_humid_1, 356 main_led_state_space3, 357 }; 358 359 int main_led_timer = TMO_FEVR; 360 enum main_led_state_t main_led_state = main_led_state_idle; 361 bool_t main_led_update; 336 enum main_state_t main_state = main_state_start; 337 338 int main_lcd_timer = TMO_FEVR; 339 int main_lcd_state = 0; 362 340 363 341 bool_t main_btn1_state; … … 365 343 bool_t main_btn2_state; 366 344 int main_btn2_count = 0; 345 346 LCD_Handler_t lcd; 367 347 368 348 /* … … 387 367 sil_wrb_mem((uint8_t *)0x0008C02D, 0xC0); 388 368 389 /* 10ms後にボタン状態を確認 */ 390 main_timer = 10 * 1000; 369 /* ECHONETミドルウェアを起動するのを待つ */ 370 main_state = main_state_start; 371 main_timer = 1000 * 1000; 391 372 392 373 /* 12bitADC初期化 */ 393 374 sil_wrh_mem((uint16_t *)S12AD_ADEXICR_ADDR, 0x0000); /* 温度センサ出力、内部基準電圧非選択 */ 394 sil_wrh_mem((uint16_t *)S12AD_ADANS0_ADDR, 0x000 1); /* 変換ポートAN000選択、AN001~AN015非選択 */375 sil_wrh_mem((uint16_t *)S12AD_ADANS0_ADDR, 0x0007); /* 変換ポートAN000選択、AN001~AN015非選択 */ 395 376 sil_wrh_mem((uint16_t *)S12AD_ADANS1_ADDR, 0x0000); /* 変換ポートAN016~AN020非選択 */ 396 397 if(temperature_sensor1_data.property80 == 0x30)398 main_led_state = main_led_state_on_o;399 else400 main_led_state = main_led_state_off_o;401 main_led_timer = 0;402 377 403 378 /* ボタン状態読み込み */ … … 407 382 main_btn2_state = (btn2 & 0x80) != 0; 408 383 384 i2c_init(&lcd.i2c, I2C_SDA, I2C_SCL); 385 i2c_frequency(&lcd.i2c, 100000); 386 387 lcd_init3(&lcd, NC); 388 389 lcd_begin(&lcd, SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS, true); 390 391 lcd_clearDisplay(&lcd); 392 393 lcd_display(&lcd); 394 395 /* 1秒後にLCD表示を更新 */ 396 main_lcd_state = 10; 397 main_lcd_timer = 1000 * 1000; 398 399 /* メインタスクを起動 */ 409 400 ER ret = act_tsk(MAIN_TASK); 410 401 if (ret != E_OK) { … … 420 411 int result = main_timer; 421 412 422 if ((result == TMO_FEVR)423 || ((main_l ed_timer != TMO_FEVR) && (main_led_timer < result))){424 result = main_l ed_timer;413 if ((result == TMO_FEVR) 414 || ((main_lcd_timer != TMO_FEVR) && (main_lcd_timer < result))) { 415 result = main_lcd_timer; 425 416 } 426 417 … … 433 424 static void main_progress(int interval) 434 425 { 435 if (main_timer != TMO_FEVR){426 if (main_timer != TMO_FEVR) { 436 427 main_timer -= interval; 437 if (main_timer < 0){428 if (main_timer < 0) { 438 429 main_timer = 0; 439 430 } 440 431 } 441 432 442 if (main_led_timer != TMO_FEVR){443 main_l ed_timer -= interval;444 if (main_led_timer < 0){445 main_l ed_timer = 0;433 if (main_lcd_timer != TMO_FEVR) { 434 main_lcd_timer -= interval; 435 if (main_lcd_timer < 0) { 436 main_lcd_timer = 0; 446 437 } 447 438 } … … 463 454 464 455 ret = ecn_itr_ini(&enm, esv); 465 if (ret != E_OK){456 if (ret != E_OK) { 466 457 syslog(LOG_ERROR, "ecn_itr_ini"); 467 458 return; 468 459 } 469 460 470 for (;;) {471 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {461 for (;;) { 462 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) { 472 463 switch (epc) { 473 464 case 0xE0: 474 if (in_get && (esv->hdr.edata.esv == ESV_SET_GET_RES)){465 if (in_get && (esv->hdr.edata.esv == ESV_SET_GET_RES)) { 475 466 check_response(pdc, p_edt); 476 467 } … … 478 469 } 479 470 } 480 if (ret != E_BOVR){471 if (ret != E_BOVR) { 481 472 syslog(LOG_ERROR, "ecn_itr_nxt"); 482 473 break; 483 474 } 484 if (enm.is_eof)475 if (enm.is_eof) 485 476 break; 486 477 … … 501 492 502 493 if ((len == 2) && (brkdat[0] == 0x80)) { 503 switch (brkdat[1]){494 switch (brkdat[1]) { 504 495 /* ONの場合 */ 505 496 case 0x30: … … 514 505 } 515 506 } 516 517 switch(main_led_state){518 case main_led_state_idle:519 if(temperature_sensor1_data.property80 == 0x30)520 main_led_state = main_led_state_on_o;521 else522 main_led_state = main_led_state_off_o;523 main_led_timer = 0;524 break;525 default:526 main_led_update = true;527 break;528 }529 507 } 530 508 531 509 static void main_ontimer(); 532 static void main_l ed_ontimer();510 static void main_lcd_ontimer(); 533 511 534 512 /* … … 537 515 static void main_timeout() 538 516 { 539 if (main_timer == 0){517 if (main_timer == 0) { 540 518 main_ontimer(); 541 519 } 542 520 543 if(main_led_timer == 0){ 544 main_led_ontimer(); 545 } 546 } 547 548 static int16_t main_ad_tempr = 200; 549 static uint16_t main_ad_table[64]; 550 #define main_ad_table_count (sizeof(main_ad_table) / sizeof(main_ad_table[0])) 521 if (main_lcd_timer == 0) { 522 main_lcd_ontimer(); 523 } 524 } 525 526 #define main_ad_count 3 527 #define main_ad_table_count 64 528 static int16_t main_ad_tempr[main_ad_count] = { 200, 200, 200 }; 529 static uint16_t main_ad_table[main_ad_count][main_ad_table_count]; 551 530 static int main_ad_pos = 0; 552 static uint32_t main_ad_avelage ;553 static int main_count ;554 555 static void main_ad_change( );531 static uint32_t main_ad_avelage[main_ad_count]; 532 static int main_count[main_ad_count]; 533 534 static void main_ad_change(int no, int adv); 556 535 static void main_btn1_change(bool_t push); 557 536 static void main_btn2_change(bool_t push); 558 537 559 uint8_t led_disp[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };560 561 538 static void main_ontimer() 562 539 { 540 ER ret; 563 541 uint8_t btn1, btn2; 564 542 uint16_t ad_value; 565 543 int16_t ad_tempr; 566 uint8_t sseg = sil_reb_mem((uint8_t *)0x0008C02A) & ~0x07; 567 568 switch(main_state){ 544 545 switch (main_state) { 546 case main_state_start: 547 /* ECHONETミドルウェアを起動 */ 548 ret = ecn_sta_svc(); 549 if (ret != E_OK) { 550 syslog(LOG_ERROR, "ecn_sta_svc"); 551 } 552 553 /* 10ms後にボタン状態を確認 */ 554 main_state = main_state_idle; 555 main_timer = 10 * 1000; 556 break; 569 557 case main_state_idle: 570 558 /* 10ms後にボタン状態を確認 */ … … 572 560 573 561 /* ADCの変換結果取得 */ 574 if((sil_reb_mem((uint8_t *)S12AD_ADCSR_ADDR) & S12AD_ADCSR_ADST_BIT) == 0){ 575 main_ad_avelage -= main_ad_table[main_ad_pos]; 576 ad_value = sil_reh_mem((uint16_t *)S12AD_ADDR0_ADDR); 577 main_ad_table[main_ad_pos] = ad_value; 578 main_ad_avelage += ad_value; 562 if ((sil_reb_mem((uint8_t *)S12AD_ADCSR_ADDR) & S12AD_ADCSR_ADST_BIT) == 0) { 563 for (int i = 0; i < main_ad_count; i++) { 564 main_ad_avelage[i] -= main_ad_table[i][main_ad_pos]; 565 ad_value = sil_reh_mem(&((uint16_t *)S12AD_ADDR0_ADDR)[i]); 566 main_ad_table[i][main_ad_pos] = ad_value; 567 main_ad_avelage[i] += ad_value; 568 } 579 569 580 570 main_ad_pos++; 581 if (main_ad_pos >= main_ad_table_count){571 if (main_ad_pos >= main_ad_table_count) { 582 572 main_ad_pos = 0; 583 573 } 584 574 585 ad_tempr = ((int16_t)(((main_ad_avelage / main_ad_table_count) >> 3) & 0x1FF)) - 100; 586 if(main_ad_tempr != ad_tempr){ 587 /* 1秒変化が続いたら */ 588 if(main_count < 100){ 589 main_count++; 575 for (int i = 0; i < main_ad_count; i++) { 576 ad_tempr = ((int16_t)(((main_ad_avelage[i] / main_ad_table_count) >> 3) & 0x1FF)) - 100; 577 if (main_ad_tempr[i] != ad_tempr) { 578 /* 1秒変化が続いたら */ 579 if (main_count[i] < 100) { 580 main_count[i]++; 581 } 582 else { 583 main_count[i] = 0; 584 main_ad_tempr[i] = ad_tempr; 585 586 /* ADC状態変化処理 */ 587 main_ad_change(i + 1, ad_tempr); 588 } 590 589 } 591 else{ 592 main_ad_tempr = ad_tempr; 593 594 /* ADC状態変化処理 */ 595 main_ad_change(); 590 else { 591 main_count[i] = 0; 596 592 } 597 } 598 else{ 599 main_count = 0; 600 } 601 602 /* LEDに温度計測値を表示 */ 603 sil_wrb_mem((uint8_t *)0x0008C02A, sseg | led_disp[(main_ad_avelage / main_ad_table_count) >> 9]); 604 605 /* 変換開始(シングルスキャンモード) */ 606 sil_wrb_mem((uint8_t *)S12AD_ADCSR_ADDR, S12AD_ADCSR_ADST_BIT); 593 594 /* 変換開始(シングルスキャンモード) */ 595 sil_wrb_mem((uint8_t *)S12AD_ADCSR_ADDR, S12AD_ADCSR_ADST_BIT); 596 } 607 597 } 608 598 … … 612 602 613 603 /* ボタン1の処理 */ 614 if (((btn1 & 0x20) != 0) && !main_btn1_state){604 if (((btn1 & 0x20) != 0) && !main_btn1_state) { 615 605 main_btn1_count++; 616 if (main_btn1_count > 10){606 if (main_btn1_count > 10) { 617 607 main_btn1_count = 0; 618 608 main_btn1_state = true; … … 621 611 } 622 612 } 623 else if (((btn1 & 0x20) == 0) && main_btn1_state){613 else if (((btn1 & 0x20) == 0) && main_btn1_state) { 624 614 main_btn1_count++; 625 if (main_btn1_count > 10){615 if (main_btn1_count > 10) { 626 616 main_btn1_count = 0; 627 617 main_btn1_state = false; … … 632 622 633 623 /* ボタン2の処理 */ 634 if (((btn2 & 0x80) != 0) && !main_btn2_state){624 if (((btn2 & 0x80) != 0) && !main_btn2_state) { 635 625 main_btn2_count++; 636 if (main_btn2_count > 10){626 if (main_btn2_count > 10) { 637 627 main_btn2_count = 0; 638 628 main_btn2_state = true; … … 641 631 } 642 632 } 643 else if (((btn2 & 0x80) == 0) && main_btn2_state){633 else if (((btn2 & 0x80) == 0) && main_btn2_state) { 644 634 main_btn2_count++; 645 if (main_btn2_count > 10){635 if (main_btn2_count > 10) { 646 636 main_btn2_count = 0; 647 637 main_btn2_state = false; … … 654 644 } 655 645 656 uint8_t led_num[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 }; 657 uint8_t led_onf[] = { 0xA3, 0xAB, 0x8E }; 658 659 static void main_led_ontimer() 646 static char temp1[] = "温度1:+000.0℃"; 647 static char temp2[] = "温度2:+000.0℃"; 648 static char humid[] = "湿度 :+000.0%"; 649 650 static void main_lcd_ontimer() 660 651 { 661 652 int temp; 662 653 663 switch(main_led_state){ 664 case main_led_state_idle: 665 /* 7segに' 'を表示 */ 666 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 667 main_led_timer = TMO_FEVR; 668 return; 669 case main_led_state_on_o: 670 /* 7segに'o'を表示 */ 671 sil_wrb_mem((uint8_t *)0x0008C02D, led_onf[0]); 672 main_led_state = main_led_state_on_n; 673 break; 674 case main_led_state_on_n: 675 /* 7segに'n'を表示 */ 676 sil_wrb_mem((uint8_t *)0x0008C02D, led_onf[1]); 677 main_led_state = main_led_state_space1; 678 break; 679 case main_led_state_off_o: 680 /* 7segに'o'を表示 */ 681 sil_wrb_mem((uint8_t *)0x0008C02D, led_onf[0]); 682 main_led_state = main_led_state_off_f1; 683 break; 684 case main_led_state_off_f1: 685 /* 7segに'f'を表示 */ 686 sil_wrb_mem((uint8_t *)0x0008C02D, led_onf[2]); 687 main_led_state = main_led_state_off_f2; 688 break; 689 case main_led_state_off_f2: 690 /* 7segに'f'を表示 */ 691 sil_wrb_mem((uint8_t *)0x0008C02D, led_onf[2]); 692 main_led_state = main_led_state_space1; 693 break; 694 case main_led_state_space1: 695 /* 7segに' 'を表示 */ 696 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 697 if(temperature_sensor1_data.propertyE0 >= 0){ 698 main_led_state = main_led_state_tmpr_10; 699 } 700 else{ 701 main_led_state = main_led_state_tmpr_minus; 702 } 703 break; 704 case main_led_state_tmpr_minus: 705 /* 7segに'-'を表示 */ 706 sil_wrb_mem((uint8_t *)0x0008C02D, 0xBF); 707 if((temperature_sensor1_data.propertyE0 >= 100) 708 || (temperature_sensor1_data.propertyE0 <= -100)) 709 main_led_state = main_led_state_tmpr_100; 710 else 711 main_led_state = main_led_state_tmpr_10; 712 break; 713 case main_led_state_tmpr_100: 654 switch (main_lcd_state) { 655 case 0: 656 temp1[10] = (temperature_sensor1_data.propertyE0 >= 0) ? ' ' : '-'; 714 657 temp = (temperature_sensor1_data.propertyE0 / 1000) % 10; 715 if (temp < 0)658 if (temp < 0) 716 659 temp = -temp; 717 /* 7segに温度計測値10の位を表示 */ 718 sil_wrb_mem((uint8_t *)0x0008C02D, led_num[temp]); 719 main_led_state = main_led_state_tmpr_10; 720 break; 721 case main_led_state_tmpr_10: 660 temp1[11] = '0' + temp; 722 661 temp = (temperature_sensor1_data.propertyE0 / 100) % 10; 723 if (temp < 0)662 if (temp < 0) 724 663 temp = -temp; 725 /* 7segに温度計測値10の位を表示 */ 726 sil_wrb_mem((uint8_t *)0x0008C02D, led_num[temp]); 727 main_led_state = main_led_state_tmpr_1; 728 break; 729 case main_led_state_tmpr_1: 664 temp1[12] = '0' + temp; 730 665 temp = (temperature_sensor1_data.propertyE0 / 10) % 10; 731 if (temp < 0)666 if (temp < 0) 732 667 temp = -temp; 733 /* 7segに温度計測値10の位を表示 */ 734 sil_wrb_mem((uint8_t *)0x0008C02D, led_num[temp] & (~0x80)); 735 main_led_state = main_led_state_space2; 736 break; 737 case main_led_state_space2: 738 /* 7segに' 'を表示 */ 739 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 740 main_led_state = main_led_state_humid_10; 741 break; 742 case main_led_state_humid_10: 743 temp = humidity_sensor_data.propertyE0 / 10; 744 /* 7segに湿度計測値10の位を表示 */ 745 sil_wrb_mem((uint8_t *)0x0008C02D, led_num[temp]); 746 main_led_state = main_led_state_humid_1; 747 break; 748 case main_led_state_humid_1: 749 temp = humidity_sensor_data.propertyE0 % 10; 750 /* 7segに湿度計測値10の位を表示 */ 751 sil_wrb_mem((uint8_t *)0x0008C02D, led_num[temp] & (~0x80)); 752 main_led_state = main_led_state_space3; 753 break; 754 case main_led_state_space3: 755 /* 7segに' 'を表示 */ 756 if(temperature_sensor1_data.property80 == 0x30) 757 /* 7segに'.'を表示 */ 758 sil_wrb_mem((uint8_t *)0x0008C02D, 0x7F); 759 else 760 /* 7segに' 'を表示 */ 761 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 762 763 if(main_led_update){ 764 main_led_update = false; 765 766 if(temperature_sensor1_data.property80 == 0x30) 767 main_led_state = main_led_state_on_o; 768 else 769 main_led_state = main_led_state_off_o; 770 } 771 else{ 772 main_led_state = main_led_state_idle; 773 main_led_timer = TMO_FEVR; 774 return; 775 } 668 temp1[13] = '0' + temp; 669 temp = (temperature_sensor1_data.propertyE0 / 1) % 10; 670 if (temp < 0) 671 temp = -temp; 672 temp1[15] = '0' + temp; 673 lcd_drawString(&lcd, &temp1[10], X_LINE_HALF_TO_PIX(&lcd, 7), Y_ROW_TO_PIX(&lcd, main_lcd_state + 2), WHITE, BLACK); 674 main_lcd_state++; 675 break; 676 case 1: 677 temp2[10] = (temperature_sensor2_data.propertyE0 >= 0) ? ' ' : '-'; 678 temp = (temperature_sensor2_data.propertyE0 / 1000) % 10; 679 if (temp < 0) 680 temp = -temp; 681 temp2[11] = '0' + temp; 682 temp = (temperature_sensor2_data.propertyE0 / 100) % 10; 683 if (temp < 0) 684 temp = -temp; 685 temp2[12] = '0' + temp; 686 temp = (temperature_sensor2_data.propertyE0 / 10) % 10; 687 if (temp < 0) 688 temp = -temp; 689 temp2[13] = '0' + temp; 690 temp = (temperature_sensor2_data.propertyE0 / 1) % 10; 691 if (temp < 0) 692 temp = -temp; 693 temp2[15] = '0' + temp; 694 lcd_drawString(&lcd, &temp2[10], X_LINE_HALF_TO_PIX(&lcd, 7), Y_ROW_TO_PIX(&lcd, main_lcd_state + 2), WHITE, BLACK); 695 main_lcd_state++; 696 break; 697 case 2: 698 humid[10] = ' '; 699 humid[11] = ' '; 700 temp = (humidity_sensor_data.propertyE0 / 100) % 10; 701 humid[12] = '0' + temp; 702 temp = (humidity_sensor_data.propertyE0 / 10) % 10; 703 humid[13] = '0' + temp; 704 temp = (humidity_sensor_data.propertyE0 / 1) % 10; 705 humid[15] = '0' + temp; 706 lcd_drawString(&lcd, &humid[10], X_LINE_HALF_TO_PIX(&lcd, 7), Y_ROW_TO_PIX(&lcd, main_lcd_state + 2), WHITE, BLACK); 707 main_lcd_state++; 708 break; 709 case 3: 710 case 4: 711 case 5: 712 case 6: 713 case 7: 714 case 8: 715 main_lcd_state++; 716 break; 717 case 9: 718 lcd_display(&lcd); 719 main_lcd_state = 0; 720 break; 721 case 10: 722 lcd_drawString(&lcd, "温度湿度計", X_LINE_TO_PIX(&lcd, 5), Y_ROW_TO_PIX(&lcd, 0), WHITE, BLACK); 723 lcd_drawString(&lcd, temp1, X_LINE_TO_PIX(&lcd, 0), Y_ROW_TO_PIX(&lcd, 0 + 2), WHITE, BLACK); 724 lcd_drawString(&lcd, temp2, X_LINE_TO_PIX(&lcd, 0), Y_ROW_TO_PIX(&lcd, 1 + 2), WHITE, BLACK); 725 lcd_drawString(&lcd, humid, X_LINE_TO_PIX(&lcd, 0), Y_ROW_TO_PIX(&lcd, 2 + 2), WHITE, BLACK); 726 lcd_display(&lcd); 727 main_lcd_state = 0; 776 728 break; 777 729 default: 778 /* 7segに' 'を表示 */ 779 sil_wrb_mem((uint8_t *)0x0008C02D, 0xFF); 780 main_led_state = main_led_state_idle; 781 main_led_timer = TMO_FEVR; 782 return; 783 } 784 785 main_led_timer = 500 * 1000; 730 main_lcd_state = 10; 731 break; 732 } 733 734 /* 100ms後にLCD表示を更新 */ 735 main_lcd_timer = 100 * 1000; 786 736 } 787 737 … … 789 739 * ADC状態変化処理 790 740 */ 791 static void main_ad_change( )741 static void main_ad_change(int no, int adv) 792 742 { 793 743 ER ret; 794 744 T_EDATA *esv; 795 745 uint8_t p_edt[2]; 796 797 p_edt[0] = ((uint16_t)main_ad_tempr) >> 8; 798 p_edt[1] = ((uint16_t)main_ad_tempr) & 0xFF; 746 uint8_t eobj; 747 748 switch (no) { 749 case 1: 750 eobj = TEMP_SENSOR_01_EOBJ; 751 break; 752 case 2: 753 eobj = TEMP_SENSOR_02_EOBJ; 754 break; 755 case 3: 756 eobj = HUMIDITY_SENSOR_EOBJ; 757 break; 758 default: 759 return; 760 } 761 762 p_edt[0] = ((uint16_t)adv) >> 8; 763 p_edt[1] = ((uint16_t)adv) & 0xFF; 799 764 800 765 /* プロパティ設定電文作成 */ 801 ret = ecn_esv_setc(&esv, TEMP_SENSOR_01_EOBJ, 0xE0, 2, p_edt);802 if (ret != E_OK){766 ret = ecn_esv_setc(&esv, eobj, 0xE0, 2, p_edt); 767 if (ret != E_OK) { 803 768 syslog(LOG_ERROR, "ecn_esv_setc"); 804 769 return; … … 806 771 807 772 /* 電文送信 */ 808 ecn_snd_esv(esv); 773 ret = ecn_snd_esv(esv); 774 if (ret != E_OK) { 775 syslog(LOG_ERROR, "ecn_snd_esv"); 776 } 809 777 } 810 778 … … 822 790 823 791 /* 押されて戻った時に処理する */ 824 if (push)792 if (push) 825 793 return; 826 794 827 795 /* 温度計測値 */ 828 796 main_tmpr -= 10; /* - 1.0℃ */ 829 if (main_tmpr < -100) /* -10.0℃までとする */797 if (main_tmpr < -100) /* -10.0℃までとする */ 830 798 main_tmpr = -100; 831 799 … … 835 803 /* プロパティ値書き込み・読み出し要求電文作成 */ 836 804 ret = ecn_esv_set_get(&esv, TEMP_SENSOR_02_EOBJ, 0xE0, 2, p_edt); 837 if (ret != E_OK){805 if (ret != E_OK) { 838 806 syslog(LOG_ERROR, "ecn_esv_setc"); 839 807 return; … … 844 812 /* 書き込みプロパティ追加 */ 845 813 ret = ecn_add_edt(esv, 0x80, 1, p_edt); 846 if (ret) {814 if (ret) { 847 815 syslog(LOG_ERROR, "ecn_add_edt"); 848 816 goto error; … … 851 819 /* プロパティ値書き込み・読み出し要求電文作成:折り返し指定 */ 852 820 ret = ecn_trn_set_get(esv, &trn_pos); 853 if (ret) {821 if (ret) { 854 822 syslog(LOG_ERROR, "ecn_trn_set_get"); 855 823 goto error; … … 858 826 /* 読み出しプロパティ追加 */ 859 827 ret = ecn_add_epc(esv, 0xE0); 860 if (ret) {828 if (ret) { 861 829 syslog(LOG_ERROR, "ecn_add_epc"); 862 830 goto error; … … 865 833 /* プロパティ値書き込み・読み出し要求電文作成:終了指定 */ 866 834 ret = ecn_end_set_get(esv, trn_pos); 867 if (ret) {835 if (ret) { 868 836 syslog(LOG_ERROR, "ecn_end_set_get"); 869 837 goto error; … … 872 840 /* 電文送信 */ 873 841 ret = ecn_snd_esv(esv); 874 if (ret != E_OK){842 if (ret != E_OK) { 875 843 syslog(LOG_ERROR, "ecn_snd_esv"); 876 844 } … … 879 847 /* 領域解放 */ 880 848 ret = ecn_rel_esv(esv); 881 if (ret != E_OK) {849 if (ret != E_OK) { 882 850 syslog(LOG_ERROR, "ecn_rel_esv"); 883 851 } … … 895 863 896 864 /* 押されて戻った時に処理する */ 897 if (push)865 if (push) 898 866 return; 899 867 900 868 /* 温度計測値 */ 901 869 main_tmpr += 10; /* + 1.0℃ */ 902 if (main_tmpr > 400) /* +40.0℃までとする */870 if (main_tmpr > 400) /* +40.0℃までとする */ 903 871 main_tmpr = 400; 904 872 … … 908 876 /* プロパティ値書き込み・読み出し要求電文作成 */ 909 877 ret = ecn_esv_set_get(&esv, TEMP_SENSOR_02_EOBJ, 0xE0, 2, p_edt); 910 if (ret != E_OK){878 if (ret != E_OK) { 911 879 syslog(LOG_ERROR, "ecn_esv_setc"); 912 880 return; … … 917 885 /* 書き込みプロパティ追加 */ 918 886 ret = ecn_add_edt(esv, 0x80, 1, p_edt); 919 if (ret) {887 if (ret) { 920 888 syslog(LOG_ERROR, "ecn_add_edt"); 921 889 goto error; … … 924 892 /* プロパティ値書き込み・読み出し要求電文作成:折り返し指定 */ 925 893 ret = ecn_trn_set_get(esv, &trn_pos); 926 if (ret) {894 if (ret) { 927 895 syslog(LOG_ERROR, "ecn_trn_set_get"); 928 896 goto error; … … 931 899 /* 読み出しプロパティ追加 */ 932 900 ret = ecn_add_epc(esv, 0xE0); 933 if (ret) {901 if (ret) { 934 902 syslog(LOG_ERROR, "ecn_add_epc"); 935 903 goto error; … … 938 906 /* プロパティ値書き込み・読み出し要求電文作成:終了指定 */ 939 907 ret = ecn_end_set_get(esv, trn_pos); 940 if (ret) {908 if (ret) { 941 909 syslog(LOG_ERROR, "ecn_end_set_get"); 942 910 goto error; … … 945 913 /* 電文送信 */ 946 914 ret = ecn_snd_esv(esv); 947 if (ret != E_OK){915 if (ret != E_OK) { 948 916 syslog(LOG_ERROR, "ecn_snd_esv"); 949 917 } … … 952 920 /* 領域解放 */ 953 921 ret = ecn_rel_esv(esv); 954 if (ret != E_OK) {922 if (ret != E_OK) { 955 923 syslog(LOG_ERROR, "ecn_rel_esv"); 956 924 } … … 962 930 static bool_t check_response(uint8_t pdc, uint8_t *p_edt) 963 931 { 964 if ((pdc != 2)932 if ((pdc != 2) 965 933 || (p_edt[0] != ((uint16_t)main_tmpr) >> 8) 966 || (p_edt[1] != ((uint16_t)main_tmpr) & 0xFF)) 967 { 934 || (p_edt[1] != ((uint16_t)main_tmpr) & 0xFF)) { 968 935 syslog(LOG_WARNING, "epc_set_get response NG"); 969 936 return false;
Note:
See TracChangeset
for help on using the changeset viewer.