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

TINETとSocket APIなどを更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_arm/trunk/app3_human_detec/src/echonet_main.c

    r352 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 */
     
    9494{
    9595        /* サイズが1以外は受け付けない */
    96         if(size != 1)
     96        if (size != 1)
    9797                return 0;
    9898
    9999        *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
    100100
    101         switch(*(uint8_t *)src){
     101        switch (*(uint8_t *)src) {
    102102        /* ONの場合 */
    103103        case 0x30:
     
    126126{
    127127        /* サイズが1以外は受け付けない */
    128         if(size != 1)
     128        if (size != 1)
    129129                return 0;
    130130
    131131        *anno = *((uint8_t *)item->exinf) != *((uint8_t *)src);
    132132
    133         switch(*(uint8_t *)src){
     133        switch (*(uint8_t *)src) {
    134134        /* 異常発生ありの場合 */
    135135        case 0x41:
     
    152152{
    153153        /* サイズが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)) {
    158158                *((uint8_t *)item->exinf) = *((uint8_t *)src);
    159159        }
    160160        /* 上記以外は受け付けない */
    161         else{
     161        else {
    162162                return 0;
    163163        }
     
    180180
    181181        /* サイズが1以外は受け付けない */
    182         if(size != 1)
     182        if (size != 1)
    183183                return 0;
    184184
    185185        *anno = false;
    186186
    187         if((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)){
     187        if ((*(uint8_t *)src >= 0x31) && (*(uint8_t *)src <= 0x38)) {
    188188                /* 以前の検知レベルを保存 */
    189189                prev_state = eobj->state;
     
    197197
    198198                /* 人体検知状態に変化があった場合 */
    199                 if((prev_state < eobj->threshold) != (eobj->state < eobj->threshold))
    200                 {
     199                if ((prev_state < eobj->threshold) != (eobj->state < eobj->threshold)) {
    201200                        /* プロパティ通知 */
    202201                        *anno = true;
     
    204203        }
    205204        /* 上記以外は受け付けない */
    206         else{
     205        else {
    207206                return 0;
    208207        }
     
    211210}
    212211
    213 /* 
     212/*
    214213 * 人体検知状態取得関数
    215214 */
     
    219218
    220219        /* 閾値より検知レベルが低い場合 */
    221         if(eobj->state < eobj->threshold){
     220        if (eobj->state < eobj->threshold) {
    222221                /* 人体検知なし */
    223222                ((uint8_t *)dst)[0] = 0x42;
    224223        }
    225224        /* 閾値より検知レベルが高い場合 */
    226         else{
     225        else {
    227226                /* 人体検知あり */
    228227                ((uint8_t *)dst)[0] = 0x41;
     
    255254
    256255        ret2 = get_tim(&now);
    257         if (ret2 != E_OK){
     256        if (ret2 != E_OK) {
    258257                syslog(LOG_ERROR, "get_tim");
    259258                return;
    260259        }
    261260
    262         for(;;){
     261        for (;;) {
    263262                prev = now;
    264263
     
    268267                /* 応答電文待ち */
    269268                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)) {
    271270                        syslog(LOG_ERROR, "ecn_trcv_esv");
    272271                        break;
     
    274273
    275274                ret2 = get_tim(&now);
    276                 if (ret2 != E_OK){
     275                if (ret2 != E_OK) {
    277276                        syslog(LOG_ERROR, "get_tim");
    278277                        break;
     
    289288                        /* 領域解放 */
    290289                        ret = ecn_rel_esv(esv);
    291                         if (ret != E_OK){
     290                        if (ret != E_OK) {
    292291                                syslog(LOG_ERROR, "ecn_rel_esv");
    293292                                break;
     
    298297                        /* 応答電文待ちの割り込みデータ取得 */
    299298                        ret = ecn_get_brk_dat(esv, brkdat, sizeof(brkdat), &len);
    300                         if (ret != E_OK){
     299                        if (ret != E_OK) {
    301300                                syslog(LOG_ERROR, "ecn_get_brk_dat");
    302301                                break;
     
    308307                        /* 領域解放 */
    309308                        ret = ecn_rel_esv(esv);
    310                         if (ret != E_OK){
     309                        if (ret != E_OK) {
    311310                                syslog(LOG_ERROR, "ecn_rel_esv");
    312311                                break;
     
    319318}
    320319
    321 bool_t started = false;
    322 
    323320void echonet_change_netif_link(uint8_t link_up, uint8_t up)
    324321{
     
    328325                return;
    329326
    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                }
    340333        }
    341334
     
    351344}
    352345
    353 enum main_state_t{
     346enum main_state_t {
     347        main_state_start,
    354348        main_state_idle,
    355349};
    356350
    357351int main_timer = TMO_FEVR;
    358 enum main_state_t main_state = main_state_idle;
     352enum main_state_t main_state = main_state_start;
    359353bool_t main_btn1_state;
    360354int main_btn1_count = 0;
     
    386380        gpio_write(&led_red, 0);
    387381
    388         /* 10ms後にボタン状態を確認 */
    389         main_timer = 10 * 1000;
     382        /* ECHONETミドルウェアを起動するのを待つ */
     383        main_state = main_state_start;
     384        main_timer = 1000 * 1000;
    390385
    391386        /* アナログ入力の初期化 */
     
    398393        main_btn2_state = btn2 != 0;
    399394
     395        /* メインタスクを起動 */
    400396        ER ret = act_tsk(MAIN_TASK);
    401397        if (ret != E_OK) {
     
    417413static void main_progress(int interval)
    418414{
    419         if(main_timer == TMO_FEVR)
     415        if (main_timer == TMO_FEVR)
    420416                return;
    421417
    422418        main_timer -= interval;
    423         if(main_timer < 0){
     419        if (main_timer < 0) {
    424420                main_timer = 0;
    425421        }
     
    438434
    439435        ret = ecn_itr_ini(&enm, esv);
    440         if(ret != E_OK){
     436        if (ret != E_OK) {
    441437                syslog(LOG_ERROR, "ecn_itr_ini");
    442438                return;
    443439        }
    444440
    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) {
    447443                        switch (epc) {
    448444                        case 0x80:
     
    452448                        }
    453449                }
    454                 if(ret != E_BOVR){
     450                if (ret != E_BOVR) {
    455451                        syslog(LOG_ERROR, "ecn_itr_nxt");
    456452                        break;
    457453                }
    458                 if(enm.is_eof)
     454                if (enm.is_eof)
    459455                        break;
    460456        }
     
    466462static void main_break_wait(uint8_t *brkdat, int32_t len)
    467463{
    468         switch(main_state){
     464        switch (main_state) {
    469465        case main_state_idle:
    470466                break;
     
    488484static void main_timeout()
    489485{
     486        ER ret;
    490487        uint8_t btn1, btn2;
    491488        uint16_t ad_value;
    492489        uint8_t ad_level;
    493490
    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;
    498506        case main_state_idle:
    499507                /* 10ms後にボタン状態を確認 */
     
    507515
    508516                main_ad_pos++;
    509                 if(main_ad_pos >= main_ad_table_count){
     517                if (main_ad_pos >= main_ad_table_count) {
    510518                        main_ad_pos = 0;
    511519                }
    512520
    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) {
    515523                        /* 1秒変化が続いたら */
    516                         if(main_count < 100){
     524                        if (main_count < 100) {
    517525                                main_count++;
    518526                        }
    519                         else{
     527                        else {
    520528                                main_ad_level = ad_level;
    521529
     
    524532                        }
    525533                }
    526                 else{
     534                else {
    527535                        main_count = 0;
    528536                }
     
    533541
    534542                /* ボタン1の処理 */
    535                 if((btn1 != 0) && !main_btn1_state){
     543                if ((btn1 != 0) && !main_btn1_state) {
    536544                        main_btn1_count++;
    537                         if(main_btn1_count > 10){
     545                        if (main_btn1_count > 10) {
    538546                                main_btn1_count = 0;
    539547                                main_btn1_state = true;
     
    542550                        }
    543551                }
    544                 else if((btn1 == 0) && main_btn1_state){
     552                else if ((btn1 == 0) && main_btn1_state) {
    545553                        main_btn1_count++;
    546                         if(main_btn1_count > 10){
     554                        if (main_btn1_count > 10) {
    547555                                main_btn1_count = 0;
    548556                                main_btn1_state = false;
     
    553561
    554562                /* ボタン2の処理 */
    555                 if((btn2 != 0) && !main_btn2_state){
     563                if ((btn2 != 0) && !main_btn2_state) {
    556564                        main_btn2_count++;
    557                         if(main_btn2_count > 10){
     565                        if (main_btn2_count > 10) {
    558566                                main_btn2_count = 0;
    559567                                main_btn2_state = true;
     
    562570                        }
    563571                }
    564                 else if((btn2 == 0) && main_btn2_state){
     572                else if ((btn2 == 0) && main_btn2_state) {
    565573                        main_btn2_count++;
    566                         if(main_btn2_count > 10){
     574                        if (main_btn2_count > 10) {
    567575                                main_btn2_count = 0;
    568576                                main_btn2_state = false;
     
    588596        /* プロパティ設定電文作成 */
    589597        ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt);
    590         if(ret != E_OK){
     598        if (ret != E_OK) {
    591599                syslog(LOG_ERROR, "ecn_esv_setc");
    592600                return;
     
    610618
    611619        /* 押されて戻った時に処理する */
    612         if(push)
     620        if (push)
    613621                return;
    614622
    615623        /* 人体検知状態 */
    616         if(!main_rev){
     624        if (!main_rev) {
    617625                main_level--;
    618                 if(main_level < 1){
     626                if (main_level < 1) {
    619627                        main_level = 1;
    620628                        main_rev = true;
    621629                }
    622630        }
    623         else{
     631        else {
    624632                main_level++;
    625                 if(main_level > 8){
     633                if (main_level > 8) {
    626634                        main_level = 8;
    627635                        main_rev = false;
     
    633641        /* プロパティ設定電文作成 */
    634642        ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt);
    635         if(ret != E_OK){
     643        if (ret != E_OK) {
    636644                syslog(LOG_ERROR, "ecn_esv_setc");
    637645                return;
     
    652660
    653661        /* 押されて戻った時に処理する */
    654         if(push)
     662        if (push)
    655663                return;
    656664
    657665        /* 人体検知状態 */
    658         if(!main_rev){
     666        if (!main_rev) {
    659667                main_level++;
    660                 if(main_level > 8){
     668                if (main_level > 8) {
    661669                        main_level = 8;
    662670                        main_rev = false;
    663671                }
    664672        }
    665         else{
     673        else {
    666674                main_level--;
    667                 if(main_level < 1){
     675                if (main_level < 1) {
    668676                        main_level = 1;
    669677                        main_rev = true;
     
    675683        /* プロパティ設定電文作成 */
    676684        ret = ecn_esv_setc(&esv, HUMAN_DETECTION_SENSOR_EOBJ, 0xB1, 1, p_edt);
    677         if(ret != E_OK){
     685        if (ret != E_OK) {
    678686                syslog(LOG_ERROR, "ecn_esv_setc");
    679687                return;
Note: See TracChangeset for help on using the changeset viewer.