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

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