35 #include "menuYesNo.h" 37 #define GEN_SIZE_OFFSET 38 #include "int64inRecord.h" 39 #undef GEN_SIZE_OFFSET 43 #define THRESHOLD 0.6321 46 #define initialize NULL 48 static long process(dbCommon *);
49 static long special(DBADDR *,
int);
50 #define get_value NULL 51 #define cvt_dbaddr NULL 52 #define get_array_info NULL 53 #define put_array_info NULL 55 #define get_precision NULL 56 #define get_enum_str NULL 57 #define get_enum_strs NULL 58 #define put_enum_str NULL 87 static void monitor(int64inRecord *
prec);
88 static long readValue(int64inRecord *
prec);
91 static long init_record(dbCommon *pcommon,
int pass)
93 int64inRecord *
prec = (int64inRecord*)pcommon;
97 if (pass == 0)
return 0;
100 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
101 recGblInitConstantLink(&prec->siol,
DBF_INT64, &prec->sval);
103 if(!(pdset = (int64indset *)(prec->dset))) {
104 recGblRecordError(
S_dev_noDSET,(
void *)prec,
"int64in: init_record");
108 if ((pdset->common.number < 5) || (pdset->read_int64in ==
NULL)) {
112 if (pdset->common.init_record) {
113 if ((status = pdset->common.init_record(pcommon)))
return status;
115 prec->mlst = prec->val;
116 prec->alst = prec->val;
117 prec->lalm = prec->val;
121 static long process(dbCommon *pcommon)
123 int64inRecord *
prec = (int64inRecord*)pcommon;
124 int64indset *pdset = (int64indset *)(prec->dset);
126 unsigned char pact=prec->pact;
129 if( (pdset==
NULL) || (pdset->read_int64in==
NULL) ) {
134 timeLast = prec->time;
136 status=readValue(prec);
138 if ( !pact && prec->pact )
return(0);
141 recGblGetTimeStampSimm(prec, prec->simm, &prec->siol);
143 if (status==0) prec->udf =
FALSE;
146 checkAlarms(prec, &timeLast);
156 static long special(DBADDR *paddr,
int after)
158 int64inRecord *
prec = (int64inRecord *)(paddr->precord);
159 int special_type = paddr->special;
161 switch(special_type) {
163 if (dbGetFieldIndex(paddr) == int64inRecordSIMM) {
165 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
167 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
171 recGblDbaddrError(S_db_badChoice, paddr,
"int64in: special");
172 return(S_db_badChoice);
176 #define indexof(field) int64inRecord##field 178 static long get_units(DBADDR *paddr,
char *units)
180 int64inRecord *
prec = (int64inRecord *) paddr->precord;
183 strncpy(units, prec->egu, DB_UNITS_SIZE);
190 int64inRecord *
prec=(int64inRecord *)paddr->precord;
192 switch (dbGetFieldIndex(paddr)) {
202 pgd->upper_disp_limit = prec->hopr;
203 pgd->lower_disp_limit = prec->lopr;
206 recGblGetGraphicDouble(paddr,pgd);
213 int64inRecord *
prec=(int64inRecord *)paddr->precord;
215 switch (dbGetFieldIndex(paddr)) {
225 pcd->upper_ctrl_limit = prec->hopr;
226 pcd->lower_ctrl_limit = prec->lopr;
229 recGblGetControlDouble(paddr,pcd);
236 int64inRecord *
prec=(int64inRecord *)paddr->precord;
238 if(dbGetFieldIndex(paddr) ==
indexof(VAL)){
239 pad->upper_alarm_limit = prec->hihi;
240 pad->upper_warning_limit = prec->high;
241 pad->lower_warning_limit = prec->low;
242 pad->lower_alarm_limit = prec->lolo;
243 }
else recGblGetAlarmDouble(paddr,pad);
277 if ((asev =
prec->hhsv) &&
278 (val >= (alev =
prec->hihi) ||
279 ((lalm == alev) && (val >= alev - hyst))))
280 alarmRange = range_Hihi;
282 if ((asev =
prec->llsv) &&
283 (val <= (alev =
prec->lolo) ||
284 ((lalm == alev) && (val <= alev + hyst))))
285 alarmRange = range_Lolo;
287 if ((asev =
prec->hsv) &&
288 (val >= (alev =
prec->high) ||
289 ((lalm == alev) && (val >= alev - hyst))))
290 alarmRange = range_High;
292 if ((asev =
prec->lsv) &&
293 (val <= (alev =
prec->low) ||
294 ((lalm == alev) && (val <= alev + hyst))))
295 alarmRange = range_Low;
299 alarmRange = range_Normal;
309 afvl = (double)alarmRange;
312 double alpha = aftc / (t + aftc);
319 afvl = alpha * afvl +
320 ((afvl > 0) ? (1 - alpha) : (alpha - 1)) * alarmRange;
324 alarmRange = abs((
int)floor(afvl));
325 switch (alarmRange) {
352 if (recGblSetSevr(
prec, range_stat[alarmRange], asev))
362 #define DELTA(last, val) \ 363 ((epicsUInt32) ((last) > (val) ? (last) - (val) : (val) - (last))) 365 static void monitor(int64inRecord *
prec)
367 unsigned short monitor_mask = recGblResetAlarms(prec);
369 if (prec->mdel < 0 ||
374 prec->mlst = prec->val;
377 if (prec->adel < 0 ||
382 prec->alst = prec->val;
387 db_post_events(prec, &prec->val, monitor_mask);
390 static long readValue(int64inRecord *
prec)
392 int64indset *pdset = (int64indset *) prec->dset;
396 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
400 switch (prec->simm) {
402 status = pdset->read_int64in(prec);
407 if (prec->pact || (prec->sdly < 0.)) {
410 prec->val = prec->sval;
415 epicsCallback *pvt = prec->simpvt;
417 pvt = calloc(1,
sizeof(epicsCallback));
420 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
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.
epicsExportAddress(rset, int64inRSET)
LIBCOM_API double epicsStdCall epicsTimeDiffInSeconds(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
Time difference between left and right in seconds.
#define get_graphic_double