diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html index 9cd899604..4ec06ada0 100644 --- a/documentation/RELEASE_NOTES.html +++ b/documentation/RELEASE_NOTES.html @@ -15,6 +15,14 @@ EPICS Base 3.15.0.x releases are not intended for use in production systems.

Changes between 3.14.x and 3.15.0.x

+

Attributes of Non-VAL Fields

+ +

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. +

Changes to epicsVersion.h

diff --git a/src/std/rec/aSubRecord.c b/src/std/rec/aSubRecord.c index 24447cee3..1c033b3ba 100644 --- a/src/std/rec/aSubRecord.c +++ b/src/std/rec/aSubRecord.c @@ -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) { diff --git a/src/std/rec/aaiRecord.c b/src/std/rec/aaiRecord.c index 5c88791c4..428916de9 100644 --- a/src/std/rec/aaiRecord.c +++ b/src/std/rec/aaiRecord.c @@ -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; } diff --git a/src/std/rec/aaoRecord.c b/src/std/rec/aaoRecord.c index 695f8e1b1..46c837310 100644 --- a/src/std/rec/aaoRecord.c +++ b/src/std/rec/aaoRecord.c @@ -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; } diff --git a/src/std/rec/aiRecord.c b/src/std/rec/aiRecord.c index 343d62126..158456e88 100644 --- a/src/std/rec/aiRecord.c +++ b/src/std/rec/aiRecord.c @@ -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; diff --git a/src/std/rec/aoRecord.c b/src/std/rec/aoRecord.c index 5f8436ab2..5b77b607e 100644 --- a/src/std/rec/aoRecord.c +++ b/src/std/rec/aoRecord.c @@ -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; diff --git a/src/std/rec/boRecord.c b/src/std/rec/boRecord.c index 5248bd661..e0e361c6f 100644 --- a/src/std/rec/boRecord.c +++ b/src/std/rec/boRecord.c @@ -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)); diff --git a/src/std/rec/calcRecord.c b/src/std/rec/calcRecord.c index 722ce0698..85e66f538 100644 --- a/src/std/rec/calcRecord.c +++ b/src/std/rec/calcRecord.c @@ -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; } diff --git a/src/std/rec/calcoutRecord.c b/src/std/rec/calcoutRecord.c index 062580c76..1e7432465 100644 --- a/src/std/rec/calcoutRecord.c +++ b/src/std/rec/calcoutRecord.c @@ -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; } diff --git a/src/std/rec/compressRecord.c b/src/std/rec/compressRecord.c index 2879852d8..46966dba4 100644 --- a/src/std/rec/compressRecord.c +++ b/src/std/rec/compressRecord.c @@ -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); } diff --git a/src/std/rec/dfanoutRecord.c b/src/std/rec/dfanoutRecord.c index 672c1cccd..4628ab7a6 100644 --- a/src/std/rec/dfanoutRecord.c +++ b/src/std/rec/dfanoutRecord.c @@ -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; diff --git a/src/std/rec/histogramRecord.c b/src/std/rec/histogramRecord.c index e78be26c5..a01dfb2ab 100644 --- a/src/std/rec/histogramRecord.c +++ b/src/std/rec/histogramRecord.c @@ -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); } diff --git a/src/std/rec/longinRecord.c b/src/std/rec/longinRecord.c index 011b6c882..b41bbe506 100644 --- a/src/std/rec/longinRecord.c +++ b/src/std/rec/longinRecord.c @@ -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; diff --git a/src/std/rec/longoutRecord.c b/src/std/rec/longoutRecord.c index d7d53d44f..ba1fa34b9 100644 --- a/src/std/rec/longoutRecord.c +++ b/src/std/rec/longoutRecord.c @@ -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; diff --git a/src/std/rec/selRecord.c b/src/std/rec/selRecord.c index 6bc43c227..514b42d82 100644 --- a/src/std/rec/selRecord.c +++ b/src/std/rec/selRecord.c @@ -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; diff --git a/src/std/rec/seqRecord.c b/src/std/rec/seqRecord.c index 67e2518d8..0394497f7 100644 --- a/src/std/rec/seqRecord.c +++ b/src/std/rec/seqRecord.c @@ -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; +} + diff --git a/src/std/rec/subArrayRecord.c b/src/std/rec/subArrayRecord.c index dc18a6ad3..f40f5ac0c 100644 --- a/src/std/rec/subArrayRecord.c +++ b/src/std/rec/subArrayRecord.c @@ -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; } diff --git a/src/std/rec/subRecord.c b/src/std/rec/subRecord.c index c07de5692..3b7632ecc 100644 --- a/src/std/rec/subRecord.c +++ b/src/std/rec/subRecord.c @@ -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; } diff --git a/src/std/rec/waveformRecord.c b/src/std/rec/waveformRecord.c index 6cd7a05b4..95219a70a 100644 --- a/src/std/rec/waveformRecord.c +++ b/src/std/rec/waveformRecord.c @@ -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; }