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>
24 static void *_service_interface_ref_zigbee_zcl_alarm(ZigBeeServiceInterface *service_interface)
26 ZigbeeObjectSkeleton *zigbee_object = NULL;
27 ZigbeeCustomData_t *custom_data = NULL;
28 ZigbeeZcl_alarm *alarm_object = NULL;
30 custom_data = (ZigbeeCustomData_t *)zblib_service_interface_ref_user_data(service_interface);
31 if (NULL == custom_data) {
32 Z_LOGE("D-BUS service interface custom_data is NULL!");
36 /* Get zigbee object */
37 zigbee_object = g_hash_table_lookup(custom_data->objects, ZIGBEE_SERVICE_PATH);
38 if (NULL == zigbee_object) {
39 Z_LOGW("Cannot find ZigBee D-BUS interface object!", zigbee_object);
43 alarm_object = zigbee_object_get_zcl_alarm(ZIGBEE_OBJECT(zigbee_object));
47 static void on_alarm_get_alarm_count_resp(ZigBeeServiceInterface *service_interface,
48 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
50 ZigbeeServiceInterfaceRespCbData_t *cb_data =
51 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
53 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
54 GDBusMethodInvocation *invocation = NULL;
56 ZigbeeZclAlarmGetAlarmCountResp_t *payload =
57 (ZigbeeZclAlarmGetAlarmCountResp_t *)resp_data;
59 NOT_USED(service_interface);
62 if (NULL == resp_data || 0 == resp_data_len) {
63 Z_LOGE("resp_data is null");
68 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
69 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
71 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
72 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
74 zigbee_zcl_alarm_complete_get_alarm_count(zcl_alarm_object, invocation,
75 payload->result, payload->status);
80 static gboolean on_alarm_get_alarm_count(ZigbeeZcl_alarm *alarm_object,
81 GDBusMethodInvocation *invocation,
86 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
87 ZigbeeZclAlarmGetAlarmCount_t req;
88 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
90 GVariantIter *iter = NULL;
95 memset(&req, 0x0, sizeof(ZigbeeZclAlarmGetAlarmCount_t));
97 /* Update request structure */
98 g_variant_get(eui64, "a(y)", &iter);
99 while (g_variant_iter_loop(iter, "(y)", &(req.eui64[i]))) {
101 if (i >= ZIGBEE_EUI64_SIZE)
104 req.endpoint = endpoint;
106 /* Allocate response callback data */
108 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
109 invocation, NULL, 0);
110 if (NULL == resp_cb_data) {
111 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
113 /* Send failure response */
114 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
119 /* Dispatch request */
120 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
121 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
122 ZBLIB_ZCL_ALARM_OPS_GET_ALARM_COUNT,
124 on_alarm_get_alarm_count_resp, resp_cb_data);
126 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
128 /* Free response callback data */
129 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
131 /* Send failure response */
132 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
140 static void on_alarm_reset_alarm_resp(ZigBeeServiceInterface *service_interface,
141 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
143 ZigbeeServiceInterfaceRespCbData_t *cb_data =
144 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
146 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
147 GDBusMethodInvocation *invocation = NULL;
149 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
151 NOT_USED(service_interface);
152 NOT_USED(request_id);
154 if (NULL == resp_data || 0 == resp_data_len) {
155 Z_LOGE("resp_data is null");
160 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
161 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
163 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
164 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
166 zigbee_zcl_alarm_complete_reset_alarm(zcl_alarm_object, invocation,
172 static gboolean on_alarm_reset_alarm(ZigbeeZcl_alarm *alarm_object,
173 GDBusMethodInvocation *invocation,
180 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
181 ZigbeeZclAlarmResetAlarm_t req;
182 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
186 memset(&req, 0x0, sizeof(ZigbeeZclAlarmResetAlarm_t));
188 /* Update request structure */
189 req.node_id = node_id;
190 req.endpoint = endpoint;
191 req.alarm_code = alarmcode;
192 req.cluster_id = cluster_id;
194 /* Allocate response callback data */
196 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
197 invocation, &req, sizeof(req));
198 if (NULL == resp_cb_data) {
199 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
201 /* Send failure response */
202 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
207 /* Dispatch request */
208 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
209 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
210 ZBLIB_ZCL_ALARM_OPS_RESET_ALARM,
212 on_alarm_reset_alarm_resp, resp_cb_data);
214 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
216 /* Free response callback data */
217 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
219 /* Send failure response */
220 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
228 static void on_alarm_reset_all_alarm_resp(ZigBeeServiceInterface *service_interface,
229 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
231 ZigbeeServiceInterfaceRespCbData_t *cb_data =
232 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
234 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
235 GDBusMethodInvocation *invocation = NULL;
237 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
239 NOT_USED(service_interface);
240 NOT_USED(request_id);
242 if (NULL == resp_data || 0 == resp_data_len) {
243 Z_LOGE("resp_data is null");
248 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
249 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
251 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
252 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
254 zigbee_zcl_alarm_complete_reset_all_alarm(zcl_alarm_object, invocation,
260 static gboolean on_alarm_reset_all_alarm(ZigbeeZcl_alarm *alarm_object,
261 GDBusMethodInvocation *invocation,
266 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
267 ZigbeeZclAlarmResetAllAlarm_t req;
268 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
272 memset(&req, 0x0, sizeof(ZigbeeZclAlarmResetAllAlarm_t));
274 /* Update request structure */
275 req.node_id = node_id;
276 req.endpoint = endpoint;
278 /* Allocate response callback data */
280 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
281 invocation, NULL, 0);
282 if (NULL == resp_cb_data) {
283 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
285 /* Send failure response */
286 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
291 /* Dispatch request */
292 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
293 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
294 ZBLIB_ZCL_ALARM_OPS_RESET_ALL_ALARM,
296 on_alarm_reset_all_alarm_resp, resp_cb_data);
298 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
300 /* Free response callback data */
301 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
303 /* Send failure response */
304 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
312 static void on_alarm_alarm_resp(ZigBeeServiceInterface *service_interface,
313 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
315 ZigbeeServiceInterfaceRespCbData_t *cb_data =
316 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
318 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
319 GDBusMethodInvocation *invocation = NULL;
321 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
323 NOT_USED(service_interface);
324 NOT_USED(request_id);
326 if (NULL == resp_data || 0 == resp_data_len) {
327 Z_LOGE("resp_data is null");
332 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
333 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
335 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
336 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
338 zigbee_zcl_alarm_complete_alarm(zcl_alarm_object, invocation,
344 static gboolean on_alarm_alarm(ZigbeeZcl_alarm *alarm_object,
345 GDBusMethodInvocation *invocation,
352 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
353 ZigbeeZclAlarmAlarm_t req;
354 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
356 GVariantIter *iter = NULL;
361 memset(&req, 0x0, sizeof(ZigbeeZclAlarmAlarm_t));
363 /* Update request structure */
364 g_variant_get(eui64, "a(y)", &iter);
365 while (g_variant_iter_loop(iter, "(y)", &(req.eui64[i]))) {
367 if (i >= ZIGBEE_EUI64_SIZE)
370 req.endpoint = endpoint;
371 req.alarm_code = alarmcode;
372 req.cluster_id = cluster_id;
374 /* Allocate response callback data */
376 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
377 invocation, NULL, 0);
378 if (NULL == resp_cb_data) {
379 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
381 /* Send failure response */
382 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
387 /* Dispatch request */
388 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
389 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
390 ZBLIB_ZCL_ALARM_OPS_ALARM,
392 on_alarm_alarm_resp, resp_cb_data);
394 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
396 /* Free response callback data */
397 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
399 /* Send failure response */
400 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
408 static void on_alarm_reset_alarm_log_resp(ZigBeeServiceInterface *service_interface,
409 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
411 ZigbeeServiceInterfaceRespCbData_t *cb_data =
412 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
414 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
415 GDBusMethodInvocation *invocation = NULL;
417 ZigbeeGeneralResp_t *payload =
418 (ZigbeeGeneralResp_t *)resp_data;
420 NOT_USED(service_interface);
421 NOT_USED(request_id);
423 if (NULL == resp_data || 0 == resp_data_len) {
424 Z_LOGE("resp_data is null");
429 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
430 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
432 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
433 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
435 zigbee_zcl_alarm_complete_reset_alarm_log(zcl_alarm_object, invocation,
441 static gboolean on_alarm_reset_alarm_log(ZigbeeZcl_alarm *alarm_object,
442 GDBusMethodInvocation *invocation,
447 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
448 ZigbeeZclAlarmResetAlarmLogs_t req;
449 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
453 memset(&req, 0x0, sizeof(ZigbeeZclAlarmResetAlarmLogs_t));
455 /* Update request structure */
456 req.node_id = node_id;
457 req.endpoint = endpoint;
459 /* Allocate response callback data */
461 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
462 invocation, NULL, 0);
463 if (NULL == resp_cb_data) {
464 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
466 /* Send failure response */
467 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
472 /* Dispatch request */
473 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
474 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
475 ZBLIB_ZCL_ALARM_OPS_RESET_ALARM_LOG,
477 on_alarm_reset_alarm_log_resp, resp_cb_data);
479 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
481 /* Free response callback data */
482 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
484 /* Send failure response */
485 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
493 static void on_alarm_get_alarm_resp(ZigBeeServiceInterface *service_interface,
494 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
496 ZigbeeServiceInterfaceRespCbData_t *cb_data =
497 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
499 ZigbeeZcl_alarm *zcl_alarm_object = NULL;
500 GDBusMethodInvocation *invocation = NULL;
502 ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
504 NOT_USED(service_interface);
505 NOT_USED(request_id);
507 if (NULL == resp_data || 0 == resp_data_len) {
508 Z_LOGE("resp_data is null");
513 zcl_alarm_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
514 zblib_check_null_free_and_ret("zcl_alarm_object", zcl_alarm_object, cb_data);
516 invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
517 zblib_check_null_free_and_ret("invocation", invocation, cb_data);
519 zigbee_zcl_alarm_complete_get_alarm(zcl_alarm_object, invocation,
525 static gboolean on_alarm_get_alarm(ZigbeeZcl_alarm *alarm_object,
526 GDBusMethodInvocation *invocation,
531 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
532 ZigbeeZclAlarmGetAlarm_t req;
533 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
537 memset(&req, 0x0, sizeof(ZigbeeZclAlarmGetAlarm_t));
539 /* Update request structure */
540 req.node_id = node_id;
541 req.endpoint = endpoint;
543 /* Allocate response callback data */
545 zigbee_service_dbus_interface_create_resp_cb_data(alarm_object,
546 invocation, NULL, 0);
547 if (NULL == resp_cb_data) {
548 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
550 /* Send failure response */
551 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
556 /* Dispatch request */
557 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
558 ZBLIB_DRIVER_TYPE_ZCL_ALARM,
559 ZBLIB_ZCL_ALARM_OPS_GET_ALARM,
561 on_alarm_get_alarm_resp, resp_cb_data);
563 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
565 /* Free response callback data */
566 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
568 /* Send failure response */
569 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
577 void zigbee_service_dbus_interface_zcl_alarm_notification(ZigBeeServiceInterface *service_interface,
578 guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data)
580 ZigbeeZcl_alarm *alarm_object;
582 zblib_check_null_ret("service_interface", service_interface);
584 if (NULL == noti_data || 0 == noti_data_len) {
585 Z_LOGE("noti_data is NULL");
589 alarm_object = _service_interface_ref_zigbee_zcl_alarm(service_interface);
590 zblib_check_null_ret("alarm_object", alarm_object);
592 NOT_USED(noti_cb_data);
595 case ZBLIB_ZCL_ALARM_NOTI_GET_ALARM_RSP: {
596 ZigbeeZclAlarmGetAlarmRsp_t *rsp =
597 (ZigbeeZclAlarmGetAlarmRsp_t*)noti_data;
599 Z_LOGD("get_alarm_rsp from : [0x%X]", rsp->node_id);
601 zigbee_zcl_alarm_emit_get_alarm_rsp(alarm_object, rsp->node_id, rsp->endpoint,
602 rsp->status, rsp->alarm_code, rsp->clusterid, rsp->timestamp);
606 Z_LOGE("Unexpected notification [%x]", noti_id);
610 /* ZigbeeZcl_alarm should be dereferenced */
611 g_object_unref(alarm_object);
615 gboolean zigbee_service_dbus_interface_zcl_alarm_init(ZigBeeServiceInterface *service_interface,
616 ZigbeeObjectSkeleton *zigbee_object)
618 ZigbeeZcl_alarm *alarm_object;
620 if (NULL == service_interface) {
621 /* LCOV_EXCL_START */
622 Z_LOGE("service_interface is NULL");
627 alarm_object = zigbee_zcl_alarm_skeleton_new();
628 zigbee_object_skeleton_set_zcl_alarm(zigbee_object, alarm_object);
629 g_object_unref(alarm_object);
631 Z_LOGI("alarm_object: [%p]", alarm_object);
634 * Register signal handlers for 'alarm' interface
636 g_signal_connect(alarm_object,
637 "handle-get-alarm-count",
638 G_CALLBACK(on_alarm_get_alarm_count), service_interface);
640 g_signal_connect(alarm_object,
641 "handle-reset-alarm",
642 G_CALLBACK(on_alarm_reset_alarm), service_interface);
644 g_signal_connect(alarm_object,
645 "handle-reset-all-alarm",
646 G_CALLBACK(on_alarm_reset_all_alarm), service_interface);
648 g_signal_connect(alarm_object,
650 G_CALLBACK(on_alarm_alarm), service_interface);
652 g_signal_connect(alarm_object,
653 "handle-reset-alarm-log",
654 G_CALLBACK(on_alarm_reset_alarm_log), service_interface);
656 g_signal_connect(alarm_object,
658 G_CALLBACK(on_alarm_get_alarm), service_interface);