From 892a361de7002bf2b3f375f24bc5bf61858de2e5 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 30 Mar 2020 13:56:13 -0700 Subject: [PATCH] add alarm message field --- modules/database/src/ioc/db/dbCommon.dbd.pod | 10 ++++++ modules/database/src/ioc/db/recGbl.c | 35 +++++++++++++++++++- modules/database/src/ioc/db/recGbl.h | 9 +++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/modules/database/src/ioc/db/dbCommon.dbd.pod b/modules/database/src/ioc/db/dbCommon.dbd.pod index 36b9c1adb..24624abf6 100644 --- a/modules/database/src/ioc/db/dbCommon.dbd.pod +++ b/modules/database/src/ioc/db/dbCommon.dbd.pod @@ -279,6 +279,11 @@ support routines which write to the VAL field are responsible for setting UDF. special(SPC_NOMOD) menu(menuAlarmSevr) } + field(AMSG,DBF_STRING) { + prompt("Alarm Message") + special(SPC_NOMOD) + size(40) + } field(NSTA,DBF_MENU) { prompt("New Alarm Status") special(SPC_NOMOD) @@ -291,6 +296,11 @@ support routines which write to the VAL field are responsible for setting UDF. interest(2) menu(menuAlarmSevr) } + field(NAMSG,DBF_STRING) { + prompt("New Alarm Message") + special(SPC_NOMOD) + size(40) + } field(ACKS,DBF_MENU) { prompt("Alarm Ack Severity") special(SPC_NOMOD) diff --git a/modules/database/src/ioc/db/recGbl.c b/modules/database/src/ioc/db/recGbl.c index e9f6e5e89..c2cdf2bbf 100644 --- a/modules/database/src/ioc/db/recGbl.c +++ b/modules/database/src/ioc/db/recGbl.c @@ -24,6 +24,7 @@ #include "epicsMath.h" #include "epicsPrint.h" #include "epicsStdlib.h" +#include "epicsStdio.h" #include "epicsTime.h" #include "errlog.h" @@ -184,6 +185,11 @@ unsigned short recGblResetAlarms(void *precord) if (new_sevr > INVALID_ALARM) new_sevr = INVALID_ALARM; + if(strcmp(pdbc->namsg, pdbc->amsg)!=0) { + strcpy(pdbc->amsg, pdbc->namsg); + stat_mask = DBE_ALARM; + } + pdbc->stat = new_stat; pdbc->sevr = new_sevr; pdbc->nsta = 0; @@ -198,6 +204,7 @@ unsigned short recGblResetAlarms(void *precord) } if (stat_mask) { db_post_events(pdbc, &pdbc->stat, stat_mask); + db_post_events(pdbc, &pdbc->amsg, stat_mask); val_mask = DBE_ALARM; if (!pdbc->ackt || new_sevr >= pdbc->acks) { @@ -211,18 +218,44 @@ unsigned short recGblResetAlarms(void *precord) } return val_mask; } +int recGblSetSevrMsg(void *precord, epicsEnum16 new_stat, + epicsEnum16 new_sevr, + const char *msg, ...) +{ + int ret; + va_list args; + va_start(args, msg); + ret = recGblSetSevrVMsg(precord, new_stat, new_sevr, msg, args); + va_end(args); + return ret; +} -int recGblSetSevr(void *precord, epicsEnum16 new_stat, epicsEnum16 new_sevr) +int recGblSetSevrVMsg(void *precord, epicsEnum16 new_stat, + epicsEnum16 new_sevr, + const char *msg, va_list args) { struct dbCommon *prec = precord; if (prec->nsev < new_sevr) { prec->nsta = new_stat; prec->nsev = new_sevr; + if(msg) { + epicsVsnprintf(prec->namsg, sizeof(prec->namsg)-1, msg, args); + prec->namsg[sizeof(prec->namsg)-1] = '\0'; + + } else { + prec->namsg[0] = '\0'; + } + prec->namsg[sizeof(prec->namsg)-1] = '\0'; return TRUE; } return FALSE; } +int recGblSetSevr(void *precord, epicsEnum16 new_stat, epicsEnum16 new_sevr) +{ + return recGblSetSevrMsg(precord, new_stat, new_sevr, NULL); +} + void recGblInheritSevr(int msMode, void *precord, epicsEnum16 stat, epicsEnum16 sevr) { diff --git a/modules/database/src/ioc/db/recGbl.h b/modules/database/src/ioc/db/recGbl.h index fd08123ef..03c4202e2 100644 --- a/modules/database/src/ioc/db/recGbl.h +++ b/modules/database/src/ioc/db/recGbl.h @@ -15,6 +15,9 @@ #ifndef INCrecGblh #define INCrecGblh 1 +#include + +#include "compilerDependencies.h" #include "epicsTypes.h" #include "dbCoreAPI.h" @@ -62,6 +65,12 @@ DBCORE_API int recGblSetSevr(void *precord, epicsEnum16 new_stat, epicsEnum16 new_sevr); DBCORE_API void recGblInheritSevr(int msMode, void *precord, epicsEnum16 stat, epicsEnum16 sevr); +DBCORE_API int recGblSetSevrMsg(void *precord, epicsEnum16 new_stat, + epicsEnum16 new_sevr, + const char *msg, ...) EPICS_PRINTF_STYLE(4,5); +DBCORE_API int recGblSetSevrVMsg(void *precord, epicsEnum16 new_stat, + epicsEnum16 new_sevr, + const char *msg, va_list args); DBCORE_API void recGblFwdLink(void *precord); DBCORE_API void recGblGetTimeStamp(void *precord); DBCORE_API void recGblGetTimeStampSimm(void *prec, const epicsEnum16 simm, struct link *siol);