source: uKadecot/trunk/ecnl_ssp/echonet_fbs.h@ 108

Last change on this file since 108 was 108, checked in by coas-nagasima, 9 years ago

MIMEプロパティの変更

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