39 #define GEN_SIZE_OFFSET 40 #include "subArrayRecord.h" 41 #undef GEN_SIZE_OFFSET 46 #define initialize NULL 48 static long process(
struct dbCommon *
prec);
50 #define get_value NULL 52 static long get_array_info(DBADDR *paddr,
long *no_elements,
long *offset);
54 static long get_units(DBADDR *paddr,
char *units);
55 static long get_precision(
const DBADDR *paddr,
long *precision);
56 #define get_enum_str NULL 57 #define get_enum_strs NULL 58 #define put_enum_str NULL 61 #define get_alarm_double NULL 85 static void monitor(subArrayRecord *
prec);
86 static long readValue(subArrayRecord *
prec);
89 static long init_record(
struct dbCommon *pcommon,
int pass)
91 struct subArrayRecord *
prec = (
struct subArrayRecord *)pcommon;
100 "subArrayRecord calloc failed");
102 if (prec->nelm > prec->malm)
103 prec->nelm = prec->malm;
108 if (!(pdset = (sadset *)(prec->dset))) {
109 recGblRecordError(
S_dev_noDSET,(
void *)prec,
"sa: init_record");
114 if ( (pdset->common.number < 5) || (pdset->read_sa ==
NULL) ) {
119 if (pdset->common.init_record)
120 return pdset->common.init_record(pcommon);
125 static long process(
struct dbCommon *pcommon)
127 struct subArrayRecord *
prec = (
struct subArrayRecord *)pcommon;
128 sadset *pdset = (sadset *)(prec->dset);
130 unsigned char pact=prec->pact;
132 if ((pdset==
NULL) || (pdset->read_sa==
NULL)) {
138 if (pact && prec->busy)
return 0;
140 status=readValue(prec);
141 if (!pact && prec->pact)
return 0;
144 recGblGetTimeStamp(prec);
148 recGblSetSevr(prec,
UDF_ALARM, prec->udfs);
161 subArrayRecord *
prec = (subArrayRecord *) paddr->precord;
163 paddr->pfield = prec->bptr;
164 paddr->no_elements = prec->malm;
165 paddr->field_type = prec->ftvl;
166 paddr->field_size = dbValueSize(prec->ftvl);
167 paddr->dbr_field_type = prec->ftvl;
172 static long get_array_info(DBADDR *paddr,
long *no_elements,
long *offset)
174 subArrayRecord *
prec = (subArrayRecord *) paddr->precord;
179 *no_elements = prec->nord;
187 subArrayRecord *
prec = (subArrayRecord *) paddr->precord;
191 if (prec->nord > prec->malm)
192 prec->nord = prec->malm;
194 if (nord != prec->nord)
199 #define indexof(field) subArrayRecord##field 201 static long get_units(DBADDR *paddr,
char *units)
203 subArrayRecord *
prec = (subArrayRecord *) paddr->precord;
205 switch (dbGetFieldIndex(paddr)) {
211 strncpy(units,prec->egu,DB_UNITS_SIZE);
216 static long get_precision(
const DBADDR *paddr,
long *precision)
218 subArrayRecord *
prec = (subArrayRecord *) paddr->precord;
220 *precision = prec->prec;
221 if (dbGetFieldIndex(paddr) !=
indexof(VAL))
222 recGblGetPrec(paddr, precision);
228 subArrayRecord *
prec = (subArrayRecord *) paddr->precord;
230 switch (dbGetFieldIndex(paddr)) {
232 pgd->upper_disp_limit = prec->hopr;
233 pgd->lower_disp_limit = prec->lopr;
236 pgd->upper_disp_limit = prec->malm - 1;
237 pgd->lower_disp_limit = 0;
240 pgd->upper_disp_limit = prec->malm;
241 pgd->lower_disp_limit = 0;
244 pgd->upper_disp_limit = prec->malm;
245 pgd->lower_disp_limit = 0;
248 pgd->upper_disp_limit = 1;
249 pgd->lower_disp_limit = 0;
252 recGblGetGraphicDouble(paddr, pgd);
259 subArrayRecord *
prec = (subArrayRecord *) paddr->precord;
261 switch (dbGetFieldIndex(paddr)) {
263 pcd->upper_ctrl_limit = prec->hopr;
264 pcd->lower_ctrl_limit = prec->lopr;
267 pcd->upper_ctrl_limit = prec->malm - 1;
268 pcd->lower_ctrl_limit = 0;
271 pcd->upper_ctrl_limit = prec->malm;
272 pcd->lower_ctrl_limit = 1;
275 pcd->upper_ctrl_limit = prec->malm;
276 pcd->lower_ctrl_limit = 0;
279 pcd->upper_ctrl_limit = 1;
280 pcd->lower_ctrl_limit = 0;
283 recGblGetControlDouble(paddr, pcd);
288 static void monitor(subArrayRecord *
prec)
290 unsigned short monitor_mask;
292 monitor_mask = recGblResetAlarms(prec);
295 db_post_events(prec, prec->bptr, monitor_mask);
300 static long readValue(subArrayRecord *
prec)
303 sadset *pdset = (sadset *) (prec->dset);
305 if (prec->nelm > prec->malm)
306 prec->nelm = prec->malm;
308 if (prec->indx >= prec->malm)
309 prec->indx = prec->malm - 1;
311 status = (*pdset->read_sa)(prec);
Miscellaneous macro definitions.
#define get_control_double
epicsExportAddress(rset, subArrayRSET)
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
Routines for code that can't continue or return after an error.
#define get_graphic_double