From 71c456cc58bcad772850e04d78033e3ead80422f Mon Sep 17 00:00:00 2001 From: Lokesh Date: Mon, 9 Sep 2019 11:09:14 +0530 Subject: filter list of found_devices of a user based on sensors mentioned in AND/OR conditions Change-Id: I49c00ab54aa734506e4403b08f58fc04b2a4e9d7 Signed-off-by: Lokesh --- src/user-awareness-monitors.c | 30 +++++++++++++++++++++++++++++- src/user-awareness-util.c | 18 ++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/user-awareness-monitors.c b/src/user-awareness-monitors.c index 4f9f7fc..1408294 100644 --- a/src/user-awareness-monitors.c +++ b/src/user-awareness-monitors.c @@ -160,6 +160,7 @@ static ua_sensor_e __ua_sensor_bitmask_to_type(unsigned int bitmask) UA_WARN("Unknown sensor bitmask [0x%8.8X]", bitmask); return UA_SENSOR_MAX; } + FUNC_EXIT; } /* LCOV_EXCL_STOP */ @@ -267,15 +268,23 @@ static void __ua_monitor_send_user_presence_cb(ua_monitor_s *monitor, FUNC_ENTRY; unsigned int env_presence_bitmask = 0; unsigned int user_sensor_bitmask = user_state->sensor_bitmask; + unsigned int filter_bitmask = 0; + unsigned int dev_bitmask = 0; + GSList *l = 0; + GSList *devices = 0; gboolean and_condition = 0; gboolean or_condition = 0; gboolean condition_result = 0; + ua_dev_info_s *dev = 0; + ret_if(NULL == user_state); ua_user_h user_handle = _ua_get_user_handle_by_account( user_state->account); env_presence_bitmask = monitor->presence_detected_bitmask & (UA_SENSOR_MOTION | UA_SENSOR_LIGHT); + filter_bitmask = + monitor->presence_bitmask_and | monitor->presence_bitmask_or; /** * Check whether user_handle present or not and also check @@ -317,12 +326,31 @@ static void __ua_monitor_send_user_presence_cb(ua_monitor_s *monitor, return; } + /** + * Filter the list of found_devices according to sensors mentioned in + * AND/OR conditions. + */ + for (l = user_state->found_devices; l; l = g_slist_next(l)) { + dev = (ua_dev_info_s *)l->data; + if(!dev) + continue; + + UA_DBG("device id [%s], dev type [%u]", dev->device_id, dev->type); + + dev_bitmask = _ua_dev_type_to_sensor(dev->type); + if (dev_bitmask & filter_bitmask) + devices = g_slist_prepend(devices, dev); + } + ((ua_presence_user_detected_cb)monitor->presence_user_cb.callback)( UA_ERROR_NONE, monitor, user_handle, - user_state->found_devices, + devices, monitor->presence_user_cb.user_data); user_state->cb_sent = TRUE; + + g_slist_free(devices); + FUNC_EXIT; return; } diff --git a/src/user-awareness-util.c b/src/user-awareness-util.c index d07ab50..3500a37 100644 --- a/src/user-awareness-util.c +++ b/src/user-awareness-util.c @@ -171,3 +171,21 @@ uam_tech_type_e _ua_to_uam_tech_type(ua_mac_type_e type) return UA_MAC_TYPE_INVALID; } } + +ua_sensor_e _ua_dev_type_to_sensor(ua_mac_type_e type) +{ + FUNC_ENTRY; + + switch (type) { + case UA_MAC_TYPE_BT: + return UA_SENSOR_BT; + case UA_MAC_TYPE_BLE: + return UA_SENSOR_BLE; + case UA_MAC_TYPE_WIFI: + return UA_SENSOR_WIFI; + default: + UA_WARN("Uncompatible to convert. Mac type [%u]", type); + return UA_SENSOR_MAX; + } + FUNC_EXIT; +} -- cgit v1.2.3