#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;
}
#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;
}
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");
#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)
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)
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)
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!!");
st_things_register_user_confirm_cb(handle_ownership_transfer_request);
st_things_register_things_status_change_cb(handle_things_status_change);
-
return 0;
}
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;
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);
}
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;