36 #include "menuYesNo.h" 38 #define GEN_SIZE_OFFSET 39 #include "mbboDirectRecord.h" 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 53 #define get_units NULL 55 #define get_enum_str NULL 56 #define get_enum_strs NULL 57 #define put_enum_str NULL 58 #define get_graphic_double NULL 59 #define get_control_double NULL 60 #define get_alarm_double NULL 84 static void convert(mbboDirectRecord *);
85 static void monitor(mbboDirectRecord *);
86 static long writeValue(mbboDirectRecord *);
90 static long init_record(
struct dbCommon *pcommon,
int pass)
92 struct mbboDirectRecord *
prec = (
struct mbboDirectRecord *)pcommon;
93 mbbodirectdset *pdset = (mbbodirectdset *) prec->dset;
96 if (pass == 0)
return 0;
99 recGblRecordError(
S_dev_noDSET, prec,
"mbboDirect: init_record");
103 if ((pdset->common.number < 5) || (pdset->write_mbbo ==
NULL)) {
108 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
110 if (recGblInitConstantLink(&prec->dol,
DBF_ULONG, &prec->val))
114 if (prec->mask == 0 && prec->nobt <= 32)
117 if (pdset->common.init_record) {
118 status = pdset->common.init_record(pcommon);
134 prec->omsl == menuOmslsupervisory) {
141 *pBn++ = !! (val & 1);
146 prec->mlst = prec->val;
147 prec->oraw = prec->rval;
148 prec->orbv = prec->rbv;
152 static long process(
struct dbCommon *pcommon)
154 struct mbboDirectRecord *
prec = (
struct mbboDirectRecord *)pcommon;
155 mbbodirectdset *pdset = (mbbodirectdset *)(prec->dset);
157 int pact = prec->pact;
159 if ((pdset ==
NULL) || (pdset->write_mbbo ==
NULL)) {
166 if (!dbLinkIsConstant(&prec->dol) &&
167 prec->omsl == menuOmslclosed_loop) {
170 if (dbGetLink(&prec->dol,
DBR_ULONG, &val, 0, 0)) {
176 else if (prec->omsl == menuOmslsupervisory) {
183 for (i = 0; i <
NUM_BITS; i++, bit <<= 1)
188 else if (prec->udf) {
189 recGblSetSevr(prec,
UDF_ALARM, prec->udfs);
200 status = writeValue(prec);
202 switch (prec->ivoa) {
203 case menuIvoaSet_output_to_IVOV:
205 prec->val = prec->ivov;
209 case menuIvoaContinue_normally:
210 status = writeValue(prec);
212 case menuIvoaDon_t_drive_outputs:
216 recGblRecordError(S_db_badField, prec,
217 "mbboDirect: process Illegal IVOA field");
222 if (!pact && prec->pact)
226 recGblGetTimeStampSimm(prec, prec->simm,
NULL);
236 static long special(DBADDR *paddr,
int after)
238 mbboDirectRecord *
prec = (mbboDirectRecord *) paddr->precord;
239 int fieldIndex = dbGetFieldIndex(paddr);
241 if (paddr->special ==
SPC_MOD && fieldIndex == mbboDirectRecordSIMM) {
243 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
245 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
252 switch (paddr->special) {
254 if (prec->omsl == menuOmslsupervisory) {
270 if (prec->omsl == menuOmslclosed_loop) {
276 for (i = 0; i <
NUM_BITS; i++, bit <<= 1)
281 else if (prec->omsl == menuOmslsupervisory) {
287 for (i = 0; i < NUM_BITS; i++, pBn++, val >>= 1) {
298 recGblDbaddrError(S_db_badChoice, paddr,
"mbboDirect: special");
299 return S_db_badChoice;
306 static long get_precision(
const DBADDR *paddr,
long *precision)
308 mbboDirectRecord *
prec=(mbboDirectRecord *)paddr->precord;
309 if(dbGetFieldIndex(paddr)==mbboDirectRecordVAL)
310 *precision = prec->nobt;
312 recGblGetPrec(paddr,precision);
316 static void monitor(mbboDirectRecord *
prec)
320 if (prec->mlst != prec->val) {
322 prec->mlst = prec->val;
325 db_post_events(prec, &prec->val, events);
328 if (prec->oraw != prec->rval) {
329 db_post_events(prec, &prec->rval, events);
330 prec->oraw = prec->rval;
332 if (prec->orbv != prec->rbv) {
333 db_post_events(prec, &prec->rbv, events);
334 prec->orbv = prec->rbv;
338 static void convert(mbboDirectRecord *
prec)
341 prec->rval = prec->val;
344 prec->rval <<= prec->shft;
347 static long writeValue(mbboDirectRecord *
prec)
349 mbbodirectdset *pdset = (mbbodirectdset *) prec->dset;
353 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
357 switch (prec->simm) {
359 status = pdset->write_mbbo(prec);
364 if (prec->pact || (prec->sdly < 0.)) {
368 epicsCallback *pvt = prec->simpvt;
370 pvt = calloc(1,
sizeof(epicsCallback));
373 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
unsigned short epicsUInt16
Miscellaneous macro definitions.
unsigned long long epicsUInt64
#define get_graphic_double
epicsExportAddress(rset, mbboDirectRSET)
#define get_control_double