apply sensor data module
authorJeonghoon Park <jh1979.park@samsung.com>
Tue, 17 Jul 2018 06:39:34 +0000 (15:39 +0900)
committerJeonghoon Park <jh1979.park@samsung.com>
Tue, 17 Jul 2018 06:40:13 +0000 (15:40 +0900)
src/controller.c

index 32a7039..4a6dd9b 100644 (file)
@@ -23,9 +23,9 @@
 #include <Ecore.h>
 
 #include "st_things.h"
-#include "thing.h"
 #include "log.h"
 #include "resource.h"
+#include "sensor-data.h"
 
 //#define TEST_RANDOM_VAL_GEN
 
 #define SENSOR_URI_CO2 "/capability/airQualitySensor/main/0"
 #define SENSOR_KEY_CO2 "airQuality"
 #define SENSOR_KEY_RANGE "range"
-#define SENSOR_CH_CO2 (1)
 
-#define SENSOR_THRESHOLD_CO2 (500)
+#define SENSOR_CH_CO2 (0)
+#define SENSOR_THRESHOLD_CO2 (650)
 
-//#define USE_ST_SDK
+#define SENSOR_GATHER_INTERVAL (0.05f)
+#define SENSOR_GATHER_COUNT (5)
+
+#define USE_ST_SDK
 
 typedef struct app_data_s {
        Ecore_Timer *getter_co2;
-       unsigned int co2_val;
-       pthread_mutex_t mutex;
+       sensor_data *co2_data;
 } app_data;
 
 static app_data *g_ad = NULL;
@@ -66,34 +68,62 @@ static int rand_resource_read_co2_sensor(unsigned int *out_value)
 }
 #endif
 
+static int read_co2_sensor(unsigned int *out_value)
+{
+       int ret = 0;
+       retv_if(!out_value, -1);
+
+#ifdef TEST_RANDOM_VAL_GEN
+       ret = rand_resource_read_co2_sensor(out_value);
+#else /* TEST_RANDOM_VAL_GEN */
+       ret = resource_read_co2_sensor(SENSOR_CH_CO2, out_value);
+#endif /* TEST_RANDOM_VAL_GEN */
+
+       return ret;
+}
 
 static Eina_Bool __get_co2(void *data)
 {
-
        int ret = 0;
        unsigned int value = 0;
+       static unsigned int sum = 0;
+       static unsigned int count = 0;
 
        app_data *ad = data;
 
-       retv_if(!ad, false);
+       if (!ad) {
+               _E("failed to get app_data");
+               service_app_exit();
+       }
 
-#ifdef TEST_RANDOM_VAL_GEN
-       ret = rand_resource_read_co2_sensor(&value);
-#else /* TEST_RANDOM_VAL_GEN */
-       ret = resource_read_co2_sensor(SENSOR_CH_CO2, &value);
-#endif /* TEST_RANDOM_VAL_GEN */
+       if (!ad->co2_data) {
+               _E("failed to get co2_data");
+               service_app_exit();
+       }
+
+       ret = read_co2_sensor(&value);
        retv_if(ret != 0, ECORE_CALLBACK_RENEW);
 
-       _D("co2 value - %u", value);
+       count++;
+       sum += value;
 
-       pthread_mutex_lock(&ad->mutex);
-       ad->co2_val = value;
-       pthread_mutex_unlock(&ad->mutex);
+       if (count == SENSOR_GATHER_COUNT) {
+               unsigned int avg = 0;
+               avg = sum/SENSOR_GATHER_COUNT;
 
-#ifdef USE_ST_SDK
-       if (value >= SENSOR_THRESHOLD_CO2)
-               st_things_notify_observers(SENSOR_URI_CO2);
-#endif
+               _D("co2 avg value - %u", avg);
+
+               sensor_data_set_uint(ad->co2_data, avg);
+
+               if (avg <= SENSOR_THRESHOLD_CO2) {
+       #ifdef USE_ST_SDK
+                       st_things_notify_observers(SENSOR_URI_CO2);
+       #endif
+               }
+
+               count = 0;
+               sum = 0;
+       }
 
        return ECORE_CALLBACK_RENEW;
 }
@@ -101,8 +131,12 @@ static Eina_Bool __get_co2(void *data)
 void gathering_start(void *data)
 {
        app_data *ad = data;
+       ret_if(!ad);
 
-       ad->getter_co2 = ecore_timer_add(1.0f, __get_co2, ad);
+       if (ad->getter_co2)
+               ecore_timer_del(ad->getter_co2);
+
+       ad->getter_co2 = ecore_timer_add(SENSOR_GATHER_INTERVAL, __get_co2, ad);
        if (!ad->getter_co2)
                _E("Failed to add getter_co2");
 
@@ -112,8 +146,8 @@ void gathering_start(void *data)
 #ifdef USE_ST_SDK
 static bool handle_reset_request(void)
 {
-    _D("Received a request for RESET.");
-    return false;
+       _D("Received a request for RESET.");
+       return false;
 }
 
 static void handle_reset_result(bool result)
@@ -124,7 +158,7 @@ static void handle_reset_result(bool result)
 static bool handle_ownership_transfer_request(void)
 {
        _D("Received a request for Ownership-transfer.");
-    return true;
+       return true;
 }
 
 static void handle_things_status_change(st_things_status_e things_status)
@@ -141,21 +175,19 @@ static bool handle_get_request(st_things_get_request_message_s* req_msg, st_thin
        retv_if(!g_ad, false);
 
        if (0 == strcmp(req_msg->resource_uri, SENSOR_URI_CO2)) {
-        if (req_msg->has_property_key(req_msg, SENSOR_KEY_CO2)) {
-               unsigned int value = 0;
-               pthread_mutex_lock(&ad->mutex);
-               value = ad->co2_val;
-               pthread_mutex_unlock(&ad->mutex);
-               resp_rep->set_int_value(resp_rep, SENSOR_KEY_CO2, value);
-        }
-        if (req_msg->has_property_key(req_msg, SENSOR_KEY_RANGE)) {
-               double range[2] = { 0.0, 1024.0 };
-               resp_rep->set_double_array_value(resp_rep, SENSOR_KEY_RANGE, &range, 2);
-        }
-        return true;
-    }
-    _E("not supported uri");
-    return false;
+               if (req_msg->has_property_key(req_msg, SENSOR_KEY_CO2)) {
+                       unsigned int value = 0;
+                       sensor_data_get_uint(g_ad->co2_data, &value);
+                       resp_rep->set_int_value(resp_rep, SENSOR_KEY_CO2, value);
+               }
+               if (req_msg->has_property_key(req_msg, SENSOR_KEY_RANGE)) {
+                       const double range[2] = { 0.0, 1024.0 };
+                       resp_rep->set_double_array_value(resp_rep, SENSOR_KEY_RANGE, range, 2);
+               }
+               return true;
+       }
+       _E("not supported uri");
+       return false;
 }
 
 static bool handle_set_request(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep)
@@ -184,7 +216,7 @@ static int __things_init(void)
                return -1;
        }
 
-       snprintf(app_json_path, sizeof(app_json_path), "%s/%s", app_res_path, JSON_PATH);
+       snprintf(app_json_path, sizeof(app_json_path), "%s%s", app_res_path, JSON_PATH);
 
        if (0 != st_things_set_configuration_prefix_path(app_res_path, app_data_path)) {
                _E("st_things_set_configuration_prefix_path() failed!!");
@@ -208,7 +240,6 @@ static int __things_init(void)
        st_things_register_user_confirm_cb(handle_ownership_transfer_request);
        st_things_register_things_status_change_cb(handle_things_status_change);
 
-
        return 0;
 }
 
@@ -233,8 +264,13 @@ static int __things_stop(void)
 
 static bool service_app_create(void *user_data)
 {
+       app_data *ad = (app_data *)user_data;
        FN_CALL;
 
+       ad->co2_data = sensor_data_new(SENSOR_DATA_TYPE_UINT);
+       if (!ad->co2_data)
+               return false;
+
 #ifdef USE_ST_SDK
        if (__things_init())
                return false;
@@ -265,13 +301,13 @@ static void service_app_terminate(void *user_data)
        if (ad->getter_co2)
                ecore_timer_del(ad->getter_co2);
 
-       resource_close_all();
-
 #ifdef USE_ST_SDK
        __things_stop();
        __things_deinit();
 #endif
 
+       sensor_data_free(ad->co2_data);
+       resource_close_all();
        free(ad);
 }
 
@@ -285,7 +321,6 @@ int main(int argc, char *argv[])
        ad = calloc(1, sizeof(app_data));
        retv_if(!ad, -1);
 
-       pthread_mutex_init(&ad->mutex, NULL);
        g_ad = ad;
 
        event_callback.create = service_app_create;