Merged Dirk Zimoch's non-val-attributes branch
This commit is contained in:
@@ -15,6 +15,14 @@ EPICS Base 3.15.0.x releases are not intended for use in production systems.</p>
|
||||
<h2 align="center">Changes between 3.14.x and 3.15.0.x</h2>
|
||||
<!-- Insert new items immediately below here ... -->
|
||||
|
||||
<h3>Attributes of Non-VAL Fields</h3>
|
||||
|
||||
<p>Non-VAL fields now report meaningful information for precision, units,
|
||||
graphic limits, control limits, and alarm limits instead of simply using
|
||||
PREC, EGU, HOPR, LOPR, DRVL, DRVH, HIHI, HIGH, LOW, and LOLO. All delay
|
||||
fields have precision 2 and units "s". Input fields like A-L of the calc record
|
||||
read these information from the corresponding INPn link if possible.
|
||||
|
||||
<h3>
|
||||
Changes to epicsVersion.h</h3>
|
||||
|
||||
|
||||
@@ -53,14 +53,14 @@ static long special(DBADDR *, int);
|
||||
static long cvt_dbaddr(DBADDR *);
|
||||
static long get_array_info(DBADDR *, long *, long *);
|
||||
static long put_array_info(DBADDR *, long );
|
||||
#define get_units NULL
|
||||
static long get_units(DBADDR *, char *);
|
||||
static long get_precision(DBADDR *, long *);
|
||||
#define get_enum_str NULL
|
||||
#define get_enum_strs NULL
|
||||
#define put_enum_str NULL
|
||||
#define get_graphic_double NULL
|
||||
#define get_control_double NULL
|
||||
#define get_alarm_double NULL
|
||||
static long get_graphic_double(DBADDR *, struct dbr_grDouble *);
|
||||
static long get_control_double(DBADDR *, struct dbr_ctrlDouble *);
|
||||
static long get_alarm_double(DBADDR *, struct dbr_alDouble *);
|
||||
|
||||
rset aSubRSET = {
|
||||
RSETNUMBER,
|
||||
@@ -330,15 +330,116 @@ static long fetch_values(aSubRecord *prec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_precision(DBADDR *paddr, long *precision)
|
||||
#define indexof(field) aSubRecord##field
|
||||
|
||||
static long get_inlinkNumber(int fieldIndex) {
|
||||
if (fieldIndex >= indexof(A) && fieldIndex <= indexof(U))
|
||||
return fieldIndex - indexof(A);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static long get_outlinkNumber(int fieldIndex) {
|
||||
if (fieldIndex >= indexof(VALA) && fieldIndex <= indexof(VALU))
|
||||
return fieldIndex - indexof(VALA);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
aSubRecord *prec = (aSubRecord *)paddr->precord;
|
||||
int linkNumber;
|
||||
|
||||
*precision = prec->prec;
|
||||
recGblGetPrec(paddr, precision);
|
||||
linkNumber = get_inlinkNumber(dbGetFieldIndex(paddr));
|
||||
if (linkNumber >= 0) {
|
||||
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
return 0;
|
||||
}
|
||||
linkNumber = get_outlinkNumber(dbGetFieldIndex(paddr));
|
||||
if (linkNumber >= 0) {
|
||||
dbGetUnits(&prec->outa + linkNumber, units, DB_UNITS_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_precision(DBADDR *paddr, long *pprecision)
|
||||
{
|
||||
aSubRecord *prec = (aSubRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
short precision;
|
||||
|
||||
*pprecision = prec->prec;
|
||||
linkNumber = get_inlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
|
||||
*pprecision = precision;
|
||||
return 0;
|
||||
}
|
||||
linkNumber = get_outlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
if (dbGetPrecision(&prec->outa + linkNumber, &precision) == 0)
|
||||
*pprecision = precision;
|
||||
return 0;
|
||||
}
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
aSubRecord *prec = (aSubRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
linkNumber = get_inlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetGraphicLimits(&prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
return 0;
|
||||
}
|
||||
linkNumber = get_outlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetGraphicLimits(&prec->outa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
aSubRecord *prec = (aSubRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
linkNumber = get_inlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetAlarmLimits(&prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
return 0;
|
||||
}
|
||||
linkNumber = get_outlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetAlarmLimits(&prec->outa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
return 0;
|
||||
}
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void monitor(aSubRecord *prec)
|
||||
{
|
||||
|
||||
@@ -109,7 +109,7 @@ static long init_record(aaiRecord *prec, int pass)
|
||||
recGblRecordError(S_dev_noDSET, prec, "aai: init_record");
|
||||
return S_dev_noDSET;
|
||||
}
|
||||
|
||||
|
||||
if (pass == 0) {
|
||||
if (prec->nelm <= 0)
|
||||
prec->nelm = 1;
|
||||
@@ -120,12 +120,12 @@ static long init_record(aaiRecord *prec, int pass)
|
||||
} else {
|
||||
prec->nord = 0;
|
||||
}
|
||||
|
||||
|
||||
/* we must call pdset->init_record in pass 0
|
||||
because it may set prec->bptr which must
|
||||
not change after links are established before pass 1
|
||||
*/
|
||||
|
||||
|
||||
if (pdset->init_record) {
|
||||
/* init_record may set the bptr to point to the data */
|
||||
if ((status = pdset->init_record(prec)))
|
||||
@@ -141,7 +141,7 @@ static long init_record(aaiRecord *prec, int pass)
|
||||
|
||||
/* SIML must be a CONSTANT or a PV_LINK or a DB_LINK */
|
||||
if (prec->siml.type == CONSTANT) {
|
||||
recGblInitConstantLink(&prec->siml,DBF_USHORT,&prec->simm);
|
||||
recGblInitConstantLink(&prec->siml,DBF_USHORT,&prec->simm);
|
||||
}
|
||||
|
||||
/* must have read_aai function defined */
|
||||
@@ -210,11 +210,20 @@ static long put_array_info(DBADDR *paddr, long nNew)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define indexof(field) aaiRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
aaiRecord *prec = (aaiRecord *)paddr->precord;
|
||||
|
||||
strncpy(units, prec->egu, DB_UNITS_SIZE);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
|
||||
break;
|
||||
case indexof(HOPR):
|
||||
case indexof(LOPR):
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -223,8 +232,8 @@ static long get_precision(DBADDR *paddr, long *precision)
|
||||
aaiRecord *prec = (aaiRecord *)paddr->precord;
|
||||
|
||||
*precision = prec->prec;
|
||||
if (paddr->pfield == prec->bptr) return 0;
|
||||
recGblGetPrec(paddr, precision);
|
||||
if (dbGetFieldIndex(paddr) != indexof(VAL))
|
||||
recGblGetPrec(paddr, precision);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -232,10 +241,18 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
aaiRecord *prec = (aaiRecord *)paddr->precord;
|
||||
|
||||
if (paddr->pfield == prec->bptr) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
} else recGblGetGraphicDouble(paddr, pgd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
case indexof(NORD):
|
||||
pgd->upper_disp_limit = prec->nelm;
|
||||
pgd->lower_disp_limit = 0;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr, pgd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -243,10 +260,18 @@ static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
aaiRecord *prec = (aaiRecord *)paddr->precord;
|
||||
|
||||
if (paddr->pfield == prec->bptr) {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
} else recGblGetControlDouble(paddr, pcd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
case indexof(NORD):
|
||||
pcd->upper_ctrl_limit = prec->nelm;
|
||||
pcd->lower_ctrl_limit = 0;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr, pcd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ static long init_record(aaoRecord *prec, int pass)
|
||||
recGblRecordError(S_dev_noDSET, prec, "aao: init_record");
|
||||
return S_dev_noDSET;
|
||||
}
|
||||
|
||||
|
||||
if (pass == 0) {
|
||||
if (prec->nelm <= 0)
|
||||
prec->nelm = 1;
|
||||
@@ -120,12 +120,12 @@ static long init_record(aaoRecord *prec, int pass)
|
||||
} else {
|
||||
prec->nord = 0;
|
||||
}
|
||||
|
||||
|
||||
/* we must call pdset->init_record in pass 0
|
||||
because it may set prec->bptr which must
|
||||
not change after links are established before pass 1
|
||||
*/
|
||||
|
||||
|
||||
if (pdset->init_record) {
|
||||
/* init_record may set the bptr to point to the data */
|
||||
if ((status = pdset->init_record(prec)))
|
||||
@@ -138,12 +138,12 @@ static long init_record(aaoRecord *prec, int pass)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* SIML must be a CONSTANT or a PV_LINK or a DB_LINK */
|
||||
if (prec->siml.type == CONSTANT) {
|
||||
recGblInitConstantLink(&prec->siml,DBF_USHORT,&prec->simm);
|
||||
recGblInitConstantLink(&prec->siml,DBF_USHORT,&prec->simm);
|
||||
}
|
||||
|
||||
|
||||
/* must have write_aao function defined */
|
||||
if (pdset->number < 5 || pdset->write_aao == NULL) {
|
||||
recGblRecordError(S_dev_missingSup, prec, "aao: init_record");
|
||||
@@ -210,11 +210,20 @@ static long put_array_info(DBADDR *paddr, long nNew)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define indexof(field) aaoRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
aaoRecord *prec = (aaoRecord *)paddr->precord;
|
||||
|
||||
strncpy(units, prec->egu, DB_UNITS_SIZE);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
|
||||
break;
|
||||
case indexof(HOPR):
|
||||
case indexof(LOPR):
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -223,8 +232,8 @@ static long get_precision(DBADDR *paddr, long *precision)
|
||||
aaoRecord *prec = (aaoRecord *)paddr->precord;
|
||||
|
||||
*precision = prec->prec;
|
||||
if (paddr->pfield == (void *)prec->bptr) return 0;
|
||||
recGblGetPrec(paddr, precision);
|
||||
if (dbGetFieldIndex(paddr) != indexof(VAL))
|
||||
recGblGetPrec(paddr, precision);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -232,10 +241,18 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
aaoRecord *prec = (aaoRecord *)paddr->precord;
|
||||
|
||||
if (paddr->pfield == prec->bptr) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
} else recGblGetGraphicDouble(paddr,pgd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
case indexof(NORD):
|
||||
pgd->upper_disp_limit = prec->nelm;
|
||||
pgd->lower_disp_limit = 0;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr, pgd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -243,10 +260,18 @@ static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
aaoRecord *prec = (aaoRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield == prec->bptr){
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
} else recGblGetControlDouble(paddr,pcd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
case indexof(NORD):
|
||||
pcd->upper_ctrl_limit = prec->nelm;
|
||||
pcd->lower_ctrl_limit = 0;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr, pcd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -217,11 +217,22 @@ static long special(DBADDR *paddr,int after)
|
||||
}
|
||||
}
|
||||
|
||||
#define indexof(field) aiRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
aiRecord *prec=(aiRecord *)paddr->precord;
|
||||
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(ASLO):
|
||||
case indexof(AOFF):
|
||||
case indexof(SMOO):
|
||||
break;
|
||||
default:
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -230,7 +241,7 @@ static long get_precision(DBADDR *paddr, long *precision)
|
||||
aiRecord *prec=(aiRecord *)paddr->precord;
|
||||
|
||||
*precision = prec->prec;
|
||||
if(paddr->pfield == (void *)&prec->val) return(0);
|
||||
if (dbGetFieldIndex(paddr) == indexof(VAL)) return(0);
|
||||
recGblGetPrec(paddr,precision);
|
||||
return(0);
|
||||
}
|
||||
@@ -238,43 +249,54 @@ static long get_precision(DBADDR *paddr, long *precision)
|
||||
static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
|
||||
{
|
||||
aiRecord *prec=(aiRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == aiRecordVAL
|
||||
|| fieldIndex == aiRecordHIHI
|
||||
|| fieldIndex == aiRecordHIGH
|
||||
|| fieldIndex == aiRecordLOW
|
||||
|| fieldIndex == aiRecordLOLO
|
||||
|| fieldIndex == aiRecordHOPR
|
||||
|| fieldIndex == aiRecordLOPR) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
} else recGblGetGraphicDouble(paddr,pgd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
case indexof(SVAL):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
aiRecord *prec=(aiRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == aiRecordVAL
|
||||
|| fieldIndex == aiRecordHIHI
|
||||
|| fieldIndex == aiRecordHIGH
|
||||
|| fieldIndex == aiRecordLOW
|
||||
|| fieldIndex == aiRecordLOLO) {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
} else recGblGetControlDouble(paddr,pcd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
case indexof(SVAL):
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_alarm_double(DBADDR *paddr,struct dbr_alDouble *pad)
|
||||
{
|
||||
aiRecord *prec=(aiRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == aiRecordVAL) {
|
||||
if (dbGetFieldIndex(paddr) == indexof(VAL)) {
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
|
||||
pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
|
||||
|
||||
@@ -276,11 +276,21 @@ static long special(DBADDR *paddr, int after)
|
||||
}
|
||||
}
|
||||
|
||||
#define indexof(field) aoRecord##field
|
||||
|
||||
static long get_units(DBADDR * paddr,char *units)
|
||||
{
|
||||
aoRecord *prec=(aoRecord *)paddr->precord;
|
||||
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(ASLO):
|
||||
case indexof(AOFF):
|
||||
break;
|
||||
default:
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -289,10 +299,14 @@ static long get_precision(DBADDR *paddr,long *precision)
|
||||
aoRecord *prec=(aoRecord *)paddr->precord;
|
||||
|
||||
*precision = prec->prec;
|
||||
if(paddr->pfield == (void *)&prec->val
|
||||
|| paddr->pfield == (void *)&prec->oval
|
||||
|| paddr->pfield == (void *)&prec->pval) return(0);
|
||||
recGblGetPrec(paddr,precision);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(OVAL):
|
||||
case indexof(PVAL):
|
||||
break;
|
||||
default:
|
||||
recGblGetPrec(paddr,precision);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -300,16 +314,24 @@ static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
|
||||
{
|
||||
aoRecord *prec=(aoRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)&prec->val
|
||||
|| paddr->pfield==(void *)&prec->hihi
|
||||
|| paddr->pfield==(void *)&prec->high
|
||||
|| paddr->pfield==(void *)&prec->low
|
||||
|| paddr->pfield==(void *)&prec->lolo
|
||||
|| paddr->pfield==(void *)&prec->oval
|
||||
|| paddr->pfield==(void *)&prec->pval){
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
} else recGblGetGraphicDouble(paddr,pgd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(OVAL):
|
||||
case indexof(PVAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
case indexof(IVOV):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -317,23 +339,30 @@ static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
aoRecord *prec=(aoRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)&prec->val
|
||||
|| paddr->pfield==(void *)&prec->hihi
|
||||
|| paddr->pfield==(void *)&prec->high
|
||||
|| paddr->pfield==(void *)&prec->low
|
||||
|| paddr->pfield==(void *)&prec->lolo
|
||||
|| paddr->pfield==(void *)&prec->oval
|
||||
|| paddr->pfield==(void *)&prec->pval){
|
||||
pcd->upper_ctrl_limit = prec->drvh;
|
||||
pcd->lower_ctrl_limit = prec->drvl;
|
||||
} else recGblGetControlDouble(paddr,pcd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(OVAL):
|
||||
case indexof(PVAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
pcd->upper_ctrl_limit = prec->drvh;
|
||||
pcd->lower_ctrl_limit = prec->drvl;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
aoRecord *prec=(aoRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)&prec->val){
|
||||
if(dbGetFieldIndex(paddr) == indexof(VAL)){
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
|
||||
pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
|
||||
|
||||
@@ -51,13 +51,13 @@ static long process(boRecord *);
|
||||
#define cvt_dbaddr NULL
|
||||
#define get_array_info NULL
|
||||
#define put_array_info NULL
|
||||
#define get_units NULL
|
||||
static long get_units(DBADDR *, char *);
|
||||
static long get_precision(DBADDR *, long *);
|
||||
static long get_enum_str(DBADDR *, char *);
|
||||
static long get_enum_strs(DBADDR *, struct dbr_enumStrs *);
|
||||
static long put_enum_str(DBADDR *, char *);
|
||||
#define get_graphic_double NULL
|
||||
#define get_control_double NULL
|
||||
static long get_control_double(DBADDR *, struct dbr_ctrlDouble *);
|
||||
#define get_alarm_double NULL
|
||||
|
||||
rset boRSET={
|
||||
@@ -268,12 +268,31 @@ static long process(boRecord *prec)
|
||||
return(status);
|
||||
}
|
||||
|
||||
#define indexof(field) boRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
if(dbGetFieldIndex(paddr) == indexof(HIGH))
|
||||
strcpy(units, "s");
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_precision(DBADDR *paddr, long *precision)
|
||||
{
|
||||
boRecord *prec=(boRecord *)paddr->precord;
|
||||
if(dbGetFieldIndex(paddr) == indexof(HIGH))
|
||||
*precision = 2;
|
||||
else
|
||||
recGblGetPrec(paddr,precision);
|
||||
return(0);
|
||||
}
|
||||
|
||||
if(paddr->pfield == (void *)&prec->high) *precision=2;
|
||||
else recGblGetPrec(paddr,precision);
|
||||
static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
if(dbGetFieldIndex(paddr) == indexof(HIGH)) {
|
||||
pcd->lower_ctrl_limit = 0.0;
|
||||
pcd->upper_ctrl_limit = 10.0;
|
||||
} else
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -285,7 +304,7 @@ static long get_enum_str(DBADDR *paddr, char *pstring)
|
||||
|
||||
|
||||
index = dbGetFieldIndex(paddr);
|
||||
if(index!=boRecordVAL) {
|
||||
if(index!=indexof(VAL)) {
|
||||
strcpy(pstring,"Illegal_Value");
|
||||
} else if(*pfield==0) {
|
||||
strncpy(pstring,prec->znam,sizeof(prec->znam));
|
||||
|
||||
@@ -54,28 +54,28 @@ static long get_precision(DBADDR *paddr, long *precision);
|
||||
#define get_enum_strs NULL
|
||||
#define put_enum_str NULL
|
||||
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd);
|
||||
static long get_ctrl_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd);
|
||||
static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd);
|
||||
static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad);
|
||||
|
||||
rset calcRSET={
|
||||
RSETNUMBER,
|
||||
report,
|
||||
initialize,
|
||||
init_record,
|
||||
process,
|
||||
special,
|
||||
get_value,
|
||||
cvt_dbaddr,
|
||||
get_array_info,
|
||||
put_array_info,
|
||||
get_units,
|
||||
get_precision,
|
||||
get_enum_str,
|
||||
get_enum_strs,
|
||||
put_enum_str,
|
||||
get_graphic_double,
|
||||
get_ctrl_double,
|
||||
get_alarm_double
|
||||
RSETNUMBER,
|
||||
report,
|
||||
initialize,
|
||||
init_record,
|
||||
process,
|
||||
special,
|
||||
get_value,
|
||||
cvt_dbaddr,
|
||||
get_array_info,
|
||||
put_array_info,
|
||||
get_units,
|
||||
get_precision,
|
||||
get_enum_str,
|
||||
get_enum_strs,
|
||||
put_enum_str,
|
||||
get_graphic_double,
|
||||
get_control_double,
|
||||
get_alarm_double
|
||||
};
|
||||
epicsExportAddress(rset, calcRSET);
|
||||
|
||||
@@ -96,15 +96,15 @@ static long init_record(calcRecord *prec, int pass)
|
||||
plink = &prec->inpa;
|
||||
pvalue = &prec->a;
|
||||
for (i = 0; i < CALCPERFORM_NARGS; i++, plink++, pvalue++) {
|
||||
if (plink->type == CONSTANT) {
|
||||
recGblInitConstantLink(plink, DBF_DOUBLE, pvalue);
|
||||
}
|
||||
if (plink->type == CONSTANT) {
|
||||
recGblInitConstantLink(plink, DBF_DOUBLE, pvalue);
|
||||
}
|
||||
}
|
||||
if (postfix(prec->calc, prec->rpcl, &error_number)) {
|
||||
recGblRecordError(S_db_badField, (void *)prec,
|
||||
"calc: init_record: Illegal CALC field");
|
||||
errlogPrintf("%s.CALC: %s in expression \"%s\"\n",
|
||||
prec->name, calcErrorStr(error_number), prec->calc);
|
||||
recGblRecordError(S_db_badField, (void *)prec,
|
||||
"calc: init_record: Illegal CALC field");
|
||||
errlogPrintf("%s.CALC: %s in expression \"%s\"\n",
|
||||
prec->name, calcErrorStr(error_number), prec->calc);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -112,10 +112,11 @@ static long init_record(calcRecord *prec, int pass)
|
||||
static long process(calcRecord *prec)
|
||||
{
|
||||
prec->pact = TRUE;
|
||||
if (fetch_values(prec)==0) {
|
||||
if (calcPerform(&prec->a, &prec->val, prec->rpcl)) {
|
||||
recGblSetSevr(prec, CALC_ALARM, INVALID_ALARM);
|
||||
} else prec->udf = isnan(prec->val);
|
||||
if (fetch_values(prec) == 0) {
|
||||
if (calcPerform(&prec->a, &prec->val, prec->rpcl)) {
|
||||
recGblSetSevr(prec, CALC_ALARM, INVALID_ALARM);
|
||||
} else
|
||||
prec->udf = isnan(prec->val);
|
||||
}
|
||||
recGblGetTimeStamp(prec);
|
||||
/* check for alarms */
|
||||
@@ -135,24 +136,41 @@ static long special(DBADDR *paddr, int after)
|
||||
|
||||
if (!after) return 0;
|
||||
if (paddr->special == SPC_CALC) {
|
||||
if (postfix(prec->calc, prec->rpcl, &error_number)) {
|
||||
recGblRecordError(S_db_badField, (void *)prec,
|
||||
"calc: Illegal CALC field");
|
||||
errlogPrintf("%s.CALC: %s in expression \"%s\"\n",
|
||||
prec->name, calcErrorStr(error_number), prec->calc);
|
||||
return S_db_badField;
|
||||
}
|
||||
return 0;
|
||||
if (postfix(prec->calc, prec->rpcl, &error_number)) {
|
||||
recGblRecordError(S_db_badField, (void *)prec,
|
||||
"calc: Illegal CALC field");
|
||||
errlogPrintf("%s.CALC: %s in expression \"%s\"\n",
|
||||
prec->name, calcErrorStr(error_number), prec->calc);
|
||||
return S_db_badField;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
recGblDbaddrError(S_db_badChoice, paddr, "calc::special - bad special value!");
|
||||
return S_db_badChoice;
|
||||
}
|
||||
|
||||
#define indexof(field) calcRecord##field
|
||||
|
||||
static long get_linkNumber(int fieldIndex) {
|
||||
if (fieldIndex >= indexof(A) && fieldIndex <= indexof(L))
|
||||
return fieldIndex - indexof(A);
|
||||
if (fieldIndex >= indexof(LA) && fieldIndex <= indexof(LL))
|
||||
return fieldIndex - indexof(LA);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
calcRecord *prec = (calcRecord *)paddr->precord;
|
||||
int linkNumber;
|
||||
|
||||
strncpy(units, prec->egu, DB_UNITS_SIZE);
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
|
||||
linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
|
||||
if (linkNumber >= 0)
|
||||
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
else
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -160,86 +178,97 @@ static long get_precision(DBADDR *paddr, long *pprecision)
|
||||
{
|
||||
calcRecord *prec = (calcRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
*pprecision = prec->prec;
|
||||
|
||||
if (fieldIndex != calcRecordVAL)
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
|
||||
if (fieldIndex == indexof(VAL)) {
|
||||
return 0;
|
||||
}
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
short precision;
|
||||
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
|
||||
*pprecision = precision;
|
||||
else
|
||||
*pprecision = 15;
|
||||
} else
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
calcRecord *prec = (calcRecord *)paddr->precord;
|
||||
|
||||
if (paddr->pfield == (void *)&prec->val ||
|
||||
paddr->pfield == (void *)&prec->hihi ||
|
||||
paddr->pfield == (void *)&prec->high ||
|
||||
paddr->pfield == (void *)&prec->low ||
|
||||
paddr->pfield == (void *)&prec->lolo) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
return 0;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
switch (fieldIndex) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
break;
|
||||
default:
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetGraphicLimits(&prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
} else
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
|
||||
if (paddr->pfield >= (void *)&prec->a &&
|
||||
paddr->pfield <= (void *)&prec->l) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
return 0;
|
||||
}
|
||||
if (paddr->pfield >= (void *)&prec->la &&
|
||||
paddr->pfield <= (void *)&prec->ll) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
return 0;
|
||||
}
|
||||
recGblGetGraphicDouble(paddr, pgd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_ctrl_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
calcRecord *prec = (calcRecord *)paddr->precord;
|
||||
|
||||
if (paddr->pfield == (void *)&prec->val ||
|
||||
paddr->pfield == (void *)&prec->hihi ||
|
||||
paddr->pfield == (void *)&prec->high ||
|
||||
paddr->pfield == (void *)&prec->low ||
|
||||
paddr->pfield == (void *)&prec->lolo) {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
return 0;
|
||||
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
}
|
||||
|
||||
if (paddr->pfield >= (void *)&prec->a &&
|
||||
paddr->pfield <= (void *)&prec->l) {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
return 0;
|
||||
}
|
||||
if (paddr->pfield >= (void *)&prec->la &&
|
||||
paddr->pfield <= (void *)&prec->ll) {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
return 0;
|
||||
}
|
||||
recGblGetControlDouble(paddr, pcd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
calcRecord *prec = (calcRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
if (paddr->pfield == (void *)&prec->val) {
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
|
||||
pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
|
||||
if (fieldIndex == indexof(VAL)) {
|
||||
pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
|
||||
pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
|
||||
pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
} else {
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetAlarmLimits(&prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
} else
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -311,34 +340,34 @@ static void monitor(calcRecord *prec)
|
||||
delta = prec->mlst - prec->val;
|
||||
if (delta < 0.0) delta = -delta;
|
||||
if (delta > prec->mdel) {
|
||||
/* post events for value change */
|
||||
monitor_mask |= DBE_VALUE;
|
||||
/* update last value monitored */
|
||||
prec->mlst = prec->val;
|
||||
/* post events for value change */
|
||||
monitor_mask |= DBE_VALUE;
|
||||
/* update last value monitored */
|
||||
prec->mlst = prec->val;
|
||||
}
|
||||
/* check for archive change */
|
||||
delta = prec->alst - prec->val;
|
||||
if (delta < 0.0) delta = -delta;
|
||||
if (delta > prec->adel) {
|
||||
/* post events on value field for archive change */
|
||||
monitor_mask |= DBE_LOG;
|
||||
/* update last archive value monitored */
|
||||
prec->alst = prec->val;
|
||||
/* post events on value field for archive change */
|
||||
monitor_mask |= DBE_LOG;
|
||||
/* update last archive value monitored */
|
||||
prec->alst = prec->val;
|
||||
}
|
||||
|
||||
/* send out monitors connected to the value field */
|
||||
if (monitor_mask){
|
||||
db_post_events(prec, &prec->val, monitor_mask);
|
||||
db_post_events(prec, &prec->val, monitor_mask);
|
||||
}
|
||||
/* check all input fields for changes*/
|
||||
pnew = &prec->a;
|
||||
pprev = &prec->la;
|
||||
for (i = 0; i < CALCPERFORM_NARGS; i++, pnew++, pprev++) {
|
||||
if (*pnew != *pprev ||
|
||||
monitor_mask & DBE_ALARM) {
|
||||
db_post_events(prec, pnew, monitor_mask | DBE_VALUE | DBE_LOG);
|
||||
*pprev = *pnew;
|
||||
}
|
||||
if (*pnew != *pprev ||
|
||||
monitor_mask & DBE_ALARM) {
|
||||
db_post_events(prec, pnew, monitor_mask | DBE_VALUE | DBE_LOG);
|
||||
*pprev = *pnew;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -353,10 +382,10 @@ static int fetch_values(calcRecord *prec)
|
||||
plink = &prec->inpa;
|
||||
pvalue = &prec->a;
|
||||
for(i = 0; i < CALCPERFORM_NARGS; i++, plink++, pvalue++) {
|
||||
int newStatus;
|
||||
int newStatus;
|
||||
|
||||
newStatus = dbGetLink(plink, DBR_DOUBLE, pvalue, 0, 0);
|
||||
if (status == 0) status = newStatus;
|
||||
newStatus = dbGetLink(plink, DBR_DOUBLE, pvalue, 0, 0);
|
||||
if (status == 0) status = newStatus;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ static long get_precision(DBADDR *, long *);
|
||||
#define get_enum_strs NULL
|
||||
#define put_enum_str NULL
|
||||
static long get_graphic_double(DBADDR *, struct dbr_grDouble *);
|
||||
static long get_ctrl_double(DBADDR *, struct dbr_ctrlDouble *);
|
||||
static long get_control_double(DBADDR *, struct dbr_ctrlDouble *);
|
||||
static long get_alarm_double(DBADDR *, struct dbr_alDouble *);
|
||||
|
||||
rset calcoutRSET = {
|
||||
@@ -79,7 +79,7 @@ rset calcoutRSET = {
|
||||
get_enum_strs,
|
||||
put_enum_str,
|
||||
get_graphic_double,
|
||||
get_ctrl_double,
|
||||
get_control_double,
|
||||
get_alarm_double
|
||||
};
|
||||
epicsExportAddress(rset, calcoutRSET);
|
||||
@@ -363,11 +363,34 @@ static long special(DBADDR *paddr, int after)
|
||||
}
|
||||
}
|
||||
|
||||
#define indexof(field) calcoutRecord##field
|
||||
|
||||
static long get_linkNumber(int fieldIndex) {
|
||||
if (fieldIndex >= indexof(A) && fieldIndex <= indexof(L))
|
||||
return fieldIndex - indexof(A);
|
||||
if (fieldIndex >= indexof(LA) && fieldIndex <= indexof(LL))
|
||||
return fieldIndex - indexof(LA);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
calcoutRecord *prec = (calcoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
strncpy(units, prec->egu, DB_UNITS_SIZE);
|
||||
if(fieldIndex == indexof(ODLY)) {
|
||||
strcpy(units, "s");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
|
||||
linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
|
||||
if (linkNumber >= 0)
|
||||
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
else
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -375,86 +398,109 @@ static long get_precision(DBADDR *paddr, long *pprecision)
|
||||
{
|
||||
calcoutRecord *prec = (calcoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
if(fieldIndex == indexof(ODLY)) {
|
||||
*pprecision = 2;
|
||||
return 0;
|
||||
}
|
||||
*pprecision = prec->prec;
|
||||
|
||||
if (fieldIndex != calcoutRecordVAL)
|
||||
if (fieldIndex == indexof(VAL)) {
|
||||
return 0;
|
||||
}
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
short precision;
|
||||
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
|
||||
*pprecision = precision;
|
||||
else
|
||||
*pprecision = 15;
|
||||
} else
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
calcoutRecord *prec = (calcoutRecord *)paddr->precord;
|
||||
|
||||
if (paddr->pfield == (void *)&prec->val ||
|
||||
paddr->pfield == (void *)&prec->hihi ||
|
||||
paddr->pfield == (void *)&prec->high ||
|
||||
paddr->pfield == (void *)&prec->low ||
|
||||
paddr->pfield == (void *)&prec->lolo) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
return 0;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
switch (fieldIndex) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
break;
|
||||
case indexof(ODLY):
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
pgd->lower_disp_limit = 0.0;
|
||||
break;
|
||||
default:
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetGraphicLimits(&prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
} else
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
|
||||
if (paddr->pfield >= (void *)&prec->a &&
|
||||
paddr->pfield <= (void *)&prec->l) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
return 0;
|
||||
}
|
||||
if (paddr->pfield >= (void *)&prec->la &&
|
||||
paddr->pfield <= (void *)&prec->ll) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
return 0;
|
||||
}
|
||||
recGblGetGraphicDouble(paddr, pgd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_ctrl_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
calcoutRecord *prec = (calcoutRecord *)paddr->precord;
|
||||
|
||||
if (paddr->pfield == (void *)&prec->val ||
|
||||
paddr->pfield == (void *)&prec->hihi ||
|
||||
paddr->pfield == (void *)&prec->high ||
|
||||
paddr->pfield == (void *)&prec->low ||
|
||||
paddr->pfield == (void *)&prec->lolo) {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
return 0;
|
||||
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
break;
|
||||
case indexof(ODLY):
|
||||
pcd->lower_ctrl_limit = 0.0;
|
||||
pcd->upper_ctrl_limit = 10.0;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
}
|
||||
|
||||
if (paddr->pfield >= (void *)&prec->a &&
|
||||
paddr->pfield <= (void *)&prec->l) {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
return 0;
|
||||
}
|
||||
if (paddr->pfield >= (void *)&prec->la &&
|
||||
paddr->pfield <= (void *)&prec->ll) {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
return 0;
|
||||
}
|
||||
recGblGetControlDouble(paddr, pcd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
calcoutRecord *prec = (calcoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
if (paddr->pfield == (void *)&prec->val) {
|
||||
if (fieldIndex == indexof(VAL)) {
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
|
||||
pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
|
||||
pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
|
||||
} else {
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetAlarmLimits(&prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
} else
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -400,11 +400,16 @@ static long put_array_info(DBADDR *paddr, long nNew)
|
||||
return(0);
|
||||
}
|
||||
|
||||
#define indexof(field) compressRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr,char *units)
|
||||
{
|
||||
compressRecord *prec=(compressRecord *)paddr->precord;
|
||||
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE
|
||||
|| dbGetFieldIndex(paddr) == indexof(VAL)) {
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -413,7 +418,7 @@ static long get_precision(DBADDR *paddr, long *precision)
|
||||
compressRecord *prec=(compressRecord *)paddr->precord;
|
||||
|
||||
*precision = prec->prec;
|
||||
if(paddr->pfield == (void *)prec->bptr) return(0);
|
||||
if(dbGetFieldIndex(paddr) == indexof(BPTR)) return(0);
|
||||
recGblGetPrec(paddr,precision);
|
||||
return(0);
|
||||
}
|
||||
@@ -422,12 +427,16 @@ static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
|
||||
{
|
||||
compressRecord *prec=(compressRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)prec->bptr
|
||||
|| paddr->pfield==(void *)&prec->ihil
|
||||
|| paddr->pfield==(void *)&prec->ilil){
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
} else recGblGetGraphicDouble(paddr,pgd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(BPTR):
|
||||
case indexof(IHIL):
|
||||
case indexof(ILIL):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -435,11 +444,15 @@ static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
compressRecord *prec=(compressRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)prec->bptr
|
||||
|| paddr->pfield==(void *)&prec->ihil
|
||||
|| paddr->pfield==(void *)&prec->ilil){
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
} else recGblGetControlDouble(paddr,pcd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(BPTR):
|
||||
case indexof(IHIL):
|
||||
case indexof(ILIL):
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -126,73 +126,72 @@ static long process(dfanoutRecord *prec)
|
||||
return(status);
|
||||
}
|
||||
|
||||
#define indexof(field) dfanoutRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr,char *units)
|
||||
{
|
||||
dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
|
||||
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_precision(DBADDR *paddr,long *precision)
|
||||
{
|
||||
dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == dfanoutRecordVAL
|
||||
|| fieldIndex == dfanoutRecordHIHI
|
||||
|| fieldIndex == dfanoutRecordHIGH
|
||||
|| fieldIndex == dfanoutRecordLOW
|
||||
|| fieldIndex == dfanoutRecordLOLO
|
||||
|| fieldIndex == dfanoutRecordHOPR
|
||||
|| fieldIndex == dfanoutRecordLOPR) {
|
||||
*precision = prec->prec;
|
||||
} else {
|
||||
recGblGetPrec(paddr,precision);
|
||||
}
|
||||
*precision = prec->prec;
|
||||
if (dbGetFieldIndex(paddr) == indexof(VAL)) return(0);
|
||||
recGblGetPrec(paddr,precision);
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
|
||||
static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
|
||||
{
|
||||
dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == dfanoutRecordVAL
|
||||
|| fieldIndex == dfanoutRecordHIHI
|
||||
|| fieldIndex == dfanoutRecordHIGH
|
||||
|| fieldIndex == dfanoutRecordLOW
|
||||
|| fieldIndex == dfanoutRecordLOLO
|
||||
|| fieldIndex == dfanoutRecordHOPR
|
||||
|| fieldIndex == dfanoutRecordLOPR) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
} else recGblGetGraphicDouble(paddr,pgd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == dfanoutRecordVAL
|
||||
|| fieldIndex == dfanoutRecordHIHI
|
||||
|| fieldIndex == dfanoutRecordHIGH
|
||||
|| fieldIndex == dfanoutRecordLOW
|
||||
|| fieldIndex == dfanoutRecordLOLO) {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
} else recGblGetControlDouble(paddr,pcd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
static long get_alarm_double(DBADDR *paddr,struct dbr_alDouble *pad)
|
||||
{
|
||||
dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
|
||||
if(fieldIndex == dfanoutRecordVAL) {
|
||||
if(dbGetFieldIndex(paddr) == indexof(VAL)) {
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
|
||||
pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
|
||||
|
||||
@@ -52,7 +52,7 @@ static long special(DBADDR *, int);
|
||||
static long cvt_dbaddr(DBADDR *);
|
||||
static long get_array_info(DBADDR *, long *, long *);
|
||||
#define put_array_info NULL
|
||||
#define get_units NULL
|
||||
static long get_units(DBADDR *, char *);
|
||||
static long get_precision(DBADDR *paddr,long *precision);
|
||||
#define get_enum_str NULL
|
||||
#define get_enum_strs NULL
|
||||
@@ -386,42 +386,71 @@ static long readValue(histogramRecord *prec)
|
||||
return(status);
|
||||
}
|
||||
|
||||
#define indexof(field) histogramRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
if (dbGetFieldIndex(paddr) == indexof(SDEL)) {
|
||||
strcpy(units,"s");
|
||||
}
|
||||
/* We should have EGU for other DOUBLE values or probably get it from input link SVL */
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_precision(DBADDR *paddr,long *precision)
|
||||
{
|
||||
histogramRecord *prec=(histogramRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
*precision = prec->prec;
|
||||
if(fieldIndex == histogramRecordULIM
|
||||
|| fieldIndex == histogramRecordLLIM
|
||||
|| fieldIndex == histogramRecordSDEL
|
||||
|| fieldIndex == histogramRecordSGNL
|
||||
|| fieldIndex == histogramRecordSVAL
|
||||
|| fieldIndex == histogramRecordWDTH) {
|
||||
*precision = prec->prec;
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(ULIM):
|
||||
case indexof(LLIM):
|
||||
case indexof(SGNL):
|
||||
case indexof(SVAL):
|
||||
case indexof(WDTH):
|
||||
*precision = prec->prec;
|
||||
break;
|
||||
case indexof(SDEL):
|
||||
*precision = 2;
|
||||
break;
|
||||
default:
|
||||
recGblGetPrec(paddr,precision);
|
||||
}
|
||||
recGblGetPrec(paddr,precision);
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
|
||||
{
|
||||
histogramRecord *prec=(histogramRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == histogramRecordBPTR){
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
} else recGblGetGraphicDouble(paddr,pgd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(BPTR):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
case indexof(WDTH):
|
||||
pgd->upper_disp_limit = prec->ulim-prec->llim;
|
||||
pgd->lower_disp_limit = 0.0;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
histogramRecord *prec=(histogramRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == histogramRecordBPTR){
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
} else recGblGetControlDouble(paddr,pcd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(BPTR):
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
case indexof(WDTH):
|
||||
pcd->upper_ctrl_limit = prec->ulim-prec->llim;
|
||||
pcd->lower_ctrl_limit = 0.0;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -158,11 +158,15 @@ static long process(longinRecord *prec)
|
||||
return(status);
|
||||
}
|
||||
|
||||
#define indexof(field) longinRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr,char *units)
|
||||
{
|
||||
longinRecord *prec=(longinRecord *)paddr->precord;
|
||||
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
if(paddr->pfldDes->field_type == DBF_LONG) {
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -171,14 +175,22 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
longinRecord *prec=(longinRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)&prec->val
|
||||
|| paddr->pfield==(void *)&prec->hihi
|
||||
|| paddr->pfield==(void *)&prec->high
|
||||
|| paddr->pfield==(void *)&prec->low
|
||||
|| paddr->pfield==(void *)&prec->lolo){
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
} else recGblGetGraphicDouble(paddr,pgd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
case indexof(SVAL):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -186,14 +198,22 @@ static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
longinRecord *prec=(longinRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)&prec->val
|
||||
|| paddr->pfield==(void *)&prec->hihi
|
||||
|| paddr->pfield==(void *)&prec->high
|
||||
|| paddr->pfield==(void *)&prec->low
|
||||
|| paddr->pfield==(void *)&prec->lolo){
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
} else recGblGetControlDouble(paddr,pcd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
case indexof(SVAL):
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -201,7 +221,7 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
longinRecord *prec=(longinRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)&prec->val){
|
||||
if(dbGetFieldIndex(paddr) == indexof(VAL)){
|
||||
pad->upper_alarm_limit = prec->hihi;
|
||||
pad->upper_warning_limit = prec->high;
|
||||
pad->lower_warning_limit = prec->low;
|
||||
|
||||
@@ -190,58 +190,73 @@ static long process(longoutRecord *prec)
|
||||
return(status);
|
||||
}
|
||||
|
||||
#define indexof(field) longoutRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr,char *units)
|
||||
{
|
||||
longoutRecord *prec=(longoutRecord *)paddr->precord;
|
||||
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
if(paddr->pfldDes->field_type == DBF_LONG) {
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
|
||||
{
|
||||
longoutRecord *prec=(longoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == longoutRecordVAL
|
||||
|| fieldIndex == longoutRecordHIHI
|
||||
|| fieldIndex == longoutRecordHIGH
|
||||
|| fieldIndex == longoutRecordLOW
|
||||
|| fieldIndex == longoutRecordLOLO) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
} else recGblGetGraphicDouble(paddr,pgd);
|
||||
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
longoutRecord *prec=(longoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == longoutRecordVAL
|
||||
|| fieldIndex == longoutRecordHIHI
|
||||
|| fieldIndex == longoutRecordHIGH
|
||||
|| fieldIndex == longoutRecordLOW
|
||||
|| fieldIndex == longoutRecordLOLO) {
|
||||
/* do not change pre drvh/drvl behavior */
|
||||
if(prec->drvh > prec->drvl) {
|
||||
pcd->upper_ctrl_limit = prec->drvh;
|
||||
pcd->lower_ctrl_limit = prec->drvl;
|
||||
} else {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
}
|
||||
} else recGblGetControlDouble(paddr,pcd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
/* do not change pre drvh/drvl behavior */
|
||||
if(prec->drvh > prec->drvl) {
|
||||
pcd->upper_ctrl_limit = prec->drvh;
|
||||
pcd->lower_ctrl_limit = prec->drvl;
|
||||
} else {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_alarm_double(DBADDR *paddr,struct dbr_alDouble *pad)
|
||||
{
|
||||
longoutRecord *prec=(longoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if(fieldIndex == longoutRecordVAL) {
|
||||
if(dbGetFieldIndex(paddr) == indexof(VAL)) {
|
||||
pad->upper_alarm_limit = prec->hihi;
|
||||
pad->upper_warning_limit = prec->high;
|
||||
pad->lower_warning_limit = prec->low;
|
||||
|
||||
@@ -132,11 +132,15 @@ static long process(selRecord *prec)
|
||||
}
|
||||
|
||||
|
||||
#define indexof(field) selRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
selRecord *prec=(selRecord *)paddr->precord;
|
||||
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -166,56 +170,68 @@ static long get_precision(DBADDR *paddr, long *precision)
|
||||
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
selRecord *prec=(selRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)&prec->val
|
||||
|| paddr->pfield==(void *)&prec->hihi
|
||||
|| paddr->pfield==(void *)&prec->high
|
||||
|| paddr->pfield==(void *)&prec->low
|
||||
|| paddr->pfield==(void *)&prec->lolo){
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
return(0);
|
||||
int index = dbGetFieldIndex(paddr);
|
||||
|
||||
switch (index) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
#ifdef __GNUC__
|
||||
case indexof(A) ... indexof(L):
|
||||
case indexof(LA) ... indexof(LL):
|
||||
break;
|
||||
default:
|
||||
#else
|
||||
break;
|
||||
default:
|
||||
if((index >= indexof(A) && index <= indexof(L))
|
||||
|| (index >= indexof(LA) && index <= indexof(LL)))
|
||||
break;
|
||||
#endif
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
return(0);
|
||||
}
|
||||
|
||||
if(paddr->pfield>=(void *)&prec->a && paddr->pfield<=(void *)&prec->l){
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
return(0);
|
||||
}
|
||||
if(paddr->pfield>=(void *)&prec->la && paddr->pfield<=(void *)&prec->ll){
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
return(0);
|
||||
}
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_control_double(struct dbAddr *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
selRecord *prec=(selRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)&prec->val
|
||||
|| paddr->pfield==(void *)&prec->hihi
|
||||
|| paddr->pfield==(void *)&prec->high
|
||||
|| paddr->pfield==(void *)&prec->low
|
||||
|| paddr->pfield==(void *)&prec->lolo){
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
return(0);
|
||||
int index = dbGetFieldIndex(paddr);
|
||||
|
||||
switch (index) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
#ifdef __GNUC__
|
||||
case indexof(A) ... indexof(L):
|
||||
case indexof(LA) ... indexof(LL):
|
||||
break;
|
||||
default:
|
||||
#else
|
||||
break;
|
||||
default:
|
||||
if((index >= indexof(A) && index <= indexof(L))
|
||||
|| (index >= indexof(LA) && index <= indexof(LL)))
|
||||
break;
|
||||
#endif
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
return(0);
|
||||
}
|
||||
|
||||
if(paddr->pfield>=(void *)&prec->a && paddr->pfield<=(void *)&prec->l){
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
return(0);
|
||||
}
|
||||
if(paddr->pfield>=(void *)&prec->la && paddr->pfield<=(void *)&prec->ll){
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
return(0);
|
||||
}
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -223,7 +239,7 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
selRecord *prec=(selRecord *)paddr->precord;
|
||||
|
||||
if(paddr->pfield==(void *)&prec->val ){
|
||||
if(dbGetFieldIndex(paddr) == indexof(VAL)) {
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
|
||||
pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
|
||||
/*
|
||||
* $Revision-Id$
|
||||
*
|
||||
@@ -39,34 +39,48 @@
|
||||
|
||||
int seqRecDebug = 0;
|
||||
|
||||
/* Create RSET - Record Support Entry Table*/
|
||||
static long init_record(seqRecord *prec, int pass);
|
||||
static long process(seqRecord *prec);
|
||||
static int processNextLink(seqRecord *prec);
|
||||
static long asyncFinish(seqRecord *prec);
|
||||
static void processCallback(CALLBACK *arg);
|
||||
static long get_precision(dbAddr *paddr, long *pprecision);
|
||||
|
||||
/* Create RSET - Record Support Entry Table*/
|
||||
#define report NULL
|
||||
#define initialize NULL
|
||||
static long init_record(seqRecord *prec, int pass);
|
||||
static long process(seqRecord *prec);
|
||||
#define special NULL
|
||||
#define get_value NULL
|
||||
#define cvt_dbaddr NULL
|
||||
#define get_array_info NULL
|
||||
#define put_array_info NULL
|
||||
static long get_units(DBADDR *, char *);
|
||||
static long get_precision(dbAddr *paddr, long *);
|
||||
#define get_enum_str NULL
|
||||
#define get_enum_strs NULL
|
||||
#define put_enum_str NULL
|
||||
static long get_graphic_double(DBADDR *, struct dbr_grDouble *);
|
||||
static long get_control_double(DBADDR *, struct dbr_ctrlDouble *);
|
||||
static long get_alarm_double(DBADDR *, struct dbr_alDouble *);
|
||||
|
||||
rset seqRSET={
|
||||
RSETNUMBER,
|
||||
NULL, /* report */
|
||||
NULL, /* initialize */
|
||||
report, /* report */
|
||||
initialize, /* initialize */
|
||||
init_record, /* init_record */
|
||||
process, /* process */
|
||||
NULL, /* special */
|
||||
NULL, /* get_value */
|
||||
NULL, /* cvt_dbaddr */
|
||||
NULL, /* get_array_info */
|
||||
NULL, /* put_array_info */
|
||||
NULL, /* get_units */
|
||||
special, /* special */
|
||||
get_value, /* get_value */
|
||||
cvt_dbaddr, /* cvt_dbaddr */
|
||||
get_array_info, /* get_array_info */
|
||||
put_array_info, /* put_array_info */
|
||||
get_units, /* get_units */
|
||||
get_precision, /* get_precision */
|
||||
NULL, /* get_enum_str */
|
||||
NULL, /* get_enum_strs */
|
||||
NULL, /* put_enum_str */
|
||||
NULL, /* get_graphic_double */
|
||||
NULL, /* get_control_double */
|
||||
NULL /* get_alarm_double */
|
||||
|
||||
get_enum_str, /* get_enum_str */
|
||||
get_enum_strs, /* get_enum_strs */
|
||||
put_enum_str, /* put_enum_str */
|
||||
get_graphic_double, /* get_graphic_double */
|
||||
get_control_double, /* get_control_double */
|
||||
get_alarm_double /* get_alarm_double */
|
||||
};
|
||||
epicsExportAddress(rset,seqRSET);
|
||||
|
||||
@@ -406,15 +420,91 @@ static void processCallback(CALLBACK *arg)
|
||||
* Return the precision value from PREC
|
||||
*
|
||||
*****************************************************************************/
|
||||
#define indexof(field) seqRecord##field
|
||||
#define get_dol(prec, fieldOffset) \
|
||||
&((linkDesc*)&prec->dly1)[fieldOffset>>2].dol
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
|
||||
if (fieldOffset >= 0) switch (fieldOffset & 2) {
|
||||
case 0: /* DLYn */
|
||||
strcpy(units, "s");
|
||||
break;
|
||||
case 2: /* DOn */
|
||||
dbGetUnits(get_dol(prec, fieldOffset),
|
||||
units, DB_UNITS_SIZE);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_precision(dbAddr *paddr, long *pprecision)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
short precision;
|
||||
|
||||
if (fieldOffset >= 0) switch (fieldOffset & 2) {
|
||||
case 0: /* DLYn */
|
||||
*pprecision = 2;
|
||||
return 0;
|
||||
case 2: /* DOn */
|
||||
if (dbGetPrecision(get_dol(prec, fieldOffset),
|
||||
&precision) == 0) {
|
||||
*pprecision = precision;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
*pprecision = prec->prec;
|
||||
|
||||
if(paddr->pfield < (void *)&prec->val)
|
||||
return 0; /* Field is NOT in dbCommon */
|
||||
|
||||
recGblGetPrec(paddr, pprecision); /* Field is in dbCommon */
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
|
||||
if (fieldOffset >= 0) switch (fieldOffset & 2) {
|
||||
case 0: /* DLYn */
|
||||
pgd->lower_disp_limit = 0.0;
|
||||
pgd->lower_disp_limit = 10.0;
|
||||
return 0;
|
||||
case 2: /* DOn */
|
||||
dbGetGraphicLimits(get_dol(prec, fieldOffset),
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
return 0;
|
||||
}
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
if (fieldOffset >= 0 && (fieldOffset & 2) == 0) /* DLYn */
|
||||
pcd->lower_ctrl_limit = 0.0;
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
|
||||
if (fieldOffset >= 0 && (fieldOffset & 2) == 2) /* DOn */
|
||||
dbGetAlarmLimits(get_dol(prec, fieldOffset),
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
else
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -200,25 +200,30 @@ static long put_array_info(DBADDR *paddr, long nNew)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define indexof(field) subArrayRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
subArrayRecord *prec = (subArrayRecord *) paddr->precord;
|
||||
|
||||
strncpy(units, prec->egu, DB_UNITS_SIZE);
|
||||
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
|
||||
break;
|
||||
case indexof(HOPR):
|
||||
case indexof(LOPR):
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_precision(DBADDR *paddr, long *precision)
|
||||
{
|
||||
subArrayRecord *prec = (subArrayRecord *) paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
*precision = prec->prec;
|
||||
|
||||
if (fieldIndex != subArrayRecordVAL)
|
||||
if (dbGetFieldIndex(paddr) != indexof(VAL))
|
||||
recGblGetPrec(paddr, precision);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -227,25 +232,29 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
subArrayRecord *prec = (subArrayRecord *) paddr->precord;
|
||||
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case subArrayRecordVAL:
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
|
||||
case subArrayRecordINDX:
|
||||
pgd->upper_disp_limit = prec->malm - 1;
|
||||
pgd->lower_disp_limit = 0;
|
||||
break;
|
||||
|
||||
case subArrayRecordNELM:
|
||||
pgd->upper_disp_limit = prec->malm;
|
||||
pgd->lower_disp_limit = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr, pgd);
|
||||
case indexof(VAL):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
case indexof(INDX):
|
||||
pgd->upper_disp_limit = prec->malm - 1;
|
||||
pgd->lower_disp_limit = 0;
|
||||
break;
|
||||
case indexof(NELM):
|
||||
pgd->upper_disp_limit = prec->malm;
|
||||
pgd->lower_disp_limit = 0;
|
||||
break;
|
||||
case indexof(NORD):
|
||||
pgd->upper_disp_limit = prec->malm;
|
||||
pgd->lower_disp_limit = 0;
|
||||
break;
|
||||
case indexof(BUSY):
|
||||
pgd->upper_disp_limit = 1;
|
||||
pgd->lower_disp_limit = 0;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr, pgd);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -254,25 +263,29 @@ static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
subArrayRecord *prec = (subArrayRecord *) paddr->precord;
|
||||
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case subArrayRecordVAL:
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
|
||||
case subArrayRecordINDX:
|
||||
pcd->upper_ctrl_limit = prec->malm - 1;
|
||||
pcd->lower_ctrl_limit = 0;
|
||||
break;
|
||||
|
||||
case subArrayRecordNELM:
|
||||
pcd->upper_ctrl_limit = prec->malm;
|
||||
pcd->lower_ctrl_limit = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
recGblGetControlDouble(paddr, pcd);
|
||||
case indexof(VAL):
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
case indexof(INDX):
|
||||
pcd->upper_ctrl_limit = prec->malm - 1;
|
||||
pcd->lower_ctrl_limit = 0;
|
||||
break;
|
||||
case indexof(NELM):
|
||||
pcd->upper_ctrl_limit = prec->malm;
|
||||
pcd->lower_ctrl_limit = 1;
|
||||
break;
|
||||
case indexof(NORD):
|
||||
pcd->upper_ctrl_limit = prec->malm;
|
||||
pcd->lower_ctrl_limit = 0;
|
||||
break;
|
||||
case indexof(BUSY):
|
||||
pcd->upper_ctrl_limit = 1;
|
||||
pcd->lower_ctrl_limit = 0;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr, pcd);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -191,54 +191,79 @@ static long special(DBADDR *paddr, int after)
|
||||
return S_db_BadSub;
|
||||
}
|
||||
|
||||
#define indexof(field) subRecord##field
|
||||
|
||||
static long get_linkNumber(int fieldIndex) {
|
||||
if (fieldIndex >= indexof(A) && fieldIndex <= indexof(L))
|
||||
return fieldIndex - indexof(A);
|
||||
if (fieldIndex >= indexof(LA) && fieldIndex <= indexof(LL))
|
||||
return fieldIndex - indexof(LA);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
subRecord *prec = (subRecord *)paddr->precord;
|
||||
int linkNumber;
|
||||
|
||||
strncpy(units, prec->egu, DB_UNITS_SIZE);
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
|
||||
linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
|
||||
if (linkNumber >= 0)
|
||||
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
else
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_precision(DBADDR *paddr, long *precision)
|
||||
static long get_precision(DBADDR *paddr, long *pprecision)
|
||||
{
|
||||
subRecord *prec = (subRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
*precision = prec->prec;
|
||||
if (fieldIndex != subRecordVAL)
|
||||
recGblGetPrec(paddr, precision);
|
||||
|
||||
*pprecision = prec->prec;
|
||||
if (fieldIndex == indexof(VAL)) {
|
||||
return 0;
|
||||
}
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
short precision;
|
||||
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
|
||||
*pprecision = precision;
|
||||
else
|
||||
*pprecision = 15;
|
||||
} else
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
subRecord *prec = (subRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
int linkNumber;
|
||||
|
||||
switch (fieldIndex) {
|
||||
case subRecordVAL:
|
||||
case subRecordHIHI: case subRecordHIGH:
|
||||
case subRecordLOW: case subRecordLOLO:
|
||||
case subRecordA: case subRecordB:
|
||||
case subRecordC: case subRecordD:
|
||||
case subRecordE: case subRecordF:
|
||||
case subRecordG: case subRecordH:
|
||||
case subRecordI: case subRecordJ:
|
||||
case subRecordK: case subRecordL:
|
||||
case subRecordLA: case subRecordLB:
|
||||
case subRecordLC: case subRecordLD:
|
||||
case subRecordLE: case subRecordLF:
|
||||
case subRecordLG: case subRecordLH:
|
||||
case subRecordLI: case subRecordLJ:
|
||||
case subRecordLK: case subRecordLL:
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr, pgd);
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
break;
|
||||
default:
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetGraphicLimits(&prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
} else
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -246,24 +271,21 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
subRecord *prec = (subRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
switch (fieldIndex) {
|
||||
case subRecordVAL:
|
||||
case subRecordHIHI: case subRecordHIGH:
|
||||
case subRecordLOW: case subRecordLOLO:
|
||||
case subRecordA: case subRecordB:
|
||||
case subRecordC: case subRecordD:
|
||||
case subRecordE: case subRecordF:
|
||||
case subRecordG: case subRecordH:
|
||||
case subRecordI: case subRecordJ:
|
||||
case subRecordK: case subRecordL:
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
|
||||
default:
|
||||
recGblGetControlDouble(paddr, pcd);
|
||||
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
case indexof(HIHI):
|
||||
case indexof(HIGH):
|
||||
case indexof(LOW):
|
||||
case indexof(LOLO):
|
||||
case indexof(LALM):
|
||||
case indexof(ALST):
|
||||
case indexof(MLST):
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr,pcd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -272,6 +294,7 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
subRecord *prec = (subRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
|
||||
if (fieldIndex == subRecordVAL) {
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
@@ -279,7 +302,15 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
|
||||
pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
|
||||
} else {
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetAlarmLimits(&prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
} else
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -194,25 +194,30 @@ static long put_array_info(DBADDR *paddr, long nNew)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define indexof(field) waveformRecord##field
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
waveformRecord *prec = (waveformRecord *) paddr->precord;
|
||||
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
|
||||
break;
|
||||
case indexof(HOPR):
|
||||
case indexof(LOPR):
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_precision(DBADDR *paddr, long *precision)
|
||||
{
|
||||
waveformRecord *prec = (waveformRecord *) paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
*precision = prec->prec;
|
||||
|
||||
if (fieldIndex != waveformRecordVAL)
|
||||
if (dbGetFieldIndex(paddr) != indexof(VAL))
|
||||
recGblGetPrec(paddr, precision);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -220,11 +225,22 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
waveformRecord *prec = (waveformRecord *) paddr->precord;
|
||||
|
||||
if (dbGetFieldIndex(paddr) == waveformRecordVAL) {
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
} else
|
||||
recGblGetGraphicDouble(paddr, pgd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
pgd->upper_disp_limit = prec->hopr;
|
||||
pgd->lower_disp_limit = prec->lopr;
|
||||
break;
|
||||
case indexof(BUSY):
|
||||
pgd->upper_disp_limit = 1;
|
||||
pgd->lower_disp_limit = 0;
|
||||
break;
|
||||
case indexof(NORD):
|
||||
pgd->upper_disp_limit = prec->nelm;
|
||||
pgd->lower_disp_limit = 0;
|
||||
break;
|
||||
default:
|
||||
recGblGetGraphicDouble(paddr, pgd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -232,11 +248,22 @@ static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
waveformRecord *prec = (waveformRecord *) paddr->precord;
|
||||
|
||||
if (dbGetFieldIndex(paddr) == waveformRecordVAL) {
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
} else
|
||||
recGblGetControlDouble(paddr, pcd);
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
pcd->upper_ctrl_limit = prec->hopr;
|
||||
pcd->lower_ctrl_limit = prec->lopr;
|
||||
break;
|
||||
case indexof(BUSY):
|
||||
pcd->upper_ctrl_limit = 1;
|
||||
pcd->lower_ctrl_limit = 0;
|
||||
break;
|
||||
case indexof(NORD):
|
||||
pcd->upper_ctrl_limit = prec->nelm;
|
||||
pcd->lower_ctrl_limit = 0;
|
||||
break;
|
||||
default:
|
||||
recGblGetControlDouble(paddr, pcd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user