+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Suresh Kumar N (suresh.n@samsung.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <zblib.h>
+#include <zblib_request.h>
+#include <zblib_service.h>
+#include <zblib_service_interface.h>
+
+#include <zblib_driver.h>
+#include <zblib_driver_alarm.h>
+#include <zblib_driver_custom.h>
+#include <zblib_driver_door_lock.h>
+#include <zblib_driver_fan_control.h>
+#include <zblib_driver_level_control.h>
+#include <zblib_driver_mfglib_control.h>
+#include <zblib_driver_on_off.h>
+#include <zblib_driver_service.h>
+#include <zblib_driver_thermostat.h>
+#include <zblib_driver_zclbasic_control.h>
+#include <zblib_driver_zclglobal_control.h>
+#include <zblib_driver_zclias_control.h>
+#include <zblib_driver_zclidentify_control.h>
+#include <zblib_driver_zcl_color.h>
+#include <zblib_driver_zcl_group.h>
+#include <zblib_driver_zcl_poll_control.h>
+#include <zblib_driver_zcl_scene.h>
+#include <zblib_driver_zdodev_control.h>
+#include <zblib_driver_zdo_bind.h>
+
+/**< ZigBee Request object */
+struct zblib_request_type {
+ gint request_id; /**< Request ID */
+ guint request_type; /**< Request type */
+ guint ref_count; /* Reference count */
+
+ gpointer request_data; /**< Request data */
+
+ ZigBeeServiceInterface *service_interface; /* Service interface */
+};
+
+static ZblibDriverType_e __zblib_request_get_driver_type(guint request_type)
+{
+ ZblibDriverType_e driver_type;
+
+ driver_type = ((request_type && 0xFF000000) >> 24);
+
+ return driver_type;
+}
+
+static ZblibDriverType_e __zblib_request_get_ops_id(guint request_type)
+{
+ guint ops_id;
+
+ ops_id = (request_type && 0x000000FF);
+
+ return ops_id;
+}
+
+static gpointer __zblib_request_create_alarm_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer alarm_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ALARM_OPS_GET_ALARM_COUNT: {
+ }
+ break;
+
+ case ZBLIB_ALARM_OPS_RESET_ALARM: {
+ }
+ break;
+
+ case ZBLIB_ALARM_OPS_RESET_ALL_ALARM: {
+ }
+ break;
+
+ case ZBLIB_ALARM_OPS_ALARM: {
+ }
+ break;
+
+ case ZBLIB_ALARM_OPS_RESET_ALARM_LOG: {
+ }
+ break;
+
+ case ZBLIB_ALARM_OPS_GET_ALARM: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return alarm_request_data;
+}
+
+static gpointer __zblib_request_create_custom_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer custom_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_CUSTOM_OPS_APS_SEND: {
+ }
+ break;
+
+ case ZBLIB_CUSTOM_OPS_ZCL_SEND: {
+ }
+ break;
+
+ case ZBLIB_CUSTOM_OPS_SEND_TO_LOCAL: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return custom_request_data;
+}
+
+static gpointer __zblib_request_create_door_lock_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer door_lock_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_DOOR_LOCK_OPS_SUBSCRIBE_LOCK_EVENT: {
+ }
+ break;
+
+ case ZBLIB_DOOR_LOCK_OPS_SET_DOOR_LOCK_PIN: {
+ }
+ break;
+
+ case ZBLIB_DOOR_LOCK_OPS_SET_DOOR_LOCK: {
+ }
+ break;
+
+ case ZBLIB_DOOR_LOCK_OPS_GET_LOCK_STATE: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return door_lock_request_data;
+}
+
+static gpointer __zblib_request_create_fan_control_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer fan_control_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_FAN_CONTROL_OPS_SET_FAN_MODE: {
+ }
+ break;
+
+ case ZBLIB_FAN_CONTROL_OPS_GET_FAN_MODE: {
+ }
+ break;
+
+ case ZBLIB_FAN_CONTROL_OPS_SET_FAN_MODE_SEQUENCE: {
+ }
+ break;
+
+ case ZBLIB_FAN_CONTROL_OPS_GET_FAN_MODE_SEQUENCE: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return fan_control_request_data;
+}
+
+static gpointer __zblib_request_create_level_control_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer level_control_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_LEVEL_CONTROL_OPS_MOVE_TO_LEVEL: {
+ }
+ break;
+
+ case ZBLIB_LEVEL_CONTROL_OPS_MOVE: {
+ }
+ break;
+
+ case ZBLIB_LEVEL_CONTROL_OPS_STEP: {
+ }
+ break;
+
+ case ZBLIB_LEVEL_CONTROL_OPS_MOVE_TO_LEVEL_WITH_ON_OFF: {
+ }
+ break;
+
+ case ZBLIB_LEVEL_CONTROL_OPS_MOVE_WITH_ON_OFF: {
+ }
+ break;
+
+ case ZBLIB_LEVEL_CONTROL_OPS_STEP_WITH_ON_OFF: {
+ }
+ break;
+
+ case ZBLIB_LEVEL_CONTROL_OPS_STOP: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return level_control_request_data;
+}
+
+static gpointer __zblib_request_create_mfglib_control_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer mfglib_control_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_MFGLIB_CONTROL_OPS_START: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_END: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_START_TONE: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_STOP_TONE: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_START_STREAM: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_STOP_STREAM: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_SEND_PACKET: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_SET_CHANNEL: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_GET_CHANNEL: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_SET_POWER: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_GET_POWER: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_SET_SYNOFFSET: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_GET_SYNOFFSET: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_RX_START: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_RX_STOP: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_RX_VERIFY: {
+ }
+ break;
+
+ case ZBLIB_MFGLIB_CONTROL_OPS_GET_RSSI: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return mfglib_control_request_data;
+}
+
+static gpointer __zblib_request_create_on_off_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer on_off_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ON_OFF_OPS_SET_ON_OFF: {
+ }
+ break;
+
+ case ZBLIB_ON_OFF_OPS_GET_ON_OFF_STATE: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return on_off_request_data;
+}
+
+static gpointer __zblib_request_create_service_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer service_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_SERVICE_OPS_ENABLE: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_DISABLE: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_ZB_HW_RESET: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_FORM_NETWORK: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_COEX_START: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_COEX_STOP: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_LEAVE_NETWORK: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_GET_NETWORK_INFO: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_PERMIT_JOIN: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_LEAVE_REQUEST: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_GET_DEVICE_LIST: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_GET_MAC: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_GET_DEVICE_INFO: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_GET_ENDPOINT_LIST: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_GET_CLUSTER_LIST: {
+ }
+ break;
+
+ case ZBLIB_SERVICE_OPS_GET_NODE_TYPE: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return service_request_data;
+}
+
+static gpointer __zblib_request_create_thermostat_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer thermostat_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_THERMOSTAT_OPS_GET_LOCAL_TEMP: {
+ }
+ break;
+
+ case ZBLIB_THERMOSTAT_OPS_GET_WEEKLY_SCHEDULE: {
+ }
+ break;
+
+ case ZBLIB_THERMOSTAT_OPS_SET_WEEKLY_SCHEDULE: {
+ }
+ break;
+
+ case ZBLIB_THERMOSTAT_OPS_CLEAR_WEEKLY_SCHEDULE: {
+ }
+ break;
+
+ case ZBLIB_THERMOSTAT_OPS_SETPOINT_RAISE_LOWER: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return thermostat_request_data;
+}
+
+static gpointer __zblib_request_create_zclbasic_control_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer zclbasic_control_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ZCLBASIC_CONTROL_OPS_RESET_FACTORY_DEFAULT: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return zclbasic_control_request_data;
+}
+
+static gpointer __zblib_request_create_zclglobal_control_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer zclglobal_control_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_READ_ATTRIBUTES_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_WRITE_ATTRIBUTES_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_WRITE_ATTRIBUTES_UNDIVIDED_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_WRITE_ATTRIBUTES_NO_RESP: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_WRITE_ATTRIBUTES_STRUCTURED: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_READ_ATTRIBUTES_STRUCTURED: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_CONFIGURE_REPORTING_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_READ_CONFIGURE_REPORTING: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_DISCOVER_ATTRIBUTES: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_DISCOVER_ATTRIBUTES_EXTENDED: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_DISCOVER_COMMANDS_RECEIVED: {
+ }
+ break;
+
+ case ZBLIB_ZCLGLOBAL_CONTROL_OPS_DISCOVER_COMMANDS_GENERATED: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return zclglobal_control_request_data;
+}
+
+static gpointer __zblib_request_create_zclias_control_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer zclias_control_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ZCLIAS_CONTROL_OPS_ENROLL_RESPONSE: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return zclias_control_request_data;
+}
+
+static gpointer __zblib_request_create_zclidentify_control_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer zclidentify_control_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ZCLIDENTIFY_CONTROL_OPS_IDENTIFY: {
+ }
+ break;
+
+ case ZBLIB_ZCLIDENTIFY_CONTROL_OPS_QUERY: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return zclidentify_control_request_data;
+}
+
+static gpointer __zblib_request_create_zcl_color_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer zcl_color_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ZCL_COLOR_OPS_MOVE_TO_HUE: {
+ }
+ break;
+
+ case ZBLIB_ZCL_COLOR_OPS_MOVE_HUE: {
+ }
+ break;
+
+ case ZBLIB_ZCL_COLOR_OPS_STEP_HUE: {
+ }
+ break;
+
+ case ZBLIB_ZCL_COLOR_OPS_MOVE_TO_STAURATION: {
+ }
+ break;
+
+ case ZBLIB_ZCL_COLOR_OPS_MOVE_STAURATION: {
+ }
+ break;
+
+ case ZBLIB_ZCL_COLOR_OPS_STEP_STAURATION: {
+ }
+ break;
+
+ case ZBLIB_ZCL_COLOR_OPS_MOVE_TO_HUE_AND_SATURATION: {
+ }
+ break;
+
+ case ZBLIB_ZCL_COLOR_OPS_MOVE_TO_COLOR: {
+ }
+ break;
+
+ case ZBLIB_ZCL_COLOR_OPS_MOVE_COLOR: {
+ }
+ break;
+
+ case ZBLIB_ZCL_COLOR_OPS_STEP_COLOR: {
+ }
+ break;
+
+ case ZBLIB_ZCL_COLOR_OPS_MOVE_COLOR_TEMPERATURE: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return zcl_color_request_data;
+}
+
+static gpointer __zblib_request_create_zcl_group_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer zcl_group_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ZCL_GROUP_OPS_ADD_GROUP: {
+ }
+ break;
+
+ case ZBLIB_ZCL_GROUP_OPS_VIEW_GROUP: {
+ }
+ break;
+
+ case ZBLIB_ZCL_GROUP_OPS_GET_GROUP_MEMBERSHIP: {
+ }
+ break;
+
+ case ZBLIB_ZCL_GROUP_OPS_REMOVE_GROUP: {
+ }
+ break;
+
+ case ZBLIB_ZCL_GROUP_OPS_REMOVE_ALL_GROUP: {
+ }
+ break;
+
+ case ZBLIB_ZCL_GROUP_OPS_ADD_GROUP_IF_IDENTIFYING: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return zcl_group_request_data;
+}
+
+static gpointer __zblib_request_create_zcl_poll_control_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer zcl_poll_control_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ZCL_POLL_CONTROL_OPS_CHECK_IN_RESPONSE: {
+ }
+ break;
+
+ case ZBLIB_ZCL_POLL_CONTROL_OPS_FAST_POLL_STOP: {
+ }
+ break;
+
+ case ZBLIB_ZCL_POLL_CONTROL_OPS_SET_LONG_POLL_INTERVAL: {
+ }
+ break;
+
+ case ZBLIB_ZCL_POLL_CONTROL_OPS_SET_SHORT_POLL_INTERVAL: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return zcl_poll_control_request_data;
+}
+
+static gpointer __zblib_request_create_zcl_scene_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer zcl_scene_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ZCL_SCENE_OPS_ADD_SCENE: {
+ }
+ break;
+
+ case ZBLIB_ZCL_SCENE_OPS_VIEW_SCENE: {
+ }
+ break;
+
+ case ZBLIB_ZCL_SCENE_OPS_REMOVE_SCENE: {
+ }
+ break;
+
+ case ZBLIB_ZCL_SCENE_OPS_STORE_SCENE: {
+ }
+ break;
+
+ case ZBLIB_ZCL_SCENE_OPS_RECALL_SCENE: {
+ }
+ break;
+
+ case ZBLIB_ZCL_SCENE_OPS_REMOVE_ALL_SCENE: {
+ }
+ break;
+
+ case ZBLIB_ZCL_SCENE_OPS_GET_SCENE_MEMBERSHIP: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return zcl_scene_request_data;
+}
+
+static gpointer __zblib_request_create_zdodev_control_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer zdodev_control_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ZDODEV_CONTROL_OPS_NWK_ADDR_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_MATCHED_DESCRIPTOR_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_IEEE_ADDR_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_ACTIVE_EP_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_NODE_DESC_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_POWER_DESC_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_COMPLEX_DESC_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_USER_DESC_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_USER_DESC_SET_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_DEVICE_ANNOUNCE: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_SIMPLE_DESC_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_MGMT_LQI_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_MGMT_RTG_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_MGMT_BIND_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_MGMT_PERMIT_JOIN_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_NWK_UPDATE_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDODEV_CONTROL_OPS_NWK_DISC_REQ: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return zdodev_control_request_data;
+}
+
+static gpointer __zblib_request_create_zdo_bind_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer zdo_bind_request_data = NULL;
+ guint ops_id;
+
+ NOT_USED(request_data);
+ NOT_USED(request_data_len);
+
+ /* Fetch ops ID */
+ ops_id = __zblib_request_get_ops_id(request_type);
+ switch (ops_id) {
+ case ZBLIB_ZDO_BIND_OPS_BIND_REQ: {
+ }
+ break;
+
+ case ZBLIB_ZDO_BIND_OPS_UNBIND_REQ: {
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return zdo_bind_request_data;
+}
+
+static gpointer __zblib_request_create_request_data(guint request_type,
+ gpointer request_data, guint request_data_len)
+{
+ gpointer _request_data = NULL;
+ ZblibDriverType_e driver_type;
+
+ /* Fetch driver type */
+ driver_type = __zblib_request_get_driver_type(request_type);
+ switch (driver_type) {
+ case ZBLIB_DRIVER_TYPE_ALARM: {
+ _request_data = __zblib_request_create_alarm_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_CUSTOM: {
+ _request_data = __zblib_request_create_custom_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_DOOR_LOCK: {
+ _request_data = __zblib_request_create_door_lock_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_FAN_CONTROL: {
+ _request_data = __zblib_request_create_fan_control_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_LEVEL_CONTROL: {
+ _request_data = __zblib_request_create_level_control_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_MFGLIB_CONTROL: {
+ _request_data = __zblib_request_create_mfglib_control_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ON_OFF: {
+ _request_data = __zblib_request_create_on_off_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+ case ZBLIB_DRIVER_TYPE_SERVICE: {
+ _request_data = __zblib_request_create_service_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_THERMOSTAT: {
+ _request_data = __zblib_request_create_thermostat_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ZCLBASIC_CONTROL: {
+ _request_data = __zblib_request_create_zclbasic_control_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ZCLGLOBAL_CONTROL: {
+ _request_data = __zblib_request_create_zclglobal_control_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ZCLIAS_CONTROL: {
+ _request_data = __zblib_request_create_zclias_control_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ZCLIDENTIFY_CONTROL: {
+ _request_data = __zblib_request_create_zclidentify_control_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ZCL_COLOR: {
+ _request_data = __zblib_request_create_zcl_color_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ZCL_GROUP: {
+ _request_data = __zblib_request_create_zcl_group_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ZCL_POLL_CONTROL: {
+ _request_data = __zblib_request_create_zcl_poll_control_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ZCL_SCENE: {
+ _request_data = __zblib_request_create_zcl_scene_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ZDODEV_CONTROL: {
+ _request_data = __zblib_request_create_zdodev_control_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_ZDO_BIND: {
+ _request_data = __zblib_request_create_zdo_bind_request_data(request_type,
+ request_data, request_data_len);
+ }
+ break;
+
+ case ZBLIB_DRIVER_TYPE_NONE: /* Fallthrough */
+ default: {
+ Z_LOGE("Unhandled driver type: [%d]", driver_type);
+ }
+ break;
+ }
+
+ return _request_data;
+}
+
+static void __zblib_request_free_request_data(gpointer request_data)
+{
+ if (NULL == request_data) {
+ Z_LOGE("request_data is NULL");
+ return;
+ }
+
+ /* Free resources */
+ g_free(request_data);
+}
+
+gint zblib_request_new(ZigBeeServiceInterface *service_interface,
+ guint request_type, gpointer request_data, guint request_data_len)
+{
+ ZigBeeService *service = NULL;
+ ZigBeeRequest *request = NULL;
+ GHashTable *request_table = NULL;
+
+ if (NULL == service_interface) {
+ Z_LOGE("service_interface is NULL");
+ return ZIGBEE_REQUEST_INVALID_REQUEST_ID;
+ }
+
+ service = zblib_service_interface_ref_service(service_interface);
+ if (NULL == service) {
+ Z_LOGE("service is NULL");
+ return ZIGBEE_REQUEST_INVALID_REQUEST_ID;
+ }
+
+ /* Allocate ZigBee request memory */
+ request = g_malloc0(sizeof(ZigBeeRequest));
+
+ /* Update request */
+ request->service_interface = service_interface;
+ request->ref_count = 1; /* Initialize reference count to '1' for new request */
+
+ /* Update request data for specific request */
+ request->request_data = __zblib_request_create_request_data(request_type,
+ request_data, request_data_len);
+ request->request_type = request_type;
+
+ /* Generate request ID */
+ request->request_id = zblib_service_generate_request_id(service);
+ if (ZIGBEE_REQUEST_INVALID_REQUEST_ID == request->request_id) {
+ Z_LOGE("zblib_service_genrate_request_id failed!");
+
+ /* Free resources */
+ g_free(request);
+
+ return ZIGBEE_REQUEST_INVALID_REQUEST_ID;
+ }
+
+ /* Fetch request table from service */
+ request_table = zblib_service_ref_request_hash_table(service);
+ if (NULL == request_table) {
+ Z_LOGE("zblib_service_ref_request_hash_table failed!");
+
+ /* Free resources */
+ g_free(request);
+
+ return ZIGBEE_REQUEST_INVALID_REQUEST_ID;
+ }
+
+ /* Insert request to request table */
+ g_hash_table_insert(request_table, (gpointer)(request->request_id), request);
+
+ return request->request_id;
+}
+
+void zblib_request_free(ZigBeeRequest *request)
+{
+ if (NULL == request) {
+ Z_LOGE("request is NULL");
+ return;
+ }
+
+ /* Free resources */
+ __zblib_request_free_request_data(request->request_data);
+ g_free(request);
+}
+
+ZigBeeRequest *zblib_request_ref(ZigBeeRequest *request)
+{
+ if (NULL == request) {
+ Z_LOGE("request is NULL");
+ return request;
+ }
+
+ request->ref_count++;
+
+ return request;
+}
+
+void zblib_request_unref(ZigBeeRequest *request)
+{
+ if (NULL == request) {
+ Z_LOGE("request is NULL");
+ return;
+ }
+
+ request->ref_count--;
+ if (0 == request->ref_count) {
+ Z_LOGD("Reference count is ZERO!");
+
+ /* Free 'request' */
+ zblib_request_free(request);
+ }
+}
+
+guint zblib_request_ref_request_type(ZigBeeRequest *request)
+{
+ if (NULL == request) {
+ Z_LOGE("request is NULL");
+ return 0;
+ }
+
+ return request->request_type;
+}
+
+ZigBeeServiceInterface *zblib_request_ref_service_interface(ZigBeeRequest *request)
+{
+ if (NULL == request) {
+ Z_LOGE("request is NULL");
+ return NULL;
+ }
+
+ return request->service_interface;
+}
+
+gpointer zblib_request_ref_request_data(ZigBeeRequest *request)
+{
+ if (NULL == request) {
+ Z_LOGE("request is NULL");
+ return NULL;
+ }
+
+ return request->request_data;
+}
+
+guint zblib_request_generate_request_type(ZblibDriverType_e driver_type,
+ guint ops_id)
+{
+ guint request_type;
+
+ /*
+ * request_type consists of driver_type and ops_id
+ * request_type = driver_type | 0x00 | 0x00 | ops_id
+ */
+ request_type = (driver_type << 24) | (ops_id);
+
+ return request_type;
+}
+
+gint zblib_request_ref_request_type_by_request_id(ZigBeeService *service,
+ guint request_id)
+{
+ ZigBeeRequest *request = NULL;
+ GHashTable *request_table = NULL;
+
+ /* Fetch request table from service */
+ request_table = zblib_service_ref_request_hash_table(service);
+ if (NULL == request_table) {
+ Z_LOGE("zblib_service_ref_request_hash_table failed!");
+ return -1;
+ }
+
+ /* Look-up requets_id in request hash table */
+ request = (ZigBeeRequest *)g_hash_table_lookup(request_table, (gconstpointer)request_id);
+ if (NULL == request_table) {
+ Z_LOGE("No request availabel for request_id: [%d]", request_id);
+ return -1;
+ }
+
+ return (gint)(request->request_type);
+}
+
+ZblibDriverType_e zblib_request_get_driver_type(guint request_type)
+{
+ return __zblib_request_get_driver_type(request_type);
+}
+
+guint zblib_request_get_ops_id(guint request_type)
+{
+ return __zblib_request_get_ops_id(request_type);
+}