27 #define GEN_SIZE_OFFSET 28 #include "seqRecord.h" 29 #undef GEN_SIZE_OFFSET 32 static void processNextLink(seqRecord *
prec);
33 static long asyncFinish(seqRecord *
prec);
34 static void processCallback(epicsCallback *arg);
38 #define initialize NULL 40 static long process(
struct dbCommon *
prec);
42 #define get_value NULL 43 #define cvt_dbaddr NULL 44 #define get_array_info NULL 45 #define put_array_info NULL 48 #define get_enum_str NULL 49 #define get_enum_strs NULL 50 #define put_enum_str NULL 104 static long init_record(
struct dbCommon *pcommon,
int pass)
106 struct seqRecord *
prec = (
struct seqRecord *)pcommon;
116 callbackSetCallback(processCallback, &pseqRecPvt->
callback);
117 callbackSetUser(pseqRecPvt, &pseqRecPvt->
callback);
118 prec->dpvt = pseqRecPvt;
120 recGblInitConstantLink(&prec->sell,
DBF_USHORT, &prec->seln);
123 for (index = 0; index <
NUM_LINKS; index++, grp++) {
127 prec->oldn = prec->seln;
132 static long process(
struct dbCommon *pcommon)
134 struct seqRecord *
prec = (
struct seqRecord *)pcommon;
141 return asyncFinish(prec);
145 callbackSetPriority(prec->prio, &pcb->
callback);
147 if (prec->selm == seqSELM_All)
151 dbGetLink(&prec->sell,
DBR_USHORT, &prec->seln, 0, 0);
153 if (prec->selm == seqSELM_Specified) {
154 int grpn = prec->seln + prec->offs;
157 return asyncFinish(prec);
162 else if (prec->selm == seqSELM_Mask) {
163 int shft = prec->shft;
164 if (shft < -15 || shft > 15) {
168 return asyncFinish(prec);
170 lmask = (shft >= 0) ? prec->seln >> shft : prec->seln << -shft;
174 return asyncFinish(prec);
180 pgrp = (
linkGrp *) &prec->dly0;
181 for (
i = 0; lmask; lmask >>= 1) {
183 (!dbLinkIsConstant(&pgrp->lnk) ||
184 !dbLinkIsConstant(&pgrp->dol))) {
185 pcb->
grps[
i++] = pgrp;
192 return asyncFinish(prec);
195 processNextLink(prec);
200 static void processNextLink(seqRecord *
prec)
207 prec->rset->process((dbCommon *)prec);
213 callbackRequestDelayed(&pcb->
callback, pgrp->dly);
218 static long asyncFinish(seqRecord *
prec)
223 recGblGetTimeStamp(prec);
226 events = recGblResetAlarms(prec);
228 db_post_events(prec, &prec->val, events);
229 if (prec->seln != prec->oldn) {
231 prec->oldn = prec->seln;
242 static void processCallback(epicsCallback *arg)
249 callbackGetUser(pcb, arg);
251 dbScanLock((
struct dbCommon *)prec);
260 recGblGetTimeStamp(prec);
265 if (odov != pgrp->
dov) {
271 processNextLink(prec);
273 dbScanUnlock((
struct dbCommon *)prec);
277 #define indexof(field) seqRecord##field 278 #define get_dol(prec, fieldOffset) \ 279 &((linkGrp *) &prec->dly0)[fieldOffset >> 2].dol 281 static long get_units(DBADDR *paddr,
char *units)
283 seqRecord *
prec = (seqRecord *) paddr->precord;
284 int fieldOffset = dbGetFieldIndex(paddr) -
indexof(DLY1);
286 if (fieldOffset >= 0)
287 switch (fieldOffset & 2) {
292 dbGetUnits(
get_dol(prec, fieldOffset),
293 units, DB_UNITS_SIZE);
298 static long get_precision(
const DBADDR *paddr,
long *pprecision)
300 seqRecord *
prec = (seqRecord *) paddr->precord;
301 int fieldOffset = dbGetFieldIndex(paddr) -
indexof(DLY1);
304 if (fieldOffset >= 0)
305 switch (fieldOffset & 2) {
310 if (dbGetPrecision(
get_dol(prec, fieldOffset), &precision) == 0) {
311 *pprecision = precision;
315 *pprecision = prec->prec;
316 recGblGetPrec(paddr, pprecision);
322 seqRecord *
prec = (seqRecord *) paddr->precord;
323 int fieldOffset = dbGetFieldIndex(paddr) -
indexof(DLY1);
325 if (fieldOffset >= 0)
326 switch (fieldOffset & 2) {
328 pgd->lower_disp_limit = 0.0;
329 pgd->lower_disp_limit = 10.0;
332 dbGetGraphicLimits(
get_dol(prec, fieldOffset),
333 &pgd->lower_disp_limit,
334 &pgd->upper_disp_limit);
337 recGblGetGraphicDouble(paddr, pgd);
343 int fieldOffset = dbGetFieldIndex(paddr) -
indexof(DLY1);
345 if (fieldOffset >= 0 && (fieldOffset & 2) == 0) {
346 pcd->lower_ctrl_limit = 0.0;
350 recGblGetControlDouble(paddr, pcd);
356 seqRecord *
prec = (seqRecord *) paddr->precord;
357 int fieldOffset = dbGetFieldIndex(paddr) -
indexof(DLY1);
359 if (fieldOffset >= 0 && (fieldOffset & 2) == 2)
360 dbGetAlarmLimits(
get_dol(prec, fieldOffset),
361 &pad->lower_alarm_limit, &pad->lower_warning_limit,
362 &pad->upper_warning_limit, &pad->upper_alarm_limit);
364 recGblGetAlarmDouble(paddr, pad);
epicsExportAddress(rset, seqRSET)
#define get_dol(prec, fieldOffset)
unsigned short epicsUInt16
struct seqRecPvt seqRecPvt
linkGrp * grps[NUM_LINKS+1]
#define get_control_double
#define get_graphic_double