Implement ZCL Basic Cluster
authorsaerome kim <saerome.kim@samsung.com>
Wed, 1 Feb 2017 04:51:12 +0000 (13:51 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Thu, 11 May 2017 09:10:25 +0000 (18:10 +0900)
Problem : ZCL Basic cluster is not implemented
Cause : ZCL Basic cluster is not implemented
Solution : Implemented ZCL Basic cluster in daemon

Change-Id: I041c45b76c58531f78450e58f7f3bd319f4a891b
Signed-off-by: saerome kim <saerome.kim@samsung.com>
common/include/zigbee_zcl_basic_type.h
zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_zcl_basic.c
zigbee-daemon/zigbee-lib/src/drivers/zblib_driver_zcl_basic.c

index 1100545..f2cdf07 100644 (file)
 
 #include <zigbee_types.h>
 
+/* --------------------------------------------------------------------------------------
+ * For Request
+ * -------------------------------------------------------------------------------------*/
+
 /**
  * @brief Definition for ZCL Basic reset factory default structure.
  * @since_tizen 3.0
index 25c8998..fdb7332 100644 (file)
 
 #include <zblib_driver_zcl_basic.h>
 
+static void *_service_interface_ref_zigbee_zcl_basic(ZigBeeServiceInterface *service_interface)
+{
+       ZigbeeObjectSkeleton *zigbee_object = NULL;
+       ZigbeeCustomData_t *custom_data = NULL;
+       ZigbeeZcl_basic *basic_object = NULL;
+
+       custom_data = (ZigbeeCustomData_t *)zblib_service_interface_ref_user_data(service_interface);
+       if (NULL == custom_data) {
+               Z_LOGE("D-BUS service interface custom_data is NULL!");
+               return NULL;
+       }
+
+       /* Get zigbee object */
+       zigbee_object = g_hash_table_lookup(custom_data->objects, ZIGBEE_SERVICE_PATH);
+       if (NULL == zigbee_object) {
+               Z_LOGW("Cannot find ZigBee D-BUS interface object!", zigbee_object);
+               return NULL;
+       }
+
+       basic_object = zigbee_object_get_zcl_basic(ZIGBEE_OBJECT(zigbee_object));
+       return basic_object;
+}
+
 static void on_zclbasic_control_reset_factory_default_resp(ZigBeeServiceInterface *service_interface,
        guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
 {
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZcl_basic *zcl_basic_object = NULL;
+       GDBusMethodInvocation *invocation = NULL;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t *)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data is null");
+               g_free(cb_data);
+               return;
+       }
+
+       zcl_basic_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("zcl_basic_object", zcl_basic_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zcl_basic_complete_reset_factory_default(zcl_basic_object, invocation,
+               payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zclbasic_control_reset_factory_default(ZigbeeZcl_basic *zclbasic_control_object,
@@ -88,15 +130,28 @@ static gboolean on_zclbasic_control_reset_factory_default(ZigbeeZcl_basic *zclba
 void zigbee_service_dbus_interface_zcl_basic_notification(ZigBeeServiceInterface *service_interface,
        guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data)
 {
-       if (NULL == service_interface) {
-               Z_LOGE("service_interface is NULL");
+       ZigbeeZcl_basic *basic_object;
+
+       zblib_check_null_ret("service_interface", service_interface);
+
+       if (NULL == noti_data || 0 == noti_data_len) {
+               Z_LOGE("noti_data is NULL");
                return;
        }
 
-       NOT_USED(noti_id);
-       NOT_USED(noti_data);
-       NOT_USED(noti_data_len);
+       basic_object = _service_interface_ref_zigbee_zcl_basic(service_interface);
+       zblib_check_null_ret("basic_object", basic_object);
+
        NOT_USED(noti_cb_data);
+
+       switch(noti_id) {
+       default:
+               Z_LOGE("Unexpected notification [%x]", noti_id);
+       break;
+       }
+
+       /* ZigbeeZcl_basic should be dereferenced */
+       g_object_unref(basic_object);
 }
 
 gboolean zigbee_service_dbus_interface_zcl_basic_init(ZigBeeServiceInterface *service_interface,
index c6822ea..1870773 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <zblib.h>
 #include <zblib_driver.h>
+#include <zblib_plugin.h>
 #include <zblib_request.h>
 
 #include "zblib_driver_zcl_basic.h"
@@ -89,6 +90,7 @@ ZigBeeDriver *zblib_driver_zcl_basic_new(ZigBeePlugin *plugin,
        const gchar *driver_name,
        ZblibDriverZclBasicOps_t *ops)
 {
+       ZigBeeService *service = NULL;
        ZigBeeDriver *driver = NULL;
        ZblibDriverZclBasicPrivData_t *priv_data = NULL;
        gboolean ret;
@@ -105,6 +107,19 @@ ZigBeeDriver *zblib_driver_zcl_basic_new(ZigBeePlugin *plugin,
        /* Update private data */
        priv_data->ops = ops;
 
+       /* Link service to driver */
+       service = zblib_plugin_ref_service(plugin);
+       if (NULL == service) {
+               Z_LOGE("zblib_plugin_ref_service failed!");
+
+               /* Free allocated resources */
+               g_free(priv_data);
+               g_free(driver);
+
+               return NULL;
+       }
+       zblib_driver_link_service(driver, service);
+
        /* Link private data to driver */
        ret = zblib_driver_link_object(driver, priv_data);
        if (FALSE == ret) {