* $Id: objectUtils.c,v 0.0.0.1 2003/09/10
*
* DEBUG: section 9 Functions with objets
- * AUTHOR: Petr Smolik petr.smolik@wo.cz
*
- * ORTE - OCERA Real-Time Ethernet http://www.ocera.org/
+ * -------------------------------------------------------------------
+ * ORTE
+ * Open Real-Time Ethernet
+ *
+ * Copyright (C) 2001-2006
+ * Department of Control Engineering FEE CTU Prague, Czech Republic
+ * http://dce.felk.cvut.cz
+ * http://www.ocera.org
+ *
+ * Author: Petr Smolik petr@smoliku.cz
+ * Advisor: Pavel Pisa
+ * Project Responsible: Zdenek Hanzalek
* --------------------------------------------------------------------
*
* This program is free software; you can redistribute it and/or modify
*
*/
-#include "orte.h"
+#include "orte_all.h"
/*
* AppParamsInit - Initalization default values of an application
pp->reliabilityOffered=0;
pp->sendQueueSize=1;
pp->strength=1;
- strcpy(pp->topic,"DefaultTopic");
- strcpy(pp->typeName,"");
+ strcpy((char *)pp->topic,"DefaultTopic");
+ strcpy((char *)pp->typeName,"");
pp->typeChecksum=0;
//additional params
NTPTIME_BUILD(pp->maxBlockTime,30);
NTPTIME_ZERO(sp->minimumSeparation);
sp->recvQueueSize=1;
sp->reliabilityRequested=0;
- strcpy(sp->topic,"DefaultTopic");
- strcpy(sp->typeName,"");
+ strcpy((char *)sp->topic,"DefaultTopic");
+ strcpy((char *)sp->typeName,"");
sp->typeChecksum=0;
// s->rcvMessageCallBack=NULL;
// s->deadline=NTPTIME_ZERO;
objectEntryOID=objectEntryFind(d,&guidapp);
if (!objectEntryOID) return ORTE_FALSE;
updateORTEAppInfo((AppParams*)objectEntryOID->attributes,&d->appInfo);
- d->pubInfo.topic=((ORTEPublProp*)params)->topic;
- d->pubInfo.type=((ORTEPublProp*)params)->typeName;
+ d->pubInfo.topic=(char*)((ORTEPublProp*)params)->topic;
+ d->pubInfo.type=(char*)((ORTEPublProp*)params)->typeName;
d->pubInfo.objectId=guid->oid;
if ((d->domainEvents.onPubRemoteNew) && live)
result=d->domainEvents.onPubRemoteNew(&d->appInfo,&d->pubInfo,
objectEntryOID=objectEntryFind(d,&guidapp);
if (!objectEntryOID) return ORTE_FALSE;
updateORTEAppInfo((AppParams*)objectEntryOID->attributes,&d->appInfo);
- d->subInfo.topic=((ORTESubsProp*)params)->topic;
- d->subInfo.type=((ORTESubsProp*)params)->typeName;
+ d->subInfo.topic=(char*)((ORTESubsProp*)params)->topic;
+ d->subInfo.type=(char*)((ORTESubsProp*)params)->typeName;
d->subInfo.objectId=guid->oid;
if ((d->domainEvents.onSubRemoteNew) && (live))
result=d->domainEvents.onSubRemoteNew(&d->appInfo,&d->subInfo,
Boolean
getTypeApp(ORTEDomain *d,AppParams *ap,IPAddress senderIPAddress) {
Boolean result=ORTE_FALSE;
- u_int16_t i,j,k;
+ uint16_t i,j,k;
//test if the app is MOM
for (i=0;i<d->appParams->managerKeyCount;i++) {
return result;
}
+/*
+ * matchMulticastAddresses - Test if objects contain same a multicast ip address
+ * @o1: pointer to a object
+ * @o2: pointer to a object
+ *
+ * Return: return ORTE_TRUE if a multicast ip address was match
+ */
+Boolean
+matchMulticastAddresses(ObjectEntryOID *o1,ObjectEntryOID *o2)
+{
+ AppParams *ap1,*ap2;
+ uint16_t i,j;
+
+ if ((o1->guid.oid!=OID_APP) ||
+ (o1->guid.oid!=OID_APP)) return ORTE_FALSE;
+
+ ap1=o1->attributes;
+ ap2=o2->attributes;
+ for (i=0;i<ap1->metatrafficMulticastIPAddressCount;i++) {
+ for (j=0;j<ap2->metatrafficMulticastIPAddressCount;j++) {
+ if (ap1->metatrafficMulticastIPAddressList[i]==
+ ap2->metatrafficMulticastIPAddressList[j])
+ return ORTE_TRUE;
+ }
+ }
+ return ORTE_FALSE;
+}
+
/*
* appSelfParamChanged - Self parameters changed
* @d: pointer to an domain
* @lock: lock CSTWriters at the start of function
* @unlock: unlock CSTWriters at the end of function
+ * @alive:
*
*/
void
appSelfParamChanged(ORTEDomain *d,
- Boolean lock,Boolean unlock,Boolean forWM) {
+ Boolean lock,Boolean unlock,Boolean forWM,Boolean alive) {
CSChange *csChange;
if (lock) {
pthread_rwlock_wrlock(&d->writerApplicationSelf.lock);
- pthread_rwlock_wrlock(&d->writerManagers.lock);
+ if (forWM)
+ pthread_rwlock_wrlock(&d->writerManagers.lock);
}
csChange=(CSChange*)MALLOC(sizeof(CSChange));
parameterUpdateCSChange(csChange,d->appParams,ORTE_TRUE);
csChange->guid=d->guid;
- csChange->alive=ORTE_TRUE;
- csChange->cdrStream.buffer=NULL;
+ csChange->alive=alive;
+ csChange->cdrCodec.buffer=NULL;
CSTWriterAddCSChange(d,&d->writerApplicationSelf,csChange);
if (forWM) {
csChange=(CSChange*)MALLOC(sizeof(CSChange));
parameterUpdateCSChange(csChange,d->appParams,ORTE_TRUE);
csChange->guid=d->guid;
- csChange->alive=ORTE_TRUE;
- csChange->cdrStream.buffer=NULL;
+ csChange->alive=alive;
+ csChange->cdrCodec.buffer=NULL;
CSTWriterAddCSChange(d,&d->writerManagers,csChange);
}
if (unlock) {
pthread_rwlock_unlock(&d->writerApplicationSelf.lock);
- pthread_rwlock_unlock(&d->writerManagers.lock);
+ if (forWM)
+ pthread_rwlock_unlock(&d->writerManagers.lock);
+ }
+}
+
+/*
+ * getAppO2SRemoteReader - returns pointer to virtual multicat object in case multicast application
+ * @d: pointer to an domain
+ * @objectEntryOID:
+ * @ap: pointer to an application
+ *
+ */
+ObjectEntryOID *
+getAppO2SRemoteReader(ORTEDomain *d,ObjectEntryOID *objectEntryOID,
+ AppParams *ap) {
+ GUID_RTPS guid;
+ AppParams *map;
+ IPAddress maddr;
+
+ maddr=ap->metatrafficMulticastIPAddressList[0];
+ if (ap->metatrafficMulticastIPAddressCount &&
+ IN_MULTICAST(maddr)) {
+ map=(AppParams*)MALLOC(sizeof(AppParams));
+ guid.hid=maddr;
+ guid.aid=AID_UNKNOWN;
+ guid.oid=OID_APP;
+ objectEntryOID=objectEntryFind(d,&guid);
+ if (!objectEntryOID) {
+ memcpy(map,ap,sizeof(AppParams));
+ objectEntryOID=objectEntryAdd(d,&guid,(void*)map);
+ Domain2PortMulticastMetatraffic(d->domain,
+ objectEntryOID->multicastPort);
+ debug(9,2) ("new multicast application 0x%x-0x%x-0x%x temporary created\n",
+ GUID_PRINTF(guid));
+ }
+ }
+ return objectEntryOID;
+}
+
+/*
+ * getSubsO2SRemoteReader - returns pointer to virtual multicat object in case multicast subscription
+ * @d: pointer to an domain
+ * @objectEntryOID:
+ * @sp: pointer to a subscription
+ *
+ */
+ObjectEntryOID *
+getSubsO2SRemoteReader(ORTEDomain *d,ObjectEntryOID *objectEntryOID,
+ ORTESubsProp *sp) {
+ AppParams *map;
+ GUID_RTPS guid;
+
+ if (IN_MULTICAST(sp->multicast)) {
+ map=(AppParams*)MALLOC(sizeof(AppParams));
+ guid.hid=sp->multicast;
+ guid.aid=AID_UNKNOWN;
+ guid.oid=OID_APP;
+ objectEntryOID=objectEntryFind(d,&guid);
+ if (!objectEntryOID) {
+ AppParamsInit(map);
+ map->metatrafficMulticastIPAddressList[0]=sp->multicast;
+ map->metatrafficMulticastIPAddressCount=1;
+ objectEntryOID=objectEntryAdd(d,&guid,(void*)map);
+ Domain2PortMulticastUserdata(d->domain,
+ objectEntryOID->multicastPort);
+ debug(9,2) ("new subs. multicast application 0x%x-0x%x-0x%x temporary created\n",
+ GUID_PRINTF(guid));
+ }
}
+ return objectEntryOID;
}