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_alarm.h>
23 static void *_service_interface_ref_zigbee_zcl_alarm(ZigBeeServiceInterface *service_interface)
25 ZigbeeObjectSkeleton *zigbee_object = NULL;
26 ZigbeeCustomData_t *custom_data = NULL;
27 ZigbeeZcl_alarm *alarm_object = NULL;
29 custom_data = (ZigbeeCustomData_t *)zblib_service_interface_ref_user_data(service_interface);
30 if (NULL == custom_data) {
31 Z_LOGE("D-BUS service interface custom_data is NULL!");
35 /* Get zigbee object */
36 zigbee_object = g_hash_table_lookup(custom_data->objects, ZIGBEE_SERVICE_PATH);
37 if (NULL == zigbee_object) {
38 Z_LOGW("Cannot find ZigBee D-BUS interface object!", zigbee_object);
42 alarm_object = zigbee_object_get_zcl_alarm(ZIGBEE_OBJECT(zigbee_object));
46 static void on_alarm_get_alarm_count_resp(ZigBeeServiceInterface *service_interface,
47 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
49 ZigbeeServiceInterfaceRespCbData_t *cb_data =
50 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
52 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
53 GDBusMethodInvocation *invocation = NULL;
55 ZigbeeZclAlarmGetAlarmCountResp_t *payload =
56 (ZigbeeZclAlarmGetAlarmCountResp_t *)resp_data;
58 NOT_USED(service_interface);
61 if (NULL == resp_data || 0 == resp_data_len) {
62 Z_LOGE("resp_data is null");
67 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
68 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
70 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
71 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
73 zigbee_zcl_alarm_complete_get_alarm_count(zcl_alarm_object, invocation,
74 payload->result, payload->status);
79 static gboolean on_alarm_get_alarm_count(ZigbeeZcl_alarm *alarm_object,
80 GDBusMethodInvocation *invocation,
85 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
86 ZigbeeZclAlarmGetAlarmCount_t req;
87 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
89 GVariantIter *iter = NULL;
94 memset(&req, 0x0, sizeof(ZigbeeZclAlarmGetAlarmCount_t));
96 /* Update request structure */
97 g_variant_get(eui64, "ay", &iter);
98 while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
100 if (i >= ZIGBEE_EUI64_SIZE)
103 req.endpoint = endpoint;
105 /* Allocate response callback data */
107 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
108 invocation, NULL, 0);
109 if (NULL == resp_cb_data) {
110 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
112 /* Send failure response */
113 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
118 /* Dispatch request */
119 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
120 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
121 ZBLIB_ZCL_ALARM_OPS_GET_ALARM_COUNT,
123 on_alarm_get_alarm_count_resp, resp_cb_data);
125 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
127 /* Free response callback data */
128 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
130 /* Send failure response */
131 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
139 static void on_alarm_reset_alarm_resp(ZigBeeServiceInterface *service_interface,
140 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
142 ZigbeeServiceInterfaceRespCbData_t *cb_data =
143 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
145 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
146 GDBusMethodInvocation *invocation = NULL;
148 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
150 NOT_USED(service_interface);
151 NOT_USED(request_id);
153 if (NULL == resp_data || 0 == resp_data_len) {
154 Z_LOGE("resp_data is null");
159 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
160 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
162 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
163 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
165 zigbee_zcl_alarm_complete_reset_alarm(zcl_alarm_object, invocation,
171 static gboolean on_alarm_reset_alarm(ZigbeeZcl_alarm *alarm_object,
172 GDBusMethodInvocation *invocation,
179 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
180 ZigbeeZclAlarmResetAlarm_t req;
181 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
185 memset(&req, 0x0, sizeof(ZigbeeZclAlarmResetAlarm_t));
187 /* Update request structure */
188 req.node_id = node_id;
189 req.endpoint = endpoint;
190 req.alarm_code = alarmcode;
191 req.cluster_id = cluster_id;
193 /* Allocate response callback data */
195 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
196 invocation, &req, sizeof(req));
197 if (NULL == resp_cb_data) {
198 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
200 /* Send failure response */
201 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
206 /* Dispatch request */
207 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
208 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
209 ZBLIB_ZCL_ALARM_OPS_RESET_ALARM,
211 on_alarm_reset_alarm_resp, resp_cb_data);
213 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
215 /* Free response callback data */
216 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
218 /* Send failure response */
219 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
227 static void on_alarm_reset_all_alarm_resp(ZigBeeServiceInterface *service_interface,
228 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
230 ZigbeeServiceInterfaceRespCbData_t *cb_data =
231 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
233 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
234 GDBusMethodInvocation *invocation = NULL;
236 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
238 NOT_USED(service_interface);
239 NOT_USED(request_id);
241 if (NULL == resp_data || 0 == resp_data_len) {
242 Z_LOGE("resp_data is null");
247 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
248 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
250 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
251 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
253 zigbee_zcl_alarm_complete_reset_all_alarm(zcl_alarm_object, invocation,
259 static gboolean on_alarm_reset_all_alarm(ZigbeeZcl_alarm *alarm_object,
260 GDBusMethodInvocation *invocation,
265 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
266 ZigbeeZclAlarmResetAllAlarm_t req;
267 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
271 memset(&req, 0x0, sizeof(ZigbeeZclAlarmResetAllAlarm_t));
273 /* Update request structure */
274 req.node_id = node_id;
275 req.endpoint = endpoint;
277 /* Allocate response callback data */
279 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
280 invocation, NULL, 0);
281 if (NULL == resp_cb_data) {
282 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
284 /* Send failure response */
285 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
290 /* Dispatch request */
291 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
292 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
293 ZBLIB_ZCL_ALARM_OPS_RESET_ALL_ALARM,
295 on_alarm_reset_all_alarm_resp, resp_cb_data);
297 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
299 /* Free response callback data */
300 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
302 /* Send failure response */
303 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
311 static void on_alarm_alarm_resp(ZigBeeServiceInterface *service_interface,
312 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
314 ZigbeeServiceInterfaceRespCbData_t *cb_data =
315 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
317 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
318 GDBusMethodInvocation *invocation = NULL;
320 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
322 NOT_USED(service_interface);
323 NOT_USED(request_id);
325 if (NULL == resp_data || 0 == resp_data_len) {
326 Z_LOGE("resp_data is null");
331 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
332 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
334 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
335 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
337 zigbee_zcl_alarm_complete_alarm(zcl_alarm_object, invocation,
343 static gboolean on_alarm_alarm(ZigbeeZcl_alarm *alarm_object,
344 GDBusMethodInvocation *invocation,
351 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
352 ZigbeeZclAlarmAlarm_t req;
353 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
355 GVariantIter *iter = NULL;
360 memset(&req, 0x0, sizeof(ZigbeeZclAlarmAlarm_t));
362 /* Update request structure */
363 g_variant_get(eui64, "ay", &iter);
364 while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
366 if (i >= ZIGBEE_EUI64_SIZE)
369 req.endpoint = endpoint;
370 req.alarm_code = alarmcode;
371 req.cluster_id = cluster_id;
373 /* Allocate response callback data */
375 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
376 invocation, NULL, 0);
377 if (NULL == resp_cb_data) {
378 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
380 /* Send failure response */
381 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
386 /* Dispatch request */
387 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
388 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
389 ZBLIB_ZCL_ALARM_OPS_ALARM,
391 on_alarm_alarm_resp, resp_cb_data);
393 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
395 /* Free response callback data */
396 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
398 /* Send failure response */
399 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
407 static void on_alarm_reset_alarm_log_resp(ZigBeeServiceInterface *service_interface,
408 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
410 ZigbeeServiceInterfaceRespCbData_t *cb_data =
411 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
413 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
414 GDBusMethodInvocation *invocation = NULL;
416 ZigbeeGeneralResp_t *payload =
417 (ZigbeeGeneralResp_t *)resp_data;
419 NOT_USED(service_interface);
420 NOT_USED(request_id);
422 if (NULL == resp_data || 0 == resp_data_len) {
423 Z_LOGE("resp_data is null");
428 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
429 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
431 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
432 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
434 zigbee_zcl_alarm_complete_reset_alarm_log(zcl_alarm_object, invocation,
440 static gboolean on_alarm_reset_alarm_log(ZigbeeZcl_alarm *alarm_object,
441 GDBusMethodInvocation *invocation,
446 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
447 ZigbeeZclAlarmResetAlarmLogs_t req;
448 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
452 memset(&req, 0x0, sizeof(ZigbeeZclAlarmResetAlarmLogs_t));
454 /* Update request structure */
455 req.node_id = node_id;
456 req.endpoint = endpoint;
458 /* Allocate response callback data */
460 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
461 invocation, NULL, 0);
462 if (NULL == resp_cb_data) {
463 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
465 /* Send failure response */
466 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
471 /* Dispatch request */
472 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
473 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
474 ZBLIB_ZCL_ALARM_OPS_RESET_ALARM_LOG,
476 on_alarm_reset_alarm_log_resp, resp_cb_data);
478 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
480 /* Free response callback data */
481 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
483 /* Send failure response */
484 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
492 static void on_alarm_get_alarm_resp(ZigBeeServiceInterface *service_interface,
493 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
495 ZigbeeServiceInterfaceRespCbData_t *cb_data =
496 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
498 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
499 GDBusMethodInvocation *invocation = NULL;
501 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
503 NOT_USED(service_interface);
504 NOT_USED(request_id);
506 if (NULL == resp_data || 0 == resp_data_len) {
507 Z_LOGE("resp_data is null");
512 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
513 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
515 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
516 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
518 zigbee_zcl_alarm_complete_get_alarm(zcl_alarm_object, invocation,
524 static gboolean on_alarm_get_alarm(ZigbeeZcl_alarm *alarm_object,
525 GDBusMethodInvocation *invocation,
530 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
531 ZigbeeZclAlarmGetAlarm_t req;
532 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
536 memset(&req, 0x0, sizeof(ZigbeeZclAlarmGetAlarm_t));
538 /* Update request structure */
539 req.node_id = node_id;
540 req.endpoint = endpoint;
542 /* Allocate response callback data */
544 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
545 invocation, NULL, 0);
546 if (NULL == resp_cb_data) {
547 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
549 /* Send failure response */
550 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
555 /* Dispatch request */
556 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
557 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
558 ZBLIB_ZCL_ALARM_OPS_GET_ALARM,
560 on_alarm_get_alarm_resp, resp_cb_data);
562 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
564 /* Free response callback data */
565 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
567 /* Send failure response */
568 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
576 void zigbee_service_dbus_interface_zcl_alarm_notification(ZigBeeServiceInterface *service_interface,
577 guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data)
579 ZigbeeZcl_alarm *alarm_object;
581 zblib_check_null_ret("service_interface", service_interface);
583 if (NULL == noti_data || 0 == noti_data_len) {
584 Z_LOGE("noti_data is NULL");
588 alarm_object = _service_interface_ref_zigbee_zcl_alarm(service_interface);
589 zblib_check_null_ret("alarm_object", alarm_object);
591 NOT_USED(noti_cb_data);
594 case ZBLIB_ZCL_ALARM_NOTI_GET_ALARM_RSP: {
595 ZigbeeZclAlarmGetAlarmRsp_t *rsp =
596 (ZigbeeZclAlarmGetAlarmRsp_t*)noti_data;
598 Z_LOGD("get_alarm_rsp from : [0x%X]", rsp->node_id);
600 zigbee_zcl_alarm_emit_get_alarm_rsp(alarm_object, rsp->node_id, rsp->endpoint,
601 rsp->status, rsp->alarm_code, rsp->clusterid, rsp->timestamp);
605 Z_LOGE("Unexpected notification [%x]", noti_id);
609 /* ZigbeeZcl_alarm should be dereferenced */
610 g_object_unref(alarm_object);
613 gboolean zigbee_service_dbus_interface_zcl_alarm_init(ZigBeeServiceInterface *service_interface,
614 ZigbeeObjectSkeleton *zigbee_object)
616 ZigbeeZcl_alarm *alarm_object;
618 if (NULL == service_interface) {
619 Z_LOGE("service_interface is NULL");
623 alarm_object = zigbee_zcl_alarm_skeleton_new();
624 zigbee_object_skeleton_set_zcl_alarm(zigbee_object, alarm_object);
625 g_object_unref(alarm_object);
627 Z_LOGI("alarm_object: [%p]", alarm_object);
630 * Register signal handlers for 'alarm' interface
632 g_signal_connect(alarm_object,
633 "handle-get-alarm-count",
634 G_CALLBACK(on_alarm_get_alarm_count), service_interface);
636 g_signal_connect(alarm_object,
637 "handle-reset-alarm",
638 G_CALLBACK(on_alarm_reset_alarm), service_interface);
640 g_signal_connect(alarm_object,
641 "handle-reset-all-alarm",
642 G_CALLBACK(on_alarm_reset_all_alarm), service_interface);
644 g_signal_connect(alarm_object,
646 G_CALLBACK(on_alarm_alarm), service_interface);
648 g_signal_connect(alarm_object,
649 "handle-reset-alarm-log",
650 G_CALLBACK(on_alarm_reset_alarm_log), service_interface);
652 g_signal_connect(alarm_object,
654 G_CALLBACK(on_alarm_get_alarm), service_interface);