[Custom] Implement custom discovery function
authorGichan Jang <gichan2.jang@samsung.com>
Tue, 14 Jan 2025 01:39:00 +0000 (10:39 +0900)
committerjaeyun-jung <39614140+jaeyun-jung@users.noreply.github.com>
Tue, 21 Jan 2025 08:28:10 +0000 (17:28 +0900)
Implement custom discovery function and add related unit tests.

Signed-off-by: Gichan Jang <gichan2.jang@samsung.com>
include/nnstreamer-edge-custom.h
include/nnstreamer-edge.h
src/libnnstreamer-edge/nnstreamer-edge-custom-impl.c
src/libnnstreamer-edge/nnstreamer-edge-custom-impl.h
src/libnnstreamer-edge/nnstreamer-edge-internal.c
tests/nnstreamer-edge-custom-test.c
tests/unittest_nnstreamer-edge-custom.cc

index b069b6cda283cd61cd088db876e1a9ea29678cee..de339289238da9a17c48896ef71c76d2542b60f3 100644 (file)
@@ -34,6 +34,7 @@ typedef struct
   int (*nns_edge_custom_connect) (void *priv);
   int (*nns_edge_custom_subscribe) (void *priv);
   int (*nns_edge_custom_is_connected) (void *priv);
+  int (*nns_edge_custom_discover) (void *priv);
   int (*nns_edge_custom_set_event_cb) (void *priv, nns_edge_event_cb cb, void *user_data);
   int (*nns_edge_custom_send_data) (void *priv, nns_edge_data_h data_h);
   int (*nns_edge_custom_set_info) (void *priv, const char *key, const char *value);
index 87deca66c8d1cc54d4d7df0eb00b89f2a294ad69..e47109e6b47853174e37278c8d99f6b882817b34 100644 (file)
@@ -214,15 +214,14 @@ int nns_edge_release_handle (nns_edge_h edge_h);
 int nns_edge_set_event_callback (nns_edge_h edge_h, nns_edge_event_cb cb, void *user_data);
 
 /**
- * @brief Discovery connectable devices within the network.
+ * @brief Discover connectable devices within the network.
  * @param[in] edge_h The edge handle.
- * @param[in] user_data The user's custom data passed to discovery callback.
  * @return 0 on success. Otherwise a negative error value.
  * @retval #NNS_EDGE_ERROR_NONE Successful.
  * @retval #NNS_EDGE_ERROR_NOT_SUPPORTED Not supported.
  * @retval #NNS_EDGE_ERROR_INVALID_PARAMETER Given parameter is invalid.
  */
-int nns_edge_discovery (nns_edge_h edge_h, void *user_data);
+int nns_edge_discover (nns_edge_h edge_h);
 
 /**
  * @brief Connect to the destination node. In the case of Hybrid and MQTT, the TOPIC, DEST_HOST and DEST_PORT must be set before connection using nns_edge_set_info().
index da91531623100be4346b27eb373d924fa74bd71a..93c5bc46bc3c0a259e07b40d7a68417280c3ed0f 100644 (file)
@@ -220,6 +220,29 @@ nns_edge_custom_set_event_callback (nns_edge_custom_connection_h handle,
   return ret;
 }
 
+/**
+ * @brief Internal function to discover devices of custom connection.
+ */
+int
+nns_edge_custom_discover (nns_edge_custom_connection_h handle)
+{
+  custom_connection_s *custom = (custom_connection_s *) handle;
+  nns_edge_custom_s *custom_h;
+  int ret;
+
+  if (!custom || !custom->instance)
+    return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+  custom_h = custom->instance;
+
+  ret = custom_h->nns_edge_custom_discover (custom->priv);
+  if (NNS_EDGE_ERROR_NONE != ret) {
+    nns_edge_loge ("Failed to discover devices of custom connection.");
+  }
+
+  return ret;
+}
+
 /**
  * @brief Internal function to connect custom connection.
  */
index a4332f8d94f049576bd8b8d6c6bff14232c82d89..2fbe1f016d46f414ec4b4d7462cc6f261bb383e8 100644 (file)
@@ -42,6 +42,11 @@ int nns_edge_custom_start (nns_edge_custom_connection_h handle);
  */
 int nns_edge_custom_stop (nns_edge_custom_connection_h handle);
 
+/**
+ * @brief Internal function to discover devices of custom connection.
+ */
+int nns_edge_custom_discover (nns_edge_custom_connection_h handle);
+
 /**
  * @brief Internal function to set the event callback of custom connection.
  */
@@ -76,6 +81,7 @@ int nns_edge_custom_get_info (nns_edge_custom_connection_h handle, const char *k
 #define nns_edge_custom_release(...) (NNS_EDGE_ERROR_NOT_SUPPORTED)
 #define nns_edge_custom_start(...) (NNS_EDGE_ERROR_NOT_SUPPORTED)
 #define nns_edge_custom_stop(...) (NNS_EDGE_ERROR_NOT_SUPPORTED)
+#define nns_edge_custom_discover(...) (NNS_EDGE_ERROR_NOT_SUPPORTED)
 #define nns_edge_custom_set_event_callback(...) (NNS_EDGE_ERROR_NOT_SUPPORTED)
 #define nns_edge_custom_connect(...) (NNS_EDGE_ERROR_NOT_SUPPORTED)
 #define nns_edge_custom_is_connected(...) (NNS_EDGE_ERROR_NOT_SUPPORTED)
index 4aede6323cfa867959fb2cb03e67ab753136c29a..a6a74bf64925c995266c6d9573b77bd39f71f565 100644 (file)
@@ -2143,3 +2143,39 @@ nns_edge_get_info (nns_edge_h edge_h, const char *key, char **value)
 
   return ret;
 }
+
+/**
+ * @brief Discover connectable devices within the network.
+ */
+int nns_edge_discover (nns_edge_h edge_h)
+{
+  nns_edge_handle_s *eh;
+  int ret = NNS_EDGE_ERROR_NONE;
+
+  eh = (nns_edge_handle_s *) edge_h;
+  if (!eh) {
+    nns_edge_loge ("Invalid param, given edge handle is null.");
+    return NNS_EDGE_ERROR_INVALID_PARAMETER;
+  }
+
+  if (!nns_edge_handle_is_valid (eh)) {
+    nns_edge_loge ("Invalid param, given edge handle is invalid.");
+    return NNS_EDGE_ERROR_INVALID_PARAMETER;
+  }
+
+  nns_edge_lock (eh);
+  if (!eh->event_cb) {
+    nns_edge_loge ("NNStreamer-edge event callback is not registered.");
+    nns_edge_unlock (eh);
+    return NNS_EDGE_ERROR_CONNECTION_FAILURE;
+  }
+
+  if (NNS_EDGE_CONNECT_TYPE_CUSTOM == eh->connect_type) {
+    ret = nns_edge_custom_discover (eh->custom_connection_h);
+  }
+
+  nns_edge_unlock (eh);
+
+  return ret;
+}
+
index 4dbd09260ce97b0b70c898fe0c9caa97ed7cbd26..7c00b03f7fff93d6a8c4aa31a17ffbd30f181b35 100644 (file)
@@ -108,6 +108,23 @@ nns_edge_custom_subscribe (void *priv)
   return NNS_EDGE_ERROR_NOT_SUPPORTED;
 }
 
+
+static int
+nns_edge_custom_discover (void *priv)
+{
+  int ret = NNS_EDGE_ERROR_NONE;
+
+  if (!priv) {
+    nns_edge_loge ("Invalid param, handle should not be null.");
+    return NNS_EDGE_ERROR_INVALID_PARAMETER;
+  }
+  nns_edge_custom_test_s *custom_h = (nns_edge_custom_test_s *) priv;
+  ret = nns_edge_event_invoke_callback (custom_h->event_cb, custom_h->user_data,
+      NNS_EDGE_EVENT_DEVICE_FOUND, NULL, 0, NULL);
+
+  return ret;
+}
+
 static int
 nns_edge_custom_is_connected (void *priv)
 {
@@ -130,6 +147,10 @@ nns_edge_custom_set_event_cb (void *priv, nns_edge_event_cb cb, void *user_data)
     nns_edge_loge ("Invalid param, handle should not be null.");
     return NNS_EDGE_ERROR_INVALID_PARAMETER;
   }
+  nns_edge_custom_test_s *custom_h = (nns_edge_custom_test_s *) priv;
+
+  custom_h->event_cb = cb;
+  custom_h->user_data = user_data;
 
   return NNS_EDGE_ERROR_NONE;
 }
@@ -187,6 +208,7 @@ nns_edge_custom_s edge_custom_h = {
   .nns_edge_custom_create = nns_edge_custom_create,
   .nns_edge_custom_close = nns_edge_custom_close,
   .nns_edge_custom_start = nns_edge_custom_start,
+  .nns_edge_custom_discover = nns_edge_custom_discover,
   .nns_edge_custom_stop = nns_edge_custom_stop,
   .nns_edge_custom_connect = nns_edge_custom_connect,
   .nns_edge_custom_subscribe = nns_edge_custom_subscribe,
index df040181c16addb1139446d2a0772f367b75651d..0b565b589842a4300745850488ef8fd0f7010b7f 100644 (file)
@@ -74,6 +74,21 @@ TEST (edgeCustom, createHandleInvalidParam03_n)
 static int
 _test_edge_event_cb (nns_edge_event_h event_h, void *user_data)
 {
+  nns_edge_event_e event = NNS_EDGE_EVENT_UNKNOWN;
+  int ret;
+  int *device_found = (int *) user_data;
+
+  ret = nns_edge_event_get_type (event_h, &event);
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
+
+  switch (event) {
+    case NNS_EDGE_EVENT_DEVICE_FOUND:
+      (*device_found)++;
+      break;
+    default:
+      break;
+  }
+
   return NNS_EDGE_ERROR_NONE;
 }
 
@@ -86,12 +101,13 @@ TEST (edgeCustom, expectedReturn)
   nns_edge_h edge_h = NULL;
   nns_edge_data_h data_h = NULL;
   char *ret_str = NULL;
+  int device_found = 0;
 
   ret = nns_edge_custom_create_handle ("temp_id", "libnnstreamer-edge-custom-test.so",
       NNS_EDGE_NODE_TYPE_QUERY_SERVER, &edge_h);
   ASSERT_EQ (NNS_EDGE_ERROR_NONE, ret);
 
-  ret = nns_edge_set_event_callback (edge_h, _test_edge_event_cb, NULL);
+  ret = nns_edge_set_event_callback (edge_h, _test_edge_event_cb, &device_found);
   EXPECT_EQ (NNS_EDGE_ERROR_NONE, ret);
   ret = nns_edge_set_info (edge_h, "PEER_ADDRESS", "TE:MP:AD:DR:ES:SS");
   EXPECT_EQ (NNS_EDGE_ERROR_NONE, ret);
@@ -103,6 +119,10 @@ TEST (edgeCustom, expectedReturn)
   ret = nns_edge_start (edge_h);
   EXPECT_EQ (NNS_EDGE_ERROR_NONE, ret);
 
+  ret = nns_edge_discover (edge_h);
+  EXPECT_EQ (NNS_EDGE_ERROR_NONE, ret);
+  EXPECT_EQ (1, device_found);
+
   ret = nns_edge_is_connected (edge_h);
   EXPECT_EQ (NNS_EDGE_ERROR_CONNECTION_FAILURE, ret);
 
@@ -195,6 +215,17 @@ TEST (edgeCustom, stopInvalidParam01_n)
   EXPECT_NE (NNS_EDGE_ERROR_NONE, ret);
 }
 
+/**
+ * @brief Set event callback of edge custom - invalid param.
+ */
+TEST (edgeCustom, discoverInvalidParam01_n)
+{
+  int ret;
+
+  ret = nns_edge_custom_discover (NULL);
+  EXPECT_NE (NNS_EDGE_ERROR_NONE, ret);
+}
+
 /**
  * @brief Set event callback of edge custom - invalid param.
  */