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