22 #include "epicsMath.h" 33 #include "menuYesNo.h" 37 #define GEN_SIZE_OFFSET 38 #include "longoutRecord.h" 39 #undef GEN_SIZE_OFFSET 44 #define initialize NULL 46 static long process(
struct dbCommon *);
47 static long special(DBADDR *,
int);
48 #define get_value NULL 49 #define cvt_dbaddr NULL 50 #define get_array_info NULL 51 #define put_array_info NULL 53 #define get_precision NULL 54 #define get_enum_str NULL 55 #define get_enum_strs NULL 56 #define put_enum_str NULL 83 static void checkAlarms(longoutRecord *
prec);
84 static void monitor(longoutRecord *
prec);
85 static long writeValue(longoutRecord *
prec);
88 static long init_record(
struct dbCommon *pcommon,
int pass)
90 struct longoutRecord *
prec = (
struct longoutRecord *)pcommon;
91 longoutdset *pdset = (longoutdset *) prec->dset;
93 if (pass == 0)
return 0;
95 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
98 recGblRecordError(
S_dev_noDSET, prec,
"longout: init_record");
103 if ((pdset->common.number < 5) || (pdset->write_longout ==
NULL)) {
108 if (recGblInitConstantLink(&prec->dol,
DBF_LONG, &prec->val))
111 if (pdset->common.init_record) {
112 long status = pdset->common.init_record(pcommon);
118 prec->mlst = prec->val;
119 prec->alst = prec->val;
120 prec->lalm = prec->val;
124 static long process(
struct dbCommon *pcommon)
126 struct longoutRecord *
prec = (
struct longoutRecord *)pcommon;
127 longoutdset *pdset = (longoutdset *)(prec->dset);
130 unsigned char pact=prec->pact;
132 if( (pdset==
NULL) || (pdset->write_longout==
NULL) ) {
138 if (!dbLinkIsConstant(&prec->dol) &&
139 prec->omsl == menuOmslclosed_loop) {
140 status = dbGetLink(&prec->dol,
DBR_LONG, &value, 0, 0);
141 if (!dbLinkIsConstant(&prec->dol) && !status)
147 if (!status) convert(prec,value);
154 status=writeValue(prec);
156 switch (prec->ivoa) {
157 case (menuIvoaContinue_normally) :
158 status=writeValue(prec);
160 case (menuIvoaDon_t_drive_outputs) :
162 case (menuIvoaSet_output_to_IVOV) :
163 if(prec->pact ==
FALSE){
164 prec->val=prec->ivov;
166 status=writeValue(prec);
170 recGblRecordError(S_db_badField,(
void *)prec,
171 "longout:process Illegal IVOA field");
176 if ( !pact && prec->pact )
return(0);
179 recGblGetTimeStampSimm(prec, prec->simm,
NULL);
191 static long special(DBADDR *paddr,
int after)
193 longoutRecord *
prec = (longoutRecord *)(paddr->precord);
194 int special_type = paddr->special;
196 switch(special_type) {
198 if (dbGetFieldIndex(paddr) == longoutRecordSIMM) {
200 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
202 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
206 recGblDbaddrError(S_db_badChoice, paddr,
"longout: special");
207 return(S_db_badChoice);
211 #define indexof(field) longoutRecord##field 213 static long get_units(DBADDR *paddr,
char *units)
215 longoutRecord *
prec=(longoutRecord *)paddr->precord;
217 if(paddr->pfldDes->field_type ==
DBF_LONG) {
218 strncpy(units,prec->egu,DB_UNITS_SIZE);
225 longoutRecord *
prec=(longoutRecord *)paddr->precord;
227 switch (dbGetFieldIndex(paddr)) {
236 pgd->upper_disp_limit = prec->hopr;
237 pgd->lower_disp_limit = prec->lopr;
240 recGblGetGraphicDouble(paddr,pgd);
247 longoutRecord *
prec=(longoutRecord *)paddr->precord;
249 switch (dbGetFieldIndex(paddr)) {
259 if(prec->drvh > prec->drvl) {
260 pcd->upper_ctrl_limit = prec->drvh;
261 pcd->lower_ctrl_limit = prec->drvl;
263 pcd->upper_ctrl_limit = prec->hopr;
264 pcd->lower_ctrl_limit = prec->lopr;
268 recGblGetControlDouble(paddr,pcd);
275 longoutRecord *
prec=(longoutRecord *)paddr->precord;
277 if (dbGetFieldIndex(paddr) ==
indexof(VAL)) {
278 pad->upper_alarm_limit = prec->hhsv ? prec->hihi :
epicsNAN;
279 pad->upper_warning_limit = prec->hsv ? prec->high :
epicsNAN;
280 pad->lower_warning_limit = prec->lsv ? prec->low :
epicsNAN;
281 pad->lower_alarm_limit = prec->llsv ? prec->lolo :
epicsNAN;
284 recGblGetAlarmDouble(paddr,pad);
288 static void checkAlarms(longoutRecord *
prec)
295 recGblSetSevr(prec,
UDF_ALARM, prec->udfs);
306 if (asev && (val >= alev || ((lalm == alev) && (val >= alev - hyst)))) {
315 if (asev && (val <= alev || ((lalm == alev) && (val <= alev + hyst)))) {
324 if (asev && (val >= alev || ((lalm == alev) && (val >= alev - hyst)))) {
333 if (asev && (val <= alev || ((lalm == alev) && (val <= alev + hyst)))) {
334 if (recGblSetSevr(prec,
LOW_ALARM, asev))
346 #define DELTA(last, val) \ 347 ((epicsUInt32) ((last) > (val) ? (last) - (val) : (val) - (last))) 349 static void monitor(longoutRecord *
prec)
351 unsigned short monitor_mask = recGblResetAlarms(prec);
353 if (prec->mdel < 0 ||
358 prec->mlst = prec->val;
361 if (prec->adel < 0 ||
366 prec->alst = prec->val;
371 db_post_events(prec, &prec->val, monitor_mask);
374 static long writeValue(longoutRecord *
prec)
376 longoutdset *pdset = (longoutdset *) prec->dset;
380 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
384 switch (prec->simm) {
386 status = pdset->write_longout(prec);
391 if (prec->pact || (prec->sdly < 0.)) {
395 epicsCallback *pvt = prec->simpvt;
397 pvt = calloc(1,
sizeof(epicsCallback));
400 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
418 if (value >
prec->drvh) value =
prec->drvh;
Miscellaneous macro definitions.
#define get_control_double
epicsExportAddress(rset, longoutRSET)
#define get_graphic_double