36 #include "menuYesNo.h" 38 #define GEN_SIZE_OFFSET 40 #undef GEN_SIZE_OFFSET 45 #define initialize NULL 47 static long process(
struct dbCommon *);
48 static long special(DBADDR *,
int);
49 #define get_value NULL 50 #define cvt_dbaddr NULL 51 #define get_array_info NULL 52 #define put_array_info NULL 56 static long get_enum_strs(
const DBADDR *,
struct dbr_enumStrs *);
58 #define get_graphic_double NULL 60 #define get_alarm_double NULL 95 static void checkAlarms(boRecord *);
96 static void monitor(boRecord *);
97 static long writeValue(boRecord *);
99 static void myCallbackFunc(epicsCallback *arg)
104 callbackGetUser(pcallback,arg);
105 prec=(boRecord *)pcallback->
precord;
106 dbScanLock((
struct dbCommon *)
prec);
108 if((prec->val==1) && (prec->high>0)){
111 callbackSetPriority(prec->prio, &pcallback->
callback);
112 callbackRequestDelayed(&pcallback->
callback,(
double)prec->high);
116 dbProcess((
struct dbCommon *)prec);
118 dbScanUnlock((
struct dbCommon *)prec);
121 static long init_record(
struct dbCommon *pcommon,
int pass)
123 struct boRecord *prec = (
struct boRecord *)pcommon;
124 bodset *pdset = (bodset *) prec->dset;
125 unsigned short ival = 0;
129 if (pass == 0)
return 0;
131 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
134 recGblRecordError(
S_dev_noDSET, prec,
"bo: init_record");
139 if ((pdset->common.number < 5) || (pdset->write_bo ==
NULL)) {
145 if (recGblInitConstantLink(&prec->dol,
DBF_USHORT, &ival)) {
151 prec->rpvt = pcallback;
152 callbackSetCallback(myCallbackFunc, &pcallback->
callback);
153 callbackSetUser(pcallback, &pcallback->
callback);
154 pcallback->
precord = (
struct dbCommon *) prec;
156 if (pdset->common.init_record) {
157 status=(*pdset->common.init_record)(pcommon);
159 if(prec->rval==0) prec->val = 0;
164 prec->mlst = prec->val;
166 if ( prec->mask != 0 ) {
167 if(prec->val==0) prec->rval = 0;
168 else prec->rval = prec->mask;
171 prec->mlst = prec->val;
172 prec->lalm = prec->val;
173 prec->oraw = prec->rval;
174 prec->orbv = prec->rbv;
178 static long process(
struct dbCommon *pcommon)
180 struct boRecord *prec = (
struct boRecord *)pcommon;
181 bodset *pdset = (bodset *)(prec->dset);
183 unsigned char pact=prec->pact;
185 if( (pdset==
NULL) || (pdset->write_bo==
NULL) ) {
191 if (!dbLinkIsConstant(&prec->dol) &&
192 prec->omsl == menuOmslclosed_loop) {
196 status=dbGetLink(&prec->dol,
DBR_USHORT, &val,0,0);
207 if ( prec->mask != 0 ) {
208 if(prec->val==0) prec->rval = 0;
209 else prec->rval = prec->mask;
217 status=writeValue(prec);
219 switch (prec->ivoa) {
220 case (menuIvoaContinue_normally) :
221 status=writeValue(prec);
223 case (menuIvoaDon_t_drive_outputs) :
225 case (menuIvoaSet_output_to_IVOV) :
226 if(prec->pact ==
FALSE){
228 prec->val=prec->ivov;
229 if ( prec->mask != 0 ) {
230 if(prec->val==0) prec->rval = 0;
231 else prec->rval = prec->mask;
234 status=writeValue(prec);
238 recGblRecordError(S_db_badField,(
void *)prec,
239 "bo:process Illegal IVOA field");
244 if ( !pact && prec->pact )
return(0);
247 recGblGetTimeStampSimm(prec, prec->simm,
NULL);
249 if((prec->val==1) && (prec->high>0)){
252 callbackSetPriority(prec->prio, &pcallback->
callback);
253 callbackRequestDelayed(&pcallback->
callback,(
double)prec->high);
264 static long special(DBADDR *paddr,
int after)
266 boRecord *prec = (boRecord *)(paddr->precord);
267 int special_type = paddr->special;
269 switch(special_type) {
271 if (dbGetFieldIndex(paddr) == boRecordSIMM) {
273 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
275 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
279 recGblDbaddrError(S_db_badChoice, paddr,
"bo: special");
280 return(S_db_badChoice);
284 #define indexof(field) boRecord##field 286 static long get_units(DBADDR *paddr,
char *units)
288 if(dbGetFieldIndex(paddr) ==
indexof(HIGH))
293 static long get_precision(
const DBADDR *paddr,
long *precision)
295 if(dbGetFieldIndex(paddr) ==
indexof(HIGH))
298 recGblGetPrec(paddr,precision);
304 if(dbGetFieldIndex(paddr) ==
indexof(HIGH)) {
305 pcd->lower_ctrl_limit = 0.0;
308 recGblGetControlDouble(paddr,pcd);
312 static long get_enum_str(
const DBADDR *paddr,
char *pstring)
314 boRecord *prec=(boRecord *)paddr->precord;
316 unsigned short *pfield = (
unsigned short *)paddr->pfield;
319 index = dbGetFieldIndex(paddr);
321 strcpy(pstring,
"Illegal_Value");
322 }
else if(*pfield==0) {
323 strncpy(pstring,prec->znam,
sizeof(prec->znam));
324 pstring[
sizeof(prec->znam)] = 0;
325 }
else if(*pfield==1) {
326 strncpy(pstring,prec->onam,
sizeof(prec->onam));
327 pstring[
sizeof(prec->onam)] = 0;
329 strcpy(pstring,
"Illegal_Value");
334 static long get_enum_strs(
const DBADDR *paddr,
struct dbr_enumStrs *pes)
336 boRecord *prec=(boRecord *)paddr->precord;
340 memset(pes->strs,
'\0',
sizeof(pes->strs));
341 strncpy(pes->strs[0],prec->znam,
sizeof(pes->strs[0]));
342 if(*prec->znam!=0) pes->no_str=1;
343 strncpy(pes->strs[1],prec->onam,
sizeof(pes->strs[1]));
344 if(*prec->onam!=0) pes->no_str=2;
347 static long put_enum_str(
const DBADDR *paddr,
const char *pstring)
349 boRecord *prec=(boRecord *)paddr->precord;
351 if(strncmp(pstring,prec->znam,
sizeof(prec->znam))==0) prec->val = 0;
352 else if(strncmp(pstring,prec->onam,
sizeof(prec->onam))==0) prec->val = 1;
353 else return(S_db_badChoice);
358 static void checkAlarms(boRecord *prec)
360 unsigned short val = prec->val;
363 if(prec->udf ==
TRUE ){
364 recGblSetSevr(prec,
UDF_ALARM,prec->udfs);
375 if(val == prec->lalm)
return;
376 recGblSetSevr(prec,
COS_ALARM,prec->cosv);
381 static void monitor(boRecord *prec)
383 unsigned short monitor_mask;
385 monitor_mask = recGblResetAlarms(prec);
387 if (prec->mlst != prec->val){
391 prec->mlst = prec->val;
396 db_post_events(prec,&prec->val,monitor_mask);
398 if(prec->oraw!=prec->rval) {
399 db_post_events(prec,&prec->rval,
401 prec->oraw = prec->rval;
403 if(prec->orbv!=prec->rbv) {
404 db_post_events(prec,&prec->rbv,
406 prec->orbv = prec->rbv;
411 static long writeValue(boRecord *prec)
413 bodset *pdset = (bodset *) prec->dset;
417 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
418 if (status)
return status;
421 switch (prec->simm) {
423 status = pdset->write_bo(prec);
428 if (prec->pact || (prec->sdly < 0.)) {
429 status = dbPutLink(&prec->siol,
DBR_USHORT, &prec->val, 1);
432 epicsCallback *pvt = prec->simpvt;
434 pvt = calloc(1,
sizeof(epicsCallback));
437 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
#define get_graphic_double
Miscellaneous macro definitions.
#define get_control_double
epicsExportAddress(rset, boRSET)
struct myCallback myCallback
struct dbCommon * precord