Changeset 167 for UsbWattMeter/trunk/ecnl_lwip/echonet_task.c
- Timestamp:
- Mar 8, 2016, 8:37:45 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
UsbWattMeter/trunk/ecnl_lwip/echonet_task.c
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc; charset=SHIFT_JIS
r164 r167 4 4 * Copyright (C) 2014-2016 Cores Co., Ltd. Japan 5 5 * 6 * ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 7 * Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 8 * ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 9 * (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 10 * \¦C±Ìpð¨æÑºLÌ³ÛØKèªC»ÌÜÜÌ`Å\[ 11 * XR[hÉÜÜêĢ鱯D 12 * (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 13 * pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 14 gip 15 * Ò}j 16 AÈÇjÉCãLÌì \¦C±Ìpð¨æÑºL 17 * Ì³ÛØKèðfÚ·é±ÆD 18 * (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 19 * pūȢ`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 20 * ÆD 21 * (a) Äzzɺ¤hL 22 gipÒ}j 23 AÈÇjÉCãLÌ 24 * ì \¦C±Ìpð¨æÑºLÌ³ÛØKèðfÚ·é±ÆD 25 * (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 26 * ñ·é±ÆD 27 * (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 28 * Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 29 * ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 30 * RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 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 * 免責すること. 32 28 * 33 * {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨34 * æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI35 * ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF36 * AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»37 * ÌÓCðíÈ¢D29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 33 * の責任を負わない. 38 34 * 39 35 * @(#) $Id$ … … 41 37 42 38 /* 43 * ECHONET Lite ^XN39 * ECHONET Lite タスク 44 40 */ 45 41 … … 75 71 #endif /* ECHONET_TASK_TIMEOUT */ 76 72 77 /* AvP[Vªvµ½d¶ÌV[PXÔ*/73 /* アプリケーションが要求した電文のシーケンス番号 */ 78 74 static uint16_t g_api_tid; 79 75 80 /* óMbZ[WðJú·é©Û©*/76 /* 受信メッセージを開放するか否か */ 81 77 static bool_t g_release_esv; 82 78 … … 122 118 i += - ENOD_REMOTE_ID + 1; 123 119 if (from_app && (i < tnum_enodid)) { 124 /* ñ¯úÌ[gm[hÍT[rX^XNÅ·é*/120 /* 非同期のリモートノードはサービス処理タスクで処理する */ 125 121 switch (eobjcb_table[i].profile->eobjatr) { 126 122 case EOBJ_SYNC_REMOTE_NODE: … … 170 166 ECN_FBS_ID fa_fbs_id, ECN_FBS_ID *fa_fbs_anno); 171 167 172 /* W 173 [ú»tO */ 168 /* モジュール初期化フラグ */ 174 169 static uint8_t m_eobjlist_need_init = 1; 175 170 176 /* V[PXÔ*/171 /* シーケンス番号 */ 177 172 static uint16_t g_current_tid = 1; 178 173 179 174 /* 180 * ECHONET Lite ^XNÌú»iRXgN^j175 * ECHONET Lite タスクの初期化(コンストラクタ相当) 181 176 */ 182 177 void echonet_task_init(intptr_t exinf) … … 187 182 188 183 /* 189 * W 190 [ú» 184 * モジュール初期化 191 185 */ 192 186 static void _ecn_tsk_int_module_init(intptr_t exinf) … … 209 203 210 204 /* 211 * ECHONET Lite ^XNÌ{Ì205 * ECHONET Lite タスクの本体 212 206 */ 213 207 void echonet_task(intptr_t fa_exinf) … … 233 227 } 234 228 235 /* bZ[W[v*/229 /* メッセージループ */ 236 230 for (;;) { 237 231 a_prev = a_now; … … 271 265 272 266 switch (a_mdt.fbs_id.ptr->hdr.type) { 273 /* àgpbZ[W*/267 /* 内部使用メッセージ */ 274 268 case ECN_MSG_INTERNAL: 275 269 _ecn_tsk_int_msg(fa_exinf, a_mdt.fbs_id); 276 270 break; 277 271 278 /* ECHONET pbZ[W*/272 /* ECHONET用メッセージ */ 279 273 case ECN_MSG_ECHONET: 280 274 _ecn_tsk_ecn_msg(fa_exinf, a_mdt.fbs_id); … … 285 279 } 286 280 287 /* Ìæðú*/281 /* 領域解放 */ 288 282 if (g_release_esv) 289 283 _ecn_fbs_del(a_mdt.fbs_id); … … 298 292 299 293 /* 300 * V[PXÔ¶¬294 * シーケンス番号生成 301 295 */ 302 296 static uint16_t _ecn_tsk_new_tid(void) … … 306 300 307 301 /* 308 * vd¶ì¬309 * ø310 * ECN_FBS_ID *fp_fbs_id æ¾µ½FBS_IDÌi[æ311 * ID fa_seoj M³ÌECHONETIuWFNgID312 * ID fa_deoj ¶æÌECHONETIuWFNgID313 * uint8_t fa_epc vpeBR[h314 * uint8_t fa_pdc vpeBlf[^TCY315 * const void *p_edt vpeBlf[^316 * ECN_SRV_CODE fa_esv ECHONET Light T[rXR[h302 * 要求電文作成 303 * 引数 304 * ECN_FBS_ID *fp_fbs_id 取得したFBS_IDの格納先 305 * ID fa_seoj 送信元のECHONETオブジェクトID 306 * ID fa_deoj 宛先のECHONETオブジェクトID 307 * uint8_t fa_epc プロパティコード 308 * uint8_t fa_pdc プロパティ値データサイズ 309 * const void *p_edt プロパティ値データ 310 * ECN_SRV_CODE fa_esv ECHONET Light サービスコード 317 311 */ 318 312 ER _ecn_tsk_mk_esv(ECN_FBS_ID *fp_fbs_id, ID fa_seoj, ID fa_deoj, … … 321 315 ER a_ret; 322 316 int a_size, i; 323 ECN_FBS_ID a_fbs_id = { 0 }; /* vd¶p*/317 ECN_FBS_ID a_fbs_id = { 0 }; /* 要求電文用メモリ */ 324 318 T_ECN_EDT_HDR a_ecn_hdp; /* ecn_hdr+edata+ecn_prp 14byte */ 325 319 ID a_enodid; … … 328 322 329 323 if (!fp_fbs_id) 330 return E_PAR; /* æ¾µ½FBS_IDÌi[æªNULL */324 return E_PAR; /* 取得したFBS_IDの格納先がNULL */ 331 325 if (ECHONET_MEMPOOL_BLOCK_SIZE <= fa_pdc) 332 return E_PAR; /* vpeBlTCYªå«·¬é*/326 return E_PAR; /* プロパティ値サイズが大きすぎる */ 333 327 if (!p_edt && 0 < fa_pdc) 334 return E_PAR; /* vpeBlTCYª1ÈãÈÌÉf[^|C^ªNULL */328 return E_PAR; /* プロパティ値サイズが1以上なのにデータポインタがNULL */ 335 329 336 330 if (fa_seoj <= EOBJ_NULL || tmax_eobjid < fa_seoj) 337 return E_NOEXS; /* ECHONET IuWFNgIDª¢è`*/331 return E_NOEXS; /* ECHONETオブジェクトIDが未定義 */ 338 332 #ifndef ECHONET_CONTROLLER_EXTENTION 339 333 if (fa_deoj < EOBJ_NULL || tmax_eobjid < fa_deoj) 340 return E_NOEXS; /* ECHONET IuWFNgIDª¢è`*/334 return E_NOEXS; /* ECHONETオブジェクトIDが未定義 */ 341 335 #else 342 336 if (fa_deoj < EOBJ_NULL || (tmax_eobjid + TNUM_AEOBJID) < fa_deoj) 343 return E_NOEXS; /* ECHONET IuWFNgIDª¢è`*/337 return E_NOEXS; /* ECHONETオブジェクトIDが未定義 */ 344 338 #endif 345 339 if (fa_deoj == EOBJ_NULL && fa_esv == ESV_INFC) 346 return E_NOEXS; /* ECHONET IuWFNgIDª¢è`*/347 348 /* vŬTCYÌæ¾*/340 return E_NOEXS; /* ECHONETオブジェクトIDが未定義 */ 341 342 /* 要求最小サイズの取得 */ 349 343 a_size = sizeof(T_ECN_HDR) + sizeof(T_ECN_EDATA_BODY) + sizeof(T_ECN_PRP); 350 344 351 /* vd¶pÌæ¾*/345 /* 要求電文用メモリの取得 */ 352 346 a_ret = _ecn_fbs_cre(a_size, &a_fbs_id); 353 if (a_ret != E_OK || !a_fbs_id.ptr) { /* mÛ¸s*/347 if (a_ret != E_OK || !a_fbs_id.ptr) { /* 確保失敗 */ 354 348 ECN_DBG_PUT( "_ecn_fbs_cre(%d) result = %d:%s", 355 349 a_size, … … 358 352 } 359 353 360 /* vd¶Ýè*/354 /* 要求電文設定 */ 361 355 memset(&a_ecn_hdp, 0, sizeof(a_ecn_hdp)); 362 356 a_ecn_hdp.ecn_hdr.ehd1 = ECN_EDH1_ECHONET_LITE; … … 365 359 memcpy(&a_ecn_hdp.edata.seoj, &eobjinib_table[fa_seoj - 1].eojx1, sizeof(a_ecn_hdp.edata.seoj)); 366 360 a_ecn_hdp.edata.esv = fa_esv; 367 a_ecn_hdp.edata.opc = 1; /* vpeB*/368 a_ecn_hdp.ecn_prp.epc = fa_epc; /* vpeBR[h*/369 a_ecn_hdp.ecn_prp.pdc = fa_pdc; /* tf[^TCY*/370 371 /* vd¶pÉf[^ÇÁ*/361 a_ecn_hdp.edata.opc = 1; /* 処理プロパティ数 */ 362 a_ecn_hdp.ecn_prp.epc = fa_epc; /* プロパティコード */ 363 a_ecn_hdp.ecn_prp.pdc = fa_pdc; /* 付随データサイズ */ 364 365 /* 要求電文用メモリにデータ追加 */ 372 366 a_ret = _ecn_fbs_add_data_ex(a_fbs_id, &a_ecn_hdp, a_size); 373 367 if (a_ret) { … … 378 372 } 379 373 if (0 < fa_pdc) { 380 /* tf[^ÇÁ*/374 /* 付随データ追加 */ 381 375 a_ret = _ecn_fbs_add_data_ex(a_fbs_id, p_edt, fa_pdc); 382 376 if (a_ret) { … … 388 382 } 389 383 if (fa_deoj == 0) { 390 ECN_DBG_PUT( "%s", " }`LXg" );391 /* fa_deoj == 0 : }`LXg*/384 ECN_DBG_PUT( "%s", "マルチキャスト" ); 385 /* fa_deoj == 0 : マルチキャスト */ 392 386 ((T_EDATA *)a_fbs_id.ptr)->hdr.edata.deoj.eojx1 = EOJ_X1_PROFILE; 393 387 ((T_EDATA *)a_fbs_id.ptr)->hdr.edata.deoj.eojx2 = EOJ_X2_NODE_PROFILE; … … 397 391 else if (fa_deoj <= tmax_eobjid) { 398 392 ECN_DBG_PUT( "fa_deoj = %d", fa_deoj ); 399 /* if (fa_deoj < 1 || tmax_eobjid < fa_deoj) cÌÙínÍÖ`ªÅOÏÝÆ·é*/393 /* if (fa_deoj < 1 || tmax_eobjid < fa_deoj) …の異常系は関数冒頭で除外済みとする */ 400 394 a_eobj = &eobjinib_table[fa_deoj - 1]; 401 395 memcpy(&((T_EDATA *)a_fbs_id.ptr)->hdr.edata.deoj, &a_eobj->eojx1, 402 396 sizeof(((T_EDATA *)a_fbs_id.ptr)->hdr.edata.deoj)); 403 397 404 /* e[u©çõ*/398 /* テーブルから検索 */ 405 399 a_fbs_id.ptr->hdr.target.id = ENOD_NOT_MATCH_ID; 406 400 a_enodid = (a_eobj->enodid == 0) ? fa_deoj : a_eobj->enodid; … … 442 436 ECN_ENOD_ID enodid; 443 437 ECN_DBG_PUT( "fa_deoj = %d", fa_deoj ); 444 /* IuWFNgID©çEOJÆm[hIDðæ¾*/438 /* オブジェクトIDからEOJとノードIDを取得 */ 445 439 if(ecn_agent_get_eoj_enodid(fa_deoj, &eoj, &enodid)){ 446 440 memcpy(&((T_EDATA *)a_fbs_id.ptr)->hdr.edata.deoj, &eoj, … … 475 469 a_fbs_id.ptr->hdr.reply.id = ENOD_API_ID; 476 470 477 /* ³íI¹*/471 /* 正常終了 */ 478 472 *fp_fbs_id = a_fbs_id; 479 473 return E_OK; 480 474 481 475 lb_except: 482 /* f[^쬸sµ½çÌæðú*/476 /* データ作成失敗したら領域解放 */ 483 477 if (a_fbs_id.ptr) 484 478 _ecn_fbs_del(a_fbs_id); … … 488 482 489 483 /* 490 * àgpbZ[W484 * 内部使用メッセージ 491 485 */ 492 486 static void _ecn_tsk_int_msg(intptr_t fa_exinf, ECN_FBS_ID fa_fbs_id) … … 519 513 520 514 /* 521 * ^XNú»515 * タスク初期化 522 516 */ 523 517 static void _ecn_tsk_int_startup(intptr_t fa_exinf) … … 528 522 _ecn_tsk_int_module_init(fa_exinf); 529 523 530 /* CX^XXgÊmÌM*/524 /* インスタンスリスト通知の送信 */ 531 525 a_ret = _ecn_tsk_ntf_inl(fa_exinf); 532 526 if (a_ret) { … … 536 530 537 531 /* 538 * CX^XXgÊmÌM539 * ECHONET-Lite_Ver.1.10_02.pdf p.43 }4-1-4532 * インスタンスリスト通知の送信 533 * ECHONET-Lite_Ver.1.10_02.pdf p.43 図4-1-4 540 534 */ 541 535 ER _ecn_tsk_ntf_inl(intptr_t fa_exinf) 542 536 { 543 const T_ECN_EOJ a_seoj = /* 0x01 : êÊm[hA0x02FMêpm[h*/537 const T_ECN_EOJ a_seoj = /* 0x01 : 一般ノード、0x02:送信専用ノード */ 544 538 { EOJ_X1_PROFILE, EOJ_X2_NODE_PROFILE, 0x01 }; 545 539 const T_ECN_EOJ a_deoj = … … 551 545 int i; 552 546 uint8_t a_count; 553 const EOBJCB *enod = &eobjcb_table[0]; /* [Jm[h*/547 const EOBJCB *enod = &eobjcb_table[0]; /* ローカルノード */ 554 548 const EOBJINIB *eobj; 555 549 … … 569 563 570 564 if (!a_eoj_ct) { 571 /* mÛEwb_i[*/572 a_hdr.ecn_hdr.tid = (uint8_t)_ecn_tsk_new_tid(); /* V[PXÔ¶¬*/565 /* メモリ確保・ヘッダ格納 */ 566 a_hdr.ecn_hdr.tid = (uint8_t)_ecn_tsk_new_tid(); /* シーケンス番号生成 */ 573 567 a_ret = _ecn_fbs_cre(sizeof(a_hdr), &a_fbs); 574 if (a_ret != E_OK) /* mÛ¸s*/568 if (a_ret != E_OK) /* 確保失敗 */ 575 569 goto lb_except; 576 570 a_ret = _ecn_fbs_add_data(a_fbs, &a_hdr, sizeof(a_hdr)); 577 if (a_ret != E_OK) /* f[^ÇÁ¸s*/571 if (a_ret != E_OK) /* データ追加失敗 */ 578 572 goto lb_except; 579 573 … … 582 576 a_fbs.ptr->hdr.target.id = ENOD_MULTICAST_ID; 583 577 a_fbs.ptr->hdr.reply.id = ENOD_LOCAL_ID; 584 ((T_EDATA *)a_fbs.ptr)->hdr.ecn_prp.pdc = 1; /* */585 /* ði[*/578 ((T_EDATA *)a_fbs.ptr)->hdr.ecn_prp.pdc = 1; /* 件数 */ 579 /* 件数を格納 */ 586 580 a_count = (uint8_t)(enod->eobjcnt - i); 587 581 if (a_count >= ECN_IST_LST_EOJ_MAX_CT) 588 582 a_count = ECN_IST_LST_EOJ_MAX_CT; 589 583 a_ret = _ecn_fbs_add_data_ex(a_fbs, &a_count, sizeof(a_count)); 590 if (a_ret != E_OK) /* f[^ÇÁ¸s*/584 if (a_ret != E_OK) /* データ追加失敗 */ 591 585 goto lb_except; 592 586 } 593 /* ECHONET IuWFNgID(3byte)ði[*/587 /* ECHONETオブジェクトID(3byte)を格納 */ 594 588 a_ret = _ecn_fbs_add_data_ex(a_fbs, &eobj->eojx1, sizeof(T_ECN_EOJ)); 595 if (a_ret != E_OK) /* f[^ÇÁ¸s*/589 if (a_ret != E_OK) /* データ追加失敗 */ 596 590 goto lb_except; 597 591 598 /* EedtTCYÁZ*/592 /* 件数・edtサイズ加算 */ 599 593 ((T_EDATA *)a_fbs.ptr)->hdr.ecn_prp.pdc += sizeof(T_ECN_EOJ); 600 594 if (++a_eoj_ct < ECN_IST_LST_EOJ_MAX_CT) 601 595 continue; 602 596 603 /* 1 AiEXÅÌãÀÉBµ½çAêUM*/597 /* 1アナウンスでの上限に達したら、一旦送信 */ 604 598 a_ret = _ecn_tsk_snd_mbx(a_fbs, false); 605 if (a_ret != E_OK) /* f[^M¸s*/599 if (a_ret != E_OK) /* データ送信失敗 */ 606 600 goto lb_except; 607 601 a_eoj_ct = 0; … … 609 603 } 610 604 if (a_eoj_ct) { 611 /* ¢Mf[^ª Á½çAM*/605 /* 未送信データがあったら、送信 */ 612 606 a_ret = _ecn_tsk_snd_mbx(a_fbs, false); 613 if (a_ret != E_OK) /* f[^M¸s*/607 if (a_ret != E_OK) /* データ送信失敗 */ 614 608 goto lb_except; 615 609 a_fbs.ptr = 0; … … 655 649 656 650 /* 657 * 3byte ÌeobjidÅzñðõ·é651 * 3byteのeobjidで配列中を検索する 658 652 */ 659 653 const EOBJINIB *_ecn_eoj_fnd(const EOBJCB *fp_nod, const T_ECN_EOJ *fp_eoj) … … 691 685 692 686 /* 693 * ECHONET pbZ[W687 * ECHONET用メッセージ 694 688 */ 695 689 static void _ecn_tsk_ecn_msg(intptr_t fa_exinf, ECN_FBS_ID fa_fbs_id) … … 718 712 } 719 713 720 /* M¶©çm[hðõ*/714 /* 送信宛からノードを検索 */ 721 715 p_nod = _ecn_eno_fnd(fa_fbs_id.ptr->hdr.target.id); 722 /* M³©çm[hðõ*/716 /* 送信元からノードを検索 */ 723 717 p_snod = _ecn_eno_fnd(fa_fbs_id.ptr->hdr.sender.id); 724 718 if (p_snod != NULL) { 725 719 sobjatr = p_snod->profile->eobjatr; 726 /* m[hvt@CÌê*/720 /* ノードプロファイルの場合 */ 727 721 if ((p_esv->edata.seoj.eojx1 == EOJ_X1_PROFILE) 728 722 && (p_esv->edata.seoj.eojx2 == EOJ_X2_NODE_PROFILE)) { 729 723 p_sobj = p_snod->profile; 730 724 } 731 /* @íIuWFNgÌê*/725 /* 機器オブジェクトの場合 */ 732 726 else { 733 727 p_sobj = _ecn_eoj_fnd(p_snod, &p_esv->edata.seoj); … … 739 733 #endif 740 734 741 /* m[hàÌ@íIuWFNgðõ*/735 /* ノード内の機器オブジェクトを検索 */ 742 736 a_prc = false; 743 737 a_fwd = false; … … 745 739 eobjatr = p_nod->profile->eobjatr; 746 740 p_eoj = &p_esv->edata.deoj; 747 /* m[hvt@CÌê*/741 /* ノードプロファイルの場合 */ 748 742 if ((p_eoj->eojx1 == EOJ_X1_PROFILE) 749 743 && (p_eoj->eojx2 == EOJ_X2_NODE_PROFILE)) { 750 744 if ((p_eoj->eojx3 == p_nod->profile->eojx3) 751 745 || (p_eoj->eojx3 == 0)) { 752 /* d¶Às*/746 /* 電文処理実行 */ 753 747 if (_ecn_tsk_ecn_msg_main(fa_fbs_id, p_nod->profile, eobjatr, p_sobj, sobjatr) == 1) 754 748 a_fwd = true; 755 749 a_prc = true; 756 750 } 757 /* 0x74 vpeBlÊmivjÌêµ½±ÆÉ·é*/751 /* 0x74 プロパティ値通知(応答要)の場合処理したことにする */ 758 752 else if (p_esv->edata.esv == ESV_INFC) { 759 753 a_prc = true; 760 754 } 761 755 } 762 /* @íIuWFNgÌê*/756 /* 機器オブジェクトの場合 */ 763 757 else { 764 758 count = p_nod->eobjcnt; … … 779 773 if (p_obj->eojx2 != p_eoj->eojx2) 780 774 continue; 781 /* CX^XR[hªOÌêA¯¶NXÌSÄÌCX^X¶*/775 /* インスタンスコードが0の場合、同じクラスの全てのインスタンス宛 */ 782 776 if ((p_obj->eojx3 != p_eoj->eojx3) && (p_eoj->eojx3 != 0)) 783 777 continue; 784 778 785 /* d¶Às*/779 /* 電文処理実行 */ 786 780 if (_ecn_tsk_ecn_msg_main(fa_fbs_id, p_obj, eobjatr, p_sobj, sobjatr) == 1) 787 781 a_fwd = true; … … 790 784 } 791 785 } 792 /* @íIuWFNgª©Â©çÈ¢êÅà*/786 /* 機器オブジェクトが見つからない場合でも */ 793 787 if (!a_prc) { 794 /* d¶ÀsióMpj*/788 /* 電文処理実行(応答受信用) */ 795 789 if (_ecn_tsk_ecn_msg_main(fa_fbs_id, NULL, EPC_NONE, p_sobj, sobjatr) == 1) 796 790 a_fwd = true; 797 791 } 798 792 799 /* ÌêAvP[VÉ]·é*/793 /* 応答の場合アプリケーションに転送する */ 800 794 if (a_fwd && (p_esv->ecn_hdr.tid == g_api_tid)) { 801 795 g_release_esv = false; 802 796 803 ECN_CAP_PUT( "redirect ecn_svc_mailboxid ¨ecn_api_mailboxid (esv:0x%02X)",797 ECN_CAP_PUT( "redirect ecn_svc_mailboxid → ecn_api_mailboxid (esv:0x%02X)", 804 798 p_esv->edata.esv ); 805 799 fa_fbs_id.ptr->hdr.target.id = ENOD_API_ID; … … 826 820 827 821 switch (p_esv->edata.esv) { 828 /* 0x60 vpeBl«Ývisvj*/822 /* 0x60 プロパティ値書き込み要求(応答不要) */ 829 823 case ESV_SET_I: 830 824 if (!p_obj) { … … 838 832 break; 839 833 840 /* 0x61 vpeBl«Ývivj*/834 /* 0x61 プロパティ値書き込み要求(応答要) */ 841 835 case ESV_SET_C: 842 836 if (!p_obj) { … … 850 844 break; 851 845 852 /* 0x62 vpeBlÇÝoµv*/846 /* 0x62 プロパティ値読み出し要求 */ 853 847 case ESV_GET: 854 848 if (!p_obj) { … … 862 856 break; 863 857 864 /* 0x63 vpeBlÊmv*/858 /* 0x63 プロパティ値通知要求 */ 865 859 case ESV_INF_REQ: 866 860 if (!p_obj) { … … 875 869 break; 876 870 877 /* 0x6E vpeBl«ÝEÇÝoµv*/871 /* 0x6E プロパティ値書き込み・読み出し要求 */ 878 872 case ESV_SET_GET: 879 873 if (!p_obj) { … … 887 881 break; 888 882 889 /* 0x74 vpeBlÊmivj*/883 /* 0x74 プロパティ値通知(応答要) */ 890 884 case ESV_INFC: 891 885 if (!p_sobj) … … 898 892 break; 899 893 900 /* 0x60 vpeBl«Ývisvj*/901 case ESV_SET_I_SNA: /* 0x50 vpeBl«ÝvsÂ*/894 /* 0x60 プロパティ値書き込み要求(応答不要) */ 895 case ESV_SET_I_SNA: /* 0x50 プロパティ値書き込み要求不可応答 */ 902 896 result = 1; 903 897 break; 904 898 905 /* 0x61 vpeBl«Ývivj*/906 case ESV_SET_RES: /* 0x71 vpeBl«Ý*/907 case ESV_SET_C_SNA: /* 0x51 vpeBl«ÝvsÂ*/899 /* 0x61 プロパティ値書き込み要求(応答要) */ 900 case ESV_SET_RES: /* 0x71 プロパティ値書き込み応答 */ 901 case ESV_SET_C_SNA: /* 0x51 プロパティ値書き込み要求不可応答 */ 908 902 result = 1; 909 903 break; 910 904 911 /* 0x62 vpeBlÇÝoµv*/912 case ESV_GET_RES: /* 0x72 vpeBlÇÝoµ*/913 case ESV_GET_SNA: /* 0x52 vpeBlÇÝoµsÂ*/905 /* 0x62 プロパティ値読み出し要求 */ 906 case ESV_GET_RES: /* 0x72 プロパティ値読み出し応答 */ 907 case ESV_GET_SNA: /* 0x52 プロパティ値読み出し不可応答 */ 914 908 if (!p_sobj) { 915 909 ECN_DBG_PUT( "_ecn_tsk_ecn_msg_main() eoj %06X not found.", … … 922 916 break; 923 917 924 /* 0x63 vpeBlÊmv*/925 case ESV_INF: /* 0x73 vpeBlÊm*/926 case ESV_INF_SNA: /* 0x53 vpeBlÊmsÂ*/918 /* 0x63 プロパティ値通知要求 */ 919 case ESV_INF: /* 0x73 プロパティ値通知 */ 920 case ESV_INF_SNA: /* 0x53 プロパティ値通知不可応答 */ 927 921 if (!p_sobj) { 928 922 ECN_DBG_PUT( "_ecn_tsk_ecn_msg_main() eoj %06X not found.", … … 935 929 break; 936 930 937 /* 0x6E vpeBl«ÝEÇÝoµv*/938 case ESV_SET_GET_RES: /* 0x7E vpeBl«ÝEÇÝoµ*/939 case ESV_SET_GET_SNA: /* 0x5E vpeBl«ÝEÇÝoµsÂ*/931 /* 0x6E プロパティ値書き込み・読み出し要求 */ 932 case ESV_SET_GET_RES: /* 0x7E プロパティ値書き込み・読み出し応答 */ 933 case ESV_SET_GET_SNA: /* 0x5E プロパティ値書き込み・読み出し不可応答 */ 940 934 if (!p_sobj) { 941 935 ECN_DBG_PUT( "_ecn_tsk_ecn_msg_main() eoj %06X not found.", … … 948 942 break; 949 943 950 /* 0x74 vpeBlÊmivj*/951 case ESV_INFC_RES: /* 0x7A vpeBlÊm*/944 /* 0x74 プロパティ値通知(応答要) */ 945 case ESV_INFC_RES: /* 0x7A プロパティ値通知応答 */ 952 946 result = 1; 953 947 break; … … 959 953 } 960 954 961 /* vpeBÊmvðM*/955 /* プロパティ通知要求を送信 */ 962 956 if (a_fbs_anno.ptr != NULL) { 963 957 ER a_ret = _ecn_tsk_snd_mbx(a_fbs_anno, true); … … 1039 1033 1040 1034 /* 1041 * ECN_FBS_ID ©çT_ECN_PRP1Æ»Ìtf[^(edt)ðoµAedtÌ|C^ðÔ·1042 * ø1043 * ECN_FBS_ID fa_fbs_id ÇÝæéFBS1044 * T_ECN_PRP *fp_prp epc+pdc Ìi[æ1045 * uint8_t *fp_blk ìÆpÌ|C^1046 * ³íF|C^NG:01035 * ECN_FBS_IDからT_ECN_PRP1件とその付随データ(edt)を抽出し、edtのポインタを返す 1036 * 引数 1037 * ECN_FBS_ID fa_fbs_id 読み取るFBS 1038 * T_ECN_PRP *fp_prp epc+pdcの格納先 1039 * uint8_t *fp_blk 作業用メモリのポインタ 1040 * 正常:ポインタ NG:0 1047 1041 */ 1048 1042 static ID _ecn_tsk_get_prp_pce(ECN_FBS_ID fa_fbs_id, T_ECN_PRP *fp_prp, … … 1054 1048 memset(fp_blk, 0, sizeof(T_ECN_SUB_BLK)); 1055 1049 1056 /* T_ECN_PRP ª(epc,pdc)ðÇÝæé*/1050 /* T_ECN_PRP部分(epc,pdc)を読み取る */ 1057 1051 a_size = 0; 1058 1052 a_ret = _ecn_fbs_get_data(fa_fbs_id, fp_prp, sizeof(*fp_prp), &a_size); … … 1063 1057 1064 1058 if (0 < fp_prp->pdc) { 1065 /* tf[^ª(edt)ðÇÝæé*/1059 /* 付随データ部分(edt)を読み取る */ 1066 1060 a_size = 0; 1067 1061 a_ret = _ecn_fbs_get_data(fa_fbs_id, fp_blk, fp_prp->pdc, &a_size); … … 1078 1072 ECN_FBS_ID fa_fbs_id, ECN_FBS_ID a_fbs_res, ECN_FBS_ID *fa_fbs_anno, int a_count, 1079 1073 int *p_sw_ok); 1080 /* vpeBl«ÝÀs*/1074 /* プロパティ値書き込み実行 */ 1081 1075 static ER _ecn_tsk_eoj_set_main(const EOBJINIB *fp_obj, ATR fa_eobjatr, bool_t fa_fromapp, bool_t fa_update, 1082 1076 ECN_FBS_ID fa_fbs_id, ECN_FBS_ID a_fbs_res, ECN_FBS_ID *fa_fbs_anno, int a_count, … … 1094 1088 1095 1089 for (i = 0; i < a_count; i++) { 1096 /* ECN_FBS_ID ©çT_ECN_PRP1Æ»Ìtf[^ðoµA»Ì|C^ðÔ·*/1090 /* ECN_FBS_IDからT_ECN_PRP1件とその付随データを抽出し、そのポインタを返す */ 1097 1091 a_ret = _ecn_tsk_get_prp_pce(fa_fbs_id, &a_prp, p_edt); 1098 1092 if (a_ret != E_OK) { … … 1101 1095 } 1102 1096 1103 /* vpeBÌÝèset_prp(obj, reqp, resp) */1097 /* プロパティの設定 set_prp(obj, reqp, resp) */ 1104 1098 a_size = a_prp.pdc; 1105 /* obj,epc ÉηésetÖðÄÔ*/1099 /* obj,epcに対応するset関数を呼ぶ */ 1106 1100 a_eprp = _ecn_tsk_eoj_get_property(fp_obj, a_prp.epc); 1107 1101 if ((a_eprp != NULL) … … 1125 1119 fp_obj->eojx1 << 16 | fp_obj->eojx2 << 8 | fp_obj->eojx3, 1126 1120 a_prp.epc, p_edt[0], a_size ); 1127 *p_sw_ok = 0; /* vpeBÝè¸s*/1128 /* ÌêEDTÍÝèµÈ¢*/1121 *p_sw_ok = 0; /* プロパティ設定失敗 */ 1122 /* 応答処理の場合EDTは設定しない */ 1129 1123 if (fa_update) 1130 1124 a_prp.pdc = 0; 1131 1125 } 1132 1126 1133 /* d¶pÉf[^ÇÁ(epc,pdcÌ2byte) */1127 /* 応答電文用メモリにデータ追加(epc,pdcの2byte) */ 1134 1128 a_ret = _ecn_fbs_add_data_ex(a_fbs_res, &a_prp, sizeof(a_prp)); 1135 1129 if (a_ret) { … … 1139 1133 1140 1134 if (0 < a_prp.pdc) { 1141 /* d¶pÉf[^ÇÁ(edt n-byte) */1135 /* 応答電文用メモリにデータ追加(edt n-byte) */ 1142 1136 a_ret = _ecn_fbs_add_data_ex(a_fbs_res, p_edt, a_prp.pdc); 1143 1137 if (a_ret) { … … 1148 1142 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.opc ++; 1149 1143 1150 /* vpeBÊm èÌê*/1144 /* プロパティ通知ありの場合 */ 1151 1145 if (a_anno && (a_ans == a_size)) { 1152 1146 if (fa_fbs_anno->ptr == NULL) { … … 1171 1165 static ER _ecn_tsk_eoj_get_main(const EOBJINIB *fp_obj, ATR fa_eobjatr, bool_t fa_forward, ATR fa_access, 1172 1166 ECN_FBS_ID fa_fbs_id, ECN_FBS_ID a_fbs_res, int a_count, int *p_sw_ok); 1173 /* vpeBlÇÝoµÀs*/1167 /* プロパティ値読み出し実行 */ 1174 1168 static ER _ecn_tsk_eoj_get_main(const EOBJINIB *fp_obj, ATR fa_eobjatr, bool_t fa_forward, ATR fa_access, 1175 1169 ECN_FBS_ID fa_fbs_id, ECN_FBS_ID a_fbs_res, int a_count, int *p_sw_ok) 1176 1170 { 1177 uint8_t p_edt[256]; /* ìÆÌæ*/1171 uint8_t p_edt[256]; /* 作業領域 */ 1178 1172 const EPRPINIB *a_eprp; 1179 1173 ER a_ret = E_SYS; … … 1184 1178 1185 1179 for (i = 0; i < a_count; i++) { 1186 /* ECN_FBS_ID ©çT_ECN_PRP1Æ»Ìtf[^ðo*/1180 /* ECN_FBS_IDからT_ECN_PRP1件とその付随データを抽出 */ 1187 1181 a_ret = _ecn_tsk_get_prp_pce(fa_fbs_id, &a_prp, p_edt); 1188 1182 if (a_ret != E_OK) { … … 1191 1185 } 1192 1186 1193 /* vpeBÌæ¾get_eprp(obj, reqp, resp, size) */1187 /* プロパティの取得 get_eprp(obj, reqp, resp, size) */ 1194 1188 memset(p_edt, 0, sizeof(p_edt)); 1195 /* obj,epc ÉηégetÖðÄÔ*/1189 /* obj,epcに対応するget関数を呼ぶ */ 1196 1190 a_eprp = _ecn_tsk_eoj_get_property(fp_obj, a_prp.epc); 1197 1191 if ((a_eprp != NULL) && (((a_eprp->eprpatr & fa_access) != 0) && (fa_eobjatr == EOBJ_LOCAL_NODE) || fa_forward)) { … … 1204 1198 a_prp.pdc = (uint8_t)a_ans; 1205 1199 } else { 1206 *p_sw_ok = 0; /* vpeB澸s*/1200 *p_sw_ok = 0; /* プロパティ取得失敗 */ 1207 1201 a_ans = 0; 1208 1202 a_prp.pdc = 0; 1209 1203 } 1210 1204 1211 /* d¶pÉf[^ÇÁ(epc,pdcÌ2byte) */1205 /* 応答電文用メモリにデータ追加(epc,pdcの2byte) */ 1212 1206 a_ret = _ecn_fbs_add_data_ex(a_fbs_res, &a_prp, sizeof(a_prp)); 1213 1207 if (a_ret) { … … 1216 1210 } 1217 1211 if (0 < a_ans) { 1218 /* tf[^ÇÁ*/1212 /* 付随データ追加 */ 1219 1213 a_ret = _ecn_fbs_add_data_ex(a_fbs_res, p_edt, a_ans); 1220 1214 if (a_ret) { … … 1236 1230 1237 1231 static ER _ecn_tsk_eoj_res_main(ECN_FBS_ID fa_fbs_id, ECN_FBS_ID a_fbs_res, int a_count, int *p_sw_ok); 1238 /* vpeBlÇÝoµÀs*/1232 /* プロパティ値読み出し実行 */ 1239 1233 static ER _ecn_tsk_eoj_res_main(ECN_FBS_ID fa_fbs_id, ECN_FBS_ID a_fbs_res, int a_count, int *p_sw_ok) 1240 1234 { … … 1247 1241 1248 1242 for (i = 0; i < a_count; i++) { 1249 /* ECN_FBS_ID ©çT_ECN_PRP1Æ»Ìtf[^ðo*/1243 /* ECN_FBS_IDからT_ECN_PRP1件とその付随データを抽出 */ 1250 1244 a_ret = _ecn_tsk_get_prp_pce(fa_fbs_id, &a_prp, p_edt); 1251 1245 if (a_ret != E_OK) { … … 1256 1250 a_prp.pdc = 0; 1257 1251 1258 /* d¶pÉf[^ÇÁ(epc,pdcÌ2byte) */1252 /* 応答電文用メモリにデータ追加(epc,pdcの2byte) */ 1259 1253 a_ret = _ecn_fbs_add_data_ex(a_fbs_res, &a_prp, sizeof(a_prp)); 1260 1254 if (a_ret) { … … 1274 1268 } 1275 1269 1276 /* vpeBlÇÝòεÀs*/1270 /* プロパティ値読み飛ばし実行 */ 1277 1271 static ER _ecn_tsk_eoj_skip_main(const EOBJINIB *fp_obj, ECN_FBS_ID fa_fbs_id, 1278 1272 int a_count); … … 1285 1279 1286 1280 for (i = 0; i < a_count; i++) { 1287 /* T_ECN_PRP ª(epc,pdc)ðÇÝæé*/1281 /* T_ECN_PRP部分(epc,pdc)を読み取る */ 1288 1282 a_size = 0; 1289 1283 a_ret = _ecn_fbs_get_data(fa_fbs_id, &a_prp, sizeof(a_prp), &a_size); … … 1293 1287 } 1294 1288 1295 /* pdc ªÇÝòε*/1289 /* pdc分読み飛ばし */ 1296 1290 a_ret = _ecn_fbs_seek_rpos(fa_fbs_id, a_prp.pdc); 1297 1291 if (a_ret) { … … 1312 1306 static void _ecn_tsk_mk_rsp_hdr(const EOBJINIB *fp_obj, T_ECN_EDT_HDR *fp_rsp_esv, 1313 1307 T_ECN_EDT_HDR const *fp_req_esv); 1314 /* d¶Ýè*/1308 /* 応答電文設定 */ 1315 1309 static void _ecn_tsk_mk_rsp_hdr(const EOBJINIB *fp_obj, T_ECN_EDT_HDR *fp_rsp_esv, 1316 1310 T_ECN_EDT_HDR const *fp_req_esv) … … 1337 1331 } 1338 1332 1339 /* d¶pfbsÝè*/1333 /* 応答電文用fbs設定 */ 1340 1334 static void _ecn_tsk_set_rsp_fbs(ECN_FBS_ID fa_rsp_fbs, T_ECN_FST_BLK const *fp_req_ptr); 1341 /* d¶pfbsÝè(sender/targetÌÝè) */1335 /* 応答電文用fbs設定(sender/targetの設定) */ 1342 1336 static void _ecn_tsk_set_rsp_fbs(ECN_FBS_ID fa_rsp_fbs, T_ECN_FST_BLK const *fp_req_ptr) 1343 1337 { … … 1348 1342 } 1349 1343 1350 /* vpeBl«Ýv*/1344 /* プロパティ値書き込み要求 */ 1351 1345 static void _ecn_tsk_eoj_set(const EOBJINIB *fp_obj, ATR fa_eobjatr, bool_t fa_fromapp, bool_t fa_update, 1352 1346 ECN_FBS_ID fa_fbs_id, ECN_SRV_CODE fa_res_esv, ECN_SRV_CODE fa_sna_esv, … … 1363 1357 memset(&a_ecn_hdp, 0, sizeof(a_ecn_hdp)); 1364 1358 1365 /* ÅåTCYÌæ¾*/1359 /* 応答最大サイズの取得 */ 1366 1360 a_size = sizeof(T_ECN_HDR) + sizeof(T_ECN_EDATA_BODY) + sizeof(T_ECN_PRP); 1367 1361 1368 /* d¶pÌæ¾*/1362 /* 応答電文用メモリの取得 */ 1369 1363 a_ret = _ecn_fbs_cre(a_size, &a_fbs_res); 1370 if (a_ret != E_OK || !a_fbs_res.ptr) /* mÛ¸s*/1364 if (a_ret != E_OK || !a_fbs_res.ptr) /* 確保失敗 */ 1371 1365 return; 1372 1366 1373 /* d¶Ýè*/1367 /* 応答電文設定 */ 1374 1368 if(p_req_esv->edata.deoj.eojx3 != 0) 1375 1369 _ecn_tsk_mk_rsp_hdr_res(&a_ecn_hdp, p_req_esv); … … 1377 1371 _ecn_tsk_mk_rsp_hdr(fp_obj, &a_ecn_hdp, p_req_esv); 1378 1372 1379 /* ³íÌd¶ªvpeBlÊmÌê*/1373 /* 正常時の応答電文がプロパティ値通知応答の場合 */ 1380 1374 if (fa_res_esv == ESV_INFC_RES) { 1381 /* M³Æ¶æðüêÖ¦*/1375 /* 送信元と宛先を入れ替え */ 1382 1376 eoj = a_ecn_hdp.edata.seoj; 1383 1377 a_ecn_hdp.edata.seoj = a_ecn_hdp.edata.deoj; … … 1385 1379 } 1386 1380 1387 f_put_fbs_eoj("_ecn_tsk_eoj_set", "fa_fbs_id", fa_fbs_id); /* s/deoj fobOoÍ*/1388 1389 /* d¶pÉf[^ÇÁ*/1381 f_put_fbs_eoj("_ecn_tsk_eoj_set", "fa_fbs_id", fa_fbs_id); /* s/deoj デバッグ出力 */ 1382 1383 /* 応答電文用メモリにデータ追加 */ 1390 1384 a_ret = _ecn_fbs_add_data_ex(a_fbs_res, &a_ecn_hdp, 1391 1385 sizeof(a_ecn_hdp.ecn_hdr) + sizeof(a_ecn_hdp.edata)); … … 1393 1387 goto lb_except; 1394 1388 1395 /* payload æªÌT_ECN_HDR(ecn_hdr), T_ECN_EDATA_BODY(edata)ðÇÝòη*/1389 /* payload先頭のT_ECN_HDR(ecn_hdr), T_ECN_EDATA_BODY(edata)を読み飛ばす */ 1396 1390 a_ret = _ecn_fbs_set_rpos(fa_fbs_id, offsetof(T_ECN_EDT_HDR, ecn_prp)); 1397 1391 if (a_ret) 1398 1392 goto lb_except; 1399 1393 1400 /* d¶pfbsÝè*/1394 /* 応答電文用fbs設定 */ 1401 1395 _ecn_tsk_set_rsp_fbs(a_fbs_res, fa_fbs_id.ptr); 1402 1396 1403 /* vpeBl«ÝÀs*/1397 /* プロパティ値書き込み実行 */ 1404 1398 a_ret = _ecn_tsk_eoj_set_main(fp_obj, fa_eobjatr, fa_fromapp, fa_update, fa_fbs_id, a_fbs_res, 1405 1399 fa_fbs_anno, p_req_esv->edata.opc, &a_sw_ok); … … 1407 1401 goto lb_except; 1408 1402 1409 /* vÌê*/1403 /* 応答要の場合 */ 1410 1404 if (a_sw_ok) { 1411 1405 if (!fa_res_esv) { 1412 /* svÌê*/1406 /* 応答不要の場合 */ 1413 1407 _ecn_fbs_del(a_fbs_res); 1414 1408 goto lb_finally; 1415 1409 } 1416 /* Ýè¬÷*/1410 /* 設定処理成功 */ 1417 1411 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.esv = fa_res_esv; 1418 1412 } else { 1419 1413 if (!fa_sna_esv) { 1420 /* svÌê*/1414 /* 応答不要の場合 */ 1421 1415 _ecn_fbs_del(a_fbs_res); 1422 1416 goto lb_finally; 1423 1417 } 1424 /* Ýè¸s*/1418 /* 設定処理失敗 */ 1425 1419 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.esv = fa_sna_esv; 1426 1420 } 1427 /* M*/1421 /* 応答送信 */ 1428 1422 a_ret = _ecn_tsk_snd_mbx(a_fbs_res, false); 1429 1423 if (a_ret == E_OK) … … 1431 1425 1432 1426 lb_except: 1433 /* f[^M¸sµ½çÌæðú*/1427 /* データ送信失敗したら領域解放 */ 1434 1428 if (a_fbs_res.ptr) 1435 1429 _ecn_fbs_del(a_fbs_res); … … 1439 1433 } 1440 1434 1441 /* vpeBlÇÝoµv*/1435 /* プロパティ値読み出し要求 */ 1442 1436 static void _ecn_tsk_eoj_get(const EOBJINIB *fp_obj, ATR fa_eobjatr, bool_t fa_forward, ATR fa_access, 1443 1437 ECN_FBS_ID fa_fbs_id, ECN_SRV_CODE fa_res_esv, ECN_SRV_CODE fa_sna_esv) … … 1452 1446 memset(&a_ecn_hdp, 0, sizeof(a_ecn_hdp)); 1453 1447 1454 /* úæ¾TCY*/1448 /* 初期取得サイズ */ 1455 1449 a_size = sizeof(T_ECN_HDR) + sizeof(T_ECN_EDATA_BODY) + sizeof(T_ECN_PRP); 1456 1450 1457 /* d¶pÌæ¾*/1451 /* 応答電文用メモリの取得 */ 1458 1452 a_ret = _ecn_fbs_cre(a_size, &a_fbs_res); 1459 if (a_ret != E_OK || !a_fbs_res.ptr) { /* mÛ¸s*/1453 if (a_ret != E_OK || !a_fbs_res.ptr) { /* 確保失敗 */ 1460 1454 ECN_DBG_PUT( "_ecn_fbs_cre() result = %d:%s", a_ret, itron_strerror(a_ret) ); 1461 1455 goto lb_finally; 1462 1456 } 1463 1457 1464 /* d¶Ýè*/1458 /* 応答電文設定 */ 1465 1459 if(p_req_esv->edata.deoj.eojx3 != 0) 1466 1460 _ecn_tsk_mk_rsp_hdr_res(&a_ecn_hdp, p_req_esv); … … 1468 1462 _ecn_tsk_mk_rsp_hdr(fp_obj, &a_ecn_hdp, p_req_esv); 1469 1463 1470 f_put_fbs_eoj("_ecn_tsk_eoj_get", "fa_fbs_id", fa_fbs_id); /* s/deoj fobOoÍ*/1471 1472 /* d¶pÉf[^ÇÁ*/1464 f_put_fbs_eoj("_ecn_tsk_eoj_get", "fa_fbs_id", fa_fbs_id); /* s/deoj デバッグ出力 */ 1465 1466 /* 応答電文用メモリにデータ追加 */ 1473 1467 a_ret = _ecn_fbs_add_data_ex(a_fbs_res, &a_ecn_hdp, 1474 1468 sizeof(a_ecn_hdp.ecn_hdr) + sizeof(a_ecn_hdp.edata)); … … 1478 1472 } 1479 1473 1480 /* payload æªÌT_ECN_HDR(ecn_hdr), T_ECN_EDATA_BODY(edata)ðÇÝòη*/1474 /* payload先頭のT_ECN_HDR(ecn_hdr), T_ECN_EDATA_BODY(edata)を読み飛ばす */ 1481 1475 a_ret = _ecn_fbs_set_rpos(fa_fbs_id, offsetof(T_ECN_EDT_HDR, ecn_prp)); 1482 1476 if (a_ret) { … … 1485 1479 } 1486 1480 1487 /* d¶pfbsÝè*/1481 /* 応答電文用fbs設定 */ 1488 1482 _ecn_tsk_set_rsp_fbs(a_fbs_res, fa_fbs_id.ptr); 1489 1483 1490 /* vpeBlÇÝÝÀs*/1484 /* プロパティ値読み込み実行 */ 1491 1485 a_ret = _ecn_tsk_eoj_get_main(fp_obj, fa_eobjatr, fa_forward, fa_access, fa_fbs_id, a_fbs_res, 1492 1486 ((T_EDATA *)fa_fbs_id.ptr)->hdr.edata.opc, &a_sw_ok); … … 1498 1492 if (a_sw_ok) { 1499 1493 if (!fa_res_esv) { 1500 /* svÌê*/1494 /* 応答不要の場合 */ 1501 1495 _ecn_fbs_del(a_fbs_res); 1502 1496 goto lb_finally; 1503 1497 } 1504 /* Ýè¬÷*/1498 /* 設定処理成功 */ 1505 1499 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.esv = fa_res_esv; 1506 1500 } else { 1507 1501 if (!fa_sna_esv) { 1508 /* svÌê*/1502 /* 応答不要の場合 */ 1509 1503 _ecn_fbs_del(a_fbs_res); 1510 1504 goto lb_finally; 1511 1505 } 1512 /* Ýè¸s*/1506 /* 設定処理失敗 */ 1513 1507 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.esv = fa_sna_esv; 1514 1508 } 1515 /* M*/1509 /* 応答送信 */ 1516 1510 a_ret = _ecn_tsk_snd_mbx(a_fbs_res, false); 1517 1511 if (a_ret != E_OK) { … … 1522 1516 1523 1517 lb_except: 1524 /* f[^M¸sµ½çÌæðú*/1518 /* データ送信失敗したら領域解放 */ 1525 1519 if (a_fbs_res.ptr) 1526 1520 _ecn_fbs_del(a_fbs_res); … … 1530 1524 } 1531 1525 1532 /* vpeBlÇÝoµv*/1526 /* プロパティ値読み出し要求 */ 1533 1527 static void _ecn_tsk_eoj_res(ECN_FBS_ID fa_fbs_id, ECN_SRV_CODE fa_res_esv, 1534 1528 ECN_SRV_CODE fa_sna_esv) … … 1543 1537 memset(&a_ecn_hdp, 0, sizeof(a_ecn_hdp)); 1544 1538 1545 /* úæ¾TCY*/1539 /* 初期取得サイズ */ 1546 1540 a_size = sizeof(T_ECN_HDR) + sizeof(T_ECN_EDATA_BODY) + sizeof(T_ECN_PRP); 1547 1541 1548 /* d¶pÌæ¾*/1542 /* 応答電文用メモリの取得 */ 1549 1543 a_ret = _ecn_fbs_cre(a_size, &a_fbs_res); 1550 if (a_ret != E_OK || !a_fbs_res.ptr) { /* mÛ¸s*/1544 if (a_ret != E_OK || !a_fbs_res.ptr) { /* 確保失敗 */ 1551 1545 ECN_DBG_PUT( "_ecn_fbs_cre() result = %d:%s", a_ret, itron_strerror(a_ret) ); 1552 1546 goto lb_finally; 1553 1547 } 1554 1548 1555 /* d¶Ýè*/1549 /* 応答電文設定 */ 1556 1550 _ecn_tsk_mk_rsp_hdr_res(&a_ecn_hdp, p_req_esv); 1557 1551 1558 f_put_fbs_eoj("_ecn_tsk_eoj_res", "fa_fbs_id", fa_fbs_id); /* s/deoj fobOoÍ*/1559 1560 /* d¶pÉf[^ÇÁ*/1552 f_put_fbs_eoj("_ecn_tsk_eoj_res", "fa_fbs_id", fa_fbs_id); /* s/deoj デバッグ出力 */ 1553 1554 /* 応答電文用メモリにデータ追加 */ 1561 1555 a_ret = _ecn_fbs_add_data_ex(a_fbs_res, &a_ecn_hdp, 1562 1556 sizeof(a_ecn_hdp.ecn_hdr) + sizeof(a_ecn_hdp.edata)); … … 1566 1560 } 1567 1561 1568 /* payload æªÌT_ECN_HDR(ecn_hdr), T_ECN_EDATA_BODY(edata)ðÇÝòη*/1562 /* payload先頭のT_ECN_HDR(ecn_hdr), T_ECN_EDATA_BODY(edata)を読み飛ばす */ 1569 1563 a_ret = _ecn_fbs_set_rpos(fa_fbs_id, offsetof(T_ECN_EDT_HDR, ecn_prp)); 1570 1564 if (a_ret) { … … 1573 1567 } 1574 1568 1575 /* d¶pfbsÝè*/1569 /* 応答電文用fbs設定 */ 1576 1570 _ecn_tsk_set_rsp_fbs(a_fbs_res, fa_fbs_id.ptr); 1577 1571 1578 /* vpeBlÇÝÝÀs*/1572 /* プロパティ値読み込み実行 */ 1579 1573 a_ret = _ecn_tsk_eoj_res_main(fa_fbs_id, a_fbs_res, 1580 1574 ((T_EDATA *)fa_fbs_id.ptr)->hdr.edata.opc, &a_sw_ok); … … 1586 1580 if (a_sw_ok) { 1587 1581 if (!fa_res_esv) { 1588 /* svÌê*/1582 /* 応答不要の場合 */ 1589 1583 _ecn_fbs_del(a_fbs_res); 1590 1584 goto lb_finally; 1591 1585 } 1592 /* Ýè¬÷*/1586 /* 設定処理成功 */ 1593 1587 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.esv = fa_res_esv; 1594 1588 } else { 1595 1589 if (!fa_sna_esv) { 1596 /* svÌê*/1590 /* 応答不要の場合 */ 1597 1591 _ecn_fbs_del(a_fbs_res); 1598 1592 goto lb_finally; 1599 1593 } 1600 /* Ýè¸s*/1594 /* 設定処理失敗 */ 1601 1595 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.esv = fa_sna_esv; 1602 1596 } 1603 /* M*/1597 /* 応答送信 */ 1604 1598 a_ret = _ecn_tsk_snd_mbx(a_fbs_res, false); 1605 1599 if (a_ret != E_OK) { … … 1610 1604 1611 1605 lb_except: 1612 /* f[^M¸sµ½çÌæðú*/1606 /* データ送信失敗したら領域解放 */ 1613 1607 if (a_fbs_res.ptr) 1614 1608 _ecn_fbs_del(a_fbs_res); … … 1625 1619 T_ECN_EDT_HDR a_ecn_hdp; 1626 1620 ECN_FBS_ID a_fbs_res = { 0 }; 1627 int a_rdprp_wrpos; /* vpeBÇÝÝ«ÝÌwbhÊu*/1621 int a_rdprp_wrpos; /* プロパティ読み込み件数書き込み時のヘッド位置 */ 1628 1622 ER a_ret; 1629 1623 int i, a_size, a_rdlen; 1630 1624 int a_sw_ok = 1; 1631 int a_count = ((T_EDATA *)fa_fbs_id.ptr)->hdr.edata.opc; /* vpeB*/1625 int a_count = ((T_EDATA *)fa_fbs_id.ptr)->hdr.edata.opc; /* 処理プロパティ数 */ 1632 1626 1633 1627 memset(&a_ecn_hdp, 0, sizeof(a_ecn_hdp)); … … 1636 1630 fp_obj->eojx1 << 16 | fp_obj->eojx2 << 8 | fp_obj->eojx3 ); 1637 1631 1638 /* úæ¾TCY*/1632 /* 初期取得サイズ */ 1639 1633 a_size = sizeof(T_ECN_HDR) + sizeof(T_ECN_EDATA_BODY) + sizeof(T_ECN_PRP); 1640 1634 1641 /* d¶pÌæ¾*/1635 /* 応答電文用メモリの取得 */ 1642 1636 a_ret = _ecn_fbs_cre(a_size, &a_fbs_res); 1643 if (a_ret != E_OK || !a_fbs_res.ptr) /* mÛ¸s*/1637 if (a_ret != E_OK || !a_fbs_res.ptr) /* 確保失敗 */ 1644 1638 goto lb_finally; 1645 1639 1646 /* d¶Ýè*/1640 /* 応答電文設定 */ 1647 1641 if(p_req_esv->edata.deoj.eojx3 != 0) 1648 1642 _ecn_tsk_mk_rsp_hdr_res(&a_ecn_hdp, p_req_esv); … … 1651 1645 a_size -= sizeof(T_ECN_HDR) + sizeof(T_ECN_EDATA_BODY); 1652 1646 1653 f_put_fbs_eoj("_ecn_tsk_eoj_set_get", "fa_fbs_id", fa_fbs_id); /* s/deoj fobOoÍ*/1654 1655 /* d¶pÉf[^ÇÁ*/1647 f_put_fbs_eoj("_ecn_tsk_eoj_set_get", "fa_fbs_id", fa_fbs_id); /* s/deoj デバッグ出力 */ 1648 1649 /* 応答電文用メモリにデータ追加 */ 1656 1650 a_ret = _ecn_fbs_add_data_ex(a_fbs_res, &a_ecn_hdp, 1657 1651 sizeof(a_ecn_hdp.ecn_hdr) + sizeof(a_ecn_hdp.edata)); … … 1659 1653 goto lb_except; 1660 1654 1661 /* payload æªÌT_ECN_HDR(ecn_hdr), T_ECN_EDATA_BODY(edata)ðÇÝòη*/1655 /* payload先頭のT_ECN_HDR(ecn_hdr), T_ECN_EDATA_BODY(edata)を読み飛ばす */ 1662 1656 a_ret = _ecn_fbs_set_rpos(fa_fbs_id, offsetof(T_ECN_EDT_HDR, ecn_prp)); 1663 1657 if (a_ret) 1664 1658 goto lb_except; 1665 1659 1666 /* d¶pfbsÝè*/1660 /* 応答電文用fbs設定 */ 1667 1661 _ecn_tsk_set_rsp_fbs(a_fbs_res, fa_fbs_id.ptr); 1668 1662 1669 /* vpeBl«ÝÀs*/1663 /* プロパティ値書き込み実行 */ 1670 1664 a_ret = _ecn_tsk_eoj_set_main(fp_obj, fa_eobjatr, fa_fromapp, false, fa_fbs_id, a_fbs_res, 1671 1665 fa_fbs_anno, a_count, &a_sw_ok); … … 1680 1674 (a_sw_ok ? "true" : "false") ); 1681 1675 1682 /* ÌðÇÝæé(1byte) */1683 /* ¨ECHONET-Lite_Ver.1.10_02.pdf p.40 [OPCGet] */1676 /* 次の件数を読み取る(1byte) */ 1677 /* → ECHONET-Lite_Ver.1.10_02.pdf p.40 [OPCGet] */ 1684 1678 a_rdlen = i = 0; 1685 1679 a_ret = _ecn_fbs_get_data(fa_fbs_id, &i, 1, &a_rdlen); … … 1688 1682 a_count = *(uint8_t *)&i; 1689 1683 1690 /* vpeBÇÝÝ«ÝÌwbhîñðL^*/1684 /* プロパティ読み込み件数書き込み時のヘッド情報を記録 */ 1691 1685 a_rdprp_wrpos = _ecn_fbs_get_datalen(a_fbs_res); 1692 1686 1693 /* d¶pÉf[^ÇÁ(OPCGet 1byte) */1687 /* 応答電文用メモリにデータ追加 (OPCGet 1byte) */ 1694 1688 a_ret = _ecn_fbs_add_data_ex(a_fbs_res, &i, 1); 1695 1689 if (a_ret) 1696 1690 goto lb_except; 1697 1691 1698 /* ±Ì_ÅÌd¶vpeBðL^*/1692 /* この時点での応答電文中プロパティ件数を記録 */ 1699 1693 i = ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.opc; 1700 1694 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.opc = 0; 1701 1695 1702 /* vpeBlÇÝÝÀs*/1696 /* プロパティ値読み込み実行 */ 1703 1697 a_ret = _ecn_tsk_eoj_get_main(fp_obj, fa_eobjatr, false, EPC_RULE_GET, fa_fbs_id, a_fbs_res, 1704 1698 a_count, &a_sw_ok); … … 1714 1708 (a_sw_ok ? "true" : "false") ); 1715 1709 1716 /* vpeBÇÝÝ«ÝÌwbhîñÅAÇÝoµðL^*/1710 /* プロパティ読み込み件数書き込み時のヘッド情報で、読み出し件数を記録 */ 1717 1711 _ecn_fbs_poke(a_fbs_res, a_rdprp_wrpos, ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.opc); 1718 1712 1719 /* L^µÄ¨¢½vpeBi«Ýjð«ß·*/1713 /* 記録しておいたプロパティ件数(書き込み件数)を書き戻す */ 1720 1714 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.opc = (uint8_t)i; 1721 1715 1722 /* vÌê*/1716 /* 応答要の場合 */ 1723 1717 if (a_sw_ok) { 1724 /* Ýè¬÷*/1718 /* 設定処理成功 */ 1725 1719 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.esv = fa_res_esv; 1726 1720 } else { 1727 /* Ýè¸s*/1721 /* 設定処理失敗 */ 1728 1722 ((T_EDATA *)a_fbs_res.ptr)->hdr.edata.esv = fa_sna_esv; 1729 1723 } 1730 /* M*/1724 /* 応答送信 */ 1731 1725 a_ret = _ecn_tsk_snd_mbx(a_fbs_res, false); 1732 1726 if (a_ret == E_OK) … … 1734 1728 1735 1729 lb_except: 1736 /* f[^M¸sµ½çÌæðú*/1730 /* データ送信失敗したら領域解放 */ 1737 1731 if (a_fbs_res.ptr) 1738 1732 _ecn_fbs_del(a_fbs_res); … … 1751 1745 int i, a_size, a_rdlen; 1752 1746 int a_sw_ok = 1; 1753 int a_count = ((T_EDATA *)fa_fbs_id.ptr)->hdr.edata.opc; /* vpeB*/1747 int a_count = ((T_EDATA *)fa_fbs_id.ptr)->hdr.edata.opc; /* 処理プロパティ数 */ 1754 1748 1755 1749 memset(&a_ecn_hdp, 0, sizeof(a_ecn_hdp)); … … 1758 1752 fp_obj->eojx1 << 16 | fp_obj->eojx2 << 8 | fp_obj->eojx3 ); 1759 1753 1760 /* úæ¾TCY*/1754 /* 初期取得サイズ */ 1761 1755 a_size = sizeof(T_ECN_HDR) + sizeof(T_ECN_EDATA_BODY) + sizeof(T_ECN_PRP); 1762 1756 1763 /* d¶pi_~[jÌæ¾*/1757 /* 応答電文用メモリ(ダミー)の取得 */ 1764 1758 a_ret = _ecn_fbs_cre(a_size, &a_fbs_dmy); 1765 if (a_ret != E_OK || !a_fbs_dmy.ptr) /* mÛ¸s*/1759 if (a_ret != E_OK || !a_fbs_dmy.ptr) /* 確保失敗 */ 1766 1760 goto lb_finally; 1767 1761 1768 /* d¶Ýè*/1762 /* 応答電文設定 */ 1769 1763 _ecn_tsk_mk_rsp_hdr_res(&a_ecn_hdp, p_req_esv); 1770 1764 a_size -= sizeof(T_ECN_HDR) + sizeof(T_ECN_EDATA_BODY); 1771 1765 1772 /* payload æªÌT_ECN_HDR(ecn_hdr), T_ECN_EDATA_BODY(edata)ðÇÝòη*/1766 /* payload先頭のT_ECN_HDR(ecn_hdr), T_ECN_EDATA_BODY(edata)を読み飛ばす */ 1773 1767 a_ret = _ecn_fbs_set_rpos(fa_fbs_id, offsetof(T_ECN_EDT_HDR, ecn_prp)); 1774 1768 if (a_ret) 1775 1769 goto lb_except; 1776 1770 1777 /* vpeBl«ÝÇÝòεÀs*/1771 /* プロパティ値書き込み応答読み飛ばし実行 */ 1778 1772 a_ret = _ecn_tsk_eoj_skip_main(fp_obj, fa_fbs_id, a_count); 1779 1773 if (a_ret) { … … 1787 1781 (a_sw_ok ? "true" : "false") ); 1788 1782 1789 /* ÌðÇÝæé(1byte) */1790 /* ¨ECHONET-Lite_Ver.1.10_02.pdf p.40 [OPCGet] */1783 /* 次の件数を読み取る(1byte) */ 1784 /* → ECHONET-Lite_Ver.1.10_02.pdf p.40 [OPCGet] */ 1791 1785 a_rdlen = i = 0; 1792 1786 a_ret = _ecn_fbs_get_data(fa_fbs_id, &i, 1, &a_rdlen); … … 1795 1789 a_count = *(uint8_t *)&i; 1796 1790 1797 /* vpeBlÇÝoµÌ«ÝÀs*/1791 /* プロパティ値読み出し応答の書き込み実行 */ 1798 1792 a_ret = _ecn_tsk_eoj_set_main(fp_obj, fa_eobjatr, fa_fromapp, true, fa_fbs_id, a_fbs_dmy, 1799 1793 fa_fbs_anno, a_count, &a_sw_ok); … … 1812 1806 1813 1807 lb_except: 1814 /* f[^M¸sµ½çÌæðú*/1808 /* データ送信失敗したら領域解放 */ 1815 1809 if (a_fbs_dmy.ptr) 1816 1810 _ecn_fbs_del(a_fbs_dmy); … … 1821 1815 1822 1816 /* 1823 * d¶Ò¿ÌèÝd¶ì¬1817 * 応答電文待ちの割り込み電文作成 1824 1818 */ 1825 1819 ER _ecn_mk_brk_wai(ECN_FBS_ID *pk_fbs_id, const void *p_dat, size_t fa_size) 1826 1820 { 1827 1821 ER a_ret; 1828 ECN_FBS_ID a_fbs_id = { 0 }; /* vd¶p*/1822 ECN_FBS_ID a_fbs_id = { 0 }; /* 要求電文用メモリ */ 1829 1823 1830 1824 if (!pk_fbs_id) … … 1832 1826 *pk_fbs_id = a_fbs_id; 1833 1827 if (sizeof(a_fbs_id.ptr->payload) <= fa_size) 1834 return E_PAR; /* tf[^ªå«·¬é*/1828 return E_PAR; /* 付随データが大きすぎる */ 1835 1829 if (!p_dat && 0 < fa_size) 1836 return E_PAR; /* tf[^TCYª1ÈãÈÌÉf[^|C^ªNULL */1837 1838 /* vd¶pÌæ¾*/1830 return E_PAR; /* 付随データサイズが1以上なのにデータポインタがNULL */ 1831 1832 /* 要求電文用メモリの取得 */ 1839 1833 a_ret = _ecn_fbs_cre((0 < fa_size ? fa_size : 1), &a_fbs_id); 1840 if (a_ret != E_OK || !a_fbs_id.ptr) { /* mÛ¸s*/1834 if (a_ret != E_OK || !a_fbs_id.ptr) { /* 確保失敗 */ 1841 1835 syslog(LOG_WARNING, "_ecn_fbs_cre(%d) result = %d:%s", fa_size, a_ret, itron_strerror(a_ret)); 1842 1836 return a_ret; 1843 1837 } 1844 1838 1845 /* vd¶Ýè*/1839 /* 要求電文設定 */ 1846 1840 a_fbs_id.ptr->hdr.type = ECN_MSG_USER_BREAK; 1847 1841 a_fbs_id.ptr->hdr.sender.id = ENOD_API_ID; … … 1850 1844 1851 1845 if (0 < fa_size && p_dat) { 1852 /* tf[^ÇÁ*/1846 /* 付随データ追加 */ 1853 1847 a_ret = _ecn_fbs_add_data_ex(a_fbs_id, p_dat, fa_size); 1854 1848 if (a_ret) { … … 1862 1856 *pk_fbs_id = a_fbs_id; 1863 1857 1864 /* ³íI¹*/1858 /* 正常終了 */ 1865 1859 return a_ret; 1866 1860 1867 1861 lb_except: 1868 /* f[^쬸sµ½çÌæðú*/1862 /* データ作成失敗したら領域解放 */ 1869 1863 if (a_fbs_id.ptr) 1870 1864 _ecn_fbs_del(a_fbs_id); … … 1873 1867 } 1874 1868 1875 /* d¶pfbsÝè(sender/targetÌÝè) */1869 /* 応答電文用fbs設定(sender/targetの設定) */ 1876 1870 ER _ecn_tsk_cre_req_fbs(ID sender, uint8_t cmd, ECN_FBS_ID *pk_req) 1877 1871 { … … 1902 1896 } 1903 1897 1904 /* d¶pfbsÝè(sender/targetÌÝè) */1898 /* 応答電文用fbs設定(sender/targetの設定) */ 1905 1899 ER _ecn_tsk_cre_res_fbs(ECN_FBS_ID req, uint8_t cmd, ECN_FBS_ID *pk_res) 1906 1900 { -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.