source: azure_iot_hub/trunk/ntshell/echonet/echonet_dbg.c@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 15.9 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者
7は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9 * 変・再é…
10å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再é…
16å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
17å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
18 * 者
19マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
24 * と.
25 * (a) 再é…
26å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
27マニュアルなど)に,上記の著
28 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
29 * (b) 再é…
30å¸ƒã®å½¢æ…
31‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
32 * 報告すること.
33 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34 * 害からも,上記著作権者
35およびTOPPERSプロジェクトをå…
36è²¬ã™ã‚‹ã“と.
37 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
38 * 由に基づく請求からも,上記著作権者
39およびTOPPERSプロジェクトを
40 * å…
41è²¬ã™ã‚‹ã“と.
42 *
43 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
44お
45 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
46 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
47 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
48 * の責任を負わない.
49 *
50 * @(#) $Id: echonet_dbg.c 388 2019-05-22 11:25:18Z coas-nagasima $
51 */
52
53/*
54 * ECHONET Lite タスク デバッグ出力
55 */
56
57#include <kernel.h>
58#include <stdio.h>
59#include <stdlib.h>
60#include <stdarg.h>
61#include <string.h>
62#include <t_syslog.h>
63#include <t_stdlib.h>
64#include <sil.h>
65#include <ctype.h>
66
67#include "syssvc/serial.h"
68#include "syssvc/syslog.h"
69
70#include <netinet/in.h>
71#include <netinet/in_itron.h>
72
73#include "echonet.h"
74#include "echonet_dbg.h"
75#include "echonet_fbs.h"
76#include "echonet_task.h"
77
78#ifdef ECN_DBG_WAI_ENA
79#define _ECN_DBG_WAI_SYSLOG _ecn_dbg_wai_syslog()
80#else
81#define _ECN_DBG_WAI_SYSLOG
82#endif
83
84#if defined(ECN_DBG_PUT_ENA) || defined(ECN_CAP_PUT_ENA)
85#if defined(ECN_DBG_WAI_ENA)
86static ER _ecn_dbg_wai_syslog(void);
87/*
88 * syslog()バッファに余裕ができるまで待
89つ
90 */
91static ER _ecn_dbg_wai_syslog(void)
92{
93 T_SYSLOG_RLOG a_rlog;
94 ER a_ret;
95 int a_ct = 0;
96#ifndef ECN_DBG_WAI_SYSLOG_RETRY
97 #ifdef LOGTASK
98 #define ECN_DBG_WAI_SYSLOG_RETRY 10
99 #else
100 #define ECN_DBG_WAI_SYSLOG_RETRY 0
101 #endif
102#endif
103
104 for (;;) {
105 a_ret = syslog_ref_log(&a_rlog);
106 if (a_ret < 0)
107 return a_ret;
108 if (1 <= a_rlog.count) {
109 a_ct = 0;
110 } else
111#if (defined ECN_DBG_WAI_SYSLOG_RETRY) && (0 < ECN_DBG_WAI_SYSLOG_RETRY)
112 if (ECN_DBG_WAI_SYSLOG_RETRY <= ++a_ct)
113#endif
114 {
115/* a_ret = dly_tsk(100);
116 if (a_ret < 0 && a_ret != E_RLWAI)
117 return a_ret; // */
118 break;
119 }
120
121 a_ret = dly_tsk(1);
122 if (a_ret < 0 && a_ret != E_RLWAI)
123 return a_ret;
124 }
125 return 0;
126}
127#endif /* #if defined(ECN_DBG_WAI_ENA) */
128
129/*
130 * デバッグ出力
131 * 例: ECN_DBG_PUT("task start");
132 */
133int _ecn_dbg_dbgput(const char *fp_srcloc, const char *fp_form, ...)
134{
135 va_list v;
136 char *p_buf = 0;
137 ID tskid;
138#ifdef ECN_DBG_PUT_USE_STATIC
139 #ifndef SEM_ECN_DBG_PUT
140 /* 256byteバッファ8本ローテーション */
141 static char a_buf[8][256];
142 static volatile uint_t a_buf_idx = 0;
143 uint_t a_buf_idx_a;
144 #else
145 /* セマフォを用いて、1本のバッファ上に文字列を並べて使う */
146 static char a_buf[1024];
147 static volatile uint_t a_buf_pos = 0;
148 size_t a_buf_len;
149 #define ECN_DBG_PUT_BUF_MAX a_buf_len
150 #endif /* #ifdef SEM_ECN_DBG_PUT */
151#endif /* #ifdef ECN_DBG_PUT_USE_STATIC */
152#ifndef ECN_DBG_PUT_BUF_MAX
153 #define ECN_DBG_PUT_BUF_MAX 255
154#endif
155
156 get_tid(&tskid);
157
158 if (!fp_srcloc)
159 fp_srcloc = "(null)";
160
161#ifdef SEM_ECN_DBG_PUT
162 syscall(wai_sem(SEM_ECN_DBG_PUT));
163#endif
164
165#ifdef ECN_DBG_PUT_USE_STATIC
166 #ifndef SEM_ECN_DBG_PUT
167 a_buf_idx_a = ++a_buf_idx;
168 p_buf = a_buf[a_buf_idx_a & 0x07];
169 #else
170 if (sizeof(a_buf) - a_buf_pos < 80) /* 残りが80byte未満になったら、å…
171ˆé ­ã«æˆ»ã‚‹ */
172 a_buf_pos = 0;
173 p_buf = a_buf + a_buf_pos;
174 a_buf_len = sizeof(a_buf) - a_buf_pos - 1;
175 if (80 * 2 <= a_buf_len) /* 80byte*2以上の余白があるうちは、末尾80byteを残す */
176 a_buf_len -= 80;
177 #endif /* #ifdef SEM_ECN_DBG_PUT */
178#else
179 p_buf = (char *)_ecn_fbs_dtq_get(255);
180 if (!p_buf) {
181 syslog(LOG_NOTICE, "%s[%d]: (+dtq fault) %s", fp_srcloc, (int)tskid, fp_form);
182 #ifdef SEM_ECN_DBG_PUT
183 syscall(sig_sem(SEM_ECN_DBG_PUT));
184 #endif /* #ifdef SEM_ECN_DBG_PUT */
185 return 1;
186 }
187#endif /* #ifdef ECN_DBG_PUT_USE_STATIC */
188
189 va_start(v, fp_form);
190
191#ifdef _MSC_VER
192 vsnprintf_s(p_buf, ECN_DBG_PUT_BUF_MAX, ECN_DBG_PUT_BUF_MAX, fp_form, v);
193#else
194 vsprintf(p_buf, fp_form, v);
195#endif
196#ifdef ECN_DBG_PUT_USE_STATIC
197 #ifdef SEM_ECN_DBG_PUT
198 a_buf_len = strlen(p_buf) + 1;
199 /* 残りが80byte未満になったら */
200 if (sizeof(a_buf) - a_buf_pos - a_buf_len < 80) {
201 /* å…
202ˆé ­ã«æˆ»ã‚‹ */
203 a_buf_pos = 0;
204 } else {
205 a_buf_pos += a_buf_len;
206 }
207 #endif /* #ifdef SEM_ECN_DBG_PUT */
208#endif
209
210 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
211つ */
212
213#ifdef SEM_ECN_DBG_PUT
214 syscall(sig_sem(SEM_ECN_DBG_PUT));
215#endif
216
217 syslog(LOG_NOTICE, "%s[%d]: %s", fp_srcloc, (int)tskid, p_buf);
218
219 va_end(v);
220
221#ifndef ECN_DBG_PUT_USE_STATIC
222 _ecn_fbs_dtq_rel(p_buf);
223#endif
224 return 0;
225}
226
227/* ECN_ENOD_IDの文字列変換 */
228const char *_ecn_dbg_enod2str(ECN_ENOD_ID fa_enod_id)
229{
230/* #define _ECN_FBS_DBG_ENOD2STR_BUF_MAX_BIT (4)
231/* */
232#ifdef _ECN_FBS_DBG_ENOD2STR_BUF_MAX_BIT
233 static volatile uint8_t a_idx_vol = 0;
234 static char a_buf[1 << _ECN_FBS_DBG_ENOD2STR_BUF_MAX_BIT][sizeof("ENOD_REMOTE_ID()")+5];
235 uint8_t a_idx;
236#endif
237
238 if (fa_enod_id == ENOD_NOT_MATCH_ID)
239 return "ENOD_NOT_MATCH_ID";
240 if (fa_enod_id == ENOD_MULTICAST_ID)
241 return "ENOD_MULTICAST_ID";
242 if (fa_enod_id == ENOD_LOCAL_ID)
243 return "ENOD_LOCAL_ID";
244 if (fa_enod_id == ENOD_API_ID)
245 return "ENOD_API_ID";
246 if (fa_enod_id == ENOD_REMOTE_ID)
247 return "ENOD_REMOTE_ID(0)";
248 if (fa_enod_id == ((ENOD_REMOTE_ID) + 1))
249 return "ENOD_REMOTE_ID(1)";
250 if (fa_enod_id == ((ENOD_REMOTE_ID) + 2))
251 return "ENOD_REMOTE_ID(2)";
252 if (fa_enod_id == ((ENOD_REMOTE_ID) + 3))
253 return "ENOD_REMOTE_ID(3)";
254 if (fa_enod_id == ((ENOD_REMOTE_ID) + 4))
255 return "ENOD_REMOTE_ID(4)";
256 if (fa_enod_id == ((ENOD_REMOTE_ID) + 5))
257 return "ENOD_REMOTE_ID(5)";
258#ifdef _ECN_FBS_DBG_ENOD2STR_BUF_MAX_BIT
259 if (ENOD_REMOTE_ID <= fa_enod_id) {
260 /* return "ENOD_REMOTE_ID"; */
261 a_idx = (++a_idx_vol) & ((1 << _ECN_FBS_DBG_ENOD2STR_BUF_MAX_BIT) - 1);
262#ifdef _MSC_VER
263 sprintf_s(a_buf[a_idx], sizeof(*a_buf), "ENOD_REMOTE_ID(%d)", fa_enod_id - ENOD_REMOTE_ID);
264#else
265 sprintf(a_buf[a_idx], "ENOD_REMOTE_ID(%d)", fa_enod_id - ENOD_REMOTE_ID);
266#endif
267 return a_buf[a_idx];
268 }
269#endif
270
271 return "?";
272}
273
274/*
275 * バイナリダンプ出力
276 */
277void _ecn_dbg_bindmp(const uint8_t *buffer, size_t len)
278{
279 /* static領域のバッファを切り替える個数(2^n) */
280 #define _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT (4)
281/* */
282#ifdef SEM_ECN_DBG_BINDMP
283 #ifdef _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT
284 #undef _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT
285 /* セマフォ(SEM_ECN_DBG_BINDMP)が定義されている場合、バッファ切り替えは不要なのでundef */
286 #endif
287#endif
288#ifndef _ECN_FBS_DBG_BINDMP_BUFLEN
289 /* バッファサイズ(bindmp中の1行が収まるサイズ) */
290 #define _ECN_FBS_DBG_BINDMP_BUFLEN (80)
291#endif
292#ifdef _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT
293 /* static領域のバッファを切り替えるための管理用変数 */
294 static volatile uint8_t a_idx_vol = 0;
295 /* static領域のバッファ切り替え領域 */
296 static char a_buf_area[1 << _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT][_ECN_FBS_DBG_BINDMP_BUFLEN];
297 uint8_t a_idx;
298 char *a_buf;
299#else
300 /* static領域のバッファ領域 */
301 static char a_buf[_ECN_FBS_DBG_BINDMP_BUFLEN];
302#endif
303 const uint8_t *p = buffer; /* 読み取りポインタ */
304 int i, a_blk, a_blk_max, a_pos = 0;
305 const T_ECN_EDT_HDR *p_req_esv;
306 const T_ECN_INTERNAL_MSG *p_im;
307
308#ifdef SEM_ECN_DBG_BINDMP
309 syscall(wai_sem(SEM_ECN_DBG_BINDMP));
310#endif
311
312 if (len != 256) {
313 a_blk_max = 1;
314 } else {
315 a_blk_max = ((T_ECN_FST_BLK *)buffer)->hdr.wr.blk
316 + (((T_ECN_FST_BLK *)buffer)->hdr.wr.pos ? 1 : 0);
317 if (!a_blk_max)
318 a_blk_max = 1;
319 }
320 #ifndef ECN_DBG_BINDMP_MAXLEN
321 /* bindmp出力の最大サイズ */
322 #define ECN_DBG_BINDMP_MAXLEN 1600
323 #endif
324 if (ECN_DBG_BINDMP_MAXLEN < len) {
325 len = ECN_DBG_BINDMP_MAXLEN;
326 }
327
328#ifdef _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT
329 a_idx = (++a_idx_vol) & ((1 << _ECN_FBS_DBG_BINDMP_BUF_MAX_BIT) - 1);
330 a_buf = a_buf_area[a_idx];
331 /* #define a_buf (a_buf_area[a_idx]) */
332#endif
333
334 for (a_blk = 0; p && a_blk < a_blk_max; p = ((T_ECN_FST_BLK *)buffer)->lnk.p_sub[a_blk++]->dat) {
335 if (0 < a_blk) {
336 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
337つ */
338 syslog(LOG_NOTICE, "p_sub[%d] (0x%08X)", a_blk - 1, p);
339 }
340 memset(a_buf, 0, _ECN_FBS_DBG_BINDMP_BUFLEN);
341 for (i = 0; i < (int)len; i++) {
342 if (i % 16 == 0) {
343 if (a_buf[0]) {
344 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
345つ */
346 syslog(LOG_NOTICE, "%s", a_buf);
347 }
348#ifdef _MSC_VER
349 sprintf_s(a_buf, _ECN_FBS_DBG_BINDMP_BUFLEN, "[%08X]:", i);
350#else
351 sprintf(a_buf, "[%08X]:", i);
352#endif
353 a_pos = strlen(a_buf);
354 } else {
355 a_buf[a_pos++] = (i % 16 == 8 ? '-':' ');
356 }
357#ifdef _MSC_VER
358 sprintf_s(a_buf + a_pos, _ECN_FBS_DBG_BINDMP_BUFLEN - a_pos, "%02X", p[i]);
359#else
360 sprintf(a_buf + a_pos, "%02X", p[i]);
361#endif
362 a_pos += 2;
363 }
364 if (a_buf[0]) {
365 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
366つ */
367 syslog(LOG_NOTICE, "%s", a_buf);
368 }
369 if (a_blk_max == 1)
370 break;
371 }
372
373 if (len == 256) {
374 switch (((const T_ECN_FST_BLK *)buffer)->hdr.type) {
375 case ECN_MSG_ECHONET:
376 p_req_esv = &((const T_ECN_FST_BLK *)buffer)->d.t_esv;
377 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
378つ */
379 syslog(LOG_NOTICE, " sender: %d %s, target: %d %s",
380 ((T_ECN_FST_BLK *)buffer)->hdr.sender, _ecn_dbg_enod2str(((T_ECN_FST_BLK *)buffer)->hdr.sender),
381 ((T_ECN_FST_BLK *)buffer)->hdr.target, _ecn_dbg_enod2str(((T_ECN_FST_BLK *)buffer)->hdr.target));
382 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
383つ */
384 syslog(LOG_NOTICE, " 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);
385 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
386つ */
387 syslog(LOG_NOTICE, " edata: 0x%06X 0x%06X 0x%02X 0x%02X (%s)",
388 p_req_esv->edata.seoj.eojx1 << 16 | p_req_esv->edata.seoj.eojx2 << 8 | p_req_esv->edata.seoj.eojx3,
389 p_req_esv->edata.deoj.eojx1 << 16 | p_req_esv->edata.deoj.eojx2 << 8 | p_req_esv->edata.deoj.eojx3,
390 p_req_esv->edata.esv, p_req_esv->edata.opc, _ecn_dbg_esv2str(p_req_esv->edata.esv));
391 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
392つ */
393 syslog(LOG_NOTICE, " ecn_prp: 0x%02X 0x%02X", p_req_esv->ecn_prp.epc, p_req_esv->ecn_prp.pdc);
394 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
395つ */
396 syslog(LOG_NOTICE, " cur(blk/pos): wr %d/%d, rd %d/%d",
397 (int)((T_ECN_FST_BLK *)buffer)->hdr.wr.blk,
398 (int)((T_ECN_FST_BLK *)buffer)->hdr.wr.pos,
399 (int)((T_ECN_FST_BLK *)buffer)->hdr.rd.blk,
400 (int)((T_ECN_FST_BLK *)buffer)->hdr.rd.pos);
401 break;
402 case ECN_MSG_INTERNAL:
403 p_im = (const T_ECN_INTERNAL_MSG *)&((const T_ECN_FST_BLK *)buffer)->payload[0];
404 syslog(LOG_NOTICE, " a_im.command: %d:%s", p_im->command,
405 (p_im->command == ECN_INM_NOTIFY_INSTANCELIST ? "ECN_INM_NOTIFY_INSTANCELIST":
406 (p_im->command == ECN_INM_RELEASE_WAIT ? "ECN_INM_RELEASE_WAIT" : "?")));
407 memset(a_buf, 0, _ECN_FBS_DBG_BINDMP_BUFLEN);
408 a_blk_max = ((const T_ECN_FST_BLK *)buffer)->hdr.wr.blk * 64
409 + ((const T_ECN_FST_BLK *)buffer)->hdr.wr.pos;
410 if (0 < a_blk_max) {
411 if (64 < a_blk_max)
412 a_blk_max = 64;
413 if (_ECN_FBS_DBG_BINDMP_BUFLEN < a_blk_max)
414 a_blk_max = _ECN_FBS_DBG_BINDMP_BUFLEN;
415 for (i = offsetof(T_ECN_INTERNAL_MSG, data); i < a_blk_max; i++) {
416 a_blk = ((const T_ECN_FST_BLK *)buffer)->payload[i];
417 if (!isprint(a_blk) || !isascii(a_blk))
418 a_blk = '.';
419 a_buf[i - 1] = a_blk;
420 }
421 syslog(LOG_NOTICE, " a_im.data: [%s]", &a_buf[offsetof(T_ECN_INTERNAL_MSG, data) - 1]);
422 }
423 break;
424 default:
425 syslog(LOG_NOTICE, " invalid type: %d", ((const T_ECN_FST_BLK *)buffer)->hdr.type);
426 }
427 }
428 else if (8 <= len
429 && ((const T_ECN_FST_BLK *)buffer)->bin[0] == 0x10
430 && ((const T_ECN_FST_BLK *)buffer)->bin[1] == 0x81) {
431 p_req_esv = (const T_ECN_EDT_HDR *)&((const T_ECN_FST_BLK *)buffer)->bin[0];
432 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
433つ */
434 syslog(LOG_NOTICE, " 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);
435 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
436つ */
437 syslog(LOG_NOTICE, " edata: 0x%06X 0x%06X 0x%02X 0x%02X (%s)",
438 p_req_esv->edata.seoj.eojx1 << 16 | p_req_esv->edata.seoj.eojx2 << 8 | p_req_esv->edata.seoj.eojx3,
439 p_req_esv->edata.deoj.eojx1 << 16 | p_req_esv->edata.deoj.eojx2 << 8 | p_req_esv->edata.deoj.eojx3,
440 p_req_esv->edata.esv, p_req_esv->edata.opc, _ecn_dbg_esv2str(p_req_esv->edata.esv));
441 _ECN_DBG_WAI_SYSLOG; /* syslog()バッファに余裕ができるまで待
442つ */
443 syslog(LOG_NOTICE, " ecn_prp: 0x%02X 0x%02X", p_req_esv->ecn_prp.epc, p_req_esv->ecn_prp.pdc);
444 }
445#ifdef SEM_ECN_DBG_BINDMP
446 syscall(sig_sem(SEM_ECN_DBG_BINDMP));
447#endif
448}
449
450/*
451 * ECHONET Liteサービスコード文字列変換
452 */
453const char *_ecn_dbg_esv2str(uint8_t fa_esv)
454{
455 switch (fa_esv) {
456 case ESV_SET_I_SNA: return "プロパティ値書き込み要求不可応答"; /* 0x50 */
457 case ESV_SET_C_SNA: return "プロパティ値書き込み要求不可応答"; /* 0x51 */
458 case ESV_GET_SNA: return "プロパティ値読み出し不可応答"; /* 0x52 */
459 case ESV_INF_SNA: return "プロパティ値通知不可応答"; /* 0x53 */
460 case ESV_SET_GET_SNA: return "プロパティ値書き込み・読み出し不可応答"; /* 0x5E */
461 case ESV_SET_I: return "プロパティ値書き込み要求(応答不要)"; /* 0x60 */
462 case ESV_SET_C: return "プロパティ値書き込み要求(応答要)"; /* 0x61 */
463 case ESV_GET: return "プロパティ値読み出し要求"; /* 0x62 */
464 case ESV_INF_REQ: return "プロパティ値通知要求"; /* 0x63 */
465 case ESV_SET_GET: return "プロパティ値書き込み・読み出し要求"; /* 0x6E */
466 case ESV_SET_RES: return "プロパティ値書き込み応答"; /* 0x71 */
467 case ESV_GET_RES: return "プロパティ値読み出し応答"; /* 0x72 */
468 case ESV_INF: return "プロパティ値通知"; /* 0x73 */
469 case ESV_INFC: return "プロパティ値通知(応答要)"; /* 0x74 */
470 case ESV_SET_GET_RES: return "プロパティ値書き込み・読み出し応答"; /* 0x7E */
471 case ESV_INFC_RES: return "プロパティ値通知応答"; /* 0x7A */
472 default:
473 return "(unknown)";
474 }
475}
476#endif /* #if defined(ECN_DBG_PUT_ENA) || defined(ECN_CAP_PUT_ENA) */
Note: See TracBrowser for help on using the repository browser.