From e01b6bd43578838dea2aae4f87b27caf19190940 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 14 Apr 2009 20:04:05 +0000 Subject: [PATCH] Calculate monitor events properly. --- src/rec/longinRecord.c | 50 +++++++++++++++++++---------------------- src/rec/longoutRecord.c | 50 ++++++++++++++++++++--------------------- 2 files changed, 47 insertions(+), 53 deletions(-) diff --git a/src/rec/longinRecord.c b/src/rec/longinRecord.c index dee03263e..9f211a0a0 100644 --- a/src/rec/longinRecord.c +++ b/src/rec/longinRecord.c @@ -262,38 +262,34 @@ static void checkAlarms(longinRecord *prec) return; } +/* DELTA calculates the absolute difference between its arguments + * expressed as an unsigned 32-bit integer */ +#define DELTA(last, val) \ + ((epicsUInt32) ((last) > (val) ? (last) - (val) : (val) - (last))) + static void monitor(longinRecord *prec) { - unsigned short monitor_mask; - epicsInt32 delta; + unsigned short monitor_mask = recGblResetAlarms(prec); - /* get previous stat and sevr and new stat and sevr*/ - monitor_mask = recGblResetAlarms(prec); - /* check for value change */ - delta = prec->mlst - prec->val; - if(delta<0) delta = -delta; - if (delta > prec->mdel || delta==0x80000000) { - /* post events for value change */ - monitor_mask |= DBE_VALUE; - /* update last value monitored */ - prec->mlst = prec->val; - } + if (prec->mdel < 0 || + DELTA(prec->mlst, prec->val) > (epicsUInt32) prec->mdel) { + /* post events for value change */ + monitor_mask |= DBE_VALUE; + /* update last value monitored */ + prec->mlst = prec->val; + } - /* check for archive change */ - delta = prec->alst - prec->val; - if(delta<0) delta = -delta; - if (delta > prec->adel || delta==0x80000000) { - /* post events on value field for archive change */ - monitor_mask |= DBE_LOG; - /* update last archive value monitored */ - prec->alst = prec->val; - } + if (prec->adel < 0 || + DELTA(prec->alst, prec->val) > (epicsUInt32) prec->adel) { + /* post events for archive value change */ + monitor_mask |= DBE_LOG; + /* update last archive value monitored */ + prec->alst = prec->val; + } - /* send out monitors connected to the value field */ - if (monitor_mask){ - db_post_events(prec,&prec->val,monitor_mask); - } - return; + /* send out monitors connected to the value field */ + if (monitor_mask) + db_post_events(prec, &prec->val, monitor_mask); } static long readValue(longinRecord *prec) diff --git a/src/rec/longoutRecord.c b/src/rec/longoutRecord.c index 6309a5d32..d143be23b 100644 --- a/src/rec/longoutRecord.c +++ b/src/rec/longoutRecord.c @@ -302,36 +302,34 @@ static void checkAlarms(longoutRecord *prec) return; } +/* DELTA calculates the absolute difference between its arguments + * expressed as an unsigned 32-bit integer */ +#define DELTA(last, val) \ + ((epicsUInt32) ((last) > (val) ? (last) - (val) : (val) - (last))) + static void monitor(longoutRecord *prec) { - unsigned short monitor_mask; - epicsInt32 delta; + unsigned short monitor_mask = recGblResetAlarms(prec); - monitor_mask = recGblResetAlarms(prec); - /* check for value change */ - delta = prec->mlst - prec->val; - if(delta<0) delta = -delta; - if (delta > prec->mdel || delta==0x80000000) { - /* post events for value change */ - monitor_mask |= DBE_VALUE; - /* update last value monitored */ - prec->mlst = prec->val; - } - /* check for archive change */ - delta = prec->alst - prec->val; - if(delta<0) delta = -delta; - if (delta > prec->adel || delta==0x80000000) { - /* post events on value field for archive change */ - monitor_mask |= DBE_LOG; - /* update last archive value monitored */ - prec->alst = prec->val; - } + if (prec->mdel < 0 || + DELTA(prec->mlst, prec->val) > (epicsUInt32) prec->mdel) { + /* post events for value change */ + monitor_mask |= DBE_VALUE; + /* update last value monitored */ + prec->mlst = prec->val; + } - /* send out monitors connected to the value field */ - if (monitor_mask){ - db_post_events(prec,&prec->val,monitor_mask); - } - return; + if (prec->adel < 0 || + DELTA(prec->alst, prec->val) > (epicsUInt32) prec->adel) { + /* post events for archive value change */ + monitor_mask |= DBE_LOG; + /* update last archive value monitored */ + prec->alst = prec->val; + } + + /* send out monitors connected to the value field */ + if (monitor_mask) + db_post_events(prec, &prec->val, monitor_mask); } static long writeValue(longoutRecord *prec)