source: EcnlProtoTool/trunk/mrbgems/mruby-ecnl/src/echonet_fbs.h@ 321

Last change on this file since 321 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: 9.2 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/*
38 * 固定長バッファ可変長ストリーム
39 */
40
41#ifndef TOPPERS_ECHONET_FBS_H
42#define TOPPERS_ECHONET_FBS_H
43
44#include <stddef.h>
45#include <stdint.h>
46#include "echonet.h"
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
52#ifndef NUM_ECHONET_MEMPOOL_BLOCK
53#define NUM_ECHONET_MEMPOOL_BLOCK (60) /* 電文用メモリブロックの数 */
54#endif /* NUM_ECHONET_MEMPOOL_BLOCK */
55
56#ifndef ECHONET_MEMPOOL_BLOCK_SIZE
57#define ECHONET_MEMPOOL_BLOCK_SIZE (256) /* 電文用メモリブロックのサイズ */
58#endif /* ECHONET_MEMPOOL_BLOCK_SIZE */
59
60typedef unsigned int ECN_FBS_SIZE_T; /* size_t相当 */
61typedef int ECN_FBS_SSIZE_T; /* ssize_t相当 */
62
63/* T_EDATA管理領域サイズ */
64#define DEF_ECN_EDT_HDR_LEN (sizeof(intptr_t))
65
66/* 管理領域サイズ(64byte - sizeof(T_MSG)) */
67/* #define DEF_ECN_FBS_LIB_HDR_LEN ((ECHONET_MEMPOOL_BLOCK_SIZE + sizeof(int) - 1)>> 2) // */
68#define DEF_ECN_FBS_LIB_HDR_LEN (64 - DEF_ECN_EDT_HDR_LEN)
69
70/* 管理領域を含むブロックに保持するデータサイズ */
71#define DEF_ECN_FBS_FST_DAT_LEN (64)
72
73/* リンクポインタ配列のサイズ(byte) */
74#define DEF_ECN_FBS_LNK_LEN (ECHONET_MEMPOOL_BLOCK_SIZE - DEF_ECN_EDT_HDR_LEN - DEF_ECN_FBS_LIB_HDR_LEN - DEF_ECN_FBS_FST_DAT_LEN)
75
76/* 固定長バッファ最大サイズ */
77#define DEF_ECN_FBS_BUF_MAXLEN ((DEF_ECN_FBS_LNK_LEN / sizeof(void *)) * ECHONET_MEMPOOL_BLOCK_SIZE + DEF_ECN_FBS_FST_DAT_LEN)
78
79/* 子要素バッファのサイズ */
80#define DEF_ECN_FBS_SUB_BUF_LEN ECHONET_MEMPOOL_BLOCK_SIZE
81
82/* 電文の種別(内容は仮) */
83typedef enum
84{
85 ECN_FBS_TYPE_BLANK = 0, /* 未使用ストリーム */
86 ECN_FBS_TYPE_INTERNAL = 1, /* 内部メッセージ */
87 ECN_FBS_TYPE_ECHONET = 2 /* ECHONET電文 */
88} TA_ECN_MSG_TYPE;
89
90/* リンクポインタ配列に列挙される、子要素バッファ */
91typedef struct
92{
93 uint8_t payload[ECHONET_MEMPOOL_BLOCK_SIZE];
94} T_ECN_SUB_BLK;
95
96/* リンクポインタ配列 */
97typedef union
98{
99 T_ECN_SUB_BLK *p_sub[DEF_ECN_FBS_LNK_LEN / sizeof(T_ECN_SUB_BLK *)];
100 uint8_t bin[DEF_ECN_FBS_LNK_LEN];
101} T_ECN_FBS_LNK;
102
103/* 管理領域(64byte - sizeof(T_MSG)) */
104typedef struct
105{
106 uint16_t length; /* メッセージ長 */
107 uint16_t type; /* メッセージタイプ */
108 union{
109 ECN_ENOD_ID id; /* 送信元ノードID(ECHONET電文) */
110 struct ecn_fbs_queue *mbxid; /* 送信元メールボックスID(内部メッセージ) */
111 }sender;
112 union{
113 ECN_ENOD_ID id; /* 送信先ノードID(ECHONET電文) */
114 struct ecn_fbs_queue *mbxid; /* 送信先メールボックスID(内部メッセージ) */
115 }target;
116 union{
117 ECN_ENOD_ID id; /* 返信先ノードID(ECHONET電文) */
118 struct ecn_fbs_queue *mbxid; /* 返信先メールボックスID(内部メッセージ) */
119 }reply;
120
121 int rd; /* 読み取りヘッド情報 */
122 int wr; /* 書き込みヘッド情報 */
123} T_ECN_FBS_HDR;
124
125/* 管理領域を含むブロックの構造 */
126typedef struct
127{
128 uint8_t _msg[DEF_ECN_EDT_HDR_LEN]; /* T_MSG */
129 T_ECN_FBS_HDR hdr; /* 管理領域 64byte - sizeof(T_MSG) */
130 uint8_t _gap[DEF_ECN_FBS_LIB_HDR_LEN - sizeof(T_ECN_FBS_HDR)];
131 T_ECN_FBS_LNK lnk; /* リンクポインタ配列 128byte */
132 uint8_t payload[DEF_ECN_FBS_FST_DAT_LEN];
133} T_ECN_FST_BLK;
134
135/* FBS-ID */
136typedef struct ecn_fbs_id_strc
137{
138 T_ECN_FST_BLK *ptr;
139} ECN_FBS_ID;
140
141/* メッセージキュー */
142typedef struct ecn_fbs_queue
143{
144 T_ECN_FST_BLK *pk_head; /* 先頭のメッセージ */
145 T_ECN_FST_BLK *pk_last; /* 末尾のメッセージ */
146} T_ECN_FBS_QUEUE;
147
148/* メモリブロック取得 ok:ポインタ NG:NULL */
149void *_ecn_fbs_mbx_get(mrb_state *mrb, ECN_FBS_SIZE_T fa_req_size);
150
151/* メモリブロック解放 ok:0 NG:非0 */
152ER _ecn_fbs_mbx_rel(mrb_state *mrb, void *p);
153
154/*
155 * 領域確保
156 * 引数
157 * ECN_FBS_SIZE_T fa_req_size 要求バッファサイズ(byte)
158 * max: DEF_ECN_FBS_BUF_MAXLEN
159 * ECN_FBS_ID *fp_id 確保したFBS-IDの格納先
160 * 戻り値
161 * ER 0:ok 非0:NG
162 */
163ER _ecn_fbs_cre(mrb_state *mrb, ECN_FBS_SIZE_T fa_req_size, ECN_FBS_ID *fp_id);
164
165/*
166 * 領域解放
167 * 引数
168 * ecn_fbs_id型 確保したFBS-ID
169 * 戻り値
170 * ER 0:ok, 非0:NG
171 */
172ER _ecn_fbs_del(mrb_state *mrb, ECN_FBS_ID fa_id);
173
174/*
175 * 保持データの有無
176 * 引数
177 * ecn_fbs_id型 確保したFBS-ID
178 * 戻り値
179 * bool_t 0:無し, 1:あり
180 */
181bool_t _ecn_fbs_exist_data(ECN_FBS_ID fa_id);
182
183/*
184 * 保持データ長の取得
185 * 引数
186 * ecn_fbs_id型 確保したFBS-ID
187 * 戻り値
188 * ECN_FBS_SSIZE_T 保持しているデータの長さ(byte) -1:NG
189 */
190ECN_FBS_SSIZE_T _ecn_fbs_get_datalen(ECN_FBS_ID fa_id);
191
192/*
193 * 読み取りカーソルの位置取得
194 * 引数
195 * ecn_fbs_id型 確保したFBS-ID
196 * 戻り値
197 * ECN_FBS_SIZE_T 先頭からの絶対位置 -1:NG
198 */
199ECN_FBS_SSIZE_T _ecn_fbs_get_rpos(ECN_FBS_ID fa_id);
200
201/*
202 * 読み取りカーソルの位置設定
203 * 引数
204 * ecn_fbs_id型 確保したFBS-ID
205 * ECN_FBS_SIZE_T fa_pos 設定する位置(先頭からの絶対位置)
206 * 戻り値
207 * ER 0:ok, 非0:NG
208 */
209ER _ecn_fbs_set_rpos(ECN_FBS_ID fa_id, ECN_FBS_SSIZE_T fa_pos);
210
211/*
212 * 読み取りカーソルの位置移動
213 * 引数
214 * ecn_fbs_id型 確保したFBS-ID
215 * ECN_FBS_SIZE_T fa_seek 移動量(現状、前進のみ)
216 * 戻り値
217 * ER 0:ok, 非0:NG
218 */
219ER _ecn_fbs_seek_rpos(ECN_FBS_ID fa_id, ECN_FBS_SSIZE_T fa_seek);
220
221/*
222 * 任意指定位置の1byte読み取り
223 */
224int _ecn_fbs_peek(mrb_state *mrb, ECN_FBS_ID fa_id, ECN_FBS_SSIZE_T fa_seek);
225
226/*
227 * 任意指定位置の1byte書き込み
228 */
229ER _ecn_fbs_poke(mrb_state *mrb, ECN_FBS_ID fa_id, ECN_FBS_SSIZE_T fa_seek, int fa_val);
230
231/*
232 * データ追加
233 * 引数
234 * ecn_fbs_id型 確保したFBS-ID
235 * const void * fa_dat 追加するデータ
236 * ECN_FBS_SSIZE_T fa_len 追加する長さ(byte)
237 * 戻り値
238 * ER 0:ok, 非0:NG
239 */
240ER _ecn_fbs_add_data(mrb_state *mrb, ECN_FBS_ID fa_id, const void *fa_dat, ECN_FBS_SSIZE_T fa_len);
241
242/*
243 * データ追加(領域を自動的に拡張する)
244 * 引数
245 * ecn_fbs_id型 確保したFBS-ID
246 * const void * fa_dat 追加するデータ
247 * ECN_FBS_SSIZE_T fa_len 追加する長さ(byte)
248 * 戻り値
249 * ER 0:ok, 非0:NG
250 */
251ER _ecn_fbs_add_data_ex(mrb_state *mrb, ECN_FBS_ID fa_id, const void *fa_dat, ECN_FBS_SSIZE_T fa_len);
252
253/*
254 * データ取得
255 * 引数
256 * ecn_fbs_id型 確保したFBS-ID
257 * void * fa_buf 取得するバッファ
258 * ECN_FBS_SSIZE_T fa_maxlen 取得する長さ(byte)
259 * ECN_FBS_SSIZE_T *p_len 取得した長さ(byte)
260 * 戻り値
261 * ER 0:ok, 非0:NG
262 */
263ER _ecn_fbs_get_data(mrb_state *mrb, ECN_FBS_ID fa_id, void *fa_buf, ECN_FBS_SSIZE_T fa_maxlen,
264 ECN_FBS_SSIZE_T *p_len);
265
266ER ecn_fbs_enqueue(T_ECN_FBS_QUEUE *pk_queue, T_ECN_FST_BLK *pk_buf);
267ER ecn_fbs_dequeue(T_ECN_FBS_QUEUE *pk_queue, T_ECN_FST_BLK **ppk_buf);
268
269#ifdef __cplusplus
270} /* extern "C" */
271#endif
272
273#endif /* #ifndef TOPPERS_ECHONET_FBS_H */
Note: See TracBrowser for help on using the repository browser.