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.
20 #include <zblib_request.h>
21 #include <zblib_service.h>
22 #include <zblib_service_interface.h>
24 #include <zblib_driver.h>
25 #include <zblib_driver_alarm.h>
26 #include <zblib_driver_custom.h>
27 #include <zblib_driver_door_lock.h>
28 #include <zblib_driver_fan_control.h>
29 #include <zblib_driver_level_control.h>
30 #include <zblib_driver_mfglib_control.h>
31 #include <zblib_driver_on_off.h>
32 #include <zblib_driver_service.h>
33 #include <zblib_driver_thermostat.h>
34 #include <zblib_driver_zclbasic_control.h>
35 #include <zblib_driver_zclglobal_control.h>
36 #include <zblib_driver_zclias_control.h>
37 #include <zblib_driver_zclidentify_control.h>
38 #include <zblib_driver_zcl_color.h>
39 #include <zblib_driver_zcl_group.h>
40 #include <zblib_driver_zcl_poll_control.h>
41 #include <zblib_driver_zcl_scene.h>
42 #include <zblib_driver_zdodev_control.h>
43 #include <zblib_driver_zdo_bind.h>
45 /**< ZigBee Request object */
46 struct zblib_request_type {
47 gint request_id; /**< Request ID */
48 guint request_type; /**< Request type */
49 guint ref_count; /* Reference count */
51 gpointer request_data; /**< Request data */
53 ZigBeeServiceInterface *service_interface; /* Service interface */
56 static ZblibDriverType_e __zblib_request_get_driver_type(guint request_type)
58 ZblibDriverType_e driver_type;
60 driver_type = ((request_type && 0xFF000000) >> 24);
65 static ZblibDriverType_e __zblib_request_get_ops_id(guint request_type)
69 ops_id = (request_type && 0x000000FF);
74 static gpointer __zblib_request_create_alarm_request_data(guint request_type,
75 gpointer request_data, guint request_data_len)
77 gpointer alarm_request_data = NULL;
80 NOT_USED(request_data);
81 NOT_USED(request_data_len);
84 ops_id = __zblib_request_get_ops_id(request_type);
86 case ZBLIB_ALARM_OPS_GET_ALARM_COUNT: {
90 case ZBLIB_ALARM_OPS_RESET_ALARM: {
94 case ZBLIB_ALARM_OPS_RESET_ALL_ALARM: {
98 case ZBLIB_ALARM_OPS_ALARM: {
102 case ZBLIB_ALARM_OPS_RESET_ALARM_LOG: {
106 case ZBLIB_ALARM_OPS_GET_ALARM: {
114 return alarm_request_data;
117 static gpointer __zblib_request_create_custom_request_data(guint request_type,
118 gpointer request_data, guint request_data_len)
120 gpointer custom_request_data = NULL;
123 NOT_USED(request_data);
124 NOT_USED(request_data_len);
127 ops_id = __zblib_request_get_ops_id(request_type);
129 case ZBLIB_CUSTOM_OPS_APS_SEND: {
133 case ZBLIB_CUSTOM_OPS_ZCL_SEND: {
137 case ZBLIB_CUSTOM_OPS_SEND_TO_LOCAL: {
145 return custom_request_data;
148 static gpointer __zblib_request_create_door_lock_request_data(guint request_type,
149 gpointer request_data, guint request_data_len)
151 gpointer door_lock_request_data = NULL;
154 NOT_USED(request_data);
155 NOT_USED(request_data_len);
158 ops_id = __zblib_request_get_ops_id(request_type);
160 case ZBLIB_DOOR_LOCK_OPS_SUBSCRIBE_LOCK_EVENT: {
164 case ZBLIB_DOOR_LOCK_OPS_SET_DOOR_LOCK_PIN: {
168 case ZBLIB_DOOR_LOCK_OPS_SET_DOOR_LOCK: {
172 case ZBLIB_DOOR_LOCK_OPS_GET_LOCK_STATE: {
180 return door_lock_request_data;
183 static gpointer __zblib_request_create_fan_control_request_data(guint request_type,
184 gpointer request_data, guint request_data_len)
186 gpointer fan_control_request_data = NULL;
189 NOT_USED(request_data);
190 NOT_USED(request_data_len);
193 ops_id = __zblib_request_get_ops_id(request_type);
195 case ZBLIB_FAN_CONTROL_OPS_SET_FAN_MODE: {
199 case ZBLIB_FAN_CONTROL_OPS_GET_FAN_MODE: {
203 case ZBLIB_FAN_CONTROL_OPS_SET_FAN_MODE_SEQUENCE: {
207 case ZBLIB_FAN_CONTROL_OPS_GET_FAN_MODE_SEQUENCE: {
215 return fan_control_request_data;
218 static gpointer __zblib_request_create_level_control_request_data(guint request_type,
219 gpointer request_data, guint request_data_len)
221 gpointer level_control_request_data = NULL;
224 NOT_USED(request_data);
225 NOT_USED(request_data_len);
228 ops_id = __zblib_request_get_ops_id(request_type);
230 case ZBLIB_LEVEL_CONTROL_OPS_MOVE_TO_LEVEL: {
234 case ZBLIB_LEVEL_CONTROL_OPS_MOVE: {
238 case ZBLIB_LEVEL_CONTROL_OPS_STEP: {
242 case ZBLIB_LEVEL_CONTROL_OPS_MOVE_TO_LEVEL_WITH_ON_OFF: {
246 case ZBLIB_LEVEL_CONTROL_OPS_MOVE_WITH_ON_OFF: {
250 case ZBLIB_LEVEL_CONTROL_OPS_STEP_WITH_ON_OFF: {
254 case ZBLIB_LEVEL_CONTROL_OPS_STOP: {
262 return level_control_request_data;
265 static gpointer __zblib_request_create_mfglib_control_request_data(guint request_type,
266 gpointer request_data, guint request_data_len)
268 gpointer mfglib_control_request_data = NULL;
271 NOT_USED(request_data);
272 NOT_USED(request_data_len);
275 ops_id = __zblib_request_get_ops_id(request_type);
277 case ZBLIB_MFGLIB_CONTROL_OPS_START: {
281 case ZBLIB_MFGLIB_CONTROL_OPS_END: {
285 case ZBLIB_MFGLIB_CONTROL_OPS_START_TONE: {
289 case ZBLIB_MFGLIB_CONTROL_OPS_STOP_TONE: {
293 case ZBLIB_MFGLIB_CONTROL_OPS_START_STREAM: {
297 case ZBLIB_MFGLIB_CONTROL_OPS_STOP_STREAM: {
301 case ZBLIB_MFGLIB_CONTROL_OPS_SEND_PACKET: {
305 case ZBLIB_MFGLIB_CONTROL_OPS_SET_CHANNEL: {
309 case ZBLIB_MFGLIB_CONTROL_OPS_GET_CHANNEL: {
313 case ZBLIB_MFGLIB_CONTROL_OPS_SET_POWER: {
317 case ZBLIB_MFGLIB_CONTROL_OPS_GET_POWER: {
321 case ZBLIB_MFGLIB_CONTROL_OPS_SET_SYNOFFSET: {
325 case ZBLIB_MFGLIB_CONTROL_OPS_GET_SYNOFFSET: {
329 case ZBLIB_MFGLIB_CONTROL_OPS_RX_START: {
333 case ZBLIB_MFGLIB_CONTROL_OPS_RX_STOP: {
337 case ZBLIB_MFGLIB_CONTROL_OPS_RX_VERIFY: {
341 case ZBLIB_MFGLIB_CONTROL_OPS_GET_RSSI: {
349 return mfglib_control_request_data;
352 static gpointer __zblib_request_create_on_off_request_data(guint request_type,
353 gpointer request_data, guint request_data_len)
355 gpointer on_off_request_data = NULL;
358 NOT_USED(request_data);
359 NOT_USED(request_data_len);
362 ops_id = __zblib_request_get_ops_id(request_type);
364 case ZBLIB_ON_OFF_OPS_SET_ON_OFF: {
368 case ZBLIB_ON_OFF_OPS_GET_ON_OFF_STATE: {
376 return on_off_request_data;
379 static gpointer __zblib_request_create_service_request_data(guint request_type,
380 gpointer request_data, guint request_data_len)
382 gpointer service_request_data = NULL;
385 NOT_USED(request_data);
386 NOT_USED(request_data_len);
389 ops_id = __zblib_request_get_ops_id(request_type);
391 case ZBLIB_SERVICE_OPS_ENABLE: {
395 case ZBLIB_SERVICE_OPS_DISABLE: {
399 case ZBLIB_SERVICE_OPS_ZB_HW_RESET: {
403 case ZBLIB_SERVICE_OPS_FORM_NETWORK: {
407 case ZBLIB_SERVICE_OPS_COEX_START: {
411 case ZBLIB_SERVICE_OPS_COEX_STOP: {
415 case ZBLIB_SERVICE_OPS_LEAVE_NETWORK: {
419 case ZBLIB_SERVICE_OPS_GET_NETWORK_INFO: {
423 case ZBLIB_SERVICE_OPS_PERMIT_JOIN: {
427 case ZBLIB_SERVICE_OPS_LEAVE_REQUEST: {
431 case ZBLIB_SERVICE_OPS_GET_DEVICE_LIST: {
435 case ZBLIB_SERVICE_OPS_GET_MAC: {
439 case ZBLIB_SERVICE_OPS_GET_DEVICE_INFO: {
443 case ZBLIB_SERVICE_OPS_GET_ENDPOINT_LIST: {
447 case ZBLIB_SERVICE_OPS_GET_CLUSTER_LIST: {
451 case ZBLIB_SERVICE_OPS_GET_NODE_TYPE: {
459 return service_request_data;
462 static gpointer __zblib_request_create_thermostat_request_data(guint request_type,
463 gpointer request_data, guint request_data_len)
465 gpointer thermostat_request_data = NULL;
468 NOT_USED(request_data);
469 NOT_USED(request_data_len);
472 ops_id = __zblib_request_get_ops_id(request_type);
474 case ZBLIB_THERMOSTAT_OPS_GET_LOCAL_TEMP: {
478 case ZBLIB_THERMOSTAT_OPS_GET_WEEKLY_SCHEDULE: {
482 case ZBLIB_THERMOSTAT_OPS_SET_WEEKLY_SCHEDULE: {
486 case ZBLIB_THERMOSTAT_OPS_CLEAR_WEEKLY_SCHEDULE: {
490 case ZBLIB_THERMOSTAT_OPS_SETPOINT_RAISE_LOWER: {
498 return thermostat_request_data;
501 static gpointer __zblib_request_create_zclbasic_control_request_data(guint request_type,
502 gpointer request_data, guint request_data_len)
504 gpointer zclbasic_control_request_data = NULL;
507 NOT_USED(request_data);
508 NOT_USED(request_data_len);
511 ops_id = __zblib_request_get_ops_id(request_type);
513 case ZBLIB_ZCLBASIC_CONTROL_OPS_RESET_FACTORY_DEFAULT: {
521 return zclbasic_control_request_data;
524 static gpointer __zblib_request_create_zclglobal_control_request_data(guint request_type,
525 gpointer request_data, guint request_data_len)
527 gpointer zclglobal_control_request_data = NULL;
530 NOT_USED(request_data);
531 NOT_USED(request_data_len);
534 ops_id = __zblib_request_get_ops_id(request_type);
536 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_READ_ATTRIBUTES_REQ: {
540 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_WRITE_ATTRIBUTES_REQ: {
544 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_WRITE_ATTRIBUTES_UNDIVIDED_REQ: {
548 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_WRITE_ATTRIBUTES_NO_RESP: {
552 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_WRITE_ATTRIBUTES_STRUCTURED: {
556 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_READ_ATTRIBUTES_STRUCTURED: {
560 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_CONFIGURE_REPORTING_REQ: {
564 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_READ_CONFIGURE_REPORTING: {
568 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_DISCOVER_ATTRIBUTES: {
572 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_DISCOVER_ATTRIBUTES_EXTENDED: {
576 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_DISCOVER_COMMANDS_RECEIVED: {
580 case ZBLIB_ZCLGLOBAL_CONTROL_OPS_DISCOVER_COMMANDS_GENERATED: {
588 return zclglobal_control_request_data;
591 static gpointer __zblib_request_create_zclias_control_request_data(guint request_type,
592 gpointer request_data, guint request_data_len)
594 gpointer zclias_control_request_data = NULL;
597 NOT_USED(request_data);
598 NOT_USED(request_data_len);
601 ops_id = __zblib_request_get_ops_id(request_type);
603 case ZBLIB_ZCLIAS_CONTROL_OPS_ENROLL_RESPONSE: {
611 return zclias_control_request_data;
614 static gpointer __zblib_request_create_zclidentify_control_request_data(guint request_type,
615 gpointer request_data, guint request_data_len)
617 gpointer zclidentify_control_request_data = NULL;
620 NOT_USED(request_data);
621 NOT_USED(request_data_len);
624 ops_id = __zblib_request_get_ops_id(request_type);
626 case ZBLIB_ZCLIDENTIFY_CONTROL_OPS_IDENTIFY: {
630 case ZBLIB_ZCLIDENTIFY_CONTROL_OPS_QUERY: {
638 return zclidentify_control_request_data;
641 static gpointer __zblib_request_create_zcl_color_request_data(guint request_type,
642 gpointer request_data, guint request_data_len)
644 gpointer zcl_color_request_data = NULL;
647 NOT_USED(request_data);
648 NOT_USED(request_data_len);
651 ops_id = __zblib_request_get_ops_id(request_type);
653 case ZBLIB_ZCL_COLOR_OPS_MOVE_TO_HUE: {
657 case ZBLIB_ZCL_COLOR_OPS_MOVE_HUE: {
661 case ZBLIB_ZCL_COLOR_OPS_STEP_HUE: {
665 case ZBLIB_ZCL_COLOR_OPS_MOVE_TO_STAURATION: {
669 case ZBLIB_ZCL_COLOR_OPS_MOVE_STAURATION: {
673 case ZBLIB_ZCL_COLOR_OPS_STEP_STAURATION: {
677 case ZBLIB_ZCL_COLOR_OPS_MOVE_TO_HUE_AND_SATURATION: {
681 case ZBLIB_ZCL_COLOR_OPS_MOVE_TO_COLOR: {
685 case ZBLIB_ZCL_COLOR_OPS_MOVE_COLOR: {
689 case ZBLIB_ZCL_COLOR_OPS_STEP_COLOR: {
693 case ZBLIB_ZCL_COLOR_OPS_MOVE_COLOR_TEMPERATURE: {
701 return zcl_color_request_data;
704 static gpointer __zblib_request_create_zcl_group_request_data(guint request_type,
705 gpointer request_data, guint request_data_len)
707 gpointer zcl_group_request_data = NULL;
710 NOT_USED(request_data);
711 NOT_USED(request_data_len);
714 ops_id = __zblib_request_get_ops_id(request_type);
716 case ZBLIB_ZCL_GROUP_OPS_ADD_GROUP: {
720 case ZBLIB_ZCL_GROUP_OPS_VIEW_GROUP: {
724 case ZBLIB_ZCL_GROUP_OPS_GET_GROUP_MEMBERSHIP: {
728 case ZBLIB_ZCL_GROUP_OPS_REMOVE_GROUP: {
732 case ZBLIB_ZCL_GROUP_OPS_REMOVE_ALL_GROUP: {
736 case ZBLIB_ZCL_GROUP_OPS_ADD_GROUP_IF_IDENTIFYING: {
744 return zcl_group_request_data;
747 static gpointer __zblib_request_create_zcl_poll_control_request_data(guint request_type,
748 gpointer request_data, guint request_data_len)
750 gpointer zcl_poll_control_request_data = NULL;
753 NOT_USED(request_data);
754 NOT_USED(request_data_len);
757 ops_id = __zblib_request_get_ops_id(request_type);
759 case ZBLIB_ZCL_POLL_CONTROL_OPS_CHECK_IN_RESPONSE: {
763 case ZBLIB_ZCL_POLL_CONTROL_OPS_FAST_POLL_STOP: {
767 case ZBLIB_ZCL_POLL_CONTROL_OPS_SET_LONG_POLL_INTERVAL: {
771 case ZBLIB_ZCL_POLL_CONTROL_OPS_SET_SHORT_POLL_INTERVAL: {
779 return zcl_poll_control_request_data;
782 static gpointer __zblib_request_create_zcl_scene_request_data(guint request_type,
783 gpointer request_data, guint request_data_len)
785 gpointer zcl_scene_request_data = NULL;
788 NOT_USED(request_data);
789 NOT_USED(request_data_len);
792 ops_id = __zblib_request_get_ops_id(request_type);
794 case ZBLIB_ZCL_SCENE_OPS_ADD_SCENE: {
798 case ZBLIB_ZCL_SCENE_OPS_VIEW_SCENE: {
802 case ZBLIB_ZCL_SCENE_OPS_REMOVE_SCENE: {
806 case ZBLIB_ZCL_SCENE_OPS_STORE_SCENE: {
810 case ZBLIB_ZCL_SCENE_OPS_RECALL_SCENE: {
814 case ZBLIB_ZCL_SCENE_OPS_REMOVE_ALL_SCENE: {
818 case ZBLIB_ZCL_SCENE_OPS_GET_SCENE_MEMBERSHIP: {
826 return zcl_scene_request_data;
829 static gpointer __zblib_request_create_zdodev_control_request_data(guint request_type,
830 gpointer request_data, guint request_data_len)
832 gpointer zdodev_control_request_data = NULL;
835 NOT_USED(request_data);
836 NOT_USED(request_data_len);
839 ops_id = __zblib_request_get_ops_id(request_type);
841 case ZBLIB_ZDODEV_CONTROL_OPS_NWK_ADDR_REQ: {
845 case ZBLIB_ZDODEV_CONTROL_OPS_MATCHED_DESCRIPTOR_REQ: {
849 case ZBLIB_ZDODEV_CONTROL_OPS_IEEE_ADDR_REQ: {
853 case ZBLIB_ZDODEV_CONTROL_OPS_ACTIVE_EP_REQ: {
857 case ZBLIB_ZDODEV_CONTROL_OPS_NODE_DESC_REQ: {
861 case ZBLIB_ZDODEV_CONTROL_OPS_POWER_DESC_REQ: {
865 case ZBLIB_ZDODEV_CONTROL_OPS_COMPLEX_DESC_REQ: {
869 case ZBLIB_ZDODEV_CONTROL_OPS_USER_DESC_REQ: {
873 case ZBLIB_ZDODEV_CONTROL_OPS_USER_DESC_SET_REQ: {
877 case ZBLIB_ZDODEV_CONTROL_OPS_DEVICE_ANNOUNCE: {
881 case ZBLIB_ZDODEV_CONTROL_OPS_SIMPLE_DESC_REQ: {
885 case ZBLIB_ZDODEV_CONTROL_OPS_MGMT_LQI_REQ: {
889 case ZBLIB_ZDODEV_CONTROL_OPS_MGMT_RTG_REQ: {
893 case ZBLIB_ZDODEV_CONTROL_OPS_MGMT_BIND_REQ: {
897 case ZBLIB_ZDODEV_CONTROL_OPS_MGMT_PERMIT_JOIN_REQ: {
901 case ZBLIB_ZDODEV_CONTROL_OPS_NWK_UPDATE_REQ: {
905 case ZBLIB_ZDODEV_CONTROL_OPS_NWK_DISC_REQ: {
913 return zdodev_control_request_data;
916 static gpointer __zblib_request_create_zdo_bind_request_data(guint request_type,
917 gpointer request_data, guint request_data_len)
919 gpointer zdo_bind_request_data = NULL;
922 NOT_USED(request_data);
923 NOT_USED(request_data_len);
926 ops_id = __zblib_request_get_ops_id(request_type);
928 case ZBLIB_ZDO_BIND_OPS_BIND_REQ: {
932 case ZBLIB_ZDO_BIND_OPS_UNBIND_REQ: {
940 return zdo_bind_request_data;
943 static gpointer __zblib_request_create_request_data(guint request_type,
944 gpointer request_data, guint request_data_len)
946 gpointer _request_data = NULL;
947 ZblibDriverType_e driver_type;
949 /* Fetch driver type */
950 driver_type = __zblib_request_get_driver_type(request_type);
951 switch (driver_type) {
952 case ZBLIB_DRIVER_TYPE_ALARM: {
953 _request_data = __zblib_request_create_alarm_request_data(request_type,
954 request_data, request_data_len);
958 case ZBLIB_DRIVER_TYPE_CUSTOM: {
959 _request_data = __zblib_request_create_custom_request_data(request_type,
960 request_data, request_data_len);
964 case ZBLIB_DRIVER_TYPE_DOOR_LOCK: {
965 _request_data = __zblib_request_create_door_lock_request_data(request_type,
966 request_data, request_data_len);
970 case ZBLIB_DRIVER_TYPE_FAN_CONTROL: {
971 _request_data = __zblib_request_create_fan_control_request_data(request_type,
972 request_data, request_data_len);
976 case ZBLIB_DRIVER_TYPE_LEVEL_CONTROL: {
977 _request_data = __zblib_request_create_level_control_request_data(request_type,
978 request_data, request_data_len);
982 case ZBLIB_DRIVER_TYPE_MFGLIB_CONTROL: {
983 _request_data = __zblib_request_create_mfglib_control_request_data(request_type,
984 request_data, request_data_len);
988 case ZBLIB_DRIVER_TYPE_ON_OFF: {
989 _request_data = __zblib_request_create_on_off_request_data(request_type,
990 request_data, request_data_len);
993 case ZBLIB_DRIVER_TYPE_SERVICE: {
994 _request_data = __zblib_request_create_service_request_data(request_type,
995 request_data, request_data_len);
999 case ZBLIB_DRIVER_TYPE_THERMOSTAT: {
1000 _request_data = __zblib_request_create_thermostat_request_data(request_type,
1001 request_data, request_data_len);
1005 case ZBLIB_DRIVER_TYPE_ZCLBASIC_CONTROL: {
1006 _request_data = __zblib_request_create_zclbasic_control_request_data(request_type,
1007 request_data, request_data_len);
1011 case ZBLIB_DRIVER_TYPE_ZCLGLOBAL_CONTROL: {
1012 _request_data = __zblib_request_create_zclglobal_control_request_data(request_type,
1013 request_data, request_data_len);
1017 case ZBLIB_DRIVER_TYPE_ZCLIAS_CONTROL: {
1018 _request_data = __zblib_request_create_zclias_control_request_data(request_type,
1019 request_data, request_data_len);
1023 case ZBLIB_DRIVER_TYPE_ZCLIDENTIFY_CONTROL: {
1024 _request_data = __zblib_request_create_zclidentify_control_request_data(request_type,
1025 request_data, request_data_len);
1029 case ZBLIB_DRIVER_TYPE_ZCL_COLOR: {
1030 _request_data = __zblib_request_create_zcl_color_request_data(request_type,
1031 request_data, request_data_len);
1035 case ZBLIB_DRIVER_TYPE_ZCL_GROUP: {
1036 _request_data = __zblib_request_create_zcl_group_request_data(request_type,
1037 request_data, request_data_len);
1041 case ZBLIB_DRIVER_TYPE_ZCL_POLL_CONTROL: {
1042 _request_data = __zblib_request_create_zcl_poll_control_request_data(request_type,
1043 request_data, request_data_len);
1047 case ZBLIB_DRIVER_TYPE_ZCL_SCENE: {
1048 _request_data = __zblib_request_create_zcl_scene_request_data(request_type,
1049 request_data, request_data_len);
1053 case ZBLIB_DRIVER_TYPE_ZDODEV_CONTROL: {
1054 _request_data = __zblib_request_create_zdodev_control_request_data(request_type,
1055 request_data, request_data_len);
1059 case ZBLIB_DRIVER_TYPE_ZDO_BIND: {
1060 _request_data = __zblib_request_create_zdo_bind_request_data(request_type,
1061 request_data, request_data_len);
1065 case ZBLIB_DRIVER_TYPE_NONE: /* Fallthrough */
1067 Z_LOGE("Unhandled driver type: [%d]", driver_type);
1072 return _request_data;
1075 static void __zblib_request_free_request_data(gpointer request_data)
1077 if (NULL == request_data) {
1078 Z_LOGE("request_data is NULL");
1082 /* Free resources */
1083 g_free(request_data);
1086 gint zblib_request_new(ZigBeeServiceInterface *service_interface,
1087 guint request_type, gpointer request_data, guint request_data_len)
1089 ZigBeeService *service = NULL;
1090 ZigBeeRequest *request = NULL;
1091 GHashTable *request_table = NULL;
1093 if (NULL == service_interface) {
1094 Z_LOGE("service_interface is NULL");
1095 return ZIGBEE_REQUEST_INVALID_REQUEST_ID;
1098 service = zblib_service_interface_ref_service(service_interface);
1099 if (NULL == service) {
1100 Z_LOGE("service is NULL");
1101 return ZIGBEE_REQUEST_INVALID_REQUEST_ID;
1104 /* Allocate ZigBee request memory */
1105 request = g_malloc0(sizeof(ZigBeeRequest));
1107 /* Update request */
1108 request->service_interface = service_interface;
1109 request->ref_count = 1; /* Initialize reference count to '1' for new request */
1111 /* Update request data for specific request */
1112 request->request_data = __zblib_request_create_request_data(request_type,
1113 request_data, request_data_len);
1114 request->request_type = request_type;
1116 /* Generate request ID */
1117 request->request_id = zblib_service_generate_request_id(service);
1118 if (ZIGBEE_REQUEST_INVALID_REQUEST_ID == request->request_id) {
1119 Z_LOGE("zblib_service_genrate_request_id failed!");
1121 /* Free resources */
1124 return ZIGBEE_REQUEST_INVALID_REQUEST_ID;
1127 /* Fetch request table from service */
1128 request_table = zblib_service_ref_request_hash_table(service);
1129 if (NULL == request_table) {
1130 Z_LOGE("zblib_service_ref_request_hash_table failed!");
1132 /* Free resources */
1135 return ZIGBEE_REQUEST_INVALID_REQUEST_ID;
1138 /* Insert request to request table */
1139 g_hash_table_insert(request_table, (gpointer)(request->request_id), request);
1141 return request->request_id;
1144 void zblib_request_free(ZigBeeRequest *request)
1146 if (NULL == request) {
1147 Z_LOGE("request is NULL");
1151 /* Free resources */
1152 __zblib_request_free_request_data(request->request_data);
1156 ZigBeeRequest *zblib_request_ref(ZigBeeRequest *request)
1158 if (NULL == request) {
1159 Z_LOGE("request is NULL");
1163 request->ref_count++;
1168 void zblib_request_unref(ZigBeeRequest *request)
1170 if (NULL == request) {
1171 Z_LOGE("request is NULL");
1175 request->ref_count--;
1176 if (0 == request->ref_count) {
1177 Z_LOGD("Reference count is ZERO!");
1179 /* Free 'request' */
1180 zblib_request_free(request);
1184 guint zblib_request_ref_request_type(ZigBeeRequest *request)
1186 if (NULL == request) {
1187 Z_LOGE("request is NULL");
1191 return request->request_type;
1194 ZigBeeServiceInterface *zblib_request_ref_service_interface(ZigBeeRequest *request)
1196 if (NULL == request) {
1197 Z_LOGE("request is NULL");
1201 return request->service_interface;
1204 gpointer zblib_request_ref_request_data(ZigBeeRequest *request)
1206 if (NULL == request) {
1207 Z_LOGE("request is NULL");
1211 return request->request_data;
1214 guint zblib_request_generate_request_type(ZblibDriverType_e driver_type,
1220 * request_type consists of driver_type and ops_id
1221 * request_type = driver_type | 0x00 | 0x00 | ops_id
1223 request_type = (driver_type << 24) | (ops_id);
1225 return request_type;
1228 gint zblib_request_ref_request_type_by_request_id(ZigBeeService *service,
1231 ZigBeeRequest *request = NULL;
1232 GHashTable *request_table = NULL;
1234 /* Fetch request table from service */
1235 request_table = zblib_service_ref_request_hash_table(service);
1236 if (NULL == request_table) {
1237 Z_LOGE("zblib_service_ref_request_hash_table failed!");
1241 /* Look-up requets_id in request hash table */
1242 request = (ZigBeeRequest *)g_hash_table_lookup(request_table, (gconstpointer)request_id);
1243 if (NULL == request_table) {
1244 Z_LOGE("No request availabel for request_id: [%d]", request_id);
1248 return (gint)(request->request_type);
1251 ZblibDriverType_e zblib_request_get_driver_type(guint request_type)
1253 return __zblib_request_get_driver_type(request_type);
1256 guint zblib_request_get_ops_id(guint request_type)
1258 return __zblib_request_get_ops_id(request_type);