From 0bcd5d1629315c629114a0d89d6fea959c15b7de Mon Sep 17 00:00:00 2001 From: scott park Date: Tue, 22 Jan 2019 16:23:46 +0900 Subject: [PATCH] tizen 5.0 migration Change-Id: I18cb705532ec0db65766a8e38b0f2c46aa4da7f8 Signed-off-by: scott park --- .cproject | 372 +++++ .exportMap | 5 + .project | 46 + .smartthingsapp | 0 .tproject | 12 + inc/log.h | 21 +- inc/smartthings.h | 1656 ++++++++++++++++++++ inc/smartthings_payload.h | 663 ++++++++ inc/smartthings_resource.h | 364 +++++ inc/st_things.h | 297 ---- inc/st_things_types.h | 317 ---- inc/thing.h | 25 - inc/thing_master_user.h | 15 + inc/thing_resource_user.h | 16 + lib/liboicdastack.so | Bin 499340 -> 0 bytes lib/libsdkapi.so | Bin 79944 -> 0 bytes lib/libst_thing_master_api.so | Bin 0 -> 111204 bytes lib/libst_thing_resource_api.so | Bin 0 -> 72524 bytes project_def.prop | 10 +- res/device_def.json | 138 -- shared/res/co2_50.png | Bin 0 -> 57662 bytes shared/res/master.json | 18 + shared/res/resource.json | 96 ++ src/capability/capability_airqualitysensor.c | 25 +- src/capability/capability_switch.c | 51 +- .../capability_thermostatcoolingsetpoint.c | 84 +- src/co2sensor.c | 468 ++++-- src/resource/resource_adc_mcp3008.c | 26 +- src/resource/resource_co2_sensor.c | 72 +- tizen-manifest.xml | 20 +- 30 files changed, 3805 insertions(+), 1012 deletions(-) create mode 100644 .cproject create mode 100644 .exportMap create mode 100644 .project create mode 100644 .smartthingsapp create mode 100644 .tproject create mode 100644 inc/smartthings.h create mode 100644 inc/smartthings_payload.h create mode 100644 inc/smartthings_resource.h delete mode 100644 inc/st_things.h delete mode 100644 inc/st_things_types.h delete mode 100644 inc/thing.h create mode 100644 inc/thing_master_user.h create mode 100644 inc/thing_resource_user.h delete mode 100644 lib/liboicdastack.so delete mode 100644 lib/libsdkapi.so create mode 100644 lib/libst_thing_master_api.so create mode 100644 lib/libst_thing_resource_api.so delete mode 100644 res/device_def.json create mode 100644 shared/res/co2_50.png create mode 100644 shared/res/master.json create mode 100644 shared/res/resource.json diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..f362923 --- /dev/null +++ b/.cproject @@ -0,0 +1,372 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.exportMap b/.exportMap new file mode 100644 index 0000000..de30516 --- /dev/null +++ b/.exportMap @@ -0,0 +1,5 @@ +{ + global: main; + _IO_*; + local: *; +}; diff --git a/.project b/.project new file mode 100644 index 0000000..ffa3c10 --- /dev/null +++ b/.project @@ -0,0 +1,46 @@ + + + co2_50 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + 1548126403883 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + 1548126403886 + + 6 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-project_def.prop + + + + diff --git a/.smartthingsapp b/.smartthingsapp new file mode 100644 index 0000000..e69de29 diff --git a/.tproject b/.tproject new file mode 100644 index 0000000..7bd616a --- /dev/null +++ b/.tproject @@ -0,0 +1,12 @@ + + + + + iot-headless-5.0 + + + + + + + diff --git a/inc/log.h b/inc/log.h index f7178df..0e6087b 100644 --- a/inc/log.h +++ b/inc/log.h @@ -15,7 +15,7 @@ */ #ifndef __LOG_H__ -#define __LOG_H__ +#define __LOG_H__ #include @@ -23,21 +23,22 @@ extern "C" { #endif -#ifdef LOG_TAG -#undef LOG_TAG +#ifdef LOG_TAG +#undef LOG_TAG #endif -#define LOG_TAG "co2" +#define LOG_TAG "STAPP" -#define ERR(fmt, args...) dlog_print(DLOG_ERROR, LOG_TAG, "%s : %s(%d) > "fmt"\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##args) -#define WARN(fmt, args...) dlog_print(DLOG_WARN, LOG_TAG, "%s : %s(%d) > "fmt"\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##args) -#define INFO(fmt, args...) dlog_print(DLOG_INFO, LOG_TAG, "%s : %s(%d) > "fmt"\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##args) -#define DBG(fmt, args...) dlog_print(DLOG_DEBUG, LOG_TAG, "%s : %s(%d) > "fmt"\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##args) +#define _E(fmt, args...) dlog_print(DLOG_ERROR, LOG_TAG, "%s : %s(%d) > "fmt"\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##args) +#define _W(fmt, args...) dlog_print(DLOG_WARN, LOG_TAG, "%s : %s(%d) > "fmt"\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##args) +#define _I(fmt, args...) dlog_print(DLOG_INFO, LOG_TAG, "%s : %s(%d) > "fmt"\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##args) +#define _D(fmt, args...) dlog_print(DLOG_DEBUG, LOG_TAG, "%s : %s(%d) > "fmt"\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##args) -#define FN_CALL dlog_print(DLOG_DEBUG, LOG_TAG, ">>>>>>>> called") -#define FN_END dlog_print(DLOG_DEBUG, LOG_TAG, "<<<<<<<< ended") +#define START dlog_print(DLOG_DEBUG, LOG_TAG, "%s : %s(%d) >>>>>>>> called", rindex(__FILE__, '/') + 1, __func__, __LINE__) +#define END dlog_print(DLOG_DEBUG, LOG_TAG, "%s : %s(%d) <<<<<<<< ended", rindex(__FILE__, '/') + 1, __func__, __LINE__) #ifdef __cplusplus } #endif + #endif /* __LOG_H__ */ diff --git a/inc/smartthings.h b/inc/smartthings.h new file mode 100644 index 0000000..7206479 --- /dev/null +++ b/inc/smartthings.h @@ -0,0 +1,1656 @@ +/***************************************************************** + * + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * 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. + * + ******************************************************************/ + + +#ifndef __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_H__ +#define __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup CAPI_SMARTTHINGS_THING_MASTER_MODULE + * @{ + */ + +/** + * @brief Definition for the max length of SSID for access point. + * @since_ses 1 + */ +#define SMARTTHINGS_SSID_LEN_MAX 32 + +/** + * @brief Definition for the max length of cloud information. + * @since_ses 1 + */ +#define SMARTTHINGS_CLOUD_INFO_LEN_MAX 128 + +/** + * @brief Enumeration for the SmartThings error. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ + SMARTTHINGS_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ + SMARTTHINGS_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ + SMARTTHINGS_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED, /**< Permission denied */ + SMARTTHINGS_ERROR_NO_DATA = TIZEN_ERROR_NO_DATA, /**< No data */ + SMARTTHINGS_ERROR_NOT_SUPPORTED = TIZEN_ERROR_NOT_SUPPORTED, /**< Not supported */ + SMARTTHINGS_ERROR_OPERATION_FAILED = TIZEN_ERROR_UNKNOWN - 1, /**< Operation failed */ + SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE = TIZEN_ERROR_UNKNOWN -2 /**< Service unavailable */ +} smartthings_error_e; + +/** + * @brief Enumeration for SmartThings status. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_STATUS_NOT_READY = -1, /**< Service agent is not ready */ + SMARTTHINGS_STATUS_INIT = 0, /**< Initial state of SmartThings Thing */ + SMARTTHINGS_STATUS_ES_STARTED, /**< Easy-setup is started */ + SMARTTHINGS_STATUS_ES_DONE, /**< Easy-setup is done */ + SMARTTHINGS_STATUS_ES_FAILED_ON_OWNERSHIP_TRANSFER, /**< Easy-setup failed due to Ownership-Transfer failure */ + SMARTTHINGS_STATUS_CONNECTING_TO_AP, /**< Connecting to target Wi-Fi access point */ + SMARTTHINGS_STATUS_CONNECTED_TO_AP, /**< Connected to target Wi-Fi access point */ + SMARTTHINGS_STATUS_CONNECTING_TO_AP_FAILED, /**< Failed to connect to target Wi-Fi access point */ + SMARTTHINGS_STATUS_REGISTERING_TO_CLOUD, /**< Trying to sign up, sign in and publish resources to cloud */ + SMARTTHINGS_STATUS_REGISTERED_TO_CLOUD, /**< Publish resources to cloud is complete. Now the thing is ready to be controlled via cloud */ + SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_SIGN_IN, /**< Failed to sign in to cloud */ + SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_PUB_RES /**< Failed to publish resources to cloud */ +} smartthings_status_e; + +/** + * @brief Enumeration for RPC connection status. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_CONNECTION_STATUS_CONNECTED = 0, /**< Connection is connected */ + SMARTTHINGS_CONNECTION_STATUS_DISCONNECTED, /**< Connection is disconnected */ + SMARTTHINGS_CONNECTION_STATUS_REJECTED, /**< Connection is rejected */ +} smartthings_connection_status_e; + +/** + * @brief The Wi-Fi mode. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_WIFI_MODE_11A = (1 << 0), /**< Wi-Fi 11A */ + SMARTTHINGS_WIFI_MODE_11B = (1 << 1), /**< Wi-Fi 11B */ + SMARTTHINGS_WIFI_MODE_11G = (1 << 2), /**< Wi-Fi 11G */ + SMARTTHINGS_WIFI_MODE_11N = (1 << 3), /**< Wi-Fi 11N */ + SMARTTHINGS_WIFI_MODE_11AC = (1 << 4) /**< Wi-Fi 11AC */ +} smartthings_wifi_mode_e; + +/** + * @brief The Wi-Fi frequency band. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_WIFI_FREQ_24G = (1 << 0), /**< Wi-Fi 2.4GHz */ + SMARTTHINGS_WIFI_FREQ_5G = (1 << 1), /**< Wi-Fi 5GHz */ +} smartthings_wifi_freq_e; + +/** + * @brief The Wi-Fi authentication type of access point. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_WIFI_AUTHTYPE_NONE = 0, /**< No authentication */ + SMARTTHINGS_WIFI_AUTHTYPE_WEP, /**< WEP */ + SMARTTHINGS_WIFI_AUTHTYPE_WPA_PSK, /**< WPA-PSK */ + SMARTTHINGS_WIFI_AUTHTYPE_WPA2_PSK /**< WPA2-PSK */ +} smartthings_wifi_authtype_e; + +/** + * @brief The Wi-Fi encryption type of access point. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_WIFI_ENCTYPE_NONE = 0, /**< No encryption */ + SMARTTHINGS_WIFI_ENCTYPE_WEP_64, /**< WEP 64 */ + SMARTTHINGS_WIFI_ENCTYPE_WEP_128, /**< WEP 128 */ + SMARTTHINGS_WIFI_ENCTYPE_TKIP, /**< TKIP */ + SMARTTHINGS_WIFI_ENCTYPE_AES, /**< AES */ + SMARTTHINGS_WIFI_ENCTYPE_TKIP_AES /**< TKIP/AES */ +} smartthings_wifi_enctype_e; + +/** + * @brief The SmartThings handle. + * @since_ses 1 + */ +typedef struct smartthings_s *smartthings_h; + +/** + * @brief The access point information handle. + * @since_ses 1 + */ +typedef struct smartthings_ap_info_s *smartthings_ap_info_h; + +/** + * @brief The device provisioning information handle. + * @since_ses 1 + */ +typedef struct smartthings_device_prov_info_s *smartthings_device_prov_info_h; + +/** + * @brief The cloud information handle for cloud sign-up. + * @since_ses 1 + */ +typedef struct smartthings_cloud_info_s *smartthings_cloud_info_h; + +/** + * @brief The access point list handle. + * @since_ses 1 + */ +typedef struct smartthings_ap_list_s *smartthings_ap_list_h; + +/** + * @brief Callback for status of connection to SmartThings Thing agent. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can see connection status as #smartthings_connection_status_e enumeration value. + * + * @param[in] result The result of connection operation + * @param[in] handle The SmartThings handle + * @param[in] status The status of connection + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_initialize() + */ +typedef void (*smartthings_connection_status_cb)(smartthings_h handle, smartthings_connection_status_e status, void *user_data); + +/** + * @brief Callback for SmartThings Thing status. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can see SmartThings status as #smartthings_status_e enumeration value. + * + * @param[in] handle The SmartThings handle + * @param[in] status The status of SmartThings + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_status_changed_cb() + * @see smartthings_unset_status_changed_cb() + */ +typedef void (*smartthings_status_changed_cb)(smartthings_h handle, smartthings_status_e status, void *user_data); + +/** + * @brief Callback for getting user's input regarding mutual verification. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can send a confirmation for mutual verification as true or false. + * + * @param[in] handle The SmartThings handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_user_confirm_cb() + * @see smartthings_unset_user_confirm_cb() + */ +typedef void (*smartthings_user_confirm_cb)(smartthings_h handle, void *user_data); + +/** + * @brief Callback for getting user's opinion regarding device reset. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can sends a confirmation for reset as true or false. + * + * @param[in] handle The SmartThings handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_reset_confirm_cb() + * @see smartthings_unset_reset_confirm_cb() + */ +typedef void (*smartthings_reset_confirm_cb)(smartthings_h handle, void *user_data); + +/** + * @brief Callback for result of reset operation. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can check reset operation succeeds or fails. + * + * @param[in] handle The SmartThings handle + * @param[in] result The result of reset + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_reset_result_cb() + * @see smartthings_unset_reset_result_cb() + */ +typedef void (*smartthings_reset_result_cb)(smartthings_h handle, bool result, void *user_data); + +/** + * @brief Callback for carrying the randomly generated PIN information. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks The @a pin can be used only in the callback. To use outside, make a copy. + * @remarks When callback is called, user can see PIN value and length. + * + * @param[in] handle The SmartThings handle + * @param[in] pin The PIN data in string format + * @param[in] size The PIN length of @a pin + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_pin_cb() + * @see smartthings_unset_pin_cb() + */ +typedef void (*smartthings_pin_generated_cb)(smartthings_h handle, const char* pin, size_t size, void *user_data); + +/** + * @brief Callback for informing the application to close the PIN display. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can know PIN based ownership transfer is finished. + * + * @param[in] handle The SmartThings handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_pin_cb() + * @see smartthings_unset_pin_cb() + */ +typedef void (*smartthings_pin_display_close_cb)(smartthings_h handle, void *user_data); + +/** + * @brief Callback for informing Wi-Fi AP information to connect. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks The @a ap_info_h should not be released. + * @remarks The @a ap_info_h will be released when smartthings_unset_wifi_ap_provisioning_cb() is called. + * @remarks When callback is called, user can get Wi-Fi provisioning information. + * + * @param[in] handle The SmartThings handle + * @param[in] ap_info_h The AP information handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +typedef void (*smartthings_wifi_ap_provisioning_cb)(smartthings_h handle, smartthings_ap_info_h ap_info_h, void *user_data); + +/** + * @brief Callback for informing device provisioning information. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks The @a dev_prov_h should not be released. + * @remarks The @a dev_prov_h will be released when smartthings_unset_device_provisioning_cb() is called. + * @remarks When callback is called, user can get device provisioning information. + * + * @param[in] handle The SmartThings handle + * @param[in] dev_prov_h The device provisioning information handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_device_provisioning_cb() + * @see smartthings_unset_device_provisioning_cb() + */ +typedef void (*smartthings_device_provisioning_cb)(smartthings_h handle, smartthings_device_prov_info_h dev_prov_h, void *user_data); + +/** + * @brief Callback for informing the scan AP list request. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user scans access points, sets AP list and sends it to agent. + * + * @param[in] handle The SmartThings handle + * @param[in] req_id The request ID + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_scan_ap_cb() + * @see smartthings_unset_scan_ap_cb() + */ +typedef void (*smartthings_scan_ap_cb)(smartthings_h handle, int req_id, void *user_data); + +/** + * @brief Callback for informing the stop soft AP request. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user stops soft AP. + * + * @param[in] handle The SmartThings handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_stop_soft_ap_cb() + * @see smartthings_unset_stop_soft_ap_cb() + */ +typedef void (*smartthings_stop_soft_ap_cb)(smartthings_h handle, void *user_data); + +/** + * @brief Creates a handle and connects to agent. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks The @a handle must be released using smartthings_deinitialize(). + * @remarks Ths function returns #SMARTTHINGS_ERROR_PERMISSION_DENIED\n + * if the application has no app-defined privilege for 'http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master'. + * + * @param[out] handle The SmartThings handle to be newly created on success + * @param[in] connection_status_cb The RPC connection status callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_NOT_SUPPORTED Not supported + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_deinitialize() + */ +int smartthings_initialize(smartthings_h *handle, + smartthings_connection_status_cb connection_status_cb, + void *user_data); + +/** + * @brief Deinitializes a handle and disconnects from the agent. + * @since_ses 1 + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_initialize() + */ +int smartthings_deinitialize(smartthings_h handle); + +/** + * @brief Starts SmartThings Thing operation. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_stop() + */ +int smartthings_start(smartthings_h handle); + +/** + * @brief Stops SmartThings Thing operation. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_start() + */ +int smartthings_stop(smartthings_h handle); + +/** + * @brief Sets thing status changed callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when SmartThings status is changed. + * @remarks When callback is called, user can get SmartThings status as #smartthings_status_e enumeration value. + * + * @param[in] handle The SmartThings handle + * @param[in] status_cb The status changed callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_status_changed_cb() + */ +int smartthings_set_status_changed_cb(smartthings_h handle, + smartthings_status_changed_cb status_cb, + void *user_data); + +/** + * @brief Unsets thing status changed callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_status_changed_cb() + */ +int smartthings_unset_status_changed_cb(smartthings_h handle); + +/** + * @brief Sets test certificate files. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks These files should be placed in 'res' directory of application. + * @remarks This function is needed only for using test certificate. + * @remarks This function can be used before smartthings_start() + * + * @param[in] handle The SmartThings handle + * @param[in] certificate The certificate file + * @param[in] private_key The private key file + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_set_certificate_file(smartthings_h handle, const char *certificate, const char *private_key); + +/** + * @brief Sets device property for Easy-setup. + * @since_ses 1 + * + * @remarks This function can be used before smartthings_start() + * + * @param[in] handle The SmartThings handle + * @param[in] dev_name The device name + * @param[in] wifi_mode The supported Wi-Fi mode (bit masked value for #smartthings_wifi_mode_e) + * @param[in] wifi_freq The supported Wi-Fi frequency (bit masked value for #smartthings_wifi_freq_e) + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_set_device_property(smartthings_h handle, const char* dev_name, int wifi_mode, int wifi_freq); + +/** + * @brief Gets a device ID. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks The @a device_id should be released using free(). + * + * @param[in] handle The SmartThings handle + * @param[out] device_id The device ID + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_get_device_id(smartthings_h handle, char **device_id); + +/** + * @brief Gets a Easy-setup status. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * @param[out] is_completed The status of Easy-setup whether it is completed or not + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_get_easysetup_status(smartthings_h handle, bool *is_completed); + +/** + * @brief Starts Easy-setup mode. + * + * @details This function requests for turning on soft AP to SmartThings Thing agent. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/softap + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_stop_easysetup() + */ +int smartthings_start_easysetup(smartthings_h handle); + +/** + * @brief Stops Easy-setup mode. + * + * @details This function requests for turning off soft AP to SmartThings Thing agent. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/softap + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_start_easysetup() + */ +int smartthings_stop_easysetup(smartthings_h handle); + +/** + * @brief Sets callback for getting user confirmation for mutual verification based just work ownership transfer. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when it needs user's confirm for mutual verification based just work ownership transfer. + * @remarks When callback is called, user can send a confirmation for mutual verification based just work ownership transfer as true or false. + * + * @param[in] handle The SmartThings handle + * @param[in] confirm_cb The user confirm callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_user_confirm_cb() + */ +int smartthings_set_user_confirm_cb(smartthings_h handle, + smartthings_user_confirm_cb confirm_cb, + void *user_data); + +/** + * @brief Unsets user confirmation callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_user_confirm_cb() + */ +int smartthings_unset_user_confirm_cb(smartthings_h handle); + +/** + * @brief Sets reset confirmation callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when it needs user's confirm for reset. + * @remarks When callback is called, user can send a confirmation for reset as true or false. + * + * @param[in] handle The SmartThings handle + * @param[in] confirm_cb The reset confirm callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_reset_confirm_cb() + */ +int smartthings_set_reset_confirm_cb(smartthings_h handle, + smartthings_reset_confirm_cb confirm_cb, + void *user_data); + +/** + * @brief Unsets reset confirmation callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_reset_confirm_cb() + */ +int smartthings_unset_reset_confirm_cb(smartthings_h handle); + +/** + * @brief Sets reset result callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when reset operation returns its result. + * @remarks When callback is called, user can check reset operation succeeds or fails. + * + * @param[in] handle The SmartThings handle + * @param[in] reset_result_cb The reset result callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_reset_result_cb() + */ +int smartthings_set_reset_result_cb(smartthings_h handle, + smartthings_reset_result_cb reset_result_cb, + void *user_data); + +/** + * @brief Unsets reset result callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_reset_result_cb() + */ +int smartthings_unset_reset_result_cb(smartthings_h handle); + + +/** + * @brief Sets callback for getting randomly generated PIN for the PIN-based ownership transfer request. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks @a generated_cb callback is called when PIN is generated. + * @remarks @a close_cb callback is called when PIN based ownership transfer is finished. + * @remarks When @a generated_cb callback is called, user can see PIN value and length. + * @remarks When @a close_cb callback is called, user can know PIN based ownership transfer is finished. + * + * @param[in] handle The SmartThings handle + * @param[in] generated_cb The PIN generation callback to register + * @param[in] close_cb The PIN display close callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_pin_cb() + */ +int smartthings_set_pin_cb(smartthings_h handle, + smartthings_pin_generated_cb generated_cb, + smartthings_pin_display_close_cb close_cb, + void *user_data); + +/** + * @brief Unsets PIN callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_pin_cb() + */ +int smartthings_unset_pin_cb(smartthings_h handle); + +/** + * @brief Sets callback for getting Wi-Fi AP information during Easy-setup. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when Wi-Fi provisioning event occurs. + * @remarks When callback is called, user can get Wi-Fi provisioning information. + * + * @param[in] handle The SmartThings handle + * @param[in] wifi_ap_cb The Wi-Fi AP callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_set_wifi_ap_provisioning_cb(smartthings_h handle, + smartthings_wifi_ap_provisioning_cb wifi_ap_cb, + void *user_data); + +/** + * @brief Unsets callback for getting Wi-Fi AP information during Easy-setup. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_wifi_ap_provisioning_cb() + */ +int smartthings_unset_wifi_ap_provisioning_cb(smartthings_h handle); + +/** + * @brief Sets callback for getting device provisioning information. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when device provisioning event occurs. + * @remarks When callback is called, user can get device provisioning information. + * + * @param[in] handle The SmartThings handle + * @param[in] dev_prov_cb The device provisioning callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_device_provisioning_cb() + */ +int smartthings_set_device_provisioning_cb(smartthings_h handle, + smartthings_device_provisioning_cb dev_prov_cb, + void *user_data); + +/** + * @brief Unsets callback for getting device provisioning information. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_device_provisioning_cb() + */ +int smartthings_unset_device_provisioning_cb(smartthings_h handle); + +/** + * @brief Sets callback for informing the scan AP list request. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when GET request for access point list. + * @remarks When callback is called, user scans access points, sets AP list and sends it to agent. + * + * @param[in] handle The SmartThings handle + * @param[in] scan_ap_cb The callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_scan_ap_cb() + * @see smartthings_send_ap_list() + */ +int smartthings_set_scan_ap_cb(smartthings_h handle, + smartthings_scan_ap_cb scan_ap_cb, + void *user_data); + +/** + * @brief Unsets callback for informing the scan AP list request. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_scan_ap_cb() + */ +int smartthings_unset_scan_ap_cb(smartthings_h handle); + +/** + * @brief Sets callback for informing the stop soft AP request. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when POST request for stopping soft AP. + * @remarks When callback is called, user stops soft AP. + * + * @param[in] handle The SmartThings handle + * @param[in] stop_soft_ap_cb The callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_stop_soft_ap_cb() + */ +int smartthings_set_stop_soft_ap_cb(smartthings_h handle, + smartthings_stop_soft_ap_cb stop_soft_ap_cb, + void *user_data); + +/** + * @brief Unsets callback for informing the stop soft AP request. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_stop_soft_ap_cb() + */ +int smartthings_unset_stop_soft_ap_cb(smartthings_h handle); + +/** + * @brief Sends a user confirmation for MUTUAL VERIFICATION BASED JUST WORK Ownership transfer. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] handle The SmartThings handle + * @param[in] confirm The user confirmation for OTM(ownership transfer method) + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_user_confirm_cb() + * @see smartthings_unset_user_confirm_cb() + */ +int smartthings_send_user_confirm(smartthings_h handle, bool confirm); + + +/** + * @brief Sends a reset confirmation. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] handle The SmartThings handle + * @param[in] confirm The reset confirmation + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_reset_confirm_cb() + * @see smartthings_unset_reset_confirm_cb() + */ +int smartthings_send_reset_confirm(smartthings_h handle, bool confirm); + +/** + * @brief Sends a reset command for resetting the device's Cloud signup and Easy-setup. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_reset_result_cb() + * @see smartthings_unset_reset_result_cb() + */ +int smartthings_reset(smartthings_h handle); + +/** + * @brief Gets SSID of access point. + * @since_ses 1 + * + * @remarks The @a ssid should be released using free(). + * + * @param[in] ap_info_h The SmartThings AP information handle + * @param[out] ssid The SSID name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_apinfo_get_ssid(smartthings_ap_info_h ap_info_h, char **ssid); + +/** + * @brief Gets password of access point. + * @since_ses 1 + * + * @remarks The @a pwd should be released using free(). + * + * @param[in] ap_info_h The SmartThings AP information handle + * @param[out] pwd The password + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_apinfo_get_password(smartthings_ap_info_h ap_info_h, char **pwd); + +/** + * @brief Gets authentification type of access point. + * @since_ses 1 + * + * @param[in] ap_info_h The SmartThings AP information handle + * @param[out] authtype The authentification type + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_apinfo_get_authtype(smartthings_ap_info_h ap_info_h, smartthings_wifi_authtype_e *authtype); + +/** + * @brief Gets encryption type of access point. + * @since_ses 1 + * + * @param[in] ap_info_h The SmartThings AP information handle + * @param[out] enctype The encryption type + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_apinfo_get_enctype(smartthings_ap_info_h ap_info_h, smartthings_wifi_enctype_e *enctype); + +/** + * @brief Gets channel information of access point. + * @since_ses 1 + * + * @param[in] ap_info_h The SmartThings AP information handle + * @param[out] channel The frequency channel + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_apinfo_get_channel(smartthings_ap_info_h ap_info_h, int *channel); + +/** + * @brief Gets language of device provisioing information. + * @since_ses 1 + * + * @remarks The @a language should be released using free(). + * + * @param[in] dev_prov_h The SmartThings device provisioning information handle + * @param[out] language The IETF language tag using ISO 639X + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_device_provisioning_cb() + * @see smartthings_unset_device_provisioning_cb() + */ +int smartthings_devinfo_get_language(smartthings_device_prov_info_h dev_prov_h, char **language); + +/** + * @brief Gets country of device provisioing information. + * @since_ses 1 + * + * @remarks The @a country should be released using free(). + * + * @param[in] dev_prov_h The SmartThings device provisioning information handle + * @param[out] country The ISO Country Code (ISO 3166-1 Alpha-2) + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_device_provisioning_cb() + * @see smartthings_unset_device_provisioning_cb() + */ +int smartthings_devinfo_get_country(smartthings_device_prov_info_h dev_prov_h, char **country); + +/** + * @brief Gets datetime of device provisioing information. + * @since_ses 1 + * + * @remarks The @a datetime should be released using free(). + * + * @param[in] dev_prov_h The SmartThings device provisioning information handle + * @param[out] datetime The date and time + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_device_provisioning_cb() + * @see smartthings_unset_device_provisioning_cb() + */ +int smartthings_devinfo_get_datetime(smartthings_device_prov_info_h dev_prov_h, char **datetime); + +/** + * @brief Creates a SmartThings AP list handle. + * @since_ses 1 + * + * @remarks The @a ap_list_h must be released using smartthings_aplist_destroy(). + * + * @param[out] ap_list_h The SmartThings AP list handle to be newly created on success + * @param[in] count The count of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OUT_OF_MEMORY Out of memory + * + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_create(smartthings_ap_list_h *ap_list_h, unsigned int count); + +/** + * @brief Destroys a SmartThings AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + */ +int smartthings_aplist_destroy(smartthings_ap_list_h ap_list_h); + +/** + * @brief Sets SSID at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] ssid The SSID of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_ssid(smartthings_ap_list_h ap_list_h, int idx, const char *ssid); + +/** + * @brief Sets BSSID at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] bssid The BSSID of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_bssid(smartthings_ap_list_h ap_list_h, int idx, const char *bssid); + +/** + * @brief Sets authentification type at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] authtype The authentification type of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_authtype(smartthings_ap_list_h ap_list_h, int idx, smartthings_wifi_authtype_e authtype); + +/** + * @brief Sets encryption type at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] enctype The encryption type of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_enctype(smartthings_ap_list_h ap_list_h, int idx, smartthings_wifi_enctype_e enctype); + +/** + * @brief Sets frequency channel at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] channel The frequency channel of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_channel(smartthings_ap_list_h ap_list_h, int idx, int channel); + +/** + * @brief Sets signal level at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] signal_level The signal level of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_signal_level(smartthings_ap_list_h ap_list_h, int idx, int signal_level); + +/** + * @brief Sets max speed rate at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] max_rate The max speed rate of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_max_rate(smartthings_ap_list_h ap_list_h, int idx, int max_rate); + +/** + * @brief Sends the scanned AP list. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] handle The SmartThings handle + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] req_id The request ID + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + * @see smartthings_set_scan_ap_cb() + */ +int smartthings_send_ap_list(smartthings_h handle, smartthings_ap_list_h ap_list_h, int req_id); + +/** + * @brief Creates a SmartThings cloud information handle. + * @since_ses 1 + * + * @remarks The @a cloud_info_h must be released using smartthings_cloudinfo_destroy(). + * + * @param[out] cloud_info_h The SmartThings cloud information handle to be newly created on success + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OUT_OF_MEMORY Out of memory + * + * @see smartthings_cloudinfo_destroy() + */ +int smartthings_cloudinfo_create(smartthings_cloud_info_h *cloud_info_h); + +/** + * @brief Destroys a SmartThings cloud information handle. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_cloudinfo_create() + */ +int smartthings_cloudinfo_destroy(smartthings_cloud_info_h cloud_info_h); + +/** + * @brief Sets region of cloud information. + * @since_ses 1 + * + * @remarks The @a region can be set to one of "global" or "china". + * @remarks If it doesn't use this function, the @a region will be set to "global" internally. + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] region The region name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_region(smartthings_cloud_info_h cloud_info_h, const char *region); + +/** + * @brief Sets authentification provider of cloud information. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] auth_provider The authentification provider + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_auth_provider(smartthings_cloud_info_h cloud_info_h, const char *auth_provider); + +/** + * @brief Sets access token of cloud information. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] access_token The access token + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_access_token(smartthings_cloud_info_h cloud_info_h, const char *access_token); + +/** + * @brief Sets refresh token of cloud information. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] refresh_token The refresh token + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_refresh_token(smartthings_cloud_info_h cloud_info_h, const char *refresh_token); + +/** + * @brief Sets user ID of cloud information. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] user_id The user ID + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_user_id(smartthings_cloud_info_h cloud_info_h, const char *user_id); + +/** + * @brief Sets client ID of cloud information. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] client_id The client ID + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_client_id(smartthings_cloud_info_h cloud_info_h, const char *client_id); + +/** + * @brief Requests to sign up to cloud. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] handle The SmartThings handle + * @param[in] cloud_info_h The handle for cloud signup + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_sign_up_cloud(smartthings_h handle, smartthings_cloud_info_h cloud_info_h); + +/** + * @brief Sets preconfigured PIN. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * @param[in] pin The PIN code to preconfigure + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_set_preconfigured_pin(smartthings_h handle, const char* pin); + +/** + * @brief Sets MOT(multiple ownership transfer) status. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * @param[in] enable The MOT(multiple ownership transfer) status + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_set_mot_status(smartthings_h handle, bool enable); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_H__ */ diff --git a/inc/smartthings_payload.h b/inc/smartthings_payload.h new file mode 100644 index 0000000..988585d --- /dev/null +++ b/inc/smartthings_payload.h @@ -0,0 +1,663 @@ +/***************************************************************** + * + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * 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. + * + ******************************************************************/ + + +#ifndef __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_PAYLOAD_H__ +#define __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_PAYLOAD_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file smartthings_payload.h + */ + +/** + * @addtogroup CAPI_SMARTTHINGS_THING_PAYLOAD_MODULE + * @{ + */ + +/** + * @brief The SmartThings payload handle. + * @since_ses 1 + */ +typedef struct smartthings_payload_s *smartthings_payload_h; + +/** + * @brief Creates a SmartThings payload handle. + * @since_ses 1 + * + * @remarks The @a payload must be released using smartthings_payload_destroy(). + * @remarks If the @a payload is set to parent payload as an object or object array + * using smartthings_payload_set_object() or smartthings_payload_set_object_array(), + * the @a payload must not be released. + + * @param[out] payload The SmartThings payload handle to be newly created on success + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * + * @see smartthings_payload_destroy() + */ +int smartthings_payload_create(smartthings_payload_h *payload); + +/** + * @brief Destroys a SmartThings payload handle and releases all its resources. + * @since_ses 1 + * + * @remarks If the @a payload has child payload, its child payload will be released as well. + * + * @param[in] payload The SmartThings payload handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_create() + */ +int smartthings_payload_destroy(smartthings_payload_h payload); + +/** + * @brief Sets an integer value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_int(smartthings_payload_h payload, const char *attr_name, int value); + +/** + * @brief Sets a boolean value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_bool(smartthings_payload_h payload, const char *attr_name, bool value); + +/** + * @brief Sets a double value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_double(smartthings_payload_h payload, const char *attr_name, double value); + +/** + * @brief Sets a string value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_string(smartthings_payload_h payload, const char *attr_name, const char *value); + +/** + * @brief Sets a byte string value and length for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * @param[in] length The size of value + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + */ +int smartthings_payload_set_byte_string(smartthings_payload_h payload, const char *attr_name, const char *value, unsigned int length); + +/** + * @brief Sets an object value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a value is SmartThings payload handle. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_object(smartthings_payload_h payload, const char *attr_name, smartthings_payload_h value); + +/** + * @brief Sets an integer array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing array for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] array The array associated with the given attribute name + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_int_array(smartthings_payload_h payload, const char *attr_name, const int *array, unsigned int length); + +/** + * @brief Sets a boolean array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing array for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] array The array associated with the given attribute name + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_bool_array(smartthings_payload_h payload, const char *attr_name, const bool *array, unsigned int length); + +/** + * @brief Sets a double array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing array for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] array The array associated with the given attribute name + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_double_array(smartthings_payload_h payload, const char *attr_name, const double *array, unsigned int length); + +/** + * @brief Sets a string array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing array for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] array The array associated with the given attribute name + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_string_array(smartthings_payload_h payload, const char *attr_name, const char **array, unsigned int length); + +/** + * @brief Sets an object array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing array for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] array The array associated with the given attribute name + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + */ +int smartthings_payload_set_object_array(smartthings_payload_h payload, const char *attr_name, smartthings_payload_h *array, unsigned int length); + +/** + * @brief Adds a payload for child resource of collection resource. + * @since_ses 1 + * + * @remarks The @a resource_uri is key value, one of several child resources of the collection resource. + * @remarks The @a value is SmartThings payload handle. + * @remarks The function replaces any existing payload for the given @a resource_uri. + * + * @param[in] payload The SmartThings payload handle + * @param[in] resource_uri The resource URI of child resource + * @param[in] value The payload associated with the given resource URI + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_add_collection_object(smartthings_payload_h payload, const char *resource_uri, smartthings_payload_h value); + +/** + * @brief Gets an integer value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_int(smartthings_payload_h payload, const char *attr_name, int *value); + +/** + * @brief Gets a boolean value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_bool(smartthings_payload_h payload, const char *attr_name, bool *value); + +/** + * @brief Gets a double value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_double(smartthings_payload_h payload, const char *attr_name, double *value); + +/** + * @brief Gets a string value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a value should be released using free(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_string(smartthings_payload_h payload, const char *attr_name, char **value); + +/** + * @brief Gets a byte string value and length for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a value should be released using free(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * @param[out] length The size of value + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_byte_string(smartthings_payload_h payload, const char *attr_name, char **value, unsigned int *length); + +/** + * @brief Gets an object value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a value is SmartThings payload handle. + * @remarks The @a value must be released using smartthings_payload_release_object(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_object(smartthings_payload_h payload, const char *attr_name, smartthings_payload_h *value); + +/** + * @brief Gets an integer array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a array must be released using smartthings_payload_release_int_array(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] array The array associated with the given attribute name + * @param[out] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + * + * @see smartthings_payload_release_int_array() + */ +int smartthings_payload_get_int_array(smartthings_payload_h payload, const char *attr_name, int **array, unsigned int *length); + +/** + * @brief Gets a boolean array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a array must be released using smartthings_payload_release_bool_array(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] array The array associated with the given attribute name + * @param[out] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + * + * @see smartthings_payload_release_bool_array() + */ +int smartthings_payload_get_bool_array(smartthings_payload_h payload, const char *attr_name, bool **array, unsigned int *length); + +/** + * @brief Gets a double array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a array must be released using smartthings_payload_release_double_array(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] array The array associated with the given attribute name + * @param[out] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + * + * @see smartthings_payload_release_double_array() + */ +int smartthings_payload_get_double_array(smartthings_payload_h payload, const char *attr_name, double **array, unsigned int *length); + +/** + * @brief Gets a string array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a array must be released using smartthings_payload_release_string_array(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] array The array associated with the given attribute name + * @param[out] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + * + * @see smartthings_payload_release_string_array() + */ +int smartthings_payload_get_string_array(smartthings_payload_h payload, const char *attr_name, char ***array, unsigned int *length); + +/** + * @brief Gets an object array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a array is a list of SmartThings payload handle. + * @remarks The @a array must be released using smartthings_payload_release_object_array(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] array The array associated with the given attribute name + * @param[out] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + * + * @see smartthings_payload_release_object_array() + */ +int smartthings_payload_get_object_array(smartthings_payload_h payload, const char *attr_name, smartthings_payload_h **array, unsigned int *length); + +/** + * @brief Gets a payload for child resource of collection resource. + * @since_ses 1 + * + * @remarks The @a resource_uri is key value, one of several child resources of the collection resource. + * @remarks The @a value is SmartThings payload handle. + * @remarks The @a value must be released using smartthings_payload_release_object(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] resource_uri The resource URI of child resource + * @param[out] value The payload associated with the given resource URI + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_collection_object(smartthings_payload_h payload, const char *resource_uri, smartthings_payload_h *value); + +/** + * @brief Releases an integer array of the SmartThings payload. + * @since_ses 1 + * + * @param[in] array The array to release + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_int_array() + */ +int smartthings_payload_release_int_array(int *array); + +/** + * @brief Releases a boolean array of the SmartThings payload. + * @since_ses 1 + * + * @param[in] array The array to release + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_bool_array() + */ +int smartthings_payload_release_bool_array(bool *array); + +/** + * @brief Releases a double array of the SmartThings payload. + * @since_ses 1 + * + * @param[in] array The array to release + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_double_array() + */ +int smartthings_payload_release_double_array(double *array); + +/** + * @brief Releases a string array of the SmartThings payload. + * @since_ses 1 + * + * @param[in] array The array to release + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_string_array() + */ +int smartthings_payload_release_string_array(char **array, unsigned int length); + +/** + * @brief Releases an object array of the SmartThings payload. + * @since_ses 1 + * + * @param[in] array The array to release + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_object_array() + */ +int smartthings_payload_release_object_array(smartthings_payload_h *array, unsigned int length); + +/** + * @brief Releases a SmartThings payload. + * @since_ses 1 + * + * @remarks The function is different with smartthings_payload_destroy(). + * @remarks The function releases only payload value that is obtained by smartthings_payload_get_object(). + * + * @param[in] payload The payload to release + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_object() + */ +int smartthings_payload_release_object(smartthings_payload_h payload); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_PAYLOAD_H__ */ diff --git a/inc/smartthings_resource.h b/inc/smartthings_resource.h new file mode 100644 index 0000000..1968c50 --- /dev/null +++ b/inc/smartthings_resource.h @@ -0,0 +1,364 @@ +/***************************************************************** + * + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * 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. + * + ******************************************************************/ + + +#ifndef __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_RESOURCE_H__ +#define __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_RESOURCE_H__ + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file smartthings_resource.h + */ + +/** + * @addtogroup CAPI_SMARTTHINGS_THING_RESOURCE_MODULE + * @{ + */ + +/** + * @brief Enumeration for the SmartThings resource error. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_RESOURCE_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ + SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ + SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ + SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED, /**< Permission denied */ + SMARTTHINGS_RESOURCE_ERROR_NO_DATA = TIZEN_ERROR_NO_DATA, /**< No data */ + SMARTTHINGS_RESOURCE_ERROR_NOT_SUPPORTED = TIZEN_ERROR_NOT_SUPPORTED, /**< Not supported */ + SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED = TIZEN_ERROR_UNKNOWN - 1, /**< Operation failed */ + SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE = TIZEN_ERROR_UNKNOWN -2 /**< Service unavailable */ +} smartthings_resource_error_e; + +/** + * @brief Enumeration for the request type of resource and collection resource. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_RESOURCE_REQUEST_GET = 0, /**< Get request type */ + SMARTTHINGS_RESOURCE_REQUEST_SET = 1, /**< Set request type */ + SMARTTHINGS_RESOURCE_REQUEST_COLLECTION_GET = 2, /**< Get request type for collection */ + SMARTTHINGS_RESOURCE_REQUEST_COLLECTION_SET = 3 /**< Set request type for collection */ +} smartthings_resource_req_type_e; + +/** + * @brief Enumeration for RPC connection status. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_RESOURCE_CONNECTION_STATUS_CONNECTED = 0, /**< Connection is connected */ + SMARTTHINGS_RESOURCE_CONNECTION_STATUS_DISCONNECTED, /**< Connection is disconnected */ + SMARTTHINGS_RESOURCE_CONNECTION_STATUS_REJECTED, /**< Connection is rejected */ +} smartthings_resource_connection_status_e; + +/** + * @brief The SmartThings resource handle. + * @since_ses 1 + */ +typedef struct smartthings_resource_s *smartthings_resource_h; + +/** + * @brief Callback for status of connection to SmartThings Thing agent. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can see connection status as #smartthings_connection_status_e enumeration value. + * + * @param[in] result The result of connection operation + * @param[in] handle The SmartThings handle + * @param[in] status The status of connection + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_resource_initialize() + */ +typedef void (*smartthings_resource_connection_status_cb)(smartthings_resource_h handle, smartthings_resource_connection_status_e status, void *user_data); + +/** + * @brief Callback for handling request(GET/SET) messages. + * @since_ses 1 + * + * @remarks The @a payload is NULL when @a req_type is #SMARTTHINGS_RESOURCE_REQUEST_GET. + * @remarks The @a payload can be used only in the callback. To use outside, make a copy. + * @remarks The @a st_h should not be released. + * @remarks The @a st_h is the same object for which the callback was set/added. + * @remarks The @a st_h will be released when smartthings_resource_deinitialize() is called. + * @remarks The @a payload should not be released. + * @remarks The @a uri can be used only in the callback. To use outside, make a copy. + * + * @param[in] st_h The SmartThings resource handle + * @param[in] req_id The request ID of request message + * @param[in] uri The resource URI + * @param[in] req_type The request type for request message + * @param[in] payload The payload for SET request message + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_resource_set_request_cb() + * @see smartthings_resource_unset_request_cb() + */ +typedef void (*smartthings_resource_request_cb)(smartthings_resource_h st_h, int req_id, const char *uri, + smartthings_resource_req_type_e req_type, + smartthings_payload_h payload, void *user_data); + +/** + * @brief Callback for status of resource registration to cloud. + * @since_ses 1 + * + * @remarks This callback will be called when status of resource registration is changed. + * @remarks The @a st_h should not be released. + * @remarks The @a st_h is the same object for which the callback was set/added. + * @remarks The @a st_h will be released when smartthings_resource_deinitialize() is called. + * @remarks The @a is_registered will be true when resources are registered to cloud. + * + * @param[in] st_h The SmartThings resource handle + * @param[in] is_registered The status of resource registration to cloud + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_resource_set_cloud_registration_status_cb() + * @see smartthings_resource_unset_cloud_registration_status_cb() + */ +typedef void (*smartthings_resource_cloud_registration_status_cb)(smartthings_resource_h st_h, bool is_registered, void *user_data); + + +/** + * @brief Initializes a resource handle and connects to agent. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks The @a st_h must be released using smartthings_resource_deinitialize(). + * @remarks Ths function returns #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED\n + * if the application has no app-defined privilege for 'http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource'. + * + * @param[out] st_h The SmartThings resource handle to be newly created on success + * @param[in] connection_status_cb The connection status callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_NOT_SUPPORTED Not supported + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_resource_deinitialize() + */ +int smartthings_resource_initialize(smartthings_resource_h *st_h, + smartthings_resource_connection_status_cb connection_status_cb, + void *user_data); + +/** + * @brief Deinitializes a resource handle and disconnects from the agent. + * @since_ses 1 + * + * @param[in] st_h The SmartThings resource handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_resource_initialize() + */ +int smartthings_resource_deinitialize(smartthings_resource_h st_h); + +/** + * @brief Sets resource request callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] st_h The SmartThings resource handle + * @param[in] req_cb The request callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_resource_unset_request_cb() + */ +int smartthings_resource_set_request_cb(smartthings_resource_h st_h, + smartthings_resource_request_cb req_cb, + void *user_data); + +/** + * @brief Unsets resource request callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] st_h The SmartThings resource handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_resource_set_request_cb() + */ +int smartthings_resource_unset_request_cb(smartthings_resource_h st_h); + +/** + * @brief Sends response for resource request message. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] st_h The SmartThings resource handle + * @param[in] req_id The request ID of request message + * @param[in] uri The resource URI + * @param[in] payload The payload of response message + * @param[in] result The result of response + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_resource_send_response(smartthings_resource_h st_h, int req_id, const char *uri, smartthings_payload_h payload, bool result); + +/** + * @brief Notifies resource change. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] st_h The SmartThings resource handle + * @param[in] uri The resource URI + * @param[in] payload The payload of response message + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_resource_notify(smartthings_resource_h st_h, const char *uri, smartthings_payload_h payload); + +/** + * @brief Gets resource URIs. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks The @a uris should be released using free(). + * + * @param[in] st_h The SmartThings resource handle + * @param[out] count The resource count + * @param[out] uris The resource URI list + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_resource_get_uris(smartthings_resource_h st_h, int *count, char ***uris); + +/** + * @brief Sets cloud registration callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] st_h The SmartThings resource handle + * @param[in] reg_cb The callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_resource_unset_cloud_registration_status_cb() + */ +int smartthings_resource_set_cloud_registration_status_cb(smartthings_resource_h st_h, + smartthings_resource_cloud_registration_status_cb reg_cb, + void *user_data); + +/** + * @brief Unsets cloud registration callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] st_h The SmartThings resource handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_resource_set_cloud_registration_status_cb() + */ +int smartthings_resource_unset_cloud_registration_status_cb(smartthings_resource_h st_h); + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_RESOURCE_H__ */ diff --git a/inc/st_things.h b/inc/st_things.h deleted file mode 100644 index 11b3267..0000000 --- a/inc/st_things.h +++ /dev/null @@ -1,297 +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. - */ - -#ifndef __ST_THINGS_H__ -#define __ST_THINGS_H__ - -#include -#include - -#ifdef __ST_THINGS_RTOS__ -#include -#else -#include "st_things_types.h" -#endif // __ST_THINGS_RTOS__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** - * @brief Set prefix paths (ReadOnly and ReadWrite) for configuration files for the device. - * This is Optional API, and should be used if relative location is used in - * filePath variable in JSON Configuration file. - * @param[in] ro_path Prefix Path for Read Only directory location. - * @param[in] rw_path Prefix Path for Read Write directory location. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_INVALID_PARAMETER Invalid parameter(both ro_path and rw_path are NULL). - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - * @retval #ST_THINGS_ERROR_STACK_ALREADY_INITIALIZED Stack already initialized. - * To set Prefix Paths, stack should be deinitilized first by calling st_things_deinitialize(). - * @retval #ST_THINGS_ERROR_STACK_RUNNING Stack is currently running. - * To set Prefix Paths, stack should be stopped first by calling st_things_stop() - * and then deinitialized by calling st_things_deinitialize(). - */ -int st_things_set_configuration_prefix_path(const char* ro_path, const char* rw_path); - -/** - * @brief Initializes things stack and returns whether easy-setup is completed or not. - * Easy-setup enable users to acquire the ownership of things and to connect the things with the cloud. - * After performing easy-setup, users can access things from anywhere through the cloud. - * In things stack, easy-setup is a primary and the first operation to be performed on the thing. - * Application running on the thing can know whether easy-setup is done already or not. - * If easy-setup is done, app can start the things stack by calling st_things_start(). - * If easy-setup is not done, app can either wait for the user interaction before starting the things stack or - * start the things stack directly without waiting for any events(This case is for those things which doesn't - * support input capability and for all other unknown cases). - * To use a new json file after initialization, stack should be deinitialized - * and stopped(if its started already). - * @param[in] json_path Path to Json file which defines a thing. Definition includes the device information, - * resources and their properties, configuration info for connectivity and easy-setup, etc. - * @param[out] easysetup_complete Indicates whether easysetup is completed already or not. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - * @retval #ST_THINGS_ERROR_STACK_ALREADY_INITIALIZED Stack already initialized. - * To initialize again, stack should be deinitilized first by calling st_things_deinitialize(). - * @retval #ST_THINGS_ERROR_STACK_RUNNING Stack is currently running. - * To initialize again, stack should be stopped first by calling st_things_stop() - * and then deinitialized by calling st_things_deinitialize(). - */ -int st_things_initialize(const char *json_path, bool *easysetup_complete); - -/** - * @brief Deinitializes things stack. - * Stack should have been initialized before calling this API. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - * @retval #ST_THINGS_ERROR_STACK_NOT_INITIALIZED Stack is not initialized. - * Initialize the stack by calling st_things_initialize(). - * @retval #ST_THINGS_ERROR_STACK_RUNNING Stack is currently running. - * Before deinitialize, stack needs to be stopped by calling st_things_stop(). - */ -int st_things_deinitialize(void); - -/** - * @brief Callback for handling GET request. - * @param[in] req_msg GET request message. - * @param[out] resp_rep Representation that will be set to payload of response. - * @return @c true in case of success, otherwise @c false - */ -typedef bool (*st_things_get_request_cb)(st_things_get_request_message_s *req_msg, st_things_representation_s *resp_rep); - -/** - * @brief Callback for handling SET(POST) request. - * @param[in] req_msg SET request message. - * @param[out] resp_rep Representation that will be set to payload of response. - * @return @c true in case of success, otherwise @c false - */ -typedef bool (*st_things_set_request_cb)(st_things_set_request_message_s *req_msg, st_things_representation_s *resp_rep); - -/** - * @brief Callback registration function for handling request messages. - * @details The callbacks ensure that a request message will be carried with one of the resource uris from json file of st_things_start(). - * @remarks Only one callback function can be set with this API.\n - * If multiple callbacks are set, the last one is registered only.\n - * And the callbacks are called in the internal thread, which is not detached,\n - * so application should return it to get the next callbacks. - * @param[in] get_cb Reference of the callback function to handle GET request. - * @param[in] set_cb Reference of the callback function to handle SET(POST) request. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - */ -int st_things_register_request_cb(st_things_get_request_cb get_cb, st_things_set_request_cb set_cb); - -/** - * @brief Starts things stack. - * Parses the thing definition(whose path is passed to st_things_initialize(), configures the thing, - * creates the resources and prepares it for easy-setup. - * If easy-setup is not done yet, onboarding will be started using either SoftAP or BLE connection. - * Onboarding creates an ad-hoc network between the thing and the client for performing easy-setup. - * If easy-setup is already done, thing will be connected with the cloud. - * Application can know whether easy-setup is done or not through st_things_initialize API. - * Stack should have been initialized before calling this API. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful. - * It is also used for the case that the stack is started already. - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - * @retval #ST_THINGS_ERROR_STACK_NOT_INITIALIZED Stack is not initialized. - * Initialize the stack by calling st_things_initialize(). - */ -int st_things_start(void); - -/** - * @brief Stops things stack. - * Removes all the data being used internally and releases all the memory allocated for the stack. - * Stack should have been initialized and started before calling this API. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - * @retval #ST_THINGS_ERROR_STACK_NOT_INITIALIZED Stack is not initialized. - * Initialize the stack by calling st_things_initialize(). - * @retval #ST_THINGS_ERROR_STACK_NOT_STARTED Stack is not started. - * Start the stack by calling st_things_start(). - */ -int st_things_stop(void); - -/** - * @brief Callback for getting user's opinion regarding device reset. - * @return @c true to confirm, otherwise @c to deny - */ -typedef bool (*st_things_reset_confirm_cb)(void); - -/** - * @brief Callback for carrying the result of reset. - * @param[in] is_success Result of Stack-reset. (true : success, false : failure) - */ -typedef void (*st_things_reset_result_cb)(bool is_success); - -/** - * @brief Callback registration function for Reset-Confirmation and Reset-Result functions. - * @remarks Only one callback function can be set with this API.\n - * If multiple callbacks are set, the last one is registered only.\n - And the callbacks are called in the internal thread, which is not detached,\n - * so application should return it to get the next callbacks. - * @param[in] confirm_cb Callback function that will be called to get the user's input when reset is triggered. - * @param[in] result_cb Callback function that will be called after the reset process is done. - * This parameter can be NULL if notification for result of reset is not needed. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - */ -int st_things_register_reset_cb(st_things_reset_confirm_cb confirm_cb, st_things_reset_result_cb result_cb); - -/** - * @brief Reset all the data related to security and cloud being used in the stack. - * Stack should have been initialized and started before calling this API. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - * @retval #ST_THINGS_ERROR_STACK_NOT_INITIALIZED Stack is not intialized. - * Initialize the stack by calling st_things_initialize(). - * @retval #ST_THINGS_ERROR_STACK_NOT_STARTED Stack is not started. - * Start the stack by calling st_things_start(). - */ -int st_things_reset(void); - -/** - * @brief Callback for carrying the randomly generated PIN info. - * @details Device should show the PIN on display. - * @param[in] pin_data PIN data in string format. - * @param[in] pin_size Length of the PIN String. - */ -typedef void (*st_things_pin_generated_cb)(const char *pin_data, const size_t pin_size); - -/** - * @brief Callback for informing the application to close the PIN display. - */ -typedef void (*st_things_pin_display_close_cb)(void); - -/** - * @brief Callback registration function for getting randomly generated PIN for the PIN-Based Ownership Transfer Request. - * @remarks Only one callback function can be set with this API.\n - * If multiple callbacks are set, the last one is registered only.\n - * And the callbacks are called in the internal thread, which is not detached,\n - * so application should return it to get the next callbacks. - * @param[in] generated_cb Callback function that will be called when device receives a Ownership Transfer request from client. - * @param[in] close_cb Callback function that will be called when Ownership Transfer is done so device can stop showing PIN on display. - * This parameter can be NULL if stop triggering is not needed. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - */ -int st_things_register_pin_handling_cb(st_things_pin_generated_cb generated_cb, st_things_pin_display_close_cb close_cb); - -/** - * @brief Callback for getting user's input regarding mutual verification. - * @return @c true true in cse of confirmed, otherwise @c false - */ -typedef bool (*st_things_user_confirm_cb)(void); - -/** - * @brief Callback registration function for getting user confirmation for MUTUAL VERIFICATION BASED JUST WORK Ownership transfer. - * @remarks Only one callback function can be set with this API.\n - * If multiple callbacks are set, the last one is registered only.\n - * And the callbacks are called in the internal thread, which is not detached,\n - * so application should return it to get the next callbacks. - * @param[in] confirm_cb Callback function that will be called when device receives a confirm request from client. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - */ -int st_things_register_user_confirm_cb(st_things_user_confirm_cb confirm_cb); - -/** - * @brief Callback for getting the current state of ST Things. - * @param[in] things_status ST Things State - */ -typedef void (*st_things_status_change_cb)(st_things_status_e things_status); - -/** - * @brief Callback registration function for getting notified when ST Things state changes. - * @remarks Only one callback function can be set with this API.\n - * If multiple callbacks are set, the last one is registered only.\n - * And the callbacks are called in the internal thread, which is not detached,\n - * so application should return it to get the next callbacks. - * @param[in] status_cb Refernce of the callback function to get ST Things status - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - */ -int st_things_register_things_status_change_cb(st_things_status_change_cb status_cb); - -/** - * @brief Notify the observers of a specific resource. - * Stack should have been initialized and started before calling this API. - * @param[in] resource_uri Resource URI of the resource which will be notified to observers. - * @return @c 0 on success, otherwise a negative error value - * @retval #ST_THINGS_ERROR_NONE Successful - * @retval #ST_THINGS_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #ST_THINGS_ERROR_OPERATION_FAILED Operation failed - * @retval #ST_THINGS_ERROR_STACK_NOT_INITIALIZED Stack is not intialized. - * Initialize the stack by calling st_things_initialize(). - * @retval #ST_THINGS_ERROR_STACK_NOT_STARTED Stack is not started. - * Start the stack by calling st_things_start(). - */ -int st_things_notify_observers(const char *resource_uri); - -/** - * @brief Create an instance of representation. - * @remarks To destroy an instance, st_things_destroy_representation_inst() should be used. - * @return a pointer of the created representation, otherwise a null pointer if the memory is insufficient. - */ -st_things_representation_s *st_things_create_representation_inst(void); - -/** - * @brief Destroy an instance of representation. - * @param[in] rep Representation that will be destroyed. - */ -void st_things_destroy_representation_inst(st_things_representation_s *rep); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __ST_THINGS_H__ */ diff --git a/inc/st_things_types.h b/inc/st_things_types.h deleted file mode 100644 index 344f4b8..0000000 --- a/inc/st_things_types.h +++ /dev/null @@ -1,317 +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. - */ - -#ifndef __ST_THINGS_TYPES_H__ -#define __ST_THINGS_TYPES_H__ - -#include -#include -#include - -/** - * @brief Enumeration for ST Things error code. - */ -typedef enum { - ST_THINGS_ERROR_NONE = 0, /**< Successful */ - ST_THINGS_ERROR_INVALID_PARAMETER = -1, /**< Invalid parameter (If parameter is null or empty)*/ - ST_THINGS_ERROR_OPERATION_FAILED = -2, /**< Operation Failed */ - ST_THINGS_ERROR_STACK_NOT_INITIALIZED = -3, /**< Stack is not yet initialized*/ - ST_THINGS_ERROR_STACK_ALREADY_INITIALIZED = -4, /**< Stack is already initialized*/ - ST_THINGS_ERROR_STACK_NOT_STARTED = -5, /**< Stack is not yet started*/ - ST_THINGS_ERROR_STACK_RUNNING = -6, /**< Stack is currently running*/ -} st_things_error_e; - -/** - * @brief Enumeration for ST Things status. - */ -typedef enum { - ST_THINGS_STATUS_INIT = 0, /**< Initial state of ST Things */ - ST_THINGS_STATUS_ES_STARTED, /**< Easy-setup is started */ - ST_THINGS_STATUS_ES_DONE, /**< Easy-setup is done */ - ST_THINGS_STATUS_ES_FAILED_ON_OWNERSHIP_TRANSFER, /**< Easy-setup failed due to Ownership-Transfer failure */ - ST_THINGS_STATUS_CONNECTING_TO_AP, /**< Connecting to target Wi-Fi access point */ - ST_THINGS_STATUS_CONNECTED_TO_AP, /**< Connected to target Wi-Fi access point */ - ST_THINGS_STATUS_CONNECTING_TO_AP_FAILED, /**< Failed to connect to target Wi-Fi access point */ - ST_THINGS_STATUS_REGISTERING_TO_CLOUD, /**< Trying to Sign-up/Sign-in/Publish-Resource(s) to Cloud */ - ST_THINGS_STATUS_REGISTERED_TO_CLOUD, /**< Publish resource(s) to cloud is complete. Now the Thing is ready to be controlled via Cloud */ - ST_THINGS_STATUS_REGISTERING_FAILED_ON_SIGN_IN, /**< Failed to sign-in to Cloud */ - ST_THINGS_STATUS_REGISTERING_FAILED_ON_PUB_RES /**< Failed to publish resources to Cloud */ -} st_things_status_e; - -/** - * @brief Structure for Representation. - */ -typedef struct _st_things_representation -{ - void* payload; /**< Payload of representation */ - - /** - * @brief API for getting the value of string type property with a key. - * @remarks This API will return deep-copied string value as out parameter, so application must free it after use. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the value. - * @param[out] value String value - * @return @c true if value exist, otherwise @c false - */ - bool (*get_str_value) (struct _st_things_representation* rep, const char* key, char** value); - - /** - * @brief API for getting the value of boolean type property with a key. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the value. - * @param[out] value Bool value - * @return @c true if value exist, otherwise @c false - */ - bool (*get_bool_value) (struct _st_things_representation* rep, const char* key, bool* value); - - /** - * @brief API for getting the value of integer type property with a key. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the value. - * @param[out] value Integer value - * @return @c true if value exist, otherwise @c false - */ - bool (*get_int_value) (struct _st_things_representation* rep, const char* key, int64_t* value); - - /** - * @brief API for getting the value of double type property with a key. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the value. - * @param[out] value Double value - * @return @c true if value exist, otherwise @c false - */ - bool (*get_double_value) (struct _st_things_representation* rep, const char* key, double* value); - - /** - * @brief API for getting the value of byte array type property with a key. - * @remarks This API will return deep-copied byte value as out parameter, so application must free it after use. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the value. - * @param[out] value Byte value - * @param[out] size Size of Byte value - * @return @c true if value exist, otherwise @c false - */ - bool (*get_byte_value) (struct _st_things_representation* rep, const char* key, uint8_t** value, size_t* size); - - /** - * @brief API for getting the value of object type property with a key. - * @remarks This API will return deep-copied object value as out parameter, so application must free it after use.\n - * To free an object, st_things_destroy_representation_inst() in st_things.h should be used. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the value. - * @param[out] value Object value - * @return @c true if value exist, otherwise @c false - */ - bool (*get_object_value) (struct _st_things_representation* rep, const char* key, struct _st_things_representation** value); - - /** - * @brief API for setting the value of string type property with a key. - * @remarks This API will deep-copy the string value inside, so application still has an ownership of memory for the string value. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which will represent the value. - * @param[in] value String value. - * @return @c true if setting value is successful, otherwise @c false - */ - bool (*set_str_value) (struct _st_things_representation* rep, const char* key, const char* value); - - /** - * @brief API for setting the value of boolean type property with a key. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which will represent the value. - * @param[in] value Bool value. - * @return @c true if setting value is successful, otherwise @c false - */ - bool (*set_bool_value) (struct _st_things_representation* rep, const char* key, bool value); - - /** - * @brief API for setting the value of integer type property with a key. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which will represent the value. - * @param[in] value Integer value. - * @return @c true if setting value is successful, otherwise @c false - */ - bool (*set_int_value) (struct _st_things_representation* rep, const char* key, int64_t value); - - /** - * @brief API for setting the value of double type property with a key. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which will represent the value. - * @param[in] value Double value. - * @return @c true if setting value is successful, otherwise @c false - */ - bool (*set_double_value) (struct _st_things_representation* rep, const char* key, double value); - - /** - * @brief API for setting the value of byte array type property with a key. - * @remarks This API will deep-copy the byte value inside, so application still has an ownership of memory for the byte value. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which will represent the value. - * @param[in] value Byte value. - * @param[in] size Size of Byte value. - * @return @c true if setting value is successful, otherwise @c false - */ - bool (*set_byte_value) (struct _st_things_representation* rep, const char* key, const uint8_t* value, size_t size); - - /** - * @brief API for setting the value of object type property with a key. - * @remarks This API will deep-copy the object value inside, so application still has an ownership of memory for the object value. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which will represent the value. - * @param[in] value Object value. - * @return @c true if value exist, otherwise @c false - */ - bool (*set_object_value) (struct _st_things_representation* rep, const char* key, const struct _st_things_representation* value); - - /** - * @brief API for getting the value of string array type property with a key. - * @remarks This API will return deep-copied array value as out parameter, so application must free it after use. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which will represent the array type of value. - * @param[out] array Reference of the string array to where the value will be copied. - * @param[out] length Total number of elements in the array. - * @return @c true if value exist, otherwise @c false - */ - bool (*get_str_array_value) (struct _st_things_representation* rep, const char* key, char*** array, size_t* length); - - /** - * @brief API for getting the value of integer array type property with a key. - * @remarks This API will return deep-copied array value as out parameter, so application must free it after use. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which will represent the array type of value. - * @param[out] array Reference of the integer array where the value will be copied. - * @param[out] length Total number of elements in the array. - * @return @c true if value exist, otherwise @c false - */ - bool (*get_int_array_value) (struct _st_things_representation* rep, const char* key, int64_t** array, size_t* length); - - /** - * @brief API for getting the value of double array type property with a key. - * @remarks This API will return deep-copied array value as out parameter, so application must free it after use. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which will represent the array type of value. - * @param[out] array Reference of the double array where the value will be copied. - * @param[out] length Total number of elements in the array. - * @return @c true if value exist, otherwise @c false - */ - bool (*get_double_array_value) (struct _st_things_representation* rep, const char* key, double** array, size_t* length); - - /** - * @brief API for getting the value of object array type property with a key. - * @remarks This API will return deep-copied array value as out parameter, so application must free it after use.\n - * To free each object in array, st_things_destroy_representation_inst() in st_things.h should be used. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the array type of value. - * @param[out] array Reference of the object array where the value will be copied. - * @param[out] length Total number of elements in the array. - * @return @c true if value exist, otherwise @c false - */ - bool (*get_object_array_value) (struct _st_things_representation* rep, const char* key, struct _st_things_representation*** array, size_t* length); - - /** - * @brief API for setting the value of string array type property with a key. - * @remarks This API will deep-copy the array value inside, so application still has an ownership of memory for the array value. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the value. - * @param[in] array String array type value. - * @param[in] length Total number of elements in the array. - * @return @c true if setting value is successful, otherwise @c false - */ - bool (*set_str_array_value) (struct _st_things_representation* rep, const char* key, const char** array, size_t length); - - /** - * @brief API for setting the value of integer array type property with a key. - * @remarks This API will deep-copy the array value inside, so application still has an ownership of memory for the array value. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the value. - * @param[in] array Integer array type value. - * @param[in] length Total number of elements in the array. - * @return @c true if setting value is successful, otherwise @c false - */ - bool (*set_int_array_value) (struct _st_things_representation* rep, const char* key, const int64_t* array, size_t length); - - /** - * @brief API for setting the value of double array type property with a key. - * @remarks This API will deep-copy the array value inside, so application still has an ownership of memory for the array value. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the value. - * @param[in] array Double array type value. - * @param[in] length Total number of elements in the array. - * @return @c true if setting value is successful, otherwise @c false - */ - bool (*set_double_array_value) (struct _st_things_representation* rep, const char* key, const double* array, size_t length); - - /** - * @brief API for setting the value of object array type property with a key. - * @remarks This API will deep-copy the array value inside, so application still has an ownership of memory for the array value. - * @param[in] rep Instance of Representation. - * @param[in] key Property Name which represents the value. - * @param[in] array Object array type value. - * @param[in] length Total number of elements in the array. - * @return @c true if setting value is successful, otherwise @c false - */ - bool (*set_object_array_value) (struct _st_things_representation* rep, const char* key, const struct _st_things_representation** array, size_t length); - -} st_things_representation_s; - -/** - * @brief Structure for representing the Get Request Message. - */ -typedef struct _st_things_get_request_message -{ - char* resource_uri; /**< Resource URI */ - char* query; /**< One or more query parameters of the request message. Ex: key1=value1;key2=value2;... */ - char* property_key; /**< One or more property key that application needs to set a value for response. Ex: key1;key2;... */ - - /** - * @brief API for getting the value of a specific query from the query parameters of the request. - * @param[in] req_msg Instance of get request message. - * @param[in] key Name of the query.(ex: key1, key2, etc) - * @param[out] value Value of the query.(value1, value2, etc) - * @return @c true if query exist, otherwise @c false - */ - bool (*get_query_value) (struct _st_things_get_request_message* req_msg, const char* key, char** value); - - /** - * @brief API for checking whether the request has a specific property key or not. - * @param[in] req_msg Instance of get request message. - * @param[in] key Name of the property. - * @return @c true if the property key exists, otherwise @c false - */ - bool (*has_property_key) (struct _st_things_get_request_message* req_msg, const char* key); - -} st_things_get_request_message_s; - -/** - * @brief Structure for representing the Set Request Message. - */ -typedef struct _st_things_set_request_message -{ - char* resource_uri; /**< Resource URI */ - char* query; /**< One or more query parameters of the request message. Ex: key1=value1?key2=value2?... */ - struct _st_things_representation* rep; /**< Representation of the set request message */ - - /** - * @brief API for getting the value of a specific query from the query parameters of the request. - * @param[in] req_msg Instance of request message. - * @param[in] key Name of the query.(ex: key1, key2, etc) - * @param[out] value Value of the query.(value1, value2, etc) - * @return @c true if query exist, otherwise @c false - */ - bool (*get_query_value) (struct _st_things_set_request_message* req_msg, const char* key, char** value); - -} st_things_set_request_message_s; - -#endif /* __ST_THINGS_TYPES_H__ */ diff --git a/inc/thing.h b/inc/thing.h deleted file mode 100644 index e91b2d0..0000000 --- a/inc/thing.h +++ /dev/null @@ -1,25 +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. - */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -void init_thing(); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ diff --git a/inc/thing_master_user.h b/inc/thing_master_user.h new file mode 100644 index 0000000..caf4bca --- /dev/null +++ b/inc/thing_master_user.h @@ -0,0 +1,15 @@ +/* + * thing_master_user.h + * + * Created on: Jan 22, 2019 + * Author: segaon + */ + +#ifndef THING_MASTER_USER_H_ +#define THING_MASTER_USER_H_ + +int init_master_app(); + +int deinit_master_app(); + +#endif /* THING_MASTER_USER_H_ */ diff --git a/inc/thing_resource_user.h b/inc/thing_resource_user.h new file mode 100644 index 0000000..cc21125 --- /dev/null +++ b/inc/thing_resource_user.h @@ -0,0 +1,16 @@ +/* + * thing_resource_user.h + * + * Created on: Jan 22, 2019 + * Author: segaon + */ + +#ifndef THING_RESOURCE_USER_H_ +#define THING_RESOURCE_USER_H_ + + +int init_resource_app(); + +int deinit_resource_app(); + +#endif /* THING_RESOURCE_USER_H_ */ diff --git a/lib/liboicdastack.so b/lib/liboicdastack.so deleted file mode 100644 index 4a5cc91959210624be86d284642481a30d40d577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499340 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 DHn0_%qkg7D zviD)+Qs2a$w11<8@-=2_CT`rL>o*0|C*0wkNqpHJNQ@H?=hBcM|fvx zi>GyVB}$uZ;5(RG8XXt%r}@)t^GCABvA^xriTh2#efbWhc0cUTn%M~NkNfLpsw5I{n{D zqVqE2+dECBPMTfu@ywYGT-cf)&%4ioZy%zLe2y_|FQjL`l{w#{_d#_&2YTe2h;M&p z^mHfa=`ecs2K2mHxQuVFL3TpEsed8gZepBktxcZ`?L31#VmqS!r!Bq*8q%Cf(7ft4 z2by1GV|*-Ovkse$oiESx?j~rx78+*!d7F>dC1@D4`ymbct!#sD-Uc+>>~dyhK7NJv zLa&7eoy%)0fTKBqqcOnYdi1vqm)l*(Rb~CHEYJ7%k>Jw)lJxh+9>J%uQB&*@0JYe| zdTdoGWwKc*pq}z-paR&7{X2loY9u|)_24J5i@*?&lTD>;igY!Q22y}*ZmH}X>EU~^ zsX!MniQU_ejZ@jlzvX-mFbkw9Ps-AZS)e!V@?eR}Uycx7*O-|OnE zj&P{H{7kR!bgI7YhqNospl|Ml{sG?#iu{8!;T5f#pVEa>AC2Q4PJ`OfTxBnPyJU-g z$M4XhL&EvemhkIZEH6Ft4wKu#SAWiuM^Im0@Knbw=aq6L8 zTF?_JDI?^#NE5G-1l9l_7&U2BKSDd4)e6fJ6 zR59kIz}m;KBj}4>59Ea)6 zs~NX&eyjT}FLY1)I5n(C)lQaY^=@;N zrp(U>hkfvU6z@ZOpld#9^UZCG_o2{P{sr0KmHe6gu6vmOKr^t4ZkS{2dq|Ie6h8qN z0J2tokhI5Bt1Nb1|BU#Xy&dppp0>l72mammD)U*xzIfco`{I7B#^Y1gmlYc$@5?cp ztGV*LP5f}|PaJ&(V<6tmMs
wDPBPg%aw@)MTNSpIEEx+6H8Ot|YzQXb?mM^vZ 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 literal 0 HcmV?d00001 diff --git a/project_def.prop b/project_def.prop index 230bc59..97d1dff 100644 --- a/project_def.prop +++ b/project_def.prop @@ -1,11 +1,11 @@ -APPNAME = co2sensor +APPNAME = co2_50 type = app -profile = iot-headless-4.0 +profile = iot-headless-5.0 -USER_SRCS = src/co2sensor.c +USER_SRCS = src/co2_50.c USER_DEFS = -USER_INC_DIRS = inc, inc/sdk +USER_INC_DIRS = inc USER_OBJS = -USER_LIBS = lib/liboicdastack.so, lib/libsdkapi.so +USER_LIBS = lib/libst_thing_master_api.so, lib/libst_thing_resource_api.so USER_EDCS = diff --git a/res/device_def.json b/res/device_def.json deleted file mode 100644 index 66e305c..0000000 --- a/res/device_def.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "device": [ - { - "specification": { - "device": { - "deviceType": "x.wwst.d.basic", - "deviceName": "co2sensor", - "specVersion": "core.1.1.0", - "dataModelVersion": "res.1.1.0" - }, - "platform": { - "manufacturerName": "fC3T", - "manufacturerUrl": "http://www.samsung.com/sec/", - "manufacturingDate": "2017-11-29", - "modelNumber": "NWSP-01", - "platformVersion": "1.0", - "osVersion": "1.0", - "hardwareVersion": "1.0", - "firmwareVersion": "1.0", - "vendorId": "vid_1001" - } - }, - "resources": { - "single": [ - { - "uri": "/capability/switch/main/0", - "types": [ - "x.com.st.powerswitch" - ], - "interfaces": [ - "oic.if.a", - "oic.if.baseline" - ], - "policy": 3 - }, - { - "uri": "/capability/airQualitySensor/main/0", - "types": [ - "x.com.st.airqualitylevel" - ], - "interfaces": [ - "oic.if.s", - "oic.if.baseline" - ], - "policy": 3 - }, - { - "uri": "/capability/thermostatCoolingSetpoint/main/0", - "types": [ - "x.com.st.temperature.cooling" - ], - "interfaces": [ - "oic.if.a", - "oic.if.s", - "oic.if.baseline" - ], - "policy": 3 - } - ] - } - } - ], - "resourceTypes": [ - { - "type": "x.com.st.powerswitch", - "properties": [ - { - "key": "power", - "type": 3, - "mandatory": true, - "rw": 3 - } - ] - }, - { - "type": "x.com.st.airqualitylevel", - "properties": [ - { - "key": "airQuality", - "type": 2, - "mandatory": true, - "rw": 1 - }, - { - "key": "range", - "type": 7, - "mandatory": true, - "rw": 1 - } - ] - }, - { - "type": "x.com.st.temperature.cooling", - "properties": [ - { - "key": "temperature", - "type": 2, - "mandatory": true, - "rw": 3 - }, - { - "key": "range", - "type": 7, - "mandatory": true, - "rw": 3 - }, - { - "key": "units", - "type": 3, - "mandatory": true, - "rw": 3 - } - ] - } - ], - "configuration": { - "easySetup": { - "connectivity": { - "type": 1, - "softAP": { - "setupId": "001", - "artik": false - } - }, - "ownershipTransferMethod": 2 - }, - "wifi": { - "interfaces": 15, - "frequency": 1 - }, - "filePath": { - "svrdb": "artikserversecured.dat", - "provisioning": "provisioning.dat", - "certificate": "certificate.pem", - "privateKey": "privatekey.der" - } - } -} \ No newline at end of file diff --git a/shared/res/co2_50.png b/shared/res/co2_50.png new file mode 100644 index 0000000000000000000000000000000000000000..9765b1bda7e5bddf0925555ab204b887a873bf24 GIT binary patch literal 57662 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 kZ}gYfNaCF}xV$|1>H6z0+kDresource_uri); + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; - if (req_msg->has_property_key(req_msg, PROP_AIRQUALITY)) { - g_co2_sensor_value = resource_update_co2_sensor_value(); - resp_rep->set_int_value(resp_rep, PROP_AIRQUALITY, g_co2_sensor_value); + g_co2_sensor_value = resource_update_co2_sensor_value(); + error = smartthings_payload_set_int(resp_payload, PROP_AIRQUALITY, g_co2_sensor_value); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_int() failed, [%d]", error); + return false; } - if (req_msg->has_property_key(req_msg, PROP_RANGE)) { - resp_rep->set_double_array_value(resp_rep, PROP_RANGE, (double*)&g_range, g_length); + + error = smartthings_payload_set_double_array(resp_payload, PROP_RANGE, (double*)&g_range, g_length); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_double_array() failed, [%d]", error); + return false; } return true; diff --git a/src/capability/capability_switch.c b/src/capability/capability_switch.c index 3310ad7..e18e861 100644 --- a/src/capability/capability_switch.c +++ b/src/capability/capability_switch.c @@ -14,57 +14,66 @@ * limitations under the License. */ -#include "st_things.h" +#include "smartthings_resource.h" #include "log.h" #define VALUE_STR_LEN_MAX 32 -static const char* PROP_POWER = "power"; -static const char* VALUE_SWITCH_ON = "on"; -static const char* VALUE_SWITCH_OFF = "off"; +static const char *PROP_POWER = "power"; +static const char *VALUE_SWITCH_ON = "on"; +static const char *VALUE_SWITCH_OFF = "off"; static char g_switch[VALUE_STR_LEN_MAX] = "off"; bool g_switch_is_on = false; -bool handle_get_request_on_resource_capability_switch(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep) +bool handle_get_request_on_resource_capability_switch_main_0(smartthings_payload_h resp_payload, void *user_data) { - DBG("Received a GET request on %s\n", req_msg->resource_uri); + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; - if (req_msg->has_property_key(req_msg, PROP_POWER)) { - resp_rep->set_str_value(resp_rep, PROP_POWER, g_switch); - } - else + error = smartthings_payload_set_string(resp_payload, PROP_POWER, g_switch); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_string() failed, [%d]", error); return false; + } + _D("get switch : %s", g_switch); + return true; } -bool handle_set_request_on_resource_capability_switch(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep) +bool handle_set_request_on_resource_capability_switch_main_0(smartthings_payload_h payload, smartthings_payload_h resp_payload, void *user_data) { - DBG("Received a SET request on %s\n", req_msg->resource_uri); - char *str_value = NULL; - req_msg->rep->get_str_value(req_msg->rep, PROP_POWER, &str_value); + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; + + error = smartthings_payload_get_string(payload, PROP_POWER, &str_value); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_get_string() failed, [%d]", error); + return false; + } + _D("set switch : %s", str_value); /* check validation */ if ((0 != strncmp(str_value, VALUE_SWITCH_ON, strlen(VALUE_SWITCH_ON))) && (0 != strncmp(str_value, VALUE_SWITCH_OFF, strlen(VALUE_SWITCH_OFF)))) { - ERR("Not supported value!!"); + _E("Not supported value!!"); free(str_value); return false; } + if (0 != strncmp(str_value, g_switch, strlen(g_switch))) { strncpy(g_switch, str_value, VALUE_STR_LEN_MAX); if (0 == strncmp(g_switch, VALUE_SWITCH_ON, strlen(VALUE_SWITCH_ON))) { g_switch_is_on = true; - } - else { + } else { g_switch_is_on = false; } } - resp_rep->set_str_value(resp_rep, PROP_POWER, g_switch); - - st_things_notify_observers(req_msg->resource_uri); - free(str_value); + error = smartthings_payload_set_string(resp_payload, PROP_POWER, g_switch); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_string() failed, [%d]", error); + return false; + } + return true; } diff --git a/src/capability/capability_thermostatcoolingsetpoint.c b/src/capability/capability_thermostatcoolingsetpoint.c index 90712e2..ea5b8a1 100644 --- a/src/capability/capability_thermostatcoolingsetpoint.c +++ b/src/capability/capability_thermostatcoolingsetpoint.c @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "st_things.h" +#include "smartthings_resource.h" #include "log.h" static const char* PROP_TEMPERATURE = "temperature"; @@ -30,52 +30,82 @@ extern void resource_init_co2_sensor(void); extern int resource_get_co2_sensor_parameter(void); extern void resource_set_sensor_parameter(int zero_volts); -bool handle_get_request_on_resource_capability_thermostatcoolingsetpoint(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep) +bool handle_get_request_on_resource_capability_thermostatcoolingsetpoint_main_0(smartthings_payload_h resp_payload, void *user_data) { - DBG("Received a GET request on %s\n", req_msg->resource_uri); + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; - if (req_msg->has_property_key(req_msg, PROP_TEMPERATURE)) { - DBG("requested temperature"); - if (0 == g_temperature) - g_temperature = (double)resource_get_co2_sensor_parameter(); - resp_rep->set_double_value(resp_rep, PROP_TEMPERATURE, g_temperature); + if (0 == g_temperature) { + g_temperature = (double)resource_get_co2_sensor_parameter(); + error = smartthings_payload_set_double(resp_payload, PROP_TEMPERATURE, g_temperature); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_double() failed, [%d]", error); + return false; + } } - if (req_msg->has_property_key(req_msg, PROP_RANGE)) { - //DBG("requested range"); - resp_rep->set_double_array_value(resp_rep, PROP_RANGE, (double*)&g_range, g_length); + + error = smartthings_payload_set_double_array(resp_payload, PROP_RANGE, (double*)&g_range, g_length); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_double_array() failed, [%d]", error); + return false; } - if (req_msg->has_property_key(req_msg, PROP_UNITS)) { - //DBG("requested units"); - resp_rep->set_str_value(resp_rep, PROP_UNITS, g_unit); + + error = smartthings_payload_set_string(resp_payload, PROP_UNITS, g_unit); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_string() failed, [%d]", error); + return false; } + return true; } -bool handle_set_request_on_resource_capability_thermostatcoolingsetpoint(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep) +bool handle_set_request_on_resource_capability_thermostatcoolingsetpoint_main_0(smartthings_payload_h payload, smartthings_payload_h resp_payload, void *user_data) { - DBG("Received a SET request on %s\n", req_msg->resource_uri); + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; double dvalue = 0; - if (req_msg->rep->get_double_value(req_msg->rep, PROP_TEMPERATURE, &dvalue)) { - g_temperature = dvalue; - resource_set_sensor_parameter((int32_t)g_temperature); - resource_init_co2_sensor(); - resp_rep->set_double_value(resp_rep, PROP_TEMPERATURE, dvalue); - DBG("set requested: %.f\n", g_temperature); + error = smartthings_payload_get_double(payload, PROP_TEMPERATURE, &dvalue); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_get_double() failed, [%d]", error); + return false; + } + g_temperature = dvalue; + resource_set_sensor_parameter((int32_t)g_temperature); + resource_init_co2_sensor(); + + error = smartthings_payload_set_double(resp_payload, PROP_TEMPERATURE, dvalue); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_double() failed, [%d]", error); + return false; } char *str_value = NULL; - if (req_msg->rep->get_str_value(req_msg->rep, PROP_UNITS, &str_value)) { - resp_rep->set_str_value(resp_rep, PROP_UNITS, g_unit); + error = smartthings_payload_get_string(payload, PROP_UNITS, &str_value); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_get_string() failed, [%d]", error); free(str_value); + return false; } + error = smartthings_payload_set_string(resp_payload, PROP_UNITS, g_unit); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_string() failed, [%d]", error); + free(str_value); + return false; + } + free(str_value); double davalue[2] = { 0, }; size_t dlength = 0; - if (req_msg->rep->get_double_array_value(req_msg->rep, PROP_RANGE, (double**)&davalue, &dlength )) { - resp_rep->set_double_array_value(resp_rep, PROP_RANGE, g_range, g_length); + error = smartthings_payload_get_double_array(payload, PROP_RANGE, (double**)&davalue, &dlength); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_get_double_array() failed, [%d]", error); + return false; + } + + error = smartthings_payload_set_double_array(resp_payload, PROP_RANGE, g_range, g_length); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_double_array() failed, [%d]", error); + return false; } - st_things_notify_observers(req_msg->resource_uri); return true; } diff --git a/src/co2sensor.c b/src/co2sensor.c index b1320a8..14570d3 100644 --- a/src/co2sensor.c +++ b/src/co2sensor.c @@ -16,105 +16,54 @@ #include #include -#include -#include "st_things.h" +#include "smartthings.h" +#include "smartthings_resource.h" +#include "smartthings_payload.h" +#include "resource/resource_co2_sensor.h" #include "log.h" #include -#define JSON_PATH "device_def.json" +static const char *RES_CAPABILITY_SWITCH = "/capability/switch/main/0"; +static const char *RES_CAPABILITY_THERMOSTATCOOLINGSETPOINT = "/capability/thermostatCoolingSetpoint/main/0"; +static const char *RES_CAPABILITY_AIRQUALITYSENSOR = "/capability/airQualitySensor/main/0"; -static const char* RES_CAPABILITY_SWITCH = "/capability/switch/main/0"; -static const char* RES_CAPABILITY_THERMOSTATCOOLINGSETPOINT = "/capability/thermostatCoolingSetpoint/main/0"; -static const char* RES_CAPABILITY_AIRQUALITYSENSOR = "/capability/airQualitySensor/main/0"; +smartthings_resource_h st_handle = NULL; +static bool is_init = false; +static bool is_resource_init = false; +static smartthings_h st_h; + +smartthings_status_e st_things_status = -1; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; extern int thread_done; /* resource_co2_sensor.c */ /* get and set request handlers */ -extern bool handle_get_request_on_resource_capability_switch(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep); -extern bool handle_set_request_on_resource_capability_switch(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep); -extern bool handle_get_request_on_resource_capability_thermostatcoolingsetpoint(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep); -extern bool handle_set_request_on_resource_capability_thermostatcoolingsetpoint(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep); -extern bool handle_get_request_on_resource_capability_airqualitysensor(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep); +extern bool handle_get_request_on_resource_capability_switch_main_0(smartthings_payload_h resp_payload, void *user_data); +extern bool handle_set_request_on_resource_capability_switch_main_0(smartthings_payload_h payload, smartthings_payload_h resp_payload, void *user_data); +extern bool handle_get_request_on_resource_capability_airqualitysensor_main_0(smartthings_payload_h resp_payload, void *user_data); +extern bool handle_get_request_on_resource_capability_thermostatcoolingsetpoint_main_0(smartthings_payload_h resp_payload, void *user_data); +extern bool handle_set_request_on_resource_capability_thermostatcoolingsetpoint_main_0(smartthings_payload_h payload, smartthings_payload_h resp_payload, void *user_data); extern void *thread_sensor_main(void *arg); extern void *thread_sensor_notify(void *arg); -/* handle : for getting request on resources */ -bool handle_get_request(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep) -{ - //DBG("resource_uri [%s]", req_msg->resource_uri); - - if (0 == strcmp(req_msg->resource_uri, RES_CAPABILITY_SWITCH)) { - return handle_get_request_on_resource_capability_switch(req_msg, resp_rep); - } - if (0 == strcmp(req_msg->resource_uri, RES_CAPABILITY_THERMOSTATCOOLINGSETPOINT)) { - return handle_get_request_on_resource_capability_thermostatcoolingsetpoint(req_msg, resp_rep); - } - if (0 == strcmp(req_msg->resource_uri, RES_CAPABILITY_AIRQUALITYSENSOR)) { - return handle_get_request_on_resource_capability_airqualitysensor(req_msg, resp_rep); - } - - ERR("not supported uri"); - return false; -} - -/* handle : for setting request on resources */ -bool handle_set_request(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep) -{ - DBG("resource_uri [%s]", req_msg->resource_uri); - - if (0 == strcmp(req_msg->resource_uri, RES_CAPABILITY_SWITCH)) { - return handle_set_request_on_resource_capability_switch(req_msg, resp_rep); - } - if (0 == strcmp(req_msg->resource_uri, RES_CAPABILITY_THERMOSTATCOOLINGSETPOINT)) { - return handle_set_request_on_resource_capability_thermostatcoolingsetpoint(req_msg, resp_rep); - } - - ERR("not supported uri"); - return false; -} - -/* callback functions */ -bool handle_reset_request(void) -{ - DBG("Received a request for RESET."); - return false; -} - -void handle_reset_result(bool result) -{ - DBG("Reset %s.\n", result ? "succeeded" : "failed"); -} - -bool handle_ownership_transfer_request(void) -{ - DBG("Received a request for Ownership-transfer."); - return true; -} - -void handle_things_status_change(st_things_status_e things_status) -{ - DBG("Things status is changed: %d\n", things_status); -} - void sig_handler(int sig) { switch (sig) { case SIGINT: - INFO("SIGINT received"); + _I("SIGINT received"); thread_done = 1; break; case SIGSEGV: - INFO("SIGSEGV received"); + _I("SIGSEGV received"); thread_done = 1; break; case SIGTERM: - INFO("SIGTERM received"); + _I("SIGTERM received"); thread_done = 1; break; default: - ERR("wasn't expecting that sig [%d]", sig); + _E("wasn't expecting that sig [%d]", sig); abort(); } } @@ -122,8 +71,6 @@ void sig_handler(int sig) /* main loop */ void handle_main_loop(void) { - FN_CALL; - pthread_t p_thread[2]; int ret = 0; @@ -135,112 +82,383 @@ void handle_main_loop(void) ret = pthread_create(&p_thread[0], NULL, &thread_sensor_main, NULL); if (ret != 0) { - ERR("[ERROR] thread_sensor_main create failed, ret=%d", ret); + _E("[ERROR] thread_sensor_main create failed, ret=%d", ret); return; } ret = pthread_create(&p_thread[1], NULL, &thread_sensor_notify, NULL); if (ret != 0) { - ERR("[ERROR] thread_sensor_notify create failed, ret=%d", ret); + _E("[ERROR] thread_sensor_notify create failed, ret=%d", ret); return; } } -/* initialize */ -void init_thing() +void _send_response_result_cb(smartthings_resource_error_e result, void *user_data) { - FN_CALL; - static bool binitialized = false; - if (binitialized) { - DBG("Already initialized!!"); - return; - } + _D("app_control reply callback for send_response : result=[%d]", result); +} - bool easysetup_complete = false; +void _notify_result_cb(smartthings_resource_error_e result, void *user_data) +{ + _D("app_control reply callback for notify : result=[%d]", result); +} - char app_json_path[128] = {0,}; - char *app_res_path = NULL; - char *app_data_path = NULL; +void _request_cb(smartthings_resource_h st_h, int req_id, const char *uri, smartthings_resource_req_type_e req_type, + smartthings_payload_h payload, void *user_data) +{ + START; + + smartthings_payload_h resp_payload = NULL; - app_res_path = app_get_resource_path(); - if (!app_res_path) { - ERR("app_res_path is NULL!!"); + smartthings_payload_create(&resp_payload); + if (!resp_payload) { + _E("Response payload is NULL"); return; } - app_data_path = app_get_data_path(); - if (!app_data_path) { - ERR("app_data_path is NULL!!"); - free(app_res_path); + bool result = false; + + if (req_type == SMARTTHINGS_RESOURCE_REQUEST_GET) { + if (0 == strncmp(uri, RES_CAPABILITY_SWITCH, strlen(RES_CAPABILITY_SWITCH))) { + result = handle_get_request_on_resource_capability_switch_main_0(resp_payload, user_data); + } + if (0 == strncmp(uri, RES_CAPABILITY_AIRQUALITYSENSOR, strlen(RES_CAPABILITY_AIRQUALITYSENSOR))) { + result = handle_get_request_on_resource_capability_airqualitysensor_main_0(resp_payload, user_data); + } + if (0 == strncmp(uri, RES_CAPABILITY_THERMOSTATCOOLINGSETPOINT, strlen(RES_CAPABILITY_THERMOSTATCOOLINGSETPOINT))) { + result = handle_get_request_on_resource_capability_thermostatcoolingsetpoint_main_0(resp_payload, user_data); + } + } else if (req_type == SMARTTHINGS_RESOURCE_REQUEST_SET) { + if (0 == strncmp(uri, RES_CAPABILITY_SWITCH, strlen(RES_CAPABILITY_SWITCH))) { + result = handle_set_request_on_resource_capability_switch_main_0(payload, resp_payload, user_data); + } + if (0 == strncmp(uri, RES_CAPABILITY_THERMOSTATCOOLINGSETPOINT, strlen(RES_CAPABILITY_THERMOSTATCOOLINGSETPOINT))) { + result = handle_set_request_on_resource_capability_thermostatcoolingsetpoint_main_0(payload, resp_payload, user_data); + } + } else { + _E("Invalid request type"); + smartthings_payload_destroy(resp_payload); + END; return; } - snprintf(app_json_path, sizeof(app_json_path), "%s/%s", app_res_path, JSON_PATH); + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; - if (0 != st_things_set_configuration_prefix_path((const char *)app_res_path, (const char *)app_data_path)) { - ERR("st_things_set_configuration_prefix_path() failed!!"); - free(app_res_path); - free(app_data_path); - return; + error = smartthings_resource_send_response(st_h, req_id, uri, resp_payload, result); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + smartthings_payload_destroy(resp_payload); + _E("smartthings_resource_send_response() failed, err=[%d]", error); + END; + return; } - free(app_res_path); - free(app_data_path); + if (req_type == SMARTTHINGS_RESOURCE_REQUEST_SET) { + error = smartthings_resource_notify(st_h, uri, resp_payload); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_resource_notify() failed, err=[%d]", error); + } + } - if (0 != st_things_initialize(app_json_path, &easysetup_complete)) { - ERR("st_things_initialize() failed!!"); - return; + if (smartthings_payload_destroy(resp_payload) != 0) { + _E("smartthings_payload_destroy failed"); + } + + END; + return; +} + +static void _resource_connection_status_cb(smartthings_resource_h handle, smartthings_resource_connection_status_e status, void *user_data) +{ + START; + + if (status == SMARTTHINGS_RESOURCE_CONNECTION_STATUS_CONNECTED) { + if (smartthings_resource_set_request_cb(st_handle, _request_cb, NULL) != 0) { + _E("smartthings_resource_set_request_cb() is failed"); + return; + } + } else { + _I("connection failed, status=[%d]", status); } - binitialized = true; + END; + return; +} - DBG("easysetup_complete:[%d] ", easysetup_complete); +int init_resource_app() +{ + START; - st_things_register_request_cb(handle_get_request, handle_set_request); - st_things_register_reset_cb(handle_reset_request, handle_reset_result); - st_things_register_user_confirm_cb(handle_ownership_transfer_request); - st_things_register_things_status_change_cb(handle_things_status_change); + if (is_resource_init) { + _I("Already initialized!"); + return 0; + } - st_things_start(); + if (smartthings_resource_initialize(&st_handle, _resource_connection_status_cb, NULL) != 0) { + _E("smartthings_resource_initialize() is failed"); + goto _out; + } - handle_main_loop(); + is_resource_init = true; + + END; + return 0; + +_out : + END; + return -1; +} + +int deinit_resource_app() +{ + START; + + if (!st_handle) + return 0; + + smartthings_resource_unset_request_cb(st_handle); + + if (smartthings_resource_deinitialize(st_handle) != 0) + return -1; + + is_init = false; + + END; + return 0; +} - FN_END; +void _user_confirm_cb(smartthings_h handle, void *user_data) +{ + START; + + if (smartthings_send_user_confirm(handle, true) != 0) + _E("smartthings_send_user_confirm() is failed"); + + END; + return; +} + +void _reset_confirm_cb(smartthings_h handle, void *user_data) +{ + START; + + if (smartthings_send_reset_confirm(handle, true) != 0) + _E("smartthings_send_reset_confirm() is failed"); + + END; + return; +} + +static void _reset_result_cb(smartthings_h handle, bool result, void *user_data) +{ + START; + + _I("reset result = [%d]", result); + + END; + return; +} + +static void _thing_status_cb(smartthings_h handle, smartthings_status_e status, void *user_data) +{ + START; + + _D("Received status changed cb : status = [%d]", status); + + switch (status) { + case SMARTTHINGS_STATUS_NOT_READY: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_NOT_READY"); + break; + case SMARTTHINGS_STATUS_INIT: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_INIT"); + break; + case SMARTTHINGS_STATUS_ES_STARTED: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_ES_STARTED"); + break; + case SMARTTHINGS_STATUS_ES_DONE: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_ES_DONE"); + break; + case SMARTTHINGS_STATUS_ES_FAILED_ON_OWNERSHIP_TRANSFER: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_ES_FAILED_ON_OWNERSHIP_TRANSFER"); + break; + case SMARTTHINGS_STATUS_CONNECTING_TO_AP: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_CONNECTING_TO_AP"); + break; + case SMARTTHINGS_STATUS_CONNECTED_TO_AP: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_CONNECTED_TO_AP"); + break; + case SMARTTHINGS_STATUS_CONNECTING_TO_AP_FAILED: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_CONNECTING_TO_AP_FAILED"); + break; + case SMARTTHINGS_STATUS_REGISTERING_TO_CLOUD: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_REGISTERING_TO_CLOUD"); + break; + case SMARTTHINGS_STATUS_REGISTERED_TO_CLOUD: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_REGISTERED_TO_CLOUD"); + break; + case SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_SIGN_IN: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_SIGN_IN"); + break; + case SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_PUB_RES: + _I("status: [%d] [%s]", status, "SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_PUB_RES"); + break; + default: + _E("status: [%d][%s]", status, "Unknown Status"); + break; + } + END; + return; +} + +static void _things_connection_status_cb(smartthings_h handle, smartthings_connection_status_e status, void *user_data) +{ + START; + + _D("Received connection status changed cb : status = [%d]", status); + + if (status == SMARTTHINGS_CONNECTION_STATUS_CONNECTED) { + const char* dev_name = "IoT Test Device"; + 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; + + if (smartthings_set_device_property(handle, dev_name, wifi_mode, wifi_freq) != 0) { + _E("smartthings_initialize() is failed"); + return; + } + + if (smartthings_set_certificate_file(handle, "certificate.pem", "privatekey.der") != 0) { + _E("smartthings_set_certificate_file() is failed"); + return; + } + + if (smartthings_set_user_confirm_cb(st_h, _user_confirm_cb, NULL) != 0) { + _E("smartthings_set_user_confirm_cb() is failed"); + return; + } + + if (smartthings_set_reset_confirm_cb(handle, _reset_confirm_cb, NULL) != 0) { + _E("smartthings_set_reset_confirm_cb() is failed"); + return; + } + + if (smartthings_set_reset_result_cb(handle, _reset_result_cb, NULL) != 0) { + _E("smartthings_set_reset_confirm_cb() is failed"); + return; + } + + if (smartthings_set_status_changed_cb(handle, _thing_status_cb, NULL) != 0) { + _E("smartthings_set_status_changed_callback() is failed"); + return; + } + + if (smartthings_start(handle) != 0) { + _E("smartthings_start() is failed"); + return; + } + + bool is_es_completed = false; + if (smartthings_get_easysetup_status(handle, &is_es_completed) != 0) { + _E("smartthings_get_easysetup_status() is failed"); + return; + } + + if (is_es_completed == true) { + _I("Easysetup is already done"); + return; + } + + if (smartthings_start_easysetup(handle) != 0) { + _E("smartthings_start_easysetup() is failed"); + return; + } + } else { + _E("connection failed, status=[%d]", status); + } + + END; + return; +} + +int init_master_app() +{ + START; + + if (is_init) { + _I("Already initialized!"); + END; + return 0; + } + + if (smartthings_initialize(&st_h, _things_connection_status_cb, NULL) != 0) { + _E("smartthings_initialize() is failed"); + goto _out; + } + + is_init = true; + + END; + return 0; + +_out : + END; + return -1; +} + +int deinit_master_app() +{ + START; + + is_init = false; + + if (!st_h) { + _I("handle is already NULL"); + END; + return 0; + } + + smartthings_unset_user_confirm_cb(st_h); + smartthings_unset_reset_confirm_cb(st_h); + smartthings_unset_reset_result_cb(st_h); + smartthings_unset_status_changed_cb(st_h); + + if (smartthings_deinitialize(st_h) != 0) { + _E("smartthings_deinitialize() is failed"); + END; + return -1; + } + + END; + return 0; } static bool service_app_create(void *user_data) { - UNUSED(user_data); + handle_main_loop(); return true; } static void service_app_terminate(void *user_data) { - UNUSED(user_data); - MUTEX_LOCK; thread_done = 1; MUTEX_UNLOCK; int status = pthread_mutex_destroy(&mutex); - INFO("mutex destroy status = %d", status); + _I("mutex destroy status = %d", status); } static void service_app_control(app_control_h app_control, void *user_data) { - UNUSED(user_data); if (app_control == NULL) { - ERR("app_control is NULL"); + _E("app_control is NULL"); return; } - init_thing(); + init_master_app(); + init_resource_app(); } int main(int argc, char *argv[]) { - FN_CALL; - service_app_lifecycle_callback_s event_callback; event_callback.create = service_app_create; diff --git a/src/resource/resource_adc_mcp3008.c b/src/resource/resource_adc_mcp3008.c index 0a0ae4d..19f6d44 100644 --- a/src/resource/resource_adc_mcp3008.c +++ b/src/resource/resource_adc_mcp3008.c @@ -54,7 +54,7 @@ static unsigned int ref_count = 0; #define retv_if(expr, val) do { \ if (expr) { \ - ERR("(%s) -> %s() return", #expr, __FUNCTION__); \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ return (val); \ } \ } while (0) @@ -66,7 +66,7 @@ int resource_adc_mcp3008_init(void) char *model_name = NULL; if (MCP3008_H) { - DBG("SPI device already initialized [ref_count : %u]", ref_count); + _D("SPI device already initialized [ref_count : %u]", ref_count); MUTEX_LOCK; ref_count++; MUTEX_UNLOCK; @@ -75,7 +75,7 @@ int resource_adc_mcp3008_init(void) system_info_get_platform_string(MODEL_NAME_KEY, &model_name); if (!model_name) { - ERR("fail to get model name"); + _E("fail to get model name"); return -1; } @@ -84,43 +84,43 @@ int resource_adc_mcp3008_init(void) } else if (!strcmp(model_name, MODEL_NAME_ARTIK)) { bus = 2; // ARTIK (2) } else { - ERR("unknown model name : %s", model_name); + _E("unknown model name : %s", model_name); free(model_name); return -1; } - DBG("%s model_name: %s, bus: %d", __func__, model_name, bus); + _D("%s model_name: %s, bus: %d", __func__, model_name, bus); free(model_name); model_name = NULL; ret = peripheral_spi_open(bus, 0, &MCP3008_H); if (PERIPHERAL_ERROR_NONE != ret) { - ERR("spi open failed :%s ", get_error_message(ret)); + _E("spi open failed :%s ", get_error_message(ret)); return -1; } ret = peripheral_spi_set_mode(MCP3008_H, PERIPHERAL_SPI_MODE_0); if (PERIPHERAL_ERROR_NONE != ret) { - ERR("peripheral_spi_set_mode failed :%s ", get_error_message(ret)); + _E("peripheral_spi_set_mode failed :%s ", get_error_message(ret)); goto error_after_open; } ret = peripheral_spi_set_bit_order(MCP3008_H, PERIPHERAL_SPI_BIT_ORDER_MSB); if (PERIPHERAL_ERROR_NONE != ret) { - ERR("peripheral_spi_set_bit_order failed :%s ", get_error_message(ret)); + _E("peripheral_spi_set_bit_order failed :%s ", get_error_message(ret)); goto error_after_open; } ret = peripheral_spi_set_bits_per_word(MCP3008_H, MCP3008_BPW); if (PERIPHERAL_ERROR_NONE != ret) { - ERR("peripheral_spi_set_bits_per_word failed :%s ", get_error_message(ret)); + _E("peripheral_spi_set_bits_per_word failed :%s ", get_error_message(ret)); goto error_after_open; } ret = peripheral_spi_set_frequency(MCP3008_H, MCP3008_SPEED); if (PERIPHERAL_ERROR_NONE != ret) { - ERR("peripheral_spi_set_frequency failed :%s ", get_error_message(ret)); + _E("peripheral_spi_set_frequency failed :%s ", get_error_message(ret)); goto error_after_open; } - DBG("%s success: %d", __func__, ref_count); + _D("%s success: %d", __func__, ref_count); MUTEX_LOCK; ref_count++; @@ -129,7 +129,7 @@ int resource_adc_mcp3008_init(void) return 0; error_after_open: - DBG("%s error: %d", __func__, ref_count); + _D("%s error: %d", __func__, ref_count); peripheral_spi_close(MCP3008_H); MCP3008_H = NULL; return -1; @@ -196,7 +196,7 @@ int resource_read_adc_mcp3008(int ch_num, unsigned int *out_value) spi_err_cnt++; if (spi_err_cnt >= 100) { - DBG("resource_read_adc_mcp3008 rx_w2_nb is not 0 -> rx: %02x, count: %d", rx[1], spi_read_cnt); + _D("resource_read_adc_mcp3008 rx_w2_nb is not 0 -> rx: %02x, count: %d", rx[1], spi_read_cnt); spi_err_cnt = 0; } return -1; diff --git a/src/resource/resource_co2_sensor.c b/src/resource/resource_co2_sensor.c index 567df0e..a14ba24 100644 --- a/src/resource/resource_co2_sensor.c +++ b/src/resource/resource_co2_sensor.c @@ -18,7 +18,7 @@ #include #include #include -#include "st_things.h" +#include "smartthings_resource.h" #include "resource/resource_co2_sensor.h" #include "log.h" @@ -45,6 +45,8 @@ #define VOLT_V_REACT (VOLT_V_ZERO - VOLT_V_MAX) static const char* RES_CAPABILITY_AIRQUALITYSENSOR = "/capability/airQualitySensor/main/0"; +static const char* PROP_AIRQUALITY = "airQuality"; + static float mg811_co2_slope; // refer to datasheet, mg811 co2 slope value static sensor_mg811_t mg_sensor; @@ -52,6 +54,7 @@ co2_sensor_data_t co2_sensor; int thread_done = 0; extern int32_t g_co2_sensor_value; extern bool g_switch_is_on; +extern smartthings_resource_h st_handle; extern int resource_read_adc_mcp3008(int ch_num, unsigned int *out_value); /* resource_adc_mcp3008.c */ extern int resource_adc_mcp3008_init(void); /* resource_adc_mcp3008.c */ @@ -76,9 +79,9 @@ static void _init_co2_mg811_set(float zero_volts, float max_volts) reaction_volts = VOLT_V_REACT; mg811_co2_slope = reaction_volts / (POINT_X_ZERO - POINT_X_MAX); #if defined(__DEBUG__) - DBG("CO2Volage zero_volts: %.f mV, max_volts: %.f mV, reaction %.f mV", + _D("CO2Volage zero_volts: %.f mV, max_volts: %.f mV, reaction %.f mV", sen->zero_point_volts * 1000., sen->max_point_volts * 1000., reaction_volts * 1000.); - DBG("mg811_ppm: %.3f V, %.3f", POINT_X_ZERO, mg811_co2_slope); + _D("mg811_ppm: %.3f V, %.3f", POINT_X_ZERO, mg811_co2_slope); #endif } @@ -94,7 +97,7 @@ static int _get_co2_mg811_ppm(float volts) volts = volts / DC_GAIN; if (!(volts <= sen->zero_point_volts && volts >= sen->max_point_volts)) { if ((debug++ % 10) == 0) { - DBG("wrong input %.f mV, voltage range %.f ~ %.f (400 ppm ~ 10000 ppm)", + _D("wrong input %.f mV, voltage range %.f ~ %.f (400 ppm ~ 10000 ppm)", volts * 1000., sen->zero_point_volts * 1000., sen->max_point_volts * 1000.); } if (volts < sen->max_point_volts) { @@ -155,7 +158,7 @@ int resource_update_co2_sensor_value(void) if (percentage < 0 || percentage >= 10000) { if ((debug++ % 5) == 0) - DBG("sensor: %.f, volt: %.2f mV, CO2: %d ppm", sensor_value, sensor_fvalue, percentage); + _D("sensor: %.f, volt: %.2f mV, CO2: %d ppm", sensor_value, sensor_fvalue, percentage); } return percentage; @@ -194,7 +197,7 @@ int _get_sensor_parameter(int index) sprintf(path, "%s%s", app_data_path, CO2_DATA); if((fp = fopen(path, "r")) == NULL) { - ERR("Error: [%s] can't open adc data file", path); + _E("Error: [%s] can't open adc data file", path); if (index == 2) return 0; return (int)(DEFAULT_ZERO_VOLTS * 1000); @@ -202,7 +205,7 @@ int _get_sensor_parameter(int index) fgets(buffer, 16, fp); fclose(fp); sscanf(buffer, "%d %d %d", &volts[0], &volts[1], &volts[2]); - DBG("get parameter: %s, zero: %d, max: %d, count: %d", buffer, volts[0], volts[1], volts[2]); + _D("get parameter: %s, zero: %d, max: %d, count: %d", buffer, volts[0], volts[1], volts[2]); free(app_data_path); @@ -223,7 +226,7 @@ void resource_set_sensor_parameter(int zero_volts) sprintf(path, "%s%s", app_data_path, CO2_DATA); if((fp = fopen(path, "w+")) == NULL) { - ERR("ERROR: can't fopen file: %s", CO2_DATA); + _E("ERROR: can't fopen file: %s", CO2_DATA); return; } memset(buffer, 0, sizeof(buffer)); @@ -244,7 +247,43 @@ int resource_get_co2_sensor_parameter(void) } /* - * main thread funtion to get sensor data + * notify sensor value to cloud + */ +static int notify_sensor_value(void) +{ + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; + + smartthings_payload_h resp_payload = NULL; + + // send notification to cloud server + error = smartthings_payload_create(&resp_payload); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE || !resp_payload) { + _E("smartthings_payload_create() failed, [%d]", error); + return error; + } + + error = smartthings_payload_set_int(resp_payload, PROP_AIRQUALITY, g_co2_sensor_value); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_payload_set_int() failed, [%d]", error); + return error; + } + + error = smartthings_resource_notify(st_handle, RES_CAPABILITY_AIRQUALITYSENSOR, resp_payload); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + _E("smartthings_resource_notify() failed, [%d]", error); + return error; + } + + if (smartthings_payload_destroy(resp_payload)) { + _E("smartthings_payload_destroy() failed"); + return error; + } + + return error; +} + +/* + * main thread function to get sensor data */ void *thread_sensor_main(void *arg) { @@ -254,13 +293,13 @@ void *thread_sensor_main(void *arg) short sensor_value; co2_sensor_data_t *sensorp = &co2_sensor; - DBG("%s starting...\n", __func__); + _D("%s starting...\n", __func__); memset((void *)sensorp, 0, sizeof(co2_sensor_data_t)); resource_init_co2_sensor(); ret = resource_adc_mcp3008_init(); - DBG("resource_adc_mcp3008_init ret: %d", ret); + _D("resource_adc_mcp3008_init ret: %d", ret); while (true) { @@ -289,7 +328,7 @@ void *thread_sensor_main(void *arg) usleep(10 * 1000); // 10msec } } - DBG("%s exiting...\n", __func__); + _D("%s exiting...\n", __func__); pthread_exit((void *) 0); } @@ -310,18 +349,19 @@ void *thread_sensor_notify(void *arg) co2_sensor_data_t *sensorp = &co2_sensor; if (g_co2_sensor_value > 0 && g_co2_sensor_value < 10000) - DBG("CO2 value: %d, count: %d", g_co2_sensor_value, sensorp->count); + _D("CO2 value: %d, count: %d", g_co2_sensor_value, sensorp->count); MUTEX_LOCK; sensorp->count = 0; MUTEX_UNLOCK; - if (g_switch_is_on) - st_things_notify_observers(RES_CAPABILITY_AIRQUALITYSENSOR); + if (g_switch_is_on) { + notify_sensor_value(); } + } usleep(10 * 1000); // 10msec } - DBG("%s exiting...\n", __func__); + _D("%s exiting...\n", __func__); pthread_exit((void *) 0); } diff --git a/tizen-manifest.xml b/tizen-manifest.xml index a2f81ef..9fd60ab 100644 --- a/tizen-manifest.xml +++ b/tizen-manifest.xml @@ -1,17 +1,21 @@ - + - - - co2sensor.png + + + co2_50.png + + + - http://tizen.org/privilege/network.get - http://tizen.org/privilege/network.set + http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/datasharing http://tizen.org/privilege/internet + http://tizen.org/privilege/softap http://tizen.org/privilege/peripheralio - http://tizen.org/privilege/alarm.set - http://tizen.org/privilege/network.profile + http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master + http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource -- 2.7.4

`Lb{!tY2|UWf-|?-ckRzrI1_^YE#xGZlNJ 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%0AYV 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 diff --git a/lib/libst_thing_master_api.so b/lib/libst_thing_master_api.so new file mode 100644 index 0000000000000000000000000000000000000000..aef594ac8f21d1a845064d74f25ee4f24bd21c80 GIT binary patch literal 111204 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