- 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_agent.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) 2015-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 * @(#) $Id$ … … 52 37 53 38 /* 54 * ECHONET Lite åççæãã¼ã39 * ECHONET Lite 動的生成ノード 55 40 */ 56 41 … … 158 143 159 144 /* 160 * ãã¥ã¼ã®åæå145 * キューの初期化 161 146 * 162 * p_queue ã«ã¯ãã¥ã¼ããããæå®ããï¼147 * p_queueにはキューヘッダを指定する. 163 148 */ 164 149 static void … … 173 158 174 159 /* 175 * ãã¥ã¼ã®åã¨ã³ããªã¸ã®æ¿å 176 ¥ 160 * キューの前エントリへの挿入 177 161 * 178 * p_queueã®åã«p_entryãæ¿å 179 ¥ããï¼p_queueã«ãã¥ã¼ããããæå®ããå ´ 180 * åã«ã¯ï¼ãã¥ã¼ã®æ«å°¾ã«p_entryãæ¿å 181 ¥ãããã¨ã«ãªãï¼ 162 * p_queueの前にp_entryを挿入する.p_queueにキューヘッダを指定した場 163 * 合には,キューの末尾にp_entryを挿入することになる. 182 164 */ 183 165 static void … … 195 177 196 178 /* 197 * ã¨ã³ããªã®åé¤179 * エントリの削除 198 180 * 199 * p_entry ããã¥ã¼ããåé¤ããï¼181 * p_entryをキューから削除する. 200 182 */ 201 183 static void … … 310 292 int i = eobjid; 311 293 312 /* ãªãã¸ã§ã¯ãIDããå®ä½ãåå¾*/294 /* オブジェクトIDから実体を取得 */ 313 295 i -= (svc->tmax_eobjid + 1); 314 296 if ((i < 0) … … 321 303 return false; 322 304 323 /* ãªãã¸ã§ã¯ãã®EOJãã³ãã¼*/305 /* オブジェクトのEOJをコピー */ 324 306 memcpy(eoj, &buf->cnt.obj.inib.eojx1, sizeof(*eoj)); 325 307 326 /* æå±ãããã¼ãã®ãªãã¸ã§ã¯ãIDãåå¾*/308 /* 所属するノードのオブジェクトIDを取得 */ 327 309 if(buf->cnt.obj.inib.enodid == 0) 328 310 i = buf->cnt.obj.eobjId; … … 336 318 } 337 319 338 /* ãã¼ãIDãåå¾*/320 /* ノードIDを取得 */ 339 321 buf = &agent->blockes[i]; 340 322 *enodid = buf->cnt.node.node.enodId; … … 365 347 void ecn_agent_init(ecnl_svc_task_t *svc) 366 348 { 367 svc->agent.eprpinib.eprpcd = 0x00; /* ããããã£ã³ã¼ã */ 368 svc->agent.eprpinib.eprpatr = EPC_RULE_SET | EPC_RULE_GET; /* ããããã£å±æ§ */ 369 svc->agent.eprpinib.eprpsz = 255; /* ããããã£ã®ãµã¤ãº */ 370 svc->agent.eprpinib.exinf = (intptr_t)&svc->agent; /* ããããã£ã®æ¡å¼µæ 371 å ± */ 372 svc->agent.eprpinib.eprpset = ecn_agent_eprpset; /* ããããã£ã®è¨å®é¢æ° */ 373 svc->agent.eprpinib.eprpget = ecn_agent_eprpget; /* ããããã£ã®åå¾é¢æ° */ 349 svc->agent.eprpinib.eprpcd = 0x00; /* プロパティコード */ 350 svc->agent.eprpinib.eprpatr = EPC_RULE_SET | EPC_RULE_GET; /* プロパティ属性 */ 351 svc->agent.eprpinib.eprpsz = 255; /* プロパティのサイズ */ 352 svc->agent.eprpinib.exinf = (intptr_t)&svc->agent; /* プロパティの拡張情報 */ 353 svc->agent.eprpinib.eprpset = ecn_agent_eprpset; /* プロパティの設定関数 */ 354 svc->agent.eprpinib.eprpget = ecn_agent_eprpget; /* プロパティの取得関数 */ 374 355 375 356 svc->agent.peprpinib = &svc->agent.eprpinib; … … 390 371 T_ECN_EOJ *eoj, *end; 391 372 392 // ããããã£éç¥ãåå¾å¿çã§ã373 // プロパティ通知か取得応答で、 393 374 switch (esv->hdr.edata.esv) { 394 375 case ESV_GET_RES: … … 400 381 } 401 382 402 // ãã¼ããããã¡ã¤ã«å®ã®å ´å383 // ノードプロファイル宛の場合 403 384 eoj = &esv->hdr.edata.seoj; 404 385 if ((eoj->eojx1 != EOJ_X1_PROFILE) || (eoj->eojx2 != EOJ_X2_NODE_PROFILE) … … 413 394 while (ecn_itr_nxt(mrb, &enm, &epc, &pdc, &edt) == E_OK) { 414 395 switch (epc) { 415 // ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãéç¥ã®å ´å396 // インスタンスリスト通知の場合 416 397 case 0xD5: 417 // èªãã¼ãã¤ã³ã¹ã¿ã³ã¹ãªã¹ãï¼³éç¥ã®å ´å398 // 自ノードインスタンスリストS通知の場合 418 399 case 0xD6: 419 // ãµã¤ãºãåããªãå ´å400 // サイズが合わない場合 420 401 if (pdc != (1 + edt[0] * sizeof(T_ECN_EOJ))) 421 402 return NULL; … … 765 746 ecn_obj_t *sobj; 766 747 767 /* éçã«å®ç¾©ãããéä¿¡å 768 ã®å ´å */ 748 /* 静的に定義された送信元の場合 */ 769 749 if ((*ppk_snod != NULL) && (*ppk_snod)->eobjs != NULL) { 770 /* å¦çããªã*/750 /* 処理しない */ 771 751 return; 772 752 } … … 774 754 snod = ecn_agent_find_node2(svc, *ppk_snod); 775 755 776 /* éä¿¡å 777 ãç¥ããªãã£ãã */ 756 /* 送信元を知らなかったら */ 778 757 if (snod == NULL) { 779 /* éä¿¡å 780 ã®ãã¼ãæ 781 å ±ãæ°è¦ã«ä½æ */ 758 /* 送信元のノード情報を新規に作成 */ 782 759 snod = ecn_agent_create_node(svc, agent, esv); 783 760 if (snod == NULL) … … 787 764 sobj = ecn_agent_find_obj2(snod, *ppk_sobj); 788 765 789 /* ãã¼ããããã¡ã¤ã«ã®å ´å*/766 /* ノードプロファイルの場合 */ 790 767 if ((esv->hdr.edata.seoj.eojx1 == EOJ_X1_PROFILE) 791 768 && (esv->hdr.edata.seoj.eojx2 == EOJ_X2_NODE_PROFILE)) { 792 769 sobj = &snod->node.base; 793 770 } 794 /* æ©å¨ãªãã¸ã§ã¯ãã®å ´å*/771 /* 機器オブジェクトの場合 */ 795 772 else { 796 773 sobj = ecn_agent_find_eobj(&snod->node.eobj, esv->hdr.edata.seoj); … … 837 814 ecn_obj_t *obj = node->current; 838 815 839 // ããããã£å¤èªã¿åºãè¦æ±816 // プロパティ値読み出し要求 840 817 ecn_esv_get(svc, &esv, obj->eobjId, 0x9E); 841 818 ecn_snd_esv(svc, esv); … … 850 827 ecn_obj_t *obj = node->current; 851 828 852 // ããããã£å¤èªã¿åºãè¦æ±829 // プロパティ値読み出し要求 853 830 ecn_esv_get(svc, &esv, obj->eobjId, 0x9F); 854 831 ecn_snd_esv(svc, esv); … … 863 840 ecn_obj_t *obj = node->current; 864 841 865 // ããããã£å¤èªã¿åºãè¦æ±842 // プロパティ値読み出し要求 866 843 ecn_esv_get(svc, &esv, obj->eobjId, 0x9D); 867 844 ecn_snd_esv(svc, esv); … … 877 854 ecn_device_t *device; 878 855 879 /* obj ãæå®ããã¦ããªãå ´å*/856 /* objが指定されていない場合 */ 880 857 if(obj == NULL){ 881 /* ãã®ãã¼ããè¿ã*/858 /* このノードを返す */ 882 859 node->current = &node->node.base; 883 860 return; 884 861 } 885 /* ãã¼ãã®å ´å*/862 /* ノードの場合 */ 886 863 else if((obj->inib.eojx1 == EOJ_X1_PROFILE) && (obj->inib.eojx2 == EOJ_X2_NODE_PROFILE)){ 887 864 node = (ecn_node_agent_t *)obj; 888 865 889 /* é 890 ä¸ã®æ©å¨ãè¿ã */ 866 /* 配下の機器を返す */ 891 867 queue = node->node.devices.p_next; 892 868 device = (ecn_device_t *)cast_obj(queue); 893 869 } 894 /* æ©å¨ã®å ´å*/870 /* 機器の場合 */ 895 871 else{ 896 /* 次ã®æ©å¨ãè¿ã*/872 /* 次の機器を返す */ 897 873 node = (ecn_node_agent_t *)((ecn_device_t *)obj)->node; 898 874 queue = cast_queue(obj)->p_next; … … 900 876 } 901 877 902 /* ãã®æ©å¨ãæ«å°¾ã ã£ãå ´å*/878 /* その機器が末尾だった場合 */ 903 879 if(&node->node.devices == queue){ 904 880 node->current = NULL; … … 1037 1013 bool_t has = false; 1038 1014 1039 /* ãã¼ãã®å ´åã¯ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãéç¥ã¨èªãã¼ãã¤ã³ã¹ã¿ã³ã¹ãªã¹ãï¼³éç¥ãå¿ 1040 é ã§åãåã */ 1015 /* ノードの場合はインスタンスリスト通知と自ノードインスタンスリストS通知を必須で受け取る */ 1041 1016 if ((fp_obj->enodid == 0) && ((fa_epc == 0xD5) || (fa_epc == 0xD6))) 1042 1017 has = true; … … 1072 1047 1073 1048 switch (item->eprpcd) { 1074 /* ã¤ã³ã¹ã¿ã³ã¹ãªã¹ãéç¥ã®å ´å*/1049 /* インスタンスリスト通知の場合 */ 1075 1050 case 0xD5: 1076 /* èªãã¼ãã¤ã³ã¹ã¿ã³ã¹ãªã¹ãï¼³éç¥ã®å ´å*/1051 /* 自ノードインスタンスリストS通知の場合 */ 1077 1052 case 0xD6: 1078 1053 if ((node != NULL) && (node->state == ecn_node_state_idle)) { … … 1092 1067 } 1093 1068 break; 1094 /* éç¥ããããã£ãããã®å ´å*/1069 /* 通知プロパティマップの場合 */ 1095 1070 case 0x9D: 1096 1071 eprpcnt = edt[0]; 1097 1072 1098 1073 if (eprpcnt < 16) { 1099 /* ãµã¤ãºãã§ãã¯*/1074 /* サイズチェック */ 1100 1075 if (eprpcnt + 1 != size) 1101 1076 return 0; … … 1105 1080 } 1106 1081 else { 1107 /* ãµã¤ãºãã§ãã¯*/1082 /* サイズチェック */ 1108 1083 if (size != 17) 1109 1084 return 0; … … 1114 1089 sobj->pmapFlag |= PMAP_FLAG_ANNO; 1115 1090 break; 1116 /* SET ããããã£ãããã®å ´å*/1091 /* SETプロパティマップの場合 */ 1117 1092 case 0x9E: 1118 1093 eprpcnt = edt[0]; 1119 1094 1120 1095 if (eprpcnt < 16) { 1121 /* ãµã¤ãºãã§ãã¯*/1096 /* サイズチェック */ 1122 1097 if (eprpcnt + 1 != size) 1123 1098 return 0; … … 1127 1102 } 1128 1103 else { 1129 /* ãµã¤ãºãã§ãã¯*/1104 /* サイズチェック */ 1130 1105 if (size != 17) 1131 1106 return 0; … … 1136 1111 sobj->pmapFlag |= PMAP_FLAG_SET; 1137 1112 break; 1138 /* GET ããããã£ãããã®å ´å*/1113 /* GETプロパティマップの場合 */ 1139 1114 case 0x9F: 1140 1115 eprpcnt = edt[0]; 1141 1116 1142 1117 if (eprpcnt < 16) { 1143 /* ãµã¤ãºãã§ãã¯*/1118 /* サイズチェック */ 1144 1119 if (eprpcnt + 1 != size) 1145 1120 return 0; … … 1149 1124 } 1150 1125 else { 1151 /* ãµã¤ãºãã§ãã¯*/1126 /* サイズチェック */ 1152 1127 if (size != 17) 1153 1128 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.