#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]" <<std::endl;
+ std::cout << " 2 - Creation of Resource [Developer control for Get and Set requests]"
+ << std::endl;
std::cout << " 3 - Quit" << std::endl;
- std::cout << "=====================================================================\n\n";
+ std::cout << "====================================================================="
+ << std::endl;
}
-//hander for get request (if developer choose second option for resource Creation)
-RCSGetResponse RequestHandlerForGet(const RCSRequest &request,
- RCSResourceAttributes &attrs)
+void displayControlTemperatureMenu()
{
- cout << "Recieved a Get request from Client" << std::endl;
- RCSResourceObject::LockGuard lock(*server);
- RCSResourceAttributes attr = server->getAttributes();
- RCSResourceAttributes::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,
- RCSResourceAttributes &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;
- RCSResourceAttributes::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 RCSPlatformException& 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<int>(attributeKey) + 10;
+ std::cout << "\nTemperature increased by 10 degree" << std::endl;
+ }
+ else if(Control::DECREASE == control)
+ {
+ server->getAttributes()[attributeKey] =
+ server->getAttribute<int>(attributeKey) - 10;
+ std::cout << "\nTemperature Decreased by 10 degree" << std::endl;
+ }
+ std::cout << "\nCurrent Temperature : "
+ << server->getAttributeValue(attributeKey).get<int>() << 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<std::streamsize>::max(), '\n');
- try
+ if (std::cin.fail())
{
- while (flag)
- {
+ std::cin.clear();
+ std::cin.ignore(std::numeric_limits<std::streamsize>::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<std::streamsize>::max(), '\n');
- std::cout << "Invalid input type, please try again" << std::endl;
- continue;
- }
-
- switch (temperatureInput)
- {
- case 1:
- {
- RCSResourceObject::LockGuard lock(*server);
- RCSResourceAttributes attrs = server->getAttributes();
-
- attrs[attributeKey] = (server->getAttribute<int>(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 : ";
- RCSResourceAttributes::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);
- RCSResourceAttributes attrs = server->getAttributes();
- attrs[attributeKey] = (server->getAttribute<int>(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 : ";
- RCSResourceAttributes::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;
+}