- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mrbgems/mruby-ecnl/src/echonet_lcl_task.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r270 r321 4 4 * Copyright (C) 2014-2016 Cores Co., Ltd. Japan 5 5 * 6 * ä¸è¨èä½æ¨©è 7 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 8 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 9 * å¤ã»åé 10 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 11 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 12 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 13 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 14 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 15 * ç¨ã§ããå½¢ã§åé 16 å¸ããå ´åã«ã¯ï¼åé 17 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 18 * è 19 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 20 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 21 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 22 * ç¨ã§ããªãå½¢ã§åé 23 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 24 * ã¨ï¼ 25 * (a) åé 26 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 27 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 28 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 29 * (b) åé 30 å¸ã®å½¢æ 31 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 32 * å ±åãããã¨ï¼ 33 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 34 * 害ãããï¼ä¸è¨èä½æ¨©è 35 ããã³TOPPERSããã¸ã§ã¯ããå 36 責ãããã¨ï¼ 37 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 38 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 39 ããã³TOPPERSããã¸ã§ã¯ãã 40 * å 41 責ãããã¨ï¼ 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 * 免責すること. 42 28 * 43 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 44 ã 45 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 46 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 47 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 48 * ã®è²¬ä»»ãè² ããªãï¼ 29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 33 * の責任を負わない. 49 34 * 50 35 */ 51 36 52 37 /* 53 * ECHONET Lite LCL éä¿¡å¦çã¿ã¹ã¯38 * ECHONET Lite LCL通信処理タスク 54 39 */ 55 40 … … 90 75 91 76 /* 92 * åä¿¡ããLCLãã¼ã¿ãMAILBOXã«éã77 * 受信したLCLデータをMAILBOXに送る 93 78 */ 94 79 ER _ecn_lcl2mbx(ecnl_svc_task_t *svc, const uint8_t *buffer, size_t fa_len, const mrb_value dst); … … 106 91 107 92 a_rcv_pkt.buffer = buffer; 108 if ( a_rcv_pkt.t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite è¦æ ¼*/109 || a_rcv_pkt.t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* é»æå½¢å¼1 */) {93 if ( a_rcv_pkt.t_esv->ecn_hdr.ehd1 != ECN_EDH1_ECHONET_LITE /* ECHONET Lite規格 */ 94 || a_rcv_pkt.t_esv->ecn_hdr.ehd2 != ECN_EDH2_FORMAT_1 /* 電文形式1 */) { 110 95 ECN_DBG_PUT_2("[LCL ECHO SRV] illegal type (0x%02X,0x%02X)", a_rcv_pkt.t_esv->ecn_hdr.ehd1, a_rcv_pkt.t_esv->ecn_hdr.ehd2); 111 96 return E_PAR; … … 130 115 a_fbs_id.ptr->hdr.sender.id = ENOD_NOT_MATCH_ID; 131 116 132 /* éä¿¡ã¬ã¤ã¤ã¼ã¢ãã¬ã¹ãããªã¢ã¼ãECHONETãã¼ãã¸å¤æ*/117 /* 通信レイヤーアドレスからリモートECHONETノードへ変換 */ 133 118 a_enod_id = lcl_get_id(svc, (T_EDATA *)a_fbs_id.ptr, dst); 134 119 if (!lcl_is_valid_addrid(svc, a_enod_id)) { … … 136 121 ip2str(NULL, &dst->lcladdr)); 137 122 } else { 138 /* éä¿¡å 139 ECHONETãã¼ããè¨é² */ 123 /* 送信元ECHONETノードを記録 */ 140 124 a_fbs_id.ptr->hdr.sender.id = a_enod_id; 141 125 } 142 126 a_fbs_id.ptr->hdr.reply.id = a_fbs_id.ptr->hdr.sender.id; 143 127 144 /* echonet_task ã«éã*/128 /* echonet_taskに送る */ 145 129 a_ret = ecn_fbs_enqueue(&svc->svc_mbxid, a_fbs_id.ptr); 146 130 if (a_ret != E_OK) { … … 155 139 156 140 /* 157 * ECHONET Lite éä¿¡ã¬ã¤ã¤ã¼ã¿ã¹ã¯ ã¿ã¤ãã¼å¤åå¾141 * ECHONET Lite 通信レイヤータスク タイマー値取得 158 142 */ 159 143 TMO echonet_lcltask_get_timer(ecnl_svc_task_t *svc) … … 168 152 169 153 /* 170 * ECHONET Lite éä¿¡ã¬ã¤ã¤ã¼ã¿ã¹ã¯ æéçµéå¦ç154 * ECHONET Lite 通信レイヤータスク 時間経過処理 171 155 */ 172 156 void echonet_lcltask_progress(ecnl_svc_task_t *svc, TMO a_timer) … … 176 160 177 161 /* 178 * ECHONET Lite éä¿¡ã¬ã¤ã¤ã¼ã¿ã¹ã¯ ã¡ãã»ã¼ã¸åä¿¡å¦ç162 * ECHONET Lite 通信レイヤータスク メッセージ受信処理 179 163 */ 180 164 void echonet_lcltask_recv_msg(ecnl_svc_task_t *svc, T_ECN_FST_BLK *p_msg) … … 185 169 a_fbs_id.ptr = p_msg; 186 170 187 /* éä¿¡ãã¼ã¿é·ãåå¾*/171 /* 送信データ長を取得 */ 188 172 a_snd_len = _ecn_fbs_get_datalen(a_fbs_id); 189 173 … … 191 175 192 176 switch (a_fbs_id.ptr->hdr.type) { 193 /* å 194 é¨ä½¿ç¨ã¡ãã»ã¼ã¸ */ 177 /* 内部使用メッセージ */ 195 178 case ECN_MSG_INTERNAL: 196 179 _ecn_int_msg(svc, a_fbs_id, a_snd_len); 197 180 break; 198 181 199 /* ECHONET ç¨ã¡ãã»ã¼ã¸*/182 /* ECHONET用メッセージ */ 200 183 case ECN_MSG_ECHONET: 201 184 _ecn_esv_msg(svc, a_fbs_id); … … 206 189 } 207 190 208 /* é å解æ¾*/191 /* 領域解放 */ 209 192 _ecn_fbs_del(svc->mrb, a_fbs_id); 210 193 } 211 194 212 195 /* 213 * ECHONET Lite éä¿¡ã¬ã¤ã¤ã¼ã¿ã¹ã¯ ã¿ã¤ã ã¢ã¦ãå¦ç196 * ECHONET Lite 通信レイヤータスク タイムアウト処理 214 197 */ 215 198 void echonet_lcltask_timeout(ecnl_svc_task_t *svc) … … 218 201 } 219 202 220 /* å¿çé»æç¨fbsè¨å®(sender/targetã®è¨å®) */203 /* 応答電文用fbs設定(sender/targetの設定) */ 221 204 static ER _ecn_lcl_cre_req_fbs(ecnl_svc_task_t *svc, T_ECN_FBS_QUEUE *sender, uint8_t cmd, ECN_FBS_ID *pk_req) 222 205 { … … 248 231 } 249 232 250 /* å¿çé»æç¨fbsè¨å®(sender/targetã®è¨å®) */233 /* 応答電文用fbs設定(sender/targetの設定) */ 251 234 static ER _ecn_lcl_cre_res_fbs(ecnl_svc_task_t *svc, ECN_FBS_ID req, uint8_t cmd, ECN_FBS_ID *pk_res) 252 235 { … … 279 262 280 263 /* 281 * å 282 é¨ã¡ãã»ã¼ã¸åä¿¡å¦ç 264 * 内部メッセージ受信処理 283 265 */ 284 266 void _ecn_int_msg(ecnl_svc_task_t *svc, ECN_FBS_ID fbs_id, ECN_FBS_SSIZE_T a_snd_len) … … 300 282 301 283 switch(cmd){ 302 // éä¿¡ã¬ã¤ã¤ã¼ã¢ãã¬ã¹ãè¿ä¿¡284 // 通信レイヤーアドレスを返信 303 285 case ECN_LCL_MSG_GET_LCLADDR_REQ: 304 286 if (a_snd_len < sizeof(msg)) { … … 370 352 371 353 /* 372 * ECHONET é»æåä¿¡å¦ç354 * ECHONET 電文受信処理 373 355 */ 374 356 void _ecn_esv_msg(ecnl_svc_task_t *svc, ECN_FBS_ID fbs_id) … … 381 363 ECN_FBS_SSIZE_T a_snd_len; 382 364 383 /* éä¿¡å 384 éä¿¡ã¬ã¤ã¤ã¼ã¢ãã¬ã¹ */ 365 /* 送信先通信レイヤーアドレス */ 385 366 a_dst = lcl_get_addr(svc, fbs_id.ptr->hdr.target.id); 386 367 if (mrb_type(a_dst) != MRB_TT_FALSE/*nil*/) { 387 ECN_DBG_PUT_4("[LCL TSK] echonet-node 0x%02X-0x%02X-0x%02X âlcl dest(%s)",368 ECN_DBG_PUT_4("[LCL TSK] echonet-node 0x%02X-0x%02X-0x%02X → lcl dest(%s)", 388 369 ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx1, 389 370 ((T_EDATA *)fbs_id.ptr)->hdr.edata.deoj.eojx2, … … 393 374 a_msg = mrb_str_buf_new(mrb, a_len); 394 375 395 /* fbs ããåºåé åã«ãã¼ã¿ãæ½åº*/376 /* fbsから出力領域にデータを抽出 */ 396 377 a_snd_len = 0; 397 378 a_ret = _ecn_fbs_get_data(mrb, fbs_id, RSTRING_PTR(a_msg), a_len, &a_snd_len); … … 402 383 RSTR_SET_LEN(RSTRING(a_msg), a_snd_len); 403 384 404 /* éä¿¡å 405 ã127.0.0.1 â mbxã«è»¢é */ 406 ECN_DBG_PUT_1("redirect svc->lcl_mbxid â svc->svc_mbxid (esv:0x%02X)", 385 /* 送信先が127.0.0.1 → mbxに転送 */ 386 ECN_DBG_PUT_1("redirect svc->lcl_mbxid → svc->svc_mbxid (esv:0x%02X)", 407 387 ((T_EDATA *)fbs_id.ptr)->hdr.edata.esv); 408 388 … … 420 400 _ecn_dbg_bindmp(RSTRING_PTR(a_msg), a_snd_len); 421 401 #endif 422 /* éä¿¡ã¬ã¤ã¤ã¼ã¸éä¿¡*/402 /* 通信レイヤーへ送信 */ 423 403 a_ret = lcl_snd_msg(svc, a_dst, a_msg); 424 404 if (a_ret < 0) { … … 427 407 } 428 408 429 /* ãã¼ã¿ãé·ããã¦1ãã±ããã«åã¾ããªãã£ãå ´å*/409 /* データが長すぎて1パケットに収まらなかった場合 */ 430 410 if (_ecn_fbs_exist_data(fbs_id)) { 431 411 ECN_DBG_PUT_1("[LCL TSK] send, data so long: %dbyte(s)", _ecn_fbs_get_datalen(fbs_id)); … … 440 420 441 421 /* 442 * ãã³ããããã³ã°ã³ã¼ã«ã®ã³ã¼ã«ããã¯é¢æ°422 * ノンブロッキングコールのコールバック関数 443 423 */ 444 424 ER echonet_lcl_input_msg(ecnl_svc_task_t *svc, mrb_value ep, mrb_value data) … … 452 432 453 433 /* 454 * ãªã¢ã¼ãECHONETãã¼ãã®é©å確èª434 * リモートECHONETノードの適合確認 455 435 */ 456 436 bool_t ecn_is_match(ecnl_svc_task_t *svc, const EOBJCB *enodcb, T_EDATA *edata, mrb_value ep) … … 470 450 return false; 471 451 472 /* ãã¼ãã¹ã¿ã¼ãæã¤ã³ã¹ã¿ã³ã¹ãªã¹ãéç¥ä»¥å¤ã¯é¤å¤*/452 /* ノードスタート時インスタンスリスト通知以外は除外 */ 473 453 if ( edata->hdr.edata.esv != ESV_INF 474 454 || edata->hdr.edata.deoj.eojx1 != EOJ_X1_PROFILE … … 492 472 } 493 473 ECN_DBG_PUT_2("ecn_is_match(): ecn_itr_nxt() result: epc=0x%02X, pdc=%d", epc, pdc); 494 /* ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãéç¥ã¾ãã¯èªãã¼ãã¤ã³ã¹ã¿ã³ã¹ãªã¹ãS以å¤ã¯é¤å¤*/474 /* インスタンスリスト通知または自ノードインスタンスリストS以外は除外 */ 495 475 if ((epc != 0xD5) && (epc != 0xD6)) { 496 476 continue; 497 477 } 498 478 499 /* ï¼ãã¤ãç®ä»¥éã«eojãåæããã¦ãã*/479 /* 2バイト目以降にeojが列挙されている */ 500 480 count = (pdc - 1) / sizeof(T_ECN_EOJ); 501 481 502 /* ãã¼ãå 503 ã®æ©å¨ãªãã¸ã§ã¯ããæ¤ç´¢ */ 482 /* ノード内の機器オブジェクトを検索 */ 504 483 for (k = 0; k < enodcb->eobjcnt; k++) { 505 484 p_eobj = enodcb->eobjs[k]; 506 485 507 /* ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãã確èª*/486 /* インスタンスリストを確認 */ 508 487 match = false; 509 488 for (i = 0, j = 1; i < count; i++, j += sizeof(T_ECN_EOJ)) { … … 523 502 } 524 503 525 /* ãã¹ã¦æã£ã¦ãããé©åï¼ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãã®æ¹ãå¤ãã¦ããããã¨ã¨ããï¼*/504 /* すべて揃っていたら適合(インスタンスリストの方が多くてもいいこととする) */ 526 505 return true; 527 506 } … … 531 510 532 511 /* 533 * éä¿¡ã¬ã¤ã¤ã¼ã¢ãã¬ã¹ãããªã¢ã¼ãECHONETãã¼ãã¸å¤æ512 * 通信レイヤーアドレスからリモートECHONETノードへ変換 534 513 */ 535 514 ECN_ENOD_ID lcl_get_id(ecnl_svc_task_t *svc, T_EDATA *edata, const mrb_value ep) … … 542 521 return ENOD_MULTICAST_ID; 543 522 544 /* éä¿¡ã¬ã¤ã¤ã¼ã¢ãã¬ã¹ã®åããã®ãæ¤ç´¢*/523 /* 通信レイヤーアドレスの同じものを検索 */ 545 524 if ((id = lcl_get_remote_id(svc, ep)) != ENOD_NOT_MATCH_ID) { 546 525 ECN_CAP_PUT_2("lcl_get_id(): ip-found remote(%d) = %s", … … 549 528 } 550 529 551 /* 対å¿ãããªã¢ã¼ããã¼ããããã°éä¿¡ã¬ã¤ã¤ã¼ã¢ãã¬ã¹ãè¨å®*/530 /* 対応するリモートノードがあれば通信レイヤーアドレスを設定 */ 552 531 if ((id = lcl_set_remote_addr(svc, edata, ep)) != ENOD_NOT_MATCH_ID) { 553 532 ECN_CAP_PUT_2("lcl_get_id(): enod-found remote(%d) = %s", … … 556 535 } 557 536 558 /* 空ãé åãæ¢ãã¦èªåç»é²*/537 /* 空き領域を探して自動登録 */ 559 538 if ((id = lcl_add_remote_addr(svc, edata, ep)) != ENOD_NOT_MATCH_ID) { 560 539 ECN_CAP_PUT_2("lcl_get_id(): empty-found remote(%d) = %s", … … 567 546 568 547 /* 569 * ãªã¢ã¼ãECHONETãã¼ãããéä¿¡ã¬ã¤ã¤ã¼ã¢ãã¬ã¹ã¸å¤æ548 * リモートECHONETノードから通信レイヤーアドレスへ変換 570 549 */ 571 550 mrb_value lcl_get_addr(ecnl_svc_task_t *svc, ECN_ENOD_ID fa_enodid) 572 551 { 573 552 if (fa_enodid == ENOD_MULTICAST_ID) { 574 /* target ãENOD_MULTICAST_IDã®å ´åããã«ããã£ã¹ããè¡ã*/553 /* targetがENOD_MULTICAST_IDの場合、マルチキャストを行う */ 575 554 return lcl_get_multicast_addr(svc); 576 555 } 577 556 578 557 if (fa_enodid < ENOD_REMOTE_ID) { 579 /* targetãæªå®ç¾©ã»LOCALã»APIã®å ´åããã¼ã«ã«é 580 éãè¡ã */ 558 /* targetが未定義・LOCAL・APIの場合、ローカル配送を行う */ 581 559 return lcl_get_local_addr(svc); 582 560 }
Note:
See TracChangeset
for help on using the changeset viewer.