28 #include "epicsMath.h" 40 #define GEN_SIZE_OFFSET 41 #include "dfanoutRecord.h" 42 #undef GEN_SIZE_OFFSET 47 #define initialize NULL 49 static long process(
struct dbCommon *);
51 #define get_value NULL 52 #define cvt_dbaddr NULL 53 #define get_array_info NULL 54 #define put_array_info NULL 57 #define get_enum_str NULL 58 #define get_enum_strs NULL 59 #define put_enum_str NULL 87 static void checkAlarms(dfanoutRecord *);
88 static void monitor(dfanoutRecord *);
89 static void push_values(dfanoutRecord *);
94 static long init_record(
struct dbCommon *pcommon,
int pass)
96 struct dfanoutRecord *
prec = (
struct dfanoutRecord *)pcommon;
100 recGblInitConstantLink(&prec->sell,
DBF_USHORT, &prec->seln);
103 if (recGblInitConstantLink(&prec->dol,
DBF_DOUBLE, &prec->val))
104 prec->udf =
isnan(prec->val);
109 static long process(
struct dbCommon *pcommon)
111 struct dfanoutRecord *
prec = (
struct dfanoutRecord *)pcommon;
115 !dbLinkIsConstant(&prec->dol) &&
116 prec->omsl == menuOmslclosed_loop) {
117 status = dbGetLink(&prec->dol,
DBR_DOUBLE, &prec->val, 0, 0);
118 if (!dbLinkIsConstant(&prec->dol) && !status)
119 prec->udf =
isnan(prec->val);
122 recGblGetTimeStamp(prec);
124 dbGetLink(&(prec->sell),
DBR_USHORT,&(prec->seln),0,0);
133 #define indexof(field) dfanoutRecord##field 135 static long get_units(DBADDR *paddr,
char *units)
137 dfanoutRecord *
prec=(dfanoutRecord *)paddr->precord;
139 if(paddr->pfldDes->field_type ==
DBF_DOUBLE) {
140 strncpy(units,prec->egu,DB_UNITS_SIZE);
145 static long get_precision(
const DBADDR *paddr,
long *precision)
147 dfanoutRecord *
prec=(dfanoutRecord *)paddr->precord;
149 *precision = prec->prec;
150 if (dbGetFieldIndex(paddr) ==
indexof(VAL))
return(0);
151 recGblGetPrec(paddr,precision);
157 dfanoutRecord *
prec=(dfanoutRecord *)paddr->precord;
159 switch (dbGetFieldIndex(paddr)) {
168 pgd->upper_disp_limit = prec->hopr;
169 pgd->lower_disp_limit = prec->lopr;
172 recGblGetGraphicDouble(paddr,pgd);
179 dfanoutRecord *
prec=(dfanoutRecord *)paddr->precord;
181 switch (dbGetFieldIndex(paddr)) {
186 pcd->upper_ctrl_limit = prec->hopr;
187 pcd->lower_ctrl_limit = prec->lopr;
190 recGblGetControlDouble(paddr,pcd);
196 dfanoutRecord *
prec=(dfanoutRecord *)paddr->precord;
198 if(dbGetFieldIndex(paddr) ==
indexof(VAL)) {
199 pad->upper_alarm_limit = prec->hhsv ? prec->hihi :
epicsNAN;
200 pad->upper_warning_limit = prec->hsv ? prec->high :
epicsNAN;
201 pad->lower_warning_limit = prec->lsv ? prec->low :
epicsNAN;
202 pad->lower_alarm_limit = prec->llsv ? prec->lolo :
epicsNAN;
203 }
else recGblGetAlarmDouble(paddr,pad);
207 static void checkAlarms(dfanoutRecord *
prec)
209 double val, hyst, lalm;
214 recGblSetSevr(prec,
UDF_ALARM, prec->udfs);
225 if (asev && (val >= alev || ((lalm == alev) && (val >= alev - hyst)))) {
234 if (asev && (val <= alev || ((lalm == alev) && (val <= alev + hyst)))) {
243 if (asev && (val >= alev || ((lalm == alev) && (val >= alev - hyst)))) {
252 if (asev && (val <= alev || ((lalm == alev) && (val <= alev + hyst)))) {
253 if (recGblSetSevr(prec,
LOW_ALARM, asev))
263 static void monitor(dfanoutRecord *
prec)
265 unsigned monitor_mask = recGblResetAlarms(prec);
268 recGblCheckDeadband(&prec->mlst, prec->val, prec->mdel, &monitor_mask,
DBE_VALUE);
271 recGblCheckDeadband(&prec->alst, prec->val, prec->adel, &monitor_mask,
DBE_ARCHIVE);
275 db_post_events(prec,&prec->val,monitor_mask);
281 static void push_values(dfanoutRecord *
prec)
286 unsigned short state;
289 case (dfanoutSELM_All):
290 for(i=0, plink=&(prec->outa); i<
OUT_ARG_MAX; i++, plink++) {
291 status=dbPutLink(plink,
DBR_DOUBLE,&(prec->val),1);
295 case (dfanoutSELM_Specified):
300 if(prec->seln==0)
break;
302 plink += (prec->seln -1);
303 status=dbPutLink(plink,
DBR_DOUBLE,&(prec->val),1);
306 case (dfanoutSELM_Mask):
307 if(prec->seln==0)
break;
308 for(i=0, plink=&(prec->outa), state=prec->seln;
310 i++, plink++, state>>=1) {
312 status=dbPutLink(plink,
DBR_DOUBLE,&(prec->val),1);
Miscellaneous macro definitions.
#define get_control_double
epicsExportAddress(rset, dfanoutRSET)
#define get_graphic_double