a865d1182613570457ad48e4af984b284091dd86
[platform/upstream/iotivity.git] / service / scene-manager / sampleapp / linux / sceneserver.cpp
1 //******************************************************************
2 //
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
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
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
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.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #include <iostream>
22 #include <vector>
23
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"
31
32 using namespace OC;
33 using namespace OIC::Service;
34
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;
39
40 constexpr int EXECUTE_SCENE_1 = 1;
41 constexpr int EXECUTE_SCENE_2 = 2;
42
43 typedef void (*DisplayControlMenuFunc)();
44 typedef std::function<void()> Run;
45
46 std::unique_ptr<RCSDiscoveryManager::DiscoveryTask> discoveryTask;
47 Run g_currentRun;
48
49 struct CloseApp {};
50
51 const std::vector<std::string> resourceTypes{"core.light", "core.fan"};
52 const std::string relativetUri = OC_RSRVD_WELL_KNOWN_URI;
53
54 std::mutex mtx;
55 std::condition_variable cond;
56
57 RCSRemoteResourceObject::Ptr g_selectedResource;
58 std::shared_ptr<RCSRemoteResourceObject> g_discoveredResources;
59
60 std::vector<RCSRemoteResourceObject::Ptr> g_foundResourceList;
61 std::vector<RCSResourceObject::Ptr> g_memberResourceList;
62
63 SceneCollection::Ptr g_sceneColObj;
64 Scene::Ptr g_scene;
65 Scene::Ptr g_scene_2;
66 SceneAction::Ptr g_sceneAction;
67
68 typedef std::function<void(std::shared_ptr<RCSRemoteResourceObject>)> DiscoveryCallback;
69 typedef std::function<void (int)> ExecuteCallback;
70
71 void onExecute(int /*Code*/)
72 {
73     std::cout << __func__ << std::endl;
74 }
75
76 void configurePlatform()
77 {
78     PlatformConfig config
79     {
80         OC::ServiceType::InProc, ModeType::Both, "0.0.0.0", 0, OC::QualityOfService::LowQos
81     };
82     OCPlatform::Configure(config);
83 }
84
85 int processUserInput(int min, int max)
86 {
87     assert(min <= max);
88
89     int input;
90
91     std::cin >> input;
92
93     if (!std::cin.fail())
94     {
95         if(input == max + 1) throw CloseApp();
96         if(min <= input && input <= max) return input;
97     }
98
99     std::cin.clear();
100     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
101
102     throw std::runtime_error("Invalid Input, please try again");
103 }
104
105 void displayCreateSceneListMenu()
106 {
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";
111 }
112
113 void displayCreateSceneCollectionMenu()
114 {
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";
119 }
120
121 void displayCreateSceneMenu()
122 {
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";
127 }
128
129 void displayCreateSceneActionMenu()
130 {
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";
135 }
136
137 void displayExecuteSceneMenu()
138 {
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";
144 }
145
146 void displaySceneList()
147 {
148     std::cout << "\t" << SceneList::getInstance()->getName();
149     std::cout << "(SceneList)" << std::endl;
150 }
151
152 void displaySceneCollection()
153 {
154     std::cout << "\t\t   |_ _ _ " << g_sceneColObj->getName();
155     std::cout << "(SceneCollection)" << std::endl;
156 }
157
158 void displayScene()
159 {
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;
164 }
165
166 void displayClear(Run runFunc)
167 {
168     std::cout << "\nPress Enter to Continue....." << std::endl;
169     std::cin.ignore();
170     if(std::cin.get() == '\n')
171     {
172         auto ret = std::system("/usr/bin/clear");
173         if(ret == -1)
174         {
175             std::cout << "clear error!" << std::endl;
176         }
177         g_currentRun = runFunc;
178     }
179 }
180
181 void displaySceneAction()
182 {
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)
187     {
188         auto attr = it->getExecutionParameter();
189         for(const auto &att : attr)
190         {
191             std::cout << "\t\t\t      |\t\t|_ _ _ ";
192             std::cout << it->getRemoteResourceObject()->getUri() << ":";
193             std::cout << att.key() << " - "  << att.value().toString() << std::endl;
194         }
195     }
196
197     std::cout << "\t\t\t      |_ _ _ " << g_scene_2->getName();
198     std::cout << "(Scene)" << std::endl;
199
200     sceneActionList = g_scene_2->getSceneActions();
201     for(const auto &it : sceneActionList)
202     {
203         auto attr = it->getExecutionParameter();
204         for(const auto &att : attr)
205         {
206             std::cout << "\t\t\t       \t\t|_ _ _ ";
207             std::cout << it->getRemoteResourceObject()->getUri() << ":";
208             std::cout << att.key() << " - "  << att.value().toString() << std::endl;
209         }
210     }
211 }
212
213 void onResourceDiscovered(std::shared_ptr<RCSRemoteResourceObject> foundResource)
214 {
215     std::cout << "onResourceDiscovered callback" << std::endl;
216
217     std::string resourceURI = foundResource->getUri();
218     std::string hostAddress = foundResource->getAddress();
219
220     std::cout << "\t\tResource URI : " << resourceURI << std::endl;
221     std::cout << "\t\tResource Host : " << hostAddress << std::endl;
222
223     g_foundResourceList.push_back(foundResource);
224
225     cond.notify_all();
226 }
227
228 bool discoverResource()
229 {
230     std::cout << "Wait 2 seconds until discovered." << std::endl;
231
232     try
233     {
234         discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByTypes(
235                 RCSAddress::multicast(), relativetUri, resourceTypes, &onResourceDiscovered);
236     }
237     catch(const RCSPlatformException& e)
238     {
239          std::cout << e.what() << std::endl;
240     }
241     catch(const RCSException& e)
242     {
243         std::cout << e.what() << std::endl;
244     }
245     std::unique_lock<std::mutex> lck(mtx);
246
247     cond.wait_for(lck, std::chrono::seconds(4));
248     return g_discoveredResources != nullptr;
249 }
250
251 void createSceneList()
252 {
253     SceneList::getInstance()->setName("Home");
254     displaySceneList();
255 }
256
257 void createSceneCollection()
258 {
259     g_sceneColObj = SceneList::getInstance()->addNewSceneCollection();
260     g_sceneColObj->setName("Living Room");
261     displaySceneList();
262     displaySceneCollection();
263 }
264
265 void createScene()
266 {
267     try
268     {
269         g_scene = g_sceneColObj->addNewScene("Going Out");
270         g_scene_2 = g_sceneColObj->addNewScene("TV mode");
271     }
272     catch(const RCSException& e)
273     {
274         std::cout << e.what() << std::endl;
275     }
276
277     displaySceneList();
278     displaySceneCollection();
279     displayScene();
280 }
281
282 void createSceneAction()
283 {
284     try
285     {
286         g_scene->addNewSceneAction(g_foundResourceList.at(0), "power", "off");
287         g_scene->addNewSceneAction(g_foundResourceList.at(1), "speed", "0");
288
289         g_scene_2->addNewSceneAction(g_foundResourceList.at(0), "power", "on");
290         g_scene_2->addNewSceneAction(g_foundResourceList.at(1), "speed", "20");
291     }
292     catch(const RCSException& e)
293     {
294         std::cout << e.what() << std::endl;
295     }
296
297     displaySceneList();
298     displaySceneCollection();
299     displaySceneAction();
300 }
301
302 void executeScene(int sceneNum)
303 {
304     displaySceneList();
305     displaySceneCollection();
306     displaySceneAction();
307
308     switch(sceneNum)
309     {
310         case 1:
311             try
312             {
313                 g_scene->execute(onExecute);
314                 std::cout << "\t'" << g_scene->getName() << "' is executed!" << std::endl;
315             }
316             catch(const RCSException& e)
317             {
318                 std::cout << e.what() <<std::endl;
319             }
320             break;
321         case 2:
322             try
323             {
324                 g_scene_2->execute(onExecute);
325                 std::cout << "\t'" << g_scene_2->getName() << "' is executed!" << std::endl;
326             }
327             catch(const RCSException& e)
328             {
329                 std::cout << e.what() <<std::endl;
330             }
331             break;
332     }
333 }
334
335 void runExecuteScene()
336 {
337     displayExecuteSceneMenu();
338
339     int command = processUserInput(EXECUTE_SCENE_1, EXECUTE_SCENE_2);
340     switch(command)
341     {
342         case EXECUTE_SCENE_1:
343             executeScene(1);
344             break;
345         case EXECUTE_SCENE_2:
346             executeScene(2);
347             break;
348     }
349     displayClear(runExecuteScene);
350 }
351
352 void runCreateSceneAction()
353 {
354     displayCreateSceneActionMenu();
355
356     int command = processUserInput(CREATE_SCENE_ACTION, CREATE_SCENE_ACTION);
357     switch(command)
358     {
359         case CREATE_SCENE_ACTION:
360             createSceneAction();
361             displayClear(runExecuteScene);
362             break;
363     }
364 }
365
366 void runCreateScene()
367 {
368     displayCreateSceneMenu();
369
370     int command = processUserInput(CREATE_SCENE, CREATE_SCENE);
371     switch(command)
372     {
373         case CREATE_SCENE:
374             createScene();
375             displayClear(runCreateSceneAction);
376             break;
377     }
378 }
379
380 void runCreateSceneCollection()
381 {
382     displayCreateSceneCollectionMenu();
383
384     int command = processUserInput(CREATE_SCENE_COLLECTION, CREATE_SCENE_COLLECTION);
385     switch(command)
386     {
387         case CREATE_SCENE_COLLECTION:
388             createSceneCollection();
389             displayClear(runCreateScene);
390             break;
391     }
392 }
393
394 void runCreateSceneList()
395 {
396     displayCreateSceneListMenu();
397
398     int command = processUserInput(CREATE_SCENE_LIST, CREATE_SCENE_LIST);
399     switch(command)
400     {
401         case CREATE_SCENE_LIST:
402             discoveryTask->cancel();
403             createSceneList();
404             displayClear(runCreateSceneCollection);
405             break;
406     }
407 }
408
409 int main()
410 {
411     configurePlatform();
412
413     discoverResource();
414
415     g_currentRun = runCreateSceneList;
416
417     while (true)
418     {
419         try
420         {
421             g_currentRun();
422         }
423         catch (const std::exception& e)
424         {
425             std::cout << e.what() << std::endl;
426         }
427         catch (const CloseApp&)
428         {
429             break;
430         }
431     }
432
433     std::cout << "Stopping the client" << std::endl;
434
435     return 0;
436 }