45 #include "menuYesNo.h" 47 #define GEN_SIZE_OFFSET 48 #include "aaiRecord.h" 49 #undef GEN_SIZE_OFFSET 54 #define initialize NULL 56 static long process(
struct dbCommon *);
57 static long special(DBADDR *,
int);
58 #define get_value NULL 64 #define get_enum_str NULL 65 #define get_enum_strs NULL 66 #define put_enum_str NULL 69 #define get_alarm_double NULL 93 static void monitor(aaiRecord *);
94 static long readValue(aaiRecord *);
96 static long init_record(
struct dbCommon *pcommon,
int pass)
98 struct aaiRecord *
prec = (
struct aaiRecord *)pcommon;
99 aaidset *pdset = (aaidset *)(prec->dset);
103 recGblRecordError(
S_dev_noDSET, prec,
"aai: init_record");
112 prec->nord = (prec->nelm == 1);
119 if (pdset->common.init_record) {
120 long status = pdset->common.init_record(pcommon);
129 "aai: buffer calloc failed");
134 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
137 if (pdset->common.number < 5 || pdset->read_aai ==
NULL) {
144 static long process(
struct dbCommon *pcommon)
146 struct aaiRecord *
prec = (
struct aaiRecord *)pcommon;
147 aaidset *pdset = (aaidset *)(prec->dset);
149 unsigned char pact = prec->pact;
151 if (pdset ==
NULL || pdset->read_aai ==
NULL) {
157 status = readValue(prec);
158 if (!pact && prec->pact)
163 recGblGetTimeStampSimm(prec, prec->simm, &prec->siol);
173 static long special(DBADDR *paddr,
int after)
175 aaiRecord *
prec = (aaiRecord *)(paddr->precord);
176 int special_type = paddr->special;
178 switch(special_type) {
180 if (dbGetFieldIndex(paddr) == aaiRecordSIMM) {
182 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
184 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm,
190 recGblDbaddrError(S_db_badChoice, paddr,
"aai: special");
191 return S_db_badChoice;
197 aaiRecord *
prec = (aaiRecord *)paddr->precord;
199 paddr->no_elements = prec->nelm;
200 paddr->field_type = prec->ftvl;
201 paddr->field_size = dbValueSize(prec->ftvl);
202 paddr->dbr_field_type = prec->ftvl;
206 static long get_array_info(DBADDR *paddr,
long *no_elements,
long *offset)
208 aaiRecord *
prec = (aaiRecord *)paddr->precord;
210 paddr->pfield = prec->bptr;
211 *no_elements = prec->nord;
218 aaiRecord *
prec = (aaiRecord *)paddr->precord;
222 if (prec->nord > prec->nelm)
223 prec->nord = prec->nelm;
225 if (nord != prec->nord)
230 #define indexof(field) aaiRecord##field 232 static long get_units(DBADDR *paddr,
char *units)
234 aaiRecord *
prec = (aaiRecord *)paddr->precord;
236 switch (dbGetFieldIndex(paddr)) {
242 strncpy(units,prec->egu,DB_UNITS_SIZE);
247 static long get_precision(
const DBADDR *paddr,
long *precision)
249 aaiRecord *
prec = (aaiRecord *)paddr->precord;
251 *precision = prec->prec;
252 if (dbGetFieldIndex(paddr) !=
indexof(VAL))
253 recGblGetPrec(paddr, precision);
259 aaiRecord *
prec = (aaiRecord *)paddr->precord;
261 switch (dbGetFieldIndex(paddr)) {
263 pgd->upper_disp_limit = prec->hopr;
264 pgd->lower_disp_limit = prec->lopr;
267 pgd->upper_disp_limit = prec->nelm;
268 pgd->lower_disp_limit = 0;
271 recGblGetGraphicDouble(paddr, pgd);
278 aaiRecord *
prec = (aaiRecord *)paddr->precord;
280 switch (dbGetFieldIndex(paddr)) {
282 pcd->upper_ctrl_limit = prec->hopr;
283 pcd->lower_ctrl_limit = prec->lopr;
286 pcd->upper_ctrl_limit = prec->nelm;
287 pcd->lower_ctrl_limit = 0;
290 recGblGetControlDouble(paddr, pcd);
295 static void monitor(aaiRecord *
prec)
297 unsigned short monitor_mask;
298 unsigned int hash = 0;
300 monitor_mask = recGblResetAlarms(prec);
302 if (prec->mpst == aaiPOST_Always)
304 if (prec->apst == aaiPOST_Always)
308 if ((prec->mpst == aaiPOST_OnChange) ||
309 (prec->apst == aaiPOST_OnChange)) {
311 prec->nord * dbValueSize(prec->ftvl), 0);
314 if (hash != prec->hash) {
315 if (prec->mpst == aaiPOST_OnChange)
317 if (prec->apst == aaiPOST_OnChange)
323 db_post_events(prec, &prec->hash,
DBE_VALUE);
328 db_post_events(prec, &prec->val, monitor_mask);
331 static long readValue(aaiRecord *
prec)
333 aaidset *pdset = (aaidset *) prec->dset;
341 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm,
342 &prec->simm, &prec->siml);
346 if (prec->simm == menuYesNoYES) {
349 if (prec->sdly >= 0) {
350 epicsCallback *pvt = prec->simpvt;
353 pvt = calloc(1,
sizeof(epicsCallback));
357 callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec,
363 else if (prec->simm != menuYesNoNO) {
369 return pdset->read_aai(prec);
epicsExportAddress(rset, aaiRSET)
Miscellaneous macro definitions.
#define get_control_double
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
unsigned int epicsMemHash(const char *str, size_t length, unsigned int seed)
Routines for code that can't continue or return after an error.
#define get_graphic_double