Fix presence_user_cb AND/OR condition
authorLokesh <l.kasana@samsung.com>
Fri, 30 Aug 2019 10:01:21 +0000 (15:31 +0530)
committersaerome.kim <saerome.kim@samsung.com>
Mon, 16 Sep 2019 12:03:45 +0000 (21:03 +0900)
1/ Incorporate environmental sensors
2/ Send only one presence_user_cb for a user within a cycle

Change-Id: I0510fe074e4da808c3078d8ff15f20fc1ae4716f
Signed-off-by: Lokesh <l.kasana@samsung.com>
include/user-awareness-private.h
packaging/capi-network-ua.spec
src/user-awareness-event-handler.c
src/user-awareness-monitors.c
test/uat-detections.c

index 7b5e0897a491990cdd4aff14b2e5943578f5aa2a..536060a74f76ad107c6d4fc6e99d0f0ae42230e1 100644 (file)
@@ -193,6 +193,8 @@ typedef struct {
 typedef struct {
        char *account; /**< Account */
        unsigned int sensor_bitmask; /**< Detected sensor type bit mask */
+       GSList *found_devices; /**< Detected devices' handles list */
+       gboolean cb_sent; /** User presence callback sent or not flag */
 } ua_user_state_info_s;
 
 /**
index db50dcd26e8f4b67062005806043107ddc6be7c9..fd65670960edb7321afe4d90d44c293bd4bcdb0f 100644 (file)
@@ -1,6 +1,6 @@
 Name: capi-network-ua
 Summary: User Awareness Framework CAPI
-Version: 0.7.3
+Version: 0.8.0
 Release: 1
 License: Apache-2.0
 Source0: %{name}-%{version}.tar.gz
index b0e114d0e7bad8d3a9cd1ea6820b623db4daa9b7..be991242bfbdc7cc9aab86c3d2d36333002f0612 100644 (file)
@@ -78,7 +78,8 @@ static void __ua_event_handler(int event, uam_event_data_s *event_param, void *u
                ret_if(NULL == sensor_bitmask);
 
                _ua_monitor_handle_user_presence_detected(*sensor_bitmask, NULL,
-                                                         NULL, 0, NULL);
+                               NULL, 0, NULL);
+
                break;
        }
        case UAM_EVENT_ABSENCE_DETECTED: {
index ffad5e7fb8bc1961dc7b37f7d730fba66c4cf13b..1c387d439e1b00d5e0bee75681c38666000eb209 100644 (file)
@@ -170,6 +170,7 @@ static void __ua_free_user_state_info_t(gpointer data)
        ret_if(NULL == user_state);
 
        g_free(user_state->account);
+       g_slist_free(user_state->found_devices);
        g_free(user_state);
        FUNC_EXIT;
 }
@@ -225,8 +226,8 @@ static void __ua_send_presence_detection()
                        continue;
                }
 
-               UA_INFO("monitor->sensor_bitmask: 0x%8.8X, monitor->absence_detected_bitmask: 0x%8.8X",
-                               monitor->sensor_bitmask, monitor->absence_detected_bitmask);
+               UA_INFO("monitor->sensor_bitmask: 0x%8.8X, monitor->presence_detected_bitmask: 0x%8.8X",
+                               monitor->sensor_bitmask, monitor->presence_detected_bitmask);
                if (monitor->sensor_bitmask == monitor->presence_detected_bitmask) {
                        if (monitor->presence_cb)
                                monitor->presence_cb(UA_ERROR_NONE, monitor,
@@ -261,31 +262,38 @@ static ua_user_state_info_s* __ua_monitor_user_state_create(char *account)
 }
 
 static void __ua_monitor_send_user_presence_cb(ua_monitor_s *monitor,
-                                              ua_user_h user_handle,
-                                              unsigned int user_sensor_bitmask,
-                                              char *device_id)
+               ua_user_state_info_s *user_state)
 {
        FUNC_ENTRY;
+       unsigned int env_presence_bm = 0;
+       unsigned int user_sensor_bitmask = user_state->sensor_bitmask;
+
+       ua_user_h user_handle = _ua_get_user_handle_by_account(
+                       user_state->account);
+       env_presence_bm = monitor->presence_detected_bitmask & UA_SENSOR_MOTION
+                       & UA_SENSOR_LIGHT;
 
        /**
         * Check whether user_handle present or not and also check
         * whether presence has been started or not.
         */
-       if (!user_handle || !monitor->presence_user_cb.callback ||
-           !monitor->presence_detection_started) {
+       if (!user_handle || user_state->cb_sent
+                       || !monitor->presence_user_cb.callback
+                       || !monitor->presence_detection_started) {
                FUNC_EXIT;
                return;
        }
 
        UA_DBG("User's sensor bitmask [0x%u], monior presence bitmask AND [0x%u], OR [0x%u]",
-              user_sensor_bitmask,
-              monitor->presence_bitmask_and, monitor->presence_bitmask_or);
+                       user_sensor_bitmask, monitor->presence_bitmask_and,
+                       monitor->presence_bitmask_or);
 
        /**
         * Check AND conditions for sensors.
         */
        if (monitor->presence_bitmask_and !=
-           (user_sensor_bitmask & monitor->presence_bitmask_and)) {
+                       (monitor->presence_bitmask_and
+                       & (user_sensor_bitmask | env_presence_bm))) {
                FUNC_EXIT;
                return;
        }
@@ -296,42 +304,20 @@ static void __ua_monitor_send_user_presence_cb(ua_monitor_s *monitor,
         * Check OR conditions for sensors.
         */
        if (monitor->presence_bitmask_or &&
-           !(user_sensor_bitmask & monitor->presence_bitmask_or)) {
+                       !(monitor->presence_bitmask_or
+                       & (user_sensor_bitmask | env_presence_bm))) {
                FUNC_EXIT;
                return;
        }
 
        UA_DBG("OR condition matched");
-       GSList *device_handles = NULL;
-       ua_device_h device_handle;
-
-       if (user_sensor_bitmask & UA_SENSOR_BT) {
-               ua_device_get_by_device_id(device_id,
-                                          user_sensor_bitmask & UA_SENSOR_BT,
-                                          &device_handle);
-               device_handles = g_slist_prepend(device_handles, device_handle);
-       }
-
-       if (user_sensor_bitmask & UA_SENSOR_BLE) {
-               ua_device_get_by_device_id(device_id,
-                                          user_sensor_bitmask & UA_SENSOR_BLE,
-                                          &device_handle);
-               device_handles = g_slist_prepend(device_handles, device_handle);
-       }
-
-       if (user_sensor_bitmask & UA_SENSOR_WIFI) {
-               ua_device_get_by_device_id(device_id,
-                                          user_sensor_bitmask & UA_SENSOR_WIFI,
-                                          &device_handle);
-               device_handles = g_slist_prepend(device_handles, device_handle);
-       }
 
        ((ua_presence_user_detected_cb)monitor->presence_user_cb.callback)(
-                                          UA_ERROR_NONE, monitor, user_handle,
-                                          device_handles,
-                                          monitor->presence_user_cb.user_data);
+                                       UA_ERROR_NONE, monitor, user_handle,
+                                       user_state->found_devices,
+                                       monitor->presence_user_cb.user_data);
 
-       g_slist_free(device_handles);
+       user_state->cb_sent = TRUE;
 }
 
 static void __ua_sensor_presence_detected(ua_monitor_s *monitor,
@@ -340,8 +326,12 @@ static void __ua_sensor_presence_detected(ua_monitor_s *monitor,
        FUNC_ENTRY;
 
        GSList *l;
+       GSList *us;
        int found = 0;
+       int ret = UA_ERROR_NONE;
        ua_user_state_info_s *user_state;
+       ua_device_h device_handle = NULL;
+
        ret_if(NULL == monitor);
 
        if (account) {
@@ -366,14 +356,19 @@ static void __ua_sensor_presence_detected(ua_monitor_s *monitor,
                        monitor->user_state = g_slist_append(monitor->user_state, user_state);
                }
 
-               ua_user_h user_handle = _ua_get_user_handle_by_account(user_state->account);
-
-               _ua_set_user_last_presence_timestamp(user_handle, timestamp);
                user_state->sensor_bitmask |= bitmask;
 
-               __ua_monitor_send_user_presence_cb(monitor, user_handle,
-                                                  user_state->sensor_bitmask,
-                                                  device_id);
+               ret = ua_device_get_by_device_id(device_id, bitmask, &device_handle);
+               UA_INFO("ua_device_get_by_device_id returned %s",
+                               _ua_get_error_string(ret));
+               if (device_handle)
+                       user_state->found_devices = g_slist_prepend(user_state->found_devices,
+                                       device_handle);
+
+               __ua_monitor_send_user_presence_cb(monitor, user_state);
+
+               ua_user_h user_handle = _ua_get_user_handle_by_account(user_state->account);
+               _ua_set_user_last_presence_timestamp(user_handle, timestamp);
        }
 
        switch (monitor->presence_mode) {
@@ -384,6 +379,7 @@ static void __ua_sensor_presence_detected(ua_monitor_s *monitor,
                 * send presence detection callback to application. This will make sure that each sensor is
                 * detected at least one device from registered devices list.
                 */
+//TODO remove this (BLE | WIFI) condition and the ALL/ANY thing.
                if (((bitmask == UA_SENSOR_BLE) && (monitor->sensor_bitmask & UA_SENSOR_WIFI))
                                || ((bitmask == UA_SENSOR_WIFI) && (monitor->sensor_bitmask & UA_SENSOR_BLE)))
                        monitor->presence_detected_bitmask |= (UA_SENSOR_BLE | UA_SENSOR_WIFI);
@@ -412,6 +408,16 @@ static void __ua_sensor_presence_detected(ua_monitor_s *monitor,
                UA_WARN("Unexpected detection mode: %d", monitor->presence_mode);
        }
 
+       /* if environmental sensor comes after connectivity sensor */
+       if (!account) {
+               for (us = monitor->user_state; us; us = g_slist_next(us)) {
+                       user_state = (ua_user_state_info_s *)us->data;
+                       UA_DBG("user_state->account [%s]", user_state->account);
+
+                       __ua_monitor_send_user_presence_cb(monitor, user_state);
+               }
+       }
+
        FUNC_EXIT;
 }
 
@@ -655,7 +661,8 @@ void _ua_monitor_handle_user_presence_detected(unsigned int bitmask,
        for (l = ua_monitor_list; l; l = g_slist_next(l)) {
                ua_monitor_s *monitor = l->data;
 
-               if (!monitor || (!monitor->presence_detection_started && !monitor->internal_presence_started))
+               if (!monitor || (!monitor->presence_detection_started
+                               && !monitor->internal_presence_started))
                        continue;
 
                if (0 == (bitmask & monitor->sensor_bitmask))
@@ -817,6 +824,7 @@ void _ua_free_ua_monitor_t(gpointer data)
        ua_monitor_s *monitor = data;
        ret_if(NULL == monitor);
 
+//TODO lk, where are these timers used?
        if (monitor->presence_detection_timer) {
                /* LCOV_EXCL_START */
                g_source_remove(monitor->presence_detection_timer);
@@ -1091,6 +1099,12 @@ int ua_monitor_set_user_presence_condition(ua_monitor_h handle,
                return UA_ERROR_INVALID_PARAMETER;
        }
 
+       if (!(bitmask_and | bitmask_or)) {
+               UA_ERR("Both of AND/OR bitmask are zero");
+               FUNC_EXIT;
+               return UA_ERROR_INVALID_PARAMETER;
+       }
+
        _uam_get_available_sensors(&available_sensors);
 
        if (bitmask_and != (available_sensors & bitmask_and)) {
index b09ca87fb21bbf8db2102846a8e618c5c8ad849b..656ff9da00329f0d1f3e4cc460bf768ee99d0296 100644 (file)
@@ -37,10 +37,10 @@ extern char g_service_str[MENU_DATA_SIZE + 1]; /**< Service string */
 static char cycle_time[MENU_DATA_SIZE + 1] = {"900", }; /**< cycle time */
 static char window[MENU_DATA_SIZE + 1] = {"60", }; /**< Detection window */
 
-static char g_presence_and_cond[MENU_DATA_SIZE + 1] = {"00", }; /**< PRESENCE AND condition */
-static char g_presence_or_cond[MENU_DATA_SIZE + 1] = {"00", }; /**< PRESENCE OR condition */
-static char g_absence_and_cond[MENU_DATA_SIZE + 1] = {"00", }; /**< ABSENCE AND condition */
-static char g_absence_or_cond[MENU_DATA_SIZE + 1] = {"00", }; /**< ABSENCE OR condition */
+static char g_presence_and_cond[MENU_DATA_SIZE + 1] = {0,}; /**< PRESENCE AND condition */
+static char g_presence_or_cond[MENU_DATA_SIZE + 1] = {0,}; /**< PRESENCE OR condition */
+static char g_absence_and_cond[MENU_DATA_SIZE + 1] = {0,}; /**< ABSENCE AND condition */
+static char g_absence_or_cond[MENU_DATA_SIZE + 1] = {0,}; /**< ABSENCE OR condition */
 
 static char g_presence_type[MENU_DATA_SIZE + 1] = "2"; /**< Selected PRESENCE type */
 static char g_absence_type[MENU_DATA_SIZE + 1] = "2"; /**< Selected ABSENCE type */
@@ -215,17 +215,17 @@ static int run_ua_monitor_set_user_presence_condition(
                MManager *mm, struct menu_data *menu)
 {
        int ret = UA_ERROR_NONE;
-       unsigned int bitmask_and = 0x00;
-       unsigned int bitmask_or = 0x00;
+       unsigned int bitmask_and = 0;
+       unsigned int bitmask_or = 0;
 
        msg("ua_monitor_set_user_presence_condition");
 
        if (strlen(g_presence_and_cond))
-               bitmask_and = (unsigned char)strtol(g_presence_and_cond, NULL, 10);
+               bitmask_and = (unsigned int)strtol(g_presence_and_cond, NULL, 10);
        if (strlen(g_presence_or_cond))
-               bitmask_or = (unsigned char)strtol(g_absence_or_cond, NULL, 10);
+               bitmask_or = (unsigned int)strtol(g_presence_or_cond, NULL, 10);
 
-       msgb("AND [0x%u] OR [0x%u]", bitmask_and, bitmask_or);
+       msgb("AND [%u] - OR [%u]", bitmask_and, bitmask_or);
 
        ret = ua_monitor_set_user_presence_condition(g_ua_mon_h, bitmask_and, bitmask_or);
 
@@ -239,17 +239,17 @@ static int run_ua_monitor_set_user_absence_condition(
                MManager *mm, struct menu_data *menu)
 {
        int ret = UA_ERROR_NONE;
-       unsigned int bitmask_and = 0x00;
-       unsigned int bitmask_or = 0x00;
+       unsigned int bitmask_and = 0;
+       unsigned int bitmask_or = 0;
 
        msg("ua_monitor_set_user_absence_condition");
 
        if (strlen(g_absence_and_cond))
-               bitmask_and = (unsigned char)strtol(g_absence_and_cond, NULL, 10);
+               bitmask_and = (unsigned int)strtol(g_absence_and_cond, NULL, 10);
        if (strlen(g_absence_or_cond))
-               bitmask_or = (unsigned char)strtol(g_absence_or_cond, NULL, 10);
+               bitmask_or = (unsigned int)strtol(g_absence_or_cond, NULL, 10);
 
-       msgb("AND [0x%u] OR [0x%u]", bitmask_and, bitmask_or);
+       msgb("AND [%u] - OR [%u]", bitmask_and, bitmask_or);
 
        ret = ua_monitor_set_user_absence_condition(g_ua_mon_h, bitmask_and, bitmask_or);
 
@@ -526,9 +526,9 @@ static struct menu_data menu_ua_set_detection_window[] = {
 };
 
 static struct menu_data menu_ua_set_presence_condition[] = {
-       { "1", "AND Bitmask (01:BT 02:BLE 04:Wi-Fi 08:Motion 10:Light 20:Audio",
+       { "1", "AND Bitmask (1:BT 2:BLE 4:Wi-Fi 8:Motion 16:Light 32:Audio",
                NULL, NULL, g_presence_and_cond },
-       { "2", "OR Bitmask (01:BT 02:BLE 04:Wi-Fi 08:Motion 10:Light 20:Audio",
+       { "2", "OR Bitmask (01:BT 02:BLE 04:Wi-Fi 08:Motion 16:Light 32:Audio",
                NULL, NULL, g_presence_or_cond },
        { "3", "run", NULL,
                run_ua_monitor_set_user_presence_condition, NULL },
@@ -536,9 +536,9 @@ static struct menu_data menu_ua_set_presence_condition[] = {
 };
 
 static struct menu_data menu_ua_set_absence_condition[] = {
-       { "1", "AND Bitmask (0x01:BT 0x02:BLE 0x04:Wi-Fi 0x08:Motion 0x10:Light 0x20:Audio",
+       { "1", "AND Bitmask (1:BT 2:BLE 4:Wi-Fi 8:Motion 16:Light 32:Audio",
                NULL, NULL, g_absence_and_cond },
-       { "2", "OR Bitmask (0x01:BT 0x02:BLE 0x04:Wi-Fi 0x08:Motion 0x10:Light 0x20:Audio",
+       { "2", "OR Bitmask (01:BT 02:BLE 04:Wi-Fi 08:Motion 16:Light 32:Audio",
                NULL, NULL, g_absence_or_cond },
        { "3", "run", NULL,
                run_ua_monitor_set_user_absence_condition, NULL },