2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <service_app.h>
23 #include "st_things.h"
25 #include "resource/resource_infrared_motion_sensor.h"
26 #include "resource/resource_led.h"
27 #include "sensor-data.h"
29 #define JSON_NAME "device_def.json"
30 #define SENSOR_MOTION_URI "/capability/motionSensor/main/0"
31 #define SENSOR_MOTION_KEY "value"
32 #define SENSOR_LED_URI "/capability/switch/main/0"
33 #define SENSOR_LED_KEY "power"
34 #define SENSOR_LED_INIT "off"
41 typedef struct app_data_s {
42 Ecore_Timer *getter_motion;
43 sensor_data *motion_data;
44 sensor_data *led_data;
47 static app_data *g_ad = NULL;
49 static Eina_Bool control_sensors_cb(void *data)
53 /* Gets value from motion sensor */
54 int ret = resource_read_infrared_motion_sensor(46, &value);
55 if (ret != 0) _E("Cannot read sensor value");
57 sensor_data_set_bool(g_ad->motion_data, value);
58 _D("Detected motion value is: %d", value);
60 // Notify motion sensor change
61 st_things_notify_observers(SENSOR_MOTION_URI);
63 return ECORE_CALLBACK_RENEW;
66 static int __set_led_light(void *data, char *state) {
71 retv_if(!ad->led_data, -1);
73 if (0 == strcmp(state, LED_ON)) {
74 ret = resource_write_led(130, 1);
76 ret = resource_write_led(130, 0);
79 retv_if(ret != 0, -1);
81 // Set LED sensor data
82 sensor_data_set_string(ad->led_data, state, strlen(state));
84 // Log LED sensor value
85 _D("Set LED to %s", state);
87 // Notify LED sensor change
88 st_things_notify_observers(SENSOR_LED_URI);
93 void gathering_start(void *data)
98 if (ad->getter_motion)
99 ecore_timer_del(ad->getter_motion);
101 ad->getter_motion = ecore_timer_add(1.0f, control_sensors_cb, ad);
103 if (!ad->getter_motion) {
104 _E("Failed to add infrared motion getter timer");
110 static bool handle_reset_request(void)
112 _D("Received a request for RESET.");
116 static void handle_reset_result(bool result)
118 _D("Reset %s.\n", result ? "succeeded" : "failed");
121 static bool handle_ownership_transfer_request(void)
123 _D("Received a request for Ownership-transfer.");
127 static void handle_things_status_change(st_things_status_e things_status)
129 _D("Things status is changed: %d\n", things_status);
131 if (things_status == ST_THINGS_STATUS_REGISTERED_TO_CLOUD)
132 ecore_main_loop_thread_safe_call_async(gathering_start, g_ad);
135 static bool handle_get_request(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep)
137 _D("resource_uri [%s]", req_msg->resource_uri);
138 retv_if(!g_ad, false);
140 if (0 == strcmp(req_msg->resource_uri, SENSOR_MOTION_URI)) {
141 _D("query : %s, property: %s", req_msg->query, req_msg->property_key);
143 if (req_msg->has_property_key(req_msg, SENSOR_MOTION_KEY)) {
146 // Get Motion sensor data
147 sensor_data_get_bool(g_ad->motion_data, &value);
149 // Set Motion sensor value value for smart things representation
150 resp_rep->set_bool_value(resp_rep, SENSOR_MOTION_KEY, value);
152 _D("Value : %d", value);
156 } else if (0 == strcmp(req_msg->resource_uri, SENSOR_LED_URI)) {
157 _D("query : %s, property: %s", req_msg->query, req_msg->property_key);
159 if (req_msg->has_property_key(req_msg, SENSOR_LED_KEY)) {
160 // Set LED sensor data
161 const char *str = NULL;
163 // Get LED sensor data
164 sensor_data_get_string(g_ad->led_data, &str);
166 // Set initial value for LED data if data does not exist
168 str = SENSOR_LED_INIT;
171 // Set Motion sensor value value for smart things representation
172 resp_rep->set_str_value(resp_rep, SENSOR_LED_KEY, str);
174 _D("Power : %s", str);
179 _E("not supported uri");
183 static bool handle_set_request(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep)
185 _D("resource_uri [%s]", req_msg->resource_uri);
186 retv_if(!g_ad, false);
188 if (0 == strcmp(req_msg->resource_uri, SENSOR_LED_URI)) {
192 if (req_msg->rep->get_str_value(req_msg->rep, SENSOR_LED_KEY, &str)) {
193 retv_if(!str, false);
194 _D("set [%s:%s] == %s", SENSOR_LED_URI, SENSOR_LED_KEY, str);
196 // Set LED sensor data
197 sensor_data_set_string(g_ad->led_data, str, strlen(str));
199 // Set Motion sensor value value for smart things representation
200 resp_rep->set_str_value(resp_rep, SENSOR_LED_KEY, str);
202 // Turn on LED light with __set_led_light()
203 ret = __set_led_light(g_ad, strdup(str));
205 retv_if(ret != 0, false);
207 _E("cannot get a string value");
218 static int __things_init(void)
220 bool easysetup_complete = false;
221 char app_json_path[128] = {'\0', };
222 char *app_res_path = NULL;
223 char *app_data_path = NULL;
225 app_res_path = app_get_resource_path();
227 _E("app_res_path is NULL!!");
231 app_data_path = app_get_data_path();
232 if (!app_data_path) {
233 _E("app_data_path is NULL!!");
238 if (0 != st_things_set_configuration_prefix_path(app_res_path, app_data_path)) {
239 _E("st_things_set_configuration_prefix_path() failed!!");
246 snprintf(app_json_path, sizeof(app_json_path), "%s%s", app_res_path, JSON_NAME);
249 if (0 != st_things_initialize(app_json_path, &easysetup_complete)) {
250 _E("st_things_initialize() failed!!");
254 _D("easysetup_complete:[%d] ", easysetup_complete);
256 st_things_register_request_cb(handle_get_request, handle_set_request);
257 st_things_register_reset_cb(handle_reset_request, handle_reset_result);
258 st_things_register_user_confirm_cb(handle_ownership_transfer_request);
259 st_things_register_things_status_change_cb(handle_things_status_change);
264 static int __things_deinit(void)
266 st_things_deinitialize();
270 static int __things_start(void)
276 static int __things_stop(void)
282 static bool service_app_create(void *user_data)
284 app_data *ad = user_data;
286 // Declare new sensor data for Motion data
287 ad->motion_data = sensor_data_new(SENSOR_DATA_TYPE_BOOL);
288 if (!ad->motion_data)
291 // Declare new sensor data for LED data
292 ad->led_data = sensor_data_new(SENSOR_DATA_TYPE_STR);
296 // Initialize LED sensor data
297 sensor_data_set_string(g_ad->led_data, SENSOR_LED_INIT, strlen(SENSOR_LED_INIT));
305 static void service_app_control(app_control_h app_control, void *user_data)
310 static void service_app_terminate(void *user_data)
312 app_data *ad = (app_data *)user_data;
314 // Delete ecore timer
315 if (ad->getter_motion)
316 ecore_timer_del(ad->getter_motion);
318 // Stop and deinitialize things
322 // Turn off LED light with __set_led_light()
323 __set_led_light(ad, LED_OFF);
325 // Free sensor Motion & LED data
326 sensor_data_free(ad->motion_data);
327 sensor_data_free(ad->led_data);
329 // Close Motion and LED resources
330 resource_close_infrared_motion_sensor(46);
331 resource_close_led(130);
339 int main(int argc, char *argv[])
342 service_app_lifecycle_callback_s event_callback;
344 ad = calloc(1, sizeof(app_data));
349 event_callback.create = service_app_create;
350 event_callback.terminate = service_app_terminate;
351 event_callback.app_control = service_app_control;
353 return service_app_main(argc, argv, &event_callback, ad);