Ignore:
Timestamp:
Feb 1, 2019, 9:57:09 PM (4 years ago)
Author:
coas-nagasima
Message:

TINETとSocket APIなどを更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_rx/trunk/app5_temp_sensor/src/echonet_main.c

    r351 r364  
    11/*
    22 *  TOPPERS ECHONET Lite Communication Middleware
    3  * 
     3 *
    44 *  Copyright (C) 2014-2018 Cores Co., Ltd. Japan
    5  * 
     5 *
    66 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    77 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     
    2626 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
    2727 *      免責すること.
    28  * 
     28 *
    2929 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
    3030 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     
    3232 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    3333 *  の責任を負わない.
    34  * 
     34 *
    3535 *  @(#) $Id$
    3636 */
    3737
    38 /* 
     38/*
    3939 *  サンプルプログラム(1)の本体
    4040 */
     
    5151#include "echonet_cfg.h"
    5252#include "target_kernel_impl.h"
     53#include "adafruit_ssd1306.h"
     54#include "draw_font.h"
    5355
    5456/* TODO: メーカーコードを設定 */
     
    107109
    108110        /* サイズが1以外は受け付けない */
    109         if(size != 1)
     111        if (size != 1)
    110112                return 0;
    111113
    112114        *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
    113115
    114         switch(*(uint8_t *)src){
     116        switch (*(uint8_t *)src) {
    115117        /* ONの場合 */
    116118        case 0x30:
     
    122124                data[1] = *(uint8_t *)src;
    123125                ret = ecn_brk_wai(data, sizeof(data));
    124                 if(ret != E_OK){
     126                if (ret != E_OK) {
    125127                        syslog(LOG_ERROR, "ecn_brk_wai");
    126128                        return 1;
     
    141143{
    142144        /* サイズが1以外は受け付けない */
    143         if(size != 1)
     145        if (size != 1)
    144146                return 0;
    145147
    146148        *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
    147149
    148         switch(*(uint8_t *)src){
     150        switch (*(uint8_t *)src) {
    149151        /* 異常発生ありの場合 */
    150152        case 0x41:
     
    172174
    173175        /* サイズが2以外は受け付けない */
    174         if(size != 2)
     176        if (size != 2)
    175177                return 0;
    176178
    177179        value = (((uint8_t *)src)[0] << 8) | (((uint8_t *)src)[1] & 0xFF);
    178180
    179         if((value >= -2732) && (value <= 32766)){
     181        if ((value >= -2732) && (value <= 32766)) {
    180182                eobj->propertyE0 = value;
    181183                /* メインタスクに通知 */
    182184                data[0] = 0xE0;
    183185                ret = ecn_brk_wai(data, sizeof(data));
    184                 if(ret != E_OK){
     186                if (ret != E_OK) {
    185187                        syslog(LOG_ERROR, "ecn_brk_wai");
    186188                        return 2;
     
    188190        }
    189191        /* 上記以外は受け付けない */
    190         else{
     192        else {
    191193                return 0;
    192194        }
     
    195197}
    196198
    197 /* 
     199/*
    198200 * 温度計測値取得関数
    199201 */
     
    204206
    205207        /* サイズが2以外は受け付けない */
    206         if(size != 2)
     208        if (size != 2)
    207209                return 0;
    208210
     
    236238
    237239        ret2 = get_tim(&now);
    238         if (ret2 != E_OK){
     240        if (ret2 != E_OK) {
    239241                syslog(LOG_ERROR, "get_tim");
    240242                return;
    241243        }
    242244
    243         for(;;){
     245        for (;;) {
    244246                prev = now;
    245247
     
    249251                /* 応答電文待ち */
    250252                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)) {
    252254                        syslog(LOG_ERROR, "ecn_trcv_esv");
    253255                        break;
     
    255257
    256258                ret2 = get_tim(&now);
    257                 if (ret2 != E_OK){
     259                if (ret2 != E_OK) {
    258260                        syslog(LOG_ERROR, "get_tim");
    259261                        break;
     
    270272                        /* 領域解放 */
    271273                        ret = ecn_rel_esv(esv);
    272                         if (ret != E_OK){
     274                        if (ret != E_OK) {
    273275                                syslog(LOG_ERROR, "ecn_rel_esv");
    274276                                break;
     
    279281                        /* 応答電文待ちの割り込みデータ取得 */
    280282                        ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len);
    281                         if (ret != E_OK){
     283                        if (ret != E_OK) {
    282284                                syslog(LOG_ERROR, "ecn_get_brk_dat");
    283285                                break;
     
    289291                        /* 領域解放 */
    290292                        ret = ecn_rel_esv(esv);
    291                         if (ret != E_OK){
     293                        if (ret != E_OK) {
    292294                                syslog(LOG_ERROR, "ecn_rel_esv");
    293295                                break;
     
    300302}
    301303
    302 bool_t started = false;
    303 
    304304void echonet_change_netif_link(uint8_t link_up, uint8_t up)
    305305{
     
    309309                return;
    310310
    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                }
    321317        }
    322318
     
    332328}
    333329
    334 enum main_state_t{
     330enum main_state_t {
     331        main_state_start,
    335332        main_state_idle,
    336333};
    337334
    338335int 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;
     336enum main_state_t main_state = main_state_start;
     337
     338int main_lcd_timer = TMO_FEVR;
     339int main_lcd_state = 0;
    362340
    363341bool_t main_btn1_state;
     
    365343bool_t main_btn2_state;
    366344int main_btn2_count = 0;
     345
     346LCD_Handler_t lcd;
    367347
    368348/*
     
    387367        sil_wrb_mem((uint8_t *)0x0008C02D, 0xC0);
    388368
    389         /* 10ms後にボタン状態を確認 */
    390         main_timer = 10 * 1000;
     369        /* ECHONETミドルウェアを起動するのを待つ */
     370        main_state = main_state_start;
     371        main_timer = 1000 * 1000;
    391372
    392373        /* 12bitADC初期化 */
    393374        sil_wrh_mem((uint16_t *)S12AD_ADEXICR_ADDR, 0x0000);    /* 温度センサ出力、内部基準電圧非選択 */
    394         sil_wrh_mem((uint16_t *)S12AD_ADANS0_ADDR, 0x0001);             /* 変換ポートAN000選択、AN001~AN015非選択 */
     375        sil_wrh_mem((uint16_t *)S12AD_ADANS0_ADDR, 0x0007);             /* 変換ポートAN000選択、AN001~AN015非選択 */
    395376        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         else
    400                 main_led_state = main_led_state_off_o;
    401         main_led_timer = 0;
    402377
    403378        /* ボタン状態読み込み */
     
    407382        main_btn2_state = (btn2 & 0x80) != 0;
    408383
     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        /* メインタスクを起動 */
    409400        ER ret = act_tsk(MAIN_TASK);
    410401        if (ret != E_OK) {
     
    420411        int result = main_timer;
    421412
    422         if((result == TMO_FEVR)
    423                 || ((main_led_timer != TMO_FEVR) && (main_led_timer < result))){
    424                 result = main_led_timer;
     413        if ((result == TMO_FEVR)
     414                || ((main_lcd_timer != TMO_FEVR) && (main_lcd_timer < result))) {
     415                result = main_lcd_timer;
    425416        }
    426417
     
    433424static void main_progress(int interval)
    434425{
    435         if(main_timer != TMO_FEVR){
     426        if (main_timer != TMO_FEVR) {
    436427                main_timer -= interval;
    437                 if(main_timer < 0){
     428                if (main_timer < 0) {
    438429                        main_timer = 0;
    439430                }
    440431        }
    441432
    442         if(main_led_timer != TMO_FEVR){
    443                 main_led_timer -= interval;
    444                 if(main_led_timer < 0){
    445                         main_led_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;
    446437                }
    447438        }
     
    463454
    464455        ret = ecn_itr_ini(&enm, esv);
    465         if(ret != E_OK){
     456        if (ret != E_OK) {
    466457                syslog(LOG_ERROR, "ecn_itr_ini");
    467458                return;
    468459        }
    469460
    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) {
    472463                        switch (epc) {
    473464                        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)) {
    475466                                        check_response(pdc, p_edt);
    476467                                }
     
    478469                        }
    479470                }
    480                 if(ret != E_BOVR){
     471                if (ret != E_BOVR) {
    481472                        syslog(LOG_ERROR, "ecn_itr_nxt");
    482473                        break;
    483474                }
    484                 if(enm.is_eof)
     475                if (enm.is_eof)
    485476                        break;
    486477
     
    501492
    502493        if ((len == 2) && (brkdat[0] == 0x80)) {
    503                 switch(brkdat[1]){
     494                switch (brkdat[1]) {
    504495                /* ONの場合 */
    505496                case 0x30:
     
    514505                }
    515506        }
    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                 else
    522                         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         }
    529507}
    530508
    531509static void main_ontimer();
    532 static void main_led_ontimer();
     510static void main_lcd_ontimer();
    533511
    534512/*
     
    537515static void main_timeout()
    538516{
    539         if(main_timer == 0){
     517        if (main_timer == 0) {
    540518                main_ontimer();
    541519        }
    542520
    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
     528static int16_t main_ad_tempr[main_ad_count] = { 200, 200, 200 };
     529static uint16_t main_ad_table[main_ad_count][main_ad_table_count];
    551530static int main_ad_pos = 0;
    552 static uint32_t main_ad_avelage;
    553 static int main_count;
    554 
    555 static void main_ad_change();
     531static uint32_t main_ad_avelage[main_ad_count];
     532static int main_count[main_ad_count];
     533
     534static void main_ad_change(int no, int adv);
    556535static void main_btn1_change(bool_t push);
    557536static void main_btn2_change(bool_t push);
    558537
    559 uint8_t led_disp[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
    560 
    561538static void main_ontimer()
    562539{
     540        ER ret;
    563541        uint8_t btn1, btn2;
    564542        uint16_t ad_value;
    565543        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;
    569557        case main_state_idle:
    570558                /* 10ms後にボタン状態を確認 */
     
    572560
    573561                /* 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                        }
    579569
    580570                        main_ad_pos++;
    581                         if(main_ad_pos >= main_ad_table_count){
     571                        if (main_ad_pos >= main_ad_table_count) {
    582572                                main_ad_pos = 0;
    583573                        }
    584574
    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                                        }
    590589                                }
    591                                 else{
    592                                         main_ad_tempr = ad_tempr;
    593 
    594                                         /* ADC状態変化処理 */
    595                                         main_ad_change();
     590                                else {
     591                                        main_count[i] = 0;
    596592                                }
    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                        }
    607597                }
    608598
     
    612602
    613603                /* ボタン1の処理 */
    614                 if(((btn1 & 0x20) != 0) && !main_btn1_state){
     604                if (((btn1 & 0x20) != 0) && !main_btn1_state) {
    615605                        main_btn1_count++;
    616                         if(main_btn1_count > 10){
     606                        if (main_btn1_count > 10) {
    617607                                main_btn1_count = 0;
    618608                                main_btn1_state = true;
     
    621611                        }
    622612                }
    623                 else if(((btn1 & 0x20) == 0) && main_btn1_state){
     613                else if (((btn1 & 0x20) == 0) && main_btn1_state) {
    624614                        main_btn1_count++;
    625                         if(main_btn1_count > 10){
     615                        if (main_btn1_count > 10) {
    626616                                main_btn1_count = 0;
    627617                                main_btn1_state = false;
     
    632622
    633623                /* ボタン2の処理 */
    634                 if(((btn2 & 0x80) != 0) && !main_btn2_state){
     624                if (((btn2 & 0x80) != 0) && !main_btn2_state) {
    635625                        main_btn2_count++;
    636                         if(main_btn2_count > 10){
     626                        if (main_btn2_count > 10) {
    637627                                main_btn2_count = 0;
    638628                                main_btn2_state = true;
     
    641631                        }
    642632                }
    643                 else if(((btn2 & 0x80) == 0) && main_btn2_state){
     633                else if (((btn2 & 0x80) == 0) && main_btn2_state) {
    644634                        main_btn2_count++;
    645                         if(main_btn2_count > 10){
     635                        if (main_btn2_count > 10) {
    646636                                main_btn2_count = 0;
    647637                                main_btn2_state = false;
     
    654644}
    655645
    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()
     646static char temp1[] = "温度1:+000.0℃";
     647static char temp2[] = "温度2:+000.0℃";
     648static char humid[] = "湿度 :+000.0%";
     649
     650static void main_lcd_ontimer()
    660651{
    661652        int temp;
    662653
    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) ? ' ' : '-';
    714657                temp = (temperature_sensor1_data.propertyE0 / 1000) % 10;
    715                 if(temp < 0)
     658                if (temp < 0)
    716659                        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;
    722661                temp = (temperature_sensor1_data.propertyE0 / 100) % 10;
    723                 if(temp < 0)
     662                if (temp < 0)
    724663                        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;
    730665                temp = (temperature_sensor1_data.propertyE0 / 10) % 10;
    731                 if(temp < 0)
     666                if (temp < 0)
    732667                        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;
    776728                break;
    777729        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;
    786736}
    787737
     
    789739 * ADC状態変化処理
    790740 */
    791 static void main_ad_change()
     741static void main_ad_change(int no, int adv)
    792742{
    793743        ER ret;
    794744        T_EDATA *esv;
    795745        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;
    799764
    800765        /* プロパティ設定電文作成 */
    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) {
    803768                syslog(LOG_ERROR, "ecn_esv_setc");
    804769                return;
     
    806771
    807772        /* 電文送信 */
    808         ecn_snd_esv(esv);
     773        ret = ecn_snd_esv(esv);
     774        if (ret != E_OK) {
     775                syslog(LOG_ERROR, "ecn_snd_esv");
     776        }
    809777}
    810778
     
    822790
    823791        /* 押されて戻った時に処理する */
    824         if(push)
     792        if (push)
    825793                return;
    826794
    827795        /* 温度計測値 */
    828796        main_tmpr -= 10;        /* - 1.0℃ */
    829         if(main_tmpr < -100)    /* -10.0℃までとする */
     797        if (main_tmpr < -100)   /* -10.0℃までとする */
    830798                main_tmpr = -100;
    831799
     
    835803        /* プロパティ値書き込み・読み出し要求電文作成 */
    836804        ret = ecn_esv_set_get(&esv, TEMP_SENSOR_02_EOBJ, 0xE0, 2, p_edt);
    837         if(ret != E_OK){
     805        if (ret != E_OK) {
    838806                syslog(LOG_ERROR, "ecn_esv_setc");
    839807                return;
     
    844812        /* 書き込みプロパティ追加 */
    845813        ret = ecn_add_edt(esv, 0x80, 1, p_edt);
    846         if(ret) {
     814        if (ret) {
    847815                syslog(LOG_ERROR, "ecn_add_edt");
    848816                goto error;
     
    851819        /* プロパティ値書き込み・読み出し要求電文作成:折り返し指定 */
    852820        ret = ecn_trn_set_get(esv, &trn_pos);
    853         if(ret) {
     821        if (ret) {
    854822                syslog(LOG_ERROR, "ecn_trn_set_get");
    855823                goto error;
     
    858826        /* 読み出しプロパティ追加 */
    859827        ret = ecn_add_epc(esv, 0xE0);
    860         if(ret) {
     828        if (ret) {
    861829                syslog(LOG_ERROR, "ecn_add_epc");
    862830                goto error;
     
    865833        /* プロパティ値書き込み・読み出し要求電文作成:終了指定 */
    866834        ret = ecn_end_set_get(esv, trn_pos);
    867         if(ret) {
     835        if (ret) {
    868836                syslog(LOG_ERROR, "ecn_end_set_get");
    869837                goto error;
     
    872840        /* 電文送信 */
    873841        ret = ecn_snd_esv(esv);
    874         if(ret != E_OK){
     842        if (ret != E_OK) {
    875843                syslog(LOG_ERROR, "ecn_snd_esv");
    876844        }
     
    879847        /* 領域解放 */
    880848        ret = ecn_rel_esv(esv);
    881         if (ret != E_OK){
     849        if (ret != E_OK) {
    882850                syslog(LOG_ERROR, "ecn_rel_esv");
    883851        }
     
    895863
    896864        /* 押されて戻った時に処理する */
    897         if(push)
     865        if (push)
    898866                return;
    899867
    900868        /* 温度計測値 */
    901869        main_tmpr += 10;        /* + 1.0℃ */
    902         if(main_tmpr > 400)     /* +40.0℃までとする */
     870        if (main_tmpr > 400)    /* +40.0℃までとする */
    903871                main_tmpr = 400;
    904872
     
    908876        /* プロパティ値書き込み・読み出し要求電文作成 */
    909877        ret = ecn_esv_set_get(&esv, TEMP_SENSOR_02_EOBJ, 0xE0, 2, p_edt);
    910         if(ret != E_OK){
     878        if (ret != E_OK) {
    911879                syslog(LOG_ERROR, "ecn_esv_setc");
    912880                return;
     
    917885        /* 書き込みプロパティ追加 */
    918886        ret = ecn_add_edt(esv, 0x80, 1, p_edt);
    919         if(ret) {
     887        if (ret) {
    920888                syslog(LOG_ERROR, "ecn_add_edt");
    921889                goto error;
     
    924892        /* プロパティ値書き込み・読み出し要求電文作成:折り返し指定 */
    925893        ret = ecn_trn_set_get(esv, &trn_pos);
    926         if(ret) {
     894        if (ret) {
    927895                syslog(LOG_ERROR, "ecn_trn_set_get");
    928896                goto error;
     
    931899        /* 読み出しプロパティ追加 */
    932900        ret = ecn_add_epc(esv, 0xE0);
    933         if(ret) {
     901        if (ret) {
    934902                syslog(LOG_ERROR, "ecn_add_epc");
    935903                goto error;
     
    938906        /* プロパティ値書き込み・読み出し要求電文作成:終了指定 */
    939907        ret = ecn_end_set_get(esv, trn_pos);
    940         if(ret) {
     908        if (ret) {
    941909                syslog(LOG_ERROR, "ecn_end_set_get");
    942910                goto error;
     
    945913        /* 電文送信 */
    946914        ret = ecn_snd_esv(esv);
    947         if(ret != E_OK){
     915        if (ret != E_OK) {
    948916                syslog(LOG_ERROR, "ecn_snd_esv");
    949917        }
     
    952920        /* 領域解放 */
    953921        ret = ecn_rel_esv(esv);
    954         if (ret != E_OK){
     922        if (ret != E_OK) {
    955923                syslog(LOG_ERROR, "ecn_rel_esv");
    956924        }
     
    962930static bool_t check_response(uint8_t pdc, uint8_t *p_edt)
    963931{
    964         if((pdc != 2)
     932        if ((pdc != 2)
    965933                || (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)) {
    968935                syslog(LOG_WARNING, "epc_set_get response NG");
    969936                return false;
Note: See TracChangeset for help on using the changeset viewer.