source: EcnlProtoTool/trunk/mrbgems/mruby-ecnl/src/echonet.c@ 270

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

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 22.3 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014-2016 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 */
51
52#include <mruby.h>
53#include <stdio.h>
54#include <string.h>
55
56#include "echonet.h"
57#include "echonet_fbs.h"
58#include "echonet_task.h"
59#include "echonet_dbg.h"
60#include "echonet_agent.h"
61#include "mrb_ecnl.h"
62
63/*
64 * ECHONET Liteサービス処理開始
65 */
66ER ecn_sta_svc(ecnl_svc_task_t *svc)
67{
68 _ecn_tsk_int_startup(svc);
69
70 return E_OK;
71}
72
73/*
74 * ECHONETオブジェクト参ç…
75§
76 * 引数
77 * ID fa_eobjid ECHONETオブジェクトID
78 * T_REOBJ *fp_eobj ECHONETオブジェクトの設定内
79容コピーå…
80ˆ
81 *
82 * eobjidで指定したECHONETオブジェクトの設定内
83容を参ç…
84§ã™ã‚‹ã€‚
85 * 参ç…
86§ã—た設定内
87容はpk_eobjに指定したメモリに返される。
88 */
89ER ecn_ref_eobj(ecnl_svc_task_t *svc, ID fa_eobjid, T_REOBJ *fp_eobj)
90{
91 const EOBJINIB *p_obj;
92
93 if (!fp_eobj)
94 return E_PAR; /* パラメータエラー */
95
96 if ((fa_eobjid <= 0) || (fa_eobjid > svc->tmax_eobjid))
97 return E_OBJ; /* オブジェクト未登録 */
98
99 p_obj = echonet_svctask_get_eobjinib(svc, fa_eobjid);
100
101 *fp_eobj = *p_obj;
102
103 return E_OK;
104}
105
106/*
107 * ECHONETプロパティ参ç…
108§
109 * 引数
110 * ID fa_eobjid ECHONETオブジェクトID
111 * uint8_t fa_epc プロパティコード
112 * T_RPRP *fp_eprp ECHONETオブジェクトのプロパティ設定内
113容コピーå…
114ˆ
115 *
116 * eobjidで指定したECHONETオブジェクトの、epcで指定したプロパティの設定内
117容を参ç…
118§ã™ã‚‹ã€‚
119 * 参ç…
120§ã—た設定内
121容はpk_eprpに指定したメモリに返される。
122 */
123ER ecn_ref_eprp(ecnl_svc_task_t *svc, ID fa_eobjid, uint8_t fa_epc, T_RPRP *fp_eprp)
124{
125 const EOBJINIB *p_obj;
126 const EPRPINIB **p;
127 uint_t i;
128
129 if (!fp_eprp)
130 return E_PAR; /* パラメータエラー */
131
132 if ((fa_eobjid <= 0) || (fa_eobjid > svc->tmax_eobjid))
133 return E_OBJ; /* オブジェクト未登録 */
134
135 p_obj = svc->eobjinib_table[fa_eobjid - 1];
136
137 /* eojの持つプロパティ初期化定義é…
138åˆ—から検索 */
139 p = p_obj->eprp;
140 for (i = 0; i < p_obj->eprpcnt; i++, p++) {
141 if ((*p)->eprpcd != fa_epc)
142 continue;
143 *fp_eprp = **p;
144 return E_OK;
145 }
146
147 return E_PAR; /* パラメータエラー */
148}
149
150/*
151 * プロパティ値書き込み要求(応答不要)電文作成
152 * 引数
153 * T_EDATA **ppk_esv 取得した電文の格納å…
154ˆ
155 * ID fa_deoj 宛å…
156ˆã®ECHONETオブジェクトID
157 * uint8_t fa_epc プロパティコード
158 * uint8_t fa_pdc プロパティ値データサイズ
159 * const void *p_edt プロパティ値データ
160 *
161 * プロパティ値書き込み要求(応答不要)電文を作成する。
162 * 電文はdeojで指定したECHONETオブジェクトを宛å…
163ˆã¨ã—、
164 * 電文の初めのプロパティ値として、epcとpdc、p_edtで指定された
165 * プロパティコード、データサイズ、データを電文に設定する。
166 * 作成した電文のå…
167ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ãƒã‚¤ãƒ³ã‚¿çµŒç”±ã§è¿”される。
168 */
169ER ecn_esv_seti(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID fa_deoj, uint8_t fa_epc, uint8_t fa_pdc,
170 const void *p_edt)
171{
172 return _ecn_tsk_mk_esv(svc, (ECN_FBS_ID *)ppk_esv, (ID)1, fa_deoj, fa_epc, fa_pdc, p_edt, ESV_SET_I);
173}
174
175/*
176 * プロパティ値書き込み要求(応答要)電文作成
177 * 引数
178 * T_EDATA **ppk_esv 取得した電文の格納å…
179ˆ
180 * ID fa_deoj 宛å…
181ˆã®ECHONETオブジェクトID
182 * uint8_t fa_epc プロパティコード
183 * uint8_t fa_pdc プロパティ値データサイズ
184 * const void *p_edt プロパティ値データ
185 *
186 * プロパティ値書き込み要求(応答要)電文を作成する。
187 * 電文はdeojで指定したECHONETオブジェクトを宛å…
188ˆã¨ã—、
189 * 電文の初めのプロパティ値として、epcとpdc、p_edtで指定された
190 * プロパティコード、データサイズ、データを電文に設定する。
191 * 作成した電文のå…
192ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ãƒã‚¤ãƒ³ã‚¿çµŒç”±ã§è¿”される。
193 */
194ER ecn_esv_setc(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID fa_deoj, uint8_t fa_epc, uint8_t fa_pdc,
195 const void *p_edt)
196{
197 return _ecn_tsk_mk_esv(svc, (ECN_FBS_ID *)ppk_esv, (ID)1, fa_deoj, fa_epc, fa_pdc, p_edt, ESV_SET_C);
198}
199
200/*
201 * プロパティ値読み出し要求電文作成
202 * 引数
203 * T_EDATA **ppk_esv 取得した電文の格納å…
204ˆ
205 * ID fa_deoj 宛å…
206ˆã®ECHONETオブジェクトID
207 * uint8_t fa_epc プロパティコード
208 *
209 * プロパティ値読み出し要求電文を作成する。
210 * 電文はdeojで指定したECHONETオブジェクトを宛å…
211ˆã¨ã—、
212 * 電文の初めのプロパティ値として、epcで指定された
213 * プロパティコードを電文に設定する。
214 * 作成した電文のå…
215ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ãƒã‚¤ãƒ³ã‚¿çµŒç”±ã§è¿”される。
216 */
217ER ecn_esv_get(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID fa_deoj, uint8_t fa_epc)
218{
219 return _ecn_tsk_mk_esv(svc, (ECN_FBS_ID *)ppk_esv, (ID)1, fa_deoj, fa_epc, 0, NULL, ESV_GET);
220}
221
222/*
223 * プロパティ値通知要求電文作成
224 * 引数
225 * T_EDATA **ppk_esv 取得した電文の格納å…
226ˆ
227 * ID fa_deoj 宛å…
228ˆã®ECHONETオブジェクトID
229 * uint8_t fa_epc プロパティコード
230 *
231 * プロパティ値通知要求電文を作成する。
232 * 電文はdeojで指定したECHONETオブジェクトを宛å…
233ˆã¨ã—、
234 * 電文の初めのプロパティ値として、epcで指定された
235 * プロパティコードを電文に設定する。
236 * 作成した電文のå…
237ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ãƒã‚¤ãƒ³ã‚¿çµŒç”±ã§è¿”される。
238 */
239ER ecn_esv_inf_req(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID fa_deoj, uint8_t fa_epc)
240{
241 return _ecn_tsk_mk_esv(svc, (ECN_FBS_ID *)ppk_esv, (ID)1, fa_deoj, fa_epc, 0, NULL, ESV_INF_REQ);
242}
243
244/*
245 * プロパティ値書き込み・読み出し要求電文作成
246 * 引数
247 * T_EDATA **ppk_esv 取得した電文の格納å…
248ˆ
249 * ID fa_deoj 宛å…
250ˆã®ECHONETオブジェクトID
251 * uint8_t fa_epc プロパティコード
252 * uint8_t fa_pdc プロパティ値データサイズ
253 * const void *p_edt プロパティ値データ
254 *
255 * プロパティ値書き込み・読み出し要求電文を作成する。
256 * 電文はdeojで指定したECHONETオブジェクトを宛å…
257ˆã¨ã—、
258 * 電文の初めのプロパティ値として、epcとpdc、p_edtで指定された
259 * プロパティコード、データサイズ、データを電文に設定する。
260 * 作成した電文のå…
261ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ãƒã‚¤ãƒ³ã‚¿çµŒç”±ã§è¿”される。
262 */
263ER ecn_esv_set_get(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID fa_deoj, uint8_t fa_epc, uint8_t fa_pdc,
264 const void *p_edt)
265{
266 return _ecn_tsk_mk_esv(svc, (ECN_FBS_ID *)ppk_esv, (ID)1, fa_deoj, fa_epc, fa_pdc, p_edt, ESV_SET_GET);
267}
268
269/*
270 * プロパティ値書き込み・読み出し要求電文作成:折り返し指定
271 * プロパティ値書き込み・読み出し要求電文作成中の、書き込みプロパティé…
272åˆ—を終えて
273 * 読み出しプロパティé…
274åˆ—に移る時に用いる。
275 */
276ER ecn_trn_set_get(mrb_state *mrb, T_EDATA *ppk_esv, int *p_trn_pos)
277{
278 ER a_ret;
279
280 if (!ppk_esv)
281 return E_PAR;
282 if (!p_trn_pos)
283 return E_PAR;
284
285 /* プロパティ読み込み件数書き込み時のヘッド情
286報を記録 */
287 *p_trn_pos = _ecn_fbs_get_datalen(*(ECN_FBS_ID *)&ppk_esv);
288
289 /* 応答電文用メモリにデータ追加・この時点での応答電文中プロパティ件数を記録 */
290 a_ret = _ecn_fbs_add_data_ex(mrb, *(ECN_FBS_ID *)&ppk_esv, &ppk_esv->hdr.edata.opc, 1);
291 if (a_ret) {
292 ECN_DBG_PUT_2("ecn_trn_set_get(): _ecn_fbs_add_data_ex() result = %d:%s", a_ret, itron_strerror(a_ret));
293 return a_ret;
294 }
295
296 /* 応答電文中プロパティ件数を 0 に戻す(今後、終了指定するまでは読み出しプロパティ件数になる) */
297 ppk_esv->hdr.edata.opc = 0;
298
299 return E_OK;
300}
301
302/*
303 * プロパティ値書き込み・読み出し要求電文作成:終了指定
304 * プロパティ値書き込み・読み出し要求電文作成中の、読み出しプロパティé…
305åˆ—を終える時に用いる。
306 */
307ER ecn_end_set_get(mrb_state *mrb, T_EDATA *ppk_esv, int fa_trn_pos)
308{
309 ER a_ret;
310 int a_wr_opc;
311 uint8_t a_rd_opc;
312
313 if (!ppk_esv)
314 return E_PAR;
315
316 /* この時点での応答電文中プロパティ件数(読み出しプロパティ件数)を保持 */
317 a_rd_opc = ppk_esv->hdr.edata.opc;
318
319 /* 応答電文中プロパティ件数(書き込みプロパティ件数)を保存位置から読み取り */
320 a_wr_opc = _ecn_fbs_peek(mrb, *(ECN_FBS_ID *)&ppk_esv, fa_trn_pos);
321 if (a_wr_opc < 0) {
322 ECN_DBG_PUT_2("ecn_end_set_get(): _ecn_fbs_peek() result = %d:%s", a_wr_opc, itron_strerror(a_wr_opc));
323 return a_wr_opc;
324 }
325
326 /* 応答電文中プロパティ件数(書き込みプロパティ件数)を復å…
327ƒ */
328 ppk_esv->hdr.edata.opc = (uint8_t)a_wr_opc;
329
330 /* 応答電文中プロパティ件数(読み出しプロパティ件数)を保存位置に書き込み */
331 a_ret = _ecn_fbs_poke(mrb, *(ECN_FBS_ID *)&ppk_esv, fa_trn_pos, a_rd_opc);
332 if (a_ret) {
333 ECN_DBG_PUT_2("ecn_end_set_get(): _ecn_fbs_poke() result = %d:%s", a_ret, itron_strerror(a_ret));
334 return a_ret;
335 }
336
337 return E_OK;
338}
339
340/*
341 * プロパティ値通知(応答要)電文作成
342 * 引数
343 * T_EDATA **ppk_esv 取得した電文の格納å…
344ˆ
345 * ID fa_deoj 宛å…
346ˆã®ECHONETオブジェクトID
347 * ID fa_seoj 送信å…
348ƒã®ECHONETオブジェクトID
349 * uint8_t fa_sepc 送信å…
350ƒã®ãƒ—ロパティコード
351 */
352ER ecn_esv_infc(ecnl_svc_task_t *svc, T_EDATA **ppk_esv, ID fa_deoj, ID fa_seoj, uint8_t fa_sepc)
353{
354 return _ecn_tsk_mk_esv(svc, (ECN_FBS_ID *)ppk_esv, fa_seoj, fa_deoj, fa_sepc, 0, NULL, ESV_INFC);
355}
356
357/*
358 * 要求電文へのプロパティ指定追加 (プロパティデータが付随しない場合に用いる)
359 */
360ER ecn_add_epc(mrb_state *mrb, T_EDATA *pk_esv, uint8_t epc)
361{
362 return ecn_add_edt(mrb, pk_esv, epc, 0, 0);
363}
364
365/*
366 * 要求電文へのプロパティデータ追加 (プロパティおよび付随データを追加する)
367 */
368ER ecn_add_edt(mrb_state *mrb, T_EDATA *pk_esv, uint8_t fa_epc, uint8_t fa_pdc, const void *p_edt)
369{
370 ECN_FBS_ID a_fbs_id;
371 ER a_ret;
372 T_ECN_PRP a_ecn_prp;
373
374 if (!pk_esv)
375 return E_PAR; /* 取得したFBS_IDの格納å…
376ˆãŒNULL */
377 if (ECHONET_MEMPOOL_BLOCK_SIZE <= fa_pdc)
378 return E_PAR; /* プロパティ値サイズが大きすぎる */
379 if (!p_edt && 0 < fa_pdc)
380 return E_PAR; /* プロパティ値サイズが1以上なのにデータポインタがNULL */
381
382 a_fbs_id.ptr = (T_ECN_FST_BLK *)pk_esv;
383 if (((T_EDATA *)a_fbs_id.ptr)->hdr.edata.opc == 0xFF)
384 return E_PAR; /* プロパティが多すぎる */
385
386 /* 要求電文用メモリにデータ追加 */
387 memset(&a_ecn_prp, 0, sizeof(a_ecn_prp));
388 a_ecn_prp.epc = fa_epc;
389 a_ecn_prp.pdc = fa_pdc;
390 a_ret = _ecn_fbs_add_data_ex(mrb, a_fbs_id, &a_ecn_prp, sizeof(a_ecn_prp));
391 if (a_ret) {
392 ECN_DBG_PUT_4("ecn_add_edt(): _ecn_fbs_add_data_ex(*, ecn_prp{epc:0x%02X}, %u) result = %d:%s",
393 a_ecn_prp.epc, sizeof(a_ecn_prp), a_ret, itron_strerror(a_ret));
394 goto lb_except;
395 }
396 if (0 < fa_pdc) {
397 /* 付随データ追加 */
398 a_ret = _ecn_fbs_add_data_ex(mrb, a_fbs_id, p_edt, fa_pdc);
399 if (a_ret) {
400 ECN_DBG_PUT_4("ecn_add_edt(): _ecn_fbs_add_data_ex(*, ecn_prp{epc:0x%02X} edt, %u) result = %d:%s",
401 a_ecn_prp.epc, fa_pdc, a_ret, itron_strerror(a_ret));
402 goto lb_except;
403 }
404 }
405 /* プロパティ数インクリメント */
406 ((T_EDATA *)a_fbs_id.ptr)->hdr.edata.opc++;
407
408lb_except:
409 return a_ret;
410}
411
412/*
413 * 要求電文の送信
414 * esvで指定された要求電文を送信する。
415 * 電文に指定された宛å…
416ˆã‹ã‚‰é€šä¿¡ãƒ¬ã‚¤ãƒ¤ãƒ¼ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’特定し、UDPパケットとして送信する。
417 */
418ER ecn_snd_esv(ecnl_svc_task_t *svc, T_EDATA *pk_esv)
419{
420 ECN_FBS_ID a_rsp_fbs;
421 a_rsp_fbs.ptr = (T_ECN_FST_BLK *)pk_esv;
422 return _ecn_tsk_snd_mbx(svc, a_rsp_fbs, true);
423}
424
425/*
426 * 応答電文の受信ポーリング
427 * 応答電文を受信するのを待
428つ。
429 * 受信した応答電文はppk_esvで指定したポインターにå…
430ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒè¿”される。
431 * 応答電文の受信の有無にかかわらず、待
432たずに関数を抜ける。
433 */
434ER ecn_prcv_esv(ecnl_svc_task_t *svc, T_EDATA **ppk_esv)
435{
436 T_ECN_FST_BLK *p_msg = NULL;
437 ER a_ret;
438
439 if (!ppk_esv)
440 return E_PAR;
441
442 a_ret = ecn_fbs_dequeue(&svc->api_mbxid, &p_msg);
443 if (a_ret != E_OK) {
444 *ppk_esv = NULL;
445 return a_ret;
446 }
447
448 *ppk_esv = (T_EDATA *)p_msg;
449 return ((p_msg)->hdr.type == ECN_MSG_ECHONET) ? E_OK : E_BRK;
450}
451
452/*
453 * 応答電文の破棄
454 */
455ER ecn_rel_esv(mrb_state *mrb, T_EDATA *pk_esv)
456{
457 ECN_FBS_ID a_fbs;
458 ER a_ret;
459
460 a_fbs.ptr = (T_ECN_FST_BLK *)pk_esv;
461 a_ret = _ecn_fbs_del(mrb, a_fbs);
462 return a_ret;
463}
464
465/*
466 * 応答電文の送信å…
467ƒãƒŽãƒ¼ãƒ‰ã‚’取得する
468 */
469ID ecn_get_enod(ecnl_svc_task_t *svc, T_EDATA *pk_esv)
470{
471 const EOBJCB *p_snod;
472 const EOBJINIB *p_sobj = NULL;
473
474 p_snod = _ecn_eno_fnd(svc, ((T_ECN_FST_BLK *)pk_esv)->hdr.sender.id);
475 if (p_snod != NULL) {
476 p_sobj = p_snod->profile;
477 }
478
479 if (p_sobj == NULL)
480 return EOBJ_NULL;
481#ifdef ECHONET_CONTROLLER_EXTENTION
482 if (p_sobj->eprpcnt == 0)
483 return ecn_agent_get_eobj(p_sobj);
484#endif
485 return echonet_svctask_get_eobjid(svc, p_sobj);
486}
487
488/*
489 * 応答電文の送信å…
490ƒæ©Ÿå™¨ã‚ªãƒ–ジェクトを取得する
491 */
492ID ecn_get_eobj(ecnl_svc_task_t *svc, T_EDATA *pk_esv)
493{
494 const EOBJCB *p_snod;
495 const EOBJINIB *p_sobj = NULL;
496 T_ECN_EDT_HDR *p_esv;
497
498 p_esv = &pk_esv->hdr;
499 p_snod = _ecn_eno_fnd(svc, ((T_ECN_FST_BLK *)pk_esv)->hdr.sender.id);
500 if (p_snod != NULL) {
501 /* ノードプロファイルの場合 */
502 if ((p_esv->edata.seoj.eojx1 == EOJ_X1_PROFILE)
503 && (p_esv->edata.seoj.eojx2 == EOJ_X2_NODE_PROFILE)) {
504 p_sobj = p_snod->profile;
505 }
506 /* 機器オブジェクトの場合 */
507 else {
508 p_sobj = _ecn_eoj_fnd(p_snod, &p_esv->edata.seoj);
509 }
510 }
511
512 if (p_sobj == NULL)
513 return EOBJ_NULL;
514#ifdef ECHONET_CONTROLLER_EXTENTION
515 if (p_sobj->eprpcnt == 0)
516 return ecn_agent_get_eobj(p_sobj);
517#endif
518 return echonet_svctask_get_eobjid(svc, p_sobj);
519}
520
521/*
522 * 応答電文解析イテレーター初期化
523 */
524ER ecn_itr_ini(T_ENUM_EPC *pk_itr, T_EDATA *pk_esv)
525{
526 if (!pk_itr)
527 return E_PAR;
528 if (!pk_esv)
529 return E_PAR;
530
531 memset(pk_itr, 0, sizeof(*pk_itr));
532 pk_itr->pk_esv = pk_esv;
533 pk_itr->count = pk_esv->hdr.edata.opc;
534 /* 今のブロックでのプロパティ総数 */
535 pk_itr->got_ct = 0; /* 今のブロックで、読み取った数 */
536 pk_itr->next_blk_ct = 0; /* 後続ブロック数 */
537 pk_itr->is_eof = 0; /* 終端に達した時、非0 */
538 pk_itr->cur = offsetof(T_ECN_EDT_HDR, ecn_prp);
539
540 switch (pk_esv->hdr.edata.esv) {
541 case ESV_SET_GET: /* 0x6E プロパティ値書き込み・読み出し要求 */
542 case ESV_SET_GET_RES: /* 0x7E プロパティ値書き込み・読み出し応答 */
543 case ESV_SET_GET_SNA: /* 0x5E プロパティ値書き込み・読み出し不可応答 */
544 pk_itr->next_blk_ct ++;
545 default:
546 break;
547 }
548
549 return E_OK;
550}
551
552/*
553 * 応答電文解析イテレーターインクリメント
554 */
555ER ecn_itr_nxt(mrb_state *mrb, T_ENUM_EPC *pk_itr, uint8_t *p_epc, uint8_t *p_pdc, void *p_edt)
556{
557 ECN_FBS_ID a_fbs_id;
558 int a_rd_bak;
559 ER a_ret;
560 ECN_FBS_SSIZE_T a_rd_len;
561 T_ECN_PRP a_ecn_prp;
562
563 if (!pk_itr)
564 return E_PAR;
565 if (!p_epc)
566 return E_PAR;
567 if (!p_pdc)
568 return E_PAR;
569 if (!pk_itr->pk_esv)
570 return E_PAR;
571
572 if (pk_itr->is_eof)
573 return E_BOVR; /* データ終了 */
574 if (pk_itr->count <= pk_itr->got_ct && pk_itr->next_blk_ct < 1) {
575 pk_itr->is_eof = 1; /* 終端に達した時、非0 */
576 return E_BOVR; /* データ終了 */
577 }
578
579 a_fbs_id.ptr = (T_ECN_FST_BLK *)pk_itr->pk_esv;
580
581 /* å…
582ƒã®ã‚«ãƒ¼ã‚½ãƒ«ä½ç½®ã‚’保存し、イテレータのカーソル位置にする */
583 a_rd_bak = a_fbs_id.ptr->hdr.rd;
584 a_fbs_id.ptr->hdr.rd = pk_itr->cur;
585
586#ifdef ECN_ENA_ITR_NXT_CARP
587 ECN_CAP_PUT_2("ecn_itr_nxt() rd.cur=b%dp%d", pk_itr->cur.blk, pk_itr->cur.pos ECN_CAP_PUT_2(;
588#endif
589 if (pk_itr->count <= pk_itr->got_ct && 0 < pk_itr->next_blk_ct) {
590 /* 次ブロックに移動 */
591 pk_itr->next_blk_ct --;
592 pk_itr->count = 0; /* 今のブロックでのプロパティ総数 */
593 pk_itr->got_ct = 0; /* 今のブロックで、読み取った数 */
594
595 /* 次ブロックのプロパティ数を読み取る */
596 a_rd_len = 0;
597 a_ret = _ecn_fbs_get_data(mrb, a_fbs_id, &a_ecn_prp.pdc, 1, &a_rd_len);
598 if (a_ret != E_OK)
599 goto lb_except;
600 if (0 < a_rd_len) {
601 pk_itr->count = a_ecn_prp.pdc; /* 今のブロックでのプロパティ総数 */
602 }
603 a_ret = E_BOVR; /* データ終了 */
604 goto lb_finally;
605 }
606
607 /* プロパティコードとデータサイズを読み取る */
608 memset(&a_ecn_prp, 0, sizeof(a_ecn_prp));
609 a_rd_len = 0;
610 a_ret = _ecn_fbs_get_data(mrb, a_fbs_id, &a_ecn_prp, sizeof(a_ecn_prp), &a_rd_len);
611 if (a_ret != E_OK)
612 goto lb_except;
613 if (a_rd_len < sizeof(a_ecn_prp)) {
614 ECN_DBG_PUT_1("ecn_itr_nxt() ecn_prp read fault. rd.cur=%d", pk_itr->cur);
615 pk_itr->is_eof = 1; /* 終端に達した時、非0 */
616 a_ret = E_BOVR; /* データ終了 */
617 goto lb_finally;
618 }
619 *p_epc = a_ecn_prp.epc;
620 *p_pdc = a_ecn_prp.pdc;
621
622 if (0 < a_ecn_prp.pdc) {
623 if (p_edt == NULL) {
624 a_ret = _ecn_fbs_seek_rpos(a_fbs_id, a_ecn_prp.pdc);
625 if (a_ret != E_OK)
626 goto lb_except;
627 }
628 else {
629 /* 付随データを読み取る */
630 a_rd_len = 0;
631 a_ret = _ecn_fbs_get_data(mrb, a_fbs_id, p_edt, a_ecn_prp.pdc, &a_rd_len);
632 if (a_ret != E_OK)
633 goto lb_except;
634 if (a_rd_len < (ECN_FBS_SSIZE_T)a_ecn_prp.pdc) {
635 ECN_DBG_PUT_3("ecn_itr_nxt() edt read fault. rd.cur=%d,epc=0x%02X,pdc=%u",
636 pk_itr->cur, a_ecn_prp.epc , a_ecn_prp.pdc);
637 pk_itr->is_eof = 1; /* 終端に達した時、非0 */
638 a_ret = E_BOVR; /* データ終了 */
639 goto lb_finally;
640 }
641 }
642 }
643 pk_itr->got_ct++;
644
645#ifdef ECN_ENA_ITR_NXT_CARP
646 ECN_CAP_PUT_2("ecn_itr_nxt() read: ct=%d/%d", pk_itr->got_ct, pk_itr->count ECN_CAP_PUT_2(;
647#endif
648
649lb_finally:
650 /* イテレータのカーソル位置を更新 */
651 pk_itr->cur = a_fbs_id.ptr->hdr.rd;
652
653lb_except:
654 /* å…
655ƒã®ã‚«ãƒ¼ã‚½ãƒ«ä½ç½®ã«æˆ»ã™ */
656 a_fbs_id.ptr->hdr.rd = a_rd_bak;
657 return a_ret;
658}
659
660/*
661 * 応答電文待
662ちの割り込み送信
663 */
664ER ecn_brk_wai(ecnl_svc_task_t *svc, const void *p_dat, int fa_datsz)
665{
666 ER a_ret;
667 ECN_FBS_ID a_fbs_id = { 0 }; /* 要求電文用メモリ */
668
669 /* 応答電文待
670ちの割り込み電文作成 */
671 a_ret = _ecn_mk_brk_wai(svc, &a_fbs_id, p_dat, fa_datsz);
672 if (a_ret)
673 return a_ret;
674
675 /* 割り込み送信 */
676 a_ret = _ecn_tsk_snd_mbx(svc, a_fbs_id, true);
677 if (a_ret) {
678 ECN_DBG_PUT_2("_ecn_tsk_snd_mbx() result = %d:%s",
679 a_ret, itron_strerror(a_ret));
680 goto lb_except;
681 }
682
683 /* 正常終了 */
684 return a_ret;
685
686lb_except:
687 /* データ作成失敗したら領域解放 */
688 if (a_fbs_id.ptr)
689 _ecn_fbs_del(svc->mrb, a_fbs_id);
690
691 return a_ret;
692}
693
694/*
695 * 割り込みデータの取得
696 */
697ER ecn_get_brk_dat(mrb_state *mrb, T_EDATA *pk_esv, void *p_buf, int fa_bufsz, int *p_datsz)
698{
699 ECN_FBS_ID a_fbs;
700 ER a_ret;
701 ECN_FBS_SSIZE_T a_len;
702
703 if (p_datsz)
704 *p_datsz = 0;
705 if (!pk_esv)
706 return E_PAR;
707
708 a_fbs.ptr = (T_ECN_FST_BLK *)pk_esv;
709 if (a_fbs.ptr->hdr.type != ECN_MSG_USER_BREAK) {
710 ECN_DBG_PUT_1("ecn_get_brk_dat: fbs-type:%d != ECN_MSG_USER_BREAK",
711 a_fbs.ptr->hdr.type);
712 return E_PAR;
713 }
714
715 /* 読み取り位置をå…
716ˆé ­ã«æˆ»ã™ */
717 a_ret = _ecn_fbs_set_rpos(a_fbs, 0);
718 if (a_ret) {
719 ECN_DBG_PUT_2("_ecn_fbs_set_rpos(*, 0) result = %d:%s",
720 a_ret, itron_strerror(a_ret));
721 return a_ret;
722 }
723
724 /* 付随データを読み込む */
725 if (p_buf && 0 < fa_bufsz) {
726 a_len = 0;
727 a_ret = _ecn_fbs_get_data(mrb, a_fbs, p_buf, fa_bufsz, &a_len);
728 if (a_ret || !a_len) {
729 ECN_DBG_PUT_2("_ecn_fbs_get_data(*, p_buf, fa_bufsz) result = %d:%s",
730 a_ret, itron_strerror(a_ret));
731 return E_PAR;
732 }
733 *p_datsz = a_len;
734 }
735
736 return E_OK;
737}
738
739#ifndef ECN_USER_DATA_PROP_SET
740/*
741 * データ設定関数
742 */
743int ecn_data_prop_set(ecnl_svc_task_t *svc, const EPRPINIB *item, const void *src, int size, bool_t *anno)
744{
745 if (size > item->eprpsz)
746 size = item->eprpsz;
747
748 if (*anno)
749 *anno = memcmp((uint8_t *)item->exinf, src, size) != 0;
750
751 memcpy((uint8_t *)item->exinf, src, size);
752
753 return size;
754}
755#endif
756
757#ifndef ECN_USER_DATA_PROP_GET
758/*
759 * データ取得関数
760 */
761int ecn_data_prop_get(ecnl_svc_task_t *svc, const EPRPINIB *item, void *dst, int size)
762{
763 if (size > item->eprpsz)
764 size = item->eprpsz;
765
766 memcpy(dst, (uint8_t *)item->exinf, size);
767
768 return size;
769}
770#endif
Note: See TracBrowser for help on using the repository browser.