2 * $Id: RTPSCSTReaderTimer.c,v 0.0.0.1 2003/11/03
4 * DEBUG: section 55 CSTReader timer functions
5 * AUTHOR: Petr Smolik petr.smolik@wo.cz
7 * ORTE - OCERA Real-Time Ethernet http://www.ocera.org/
8 * --------------------------------------------------------------------
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
24 /*****************************************************************************/
26 CSTReaderResponceTimer(ORTEDomain *d,void *vcstRemoteWriter) {
27 CSTRemoteWriter *cstRemoteWriter=(CSTRemoteWriter*)vcstRemoteWriter;
31 if ((cstRemoteWriter->guid.oid & 0x07) == OID_PUBLICATION)
33 if (!d->taskSend.mb.containsInfoReply) {
35 len=RTPSInfoREPLYCreate(
36 &d->taskSend.mb.cdrCodec,
38 ((AppParams*)cstRemoteWriter->cstReader->objectEntryOID->attributes)->metatrafficUnicastPort);
40 len=RTPSInfoREPLYCreate(
41 &d->taskSend.mb.cdrCodec,
43 ((AppParams*)cstRemoteWriter->cstReader->objectEntryOID->attributes)->userdataUnicastPort);
46 d->taskSend.mb.needSend=ORTE_TRUE;
49 d->taskSend.mb.containsInfoReply=ORTE_TRUE;
50 debug(55,3) ("sent: RTPS_InfoREPLY(0x%x) to 0x%x-0x%x\n",
51 cstRemoteWriter->cstReader->guid.oid,
52 cstRemoteWriter->guid.hid,
53 cstRemoteWriter->guid.aid);
56 &d->taskSend.mb.cdrCodec,
58 cstRemoteWriter->cstReader->guid.oid,
59 cstRemoteWriter->guid.oid,
62 //not enought space in sending buffer
63 d->taskSend.mb.needSend=ORTE_TRUE;
66 debug(55,3) ("sent: RTPS_ACKF(0x%x) to 0x%x-0x%x\n",
67 cstRemoteWriter->cstReader->guid.oid,
68 cstRemoteWriter->guid.hid,
69 cstRemoteWriter->guid.aid);
70 if (cstRemoteWriter->commStateACK==PULLING) {
72 cstRemoteWriter->spobject->objectEntryAID,
73 &cstRemoteWriter->delayResponceTimer,
75 if (cstRemoteWriter->ACKRetriesCounter<
76 cstRemoteWriter->cstReader->params.ACKMaxRetries) {
77 cstRemoteWriter->ACKRetriesCounter++;
79 cstRemoteWriter->spobject->objectEntryAID,
80 &cstRemoteWriter->delayResponceTimer,
82 "CSTReaderResponceTimer",
83 CSTReaderResponceTimer,
84 &cstRemoteWriter->cstReader->lock,
86 &cstRemoteWriter->cstReader->params.delayResponceTimeMin);
88 debug(55,3) ("sent: maxRetries ritch upper level (%d).\n",
89 cstRemoteWriter->cstReader->params.ACKMaxRetries);
92 if (cstRemoteWriter->commStateACK==ACKPENDING) {
93 cstRemoteWriter->commStateACK=WAITING;
95 cstRemoteWriter->spobject->objectEntryAID,
96 &cstRemoteWriter->repeatActiveQueryTimer,
98 if (NtpTimeCmp(cstRemoteWriter->cstReader->
99 params.repeatActiveQueryTime,iNtpTime)!=0) {
101 cstRemoteWriter->spobject->objectEntryAID,
102 &cstRemoteWriter->repeatActiveQueryTimer,
104 "CSTReaderQueryTimer",
106 &cstRemoteWriter->cstReader->lock,
108 &cstRemoteWriter->cstReader->params.repeatActiveQueryTime);
114 /*****************************************************************************/
116 CSTReaderQueryTimer(ORTEDomain *d,void *vcstRemoteWriter) {
117 CSTRemoteWriter *cstRemoteWriter=(CSTRemoteWriter*)vcstRemoteWriter;
121 if ((cstRemoteWriter->guid.oid & 0x07) == OID_PUBLICATION)
123 if (!d->taskSend.mb.containsInfoReply) {
125 len=RTPSInfoREPLYCreate(
126 &d->taskSend.mb.cdrCodec,
128 ((AppParams*)cstRemoteWriter->cstReader->objectEntryOID->attributes)->metatrafficUnicastPort);
130 len=RTPSInfoREPLYCreate(
131 &d->taskSend.mb.cdrCodec,
133 ((AppParams*)cstRemoteWriter->cstReader->objectEntryOID->attributes)->userdataUnicastPort);
136 d->taskSend.mb.needSend=ORTE_TRUE;
139 d->taskSend.mb.containsInfoReply=ORTE_TRUE;
140 debug(55,3) ("sent: RTPS_InfoREPLY(0x%x) to 0x%x-0x%x\n",
141 cstRemoteWriter->cstReader->guid.oid,
142 cstRemoteWriter->guid.hid,
143 cstRemoteWriter->guid.aid);
146 &d->taskSend.mb.cdrCodec,
147 &cstRemoteWriter->sn,
148 cstRemoteWriter->cstReader->guid.oid,
149 cstRemoteWriter->guid.oid,
152 d->taskSend.mb.needSend=ORTE_TRUE;
155 debug(55,3) ("sent: RTPS_ACKf(0x%x) to 0x%x-0x%x\n",
156 cstRemoteWriter->cstReader->guid.oid,
157 cstRemoteWriter->guid.hid,
158 cstRemoteWriter->guid.aid);
160 cstRemoteWriter->spobject->objectEntryAID,
161 &cstRemoteWriter->repeatActiveQueryTimer,
163 if (NtpTimeCmp(cstRemoteWriter->cstReader->
164 params.repeatActiveQueryTime,iNtpTime)!=0) {
166 cstRemoteWriter->spobject->objectEntryAID,
167 &cstRemoteWriter->repeatActiveQueryTimer,
169 "CSTReaderQueryTimer",
171 &cstRemoteWriter->cstReader->lock,
173 &cstRemoteWriter->cstReader->params.repeatActiveQueryTime);
179 /*****************************************************************************/
181 CSTReaderDeadlineTimer(ORTEDomain *d,void *vcstReader) {
182 CSTReader *cstReader=(CSTReader*)vcstReader;
186 sp=(ORTESubsProp*)cstReader->objectEntryOID->attributes;
187 memset(&info,0,sizeof(info));
188 info.status=DEADLINE;
189 info.topic=sp->topic;
190 info.type=sp->typeName;
191 if (cstReader->objectEntryOID->recvCallBack) {
192 cstReader->objectEntryOID->recvCallBack(&info,
193 cstReader->objectEntryOID->instance,
194 cstReader->objectEntryOID->callBackParam);
197 cstReader->objectEntryOID->objectEntryAID,
198 &cstReader->deadlineTimer,
201 cstReader->objectEntryOID->objectEntryAID,
202 &cstReader->deadlineTimer,
204 "CSTReaderDeadlineTimer",
205 CSTReaderDeadlineTimer,
212 /*****************************************************************************/
214 CSTReaderPersistenceTimer(ORTEDomain *d,void *vcstReader) {
215 CSTReader *cstReader=(CSTReader*)vcstReader;
216 CSTRemoteWriter *cstRemoteWriter;
217 CSChangeFromWriter *csChangeFromWriter;
222 if (cstReader->cstRemoteWriterSubscribed!=NULL) {
223 //keep only one csChange (last)
224 while (cstReader->cstRemoteWriterSubscribed->csChangesCounter>1) {
226 CSChangeFromWriter_first(cstReader->cstRemoteWriterSubscribed);
227 if (csChangeFromWriter) {
228 CSTReaderDestroyCSChangeFromWriter(
229 cstReader->cstRemoteWriterSubscribed,
235 cstReader->cstRemoteWriterSubscribed=NULL;
236 sp=(ORTESubsProp*)cstReader->objectEntryOID->attributes;
238 gavl_cust_for_each(CSTRemoteWriter,cstReader,cstRemoteWriter) {
239 pp=(ORTEPublProp*)cstRemoteWriter->spobject->attributes;
240 csChangeFromWriter=CSChangeFromWriter_last(cstRemoteWriter);
241 if ((pp->strength>strength) && (csChangeFromWriter!=NULL)){
242 NtpTime persistence,persistenceExpired,actTime;
243 actTime=getActualNtpTime();
244 NtpTimeAdd(persistenceExpired,
245 csChangeFromWriter->csChange->localTimeReceived,
247 if (NtpTimeCmp(persistenceExpired,actTime)>0) {
248 NtpTimeSub(persistence,
252 cstReader->objectEntryOID->objectEntryAID,
253 &cstReader->persistenceTimer,
256 cstReader->objectEntryOID->objectEntryAID,
257 &cstReader->persistenceTimer,
259 "CSTReaderPersistenceTimer",
260 CSTReaderPersistenceTimer,
264 cstReader->cstRemoteWriterSubscribed=cstRemoteWriter;
268 if ((cstReader->cstRemoteWriterSubscribed!=NULL) &&
269 (sp->mode==IMMEDIATE)) {
270 CSTReaderProcCSChangesIssue(
271 cstReader->cstRemoteWriterSubscribed,ORTE_FALSE);