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"
36 #define SENSORING_TIME_INTERVAL (1.0f)
37 #define SENSOR_MOTION_PIN_NUM (46)
38 #define SENSOR_LED_PIN_NUM (130)
45 typedef struct app_data_s {
46 Ecore_Timer *getter_motion;
47 sensor_data *motion_data;
48 sensor_data *led_data;
51 static app_data *g_ad = NULL;
53 static Eina_Bool control_sensors_cb(void *data)
57 /* Gets value from motion sensor */
58 int ret = resource_read_infrared_motion_sensor(SENSOR_MOTION_PIN_NUM, &value);
59 if (ret != 0) _E("Cannot read sensor value");
61 sensor_data_set_bool(g_ad->motion_data, value);
62 _D("Detected motion value is: %d", value);
65 st_things_notify_observers(SENSOR_MOTION_URI);
68 return ECORE_CALLBACK_RENEW;
71 static int __set_led_light(void *data, char *state) {
76 retv_if(!ad->led_data, -1);
78 if (0 == strcmp(state, LED_ON)) {
79 ret = resource_write_led(SENSOR_LED_PIN_NUM, 1);
81 ret = resource_write_led(SENSOR_LED_PIN_NUM, 0);
84 retv_if(ret != 0, -1);
86 sensor_data_set_string(ad->led_data, state, strlen(state));
87 _D("Set LED to %s", state);
90 st_things_notify_observers(SENSOR_LED_URI);
96 void gathering_start(void *data)
101 if (ad->getter_motion)
102 ecore_timer_del(ad->getter_motion);
104 ad->getter_motion = ecore_timer_add(SENSORING_TIME_INTERVAL, control_sensors_cb, ad);
106 if (!ad->getter_motion) {
107 _E("Failed to add infrared motion getter timer");
114 static bool handle_reset_request(void)
116 _D("Received a request for RESET.");
120 static void handle_reset_result(bool result)
122 _D("Reset %s.\n", result ? "succeeded" : "failed");
125 static bool handle_ownership_transfer_request(void)
127 _D("Received a request for Ownership-transfer.");
131 static void handle_things_status_change(st_things_status_e things_status)
133 _D("Things status is changed: %d\n", things_status);
135 if (things_status == ST_THINGS_STATUS_REGISTERED_TO_CLOUD)
136 ecore_main_loop_thread_safe_call_async(gathering_start, g_ad);
139 static bool handle_get_request(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep)
141 _D("resource_uri [%s]", req_msg->resource_uri);
142 retv_if(!g_ad, false);
144 if (0 == strcmp(req_msg->resource_uri, SENSOR_MOTION_URI)) {
145 _D("query : %s, property: %s", req_msg->query, req_msg->property_key);
147 if (req_msg->has_property_key(req_msg, SENSOR_MOTION_KEY)) {
149 sensor_data_get_bool(g_ad->motion_data, &value);
150 _D("Value : %d", value);
151 resp_rep->set_bool_value(resp_rep, SENSOR_MOTION_KEY, value);
155 } else if (0 == strcmp(req_msg->resource_uri, SENSOR_LED_URI)) {
156 _D("query : %s, property: %s", req_msg->query, req_msg->property_key);
158 if (req_msg->has_property_key(req_msg, SENSOR_LED_KEY)) {
159 const char *str = NULL;
160 sensor_data_get_string(g_ad->led_data, &str);
162 str = SENSOR_LED_INIT;
164 resp_rep->set_str_value(resp_rep, SENSOR_LED_KEY, str);
165 _D("Power : %s", str);
170 _E("not supported uri");
174 static bool handle_set_request(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep)
176 _D("resource_uri [%s]", req_msg->resource_uri);
177 retv_if(!g_ad, false);
179 if (0 == strcmp(req_msg->resource_uri, SENSOR_LED_URI)) {
183 if (req_msg->rep->get_str_value(req_msg->rep, SENSOR_LED_KEY, &str)) {
184 retv_if(!str, false);
185 _D("set [%s:%s] == %s", SENSOR_LED_URI, SENSOR_LED_KEY, str);
187 sensor_data_set_string(g_ad->led_data, str, strlen(str));
188 resp_rep->set_str_value(resp_rep, SENSOR_LED_KEY, str);
189 ret = __set_led_light(g_ad, strdup(str));
191 retv_if(ret != 0, false);
193 _E("cannot get a string value");
204 static int __things_init(void)
206 bool easysetup_complete = false;
207 char app_json_path[128] = {'\0', };
208 char *app_res_path = NULL;
209 char *app_data_path = NULL;
211 app_res_path = app_get_resource_path();
213 _E("app_res_path is NULL!!");
217 app_data_path = app_get_data_path();
218 if (!app_data_path) {
219 _E("app_data_path is NULL!!");
224 if (0 != st_things_set_configuration_prefix_path(app_res_path, app_data_path)) {
225 _E("st_things_set_configuration_prefix_path() failed!!");
232 snprintf(app_json_path, sizeof(app_json_path), "%s%s", app_res_path, JSON_NAME);
235 if (0 != st_things_initialize(app_json_path, &easysetup_complete)) {
236 _E("st_things_initialize() failed!!");
240 _D("easysetup_complete:[%d] ", easysetup_complete);
242 st_things_register_request_cb(handle_get_request, handle_set_request);
243 st_things_register_reset_cb(handle_reset_request, handle_reset_result);
244 st_things_register_user_confirm_cb(handle_ownership_transfer_request);
245 st_things_register_things_status_change_cb(handle_things_status_change);
250 static int __things_deinit(void)
252 st_things_deinitialize();
256 static int __things_start(void)
262 static int __things_stop(void)
267 #endif /* USE_ST_SDK */
269 static bool service_app_create(void *user_data)
271 app_data *ad = user_data;
273 ad->motion_data = sensor_data_new(SENSOR_DATA_TYPE_BOOL);
274 if (!ad->motion_data)
277 ad->led_data = sensor_data_new(SENSOR_DATA_TYPE_STR);
281 sensor_data_set_string(g_ad->led_data, SENSOR_LED_INIT, strlen(SENSOR_LED_INIT));
291 static void service_app_control(app_control_h app_control, void *user_data)
296 gathering_start(user_data);
300 static void service_app_terminate(void *user_data)
302 app_data *ad = (app_data *)user_data;
304 if (ad->getter_motion)
305 ecore_timer_del(ad->getter_motion);
312 __set_led_light(ad, LED_OFF);
314 sensor_data_free(ad->motion_data);
315 sensor_data_free(ad->led_data);
317 resource_close_infrared_motion_sensor(SENSOR_MOTION_PIN_NUM);
318 resource_close_led(SENSOR_LED_PIN_NUM);
325 int main(int argc, char *argv[])
328 service_app_lifecycle_callback_s event_callback;
330 ad = calloc(1, sizeof(app_data));
335 event_callback.create = service_app_create;
336 event_callback.terminate = service_app_terminate;
337 event_callback.app_control = service_app_control;
339 return service_app_main(argc, argv, &event_callback, ad);