#include "OCPlatform.h"
#include "OCApi.h"
+#include "logger.h"
#include <functional>
#include <pthread.h>
+#include <mutex>
+#include <condition_variable>
#include <iostream>
+#include <mutex>
+
+#define DO_ACTION "DoAction"
+#define GET_ACTIONSET "GetActionSet"
+#define ACTIONSET "ActionSet"
+#define DELETE_ACTIONSET "DelActionSet"
using namespace std;
using namespace OC;
namespace PH = std::placeholders;
+std::mutex resourceLock;
OCResourceHandle resourceHandle;
-
shared_ptr< OCResource > g_resource;
vector< string > lights;
+std::mutex blocker;
+std::condition_variable cv;
bool isReady = false;
void foundResource(std::shared_ptr< OCResource > resource)
{
+ std::lock_guard<std::mutex> lock(resourceLock);
+ if(g_resource)
+ {
+ std::cout << "Found another resource, ignoring"<<std::endl;
+ return;
+ }
+
std::string resourceURI;
std::string hostAddress;
{
string resourceURI = resource->uri();
cout << resourceURI << endl;
+ cout << "HOST :: " << resource->host() << endl;
if (resourceURI == "/core/a/collection")
{
g_resource = resource;
+ resource->get("", DEFAULT_INTERFACE, QueryParamsMap(), onGet);
}
-
- g_resource->get("", DEFAULT_INTERFACE, QueryParamsMap(), onGet);
printf("HOST :: %s\n", resource->host().c_str());
}
}
catch (std::exception& e)
{
- std::cout << "" << std::endl;
+ std::cerr << "Exception in foundResource: "<< e.what() << std::endl;
}
}
}
isReady = true;
+ cv.notify_one();
}
void onPut(const HeaderOptions& headerOptions, const OCRepresentation& rep, const int eCode)
}
}
-int main(int argc, char* argv[])
+string buildActionSetDesc(unsigned int delay = 0, unsigned int type = 0)
{
- ostringstream requestURI;
- requestURI << OC_WELL_KNOWN_QUERY << "?rt=a.collection";
-
-#ifdef CA_INT
- OCConnectivityType connectivityType = OC_WIFI;
-
- if(argc == 2)
+ string actionsetDesc = "";
+ actionsetDesc = "allbulboff";
+ actionsetDesc.append("*");
+ actionsetDesc.append(std::to_string(delay)); // Set delay time.
+ actionsetDesc.append(" ");
+ actionsetDesc.append(std::to_string(type)); // Set action type.
+ actionsetDesc.append("*");
+ for (auto iter = lights.begin(); iter != lights.end(); ++iter)
{
- try
- {
- std::size_t inputValLen;
- int optionSelected = stoi(argv[1], &inputValLen);
-
- if(inputValLen == strlen(argv[1]))
- {
- if(optionSelected == 0)
- {
- connectivityType = OC_ETHERNET;
- }
- else if(optionSelected == 1)
- {
- connectivityType = OC_WIFI;
- }
- else
- {
- std::cout << "Invalid connectivity type selected. Using default WIFI"
- << std::endl;
- }
- }
- else
- {
- std::cout << "Invalid connectivity type selected. Using default WIFI" << std::endl;
- }
- }
- catch(exception& e)
+ actionsetDesc.append("uri=").append((*iter));
+ actionsetDesc.append("|");
+ actionsetDesc.append("power=");
+ actionsetDesc.append("off");
+ if ((iter + 1) != lights.end())
{
- std::cout << "Invalid input argument. Using WIFI as connectivity type" << std::endl;
+ actionsetDesc.append("*");
}
}
- else
- {
- std::cout<<"Usage: groupclient <ConnectivityType(0|1)>\n";
- std::cout<<"ConnectivityType: Default WIFI\n";
- std::cout<<"ConnectivityType 0: ETHERNET\n";
- std::cout<<"ConnectivityType 1: WIFI\n";
- }
-#endif
+ return actionsetDesc;
+}
+
+bool isResourceReady()
+{
+ return isReady;
+}
+
+int main(int argc, char* argv[])
+{
+ ostringstream requestURI;
+ requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=a.collection";
PlatformConfig config
{ OC::ServiceType::InProc, ModeType::Client, "0.0.0.0", 0, OC::QualityOfService::LowQos };
OCPlatform::Configure(config);
string resourceTypeName = "a.collection";
-#ifdef CA_INT
+
OCPlatform::findResource("", requestURI.str(),
- connectivityType, &foundResource);
-#else
- OCPlatform::findResource("", requestURI.str(), &foundResource);
-#endif
+ CT_DEFAULT, &foundResource);
- isReady = false;
+ //Non-intensive block until foundResource callback is called by OCPlatform
+ //and onGet gets resource.
+ //isResourceReady takes care of spurious wake-up
+ std::unique_lock<std::mutex> lock(blocker);
+ cv.wait(lock, isResourceReady);
+
+ isReady = false;
while (isRun)
{
- usleep(100);
- while (isReady)
- {
- int n;
+ int selectedMenu;
- cout << endl
- << "1 :: CREATE ACTIONSET 2 :: EXECUTE ACTION SET 3 :: GET ACTIONSET\n";
- cout << "4 :: DELETE ACTIONSET 5 :: Quit\n";
+ cout << endl << "0 :: Quit 1 :: CREATE ACTIONSET 2 :: EXECUTE ACTION SET \n";
+ cout << "3 :: GET ACTIONSET 4 :: DELETE ACTIONSET \n" << endl;
- cin >> n;
- if (n == 1)
- {
- string actionsetDesc;
- //"movieTime*uri=coap://10.251.44.228:49858/a/light|power=10*uri=coap://10.251.44.228:49858/a/light|power=10|";
+ cin >> selectedMenu;
+ OCRepresentation rep;
+ string actionsetDesc;
- actionsetDesc = "allbulboff";
- actionsetDesc.append("*");
- for (auto iter = lights.begin(); iter != lights.end(); ++iter)
+ switch(selectedMenu)
+ {
+ case 0:
+ isRun = false;
+ break;
+ case 1:
+ actionsetDesc = buildActionSetDesc();
+ if(!actionsetDesc.empty())
{
- actionsetDesc.append("uri=").append((*iter));
- actionsetDesc.append("|");
- actionsetDesc.append("power=");
- actionsetDesc.append("off");
- if ((iter + 1) != lights.end())
- {
- actionsetDesc.append("*");
- }
+ cout << "ActionSet :: " << actionsetDesc << endl;
+ rep.setValue("ActionSet", actionsetDesc);
}
-
- cout << "ActionSet :: " << actionsetDesc << endl;
-
- OCRepresentation rep;
- rep.setValue("ActionSet", actionsetDesc);
-
if (g_resource)
{
g_resource->put("a.collection", GROUP_INTERFACE, rep, QueryParamsMap(),
- &onPut);
+ &onPut);
}
- }
- else if (n == 2)
- {
- OCRepresentation rep;
-
- rep.setValue("DoAction", std::string("allbulboff"));
-
+ break;
+ case 2:
+ rep.setValue(DO_ACTION, std::string("allbulboff"));
if (g_resource)
{
g_resource->post("a.collection", GROUP_INTERFACE, rep, QueryParamsMap(),
- &onPost);
- }
- }
- else if (n == 3)
- {
- OCRepresentation rep;
-
- rep.setValue("GetActionSet", std::string("allbulboff"));
-
+ &onPost);
+ }
+ break;
+ case 3:
+ rep.setValue(GET_ACTIONSET, std::string("allbulboff"));
if (g_resource)
{
g_resource->post("a.collection", GROUP_INTERFACE, rep, QueryParamsMap(),
&onPost);
}
- }
- else if (n == 4)
- {
- OCRepresentation rep;
-
+ break;
+ case 4:
rep.setValue("DelActionSet", std::string("allbulboff"));
-
if (g_resource)
{
g_resource->put("a.collection", GROUP_INTERFACE, rep, QueryParamsMap(),
&onPut);
}
- }
- else if (n == 5)
- {
- isRun = false;
break;
- }
-
- fflush(stdin);
+ default:
+ cout << "Invalid option" << endl;
+ break;
}
+ fflush(stdin);
}
}
catch (OCException& e)
{
cout << e.what() << endl;
}
-
return 0;
}
+