1 /* ****************************************************************
3 * Copyright 2017 Samsung Electronics All Rights Reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 ******************************************************************/
20 #include <service_app.h>
25 #include "st_things.h"
27 #include "sensor-data.h"
28 #include "co2-sensor.h"
30 //#define TEST_RANDOM_VAL_GEN
31 #ifdef TEST_RANDOM_VAL_GEN
34 #define RAND_VAL_MIN 0
35 #define RAND_VAL_MAX_CO2 1023
36 #endif /* TEST_RANDOM_VAL_GEN */
38 #define JSON_NAME "device_def.json"
39 #define SENSOR_URI_CO2 "/capability/airQualitySensor/main/0"
40 #define SENSOR_KEY_CO2 "airQuality"
41 #define SENSOR_KEY_RANGE "range"
43 #define SENSOR_CH_CO2 (0)
44 #define SENSOR_THRESHOLD_CO2 (650)
46 #define SENSOR_GATHER_INTERVAL (0.05f)
47 #define SENSOR_GATHER_COUNT (60)
51 typedef struct app_data_s {
52 Ecore_Timer *getter_co2;
53 sensor_data *co2_data;
56 static app_data *g_ad = NULL;
58 #ifdef TEST_RANDOM_VAL_GEN
59 static int rand_read_co2_sensor(unsigned int *out_value)
63 val = RAND_VAL_MIN + rand() / (RAND_MAX / (RAND_VAL_MAX_CO2 - RAND_VAL_MIN + 1) + 1);
70 static int read_sensor(unsigned int *out_value)
73 retv_if(!out_value, -1);
75 #ifdef TEST_RANDOM_VAL_GEN
76 ret = rand_read_co2_sensor(out_value);
77 #else /* TEST_RANDOM_VAL_GEN */
78 ret = co2_sensor_read(SENSOR_CH_CO2, out_value);
79 #endif /* TEST_RANDOM_VAL_GEN */
84 static Eina_Bool __get_co2(void *data)
87 unsigned int value = 0;
88 static unsigned int sum = 0;
89 static unsigned int count = 0;
94 _E("failed to get app_data");
99 _E("failed to get co2_data");
103 ret = read_sensor(&value);
104 retv_if(ret != 0, ECORE_CALLBACK_RENEW);
109 if (count == SENSOR_GATHER_COUNT) {
110 unsigned int avg = 0;
111 avg = sum/SENSOR_GATHER_COUNT;
113 _D("co2 avg - [%u], [%u ppm]", avg, co2_sensor_value_to_ppm(avg));
115 sensor_data_set_uint(ad->co2_data, avg);
117 if (avg <= SENSOR_THRESHOLD_CO2) {
119 st_things_notify_observers(SENSOR_URI_CO2);
127 return ECORE_CALLBACK_RENEW;
130 void gathering_start(void *data)
136 ecore_timer_del(ad->getter_co2);
138 ad->getter_co2 = ecore_timer_add(SENSOR_GATHER_INTERVAL, __get_co2, ad);
140 _E("Failed to add getter_co2");
146 static bool handle_reset_request(void)
148 _D("Received a request for RESET.");
152 static void handle_reset_result(bool result)
154 _D("Reset %s.\n", result ? "succeeded" : "failed");
157 static bool handle_ownership_transfer_request(void)
159 _D("Received a request for Ownership-transfer.");
163 static void handle_things_status_change(st_things_status_e things_status)
165 _D("Things status is changed: %d\n", things_status);
167 if (things_status == ST_THINGS_STATUS_REGISTERED_TO_CLOUD)
168 ecore_main_loop_thread_safe_call_async(gathering_start, g_ad);
171 static bool handle_get_request(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep)
173 _D("resource_uri [%s]", req_msg->resource_uri);
174 retv_if(!g_ad, false);
176 if (0 == strcmp(req_msg->resource_uri, SENSOR_URI_CO2)) {
177 _D("query : %s, property: %s", req_msg->query, req_msg->property_key);
179 if (req_msg->has_property_key(req_msg, SENSOR_KEY_CO2)) {
180 unsigned int value = 0;
181 sensor_data_get_uint(g_ad->co2_data, &value);
182 resp_rep->set_int_value(resp_rep, SENSOR_KEY_CO2, value);
184 if (req_msg->has_property_key(req_msg, SENSOR_KEY_RANGE)) {
185 const double range[2] = { 0.0, 1024.0 };
186 resp_rep->set_double_array_value(resp_rep, SENSOR_KEY_RANGE, range, 2);
190 _E("not supported uri");
194 static bool handle_set_request(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep)
196 _D("resource_uri [%s]", req_msg->resource_uri);
200 static int __things_init(void)
202 bool easysetup_complete = false;
203 char app_json_path[128] = {'\0', };
204 char *app_res_path = NULL;
205 char *app_data_path = NULL;
207 app_res_path = app_get_resource_path();
209 _E("app_res_path is NULL!!");
213 app_data_path = app_get_data_path();
214 if (!app_data_path) {
215 _E("app_data_path is NULL!!");
220 if (0 != st_things_set_configuration_prefix_path(app_res_path, app_data_path)) {
221 _E("st_things_set_configuration_prefix_path() failed!!");
228 snprintf(app_json_path, sizeof(app_json_path), "%s%s", app_res_path, JSON_NAME);
231 if (0 != st_things_initialize(app_json_path, &easysetup_complete)) {
232 _E("st_things_initialize() failed!!");
236 _D("easysetup_complete:[%d] ", easysetup_complete);
238 st_things_register_request_cb(handle_get_request, handle_set_request);
239 st_things_register_reset_cb(handle_reset_request, handle_reset_result);
240 st_things_register_user_confirm_cb(handle_ownership_transfer_request);
241 st_things_register_things_status_change_cb(handle_things_status_change);
246 static int __things_deinit(void)
248 st_things_deinitialize();
252 static int __things_start(void)
258 static int __things_stop(void)
263 #endif /* USE_ST_SDK */
265 static bool service_app_create(void *user_data)
267 app_data *ad = (app_data *)user_data;
269 ad->co2_data = sensor_data_new(SENSOR_DATA_TYPE_UINT);
281 static void service_app_control(app_control_h app_control, void *user_data)
286 gathering_start(user_data);
290 static void service_app_terminate(void *user_data)
292 app_data *ad = (app_data *)user_data;
295 ecore_timer_del(ad->getter_co2);
302 sensor_data_free(ad->co2_data);
309 int main(int argc, char *argv[])
312 service_app_lifecycle_callback_s event_callback;
314 ad = calloc(1, sizeof(app_data));
319 event_callback.create = service_app_create;
320 event_callback.terminate = service_app_terminate;
321 event_callback.app_control = service_app_control;
323 return service_app_main(argc, argv, &event_callback, ad);