source: uKadecot/trunk/kadecot/wamp_dealer.c

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

ECNL 1.0.3の修正内容を盛り込み
内蔵Webアプリで機器が取得できないのを修正

  • 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: 57.4 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2015 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: wamp_dealer.c 265 2016-11-18 08:30:16Z coas-nagasima $
36 */
37
38#include <string.h>
39#include "wamp.h"
40#include "wamp_dealer.h"
41#include "main.h"
42#include "fbs_string.h"
43#include "kadecot_names.h"
44#include "kernel_cfg.h"
45#include "echonet_agent.h"
46#include "arduino.h"
47#include "data_flash.h"
48#include "net/ip/uip.h"
49#include "uip_adpt.h"
50
51#ifndef _MSC_VER
52#ifndef strcpy_s
53#define strcpy_s(s1, s1m, s2) strcpy(s1, s2)
54#endif
55
56#ifndef strncpy_s
57#define strncpy_s(dst, dsz, src, sz) strncpy(dst, src, sz)
58#endif
59
60size_t strnlen(const char *s, size_t maxlen);
61#endif
62
63static void wamp_dealer_call_dummy_param(wamp_dealer_t *dealer,
64 jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf);
65static void wamp_dealer_call_kadecot_param(wamp_dealer_t *dealer,
66 jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf);
67static void wamp_dealer_call_ecnl_param(wamp_dealer_t *dealer,
68 jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf);
69static void wamp_dealer_call_arduino_param(wamp_dealer_t *dealer,
70 jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf);
71static void wamp_dealer_call_init_params_param(wamp_dealer_t *dealer,
72 jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf);
73
74static void wamp_dealer_none_close(struct wamp_dealer *dealer);
75static void wamp_dealer_get_devicelist_close(struct wamp_dealer *dealer);
76static void wamp_dealer_kadecot_get_close(struct wamp_dealer *dealer);
77static void wamp_dealer_kadecot_set_close(struct wamp_dealer *dealer);
78static void wamp_dealer_get_deviceinfo_close(struct wamp_dealer *dealer);
79static void wamp_dealer_ecnl_set_close(struct wamp_dealer *dealer);
80static void wamp_dealer_ecnl_get_close(struct wamp_dealer *dealer);
81static void wamp_dealer_ecnl_setget_close(struct wamp_dealer *dealer);
82static void wamp_dealer_pin_mode_close(struct wamp_dealer *dealer);
83static void wamp_dealer_digital_write_close(struct wamp_dealer *dealer);
84static void wamp_dealer_digital_read_close(struct wamp_dealer *dealer);
85static void wamp_dealer_analog_read_close(struct wamp_dealer *dealer);
86static void wamp_dealer_analog_write_close(struct wamp_dealer *dealer);
87static void wamp_dealer_set_init_params_close(struct wamp_dealer *dealer);
88static void wamp_dealer_get_init_params_close(struct wamp_dealer *dealer);
89
90static echonetlite_device_t *wamp_dealer_get_device(wamp_dealer_t *dealer, int deviceId);
91
92static bool_t wamp_dealer_get_epc(const char *propName, int nameLen,
93 uint16_t devType, uint8_t *epc, uint8_t *pdc);
94static void wamp_dealer_get_devicelist(struct wamp_dealer *dealer);
95
96int wamp_stob(const char *str, uint8_t *dst, int dstc);
97
98void wamp_dealer_register(wamp_dealer_t *dealer)
99{
100}
101
102void wamp_dealer_register_request_id(wamp_dealer_t *dealer, const char *value)
103{
104}
105
106void wamp_dealer_register_options(wamp_dealer_t *dealer, const char *value)
107{
108}
109
110void wamp_dealer_register_options_param(wamp_dealer_t *dealer, jsonsl_action_t action,
111 struct jsonsl_state_st *state, const char *buf)
112{
113}
114
115void wamp_dealer_register_procedure(wamp_dealer_t *dealer, const char *value)
116{
117}
118
119void wamp_dealer_register_close(struct wamp_state *s)
120{
121}
122
123void wamp_dealer_unregister(wamp_dealer_t *dealer)
124{
125}
126
127void wamp_dealer_unregister_request_id(wamp_dealer_t *dealer, const char *value)
128{
129}
130
131void wamp_dealer_unregister_registration_id(wamp_dealer_t *dealer, const char *value)
132{
133}
134
135void wamp_dealer_unregister_close(struct wamp_state *s)
136{
137}
138
139void wamp_dealer_call(wamp_dealer_t *dealer)
140{
141 dealer->args_parse = wamp_dealer_call_dummy_param;
142 dealer->call_close = wamp_dealer_none_close;
143
144 memset(&dealer->params, 0, sizeof(dealer->params));
145}
146
147void wamp_dealer_call_request_id(wamp_dealer_t *dealer, const char *value)
148{
149 dealer->requestId = atoi(value);
150}
151
152void wamp_dealer_call_options(wamp_dealer_t *dealer, const char *value)
153{
154}
155
156void wamp_dealer_call_options_param(wamp_dealer_t *dealer, jsonsl_action_t action,
157 struct jsonsl_state_st *state, const char *buf)
158{
159 static const char deviceId[] = "deviceId";
160
161 switch (state->level) {
162 case 3:
163 switch (action){
164 case JSONSL_ACTION_POP:
165 switch (state->type)
166 {
167 case JSONSL_T_HKEY:
168 if(strcmp(deviceId, dealer->s->jsn_buf) == 0){
169 dealer->state = WAMP_DEALER_STATE_DEVICE_ID;
170 }
171 break;
172 case JSONSL_T_SPECIAL:
173 dealer->current_device = wamp_dealer_get_device(dealer, atoi(dealer->s->jsn_buf));
174 break;
175 default:
176 break;
177 }
178 break;
179 }
180 break;
181 }
182}
183
184void wamp_dealer_call_procedure(wamp_dealer_t *dealer, const char *value, int length)
185{
186 static const char comSonycslKadecot[] = "com.sonycsl.kadecot.";
187 static const char jpToppersEcnl[] = "jp.toppers.ecnl.";
188 const char *start = value;
189
190 if (strncmp(comSonycslKadecot, value, sizeof(comSonycslKadecot) - 1) == 0) {
191 static const char provider[] = "provider.procedure.";
192 static const char echonetlite[] = "echonetlite.procedure.";
193 static const char arduino[] = "arduino.";
194 value = &value[sizeof(comSonycslKadecot) - 1];
195
196 if (strncmp(provider, value, sizeof(provider) - 1) == 0) {
197 static const char getDeviceList[] = "getDeviceList";
198 value = &value[sizeof(provider) - 1];
199
200 if (strncmp(getDeviceList, value, sizeof(getDeviceList) - 1) == 0) {
201 dealer->procedure = WAMP_DEALER_PROCEDURE_GET_DEVICELIST;
202 dealer->args_parse = wamp_dealer_call_dummy_param;
203 dealer->call_close = wamp_dealer_get_devicelist_close;
204 return;
205 }
206 }
207 else if (strncmp(echonetlite, value, sizeof(echonetlite) - 1) == 0) {
208 static const char kadecotGet[] = "get";
209 static const char kadecotSet[] = "set";
210 value = &value[sizeof(echonetlite) - 1];
211
212 if (strncmp(kadecotGet, value, sizeof(kadecotGet) - 1) == 0) {
213 dealer->procedure = WAMP_DEALER_PROCEDURE_KADECOT_GET;
214 dealer->args_parse = wamp_dealer_call_kadecot_param;
215 dealer->call_close = wamp_dealer_kadecot_get_close;
216 return;
217 }
218 else if (strncmp(kadecotSet, value, sizeof(kadecotSet) - 1) == 0) {
219 dealer->procedure = WAMP_DEALER_PROCEDURE_KADECOT_SET;
220 dealer->args_parse = wamp_dealer_call_kadecot_param;
221 dealer->call_close = wamp_dealer_kadecot_set_close;
222 return;
223 }
224
225 for (int i = value - start; i < length; i++) {
226 if (*value == '.' || *value == '\0') {
227 value++;
228 break;
229 }
230 value++;
231 }
232
233 if (strncmp(kadecotGet, value, sizeof(kadecotGet) - 1) == 0) {
234 dealer->procedure = WAMP_DEALER_PROCEDURE_KADECOT_GET;
235 dealer->args_parse = wamp_dealer_call_kadecot_param;
236 dealer->call_close = wamp_dealer_kadecot_get_close;
237 return;
238 }
239 else if (strncmp(kadecotSet, value, sizeof(kadecotSet) - 1) == 0) {
240 dealer->procedure = WAMP_DEALER_PROCEDURE_KADECOT_SET;
241 dealer->args_parse = wamp_dealer_call_kadecot_param;
242 dealer->call_close = wamp_dealer_kadecot_set_close;
243 return;
244 }
245 }
246 else if (strncmp(arduino, value, sizeof(arduino) - 1) == 0) {
247 static const char pinMode[] = "pinMode";
248 static const char digitalWrite[] = "digitalWrite";
249 static const char digitalRead[] = "digitalRead";
250 static const char analogRead[] = "analogRead";
251 static const char analogWrite[] = "analogWrite";
252 value = &value[sizeof(arduino) - 1];
253
254 if (strncmp(pinMode, value, sizeof(pinMode) - 1) == 0) {
255 dealer->procedure = WAMP_DEALER_PROCEDURE_PIN_MODE;
256 dealer->args_parse = wamp_dealer_call_arduino_param;
257 dealer->call_close = wamp_dealer_pin_mode_close;
258 return;
259 }
260 else if (strncmp(digitalWrite, value, sizeof(digitalWrite) - 1) == 0) {
261 dealer->procedure = WAMP_DEALER_PROCEDURE_DIGITAL_WRITE;
262 dealer->args_parse = wamp_dealer_call_arduino_param;
263 dealer->call_close = wamp_dealer_digital_write_close;
264 return;
265 }
266 else if (strncmp(digitalRead, value, sizeof(digitalRead) - 1) == 0) {
267 dealer->procedure = WAMP_DEALER_PROCEDURE_DIGITAL_READ;
268 dealer->args_parse = wamp_dealer_call_arduino_param;
269 dealer->call_close = wamp_dealer_digital_read_close;
270 return;
271 }
272 else if (strncmp(analogRead, value, sizeof(analogRead) - 1) == 0) {
273 dealer->procedure = WAMP_DEALER_PROCEDURE_ANALOG_READ;
274 dealer->args_parse = wamp_dealer_call_arduino_param;
275 dealer->call_close = wamp_dealer_analog_read_close;
276 return;
277 }
278 else if (strncmp(analogWrite, value, sizeof(analogWrite) - 1) == 0) {
279 dealer->procedure = WAMP_DEALER_PROCEDURE_ANALOG_WRITE;
280 dealer->args_parse = wamp_dealer_call_arduino_param;
281 dealer->call_close = wamp_dealer_analog_write_close;
282 return;
283 }
284 }
285 }
286 else if (strncmp(jpToppersEcnl, value, sizeof(jpToppersEcnl) - 1) == 0) {
287 static const char getDeviceInfo[] = "procedure.getDeviceInfo";
288 static const char ecnlSet[] = "procedure.set";
289 static const char ecnlGet[] = "procedure.get";
290 static const char ecnlSetGet[] = "procedure.setget";
291 static const char setInitParams[] = "procedure.setInitParams";
292 static const char getInitParams[] = "procedure.getInitParams";
293 value = &value[sizeof(jpToppersEcnl) - 1];
294
295 if (strncmp(getDeviceInfo, value, sizeof(getDeviceInfo) - 1) == 0) {
296 dealer->procedure = WAMP_DEALER_PROCEDURE_GET_DEVICEINFO;
297 dealer->args_parse = wamp_dealer_call_dummy_param;
298 dealer->call_close = wamp_dealer_get_deviceinfo_close;
299 return;
300 }
301 else if (strncmp(ecnlSet, value, sizeof(ecnlSet) - 1) == 0) {
302 dealer->procedure = WAMP_DEALER_PROCEDURE_ECNL_SET;
303 dealer->args_parse = wamp_dealer_call_ecnl_param;
304 dealer->call_close = wamp_dealer_ecnl_set_close;
305 return;
306 }
307 else if (strncmp(ecnlGet, value, sizeof(ecnlGet) - 1) == 0) {
308 dealer->procedure = WAMP_DEALER_PROCEDURE_ECNL_GET;
309 dealer->args_parse = wamp_dealer_call_ecnl_param;
310 dealer->call_close = wamp_dealer_ecnl_get_close;
311 return;
312 }
313 else if (strncmp(ecnlSetGet, value, sizeof(ecnlSetGet) - 1) == 0) {
314 dealer->procedure = WAMP_DEALER_PROCEDURE_ECNL_SETGET;
315 dealer->args_parse = wamp_dealer_call_ecnl_param;
316 dealer->call_close = wamp_dealer_ecnl_setget_close;
317 return;
318 }
319 else if (strncmp(setInitParams, value, sizeof(setInitParams) - 1) == 0) {
320 dealer->procedure = WAMP_DEALER_PROCEDURE_SET_INIT_PARAMS;
321 dealer->args_parse = wamp_dealer_call_init_params_param;
322 dealer->call_close = wamp_dealer_set_init_params_close;
323 return;
324 }
325 else if (strncmp(getInitParams, value, sizeof(getInitParams) - 1) == 0) {
326 dealer->procedure = WAMP_DEALER_PROCEDURE_GET_INIT_PARAMS;
327 dealer->args_parse = wamp_dealer_call_init_params_param;
328 dealer->call_close = wamp_dealer_get_init_params_close;
329 return;
330 }
331 }
332
333 dealer->procedure = WAMP_DEALER_PROCEDURE_NONE;
334 dealer->args_parse = wamp_dealer_call_dummy_param;
335 dealer->call_close = wamp_dealer_none_close;
336}
337
338void wamp_dealer_call_arguments(wamp_dealer_t *dealer, const char *value)
339{
340}
341
342void wamp_dealer_call_arguments_param(wamp_dealer_t *dealer, jsonsl_action_t action,
343 struct jsonsl_state_st *state, const char *buf)
344{
345}
346
347void wamp_dealer_call_argumentskw(wamp_dealer_t *dealer, const char *value)
348{
349}
350
351void wamp_dealer_call_argumentskw_param(wamp_dealer_t *dealer, jsonsl_action_t action,
352 struct jsonsl_state_st *state, const char *buf)
353{
354 dealer->args_parse(dealer, action, state, buf);
355}
356
357static void wamp_dealer_call_dummy_param(wamp_dealer_t *dealer,
358 jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf)
359{
360}
361
362static void wamp_dealer_call_kadecot_param(wamp_dealer_t *dealer,
363 jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf)
364{
365 static const char propertyName[] = "propertyName";
366 static const char propertyValue[] = "propertyValue";
367
368 switch (state->level) {
369 case 3:
370 switch (action){
371 case JSONSL_ACTION_POP:
372 switch (state->type)
373 {
374 case JSONSL_T_HKEY:
375 if(strcmp(propertyName, dealer->s->jsn_buf) == 0){
376 dealer->state = WAMP_DEALER_STATE_PROPERTY_NAME;
377 }
378 else if(strcmp(propertyValue, dealer->s->jsn_buf) == 0){
379 dealer->state = WAMP_DEALER_STATE_PROPERTY_VALUE;
380 dealer->params.pdc = 0;
381 memset(dealer->params.edt, 0, sizeof(dealer->params.edt));
382 }
383 break;
384 case JSONSL_T_STRING:
385 switch(dealer->state){
386 case WAMP_DEALER_STATE_PROPERTY_NAME:
387 memcpy(dealer->params.prop_name, dealer->s->jsn_buf, sizeof(dealer->params.prop_name));
388 wamp_dealer_get_epc(dealer->params.prop_name, strnlen(dealer->params.prop_name,
389 sizeof(dealer->params.prop_name)),
390 dealer->current_device->deviceType,
391 &dealer->params.epc, &dealer->params.pdc);
392 break;
393 }
394 break;
395 default:
396 break;
397 }
398 break;
399 }
400 break;
401 case 4:
402 switch (action){
403 case JSONSL_ACTION_POP:
404 switch (state->type)
405 {
406 case JSONSL_T_SPECIAL:
407 switch(dealer->state){
408 case WAMP_DEALER_STATE_PROPERTY_VALUE:
409 dealer->params.edt[dealer->params.pdc++] = atoi(dealer->s->jsn_buf);
410 break;
411 }
412 break;
413 }
414 break;
415 }
416 break;
417 }
418}
419
420static void wamp_dealer_call_ecnl_param(wamp_dealer_t *dealer,
421 jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf)
422{
423 static const char deojId[] = "deojid";
424 static const char properties[] = "properties";
425 static const char propertyCode[] = "epc";
426 static const char propertyValue[] = "edt";
427
428 switch (state->level) {
429 case 3:
430 switch (action){
431 case JSONSL_ACTION_POP:
432 switch (state->type)
433 {
434 case JSONSL_T_HKEY:
435 if(strcmp(deojId, dealer->s->jsn_buf) == 0){
436 dealer->state = WAMP_DEALER_STATE_DEOJID;
437 }
438 else if(strcmp(properties, dealer->s->jsn_buf) == 0){
439 dealer->state = WAMP_DEALER_STATE_PROPERTIES;
440 }
441 break;
442 case JSONSL_T_SPECIAL:
443 switch(dealer->state){
444 case WAMP_DEALER_STATE_DEOJID:
445 dealer->params.deojid = atoi(dealer->s->jsn_buf);
446 break;
447 }
448 break;
449 }
450 break;
451 case JSONSL_ACTION_PUSH:
452 switch (state->type)
453 {
454 case JSONSL_T_LIST:
455 switch(dealer->state){
456 case WAMP_DEALER_STATE_PROPERTIES:
457 dealer->state = WAMP_DEALER_STATE_PROPERTY_LIST;
458 break;
459 }
460 break;
461 default:
462 break;
463 }
464 break;
465 }
466 break;
467 case 4:
468 switch (action){
469 case JSONSL_ACTION_POP:
470 switch (state->type)
471 {
472 case JSONSL_T_SPECIAL:
473 switch(dealer->state){
474 }
475 break;
476 default:
477 break;
478 }
479 break;
480 }
481 break;
482 case 5:
483 switch (action){
484 case JSONSL_ACTION_POP:
485 switch (state->type)
486 {
487 case JSONSL_T_HKEY:
488 if(strcmp(propertyCode, dealer->s->jsn_buf) == 0){
489 dealer->state = WAMP_DEALER_STATE_PROPERTY_CODE;
490 }
491 else if(strcmp(propertyValue, dealer->s->jsn_buf) == 0){
492 dealer->state = WAMP_DEALER_STATE_PROPERTY_VALUE;
493 dealer->params.pdc = 0;
494 memset(dealer->params.edt, 0, sizeof(dealer->params.edt));
495 }
496 break;
497 case JSONSL_T_SPECIAL:
498 switch(dealer->state){
499 case WAMP_DEALER_STATE_PROPERTY_CODE:
500 dealer->params.epc = atoi(dealer->s->jsn_buf);
501 switch(dealer->procedure){
502 case WAMP_DEALER_PROCEDURE_ECNL_GET:
503 if (dealer->ecnl_mag == NULL){
504 ecn_esv_get(&dealer->ecnl_mag, dealer->params.deojid, dealer->params.epc);
505 }
506 else{
507 ecn_add_epc(dealer->ecnl_mag, dealer->params.epc);
508 }
509 break;
510 case WAMP_DEALER_PROCEDURE_ECNL_SETGET:
511 ecn_add_epc(dealer->ecnl_mag, dealer->params.epc);
512 break;
513 }
514 break;
515 }
516 break;
517 case JSONSL_T_STRING:
518 switch(dealer->state){
519 case WAMP_DEALER_STATE_PROPERTY_VALUE:
520 dealer->params.pdc = wamp_stob(dealer->s->jsn_buf, dealer->params.edt, sizeof(dealer->params.edt));
521 switch(dealer->procedure){
522 case WAMP_DEALER_PROCEDURE_ECNL_SET:
523 if (dealer->ecnl_mag == NULL){
524 ecn_esv_setc(&dealer->ecnl_mag, dealer->params.deojid, dealer->params.epc,
525 dealer->params.pdc, dealer->params.edt);
526 }
527 else{
528 ecn_add_edt(dealer->ecnl_mag, dealer->params.epc,
529 dealer->params.pdc, dealer->params.edt);
530 }
531 break;
532 case WAMP_DEALER_PROCEDURE_ECNL_SETGET:
533 if (dealer->ecnl_mag == NULL){
534 ecn_esv_set_get(&dealer->ecnl_mag, dealer->params.deojid, dealer->params.epc,
535 dealer->params.pdc, dealer->params.edt);
536 }
537 else{
538 ecn_add_edt(dealer->ecnl_mag, dealer->params.epc,
539 dealer->params.pdc, dealer->params.edt);
540 }
541 break;
542 }
543 break;
544 }
545 break;
546 }
547 break;
548 }
549 break;
550 }
551}
552
553static void wamp_dealer_call_arduino_param(wamp_dealer_t *dealer,
554 jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf)
555{
556 static const char pin[] = "pin";
557 static const char mode[] = "mode";
558 static const char value[] = "value";
559 static const char INPUT[] = "INPUT";
560 static const char OUTPUT[] = "OUTPUT";
561 static const char INPUT_PULLUP[] = "INPUT_PULLUP";
562 static const char HIGH[] = "HIGH";
563 static const char LOW[] = "LOW";
564
565 switch (state->level) {
566 case 3:
567 switch (action){
568 case JSONSL_ACTION_POP:
569 switch (state->type)
570 {
571 case JSONSL_T_HKEY:
572 if(strcmp(pin, dealer->s->jsn_buf) == 0){
573 dealer->state = WAMP_DEALER_STATE_PIN;
574 }
575 else if(strcmp(mode, dealer->s->jsn_buf) == 0){
576 dealer->state = WAMP_DEALER_STATE_MODE;
577 }
578 else if(strcmp(value, dealer->s->jsn_buf) == 0){
579 if(dealer->procedure == WAMP_DEALER_PROCEDURE_DIGITAL_WRITE)
580 dealer->state = WAMP_DEALER_STATE_DIGITAL_VALUE;
581 else if(dealer->procedure == WAMP_DEALER_PROCEDURE_ANALOG_WRITE)
582 dealer->state = WAMP_DEALER_STATE_ANALOG_VALUE;
583 }
584 break;
585 case JSONSL_T_STRING:
586 switch(dealer->state){
587 case WAMP_DEALER_STATE_MODE:
588 if(strcmp(INPUT, dealer->s->jsn_buf) == 0){
589 dealer->arduino_params.mode = WAMP_DEALER_PIN_MODE_INPUT;
590 }
591 else if(strcmp(OUTPUT, dealer->s->jsn_buf) == 0){
592 dealer->arduino_params.mode = WAMP_DEALER_PIN_MODE_OUTPUT;
593 }
594 else if(strcmp(INPUT_PULLUP, dealer->s->jsn_buf) == 0){
595 dealer->arduino_params.mode = WAMP_DEALER_PIN_MODE_INPUT_PULLUP;
596 }
597 break;
598 case WAMP_DEALER_STATE_DIGITAL_VALUE:
599 if(strcmp(HIGH, dealer->s->jsn_buf) == 0){
600 dealer->arduino_params.digval = WAMP_DEALER_DIGITAL_VALUE_HIGH;
601 }
602 else if(strcmp(LOW, dealer->s->jsn_buf) == 0){
603 dealer->arduino_params.digval = WAMP_DEALER_DIGITAL_VALUE_LOW;
604 }
605 break;
606 }
607 break;
608 case JSONSL_T_SPECIAL:
609 switch(dealer->state){
610 case WAMP_DEALER_STATE_PIN:
611 dealer->arduino_params.pin = atoi(dealer->s->jsn_buf);
612 break;
613 case WAMP_DEALER_STATE_ANALOG_VALUE:
614 dealer->arduino_params.anaval = atoi(dealer->s->jsn_buf);
615 break;
616 }
617 break;
618 default:
619 break;
620 }
621 break;
622 }
623 break;
624 }
625}
626
627static void wamp_dealer_call_init_params_param(wamp_dealer_t *dealer,
628 jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf)
629{
630 static const char macAddr[] = "macAddr";
631 static const char dhcpEnable[] = "dhcpEnable";
632 static const char ipAddr[] = "ipAddr";
633 static const char netmask[] = "netmask";
634 static const char gateway[] = "gateway";
635
636 switch (state->level) {
637 case 3:
638 switch (action){
639 case JSONSL_ACTION_POP:
640 switch (state->type)
641 {
642 case JSONSL_T_HKEY:
643 if(strcmp(macAddr, dealer->s->jsn_buf) == 0){
644 dealer->state = WAMP_DEALER_STATE_MAC_ADDR_VALUE;
645 dealer->init_params.pos = 0;
646 memset(&dealer->init_params.mac_addr, 0, sizeof(dealer->init_params.mac_addr));
647 }
648 if(strcmp(dhcpEnable, dealer->s->jsn_buf) == 0){
649 dealer->state = WAMP_DEALER_STATE_DHCP_ENABLE_VALUE;
650 dealer->init_params.dhcp_enable = false;
651 }
652 if(strcmp(ipAddr, dealer->s->jsn_buf) == 0){
653 dealer->state = WAMP_DEALER_STATE_IP_ADDR_VALUE;
654 dealer->init_params.pos = 0;
655 memset(&dealer->init_params.ip_addr, 0, sizeof(dealer->init_params.ip_addr));
656 }
657 if(strcmp(netmask, dealer->s->jsn_buf) == 0){
658 dealer->state = WAMP_DEALER_STATE_NETMASK_VALUE;
659 dealer->init_params.pos = 0;
660 memset(&dealer->init_params.netmask, 0, sizeof(dealer->init_params.netmask));
661 }
662 if(strcmp(gateway, dealer->s->jsn_buf) == 0){
663 dealer->state = WAMP_DEALER_STATE_GATEWAY_VALUE;
664 dealer->init_params.pos = 0;
665 memset(&dealer->init_params.gateway, 0, sizeof(dealer->init_params.gateway));
666 }
667 break;
668 case JSONSL_T_SPECIAL:
669 switch(dealer->state){
670 case WAMP_DEALER_STATE_DHCP_ENABLE_VALUE:
671 dealer->init_params.dhcp_enable = strcmp("true", dealer->s->jsn_buf) == 0;
672 break;
673 }
674 break;
675 default:
676 break;
677 }
678 break;
679 }
680 break;
681 case 4:
682 switch (action){
683 case JSONSL_ACTION_POP:
684 switch (state->type)
685 {
686 case JSONSL_T_SPECIAL:
687 switch(dealer->state){
688 case WAMP_DEALER_STATE_MAC_ADDR_VALUE:
689 dealer->init_params.mac_addr[dealer->init_params.pos++] = atoi(dealer->s->jsn_buf);
690 break;
691 case WAMP_DEALER_STATE_IP_ADDR_VALUE:
692 dealer->init_params.ip_addr[dealer->init_params.pos++] = atoi(dealer->s->jsn_buf);
693 break;
694 case WAMP_DEALER_STATE_NETMASK_VALUE:
695 dealer->init_params.netmask[dealer->init_params.pos++] = atoi(dealer->s->jsn_buf);
696 break;
697 case WAMP_DEALER_STATE_GATEWAY_VALUE:
698 dealer->init_params.gateway[dealer->init_params.pos++] = atoi(dealer->s->jsn_buf);
699 break;
700 }
701 break;
702 }
703 break;
704 }
705 break;
706 }
707}
708
709void wamp_dealer_call_close(struct wamp_state *s)
710{
711 wamp_dealer_t *dealer = &s->dealer;
712 ER ret;
713
714 dealer->error = internal_error;
715
716 // send RESULT
717 dealer->call_close(dealer);
718
719 if (dealer->error != NULL){
720 ret = wamp_send_error_res(s, WAMP_CODE_CALL, dealer->requestId, dealer->error);
721 if (ret != E_OK) {
722 syslog(LOG_WARNING, "wamp_dealer_call_close() : wamp_send_error_res() result = %d", ret);
723 }
724 dealer->error = NULL;
725 }
726}
727
728static void wamp_dealer_none_close(struct wamp_dealer *dealer)
729{
730 wamp_state_t *s = dealer->s;
731 ER ret;
732
733 dealer->error = NULL;
734 ret = wamp_send_error_res(s, WAMP_CODE_CALL, dealer->requestId, invalid_request);
735 if (ret != E_OK) {
736 syslog(LOG_WARNING, "wamp_dealer_none_close() : wamp_send_error_res() result = %d", ret);
737 }
738}
739
740static void wamp_dealer_get_devicelist_close(struct wamp_dealer *dealer)
741{
742 dealer->error = NULL;
743 main_get_device_list(dealer->requestId, dealer);
744}
745
746void wamp_dealer_set_devicelist(struct wamp_dealer *dealer, ECN_FBS_ID msg)
747{
748 wamp_state_t *s = dealer->s;
749 ecn_inm_get_device_item_t device;
750 ECN_FBS_SSIZE_T rlen;
751 echonetlite_device_t *dev, *end = &dealer->devices[sizeof(dealer->devices) / sizeof(dealer->devices[0])];
752 ER ret;
753
754 /* 機器情報をクリア */
755 for(dev = dealer->devices; dev < end; dev++){
756 dev->deviceId = 0;
757 }
758
759 /* メッセージから機器情報を作成 */
760 for(dev = dealer->devices; dev < end; ){
761 ret = _ecn_fbs_get_data(msg, &device, sizeof(device), &rlen);
762 if ((ret != E_OK) || (rlen != sizeof(device)))
763 break;
764
765 if (device.enodid == 0)
766 continue;
767
768 dev->deviceId = device.eobjid;
769 dev->nodeId = device.enodid;
770 dev->addrId = device.addrid;
771 dev->deviceType = (device.eojx1 << 8) | device.eojx2;
772 dev->x3 = device.eojx3;
773 dev->status = device.state != 0;
774
775 dev++;
776 }
777
778 dealer->current_device = &dealer->devices[0];
779 dealer->devices_pos = 0;
780 main_get_device_ipaddr(dealer->requestId, dealer, dealer->current_device->addrId);
781}
782
783void wamp_dealer_get_devicelist_timeout(struct wamp_dealer *dealer)
784{
785 wamp_state_t *s = dealer->s;
786 ER ret;
787
788 ret = wamp_send_error_res(s, WAMP_CODE_CALL, dealer->requestId, internal_error);
789 if (ret != E_OK) {
790 syslog(LOG_WARNING, "wamp_dealer_get_devicelist_timeout() : wamp_send_error_res() result = %d", ret);
791 }
792}
793
794void wamp_dealer_set_ipaddr(struct wamp_dealer *dealer, char *ipaddr)
795{
796 echonetlite_device_t *dev, *end = &dealer->devices[sizeof(dealer->devices) / sizeof(dealer->devices[0])];
797 int i, devicePos;
798
799 dev = dealer->current_device;
800 if ((dev != NULL) && (ipaddr != NULL)){
801 strcpy_s(dev->ip_addr, sizeof(dev->ip_addr), ipaddr);
802
803 kadecot_names_get_device_type_name(dev->deviceType, dev->deviceTypeStr, sizeof(dev->deviceTypeStr));
804 strcpy_s(dev->description, sizeof(dev->description), dev->deviceTypeStr);
805 strcpy_s(dev->nickname, sizeof(dev->nickname), dev->deviceTypeStr);
806 }
807
808 devicePos = sizeof(dealer->devices) / sizeof(dealer->devices[0]);
809 for(i = dealer->devices_pos + 1, dev = &dealer->devices[i]; dev < end; i++, dev++){
810 if(dev->deviceId == 0)
811 continue;
812
813 devicePos = i;
814 break;
815 }
816
817 if (devicePos == sizeof(dealer->devices) / sizeof(dealer->devices[0])){
818 dealer->current_device = NULL;
819 dealer->devices_pos = 0;
820 wamp_dealer_get_devicelist(dealer);
821 }
822 else{
823 dealer->current_device = &dealer->devices[devicePos];
824 dealer->devices_pos = devicePos;
825 main_get_device_ipaddr(dealer->requestId, dealer, dealer->current_device->addrId);
826 }
827}
828
829void wamp_dealer_get_ipaddr_timeout(struct wamp_dealer *dealer)
830{
831 wamp_state_t *s = dealer->s;
832 ER ret;
833
834 ret = wamp_send_error_res(s, WAMP_CODE_CALL, dealer->requestId, internal_error);
835 if (ret != E_OK) {
836 syslog(LOG_WARNING, "wamp_dealer_get_ipaddr_timeout() : wamp_send_error_res() result = %d", ret);
837 }
838}
839
840static void wamp_dealer_get_devicelist(struct wamp_dealer *dealer)
841{
842 wamp_state_t *s = dealer->s;
843 echonetlite_device_t *dev, *end = &dealer->devices[sizeof(dealer->devices) / sizeof(dealer->devices[0])];
844 ECN_FBS_ID buf;
845 ECN_FBS_SSIZE_T pos = 0, start;
846 char ip_addr[16];
847 ER ret;
848
849 ret = _ecn_fbs_cre(1, &buf);
850 if (ret != E_OK) {
851 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
852 return;
853 }
854
855 ret = fbs_printf(buf, &pos, "[50,%d,{},[],", dealer->requestId);
856 if (ret != E_OK) {
857 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
858 _ecn_fbs_del(buf);
859 return;
860 }
861
862 ret = fbs_printf(buf, &pos, "{\"deviceList\":["
863 "{\"description\":\"GR-SAKURA\",\"deviceId\":1,\"deviceType\":\"GrSakura\",\"ip_addr\":\"%s\",\"nickname\":\"GR-SAKURA\",\"protocol\":\"arduino\",\"status\":true},",
864 ip2str(ip_addr, uip_hostaddr));
865 if (ret != E_OK) {
866 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
867 _ecn_fbs_del(buf);
868 return;
869 }
870
871 start = pos;
872 for(dev = dealer->devices; dev < end; dev++){
873 if(dev->deviceId == 0)
874 continue;
875
876 ret = fbs_printf(buf, &pos, "{\"description\":\"%s\",\"deviceId\":%d,\"deviceType\":\"%s\",\"ip_addr\":\"%s\",\"nickname\":\"%s\",\"protocol\":\"echonetlite\",\"status\":%s},",
877 dev->description, dev->deviceId, dev->deviceTypeStr, dev->ip_addr, dev->nickname, dev->status ? "true" : "false");
878 if (ret != E_OK) {
879 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
880 _ecn_fbs_del(buf);
881 return;
882 }
883 }
884
885 /* 最後の","を消す */
886 if(start != pos)
887 pos--;
888
889 ret = fbs_printf(buf, &pos, "]}]");
890 if (ret != E_OK) {
891 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
892 _ecn_fbs_del(buf);
893 return;
894 }
895
896 ret = main_send_message(buf, s->wbsid);
897 if (ret != E_OK) {
898 syslog(LOG_WARNING, "wamp_dealer_get_devicelist() : main_send_message() result = %d", ret);
899 }
900}
901
902static void wamp_dealer_kadecot_get_close(struct wamp_dealer *dealer)
903{
904 echonetlite_device_t *device = dealer->current_device;
905 uint16_t devType;
906
907 if(device == NULL)
908 return;
909
910 devType = device->deviceType;
911 if(devType == 0)
912 return;
913
914 if (dealer->params.epc == 0) {
915 dealer->error = method_not_found;
916 syslog(7, method_not_found);
917 return;
918 }
919
920 dealer->error = NULL;
921 main_kadecot_get(dealer->requestId, dealer, device->deviceId, dealer->params.epc);
922}
923
924void wamp_dealer_kadecot_get(struct wamp_dealer *dealer, int deviceId, uint8_t epc,
925 uint8_t pdc, uint8_t *edt)
926{
927 wamp_state_t *s = dealer->s;
928 ECN_FBS_ID buf;
929 ECN_FBS_SSIZE_T pos = 0, start;
930 int i;
931 const char *propName;
932 ER ret;
933
934 ret = _ecn_fbs_cre(1, &buf);
935 if (ret != E_OK) {
936 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
937 return;
938 }
939
940 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":%d},[],",
941 dealer->requestId, deviceId);
942 if (ret != E_OK) {
943 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
944 _ecn_fbs_del(buf);
945 return;
946 }
947
948 propName = dealer->params.prop_name;
949 if(propName[0] != '\0'){
950 ret = fbs_printf(buf, &pos, "{\"propertyName\":\"%s\",\"propertyValue\":[",
951 propName);
952 if (ret != E_OK) {
953 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
954 _ecn_fbs_del(buf);
955 return;
956 }
957 }
958 else{
959 ret = fbs_printf(buf, &pos, "{\"propertyName\":\"0x%02x\",\"propertyValue\":[",
960 epc);
961 if (ret != E_OK) {
962 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
963 _ecn_fbs_del(buf);
964 return;
965 }
966 }
967
968 start = pos;
969 for(i = 0; i < pdc; i++){
970 ret = fbs_printf(buf, &pos, "%d,", edt[i]);
971 if (ret != E_OK) {
972 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
973 _ecn_fbs_del(buf);
974 return;
975 }
976 }
977
978 /* 最後の","を消す */
979 if(start != pos)
980 pos--;
981
982 ret = fbs_printf(buf, &pos, "]}]");
983 if (ret != E_OK) {
984 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
985 _ecn_fbs_del(buf);
986 return;
987 }
988
989 ret = main_send_message(buf, s->wbsid);
990 if (ret != E_OK) {
991 syslog(LOG_WARNING, "wamp_dealer_kadecot_get() : main_send_message() result = %d", ret);
992 }
993}
994
995void wamp_dealer_kadecot_set_timeout(struct wamp_dealer *dealer)
996{
997 wamp_state_t *s = dealer->s;
998 ER ret;
999
1000 ret = wamp_send_error_res(s, WAMP_CODE_CALL, dealer->requestId, internal_error);
1001 if (ret != E_OK) {
1002 syslog(LOG_WARNING, "wamp_dealer_kadecot_set_timeout() : wamp_send_error_res() result = %d", ret);
1003 }
1004}
1005
1006static void wamp_dealer_kadecot_set_close(struct wamp_dealer *dealer)
1007{
1008 echonetlite_device_t *device = dealer->current_device;
1009 uint16_t devType;
1010
1011 if(device == NULL)
1012 return;
1013
1014 devType = device->deviceType;
1015 if(devType == 0)
1016 return;
1017
1018 if(dealer->params.epc == 0){
1019 dealer->error = method_not_found;
1020 return;
1021 }
1022
1023 dealer->error = NULL;
1024 main_kadecot_set(dealer->requestId, dealer, device->deviceId, dealer->params.epc,
1025 dealer->params.pdc, dealer->params.edt);
1026}
1027
1028void wamp_dealer_kadecot_set(struct wamp_dealer *dealer, int deviceId, uint8_t epc)
1029{
1030 wamp_state_t *s = dealer->s;
1031 ECN_FBS_ID buf;
1032 ECN_FBS_SSIZE_T pos = 0, start;
1033 int i;
1034 const char *propName;
1035 ER ret;
1036
1037 ret = _ecn_fbs_cre(1, &buf);
1038 if (ret != E_OK) {
1039 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1040 return;
1041 }
1042
1043 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":%d},[],",
1044 dealer->requestId, deviceId);
1045 if (ret != E_OK) {
1046 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1047 _ecn_fbs_del(buf);
1048 return;
1049 }
1050
1051 propName = dealer->params.prop_name;
1052 if(propName[0] != '\0'){
1053 ret = fbs_printf(buf, &pos, "{\"propertyName\":\"%s\",\"propertyValue\":[",
1054 propName);
1055 if (ret != E_OK) {
1056 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1057 _ecn_fbs_del(buf);
1058 return;
1059 }
1060 }
1061 else{
1062 ret = fbs_printf(buf, &pos, "{\"propertyName\":\"0x%02x\",\"propertyValue\":[",
1063 epc);
1064 if (ret != E_OK) {
1065 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1066 _ecn_fbs_del(buf);
1067 return;
1068 }
1069 }
1070
1071 start = pos;
1072 for(i = 0; i < dealer->params.pdc; i++){
1073 ret = fbs_printf(buf, &pos, "%d,", dealer->params.edt[i]);
1074 if (ret != E_OK) {
1075 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1076 _ecn_fbs_del(buf);
1077 return;
1078 }
1079 }
1080
1081 /* 最後の","を消す */
1082 if(start != pos)
1083 pos--;
1084
1085 ret = fbs_printf(buf, &pos, "]}]");
1086 if (ret != E_OK) {
1087 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1088 _ecn_fbs_del(buf);
1089 return;
1090 }
1091
1092 ret = main_send_message(buf, s->wbsid);
1093 if (ret != E_OK) {
1094 syslog(LOG_WARNING, "wamp_dealer_kadecot_set() : main_send_message() result = %d", ret);
1095 }
1096}
1097
1098void wamp_dealer_kadecot_get_timeout(struct wamp_dealer *dealer)
1099{
1100 wamp_state_t *s = dealer->s;
1101 ER ret;
1102
1103 ret = wamp_send_error_res(s, WAMP_CODE_CALL, dealer->requestId, internal_error);
1104 if (ret != E_OK) {
1105 syslog(LOG_WARNING, "wamp_dealer_kadecot_get_timeout() : wamp_send_error_res() result = %d", ret);
1106 }
1107}
1108
1109static void wamp_dealer_get_deviceinfo_close(struct wamp_dealer *dealer)
1110{
1111 echonetlite_device_t *device = dealer->current_device;
1112 if(device == NULL)
1113 return;
1114
1115 dealer->error = NULL;
1116 main_get_device_info(dealer->requestId, dealer, device->deviceId);
1117}
1118
1119void wamp_dealer_set_deviceinfo(struct wamp_dealer *dealer, int deviceId, uint8_t *pmset,
1120 uint8_t *pmget, uint8_t *pmanno)
1121{
1122 wamp_state_t *s = dealer->s;
1123 echonetlite_device_t *device = dealer->current_device;
1124 ECN_FBS_ID buf;
1125 ECN_FBS_SSIZE_T pos = 0;
1126 int i, j, m, prop;
1127 ER ret;
1128
1129 if(device == NULL)
1130 return;
1131
1132 ret = _ecn_fbs_cre(1, &buf);
1133 if (ret != E_OK) {
1134 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1135 return;
1136 }
1137
1138 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":%d},[],",
1139 dealer->requestId, deviceId);
1140 if (ret != E_OK) {
1141 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1142 _ecn_fbs_del(buf);
1143 return;
1144 }
1145
1146 ret = fbs_printf(buf, &pos, "{\"x1\":%d,\"x2\":%d,\"x3\":%d,\"enodid\":%d,\"properties\":[",
1147 device->deviceType >> 8, device->deviceType & 0xFF, device->x3, device->nodeId);
1148 if (ret != E_OK) {
1149 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1150 _ecn_fbs_del(buf);
1151 return;
1152 }
1153
1154 prop = pos;
1155 for(i = 0; i < 16; i++){
1156 uint8_t pms = pmset[i], pmg = pmget[i], pma = pmanno[i], exs = pms | pmg | pma;
1157
1158 for(j = 0; j < 8; j++){
1159 m = 1 << j;
1160 if(!(exs & m))
1161 continue;
1162
1163 ret = fbs_printf(buf, &pos, "{\"epc\":%d,\"flag\":\"", 0x80 | (j << 4) | i);
1164 if (ret != E_OK) {
1165 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1166 _ecn_fbs_del(buf);
1167 return;
1168 }
1169 if (pms & m) {
1170 ret = fbs_printf(buf, &pos, "RULE_SET,");
1171 if (ret != E_OK) {
1172 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1173 _ecn_fbs_del(buf);
1174 return;
1175 }
1176 }
1177 if (pmg & m) {
1178 ret = fbs_printf(buf, &pos, "RULE_GET,");
1179 if (ret != E_OK) {
1180 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1181 _ecn_fbs_del(buf);
1182 return;
1183 }
1184 }
1185 if (pma & m) {
1186 ret = fbs_printf(buf, &pos, "ANNOUNCE,");
1187 if (ret != E_OK) {
1188 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1189 _ecn_fbs_del(buf);
1190 return;
1191 }
1192 }
1193 /* 最後の","を消す */
1194 pos--;
1195
1196 ret = fbs_printf(buf, &pos, "\"},");
1197 if (ret != E_OK) {
1198 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1199 _ecn_fbs_del(buf);
1200 return;
1201 }
1202 }
1203 }
1204
1205 /* 最後の","を消す */
1206 if(prop != pos)
1207 pos--;
1208
1209 ret = fbs_printf(buf, &pos, "]}]");
1210 if (ret != E_OK) {
1211 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1212 _ecn_fbs_del(buf);
1213 return;
1214 }
1215
1216 ret = main_send_message(buf, s->wbsid);
1217 if (ret != E_OK) {
1218 syslog(LOG_WARNING, "wamp_dealer_set_deviceinfo() : main_send_message() result = %d", ret);
1219 }
1220}
1221
1222void wamp_dealer_get_deviceinfo_timeout(struct wamp_dealer *dealer)
1223{
1224 wamp_state_t *s = dealer->s;
1225 ER ret;
1226
1227 ret = wamp_send_error_res(s, WAMP_CODE_CALL, dealer->requestId, internal_error);
1228 if (ret != E_OK) {
1229 syslog(LOG_WARNING, "wamp_dealer_get_deviceinfo_timeout() : wamp_send_error_res() result = %d", ret);
1230 }
1231}
1232
1233static void wamp_dealer_ecnl_set_close(struct wamp_dealer *dealer)
1234{
1235 ER ret;
1236 echonetlite_device_t *device = dealer->current_device;
1237 ECN_FBS_ID buf = { (T_ECN_FST_BLK *)dealer->ecnl_mag };
1238
1239 if (dealer->ecnl_mag == NULL)
1240 return;
1241
1242 if(device == NULL){
1243 _ecn_fbs_del(buf);
1244 return;
1245 }
1246
1247 ret = main_ecnl_set(dealer->requestId, dealer, device->deviceId, dealer->ecnl_mag);
1248 if (ret == E_OK) {
1249 dealer->error = NULL;
1250 }
1251 else {
1252 _ecn_fbs_del(buf);
1253 }
1254
1255 dealer->ecnl_mag = NULL;
1256}
1257
1258void wamp_dealer_ecnl_set_res(struct wamp_dealer *dealer, T_EDATA *esv)
1259{
1260 wamp_state_t *s = dealer->s;
1261 echonetlite_device_t *device = dealer->current_device;
1262 ECN_FBS_ID buf;
1263 ECN_FBS_SSIZE_T pos = 0, start;
1264 uint8_t epc;
1265 uint8_t pdc;
1266 uint8_t p_edt[256];
1267 T_ENUM_EPC enm;
1268 int j;
1269 ER ret;
1270
1271 if(device == NULL)
1272 return;
1273
1274 ret = _ecn_fbs_cre(1, &buf);
1275 if (ret != E_OK) {
1276 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1277 return;
1278 }
1279
1280 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":%d},[],",
1281 dealer->requestId, device->deviceId);
1282 if (ret != E_OK) {
1283 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1284 _ecn_fbs_del(buf);
1285 return;
1286 }
1287
1288 /* プロパティ値書き込み応答 0x71 */
1289 ret = fbs_printf(buf, &pos, "{\"esv\":113,\"sender\":%d,\"seoj\":\"%02x%02x%02x\",\"deoj\":\"%02x%02x%02x\",\"properties\":[",
1290 ecn_get_enod(esv), esv->hdr.edata.seoj.eojx1, esv->hdr.edata.seoj.eojx2, esv->hdr.edata.seoj.eojx3,
1291 esv->hdr.edata.deoj.eojx1, esv->hdr.edata.deoj.eojx2, esv->hdr.edata.deoj.eojx3);
1292 if (ret != E_OK) {
1293 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1294 _ecn_fbs_del(buf);
1295 return;
1296 }
1297
1298 ret = ecn_itr_ini(&enm, esv);
1299 if (ret != E_OK){
1300 syslog(LOG_ERROR, "ecn_itr_ini");
1301 return;
1302 }
1303
1304 start = pos;
1305 for(;;) {
1306 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
1307 if (pdc == 0) {
1308 ret = fbs_printf(buf, &pos, "{\"epc\":%d},", epc);
1309 if (ret != E_OK) {
1310 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1311 _ecn_fbs_del(buf);
1312 return;
1313 }
1314 }
1315 else {
1316 ret = fbs_printf(buf, &pos, "{\"epc\":%d,\"edt\":\"", epc);
1317 if (ret != E_OK) {
1318 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1319 _ecn_fbs_del(buf);
1320 return;
1321 }
1322 for(j = 0; j < pdc; j++){
1323 ret = fbs_printf(buf, &pos, "%02x", p_edt[j]);
1324 if (ret != E_OK) {
1325 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1326 _ecn_fbs_del(buf);
1327 return;
1328 }
1329 }
1330 ret = fbs_printf(buf, &pos, "\"},");
1331 if (ret != E_OK) {
1332 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1333 _ecn_fbs_del(buf);
1334 return;
1335 }
1336 }
1337 }
1338 if(ret != E_BOVR){
1339 syslog(LOG_ERROR, "ecn_itr_nxt");
1340 break;
1341 }
1342 if(enm.is_eof)
1343 break;
1344 }
1345
1346 /* 最後の","を消す */
1347 if(start != pos)
1348 pos--;
1349
1350 ret = fbs_printf(buf, &pos, "]}]");
1351 if (ret != E_OK) {
1352 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1353 _ecn_fbs_del(buf);
1354 return;
1355 }
1356
1357 ret = main_send_message(buf, s->wbsid);
1358 if (ret != E_OK) {
1359 syslog(LOG_WARNING, "wamp_dealer_ecnl_set_res() : main_send_message() result = %d", ret);
1360 }
1361}
1362
1363void wamp_dealer_ecnl_set_timeout(struct wamp_dealer *dealer)
1364{
1365 wamp_state_t *s = dealer->s;
1366 ER ret;
1367
1368 ret = wamp_send_error_res(s, WAMP_CODE_CALL, dealer->requestId, internal_error);
1369 if (ret != E_OK) {
1370 syslog(LOG_WARNING, "wamp_dealer_ecnl_set_timeout() : wamp_send_error_res() result = %d", ret);
1371 }
1372}
1373
1374static void wamp_dealer_ecnl_get_close(struct wamp_dealer *dealer)
1375{
1376 ER ret;
1377 echonetlite_device_t *device = dealer->current_device;
1378 ECN_FBS_ID buf = { (T_ECN_FST_BLK *)dealer->ecnl_mag };
1379
1380 if (dealer->ecnl_mag == NULL)
1381 return;
1382
1383 if(device == NULL){
1384 _ecn_fbs_del(buf);
1385 return;
1386 }
1387
1388 ret = main_ecnl_get(dealer->requestId, dealer, device->deviceId, dealer->ecnl_mag);
1389 if (ret == E_OK) {
1390 dealer->error = NULL;
1391 }
1392 else {
1393 _ecn_fbs_del(buf);
1394 }
1395
1396 dealer->ecnl_mag = NULL;
1397}
1398
1399void wamp_dealer_ecnl_get_res(struct wamp_dealer *dealer, T_EDATA *esv)
1400{
1401 wamp_state_t *s = dealer->s;
1402 echonetlite_device_t *device = dealer->current_device;
1403 ECN_FBS_ID buf;
1404 ECN_FBS_SSIZE_T pos = 0, start;
1405 uint8_t epc;
1406 uint8_t pdc;
1407 uint8_t p_edt[256];
1408 T_ENUM_EPC enm;
1409 int j;
1410 ER ret;
1411
1412 if(device == NULL)
1413 return;
1414
1415 ret = _ecn_fbs_cre(1, &buf);
1416 if (ret != E_OK) {
1417 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1418 return;
1419 }
1420
1421 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":%d},[],",
1422 dealer->requestId, device->deviceId);
1423 if (ret != E_OK) {
1424 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1425 _ecn_fbs_del(buf);
1426 return;
1427 }
1428
1429 /* プロパティ値読み込み応答 0x72 */
1430 ret = fbs_printf(buf, &pos, "{\"esv\":114,\"sender\":%d,\"seoj\":\"%02x%02x%02x\",\"deoj\":\"%02x%02x%02x\",\"properties\":[",
1431 ecn_get_enod(esv), esv->hdr.edata.seoj.eojx1, esv->hdr.edata.seoj.eojx2, esv->hdr.edata.seoj.eojx3,
1432 esv->hdr.edata.deoj.eojx1, esv->hdr.edata.deoj.eojx2, esv->hdr.edata.deoj.eojx3);
1433 if (ret != E_OK) {
1434 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1435 _ecn_fbs_del(buf);
1436 return;
1437 }
1438
1439 ret = ecn_itr_ini(&enm, esv);
1440 if (ret != E_OK){
1441 syslog(LOG_ERROR, "ecn_itr_ini");
1442 return;
1443 }
1444
1445 start = pos;
1446 for(;;) {
1447 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
1448 if (pdc == 0) {
1449 ret = fbs_printf(buf, &pos, "{\"epc\":%d},", epc);
1450 if (ret != E_OK) {
1451 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1452 _ecn_fbs_del(buf);
1453 return;
1454 }
1455 }
1456 else {
1457 ret = fbs_printf(buf, &pos, "{\"epc\":%d,\"edt\":\"", epc);
1458 if (ret != E_OK) {
1459 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1460 _ecn_fbs_del(buf);
1461 return;
1462 }
1463 for(j = 0; j < pdc; j++){
1464 ret = fbs_printf(buf, &pos, "%02x", p_edt[j]);
1465 if (ret != E_OK) {
1466 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1467 _ecn_fbs_del(buf);
1468 return;
1469 }
1470 }
1471 ret = fbs_printf(buf, &pos, "\"},");
1472 if (ret != E_OK) {
1473 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1474 _ecn_fbs_del(buf);
1475 return;
1476 }
1477 }
1478 }
1479 if(ret != E_BOVR){
1480 syslog(LOG_ERROR, "ecn_itr_nxt");
1481 break;
1482 }
1483 if(enm.is_eof)
1484 break;
1485 }
1486
1487 /* 最後の","を消す */
1488 if(start != pos)
1489 pos--;
1490
1491 ret = fbs_printf(buf, &pos, "]}]");
1492 if (ret != E_OK) {
1493 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1494 _ecn_fbs_del(buf);
1495 return;
1496 }
1497
1498 ret = main_send_message(buf, s->wbsid);
1499 if (ret != E_OK) {
1500 syslog(LOG_WARNING, "wamp_dealer_ecnl_get_res() : main_send_message() result = %d", ret);
1501 }
1502}
1503
1504void wamp_dealer_ecnl_get_timeout(struct wamp_dealer *dealer)
1505{
1506 wamp_state_t *s = dealer->s;
1507 ER ret;
1508
1509 ret = wamp_send_error_res(s, WAMP_CODE_CALL, dealer->requestId, internal_error);
1510 if (ret != E_OK) {
1511 syslog(LOG_WARNING, "wamp_dealer_ecnl_get_timeout() : wamp_send_error_res() result = %d", ret);
1512 }
1513}
1514
1515static void wamp_dealer_ecnl_setget_close(struct wamp_dealer *dealer)
1516{
1517 ER ret;
1518 echonetlite_device_t *device = dealer->current_device;
1519 ECN_FBS_ID buf = { (T_ECN_FST_BLK *)dealer->ecnl_mag };
1520
1521 if (dealer->ecnl_mag == NULL)
1522 return;
1523
1524 if(device == NULL){
1525 _ecn_fbs_del(buf);
1526 return;
1527 }
1528
1529 ret = main_ecnl_setget(dealer->requestId, dealer, device->deviceId, dealer->ecnl_mag);
1530 if (ret == E_OK) {
1531 dealer->error = NULL;
1532 }
1533 else {
1534 _ecn_fbs_del(buf);
1535 }
1536
1537 dealer->ecnl_mag = NULL;
1538}
1539
1540void wamp_dealer_ecnl_setget_res(struct wamp_dealer *dealer, T_EDATA *esv)
1541{
1542 wamp_state_t *s = dealer->s;
1543 echonetlite_device_t *device = dealer->current_device;
1544 ECN_FBS_ID buf;
1545 ECN_FBS_SSIZE_T pos = 0, start;
1546 uint8_t epc;
1547 uint8_t pdc;
1548 uint8_t p_edt[256];
1549 T_ENUM_EPC enm;
1550 int j;
1551 ER ret;
1552
1553 if(device == NULL)
1554 return;
1555
1556 ret = _ecn_fbs_cre(1, &buf);
1557 if (ret != E_OK) {
1558 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1559 return;
1560 }
1561
1562 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":%d},[],",
1563 dealer->requestId, device->deviceId);
1564 if (ret != E_OK) {
1565 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1566 _ecn_fbs_del(buf);
1567 return;
1568 }
1569
1570 /* プロパティ値書き込み・読み込み応答 0x7E */
1571 ret = fbs_printf(buf, &pos, "{\"esv\":126,\"sender\":%d,\"seoj\":\"%02x%02x%02x\",\"deoj\":\"%02x%02x%02x\",\"properties\":[",
1572 ecn_get_enod(esv), esv->hdr.edata.seoj.eojx1, esv->hdr.edata.seoj.eojx2, esv->hdr.edata.seoj.eojx3,
1573 esv->hdr.edata.deoj.eojx1, esv->hdr.edata.deoj.eojx2, esv->hdr.edata.deoj.eojx3);
1574 if (ret != E_OK) {
1575 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1576 _ecn_fbs_del(buf);
1577 return;
1578 }
1579
1580 ret = ecn_itr_ini(&enm, esv);
1581 if (ret != E_OK){
1582 syslog(LOG_ERROR, "ecn_itr_ini");
1583 return;
1584 }
1585
1586 start = pos;
1587 for(;;) {
1588 while ((ret = ecn_itr_nxt(&enm, &epc, &pdc, p_edt)) == E_OK) {
1589 if (pdc == 0) {
1590 ret = fbs_printf(buf, &pos, "{\"epc\":%d},", epc);
1591 if (ret != E_OK) {
1592 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1593 _ecn_fbs_del(buf);
1594 return;
1595 }
1596 }
1597 else {
1598 ret = fbs_printf(buf, &pos, "{\"epc\":%d,\"edt\":\"", epc);
1599 if (ret != E_OK) {
1600 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1601 _ecn_fbs_del(buf);
1602 return;
1603 }
1604 for(j = 0; j < pdc; j++){
1605 ret = fbs_printf(buf, &pos, "%02x", p_edt[j]);
1606 if (ret != E_OK) {
1607 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1608 _ecn_fbs_del(buf);
1609 return;
1610 }
1611 }
1612 ret = fbs_printf(buf, &pos, "\"},");
1613 if (ret != E_OK) {
1614 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1615 _ecn_fbs_del(buf);
1616 return;
1617 }
1618 }
1619 }
1620 if(ret != E_BOVR){
1621 syslog(LOG_ERROR, "ecn_itr_nxt");
1622 break;
1623 }
1624 if(enm.is_eof)
1625 break;
1626 }
1627
1628 /* 最後の","を消す */
1629 if(start != pos)
1630 pos--;
1631
1632 ret = fbs_printf(buf, &pos, "]}]");
1633 if (ret != E_OK) {
1634 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1635 _ecn_fbs_del(buf);
1636 return;
1637 }
1638
1639 ret = main_send_message(buf, s->wbsid);
1640 if (ret != E_OK) {
1641 syslog(LOG_WARNING, "wamp_dealer_ecnl_setget_res() : main_send_message() result = %d", ret);
1642 }
1643}
1644
1645void wamp_dealer_ecnl_setget_timeout(struct wamp_dealer *dealer)
1646{
1647 wamp_state_t *s = dealer->s;
1648 ER ret;
1649
1650 ret = wamp_send_error_res(s, WAMP_CODE_CALL, dealer->requestId, internal_error);
1651 if (ret != E_OK) {
1652 syslog(LOG_WARNING, "wamp_dealer_ecnl_setget_timeout() : wamp_send_error_res() result = %d", ret);
1653 }
1654}
1655
1656static void wamp_dealer_pin_mode_close(struct wamp_dealer *dealer)
1657{
1658 wamp_state_t *s = dealer->s;
1659 ECN_FBS_ID buf;
1660 ECN_FBS_SSIZE_T pos = 0;
1661 ER ret = E_PAR;
1662
1663 switch(dealer->arduino_params.mode){
1664 case WAMP_DEALER_PIN_MODE_INPUT:
1665 ret = arduino_pinMode(dealer->arduino_params.pin, ARDUINO_PIN_MODE_INPUT);
1666 break;
1667 case WAMP_DEALER_PIN_MODE_OUTPUT:
1668 ret = arduino_pinMode(dealer->arduino_params.pin, ARDUINO_PIN_MODE_OUTPUT);
1669 break;
1670 case WAMP_DEALER_PIN_MODE_INPUT_PULLUP:
1671 ret = arduino_pinMode(dealer->arduino_params.pin, ARDUINO_PIN_MODE_INPUT_PULLUP);
1672 break;
1673 }
1674
1675 if (ret != E_OK)
1676 return;
1677
1678 ret = _ecn_fbs_cre(1, &buf);
1679 if (ret != E_OK) {
1680 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1681 return;
1682 }
1683
1684 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":1},[],{}]", dealer->requestId);
1685 if (ret != E_OK) {
1686 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1687 _ecn_fbs_del(buf);
1688 return;
1689 }
1690
1691 ret = main_send_message(buf, s->wbsid);
1692 if (ret != E_OK) {
1693 syslog(LOG_WARNING, "main_send_message() result = %d", ret);
1694 return;
1695 }
1696
1697 dealer->error = NULL;
1698}
1699
1700static void wamp_dealer_digital_write_close(struct wamp_dealer *dealer)
1701{
1702 wamp_state_t *s = dealer->s;
1703 ECN_FBS_ID buf;
1704 ECN_FBS_SSIZE_T pos = 0;
1705 ER ret = E_PAR;
1706
1707 switch(dealer->arduino_params.digval){
1708 case WAMP_DEALER_DIGITAL_VALUE_HIGH:
1709 ret = arduino_digitalWrite(dealer->arduino_params.pin, ARDUINO_DIGITAL_VALUE_HIGH);
1710 break;
1711 case WAMP_DEALER_DIGITAL_VALUE_LOW:
1712 ret = arduino_digitalWrite(dealer->arduino_params.pin, ARDUINO_DIGITAL_VALUE_LOW);
1713 break;
1714 }
1715
1716 if (ret != E_OK)
1717 return;
1718
1719 ret = _ecn_fbs_cre(1, &buf);
1720 if (ret != E_OK) {
1721 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1722 return;
1723 }
1724
1725 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":1},[],{}]", dealer->requestId);
1726 if (ret != E_OK) {
1727 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1728 _ecn_fbs_del(buf);
1729 return;
1730 }
1731
1732 ret = main_send_message(buf, s->wbsid);
1733 if (ret != E_OK) {
1734 syslog(LOG_WARNING, "main_send_message() result = %d", ret);
1735 return;
1736 }
1737
1738 dealer->error = NULL;
1739}
1740
1741static void wamp_dealer_digital_read_close(struct wamp_dealer *dealer)
1742{
1743 const static char *values[] = { "", "HIGH", "LOW" };
1744 wamp_state_t *s = dealer->s;
1745 ECN_FBS_ID buf;
1746 ECN_FBS_SSIZE_T pos = 0;
1747 arduino_digital_value_t value;
1748 ER ret;
1749
1750 ret = arduino_digitalRead(dealer->arduino_params.pin, &value);
1751 if (ret != E_OK)
1752 return;
1753
1754 ret = _ecn_fbs_cre(1, &buf);
1755 if (ret != E_OK) {
1756 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1757 return;
1758 }
1759
1760 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":1},[],{", dealer->requestId);
1761 if (ret != E_OK) {
1762 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1763 _ecn_fbs_del(buf);
1764 return;
1765 }
1766
1767 ret = fbs_printf(buf, &pos, "\"pin\":%d,\"value\":\"%s\"",
1768 dealer->arduino_params.pin, values[value]);
1769 if (ret != E_OK) {
1770 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1771 _ecn_fbs_del(buf);
1772 return;
1773 }
1774
1775 ret = fbs_printf(buf, &pos, "}]");
1776 if (ret != E_OK) {
1777 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1778 _ecn_fbs_del(buf);
1779 return;
1780 }
1781
1782 ret = main_send_message(buf, s->wbsid);
1783 if (ret != E_OK) {
1784 syslog(LOG_WARNING, "main_send_message() result = %d", ret);
1785 return;
1786 }
1787
1788 dealer->error = NULL;
1789}
1790
1791static void wamp_dealer_analog_read_close(struct wamp_dealer *dealer)
1792{
1793 wamp_state_t *s = dealer->s;
1794 ECN_FBS_ID buf;
1795 ECN_FBS_SSIZE_T pos = 0;
1796 int value;
1797 ER ret;
1798
1799 ret = arduino_analogRead(dealer->arduino_params.pin, &value);
1800 if (ret != E_OK)
1801 return;
1802
1803 ret = _ecn_fbs_cre(1, &buf);
1804 if (ret != E_OK) {
1805 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1806 return;
1807 }
1808
1809 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":1},[],{", dealer->requestId);
1810 if (ret != E_OK) {
1811 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1812 _ecn_fbs_del(buf);
1813 return;
1814 }
1815
1816 ret = fbs_printf(buf, &pos, "\"pin\":%d,\"value\":%d",
1817 dealer->arduino_params.pin, value);
1818 if (ret != E_OK) {
1819 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1820 _ecn_fbs_del(buf);
1821 return;
1822 }
1823
1824 ret = fbs_printf(buf, &pos, "}]");
1825 if (ret != E_OK) {
1826 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1827 _ecn_fbs_del(buf);
1828 return;
1829 }
1830
1831 ret = main_send_message(buf, s->wbsid);
1832 if (ret != E_OK) {
1833 syslog(LOG_WARNING, "main_send_message() result = %d", ret);
1834 return;
1835 }
1836
1837 dealer->error = NULL;
1838}
1839
1840static void wamp_dealer_analog_write_close(struct wamp_dealer *dealer)
1841{
1842 wamp_state_t *s = dealer->s;
1843 ECN_FBS_ID buf;
1844 ECN_FBS_SSIZE_T pos = 0;
1845 ER ret;
1846
1847 ret = arduino_analogWrite(dealer->arduino_params.pin, dealer->arduino_params.anaval);
1848 if (ret != E_OK)
1849 return;
1850
1851 ret = _ecn_fbs_cre(1, &buf);
1852 if (ret != E_OK) {
1853 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1854 return;
1855 }
1856
1857 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":1},[],{}]", dealer->requestId);
1858 if (ret != E_OK) {
1859 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1860 _ecn_fbs_del(buf);
1861 return;
1862 }
1863
1864 ret = main_send_message(buf, s->wbsid);
1865 if (ret != E_OK) {
1866 syslog(LOG_WARNING, "main_send_message() result = %d", ret);
1867 return;
1868 }
1869
1870 dealer->error = NULL;
1871}
1872
1873static void wamp_dealer_set_init_params_close(struct wamp_dealer *dealer)
1874{
1875 wamp_state_t *s = dealer->s;
1876 ECN_FBS_ID buf;
1877 ECN_FBS_SSIZE_T pos = 0;
1878 ER ret;
1879 uint8_t data[32];
1880
1881 memset(data, 0, sizeof(data));
1882 memcpy(&data[0], dealer->init_params.mac_addr, sizeof(dealer->init_params.mac_addr));
1883 data[6] = dealer->init_params.dhcp_enable ? 1 : 0;
1884 memcpy(&data[7], dealer->init_params.ip_addr, sizeof(dealer->init_params.ip_addr));
1885 memcpy(&data[11], dealer->init_params.netmask, sizeof(dealer->init_params.netmask));
1886 memcpy(&data[15], dealer->init_params.gateway, sizeof(dealer->init_params.gateway));
1887
1888 ret = data_flash_write(0, data);
1889 if (ret != E_OK) {
1890 syslog(LOG_WARNING, "data_flash_write() result = %d", ret);
1891 return;
1892 }
1893
1894 ret = _ecn_fbs_cre(1, &buf);
1895 if (ret != E_OK) {
1896 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1897 return;
1898 }
1899
1900 ret = fbs_printf(buf, &pos, "[50,%d,{\"deviceId\":1},[],{}]", dealer->requestId);
1901 if (ret != E_OK) {
1902 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1903 _ecn_fbs_del(buf);
1904 return;
1905 }
1906
1907 ret = main_send_message(buf, s->wbsid);
1908 if (ret != E_OK) {
1909 syslog(LOG_WARNING, "main_send_message() result = %d", ret);
1910 return;
1911 }
1912
1913 dealer->error = NULL;
1914}
1915
1916static ER wamp_dealer_write_ip_addr(struct wamp_dealer *dealer, ECN_FBS_ID buf,
1917 ECN_FBS_SSIZE_T *pos, uint8_t *ip_addr, char *name)
1918{
1919 ER ret;
1920 int i;
1921
1922 /* IPアドレス */
1923 ret = fbs_printf(buf, pos, "\"%s\":[", name);
1924 if (ret != E_OK) {
1925 return ret;
1926 }
1927
1928 for (i = 0; i < 4; i++) {
1929 ret = fbs_printf(buf, pos, "%d,", ip_addr[i]);
1930 if (ret != E_OK) {
1931 return ret;
1932 }
1933 }
1934
1935 /* 最後の","を消す */
1936 *pos = *pos - 1;
1937
1938 ret = fbs_printf(buf, pos, "],");
1939 if (ret != E_OK) {
1940 return ret;
1941 }
1942
1943 return E_OK;
1944}
1945
1946static void wamp_dealer_get_init_params_close(struct wamp_dealer *dealer)
1947{
1948 wamp_state_t *s = dealer->s;
1949 ECN_FBS_ID buf;
1950 ECN_FBS_SSIZE_T pos = 0;
1951 ER ret;
1952 int i;
1953 uint8_t data[32];
1954
1955 ret = data_flash_read(0, data);
1956 if (ret != E_OK) {
1957 syslog(LOG_WARNING, "data_flash_read() result = %d", ret);
1958 return;
1959 }
1960
1961 memcpy(dealer->init_params.mac_addr, &data[0], sizeof(dealer->init_params.mac_addr));
1962 dealer->init_params.dhcp_enable = data[6] != 0;
1963 memcpy(dealer->init_params.ip_addr, &data[7], sizeof(dealer->init_params.ip_addr));
1964 memcpy(dealer->init_params.netmask, &data[11], sizeof(dealer->init_params.netmask));
1965 memcpy(dealer->init_params.gateway, &data[15], sizeof(dealer->init_params.gateway));
1966
1967 ret = _ecn_fbs_cre(1, &buf);
1968 if (ret != E_OK) {
1969 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
1970 return;
1971 }
1972
1973 ret = fbs_printf(buf, &pos, "[50,%d,{},[],{", dealer->requestId);
1974 if (ret != E_OK) {
1975 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1976 _ecn_fbs_del(buf);
1977 return;
1978 }
1979
1980 /* MACアドレス */
1981 ret = fbs_printf(buf, &pos, "\"macAddr\":[");
1982 if (ret != E_OK) {
1983 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1984 _ecn_fbs_del(buf);
1985 return;
1986 }
1987
1988 for (i = 0; i < 6; i++) {
1989 ret = fbs_printf(buf, &pos, "%d,", dealer->init_params.mac_addr[i]);
1990 if (ret != E_OK) {
1991 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
1992 _ecn_fbs_del(buf);
1993 return;
1994 }
1995 }
1996
1997 /* 最後の","を消す */
1998 pos--;
1999
2000 ret = fbs_printf(buf, &pos, "],");
2001 if (ret != E_OK) {
2002 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
2003 _ecn_fbs_del(buf);
2004 return;
2005 }
2006
2007 /* DHCP有効/無効 */
2008 ret = fbs_printf(buf, &pos, "\"dhcpEnable\":%s,", dealer->init_params.dhcp_enable ? "true" : "false");
2009 if (ret != E_OK) {
2010 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
2011 _ecn_fbs_del(buf);
2012 return;
2013 }
2014
2015 /* IPアドレス */
2016 ret = wamp_dealer_write_ip_addr(dealer, buf, &pos, dealer->init_params.ip_addr, "ipAddr");
2017 if (ret != E_OK) {
2018 syslog(LOG_WARNING, "wamp_dealer_write_ip_addr() result = %d", ret);
2019 _ecn_fbs_del(buf);
2020 return;
2021 }
2022
2023 /* サブネットマスク */
2024 ret = wamp_dealer_write_ip_addr(dealer, buf, &pos, dealer->init_params.netmask, "netmask");
2025 if (ret != E_OK) {
2026 syslog(LOG_WARNING, "wamp_dealer_write_ip_addr() result = %d", ret);
2027 _ecn_fbs_del(buf);
2028 return;
2029 }
2030
2031 /* デフォルトゲートウェイ */
2032 ret = wamp_dealer_write_ip_addr(dealer, buf, &pos, dealer->init_params.gateway, "gateway");
2033 if (ret != E_OK) {
2034 syslog(LOG_WARNING, "wamp_dealer_write_ip_addr() result = %d", ret);
2035 _ecn_fbs_del(buf);
2036 return;
2037 }
2038
2039 /* 最後の","を消す */
2040 pos--;
2041
2042 ret = fbs_printf(buf, &pos, "}]");
2043 if (ret != E_OK) {
2044 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
2045 _ecn_fbs_del(buf);
2046 return;
2047 }
2048
2049 ret = main_send_message(buf, s->wbsid);
2050 if (ret != E_OK) {
2051 syslog(LOG_WARNING, "main_send_message() result = %d", ret);
2052 return;
2053 }
2054
2055 dealer->error = NULL;
2056}
2057
2058void wamp_dealer_yield(wamp_dealer_t *dealer)
2059{
2060}
2061
2062void wamp_dealer_yield_request_id(wamp_dealer_t *dealer, const char *value)
2063{
2064}
2065
2066void wamp_dealer_yield_options(wamp_dealer_t *dealer, const char *value)
2067{
2068}
2069
2070void wamp_dealer_yield_options_param(wamp_dealer_t *dealer, jsonsl_action_t action,
2071 struct jsonsl_state_st *state, const char *buf)
2072{
2073}
2074
2075void wamp_dealer_yield_arguments(wamp_dealer_t *dealer, const char *value)
2076{
2077}
2078
2079void wamp_dealer_yield_arguments_param(wamp_dealer_t *dealer, jsonsl_action_t action,
2080 struct jsonsl_state_st *state, const char *buf)
2081{
2082}
2083
2084void wamp_dealer_yield_argumentskw(wamp_dealer_t *dealer, const char *value)
2085{
2086}
2087
2088void wamp_dealer_yield_argumentskw_param(wamp_dealer_t *dealer, jsonsl_action_t action,
2089 struct jsonsl_state_st *state, const char *buf)
2090{
2091}
2092
2093void wamp_dealer_yield_close(struct wamp_state *s)
2094{
2095}
2096
2097void wamp_dealer_cansel(wamp_dealer_t *dealer)
2098{
2099}
2100
2101void wamp_dealer_cansel_request_id(wamp_dealer_t *dealer, const char *value)
2102{
2103}
2104
2105void wamp_dealer_cansel_options(wamp_dealer_t *dealer, const char *value)
2106{
2107}
2108
2109void wamp_dealer_cansel_options_param(wamp_dealer_t *dealer, jsonsl_action_t action,
2110 struct jsonsl_state_st *state, const char *buf)
2111{
2112}
2113
2114void wamp_dealer_cansel_close(struct wamp_state *s)
2115{
2116}
2117
2118static bool_t wamp_dealer_get_epc(const char *propName, int nameLen,
2119 uint16_t devType, uint8_t *epc, uint8_t *pdc)
2120{
2121 if(propName[0] == '0' && propName[1] == 'x'){
2122 if((wamp_stob(&propName[2], epc, sizeof(*epc)) != 1)
2123 || (propName[4] != '\0')){
2124 *epc = 0;
2125 *pdc = 0;
2126 return false;
2127 }
2128
2129 *pdc = 1;
2130 return true;
2131 }
2132
2133 *epc = kadecot_names_get_property_code(propName, nameLen, devType);
2134 if(*epc == 0){
2135 *pdc = 0;
2136 return false;
2137 }
2138 *pdc = 1;
2139
2140 return true;
2141}
2142
2143static echonetlite_device_t *wamp_dealer_get_device(wamp_dealer_t *dealer, int deviceId)
2144{
2145 echonetlite_device_t *pos, *end = &dealer->devices[sizeof(dealer->devices) / sizeof(dealer->devices[0])];
2146
2147 if(deviceId <= 0)
2148 return NULL;
2149
2150 for(pos = dealer->devices; pos < end; pos++){
2151 if(pos->deviceId != deviceId)
2152 continue;
2153
2154 return pos;
2155 }
2156
2157 return NULL;
2158}
2159
2160int wamp_stob(const char *str, uint8_t *dst, int dstc)
2161{
2162 uint8_t *start = dst, *end = &dst[dstc];
2163 int size = 0, i;
2164 char c;
2165 uint8_t data;
2166
2167 for(i = 0; dst < end; dst++){
2168 c = str[i];
2169 if(c == '\0')
2170 break;
2171
2172 data = 0;
2173
2174 if(c >= '0' && c <= '9'){
2175 data |= (c - '0');
2176 }
2177 else if(c >= 'A' && c <= 'F'){
2178 data |= (0xA + c - 'A');
2179 }
2180 else if(c >= 'a' && c <= 'f'){
2181 data |= (0xA + c - 'a');
2182 }
2183 else
2184 break;
2185
2186 i++;
2187 c = str[i];
2188 data <<= 4;
2189
2190 if(c >= '0' && c <= '9'){
2191 data |= (c - '0');
2192 }
2193 else if(c >= 'A' && c <= 'F'){
2194 data |= (0xA + c - 'A');
2195 }
2196 else if(c >= 'a' && c <= 'f'){
2197 data |= (0xA + c - 'a');
2198 }
2199 else
2200 break;
2201
2202 i++;
2203 *dst = data;
2204 }
2205
2206 return dst - start;
2207}
2208
2209void wamp_dealer_init(wamp_dealer_t *dealer)
2210{
2211}
Note: See TracBrowser for help on using the repository browser.