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 <condition_variable>
26 #include "OCPlatform.h"
27 #include "RCSDiscoveryManager.h"
28 #include "RCSRemoteResourceObject.h"
29 #include "RCSAddress.h"
30 #include "RemoteSceneList.h"
33 using namespace OIC::Service;
35 constexpr int CREATE_REMOTE_SCENE_LIST = 1;
37 constexpr int CREATE_REMOTE_SCENE_COLLECTION = 1;
38 constexpr int SHOW_REMOTE_SCENE_COLLECTION = 2;
40 constexpr int CREATE_REMOTE_SCENE = 1;
41 constexpr int CREATE_REMOTE_SCENE_ACTION = 1;
43 constexpr int EXECUTE_REMOTE_SCENE = 1;
45 constexpr int SCENE_RESULT_OK = 200;
47 constexpr int numCreatedSceneAction = 2;
48 static int numRecvSceneActionCreationResp = 0;
50 typedef std::function< void() > Run;
53 const std::string scene_name = "Night mode";
54 const std::string relativetUri = OC_RSRVD_WELL_KNOWN_URI;
55 const std::vector<std::string> resourceTypes{ "oic.wk.sceneList", "core.light", "core.fan" };
58 std::mutex g_discoverymtx;
59 std::condition_variable g_cond;
61 std::unique_ptr<RCSDiscoveryManager::DiscoveryTask> g_discoveryTask;
63 RCSRemoteResourceObject::Ptr g_foundListResource;
64 RCSRemoteResourceObject::Ptr g_foundLightResource;
65 RCSRemoteResourceObject::Ptr g_foundFanResource;
67 RemoteSceneList::Ptr g_sceneList;
68 RemoteSceneCollection::Ptr g_sceneCollection;
69 RemoteScene::Ptr g_scene;
71 void displaySceneList();
72 void runCreateRemoteSceneList();
73 void runRemoteSceneCollection();
74 void runCreateRemoteScene();
75 void runCreateRemoteSceneAction();
76 void runExecuteCreatedRemoteScene();
77 void runExecuteExistingRemoteScene();
79 // Scene Manager Remote API sample ---
80 void onRemoteSceneListCreated(RemoteSceneList::Ptr remoteSceneList, int eCode)
82 std::cout << __func__ << " - error code : " << eCode << std::endl;
84 if (eCode == SCENE_RESULT_OK)
86 g_sceneList = std::move(remoteSceneList);
87 g_currentRun = runRemoteSceneCollection;
91 std::cout << "Create Remote scene list failed." << std::endl;
92 g_currentRun = runCreateRemoteSceneList;
97 void onRemoteSceneCollectionCreated(RemoteSceneCollection::Ptr remoteSceneCol, int eCode)
99 std::cout << __func__ << " - error code : " << eCode << std::endl;
101 if (eCode == SCENE_RESULT_OK)
103 g_sceneCollection = remoteSceneCol;
104 g_currentRun = runCreateRemoteScene;
108 std::cout << "Create Remote scene collection failed." << std::endl;
109 g_currentRun = runRemoteSceneCollection;
115 void onRemoteSceneCreated(RemoteScene::Ptr remoteScene, int eCode)
117 std::cout << __func__ << " - error code : " << eCode << std::endl;
119 if (eCode == SCENE_RESULT_OK)
121 g_scene = remoteScene;
123 g_currentRun = runCreateRemoteSceneAction;
127 std::cout << "Create Remote scene failed." << std::endl;
128 g_currentRun = runCreateRemoteScene;
134 void onRemoteSceneActionCreated(RemoteSceneAction::Ptr, int eCode)
136 std::cout << __func__ << " - error code : " << eCode << std::endl;
138 if (eCode == SCENE_RESULT_OK)
140 g_currentRun = runExecuteCreatedRemoteScene;
144 std::cout << "Create Remote scene action failed." << std::endl;
145 g_currentRun = runCreateRemoteSceneAction;
148 numRecvSceneActionCreationResp++;
150 if(numCreatedSceneAction == numRecvSceneActionCreationResp)
154 void onRemoteSceneExecuted(const std::string &sceneName, int eCode)
156 std::cout << __func__ << " - scene name : " << sceneName
157 << ", error code : " << eCode << std::endl;
159 if (eCode != SCENE_RESULT_OK)
161 std::cout << "Execute scene failed." << std::endl;
167 // --- Scene Manager Remote API sample
169 void createRemoteSceneList()
171 if (g_foundListResource)
173 RemoteSceneList::createInstance(g_foundListResource, onRemoteSceneListCreated);
177 std::cout << "Scene List Resource is not discovered." << std::endl;
182 void createRemoteSceneCollection()
184 if (!g_sceneList) return;
186 g_sceneList->addNewSceneCollection(onRemoteSceneCollectionCreated);
189 void showRemoteSceneCollection()
191 if (!g_sceneList) return;
193 if (g_sceneList->getRemoteSceneCollections().size() == 0) return;
195 g_sceneCollection = g_sceneList->getRemoteSceneCollections().at(0);
197 if( g_sceneCollection->getRemoteScenes().size() == 0) return;
199 g_scene = g_sceneCollection->getRemoteScenes().begin()->second;
202 void createRemoteScene()
204 if (!g_sceneCollection) return;
206 g_sceneCollection->addNewScene(scene_name, onRemoteSceneCreated);
209 void createRemoteSceneAction(
210 RemoteScene::Ptr scene, RCSRemoteResourceObject::Ptr member,
211 const std::string &key, const std::string &value)
215 g_scene->addNewSceneAction(member, key, RCSResourceAttributes::Value(value),
216 onRemoteSceneActionCreated);
220 void createRemoteSceneActions()
222 createRemoteSceneAction(g_scene, g_foundLightResource, "power", "on");
223 createRemoteSceneAction(g_scene, g_foundFanResource, "speed", "50");
232 g_scene->execute(onRemoteSceneExecuted);
233 std::cout << "\n\t'" << g_scene->getName() << "' is executed!\n" << std::endl;
237 // --- 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;