37 #include "menuYesNo.h" 39 #define GEN_SIZE_OFFSET 40 #include "mbboRecord.h" 41 #undef GEN_SIZE_OFFSET 46 #define initialize NULL 48 static long process(
struct dbCommon *);
49 static long special(DBADDR *,
int);
50 #define get_value NULL 52 #define get_array_info NULL 53 #define put_array_info NULL 54 #define get_units NULL 55 #define get_precision NULL 57 static long get_enum_strs(
const DBADDR *,
struct dbr_enumStrs *);
59 #define get_graphic_double NULL 60 #define get_control_double NULL 61 #define get_alarm_double NULL 86 static void checkAlarms(mbboRecord *);
87 static void convert(mbboRecord *);
88 static void monitor(mbboRecord *);
89 static long writeValue(mbboRecord *);
92 static void init_common(mbboRecord *
prec)
95 char *pstate_string = prec->zrst;
99 for (i = 0; i < 16; i++, pstate_string +=
sizeof(prec->zrst)) {
100 if ((pstate_values[i] != 0) || (*pstate_string !=
'\0')) {
108 static long init_record(
struct dbCommon *pcommon,
int pass)
110 struct mbboRecord *
prec = (
struct mbboRecord *)pcommon;
119 pdset = (mbbodset *) prec->dset;
121 recGblRecordError(
S_dev_noDSET, prec,
"mbbo: init_record");
125 if ((pdset->common.number < 5) || (pdset->write_mbbo ==
NULL)) {
130 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
132 if (recGblInitConstantLink(&prec->dol,
DBF_USHORT, &prec->val))
136 if (prec->mask == 0 && prec->nobt <= 32)
139 if (pdset->common.init_record) {
140 status = pdset->common.init_record(pcommon);
154 for (i = 0; i < 16; i++) {
155 if (*pstate_values == rval) {
168 else if (status == 2)
178 prec->mlst = prec->val;
179 prec->lalm = prec->val;
180 prec->oraw = prec->rval;
181 prec->orbv = prec->rbv;
185 static long process(
struct dbCommon *pcommon)
187 struct mbboRecord *
prec = (
struct mbboRecord *)pcommon;
188 mbbodset *pdset = (mbbodset *) prec->dset;
190 int pact = prec->pact;
192 if ((pdset ==
NULL) || (pdset->write_mbbo ==
NULL)) {
199 if (!dbLinkIsConstant(&prec->dol) &&
200 prec->omsl == menuOmslclosed_loop) {
203 if (dbGetLink(&prec->dol,
DBR_USHORT, &val, 0, 0)) {
209 else if (prec->udf) {
210 recGblSetSevr(prec,
UDF_ALARM, prec->udfs);
224 status = writeValue(prec);
226 switch (prec->ivoa) {
227 case menuIvoaSet_output_to_IVOV:
229 prec->val = prec->ivov;
233 case menuIvoaContinue_normally:
234 status = writeValue(prec);
236 case menuIvoaDon_t_drive_outputs:
240 recGblRecordError(S_db_badField, prec,
241 "mbbo::process Illegal IVOA field");
246 if (!pact && prec->pact)
250 recGblGetTimeStampSimm(prec, prec->simm,
NULL);
260 static long special(DBADDR *paddr,
int after)
262 mbboRecord *
prec = (mbboRecord *) paddr->precord;
263 int fieldIndex = dbGetFieldIndex(paddr);
265 switch (paddr->special) {
267 if (fieldIndex == mbboRecordSIMM) {
269 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
271 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
279 if (fieldIndex >= mbboRecordZRST && fieldIndex <= mbboRecordFFST) {
282 if (prec->val == fieldIndex - mbboRecordZRST)
284 db_post_events(prec, &prec->val, event);
289 recGblDbaddrError(S_db_badChoice, paddr,
"mbbo: special");
290 return S_db_badChoice;
296 mbboRecord *
prec = (mbboRecord *) paddr->precord;
298 if (dbGetFieldIndex(paddr) != mbboRecordVAL) {
299 recGblDbaddrError(S_db_badField, paddr,
"mbbo: cvt_dbaddr");
309 static long get_enum_str(
const DBADDR *paddr,
char *pstring)
311 mbboRecord *
prec = (mbboRecord *) paddr->precord;
315 if (dbGetFieldIndex(paddr) != mbboRecordVAL) {
316 strcpy(pstring,
"Bad Field");
318 else if (val <= 15) {
319 const char *pstate = prec->zrst + val *
sizeof(prec->zrst);
321 strncpy(pstring, pstate,
sizeof(prec->zrst));
324 strcpy(pstring,
"Illegal Value");
329 static long get_enum_strs(
const DBADDR *paddr,
struct dbr_enumStrs *pes)
331 mbboRecord *
prec = (mbboRecord *) paddr->precord;
335 memset(pes->strs,
'\0',
sizeof(pes->strs));
337 for (i = 0; i < 16; i++) {
338 strncpy(pes->strs[i], pstate,
sizeof(prec->zrst));
341 pstate +=
sizeof(prec->zrst);
343 pes->no_str = states;
348 static long put_enum_str(
const DBADDR *paddr,
const char *pstring)
350 mbboRecord *
prec = (mbboRecord *) paddr->precord;
356 for (
i = 0;
i < 16;
i++) {
357 if (strncmp(pstate, pstring,
sizeof(prec->zrst)) == 0) {
361 pstate +=
sizeof(prec->zrst);
364 return S_db_badChoice;
367 static void checkAlarms(mbboRecord *
prec)
379 recGblSetSevr(prec,
STATE_ALARM, severities[prec->val]);
383 if (val == prec->lalm ||
384 recGblSetSevr(prec,
COS_ALARM, prec->cosv))
390 static void monitor(mbboRecord *
prec)
394 if (prec->mlst != prec->val) {
396 prec->mlst = prec->val;
399 db_post_events(prec, &prec->val, events);
402 if (prec->oraw != prec->rval) {
403 db_post_events(prec, &prec->rval, events);
404 prec->oraw = prec->rval;
406 if (prec->orbv != prec->rbv) {
407 db_post_events(prec, &prec->rbv, events);
408 prec->orbv = prec->rbv;
412 static void convert(mbboRecord *
prec)
418 if (prec->val > 15) {
422 prec->rval = pvalues[prec->val];
425 prec->rval = prec->val;
428 prec->rval <<= prec->shft;
431 static long writeValue(mbboRecord *
prec)
433 mbbodset *pdset = (mbbodset *) prec->dset;
437 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
441 switch (prec->simm) {
443 status = pdset->write_mbbo(prec);
448 if (prec->pact || (prec->sdly < 0.)) {
452 epicsCallback *pvt = prec->simpvt;
454 pvt = calloc(1,
sizeof(epicsCallback));
457 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
unsigned short epicsUInt16
#define get_graphic_double
Miscellaneous macro definitions.
unsigned long long epicsUInt64
epicsExportAddress(rset, mbboRSET)
#define get_control_double