25 #include "epicsMath.h" 36 #include "menuYesNo.h" 38 #define GEN_SIZE_OFFSET 39 #include "longinRecord.h" 40 #undef GEN_SIZE_OFFSET 44 #define THRESHOLD 0.6321 47 #define initialize NULL 49 static long process(
struct dbCommon *);
50 static long special(DBADDR *,
int);
51 #define get_value NULL 52 #define cvt_dbaddr NULL 53 #define get_array_info NULL 54 #define put_array_info NULL 56 #define get_precision NULL 57 #define get_enum_str NULL 58 #define get_enum_strs NULL 59 #define put_enum_str NULL 87 static void monitor(longinRecord *
prec);
88 static long readValue(longinRecord *
prec);
91 static long init_record(
struct dbCommon *pcommon,
int pass)
93 struct longinRecord *
prec = (
struct longinRecord *)pcommon;
94 longindset *pdset = (longindset *) prec->dset;
96 if (pass == 0)
return 0;
98 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
99 recGblInitConstantLink(&prec->siol,
DBF_LONG, &prec->sval);
102 recGblRecordError(
S_dev_noDSET, prec,
"longin: init_record");
107 if ((pdset->common.number < 5) || (pdset->read_longin ==
NULL)) {
112 if (pdset->common.init_record) {
113 long status = pdset->common.init_record(pcommon);
119 prec->mlst = prec->val;
120 prec->alst = prec->val;
121 prec->lalm = prec->val;
125 static long process(
struct dbCommon *pcommon)
127 struct longinRecord *
prec = (
struct longinRecord *)pcommon;
128 longindset *pdset = (longindset *)(prec->dset);
130 unsigned char pact=prec->pact;
133 if( (pdset==
NULL) || (pdset->read_longin==
NULL) ) {
138 timeLast = prec->time;
140 status=readValue(prec);
142 if ( !pact && prec->pact )
return(0);
145 recGblGetTimeStampSimm(prec, prec->simm, &prec->siol);
147 if (status==0) prec->udf =
FALSE;
150 checkAlarms(prec, &timeLast);
160 static long special(DBADDR *paddr,
int after)
162 longinRecord *
prec = (longinRecord *)(paddr->precord);
163 int special_type = paddr->special;
165 switch(special_type) {
167 if (dbGetFieldIndex(paddr) == longinRecordSIMM) {
169 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
171 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
175 recGblDbaddrError(S_db_badChoice, paddr,
"longin: special");
176 return(S_db_badChoice);
180 #define indexof(field) longinRecord##field 182 static long get_units(DBADDR *paddr,
char *units)
184 longinRecord *
prec=(longinRecord *)paddr->precord;
186 if(paddr->pfldDes->field_type ==
DBF_LONG) {
187 strncpy(units,prec->egu,DB_UNITS_SIZE);
195 longinRecord *
prec=(longinRecord *)paddr->precord;
197 switch (dbGetFieldIndex(paddr)) {
207 pgd->upper_disp_limit = prec->hopr;
208 pgd->lower_disp_limit = prec->lopr;
211 recGblGetGraphicDouble(paddr,pgd);
218 longinRecord *
prec=(longinRecord *)paddr->precord;
220 switch (dbGetFieldIndex(paddr)) {
230 pcd->upper_ctrl_limit = prec->hopr;
231 pcd->lower_ctrl_limit = prec->lopr;
234 recGblGetControlDouble(paddr,pcd);
241 longinRecord *
prec=(longinRecord *)paddr->precord;
243 if (dbGetFieldIndex(paddr) ==
indexof(VAL)){
244 pad->upper_alarm_limit = prec->hhsv ? prec->hihi :
epicsNAN;
245 pad->upper_warning_limit = prec->hsv ? prec->high :
epicsNAN;
246 pad->lower_warning_limit = prec->lsv ? prec->low :
epicsNAN;
247 pad->lower_alarm_limit = prec->llsv ? prec->lolo :
epicsNAN;
250 recGblGetAlarmDouble(paddr,pad);
284 if ((asev =
prec->hhsv) &&
285 (val >= (alev =
prec->hihi) ||
286 ((lalm == alev) && (val >= alev - hyst))))
287 alarmRange = range_Hihi;
289 if ((asev =
prec->llsv) &&
290 (val <= (alev =
prec->lolo) ||
291 ((lalm == alev) && (val <= alev + hyst))))
292 alarmRange = range_Lolo;
294 if ((asev =
prec->hsv) &&
295 (val >= (alev =
prec->high) ||
296 ((lalm == alev) && (val >= alev - hyst))))
297 alarmRange = range_High;
299 if ((asev =
prec->lsv) &&
300 (val <= (alev =
prec->low) ||
301 ((lalm == alev) && (val <= alev + hyst))))
302 alarmRange = range_Low;
306 alarmRange = range_Normal;
316 afvl = (double)alarmRange;
319 double alpha = aftc / (t + aftc);
326 afvl = alpha * afvl +
327 ((afvl > 0) ? (1 - alpha) : (alpha - 1)) * alarmRange;
331 alarmRange = abs((
int)floor(afvl));
332 switch (alarmRange) {
359 if (recGblSetSevr(
prec, range_stat[alarmRange], asev))
369 #define DELTA(last, val) \ 370 ((epicsUInt32) ((last) > (val) ? (last) - (val) : (val) - (last))) 372 static void monitor(longinRecord *
prec)
374 unsigned short monitor_mask = recGblResetAlarms(prec);
376 if (prec->mdel < 0 ||
381 prec->mlst = prec->val;
384 if (prec->adel < 0 ||
389 prec->alst = prec->val;
394 db_post_events(prec, &prec->val, monitor_mask);
397 static long readValue(longinRecord *
prec)
399 longindset *pdset = (longindset *) prec->dset;
403 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
407 switch (prec->simm) {
409 status = pdset->read_longin(prec);
414 if (prec->pact || (prec->sdly < 0.)) {
417 prec->val = prec->sval;
422 epicsCallback *pvt = prec->simpvt;
424 pvt = calloc(1,
sizeof(epicsCallback));
427 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
epicsExportAddress(rset, longinRSET)
Miscellaneous macro definitions.
#define get_control_double
#define NO_ALARM
The NO_ALARM value can be used as both a severity and a status.
EPICS time stamp, for use from C code.
LIBCOM_API double epicsStdCall epicsTimeDiffInSeconds(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
Time difference between left and right in seconds.
#define get_graphic_double