propagate utag w/ links (including TSEL)
add lset::getTimestampTag()
This commit is contained in:
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user