32 #include "menuYesNo.h" 36 #define GEN_SIZE_OFFSET 37 #include "int64outRecord.h" 38 #undef GEN_SIZE_OFFSET 43 #define initialize NULL 45 static long process(dbCommon *);
46 static long special(DBADDR *,
int);
47 #define get_value NULL 48 #define cvt_dbaddr NULL 49 #define get_array_info NULL 50 #define put_array_info NULL 52 #define get_precision NULL 53 #define get_enum_str NULL 54 #define get_enum_strs NULL 55 #define put_enum_str NULL 83 static void checkAlarms(int64outRecord *
prec);
84 static void monitor(int64outRecord *
prec);
85 static long writeValue(int64outRecord *
prec);
89 static long init_record(dbCommon *pcommon,
int pass)
91 int64outRecord *
prec = (int64outRecord*)pcommon;
95 if (pass == 0)
return 0;
97 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
99 if(!(pdset = (int64outdset *)(prec->dset))) {
100 recGblRecordError(
S_dev_noDSET,(
void *)prec,
"int64out: init_record");
104 if ((pdset->common.number < 5) || (pdset->write_int64out ==
NULL)) {
109 if(recGblInitConstantLink(&prec->dol,
DBF_INT64,&prec->val))
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 int64outRecord *
prec = (int64outRecord*)pcommon;
124 int64outdset *pdset = (int64outdset *)(prec->dset);
127 unsigned char pact=prec->pact;
129 if( (pdset==
NULL) || (pdset->write_int64out==
NULL) ) {
136 && (prec->omsl == menuOmslclosed_loop)) {
137 status = dbGetLink(&(prec->dol),
DBR_INT64,
145 if (!status) convert(prec,value);
152 status=writeValue(prec);
154 switch (prec->ivoa) {
155 case (menuIvoaContinue_normally) :
156 status=writeValue(prec);
158 case (menuIvoaDon_t_drive_outputs) :
160 case (menuIvoaSet_output_to_IVOV) :
161 if(prec->pact ==
FALSE){
162 prec->val=prec->ivov;
164 status=writeValue(prec);
168 recGblRecordError(S_db_badField,(
void *)prec,
169 "int64out:process Illegal IVOA field");
174 if ( !pact && prec->pact )
return(0);
177 recGblGetTimeStampSimm(prec, prec->simm,
NULL);
189 static long special(DBADDR *paddr,
int after)
191 int64outRecord *
prec = (int64outRecord *)(paddr->precord);
192 int special_type = paddr->special;
194 switch(special_type) {
196 if (dbGetFieldIndex(paddr) == int64outRecordSIMM) {
198 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
200 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
204 recGblDbaddrError(S_db_badChoice, paddr,
"int64out: special");
205 return(S_db_badChoice);
209 #define indexof(field) int64outRecord##field 211 static long get_units(DBADDR *paddr,
char *units)
213 int64outRecord *
prec=(int64outRecord *)paddr->precord;
215 if(paddr->pfldDes->field_type ==
DBF_INT64) {
216 strncpy(units,prec->egu,DB_UNITS_SIZE);
223 int64outRecord *
prec=(int64outRecord *)paddr->precord;
225 switch (dbGetFieldIndex(paddr)) {
234 pgd->upper_disp_limit = prec->hopr;
235 pgd->lower_disp_limit = prec->lopr;
238 recGblGetGraphicDouble(paddr,pgd);
245 int64outRecord *
prec=(int64outRecord *)paddr->precord;
247 switch (dbGetFieldIndex(paddr)) {
257 if(prec->drvh > prec->drvl) {
258 pcd->upper_ctrl_limit = prec->drvh;
259 pcd->lower_ctrl_limit = prec->drvl;
261 pcd->upper_ctrl_limit = prec->hopr;
262 pcd->lower_ctrl_limit = prec->lopr;
266 recGblGetControlDouble(paddr,pcd);
273 int64outRecord *
prec=(int64outRecord *)paddr->precord;
275 if(dbGetFieldIndex(paddr) ==
indexof(VAL)) {
276 pad->upper_alarm_limit = prec->hihi;
277 pad->upper_warning_limit = prec->high;
278 pad->lower_warning_limit = prec->low;
279 pad->lower_alarm_limit = prec->lolo;
280 }
else recGblGetAlarmDouble(paddr,pad);
284 static void checkAlarms(int64outRecord *
prec)
291 recGblSetSevr(prec,
UDF_ALARM, prec->udfs);
302 if (asev && (val >= alev || ((lalm == alev) && (val >= alev - hyst)))) {
311 if (asev && (val <= alev || ((lalm == alev) && (val <= alev + hyst)))) {
320 if (asev && (val >= alev || ((lalm == alev) && (val >= alev - hyst)))) {
329 if (asev && (val <= alev || ((lalm == alev) && (val <= alev + hyst)))) {
330 if (recGblSetSevr(prec,
LOW_ALARM, asev))
342 #define DELTA(last, val) \ 343 ((epicsUInt64) ((last) > (val) ? (last) - (val) : (val) - (last))) 345 static void monitor(int64outRecord *
prec)
347 unsigned short monitor_mask = recGblResetAlarms(prec);
349 if (prec->mdel < 0 ||
354 prec->mlst = prec->val;
357 if (prec->adel < 0 ||
362 prec->alst = prec->val;
367 db_post_events(prec, &prec->val, monitor_mask);
370 static long writeValue(int64outRecord *
prec)
372 int64outdset *pdset = (int64outdset *) prec->dset;
376 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
380 switch (prec->simm) {
382 status = pdset->write_int64out(prec);
387 if (prec->pact || (prec->sdly < 0.)) {
391 epicsCallback *pvt = prec->simpvt;
393 pvt = calloc(1,
sizeof(epicsCallback));
396 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
414 if (value >
prec->drvh) value =
prec->drvh;
epicsExportAddress(rset, int64outRSET)
#define RTN_SUCCESS(STATUS)
Miscellaneous macro definitions.
unsigned long long epicsUInt64
#define get_control_double
#define get_graphic_double