Merge lp:~dirk.zimoch/epics-base/non-val-attributes into lp:~epics-core/epics-base/3.14

Proposed by Dirk Zimoch
Status: Merged
Merge reported by: Andrew Johnson
Merged at revision: not available
Proposed branch: lp:~dirk.zimoch/epics-base/non-val-attributes
Merge into: lp:~epics-core/epics-base/3.14
Diff against target: 2301 lines (+1074/-516)
19 files modified
documentation/RELEASE_NOTES.html (+8/-0)
src/rec/aSubRecord.c (+114/-13)
src/rec/aaiRecord.c (+36/-11)
src/rec/aaoRecord.c (+36/-11)
src/rec/aiRecord.c (+46/-24)
src/rec/aoRecord.c (+55/-26)
src/rec/boRecord.c (+25/-6)
src/rec/calcRecord.c (+90/-61)
src/rec/calcoutRecord.c (+106/-59)
src/rec/compressRecord.c (+27/-14)
src/rec/dfanoutRecord.c (+42/-43)
src/rec/histogramRecord.c (+50/-21)
src/rec/longinRecord.c (+38/-18)
src/rec/longoutRecord.c (+44/-29)
src/rec/selRecord.c (+62/-46)
src/rec/seqRecord.c (+117/-27)
src/rec/subArrayRecord.c (+55/-42)
src/rec/subRecord.c (+80/-49)
src/rec/waveformRecord.c (+43/-16)
To merge this branch: bzr merge lp:~dirk.zimoch/epics-base/non-val-attributes
Reviewer Review Type Date Requested Status
EPICS Core Developers Pending
Review via email: mp+26189@code.launchpad.net

Description of the change

The attributes (units, precision, graphic and control limits) of non-VAL fields used to be mainly nonsense.

Now EGU and PREC are used only for VAL-equivalent fields (i.e.VAL, OVAL, HOPR, LOPR,...). (The histogram record is an exception as it uses units and precision on its input, not on the VAL field, which is an array of counters.)
Records with variable type (->FTVL) now ignore EGU for the VAL field when using STRING or ENUM types.

All delay fields (bo.HIGH, seq.DLYn, calcout.ODLY) now report precision=2, units="s", graphic limits=0...10.

Calc-like records with many inputs of probably different units and precisions (calc, calcout, sub, aSub, seq) now fetch the attributes of these values (A...L, LA...LL) from the corresponding INPn link (aSub.VALn from the corresponding OUTn link). Constant links get precision and units from PREC and EGU if possible, precision=15 and units="" otherwise.

Discussion and future work:
* Set the severity and status attributes only on the VAL field?
* Should SPC_NOMOD fields report Nan for control limits?
* Precision is limited to 0...15 for most double fields except VAL. Remove this feature and trust the user?
* Implement common code for similar records (like base classes). This might involve re-ordering of the fields and may expand the number of similar inputs to a common number for calc-like records. This is probably a separate work package.

To post a comment you must log in.
12073. By Dirk Zimoch <dirk@ubuntu>

release notes updated

12074. By Dirk Zimoch <dirk@ubuntu>

Merged with 3.14

Revision history for this message
Andrew Johnson (anj) wrote :

The only major quibble I have with this on first glance is the choice of 10 for the maximum graphic limit of a delay field.

The indexof() macro is interesting, almost worth building directly into the xxxRecord.h output.

What happens when a link is currently disconnected?

Revision history for this message
Dirk Zimoch (dirk.zimoch) wrote :

10 seconds for the maximum delay is as arbitrary as any other value, except probably the maximum double value. But I think it is more reasonable. It is not worth the effort to implement a new field for this. Note that is is only the display limit, not the max value you can set.

indexof () has a different implementation for each record. Thus putting it into xxxRecord.h would break any device support that includes two or more different record headers in the same source code.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'documentation/RELEASE_NOTES.html'
2--- documentation/RELEASE_NOTES.html 2010-04-26 22:16:06 +0000
3+++ documentation/RELEASE_NOTES.html 2010-05-28 10:21:33 +0000
4@@ -12,6 +12,14 @@
5 <h2 align="center">Changes between 3.14.11 and 3.14.12</h2>
6 <!-- Insert new items immediately below here ... -->
7
8+<h4>Attributes of Non-VAL Fields</h4>
9+
10+<p>Non-VAL fields now report meaningful information for precision, units,
11+graphic limits, control limits, and alarm limits instead of simply using
12+PREC, EGU, HOPR, LOPR, DRVL, DRVH, HIHI, HIGH, LOW, and LOLO. All delay
13+fields have precision 2 and units "s". Input fields like A-L of the calc record
14+read these information from the corresponding INPn link if possible.
15+
16 <h4>Rewrite epicsThreadOnce()</h4>
17
18 <p>Michael Davidsaver suggested a better implementation of epicsThreadOnce()
19
20=== modified file 'src/rec/aSubRecord.c'
21--- src/rec/aSubRecord.c 2010-04-20 22:13:54 +0000
22+++ src/rec/aSubRecord.c 2010-05-28 10:21:33 +0000
23@@ -53,14 +53,14 @@
24 static long cvt_dbaddr(DBADDR *);
25 static long get_array_info(DBADDR *, long *, long *);
26 static long put_array_info(DBADDR *, long );
27-#define get_units NULL
28+static long get_units(DBADDR *, char *);
29 static long get_precision(DBADDR *, long *);
30 #define get_enum_str NULL
31 #define get_enum_strs NULL
32 #define put_enum_str NULL
33-#define get_graphic_double NULL
34-#define get_control_double NULL
35-#define get_alarm_double NULL
36+static long get_graphic_double(DBADDR *, struct dbr_grDouble *);
37+static long get_control_double(DBADDR *, struct dbr_ctrlDouble *);
38+static long get_alarm_double(DBADDR *, struct dbr_alDouble *);
39
40 rset aSubRSET = {
41 RSETNUMBER,
42@@ -330,15 +330,116 @@
43 return 0;
44 }
45
46-static long get_precision(DBADDR *paddr, long *precision)
47-{
48- aSubRecord *prec = (aSubRecord *)paddr->precord;
49-
50- *precision = prec->prec;
51- recGblGetPrec(paddr, precision);
52- return 0;
53-}
54-
55+#define indexof(field) aSubRecord##field
56+
57+static long get_inlinkNumber(int fieldIndex) {
58+ if (fieldIndex >= indexof(A) && fieldIndex <= indexof(U))
59+ return fieldIndex - indexof(A);
60+ return -1;
61+}
62+
63+static long get_outlinkNumber(int fieldIndex) {
64+ if (fieldIndex >= indexof(VALA) && fieldIndex <= indexof(VALU))
65+ return fieldIndex - indexof(VALA);
66+ return -1;
67+}
68+
69+static long get_units(DBADDR *paddr, char *units)
70+{
71+ aSubRecord *prec = (aSubRecord *)paddr->precord;
72+ int linkNumber;
73+
74+ linkNumber = get_inlinkNumber(dbGetFieldIndex(paddr));
75+ if (linkNumber >= 0) {
76+ dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
77+ return 0;
78+ }
79+ linkNumber = get_outlinkNumber(dbGetFieldIndex(paddr));
80+ if (linkNumber >= 0) {
81+ dbGetUnits(&prec->outa + linkNumber, units, DB_UNITS_SIZE);
82+ }
83+ return 0;
84+}
85+
86+static long get_precision(DBADDR *paddr, long *pprecision)
87+{
88+ aSubRecord *prec = (aSubRecord *)paddr->precord;
89+ int fieldIndex = dbGetFieldIndex(paddr);
90+ int linkNumber;
91+ short precision;
92+
93+ *pprecision = prec->prec;
94+ linkNumber = get_inlinkNumber(fieldIndex);
95+ if (linkNumber >= 0) {
96+ if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
97+ *pprecision = precision;
98+ return 0;
99+ }
100+ linkNumber = get_outlinkNumber(fieldIndex);
101+ if (linkNumber >= 0) {
102+ if (dbGetPrecision(&prec->outa + linkNumber, &precision) == 0)
103+ *pprecision = precision;
104+ return 0;
105+ }
106+ recGblGetPrec(paddr, pprecision);
107+ return 0;
108+}
109+
110+static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
111+{
112+ aSubRecord *prec = (aSubRecord *)paddr->precord;
113+ int fieldIndex = dbGetFieldIndex(paddr);
114+ int linkNumber;
115+
116+ linkNumber = get_inlinkNumber(fieldIndex);
117+ if (linkNumber >= 0) {
118+ dbGetGraphicLimits(&prec->inpa + linkNumber,
119+ &pgd->lower_disp_limit,
120+ &pgd->upper_disp_limit);
121+ return 0;
122+ }
123+ linkNumber = get_outlinkNumber(fieldIndex);
124+ if (linkNumber >= 0) {
125+ dbGetGraphicLimits(&prec->outa + linkNumber,
126+ &pgd->lower_disp_limit,
127+ &pgd->upper_disp_limit);
128+ }
129+ return 0;
130+}
131+
132+static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
133+{
134+ recGblGetControlDouble(paddr,pcd);
135+ return 0;
136+}
137+
138+static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
139+{
140+ aSubRecord *prec = (aSubRecord *)paddr->precord;
141+ int fieldIndex = dbGetFieldIndex(paddr);
142+ int linkNumber;
143+
144+ linkNumber = get_inlinkNumber(fieldIndex);
145+ if (linkNumber >= 0) {
146+ dbGetAlarmLimits(&prec->inpa + linkNumber,
147+ &pad->lower_alarm_limit,
148+ &pad->lower_warning_limit,
149+ &pad->upper_warning_limit,
150+ &pad->upper_alarm_limit);
151+ return 0;
152+ }
153+ linkNumber = get_outlinkNumber(fieldIndex);
154+ if (linkNumber >= 0) {
155+ dbGetAlarmLimits(&prec->outa + linkNumber,
156+ &pad->lower_alarm_limit,
157+ &pad->lower_warning_limit,
158+ &pad->upper_warning_limit,
159+ &pad->upper_alarm_limit);
160+ return 0;
161+ }
162+ recGblGetAlarmDouble(paddr, pad);
163+ return 0;
164+}
165
166 static void monitor(aSubRecord *prec)
167 {
168
169=== modified file 'src/rec/aaiRecord.c'
170--- src/rec/aaiRecord.c 2009-07-08 18:14:11 +0000
171+++ src/rec/aaiRecord.c 2010-05-28 10:21:33 +0000
172@@ -191,11 +191,20 @@
173 return 0;
174 }
175
176+#define indexof(field) aaiRecord##field
177+
178 static long get_units(DBADDR *paddr, char *units)
179 {
180 aaiRecord *prec = (aaiRecord *)paddr->precord;
181
182- strncpy(units, prec->egu, DB_UNITS_SIZE);
183+ switch (dbGetFieldIndex(paddr)) {
184+ case indexof(VAL):
185+ if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
186+ break;
187+ case indexof(HOPR):
188+ case indexof(LOPR):
189+ strncpy(units,prec->egu,DB_UNITS_SIZE);
190+ }
191 return 0;
192 }
193
194@@ -204,8 +213,8 @@
195 aaiRecord *prec = (aaiRecord *)paddr->precord;
196
197 *precision = prec->prec;
198- if (paddr->pfield == (void *)prec->bptr) return 0;
199- recGblGetPrec(paddr, precision);
200+ if (dbGetFieldIndex(paddr) != indexof(VAL))
201+ recGblGetPrec(paddr, precision);
202 return 0;
203 }
204
205@@ -213,10 +222,18 @@
206 {
207 aaiRecord *prec = (aaiRecord *)paddr->precord;
208
209- if (paddr->pfield == (void *)prec->bptr) {
210- pgd->upper_disp_limit = prec->hopr;
211- pgd->lower_disp_limit = prec->lopr;
212- } else recGblGetGraphicDouble(paddr, pgd);
213+ switch (dbGetFieldIndex(paddr)) {
214+ case indexof(VAL):
215+ pgd->upper_disp_limit = prec->hopr;
216+ pgd->lower_disp_limit = prec->lopr;
217+ break;
218+ case indexof(NORD):
219+ pgd->upper_disp_limit = prec->nelm;
220+ pgd->lower_disp_limit = 0;
221+ break;
222+ default:
223+ recGblGetGraphicDouble(paddr, pgd);
224+ }
225 return 0;
226 }
227
228@@ -224,10 +241,18 @@
229 {
230 aaiRecord *prec = (aaiRecord *)paddr->precord;
231
232- if (paddr->pfield == (void *)prec->bptr) {
233- pcd->upper_ctrl_limit = prec->hopr;
234- pcd->lower_ctrl_limit = prec->lopr;
235- } else recGblGetControlDouble(paddr, pcd);
236+ switch (dbGetFieldIndex(paddr)) {
237+ case indexof(VAL):
238+ pcd->upper_ctrl_limit = prec->hopr;
239+ pcd->lower_ctrl_limit = prec->lopr;
240+ break;
241+ case indexof(NORD):
242+ pcd->upper_ctrl_limit = prec->nelm;
243+ pcd->lower_ctrl_limit = 0;
244+ break;
245+ default:
246+ recGblGetControlDouble(paddr, pcd);
247+ }
248 return 0;
249 }
250
251
252=== modified file 'src/rec/aaoRecord.c'
253--- src/rec/aaoRecord.c 2009-07-08 18:14:11 +0000
254+++ src/rec/aaoRecord.c 2010-05-28 10:21:33 +0000
255@@ -188,11 +188,20 @@
256 return 0;
257 }
258
259+#define indexof(field) aaoRecord##field
260+
261 static long get_units(DBADDR *paddr, char *units)
262 {
263 aaoRecord *prec = (aaoRecord *)paddr->precord;
264
265- strncpy(units, prec->egu, DB_UNITS_SIZE);
266+ switch (dbGetFieldIndex(paddr)) {
267+ case indexof(VAL):
268+ if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
269+ break;
270+ case indexof(HOPR):
271+ case indexof(LOPR):
272+ strncpy(units,prec->egu,DB_UNITS_SIZE);
273+ }
274 return 0;
275 }
276
277@@ -201,8 +210,8 @@
278 aaoRecord *prec = (aaoRecord *)paddr->precord;
279
280 *precision = prec->prec;
281- if (paddr->pfield == (void *)prec->bptr) return 0;
282- recGblGetPrec(paddr, precision);
283+ if (dbGetFieldIndex(paddr) != indexof(VAL))
284+ recGblGetPrec(paddr, precision);
285 return 0;
286 }
287
288@@ -210,10 +219,18 @@
289 {
290 aaoRecord *prec = (aaoRecord *)paddr->precord;
291
292- if (paddr->pfield == (void *)prec->bptr) {
293- pgd->upper_disp_limit = prec->hopr;
294- pgd->lower_disp_limit = prec->lopr;
295- } else recGblGetGraphicDouble(paddr,pgd);
296+ switch (dbGetFieldIndex(paddr)) {
297+ case indexof(VAL):
298+ pgd->upper_disp_limit = prec->hopr;
299+ pgd->lower_disp_limit = prec->lopr;
300+ break;
301+ case indexof(NORD):
302+ pgd->upper_disp_limit = prec->nelm;
303+ pgd->lower_disp_limit = 0;
304+ break;
305+ default:
306+ recGblGetGraphicDouble(paddr, pgd);
307+ }
308 return 0;
309 }
310
311@@ -221,10 +238,18 @@
312 {
313 aaoRecord *prec = (aaoRecord *)paddr->precord;
314
315- if(paddr->pfield==(void *)prec->bptr){
316- pcd->upper_ctrl_limit = prec->hopr;
317- pcd->lower_ctrl_limit = prec->lopr;
318- } else recGblGetControlDouble(paddr,pcd);
319+ switch (dbGetFieldIndex(paddr)) {
320+ case indexof(VAL):
321+ pcd->upper_ctrl_limit = prec->hopr;
322+ pcd->lower_ctrl_limit = prec->lopr;
323+ break;
324+ case indexof(NORD):
325+ pcd->upper_ctrl_limit = prec->nelm;
326+ pcd->lower_ctrl_limit = 0;
327+ break;
328+ default:
329+ recGblGetControlDouble(paddr, pcd);
330+ }
331 return 0;
332 }
333
334
335=== modified file 'src/rec/aiRecord.c'
336--- src/rec/aiRecord.c 2010-04-05 18:49:18 +0000
337+++ src/rec/aiRecord.c 2010-05-28 10:21:33 +0000
338@@ -217,11 +217,22 @@
339 }
340 }
341
342
343+#define indexof(field) aiRecord##field
344+
345 static long get_units(DBADDR *paddr, char *units)
346 {
347 aiRecord *prec=(aiRecord *)paddr->precord;
348
349- strncpy(units,prec->egu,DB_UNITS_SIZE);
350+ if(paddr->pfldDes->field_type == DBF_DOUBLE) {
351+ switch (dbGetFieldIndex(paddr)) {
352+ case indexof(ASLO):
353+ case indexof(AOFF):
354+ case indexof(SMOO):
355+ break;
356+ default:
357+ strncpy(units,prec->egu,DB_UNITS_SIZE);
358+ }
359+ }
360 return(0);
361 }
362
363@@ -230,7 +241,7 @@
364 aiRecord *prec=(aiRecord *)paddr->precord;
365
366 *precision = prec->prec;
367- if(paddr->pfield == (void *)&prec->val) return(0);
368+ if (dbGetFieldIndex(paddr) == indexof(VAL)) return(0);
369 recGblGetPrec(paddr,precision);
370 return(0);
371 }
372@@ -238,43 +249,54 @@
373 static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
374 {
375 aiRecord *prec=(aiRecord *)paddr->precord;
376- int fieldIndex = dbGetFieldIndex(paddr);
377
378- if(fieldIndex == aiRecordVAL
379- || fieldIndex == aiRecordHIHI
380- || fieldIndex == aiRecordHIGH
381- || fieldIndex == aiRecordLOW
382- || fieldIndex == aiRecordLOLO
383- || fieldIndex == aiRecordHOPR
384- || fieldIndex == aiRecordLOPR) {
385- pgd->upper_disp_limit = prec->hopr;
386- pgd->lower_disp_limit = prec->lopr;
387- } else recGblGetGraphicDouble(paddr,pgd);
388+ switch (dbGetFieldIndex(paddr)) {
389+ case indexof(VAL):
390+ case indexof(HIHI):
391+ case indexof(HIGH):
392+ case indexof(LOW):
393+ case indexof(LOLO):
394+ case indexof(LALM):
395+ case indexof(ALST):
396+ case indexof(MLST):
397+ case indexof(SVAL):
398+ pgd->upper_disp_limit = prec->hopr;
399+ pgd->lower_disp_limit = prec->lopr;
400+ break;
401+ default:
402+ recGblGetGraphicDouble(paddr,pgd);
403+ }
404 return(0);
405 }
406
407 static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
408 {
409 aiRecord *prec=(aiRecord *)paddr->precord;
410- int fieldIndex = dbGetFieldIndex(paddr);
411
412- if(fieldIndex == aiRecordVAL
413- || fieldIndex == aiRecordHIHI
414- || fieldIndex == aiRecordHIGH
415- || fieldIndex == aiRecordLOW
416- || fieldIndex == aiRecordLOLO) {
417- pcd->upper_ctrl_limit = prec->hopr;
418- pcd->lower_ctrl_limit = prec->lopr;
419- } else recGblGetControlDouble(paddr,pcd);
420+ switch (dbGetFieldIndex(paddr)) {
421+ case indexof(VAL):
422+ case indexof(HIHI):
423+ case indexof(HIGH):
424+ case indexof(LOW):
425+ case indexof(LOLO):
426+ case indexof(LALM):
427+ case indexof(ALST):
428+ case indexof(MLST):
429+ case indexof(SVAL):
430+ pcd->upper_ctrl_limit = prec->hopr;
431+ pcd->lower_ctrl_limit = prec->lopr;
432+ break;
433+ default:
434+ recGblGetControlDouble(paddr,pcd);
435+ }
436 return(0);
437 }
438
439 static long get_alarm_double(DBADDR *paddr,struct dbr_alDouble *pad)
440 {
441 aiRecord *prec=(aiRecord *)paddr->precord;
442- int fieldIndex = dbGetFieldIndex(paddr);
443
444- if(fieldIndex == aiRecordVAL) {
445+ if (dbGetFieldIndex(paddr) == indexof(VAL)) {
446 pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
447 pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
448 pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
449
450=== modified file 'src/rec/aoRecord.c'
451--- src/rec/aoRecord.c 2010-04-05 18:49:18 +0000
452+++ src/rec/aoRecord.c 2010-05-28 10:21:33 +0000
453@@ -276,11 +276,21 @@
454 }
455 }
456
457+#define indexof(field) aoRecord##field
458+
459 static long get_units(DBADDR * paddr,char *units)
460 {
461 aoRecord *prec=(aoRecord *)paddr->precord;
462
463- strncpy(units,prec->egu,DB_UNITS_SIZE);
464+ if(paddr->pfldDes->field_type == DBF_DOUBLE) {
465+ switch (dbGetFieldIndex(paddr)) {
466+ case indexof(ASLO):
467+ case indexof(AOFF):
468+ break;
469+ default:
470+ strncpy(units,prec->egu,DB_UNITS_SIZE);
471+ }
472+ }
473 return(0);
474 }
475
476@@ -289,10 +299,14 @@
477 aoRecord *prec=(aoRecord *)paddr->precord;
478
479 *precision = prec->prec;
480- if(paddr->pfield == (void *)&prec->val
481- || paddr->pfield == (void *)&prec->oval
482- || paddr->pfield == (void *)&prec->pval) return(0);
483- recGblGetPrec(paddr,precision);
484+ switch (dbGetFieldIndex(paddr)) {
485+ case indexof(VAL):
486+ case indexof(OVAL):
487+ case indexof(PVAL):
488+ break;
489+ default:
490+ recGblGetPrec(paddr,precision);
491+ }
492 return(0);
493 }
494
495
496@@ -300,16 +314,24 @@
497 {
498 aoRecord *prec=(aoRecord *)paddr->precord;
499
500- if(paddr->pfield==(void *)&prec->val
501- || paddr->pfield==(void *)&prec->hihi
502- || paddr->pfield==(void *)&prec->high
503- || paddr->pfield==(void *)&prec->low
504- || paddr->pfield==(void *)&prec->lolo
505- || paddr->pfield==(void *)&prec->oval
506- || paddr->pfield==(void *)&prec->pval){
507- pgd->upper_disp_limit = prec->hopr;
508- pgd->lower_disp_limit = prec->lopr;
509- } else recGblGetGraphicDouble(paddr,pgd);
510+ switch (dbGetFieldIndex(paddr)) {
511+ case indexof(VAL):
512+ case indexof(OVAL):
513+ case indexof(PVAL):
514+ case indexof(HIHI):
515+ case indexof(HIGH):
516+ case indexof(LOW):
517+ case indexof(LOLO):
518+ case indexof(LALM):
519+ case indexof(ALST):
520+ case indexof(MLST):
521+ case indexof(IVOV):
522+ pgd->upper_disp_limit = prec->hopr;
523+ pgd->lower_disp_limit = prec->lopr;
524+ break;
525+ default:
526+ recGblGetGraphicDouble(paddr,pgd);
527+ }
528 return(0);
529 }
530
531@@ -317,23 +339,30 @@
532 {
533 aoRecord *prec=(aoRecord *)paddr->precord;
534
535- if(paddr->pfield==(void *)&prec->val
536- || paddr->pfield==(void *)&prec->hihi
537- || paddr->pfield==(void *)&prec->high
538- || paddr->pfield==(void *)&prec->low
539- || paddr->pfield==(void *)&prec->lolo
540- || paddr->pfield==(void *)&prec->oval
541- || paddr->pfield==(void *)&prec->pval){
542- pcd->upper_ctrl_limit = prec->drvh;
543- pcd->lower_ctrl_limit = prec->drvl;
544- } else recGblGetControlDouble(paddr,pcd);
545+ switch (dbGetFieldIndex(paddr)) {
546+ case indexof(VAL):
547+ case indexof(OVAL):
548+ case indexof(PVAL):
549+ case indexof(HIHI):
550+ case indexof(HIGH):
551+ case indexof(LOW):
552+ case indexof(LOLO):
553+ case indexof(LALM):
554+ case indexof(ALST):
555+ case indexof(MLST):
556+ pcd->upper_ctrl_limit = prec->drvh;
557+ pcd->lower_ctrl_limit = prec->drvl;
558+ break;
559+ default:
560+ recGblGetControlDouble(paddr,pcd);
561+ }
562 return(0);
563 }
564 static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
565 {
566 aoRecord *prec=(aoRecord *)paddr->precord;
567
568- if(paddr->pfield==(void *)&prec->val){
569+ if(dbGetFieldIndex(paddr) == indexof(VAL)){
570 pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
571 pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
572 pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
573
574=== modified file 'src/rec/boRecord.c'
575--- src/rec/boRecord.c 2010-04-05 18:49:18 +0000
576+++ src/rec/boRecord.c 2010-05-28 10:21:33 +0000
577@@ -51,13 +51,13 @@
578 #define cvt_dbaddr NULL
579 #define get_array_info NULL
580 #define put_array_info NULL
581-#define get_units NULL
582+static long get_units(DBADDR *, char *);
583 static long get_precision(DBADDR *, long *);
584 static long get_enum_str(DBADDR *, char *);
585 static long get_enum_strs(DBADDR *, struct dbr_enumStrs *);
586 static long put_enum_str(DBADDR *, char *);
587 #define get_graphic_double NULL
588-#define get_control_double NULL
589+static long get_control_double(DBADDR *, struct dbr_ctrlDouble *);
590 #define get_alarm_double NULL
591
592 rset boRSET={
593@@ -268,12 +268,31 @@
594 return(status);
595 }
596
597
598+#define indexof(field) boRecord##field
599+
600+static long get_units(DBADDR *paddr, char *units)
601+{
602+ if(dbGetFieldIndex(paddr) == indexof(HIGH))
603+ strcpy(units, "s");
604+ return(0);
605+}
606+
607 static long get_precision(DBADDR *paddr, long *precision)
608 {
609- boRecord *prec=(boRecord *)paddr->precord;
610+ if(dbGetFieldIndex(paddr) == indexof(HIGH))
611+ *precision = 2;
612+ else
613+ recGblGetPrec(paddr,precision);
614+ return(0);
615+}
616
617- if(paddr->pfield == (void *)&prec->high) *precision=2;
618- else recGblGetPrec(paddr,precision);
619+static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
620+{
621+ if(dbGetFieldIndex(paddr) == indexof(HIGH)) {
622+ pcd->lower_ctrl_limit = 0.0;
623+ pcd->upper_ctrl_limit = 10.0;
624+ } else
625+ recGblGetControlDouble(paddr,pcd);
626 return(0);
627 }
628
629@@ -285,7 +304,7 @@
630
631
632 index = dbGetFieldIndex(paddr);
633- if(index!=boRecordVAL) {
634+ if(index!=indexof(VAL)) {
635 strcpy(pstring,"Illegal_Value");
636 } else if(*pfield==0) {
637 strncpy(pstring,prec->znam,sizeof(prec->znam));
638
639=== modified file 'src/rec/calcRecord.c'
640--- src/rec/calcRecord.c 2009-04-03 14:40:13 +0000
641+++ src/rec/calcRecord.c 2010-05-28 10:21:33 +0000
642@@ -54,7 +54,7 @@
643 #define get_enum_strs NULL
644 #define put_enum_str NULL
645 static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd);
646-static long get_ctrl_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd);
647+static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd);
648 static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad);
649
650 rset calcRSET={
651@@ -74,7 +74,7 @@
652 get_enum_strs,
653 put_enum_str,
654 get_graphic_double,
655- get_ctrl_double,
656+ get_control_double,
657 get_alarm_double
658 };
659 epicsExportAddress(rset, calcRSET);
660@@ -148,97 +148,126 @@
661 return S_db_badChoice;
662 }
663
664+#define indexof(field) calcRecord##field
665+
666+static long get_linkNumber(int fieldIndex) {
667+ if (fieldIndex >= indexof(A) && fieldIndex <= indexof(L))
668+ return fieldIndex - indexof(A);
669+ if (fieldIndex >= indexof(LA) && fieldIndex <= indexof(LL))
670+ return fieldIndex - indexof(LA);
671+ return -1;
672+}
673+
674 static long get_units(DBADDR *paddr, char *units)
675 {
676 calcRecord *prec = (calcRecord *)paddr->precord;
677+ int linkNumber;
678
679- strncpy(units, prec->egu, DB_UNITS_SIZE);
680+ if(paddr->pfldDes->field_type == DBF_DOUBLE) {
681+ linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
682+ if (linkNumber >= 0)
683+ dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
684+ else
685+ strncpy(units,prec->egu,DB_UNITS_SIZE);
686+ }
687 return 0;
688 }
689
690 static long get_precision(DBADDR *paddr, long *pprecision)
691 {
692 calcRecord *prec = (calcRecord *)paddr->precord;
693+ int fieldIndex = dbGetFieldIndex(paddr);
694+ int linkNumber;
695
696- if (paddr->pfield == (void *)&prec->val) {
697- *pprecision = prec->prec;
698- } else {
699- recGblGetPrec(paddr, pprecision);
700+ *pprecision = prec->prec;
701+ if (fieldIndex == indexof(VAL)) {
702+ return 0;
703 }
704+ linkNumber = get_linkNumber(fieldIndex);
705+ if (linkNumber >= 0) {
706+ short precision;
707+ if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
708+ *pprecision = precision;
709+ else
710+ *pprecision = 15;
711+ } else
712+ recGblGetPrec(paddr, pprecision);
713 return 0;
714 }
715
716 static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
717 {
718 calcRecord *prec = (calcRecord *)paddr->precord;
719-
720- if (paddr->pfield == (void *)&prec->val ||
721- paddr->pfield == (void *)&prec->hihi ||
722- paddr->pfield == (void *)&prec->high ||
723- paddr->pfield == (void *)&prec->low ||
724- paddr->pfield == (void *)&prec->lolo) {
725- pgd->upper_disp_limit = prec->hopr;
726- pgd->lower_disp_limit = prec->lopr;
727- return 0;
728- }
729-
730- if (paddr->pfield >= (void *)&prec->a &&
731- paddr->pfield <= (void *)&prec->l) {
732- pgd->upper_disp_limit = prec->hopr;
733- pgd->lower_disp_limit = prec->lopr;
734- return 0;
735- }
736- if (paddr->pfield >= (void *)&prec->la &&
737- paddr->pfield <= (void *)&prec->ll) {
738- pgd->upper_disp_limit = prec->hopr;
739- pgd->lower_disp_limit = prec->lopr;
740- return 0;
741- }
742- recGblGetGraphicDouble(paddr, pgd);
743+ int fieldIndex = dbGetFieldIndex(paddr);
744+ int linkNumber;
745+
746+ switch (fieldIndex) {
747+ case indexof(VAL):
748+ case indexof(HIHI):
749+ case indexof(HIGH):
750+ case indexof(LOW):
751+ case indexof(LOLO):
752+ case indexof(LALM):
753+ case indexof(ALST):
754+ case indexof(MLST):
755+ pgd->lower_disp_limit = prec->lopr;
756+ pgd->upper_disp_limit = prec->hopr;
757+ break;
758+ default:
759+ linkNumber = get_linkNumber(fieldIndex);
760+ if (linkNumber >= 0) {
761+ dbGetGraphicLimits(&prec->inpa + linkNumber,
762+ &pgd->lower_disp_limit,
763+ &pgd->upper_disp_limit);
764+ } else
765+ recGblGetGraphicDouble(paddr,pgd);
766+ }
767 return 0;
768 }
769
770-static long get_ctrl_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
771+static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
772 {
773 calcRecord *prec = (calcRecord *)paddr->precord;
774-
775- if (paddr->pfield == (void *)&prec->val ||
776- paddr->pfield == (void *)&prec->hihi ||
777- paddr->pfield == (void *)&prec->high ||
778- paddr->pfield == (void *)&prec->low ||
779- paddr->pfield == (void *)&prec->lolo) {
780- pcd->upper_ctrl_limit = prec->hopr;
781- pcd->lower_ctrl_limit = prec->lopr;
782- return 0;
783- }
784-
785- if (paddr->pfield >= (void *)&prec->a &&
786- paddr->pfield <= (void *)&prec->l) {
787- pcd->upper_ctrl_limit = prec->hopr;
788- pcd->lower_ctrl_limit = prec->lopr;
789- return 0;
790- }
791- if (paddr->pfield >= (void *)&prec->la &&
792- paddr->pfield <= (void *)&prec->ll) {
793- pcd->upper_ctrl_limit = prec->hopr;
794- pcd->lower_ctrl_limit = prec->lopr;
795- return 0;
796- }
797- recGblGetControlDouble(paddr, pcd);
798+
799+ switch (dbGetFieldIndex(paddr)) {
800+ case indexof(VAL):
801+ case indexof(HIHI):
802+ case indexof(HIGH):
803+ case indexof(LOW):
804+ case indexof(LOLO):
805+ case indexof(LALM):
806+ case indexof(ALST):
807+ case indexof(MLST):
808+ pcd->lower_ctrl_limit = prec->lopr;
809+ pcd->upper_ctrl_limit = prec->hopr;
810+ break;
811+ default:
812+ recGblGetControlDouble(paddr,pcd);
813+ }
814 return 0;
815 }
816
817 static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
818 {
819 calcRecord *prec = (calcRecord *)paddr->precord;
820+ int fieldIndex = dbGetFieldIndex(paddr);
821+ int linkNumber;
822
823- if (paddr->pfield == (void *)&prec->val) {
824+ if (fieldIndex == indexof(VAL)) {
825+ pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
826+ pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
827+ pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
828 pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
829- pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
830- pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
831- pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
832 } else {
833- recGblGetAlarmDouble(paddr, pad);
834+ linkNumber = get_linkNumber(fieldIndex);
835+ if (linkNumber >= 0) {
836+ dbGetAlarmLimits(&prec->inpa + linkNumber,
837+ &pad->lower_alarm_limit,
838+ &pad->lower_warning_limit,
839+ &pad->upper_warning_limit,
840+ &pad->upper_alarm_limit);
841+ } else
842+ recGblGetAlarmDouble(paddr, pad);
843 }
844 return 0;
845 }
846
847=== modified file 'src/rec/calcoutRecord.c'
848--- src/rec/calcoutRecord.c 2010-04-05 18:49:18 +0000
849+++ src/rec/calcoutRecord.c 2010-05-28 10:21:33 +0000
850@@ -59,7 +59,7 @@
851 #define get_enum_strs NULL
852 #define put_enum_str NULL
853 static long get_graphic_double(DBADDR *, struct dbr_grDouble *);
854-static long get_ctrl_double(DBADDR *, struct dbr_ctrlDouble *);
855+static long get_control_double(DBADDR *, struct dbr_ctrlDouble *);
856 static long get_alarm_double(DBADDR *, struct dbr_alDouble *);
857
858 rset calcoutRSET = {
859@@ -79,7 +79,7 @@
860 get_enum_strs,
861 put_enum_str,
862 get_graphic_double,
863- get_ctrl_double,
864+ get_control_double,
865 get_alarm_double
866 };
867 epicsExportAddress(rset, calcoutRSET);
868@@ -363,97 +363,144 @@
869 }
870 }
871
872+#define indexof(field) calcoutRecord##field
873+
874+static long get_linkNumber(int fieldIndex) {
875+ if (fieldIndex >= indexof(A) && fieldIndex <= indexof(L))
876+ return fieldIndex - indexof(A);
877+ if (fieldIndex >= indexof(LA) && fieldIndex <= indexof(LL))
878+ return fieldIndex - indexof(LA);
879+ return -1;
880+}
881+
882 static long get_units(DBADDR *paddr, char *units)
883 {
884 calcoutRecord *prec = (calcoutRecord *)paddr->precord;
885-
886- strncpy(units, prec->egu, DB_UNITS_SIZE);
887+ int fieldIndex = dbGetFieldIndex(paddr);
888+ int linkNumber;
889+
890+ if(fieldIndex == indexof(ODLY)) {
891+ strcpy(units, "s");
892+ return 0;
893+ }
894+
895+ if(paddr->pfldDes->field_type == DBF_DOUBLE) {
896+ linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
897+ if (linkNumber >= 0)
898+ dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
899+ else
900+ strncpy(units,prec->egu,DB_UNITS_SIZE);
901+ }
902 return 0;
903 }
904
905 static long get_precision(DBADDR *paddr, long *pprecision)
906 {
907 calcoutRecord *prec = (calcoutRecord *)paddr->precord;
908+ int fieldIndex = dbGetFieldIndex(paddr);
909+ int linkNumber;
910
911- if (paddr->pfield == (void *)&prec->val) {
912- *pprecision = prec->prec;
913- } else {
914+ if(fieldIndex == indexof(ODLY)) {
915+ *pprecision = 2;
916+ return 0;
917+ }
918+ *pprecision = prec->prec;
919+ if (fieldIndex == indexof(VAL)) {
920+ return 0;
921+ }
922+ linkNumber = get_linkNumber(fieldIndex);
923+ if (linkNumber >= 0) {
924+ short precision;
925+ if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
926+ *pprecision = precision;
927+ else
928+ *pprecision = 15;
929+ } else
930 recGblGetPrec(paddr, pprecision);
931- }
932 return 0;
933 }
934
935 static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
936 {
937 calcoutRecord *prec = (calcoutRecord *)paddr->precord;
938-
939- if (paddr->pfield == (void *)&prec->val ||
940- paddr->pfield == (void *)&prec->hihi ||
941- paddr->pfield == (void *)&prec->high ||
942- paddr->pfield == (void *)&prec->low ||
943- paddr->pfield == (void *)&prec->lolo) {
944- pgd->upper_disp_limit = prec->hopr;
945- pgd->lower_disp_limit = prec->lopr;
946- return 0;
947- }
948-
949- if (paddr->pfield >= (void *)&prec->a &&
950- paddr->pfield <= (void *)&prec->l) {
951- pgd->upper_disp_limit = prec->hopr;
952- pgd->lower_disp_limit = prec->lopr;
953- return 0;
954- }
955- if (paddr->pfield >= (void *)&prec->la &&
956- paddr->pfield <= (void *)&prec->ll) {
957- pgd->upper_disp_limit = prec->hopr;
958- pgd->lower_disp_limit = prec->lopr;
959- return 0;
960- }
961- recGblGetGraphicDouble(paddr, pgd);
962+ int fieldIndex = dbGetFieldIndex(paddr);
963+ int linkNumber;
964+
965+ switch (fieldIndex) {
966+ case indexof(VAL):
967+ case indexof(HIHI):
968+ case indexof(HIGH):
969+ case indexof(LOW):
970+ case indexof(LOLO):
971+ case indexof(LALM):
972+ case indexof(ALST):
973+ case indexof(MLST):
974+ pgd->lower_disp_limit = prec->lopr;
975+ pgd->upper_disp_limit = prec->hopr;
976+ break;
977+ case indexof(ODLY):
978+ recGblGetGraphicDouble(paddr,pgd);
979+ pgd->lower_disp_limit = 0.0;
980+ break;
981+ default:
982+ linkNumber = get_linkNumber(fieldIndex);
983+ if (linkNumber >= 0) {
984+ dbGetGraphicLimits(&prec->inpa + linkNumber,
985+ &pgd->lower_disp_limit,
986+ &pgd->upper_disp_limit);
987+ } else
988+ recGblGetGraphicDouble(paddr,pgd);
989+ }
990 return 0;
991 }
992
993-static long get_ctrl_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
994+static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
995 {
996 calcoutRecord *prec = (calcoutRecord *)paddr->precord;
997-
998- if (paddr->pfield == (void *)&prec->val ||
999- paddr->pfield == (void *)&prec->hihi ||
1000- paddr->pfield == (void *)&prec->high ||
1001- paddr->pfield == (void *)&prec->low ||
1002- paddr->pfield == (void *)&prec->lolo) {
1003- pcd->upper_ctrl_limit = prec->hopr;
1004- pcd->lower_ctrl_limit = prec->lopr;
1005- return 0;
1006- }
1007-
1008- if (paddr->pfield >= (void *)&prec->a &&
1009- paddr->pfield <= (void *)&prec->l) {
1010- pcd->upper_ctrl_limit = prec->hopr;
1011- pcd->lower_ctrl_limit = prec->lopr;
1012- return 0;
1013- }
1014- if (paddr->pfield >= (void *)&prec->la &&
1015- paddr->pfield <= (void *)&prec->ll) {
1016- pcd->upper_ctrl_limit = prec->hopr;
1017- pcd->lower_ctrl_limit = prec->lopr;
1018- return 0;
1019- }
1020- recGblGetControlDouble(paddr, pcd);
1021+
1022+ switch (dbGetFieldIndex(paddr)) {
1023+ case indexof(VAL):
1024+ case indexof(HIHI):
1025+ case indexof(HIGH):
1026+ case indexof(LOW):
1027+ case indexof(LOLO):
1028+ case indexof(LALM):
1029+ case indexof(ALST):
1030+ case indexof(MLST):
1031+ pcd->lower_ctrl_limit = prec->lopr;
1032+ pcd->upper_ctrl_limit = prec->hopr;
1033+ break;
1034+ case indexof(ODLY):
1035+ pcd->lower_ctrl_limit = 0.0;
1036+ pcd->upper_ctrl_limit = 10.0;
1037+ break;
1038+ default:
1039+ recGblGetControlDouble(paddr,pcd);
1040+ }
1041 return 0;
1042 }
1043
1044 static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
1045 {
1046 calcoutRecord *prec = (calcoutRecord *)paddr->precord;
1047+ int fieldIndex = dbGetFieldIndex(paddr);
1048+ int linkNumber;
1049
1050- if (paddr->pfield == (void *)&prec->val) {
1051+ if (fieldIndex == indexof(VAL)) {
1052 pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
1053 pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
1054 pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
1055 pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
1056 } else {
1057- recGblGetAlarmDouble(paddr, pad);
1058+ linkNumber = get_linkNumber(fieldIndex);
1059+ if (linkNumber >= 0) {
1060+ dbGetAlarmLimits(&prec->inpa + linkNumber,
1061+ &pad->lower_alarm_limit,
1062+ &pad->lower_warning_limit,
1063+ &pad->upper_warning_limit,
1064+ &pad->upper_alarm_limit);
1065+ } else
1066+ recGblGetAlarmDouble(paddr, pad);
1067 }
1068 return 0;
1069 }
1070
1071=== modified file 'src/rec/compressRecord.c'
1072--- src/rec/compressRecord.c 2010-04-02 21:26:17 +0000
1073+++ src/rec/compressRecord.c 2010-05-28 10:21:33 +0000
1074@@ -398,11 +398,16 @@
1075 return(0);
1076 }
1077
1078
1079+#define indexof(field) compressRecord##field
1080+
1081 static long get_units(DBADDR *paddr,char *units)
1082 {
1083 compressRecord *prec=(compressRecord *)paddr->precord;
1084
1085- strncpy(units,prec->egu,DB_UNITS_SIZE);
1086+ if(paddr->pfldDes->field_type == DBF_DOUBLE
1087+ || dbGetFieldIndex(paddr) == indexof(VAL)) {
1088+ strncpy(units,prec->egu,DB_UNITS_SIZE);
1089+ }
1090 return(0);
1091 }
1092
1093@@ -411,7 +416,7 @@
1094 compressRecord *prec=(compressRecord *)paddr->precord;
1095
1096 *precision = prec->prec;
1097- if(paddr->pfield == (void *)prec->bptr) return(0);
1098+ if(dbGetFieldIndex(paddr) == indexof(BPTR)) return(0);
1099 recGblGetPrec(paddr,precision);
1100 return(0);
1101 }
1102@@ -420,12 +425,16 @@
1103 {
1104 compressRecord *prec=(compressRecord *)paddr->precord;
1105
1106- if(paddr->pfield==(void *)prec->bptr
1107- || paddr->pfield==(void *)&prec->ihil
1108- || paddr->pfield==(void *)&prec->ilil){
1109- pgd->upper_disp_limit = prec->hopr;
1110- pgd->lower_disp_limit = prec->lopr;
1111- } else recGblGetGraphicDouble(paddr,pgd);
1112+ switch (dbGetFieldIndex(paddr)) {
1113+ case indexof(BPTR):
1114+ case indexof(IHIL):
1115+ case indexof(ILIL):
1116+ pgd->upper_disp_limit = prec->hopr;
1117+ pgd->lower_disp_limit = prec->lopr;
1118+ break;
1119+ default:
1120+ recGblGetGraphicDouble(paddr,pgd);
1121+ }
1122 return(0);
1123 }
1124
1125@@ -433,11 +442,15 @@
1126 {
1127 compressRecord *prec=(compressRecord *)paddr->precord;
1128
1129- if(paddr->pfield==(void *)prec->bptr
1130- || paddr->pfield==(void *)&prec->ihil
1131- || paddr->pfield==(void *)&prec->ilil){
1132- pcd->upper_ctrl_limit = prec->hopr;
1133- pcd->lower_ctrl_limit = prec->lopr;
1134- } else recGblGetControlDouble(paddr,pcd);
1135+ switch (dbGetFieldIndex(paddr)) {
1136+ case indexof(BPTR):
1137+ case indexof(IHIL):
1138+ case indexof(ILIL):
1139+ pcd->upper_ctrl_limit = prec->hopr;
1140+ pcd->lower_ctrl_limit = prec->lopr;
1141+ break;
1142+ default:
1143+ recGblGetControlDouble(paddr,pcd);
1144+ }
1145 return(0);
1146 }
1147
1148=== modified file 'src/rec/dfanoutRecord.c'
1149--- src/rec/dfanoutRecord.c 2009-04-03 14:40:13 +0000
1150+++ src/rec/dfanoutRecord.c 2010-05-28 10:21:33 +0000
1151@@ -126,73 +126,72 @@
1152 return(status);
1153 }
1154
1155
1156+#define indexof(field) dfanoutRecord##field
1157+
1158 static long get_units(DBADDR *paddr,char *units)
1159 {
1160 dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
1161
1162- strncpy(units,prec->egu,DB_UNITS_SIZE);
1163+ if(paddr->pfldDes->field_type == DBF_DOUBLE) {
1164+ strncpy(units,prec->egu,DB_UNITS_SIZE);
1165+ }
1166 return(0);
1167 }
1168
1169 static long get_precision(DBADDR *paddr,long *precision)
1170 {
1171 dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
1172- int fieldIndex = dbGetFieldIndex(paddr);
1173-
1174- if(fieldIndex == dfanoutRecordVAL
1175- || fieldIndex == dfanoutRecordHIHI
1176- || fieldIndex == dfanoutRecordHIGH
1177- || fieldIndex == dfanoutRecordLOW
1178- || fieldIndex == dfanoutRecordLOLO
1179- || fieldIndex == dfanoutRecordHOPR
1180- || fieldIndex == dfanoutRecordLOPR) {
1181- *precision = prec->prec;
1182- } else {
1183- recGblGetPrec(paddr,precision);
1184+
1185+ *precision = prec->prec;
1186+ if (dbGetFieldIndex(paddr) == indexof(VAL)) return(0);
1187+ recGblGetPrec(paddr,precision);
1188+ return(0);
1189+}
1190+
1191+static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
1192+{
1193+ dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
1194+
1195+ switch (dbGetFieldIndex(paddr)) {
1196+ case indexof(VAL):
1197+ case indexof(HIHI):
1198+ case indexof(HIGH):
1199+ case indexof(LOW):
1200+ case indexof(LOLO):
1201+ case indexof(LALM):
1202+ case indexof(ALST):
1203+ case indexof(MLST):
1204+ pgd->upper_disp_limit = prec->hopr;
1205+ pgd->lower_disp_limit = prec->lopr;
1206+ break;
1207+ default:
1208+ recGblGetGraphicDouble(paddr,pgd);
1209 }
1210 return(0);
1211 }
1212
1213-static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
1214-{
1215- dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
1216- int fieldIndex = dbGetFieldIndex(paddr);
1217-
1218- if(fieldIndex == dfanoutRecordVAL
1219- || fieldIndex == dfanoutRecordHIHI
1220- || fieldIndex == dfanoutRecordHIGH
1221- || fieldIndex == dfanoutRecordLOW
1222- || fieldIndex == dfanoutRecordLOLO
1223- || fieldIndex == dfanoutRecordHOPR
1224- || fieldIndex == dfanoutRecordLOPR) {
1225- pgd->upper_disp_limit = prec->hopr;
1226- pgd->lower_disp_limit = prec->lopr;
1227- } else recGblGetGraphicDouble(paddr,pgd);
1228- return(0);
1229-}
1230-
1231 static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
1232 {
1233 dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
1234- int fieldIndex = dbGetFieldIndex(paddr);
1235
1236- if(fieldIndex == dfanoutRecordVAL
1237- || fieldIndex == dfanoutRecordHIHI
1238- || fieldIndex == dfanoutRecordHIGH
1239- || fieldIndex == dfanoutRecordLOW
1240- || fieldIndex == dfanoutRecordLOLO) {
1241- pcd->upper_ctrl_limit = prec->hopr;
1242- pcd->lower_ctrl_limit = prec->lopr;
1243- } else recGblGetControlDouble(paddr,pcd);
1244+ switch (dbGetFieldIndex(paddr)) {
1245+ case indexof(VAL):
1246+ case indexof(LALM):
1247+ case indexof(ALST):
1248+ case indexof(MLST):
1249+ pcd->upper_ctrl_limit = prec->hopr;
1250+ pcd->lower_ctrl_limit = prec->lopr;
1251+ break;
1252+ default:
1253+ recGblGetControlDouble(paddr,pcd);
1254+ }
1255 return(0);
1256 }
1257 static long get_alarm_double(DBADDR *paddr,struct dbr_alDouble *pad)
1258 {
1259 dfanoutRecord *prec=(dfanoutRecord *)paddr->precord;
1260- int fieldIndex = dbGetFieldIndex(paddr);
1261-
1262
1263- if(fieldIndex == dfanoutRecordVAL) {
1264+ if(dbGetFieldIndex(paddr) == indexof(VAL)) {
1265 pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
1266 pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
1267 pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
1268
1269=== modified file 'src/rec/histogramRecord.c'
1270--- src/rec/histogramRecord.c 2009-07-08 18:14:11 +0000
1271+++ src/rec/histogramRecord.c 2010-05-28 10:21:33 +0000
1272@@ -52,7 +52,7 @@
1273 static long cvt_dbaddr(DBADDR *);
1274 static long get_array_info(DBADDR *, long *, long *);
1275 #define put_array_info NULL
1276-#define get_units NULL
1277+static long get_units(DBADDR *, char *);
1278 static long get_precision(DBADDR *paddr,long *precision);
1279 #define get_enum_str NULL
1280 #define get_enum_strs NULL
1281@@ -386,42 +386,71 @@
1282 return(status);
1283 }
1284
1285+#define indexof(field) histogramRecord##field
1286+
1287+static long get_units(DBADDR *paddr, char *units)
1288+{
1289+ if (dbGetFieldIndex(paddr) == indexof(SDEL)) {
1290+ strcpy(units,"s");
1291+ }
1292+ /* We should have EGU for other DOUBLE values or probably get it from input link SVL */
1293+ return(0);
1294+}
1295+
1296 static long get_precision(DBADDR *paddr,long *precision)
1297 {
1298 histogramRecord *prec=(histogramRecord *)paddr->precord;
1299- int fieldIndex = dbGetFieldIndex(paddr);
1300
1301- *precision = prec->prec;
1302- if(fieldIndex == histogramRecordULIM
1303- || fieldIndex == histogramRecordLLIM
1304- || fieldIndex == histogramRecordSDEL
1305- || fieldIndex == histogramRecordSGNL
1306- || fieldIndex == histogramRecordSVAL
1307- || fieldIndex == histogramRecordWDTH) {
1308- *precision = prec->prec;
1309+ switch (dbGetFieldIndex(paddr)) {
1310+ case indexof(ULIM):
1311+ case indexof(LLIM):
1312+ case indexof(SGNL):
1313+ case indexof(SVAL):
1314+ case indexof(WDTH):
1315+ *precision = prec->prec;
1316+ break;
1317+ case indexof(SDEL):
1318+ *precision = 2;
1319+ break;
1320+ default:
1321+ recGblGetPrec(paddr,precision);
1322 }
1323- recGblGetPrec(paddr,precision);
1324 return(0);
1325 }
1326+
1327 static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
1328 {
1329 histogramRecord *prec=(histogramRecord *)paddr->precord;
1330- int fieldIndex = dbGetFieldIndex(paddr);
1331
1332- if(fieldIndex == histogramRecordBPTR){
1333- pgd->upper_disp_limit = prec->hopr;
1334- pgd->lower_disp_limit = prec->lopr;
1335- } else recGblGetGraphicDouble(paddr,pgd);
1336+ switch (dbGetFieldIndex(paddr)) {
1337+ case indexof(BPTR):
1338+ pgd->upper_disp_limit = prec->hopr;
1339+ pgd->lower_disp_limit = prec->lopr;
1340+ break;
1341+ case indexof(WDTH):
1342+ pgd->upper_disp_limit = prec->ulim-prec->llim;
1343+ pgd->lower_disp_limit = 0.0;
1344+ break;
1345+ default:
1346+ recGblGetGraphicDouble(paddr,pgd);
1347+ }
1348 return(0);
1349 }
1350 static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
1351 {
1352 histogramRecord *prec=(histogramRecord *)paddr->precord;
1353- int fieldIndex = dbGetFieldIndex(paddr);
1354
1355- if(fieldIndex == histogramRecordBPTR){
1356- pcd->upper_ctrl_limit = prec->hopr;
1357- pcd->lower_ctrl_limit = prec->lopr;
1358- } else recGblGetControlDouble(paddr,pcd);
1359+ switch (dbGetFieldIndex(paddr)) {
1360+ case indexof(BPTR):
1361+ pcd->upper_ctrl_limit = prec->hopr;
1362+ pcd->lower_ctrl_limit = prec->lopr;
1363+ break;
1364+ case indexof(WDTH):
1365+ pcd->upper_ctrl_limit = prec->ulim-prec->llim;
1366+ pcd->lower_ctrl_limit = 0.0;
1367+ break;
1368+ default:
1369+ recGblGetControlDouble(paddr,pcd);
1370+ }
1371 return(0);
1372 }
1373
1374=== modified file 'src/rec/longinRecord.c'
1375--- src/rec/longinRecord.c 2010-04-05 18:49:18 +0000
1376+++ src/rec/longinRecord.c 2010-05-28 10:21:33 +0000
1377@@ -158,11 +158,15 @@
1378 return(status);
1379 }
1380
1381
1382+#define indexof(field) longinRecord##field
1383+
1384 static long get_units(DBADDR *paddr,char *units)
1385 {
1386 longinRecord *prec=(longinRecord *)paddr->precord;
1387
1388- strncpy(units,prec->egu,DB_UNITS_SIZE);
1389+ if(paddr->pfldDes->field_type == DBF_LONG) {
1390+ strncpy(units,prec->egu,DB_UNITS_SIZE);
1391+ }
1392 return(0);
1393 }
1394
1395@@ -171,14 +175,22 @@
1396 {
1397 longinRecord *prec=(longinRecord *)paddr->precord;
1398
1399- if(paddr->pfield==(void *)&prec->val
1400- || paddr->pfield==(void *)&prec->hihi
1401- || paddr->pfield==(void *)&prec->high
1402- || paddr->pfield==(void *)&prec->low
1403- || paddr->pfield==(void *)&prec->lolo){
1404- pgd->upper_disp_limit = prec->hopr;
1405- pgd->lower_disp_limit = prec->lopr;
1406- } else recGblGetGraphicDouble(paddr,pgd);
1407+ switch (dbGetFieldIndex(paddr)) {
1408+ case indexof(VAL):
1409+ case indexof(HIHI):
1410+ case indexof(HIGH):
1411+ case indexof(LOW):
1412+ case indexof(LOLO):
1413+ case indexof(LALM):
1414+ case indexof(ALST):
1415+ case indexof(MLST):
1416+ case indexof(SVAL):
1417+ pgd->upper_disp_limit = prec->hopr;
1418+ pgd->lower_disp_limit = prec->lopr;
1419+ break;
1420+ default:
1421+ recGblGetGraphicDouble(paddr,pgd);
1422+ }
1423 return(0);
1424 }
1425
1426@@ -186,14 +198,22 @@
1427 {
1428 longinRecord *prec=(longinRecord *)paddr->precord;
1429
1430- if(paddr->pfield==(void *)&prec->val
1431- || paddr->pfield==(void *)&prec->hihi
1432- || paddr->pfield==(void *)&prec->high
1433- || paddr->pfield==(void *)&prec->low
1434- || paddr->pfield==(void *)&prec->lolo){
1435- pcd->upper_ctrl_limit = prec->hopr;
1436- pcd->lower_ctrl_limit = prec->lopr;
1437- } else recGblGetControlDouble(paddr,pcd);
1438+ switch (dbGetFieldIndex(paddr)) {
1439+ case indexof(VAL):
1440+ case indexof(HIHI):
1441+ case indexof(HIGH):
1442+ case indexof(LOW):
1443+ case indexof(LOLO):
1444+ case indexof(LALM):
1445+ case indexof(ALST):
1446+ case indexof(MLST):
1447+ case indexof(SVAL):
1448+ pcd->upper_ctrl_limit = prec->hopr;
1449+ pcd->lower_ctrl_limit = prec->lopr;
1450+ break;
1451+ default:
1452+ recGblGetControlDouble(paddr,pcd);
1453+ }
1454 return(0);
1455 }
1456
1457@@ -201,7 +221,7 @@
1458 {
1459 longinRecord *prec=(longinRecord *)paddr->precord;
1460
1461- if(paddr->pfield==(void *)&prec->val){
1462+ if(dbGetFieldIndex(paddr) == indexof(VAL)){
1463 pad->upper_alarm_limit = prec->hihi;
1464 pad->upper_warning_limit = prec->high;
1465 pad->lower_warning_limit = prec->low;
1466
1467=== modified file 'src/rec/longoutRecord.c'
1468--- src/rec/longoutRecord.c 2010-04-05 18:49:18 +0000
1469+++ src/rec/longoutRecord.c 2010-05-28 10:21:33 +0000
1470@@ -190,58 +190,73 @@
1471 return(status);
1472 }
1473
1474
1475+#define indexof(field) longoutRecord##field
1476+
1477 static long get_units(DBADDR *paddr,char *units)
1478 {
1479 longoutRecord *prec=(longoutRecord *)paddr->precord;
1480
1481- strncpy(units,prec->egu,DB_UNITS_SIZE);
1482+ if(paddr->pfldDes->field_type == DBF_LONG) {
1483+ strncpy(units,prec->egu,DB_UNITS_SIZE);
1484+ }
1485 return(0);
1486 }
1487
1488 static long get_graphic_double(DBADDR *paddr,struct dbr_grDouble *pgd)
1489 {
1490 longoutRecord *prec=(longoutRecord *)paddr->precord;
1491- int fieldIndex = dbGetFieldIndex(paddr);
1492-
1493- if(fieldIndex == longoutRecordVAL
1494- || fieldIndex == longoutRecordHIHI
1495- || fieldIndex == longoutRecordHIGH
1496- || fieldIndex == longoutRecordLOW
1497- || fieldIndex == longoutRecordLOLO) {
1498- pgd->upper_disp_limit = prec->hopr;
1499- pgd->lower_disp_limit = prec->lopr;
1500- } else recGblGetGraphicDouble(paddr,pgd);
1501+
1502+ switch (dbGetFieldIndex(paddr)) {
1503+ case indexof(VAL):
1504+ case indexof(HIHI):
1505+ case indexof(HIGH):
1506+ case indexof(LOW):
1507+ case indexof(LOLO):
1508+ case indexof(LALM):
1509+ case indexof(ALST):
1510+ case indexof(MLST):
1511+ pgd->upper_disp_limit = prec->hopr;
1512+ pgd->lower_disp_limit = prec->lopr;
1513+ break;
1514+ default:
1515+ recGblGetGraphicDouble(paddr,pgd);
1516+ }
1517 return(0);
1518 }
1519
1520-
1521 static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
1522 {
1523 longoutRecord *prec=(longoutRecord *)paddr->precord;
1524- int fieldIndex = dbGetFieldIndex(paddr);
1525
1526- if(fieldIndex == longoutRecordVAL
1527- || fieldIndex == longoutRecordHIHI
1528- || fieldIndex == longoutRecordHIGH
1529- || fieldIndex == longoutRecordLOW
1530- || fieldIndex == longoutRecordLOLO) {
1531- /* do not change pre drvh/drvl behavior */
1532- if(prec->drvh > prec->drvl) {
1533- pcd->upper_ctrl_limit = prec->drvh;
1534- pcd->lower_ctrl_limit = prec->drvl;
1535- } else {
1536- pcd->upper_ctrl_limit = prec->hopr;
1537- pcd->lower_ctrl_limit = prec->lopr;
1538- }
1539- } else recGblGetControlDouble(paddr,pcd);
1540+ switch (dbGetFieldIndex(paddr)) {
1541+ case indexof(VAL):
1542+ case indexof(HIHI):
1543+ case indexof(HIGH):
1544+ case indexof(LOW):
1545+ case indexof(LOLO):
1546+ case indexof(LALM):
1547+ case indexof(ALST):
1548+ case indexof(MLST):
1549+ /* do not change pre drvh/drvl behavior */
1550+ if(prec->drvh > prec->drvl) {
1551+ pcd->upper_ctrl_limit = prec->drvh;
1552+ pcd->lower_ctrl_limit = prec->drvl;
1553+ } else {
1554+ pcd->upper_ctrl_limit = prec->hopr;
1555+ pcd->lower_ctrl_limit = prec->lopr;
1556+ }
1557+ break;
1558+ default:
1559+ recGblGetControlDouble(paddr,pcd);
1560+ }
1561 return(0);
1562 }
1563+
1564 static long get_alarm_double(DBADDR *paddr,struct dbr_alDouble *pad)
1565 {
1566 longoutRecord *prec=(longoutRecord *)paddr->precord;
1567- int fieldIndex = dbGetFieldIndex(paddr);
1568
1569- if(fieldIndex == longoutRecordVAL) {
1570+ if(dbGetFieldIndex(paddr) == indexof(VAL)) {
1571 pad->upper_alarm_limit = prec->hihi;
1572 pad->upper_warning_limit = prec->high;
1573 pad->lower_warning_limit = prec->low;
1574
1575=== modified file 'src/rec/selRecord.c'
1576--- src/rec/selRecord.c 2009-08-25 18:19:49 +0000
1577+++ src/rec/selRecord.c 2010-05-28 10:21:33 +0000
1578@@ -132,11 +132,15 @@
1579 }
1580
1581
1582
1583+#define indexof(field) selRecord##field
1584+
1585 static long get_units(DBADDR *paddr, char *units)
1586 {
1587 selRecord *prec=(selRecord *)paddr->precord;
1588
1589- strncpy(units,prec->egu,DB_UNITS_SIZE);
1590+ if(paddr->pfldDes->field_type == DBF_DOUBLE) {
1591+ strncpy(units,prec->egu,DB_UNITS_SIZE);
1592+ }
1593 return(0);
1594 }
1595
1596@@ -166,56 +170,68 @@
1597 static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
1598 {
1599 selRecord *prec=(selRecord *)paddr->precord;
1600-
1601- if(paddr->pfield==(void *)&prec->val
1602- || paddr->pfield==(void *)&prec->hihi
1603- || paddr->pfield==(void *)&prec->high
1604- || paddr->pfield==(void *)&prec->low
1605- || paddr->pfield==(void *)&prec->lolo){
1606- pgd->upper_disp_limit = prec->hopr;
1607- pgd->lower_disp_limit = prec->lopr;
1608- return(0);
1609- }
1610-
1611- if(paddr->pfield>=(void *)&prec->a && paddr->pfield<=(void *)&prec->l){
1612- pgd->upper_disp_limit = prec->hopr;
1613- pgd->lower_disp_limit = prec->lopr;
1614- return(0);
1615- }
1616- if(paddr->pfield>=(void *)&prec->la && paddr->pfield<=(void *)&prec->ll){
1617- pgd->upper_disp_limit = prec->hopr;
1618- pgd->lower_disp_limit = prec->lopr;
1619- return(0);
1620- }
1621- recGblGetGraphicDouble(paddr,pgd);
1622+ int index = dbGetFieldIndex(paddr);
1623+
1624+ switch (index) {
1625+ case indexof(VAL):
1626+ case indexof(HIHI):
1627+ case indexof(HIGH):
1628+ case indexof(LOW):
1629+ case indexof(LOLO):
1630+ case indexof(LALM):
1631+ case indexof(ALST):
1632+ case indexof(MLST):
1633+#ifdef __GNUC__
1634+ case indexof(A) ... indexof(L):
1635+ case indexof(LA) ... indexof(LL):
1636+ break;
1637+ default:
1638+#else
1639+ break;
1640+ default:
1641+ if((index >= indexof(A) && index <= indexof(L))
1642+ || (index >= indexof(LA) && index <= indexof(LL)))
1643+ break;
1644+#endif
1645+ recGblGetGraphicDouble(paddr,pgd);
1646+ return(0);
1647+ }
1648+ pgd->upper_disp_limit = prec->hopr;
1649+ pgd->lower_disp_limit = prec->lopr;
1650 return(0);
1651 }
1652
1653 static long get_control_double(struct dbAddr *paddr, struct dbr_ctrlDouble *pcd)
1654 {
1655 selRecord *prec=(selRecord *)paddr->precord;
1656-
1657- if(paddr->pfield==(void *)&prec->val
1658- || paddr->pfield==(void *)&prec->hihi
1659- || paddr->pfield==(void *)&prec->high
1660- || paddr->pfield==(void *)&prec->low
1661- || paddr->pfield==(void *)&prec->lolo){
1662- pcd->upper_ctrl_limit = prec->hopr;
1663- pcd->lower_ctrl_limit = prec->lopr;
1664- return(0);
1665- }
1666-
1667- if(paddr->pfield>=(void *)&prec->a && paddr->pfield<=(void *)&prec->l){
1668- pcd->upper_ctrl_limit = prec->hopr;
1669- pcd->lower_ctrl_limit = prec->lopr;
1670- return(0);
1671- }
1672- if(paddr->pfield>=(void *)&prec->la && paddr->pfield<=(void *)&prec->ll){
1673- pcd->upper_ctrl_limit = prec->hopr;
1674- pcd->lower_ctrl_limit = prec->lopr;
1675- return(0);
1676- }
1677- recGblGetControlDouble(paddr,pcd);
1678+ int index = dbGetFieldIndex(paddr);
1679+
1680+ switch (index) {
1681+ case indexof(VAL):
1682+ case indexof(HIHI):
1683+ case indexof(HIGH):
1684+ case indexof(LOW):
1685+ case indexof(LOLO):
1686+ case indexof(LALM):
1687+ case indexof(ALST):
1688+ case indexof(MLST):
1689+#ifdef __GNUC__
1690+ case indexof(A) ... indexof(L):
1691+ case indexof(LA) ... indexof(LL):
1692+ break;
1693+ default:
1694+#else
1695+ break;
1696+ default:
1697+ if((index >= indexof(A) && index <= indexof(L))
1698+ || (index >= indexof(LA) && index <= indexof(LL)))
1699+ break;
1700+#endif
1701+ recGblGetControlDouble(paddr,pcd);
1702+ return(0);
1703+ }
1704+ pcd->upper_ctrl_limit = prec->hopr;
1705+ pcd->lower_ctrl_limit = prec->lopr;
1706 return(0);
1707 }
1708
1709@@ -223,7 +239,7 @@
1710 {
1711 selRecord *prec=(selRecord *)paddr->precord;
1712
1713- if(paddr->pfield==(void *)&prec->val ){
1714+ if(dbGetFieldIndex(paddr) == indexof(VAL)) {
1715 pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
1716 pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
1717 pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
1718
1719=== modified file 'src/rec/seqRecord.c'
1720--- src/rec/seqRecord.c 2009-04-02 21:41:45 +0000
1721+++ src/rec/seqRecord.c 2010-05-28 10:21:33 +0000
1722@@ -6,7 +6,7 @@
1723 * EPICS BASE is distributed subject to a Software License Agreement found
1724 * in file LICENSE that is included with this distribution.
1725 \*************************************************************************/
1726-
1727+
1728 /*
1729 * $Id$
1730 *
1731@@ -39,34 +39,48 @@
1732
1733 int seqRecDebug = 0;
1734
1735+static int processNextLink(seqRecord *prec);
1736+static long asyncFinish(seqRecord *prec);
1737+static void processCallback(CALLBACK *arg);
1738+
1739 /* Create RSET - Record Support Entry Table*/
1740+#define report NULL
1741+#define initialize NULL
1742 static long init_record(seqRecord *prec, int pass);
1743 static long process(seqRecord *prec);
1744-static int processNextLink(seqRecord *prec);
1745-static long asyncFinish(seqRecord *prec);
1746-static void processCallback(CALLBACK *arg);
1747-static long get_precision(dbAddr *paddr, long *pprecision);
1748+#define special NULL
1749+#define get_value NULL
1750+#define cvt_dbaddr NULL
1751+#define get_array_info NULL
1752+#define put_array_info NULL
1753+static long get_units(DBADDR *, char *);
1754+static long get_precision(dbAddr *paddr, long *);
1755+#define get_enum_str NULL
1756+#define get_enum_strs NULL
1757+#define put_enum_str NULL
1758+static long get_graphic_double(DBADDR *, struct dbr_grDouble *);
1759+static long get_control_double(DBADDR *, struct dbr_ctrlDouble *);
1760+static long get_alarm_double(DBADDR *, struct dbr_alDouble *);
1761
1762 rset seqRSET={
1763 RSETNUMBER,
1764- NULL, /* report */
1765- NULL, /* initialize */
1766+ report, /* report */
1767+ initialize, /* initialize */
1768 init_record, /* init_record */
1769 process, /* process */
1770- NULL, /* special */
1771- NULL, /* get_value */
1772- NULL, /* cvt_dbaddr */
1773- NULL, /* get_array_info */
1774- NULL, /* put_array_info */
1775- NULL, /* get_units */
1776+ special, /* special */
1777+ get_value, /* get_value */
1778+ cvt_dbaddr, /* cvt_dbaddr */
1779+ get_array_info, /* get_array_info */
1780+ put_array_info, /* put_array_info */
1781+ get_units, /* get_units */
1782 get_precision, /* get_precision */
1783- NULL, /* get_enum_str */
1784- NULL, /* get_enum_strs */
1785- NULL, /* put_enum_str */
1786- NULL, /* get_graphic_double */
1787- NULL, /* get_control_double */
1788- NULL /* get_alarm_double */
1789-
1790+ get_enum_str, /* get_enum_str */
1791+ get_enum_strs, /* get_enum_strs */
1792+ put_enum_str, /* put_enum_str */
1793+ get_graphic_double, /* get_graphic_double */
1794+ get_control_double, /* get_control_double */
1795+ get_alarm_double /* get_alarm_double */
1796 };
1797 epicsExportAddress(rset,seqRSET);
1798
1799@@ -406,15 +420,91 @@
1800 * Return the precision value from PREC
1801 *
1802 *****************************************************************************/
1803+#define indexof(field) seqRecord##field
1804+#define get_dol(prec, fieldOffset) \
1805+ &((linkDesc*)&prec->dly1)[fieldOffset>>2].dol
1806+
1807+static long get_units(DBADDR *paddr, char *units)
1808+{
1809+ seqRecord *prec = (seqRecord *) paddr->precord;
1810+ int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
1811+
1812+ if (fieldOffset >= 0) switch (fieldOffset & 2) {
1813+ case 0: /* DLYn */
1814+ strcpy(units, "s");
1815+ break;
1816+ case 2: /* DOn */
1817+ dbGetUnits(get_dol(prec, fieldOffset),
1818+ units, DB_UNITS_SIZE);
1819+ }
1820+ return(0);
1821+}
1822+
1823 static long get_precision(dbAddr *paddr, long *pprecision)
1824 {
1825 seqRecord *prec = (seqRecord *) paddr->precord;
1826+ int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
1827+ short precision;
1828
1829+ if (fieldOffset >= 0) switch (fieldOffset & 2) {
1830+ case 0: /* DLYn */
1831+ *pprecision = 2;
1832+ return 0;
1833+ case 2: /* DOn */
1834+ if (dbGetPrecision(get_dol(prec, fieldOffset),
1835+ &precision) == 0) {
1836+ *pprecision = precision;
1837+ return 0;
1838+ }
1839+ }
1840 *pprecision = prec->prec;
1841-
1842- if(paddr->pfield < (void *)&prec->val)
1843- return 0; /* Field is NOT in dbCommon */
1844-
1845- recGblGetPrec(paddr, pprecision); /* Field is in dbCommon */
1846- return 0;
1847-}
1848+ recGblGetPrec(paddr, pprecision);
1849+ return 0;
1850+}
1851+
1852+static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
1853+{
1854+ seqRecord *prec = (seqRecord *) paddr->precord;
1855+ int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
1856+
1857+ if (fieldOffset >= 0) switch (fieldOffset & 2) {
1858+ case 0: /* DLYn */
1859+ pgd->lower_disp_limit = 0.0;
1860+ pgd->lower_disp_limit = 10.0;
1861+ return 0;
1862+ case 2: /* DOn */
1863+ dbGetGraphicLimits(get_dol(prec, fieldOffset),
1864+ &pgd->lower_disp_limit,
1865+ &pgd->upper_disp_limit);
1866+ return 0;
1867+ }
1868+ recGblGetGraphicDouble(paddr,pgd);
1869+ return 0;
1870+}
1871+
1872+static long get_control_double(DBADDR *paddr,struct dbr_ctrlDouble *pcd)
1873+{
1874+ int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
1875+
1876+ recGblGetControlDouble(paddr,pcd);
1877+ if (fieldOffset >= 0 && (fieldOffset & 2) == 0) /* DLYn */
1878+ pcd->lower_ctrl_limit = 0.0;
1879+ return(0);
1880+}
1881+
1882+static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
1883+{
1884+ seqRecord *prec = (seqRecord *) paddr->precord;
1885+ int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
1886+
1887+ if (fieldOffset >= 0 && (fieldOffset & 2) == 2) /* DOn */
1888+ dbGetAlarmLimits(get_dol(prec, fieldOffset),
1889+ &pad->lower_alarm_limit,
1890+ &pad->lower_warning_limit,
1891+ &pad->upper_warning_limit,
1892+ &pad->upper_alarm_limit);
1893+ else
1894+ recGblGetAlarmDouble(paddr, pad);
1895+ return 0;
1896+}
1897+
1898
1899=== modified file 'src/rec/subArrayRecord.c'
1900--- src/rec/subArrayRecord.c 2009-04-23 22:19:46 +0000
1901+++ src/rec/subArrayRecord.c 2010-05-28 10:21:33 +0000
1902@@ -201,25 +201,30 @@
1903 return 0;
1904 }
1905
1906
1907+#define indexof(field) subArrayRecord##field
1908+
1909 static long get_units(DBADDR *paddr, char *units)
1910 {
1911 subArrayRecord *prec = (subArrayRecord *) paddr->precord;
1912
1913- strncpy(units, prec->egu, DB_UNITS_SIZE);
1914-
1915+ switch (dbGetFieldIndex(paddr)) {
1916+ case indexof(VAL):
1917+ if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
1918+ break;
1919+ case indexof(HOPR):
1920+ case indexof(LOPR):
1921+ strncpy(units,prec->egu,DB_UNITS_SIZE);
1922+ }
1923 return 0;
1924 }
1925
1926 static long get_precision(DBADDR *paddr, long *precision)
1927 {
1928 subArrayRecord *prec = (subArrayRecord *) paddr->precord;
1929- int fieldIndex = dbGetFieldIndex(paddr);
1930
1931 *precision = prec->prec;
1932-
1933- if (fieldIndex != subArrayRecordVAL)
1934+ if (dbGetFieldIndex(paddr) != indexof(VAL))
1935 recGblGetPrec(paddr, precision);
1936-
1937 return 0;
1938 }
1939
1940@@ -228,25 +233,29 @@
1941 subArrayRecord *prec = (subArrayRecord *) paddr->precord;
1942
1943 switch (dbGetFieldIndex(paddr)) {
1944- case subArrayRecordVAL:
1945- pgd->upper_disp_limit = prec->hopr;
1946- pgd->lower_disp_limit = prec->lopr;
1947- break;
1948-
1949- case subArrayRecordINDX:
1950- pgd->upper_disp_limit = prec->malm - 1;
1951- pgd->lower_disp_limit = 0;
1952- break;
1953-
1954- case subArrayRecordNELM:
1955- pgd->upper_disp_limit = prec->malm;
1956- pgd->lower_disp_limit = 1;
1957- break;
1958-
1959- default:
1960- recGblGetGraphicDouble(paddr, pgd);
1961+ case indexof(VAL):
1962+ pgd->upper_disp_limit = prec->hopr;
1963+ pgd->lower_disp_limit = prec->lopr;
1964+ break;
1965+ case indexof(INDX):
1966+ pgd->upper_disp_limit = prec->malm - 1;
1967+ pgd->lower_disp_limit = 0;
1968+ break;
1969+ case indexof(NELM):
1970+ pgd->upper_disp_limit = prec->malm;
1971+ pgd->lower_disp_limit = 0;
1972+ break;
1973+ case indexof(NORD):
1974+ pgd->upper_disp_limit = prec->malm;
1975+ pgd->lower_disp_limit = 0;
1976+ break;
1977+ case indexof(BUSY):
1978+ pgd->upper_disp_limit = 1;
1979+ pgd->lower_disp_limit = 0;
1980+ break;
1981+ default:
1982+ recGblGetGraphicDouble(paddr, pgd);
1983 }
1984-
1985 return 0;
1986 }
1987
1988@@ -255,25 +264,29 @@
1989 subArrayRecord *prec = (subArrayRecord *) paddr->precord;
1990
1991 switch (dbGetFieldIndex(paddr)) {
1992- case subArrayRecordVAL:
1993- pcd->upper_ctrl_limit = prec->hopr;
1994- pcd->lower_ctrl_limit = prec->lopr;
1995- break;
1996-
1997- case subArrayRecordINDX:
1998- pcd->upper_ctrl_limit = prec->malm - 1;
1999- pcd->lower_ctrl_limit = 0;
2000- break;
2001-
2002- case subArrayRecordNELM:
2003- pcd->upper_ctrl_limit = prec->malm;
2004- pcd->lower_ctrl_limit = 1;
2005- break;
2006-
2007- default:
2008- recGblGetControlDouble(paddr, pcd);
2009+ case indexof(VAL):
2010+ pcd->upper_ctrl_limit = prec->hopr;
2011+ pcd->lower_ctrl_limit = prec->lopr;
2012+ break;
2013+ case indexof(INDX):
2014+ pcd->upper_ctrl_limit = prec->malm - 1;
2015+ pcd->lower_ctrl_limit = 0;
2016+ break;
2017+ case indexof(NELM):
2018+ pcd->upper_ctrl_limit = prec->malm;
2019+ pcd->lower_ctrl_limit = 1;
2020+ break;
2021+ case indexof(NORD):
2022+ pcd->upper_ctrl_limit = prec->malm;
2023+ pcd->lower_ctrl_limit = 0;
2024+ break;
2025+ case indexof(BUSY):
2026+ pcd->upper_ctrl_limit = 1;
2027+ pcd->lower_ctrl_limit = 0;
2028+ break;
2029+ default:
2030+ recGblGetControlDouble(paddr, pcd);
2031 }
2032-
2033 return 0;
2034 }
2035
2036
2037
2038=== modified file 'src/rec/subRecord.c'
2039--- src/rec/subRecord.c 2010-04-05 18:49:18 +0000
2040+++ src/rec/subRecord.c 2010-05-28 10:21:33 +0000
2041@@ -191,54 +191,79 @@
2042 return S_db_BadSub;
2043 }
2044
2045
2046+#define indexof(field) subRecord##field
2047+
2048+static long get_linkNumber(int fieldIndex) {
2049+ if (fieldIndex >= indexof(A) && fieldIndex <= indexof(L))
2050+ return fieldIndex - indexof(A);
2051+ if (fieldIndex >= indexof(LA) && fieldIndex <= indexof(LL))
2052+ return fieldIndex - indexof(LA);
2053+ return -1;
2054+}
2055+
2056 static long get_units(DBADDR *paddr, char *units)
2057 {
2058 subRecord *prec = (subRecord *)paddr->precord;
2059+ int linkNumber;
2060
2061- strncpy(units, prec->egu, DB_UNITS_SIZE);
2062+ if(paddr->pfldDes->field_type == DBF_DOUBLE) {
2063+ linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
2064+ if (linkNumber >= 0)
2065+ dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
2066+ else
2067+ strncpy(units,prec->egu,DB_UNITS_SIZE);
2068+ }
2069 return 0;
2070 }
2071
2072-static long get_precision(DBADDR *paddr, long *precision)
2073+static long get_precision(DBADDR *paddr, long *pprecision)
2074 {
2075 subRecord *prec = (subRecord *)paddr->precord;
2076 int fieldIndex = dbGetFieldIndex(paddr);
2077-
2078- *precision = prec->prec;
2079- if (fieldIndex != subRecordVAL)
2080- recGblGetPrec(paddr, precision);
2081-
2082+ int linkNumber;
2083+
2084+ *pprecision = prec->prec;
2085+ if (fieldIndex == indexof(VAL)) {
2086+ return 0;
2087+ }
2088+ linkNumber = get_linkNumber(fieldIndex);
2089+ if (linkNumber >= 0) {
2090+ short precision;
2091+ if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
2092+ *pprecision = precision;
2093+ else
2094+ *pprecision = 15;
2095+ } else
2096+ recGblGetPrec(paddr, pprecision);
2097 return 0;
2098 }
2099
2100-
2101
2102 static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
2103 {
2104 subRecord *prec = (subRecord *)paddr->precord;
2105 int fieldIndex = dbGetFieldIndex(paddr);
2106-
2107+ int linkNumber;
2108+
2109 switch (fieldIndex) {
2110- case subRecordVAL:
2111- case subRecordHIHI: case subRecordHIGH:
2112- case subRecordLOW: case subRecordLOLO:
2113- case subRecordA: case subRecordB:
2114- case subRecordC: case subRecordD:
2115- case subRecordE: case subRecordF:
2116- case subRecordG: case subRecordH:
2117- case subRecordI: case subRecordJ:
2118- case subRecordK: case subRecordL:
2119- case subRecordLA: case subRecordLB:
2120- case subRecordLC: case subRecordLD:
2121- case subRecordLE: case subRecordLF:
2122- case subRecordLG: case subRecordLH:
2123- case subRecordLI: case subRecordLJ:
2124- case subRecordLK: case subRecordLL:
2125- pgd->upper_disp_limit = prec->hopr;
2126- pgd->lower_disp_limit = prec->lopr;
2127- break;
2128-
2129- default:
2130- recGblGetGraphicDouble(paddr, pgd);
2131+ case indexof(VAL):
2132+ case indexof(HIHI):
2133+ case indexof(HIGH):
2134+ case indexof(LOW):
2135+ case indexof(LOLO):
2136+ case indexof(LALM):
2137+ case indexof(ALST):
2138+ case indexof(MLST):
2139+ pgd->lower_disp_limit = prec->lopr;
2140+ pgd->upper_disp_limit = prec->hopr;
2141+ break;
2142+ default:
2143+ linkNumber = get_linkNumber(fieldIndex);
2144+ if (linkNumber >= 0) {
2145+ dbGetGraphicLimits(&prec->inpa + linkNumber,
2146+ &pgd->lower_disp_limit,
2147+ &pgd->upper_disp_limit);
2148+ } else
2149+ recGblGetGraphicDouble(paddr,pgd);
2150 }
2151 return 0;
2152 }
2153@@ -246,24 +271,21 @@
2154 static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
2155 {
2156 subRecord *prec = (subRecord *)paddr->precord;
2157- int fieldIndex = dbGetFieldIndex(paddr);
2158-
2159- switch (fieldIndex) {
2160- case subRecordVAL:
2161- case subRecordHIHI: case subRecordHIGH:
2162- case subRecordLOW: case subRecordLOLO:
2163- case subRecordA: case subRecordB:
2164- case subRecordC: case subRecordD:
2165- case subRecordE: case subRecordF:
2166- case subRecordG: case subRecordH:
2167- case subRecordI: case subRecordJ:
2168- case subRecordK: case subRecordL:
2169- pcd->upper_ctrl_limit = prec->hopr;
2170- pcd->lower_ctrl_limit = prec->lopr;
2171- break;
2172-
2173- default:
2174- recGblGetControlDouble(paddr, pcd);
2175+
2176+ switch (dbGetFieldIndex(paddr)) {
2177+ case indexof(VAL):
2178+ case indexof(HIHI):
2179+ case indexof(HIGH):
2180+ case indexof(LOW):
2181+ case indexof(LOLO):
2182+ case indexof(LALM):
2183+ case indexof(ALST):
2184+ case indexof(MLST):
2185+ pcd->lower_ctrl_limit = prec->lopr;
2186+ pcd->upper_ctrl_limit = prec->hopr;
2187+ break;
2188+ default:
2189+ recGblGetControlDouble(paddr,pcd);
2190 }
2191 return 0;
2192 }
2193@@ -272,6 +294,7 @@
2194 {
2195 subRecord *prec = (subRecord *)paddr->precord;
2196 int fieldIndex = dbGetFieldIndex(paddr);
2197+ int linkNumber;
2198
2199 if (fieldIndex == subRecordVAL) {
2200 pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
2201@@ -279,7 +302,15 @@
2202 pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
2203 pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
2204 } else {
2205- recGblGetAlarmDouble(paddr, pad);
2206+ linkNumber = get_linkNumber(fieldIndex);
2207+ if (linkNumber >= 0) {
2208+ dbGetAlarmLimits(&prec->inpa + linkNumber,
2209+ &pad->lower_alarm_limit,
2210+ &pad->lower_warning_limit,
2211+ &pad->upper_warning_limit,
2212+ &pad->upper_alarm_limit);
2213+ } else
2214+ recGblGetAlarmDouble(paddr, pad);
2215 }
2216 return 0;
2217 }
2218
2219=== modified file 'src/rec/waveformRecord.c'
2220--- src/rec/waveformRecord.c 2009-07-08 18:14:11 +0000
2221+++ src/rec/waveformRecord.c 2010-05-28 10:21:33 +0000
2222@@ -194,25 +194,30 @@
2223 return 0;
2224 }
2225
2226+#define indexof(field) waveformRecord##field
2227+
2228 static long get_units(DBADDR *paddr, char *units)
2229 {
2230 waveformRecord *prec = (waveformRecord *) paddr->precord;
2231
2232- strncpy(units,prec->egu,DB_UNITS_SIZE);
2233-
2234+ switch (dbGetFieldIndex(paddr)) {
2235+ case indexof(VAL):
2236+ if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
2237+ break;
2238+ case indexof(HOPR):
2239+ case indexof(LOPR):
2240+ strncpy(units,prec->egu,DB_UNITS_SIZE);
2241+ }
2242 return 0;
2243 }
2244
2245 static long get_precision(DBADDR *paddr, long *precision)
2246 {
2247 waveformRecord *prec = (waveformRecord *) paddr->precord;
2248- int fieldIndex = dbGetFieldIndex(paddr);
2249
2250 *precision = prec->prec;
2251-
2252- if (fieldIndex != waveformRecordVAL)
2253+ if (dbGetFieldIndex(paddr) != indexof(VAL))
2254 recGblGetPrec(paddr, precision);
2255-
2256 return 0;
2257 }
2258
2259
2260@@ -220,11 +225,22 @@
2261 {
2262 waveformRecord *prec = (waveformRecord *) paddr->precord;
2263
2264- if (dbGetFieldIndex(paddr) == waveformRecordVAL) {
2265- pgd->upper_disp_limit = prec->hopr;
2266- pgd->lower_disp_limit = prec->lopr;
2267- } else
2268- recGblGetGraphicDouble(paddr, pgd);
2269+ switch (dbGetFieldIndex(paddr)) {
2270+ case indexof(VAL):
2271+ pgd->upper_disp_limit = prec->hopr;
2272+ pgd->lower_disp_limit = prec->lopr;
2273+ break;
2274+ case indexof(BUSY):
2275+ pgd->upper_disp_limit = 1;
2276+ pgd->lower_disp_limit = 0;
2277+ break;
2278+ case indexof(NORD):
2279+ pgd->upper_disp_limit = prec->nelm;
2280+ pgd->lower_disp_limit = 0;
2281+ break;
2282+ default:
2283+ recGblGetGraphicDouble(paddr, pgd);
2284+ }
2285 return 0;
2286 }
2287
2288@@ -232,11 +248,22 @@
2289 {
2290 waveformRecord *prec = (waveformRecord *) paddr->precord;
2291
2292- if (dbGetFieldIndex(paddr) == waveformRecordVAL) {
2293- pcd->upper_ctrl_limit = prec->hopr;
2294- pcd->lower_ctrl_limit = prec->lopr;
2295- } else
2296- recGblGetControlDouble(paddr, pcd);
2297+ switch (dbGetFieldIndex(paddr)) {
2298+ case indexof(VAL):
2299+ pcd->upper_ctrl_limit = prec->hopr;
2300+ pcd->lower_ctrl_limit = prec->lopr;
2301+ break;
2302+ case indexof(BUSY):
2303+ pcd->upper_ctrl_limit = 1;
2304+ pcd->lower_ctrl_limit = 0;
2305+ break;
2306+ case indexof(NORD):
2307+ pcd->upper_ctrl_limit = prec->nelm;
2308+ pcd->lower_ctrl_limit = 0;
2309+ break;
2310+ default:
2311+ recGblGetControlDouble(paddr, pcd);
2312+ }
2313 return 0;
2314 }
2315

Subscribers

People subscribed via source and target branches