Propagate AMSG through MSS links

MS and MSI links do not propagate STAT and therefore do not propagate
AMSG, either. CA, CP and CPP links also do not propagate AMSG, but the
reason is technical: the message is not available over Channel Access.
This commit is contained in:
Jure Varlec
2024-11-19 16:25:09 +01:00
committed by Andrew Johnson
parent f4aee8e6b7
commit d0cf47cd6f
3 changed files with 16 additions and 7 deletions

View File

@ -226,9 +226,10 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
} }
if (!status && precord != dbChannelRecord(chan)) if (!status && precord != dbChannelRecord(chan))
recGblInheritSevr(plink->value.pv_link.pvlMask & pvlOptMsMode, recGblInheritSevrMsg(plink->value.pv_link.pvlMask & pvlOptMsMode,
plink->precord, plink->precord,
dbChannelRecord(chan)->stat, dbChannelRecord(chan)->sevr); dbChannelRecord(chan)->stat, dbChannelRecord(chan)->sevr,
dbChannelRecord(chan)->amsg);
return status; return status;
} }
@ -378,8 +379,8 @@ static long dbDbPutValue(struct link *plink, short dbrType,
dbCommon *pdest = dbChannelRecord(chan); dbCommon *pdest = dbChannelRecord(chan);
long status = dbPut(paddr, dbrType, pbuffer, nRequest); long status = dbPut(paddr, dbrType, pbuffer, nRequest);
recGblInheritSevr(ppv_link->pvlMask & pvlOptMsMode, pdest, psrce->nsta, recGblInheritSevrMsg(ppv_link->pvlMask & pvlOptMsMode, pdest, psrce->nsta,
psrce->nsev); psrce->nsev, psrce->namsg);
if (status) if (status)
return status; return status;

View File

@ -260,8 +260,8 @@ int recGblSetSevr(void *precord, epicsEnum16 new_stat, epicsEnum16 new_sevr)
return recGblSetSevrMsg(precord, new_stat, new_sevr, NULL); return recGblSetSevrMsg(precord, new_stat, new_sevr, NULL);
} }
void recGblInheritSevr(int msMode, void *precord, epicsEnum16 stat, void recGblInheritSevrMsg(int msMode, void *precord, epicsEnum16 stat,
epicsEnum16 sevr) epicsEnum16 sevr, const char *msg)
{ {
switch (msMode) { switch (msMode) {
case pvlOptNMS: case pvlOptNMS:
@ -274,11 +274,17 @@ void recGblInheritSevr(int msMode, void *precord, epicsEnum16 stat,
recGblSetSevr(precord, LINK_ALARM, sevr); recGblSetSevr(precord, LINK_ALARM, sevr);
break; break;
case pvlOptMSS: case pvlOptMSS:
recGblSetSevr(precord, stat, sevr); /* Only MSS inherits msg */
recGblSetSevrMsg(precord, stat, sevr, "%s", msg);
break; break;
} }
} }
void recGblInheritSevr(int msMode, void *precord, epicsEnum16 stat,
epicsEnum16 sevr)
{
recGblInheritSevrMsg(msMode, precord, stat, sevr, NULL);
}
void recGblFwdLink(void *precord) void recGblFwdLink(void *precord)
{ {

View File

@ -73,6 +73,8 @@ DBCORE_API int recGblSetSevr(void *precord, epicsEnum16 new_stat,
epicsEnum16 new_sevr); epicsEnum16 new_sevr);
DBCORE_API void recGblInheritSevr(int msMode, void *precord, epicsEnum16 stat, DBCORE_API void recGblInheritSevr(int msMode, void *precord, epicsEnum16 stat,
epicsEnum16 sevr); epicsEnum16 sevr);
DBCORE_API void recGblInheritSevrMsg(int msMode, void *precord, epicsEnum16 stat,
epicsEnum16 sevr, const char *msg);
DBCORE_API int recGblSetSevrMsg(void *precord, epicsEnum16 new_stat, DBCORE_API int recGblSetSevrMsg(void *precord, epicsEnum16 new_stat,
epicsEnum16 new_sevr, epicsEnum16 new_sevr,
EPICS_PRINTF_FMT(const char *msg), ...) EPICS_PRINTF_STYLE(4,5); EPICS_PRINTF_FMT(const char *msg), ...) EPICS_PRINTF_STYLE(4,5);