37 #define GEN_SIZE_OFFSET 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 52 #define get_units NULL 53 #define get_precision NULL 55 static long get_enum_strs(
const DBADDR *,
struct dbr_enumStrs *);
57 #define get_graphic_double NULL 58 #define get_control_double NULL 59 #define get_alarm_double NULL 82 static void checkAlarms(biRecord *);
83 static void monitor(biRecord *);
84 static long readValue(biRecord *);
86 static long init_record(
struct dbCommon *pcommon,
int pass)
88 struct biRecord *
prec = (
struct biRecord *)pcommon;
92 if (pass == 0)
return 0;
94 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
95 recGblInitConstantLink(&prec->siol,
DBF_USHORT, &prec->sval);
97 if(!(pdset = (bidset *)(prec->dset))) {
98 recGblRecordError(
S_dev_noDSET,(
void *)prec,
"bi: init_record");
102 if( (pdset->common.number < 5) || (pdset->read_bi ==
NULL) ) {
106 if( pdset->common.init_record ) {
107 if((status=(*pdset->common.init_record)(pcommon)))
return(status);
109 prec->mlst = prec->val;
110 prec->lalm = prec->val;
111 prec->oraw = prec->rval;
115 static long process(
struct dbCommon *pcommon)
117 struct biRecord *
prec = (
struct biRecord *)pcommon;
118 bidset *pdset = (bidset *)(prec->dset);
120 unsigned char pact=prec->pact;
122 if( (pdset==
NULL) || (pdset->read_bi==
NULL) ) {
128 status=readValue(prec);
130 if ( !pact && prec->pact )
return(0);
133 recGblGetTimeStampSimm(prec, prec->simm, &prec->siol);
136 if(prec->rval==0) prec->val =0;
140 else if(status==2) status=0;
152 static long special(DBADDR *paddr,
int after)
154 biRecord *
prec = (biRecord *)(paddr->precord);
155 int special_type = paddr->special;
157 switch(special_type) {
159 if (dbGetFieldIndex(paddr) == biRecordSIMM) {
161 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
163 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
167 recGblDbaddrError(S_db_badChoice, paddr,
"bi: special");
168 return(S_db_badChoice);
172 static long get_enum_str(
const DBADDR *paddr,
char *pstring)
174 biRecord *
prec=(biRecord *)paddr->precord;
176 unsigned short *pfield = (
unsigned short *)paddr->pfield;
179 index = dbGetFieldIndex(paddr);
180 if(index!=biRecordVAL) {
181 strcpy(pstring,
"Illegal_Value");
182 }
else if(*pfield==0) {
183 strncpy(pstring,prec->znam,
sizeof(prec->znam));
184 pstring[
sizeof(prec->znam)] = 0;
185 }
else if(*pfield==1) {
186 strncpy(pstring,prec->onam,
sizeof(prec->onam));
187 pstring[
sizeof(prec->onam)] = 0;
189 strcpy(pstring,
"Illegal_Value");
194 static long get_enum_strs(
const DBADDR *paddr,
struct dbr_enumStrs *pes)
196 biRecord *
prec=(biRecord *)paddr->precord;
199 memset(pes->strs,
'\0',
sizeof(pes->strs));
200 strncpy(pes->strs[0],prec->znam,
sizeof(prec->znam));
201 if(*prec->znam!=0) pes->no_str=1;
202 strncpy(pes->strs[1],prec->onam,
sizeof(prec->onam));
203 if(*prec->onam!=0) pes->no_str=2;
207 static long put_enum_str(
const DBADDR *paddr,
const char *pstring)
209 biRecord *
prec=(biRecord *)paddr->precord;
211 if(strncmp(pstring,prec->znam,
sizeof(prec->znam))==0) prec->val = 0;
212 else if(strncmp(pstring,prec->onam,
sizeof(prec->onam))==0) prec->val = 1;
213 else return(S_db_badChoice);
219 static void checkAlarms(biRecord *
prec)
221 unsigned short val = prec->val;
224 if(prec->udf ==
TRUE){
225 recGblSetSevr(prec,
UDF_ALARM,prec->udfs);
238 if(val == prec->lalm)
return;
239 recGblSetSevr(prec,
COS_ALARM,prec->cosv);
244 static void monitor(biRecord *
prec)
246 unsigned short monitor_mask;
248 monitor_mask = recGblResetAlarms(prec);
250 if (prec->mlst != prec->val){
254 prec->mlst = prec->val;
259 db_post_events(prec,&prec->val,monitor_mask);
261 if(prec->oraw!=prec->rval) {
262 db_post_events(prec,&prec->rval,
264 prec->oraw = prec->rval;
269 static long readValue(biRecord *
prec)
271 bidset *pdset = (bidset *)prec->dset;
275 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
279 switch (prec->simm) {
281 status = pdset->read_bi(prec);
287 if (prec->pact || (prec->sdly < 0.)) {
290 if (prec->simm == menuSimmYES) {
291 prec->val = prec->sval;
294 prec->rval = (
unsigned short) prec->sval;
300 epicsCallback *pvt = prec->simpvt;
302 pvt = calloc(1,
sizeof(epicsCallback));
305 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
Miscellaneous macro definitions.
epicsExportAddress(rset, biRSET)
#define get_control_double
#define get_graphic_double