Ignore:
Timestamp:
Mar 8, 2016, 8:37:45 PM (8 years ago)
Author:
coas-nagasima
Message:

MIMEにSJISを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • UsbWattMeter/trunk/ecnl_lwip/echonet_udp_task.c

    • Property svn:mime-type changed from text/x-csrc to text/x-csrc; charset=SHIFT_JIS
    r164 r167  
    44 *  Copyright (C) 2014-2016 Cores Co., Ltd. Japan
    55 *
    6  *  ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
    7  *  ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
    8  *  •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    9  *  (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
    10  *      Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
    11  *      ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    12  *  (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    13  *      —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    14 ƒƒ“ƒgi—˜—p
    15  *      ŽÒƒ}ƒjƒ
    16 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
    17  *      ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    18  *  (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    19  *      —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
    20  *      ‚ƁD
    21  *    (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    22 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    23 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
    24  *        ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    25  *    (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
    26  *        •ñ‚·‚邱‚ƁD
    27  *  (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
    28  *      ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
    29  *      ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
    30  *      —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
    31  *      –Ɛӂ·‚邱‚ƁD
     6 *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
     7 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     8 *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     9 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     10 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     11 *      スコード中に含まれていること.
     12 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     13 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     14 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     15 *      の無保証規定を掲載すること.
     16 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     17 *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     18 *      と.
     19 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     20 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     21 *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     22 *        報告すること.
     23 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     24 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     25 *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     26 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     27 *      免責すること.
    3228 *
    33  *  –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
    34  *  ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
    35  *  ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
    36  *  ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
    37  *  ‚̐ӔC‚𕉂í‚È‚¢D
     29 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     30 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     31 *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     32 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     33 *  の責任を負わない.
    3834 *
    3935 *  @(#) $Id$
     
    4137
    4238/*
    43  *              ECHONET Lite UDP’ʐMˆ—ƒ^ƒXƒN
     39 *              ECHONET Lite UDP通信処理タスク
    4440 */
    4541#ifdef SUPPORT_INET4
     
    107103
    108104/*
    109  * ŽóM‚µ‚½UDPƒf[ƒ^‚ðMAILBOX‚É‘—‚é
     105 * 受信したUDPデータをMAILBOXに送る
    110106 */
    111107ER _ecn_udp2mbx(ECN_FBS_ID fbs_id, const T_IPV4EP *dst);
     
    117113
    118114        t_esv = (const T_ECN_EDT_HDR    *)fbs_id.ptr->payload;
    119         if (t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE        /* ECHONET Lite‹KŠi     */
    120                 || t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1                     /* “d•¶Œ`Ž®1            */) {
     115        if (t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE        /* ECHONET Lite規格       */
     116                || t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1                     /* 電文形式1                */) {
    121117                ECN_DBG_PUT("[UDP ECHO SRV] illegal type (0x%02X,0x%02X)", t_esv->ecn_hdr.ehd1, t_esv->ecn_hdr.ehd2);
    122118                return E_PAR;
     
    131127        fbs_id.ptr->hdr.sender.id = ENOD_NOT_MATCH_ID;
    132128
    133         /* IPƒAƒhƒŒƒX‚©‚烊ƒ‚[ƒgECHONETƒm[ƒh‚Ö•ÏŠ· */
     129        /* IPアドレスからリモートECHONETノードへ変換 */
    134130        a_enod_id = udp_get_id((T_EDATA *)fbs_id.ptr, &dst->ipaddr, dst->portno);
    135131        if (a_enod_id < 0 || tnum_enodadr <= a_enod_id) {
     
    138134        }
    139135        else {
    140          /* ‘—MŒ³ECHONETƒm[ƒh‚ð‹L˜^ */
     136         /* 送信元ECHONETノードを記録 */
    141137                fbs_id.ptr->hdr.sender.id = a_enod_id;
    142138        }
    143139        fbs_id.ptr->hdr.reply.id = fbs_id.ptr->hdr.sender.id;
    144140
    145         /* echonet_task‚É‘—‚é */
     141        /* echonet_taskに送る */
    146142        a_ret = snd_mbx(ecn_svc_mailboxid, (T_MSG *)fbs_id.ptr);
    147143        if (a_ret != E_OK) {
     
    156152
    157153/*
    158  *  ECHONET UDP’ʐMˆ—ƒ^ƒXƒN
     154 *  ECHONET UDP通信処理タスク
    159155 */
    160156void echonet_udp_task(intptr_t exinf)
     
    215211        }
    216212
    217         /* ƒƒbƒZ[ƒWƒ‹[ƒv */
     213        /* メッセージループ */
    218214        for (;;) {
    219215                a_prev = a_now;
     
    237233
    238234                if (a_ret == E_OK) {
    239                         /* ‘—Mƒf[ƒ^’·‚ðŽæ“¾ */
     235                        /* 送信データ長を取得 */
    240236                        a_snd_len = _ecn_fbs_get_datalen(a_mdt.fbs_id);
    241237
     
    260256}
    261257
    262 /* ‰ž“š“d•¶—pfbsÝ’è(sender/target‚̐ݒè) */
     258/* 応答電文用fbs設定(sender/targetの設定) */
    263259static ER _ecn_udp_cre_req_fbs(ID sender, uint8_t cmd, ECN_FBS_ID *pk_req)
    264260{
     
    289285}
    290286
    291 /* ‰ž“š“d•¶—pfbsÝ’è(sender/target‚̐ݒè) */
     287/* 応答電文用fbs設定(sender/targetの設定) */
    292288static ER _ecn_udp_cre_res_fbs(ECN_FBS_ID req, uint8_t cmd, ECN_FBS_ID *pk_res)
    293289{
     
    319315
    320316/*
    321  *  “à•”ƒƒbƒZ[ƒWŽóMˆ—
     317 *  内部メッセージ受信処理
    322318 */
    323319void _ecn_int_msg(ECN_FBS_ID fbs_id, ECN_FBS_SSIZE_T a_snd_len)
     
    338334
    339335        switch (cmd) {
    340         // IPƒAƒhƒŒƒX‚ð•ÔM
     336        // IPアドレスを返信
    341337        case ECN_UDP_MSG_GET_IPADDR_REQ:
    342338                if (a_snd_len < sizeof(msg)) {
     
    418414
    419415/*
    420  *  ECHONET “d•¶ŽóMˆ—
     416 *  ECHONET 電文受信処理
    421417 */
    422418void _ecn_esv_msg(ECN_FBS_ID fbs_id)
     
    429425        IP4_ADDR(&a_dst.ipaddr, 0, 0, 0, 0);
    430426        a_dst.portno = 0;
    431         /* ‘—MæIPƒAƒhƒŒƒX */
     427        /* 送信先IPアドレス */
    432428        a_ret = udp_get_ip(&a_dst, fbs_id.ptr->hdr.target.id);
    433429        if (!a_ret) {
    434                 ECN_DBG_PUT("[UDP TSK] echonet-node 0x%02X-0x%02X-0x%02X ¨ udp dest(%s)",
     430                ECN_DBG_PUT("[UDP TSK] echonet-node 0x%02X-0x%02X-0x%02X udp dest(%s)",
    435431                        ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx1,
    436432                        ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx2,
     
    439435
    440436                if (ip_addr_cmp(&a_dst.ipaddr, &localhost)) {
    441                         /* ‘—Mæ‚ª127.0.0.1 ¨ mbx‚É“]‘— */
    442                         ECN_DBG_PUT("redirect ecn_udp_mailboxid ¨ ecn_svc_mailboxid (esv:0x%02X)",
     437                        /* 送信先が127.0.0.1 → mbxに転送 */
     438                        ECN_DBG_PUT("redirect ecn_udp_mailboxid ecn_svc_mailboxid (esv:0x%02X)",
    443439                                ((T_EDATA *)fbs_id.ptr)->hdr.edata.esv);
    444440
     
    460456                        }
    461457
    462                         /* fbs‚©‚ço—͗̈æ‚Ƀf[ƒ^‚𒊏o */
     458                        /* fbsから出力領域にデータを抽出 */
    463459                        a_snd_len = 0;
    464460                        for (q = p; q != NULL; q = q->next) {
     
    473469                        }
    474470
    475                         /* UDP‘—M */
     471                        /* UDP送信 */
    476472                        a_ret = udp_sendto(UDP_CEPID, p, &a_dst.ipaddr, 3610);
    477473                        if (a_ret < 0) {
     
    481477                }
    482478
    483                 /* ƒf[ƒ^‚ª’·‚·‚¬‚Ä1ƒpƒPƒbƒg‚ÉŽû‚Ü‚ç‚È‚©‚Á‚½ê‡ */
     479                /* データが長すぎて1パケットに収まらなかった場合 */
    484480                if (_ecn_fbs_exist_data(fbs_id)) {
    485481                        ECN_DBG_PUT("[UDP TSK] send, data so long: %dbyte(s)", _ecn_fbs_get_datalen(fbs_id));
     
    495491
    496492/*
    497  *  ƒmƒ“ƒuƒƒbƒLƒ“ƒOƒR[ƒ‹‚̃R[ƒ‹ƒoƒbƒNŠÖ”
     493 *  ノンブロッキングコールのコールバック関数
    498494 */
    499495static void
     
    525521
    526522        t_esv = (const T_ECN_EDT_HDR *)a_fbs_id.ptr->payload;
    527         if (t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE        /* ECHONET Lite‹KŠi     */
    528                 || t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1                     /* “d•¶Œ`Ž®1            */) {
     523        if (t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE        /* ECHONET Lite規格       */
     524                || t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1                     /* 電文形式1                */) {
    529525                ECN_DBG_PUT("[UDP ECHO SRV] illegal type (0x%02X,0x%02X)", t_esv->ecn_hdr.ehd1, t_esv->ecn_hdr.ehd2);
    530526                goto lb_except;
     
    539535        a_fbs_id.ptr->hdr.sender.id = ENOD_NOT_MATCH_ID;
    540536
    541         /* IPƒAƒhƒŒƒX‚©‚烊ƒ‚[ƒgECHONETƒm[ƒh‚Ö•ÏŠ· */
     537        /* IPアドレスからリモートECHONETノードへ変換 */
    542538        a_enod_id = udp_get_id((T_EDATA *)a_fbs_id.ptr, addr, port);
    543539        if (a_enod_id < 0 || tnum_enodadr <= a_enod_id) {
     
    546542        }
    547543        else {
    548                 /* ‘—MŒ³ECHONETƒm[ƒh‚ð‹L˜^ */
     544                /* 送信元ECHONETノードを記録 */
    549545                a_fbs_id.ptr->hdr.sender.id = a_enod_id;
    550546        }
    551547        a_fbs_id.ptr->hdr.reply.id = a_fbs_id.ptr->hdr.sender.id;
    552548
    553         /* echonet_task‚É‘—‚é */
     549        /* echonet_taskに送る */
    554550        a_ret = snd_mbx(ecn_svc_mailboxid, (T_MSG *)a_fbs_id.ptr);
    555551        if (a_ret != E_OK) {
     
    564560
    565561/*
    566  *  ƒŠƒ‚[ƒgECHONETƒm[ƒh‚Ì“K‡Šm”F
     562 *  リモートECHONETノードの適合確認
    567563 */
    568564bool_t is_match(const EOBJCB *enodcb, T_EDATA *edata, const void *_ipaddr, uint16_t portno)
     
    582578                return false;
    583579
    584         /* ƒm[ƒhƒXƒ^[ƒgŽžƒCƒ“ƒXƒ^ƒ“ƒXƒŠƒXƒg’Ê’mˆÈŠO‚͏œŠO */
     580        /* ノードスタート時インスタンスリスト通知以外は除外 */
    585581        if (edata->hdr.edata.esv != ESV_INF
    586582                || edata->hdr.edata.deoj.eojx1 != EOJ_X1_PROFILE
     
    604600                }
    605601                ECN_DBG_PUT("is_match(): ecn_itr_nxt() result: epc=0x%02X, pdc=%d", epc, pdc);
    606                 /* ƒCƒ“ƒXƒ^ƒ“ƒXƒŠƒXƒg’Ê’m‚Ü‚½‚ÍŽ©ƒm[ƒhƒCƒ“ƒXƒ^ƒ“ƒXƒŠƒXƒg‚rˆÈŠO‚͏œŠO */
     602                /* インスタンスリスト通知または自ノードインスタンスリストS以外は除外 */
    607603                if ((epc != 0xD5) && (epc != 0xD6)) {
    608604                        continue;
    609605                }
    610606
    611                 /* ‚QƒoƒCƒg–ڈȍ~‚Éeoj‚ª—ñ‹“‚³‚ê‚Ä‚¢‚é */
     607                /* 2バイト目以降にeojが列挙されている */
    612608                count = (pdc - 1) / sizeof(T_ECN_EOJ);
    613609
    614                 /* ƒm[ƒh“à‚Ì‹@ŠíƒIƒuƒWƒFƒNƒg‚ðŒŸõ */
     610                /* ノード内の機器オブジェクトを検索 */
    615611                for (k = 0; k < enodcb->eobjcnt; k++) {
    616612                        p_eobj = enodcb->eobjs[k];
    617613
    618                         /* ƒCƒ“ƒXƒ^ƒ“ƒXƒŠƒXƒg‚ðŠm”F */
     614                        /* インスタンスリストを確認 */
    619615                        match = false;
    620616                        for (i = 0, j = 1; i < count; i++, j += sizeof(T_ECN_EOJ)) {
     
    634630                }
    635631
    636                 /* ‚·‚ׂđµ‚Á‚Ä‚¢‚½‚ç“K‡iƒCƒ“ƒXƒ^ƒ“ƒXƒŠƒXƒg‚Ì•û‚ª‘½‚­‚Ä‚à‚¢‚¢‚±‚Æ‚Æ‚·‚éj */
     632                /* すべて揃っていたら適合(インスタンスリストの方が多くてもいいこととする) */
    637633                return true;
    638634        }
     
    642638
    643639/*
    644  *  IPƒAƒhƒŒƒX‚©‚烊ƒ‚[ƒgECHONETƒm[ƒh‚Ö•ÏŠ·
     640 *  IPアドレスからリモートECHONETノードへ変換
    645641 */
    646642ECN_ENOD_ID udp_get_id(T_EDATA *edata, const ip_addr_t *ipaddr, uint16_t portno)
     
    654650                return ENOD_MULTICAST_ID;
    655651
    656         /* IPƒAƒhƒŒƒX‚Ì“¯‚¶‚à‚Ì‚ðŒŸõ */
     652        /* IPアドレスの同じものを検索 */
    657653        for (i = 0, ea = enodadrb_table; i < tnum_enodadr; i++, ea++) {
    658654                if (!ea->inuse)
     
    666662        }
    667663
    668         /* ‘Ήž‚·‚郊ƒ‚[ƒgƒm[ƒh‚ðŒŸõ */
     664        /* 対応するリモートノードを検索 */
    669665        for (i = ENOD_REMOTE_ID, ea = &enodadrb_table[ENOD_REMOTE_ID]; i < tnum_enodadr; i++, ea++) {
    670666                if (!ea->inuse)
     
    677673                        continue;
    678674
    679                 /* ‘Ήž‚·‚郊ƒ‚[ƒgƒm[ƒh‚ª‚ ‚ê‚ÎIPƒAƒhƒŒƒX‚ðÝ’è */
     675                /* 対応するリモートノードがあればIPアドレスを設定 */
    680676                *((ip_addr_t *)ea->ipaddr) = *ipaddr;
    681677
     
    685681        }
    686682
    687         /* ‹ó‚«—̈æ‚ð’T‚µ‚ÄŽ©“®“o˜^ */
     683        /* 空き領域を探して自動登録 */
    688684        for (i = ENOD_REMOTE_ID, ea = &enodadrb_table[ENOD_REMOTE_ID]; i < tnum_enodadr; i++, ea++) {
    689685                if (ea->inuse)
     
    702698
    703699/*
    704  *  ƒŠƒ‚[ƒgECHONETƒm[ƒh‚©‚çIPƒAƒhƒŒƒX‚Ö•ÏŠ·
     700 *  リモートECHONETノードからIPアドレスへ変換
    705701 */
    706702int udp_get_ip(T_IPV4EP *fp_ipep, ECN_ENOD_ID fa_enodid)
     
    714710
    715711        if (fa_enodid == ENOD_MULTICAST_ID) {
    716                 /* target‚ªENOD_MULTICAST_ID‚̏ꍇAƒ}ƒ‹ƒ`ƒLƒƒƒXƒg‚ðs‚¤ */
     712                /* targetがENOD_MULTICAST_IDの場合、マルチキャストを行う */
    717713                ip_addr_copy(fp_ipep->ipaddr, multicast);
    718714                return 0;       /* ok */
     
    720716
    721717        if (fa_enodid < ENOD_REMOTE_ID) {
    722                 /* target‚ª–¢’è‹`ELOCALEAPI‚̏ꍇAƒ[ƒJƒ‹”z‘—‚ðs‚¤ */
     718                /* targetが未定義・LOCAL・APIの場合、ローカル配送を行う */
    723719                ip_addr_copy(fp_ipep->ipaddr, localhost);
    724720                return 0;       /* ok */
Note: See TracChangeset for help on using the changeset viewer.