source: EcnlProtoTool/trunk/ntshell/webserver/websocket_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: 8.9 KB
Line 
1/*
2 * TOPPERS WEBSOCKET Lite Communication Middleware
3 *
4 * Copyright (C) 2017 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 * 固定長バッファ可変長ストリーム
40 */
41
42#ifndef _WEBSOCKET_FBS_H_
43#define _WEBSOCKET_FBS_H_
44
45#include <kernel.h>
46
47#ifdef __cplusplus
48extern "C" {
49#endif
50
51#ifndef WEBSOCKET_MEMPOOL_GET_TMO
52#define WEBSOCKET_MEMPOOL_GET_TMO (0) /* メモリプール取得時のタイムアウト指定 */
53#endif /* WEBSOCKET_MEMPOOL_GET_TMO */
54
55#ifndef NUM_WEBSOCKET_MEMPOOL_BLOCK
56#define NUM_WEBSOCKET_MEMPOOL_BLOCK (60) /* 電文用メモリブロックの数 */
57#endif /* NUM_WEBSOCKET_MEMPOOL_BLOCK */
58
59#ifndef WEBSOCKET_MEMPOOL_BLOCK_SIZE
60#define WEBSOCKET_MEMPOOL_BLOCK_SIZE (256) /* 電文用メモリブロックのサイズ */
61#endif /* WEBSOCKET_MEMPOOL_BLOCK_SIZE */
62
63typedef unsigned int WS_FBS_SIZE_T; /* size_t相当 */
64typedef int WS_FBS_SSIZE_T; /* ssize_t相当 */
65
66/* T_WS_FST_BLK管理領域サイズ */
67#define DEF_WS_EDT_HDR_LEN (sizeof(intptr_t))
68
69/* 管理領域サイズ(64byte - sizeof(T_MSG)) */
70/* #define DEF_WS_FBS_LIB_HDR_LEN ((WEBSOCKET_MEMPOOL_BLOCK_SIZE + sizeof(int) - 1)>> 2) // */
71#define DEF_WS_FBS_LIB_HDR_LEN (64 - DEF_WS_EDT_HDR_LEN)
72
73/* 管理領域を含むブロックに保持するデータサイズ */
74#define DEF_WS_FBS_FST_DAT_LEN (64)
75
76/* リンクポインタ配列のサイズ(byte) */
77#define DEF_WS_FBS_LNK_LEN (WEBSOCKET_MEMPOOL_BLOCK_SIZE - DEF_WS_EDT_HDR_LEN - DEF_WS_FBS_LIB_HDR_LEN - DEF_WS_FBS_FST_DAT_LEN)
78
79/* 固定長バッファ最大サイズ */
80#define DEF_WS_FBS_BUF_MAXLEN ((DEF_WS_FBS_LNK_LEN / sizeof(void *)) * WEBSOCKET_MEMPOOL_BLOCK_SIZE + DEF_WS_FBS_FST_DAT_LEN)
81
82/* 子要素バッファのサイズ */
83#define DEF_WS_FBS_SUB_BUF_LEN WEBSOCKET_MEMPOOL_BLOCK_SIZE
84
85/* 電文の種別(内容は仮) */
86typedef enum
87{
88 WS_FBS_TYPE_BLANK = 0, /* 未使用ストリーム */
89 WS_FBS_TYPE_INTERNAL = 1, /* 内部メッセージ */
90 WS_FBS_TYPE_WEBSOCKET = 2 /* WEBSOCKET電文 */
91} TA_WS_MSG_TYPE;
92
93/* リンクポインタ配列に列挙される、子要素バッファ */
94typedef struct
95{
96 uint8_t payload[WEBSOCKET_MEMPOOL_BLOCK_SIZE];
97} T_WS_SUB_BLK;
98
99/* リンクポインタ配列 */
100typedef union
101{
102 T_WS_SUB_BLK *p_sub[DEF_WS_FBS_LNK_LEN / sizeof(T_WS_SUB_BLK *)];
103 uint8_t bin[DEF_WS_FBS_LNK_LEN];
104} T_WS_FBS_LNK;
105
106/* 管理領域(64byte - sizeof(T_MSG)) */
107typedef struct
108{
109 uint16_t length; /* メッセージ長 */
110 uint16_t type; /* メッセージタイプ */
111 union{
112 ID mbxid; /* 送信元メールボックスID(内部メッセージ) */
113 }sender;
114 union{
115 ID mbxid; /* 送信先メールボックスID(内部メッセージ) */
116 }target;
117 union{
118 ID mbxid; /* 返信先メールボックスID(内部メッセージ) */
119 }reply;
120
121 int rd; /* 読み取りヘッド情報 */
122 int wr; /* 書き込みヘッド情報 */
123} T_WS_FBS_HDR;
124
125/* 管理領域を含むブロックの構造 */
126typedef struct
127{
128 uint8_t _msg[DEF_WS_EDT_HDR_LEN]; /* T_MSG */
129 T_WS_FBS_HDR hdr; /* 管理領域 64byte - sizeof(T_MSG) */
130 uint8_t _gap[DEF_WS_FBS_LIB_HDR_LEN - sizeof(T_WS_FBS_HDR)];
131 T_WS_FBS_LNK lnk; /* リンクポインタ配列 128byte */
132 uint8_t payload[DEF_WS_FBS_FST_DAT_LEN];
133} T_WS_FST_BLK;
134
135/* FBS-ID */
136typedef struct ws_fbs_id_strc
137{
138 T_WS_FST_BLK *ptr;
139} WS_FBS_ID;
140
141/* メッセージキュー */
142typedef struct ws_fbs_queue
143{
144 T_WS_FST_BLK *pk_head; /* 先頭のメッセージ */
145 T_WS_FST_BLK *pk_last; /* 末尾のメッセージ */
146} T_WS_FBS_QUEUE;
147
148extern ID ws_mempoolid;
149
150/* メモリブロック取得 ok:ポインタ NG:NULL */
151void *_ws_fbs_mbx_get(WS_FBS_SIZE_T fa_req_size);
152
153/* メモリブロック解放 ok:0 NG:非0 */
154ER _ws_fbs_mbx_rel(void *p);
155
156/*
157 * 領域確保
158 * 引数
159 * WS_FBS_SIZE_T fa_req_size 要求バッファサイズ(byte)
160 * max: DEF_WS_FBS_BUF_MAXLEN
161 * WS_FBS_ID *fp_id 確保したFBS-IDの格納先
162 * 戻り値
163 * ER 0:ok 非0:NG
164 */
165ER _ws_fbs_cre(WS_FBS_SIZE_T fa_req_size, WS_FBS_ID *fp_id);
166
167/*
168 * 領域解放
169 * 引数
170 * ws_fbs_id型 確保したFBS-ID
171 * 戻り値
172 * ER 0:ok, 非0:NG
173 */
174ER _ws_fbs_del(WS_FBS_ID fa_id);
175
176/*
177 * 保持データの有無
178 * 引数
179 * ws_fbs_id型 確保したFBS-ID
180 * 戻り値
181 * bool_t 0:無し, 1:あり
182 */
183bool_t _ws_fbs_exist_data(WS_FBS_ID fa_id);
184
185/*
186 * 保持データ長の取得
187 * 引数
188 * ws_fbs_id型 確保したFBS-ID
189 * 戻り値
190 * WS_FBS_SSIZE_T 保持しているデータの長さ(byte) -1:NG
191 */
192WS_FBS_SSIZE_T _ws_fbs_get_datalen(WS_FBS_ID fa_id);
193
194/*
195 * 読み取りカーソルの位置取得
196 * 引数
197 * ws_fbs_id型 確保したFBS-ID
198 * 戻り値
199 * WS_FBS_SIZE_T 先頭からの絶対位置 -1:NG
200 */
201WS_FBS_SSIZE_T _ws_fbs_get_rpos(WS_FBS_ID fa_id);
202
203/*
204 * 読み取りカーソルの位置設定
205 * 引数
206 * ws_fbs_id型 確保したFBS-ID
207 * WS_FBS_SIZE_T fa_pos 設定する位置(先頭からの絶対位置)
208 * 戻り値
209 * ER 0:ok, 非0:NG
210 */
211ER _ws_fbs_set_rpos(WS_FBS_ID fa_id, WS_FBS_SSIZE_T fa_pos);
212
213/*
214 * 読み取りカーソルの位置移動
215 * 引数
216 * ws_fbs_id型 確保したFBS-ID
217 * WS_FBS_SIZE_T fa_seek 移動量(現状、前進のみ)
218 * 戻り値
219 * ER 0:ok, 非0:NG
220 */
221ER _ws_fbs_seek_rpos(WS_FBS_ID fa_id, WS_FBS_SSIZE_T fa_seek);
222
223/*
224 * 任意指定位置の1byte読み取り
225 */
226int _ws_fbs_peek(WS_FBS_ID fa_id, WS_FBS_SSIZE_T fa_seek);
227
228/*
229 * 任意指定位置の1byte書き込み
230 */
231ER _ws_fbs_poke(WS_FBS_ID fa_id, WS_FBS_SSIZE_T fa_seek, int fa_val);
232
233/*
234 * データ追加
235 * 引数
236 * ws_fbs_id型 確保したFBS-ID
237 * const void * fa_dat 追加するデータ
238 * WS_FBS_SSIZE_T fa_len 追加する長さ(byte)
239 * 戻り値
240 * ER 0:ok, 非0:NG
241 */
242ER _ws_fbs_add_data(WS_FBS_ID fa_id, const void *fa_dat, WS_FBS_SSIZE_T fa_len);
243
244/*
245 * データ追加(領域を自動的に拡張する)
246 * 引数
247 * ws_fbs_id型 確保したFBS-ID
248 * const void * fa_dat 追加するデータ
249 * WS_FBS_SSIZE_T fa_len 追加する長さ(byte)
250 * 戻り値
251 * ER 0:ok, 非0:NG
252 */
253ER _ws_fbs_add_data_ex(WS_FBS_ID fa_id, const void *fa_dat, WS_FBS_SSIZE_T fa_len);
254
255/*
256 * データ取得
257 * 引数
258 * ws_fbs_id型 確保したFBS-ID
259 * void * fa_buf 取得するバッファ
260 * WS_FBS_SSIZE_T fa_maxlen 取得する長さ(byte)
261 * WS_FBS_SSIZE_T *p_len 取得した長さ(byte)
262 * 戻り値
263 * ER 0:ok, 非0:NG
264 */
265ER _ws_fbs_get_data(WS_FBS_ID fa_id, void *fa_buf, WS_FBS_SSIZE_T fa_maxlen,
266 WS_FBS_SSIZE_T *p_len);
267
268ER ws_fbs_enqueue(T_WS_FBS_QUEUE *pk_queue, T_WS_FST_BLK *pk_buf);
269ER ws_fbs_dequeue(T_WS_FBS_QUEUE *pk_queue, T_WS_FST_BLK **ppk_buf);
270
271#ifdef __cplusplus
272} /* extern "C" */
273#endif
274
275#endif /* #ifndef _WEBSOCKET_FBS_H_ */
Note: See TracBrowser for help on using the repository browser.