2 * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
4 * Contact: Suresh Kumar N (suresh.n@samsung.com)
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 #include "zigbee_service_interface_common.h"
21 #include <zblib_driver_zcl_scene.h>
23 static void on_zcl_scene_add_scene_resp(ZigBeeServiceInterface *service_interface,
24 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
26 ZigbeeServiceInterfaceRespCbData_t *cb_data =
27 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
30 NOT_USED(service_interface);
33 NOT_USED(resp_data_len);
36 static gboolean on_zcl_scene_add_scene(ZigbeeZcl_scene *zcl_scene_object,
37 GDBusMethodInvocation *invocation,
42 gshort transition_time,
45 GVariant *ext_field_set,
48 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
49 ZigbeeZclSceneAddScene_t req;
50 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
52 GVariantIter *iter = NULL;
57 memset(&req, 0x0, sizeof(ZigbeeZclSceneAddScene_t));
59 /* Update request structure */
60 req.node_id = node_id;
61 req.dest_ep = dest_ep;
62 req.group_id = group_id;
63 req.scene_id = scene_id;
64 req.transition_time = transition_time;
65 g_variant_get(scene_name, "ay", &iter);
66 while (g_variant_iter_loop(iter, "y", req.scene_name[i])) {
68 if (i >= ZIGBEE_ZCL_GROUP_NAME_MAX_LEN + 1)
73 req.ext_field_set_len = ext_length;
74 req.ext_field_set = g_malloc0(ext_length);
75 g_variant_get(ext_field_set, "aq", &iter);
76 while (g_variant_iter_loop(iter, "q", req.ext_field_set[i])) {
82 /* Allocate response callback data */
84 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
86 if (NULL == resp_cb_data) {
87 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
89 /* Send failure response */
90 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
95 /* Dispatch request */
96 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
97 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
98 ZBLIB_ZCL_SCENE_OPS_ADD_SCENE,
100 on_zcl_scene_add_scene_resp, resp_cb_data);
103 g_free(req.ext_field_set);
106 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
108 /* Free response callback data */
109 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
111 /* Send failure response */
112 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
120 static void on_zcl_scene_view_scene_resp(ZigBeeServiceInterface *service_interface,
121 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
123 ZigbeeServiceInterfaceRespCbData_t *cb_data =
124 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
127 NOT_USED(service_interface);
128 NOT_USED(request_id);
130 NOT_USED(resp_data_len);
133 static gboolean on_zcl_scene_view_scene(ZigbeeZcl_scene *zcl_scene_object,
134 GDBusMethodInvocation *invocation,
141 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
142 ZigbeeZclSceneViewScene_t req;
143 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
147 memset(&req, 0x0, sizeof(ZigbeeZclSceneViewScene_t));
149 /* Update request structure */
150 req.node_id = node_id;
151 req.dest_ep = dest_ep;
152 req.group_id = group_id;
153 req.scene_id = scene_id;
155 /* Allocate response callback data */
157 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
158 invocation, NULL, 0);
159 if (NULL == resp_cb_data) {
160 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
162 /* Send failure response */
163 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
168 /* Dispatch request */
169 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
170 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
171 ZBLIB_ZCL_SCENE_OPS_VIEW_SCENE,
173 on_zcl_scene_view_scene_resp, resp_cb_data);
175 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
177 /* Free response callback data */
178 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
180 /* Send failure response */
181 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
189 static void on_zcl_scene_remove_scene_resp(ZigBeeServiceInterface *service_interface,
190 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
192 ZigbeeServiceInterfaceRespCbData_t *cb_data =
193 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
196 NOT_USED(service_interface);
197 NOT_USED(request_id);
199 NOT_USED(resp_data_len);
202 static gboolean on_zcl_scene_remove_scene(ZigbeeZcl_scene *zcl_scene_object,
203 GDBusMethodInvocation *invocation,
210 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
211 ZigbeeZclSceneRemoveScene_t req;
212 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
216 memset(&req, 0x0, sizeof(ZigbeeZclSceneRemoveScene_t));
218 /* Update request structure */
219 req.node_id = node_id;
220 req.dest_ep = dest_ep;
221 req.group_id = group_id;
222 req.scene_id = scene_id;
224 /* Allocate response callback data */
226 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
227 invocation, NULL, 0);
228 if (NULL == resp_cb_data) {
229 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
231 /* Send failure response */
232 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
237 /* Dispatch request */
238 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
239 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
240 ZBLIB_ZCL_SCENE_OPS_REMOVE_SCENE,
242 on_zcl_scene_remove_scene_resp, resp_cb_data);
244 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
246 /* Free response callback data */
247 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
249 /* Send failure response */
250 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
258 static void on_zcl_scene_store_scene_resp(ZigBeeServiceInterface *service_interface,
259 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
261 ZigbeeServiceInterfaceRespCbData_t *cb_data =
262 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
265 NOT_USED(service_interface);
266 NOT_USED(request_id);
268 NOT_USED(resp_data_len);
271 static gboolean on_zcl_scene_store_scene(ZigbeeZcl_scene *zcl_scene_object,
272 GDBusMethodInvocation *invocation,
279 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
280 ZigbeeZclSceneStoreScene_t req;
281 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
285 memset(&req, 0x0, sizeof(ZigbeeZclSceneStoreScene_t));
287 /* Update request structure */
288 req.node_id = node_id;
289 req.dest_ep = dest_ep;
290 req.group_id = group_id;
291 req.scene_id = scene_id;
293 /* Allocate response callback data */
295 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
296 invocation, NULL, 0);
297 if (NULL == resp_cb_data) {
298 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
300 /* Send failure response */
301 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
306 /* Dispatch request */
307 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
308 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
309 ZBLIB_ZCL_SCENE_OPS_STORE_SCENE,
311 on_zcl_scene_store_scene_resp, resp_cb_data);
313 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
315 /* Free response callback data */
316 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
318 /* Send failure response */
319 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
327 static void on_zcl_scene_recall_scene_resp(ZigBeeServiceInterface *service_interface,
328 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
330 ZigbeeServiceInterfaceRespCbData_t *cb_data =
331 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
334 NOT_USED(service_interface);
335 NOT_USED(request_id);
337 NOT_USED(resp_data_len);
340 static gboolean on_zcl_scene_recall_scene(ZigbeeZcl_scene *zcl_scene_object,
341 GDBusMethodInvocation *invocation,
348 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
349 ZigbeeZclSceneRecallScene_t req;
350 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
354 memset(&req, 0x0, sizeof(ZigbeeZclSceneRecallScene_t));
356 /* Update request structure */
357 req.node_id = node_id;
358 req.dest_ep = dest_ep;
359 req.group_id = group_id;
360 req.scene_id = scene_id;
362 /* Allocate response callback data */
364 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
365 invocation, NULL, 0);
366 if (NULL == resp_cb_data) {
367 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
369 /* Send failure response */
370 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
375 /* Dispatch request */
376 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
377 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
378 ZBLIB_ZCL_SCENE_OPS_RECALL_SCENE,
380 on_zcl_scene_recall_scene_resp, resp_cb_data);
382 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
384 /* Free response callback data */
385 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
387 /* Send failure response */
388 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
396 static void on_zcl_scene_remove_all_scene_resp(ZigBeeServiceInterface *service_interface,
397 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
399 ZigbeeServiceInterfaceRespCbData_t *cb_data =
400 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
403 NOT_USED(service_interface);
404 NOT_USED(request_id);
406 NOT_USED(resp_data_len);
409 static gboolean on_zcl_scene_remove_all_scene(ZigbeeZcl_scene *zcl_scene_object,
410 GDBusMethodInvocation *invocation,
416 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
417 ZigbeeZclSceneRemoveAllScene_t req;
418 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
422 memset(&req, 0x0, sizeof(ZigbeeZclSceneRemoveAllScene_t));
424 /* Update request structure */
425 req.node_id = node_id;
426 req.dest_ep = dest_ep;
427 req.group_id = group_id;
429 /* Allocate response callback data */
431 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
432 invocation, NULL, 0);
433 if (NULL == resp_cb_data) {
434 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
436 /* Send failure response */
437 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
442 /* Dispatch request */
443 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
444 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
445 ZBLIB_ZCL_SCENE_OPS_REMOVE_ALL_SCENE,
447 on_zcl_scene_remove_all_scene_resp, resp_cb_data);
449 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
451 /* Free response callback data */
452 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
454 /* Send failure response */
455 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
463 static void on_zcl_scene_get_scene_membership_resp(ZigBeeServiceInterface *service_interface,
464 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
466 ZigbeeServiceInterfaceRespCbData_t *cb_data =
467 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
470 NOT_USED(service_interface);
471 NOT_USED(request_id);
473 NOT_USED(resp_data_len);
476 static gboolean on_zcl_scene_get_scene_membership(ZigbeeZcl_scene *zcl_scene_object,
477 GDBusMethodInvocation *invocation,
483 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
484 ZigbeeZclSceneGetSceneMembership_t req;
485 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
489 memset(&req, 0x0, sizeof(ZigbeeZclSceneGetSceneMembership_t));
491 /* Update request structure */
492 req.node_id = node_id;
493 req.dest_ep = dest_ep;
494 req.group_id = group_id;
496 /* Allocate response callback data */
498 zigbee_service_dbus_interface_create_resp_cb_data(zcl_scene_object,
499 invocation, NULL, 0);
500 if (NULL == resp_cb_data) {
501 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
503 /* Send failure response */
504 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
509 /* Dispatch request */
510 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
511 ZBLIB_DRIVER_TYPE_ZCL_SCENE,
512 ZBLIB_ZCL_SCENE_OPS_GET_SCENE_MEMBERSHIP,
514 on_zcl_scene_get_scene_membership_resp, resp_cb_data);
516 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
518 /* Free response callback data */
519 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
521 /* Send failure response */
522 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
530 void zigbee_service_dbus_interface_zcl_scene_notification(ZigBeeServiceInterface *service_interface,
531 guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data)
533 if (NULL == service_interface) {
534 Z_LOGE("service_interface is NULL");
540 NOT_USED(noti_data_len);
541 NOT_USED(noti_cb_data);
544 gboolean zigbee_service_dbus_interface_zcl_scene_init(ZigBeeServiceInterface *service_interface,
545 ZigbeeObjectSkeleton *zigbee_object)
547 ZigbeeZcl_scene *zcl_scene_object;
549 if (NULL == service_interface) {
550 Z_LOGE("service_interface is NULL");
554 zcl_scene_object = zigbee_zcl_scene_skeleton_new();
555 zigbee_object_skeleton_set_zcl_scene(zigbee_object, zcl_scene_object);
556 g_object_unref(zcl_scene_object);
558 Z_LOGI("zcl_scene_object: [%p]", zcl_scene_object);
561 * Register signal handlers for 'zcl_scene' interface
563 g_signal_connect(zcl_scene_object,
565 G_CALLBACK(on_zcl_scene_add_scene), service_interface);
567 g_signal_connect(zcl_scene_object,
569 G_CALLBACK(on_zcl_scene_view_scene), service_interface);
571 g_signal_connect(zcl_scene_object,
572 "handle-remove-scene",
573 G_CALLBACK(on_zcl_scene_remove_scene), service_interface);
575 g_signal_connect(zcl_scene_object,
576 "handle-store-scene",
577 G_CALLBACK(on_zcl_scene_store_scene), service_interface);
579 g_signal_connect(zcl_scene_object,
580 "handle-recall-scene",
581 G_CALLBACK(on_zcl_scene_recall_scene), service_interface);
583 g_signal_connect(zcl_scene_object,
584 "handle-remove-all-scene",
585 G_CALLBACK(on_zcl_scene_remove_all_scene), service_interface);
587 g_signal_connect(zcl_scene_object,
588 "handle-get-scene-membership",
589 G_CALLBACK(on_zcl_scene_get_scene_membership), service_interface);