X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=service%2Fresource-encapsulation%2Fexamples%2Flinux%2FSampleResourceServer.cpp;h=b1c67cf4e035ccb7dd3ec8f441535d791f2080cb;hb=80699343a756990062eb513d395a395a5ad8baea;hp=cd2f88feb3a2937decd039cd2f2b543cb89c2ef0;hpb=aa6acd5905131fe90888bff37230cdd617098887;p=platform%2Fupstream%2Fiotivity.git diff --git a/service/resource-encapsulation/examples/linux/SampleResourceServer.cpp b/service/resource-encapsulation/examples/linux/SampleResourceServer.cpp index cd2f88f..b1c67cf 100644 --- a/service/resource-encapsulation/examples/linux/SampleResourceServer.cpp +++ b/service/resource-encapsulation/examples/linux/SampleResourceServer.cpp @@ -23,211 +23,312 @@ #include "OCPlatform.h" #include "OCApi.h" -using namespace std; using namespace OC; using namespace OC::OCPlatform; using namespace OIC::Service; +constexpr int DEFALUT_VALUE = 0; + +constexpr int REQUEST_TEMP = 1; +constexpr int REQUEST_LIGHT = 2; + +constexpr int PRESENCE_ON = 1; +constexpr int PRESENCE_OFF = 2; + +constexpr int DEFALUT_SERVER = 1; +constexpr int CUSTOM_SERVER = 2; +constexpr int STOP = 3; + +constexpr int INCREASE_TEMPERATURE = 1; +constexpr int DECREASE_TEMPERATURE = 2; +constexpr int STOP_TEMPERATURE_SENSOR = 3; +constexpr int STOP_LIGHT_SENSOR = 1; + +constexpr int CORRECT_INPUT = 1; +constexpr int INCORRECT_INPUT = 2; +constexpr int QUIT = 3; + + std::string resourceUri = "/a/TempSensor"; std::string resourceType = "core.TemperatureSensor"; std::string resourceInterface = "oic.if."; std::string attributeKey = "Temperature"; +int isPresenceOn = PRESENCE_ON; + RCSResourceObject::Ptr server; -//display the menu on the screen +int processUserInput(); + +enum class Control{ + INCREASE, + DECREASE +}; + void displayMenu() { - std::cout << "=====================================================================\n\n"; + std::cout << "=====================================================================" + << std::endl; std::cout << " 1 - Creation of Resource [Auto control for requests]" << std::endl; - std::cout << " 2 - Creation of Resource [Developer control for Get and Set requests]" <getAttributes(); - ResourceAttributes::const_iterator iter = attr.begin(); - cout << "\nSending response to Client : " << std::endl; - for (unsigned int i = 0; i < attr.size(); ++i) + std::cout << "========================================================" << std::endl; + std::cout << "1. Increase Temperature by 10 degree" << std::endl; + std::cout << "2. Decrease Temperature by 10 degree" << std::endl; + std::cout << "3. Stop the Sensor" << std::endl; + std::cout << "========================================================" << std::endl; +} + +void displayControlLightMenu() +{ + std::cout << "========================================================" << std::endl; + std::cout << "1. Stop the Sensor" << std::endl; + std::cout << "========================================================" << std::endl; +} + +void printAttribute(const RCSResourceAttributes& attrs) +{ + for(const auto& attr : attrs) { - std::cout << "\tkey : " << iter->key() << "\n\tvalue : " << iter->value().toString() << std::endl; - ++iter; + std::cout << "\tkey : " << attr.key() << "\n\tvalue : " + << attr.value().toString() << std::endl; } - return RCSGetResponse::create(attr); +} + +//hander for get request (if developer choose second option for resource Creation) +RCSGetResponse requestHandlerForGet(const RCSRequest& request, + RCSResourceAttributes& attrs) +{ + std::cout << "Recieved a Get request from Client" << std::endl; + RCSResourceObject::LockGuard lock(*server); + RCSResourceAttributes attributes = server->getAttributes(); + + std::cout << "\nSending response to Client : " << std::endl; + printAttribute(attributes); + + return RCSGetResponse::defaultAction(); } //hander for set request (if developer choose second option for resource Creation) -RCSSetResponse RequestHandlerForSet(const RCSRequest &request, - ResourceAttributes &attrs) +RCSSetResponse requestHandlerForSet(const RCSRequest& request, + RCSResourceAttributes& attrs) +{ + std::cout << "Recieved a Set request from Client" << std::endl; + + std::cout << "\n\nSending response to Client : " << std::endl; + RCSResourceObject::LockGuard lock(*server); + printAttribute(attrs); + return RCSSetResponse::defaultAction(); +} + +void createResource() { - cout << "Recieved a Set request from Client" << std::endl; - ResourceAttributes::const_iterator iter = attrs.begin(); - for (unsigned int i = 0; i < attrs.size(); ++i) + server = RCSResourceObject::Builder(resourceUri, resourceType,resourceInterface). + setDiscoverable(true).setObservable(true).build(); +} + +void initServer() +{ + std::cout << "========================================================" << std::endl; + std::cout << "Select Resource Type" << std::endl; + std::cout << "1. Temperature" << std::endl; + std::cout << "2. Light" << std::endl; + std::cout << "========================================================" << std::endl; + + switch(processUserInput()) { - std::cout << "\tkey : " << iter->key() << "\n\tvalue : " << iter->value().toString() << std::endl; - ++iter; + case REQUEST_TEMP: + resourceUri = "/a/TempSensor"; + resourceType = "core.TemperatureSensor"; + break; + case REQUEST_LIGHT: + resourceUri = "/a/light"; + resourceType = "core.light"; + break; + default : + std::cout << "Invalid input, please try again" << std::endl; + return; } - iter = attrs.begin(); - cout << "\n\nSending response to Client : " << std::endl; - for (unsigned int i = 0; i < attrs.size(); ++i) + + try { - std::cout << "\tkey : " << iter->key() << "\n\tvalue : " << iter->value().toString() << std::endl; - ++iter; + createResource(); } - return RCSSetResponse::create(attrs); + catch (const PlatformException& e) + { + std::cout << "Exception in initServer : " << e.what() << std::endl; + } + + server->setAutoNotifyPolicy(RCSResourceObject::AutoNotifyPolicy::UPDATED); + server->setSetRequestHandlerPolicy(RCSResourceObject::SetRequestHandlerPolicy::NEVER); + server->setAttribute(attributeKey, DEFALUT_VALUE); } -int main(void) +void changeTemperature(Control control) { + RCSResourceObject::LockGuard lock(server); + if(Control::INCREASE == control) + { + server->getAttributes()[attributeKey] = + server->getAttribute(attributeKey) + 10; + std::cout << "\nTemperature increased by 10 degree" << std::endl; + } + else if(Control::DECREASE == control) + { + server->getAttributes()[attributeKey] = + server->getAttribute(attributeKey) - 10; + std::cout << "\nTemperature Decreased by 10 degree" << std::endl; + } + std::cout << "\nCurrent Temperature : " + << server->getAttributeValue(attributeKey).get() << std::endl; +} +int processUserInput() +{ int userInput; - int initialTemperature = 0; - int temperatureInput; - bool flag = true; - startPresence(3); - - displayMenu(); - - //userInput for creation of Resource std::cin >> userInput; - std::cin.clear(); - std::cin.ignore (std::numeric_limits::max(), '\n'); - try + if (std::cin.fail()) { - while (flag) - { + std::cin.clear(); + std::cin.ignore(std::numeric_limits::max(), '\n'); + return -1; + } + return userInput; +} - switch (userInput) - { - - case 1: - //Creation of Resource & Auto control for all requests from Client - { - //creation of Resource - server = RCSResourceObject::Builder(resourceUri, resourceType, - resourceInterface).setDiscoverable(true).setObservable(false).build(); - std::cout << "Resource created successfully " << std::endl; - - //setting attribute for the Created Resource - server->setAttribute(attributeKey, initialTemperature); - flag = false; - break; - } - - case 2: - //Creation of Resource & setting get and set handler for handling get and set request from client in application - { - server = RCSResourceObject::Builder(resourceUri, resourceType, - resourceInterface).setDiscoverable(true).setObservable(false).build(); - std::cout << "Resource created successfully " << std::endl; - - //setting attribute for the Created Resource - server->setAttribute(attributeKey, initialTemperature); - - //setting handler for handling get request from the client - server->setGetRequestHandler(RequestHandlerForGet); - - // setting handler for handling set request from the client - server->setSetRequestHandler(RequestHandlerForSet); - flag = false; - break; - } - case 3: - return 0; - default : - std::cout << "Invalid Input" << std::endl; - break; - } - } +int selectPresenceMenu() +{ + std::cout << "========================================================" << std::endl; + std::cout << "1. Presence On" << std::endl; + std::cout << "2. Presence Off" << std::endl; + std::cout << "========================================================" << std::endl; - while (true) + switch(processUserInput()) { - bool end = false; - cout << endl; - cout << "========================================================" << endl; - cout << "1. Increase Temperature by 10 degree" << endl; - cout << "2. Decrease Temperature by 10 degree" << endl; - cout << "3. Stop the Sensor" << endl; - cout << "========================================================" << endl; - - //user Input for increasing/decreasing the temperature - cin >> temperatureInput; - if (std::cin.fail()) - { - std::cin.clear(); - std::cin.ignore(std::numeric_limits::max(), '\n'); - std::cout << "Invalid input type, please try again" << std::endl; - continue; - } - - switch (temperatureInput) - { - case 1: - { - RCSResourceObject::LockGuard lock(*server); - ResourceAttributes attrs = server->getAttributes(); - - attrs[attributeKey] = (server->getAttribute(attributeKey) + 10); - server->setAttribute(attributeKey, attrs[attributeKey]); - cout << "\nTemperature increased by 10 degree" << endl; - - //getting the current attribute and priniting it on the console - attrs = server->getAttributes(); - cout << "\nCurrent Temperature : "; - ResourceAttributes::const_iterator iter = attrs.begin(); - for (unsigned int i = 0; i < attrs.size(); ++i) - { - std::cout << iter->value().toString() << std::endl; - ++iter; - } - break; - } - case 2: - { - RCSResourceObject::LockGuard lock(*server); - ResourceAttributes attrs = server->getAttributes(); - attrs[attributeKey] = (server->getAttribute(attributeKey) - 10); - server->setAttribute(attributeKey, attrs[attributeKey]); - cout << "\nTemperature decreased by 10 degree" << endl; - - //getting the current attribute and priniting it on the console - attrs = server->getAttributes(); - cout << "\nCurrent Temperature : "; - ResourceAttributes::const_iterator iter = attrs.begin(); - for (unsigned int i = 0; i < attrs.size(); ++i) - { - std::cout << iter->value().toString() << std::endl; - ++iter; - } - break; - } - case 3: - { - cout << "Stopping the Resource" << endl; - end = true; - break; - } - default: - { - cout << "Invalid input. Please try again." << endl; - break; - } - } - if (end == true) - { - break; - } + case PRESENCE_ON: + isPresenceOn = PRESENCE_ON; + startPresence(3); + return CORRECT_INPUT; + case PRESENCE_OFF: + isPresenceOn = PRESENCE_OFF; + return CORRECT_INPUT; + default : + std::cout << "Invalid input, please try again" << std::endl; + return INCORRECT_INPUT; } +} +int selectServerMenu() +{ + switch (processUserInput()) + { + case DEFALUT_SERVER: // Creation of Resource & Auto control for all requests from Client. + initServer(); + return CORRECT_INPUT; + + case CUSTOM_SERVER: + // Creation of Resource & setting get and set handler for handling get and + // set request from client in application. + initServer(); + + server->setGetRequestHandler(requestHandlerForGet); + server->setSetRequestHandler(requestHandlerForSet); + return CORRECT_INPUT; + case STOP : + return QUIT; + + default : + std::cout << "Invalid input, please try again" << std::endl; + return INCORRECT_INPUT; } - catch (exception &e) +} + +int selectControlTemperatureMenu() +{ + switch (processUserInput()) + { + case INCREASE_TEMPERATURE: + changeTemperature(Control::INCREASE); + return CORRECT_INPUT; + + case DECREASE_TEMPERATURE: + changeTemperature(Control::DECREASE); + return CORRECT_INPUT; + + case STOP_TEMPERATURE_SENSOR: + return QUIT; + + default: + std::cout << "Invalid input. Please try again." << std::endl; + return INCORRECT_INPUT; + } +} + +int selectControlLightMenu() +{ + switch (processUserInput()) + { + case STOP_LIGHT_SENSOR: + return QUIT; + + default: + std::cout << "Invalid input. Please try again." << std::endl; + return INCORRECT_INPUT; + } +} + +void process() +{ + while(true) + { + int ret = selectPresenceMenu(); + if(ret == CORRECT_INPUT) break; + } + + while(true) { - cout << "main exception : " << e.what() << endl; + displayMenu(); + int ret = selectServerMenu(); + + if(ret == QUIT) return; + if(ret == CORRECT_INPUT) break; + } + + while(true) + { + if(resourceType == "core.TemperatureSensor") + { + displayControlTemperatureMenu(); + if (selectControlTemperatureMenu() == QUIT) return; + } + else if(resourceType == "core.light") + { + displayControlLightMenu(); + if (selectControlLightMenu() == QUIT) return; + } } } +int main(void) +{ + try + { + process(); + server = NULL; + } + catch (const std::exception& e) + { + std::cout << "main exception : " << e.what() << std::endl; + } + if(isPresenceOn == PRESENCE_ON) + { + stopPresence(); + } + std::cout << "Stopping the Server" << std::endl; +}