37 #include "menuYesNo.h" 39 #define GEN_SIZE_OFFSET 40 #include "waveformRecord.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 56 #define get_enum_str NULL 57 #define get_enum_strs NULL 58 #define put_enum_str NULL 61 #define get_alarm_double NULL 84 static void monitor(waveformRecord *);
85 static long readValue(waveformRecord *);
87 static long init_record(
struct dbCommon *pcommon,
int pass)
89 struct waveformRecord *
prec = (
struct waveformRecord *)pcommon;
98 "waveform calloc failed");
99 prec->nord = (prec->nelm == 1);
103 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
106 if (!(pdset = (wfdset *)(prec->dset))) {
107 recGblRecordError(
S_dev_noDSET,(
void *)prec,
"wf: init_record");
111 if ((pdset->common.number < 5) || (pdset->read_wf ==
NULL)) {
115 if (!pdset->common.init_record)
118 return pdset->common.init_record(pcommon);
121 static long process(
struct dbCommon *pcommon)
123 struct waveformRecord *
prec = (
struct waveformRecord *)pcommon;
124 wfdset *pdset = (wfdset *)(prec->dset);
125 unsigned char pact=prec->pact;
128 if ((pdset==
NULL) || (pdset->read_wf==
NULL)) {
134 if (pact && prec->busy)
137 status = readValue(prec);
138 if (!pact && prec->pact)
142 recGblGetTimeStampSimm(prec, prec->simm, &prec->siol);
153 static long special(DBADDR *paddr,
int after)
155 waveformRecord *
prec = (waveformRecord *)(paddr->precord);
156 int special_type = paddr->special;
158 switch(special_type) {
160 if (dbGetFieldIndex(paddr) == waveformRecordSIMM) {
162 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
164 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm,
169 recGblDbaddrError(S_db_badChoice, paddr,
"waveform: special");
170 return S_db_badChoice;
176 waveformRecord *
prec = (waveformRecord *) paddr->precord;
178 paddr->no_elements = prec->nelm;
179 paddr->field_type = prec->ftvl;
180 paddr->field_size = dbValueSize(prec->ftvl);
181 paddr->dbr_field_type = prec->ftvl;
186 static long get_array_info(DBADDR *paddr,
long *no_elements,
long *offset)
188 waveformRecord *
prec = (waveformRecord *) paddr->precord;
190 paddr->pfield = prec->bptr;
191 *no_elements = prec->nord;
199 waveformRecord *
prec = (waveformRecord *) paddr->precord;
203 if (prec->nord > prec->nelm)
204 prec->nord = prec->nelm;
206 if (nord != prec->nord)
211 #define indexof(field) waveformRecord##field 213 static long get_units(DBADDR *paddr,
char *units)
215 waveformRecord *
prec = (waveformRecord *) paddr->precord;
217 switch (dbGetFieldIndex(paddr)) {
223 strncpy(units,prec->egu,DB_UNITS_SIZE);
228 static long get_precision(
const DBADDR *paddr,
long *precision)
230 waveformRecord *
prec = (waveformRecord *) paddr->precord;
232 *precision = prec->prec;
233 if (dbGetFieldIndex(paddr) !=
indexof(VAL))
234 recGblGetPrec(paddr, precision);
240 waveformRecord *
prec = (waveformRecord *) paddr->precord;
242 switch (dbGetFieldIndex(paddr)) {
244 pgd->upper_disp_limit = prec->hopr;
245 pgd->lower_disp_limit = prec->lopr;
248 pgd->upper_disp_limit = 1;
249 pgd->lower_disp_limit = 0;
252 pgd->upper_disp_limit = prec->nelm;
253 pgd->lower_disp_limit = 0;
256 recGblGetGraphicDouble(paddr, pgd);
263 waveformRecord *
prec = (waveformRecord *) paddr->precord;
265 switch (dbGetFieldIndex(paddr)) {
267 pcd->upper_ctrl_limit = prec->hopr;
268 pcd->lower_ctrl_limit = prec->lopr;
271 pcd->upper_ctrl_limit = 1;
272 pcd->lower_ctrl_limit = 0;
275 pcd->upper_ctrl_limit = prec->nelm;
276 pcd->lower_ctrl_limit = 0;
279 recGblGetControlDouble(paddr, pcd);
284 static void monitor(waveformRecord *
prec)
286 unsigned short monitor_mask = 0;
287 unsigned int hash = 0;
289 monitor_mask = recGblResetAlarms(prec);
291 if (prec->mpst == waveformPOST_Always)
293 if (prec->apst == waveformPOST_Always)
297 if ((prec->mpst == waveformPOST_OnChange) ||
298 (prec->apst == waveformPOST_OnChange)) {
300 prec->nord * dbValueSize(prec->ftvl), 0);
303 if (hash != prec->hash) {
304 if (prec->mpst == waveformPOST_OnChange)
306 if (prec->apst == waveformPOST_OnChange)
312 db_post_events(prec, &prec->hash,
DBE_VALUE);
317 db_post_events(prec, &prec->val, monitor_mask);
321 static long readValue(waveformRecord *
prec)
323 wfdset *pdset = (wfdset *) prec->dset;
327 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm,
328 &prec->simm, &prec->siml);
333 switch (prec->simm) {
337 status = pdset->read_wf(prec);
338 if (nord != prec->nord)
344 long nRequest = prec->nelm;
347 if (prec->pact || (prec->sdly < 0)) {
348 status = dbGetLink(&prec->siol, prec->ftvl, prec->bptr, 0, &nRequest);
352 if (nRequest != prec->nord) {
353 prec->nord = nRequest;
359 epicsCallback *pvt = prec->simpvt;
362 pvt = calloc(1,
sizeof(epicsCallback));
366 callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec,
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