In detection_stopped event, consider when no environmental sensors exist
authorLokesh <l.kasana@samsung.com>
Mon, 11 Nov 2019 01:43:55 +0000 (07:13 +0530)
committersaerome.kim <saerome.kim@samsung.com>
Fri, 15 Nov 2019 09:32:07 +0000 (18:32 +0900)
1/ If there is no environmental sensor, send UAM_DETECTION_CYCLE_END only once.
2/ First update service->remaining_time, then start various detections.
3/ Environmental sensors may send detection_stopped before start_detection of
connectivity sensor, which results in multiple detection stopped events to CAPI
within a detection window.

Change-Id: I1c149fe8be8f3f86bf053ac8167df765948df72e
Signed-off-by: Lokesh <l.kasana@samsung.com>
include/ua-api.h
ua-daemon/src/ua-manager-core.c

index 0dc8f17..6d9b4a6 100644 (file)
@@ -450,8 +450,8 @@ typedef enum {
  * @since_tizen 5.5
  */
 typedef enum {
-       UAM_DETECTION_CYCLE_MID = 0x00, /**< Invaild state */
-       UAM_DETECTION_CYCLE_END, /**< Presence state */
+       UAM_DETECTION_CYCLE_MID = 0x00, /**< Ongoing detection cycle in mid */
+       UAM_DETECTION_CYCLE_END, /**< Detection cycle ends */
 } uam_cycle_state_e;
 
 /**
index 22a30cc..ac90f95 100644 (file)
@@ -1897,31 +1897,6 @@ static gboolean __start_detection(gpointer data)
 
        env_sensors = _uam_core_get_env_sensors();
        UAM_DBG("Envionmental sensors: 0x%8.8X", env_sensors);
-       if (0 != env_sensors) {
-               /* Stop PRESENCE detection on envionmental sensors*/
-               ret = _uam_pm_stop_detection(UAM_DETECT_PRESENCE, env_sensors);
-               if (UAM_ERROR_NONE != ret)
-                       UAM_ERR("Failed with error: %s (0x%4.4X)",
-                                       _uam_manager_error_to_str(ret), ret);
-
-               /* Stop ABSENCE detection on envionmental sensors*/
-               ret = _uam_pm_stop_detection(UAM_DETECT_ABSENCE, env_sensors);
-               if (UAM_ERROR_NONE != ret)
-                       UAM_ERR("Failed with error: %s (0x%4.4X)",
-                                       _uam_manager_error_to_str(ret), ret);
-
-               /* Always Start PRESENCE detection on envionmental sensors*/
-               ret = _uam_pm_start_detection(UAM_DETECT_PRESENCE, env_sensors);
-               if (UAM_ERROR_NONE != ret)
-                       UAM_ERR("Failed with error: %s (0x%4.4X)",
-                                       _uam_manager_error_to_str(ret), ret);
-
-               /* Always Start ABSENCE detection on envionmental sensors*/
-               ret = _uam_pm_start_detection(UAM_DETECT_ABSENCE, env_sensors);
-               if (UAM_ERROR_NONE != ret)
-                       UAM_ERR("Failed with error: %s (0x%4.4X)",
-                                       _uam_manager_error_to_str(ret), ret);
-       }
 
        for (l = services; NULL != l; l = g_slist_next(l)) {
                service = l->data;
@@ -1973,6 +1948,32 @@ static gboolean __start_detection(gpointer data)
        }
 
 done:
+       if (0 != env_sensors) {
+               /* Stop PRESENCE detection on envionmental sensors*/
+               ret = _uam_pm_stop_detection(UAM_DETECT_PRESENCE, env_sensors);
+               if (UAM_ERROR_NONE != ret)
+                       UAM_ERR("Failed with error: %s (0x%4.4X)",
+                                       _uam_manager_error_to_str(ret), ret);
+
+               /* Stop ABSENCE detection on envionmental sensors*/
+               ret = _uam_pm_stop_detection(UAM_DETECT_ABSENCE, env_sensors);
+               if (UAM_ERROR_NONE != ret)
+                       UAM_ERR("Failed with error: %s (0x%4.4X)",
+                                       _uam_manager_error_to_str(ret), ret);
+
+               /* Always Start PRESENCE detection on envionmental sensors*/
+               ret = _uam_pm_start_detection(UAM_DETECT_PRESENCE, env_sensors);
+               if (UAM_ERROR_NONE != ret)
+                       UAM_ERR("Failed with error: %s (0x%4.4X)",
+                                       _uam_manager_error_to_str(ret), ret);
+
+               /* Always Start ABSENCE detection on envionmental sensors*/
+               ret = _uam_pm_start_detection(UAM_DETECT_ABSENCE, env_sensors);
+               if (UAM_ERROR_NONE != ret)
+                       UAM_ERR("Failed with error: %s (0x%4.4X)",
+                                       _uam_manager_error_to_str(ret), ret);
+       }
+
        FUNC_EXIT;
        return TRUE;
 }
@@ -3217,10 +3218,15 @@ void _uam_core_handle_detection_stopped(unsigned int sensor)
                        if (!mon || !mon->name || !mon->service)
                                continue;
                        uam_db_service_info_t *service = mon->service;
-
-                       UAM_DBG("service->remaining_time: %d", service->remaining_time);
-                       cycle_state = (service->remaining_time <= UAM_DETECTION_CYCLE_MIN) ?
-                                       UAM_DETECTION_CYCLE_END : UAM_DETECTION_CYCLE_MID;
+                       cycle_state = UAM_DETECTION_CYCLE_END;
+
+                       UAM_DBG("[%s]->remaining_time: %d", service->name, service->remaining_time);
+                       if (!(mon->sensors & _uam_core_get_env_sensors())) {
+                               if (service->remaining_time < service->cycle)
+                                       return;
+                       } else if (service->remaining_time > UAM_DETECTION_CYCLE_MIN) {
+                               cycle_state = UAM_DETECTION_CYCLE_MID;
+                       }
 
                        _uam_manager_send_event(mon->name, UAM_EVENT_DETECTION_STOPPED,
                                        g_variant_new("(si)", service->name, cycle_state));