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, std::placeholders::_2),
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, std::shared_ptr<OCResourceResponse> response)
106 cerr << "entityHandler(): Received invalid request object.\n";
112 cerr << "entityHandler(): Received invalid response object.\n";
116 switch(request->getRequestHandlerFlag())
119 cerr << "entityHandler(): invalid request flag\n";
122 case RequestHandlerFlag::InitFlag:
123 cerr << "entityHandler(): Initialization requested.\n";
126 case RequestHandlerFlag::RequestFlag:
127 dispatch_request(request->getRequestType(), request, response);
130 case RequestHandlerFlag::ObserverFlag:
131 handle_observe_event(request, response);
138 void LightResource::dispatch_request(const std::string& request_type, std::shared_ptr<OCResourceRequest> request, std::shared_ptr<OCResourceResponse> response)
140 std::cout << "dispatch_request(): " << request_type << '\n';
142 if("GET" == request_type)
143 return handle_get_request(request, response);
145 if("PUT" == request_type)
146 return handle_put_request(request, response);
148 if("POST" == request_type)
149 return handle_post_request(request, response);
151 if("DELETE" == request_type)
152 return handle_delete_request(request, response);
154 cerr << "entityHandler(): Invalid request type \"" << request_type << "\".\n";
157 void LightResource::handle_get_request(std::shared_ptr<OCResourceRequest> request, std::shared_ptr<OCResourceResponse> response)
159 cout << "handle_get_request():\n";
161 const auto query_params_map = request->getQueryParameters();
163 // ...do any processing of the query here...
165 // Get a representation of the resource and send it back as a response:
166 response->setErrorCode(200);
167 response->setResourceRepresentation(getRepresentation());
170 void LightResource::handle_put_request(std::shared_ptr<OCResourceRequest> request, std::shared_ptr<OCResourceResponse> response)
172 // Here's how you would get any query parameters:
173 const auto query_params_map = request->getQueryParameters();
174 // ...do something with the query parameters (if there were any)...
176 auto rep = request->getResourceRepresentation();
178 setRepresentation(rep);
183 response->setErrorCode(200);
184 response->setResourceRepresentation(getRepresentation());
187 void LightResource::handle_post_request(std::shared_ptr<OCResourceRequest> request, std::shared_ptr<OCResourceResponse> response)
192 void LightResource::handle_delete_request(std::shared_ptr<OCResourceRequest> request, std::shared_ptr<OCResourceResponse> response)
197 // Set up observation in a separate thread:
198 void LightResource::handle_observe_event(std::shared_ptr<OCResourceRequest> request, std::shared_ptr<OCResourceResponse> response)
200 if(observe_thread.joinable())
203 observe_thread = thread(bind(&LightResource::observe_function, this));
204 observe_thread.detach();
209 }} // namespace Intel::OCDemo