void wdInitState(void) { static double nextRequestTimeSec = 0.0; RequestComponentControlMessage requestControl = NULL; JausMessage txMessage = NULL; char buf[64] = {0}; // Check for critcal service connections or conditions here if(gposSc->isActive && vssSc->isActive && pdWrenchSc->isActive && pdStatusSc->isActive && wdInControl && wdRequestControl) { // Transition to Standby wd->state = JAUS_STANDBY_STATE; //cDebug(4, "wd: Switching to STANDBY State\n"); } else if(getTimeSeconds() > nextRequestTimeSec) { if(!gposSc->isActive) { if(scManagerCreateServiceConnection(wdNmi, gposSc)) { //cDebug(4, "wd: Sent GPOS SC Request\n"); } } if(!vssSc->isActive) { if(scManagerCreateServiceConnection(wdNmi, vssSc)) { //cDebug(4, "wd: Sent VSS SC Request\n"); } } if(!pdWrenchSc->isActive && wdInControl) { if(scManagerCreateServiceConnection(wdNmi, pdWrenchSc)) { //cDebug(4, "wd: Sent PD Wrench SC Request\n"); } } if(!pdStatusSc->isActive && wdInControl) { if(scManagerCreateServiceConnection(wdNmi, pdStatusSc)) { //cDebug(4, "wd: Sent PD Status SC Request\n"); } } nextRequestTimeSec = getTimeSeconds() + REQUEST_TIMEOUT_SEC; } if(!wdInControl && wdRequestControl) { if(!pd->address->node) { pd->address->subsystem = wd->address->subsystem; if(nodeManagerLookupAddress(wdNmi, pd->address)) { jausAddressCopy(wdWrench->destination, pd->address); } } if(pd->address->node) { jausAddressToString(pd->address, buf); //cDebug(4, "wd: Requesting control of PD %s\n", buf); requestControl = requestComponentControlMessageCreate(); jausAddressCopy(requestControl->source, wd->address); jausAddressCopy(requestControl->destination, pd->address); requestControl->authorityCode = wd->authority; txMessage = requestComponentControlMessageToJausMessage(requestControl); nodeManagerSend(wdNmi, txMessage); jausMessageDestroy(txMessage); requestComponentControlMessageDestroy(requestControl); if(scManagerCreateServiceConnection(wdNmi, pdStatusSc)) { //cDebug(4, "wd: Sent PD Status SC Request\n"); } if(scManagerCreateServiceConnection(wdNmi, pdWrenchSc)) { //cDebug(4, "wd: Sent PD Wrench SC Request\n"); } nextRequestTimeSec = getTimeSeconds() + REQUEST_TIMEOUT_SEC; } } }
int ojCmptLookupAddress(OjCmpt ojCmpt, JausAddress address) { return nodeManagerLookupAddress(ojCmpt->nmi, address); }
JausBoolean scManagerCreateServiceConnection(NodeManagerInterface nmi, ServiceConnection sc) { CreateServiceConnectionMessage createSc; JausMessage txMessage; JausAddress localAddress; ServiceConnection prevSc = NULL; ServiceConnection testSc = NULL; if(!sc) { return JAUS_FALSE; } pthread_mutex_lock(&nmi->scm->mutex); // Check: Is this SC already on the incomingSc list? If so, remove it (otherwise it ends up on the list twice == bad) // Remove this service connection from the list of incoming service connections testSc = nmi->scm->incomingSc; while(testSc) { if(sc == testSc) { if(prevSc) { prevSc->nextSc = testSc->nextSc; } else { nmi->scm->incomingSc = testSc->nextSc; } testSc = testSc->nextSc; nmi->scm->incomingScCount--; } else { prevSc = testSc; testSc = testSc->nextSc; } } sc->confirmedUpdateRateHz = 0; sc->lastSentTime = 0; sc->sequenceNumber = 65535; sc->instanceId = -1; sc->isActive = JAUS_FALSE; sc->nextSc = NULL; createSc = createServiceConnectionMessageCreate(); jausAddressCopy(createSc->source, nmi->cmpt->address); createSc->serviceConnectionCommandCode = sc->commandCode; createSc->requestedPeriodicUpdateRateHertz = sc->requestedUpdateRateHz; createSc->presenceVector = sc->presenceVector; // If the subsystem for this service connection is known if(sc->address && sc->address->subsystem != 0) { jausAddressCopy(createSc->destination, sc->address); txMessage = createServiceConnectionMessageToJausMessage(createSc); nodeManagerSend(nmi, txMessage); jausMessageDestroy(txMessage); createServiceConnectionMessageDestroy(createSc); // Add the service connection to the front of the incoming service connection list sc->nextSc = nmi->scm->incomingSc; nmi->scm->incomingSc = sc; nmi->scm->incomingScCount++; pthread_mutex_unlock(&nmi->scm->mutex); return JAUS_TRUE; } // otherwise the subsystem is unknown so we assume it is the same subsystem? else { localAddress = jausAddressCreate(); localAddress->subsystem = nmi->cmpt->address->subsystem; localAddress->node = 0; localAddress->component = sc->address->component; localAddress->instance = 0; // Lookup Address from nodeManager // Tests if the target component exists or not if(nodeManagerLookupAddress(nmi, localAddress)) { jausAddressCopy(createSc->destination, localAddress); jausAddressCopy(sc->address, localAddress); txMessage = createServiceConnectionMessageToJausMessage(createSc); nodeManagerSend(nmi, txMessage); jausMessageDestroy(txMessage); jausAddressDestroy(localAddress); createServiceConnectionMessageDestroy(createSc); // Add the service connection to the front of the incoming service connection list sc->nextSc = nmi->scm->incomingSc; nmi->scm->incomingSc = sc; nmi->scm->incomingScCount++; pthread_mutex_unlock(&nmi->scm->mutex); return JAUS_TRUE; } else { jausAddressDestroy(localAddress); createServiceConnectionMessageDestroy(createSc); pthread_mutex_unlock(&nmi->scm->mutex); return JAUS_FALSE; } } pthread_mutex_unlock(&nmi->scm->mutex); return JAUS_FALSE; }
JausBoolean scManagerCreateServiceConnection(NodeManagerInterface nmi, ServiceConnection sc) { CreateServiceConnectionMessage createSc; JausMessage txMessage; JausAddress localAddress; ServiceConnection prevSc = NULL; ServiceConnection testSc = nmi->scm->incommingSc; if(!sc) { return JAUS_FALSE; } while(testSc) { if(sc == testSc) { if(prevSc) { prevSc->nextSc = testSc->nextSc; } else { nmi->scm->incommingSc = testSc->nextSc; } nmi->scm->incommingScCount--; } prevSc = testSc; testSc = testSc->nextSc; } sc->confirmedUpdateRateHz = 0; sc->lastSentTime = 0; sc->sequenceNumber = 65535; sc->instanceId = -1; sc->isActive = JAUS_FALSE; sc->nextSc = NULL; createSc = createServiceConnectionMessageCreate(); createSc->source->id = nmi->cmpt->address->id; createSc->serviceConnectionCommandCode = sc->commandCode; createSc->requestedPeriodicUpdateRateHertz = sc->requestedUpdateRateHz; createSc->presenceVector = sc->presenceVector; if(sc->address && sc->address->subsystem != 0) { createSc->destination->id = sc->address->id; txMessage = createServiceConnectionMessageToJausMessage(createSc); nodeManagerSend(nmi, txMessage); jausMessageDestroy(txMessage); createServiceConnectionMessageDestroy(createSc); sc->nextSc = nmi->scm->incommingSc; nmi->scm->incommingSc = sc; nmi->scm->incommingScCount++; return JAUS_TRUE; } else { localAddress = jausAddressCreate(); localAddress->subsystem = nmi->cmpt->address->subsystem; localAddress->node = 0; localAddress->component = sc->address->component; localAddress->instance = 0; // Lookup Address from nodeManager // Tests if the target component exists or not if(nodeManagerLookupAddress(nmi, localAddress)) { createSc->destination->id = localAddress->id; sc->address->id = localAddress->id; txMessage = createServiceConnectionMessageToJausMessage(createSc); nodeManagerSend(nmi, txMessage); jausMessageDestroy(txMessage); jausAddressDestroy(localAddress); createServiceConnectionMessageDestroy(createSc); sc->nextSc = nmi->scm->incommingSc; nmi->scm->incommingSc = sc; nmi->scm->incommingScCount++; return JAUS_TRUE; } else { jausAddressDestroy(localAddress); createServiceConnectionMessageDestroy(createSc); return JAUS_FALSE; } } }