Patch record processing routines to update timestamp before processing outlinks

This commit is contained in:
Bruce Hill
2017-02-18 00:47:52 -08:00
parent 3e891a12ff
commit f1e83b22f2
10 changed files with 84 additions and 18 deletions

View File

@@ -227,6 +227,7 @@ static long process(struct dbCommon *pcommon)
return 0;
prec->pact = TRUE;
recGblGetTimeStamp(prec);
/* Push the output link values */
if (!status) {
@@ -237,7 +238,6 @@ static long process(struct dbCommon *pcommon)
(&prec->neva)[i]);
}
recGblGetTimeStamp(prec);
monitor(prec);
recGblFwdLink(prec);
prec->pact = FALSE;

View File

@@ -158,12 +158,22 @@ static long process(struct dbCommon *pcommon)
return S_dev_missingSup;
}
if ( !pact ) {
prec->udf = FALSE;
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
status = writeValue(prec); /* write the data */
if (!pact && prec->pact) return 0;
prec->pact = TRUE;
prec->udf = FALSE;
recGblGetTimeStampSimm(prec, prec->simm, NULL);
if ( pact ) {
/* Update timestamp again for asynchronous devices */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
monitor(prec);
/* process the forward scan link record */

View File

@@ -82,7 +82,7 @@ rset aoRSET={
put_enum_str,
get_graphic_double,
get_control_double,
get_alarm_double
get_alarm_double
};
epicsExportAddress(rset,aoRSET);
@@ -187,6 +187,9 @@ static long process(struct dbCommon *pcommon)
}
if(!status) convert(prec, value);
prec->udf = isnan(prec->val);
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
/* check for alarms */
@@ -220,7 +223,10 @@ static long process(struct dbCommon *pcommon)
if ( !pact && prec->pact ) return(0);
prec->pact = TRUE;
recGblGetTimeStampSimm(prec, prec->simm, NULL);
if ( pact ) {
/* Update timestamp again for asynchronous devices */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
/* check event list */
monitor(prec);

View File

@@ -155,7 +155,7 @@ static long init_record(struct dbCommon *pcommon,int pass)
pcallback->precord = (struct dbCommon *) prec;
if (pdset->common.init_record) {
status=(*pdset->common.init_record)(pcommon);
status=(*pdset->common.init_record)(pcommon);
if(status==0) {
if(prec->rval==0) prec->val = 0;
else prec->val = 1;
@@ -209,6 +209,10 @@ static long process(struct dbCommon *pcommon)
if(prec->val==0) prec->rval = 0;
else prec->rval = prec->mask;
} else prec->rval = (epicsUInt32)prec->val;
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
/* check for alarms */
@@ -245,7 +249,10 @@ static long process(struct dbCommon *pcommon)
if ( !pact && prec->pact ) return(0);
prec->pact = TRUE;
recGblGetTimeStampSimm(prec, prec->simm, NULL);
if ( pact ) {
/* Update timestamp again for asynchronous devices */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
if((prec->val==1) && (prec->high>0)){
myCallback *pcallback;

View File

@@ -226,6 +226,7 @@ static long process(struct dbCommon *pcommon)
struct calcoutRecord *prec = (struct calcoutRecord *)pcommon;
rpvtStruct *prpvt = prec->rpvt;
int doOutput;
unsigned char pact=prec->pact;
if (!prec->pact) {
prec->pact = TRUE;
@@ -241,6 +242,12 @@ static long process(struct dbCommon *pcommon)
}
}
checkAlarms(prec);
if ( !pact ) {
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
recGblGetTimeStamp(prec);
}
/* check for output link execution */
switch (prec->oopt) {
case calcoutOOPT_Every_Time:
@@ -269,7 +276,6 @@ static long process(struct dbCommon *pcommon)
if (doOutput) {
if (prec->odly > 0.0) {
prec->dlya = 1;
recGblGetTimeStamp(prec);
db_post_events(prec, &prec->dlya, DBE_VALUE);
callbackRequestProcessCallbackDelayed(&prpvt->doOutCb,
prec->prio, prec, (double)prec->odly);
@@ -281,11 +287,12 @@ static long process(struct dbCommon *pcommon)
prec->pact = TRUE;
}
}
recGblGetTimeStamp(prec);
} else { /* pact == TRUE */
/* Update timestamp again for asynchronous devices */
recGblGetTimeStamp(prec);
if (prec->dlya) {
prec->dlya = 0;
recGblGetTimeStamp(prec);
db_post_events(prec, &prec->dlya, DBE_VALUE);
/* Make pact FALSE for asynchronous device support*/
prec->pact = FALSE;
@@ -294,7 +301,6 @@ static long process(struct dbCommon *pcommon)
prec->pact = TRUE;
} else {/*Device Support is asynchronous*/
writeValue(prec);
recGblGetTimeStamp(prec);
}
}
monitor(prec);

View File

@@ -111,7 +111,7 @@ static long init_record(dbCommon *pcommon, int pass)
prec->udf=FALSE;
}
if (pdset->common.init_record) {
if ((status = pdset->common.init_record(pcommon))) return status;
if ((status = pdset->common.init_record(pcommon))) return status;
}
prec->mlst = prec->val;
prec->alst = prec->val;
@@ -122,7 +122,7 @@ static long init_record(dbCommon *pcommon, int pass)
static long process(dbCommon *pcommon)
{
int64outRecord *prec = (int64outRecord*)pcommon;
int64outdset *pdset = (int64outdset *)(prec->dset);
int64outdset *pdset = (int64outdset *)(prec->dset);
long status=0;
epicsInt64 value;
unsigned char pact=prec->pact;
@@ -144,6 +144,10 @@ static long process(dbCommon *pcommon)
value = prec->val;
}
if (!status) convert(prec,value);
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
/* check for alarms */
@@ -175,7 +179,10 @@ static long process(dbCommon *pcommon)
if ( !pact && prec->pact ) return(0);
prec->pact = TRUE;
recGblGetTimeStampSimm(prec, prec->simm, NULL);
if ( pact ) {
/* Update timestamp again for asynchronous devices */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
/* check event list */
monitor(prec);

View File

@@ -146,6 +146,10 @@ static long process(struct dbCommon *pcommon)
value = prec->val;
}
if (!status) convert(prec,value);
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
/* check for alarms */
@@ -177,7 +181,10 @@ static long process(struct dbCommon *pcommon)
if ( !pact && prec->pact ) return(0);
prec->pact = TRUE;
recGblGetTimeStampSimm(prec, prec->simm, NULL);
if ( pact ) {
/* Update timestamp again for asynchronous devices */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
/* check event list */
monitor(prec);

View File

@@ -194,6 +194,10 @@ static long process(struct dbCommon *pcommon)
prec->udf = FALSE;
/* Convert VAL to RVAL */
convert(prec);
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
CONTINUE:
@@ -224,7 +228,11 @@ CONTINUE:
return 0;
prec->pact = TRUE;
recGblGetTimeStampSimm(prec, prec->simm, NULL);
if ( pact ) {
/* Update timestamp again for asynchronous devices */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
monitor(prec);

View File

@@ -215,6 +215,10 @@ static long process(struct dbCommon *pcommon)
prec->udf = FALSE;
/* Convert VAL to RVAL */
convert(prec);
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
CONTINUE:
@@ -248,7 +252,11 @@ CONTINUE:
return 0;
prec->pact = TRUE;
recGblGetTimeStampSimm(prec, prec->simm, NULL);
if ( pact ) {
/* Update timestamp again for asynchronous devices */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
monitor(prec);

View File

@@ -147,6 +147,10 @@ static long process(struct dbCommon *pcommon)
recGblSetSevr(prec,UDF_ALARM,prec->udfs);
}
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
if (prec->nsev < INVALID_ALARM )
status=writeValue(prec); /* write the new value */
else {
@@ -173,7 +177,10 @@ static long process(struct dbCommon *pcommon)
if ( !pact && prec->pact ) return(0);
prec->pact = TRUE;
recGblGetTimeStampSimm(prec, prec->simm, NULL);
if ( pact ) {
/* Update timestamp again for asynchronous devices */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
monitor(prec);
recGblFwdLink(prec);