OCStackResult InProcServerWrapper::stopPresence() { auto cLock = m_csdkLock.lock(); OCStackResult result = OC_STACK_ERROR; if(cLock) { std::lock_guard<std::recursive_mutex> lock(*cLock); result = OCStopPresence(); } if(result != OC_STACK_OK) { throw OCException(OC::Exception::END_PRESENCE_FAILED, result); } return result; }
void *ChangeLightRepresentation (void *param) { (void)param; OCStackResult result = OC_STACK_ERROR; uint8_t j = 0; uint8_t numNotifies = (SAMPLE_MAX_NUM_OBSERVATIONS)/2; OCObservationId obsNotify[numNotifies]; while (!gQuitFlag) { sleep(10); Light.power += 5; if (gLightUnderObservation) { OC_LOG_V(INFO, TAG, " =====> Notifying stack of new power level %d\n", Light.power); if (gObserveNotifyType == 1) { // Notify list of observers. Alternate observers on the list will be notified. j = 0; for (uint8_t i = 0; i < SAMPLE_MAX_NUM_OBSERVATIONS; (i=i+2)) { if (interestedObservers[i].valid == true) { obsNotify[j] = interestedObservers[i].observationId; j++; } } cJSON *json = cJSON_CreateObject(); cJSON *format; cJSON_AddStringToObject(json,"href",gResourceUri); cJSON_AddItemToObject(json, "rep", format=cJSON_CreateObject()); cJSON_AddStringToObject(format, "state", (char *) (Light.state ? "on":"off")); cJSON_AddNumberToObject(format, "power", Light.power); char * obsResp = cJSON_Print(json); cJSON_Delete(json); result = OCNotifyListOfObservers (Light.handle, obsNotify, j, (unsigned char *)obsResp, OC_NA_QOS); free(obsResp); } else if (gObserveNotifyType == 0) { // Notifying all observers result = OCNotifyAllObservers (Light.handle, OC_NA_QOS); if (OC_STACK_NO_OBSERVERS == result) { OC_LOG (INFO, TAG, "=======> No more observers exist, stop sending observations"); gLightUnderObservation = 0; } } else { OC_LOG (ERROR, TAG, "Incorrect notification type selected"); } } #ifdef WITH_PRESENCE if(stopPresenceCount > 0) { OC_LOG_V(INFO, TAG, "================ presence count %d", stopPresenceCount); } if(!stopPresenceCount--) { OC_LOG(INFO, TAG, "================ stopping presence"); OCStopPresence(); } #endif } return NULL; }
void *presenceNotificationGenerator(void *param) { uint8_t secondsBeforePresence = 10; OIC_LOG_V(INFO, TAG, "Will send out presence in %u seconds", secondsBeforePresence); sleep(secondsBeforePresence); (void)param; OCDoHandle presenceNotificationHandles[numPresenceResources]; OCStackResult res = OC_STACK_OK; std::array<std::string, numPresenceResources> presenceNotificationResources { { std::string("core.fan"), std::string("core.led") } }; std::array<std::string, numPresenceResources> presenceNotificationUris { { std::string("/a/fan"), std::string("/a/led") } }; for(int i=0; i<numPresenceResources; i++) { if(res == OC_STACK_OK) { sleep(1); res = OCCreateResource(&presenceNotificationHandles[i], presenceNotificationResources.at(i).c_str(), OC_RSRVD_INTERFACE_DEFAULT, presenceNotificationUris.at(i).c_str(), OCNOPEntityHandlerCb, NULL, OC_DISCOVERABLE|OC_OBSERVABLE); } if(res != OC_STACK_OK) { OIC_LOG_V(ERROR, TAG, "\"Presence Notification Generator\" failed to create resource " "%s with result %s.", presenceNotificationResources.at(i).c_str(), getResult(res)); break; } OIC_LOG_V(INFO, TAG, PCF("Created %s for presence notification"), presenceNotificationUris[i].c_str()); } sleep(5); for(int i=0; i<numPresenceResources; i++) { if(res == OC_STACK_OK) { res = OCDeleteResource(presenceNotificationHandles[i]); } if(res != OC_STACK_OK) { OIC_LOG_V(ERROR, TAG, "\"Presence Notification Generator\" failed to delete "\ "resource %s.", presenceNotificationResources.at(i).c_str()); break; } OIC_LOG_V(INFO, TAG, PCF("Deleted %s for presence notification"), presenceNotificationUris[i].c_str()); } OIC_LOG(INFO, TAG, "================ stopping presence"); OCStopPresence(); return NULL; }