1 | /*
|
---|
2 | * TOPPERS ECHONET Lite Communication Middleware
|
---|
3 | *
|
---|
4 | * Copyright (C) 2015-2016 Cores Co., Ltd. Japan
|
---|
5 | *
|
---|
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 | * 免責すること.
|
---|
28 | *
|
---|
29 | * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
---|
30 | * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
---|
31 | * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
---|
32 | * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
---|
33 | * の責任を負わない.
|
---|
34 | *
|
---|
35 | * @(#) $Id$
|
---|
36 | */
|
---|
37 |
|
---|
38 | /*
|
---|
39 | * ECHONET Lite 動的生成ノード
|
---|
40 | */
|
---|
41 |
|
---|
42 | #ifndef ECHONET_NODE_H
|
---|
43 | #define ECHONET_NODE_H
|
---|
44 |
|
---|
45 | #include "echonet.h"
|
---|
46 |
|
---|
47 | #ifdef __cplusplus
|
---|
48 | extern "C" {
|
---|
49 | #endif
|
---|
50 |
|
---|
51 | /*
|
---|
52 | * キューのデータ構造の定義
|
---|
53 | */
|
---|
54 | typedef struct ecn_agent_queue {
|
---|
55 | #ifdef _DEBUG
|
---|
56 | struct ecn_agent_queue *p_parent; /* 親キューへのポインタ */
|
---|
57 | #endif
|
---|
58 | struct ecn_agent_queue *p_next; /* 次エントリへのポインタ */
|
---|
59 | struct ecn_agent_queue *p_prev; /* 前エントリへのポインタ */
|
---|
60 | } ecn_agent_queue_t;
|
---|
61 |
|
---|
62 | #define PMAP_FLAG_SET 0x01
|
---|
63 | #define PMAP_FLAG_GET 0x02
|
---|
64 | #define PMAP_FLAG_ANNO 0x04
|
---|
65 |
|
---|
66 | typedef struct ecn_obj
|
---|
67 | {
|
---|
68 | ecnl_svc_task_t *svc;
|
---|
69 | ID eobjId;
|
---|
70 | EOBJINIB inib;
|
---|
71 | uint8_t pmapSet[16]; /* SETプロパティマップ */
|
---|
72 | uint8_t pmapGet[16]; /* GETプロパティマップ */
|
---|
73 | uint8_t pmapAnno[16]; /* 状態変化時通知プロパティマップ */
|
---|
74 | uint8_t pmapFlag;
|
---|
75 | uint8_t eprpcnt; /* ECHONET Lite プロパティ数 */
|
---|
76 | uint8_t annocnt; /* 通知プロパティの数 */
|
---|
77 | uint8_t setcnt; /* 設定プロパティの数 */
|
---|
78 | uint8_t getcnt; /* 取得プロパティの数 */
|
---|
79 | } ecn_obj_t;
|
---|
80 |
|
---|
81 | typedef struct ecn_node
|
---|
82 | {
|
---|
83 | ecn_obj_t base;
|
---|
84 | EOBJCB eobj;
|
---|
85 | ECN_ENOD_ID enodId;
|
---|
86 | ecn_agent_queue_t devices;
|
---|
87 | } ecn_node_t;
|
---|
88 |
|
---|
89 | typedef struct ecn_device {
|
---|
90 | ecn_obj_t base;
|
---|
91 | ecn_node_t *node;
|
---|
92 | } ecn_device_t;
|
---|
93 |
|
---|
94 | typedef enum ecn_node_state {
|
---|
95 | ecn_node_state_idle,
|
---|
96 | ecn_node_state_start,
|
---|
97 | ecn_node_state_set_prpmap_wait,
|
---|
98 | ecn_node_state_get_prpmap_wait,
|
---|
99 | ecn_node_state_anno_prpmap_wait,
|
---|
100 | ecn_node_state_fault,
|
---|
101 | } ecn_node_state_t;
|
---|
102 |
|
---|
103 | typedef struct ecn_node_agent {
|
---|
104 | ecn_node_t node;
|
---|
105 | ecn_node_state_t state;
|
---|
106 | TMO timer;
|
---|
107 | ecn_obj_t *current;
|
---|
108 | int retry;
|
---|
109 | } ecn_node_agent_t;
|
---|
110 |
|
---|
111 | typedef struct ecn_agent_buffer {
|
---|
112 | union {
|
---|
113 | struct ecn_agent_buffer *free;
|
---|
114 | ecn_agent_queue_t queue;
|
---|
115 | }hdr;
|
---|
116 | union {
|
---|
117 | ecn_obj_t obj;
|
---|
118 | ecn_node_agent_t node;
|
---|
119 | ecn_device_t device;
|
---|
120 | }cnt;
|
---|
121 | } ecn_agent_buffer_t;
|
---|
122 |
|
---|
123 | #define TNUM_AEOBJID 50
|
---|
124 |
|
---|
125 | typedef struct ecn_agent {
|
---|
126 | EPRPINIB eprpinib;
|
---|
127 | const EPRPINIB *peprpinib;
|
---|
128 | ecn_agent_queue_t nodes;
|
---|
129 | ecn_node_agent_t *current_node;
|
---|
130 | bool_t msg_proced;
|
---|
131 | int blkpos;
|
---|
132 | ecn_agent_buffer_t *free;
|
---|
133 | ecn_agent_buffer_t blockes[TNUM_AEOBJID];
|
---|
134 | int requestid;
|
---|
135 | } ecn_agent_t;
|
---|
136 |
|
---|
137 | typedef struct ecn_inm_get_device_list_req
|
---|
138 | {
|
---|
139 | unsigned int requestid;
|
---|
140 | } ecn_inm_get_device_list_req_t;
|
---|
141 |
|
---|
142 | typedef struct ecn_inm_get_device_item
|
---|
143 | {
|
---|
144 | ID eobjid; /* ECHONET Lite オブジェクトID */
|
---|
145 | ID enodid; /* ECHONET Lite ノードプロファイルオブジェクトID */
|
---|
146 | uint8_t state; /* 情報収集状態 */
|
---|
147 | uint8_t eojx1; /* ECHONET Lite オブジェクトのクラスグループコード */
|
---|
148 | uint8_t eojx2; /* ECHONET Lite オブジェクトのクラスコード */
|
---|
149 | uint8_t eojx3; /* ECHONET Lite オブジェクトのインスタンスコード */
|
---|
150 | ECN_ENOD_ID addrid; /* 通信レイヤーアドレス取得用ID */
|
---|
151 | } ecn_inm_get_device_item_t;
|
---|
152 |
|
---|
153 | typedef struct ecn_inm_get_device_list_res
|
---|
154 | {
|
---|
155 | unsigned int requestid;
|
---|
156 | ecn_inm_get_device_item_t devices[1];
|
---|
157 | } ecn_inm_get_device_list_res_t;
|
---|
158 |
|
---|
159 | typedef struct ecn_inm_get_device_info_req
|
---|
160 | {
|
---|
161 | unsigned int requestid;
|
---|
162 | ID eobjid;
|
---|
163 | } ecn_inm_get_device_info_req_t;
|
---|
164 |
|
---|
165 | typedef struct ecn_inm_get_device_info_res
|
---|
166 | {
|
---|
167 | unsigned int requestid;
|
---|
168 | ID eobjid;
|
---|
169 | uint8_t pmapSet[16];
|
---|
170 | uint8_t pmapGet[16];
|
---|
171 | uint8_t pmapAnno[16];
|
---|
172 | uint_t eprpcnt;
|
---|
173 | } ecn_inm_get_device_info_res_t;
|
---|
174 |
|
---|
175 | /* 初期化 */
|
---|
176 | void ecn_agent_init(ecnl_svc_task_t *svc);
|
---|
177 | /* ノードを検索 */
|
---|
178 | ecn_node_t *ecn_agent_find_node(ecnl_svc_task_t *svc, ECN_ENOD_ID enodid);
|
---|
179 | /* 機器を検索 */
|
---|
180 | ecn_obj_t *ecn_agent_find_eobj(const EOBJCB *pk_nod, T_ECN_EOJ eoj);
|
---|
181 | /* オブジェクトIDを取得 */
|
---|
182 | ID ecn_agent_get_eobj(const EOBJINIB *pk_obj);
|
---|
183 | /* 次の機器を取得 */
|
---|
184 | const EOBJINIB *ecn_agent_next_eobj(const EOBJCB *pk_nod, const EOBJINIB *pk_obj);
|
---|
185 | /* オブジェクトIDからEOJとノードIDを取得 */
|
---|
186 | bool_t ecn_agent_get_eoj_enodid(ecnl_svc_task_t *svc, ID eobjid, T_ECN_EOJ *eoj, ECN_ENOD_ID *enodid);
|
---|
187 | /* タイムアウト値を返す */
|
---|
188 | TMO ecn_agent_get_timer(ecnl_svc_task_t *svc);
|
---|
189 | /* タイマーの時間を進める */
|
---|
190 | void ecn_agent_progress(ecnl_svc_task_t *svc, TMO interval);
|
---|
191 | /* タイムアウト処理(のための呼び出し) */
|
---|
192 | void ecn_agent_timeout(ecnl_svc_task_t *svc);
|
---|
193 | /* 内部メッセージ処理 */
|
---|
194 | bool_t ecn_agent_proc_int_msg(ecnl_svc_task_t *svc, ECN_FBS_ID fbs, uint8_t cmd);
|
---|
195 | /* ECHONET電文受信処理 */
|
---|
196 | void ecn_agent_proc_ecn_msg(ecnl_svc_task_t *svc, const EOBJCB **snod, const EOBJINIB **sobj, T_EDATA *esv);
|
---|
197 | /* ECHONET電文受信処理終了 */
|
---|
198 | void ecn_agent_proc_ecn_msg_end(ecnl_svc_task_t *svc);
|
---|
199 | /* プロパティを取得 */
|
---|
200 | const EPRPINIB *ecn_agent_get_property(const EOBJINIB *fp_obj, uint8_t fa_epc, const EPRPINIB *item);
|
---|
201 |
|
---|
202 | ER ecn_agent_get_device_list(ecnl_svc_task_t *svc, T_ECN_FBS_QUEUE *sender, int requestid, ECN_FBS_ID *pk_req);
|
---|
203 | ER ecn_agent_get_device_info(ecnl_svc_task_t *svc, T_ECN_FBS_QUEUE *sender, int requestid, ID eobjid, ECN_FBS_ID *pk_req);
|
---|
204 |
|
---|
205 | void ecn_agent_set_epc_to_prop_map(uint8_t epc, uint8_t *propMap);
|
---|
206 | bool_t ecn_agent_contains_epc_in_prop_map(uint8_t epc, uint8_t *propMap);
|
---|
207 |
|
---|
208 | #ifdef __cplusplus
|
---|
209 | }
|
---|
210 | #endif
|
---|
211 |
|
---|
212 | #endif /* ECHONET_NODE_H */
|
---|