source: EcnlProtoTool/trunk/mrbgems/mruby-ecnl/src/echonet.h

Last change on this file was 321, checked in by coas-nagasima, 7 years ago

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 13.8 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014-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 */
36
37#ifndef ECHONET_H
38#define ECHONET_H
39
40#include <stddef.h>
41#include <stdint.h>
42#include <mruby.h>
43
44#include "echonet_class.h"
45
46#ifdef __cplusplus
47extern "C" {
48#endif
49
50#ifndef TOPPERS_T_STDDEF_H
51typedef char bool_t; /* 真偽値 */
52
53typedef signed int int_t; /* 自然なサイズの符号付き整数 */
54typedef unsigned int uint_t; /* 自然なサイズの符号無し整数 */
55
56typedef int_t ER; /* エラーコード */
57typedef int_t ID; /* オブジェクトのID番号 */
58typedef uint_t ATR; /* オブジェクトの属性 */
59typedef int_t TMO; /* タイムアウト指定 */
60
61#ifndef NULL
62#define NULL 0 /* 無効ポインタ */
63#endif /* NULL */
64
65#ifndef true
66#define true 1 /* 真 */
67#endif /* true */
68
69#ifndef false
70#define false 0 /* 偽 */
71#endif /* false */
72
73#define E_OK 0 /* 正常終了 */
74
75#define E_SYS (-5) /* システムエラー */
76#define E_PAR (-17) /* パラメータエラー */
77#define E_NOMEM (-33) /* メモリ不足 */
78#define E_OBJ (-41) /* オブジェクト状態エラー */
79#define E_NOEXS (-42) /* オブジェクト未生成 */
80#define E_TMOUT (-50) /* ポーリング失敗またはタイムアウト */
81#define E_BOVR (-58) /* バッファオーバーフロー */
82#define E_BRK (-100) /* ユーザーによる中断 */
83
84#define TMO_FEVR (-1) /* 永久待ち */
85#endif
86
87#define EOBJ_NULL 0x00
88#define EOBJ_LOCAL_NODE 0x01 /* 自ノード */
89#define EOBJ_SYNC_REMOTE_NODE 0x02 /* 他ノード */
90#define EOBJ_ASYNC_REMOTE_NODE 0x04 /* 他ノード(非同期) */
91#define EOBJ_DEVICE 0x08 /* 機器オブジェクト */
92
93#define EPC_NONE 0x00
94#define EPC_RULE_SET 0x01 /* アクセスルール Set */
95#define EPC_RULE_GET 0x02 /* アクセスルール Get */
96#define EPC_RULE_ANNO 0x04 /* アクセスルール Anno */
97#define EPC_ANNOUNCE 0x40 /* 状態変化時通知 */
98#define EPC_VARIABLE 0x80 /* 可変長データ */
99
100typedef enum _echonet_enod_id
101{
102 ENOD_NOT_MATCH_ID = -1, /* アドレスID登録なし */
103 ENOD_MULTICAST_ID = 0, /* マルチキャストアドレスID */
104 ENOD_LOCAL_ID = 1, /* 自ノードアドレスID */
105 ENOD_API_ID = 2, /* APIアドレスID */
106 ENOD_REMOTE_ID = 3, /* 他ノードアドレスID */
107} ECN_ENOD_ID;
108
109/* ECHONET Lite規格 */
110typedef enum
111{
112 ECN_EDH1_ECHONET_LITE = 0x10
113} ECN_EHD1_ECL_VERSION;
114
115/* 電文形式1/2 */
116typedef enum
117{
118 ECN_EDH2_FORMAT_1 = 0x81, /* 電文形式1 */
119 ECN_EDH2_FORMAT_2 = 0x82 /* 電文形式2 */
120} ECN_EHD2_FORMAT;
121
122/* ECHONET Liteサービスコード */
123typedef enum _echonet_service_code
124{
125 ESV_NOP = 0, /* (機能指定なし) */
126 ESV_SET_I = 0x60, /* プロパティ値書き込み要求(応答不要) */
127 ESV_SET_C = 0x61, /* プロパティ値書き込み要求(応答要) */
128 ESV_GET = 0x62, /* プロパティ値読み出し要求 */
129 ESV_INF_REQ = 0x63, /* プロパティ値通知要求 */
130 ESV_SET_GET = 0x6E, /* プロパティ値書き込み・読み出し要求 */
131 ESV_SET_RES = 0x71, /* プロパティ値書き込み応答 */
132 ESV_GET_RES = 0x72, /* プロパティ値読み出し応答 */
133 ESV_INF = 0x73, /* プロパティ値通知 */
134 ESV_INFC = 0x74, /* プロパティ値通知(応答要) */
135 ESV_INFC_RES = 0x7A, /* プロパティ値通知応答 */
136 ESV_SET_GET_RES = 0x7E, /* プロパティ値書き込み・読み出し応答 */
137 ESV_SET_I_SNA = 0x50, /* プロパティ値書き込み要求不可応答 */
138 ESV_SET_C_SNA = 0x51, /* プロパティ値書き込み要求不可応答 */
139 ESV_GET_SNA = 0x52, /* プロパティ値読み出し不可応答 */
140 ESV_INF_SNA = 0x53, /* プロパティ値通知不可応答 */
141 ESV_SET_GET_SNA = 0x5E /* プロパティ値書き込み・読み出し不可応答 */
142} ECN_SRV_CODE;
143
144#ifdef __CA850__
145#pragma pack(1)
146#elif __RX
147#pragma pack
148#elif _MSC_VER
149#pragma pack(push, 1)
150#endif
151#ifndef __GNUC__
152#define __attribute__(x)
153#endif // !__GNUC__
154
155/*
156 * ECHONET Lite電文ヘッダー
157 */
158typedef struct
159{
160 uint8_t ehd1; /* ECHONET Lite電文ヘッダー1 ECN_EHD1_ECL_VERSION */
161 uint8_t ehd2; /* ECHONET Lite電文ヘッダー2 ECN_EHD2_FORMAT */
162 uint16_t tid; /* トランザクションID */
163} __attribute__((packed)) T_ECN_HDR;
164
165/*
166 * ECHONET Liteオブジェクトコード
167 */
168typedef struct
169{
170 uint8_t eojx1; /* クラスグループコード */
171 uint8_t eojx2; /* クラスコード */
172 uint8_t eojx3; /* インスタンスコード */
173} __attribute__((packed)) T_ECN_EOJ;
174
175/*
176 * ECHONET Liteデータヘッダー
177 */
178typedef struct
179{
180 T_ECN_EOJ seoj; /* 送信元ECHONET Liteオブジェクト指定 */
181 T_ECN_EOJ deoj; /* 相手先ECHONET Liteオブジェクト指定 */
182 uint8_t esv; /* ECHONET Liteサービス (ECN_SRV_CODE) */
183 uint8_t opc; /* 処理プロパティ数 */
184} __attribute__((packed)) T_ECN_EDATA_BODY;
185
186/*
187 * ECHONET Liteプロパティ
188 */
189typedef struct
190{
191 uint8_t epc; /* ECHONET Liteプロパティコード */
192 uint8_t pdc; /* EDTのバイト数 */
193 /*void *p_edt;*/ /* プロパティ値データ */
194} __attribute__((packed)) T_ECN_PRP;
195
196/*
197 * ECHONET Liteデータ
198 */
199typedef struct
200{
201 T_ECN_HDR ecn_hdr;
202 T_ECN_EDATA_BODY edata;
203 T_ECN_PRP ecn_prp;
204} __attribute__((packed)) T_ECN_EDT_HDR;
205
206/*
207 * ECHONET Lite 電文
208 */
209typedef struct echonet_object_data
210{
211 uint8_t _private1[64 - sizeof(int)];
212 int trn_pos;
213 uint8_t _private2[128];
214 T_ECN_EDT_HDR hdr;
215 uint8_t _private3[64 - sizeof(T_ECN_EDT_HDR)];
216} __attribute__((packed)) T_EDATA;
217
218#ifdef __CA850__
219#pragma pack(8)
220#elif __RX
221#pragma unpack
222#elif _MSC_VER
223#pragma pack(pop)
224#endif
225
226/*
227 * 応答電文解析イテレーター
228 */
229typedef struct echonet_epc_enumerator
230{
231 T_EDATA *pk_esv;
232 uint8_t count; /* 今読み取り中のブロックにあるプロパティ総数 */
233 uint8_t got_ct; /* 今読み取り中のブロックで、読み取った数 */
234 uint8_t next_blk_ct; /* 後続ブロック数 */
235 uint8_t is_eof; /* 終端に達した時、非0 */
236 int cur;
237} T_ENUM_EPC;
238
239typedef struct echonet_property_initialization_block EPRPINIB;
240
241typedef struct ecnl_svc_task ecnl_svc_task_t;
242
243/*
244 * ECHONET Lite プロパティの設定関数
245 */
246typedef int (EPRP_SETTER)(ecnl_svc_task_t *svc, const EPRPINIB *item, const void *src, int size, bool_t *anno);
247
248/*
249 * ECHONET Lite プロパティの取得関数
250 */
251typedef int (EPRP_GETTER)(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
252
253/*
254 * ECHONET Lite プロパティ初期化ブロック
255 */
256struct echonet_property_initialization_block
257{
258 uint8_t eprpcd; /* ECHONET Lite プロパティコード */
259 ATR eprpatr; /* ECHONET Lite プロパティ属性 */
260 uint8_t eprpsz; /* ECHONET Lite プロパティのサイズ */
261 intptr_t exinf; /* ECHONET Lite プロパティの拡張情報 */
262 EPRP_SETTER *eprpset; /* ECHONET Lite プロパティの設定関数 */
263 EPRP_GETTER *eprpget; /* ECHONET Lite プロパティの取得関数 */
264};
265
266#define TMIN_EOBJID 1 /* ECHONET Lite オブジェクトIDの最小値 */
267
268/*
269 * ECHONET Lite オブジェクト初期化ブロック
270 */
271typedef struct echonet_object_initialization_block
272{
273 ATR eobjatr; /* ECHONET Lite オブジェクト属性 */
274 ID enodid; /* ECHONET Lite ノードプロファイルオブジェクトID */
275 intptr_t exinf; /* ECHONET Lite オブジェクトの拡張情報 */
276 uint8_t eojx1; /* ECHONET Lite オブジェクトのクラスグループコード */
277 uint8_t eojx2; /* ECHONET Lite オブジェクトのクラスコード */
278 uint8_t eojx3; /* ECHONET Lite オブジェクトのインスタンスコード */
279 const EPRPINIB **eprp; /* ECHONET Lite プロパティ初期化ブロック */
280 uint_t eprpcnt; /* ECHONET Lite プロパティ初期化ブロック数 */
281} EOBJINIB;
282
283/*
284 * ECHONET Lite ノード管理ブロック
285 */
286typedef struct echonet_object_control_block
287{
288 const EOBJINIB *profile; /* ECHONET Lite ノードプロファイルへのポインタ */
289 const EOBJINIB **eobjs; /* ECHONET Lite オブジェクトリストへのポインタ */
290 uint_t eobjcnt; /* ECHONET Lite オブジェクト数 */
291} EOBJCB;
292
293/*
294 * ECHONET Lite オブジェクト機能の初期化
295 */
296extern void initialize_echonet_object(void);
297
298typedef EOBJINIB T_REOBJ;
299
300typedef EPRPINIB T_RPRP;
301
302/*
303 * ECHONET Liteサービス処理開始
304 */
305ER ecn_sta_svc(ecnl_svc_task_t *svc);
306
307/*
308 * ECHONETオブジェクト参照
309 */
310ER ecn_ref_eobj(ecnl_svc_task_t *svc, ID eobjid, T_REOBJ *pk_eobj);
311
312/*
313 * ECHONETプロパティ参照
314 */
315ER ecn_ref_eprp(ecnl_svc_task_t *svc, ID eobjid, uint8_t epc, T_RPRP *pk_eprp);
316
317/*
318 * プロパティ値書き込み要求(応答不要)電文作成
319 */
320ER ecn_esv_seti(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID eobjid, uint8_t epc, uint8_t pdc, const void *p_edt);
321
322/*
323 * プロパティ値書き込み要求(応答要)電文作成
324 */
325ER ecn_esv_setc(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID eobjid, uint8_t epc, uint8_t pdc, const void *p_edt);
326
327/*
328 * プロパティ値読み出し要求電文作成
329 */
330ER ecn_esv_get(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID eobjid, uint8_t epc);
331
332/*
333 * プロパティ値通知要求電文作成
334 */
335ER ecn_esv_inf_req(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID eobjid, uint8_t epc);
336
337/*
338 * プロパティ値書き込み・読み出し要求電文作成
339 */
340ER ecn_esv_set_get(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID eobjid, uint8_t epc, uint8_t pdc, const void *p_edt);
341
342/*
343 * プロパティ値書き込み・読み出し要求電文折り返し指定
344 */
345ER ecn_trn_set_get(mrb_state *mrb, T_EDATA *pk_esv, int *p_trn_pos);
346
347/*
348 * プロパティ値書き込み・読み出し要求電文終了指定
349 */
350ER ecn_end_set_get(mrb_state *mrb, T_EDATA *pk_esv, int trn_pos);
351
352/*
353 * プロパティ値通知(応答要)電文作成
354 */
355ER ecn_esv_infc(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID eobjid, ID seobjid, uint8_t sepc);
356
357/*
358 * 要求電文へのプロパティ指定追加
359 */
360ER ecn_add_epc(mrb_state *mrb, T_EDATA *pk_esv, uint8_t epc);
361
362/*
363 * 要求電文へのプロパティデータ追加
364 */
365ER ecn_add_edt(mrb_state *mrb, T_EDATA *pk_esv, uint8_t epc, uint8_t pdc, const void *p_edt);
366
367/*
368 * 要求電文の送信
369 */
370ER ecn_snd_esv(ecnl_svc_task_t *svc, T_EDATA *pk_esv);
371
372/*
373 * 応答電文の受信ポーリング
374 */
375ER ecn_prcv_esv(ecnl_svc_task_t *svc, T_EDATA **ppk_esv);
376
377/*
378 * 応答電文の破棄
379 */
380ER ecn_rel_esv(mrb_state *mrb, T_EDATA *pk_esv);
381
382/*
383 * 応答電文の送信元ノードを取得する
384 */
385ID ecn_get_enod(ecnl_svc_task_t *svc, T_EDATA *pk_esv);
386
387/*
388 * 応答電文の送信元機器オブジェクトを取得する
389 */
390ID ecn_get_eobj(ecnl_svc_task_t *svc, T_EDATA *pk_esv);
391
392/*
393 * 応答電文解析イテレーター初期化
394 */
395ER ecn_itr_ini(T_ENUM_EPC *pk_itr, T_EDATA *pk_esv);
396
397/*
398 * 応答電文解析イテレーターインクリメント
399 */
400ER ecn_itr_nxt(mrb_state *mrb, T_ENUM_EPC *pk_itr, uint8_t *p_epc, uint8_t *p_pdc, void *p_edt);
401
402/*
403 * 応答電文待ちの割り込み送信
404 */
405ER ecn_brk_wai(ecnl_svc_task_t *svc, const void *p_dat, int datsz);
406
407/*
408 * 割り込みデータの取得
409 */
410ER ecn_get_brk_dat(mrb_state *mrb, T_EDATA *pk_esv, void *p_buf, int bufsz, int *p_datsz);
411
412/*
413 * データ設定関数
414 */
415int ecn_data_prop_set(ecnl_svc_task_t *svc, const EPRPINIB *item, const void *src, int size, bool_t *anno);
416
417/*
418 * データ取得関数
419 */
420int ecn_data_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size);
421
422#ifdef __cplusplus
423}
424#endif
425
426#endif // ECHONET_H
Note: See TracBrowser for help on using the repository browser.