Fix custom cluster to meet zigbee-daemon GDbus interface
authorsaerome.kim <saerome.kim@samsung.com>
Mon, 6 Feb 2017 23:11:04 +0000 (08:11 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Thu, 11 May 2017 09:07:20 +0000 (18:07 +0900)
Change-Id: Ic91dfbdb07e72f0638c965b739cbc54eb635cf0d
Signed-off-by: saerome.kim <saerome.kim@samsung.com>
include/zb-custom.h
lib/zbl-custom.c
lib/zbl-dbus.c
lib/zbl-dbus.h
test/custom.c

index 3e68b0a..4c55064 100644 (file)
@@ -136,6 +136,7 @@ typedef void (*zb_send_to_local_rsp)(
  *            #ZB_ZCL_LEAVE_WELL_ALONE (default) \n
  *            #ZB_ZCL_DISABLE_DEFAULT_RESPONSE
  * @param[in] mfg_code Manufacturer Code
+ * @param[in] cmd_id Command ID
  * @param[in] payload_len Length of payload
  * @param[in] payload Payload data
  * @param[in] cb Callback function to get response.
@@ -158,6 +159,7 @@ int zb_aps_send(
                unsigned short profile_id,
                unsigned char zcl_frame_ctl,
                unsigned short mfg_code,
+               unsigned char cmd_id,
                unsigned short payload_len,
                unsigned char *payload,
                zb_aps_send_rsp cb,
index 4f9598e..20e130e 100644 (file)
 #include "zbl-dbus.h"
 #include "zigbee.h"
 
-API int zb_aps_send(zigbee_h handle, nwk_addr addr16,
-               unsigned char aps_frame_ctl, unsigned char src_ep, unsigned char dst_ep,
-               unsigned short cluster_id, unsigned short profile_id,
-               unsigned char zcl_frame_ctl, unsigned short mfg_code,
-               unsigned short payload_len, unsigned char *payload,
+API int zb_aps_send(zigbee_h handle, nwk_addr addr16, unsigned char aps_frame_ctl,
+               unsigned char src_ep, unsigned char dst_ep, unsigned short cluster_id,
+               unsigned short profile_id, unsigned char zcl_frame_ctl, unsigned short mfg_code,
+               unsigned char cmd_id, unsigned short payload_len, unsigned char *payload,
                zb_aps_send_rsp cb, void *user_data)
 {
        int ret = ZIGBEE_ERROR_NONE;
        RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
 
-       ret = zbl_aps_send(addr16, aps_frame_ctl, src_ep, dst_ep,
-                               cluster_id, profile_id, zcl_frame_ctl, mfg_code,
-                               payload_len, payload, cb, user_data);
+       ret = zbl_aps_send(addr16, aps_frame_ctl, src_ep, dst_ep, cluster_id, profile_id,
+               zcl_frame_ctl, mfg_code, cmd_id, payload_len, payload, cb, user_data);
        DBG("zbl_aps_send()=0x%X", ret);
        return ret;
 }
 
-API int zb_zcl_send(zigbee_h handle, nwk_addr addr16,
-               unsigned char src_ep, unsigned char dst_ep,
-               unsigned short cluster_id, unsigned char zcl_frame_ctl, unsigned char cmd,
-               unsigned short payload_len, unsigned char *payload,
+API int zb_zcl_send(zigbee_h handle, nwk_addr addr16, unsigned char src_ep,
+               unsigned char dst_ep, unsigned short cluster_id, unsigned char zcl_frame_ctl,
+               unsigned char cmd, unsigned short payload_len, unsigned char *payload,
                zb_zcl_send_rsp cb, void *user_data)
 {
        int ret = ZIGBEE_ERROR_NONE;
index 10b91ac..87976ff 100644 (file)
@@ -2012,20 +2012,21 @@ MGMT_NWK_DISC_REQ_OUT:
                unsigned short addr16;
                unsigned char src_ep;
                unsigned char dst_ep;
-               unsigned char cluster_id;
-               unsigned char profile_id;
-               unsigned char *payload = NULL;
+               unsigned short cluster_id;
+               unsigned short profile_id;
                unsigned short payload_len = 0;
+               unsigned char *payload = NULL;
+
                unsigned char value;
                GVariantIter *payload_iter = NULL;
                int i = 0;
 
-               g_variant_get(parameters, "(qyyqqayq)", &addr16, &src_ep, &dst_ep,
-                               &cluster_id, &profile_id, &payload_iter, &payload_len);
+               g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep,
+                               &cluster_id, &profile_id, &payload_len, &payload_iter);
 
                if (payload_len > 0) {
-                       payload = calloc(payload_len, sizeof(unsigned char));
-                       while (g_variant_iter_loop(payload_iter, "y", &value)) {
+                       payload = calloc(payload_len+1, sizeof(unsigned char));
+                       while (g_variant_iter_loop(payload_iter, "(y)", &value)) {
                                payload[i++] = value;
                        }
                        if (NULL != payload_iter)
@@ -2044,20 +2045,21 @@ MGMT_NWK_DISC_REQ_OUT:
                unsigned short addr16;
                unsigned char src_ep;
                unsigned char dst_ep;
-               unsigned char cluster_id;
-               unsigned char profile_id;
-               unsigned char *payload = NULL;
+               unsigned short cluster_id;
+               unsigned short profile_id;
                unsigned short payload_len = 0;
+               unsigned char *payload = NULL;
+
                unsigned char value;
                GVariantIter *payload_iter = NULL;
                int i = 0;
 
-               g_variant_get(parameters, "(qyyqqayq)", &addr16, &src_ep, &dst_ep,
-                               &cluster_id, &profile_id, &payload_iter, &payload_len);
+               g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep,
+                               &cluster_id, &profile_id, &payload_len, &payload_iter);
 
                if (payload_len > 0) {
-                       payload = calloc(payload_len, sizeof(unsigned char));
-                       while (g_variant_iter_loop(payload_iter, "y", &value)) {
+                       payload = calloc(payload_len + 1, sizeof(unsigned char));
+                       while (g_variant_iter_loop(payload_iter, "(y)", &value)) {
                                payload[i++] = value;
                        }
                        if (NULL != payload_iter)
@@ -2079,11 +2081,11 @@ MGMT_NWK_DISC_REQ_OUT:
                GVariantIter *payload_iter = NULL;
                int i = 0;
 
-               g_variant_get(parameters, "(ayq)", &payload_iter, &length);
+               g_variant_get(parameters, "(qa(y))", &length, &payload_iter);
 
                if (length > 0) {
                        data = calloc(length, sizeof(unsigned char));
-                       while (g_variant_iter_loop(payload_iter, "y", &value)) {
+                       while (g_variant_iter_loop(payload_iter, "(y)", &value)) {
                                data[i++] = value;
                        }
                        if (NULL != payload_iter)
@@ -4449,16 +4451,18 @@ int zbl_mgmt_permit_joining_req(nwk_addr addr16, unsigned char duration,
        return ZIGBEE_ERROR_NONE;
 }
 
-int zbl_aps_send(nwk_addr addr16, unsigned char aps_frame_ctl,
-               unsigned char src_ep, unsigned char dst_ep,
-               unsigned short cluster_id, unsigned short profile_id,
-               unsigned char zcl_frame_ctl, unsigned short mfg_code,
-               unsigned short payload_len, unsigned char *payload,
-               zb_aps_send_rsp cb, void *user_data)
+int zbl_aps_send(nwk_addr addr16, unsigned char aps_frame_ctl, unsigned char src_ep,
+       unsigned char dst_ep, unsigned short cluster_id, unsigned short profile_id,
+       unsigned char zcl_frame_ctl, unsigned short mfg_code, unsigned char cmd_id,
+       unsigned short payload_len, unsigned char *payload, zb_aps_send_rsp cb, void *user_data)
 {
        int sub_id, to, i;
        zbl_req_cb_s *container;
 
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
        GVariantBuilder *payload_builder = NULL;
        GVariant *payload_variant = NULL;
 
@@ -4485,21 +4489,31 @@ int zbl_aps_send(nwk_addr addr16, unsigned char aps_frame_ctl,
        container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
        container->userdata = user_data;
 
-       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
        if (payload_len > 0) {
                for (i = payload_len - 1; i >= 0 ; i--) {
-                       g_variant_builder_add(payload_builder, "y", payload[i]);
+                       g_variant_builder_add(payload_builder, "(y)", payload[i]);
                }
        }
        payload_variant = g_variant_builder_end(payload_builder);
        g_variant_builder_unref(payload_builder);
 
-       g_dbus_proxy_call(custom_gproxy, "aps_send",
-               g_variant_new("(qyyyqqyq@ay)", addr16, aps_frame_ctl, src_ep, dst_ep, cluster_id,
-               profile_id, zcl_frame_ctl, mfg_code, payload_variant),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, NULL, container);
+       variant = g_dbus_proxy_call_sync(custom_gproxy, "aps_send",
+               g_variant_new("(qyyyqqyqyq@a(y))", addr16, aps_frame_ctl, src_ep, dst_ep, cluster_id,
+               profile_id, zcl_frame_ctl, mfg_code, cmd_id, payload_len, payload_variant),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
 
-       return ZIGBEE_ERROR_NONE;
+       if (variant) {
+               g_variant_get(variant, "(i)", &result);
+               DBG("ret = [0x%x]", result);
+               g_variant_unref(variant);
+       } else {
+               ERR("Failed to run 'aps_send' [%s]", dbus_err->message);
+               g_error_free(dbus_err);
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       return result;
 }
 
 int zbl_zcl_send(nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
@@ -4510,6 +4524,10 @@ int zbl_zcl_send(nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
        int sub_id, to, i;
        zbl_req_cb_s *container;
 
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
        GVariantBuilder *payload_builder = NULL;
        GVariant *payload_variant = NULL;
 
@@ -4536,20 +4554,30 @@ int zbl_zcl_send(nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
        container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
        container->userdata = user_data;
 
-       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
        if (payload_len > 0) {
                for (i = payload_len - 1; i >= 0 ; i--) {
-                       g_variant_builder_add(payload_builder, "y", payload[i]);
+                       g_variant_builder_add(payload_builder, "(y)", payload[i]);
                }
        }
        payload_variant = g_variant_builder_end(payload_builder);
        g_variant_builder_unref(payload_builder);
 
-       g_dbus_proxy_call(custom_gproxy, "zcl_send",
-               g_variant_new("(qyyqyy@ay)", addr16, src_ep, dst_ep, cluster_id, zcl_frame_ctl,
-               cmd, payload_variant), G_DBUS_CALL_FLAGS_NONE, to, NULL, NULL, container);
+       variant = g_dbus_proxy_call_sync(custom_gproxy, "zcl_send",
+               g_variant_new("(qyyqyyq@a(y))", addr16, src_ep, dst_ep, cluster_id, zcl_frame_ctl,
+               cmd, payload_len, payload_variant), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
 
-       return ZIGBEE_ERROR_NONE;
+       if (variant) {
+               g_variant_get(variant, "(i)", &result);
+               DBG("ret = [0x%x]", result);
+               g_variant_unref(variant);
+       } else {
+               ERR("Failed to run 'zcl_send' [%s]", dbus_err->message);
+               g_error_free(dbus_err);
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       return result;
 }
 
 int zbl_send_to_local(unsigned short length, unsigned char *data,
@@ -4558,6 +4586,10 @@ int zbl_send_to_local(unsigned short length, unsigned char *data,
        int sub_id, to, i;
        zbl_req_cb_s *container;
 
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
        GVariantBuilder *payload_builder = NULL;
        GVariant *payload_variant = NULL;
 
@@ -4584,20 +4616,30 @@ int zbl_send_to_local(unsigned short length, unsigned char *data,
        container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
        container->userdata = user_data;
 
-       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
        if (length > 0) {
                for (i = length - 1; i >= 0 ; i--) {
-                       g_variant_builder_add(payload_builder, "y", data[i]);
+                       g_variant_builder_add(payload_builder, "(y)", data[i]);
                }
        }
        payload_variant = g_variant_builder_end(payload_builder);
        g_variant_builder_unref(payload_builder);
 
-       g_dbus_proxy_call(custom_gproxy, "send_to_local",
-               g_variant_new("(@ay)", payload_variant),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, NULL, container);
+       variant = g_dbus_proxy_call_sync(custom_gproxy, "send_to_local",
+               g_variant_new("(q@a(y))", length, payload_variant),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
 
-       return ZIGBEE_ERROR_NONE;
+       if (variant) {
+               g_variant_get(variant, "(i)", &result);
+               DBG("ret = [0x%x]", result);
+               g_variant_unref(variant);
+       } else {
+               ERR("Failed to run 'send_to_local' [%s]", dbus_err->message);
+               g_error_free(dbus_err);
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       return result;
 }
 
 int zbl_read_attr_req(zigbee_h handle, unsigned short addr16, unsigned char dest_ep,
index 9184420..0b8176c 100644 (file)
@@ -82,12 +82,10 @@ int zbl_mgmt_permit_joining_req(nwk_addr addr16, unsigned char duration,
                unsigned char tc_significance, zb_zdo_mgmt_permit_joining_rsp cb, void *user_data);
 
 /* Custom Commands */
-int zbl_aps_send(nwk_addr addr16, unsigned char aps_frame_ctl,
-               unsigned char src_ep, unsigned char dst_ep,
-               unsigned short cluster_id, unsigned short profile_id,
-               unsigned char zcl_frame_ctl, unsigned short mfg_code,
-               unsigned short payload_len, unsigned char *payload,
-               zb_aps_send_rsp cb, void *user_data);
+int zbl_aps_send(nwk_addr addr16, unsigned char aps_frame_ctl, unsigned char src_ep,
+               unsigned char dst_ep, unsigned short cluster_id, unsigned short profile_id,
+               unsigned char zcl_frame_ctl, unsigned short mfg_code,  unsigned char cmd_id,
+               unsigned short payload_len, unsigned char *payload, zb_aps_send_rsp cb, void *user_data);
 int zbl_zcl_send(nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
                unsigned short cluster_id, unsigned char zcl_frame_ctl, unsigned char cmd,
                unsigned short payload_len, unsigned char *payload,
index 541ece5..aa43b2d 100644 (file)
@@ -38,7 +38,7 @@ void _zb_aps_send_rsp(nwk_addr addr16, unsigned char src_ep, unsigned char dst_e
        unsigned short i = 0;
        msgp("\n_zb_aps_send_rsp()");
        msg("  src_ep      : 0x%X", src_ep);
-       msg("  src_ep      : 0x%X", dst_ep);
+       msg("  dst_ep      : 0x%X", dst_ep);
        msg("  cluster_id  : 0x%04X", cluster_id);
        msg("  profile_id  : 0x%04X", profile_id);
        msg("  payload_len : 0x%04X", payload_len);
@@ -57,7 +57,7 @@ void _zb_zcl_send_rsp(nwk_addr addr16, unsigned char src_ep, unsigned char dst_e
        unsigned short i = 0;
        msgp("\n_zb_zcl_send_rsp()");
        msg("  src_ep      : 0x%X", src_ep);
-       msg("  src_ep      : 0x%X", dst_ep);
+       msg("  dst_ep      : 0x%X", dst_ep);
        msg("  cluster_id  : 0x%04X", cluster_id);
        msg("  profile_id  : 0x%04X", profile_id);
        msg("  payload_len : 0x%04X", payload_len);
@@ -93,12 +93,13 @@ static int run_aps_send(MManager *mm, struct menu_data *menu)
        unsigned char zcl_frame_ctl = ZB_ZCL_FC_GLOBALLY_USED | ZB_ZCL_CLIENT_TO_SERVER |
                                                                ZB_ZCL_FC_NOT_MANUFACTURER | ZB_ZCL_DISABLE_DEFAULT_RESPONSE;
        unsigned short mfg_code = 0x110A;
+       unsigned char cmd_id = 0x01;
        unsigned short payload_len = 4;
        unsigned char payload[4] = { 0x00, 0x01, 0x02, 0x03 };
 
        ret = zb_aps_send(handle, dest_addr16, aps_frame_ctl, src_ep, dst_ep,
                                cluster_id, profile_id, zcl_frame_ctl, mfg_code,
-                               payload_len, payload, _zb_aps_send_rsp, NULL);
+                               cmd_id, payload_len, payload, _zb_aps_send_rsp, NULL);
        if (ZIGBEE_ERROR_NONE != ret) {
                msg("zb_aps_send(0x%X) - FAILED!!!", ret);
                return RET_FAILURE;