Add P2P detection callback
authorArron Wang <arron.wang@intel.com>
Sun, 16 Mar 2014 11:31:47 +0000 (19:31 +0800)
committerArron Wang <arron.wang@intel.com>
Mon, 17 Mar 2014 05:49:21 +0000 (13:49 +0800)
Change-Id: I437d79df0a90c34ec87b4dab7fc5979404c064ff

client/include/net_nfc_neard.h
client/net_nfc_client_p2p.c
client/net_nfc_neard.c

index dc71356..3af91e8 100644 (file)
@@ -19,6 +19,12 @@ net_nfc_error_e net_nfc_neard_set_active(int state,
 void net_nfc_neard_set_activated(net_nfc_client_manager_activated callback,
                void *user_data);
 void net_nfc_neard_unset_activated(void);
+void net_nfc_neard_set_p2p_discovered(
+               net_nfc_client_p2p_device_discovered callback, void *user_data);
+void net_nfc_neard_unset_p2p_discovered(void);
+void net_nfc_neard_set_p2p_detached(
+               net_nfc_client_p2p_device_detached callback, void *user_data);
+void net_nfc_neard_unset_p2p_detached(void);
 void net_nfc_neard_set_tag_discovered(
                net_nfc_client_tag_tag_discovered callback, void *user_data);
 void net_nfc_neard_unset_tag_discovered(void);
index 6593a23..eacbc57 100644 (file)
@@ -23,6 +23,7 @@
 #include "net_nfc_client.h"
 #include "net_nfc_client_manager.h"
 #include "net_nfc_client_p2p.h"
+#include "net_nfc_neard.h"
 
 
 typedef struct _P2p_SignalHandler P2pSignalHandler;
@@ -198,8 +199,7 @@ API void net_nfc_client_p2p_set_device_discovered(
 {
        RET_IF(NULL == callback);
 
-       p2p_signal_handler.p2p_device_discovered_cb = callback;
-       p2p_signal_handler.p2p_device_discovered_data = user_data;
+       net_nfc_neard_set_p2p_discovered(callback, user_data);
 }
 
 
@@ -208,8 +208,7 @@ API void net_nfc_client_p2p_set_device_detached(
 {
        RET_IF(NULL == callback);
 
-       p2p_signal_handler.p2p_device_detached_cb = callback;
-       p2p_signal_handler.p2p_device_detached_data = user_data;
+       net_nfc_neard_set_p2p_detached(callback, user_data);
 }
 
 
@@ -225,15 +224,13 @@ API void net_nfc_client_p2p_set_data_received(
 
 API void net_nfc_client_p2p_unset_device_discovered(void)
 {
-       p2p_signal_handler.p2p_device_discovered_cb = NULL;
-       p2p_signal_handler.p2p_device_discovered_data = NULL;
+       net_nfc_neard_unset_p2p_discovered();
 }
 
 
 API void net_nfc_client_p2p_unset_device_detached(void)
 {
-       p2p_signal_handler.p2p_device_detached_cb = NULL;
-       p2p_signal_handler.p2p_device_detached_data = NULL;
+       net_nfc_neard_unset_p2p_detached();
 }
 
 
index 086271d..0754cde 100644 (file)
@@ -37,6 +37,11 @@ typedef struct _net_nfc_client_cb
        void *ndef_read_ud;
        net_nfc_client_ndef_write_completed ndef_write_cb;
        void *ndef_write_ud;
+
+       net_nfc_client_p2p_device_discovered p2p_discovered_cb;
+       void *p2p_discovered_ud;
+       net_nfc_client_p2p_device_detached p2p_detached_cb;
+       void *p2p_detached_ud;
 } net_nfc_client_cb;
 
 static net_nfc_client_cb client_cb;
@@ -128,6 +133,18 @@ static uint32_t _get_tag_id(const char *name)
        return id;
 }
 
+static uint32_t _get_dev_id(const char *name)
+{
+       uint32_t id;
+       char **s;
+
+       s = g_strsplit(name, "device", 2);
+       id = atoi(s[1]);
+       g_strfreev(s);
+
+       return id;
+}
+
 static bool _check_ndef(uint8_t *ndef_card_state,
                                        int *max_data_size,
                                        int *real_data_size)
@@ -433,6 +450,64 @@ static void _write_completed_cb(errorCode_t error_code, void *user_data)
        }
 }
 
+static void _device_found_cb(const char *devName, void *user_data)
+{
+       int devType = 0;
+
+       NFC_DBG("p2p device found %s", devName);
+       if (neardal_get_dev_properties(devName, &dev) != NEARDAL_SUCCESS)
+               return;
+
+       if (target_handle == NULL)
+               target_handle = g_try_malloc0(sizeof(net_nfc_target_handle_s));
+
+       if (target_handle == NULL) {
+               NFC_DBG("handle mem alloc is failed");
+               return;
+       }
+
+
+       devType = _convert_target_type(nfc_adapter_mode);
+       if (devType == NET_NFC_NFCIP1_INITIATOR)
+               target_handle->connection_type = NET_NFC_P2P_CONNECTION_TARGET;
+       else if (devType == NET_NFC_NFCIP1_TARGET)
+               target_handle->connection_type =
+                                       NET_NFC_P2P_CONNECTION_INITIATOR;
+       target_handle->connection_id = _get_dev_id(devName);
+       target_handle->target_type = devType;
+
+       if (client_cb.p2p_discovered_cb != NULL)
+               client_cb.p2p_discovered_cb(target_handle, client_cb.p2p_discovered_ud);
+}
+
+static void _device_lost_cb(const char *devName, void *user_data)
+{
+       errorCode_t err;
+
+       NFC_DBG("p2p device lost %s", devName);
+       if (target_handle != NULL) {
+               g_free(target_handle);
+               target_handle = NULL;
+       }
+
+       if (nfc_adapter_polling == true)
+               goto exit;
+
+       if (nfc_adapter_path == NULL)
+               goto exit;
+
+       err = neardal_start_poll_loop(nfc_adapter_path,
+                                               NEARD_ADP_MODE_DUAL);
+       if (err != NEARDAL_SUCCESS)
+               goto exit;
+
+       nfc_adapter_polling = true;
+
+exit:
+       if (client_cb.p2p_detached_cb != NULL)
+               client_cb.p2p_detached_cb(client_cb.p2p_detached_ud);
+}
+
 net_nfc_error_e net_nfc_neard_get_current_tag_info(net_nfc_target_info_s **info)
 {
 
@@ -563,6 +638,32 @@ net_nfc_error_e net_nfc_neard_set_active(int state,
        return NET_NFC_OK;
 }
 
+void net_nfc_neard_set_p2p_discovered(
+               net_nfc_client_p2p_device_discovered callback, void *user_data)
+{
+       client_cb.p2p_discovered_cb = callback;
+       client_cb.p2p_discovered_ud = user_data;
+}
+
+void net_nfc_neard_unset_p2p_discovered(void)
+{
+       client_cb.p2p_discovered_cb = NULL;
+       client_cb.p2p_discovered_ud = NULL;
+}
+
+void net_nfc_neard_set_p2p_detached(
+               net_nfc_client_p2p_device_detached callback, void *user_data)
+{
+       client_cb.p2p_detached_cb = callback;
+       client_cb.p2p_detached_ud = user_data;
+}
+
+void net_nfc_neard_unset_p2p_detached(void)
+{
+       client_cb.p2p_detached_cb = NULL;
+       client_cb.p2p_detached_ud = NULL;
+}
+
 void net_nfc_neard_set_tag_discovered(
                net_nfc_client_tag_tag_discovered callback, void *user_data)
 {
@@ -619,6 +720,10 @@ net_nfc_error_e net_nfc_neard_cb_init(void)
                neardal_set_cb_read_completed(_read_completed_cb, NULL)
                                                        != NEARDAL_SUCCESS ||
                neardal_set_cb_write_completed(_write_completed_cb, NULL)
+                                                       != NEARDAL_SUCCESS ||
+               neardal_set_cb_dev_found(_device_found_cb, NULL)
+                                                       != NEARDAL_SUCCESS ||
+               neardal_set_cb_dev_lost(_device_lost_cb, NULL)
                                                        != NEARDAL_SUCCESS) {
 
                NFC_DBG("failed to register the callback");