From 12f1818b39de1cd3de3bcd517f1880f2aafe5460 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 20 Apr 2020 14:04:51 -0700 Subject: [PATCH] propagate utag w/ links (including TSEL) add lset::getTimestampTag() --- modules/database/src/ioc/db/dbDbLink.c | 10 +++++++++- modules/database/src/ioc/db/dbLink.c | 15 ++++++++++++--- modules/database/src/ioc/db/dbLink.h | 13 +++++++++++++ modules/database/src/ioc/db/recGbl.c | 2 +- modules/database/src/std/link/lnkCalc.c | 20 ++++++++++++++++---- 5 files changed, 51 insertions(+), 9 deletions(-) diff --git a/modules/database/src/ioc/db/dbDbLink.c b/modules/database/src/ioc/db/dbDbLink.c index 0243fde9a..442e9f48d 100644 --- a/modules/database/src/ioc/db/dbDbLink.c +++ b/modules/database/src/ioc/db/dbDbLink.c @@ -359,14 +359,21 @@ static long dbDbGetAlarm(const struct link *plink, epicsEnum16 *status, return dbDbGetAlarmMsg(plink, status, severity, NULL, 0u); } -static long dbDbGetTimeStamp(const struct link *plink, epicsTimeStamp *pstamp) +static long dbDbGetTimeStampTag(const struct link *plink, epicsTimeStamp *pstamp, epicsInt32 *ptag) { dbChannel *chan = linkChannel(plink); dbCommon *precord = dbChannelRecord(chan); *pstamp = precord->time; + if(ptag) + *ptag = precord->utag; return 0; } +static long dbDbGetTimeStamp(const struct link *plink, epicsTimeStamp *pstamp) +{ + return dbDbGetTimeStampTag(plink, pstamp, NULL); +} + static long dbDbPutValue(struct link *plink, short dbrType, const void *pbuffer, long nRequest) { @@ -415,6 +422,7 @@ static lset dbDb_lset = { dbDbPutValue, NULL, dbDbScanFwdLink, doLocked, dbDbGetAlarmMsg, + dbDbGetTimeStampTag, }; diff --git a/modules/database/src/ioc/db/dbLink.c b/modules/database/src/ioc/db/dbLink.c index 45b5e0f7e..5e13c4a4e 100644 --- a/modules/database/src/ioc/db/dbLink.c +++ b/modules/database/src/ioc/db/dbLink.c @@ -422,13 +422,22 @@ long dbGetAlarmMsg(const struct link *plink, epicsEnum16 *status, } long dbGetTimeStamp(const struct link *plink, epicsTimeStamp *pstamp) +{ + return dbGetTimeStampTag(plink, pstamp, NULL); +} + +long dbGetTimeStampTag(const struct link *plink, + epicsTimeStamp *pstamp, epicsInt32 *ptag) { lset *plset = plink->lset; - if (!plset || !plset->getTimeStamp) + if (plset && plset->getTimeStampTag) { + return plset->getTimeStampTag(plink, pstamp, ptag); + } else if(plset && plset->getTimeStamp) { + return plset->getTimeStamp(plink, pstamp); + } else { return S_db_noLSET; - - return plset->getTimeStamp(plink, pstamp); + } } long dbPutLink(struct link *plink, short dbrType, const void *pbuffer, diff --git a/modules/database/src/ioc/db/dbLink.h b/modules/database/src/ioc/db/dbLink.h index c0540271a..384ff8fe4 100644 --- a/modules/database/src/ioc/db/dbLink.h +++ b/modules/database/src/ioc/db/dbLink.h @@ -377,6 +377,15 @@ typedef struct lset { */ long (*getAlarmMsg)(const struct link *plink, epicsEnum16 *status, epicsEnum16 *severity, char *msgbuf, size_t msgbuflen); + + /** @brief Extended version of getTimeStamp + * + * Equivalent of getTimeStamp() and also copy out time tag. + * ptag may be NULL. + * + * @since Added after UNRELEASED + */ + long (*getTimeStampTag)(const struct link *plink, epicsTimeStamp *pstamp, epicsInt32 *ptag); } lset; #define dbGetSevr(link, sevr) \ @@ -428,6 +437,10 @@ DBCORE_API long dbGetAlarmMsg(const struct link *plink, epicsEnum16 *status, #define dbGetAlarmMsg(LINK, STAT, SEVR, BUF, BUFLEN) dbGetAlarmMsg(LINK, STAT, SEVR, BUF, BUFLEN) DBCORE_API long dbGetTimeStamp(const struct link *plink, epicsTimeStamp *pstamp); +/** @since UNRELEASED */ +DBCORE_API long dbGetTimeStampTag(const struct link *plink, + epicsTimeStamp *pstamp, epicsInt32 *ptag); +#define dbGetTimeStampTag(LINK, STAMP, TAG) dbGetTimeStampTag(LINK, STAMP, TAG) DBCORE_API long dbPutLink(struct link *plink, short dbrType, const void *pbuffer, long nRequest); DBCORE_API void dbLinkAsyncComplete(struct link *plink); diff --git a/modules/database/src/ioc/db/recGbl.c b/modules/database/src/ioc/db/recGbl.c index c2cdf2bbf..9f5b90479 100644 --- a/modules/database/src/ioc/db/recGbl.c +++ b/modules/database/src/ioc/db/recGbl.c @@ -304,7 +304,7 @@ void recGblGetTimeStampSimm(void *pvoid, const epicsEnum16 simm, struct link *si if (!dbLinkIsConstant(plink)) { if (plink->flags & DBLINK_FLAG_TSELisTIME) { - if (dbGetTimeStamp(plink, &prec->time)) + if (dbGetTimeStampTag(plink, &prec->time, &prec->utag)) errlogPrintf("recGblGetTimeStamp: dbGetTimeStamp failed for %s.TSEL\n", prec->name); return; diff --git a/modules/database/src/std/link/lnkCalc.c b/modules/database/src/std/link/lnkCalc.c index 7c3eab722..9b8421cb9 100644 --- a/modules/database/src/std/link/lnkCalc.c +++ b/modules/database/src/std/link/lnkCalc.c @@ -67,6 +67,7 @@ typedef struct calc_link { struct link out; double arg[CALCPERFORM_NARGS]; epicsTimeStamp time; + epicsInt32 utag; double val; } calc_link; @@ -534,6 +535,7 @@ static long lnkCalc_getElements(const struct link *plink, long *nelements) struct lcvt { double *pval; epicsTimeStamp *ptime; + epicsInt32 *ptag; }; static long readLocked(struct link *pinp, void *vvt) @@ -543,7 +545,7 @@ static long readLocked(struct link *pinp, void *vvt) long status = dbGetLink(pinp, DBR_DOUBLE, pvt->pval, NULL, &nReq); if (!status && pvt->ptime) - dbGetTimeStamp(pinp, pvt->ptime); + dbGetTimeStampTag(pinp, pvt->ptime, pvt->ptag); return status; } @@ -569,7 +571,7 @@ static long lnkCalc_getValue(struct link *plink, short dbrType, void *pbuffer, long nReq = 1; if (i == clink->tinp) { - struct lcvt vt = {&clink->arg[i], &clink->time}; + struct lcvt vt = {&clink->arg[i], &clink->time, &clink->utag}; status = dbLinkDoLocked(child, readLocked, &vt); if (status == S_db_noLSET) @@ -578,6 +580,7 @@ static long lnkCalc_getValue(struct link *plink, short dbrType, void *pbuffer, if (dbLinkIsConstant(&prec->tsel) && prec->tse == epicsTimeEventDeviceTime) { prec->time = clink->time; + prec->utag = clink->utag; } } else @@ -648,7 +651,7 @@ static long lnkCalc_putValue(struct link *plink, short dbrType, long nReq = 1; if (i == clink->tinp) { - struct lcvt vt = {&clink->arg[i], &clink->time}; + struct lcvt vt = {&clink->arg[i], &clink->time, &clink->utag}; status = dbLinkDoLocked(child, readLocked, &vt); if (status == S_db_noLSET) @@ -657,6 +660,7 @@ static long lnkCalc_putValue(struct link *plink, short dbrType, if (dbLinkIsConstant(&prec->tsel) && prec->tse == epicsTimeEventDeviceTime) { prec->time = clink->time; + prec->utag = clink->utag; } } else @@ -750,19 +754,26 @@ static long lnkCalc_getAlarm(const struct link *plink, epicsEnum16 *status, return lnkCalc_getAlarmMsg(plink, status, severity, NULL, 0u); } -static long lnkCalc_getTimestamp(const struct link *plink, epicsTimeStamp *pstamp) +static long lnkCalc_getTimestampTag(const struct link *plink, epicsTimeStamp *pstamp, epicsInt32 *ptag) { calc_link *clink = CONTAINER(plink->value.json.jlink, struct calc_link, jlink); if (clink->tinp >= 0) { *pstamp = clink->time; + if(ptag) + *ptag = clink->utag; return 0; } return -1; } +static long lnkCalc_getTimestamp(const struct link *plink, epicsTimeStamp *pstamp) +{ + return lnkCalc_getTimestampTag(plink, pstamp, NULL); +} + static long doLocked(struct link *plink, dbLinkUserCallback rtn, void *priv) { return rtn(plink, priv); @@ -783,6 +794,7 @@ static lset lnkCalc_lset = { lnkCalc_putValue, NULL, NULL, doLocked, lnkCalc_getAlarmMsg, + lnkCalc_getTimestampTag, }; static jlif lnkCalcIf = {