30 #include "epicsMath.h" 37 #define GEN_SIZE_OFFSET 38 #include "mbbiRecord.h" 39 #undef GEN_SIZE_OFFSET 43 #define THRESHOLD 0.6321 47 #define initialize NULL 49 static long process(
struct dbCommon *);
50 static long special(DBADDR *,
int);
51 #define get_value NULL 52 #define cvt_dbaddr NULL 53 #define get_array_info NULL 54 #define put_array_info NULL 55 #define get_units NULL 56 #define get_precision NULL 58 static long get_enum_strs(
const DBADDR *,
struct dbr_enumStrs *);
60 #define get_graphic_double NULL 61 #define get_control_double NULL 62 #define get_alarm_double NULL 87 static void monitor(mbbiRecord *);
88 static long readValue(mbbiRecord *);
90 static void init_common(mbbiRecord *
prec)
93 char *pstate_string = prec->zrst;
97 for (i = 0; i < 16; i++, pstate_string +=
sizeof(prec->zrst)) {
98 if ((pstate_values[i] != 0) || (*pstate_string !=
'\0')) {
106 static long init_record(
struct dbCommon *pcommon,
int pass)
108 struct mbbiRecord *
prec = (
struct mbbiRecord *)pcommon;
109 mbbidset *pdset = (mbbidset *) prec->dset;
112 if (pass == 0)
return 0;
115 recGblRecordError(
S_dev_noDSET, prec,
"mbbi: init_record");
119 if ((pdset->common.number < 5) || (pdset->read_mbbi ==
NULL)) {
124 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
125 recGblInitConstantLink(&prec->siol,
DBF_USHORT, &prec->sval);
128 if (prec->mask == 0 && prec->nobt <= 32)
131 if (pdset->common.init_record)
132 status = pdset->common.init_record(pcommon);
136 prec->mlst = prec->val;
137 prec->lalm = prec->val;
138 prec->oraw = prec->rval;
142 static long process(
struct dbCommon *pcommon)
144 struct mbbiRecord *
prec = (
struct mbbiRecord *)pcommon;
145 mbbidset *pdset = (mbbidset *) prec->dset;
147 int pact = prec->pact;
150 if ((pdset ==
NULL) || (pdset->read_mbbi ==
NULL)) {
156 timeLast = prec->time;
161 if (!pact && prec->pact)
165 recGblGetTimeStampSimm(prec, prec->simm, &prec->siol);
178 pstate_values = &(prec->zrvl);
180 for (i = 0; i < 16; i++) {
181 if (*pstate_values == rval) {
194 checkAlarms(prec, &timeLast);
203 static long special(DBADDR *paddr,
int after)
205 mbbiRecord *
prec = (mbbiRecord *) paddr->precord;
206 int fieldIndex = dbGetFieldIndex(paddr);
208 switch (paddr->special) {
210 if (fieldIndex == mbbiRecordSIMM) {
212 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
214 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
222 if (fieldIndex >= mbbiRecordZRST && fieldIndex <= mbbiRecordFFST) {
225 if (prec->val == fieldIndex - mbbiRecordZRST)
227 db_post_events(prec, &prec->val, event);
232 recGblDbaddrError(S_db_badChoice, paddr,
"mbbi: special");
233 return S_db_badChoice;
237 static long get_enum_str(
const DBADDR *paddr,
char *pstring)
239 mbbiRecord *
prec = (mbbiRecord *) paddr->precord;
241 unsigned short *pfield = paddr->pfield;
244 index = dbGetFieldIndex(paddr);
245 if (index != mbbiRecordVAL) {
246 strcpy(pstring,
"Illegal_Value");
248 else if (val <= 15) {
249 char *pstate = prec->zrst + val *
sizeof(prec->zrst);
251 strncpy(pstring, pstate,
sizeof(prec->zrst));
254 strcpy(pstring,
"Illegal Value");
259 static long get_enum_strs(
const DBADDR *paddr,
struct dbr_enumStrs *pes)
261 mbbiRecord *
prec = (mbbiRecord *) paddr->precord;
262 char *pstate = prec->zrst;
266 memset(pes->strs,
'\0',
sizeof(pes->strs));
267 for (
i = 0;
i < 16;
i++, pstate +=
sizeof(prec->zrst) ) {
268 strncpy(pes->strs[
i], pstate,
sizeof(prec->zrst));
269 if (*pstate!=0) states =
i+1;
271 pes->no_str = states;
275 static long put_enum_str(
const DBADDR *paddr,
const char *pstring)
277 mbbiRecord *
prec = (mbbiRecord *) paddr->precord;
283 for (
i = 0;
i < 16;
i++) {
284 if (strncmp(pstate, pstring,
sizeof(prec->zrst)) == 0) {
289 pstate +=
sizeof(prec->zrst);
292 return S_db_badChoice;
298 unsigned short alarm;
318 alarm = severities[
prec->val];
327 afvl = (double) alarm;
331 double alpha = aftc / (t + aftc);
333 afvl = alpha * afvl +
334 ((afvl > 0) ? (1.0 - alpha) : (alpha - 1.0)) * alarm;
338 alarm = abs((
int)floor(afvl));
346 if (val ==
prec->lalm ||
353 static void monitor(mbbiRecord *
prec)
357 if (prec->mlst != prec->val) {
359 prec->mlst = prec->val;
363 db_post_events(prec, &prec->val, events);
365 if (prec->oraw != prec->rval) {
367 prec->oraw = prec->rval;
371 static long readValue(mbbiRecord *
prec)
373 mbbidset *pdset = (mbbidset *) prec->dset;
377 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
381 switch (prec->simm) {
383 status = pdset->read_mbbi(prec);
389 if (prec->pact || (prec->sdly < 0.)) {
392 if (prec->simm == menuSimmYES) {
393 prec->val = prec->sval;
396 prec->rval = prec->sval;
402 epicsCallback *pvt = prec->simpvt;
404 pvt = calloc(1,
sizeof(epicsCallback));
407 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
epicsExportAddress(rset, mbbiRSET)
unsigned short epicsUInt16
#define get_graphic_double
Miscellaneous macro definitions.
unsigned long long epicsUInt64
#define get_control_double
EPICS time stamp, for use from C code.
LIBCOM_API double epicsStdCall epicsTimeDiffInSeconds(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
Time difference between left and right in seconds.