1 #include "light_resource.hpp"
3 namespace Intel { namespace OCDemo {
5 std::atomic<bool> LightResource::shutdown_flag(false);
6 std::thread LightResource::observe_thread;
8 void LightResource::setRepresentation(const OCRepresentation& rep)
10 cout << "\t\t\t" << "Received representation: " << endl;
12 rep.getValue("state", m_state);
13 rep.getValue("power", m_power);
15 cout << "\t\t\t\t" << "power: " << m_power << endl;
16 cout << "\t\t\t\t" << "state: " << m_state << endl;
19 OCRepresentation LightResource::getRepresentation(void)
21 m_rep.setValue("state", m_state);
22 m_rep.setValue("power", m_power);
26 void LightResource::addType(const std::string& type) const
28 OCStackResult result = OC::OCPlatform::bindTypeToResource(m_resourceHandle, type);
30 if(OC_STACK_OK != result)
31 cout << "Binding TypeName to Resource was unsuccessful, result was " << result << '\n';
34 void LightResource::addInterface(const std::string& interface) const
36 OCStackResult result = OC::OCPlatform::bindInterfaceToResource(m_resourceHandle, interface);
38 if(OC_STACK_OK != result)
39 cout << "Binding TypeName to Resource was unsuccessful, result was " << result << '\n';
42 void LightResource::createResource(const unsigned int resource_number)
44 string resourceURI { make_URI(resource_number) };
45 string resourceTypeName { "core.light" };
47 cout << "registering resource: " << resourceURI << '\n';
48 cout << "registering type name \"" << resourceTypeName << "\".\n";
49 // This will internally create and register the resource, binding the current instance's method as a callback:
50 OCStackResult result = OC::OCPlatform::registerResource(
51 m_resourceHandle, resourceURI, resourceTypeName,
53 std::bind(&LightResource::entityHandler, this, std::placeholders::_1),
54 OC_DISCOVERABLE | OC_OBSERVABLE);
55 if (OC_STACK_OK != result)
56 std::cout << "Resource creation failed.\n";
59 void LightResource::observe_function()
61 cerr << "Observation thread is spinning up.\n";
65 std::this_thread::sleep_for(std::chrono::seconds(2));
72 const auto result = OC::OCPlatform::notifyAllObservers(getHandle());
74 // Stop notifications when there are no more observers:
75 if(OC_STACK_NO_OBSERVERS == result)
81 cerr << "Observation thread is shutting down.\n";
84 void LightResource::unregisterResource()
86 std::cout << "Unregistering light resource"<<std::endl;
88 OCStackResult result = OC::OCPlatform::unregisterResource(m_resourceHandle);
90 if(result == OC_STACK_OK)
92 std::cout << "Resource unregistered."<<std::endl;
96 cerr << "Unregister resource failed: "<<std::endl;
100 // This is just a sample implementation of entity handler.
101 // Entity handler can be implemented in several ways by the manufacturer
102 OCEntityHandlerResult LightResource::entityHandler(std::shared_ptr<OCResourceRequest> request)
106 cerr << "entityHandler(): Received invalid request object.\n";
110 switch(request->getRequestHandlerFlag())
113 cerr << "entityHandler(): invalid request flag\n";
116 case RequestHandlerFlag::InitFlag:
117 cerr << "entityHandler(): Initialization requested.\n";
120 case RequestHandlerFlag::RequestFlag:
121 dispatch_request(request->getRequestType(), request);
124 case RequestHandlerFlag::ObserverFlag:
125 handle_observe_event(request);
132 void LightResource::dispatch_request(const std::string& request_type, std::shared_ptr<OCResourceRequest> request)
134 std::cout << "dispatch_request(): " << request_type << '\n';
136 if("GET" == request_type)
137 return handle_get_request(request);
139 if("PUT" == request_type)
140 return handle_put_request(request);
142 if("POST" == request_type)
143 return handle_post_request(request);
145 if("DELETE" == request_type)
146 return handle_delete_request(request);
148 cerr << "entityHandler(): Invalid request type \"" << request_type << "\".\n";
151 void LightResource::handle_get_request(std::shared_ptr<OCResourceRequest> request)
153 cout << "handle_get_request():\n";
155 const auto query_params_map = request->getQueryParameters();
157 // ...do any processing of the query here...
159 // Get a representation of the resource and send it back as a response:
160 auto pResponse = std::make_shared<OC::OCResourceResponse>();
161 pResponse->setRequestHandle(request->getRequestHandle());
162 pResponse->setResourceHandle(request->getResourceHandle());
163 pResponse->setErrorCode(200);
164 pResponse->setResponseResult(OC_EH_OK);
165 pResponse->setResourceRepresentation(getRepresentation());
166 OCPlatform::sendResponse(pResponse);
169 void LightResource::handle_put_request(std::shared_ptr<OCResourceRequest> request)
171 // Here's how you would get any query parameters:
172 const auto query_params_map = request->getQueryParameters();
173 // ...do something with the query parameters (if there were any)...
175 auto rep = request->getResourceRepresentation();
177 setRepresentation(rep);
179 auto pResponse = std::make_shared<OC::OCResourceResponse>();
180 pResponse->setRequestHandle(request->getRequestHandle());
181 pResponse->setResourceHandle(request->getResourceHandle());
182 pResponse->setErrorCode(200);
183 pResponse->setResponseResult(OC_EH_OK);
184 pResponse->setResourceRepresentation(getRepresentation());
185 OCPlatform::sendResponse(pResponse);
188 void LightResource::handle_post_request(std::shared_ptr<OCResourceRequest> request)
193 void LightResource::handle_delete_request(std::shared_ptr<OCResourceRequest> request)
198 // Set up observation in a separate thread:
199 void LightResource::handle_observe_event(std::shared_ptr<OCResourceRequest> request)
201 if(observe_thread.joinable())
204 observe_thread = thread(bind(&LightResource::observe_function, this));
205 observe_thread.detach();
210 }} // namespace Intel::OCDemo