1 //******************************************************************
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
24 #include "OCPlatform.h"
25 #include "RCSDiscoveryManager.h"
26 #include "RCSRemoteResourceObject.h"
27 #include "RCSResourceAttributes.h"
28 #include "RCSResourceObject.h"
29 #include "RCSAddress.h"
30 #include "SceneList.h"
33 using namespace OIC::Service;
35 constexpr int CREATE_SCENE_LIST = 1;
36 constexpr int CREATE_SCENE_COLLECTION = 1;
37 constexpr int CREATE_SCENE = 1;
38 constexpr int CREATE_SCENE_ACTION = 1;
40 constexpr int EXECUTE_SCENE_1 = 1;
41 constexpr int EXECUTE_SCENE_2 = 2;
43 typedef void (*DisplayControlMenuFunc)();
44 typedef std::function<void()> Run;
46 std::unique_ptr<RCSDiscoveryManager::DiscoveryTask> discoveryTask;
51 const std::vector<std::string> resourceTypes{"core.light", "core.fan"};
52 const std::string relativetUri = OC_RSRVD_WELL_KNOWN_URI;
55 std::condition_variable cond;
57 RCSRemoteResourceObject::Ptr g_selectedResource;
58 std::shared_ptr<RCSRemoteResourceObject> g_discoveredResources;
60 std::vector<RCSRemoteResourceObject::Ptr> g_foundResourceList;
61 std::vector<RCSResourceObject::Ptr> g_memberResourceList;
63 SceneCollection::Ptr g_sceneColObj;
66 SceneAction::Ptr g_sceneAction;
68 typedef std::function<void(std::shared_ptr<RCSRemoteResourceObject>)> DiscoveryCallback;
69 typedef std::function<void (int)> ExecuteCallback;
71 void onExecute(int /*Code*/)
73 std::cout << __func__ << std::endl;
76 void configurePlatform()
80 OC::ServiceType::InProc, ModeType::Both, "0.0.0.0", 0, OC::QualityOfService::LowQos
82 OCPlatform::Configure(config);
85 int processUserInput(int min, int max)
95 if(input == max + 1) throw CloseApp();
96 if(min <= input && input <= max) return input;
100 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
102 throw std::runtime_error("Invalid Input, please try again");
105 void displayCreateSceneListMenu()
107 std::cout << "========================================================\n";
108 std::cout << CREATE_SCENE_LIST << ". Create a SceneList \n";
109 std::cout << CREATE_SCENE_LIST + 1 << ". Quit \n";
110 std::cout << "========================================================\n";
113 void displayCreateSceneCollectionMenu()
115 std::cout << "========================================================\n";
116 std::cout << CREATE_SCENE_COLLECTION << ". Create a SceneCollection \n";
117 std::cout << CREATE_SCENE_COLLECTION + 1 << ". Quit \n";
118 std::cout << "========================================================\n";
121 void displayCreateSceneMenu()
123 std::cout << "========================================================\n";
124 std::cout << CREATE_SCENE << ". Create a Scene \n";
125 std::cout << CREATE_SCENE + 1 << ". Quit \n";
126 std::cout << "========================================================\n";
129 void displayCreateSceneActionMenu()
131 std::cout << "========================================================\n";
132 std::cout << CREATE_SCENE_ACTION << ". Create a SceneAction \n";
133 std::cout << CREATE_SCENE_ACTION + 1 << ". Quit \n";
134 std::cout << "========================================================\n";
137 void displayExecuteSceneMenu()
139 std::cout << "========================================================\n";
140 std::cout << EXECUTE_SCENE_1 << ". Execute Scene1 \n";
141 std::cout << EXECUTE_SCENE_2 << ". Execute Scene2 \n";
142 std::cout << EXECUTE_SCENE_2 + 1 << ". Quit \n";
143 std::cout << "========================================================\n";
146 void displaySceneList()
148 std::cout << "\t" << SceneList::getInstance()->getName();
149 std::cout << "(SceneList)" << std::endl;
152 void displaySceneCollection()
154 std::cout << "\t\t |_ _ _ " << g_sceneColObj->getName();
155 std::cout << "(SceneCollection)" << std::endl;
160 std::cout << "\t\t\t |_ _ _ " << g_scene->getName();
161 std::cout << "(Scene)" << std::endl;
162 std::cout << "\t\t\t |_ _ _ " << g_scene_2->getName();
163 std::cout << "(Scene)" << std::endl;
166 void displayClear(Run runFunc)
168 std::cout << "\nPress Enter to Continue....." << std::endl;
170 if(std::cin.get() == '\n')
172 auto ret = std::system("/usr/bin/clear");
175 std::cout << "clear error!" << std::endl;
177 g_currentRun = runFunc;
181 void displaySceneAction()
183 std::cout << "\t\t\t |_ _ _ " << g_scene->getName();
184 std::cout << "(Scene)" << std::endl;
185 auto sceneActionList = g_scene->getSceneActions();
186 for(const auto &it : sceneActionList)
188 auto attr = it->getExecutionParameter();
189 for(const auto &att : attr)
191 std::cout << "\t\t\t |\t\t|_ _ _ ";
192 std::cout << it->getRemoteResourceObject()->getUri() << ":";
193 std::cout << att.key() << " - " << att.value().toString() << std::endl;
197 std::cout << "\t\t\t |_ _ _ " << g_scene_2->getName();
198 std::cout << "(Scene)" << std::endl;
200 sceneActionList = g_scene_2->getSceneActions();
201 for(const auto &it : sceneActionList)
203 auto attr = it->getExecutionParameter();
204 for(const auto &att : attr)
206 std::cout << "\t\t\t \t\t|_ _ _ ";
207 std::cout << it->getRemoteResourceObject()->getUri() << ":";
208 std::cout << att.key() << " - " << att.value().toString() << std::endl;
213 void onResourceDiscovered(std::shared_ptr<RCSRemoteResourceObject> foundResource)
215 std::cout << "onResourceDiscovered callback" << std::endl;
217 std::string resourceURI = foundResource->getUri();
218 std::string hostAddress = foundResource->getAddress();
220 std::cout << "\t\tResource URI : " << resourceURI << std::endl;
221 std::cout << "\t\tResource Host : " << hostAddress << std::endl;
223 g_foundResourceList.push_back(foundResource);
228 bool discoverResource()
230 std::cout << "Wait 2 seconds until discovered." << std::endl;
234 discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByTypes(
235 RCSAddress::multicast(), relativetUri, resourceTypes, &onResourceDiscovered);
237 catch(const RCSPlatformException& e)
239 std::cout << e.what() << std::endl;
241 catch(const RCSException& e)
243 std::cout << e.what() << std::endl;
245 std::unique_lock<std::mutex> lck(mtx);
247 cond.wait_for(lck, std::chrono::seconds(4));
248 return g_discoveredResources != nullptr;
251 void createSceneList()
253 SceneList::getInstance()->setName("Home");
257 void createSceneCollection()
259 g_sceneColObj = SceneList::getInstance()->addNewSceneCollection();
260 g_sceneColObj->setName("Living Room");
262 displaySceneCollection();
269 g_scene = g_sceneColObj->addNewScene("Going Out");
270 g_scene_2 = g_sceneColObj->addNewScene("TV mode");
272 catch(const RCSException& e)
274 std::cout << e.what() << std::endl;
278 displaySceneCollection();
282 void createSceneAction()
286 g_scene->addNewSceneAction(g_foundResourceList.at(0), "power", "off");
287 g_scene->addNewSceneAction(g_foundResourceList.at(1), "speed", "0");
289 g_scene_2->addNewSceneAction(g_foundResourceList.at(0), "power", "on");
290 g_scene_2->addNewSceneAction(g_foundResourceList.at(1), "speed", "20");
292 catch(const RCSException& e)
294 std::cout << e.what() << std::endl;
298 displaySceneCollection();
299 displaySceneAction();
302 void executeScene(int sceneNum)
305 displaySceneCollection();
306 displaySceneAction();
313 g_scene->execute(onExecute);
314 std::cout << "\t'" << g_scene->getName() << "' is executed!" << std::endl;
316 catch(const RCSException& e)
318 std::cout << e.what() <<std::endl;
324 g_scene_2->execute(onExecute);
325 std::cout << "\t'" << g_scene_2->getName() << "' is executed!" << std::endl;
327 catch(const RCSException& e)
329 std::cout << e.what() <<std::endl;
335 void runExecuteScene()
337 displayExecuteSceneMenu();
339 int command = processUserInput(EXECUTE_SCENE_1, EXECUTE_SCENE_2);
342 case EXECUTE_SCENE_1:
345 case EXECUTE_SCENE_2:
349 displayClear(runExecuteScene);
352 void runCreateSceneAction()
354 displayCreateSceneActionMenu();
356 int command = processUserInput(CREATE_SCENE_ACTION, CREATE_SCENE_ACTION);
359 case CREATE_SCENE_ACTION:
361 displayClear(runExecuteScene);
366 void runCreateScene()
368 displayCreateSceneMenu();
370 int command = processUserInput(CREATE_SCENE, CREATE_SCENE);
375 displayClear(runCreateSceneAction);
380 void runCreateSceneCollection()
382 displayCreateSceneCollectionMenu();
384 int command = processUserInput(CREATE_SCENE_COLLECTION, CREATE_SCENE_COLLECTION);
387 case CREATE_SCENE_COLLECTION:
388 createSceneCollection();
389 displayClear(runCreateScene);
394 void runCreateSceneList()
396 displayCreateSceneListMenu();
398 int command = processUserInput(CREATE_SCENE_LIST, CREATE_SCENE_LIST);
401 case CREATE_SCENE_LIST:
402 discoveryTask->cancel();
404 displayClear(runCreateSceneCollection);
415 g_currentRun = runCreateSceneList;
423 catch (const std::exception& e)
425 std::cout << e.what() << std::endl;
427 catch (const CloseApp&)
433 std::cout << "Stopping the client" << std::endl;