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 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
25 #include "OCPlatform.h"
26 #include "RCSDiscoveryManager.h"
27 #include "RCSRemoteResourceObject.h"
28 #include "RCSAddress.h"
29 #include "RemoteSceneList.h"
32 using namespace OIC::Service;
34 constexpr int CREATE_REMOTE_SCENE_LIST = 1;
36 constexpr int CREATE_REMOTE_SCENE_COLLECTION = 1;
37 constexpr int SHOW_REMOTE_SCENE_COLLECTION = 2;
39 constexpr int CREATE_REMOTE_SCENE = 1;
40 constexpr int CREATE_REMOTE_SCENE_ACTION = 1;
42 constexpr int EXECUTE_REMOTE_SCENE = 1;
44 constexpr int SCENE_RESULT_OK = 200;
46 constexpr int numCreatedSceneAction = 2;
47 static int numRecvSceneActionCreationResp = 0;
49 typedef std::function< void() > Run;
52 const std::string scene_name = "Night mode";
53 const std::string relativetUri = OC_RSRVD_WELL_KNOWN_URI;
54 const std::vector<std::string> resourceTypes{ "oic.wk.scenelist", "core.light", "core.fan" };
57 std::mutex g_discoverymtx;
58 std::condition_variable g_cond;
60 std::unique_ptr<RCSDiscoveryManager::DiscoveryTask> g_discoveryTask;
62 RCSRemoteResourceObject::Ptr g_foundListResource;
63 RCSRemoteResourceObject::Ptr g_foundLightResource;
64 RCSRemoteResourceObject::Ptr g_foundFanResource;
66 RemoteSceneList::Ptr g_sceneList;
67 RemoteSceneCollection::Ptr g_sceneCollection;
68 RemoteScene::Ptr g_scene;
70 void displaySceneList();
71 void runCreateRemoteSceneList();
72 void runRemoteSceneCollection();
73 void runCreateRemoteScene();
74 void runCreateRemoteSceneAction();
75 void runExecuteCreatedRemoteScene();
76 void runExecuteExistingRemoteScene();
78 // Scene Manager Remote API sample ---
79 void onRemoteSceneListCreated(RemoteSceneList::Ptr remoteSceneList, int eCode)
81 std::cout << __func__ << " - error code : " << eCode << std::endl;
83 if (eCode == SCENE_RESULT_OK)
85 g_sceneList = std::move(remoteSceneList);
86 g_currentRun = runRemoteSceneCollection;
90 std::cout << "Create Remote scene list failed." << std::endl;
91 g_currentRun = runCreateRemoteSceneList;
96 void onRemoteSceneCollectionCreated(RemoteSceneCollection::Ptr remoteSceneCol, int eCode)
98 std::cout << __func__ << " - error code : " << eCode << std::endl;
100 if (eCode == SCENE_RESULT_OK)
102 g_sceneCollection = remoteSceneCol;
103 g_currentRun = runCreateRemoteScene;
107 std::cout << "Create Remote scene collection failed." << std::endl;
108 g_currentRun = runRemoteSceneCollection;
114 void onRemoteSceneCreated(RemoteScene::Ptr remoteScene, int eCode)
116 std::cout << __func__ << " - error code : " << eCode << std::endl;
118 if (eCode == SCENE_RESULT_OK)
120 g_scene = remoteScene;
122 g_currentRun = runCreateRemoteSceneAction;
126 std::cout << "Create Remote scene failed." << std::endl;
127 g_currentRun = runCreateRemoteScene;
133 void onRemoteSceneActionCreated(RemoteSceneAction::Ptr, int eCode)
135 std::cout << __func__ << " - error code : " << eCode << std::endl;
137 if (eCode == SCENE_RESULT_OK)
139 g_currentRun = runExecuteCreatedRemoteScene;
143 std::cout << "Create Remote scene action failed." << std::endl;
144 g_currentRun = runCreateRemoteSceneAction;
147 numRecvSceneActionCreationResp++;
149 if(numCreatedSceneAction == numRecvSceneActionCreationResp)
153 void onRemoteSceneExecuted(const std::string &sceneName, int eCode)
155 std::cout << __func__ << " - scene name : " << sceneName
156 << ", error code : " << eCode << std::endl;
158 if (eCode != SCENE_RESULT_OK)
160 std::cout << "Execute scene failed." << std::endl;
166 // --- Scene Manager Remote API sample
168 void createRemoteSceneList()
170 if (g_foundListResource)
172 RemoteSceneList::createInstance(g_foundListResource, onRemoteSceneListCreated);
176 std::cout << "Scene List Resource is not discovered." << std::endl;
181 void createRemoteSceneCollection()
183 if (!g_sceneList) return;
185 g_sceneList->addNewSceneCollection(onRemoteSceneCollectionCreated);
188 void showRemoteSceneCollection()
190 if (!g_sceneList) return;
192 if (g_sceneList->getRemoteSceneCollections().size() == 0) return;
194 g_sceneCollection = g_sceneList->getRemoteSceneCollections().at(0);
196 if( g_sceneCollection->getRemoteScenes().size() == 0) return;
198 g_scene = g_sceneCollection->getRemoteScenes().begin()->second;
201 void createRemoteScene()
203 if (!g_sceneCollection) return;
205 g_sceneCollection->addNewScene(scene_name, onRemoteSceneCreated);
208 void createRemoteSceneAction(
209 RemoteScene::Ptr scene, RCSRemoteResourceObject::Ptr member,
210 const std::string &key, const std::string &value)
214 g_scene->addNewSceneAction(member, key, RCSResourceAttributes::Value(value),
215 onRemoteSceneActionCreated);
219 void createRemoteSceneActions()
221 createRemoteSceneAction(g_scene, g_foundLightResource, "power", "on");
222 createRemoteSceneAction(g_scene, g_foundFanResource, "speed", "50");
231 g_scene->execute(onRemoteSceneExecuted);
232 std::cout << "\n\t'" << g_scene->getName() << "' is executed!\n" << std::endl;
236 // --- Scene Manager Remote API sample
238 void configurePlatform()
240 PlatformConfig config
242 OC::ServiceType::InProc, ModeType::Both, "0.0.0.0", 0, OC::QualityOfService::LowQos
244 OCPlatform::Configure(config);
247 int processUserInput(int min, int max)
255 if (!std::cin.fail())
257 if (input == max + 1) exit(0);
258 if (min <= input && input <= max) return input;
262 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
264 throw std::runtime_error("Invalid Input, please try again");
267 void displaySceneList()
269 if (!g_sceneList) return;
271 std::cout << "\t" << g_sceneList->getName() << "(SceneList)" << std::endl;
273 if (!g_sceneCollection) return;
275 std::cout << "\t\t |_ _ _ " << g_sceneCollection->getId() << " (SceneCollection)" << std::endl;
277 for( const auto &it_scene : g_sceneCollection->getRemoteScenes() )
279 std::cout << "\t\t\t |_ _ _ " << it_scene.first << " (Scene)" << std::endl;
281 auto sceneActionList = it_scene.second->getRemoteSceneActions();
282 for (const auto &it : sceneActionList)
284 auto attr = it->getExecutionParameter();
285 for (const auto &att : attr)
287 std::cout << "\t\t\t \t\t|_ _ _ ";
288 std::cout << it->getRemoteResourceObject()->getUri() << " : ";
289 std::cout << att.key() << " - " << att.value().toString() << std::endl;
295 void displayClear(Run runFunc)
297 auto ret = std::system("/usr/bin/clear");
300 std::cout << "clear error!" << std::endl;
302 g_currentRun = runFunc;
305 void displayCreateRemoteSceneListMenu()
307 std::cout << "========================================================\n";
308 std::cout << CREATE_REMOTE_SCENE_LIST << ". Create a RemoteSceneList \n";
309 std::cout << CREATE_REMOTE_SCENE_LIST + 1 << ". Quit \n";
310 std::cout << "========================================================\n";
313 void displayRemoteSceneCollectionMenu()
315 std::cout << "======================================================== \n";
316 std::cout << CREATE_REMOTE_SCENE_COLLECTION << ". Create a RemoteSceneCollection \n";
317 std::cout << SHOW_REMOTE_SCENE_COLLECTION << ". Show existing RemoteSceneCollection \n";
318 std::cout << SHOW_REMOTE_SCENE_COLLECTION + 1 << ". Quit \n";
319 std::cout << "======================================================== \n";
322 void displayRemoteSceneCreationMenu()
324 std::cout << "========================================================\n";
325 std::cout << CREATE_REMOTE_SCENE << ". Create a RemoteScene \n";
326 std::cout << CREATE_REMOTE_SCENE + 1 << ". Quit \n";
327 std::cout << "========================================================\n";
330 void displayRemoteSceneActionCreationMenu()
332 std::cout << "======================================================== \n";
333 std::cout << CREATE_REMOTE_SCENE_ACTION << ". Create RemoteSceneActions \n";
334 std::cout << CREATE_REMOTE_SCENE_ACTION + 1 << ". Quit \n";
335 std::cout << "======================================================== \n";
338 void displayExecuteCreatedRemoteSceneCreationMenu()
340 std::cout << "========================================================\n";
341 std::cout << EXECUTE_REMOTE_SCENE << ". Execute RemoteScene \n";
342 std::cout << EXECUTE_REMOTE_SCENE + 1 << ". Quit \n";
343 std::cout << "========================================================\n";
346 void displayExecuteExistingRemoteSceneCreationMenu()
348 std::cout << "========================================================\n";
349 std::cout << EXECUTE_REMOTE_SCENE << ". Execute a first RemoteScene \n";
350 std::cout << EXECUTE_REMOTE_SCENE + 1 << ". Quit \n";
351 std::cout << "========================================================\n";
354 void runExecuteExistingRemoteScene()
358 displayExecuteExistingRemoteSceneCreationMenu();
362 int command = processUserInput(EXECUTE_REMOTE_SCENE, EXECUTE_REMOTE_SCENE);
365 case EXECUTE_REMOTE_SCENE:
367 displayClear(runExecuteExistingRemoteScene);
370 } catch (std::exception &e)
372 std::cout << e.what() << std::endl;
377 void runExecuteCreatedRemoteScene()
381 displayExecuteCreatedRemoteSceneCreationMenu();
385 int command = processUserInput(EXECUTE_REMOTE_SCENE, EXECUTE_REMOTE_SCENE);
388 case EXECUTE_REMOTE_SCENE:
390 displayClear(runExecuteCreatedRemoteScene);
393 } catch (std::exception &e)
395 std::cout << e.what() << std::endl;
400 void runCreateRemoteSceneAction()
404 displayRemoteSceneActionCreationMenu();
408 int command = processUserInput(CREATE_REMOTE_SCENE_ACTION, CREATE_REMOTE_SCENE_ACTION);
411 case CREATE_REMOTE_SCENE_ACTION:
412 createRemoteSceneActions();
413 displayClear(runExecuteCreatedRemoteScene);
416 } catch (std::exception &e)
418 std::cout << e.what() << std::endl;
423 void runCreateRemoteScene()
427 displayRemoteSceneCreationMenu();
431 int command = processUserInput(CREATE_REMOTE_SCENE, CREATE_REMOTE_SCENE);
434 case CREATE_REMOTE_SCENE:
436 displayClear(runCreateRemoteSceneAction);
439 } catch (std::exception &e)
441 std::cout << e.what() << std::endl;
446 void runRemoteSceneCollection()
450 displayRemoteSceneCollectionMenu();
454 int command = processUserInput(CREATE_REMOTE_SCENE_COLLECTION, SHOW_REMOTE_SCENE_COLLECTION);
457 case CREATE_REMOTE_SCENE_COLLECTION:
458 createRemoteSceneCollection();
459 displayClear(runCreateRemoteScene);
461 case SHOW_REMOTE_SCENE_COLLECTION:
462 showRemoteSceneCollection();
463 displayClear(runExecuteExistingRemoteScene);
467 } catch (std::exception &e)
469 std::cout << e.what() << std::endl;
474 void runCreateRemoteSceneList()
476 displayCreateRemoteSceneListMenu();
480 int command = processUserInput(CREATE_REMOTE_SCENE_LIST, CREATE_REMOTE_SCENE_LIST);
483 case CREATE_REMOTE_SCENE_LIST:
484 createRemoteSceneList();
485 displayClear(runRemoteSceneCollection);
488 } catch (std::exception &e)
490 std::cout << e.what() << std::endl;
495 void onResourceDiscovered(std::shared_ptr<RCSRemoteResourceObject> foundResource)
497 std::lock_guard< std::mutex > lock(g_discoverymtx);
498 std::cout << "onResourceDiscovered callback" << std::endl;
500 std::string resourceURI = foundResource->getUri();
501 std::string hostAddress = foundResource->getAddress();
502 std::vector< std::string > vecRTs = foundResource->getTypes();
504 std::cout << "\t\tResource URI : " << resourceURI << std::endl;
505 std::cout << "\t\tResource Host : " << hostAddress << std::endl;
507 // if the found resource is a scene list resource
508 if (std::find(vecRTs.begin(), vecRTs.end(), "oic.wk.scenelist") != vecRTs.end())
509 g_foundListResource = foundResource;
511 // if the found resource is a light resource
512 else if (std::find(vecRTs.begin(), vecRTs.end(), "core.light") != vecRTs.end())
514 g_foundLightResource = foundResource;
517 // if the found resource is a fan resource
518 else if (std::find(vecRTs.begin(), vecRTs.end(), "core.fan") != vecRTs.end())
520 g_foundFanResource = foundResource;
523 if (g_foundListResource && g_foundLightResource && g_foundFanResource)
525 g_discoveryTask->cancel();
532 void discoverResource()
534 std::cout << "Wait 4 seconds until discovered." << std::endl;
539 = RCSDiscoveryManager::getInstance()->discoverResourceByTypes(RCSAddress::multicast(),
540 relativetUri, resourceTypes, &onResourceDiscovered);
542 catch (const RCSPlatformException &e)
544 std::cout << e.what() << std::endl;
546 std::unique_lock<std::mutex> lck(g_mtx);
548 g_cond.wait_for(lck, std::chrono::seconds(4));
560 g_currentRun = runCreateRemoteSceneList;
563 catch(std::exception &e)
565 std::cout << e.what() << std::endl;
571 std::cout << "Stopping the scene client" << std::endl;