source: EcnlProtoTool/trunk/mrbgems/mruby-ecnl/src/echonet_dbg.c@ 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-csrc;charset=UTF-8
File size: 16.4 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 * ECHONET Lite タスク デバッグ出力
39 */
40
41#include <mruby.h>
42#include <stdio.h>
43#include <stdlib.h>
44#include <stdarg.h>
45#include <string.h>
46#include <ctype.h>
47
48#include "echonet.h"
49#include "echonet_dbg.h"
50#include "echonet_fbs.h"
51#include "echonet_task.h"
52
53#ifdef ECN_DBG_WAI_ENA
54#define _ECN_DBG_WAI_SYSLOG _ecn_dbg_wai_syslog()
55#else
56#define _ECN_DBG_WAI_SYSLOG
57#endif
58
59#if defined(ECN_DBG_PUT_ENA) || defined(ECN_CAP_PUT_ENA)
60#if defined(ECN_DBG_WAI_ENA)
61static ER _ecn_dbg_wai_syslog(void);
62/*
63 * syslog()バッファに余裕ができるまで待つ
64 */
65static ER _ecn_dbg_wai_syslog(void)
66{
67 T_SYSLOG_RLOG a_rlog;
68 ER a_ret;
69 int a_ct = 0;
70#ifndef ECN_DBG_WAI_SYSLOG_RETRY
71 #ifdef LOGTASK
72 #define ECN_DBG_WAI_SYSLOG_RETRY 10
73 #else
74 #define ECN_DBG_WAI_SYSLOG_RETRY 0
75 #endif
76#endif
77
78 for (;;) {
79 a_ret = syslog_ref_log(&a_rlog);
80 if (a_ret < 0)
81 return a_ret;
82 if (1 <= a_rlog.count) {
83 a_ct = 0;
84 } else
85#if (defined ECN_DBG_WAI_SYSLOG_RETRY) && (0 < ECN_DBG_WAI_SYSLOG_RETRY)
86 if (ECN_DBG_WAI_SYSLOG_RETRY <= ++a_ct)
87#endif
88 {
89/* a_ret = dly_tsk(100);
90 if (a_ret < 0 && a_ret != E_RLWAI)
91 return a_ret; // */
92 break;
93 }
94
95 a_ret = dly_tsk(1);
96 if (a_ret < 0 && a_ret != E_RLWAI)
97 return a_ret;
98 }
99 return 0;
100}
101#endif /* #if defined(ECN_DBG_WAI_ENA) */
102
103/*
104 * デバッグ出力
105 * 例: ECN_DBG_PUT_2("task start");
106 */
107int _ecn_dbg_dbgput(ecnl_svc_task_t *svc, const char *fp_srcloc, const char *fp_form, ...)
108{
109 va_list v;
110 char *p_buf = 0;
111#ifdef ECN_DBG_PUT_USE_STATIC
112 #ifndef SEM_ECN_DBG_PUT
113 /* 256byteバッファ8本ローテーション */
114 static char a_buf[8][256];
115 static volatile uint_t a_buf_idx = 0;
116 uint_t a_buf_idx_a;
117 #else
118 /* セマフォを用いて、1本のバッファ上に文字列を並べて使う */
119 static char a_buf[1024];
120 static volatile uint_t a_buf_pos = 0;
121 size_t a_buf_len;
122 #define ECN_DBG_PUT_BUF_MAX a_buf_len
123 #endif /* #ifdef SEM_ECN_DBG_PUT */
124#endif /* #ifdef ECN_DBG_PUT_USE_STATIC */
125#ifndef ECN_DBG_PUT_BUF_MAX
126 #define ECN_DBG_PUT_BUF_MAX 255
127#endif
128
129 if (!fp_srcloc)
130 fp_srcloc = "(null)";
131
132#ifdef SEM_ECN_DBG_PUT
133 syscall(wai_sem(SEM_ECN_DBG_PUT));
134#endif
135
136#ifdef ECN_DBG_PUT_USE_STATIC
137 #ifndef SEM_ECN_DBG_PUT
138 a_buf_idx_a = ++a_buf_idx;
139 p_buf = a_buf[a_buf_idx_a & 0x07];
140 #else
141 if (sizeof(a_buf) - a_buf_pos < 80) /* 残りが80byte未満になったら、先頭に戻る */
142 a_buf_pos = 0;
143 p_buf = a_buf + a_buf_pos;
144 a_buf_len = sizeof(a_buf) - a_buf_pos - 1;
145 if (80 * 2 <= a_buf_len) /* 80byte*2以上の余白があるうちは、末尾80byteを残す */
146 a_buf_len -= 80;
147 #endif /* #ifdef SEM_ECN_DBG_PUT */
148#else
149 p_buf = (char *)_ecn_fbs_mbx_get(mrb, 255);
150 if (!p_buf) {
151 printf("%s: (+mbx fault) %s", fp_srcloc, fp_form);
152 #ifdef SEM_ECN_DBG_PUT
153 syscall(sig_sem(SEM_ECN_DBG_PUT));
154 #endif /* #ifdef SEM_ECN_DBG_PUT */
155 return 1;
156 }
157#endif /* #ifdef ECN_DBG_PUT_USE_STATIC */
158
159 va_start(v, fp_form);
160
161#ifdef _MSC_VER
162 vsnprintf_s(p_buf, ECN_DBG_PUT_BUF_MAX, ECN_DBG_PUT_BUF_MAX, fp_form, v);
163#else
164 vsprintf(p_buf, fp_form, v);
165#endif
166#ifdef ECN_DBG_PUT_USE_STATIC
167 #ifdef SEM_ECN_DBG_PUT
168 a_buf_len = strlen(p_buf) + 1;
169 /* 残りが80byte未満になったら */
170 if (sizeof(a_buf) - a_buf_pos - a_buf_len < 80) {
171 /* 先頭に戻る */
172 a_buf_pos = 0;
173 } else {
174 a_buf_pos += a_buf_len;
175 }
176 #endif /* #ifdef SEM_ECN_DBG_PUT */
177#endif
178
179 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
180
181#ifdef SEM_ECN_DBG_PUT
182 syscall(sig_sem(SEM_ECN_DBG_PUT));
183#endif
184
185 printf("%s: %s", fp_srcloc, p_buf);
186
187 va_end(v);
188
189#ifndef ECN_DBG_PUT_USE_STATIC
190 _ecn_fbs_mbx_rel(mrb, p_buf);
191#endif
192 return 0;
193}
194
195/* ECN_ENOD_IDの文字列変換 */
196const char *_ecn_dbg_enod2str(ECN_ENOD_ID fa_enod_id)
197{
198/* #define _ECN_FBS_DBG_ENOD2STR_BUF_MAX_BIT (4)
199/* */
200#ifdef _ECN_FBS_DBG_ENOD2STR_BUF_MAX_BIT
201 static volatile uint8_t a_idx_vol = 0;
202 static char a_buf[1 << _ECN_FBS_DBG_ENOD2STR_BUF_MAX_BIT][sizeof("ENOD_REMOTE_ID()")+5];
203 uint8_t a_idx;
204#endif
205
206 if (fa_enod_id == ENOD_NOT_MATCH_ID)
207 return "ENOD_NOT_MATCH_ID";
208 if (fa_enod_id == ENOD_MULTICAST_ID)
209 return "ENOD_MULTICAST_ID";
210 if (fa_enod_id == ENOD_LOCAL_ID)
211 return "ENOD_LOCAL_ID";
212 if (fa_enod_id == ENOD_API_ID)
213 return "ENOD_API_ID";
214 if (fa_enod_id == ENOD_REMOTE_ID)
215 return "ENOD_REMOTE_ID(0)";
216 if (fa_enod_id == ((ENOD_REMOTE_ID) + 1))
217 return "ENOD_REMOTE_ID(1)";
218 if (fa_enod_id == ((ENOD_REMOTE_ID) + 2))
219 return "ENOD_REMOTE_ID(2)";
220 if (fa_enod_id == ((ENOD_REMOTE_ID) + 3))
221 return "ENOD_REMOTE_ID(3)";
222 if (fa_enod_id == ((ENOD_REMOTE_ID) + 4))
223 return "ENOD_REMOTE_ID(4)";
224 if (fa_enod_id == ((ENOD_REMOTE_ID) + 5))
225 return "ENOD_REMOTE_ID(5)";
226#ifdef _ECN_FBS_DBG_ENOD2STR_BUF_MAX_BIT
227 if (ENOD_REMOTE_ID <= fa_enod_id) {
228 /* return "ENOD_REMOTE_ID"; */
229 a_idx = (++a_idx_vol) & ((1 << _ECN_FBS_DBG_ENOD2STR_BUF_MAX_BIT) - 1);
230#ifdef _MSC_VER
231 sprintf_s(a_buf[a_idx], sizeof(*a_buf), "ENOD_REMOTE_ID(%d)", fa_enod_id - ENOD_REMOTE_ID);
232#else
233 sprintf(a_buf[a_idx], "ENOD_REMOTE_ID(%d)", fa_enod_id - ENOD_REMOTE_ID);
234#endif
235 return a_buf[a_idx];
236 }
237#endif
238
239 return "?";
240}
241
242/*
243 * バイナリダンプ出力
244 */
245void _ecn_dbg_bindmp(const uint8_t *buffer, size_t len)
246{
247 /* static領域のバッファを切り替える個数(2^n) */
248 #define _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT (4)
249/* */
250#ifdef SEM_ECN_DBG_BINDMP
251 #ifdef _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT
252 #undef _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT
253 /* セマフォ(SEM_ECN_DBG_BINDMP)が定義されている場合、バッファ切り替えは不要なのでundef */
254 #endif
255#endif
256#ifndef _ECN_FBS_DBG_BINDMP_BUFLEN
257 /* バッファサイズ(bindmp中の1行が収まるサイズ) */
258 #define _ECN_FBS_DBG_BINDMP_BUFLEN (80)
259#endif
260#ifdef _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT
261 /* static領域のバッファを切り替えるための管理用変数 */
262 static volatile uint8_t a_idx_vol = 0;
263 /* static領域のバッファ切り替え領域 */
264 static char a_buf_area[1 << _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT][_ECN_FBS_DBG_BINDMP_BUFLEN];
265 uint8_t a_idx;
266 char *a_buf;
267#else
268 /* static領域のバッファ領域 */
269 static char a_buf[_ECN_FBS_DBG_BINDMP_BUFLEN];
270#endif
271 const uint8_t *p = buffer; /* 読み取りポインタ */
272 int i, a_blk, a_blk_max, a_pos = 0;
273 const T_ECN_EDT_HDR *p_req_esv;
274 const T_ECN_INTERNAL_MSG *p_im;
275
276#ifdef SEM_ECN_DBG_BINDMP
277 syscall(wai_sem(SEM_ECN_DBG_BINDMP));
278#endif
279
280 if (len != 256) {
281 a_blk_max = 1;
282 } else {
283 a_blk_max = ((T_ECN_FST_BLK *)buffer)->hdr.wr;
284 if (!a_blk_max)
285 a_blk_max = 1;
286 }
287 #ifndef ECN_DBG_BINDMP_MAXLEN
288 /* bindmp出力の最大サイズ */
289 #define ECN_DBG_BINDMP_MAXLEN 1600
290 #endif
291 if (ECN_DBG_BINDMP_MAXLEN < len) {
292 len = ECN_DBG_BINDMP_MAXLEN;
293 }
294
295#ifdef _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT
296 a_idx = (++a_idx_vol) & ((1 << _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT) - 1);
297 a_buf = a_buf_area[a_idx];
298 /* #define a_buf (a_buf_area[a_idx]) */
299#endif
300
301 for (a_blk = 0; p && a_blk < a_blk_max; p = ((T_ECN_FST_BLK *)buffer)->lnk.p_sub[a_blk++]->payload) {
302 if (0 < a_blk) {
303 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
304 printf("p_sub[%d] (0x%p)", a_blk - 1, p);
305 }
306 memset(a_buf, 0, _ECN_FBS_DBG_BINDMP_BUFLEN);
307 for (i = 0; i < (int)len; i++) {
308 if (i % 16 == 0) {
309 if (a_buf[0]) {
310 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
311 printf("%s", a_buf);
312 }
313#ifdef _MSC_VER
314 sprintf_s(a_buf, _ECN_FBS_DBG_BINDMP_BUFLEN, "[%08X]:", i);
315#else
316 sprintf(a_buf, "[%08X]:", i);
317#endif
318 a_pos = strlen(a_buf);
319 } else {
320 a_buf[a_pos++] = (i % 16 == 8 ? '-':' ');
321 }
322#ifdef _MSC_VER
323 sprintf_s(a_buf + a_pos, _ECN_FBS_DBG_BINDMP_BUFLEN - a_pos, "%02X", p[i]);
324#else
325 sprintf(a_buf + a_pos, "%02X", p[i]);
326#endif
327 a_pos += 2;
328 }
329 if (a_buf[0]) {
330 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
331 printf("%s", a_buf);
332 }
333 if (a_blk_max == 1)
334 break;
335 }
336
337 if (len == 256) {
338 switch (((const T_ECN_FST_BLK *)buffer)->hdr.type) {
339 case ECN_MSG_ECHONET:
340 p_req_esv = (T_ECN_EDT_HDR *)&((const T_ECN_FST_BLK *)buffer)->payload;
341 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
342 printf(" sender: %d %s, target: %d %s",
343 ((T_ECN_FST_BLK *)buffer)->hdr.sender.id, _ecn_dbg_enod2str(((T_ECN_FST_BLK *)buffer)->hdr.sender.id),
344 ((T_ECN_FST_BLK *)buffer)->hdr.target.id, _ecn_dbg_enod2str(((T_ECN_FST_BLK *)buffer)->hdr.target.id));
345 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
346 printf(" ecn_hdr: 0x%02X 0x%02X 0x%04X", p_req_esv->ecn_hdr.ehd1, p_req_esv->ecn_hdr.ehd2, p_req_esv->ecn_hdr.tid);
347 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
348 printf(" edata: 0x%06X 0x%06X 0x%02X 0x%02X (%s)",
349 p_req_esv->edata.seoj.eojx1 << 16 | p_req_esv->edata.seoj.eojx2 << 8 | p_req_esv->edata.seoj.eojx3,
350 p_req_esv->edata.deoj.eojx1 << 16 | p_req_esv->edata.deoj.eojx2 << 8 | p_req_esv->edata.deoj.eojx3,
351 p_req_esv->edata.esv, p_req_esv->edata.opc, _ecn_dbg_esv2str(p_req_esv->edata.esv));
352 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
353 printf(" ecn_prp: 0x%02X 0x%02X", p_req_esv->ecn_prp.epc, p_req_esv->ecn_prp.pdc);
354 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
355 printf(" cur(blk/pos): wr %d, rd %d",
356 (int)((T_ECN_FST_BLK *)buffer)->hdr.wr,
357 (int)((T_ECN_FST_BLK *)buffer)->hdr.rd);
358 break;
359 case ECN_MSG_INTERNAL:
360 p_im = (const T_ECN_INTERNAL_MSG *)&((const T_ECN_FST_BLK *)buffer)->payload[0];
361 printf(" a_im.command: %d:%s", p_im->command,
362 (p_im->command == ECN_INM_NOTIFY_INSTANCELIST ? "ECN_INM_NOTIFY_INSTANCELIST":
363 (p_im->command == ECN_INM_GET_DEVICE_LIST_REQ ? "ECN_INM_GET_DEVICE_LIST_REQ" :
364 (p_im->command == ECN_INM_GET_DEVICE_LIST_RES ? "ECN_INM_GET_DEVICE_LIST_RES" :
365 (p_im->command == ECN_INM_GET_DEVICE_INFO_REQ ? "ECN_INM_GET_DEVICE_INFO_REQ " :
366 (p_im->command == ECN_INM_GET_DEVICE_INFO_RES ? "ECN_INM_GET_DEVICE_INFO_RES " :
367 (p_im->command == ECN_LCL_MSG_GET_LCLADDR_REQ ? "ECN_LCL_MSG_GET_LCLADDR_REQ " :
368 (p_im->command == ECN_LCL_MSG_GET_LCLADDR_REQ ? "ECN_LCL_MSG_GET_LCLADDR_REQ " :
369 (p_im->command == ECN_LCL_MSG_GET_LCLADDR_ERROR ? "ECN_LCL_MSG_GET_LCLADDR_ERROR" : "?")))))))));
370 memset(a_buf, 0, _ECN_FBS_DBG_BINDMP_BUFLEN);
371 a_blk_max = ((const T_ECN_FST_BLK *)buffer)->hdr.wr;
372 if (0 < a_blk_max) {
373 if (64 < a_blk_max)
374 a_blk_max = 64;
375 if (_ECN_FBS_DBG_BINDMP_BUFLEN < a_blk_max)
376 a_blk_max = _ECN_FBS_DBG_BINDMP_BUFLEN;
377 for (i = offsetof(T_ECN_INTERNAL_MSG, data); i < a_blk_max; i++) {
378 a_blk = ((const T_ECN_FST_BLK *)buffer)->payload[i];
379 if (!isprint(a_blk) || !isascii(a_blk))
380 a_blk = '.';
381 a_buf[i - 1] = a_blk;
382 }
383 printf(" a_im.data: [%s]", &a_buf[offsetof(T_ECN_INTERNAL_MSG, data) - 1]);
384 }
385 break;
386 default:
387 printf(" invalid type: %d", ((const T_ECN_FST_BLK *)buffer)->hdr.type);
388 }
389 }
390 else if (8 <= len
391 && ((const T_ECN_FST_BLK *)buffer)->payload[0] == 0x10
392 && ((const T_ECN_FST_BLK *)buffer)->payload[1] == 0x81) {
393 p_req_esv = (const T_ECN_EDT_HDR *)&((const T_ECN_FST_BLK *)buffer)->payload[0];
394 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
395 printf(" ecn_hdr: 0x%02X 0x%02X 0x%04X", p_req_esv->ecn_hdr.ehd1, p_req_esv->ecn_hdr.ehd2, p_req_esv->ecn_hdr.tid);
396 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
397 printf(" edata: 0x%06X 0x%06X 0x%02X 0x%02X (%s)",
398 p_req_esv->edata.seoj.eojx1 << 16 | p_req_esv->edata.seoj.eojx2 << 8 | p_req_esv->edata.seoj.eojx3,
399 p_req_esv->edata.deoj.eojx1 << 16 | p_req_esv->edata.deoj.eojx2 << 8 | p_req_esv->edata.deoj.eojx3,
400 p_req_esv->edata.esv, p_req_esv->edata.opc, _ecn_dbg_esv2str(p_req_esv->edata.esv));
401 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待つ */
402 printf(" ecn_prp: 0x%02X 0x%02X", p_req_esv->ecn_prp.epc, p_req_esv->ecn_prp.pdc);
403 }
404#ifdef SEM_ECN_DBG_BINDMP
405 syscall(sig_sem(SEM_ECN_DBG_BINDMP));
406#endif
407}
408
409/*
410 * ECHONET Liteサービスコード文字列変換
411 */
412const char *_ecn_dbg_esv2str(uint8_t fa_esv)
413{
414 switch (fa_esv) {
415 case ESV_SET_I_SNA: return "プロパティ値書き込み要求不可応答"; /* 0x50 */
416 case ESV_SET_C_SNA: return "プロパティ値書き込み要求不可応答"; /* 0x51 */
417 case ESV_GET_SNA: return "プロパティ値読み出し不可応答"; /* 0x52 */
418 case ESV_INF_SNA: return "プロパティ値通知不可応答"; /* 0x53 */
419 case ESV_SET_GET_SNA: return "プロパティ値書き込み・読み出し不可応答"; /* 0x5E */
420 case ESV_SET_I: return "プロパティ値書き込み要求(応答不要)"; /* 0x60 */
421 case ESV_SET_C: return "プロパティ値書き込み要求(応答要)"; /* 0x61 */
422 case ESV_GET: return "プロパティ値読み出し要求"; /* 0x62 */
423 case ESV_INF_REQ: return "プロパティ値通知要求"; /* 0x63 */
424 case ESV_SET_GET: return "プロパティ値書き込み・読み出し要求"; /* 0x6E */
425 case ESV_SET_RES: return "プロパティ値書き込み応答"; /* 0x71 */
426 case ESV_GET_RES: return "プロパティ値読み出し応答"; /* 0x72 */
427 case ESV_INF: return "プロパティ値通知"; /* 0x73 */
428 case ESV_INFC: return "プロパティ値通知(応答要)"; /* 0x74 */
429 case ESV_SET_GET_RES: return "プロパティ値書き込み・読み出し応答"; /* 0x7E */
430 case ESV_INFC_RES: return "プロパティ値通知応答"; /* 0x7A */
431 default:
432 return "(unknown)";
433 }
434}
435
436const char *itron_strerror(int errorno)
437{
438 switch (errorno) {
439 case E_SYS: return "システムエラー";
440 case E_PAR: return "パラメータエラー";
441 case E_NOMEM: return "メモリ不足";
442 case E_OBJ: return "オブジェクト状態エラー";
443 case E_NOEXS: return "オブジェクト未生成";
444 case E_TMOUT: return "ポーリング失敗またはタイムアウト";
445 case E_BOVR: return "バッファオーバーフロー";
446 case E_BRK: return "ユーザーによる中断";
447 default:
448 return "(unknown)";
449 }
450}
451
452#endif /* #if defined(ECN_DBG_PUT_ENA) || defined(ECN_CAP_PUT_ENA) */
Note: See TracBrowser for help on using the repository browser.