ioc/db: add recGblCheckDeadband() to recGbl library

This commit is contained in:
Ralph Lange
2014-07-30 10:35:03 +02:00
parent c8946b4fc2
commit 6f41e11804
2 changed files with 27 additions and 1 deletions
+25 -1
View File
@@ -274,7 +274,31 @@ void recGblTSELwasModified(struct link *plink)
ppv_link->pvlMask |= pvlOptTSELisTime;
}
}
void recGblCheckDeadband(epicsFloat64 *poldval, const epicsFloat64 newval,
const epicsFloat64 deadband, unsigned *monitor_mask, const unsigned add_mask)
{
double delta = 0;
if (isnan(newval) != isnan(*poldval) || isinf(newval) != isinf(*poldval)) {
/* one is NaN or +-inf, the other finite -> send update */
delta = epicsINF;
} else if (!isinf(newval) && !isnan(newval)) {
/* both are finite -> compare delta with deadband */
delta = *poldval - newval;
if (delta < 0.0) delta = -delta;
} else if (signbit(newval) != signbit(*poldval)) {
/* one is +inf, the other -inf -> send update */
delta = epicsINF;
}
if (delta > deadband) {
/* add bits to monitor mask */
*monitor_mask |= add_mask;
/* update last value monitored */
*poldval = newval;
}
}
static void getMaxRangeValues(short field_type, double *pupper_limit,
double *plower_limit)
{
+2
View File
@@ -62,6 +62,8 @@ epicsShareFunc int recGblSetSevr(void *precord, epicsEnum16 new_stat,
epicsShareFunc void recGblFwdLink(void *precord);
epicsShareFunc void recGblGetTimeStamp(void *precord);
epicsShareFunc void recGblTSELwasModified(struct link *plink);
epicsShareFunc void recGblCheckDeadband(epicsFloat64 *poldval, const epicsFloat64 newval,
const epicsFloat64 deadband, unsigned *monitor_mask, const unsigned add_mask);
#ifdef __cplusplus
}