propagate utag w/ links (including TSEL)

add lset::getTimestampTag()
This commit is contained in:
Michael Davidsaver
2020-04-20 14:04:51 -07:00
parent 4ca765d813
commit 12f1818b39
5 changed files with 51 additions and 9 deletions

View File

@@ -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,
};

View File

@@ -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,

View File

@@ -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);

View File

@@ -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;

View File

@@ -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 = {