23 #include "dbChannel.h" 26 #include "epicsMath.h" 35 #define GET_OPTIONS (DBR_STATUS | DBR_TIME) 53 aiRecord *
prec = (aiRecord *)ppn->usrPvt;
57 if (ppn->status == notifyCanceled) {
58 printf(
"devAiSoftCallback::getCallback notifyCanceled\n");
62 assert(type == getFieldType);
63 pdevPvt->status = dbChannelGetField(ppn->chan,
DBR_DOUBLE,
64 &pdevPvt->buffer, &pdevPvt->options, &no_elements, 0);
67 static void doneCallback(processNotify *ppn)
69 aiRecord *
prec = (aiRecord *)ppn->usrPvt;
72 callbackRequestProcessCallback(&pdevPvt->callback, prec->prio, prec);
75 static long add_record(dbCommon *pcommon)
77 aiRecord *
prec = (aiRecord *)pcommon;
78 DBLINK *plink = &prec->inp;
83 if (dbLinkIsDefined(plink) && dbLinkIsConstant(plink))
87 long status = S_db_badField;
89 recGblRecordError(status, (
void *)prec,
90 "devAiSoftCallback (add_record) Illegal INP field");
96 long status = S_db_notFound;
98 recGblRecordError(status, (
void *)prec,
99 "devAiSoftCallback (add_record) link target not found");
103 pdevPvt = calloc(1,
sizeof(*pdevPvt));
105 long status = S_db_noMemory;
107 recGblRecordError(status, (
void *)prec,
108 "devAiSoftCallback (add_record) out of memory, calloc() failed");
119 ppn->doneCallback = doneCallback;
120 ppn->requestType = processGetRequest;
124 prec->dpvt = pdevPvt;
128 static long del_record(dbCommon *pcommon) {
129 aiRecord *
prec = (aiRecord *)pcommon;
130 DBLINK *plink = &prec->inp;
133 if (dbLinkIsDefined(plink) && dbLinkIsConstant(plink))
138 dbNotifyCancel(&pdevPvt->
pn);
139 dbChannelDelete(pdevPvt->
pn.chan);
146 static struct dsxt dsxtSoftCallback = {
150 static long init(
int pass)
152 if (pass == 0)
devExtend(&dsxtSoftCallback);
158 aiRecord *
prec = (aiRecord *)pcommon;
160 if (recGblInitConstantLink(&prec->inp,
DBF_DOUBLE, &prec->val))
166 static long read_ai(aiRecord *
prec)
174 dbProcessNotify(&pdevPvt->
pn);
186 if (prec->smoo != 0.0 && pdevPvt->
smooth &&
finite(prec->val))
187 prec->val = prec->val * prec->smoo +
195 switch (prec->inp.value.pv_link.pvlMask &
pvlOptMsMode) {
207 pdevPvt->
buffer.severity);
211 if (dbLinkIsConstant(&prec->tsel) &&
213 prec->time = pdevPvt->
buffer.time;
#define assert(exp)
Declare that a condition should be true.
An EPICS-specific replacement for ANSI C's assert.
void devExtend(dsxt *pdsxt)
pvd::StructureConstPtr type
Miscellaneous macro definitions.
epicsExportAddress(dset, devAiSoftCallback)
#define epicsTimeEventDeviceTime
long(* add_record)(struct dbCommon *precord)
DBRstatus DBRtime epicsFloat64 value
long(* del_record)(struct dbCommon *precord)
Routines for code that can't continue or return after an error.