--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+
+ <cconfiguration id="org.tizen.nativecore.config.sbi.gcc45.app.debug.1579263345">
+
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.tizen.nativecore.config.sbi.gcc45.app.debug.1579263345" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+
+ <externalSettings/>
+
+ <extensions>
+
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.tizen.nativecore.NativeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ </extensions>
+
+ </storageModule>
+
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+
+ <configuration artifactName="smart-blind" buildArtefactType="org.tizen.nativecore.buildArtefactType.app" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.tizen.nativecore.buildArtefactType.app,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;" id="org.tizen.nativecore.config.sbi.gcc45.app.debug.1579263345" name="Debug" parent="org.tizen.nativecore.config.sbi.gcc45.app.debug">
+
+ <folderInfo id="org.tizen.nativecore.config.sbi.gcc45.app.debug.1579263345." name="/" resourcePath="">
+
+ <toolChain id="org.tizen.nativecore.toolchain.sbi.gcc45.app.debug.611539762" name="Tizen Native Toolchain" superClass="org.tizen.nativecore.toolchain.sbi.gcc45.app.debug">
+
+ <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.tizen.nativeide.target.sbi.gnu.platform.base.588449540" osList="linux,win32" superClass="org.tizen.nativeide.target.sbi.gnu.platform.base"/>
+
+ <builder autoBuildTarget="all" buildPath="${workspace_loc:/smart-blind}/Debug" enableAutoBuild="true" id="org.tizen.nativecore.target.sbi.gnu.builder.961972489" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Tizen Application Builder" superClass="org.tizen.nativecore.target.sbi.gnu.builder"/>
+
+ <tool command="arm-linux-gnueabi-ar" id="org.tizen.nativecore.tool.sbi.gnu.archiver.786630560" name="Archiver" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver"/>
+
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.1437279340" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler">
+
+ <option id="gnu.cpp.compiler.option.optimization.level.1282139812" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+
+ <option defaultValue="gnu.cpp.compiler.debugging.level.max" id="sbi.gnu.cpp.compiler.option.debugging.level.core.1579999524" name="Debug level" superClass="sbi.gnu.cpp.compiler.option.debugging.level.core" valueType="enumerated"/>
+
+ <option defaultValue="false" id="sbi.gnu.cpp.compiler.option.misc.pic.core.1485987024" name="-fPIC option" superClass="sbi.gnu.cpp.compiler.option.misc.pic.core" valueType="boolean"/>
+
+ <option id="sbi.gnu.cpp.compiler.option.1109780928" superClass="sbi.gnu.cpp.compiler.option" valueType="userObjs">
+
+ <listOptionValue builtIn="false" value="iot-headless-4.0-device.core_llvm40.armel"/>
+
+ </option>
+
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_inc.core.854556687" superClass="sbi.gnu.cpp.compiler.option.frameworks_inc.core" valueType="includePath">
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/iotcon""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+
+ </option>
+
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_cflags.core.1671438041" superClass="sbi.gnu.cpp.compiler.option.frameworks_cflags.core" valueType="stringList">
+
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+
+ <listOptionValue builtIn="false" value=" -fPIE"/>
+
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+
+ <listOptionValue builtIn="false" value="-mthumb"/>
+
+ </option>
+
+ <option id="gnu.cpp.compiler.option.include.paths.124356411" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+
+ </option>
+
+ <option id="sbi.gnu.cpp.compiler.option.frameworks.core.1482965669" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
+
+ <listOptionValue builtIn="false" value="Native_API"/>
+
+ <listOptionValue builtIn="false" value="iot-things"/>
+
+ </option>
+
+ <option id="sbi.gnu.cpp.compiler.option.preprocessor.def.deprecation.1008357656" superClass="sbi.gnu.cpp.compiler.option.preprocessor.def.deprecation" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="TIZEN_DEPRECATION"/>
+
+ <listOptionValue builtIn="false" value="DEPRECATION_WARNING"/>
+
+ <listOptionValue builtIn="false" value="_DEBUG"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1382562720" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+
+ </tool>
+
+ <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.512673844" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
+
+ <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.option.optimization.level.427976708" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
+
+ <option defaultValue="gnu.c.debugging.level.max" id="sbi.gnu.c.compiler.option.debugging.level.core.494109188" name="Debug level" superClass="sbi.gnu.c.compiler.option.debugging.level.core" valueType="enumerated"/>
+
+ <option defaultValue="false" id="sbi.gnu.c.compiler.option.misc.pic.core.142082601" name="-fPIC option" superClass="sbi.gnu.c.compiler.option.misc.pic.core" valueType="boolean"/>
+
+ <option id="sbi.gnu.c.compiler.option.133441897" superClass="sbi.gnu.c.compiler.option" valueType="userObjs">
+
+ <listOptionValue builtIn="false" value="iot-headless-4.0-device.core_llvm40.armel"/>
+
+ </option>
+
+ <option id="sbi.gnu.c.compiler.option.frameworks_inc.core.792268531" superClass="sbi.gnu.c.compiler.option.frameworks_inc.core" valueType="includePath">
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/iotcon""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+
+ </option>
+
+ <option id="sbi.gnu.c.compiler.option.frameworks_cflags.core.1631838969" superClass="sbi.gnu.c.compiler.option.frameworks_cflags.core" valueType="stringList">
+
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+
+ <listOptionValue builtIn="false" value=" -fPIE"/>
+
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+
+ <listOptionValue builtIn="false" value="-mthumb"/>
+
+ </option>
+
+ <option id="gnu.c.compiler.option.include.paths.1655724879" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+
+ </option>
+
+ <option id="sbi.gnu.c.compiler.option.frameworks.core.1521997791" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
+
+ <listOptionValue builtIn="false" value="Native_API"/>
+
+ <listOptionValue builtIn="false" value="iot-things"/>
+
+ </option>
+
+ <option id="sbi.gnu.c.compiler.option.preprocessor.def.symbols.deprecation.1595744898" superClass="sbi.gnu.c.compiler.option.preprocessor.def.symbols.deprecation" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="TIZEN_DEPRECATION"/>
+
+ <listOptionValue builtIn="false" value="DEPRECATION_WARNING"/>
+
+ <listOptionValue builtIn="false" value="_DEBUG"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1134833125" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+
+ </tool>
+
+ <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.259387756" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
+
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.linker.1609529239" name="C++ Linker" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.linker">
+
+ <option defaultValue="false" id="sbi.gnu.cpp.link.option.strip.491091650" name="Omit all symbol information (-s)" superClass="sbi.gnu.cpp.link.option.strip" valueType="boolean"/>
+
+ <option defaultValue="false" id="sbi.gnu.cpp.linker.option.shared_flag.core.1512920854" name="Linker.Shared" superClass="sbi.gnu.cpp.linker.option.shared_flag.core" valueType="boolean"/>
+
+ <option defaultValue="false" id="sbi.gnu.cpp.linker.option.noundefined.core.1057977747" name="Report unresolved symbol references (-Wl,--no-undefined)" superClass="sbi.gnu.cpp.linker.option.noundefined.core" valueType="boolean"/>
+
+ <option id="sbi.gnu.cpp.linker.option.frameworks_lflags.core.1272757498" superClass="sbi.gnu.cpp.linker.option.frameworks_lflags.core" valueType="stringList">
+
+ <listOptionValue builtIn="false" value="${TC_LINKER_MISC}"/>
+
+ <listOptionValue builtIn="false" value="${RS_LINKER_MISC}"/>
+
+ <listOptionValue builtIn="false" value="-pie -lpthread "/>
+
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+
+ <listOptionValue builtIn="false" value="-Xlinker --version-script="${PROJ_PATH}/.exportMap""/>
+
+ <listOptionValue builtIn="false" value="-L"${SBI_SYSROOT}/usr/lib""/>
+
+ <listOptionValue builtIn="false" value="-L"${SBI_SYSROOT}/../iot-things-4.0-device.core/usr/lib""/>
+
+ <listOptionValue builtIn="false" value="$(RS_LIBRARIES)"/>
+
+ </option>
+
+ <option id="gnu.cpp.link.option.paths.1369147518" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib}""/>
+
+ </option>
+
+ <option id="gnu.cpp.link.option.libs.1082130017" superClass="gnu.cpp.link.option.libs" valueType="libs">
+
+ <listOptionValue builtIn="false" value="oicdastack"/>
+
+ <listOptionValue builtIn="false" value="sdkapi"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1218710096" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+
+ </inputType>
+
+ </tool>
+
+ <tool command="#{PLATFORM_DEFAULT_GCC_PREFIX}as" id="org.tizen.nativeapp.tool.sbi.gnu.assembler.base.1720579698" name="Assembler" superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base">
+
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1044397358" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+
+ </tool>
+
+ <tool id="org.tizen.nativecore.tool.fnmapgen.1047853461" name="C FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen"/>
+
+ <tool id="org.tizen.nativecore.tool.fnmapgen.cpp.1260194585" name="C++ FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen.cpp"/>
+
+ <tool id="org.tizen.nativecore.tool.ast.1676405848" name="C Static Analyzer" superClass="org.tizen.nativecore.tool.ast"/>
+
+ <tool id="org.tizen.nativecore.tool.ast.cpp.757839070" name="C++ Static Analyzer" superClass="org.tizen.nativecore.tool.ast.cpp"/>
+
+ <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib.1231386660" name="Archive Generator" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib"/>
+
+ <tool id="org.tizen.nativecore.tool.sbi.po.compiler.230537812" name="PO Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.po.compiler"/>
+
+ <tool id="org.tizen.nativecore.tool.sbi.edc.compiler.1565517199" name="EDC Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.edc.compiler"/>
+
+ </toolChain>
+
+ </folderInfo>
+
+ <sourceEntries>
+
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
+
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
+
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="shared"/>
+
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
+
+ </sourceEntries>
+
+ </configuration>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+
+ </cconfiguration>
+
+ <cconfiguration id="org.tizen.nativecore.config.sbi.gcc45.app.release.502396447">
+
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.tizen.nativecore.config.sbi.gcc45.app.release.502396447" moduleId="org.eclipse.cdt.core.settings" name="Release">
+
+ <externalSettings/>
+
+ <extensions>
+
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.tizen.nativecore.NativeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ </extensions>
+
+ </storageModule>
+
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+
+ <configuration artifactName="smart-blind" buildArtefactType="org.tizen.nativecore.buildArtefactType.app" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.tizen.nativecore.buildArtefactType.app,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;" id="org.tizen.nativecore.config.sbi.gcc45.app.release.502396447" name="Release" parent="org.tizen.nativecore.config.sbi.gcc45.app.release">
+
+ <folderInfo id="org.tizen.nativecore.config.sbi.gcc45.app.release.502396447." name="/" resourcePath="">
+
+ <toolChain id="org.tizen.nativecore.toolchain.sbi.gcc45.app.release.1835949389" name="Tizen Native Toolchain" superClass="org.tizen.nativecore.toolchain.sbi.gcc45.app.release">
+
+ <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.tizen.nativeide.target.sbi.gnu.platform.base.1474242873" osList="linux,win32" superClass="org.tizen.nativeide.target.sbi.gnu.platform.base"/>
+
+ <builder buildPath="${workspace_loc:/smart-blind}/Release" id="org.tizen.nativecore.target.sbi.gnu.builder.1319584467" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Tizen Application Builder" superClass="org.tizen.nativecore.target.sbi.gnu.builder"/>
+
+ <tool command="arm-linux-gnueabi-ar" id="org.tizen.nativecore.tool.sbi.gnu.archiver.1688011617" name="Archiver" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver"/>
+
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.265781889" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler">
+
+ <option id="gnu.cpp.compiler.option.optimization.level.1840608126" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
+
+ <option defaultValue="gnu.cpp.compiler.debugging.level.none" id="sbi.gnu.cpp.compiler.option.debugging.level.core.2039835250" name="Debug level" superClass="sbi.gnu.cpp.compiler.option.debugging.level.core" valueType="enumerated"/>
+
+ <option defaultValue="false" id="sbi.gnu.cpp.compiler.option.misc.pic.core.1616887854" name="-fPIC option" superClass="sbi.gnu.cpp.compiler.option.misc.pic.core" valueType="boolean"/>
+
+ <option id="sbi.gnu.cpp.compiler.option.1897469350" superClass="sbi.gnu.cpp.compiler.option" valueType="userObjs">
+
+ <listOptionValue builtIn="false" value="iot-headless-4.0-device.core_llvm40.armel"/>
+
+ </option>
+
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_inc.core.349764408" superClass="sbi.gnu.cpp.compiler.option.frameworks_inc.core" valueType="includePath">
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/iotcon""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+
+ </option>
+
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_cflags.core.644139045" superClass="sbi.gnu.cpp.compiler.option.frameworks_cflags.core" valueType="stringList">
+
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+
+ <listOptionValue builtIn="false" value=" -fPIE"/>
+
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+
+ <listOptionValue builtIn="false" value="-mthumb"/>
+
+ </option>
+
+ <option id="gnu.cpp.compiler.option.include.paths.1742746573" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+
+ </option>
+
+ <option id="sbi.gnu.cpp.compiler.option.frameworks.core.138538818" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
+
+ <listOptionValue builtIn="false" value="Native_API"/>
+
+ <listOptionValue builtIn="false" value="iot-things"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.345410264" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+
+ </tool>
+
+ <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.2081951283" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
+
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.325436731" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
+
+ <option defaultValue="gnu.c.debugging.level.none" id="sbi.gnu.c.compiler.option.debugging.level.core.245781463" name="Debug level" superClass="sbi.gnu.c.compiler.option.debugging.level.core" valueType="enumerated"/>
+
+ <option defaultValue="false" id="sbi.gnu.c.compiler.option.misc.pic.core.84228738" name="-fPIC option" superClass="sbi.gnu.c.compiler.option.misc.pic.core" valueType="boolean"/>
+
+ <option id="sbi.gnu.c.compiler.option.298053056" superClass="sbi.gnu.c.compiler.option" valueType="userObjs">
+
+ <listOptionValue builtIn="false" value="iot-headless-4.0-device.core_llvm40.armel"/>
+
+ </option>
+
+ <option id="sbi.gnu.c.compiler.option.frameworks_inc.core.1495113514" superClass="sbi.gnu.c.compiler.option.frameworks_inc.core" valueType="includePath">
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/iotcon""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+
+ </option>
+
+ <option id="sbi.gnu.c.compiler.option.frameworks_cflags.core.165770040" superClass="sbi.gnu.c.compiler.option.frameworks_cflags.core" valueType="stringList">
+
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+
+ <listOptionValue builtIn="false" value=" -fPIE"/>
+
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+
+ <listOptionValue builtIn="false" value="-mthumb"/>
+
+ </option>
+
+ <option id="gnu.c.compiler.option.include.paths.2038091548" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+
+ </option>
+
+ <option id="sbi.gnu.c.compiler.option.frameworks.core.201431878" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
+
+ <listOptionValue builtIn="false" value="Native_API"/>
+
+ <listOptionValue builtIn="false" value="iot-things"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.2075162554" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+
+ </tool>
+
+ <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.1628103167" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
+
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.linker.816180912" name="C++ Linker" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.linker">
+
+ <option defaultValue="true" id="sbi.gnu.cpp.link.option.strip.315063264" name="Omit all symbol information (-s)" superClass="sbi.gnu.cpp.link.option.strip" valueType="boolean"/>
+
+ <option defaultValue="false" id="sbi.gnu.cpp.linker.option.shared_flag.core.1363552698" name="Linker.Shared" superClass="sbi.gnu.cpp.linker.option.shared_flag.core" valueType="boolean"/>
+
+ <option defaultValue="false" id="sbi.gnu.cpp.linker.option.noundefined.core.108222538" name="Report unresolved symbol references (-Wl,--no-undefined)" superClass="sbi.gnu.cpp.linker.option.noundefined.core" valueType="boolean"/>
+
+ <option id="sbi.gnu.cpp.linker.option.frameworks_lflags.core.1838858372" superClass="sbi.gnu.cpp.linker.option.frameworks_lflags.core" valueType="stringList">
+
+ <listOptionValue builtIn="false" value="${TC_LINKER_MISC}"/>
+
+ <listOptionValue builtIn="false" value="${RS_LINKER_MISC}"/>
+
+ <listOptionValue builtIn="false" value="-pie -lpthread "/>
+
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+
+ <listOptionValue builtIn="false" value="-Xlinker --version-script="${PROJ_PATH}/.exportMap""/>
+
+ <listOptionValue builtIn="false" value="-L"${SBI_SYSROOT}/usr/lib""/>
+
+ <listOptionValue builtIn="false" value="-L"${SBI_SYSROOT}/../iot-things-4.0-device.core/usr/lib""/>
+
+ <listOptionValue builtIn="false" value="$(RS_LIBRARIES)"/>
+
+ </option>
+
+ <option id="gnu.cpp.link.option.paths.630690609" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib}""/>
+
+ </option>
+
+ <option id="gnu.cpp.link.option.libs.1849184143" superClass="gnu.cpp.link.option.libs" valueType="libs">
+
+ <listOptionValue builtIn="false" value="oicdastack"/>
+
+ <listOptionValue builtIn="false" value="sdkapi"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1007940209" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+
+ </inputType>
+
+ </tool>
+
+ <tool command="#{PLATFORM_DEFAULT_GCC_PREFIX}as" id="org.tizen.nativeapp.tool.sbi.gnu.assembler.base.1919490904" name="Assembler" superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base">
+
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.596118887" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+
+ </tool>
+
+ <tool id="org.tizen.nativecore.tool.fnmapgen.237114660" name="C FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen"/>
+
+ <tool id="org.tizen.nativecore.tool.fnmapgen.cpp.1379592682" name="C++ FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen.cpp"/>
+
+ <tool id="org.tizen.nativecore.tool.ast.1860833120" name="C Static Analyzer" superClass="org.tizen.nativecore.tool.ast"/>
+
+ <tool id="org.tizen.nativecore.tool.ast.cpp.113871631" name="C++ Static Analyzer" superClass="org.tizen.nativecore.tool.ast.cpp"/>
+
+ <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib.1740391544" name="Archive Generator" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib"/>
+
+ <tool id="org.tizen.nativecore.tool.sbi.po.compiler.1845280329" name="PO Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.po.compiler"/>
+
+ <tool id="org.tizen.nativecore.tool.sbi.edc.compiler.1192681958" name="EDC Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.edc.compiler"/>
+
+ </toolChain>
+
+ </folderInfo>
+
+ <sourceEntries>
+
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
+
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
+
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="shared"/>
+
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
+
+ </sourceEntries>
+
+ </configuration>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+
+ </cconfiguration>
+
+ </storageModule>
+
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+
+ <project id="smart-blind.org.tizen.nativecore.target.sbi.gcc45.app.1161948160" name="Tizen Native Application" projectType="org.tizen.nativecore.target.sbi.gcc45.app"/>
+
+ </storageModule>
+
+ <storageModule moduleId="scannerConfiguration">
+
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+
+ <scannerConfigBuildInfo instanceId="org.tizen.nativecore.config.sbi.gcc45.app.release.502396447">
+
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+
+ </scannerConfigBuildInfo>
+
+ <scannerConfigBuildInfo instanceId="org.tizen.nativecore.config.sbi.gcc45.app.debug.1579263345">
+
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+
+ </scannerConfigBuildInfo>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+
+</cproject>
--- /dev/null
+{
+ global: main;
+ _IO_*;
+ local: *;
+};
--- /dev/null
+/Debug/
+/SA_Report/
+/.sign/
+/res/certificate.pem
+/res/privatekey.der
+/crash-info/
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>smart-blind</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ </natures>
+ <filteredResources>
+ <filter>
+ <id>1532670384450</id>
+ <name></name>
+ <type>26</type>
+ <matcher>
+ <id>org.eclipse.ui.ide.multiFilter</id>
+ <arguments>1.0-projectRelativePath-matches-false-false-*/.tpk</arguments>
+ </matcher>
+ </filter>
+ <filter>
+ <id>1532670384528</id>
+ <name></name>
+ <type>6</type>
+ <matcher>
+ <id>org.eclipse.ui.ide.multiFilter</id>
+ <arguments>1.0-name-matches-false-false-project_def.prop</arguments>
+ </matcher>
+ </filter>
+ </filteredResources>
+</projectDescription>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<tproject xmlns="http://www.tizen.org/tproject">
+ <platforms>
+ <platform>
+ <name>iot-headless-4.0</name>
+ </platform>
+ </platforms>
+ <package>
+ <blacklist/>
+ <resFallback autoGen="true"/>
+ </package>
+</tproject>
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 __POSITION_FINDER_SERVER_H__
+#define __POSITION_FINDER_SERVER_H__
+
+#include <dlog.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "TT"
+
+#if !defined(_D)
+#define _D(fmt, arg...) dlog_print(DLOG_DEBUG, LOG_TAG, "[%s:%d] " fmt "\n", __func__, __LINE__, ##arg)
+#endif
+
+#if !defined(DBG)
+#define DBG(fmt, arg...) dlog_print(DLOG_DEBUG, LOG_TAG, "[%s:%d] " fmt "\n", __func__, __LINE__, ##arg)
+#endif
+
+#if !defined(_I)
+#define _I(fmt, arg...) dlog_print(DLOG_INFO, LOG_TAG, "[%s:%d] " fmt "\n", __func__, __LINE__, ##arg)
+#endif
+
+#if !defined(_W)
+#define _W(fmt, arg...) dlog_print(DLOG_WARN, LOG_TAG, "[%s:%d] " fmt "\n", __func__, __LINE__, ##arg)
+#endif
+
+#if !defined(_E)
+#define _E(fmt, arg...) dlog_print(DLOG_ERROR, LOG_TAG, "[%s:%d] " fmt "\n", __func__, __LINE__, ##arg)
+#endif
+
+#define retvm_if(expr, val, fmt, arg...) do { \
+ if (expr) { \
+ _E(fmt, ##arg); \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return val; \
+ } \
+} while (0)
+
+#define retv_if(expr, val) do { \
+ if (expr) { \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return (val); \
+ } \
+} while (0)
+
+#define retm_if(expr, fmt, arg...) do { \
+ if (expr) { \
+ _E(fmt, ##arg); \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+} while (0)
+
+#define ret_if(expr) do { \
+ if (expr) { \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+} while (0)
+
+#define goto_if(expr, val) do { \
+ if (expr) { \
+ _E("(%s) -> goto", #expr); \
+ goto val; \
+ } \
+} while (0)
+
+#define break_if(expr) { \
+ if (expr) { \
+ _E("(%s) -> break", #expr); \
+ break; \
+ } \
+}
+
+#define continue_if(expr) { \
+ if (expr) { \
+ _E("(%s) -> continue", #expr); \
+ continue; \
+ } \
+}
+
+
+
+#endif /* __POSITION_FINDER_SERVER_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 __POSITION_FINDER_RESOURCE_H__
+#define __POSITION_FINDER_RESOURCE_H__
+
+#include <peripheral_io.h>
+
+#include "resource_internal.h"
+#include "resource/resource_illuminance_sensor.h"
+#include "resource/resource_servo_motor.h"
+
+#endif /* __POSITION_FINDER_RESOURCE_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 __POSITION_FINDER_RESOURCE_ILLUMINANCE_SENSOR_H__
+#define __POSITION_FINDER_RESOURCE_ILLUMINANCE_SENSOR_H__
+
+/**
+ * @brief Reads the value of i2c bus connected illuminance sensor.
+ * @param[in] i2c_bus The i2c bus number that the slave device is connected
+ * @param[out] out_value The value read by the illuminance sensor
+ * @return 0 on success, otherwise a negative error value
+ * @see If the i2c bus is not open, creates i2c handle before reading data from the i2c slave device.
+ */
+extern int resource_read_illuminance_sensor(int i2c_bus, uint32_t *out_value);
+
+#endif /* __POSITION_FINDER_RESOURCE_ILLUMINANCE_SENSOR_H__ */
+
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 __POSITION_FINDER_RESOURCE_ILLUMINANCE_SENSOR_INTERNAL_H__
+#define __POSITION_FINDER_RESOURCE_ILLUMINANCE_SENSOR_INTERNAL_H__
+
+/**
+ * @brief Destory the i2c handle and changes the gpio pin state to the close(0).
+ */
+extern void resource_close_illuminance_sensor(void);
+
+#endif /* __POSITION_FINDER_RESOURCE_ILLUMINANCE_SENSOR_INTERNAL_H__ */
+
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 __RESOURCE_SERVO_MOTOR_H__
+#define __RESOURCE_SERVO_MOTOR_H__
+
+void resource_close_servo_motor(void);
+
+/**
+ * This module is sample codes to handling Servo motors in Tizen platform.
+ * Hardware is configured with HS-53,
+ * Bus : 0
+ * Pin : 2
+ * @param[in] duty_cycle_ms
+ * @return 0 on success, otherwise a negative error value
+ */
+int resource_set_servo_motor_value(double duty_cycle_ms);
+
+#endif /* __RESOURCE_SERVO_MOTOR_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 __POSITION_FINDER_RESOURCE_INTERNAL_H__
+#define __POSITION_FINDER_RESOURCE_INTERNAL_H__
+
+#include <peripheral_io.h>
+
+#include "resource/resource_illuminance_sensor_internal.h"
+
+#define PIN_MAX 40
+
+struct _resource_s {
+ int opened;
+ peripheral_gpio_h sensor_h;
+ void (*close) (int);
+};
+typedef struct _resource_s resource_s;
+
+typedef void (*resource_read_cb)(double value, void *data);
+
+struct _resource_read_cb_s {
+ resource_read_cb cb;
+ void *data;
+ int pin_num;
+};
+typedef struct _resource_read_cb_s resource_read_s;
+
+extern resource_s *resource_get_info(int pin_num);
+extern void resource_close_all(void);
+
+#endif /* __POSITION_FINDER_RESOURCE_INTERNAL_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 __SENSOR_DATA_H__
+#define __SENSOR_DATA_H__
+
+#include <stdbool.h>
+
+typedef enum {
+ SENSOR_DATA_TYPE_NONE = 0,
+ SENSOR_DATA_TYPE_INT,
+ SENSOR_DATA_TYPE_UINT,
+ SENSOR_DATA_TYPE_BOOL,
+ SENSOR_DATA_TYPE_DOUBLE,
+ SENSOR_DATA_TYPE_STR,
+} sensor_data_type_e;
+
+typedef struct __sensor_data_s sensor_data;
+
+sensor_data *sensor_data_new(sensor_data_type_e type);
+void sensor_data_free(sensor_data *data);
+
+int sensor_data_set_int(sensor_data *data, int value);
+int sensor_data_set_uint(sensor_data *data, unsigned int value);
+int sensor_data_set_bool(sensor_data *data, bool value);
+int sensor_data_set_double(sensor_data *data, double value);
+int sensor_data_set_string(sensor_data *data, const char *value, unsigned int size);
+
+int sensor_data_get_int(sensor_data *data, int *value);
+int sensor_data_get_uint(sensor_data *data, unsigned int *value);
+int sensor_data_get_bool(sensor_data *data, bool *value);
+int sensor_data_get_double(sensor_data *data, double *value);
+int sensor_data_get_string(sensor_data *data, const char **value);
+
+#endif /* __SENSOR_DATA_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 <stdint.h>
+#include <stdbool.h>
+
+#ifdef __ST_THINGS_RTOS__
+#include <st_things/st_things_types.h>
+#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__ */
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+/**
+ * @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__ */
--- /dev/null
+APPNAME = smart-blind
+
+type = app
+profile = iot-headless-4.0
+
+USER_SRCS = src/smart-blind.c
+USER_DEFS =
+USER_INC_DIRS = inc, inc/sdk
+USER_OBJS =
+USER_LIBS = lib/liboicdastack.so, lib/libsdkapi.so
+USER_EDCS =
--- /dev/null
+{
+ "device": [
+ {
+ "specification": {
+ "device": {
+ "deviceType": "oic.d.light",
+ "deviceName": "*** YOUR DEVICE NAME ***",
+ "specVersion": "core.1.1.0",
+ "dataModelVersion": "res.1.1.0"
+ },
+ "platform": {
+ "manufacturerName": "*** YOUR MNID ***",
+ "manufacturerUrl": "http://www.samsung.com/sec/",
+ "manufacturingDate": "2017-08-31",
+ "modelNumber": "BLIND-01",
+ "platformVersion": "1.0",
+ "osVersion": "1.0",
+ "hardwareVersion": "1.0",
+ "firmwareVersion": "1.0",
+ "vendorId": "*** YOUR VENDOR ID ***"
+ }
+ },
+ "resources": {
+ "single": [
+ {
+ "uri": "/capability/illuminanceMeasurement/main/0",
+ "types": [
+ "oic.r.sensor.illuminance"
+ ],
+ "interfaces": [
+ "oic.if.s",
+ "oic.if.baseline"
+ ],
+ "policy": 3
+ },
+ {
+ "uri": "/capability/doorControl/main/0",
+ "types": [
+ "x.com.st.doorcontrol"
+ ],
+ "interfaces": [
+ "oic.if.baseline",
+ "oic.if.a"
+ ],
+ "policy": 3
+ }
+ ]
+ }
+ }
+ ],
+ "resourceTypes": [
+ {
+ "type": "oic.r.sensor.illuminance",
+ "properties": [
+ {
+ "key": "illuminance",
+ "type": 2,
+ "mandatory": true,
+ "rw": 1
+ }
+ ]
+ },
+ {
+ "type": "x.com.st.doorcontrol",
+ "properties": [
+ {
+ "key": "doorState",
+ "type": 3,
+ "mandatory": true,
+ "rw": 3
+ }
+ ]
+ }
+ ],
+ "configuration": {
+ "easySetup": {
+ "connectivity": {
+ "type": 1,
+ "softAP": {
+ "setupId": "*** YOUR SETUPID ***",
+ "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
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <peripheral_io.h>
+
+#include "log.h"
+#include "resource.h"
+
+static resource_s resource_info[PIN_MAX] = { {0, NULL, NULL}, };
+
+resource_s *resource_get_info(int pin_num)
+{
+ return &resource_info[pin_num];
+}
+
+void resource_close_all(void)
+{
+ int i = 0;
+ for (i = 0; i < PIN_MAX; i++) {
+ if (!resource_info[i].opened) continue;
+ _I("GPIO[%d] is closing...", i);
+
+ if (resource_info[i].close)
+ resource_info[i].close(i);
+ }
+ resource_close_illuminance_sensor();
+}
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <peripheral_io.h>
+#include <sys/time.h>
+
+#include "log.h"
+#include "resource_internal.h"
+
+#define I2C_PIN_MAX 28
+/* I2C */
+#define GY30_ADDR 0x23 /* Address of GY30 light sensor */
+#define GY30_CONT_HIGH_RES_MODE 0x10 /* Start measurement at 11x resolution. Measurement time is approx 120mx */
+#define GY30_CONSTANT_NUM (1.2)
+
+static struct {
+ int opened;
+ peripheral_i2c_h sensor_h;
+} resource_sensor_s;
+
+void resource_close_illuminance_sensor(void)
+{
+ if (!resource_sensor_s.opened)
+ return;
+
+ _I("Illuminance Sensor is finishing...");
+ peripheral_i2c_close(resource_sensor_s.sensor_h);
+ resource_sensor_s.opened = 0;
+}
+
+int resource_read_illuminance_sensor(int i2c_bus, uint32_t *out_value)
+{
+ int ret = PERIPHERAL_ERROR_NONE;
+ static int write = 0;
+ unsigned char buf[10] = { 0, };
+
+ if (!resource_sensor_s.opened) {
+ ret = peripheral_i2c_open(i2c_bus, GY30_ADDR, &resource_sensor_s.sensor_h);
+ if (ret != PERIPHERAL_ERROR_NONE) {
+ _E("i2c open error : %s", get_error_message(ret));
+ return -1;
+ }
+ resource_sensor_s.opened = 1;
+ write = 0;
+ }
+
+ buf[0] = 0x10;
+
+ if (!write) {
+ ret = peripheral_i2c_write(resource_sensor_s.sensor_h, buf, 1);
+ if (ret != PERIPHERAL_ERROR_NONE) {
+ _E("i2c write error : %s", get_error_message(ret));
+ return -1;
+ }
+ write = 1;
+ }
+
+ ret = peripheral_i2c_read(resource_sensor_s.sensor_h, buf, 2);
+ if (ret != PERIPHERAL_ERROR_NONE) {
+ _E("i2c read error : %s", get_error_message(ret));
+ return -1;
+ }
+
+ *out_value = (buf[0] << 8 | buf[1]) / GY30_CONSTANT_NUM; // Just Sum High 8bit and Low 8bit
+
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <peripheral_io.h>
+#include "log.h"
+
+#define SERVO_MOTOR_CHANNEL (0)
+#define SERVO_MOTOR_DEFAULT_PERIOD 20.0
+
+static peripheral_pwm_h g_pwm_h;
+
+void resource_close_servo_motor(void)
+{
+ if (g_pwm_h) {
+ peripheral_pwm_close(g_pwm_h);
+ g_pwm_h = NULL;
+ }
+}
+
+int resource_set_servo_motor_value(double duty_cycle_ms)
+{
+ int ret = 0;
+
+ if (duty_cycle_ms >= SERVO_MOTOR_DEFAULT_PERIOD) {
+ _E("Too large duty cycle");
+ return -1;
+ }
+
+ if (!g_pwm_h) {
+ ret = peripheral_pwm_open(0, SERVO_MOTOR_CHANNEL, &g_pwm_h);
+ if (ret != PERIPHERAL_ERROR_NONE) {
+ _E("failed to open servo motor with ch : %s", get_error_message(ret));
+ return -1;
+ }
+ }
+
+ ret = peripheral_pwm_set_period(g_pwm_h, SERVO_MOTOR_DEFAULT_PERIOD * 1000 * 1000);
+ if (ret != PERIPHERAL_ERROR_NONE) {
+ _E("failed to set period : %s", get_error_message(ret));
+ return -1;
+ }
+
+ ret = peripheral_pwm_set_duty_cycle(g_pwm_h, duty_cycle_ms * 1000 * 1000);
+ if (ret != PERIPHERAL_ERROR_NONE) {
+ _E("failed to set duty cycle : %s", get_error_message(ret));
+ return -1;
+ }
+
+ ret = peripheral_pwm_set_enabled(g_pwm_h, true);
+ if (ret != PERIPHERAL_ERROR_NONE) {
+ _E("failed to enable : %s", get_error_message(ret));
+ return -1;
+ }
+
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <pthread.h>
+#include "log.h"
+#include "sensor-data.h"
+
+struct __sensor_data_s {
+ sensor_data_type_e type;
+ union {
+ int int_val;
+ unsigned int uint_val;
+ bool b_val;
+ double d_val;
+ char *str_val;
+ } value;
+ pthread_mutex_t mutex;
+};
+
+sensor_data *sensor_data_new(sensor_data_type_e type)
+{
+ sensor_data *data = NULL;
+ retv_if(type == SENSOR_DATA_TYPE_NONE, NULL);
+
+ data = calloc(1, sizeof(sensor_data));
+ retv_if(!data, NULL);
+
+ data->type = type;
+ pthread_mutex_init(&data->mutex, NULL);
+
+ return data;
+}
+
+void sensor_data_free(sensor_data *data)
+{
+ ret_if(!data);
+
+ if (data->type == SENSOR_DATA_TYPE_STR) {
+ pthread_mutex_lock(&data->mutex);
+ free(data->value.str_val);
+ data->value.str_val = NULL;
+ pthread_mutex_unlock(&data->mutex);
+ }
+ pthread_mutex_destroy(&data->mutex);
+
+ free(data);
+}
+
+int sensor_data_set_int(sensor_data *data, int value)
+{
+ retv_if(!data, -1);
+ retv_if(data->type != SENSOR_DATA_TYPE_INT, -1);
+
+ pthread_mutex_lock(&data->mutex);
+ data->value.int_val = value;
+ pthread_mutex_unlock(&data->mutex);
+
+ return 0;
+}
+
+int sensor_data_set_uint(sensor_data *data, unsigned int value)
+{
+ retv_if(!data, -1);
+ retv_if(data->type != SENSOR_DATA_TYPE_UINT, -1);
+
+ pthread_mutex_lock(&data->mutex);
+ data->value.uint_val = value;
+ pthread_mutex_unlock(&data->mutex);
+
+ return 0;
+}
+
+int sensor_data_set_bool(sensor_data *data, bool value)
+{
+ retv_if(!data, -1);
+ retv_if(data->type != SENSOR_DATA_TYPE_BOOL, -1);
+
+ pthread_mutex_lock(&data->mutex);
+ data->value.b_val = value;
+ pthread_mutex_unlock(&data->mutex);
+
+ return 0;
+}
+
+int sensor_data_set_double(sensor_data *data, double value)
+{
+ retv_if(!data, -1);
+ retv_if(data->type != SENSOR_DATA_TYPE_DOUBLE, -1);
+
+ pthread_mutex_lock(&data->mutex);
+ data->value.d_val = value;
+ pthread_mutex_unlock(&data->mutex);
+
+ return 0;
+}
+
+int sensor_data_set_string(sensor_data *data, const char *value, unsigned int size)
+{
+ char *temp = NULL;
+ retv_if(!data, -1);
+ retv_if(data->type != SENSOR_DATA_TYPE_STR, -1);
+ retv_if(!value, -1);
+ retv_if(size == 0, -1);
+
+ temp = strndup(value, size);
+ retv_if(!temp, -1);
+
+ pthread_mutex_lock(&data->mutex);
+ free(data->value.str_val);
+ data->value.str_val = temp;
+ pthread_mutex_unlock(&data->mutex);
+
+ return 0;
+}
+
+int sensor_data_get_int(sensor_data *data, int *value)
+{
+ retv_if(!data, -1);
+ retv_if(!value, -1);
+ retv_if(data->type != SENSOR_DATA_TYPE_INT, -1);
+
+ pthread_mutex_lock(&data->mutex);
+ *value = data->value.int_val;
+ pthread_mutex_unlock(&data->mutex);
+
+ return 0;
+}
+
+int sensor_data_get_uint(sensor_data *data, unsigned int *value)
+{
+ retv_if(!data, -1);
+ retv_if(!value, -1);
+ retv_if(data->type != SENSOR_DATA_TYPE_UINT, -1);
+
+ pthread_mutex_lock(&data->mutex);
+ *value = data->value.uint_val;
+ pthread_mutex_unlock(&data->mutex);
+
+ return 0;
+}
+
+int sensor_data_get_bool(sensor_data *data, bool *value)
+{
+ retv_if(!data, -1);
+ retv_if(!value, -1);
+ retv_if(data->type != SENSOR_DATA_TYPE_BOOL, -1);
+
+ pthread_mutex_lock(&data->mutex);
+ *value = data->value.b_val;
+ pthread_mutex_unlock(&data->mutex);
+
+ return 0;
+}
+
+int sensor_data_get_double(sensor_data *data, double *value)
+{
+ retv_if(!data, -1);
+ retv_if(!value, -1);
+ retv_if(data->type != SENSOR_DATA_TYPE_DOUBLE, -1);
+
+ pthread_mutex_lock(&data->mutex);
+ *value = data->value.d_val;
+ pthread_mutex_unlock(&data->mutex);
+
+ return 0;
+}
+
+int sensor_data_get_string(sensor_data *data, const char **value)
+{
+ retv_if(!data, -1);
+ retv_if(!value, -1);
+ retv_if(data->type != SENSOR_DATA_TYPE_STR, -1);
+
+ pthread_mutex_lock(&data->mutex);
+ *value = data->value.str_val;
+ pthread_mutex_unlock(&data->mutex);
+
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <tizen.h>
+#include <service_app.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <Ecore.h>
+
+#include "st_things.h"
+#include "log.h"
+#include "sensor-data.h"
+#include "resource.h"
+
+#define JSON_PATH "device_def.json"
+
+#define SENSOR_URI_ILLUMINANCE "/capability/illuminanceMeasurement/main/0"
+#define SENSOR_KEY_ILLUMINANCE "illuminance"
+#define SENSOR_KEY_RANGE "range"
+
+#define SENSOR_URI_DOOR "/capability/doorControl/main/0"
+#define SENSOR_KEY_DOOR "doorState"
+#define SENSOR_POWER_INITIALIZING BLIND_DOWN
+
+#define I2C_BUS_NUMBER (1)
+#define SENSOR_GATHER_INTERVAL (5.0f)
+
+// If you want to use SmartThings, Please uncomment this define */
+//#define USE_ST_SDK
+
+typedef struct app_data_s {
+ Ecore_Timer *getter_illuminance;
+ sensor_data *illuminance_data;
+ sensor_data *power_data;
+} app_data;
+
+static app_data *g_ad = NULL;
+
+#define ILLUMINATION_CRITERIA 1000
+
+// HS-53 Servo Motor Duty Cycle : 0.54ms ~ 2.1ms
+// Spec Duty Cycle : 0.553ms ~ 2.227ms(https://www.servocity.com/hitec-hs-53-servo)
+#define SERVO_MOTOR_DUTY_CYCLE_COUNTER_CLOCKWISE 1.0
+#define SERVO_MOTOR_DUTY_CYCLE_CLOCKWISE 2.0
+
+#define BLIND_UP "opening"
+#define BLIND_DOWN "closing"
+
+static inline int __get_illuminance(void *data, unsigned int *illuminance_value)
+{
+ int ret = 0;
+ app_data *ad = data;
+
+ retv_if(!ad, -1);
+ retv_if(!ad->illuminance_data, -1);
+
+ ret = resource_read_illuminance_sensor(I2C_BUS_NUMBER, illuminance_value);
+ retv_if(ret != 0, -1);
+
+ sensor_data_set_uint(ad->illuminance_data, *illuminance_value);
+ _D("Illuminance value : %u", *illuminance_value);
+
+#ifdef USE_ST_SDK
+ st_things_notify_observers(SENSOR_URI_ILLUMINANCE);
+#endif
+
+ return 0;
+}
+
+static int __set_servo_motor(void *data, int on)
+{
+ double duty_cycle = 0;
+ int ret = 0;
+ const char *power_value = NULL;
+ app_data *ad = data;
+
+ retv_if(!ad, -1);
+ retv_if(!ad->illuminance_data, -1);
+
+ if (on) {
+ duty_cycle = SERVO_MOTOR_DUTY_CYCLE_CLOCKWISE;
+ power_value = BLIND_UP;
+ } else {
+ duty_cycle = SERVO_MOTOR_DUTY_CYCLE_COUNTER_CLOCKWISE;
+ power_value = BLIND_DOWN;
+ }
+
+ ret = resource_set_servo_motor_value(duty_cycle);
+ retv_if(ret != 0, -1);
+
+ sensor_data_set_string(ad->power_data, power_value, strlen(power_value));
+
+#ifdef USE_ST_SDK
+ st_things_notify_observers(SENSOR_URI_DOOR);
+#endif
+
+ return 0;
+}
+
+static Eina_Bool __illuminance_to_servo_motor(void *data)
+{
+ int ret = 0;
+ unsigned int illuminance_value = 0;
+
+ app_data *ad = data;
+
+ if (!ad) {
+ _E("failed to get app_data");
+ service_app_exit();
+ }
+
+ if (!ad->illuminance_data) {
+ _E("failed to get illuminance_data");
+ service_app_exit();
+ }
+
+ ret = __get_illuminance(ad, &illuminance_value);
+ retv_if(ret != 0, ECORE_CALLBACK_RENEW);
+
+#if 1 // If you want to control MOTOR from Cloud, please deactivate these codes.
+ int on = 0;
+
+ if (illuminance_value < ILLUMINATION_CRITERIA) {
+ on = 0;
+ } else {
+ on = 1;
+ }
+
+ ret = __set_servo_motor(ad, on);
+ retv_if(ret != 0, ECORE_CALLBACK_RENEW);
+#endif
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+void gathering_stop(void *data)
+{
+ app_data *ad = data;
+
+ ret_if(!ad);
+
+ if (ad->getter_illuminance)
+ ecore_timer_del(ad->getter_illuminance);
+}
+
+void gathering_start(void *data)
+{
+ app_data *ad = data;
+
+ ret_if(!ad);
+
+ gathering_stop(ad);
+
+ ad->getter_illuminance = ecore_timer_add(SENSOR_GATHER_INTERVAL, __illuminance_to_servo_motor, ad);
+ if (!ad->getter_illuminance)
+ _E("Failed to add getter_illuminance");
+}
+
+#ifdef USE_ST_SDK
+static bool handle_reset_request(void)
+{
+ _D("Received a request for RESET.");
+ return false;
+}
+
+static void handle_reset_result(bool result)
+{
+ _D("Reset %s.\n", result ? "succeeded" : "failed");
+}
+
+static bool handle_ownership_transfer_request(void)
+{
+ _D("Received a request for Ownership-transfer.");
+ return true;
+}
+
+static void handle_things_status_change(st_things_status_e things_status)
+{
+ _D("Things status is changed: %d", things_status);
+
+ if (things_status == ST_THINGS_STATUS_REGISTERED_TO_CLOUD) {
+ ecore_main_loop_thread_safe_call_async(gathering_start, g_ad);
+ }
+}
+
+static bool handle_get_request(st_things_get_request_message_s* req_msg, st_things_representation_s* resp_rep)
+{
+ _D("resource_uri [%s]", req_msg->resource_uri);
+ retv_if(!g_ad, false);
+
+ if (0 == strcmp(req_msg->resource_uri, SENSOR_URI_ILLUMINANCE)) {
+ if (req_msg->has_property_key(req_msg, SENSOR_KEY_ILLUMINANCE)) {
+ unsigned int value = 0;
+ sensor_data_get_uint(g_ad->illuminance_data, &value);
+ resp_rep->set_int_value(resp_rep, SENSOR_KEY_ILLUMINANCE, value);
+ }
+ return true;
+ } else if (0 == strcmp(req_msg->resource_uri, SENSOR_URI_DOOR)) {
+ if (req_msg->has_property_key(req_msg, SENSOR_KEY_DOOR)) {
+ const char *str = NULL;
+ sensor_data_get_string(g_ad->power_data, &str);
+ if (!str) {
+ str = SENSOR_POWER_INITIALIZING;
+ }
+ resp_rep->set_str_value(resp_rep, SENSOR_KEY_DOOR, str);
+ _D("Power : %s", str);
+ }
+ return true;
+ }
+ _E("not supported uri");
+ return false;
+}
+
+static bool handle_set_request(st_things_set_request_message_s* req_msg, st_things_representation_s* resp_rep)
+{
+ _D("resource_uri [%s]", req_msg->resource_uri);
+ retv_if(!g_ad, false);
+
+ if (0 == strcmp(req_msg->resource_uri, SENSOR_URI_DOOR)) {
+ int ret = 0;
+ char *str = NULL;
+
+ if (req_msg->rep->get_str_value(req_msg->rep, SENSOR_KEY_DOOR, &str)) {
+ retv_if(!str, false);
+ _D("set [%s:%s] == %s", SENSOR_URI_DOOR, SENSOR_KEY_DOOR, str);
+
+ sensor_data_set_string(g_ad->power_data, str, strlen(str));
+ resp_rep->set_str_value(resp_rep, SENSOR_KEY_DOOR, str);
+
+ if (0 == strcmp(str, "opening")) {
+ ret = __set_servo_motor(g_ad, 1);
+ } else {
+ ret = __set_servo_motor(g_ad, 0);
+ }
+ free(str);
+ retv_if(ret != 0, false);
+ } else {
+ _E("cannot get a string value");
+ }
+
+ return true;
+ }
+ return false;
+}
+
+static int __st_things_init(void)
+{
+ bool easysetup_complete = false;
+ char app_json_path[128] = {'\0', };
+ char *app_res_path = NULL;
+ char *app_data_path = NULL;
+
+ app_res_path = app_get_resource_path();
+ if (!app_res_path) {
+ _E("app_res_path is NULL!!");
+ return -1;
+ }
+
+ app_data_path = app_get_data_path();
+ if (!app_data_path) {
+ _E("app_data_path is NULL!!");
+ free(app_res_path);
+ return -1;
+ }
+
+ snprintf(app_json_path, sizeof(app_json_path), "%s%s", app_res_path, JSON_PATH);
+
+ if (0 != st_things_set_configuration_prefix_path(app_res_path, app_data_path)) {
+ _E("st_things_set_configuration_prefix_path() failed!!");
+ free(app_res_path);
+ free(app_data_path);
+ return -1;
+ }
+
+ free(app_res_path);
+ free(app_data_path);
+
+ if (0 != st_things_initialize(app_json_path, &easysetup_complete)) {
+ _E("st_things_initialize() failed!!");
+ return -1;
+ }
+
+ _D("easysetup_complete:[%d] ", easysetup_complete);
+
+ 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);
+
+ return 0;
+}
+
+static int __st_things_deinit(void)
+{
+ st_things_deinitialize();
+ return 0;
+}
+
+static int __st_things_start(void)
+{
+ st_things_start();
+ return 0;
+}
+
+static int __st_things_stop(void)
+{
+ st_things_stop();
+ return 0;
+}
+#endif /* USE_ST_SDK */
+
+static bool service_app_create(void *user_data)
+{
+ app_data *ad = (app_data *)user_data;
+
+ ad->illuminance_data = sensor_data_new(SENSOR_DATA_TYPE_UINT);
+ if (!ad->illuminance_data)
+ return false;
+
+ ad->power_data = sensor_data_new(SENSOR_DATA_TYPE_STR);
+ if (!ad->power_data)
+ return false;
+ sensor_data_set_string(g_ad->power_data, SENSOR_POWER_INITIALIZING, strlen(SENSOR_POWER_INITIALIZING));
+
+#ifdef USE_ST_SDK
+ if (__st_things_init())
+ return false;
+#endif
+
+ return true;
+}
+
+static void service_app_control(app_control_h app_control, void *user_data)
+{
+#ifdef USE_ST_SDK
+ __st_things_start();
+#else
+ gathering_start(user_data);
+#endif
+}
+
+static void service_app_terminate(void *user_data)
+{
+ app_data *ad = (app_data *)user_data;
+
+ resource_close_illuminance_sensor();
+ resource_close_servo_motor();
+
+#ifdef USE_ST_SDK
+ __st_things_stop();
+ __st_things_deinit();
+#else
+ gathering_stop(ad);
+#endif
+
+ sensor_data_free(ad->illuminance_data);
+ free(ad);
+}
+
+int main(int argc, char *argv[])
+{
+ app_data *ad = NULL;
+ service_app_lifecycle_callback_s event_callback;
+
+ ad = calloc(1, sizeof(app_data));
+ retv_if(!ad, -1);
+
+ g_ad = ad;
+
+ event_callback.create = service_app_create;
+ event_callback.terminate = service_app_terminate;
+ event_callback.app_control = service_app_control;
+
+ return service_app_main(argc, argv, &event_callback, ad);
+}
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<manifest xmlns="http://tizen.org/ns/packages" api-version="4.0" package="org.example.smart-blind" version="1.0.0">
+ <profile name="iot-headless"/>
+ <service-application appid="org.example.smart-blind" auto-restart="false" exec="smart-blind" multiple="false" nodisplay="true" on-boot="false" taskmanage="false" type="capp">
+ <label>smart-blind</label>
+ <icon>smart-blind.png</icon>
+ <background-category value="background-network"/>
+ </service-application>
+ <privileges>
+ <privilege>http://tizen.org/privilege/network.get</privilege>
+ <privilege>http://tizen.org/privilege/network.set</privilege>
+ <privilege>http://tizen.org/privilege/internet</privilege>
+ <privilege>http://tizen.org/privilege/alarm.set</privilege>
+ <privilege>http://tizen.org/privilege/network.profile</privilege>
+ <privilege>http://tizen.org/privilege/peripheralio</privilege>
+ </privileges>
+</manifest>