From 96b942dd26500fd12c61b1597185c6a44180fd78 Mon Sep 17 00:00:00 2001 From: Boyeon Date: Fri, 23 Aug 2019 20:34:04 +0900 Subject: Add two projects in master repository Change-Id: If7464555bb65cb0504597c3ac327c335a2fbaf7c --- src/controller.c | 645 ------------------------- src/resource/resource_infrared_motion_sensor.c | 66 --- src/resource/resource_led.c | 68 --- 3 files changed, 779 deletions(-) delete mode 100755 src/controller.c delete mode 100755 src/resource/resource_infrared_motion_sensor.c delete mode 100755 src/resource/resource_led.c (limited to 'src') diff --git a/src/controller.c b/src/controller.c deleted file mode 100755 index b8d8985..0000000 --- a/src/controller.c +++ /dev/null @@ -1,645 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include -#include - -#include "log.h" -#include "resource/resource_infrared_motion_sensor.h" -#include "resource/resource_led.h" - -// Timer duration -#define TIMER_GATHER_INTERVAL (5.0f) - -// Motion sensor information -#define SENSOR_MOTION_GPIO_NUMBER (46) - -// LED sensor information -#define SENSOR_LED_GPIO_NUMBER (130) -#define SENSOR_LED_ON "on" -#define SENSOR_LED_OFF "off" - -// For using SmartThings SDK -#define USE_ST_SDK -#ifdef USE_ST_SDK -#include "smartthings.h" -#include "smartthings_resource.h" -#include "smartthings_payload.h" - -// Certification file and private key file stored in the resource directory -#define CERT_FILE "certificate.pem" -#define PRIV_FILE "privatekey.der" - -// URI and key information -#define SENSOR_MOTION_URI "/capability/motionSensor/main/0" -#define SENSOR_MOTION_KEY "value" -#define SENSOR_LED_URI "/capability/switch/main/0" -#define SENSOR_LED_KEY "power" -#endif /* USE_ST_SDK */ - -typedef struct app_data_s { - Ecore_Timer *getter_timer; - uint32_t motion_data; - int led_data; -#ifdef USE_ST_SDK - smartthings_h st_master_h; - smartthings_resource_h st_res_h; - smartthings_status_e status; -#endif /* USE_ST_SDK */ -} app_data; - -static app_data *g_ad = NULL; - -#ifdef USE_ST_SDK -static const char * _resource_error_to_str(smartthings_resource_error_e error) -{ - const char *err_str = NULL; - - switch (error) { - case SMARTTHINGS_RESOURCE_ERROR_NONE: - err_str = "SMARTTHINGS_RESOURCE_ERROR_NONE"; - break; - case SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER: - err_str = "SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER"; - break; - case SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY: - err_str = "SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY"; - break; - case SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED: - err_str = "SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED"; - break; - case SMARTTHINGS_RESOURCE_ERROR_NO_DATA: - err_str = "SMARTTHINGS_RESOURCE_ERROR_NO_DATA"; - break; - case SMARTTHINGS_RESOURCE_ERROR_NOT_SUPPORTED: - err_str = "SMARTTHINGS_RESOURCE_ERROR_NOT_SUPPORTED"; - break; - case SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED: - err_str = "SMARTTHINGS_RESOURCE_ERROR_NOT_SUPPORTED"; - break; - case SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE: - err_str = "SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE"; - break; - default: - err_str = "Unknown error"; - break; - } - - return err_str; -} -#endif - -static Eina_Bool _get_motion_sensor_data(void *user_data) -{ - int ret = 0; - uint32_t value = 0; - app_data *ad = user_data; - - if (!ad) { - _E("failed to get app_data"); - return ECORE_CALLBACK_CANCEL; - } - - ret = resource_read_infrared_motion_sensor(SENSOR_MOTION_GPIO_NUMBER, &value); - if (ret != 0) { - _E("cannot read data from the infrared motion sensor"); - return ECORE_CALLBACK_CANCEL; - } - ad->motion_data = value; - - _D("Detected motion value is: %u", value); - -#ifdef USE_ST_SDK - int error = SMARTTHINGS_RESOURCE_ERROR_NONE; - smartthings_payload_h resp_payload = NULL; - - if (ad->status != SMARTTHINGS_STATUS_REGISTERED_TO_CLOUD) - return ECORE_CALLBACK_RENEW; - - error = smartthings_payload_create(&resp_payload); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE || !resp_payload) { - _E("smartthings_payload_create() failed, [%s]", - _resource_error_to_str(error)); - return ECORE_CALLBACK_CANCEL; - } - - error = smartthings_payload_set_bool(resp_payload, SENSOR_MOTION_KEY, (bool)ad->motion_data); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) - _E("smartthings_payload_set_bool() failed, [%s]", - _resource_error_to_str(error)); - - error = smartthings_resource_notify(ad->st_res_h, SENSOR_MOTION_URI, resp_payload); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) - _E("smartthings_resource_notify() failed, [%s]", - _resource_error_to_str(error)); - - if (smartthings_payload_destroy(resp_payload)) - _E("smartthings_payload_destroy() failed"); -#endif - - return ECORE_CALLBACK_RENEW; -} - -static int _set_led_data(app_data *ad, int state) { - int ret = 0; - - ad->led_data = state; - ret = resource_write_led(SENSOR_LED_GPIO_NUMBER, state); - if (ret != 0) { - _E("cannot write led data"); - return -1; - } - _I("LED : %d",state); - - return 0; -} - -#ifdef USE_ST_SDK -/* SmartThings resource functions */ -static bool _handle_get_motion(smartthings_payload_h resp_payload, void *user_data) -{ - int error = SMARTTHINGS_RESOURCE_ERROR_NONE; - app_data *ad = user_data; - - retv_if(!ad, false); - - _D("Received a GET request for MOTION"); - - error = smartthings_payload_set_bool(resp_payload, SENSOR_MOTION_KEY, (bool)ad->motion_data); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) - _E("smartthings_payload_set_bool() failed, [%s]", - _resource_error_to_str(error)); - - return true; -} - -static bool _handle_get_led(smartthings_payload_h resp_payload, void *user_data) -{ - app_data *ad = user_data; - int error = SMARTTHINGS_RESOURCE_ERROR_NONE; - char *str = NULL; - - retv_if(!ad, false); - - _D("Received a GET request for LED"); - - if (ad->led_data) - str = SENSOR_LED_ON; - else - str = SENSOR_LED_OFF; - - error = smartthings_payload_set_string(resp_payload, SENSOR_LED_KEY, str); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) - _E("smartthings_payload_set_string() failed, [%s]", - _resource_error_to_str(error)); - - _D("Power : %s", str); - - return true; -} - -static bool _handle_set_led(smartthings_payload_h payload, smartthings_payload_h resp_payload, void *user_data) -{ - app_data *ad = user_data; - char *str = NULL; - char *res_str = NULL; - int ret = 0; - int error = SMARTTHINGS_RESOURCE_ERROR_NONE; - - retv_if(!ad, false); - - _D("Received a SET request"); - - error = smartthings_payload_get_string(payload, SENSOR_LED_KEY, &str); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) - _E("smartthings_payload_get_string() failed, [%s]", - _resource_error_to_str(error)); - - if (strncmp(str, SENSOR_LED_ON, strlen(SENSOR_LED_ON))) { - ret = _set_led_data(ad, 0); - res_str = SENSOR_LED_OFF; - } else { - ret = _set_led_data(ad, 1); - res_str = SENSOR_LED_ON; - } - - free(str); - if (ret != 0) { - _E("cannot set LED"); - return false; - } - - error = smartthings_payload_set_string(resp_payload, SENSOR_LED_KEY, res_str); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) - _E("smartthings_payload_set_string() failed, [%s]", - _resource_error_to_str(error)); - - return true; -} - -static void _request_cb(smartthings_resource_h handle, int req_id, - const char *uri, smartthings_resource_req_type_e req_type, - smartthings_payload_h payload, void *user_data) -{ - smartthings_payload_h resp_payload = NULL; - bool result = false; - int error = SMARTTHINGS_RESOURCE_ERROR_NONE; - - _D("request on %s, type[%d], id[%d]", uri, req_type, req_id); - - error = smartthings_payload_create(&resp_payload); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE || ! resp_payload) - _E("smartthings_payload_create() failed, [%s]", - _resource_error_to_str(error)); - - if (req_type == SMARTTHINGS_RESOURCE_REQUEST_GET) { - if (!strncmp(uri, SENSOR_MOTION_URI, strlen(SENSOR_MOTION_URI))) - result = _handle_get_motion(resp_payload, user_data); - else if (!strncmp(uri, SENSOR_LED_URI, strlen(SENSOR_LED_URI))) - result = _handle_get_led(resp_payload, user_data); - else - _E("No matching Resource uri to get"); - } else if (req_type == SMARTTHINGS_RESOURCE_REQUEST_SET) { - if (!strncmp(uri, SENSOR_LED_URI, strlen(SENSOR_LED_URI))) - result = _handle_set_led(payload, resp_payload, user_data); - else - _E("No matching Resource uri to get"); - } else { - _E("Invalid request type - %d", req_type); - smartthings_payload_destroy(resp_payload); - return; - } - - error = smartthings_resource_send_response(handle, req_id, uri, resp_payload, result); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { - _E("smartthings_resource_send_response() failed, [%s]", - _resource_error_to_str(error)); - smartthings_payload_destroy(resp_payload); - return; - } - - if (req_type == SMARTTHINGS_RESOURCE_REQUEST_SET) { - error = smartthings_resource_notify(handle, uri, resp_payload); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) - _E("smartthings_resource_notify() failed, [%s]", - _resource_error_to_str(error)); - } - - if (smartthings_payload_destroy(resp_payload)) - _E("smartthings_payload_destroy() failed"); - - return; -} - -static void _resource_connection_status_cb( - smartthings_resource_h handle, - smartthings_resource_connection_status_e status, void *user_data) -{ - app_data *ad = user_data; - - _D("status=[%d]", status); - - ret_if(!ad); - - if (status == SMARTTHINGS_RESOURCE_CONNECTION_STATUS_CONNECTED) { - int error = SMARTTHINGS_RESOURCE_ERROR_NONE; - error = smartthings_resource_set_request_cb(handle, _request_cb, ad); - if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { - _E("smartthings_resource_set_request_cb() is failed"); - return; - } - } else { - _E("connection failed"); - } -} - -static int _init_resource(app_data *ad) -{ - smartthings_resource_h st_res_h = NULL; - int error = 0; - - retv_if(!ad, -1); - if (ad->st_res_h) { - _I("Already initialized!"); - return 0; - } - - error = smartthings_resource_initialize(&st_res_h, - _resource_connection_status_cb, ad); - if (error) { - _E("smartthings_resource_initialize() is failed, [%s]", - _resource_error_to_str(error)); - return -1; - } - - ad->st_res_h = st_res_h; - - return 0; -} - -static int _fini_resource(app_data *ad) -{ - retv_if(!ad, -1); - - if (!ad->st_res_h) - return 0; - - smartthings_resource_unset_request_cb(ad->st_res_h); - smartthings_resource_deinitialize(ad->st_res_h); - - ad->st_res_h = NULL; - - return 0; -} - -/* SmartThings master functions */ -static const char *__master_error_to_str(smartthings_error_e error) -{ - const char *err_str = NULL; - - switch (error) { - case SMARTTHINGS_ERROR_NONE: - err_str = "SMARTTHINGS_ERROR_NONE"; - break; - case SMARTTHINGS_ERROR_INVALID_PARAMETER: - err_str = "SMARTTHINGS_ERROR_INVALID_PARAMETER"; - break; - case SMARTTHINGS_ERROR_OUT_OF_MEMORY: - err_str = "SMARTTHINGS_ERROR_OUT_OF_MEMORY"; - break; - case SMARTTHINGS_ERROR_PERMISSION_DENIED: - err_str = "SMARTTHINGS_ERROR_PERMISSION_DENIED"; - break; - case SMARTTHINGS_ERROR_NO_DATA: - err_str = "SMARTTHINGS_ERROR_NO_DATA"; - break; - case SMARTTHINGS_ERROR_NOT_SUPPORTED: - err_str = "SMARTTHINGS_ERROR_NOT_SUPPORTED"; - break; - case SMARTTHINGS_ERROR_OPERATION_FAILED: - err_str = "SMARTTHINGS_ERROR_OPERATION_FAILED"; - break; - case SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE: - err_str = "SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE"; - break; - default: - err_str = "Unknown error"; - break; - } - - return err_str; -} - -static void _user_confirm_cb(smartthings_h handle, void *user_data) -{ - if (smartthings_send_user_confirm(handle, true) != 0) - _E("smartthings_send_user_confirm() is failed"); -} - -static void _reset_confirm_cb(smartthings_h handle, void *user_data) -{ - if (smartthings_send_reset_confirm(handle, true) != 0) - _E("smartthings_send_reset_confirm() is failed"); -} - -static void _reset_result_cb(smartthings_h handle, bool result, void *user_data) -{ - _I("reset result = [%d]", result); -} - -static void _thing_status_cb( - smartthings_h handle, smartthings_status_e status, void *user_data) -{ - app_data *ad = user_data; - _D("status: [%d]", status); - ad->status = status; -} - -static void _things_connection_status_cb( - smartthings_h handle, smartthings_connection_status_e status, - void *user_data) -{ - _D("status = [%d]", status); - - if (status == SMARTTHINGS_CONNECTION_STATUS_CONNECTED) { - int err = 0; - bool is_es_completed = false; - const char* dev_name = "motion-light-app"; - int wifi_mode = SMARTTHINGS_WIFI_MODE_11B - | SMARTTHINGS_WIFI_MODE_11G - | SMARTTHINGS_WIFI_MODE_11N; - - int wifi_freq = SMARTTHINGS_WIFI_FREQ_24G | SMARTTHINGS_WIFI_FREQ_5G; - - err = smartthings_set_device_property( - handle, dev_name, wifi_mode, wifi_freq); - if (err) { - _E("smartthings_set_device_property() is failed, [%s]", - __master_error_to_str(err)); - return; - } - - err = smartthings_set_certificate_file(handle, CERT_FILE, PRIV_FILE); - if (err) { - _E("smartthings_set_certificate_file() is failed, [%s]", - __master_error_to_str(err)); - return; - } - - err = smartthings_set_user_confirm_cb(handle, _user_confirm_cb, NULL); - if (err) { - _E("smartthings_set_user_confirm_cb() is failed, [%s]", - __master_error_to_str(err)); - return; - } - - err = smartthings_set_reset_confirm_cb(handle, _reset_confirm_cb, NULL); - if (err) { - _E("smartthings_set_reset_confirm_cb() is failed, [%s]", - __master_error_to_str(err)); - return; - } - - err = smartthings_set_reset_result_cb(handle, _reset_result_cb, NULL); - if (err) { - _E("smartthings_set_reset_result_cb() is failed, [%s]", - __master_error_to_str(err)); - return; - } - - err = smartthings_set_status_changed_cb(handle, _thing_status_cb, user_data); - if (err) { - _E("smartthings_set_status_changed_callback() is failed, [%s]", - __master_error_to_str(err)); - return; - } - - err = smartthings_start(handle); - if (err) { - _E("smartthings_start() is failed, [%s]", - __master_error_to_str(err)); - return; - } - - err = smartthings_get_easysetup_status(handle, &is_es_completed); - if (err) { - _E("smartthings_get_easysetup_status() is failed, [%s]", - __master_error_to_str(err)); - return; - } - - if (is_es_completed == true) { - _I("Easysetup is already done"); - return; - } - - _I("Easysetup is starting now"); - err = smartthings_start_easysetup(handle); - if (err) { - _E("smartthings_start_easysetup() is failed, [%s]", - __master_error_to_str(err)); - smartthings_stop(handle); - return; - } - } else { - _E("connection failed"); - } -} - -static int _init_master(app_data *ad) -{ - int err = 0; - smartthings_h st_handle = NULL; - - retv_if(!ad, -1); - - if (ad->st_master_h) { - _I("Already initialized!"); - return 0; - } - - err = smartthings_initialize(&st_handle, _things_connection_status_cb, ad); - if (err) { - _E("smartthings_initialize() is failed, [%s]", - __master_error_to_str(err)); - return -1; - } - - ad->st_master_h = st_handle; - - return 0; -} - -int _fini_master(app_data *ad) -{ - retv_if(!ad, -1); - - if (!ad->st_master_h) { - _I("handle is already NULL"); - return 0; - } - - smartthings_unset_user_confirm_cb(ad->st_master_h); - smartthings_unset_reset_confirm_cb(ad->st_master_h); - smartthings_unset_reset_result_cb(ad->st_master_h); - smartthings_unset_status_changed_cb(ad->st_master_h); - - smartthings_stop_easysetup(ad->st_master_h); - smartthings_stop(ad->st_master_h); - - if (smartthings_deinitialize(ad->st_master_h) != 0) { - _E("smartthings_deinitialize() is failed"); - return -1; - } - ad->st_master_h = NULL; - - return 0; -} -#endif /* USE_ST_SDK */ - -static bool service_app_create(void *user_data) -{ -#ifdef USE_ST_SDK - app_data *ad = user_data; - - if (_init_master(ad)) - return false; - - if (_init_resource(ad)) { - _fini_master(ad); - return false; - } -#endif - - return true; -} - -static void service_app_control(app_control_h app_control, void *user_data) -{ - app_data *ad = user_data; - - if (ad->getter_timer) - ecore_timer_del(ad->getter_timer); - - ad->getter_timer = ecore_timer_add(TIMER_GATHER_INTERVAL, _get_motion_sensor_data, ad); - if (!ad->getter_timer) { - _E("Failed to add getter timer"); - return; - } -} - -static void service_app_terminate(void *user_data) -{ - app_data *ad = user_data; - -#ifdef USE_ST_SDK - _fini_resource(ad); - _fini_master(ad); -#endif - - // Turn off LED light with __set_led() - _set_led_data(ad, 0); - - // Close Motion and LED resources - resource_close_infrared_motion_sensor(); - resource_close_led(); - - // Free app data - free(ad); - - FN_END; -} - -int main(int argc, char *argv[]) -{ - app_data *ad = NULL; - service_app_lifecycle_callback_s event_callback; - - ad = calloc(1, sizeof(app_data)); - retv_if(!ad, -1); - - g_ad = ad; - - event_callback.create = service_app_create; - event_callback.terminate = service_app_terminate; - event_callback.app_control = service_app_control; - - return service_app_main(argc, argv, &event_callback, ad); -} diff --git a/src/resource/resource_infrared_motion_sensor.c b/src/resource/resource_infrared_motion_sensor.c deleted file mode 100755 index d0605e6..0000000 --- a/src/resource/resource_infrared_motion_sensor.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "log.h" - -static peripheral_gpio_h g_sensor_h = NULL; -static int g_pin_num = -1; - -void resource_close_infrared_motion_sensor(void) -{ - if (!g_sensor_h) return; - - _I("Infrared Motion Sensor is finishing..."); - - peripheral_gpio_close(g_sensor_h); - - g_sensor_h = NULL; - g_pin_num = -1; -} - -int resource_read_infrared_motion_sensor(int pin_num, uint32_t *out_value) -{ - int ret = PERIPHERAL_ERROR_NONE; - - if (!g_sensor_h) { - peripheral_gpio_h temp = NULL; - - ret = peripheral_gpio_open(pin_num, &temp); - retv_if(ret, -1); - - ret = peripheral_gpio_set_direction(temp, PERIPHERAL_GPIO_DIRECTION_IN); - if (ret) { - peripheral_gpio_close(temp); - _E("peripheral_gpio_set_direction failed."); - return -1; - } - - g_sensor_h = temp; - g_pin_num = pin_num; - } - - if (g_pin_num != pin_num) { - _E("Invalid pin number."); - return -1; - } - - ret = peripheral_gpio_read(g_sensor_h, out_value); - retv_if(ret < 0, -1); - - return 0; -} diff --git a/src/resource/resource_led.c b/src/resource/resource_led.c deleted file mode 100755 index 242cf73..0000000 --- a/src/resource/resource_led.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "log.h" - -static peripheral_gpio_h g_sensor_h = NULL; -static int g_pin_num = -1; - -void resource_close_led(void) -{ - if (!g_sensor_h) return; - - _I("LED is finishing..."); - - peripheral_gpio_close(g_sensor_h); - - g_sensor_h = NULL; - g_pin_num = -1; -} - -int resource_write_led(int pin_num, int write_value) -{ - int ret = PERIPHERAL_ERROR_NONE; - - if (!g_sensor_h) { - peripheral_gpio_h temp = NULL; - - ret = peripheral_gpio_open(pin_num, &temp); - retv_if(ret, -1); - - ret = peripheral_gpio_set_direction(temp, PERIPHERAL_GPIO_DIRECTION_OUT_INITIALLY_LOW); - if (ret) { - peripheral_gpio_close(temp); - _E("peripheral_gpio_set_direction failed."); - return -1; - } - - g_sensor_h = temp; - g_pin_num = pin_num; - } - - if (g_pin_num != pin_num) { - _E("Invalid pin number."); - return -1; - } - - ret = peripheral_gpio_write(g_sensor_h, write_value); - retv_if(ret < 0, -1); - - _I("LED Value : %s", write_value ? "ON":"OFF"); - - return 0; -} -- cgit v1.2.3