Moved PV_LINK-specific code out of dbLink.c into link types
This required a change to the lset::getValue arguments, removing the pstat and psevr pointers. Links can still return a non-zero value from getValue and trigger a LINK:INVALID alarm, but for any other alarm settings they must manipulate the record themselves.
This commit is contained in:
@@ -50,6 +50,7 @@
|
||||
#include "dbLock.h"
|
||||
#include "dbScan.h"
|
||||
#include "link.h"
|
||||
#include "recGbl.h"
|
||||
#include "recSup.h"
|
||||
|
||||
/* defined in dbContext.cpp
|
||||
@@ -337,8 +338,8 @@ void dbCaRemoveLink(struct dbLocker *locker, struct link *plink)
|
||||
addAction(pca, CA_CLEAR_CHANNEL);
|
||||
}
|
||||
|
||||
long dbCaGetLink(struct link *plink,short dbrType, void *pdest,
|
||||
epicsEnum16 *pstat, epicsEnum16 *psevr, long *nelements)
|
||||
long dbCaGetLink(struct link *plink, short dbrType, void *pdest,
|
||||
long *nelements)
|
||||
{
|
||||
caLink *pca = (caLink *)plink->value.pv_link.pvt;
|
||||
long status = 0;
|
||||
@@ -410,10 +411,13 @@ long dbCaGetLink(struct link *plink,short dbrType, void *pdest,
|
||||
aConvert(&dbAddr, pdest, ntoget, ntoget, 0);
|
||||
}
|
||||
done:
|
||||
if (pstat) *pstat = pca->stat;
|
||||
if (psevr) *psevr = pca->sevr;
|
||||
if (link_action) addAction(pca, link_action);
|
||||
if (link_action)
|
||||
addAction(pca, link_action);
|
||||
if (!status)
|
||||
recGblInheritSevr(plink->value.pv_link.pvlMask & pvlOptMsMode,
|
||||
plink->precord, pca->stat, pca->sevr);
|
||||
epicsMutexUnlock(pca->lock);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,8 +33,7 @@ epicsShareFunc long dbCaAddLink(struct dbLocker *locker, struct link *plink, sho
|
||||
epicsShareFunc void dbCaRemoveLink(struct dbLocker *locker, struct link *plink);
|
||||
|
||||
epicsShareFunc long dbCaGetLink(struct link *plink,
|
||||
short dbrType, void *pbuffer, epicsEnum16 *pstat, epicsEnum16 *psevr,
|
||||
long *nRequest);
|
||||
short dbrType, void *pbuffer, long *nRequest);
|
||||
|
||||
epicsShareFunc long dbCaGetAttributes(const struct link *plink,
|
||||
dbCaCallback callback, void *userPvt);
|
||||
|
||||
@@ -115,7 +115,7 @@ static long dbConstGetNelements(const struct link *plink, long *nelements)
|
||||
}
|
||||
|
||||
static long dbConstGetValue(struct link *plink, short dbrType, void *pbuffer,
|
||||
epicsEnum16 *pstat, epicsEnum16 *psevr, long *pnRequest)
|
||||
long *pnRequest)
|
||||
{
|
||||
if (pnRequest)
|
||||
*pnRequest = 0;
|
||||
|
||||
@@ -129,7 +129,7 @@ static long dbDbGetElements(const struct link *plink, long *nelements)
|
||||
}
|
||||
|
||||
static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
|
||||
epicsEnum16 *pstat, epicsEnum16 *psevr, long *pnRequest)
|
||||
long *pnRequest)
|
||||
{
|
||||
struct pv_link *ppv_link = &plink->value.pv_link;
|
||||
DBADDR *paddr = ppv_link->pvt;
|
||||
@@ -146,8 +146,6 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
|
||||
if (status)
|
||||
return status;
|
||||
}
|
||||
*pstat = paddr->precord->stat;
|
||||
*psevr = paddr->precord->sevr;
|
||||
|
||||
if (ppv_link->getCvt && ppv_link->lastGetdbrType == dbrType) {
|
||||
status = ppv_link->getCvt(paddr->pfield, pbuffer, paddr);
|
||||
@@ -167,6 +165,10 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
|
||||
}
|
||||
ppv_link->lastGetdbrType = dbrType;
|
||||
}
|
||||
|
||||
if (!status)
|
||||
recGblInheritSevr(plink->value.pv_link.pvlMask & pvlOptMsMode,
|
||||
plink->precord, paddr->precord->stat, paddr->precord->sevr);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -270,7 +270,6 @@ long dbGetLink(struct link *plink, short dbrType, void *pbuffer,
|
||||
long *poptions, long *pnRequest)
|
||||
{
|
||||
struct dbCommon *precord = plink->precord;
|
||||
epicsEnum16 sevr = 0, stat = 0;
|
||||
lset *plset = plink->lset;
|
||||
long status;
|
||||
|
||||
@@ -282,13 +281,9 @@ long dbGetLink(struct link *plink, short dbrType, void *pbuffer,
|
||||
if (!plset || !plset->getValue)
|
||||
return -1;
|
||||
|
||||
status = plset->getValue(plink, dbrType, pbuffer, &stat, &sevr, pnRequest);
|
||||
if (status) {
|
||||
status = plset->getValue(plink, dbrType, pbuffer, pnRequest);
|
||||
if (status)
|
||||
recGblSetSevr(precord, LINK_ALARM, INVALID_ALARM);
|
||||
} else {
|
||||
recGblInheritSevr(plink->value.pv_link.pvlMask & pvlOptMsMode, precord,
|
||||
stat, sevr);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ typedef struct lset {
|
||||
|
||||
/* Get data */
|
||||
long (*getValue)(struct link *plink, short dbrType, void *pbuffer,
|
||||
epicsEnum16 *pstat, epicsEnum16 *psevr, long *pnRequest);
|
||||
long *pnRequest);
|
||||
long (*getControlLimits)(const struct link *plink, double *lo, double *hi);
|
||||
long (*getGraphicLimits)(const struct link *plink, double *lo, double *hi);
|
||||
long (*getAlarmLimits)(const struct link *plink, double *lolo, double *lo,
|
||||
|
||||
@@ -435,7 +435,7 @@ static long lnkConst_getNelements(const struct link *plink, long *nelements)
|
||||
}
|
||||
|
||||
static long lnkConst_getValue(struct link *plink, short dbrType, void *pbuffer,
|
||||
epicsEnum16 *pstat, epicsEnum16 *psevr, long *pnRequest)
|
||||
long *pnRequest)
|
||||
{
|
||||
IFDEBUG(10)
|
||||
printf("lnkConst_loadScalar(const@%p, %d, %p, ... (%ld))\n",
|
||||
|
||||
Reference in New Issue
Block a user