Skip to main content

std_rs/records/
dbd_generated.rs

1//! Record field tables generated from the vendored EPICS `.dbd` record
2//! declarations — the machine-readable spec every `FieldDesc` used to be
3//! hand-copied from.
4//!
5//! @generated by `tools/dbd-codegen` from `crates/std-rs/dbd/*.dbd`.
6//! DO NOT EDIT. Re-run `cargo run -p dbd-codegen -- --write` after changing a
7//! vendored `.dbd`. Drift is caught by `dbd_codegen::tests::generated_files_are_not_stale`,
8//! which `cargo nextest run` executes — locally and in CI — so a stale table
9//! is a failing test, not a comment asking you to remember.
10//!
11//! What is *not* here, and why:
12//!
13//! * **`dbCommon` fields.** The port models them once in
14//!   [`CommonFields`](epics_base_rs::server::record::CommonFields), so splicing them
15//!   into every record table would double-declare them. Base's table emits
16//!   them separately as `DB_COMMON_FIELDS` so the two models can be reconciled
17//!   (and so a `dbCommon` addition is a diff, not a silent gap).
18//! * **`DBF_NOACCESS` rows whose `extra(...)` names a pointer or an
19//!   array** (`RSET`, `DPVT`, `MLOK`, `BPTR`, `PPN`, ...). C keeps
20//!   `sizeof` the struct member in `pdbFldDes->size`, and neither a
21//!   pointer (whose C value is an address no two IOCs agree on) nor an
22//!   array (whose width is its bound, not its element) has one this port
23//!   can state, so the *descriptor* is dropped rather than invented —
24//!   but the NAME is kept (`record_noaccess_fields`): C's `dbNameToAddr`
25//!   resolves them, so a SEARCH for `REC.BPTR` is answered and the
26//!   refusal lands at channel creation, and the search gate needs the
27//!   names to do the same.
28//!
29//!   A row whose `extra(...)` names a plain scalar — `dbCommon`'s `BKPT`
30//!   and `TIME` — is CARRIED, descriptor and width both, because `dbpr`
31//!   prints its bytes and `dba` reports its `Field Size` and both read
32//!   the declaration. Carried is not servable: `FieldDesc::unreadable`
33//!   is what refuses the read, so the SEARCH is answered off the
34//!   descriptor instead of off the name list.
35
36#![allow(clippy::all)]
37
38use epics_base_rs::server::record::{Asl, Base, FieldDesc, Special};
39use epics_base_rs::types::{DbFieldType, DbfCode};
40
41// ---------------------------------------------------------------------
42// `menu(...)` choice tables. The index is the stored `epicsEnum16` and is
43// wire-visible (a `DBF_MENU` field is served as `DBR_ENUM`), so the order
44// here is the `.dbd` declaration order, verbatim.
45// ---------------------------------------------------------------------
46
47/// `menu(epidFeedbackMode)`
48pub static MENU_EPID_FEEDBACK_MODE: &[&str] = &["PID", "Max/Min"];
49
50/// `menu(epidFeedbackState)`
51pub static MENU_EPID_FEEDBACK_STATE: &[&str] = &["Off", "On"];
52
53/// `menu(throttleDRVLC)`
54pub static MENU_THROTTLE_DRVLC: &[&str] = &["Off", "On"];
55
56/// `menu(throttleDRVLS)`
57pub static MENU_THROTTLE_DRVLS: &[&str] = &["Normal", "Low Limit", "High Limit"];
58
59/// `menu(throttleOV)`
60pub static MENU_THROTTLE_OV: &[&str] = &["Ext PV NC", "Ext PV OK", "Local PV", "Constant"];
61
62/// `menu(throttleSTS)`
63pub static MENU_THROTTLE_STS: &[&str] = &["Unknown", "Error", "Success"];
64
65/// `menu(throttleSYNC)`
66pub static MENU_THROTTLE_SYNC: &[&str] = &["Idle", "Process"];
67
68/// `menu(throttleWAIT)`
69pub static MENU_THROTTLE_WAIT: &[&str] = &["False", "True"];
70
71/// `menu(timestampTST)`
72pub static MENU_TIMESTAMP_TST: &[&str] = &[
73    "YY/MM/DD HH:MM:SS",
74    "MM/DD/YY HH:MM:SS",
75    "Mon DD HH:MM:SS YY",
76    "Mon DD HH:MM:SS",
77    "HH:MM:SS",
78    "HH:MM",
79    "DD/MM/YY HH:MM:SS",
80    "DD Mon HH:MM:SS YY",
81    "DD-Mon-YYYY HH:MM:SS",
82    "Mon DD, YYYY HH:MM:SS.ns",
83    "MM/DD/YY HH:MM:SS.ns",
84];
85
86/// Every `menu()` declared by a vendored `.dbd`, keyed by its EPICS name.
87///
88/// This is the table `get_enum_strs` answers a `DBF_MENU` field from: the
89/// field's [`FieldDesc::menu`] already points at its choices, and this map
90/// exists for the by-name lookups (`.db` loading, `dbpr`).
91pub fn menu_choices(menu: &str) -> Option<&'static [&'static str]> {
92    Some(match menu {
93        "epidFeedbackMode" => MENU_EPID_FEEDBACK_MODE,
94        "epidFeedbackState" => MENU_EPID_FEEDBACK_STATE,
95        "throttleDRVLC" => MENU_THROTTLE_DRVLC,
96        "throttleDRVLS" => MENU_THROTTLE_DRVLS,
97        "throttleOV" => MENU_THROTTLE_OV,
98        "throttleSTS" => MENU_THROTTLE_STS,
99        "throttleSYNC" => MENU_THROTTLE_SYNC,
100        "throttleWAIT" => MENU_THROTTLE_WAIT,
101        "timestampTST" => MENU_TIMESTAMP_TST,
102        _ => return None,
103    })
104}
105
106/// Every `menu()` this target declares: EPICS name, `choice()` identifiers,
107/// and choice values — the three columns `dbWriteMenuFP` prints
108/// (`dbStaticLib.c:919-924`), which is what `dbDumpMenu` reports.
109///
110/// C walks `pdbbase->menuList` in `.dbd` LOAD order. A compiled-in table has
111/// no load order, so the rows are in name order; the per-menu choice order is
112/// still the `.dbd` order, because that one is the wire-visible index.
113pub static MENUS: &[(&str, &[&str], &[&str])] = &[
114    (
115        "epidFeedbackMode",
116        &["epidFeedbackMode_PID", "epidFeedbackMode_MaxMin"],
117        MENU_EPID_FEEDBACK_MODE,
118    ),
119    (
120        "epidFeedbackState",
121        &["epidFeedbackState_Off", "epidFeedbackState_On"],
122        MENU_EPID_FEEDBACK_STATE,
123    ),
124    (
125        "throttleDRVLC",
126        &["throttleDRVLC_OFF", "throttleDRVLC_ON"],
127        MENU_THROTTLE_DRVLC,
128    ),
129    (
130        "throttleDRVLS",
131        &[
132            "throttleDRVLS_NORM",
133            "throttleDRVLS_LOW",
134            "throttleDRVLS_HIGH",
135        ],
136        MENU_THROTTLE_DRVLS,
137    ),
138    (
139        "throttleOV",
140        &[
141            "throttleOV_EXT_NC",
142            "throttleOV_EXT",
143            "throttleOV_LOC",
144            "throttleOV_CON",
145        ],
146        MENU_THROTTLE_OV,
147    ),
148    (
149        "throttleSTS",
150        &["throttleSTS_UNK", "throttleSTS_ERR", "throttleSTS_SUC"],
151        MENU_THROTTLE_STS,
152    ),
153    (
154        "throttleSYNC",
155        &["throttleSYNC_IDLE", "throttleSYNC_PROC"],
156        MENU_THROTTLE_SYNC,
157    ),
158    (
159        "throttleWAIT",
160        &["throttleWAIT_FALSE", "throttleWAIT_TRUE"],
161        MENU_THROTTLE_WAIT,
162    ),
163    (
164        "timestampTST",
165        &[
166            "timestampTST_YY_MM_DD_HH_MM_SS",
167            "timestampTST_MM_DD_YY_HH_MM_SS",
168            "timestampTST_MM_DD_HH_MM_SS_YY",
169            "timestampTST_MM_DD_HH_MM_SS",
170            "timestampTST_HH_MM_SS",
171            "timestampTST_HH_MM",
172            "timestampTST_DD_MM_YY_HH_MM_SS",
173            "timestampTST_DD_MM_HH_MM_SS_YY",
174            "timestampTST_VMS",
175            "timestampTST_MM_DD_YYYY",
176            "timestampTST_MM_DD_YY",
177        ],
178        MENU_TIMESTAMP_TST,
179    ),
180];
181
182/// Every `variable()` this target's `.dbd`s declare, as EPICS name and
183/// declared type — the two columns `dbWriteVariableFP` prints
184/// (`dbStaticLib.c:1136-1149`), which is what `dbDumpVariable` reports.
185///
186/// Name order, which is also C's: `dbVariable` appends in load order, but
187/// the loaded `.dbd` is `dbExpand` output and that tool emits each
188/// declaration family sorted (measured in an installed `softIoc.dbd`).
189pub static VARIABLES: &[(&str, &str)] = &[];
190
191// ---------------------------------------------------------------------
192// Per-record-type field tables. Record-*own* fields only: `dbCommon` is
193// modelled separately (see the module docs).
194// ---------------------------------------------------------------------
195
196/// `recordtype(epid)` — 51 CA-visible own fields from `dbd/epidRecord.dbd` (0 `DBF_NOACCESS` internals dropped).
197pub static EPID_FIELDS: &[FieldDesc] = &[
198    FieldDesc {
199        name: "VAL",
200        dbf_type: DbFieldType::Double,
201        declared_dbf: DbfCode::Double,
202        runtime_typed: false,
203        read_only: false,
204        special: Special::None,
205        declared_special: Special::None,
206        pp: true,
207        asl: Asl::Asl0,
208        size: 0,
209        extra: None,
210        menu: None,
211        initial: None,
212        interest: 0,
213        prop: false,
214        prompt: Some("Setpoint"),
215        promptgroup: None,
216        base: Base::Decimal,
217    },
218    FieldDesc {
219        name: "SMSL",
220        dbf_type: DbFieldType::Enum,
221        declared_dbf: DbfCode::Menu,
222        runtime_typed: false,
223        read_only: false,
224        special: Special::None,
225        declared_special: Special::None,
226        pp: false,
227        asl: Asl::Asl1,
228        size: 0,
229        extra: None,
230        menu: Some(epics_base_rs::server::record::dbd_generated::MENU_OMSL),
231        initial: None,
232        interest: 1,
233        prop: false,
234        prompt: Some("Setpoint Mode Select"),
235        promptgroup: Some("GUI_PID"),
236        base: Base::Decimal,
237    },
238    FieldDesc {
239        name: "STPL",
240        dbf_type: DbFieldType::String,
241        declared_dbf: DbfCode::Inlink,
242        runtime_typed: false,
243        read_only: false,
244        special: Special::None,
245        declared_special: Special::None,
246        pp: false,
247        asl: Asl::Asl1,
248        size: 0,
249        extra: None,
250        menu: None,
251        initial: None,
252        interest: 1,
253        prop: false,
254        prompt: Some("Setpoint Location"),
255        promptgroup: Some("GUI_PID"),
256        base: Base::Decimal,
257    },
258    FieldDesc {
259        name: "INP",
260        dbf_type: DbFieldType::String,
261        declared_dbf: DbfCode::Inlink,
262        runtime_typed: false,
263        read_only: false,
264        special: Special::None,
265        declared_special: Special::None,
266        pp: false,
267        asl: Asl::Asl1,
268        size: 0,
269        extra: None,
270        menu: None,
271        initial: None,
272        interest: 1,
273        prop: false,
274        prompt: Some("Controlled Value Loc"),
275        promptgroup: Some("GUI_INPUTS"),
276        base: Base::Decimal,
277    },
278    FieldDesc {
279        name: "OUTL",
280        dbf_type: DbFieldType::String,
281        declared_dbf: DbfCode::Outlink,
282        runtime_typed: false,
283        read_only: false,
284        special: Special::None,
285        declared_special: Special::None,
286        pp: false,
287        asl: Asl::Asl1,
288        size: 0,
289        extra: None,
290        menu: None,
291        initial: None,
292        interest: 1,
293        prop: false,
294        prompt: Some("Output Location"),
295        promptgroup: Some("GUI_PID"),
296        base: Base::Decimal,
297    },
298    FieldDesc {
299        name: "TRIG",
300        dbf_type: DbFieldType::String,
301        declared_dbf: DbfCode::Outlink,
302        runtime_typed: false,
303        read_only: false,
304        special: Special::None,
305        declared_special: Special::None,
306        pp: false,
307        asl: Asl::Asl1,
308        size: 0,
309        extra: None,
310        menu: None,
311        initial: None,
312        interest: 1,
313        prop: false,
314        prompt: Some("Readback Trigger"),
315        promptgroup: Some("GUI_PID"),
316        base: Base::Decimal,
317    },
318    FieldDesc {
319        name: "TVAL",
320        dbf_type: DbFieldType::Double,
321        declared_dbf: DbfCode::Double,
322        runtime_typed: false,
323        read_only: false,
324        special: Special::None,
325        declared_special: Special::None,
326        pp: false,
327        asl: Asl::Asl1,
328        size: 0,
329        extra: None,
330        menu: None,
331        initial: None,
332        interest: 1,
333        prop: false,
334        prompt: Some("Trigger Value"),
335        promptgroup: Some("GUI_PID"),
336        base: Base::Decimal,
337    },
338    FieldDesc {
339        name: "CVAL",
340        dbf_type: DbFieldType::Double,
341        declared_dbf: DbfCode::Double,
342        runtime_typed: false,
343        read_only: true,
344        special: Special::NoMod,
345        declared_special: Special::NoMod,
346        pp: false,
347        asl: Asl::Asl1,
348        size: 0,
349        extra: None,
350        menu: None,
351        initial: None,
352        interest: 0,
353        prop: false,
354        prompt: Some("Controlled Value"),
355        promptgroup: None,
356        base: Base::Decimal,
357    },
358    FieldDesc {
359        name: "CVLP",
360        dbf_type: DbFieldType::Double,
361        declared_dbf: DbfCode::Double,
362        runtime_typed: false,
363        read_only: true,
364        special: Special::NoMod,
365        declared_special: Special::NoMod,
366        pp: false,
367        asl: Asl::Asl1,
368        size: 0,
369        extra: None,
370        menu: None,
371        initial: None,
372        interest: 0,
373        prop: false,
374        prompt: Some("Prev. Controlled Value"),
375        promptgroup: None,
376        base: Base::Decimal,
377    },
378    FieldDesc {
379        name: "OVAL",
380        dbf_type: DbFieldType::Double,
381        declared_dbf: DbfCode::Double,
382        runtime_typed: false,
383        read_only: true,
384        special: Special::NoMod,
385        declared_special: Special::NoMod,
386        pp: false,
387        asl: Asl::Asl1,
388        size: 0,
389        extra: None,
390        menu: None,
391        initial: None,
392        interest: 0,
393        prop: false,
394        prompt: Some("Output value"),
395        promptgroup: None,
396        base: Base::Decimal,
397    },
398    FieldDesc {
399        name: "OVLP",
400        dbf_type: DbFieldType::Double,
401        declared_dbf: DbfCode::Double,
402        runtime_typed: false,
403        read_only: true,
404        special: Special::NoMod,
405        declared_special: Special::NoMod,
406        pp: false,
407        asl: Asl::Asl1,
408        size: 0,
409        extra: None,
410        menu: None,
411        initial: None,
412        interest: 3,
413        prop: false,
414        prompt: Some("Prev output"),
415        promptgroup: None,
416        base: Base::Decimal,
417    },
418    FieldDesc {
419        name: "PREC",
420        dbf_type: DbFieldType::Short,
421        declared_dbf: DbfCode::Short,
422        runtime_typed: false,
423        read_only: false,
424        special: Special::None,
425        declared_special: Special::None,
426        pp: false,
427        asl: Asl::Asl1,
428        size: 0,
429        extra: None,
430        menu: None,
431        initial: None,
432        interest: 1,
433        prop: false,
434        prompt: Some("Display Precision"),
435        promptgroup: Some("GUI_DISPLAY"),
436        base: Base::Decimal,
437    },
438    FieldDesc {
439        name: "MDT",
440        dbf_type: DbFieldType::Double,
441        declared_dbf: DbfCode::Double,
442        runtime_typed: false,
443        read_only: false,
444        special: Special::None,
445        declared_special: Special::None,
446        pp: false,
447        asl: Asl::Asl1,
448        size: 0,
449        extra: None,
450        menu: None,
451        initial: None,
452        interest: 1,
453        prop: false,
454        prompt: Some("Min Delta T"),
455        promptgroup: Some("GUI_PID"),
456        base: Base::Decimal,
457    },
458    FieldDesc {
459        name: "FMOD",
460        dbf_type: DbFieldType::Enum,
461        declared_dbf: DbfCode::Menu,
462        runtime_typed: false,
463        read_only: false,
464        special: Special::None,
465        declared_special: Special::None,
466        pp: false,
467        asl: Asl::Asl1,
468        size: 0,
469        extra: None,
470        menu: Some(MENU_EPID_FEEDBACK_MODE),
471        initial: None,
472        interest: 1,
473        prop: false,
474        prompt: Some("Feedback Mode"),
475        promptgroup: Some("GUI_PID"),
476        base: Base::Decimal,
477    },
478    FieldDesc {
479        name: "FBON",
480        dbf_type: DbFieldType::Enum,
481        declared_dbf: DbfCode::Menu,
482        runtime_typed: false,
483        read_only: false,
484        special: Special::None,
485        declared_special: Special::None,
486        pp: false,
487        asl: Asl::Asl1,
488        size: 0,
489        extra: None,
490        menu: Some(MENU_EPID_FEEDBACK_STATE),
491        initial: None,
492        interest: 1,
493        prop: false,
494        prompt: Some("Feedback On/Off"),
495        promptgroup: Some("GUI_PID"),
496        base: Base::Decimal,
497    },
498    FieldDesc {
499        name: "FBOP",
500        dbf_type: DbFieldType::Enum,
501        declared_dbf: DbfCode::Menu,
502        runtime_typed: false,
503        read_only: false,
504        special: Special::None,
505        declared_special: Special::None,
506        pp: false,
507        asl: Asl::Asl1,
508        size: 0,
509        extra: None,
510        menu: Some(MENU_EPID_FEEDBACK_STATE),
511        initial: None,
512        interest: 1,
513        prop: false,
514        prompt: Some("Prev. feedback On/Off"),
515        promptgroup: Some("GUI_PID"),
516        base: Base::Decimal,
517    },
518    FieldDesc {
519        name: "KP",
520        dbf_type: DbFieldType::Double,
521        declared_dbf: DbfCode::Double,
522        runtime_typed: false,
523        read_only: false,
524        special: Special::None,
525        declared_special: Special::None,
526        pp: false,
527        asl: Asl::Asl1,
528        size: 0,
529        extra: None,
530        menu: None,
531        initial: None,
532        interest: 1,
533        prop: false,
534        prompt: Some("Proportional Gain"),
535        promptgroup: Some("GUI_PID"),
536        base: Base::Decimal,
537    },
538    FieldDesc {
539        name: "KI",
540        dbf_type: DbFieldType::Double,
541        declared_dbf: DbfCode::Double,
542        runtime_typed: false,
543        read_only: false,
544        special: Special::None,
545        declared_special: Special::None,
546        pp: false,
547        asl: Asl::Asl1,
548        size: 0,
549        extra: None,
550        menu: None,
551        initial: None,
552        interest: 1,
553        prop: false,
554        prompt: Some("Intergral Gain"),
555        promptgroup: Some("GUI_PID"),
556        base: Base::Decimal,
557    },
558    FieldDesc {
559        name: "KD",
560        dbf_type: DbFieldType::Double,
561        declared_dbf: DbfCode::Double,
562        runtime_typed: false,
563        read_only: false,
564        special: Special::None,
565        declared_special: Special::None,
566        pp: false,
567        asl: Asl::Asl1,
568        size: 0,
569        extra: None,
570        menu: None,
571        initial: None,
572        interest: 1,
573        prop: false,
574        prompt: Some("Derivative Gain"),
575        promptgroup: Some("GUI_PID"),
576        base: Base::Decimal,
577    },
578    FieldDesc {
579        name: "EGU",
580        dbf_type: DbFieldType::String,
581        declared_dbf: DbfCode::String,
582        runtime_typed: false,
583        read_only: false,
584        special: Special::None,
585        declared_special: Special::None,
586        pp: false,
587        asl: Asl::Asl1,
588        size: 16,
589        extra: None,
590        menu: None,
591        initial: None,
592        interest: 1,
593        prop: false,
594        prompt: Some("Engineering Units"),
595        promptgroup: Some("GUI_DISPLAY"),
596        base: Base::Decimal,
597    },
598    FieldDesc {
599        name: "HOPR",
600        dbf_type: DbFieldType::Double,
601        declared_dbf: DbfCode::Double,
602        runtime_typed: false,
603        read_only: false,
604        special: Special::None,
605        declared_special: Special::None,
606        pp: false,
607        asl: Asl::Asl1,
608        size: 0,
609        extra: None,
610        menu: None,
611        initial: None,
612        interest: 1,
613        prop: false,
614        prompt: Some("High Operating Range"),
615        promptgroup: Some("GUI_DISPLAY"),
616        base: Base::Decimal,
617    },
618    FieldDesc {
619        name: "LOPR",
620        dbf_type: DbFieldType::Double,
621        declared_dbf: DbfCode::Double,
622        runtime_typed: false,
623        read_only: false,
624        special: Special::None,
625        declared_special: Special::None,
626        pp: false,
627        asl: Asl::Asl1,
628        size: 0,
629        extra: None,
630        menu: None,
631        initial: None,
632        interest: 1,
633        prop: false,
634        prompt: Some("Low Operating Range"),
635        promptgroup: Some("GUI_DISPLAY"),
636        base: Base::Decimal,
637    },
638    FieldDesc {
639        name: "DRVH",
640        dbf_type: DbFieldType::Double,
641        declared_dbf: DbfCode::Double,
642        runtime_typed: false,
643        read_only: false,
644        special: Special::None,
645        declared_special: Special::None,
646        pp: false,
647        asl: Asl::Asl1,
648        size: 0,
649        extra: None,
650        menu: None,
651        initial: None,
652        interest: 1,
653        prop: false,
654        prompt: Some("High Drive Limit"),
655        promptgroup: Some("GUI_DISPLAY"),
656        base: Base::Decimal,
657    },
658    FieldDesc {
659        name: "DRVL",
660        dbf_type: DbFieldType::Double,
661        declared_dbf: DbfCode::Double,
662        runtime_typed: false,
663        read_only: false,
664        special: Special::None,
665        declared_special: Special::None,
666        pp: false,
667        asl: Asl::Asl1,
668        size: 0,
669        extra: None,
670        menu: None,
671        initial: None,
672        interest: 1,
673        prop: false,
674        prompt: Some("Low Drive Limit"),
675        promptgroup: Some("GUI_DISPLAY"),
676        base: Base::Decimal,
677    },
678    FieldDesc {
679        name: "HIHI",
680        dbf_type: DbFieldType::Double,
681        declared_dbf: DbfCode::Double,
682        runtime_typed: false,
683        read_only: false,
684        special: Special::None,
685        declared_special: Special::None,
686        pp: false,
687        asl: Asl::Asl1,
688        size: 0,
689        extra: None,
690        menu: None,
691        initial: None,
692        interest: 1,
693        prop: false,
694        prompt: Some("Hihi Deviation Limit"),
695        promptgroup: Some("GUI_ALARMS"),
696        base: Base::Decimal,
697    },
698    FieldDesc {
699        name: "LOLO",
700        dbf_type: DbFieldType::Double,
701        declared_dbf: DbfCode::Double,
702        runtime_typed: false,
703        read_only: false,
704        special: Special::None,
705        declared_special: Special::None,
706        pp: false,
707        asl: Asl::Asl1,
708        size: 0,
709        extra: None,
710        menu: None,
711        initial: None,
712        interest: 1,
713        prop: false,
714        prompt: Some("Lolo Deviation Limit"),
715        promptgroup: Some("GUI_ALARMS"),
716        base: Base::Decimal,
717    },
718    FieldDesc {
719        name: "HIGH",
720        dbf_type: DbFieldType::Double,
721        declared_dbf: DbfCode::Double,
722        runtime_typed: false,
723        read_only: false,
724        special: Special::None,
725        declared_special: Special::None,
726        pp: false,
727        asl: Asl::Asl1,
728        size: 0,
729        extra: None,
730        menu: None,
731        initial: None,
732        interest: 1,
733        prop: false,
734        prompt: Some("High Deviation Limit"),
735        promptgroup: Some("GUI_ALARMS"),
736        base: Base::Decimal,
737    },
738    FieldDesc {
739        name: "LOW",
740        dbf_type: DbFieldType::Double,
741        declared_dbf: DbfCode::Double,
742        runtime_typed: false,
743        read_only: false,
744        special: Special::None,
745        declared_special: Special::None,
746        pp: false,
747        asl: Asl::Asl1,
748        size: 0,
749        extra: None,
750        menu: None,
751        initial: None,
752        interest: 1,
753        prop: false,
754        prompt: Some("Low Deviation Limit"),
755        promptgroup: Some("GUI_ALARMS"),
756        base: Base::Decimal,
757    },
758    FieldDesc {
759        name: "HHSV",
760        dbf_type: DbFieldType::Enum,
761        declared_dbf: DbfCode::Menu,
762        runtime_typed: false,
763        read_only: false,
764        special: Special::None,
765        declared_special: Special::None,
766        pp: false,
767        asl: Asl::Asl1,
768        size: 0,
769        extra: None,
770        menu: Some(epics_base_rs::server::record::dbd_generated::MENU_ALARM_SEVR),
771        initial: None,
772        interest: 1,
773        prop: false,
774        prompt: Some("Hihi Severity"),
775        promptgroup: Some("GUI_ALARMS"),
776        base: Base::Decimal,
777    },
778    FieldDesc {
779        name: "LLSV",
780        dbf_type: DbFieldType::Enum,
781        declared_dbf: DbfCode::Menu,
782        runtime_typed: false,
783        read_only: false,
784        special: Special::None,
785        declared_special: Special::None,
786        pp: false,
787        asl: Asl::Asl1,
788        size: 0,
789        extra: None,
790        menu: Some(epics_base_rs::server::record::dbd_generated::MENU_ALARM_SEVR),
791        initial: None,
792        interest: 1,
793        prop: false,
794        prompt: Some("Lolo Severity"),
795        promptgroup: Some("GUI_ALARMS"),
796        base: Base::Decimal,
797    },
798    FieldDesc {
799        name: "HSV",
800        dbf_type: DbFieldType::Enum,
801        declared_dbf: DbfCode::Menu,
802        runtime_typed: false,
803        read_only: false,
804        special: Special::None,
805        declared_special: Special::None,
806        pp: false,
807        asl: Asl::Asl1,
808        size: 0,
809        extra: None,
810        menu: Some(epics_base_rs::server::record::dbd_generated::MENU_ALARM_SEVR),
811        initial: None,
812        interest: 1,
813        prop: false,
814        prompt: Some("High Severity"),
815        promptgroup: Some("GUI_ALARMS"),
816        base: Base::Decimal,
817    },
818    FieldDesc {
819        name: "LSV",
820        dbf_type: DbFieldType::Enum,
821        declared_dbf: DbfCode::Menu,
822        runtime_typed: false,
823        read_only: false,
824        special: Special::None,
825        declared_special: Special::None,
826        pp: false,
827        asl: Asl::Asl1,
828        size: 0,
829        extra: None,
830        menu: Some(epics_base_rs::server::record::dbd_generated::MENU_ALARM_SEVR),
831        initial: None,
832        interest: 1,
833        prop: false,
834        prompt: Some("Low Severity"),
835        promptgroup: Some("GUI_ALARMS"),
836        base: Base::Decimal,
837    },
838    FieldDesc {
839        name: "HYST",
840        dbf_type: DbFieldType::Double,
841        declared_dbf: DbfCode::Double,
842        runtime_typed: false,
843        read_only: false,
844        special: Special::None,
845        declared_special: Special::None,
846        pp: false,
847        asl: Asl::Asl1,
848        size: 0,
849        extra: None,
850        menu: None,
851        initial: None,
852        interest: 1,
853        prop: false,
854        prompt: Some("Alarm Deadband"),
855        promptgroup: Some("GUI_ALARMS"),
856        base: Base::Decimal,
857    },
858    FieldDesc {
859        name: "ADEL",
860        dbf_type: DbFieldType::Double,
861        declared_dbf: DbfCode::Double,
862        runtime_typed: false,
863        read_only: false,
864        special: Special::None,
865        declared_special: Special::None,
866        pp: false,
867        asl: Asl::Asl1,
868        size: 0,
869        extra: None,
870        menu: None,
871        initial: None,
872        interest: 1,
873        prop: false,
874        prompt: Some("Archive Deadband"),
875        promptgroup: Some("GUI_DISPLAY"),
876        base: Base::Decimal,
877    },
878    FieldDesc {
879        name: "MDEL",
880        dbf_type: DbFieldType::Double,
881        declared_dbf: DbfCode::Double,
882        runtime_typed: false,
883        read_only: false,
884        special: Special::None,
885        declared_special: Special::None,
886        pp: false,
887        asl: Asl::Asl1,
888        size: 0,
889        extra: None,
890        menu: None,
891        initial: None,
892        interest: 1,
893        prop: false,
894        prompt: Some("Monitor Deadband"),
895        promptgroup: Some("GUI_DISPLAY"),
896        base: Base::Decimal,
897    },
898    FieldDesc {
899        name: "ODEL",
900        dbf_type: DbFieldType::Double,
901        declared_dbf: DbfCode::Double,
902        runtime_typed: false,
903        read_only: false,
904        special: Special::None,
905        declared_special: Special::None,
906        pp: false,
907        asl: Asl::Asl1,
908        size: 0,
909        extra: None,
910        menu: None,
911        initial: None,
912        interest: 1,
913        prop: false,
914        prompt: Some("Output Deadband"),
915        promptgroup: Some("GUI_PID"),
916        base: Base::Decimal,
917    },
918    FieldDesc {
919        name: "P",
920        dbf_type: DbFieldType::Double,
921        declared_dbf: DbfCode::Double,
922        runtime_typed: false,
923        read_only: true,
924        special: Special::NoMod,
925        declared_special: Special::NoMod,
926        pp: false,
927        asl: Asl::Asl1,
928        size: 0,
929        extra: None,
930        menu: None,
931        initial: None,
932        interest: 2,
933        prop: false,
934        prompt: Some("P component"),
935        promptgroup: None,
936        base: Base::Decimal,
937    },
938    FieldDesc {
939        name: "PP",
940        dbf_type: DbFieldType::Double,
941        declared_dbf: DbfCode::Double,
942        runtime_typed: false,
943        read_only: true,
944        special: Special::NoMod,
945        declared_special: Special::NoMod,
946        pp: false,
947        asl: Asl::Asl1,
948        size: 0,
949        extra: None,
950        menu: None,
951        initial: None,
952        interest: 2,
953        prop: false,
954        prompt: Some("Prev. P component"),
955        promptgroup: None,
956        base: Base::Decimal,
957    },
958    FieldDesc {
959        name: "I",
960        dbf_type: DbFieldType::Double,
961        declared_dbf: DbfCode::Double,
962        runtime_typed: false,
963        read_only: false,
964        special: Special::None,
965        declared_special: Special::None,
966        pp: false,
967        asl: Asl::Asl1,
968        size: 0,
969        extra: None,
970        menu: None,
971        initial: None,
972        interest: 2,
973        prop: false,
974        prompt: Some("I component"),
975        promptgroup: None,
976        base: Base::Decimal,
977    },
978    FieldDesc {
979        name: "IP",
980        dbf_type: DbFieldType::Double,
981        declared_dbf: DbfCode::Double,
982        runtime_typed: false,
983        read_only: false,
984        special: Special::None,
985        declared_special: Special::None,
986        pp: false,
987        asl: Asl::Asl1,
988        size: 0,
989        extra: None,
990        menu: None,
991        initial: None,
992        interest: 2,
993        prop: false,
994        prompt: Some("Prev. I component"),
995        promptgroup: None,
996        base: Base::Decimal,
997    },
998    FieldDesc {
999        name: "D",
1000        dbf_type: DbFieldType::Double,
1001        declared_dbf: DbfCode::Double,
1002        runtime_typed: false,
1003        read_only: true,
1004        special: Special::NoMod,
1005        declared_special: Special::NoMod,
1006        pp: false,
1007        asl: Asl::Asl1,
1008        size: 0,
1009        extra: None,
1010        menu: None,
1011        initial: None,
1012        interest: 2,
1013        prop: false,
1014        prompt: Some("D component"),
1015        promptgroup: None,
1016        base: Base::Decimal,
1017    },
1018    FieldDesc {
1019        name: "DP",
1020        dbf_type: DbFieldType::Double,
1021        declared_dbf: DbfCode::Double,
1022        runtime_typed: false,
1023        read_only: true,
1024        special: Special::NoMod,
1025        declared_special: Special::NoMod,
1026        pp: false,
1027        asl: Asl::Asl1,
1028        size: 0,
1029        extra: None,
1030        menu: None,
1031        initial: None,
1032        interest: 2,
1033        prop: false,
1034        prompt: Some("Prev. D component"),
1035        promptgroup: None,
1036        base: Base::Decimal,
1037    },
1038    FieldDesc {
1039        name: "CT",
1040        dbf_type: DbFieldType::UChar,
1041        declared_dbf: DbfCode::NoAccess,
1042        runtime_typed: false,
1043        read_only: true,
1044        special: Special::NoMod,
1045        declared_special: Special::NoMod,
1046        pp: false,
1047        asl: Asl::Asl1,
1048        size: 8,
1049        extra: Some("epicsTimeStamp  ct"),
1050        menu: None,
1051        initial: None,
1052        interest: 4,
1053        prop: false,
1054        prompt: Some("Time"),
1055        promptgroup: None,
1056        base: Base::Decimal,
1057    },
1058    FieldDesc {
1059        name: "CTP",
1060        dbf_type: DbFieldType::UChar,
1061        declared_dbf: DbfCode::NoAccess,
1062        runtime_typed: false,
1063        read_only: true,
1064        special: Special::NoMod,
1065        declared_special: Special::NoMod,
1066        pp: false,
1067        asl: Asl::Asl1,
1068        size: 8,
1069        extra: Some("epicsTimeStamp   ctp"),
1070        menu: None,
1071        initial: None,
1072        interest: 4,
1073        prop: false,
1074        prompt: Some("Previous time"),
1075        promptgroup: None,
1076        base: Base::Decimal,
1077    },
1078    FieldDesc {
1079        name: "DT",
1080        dbf_type: DbFieldType::Double,
1081        declared_dbf: DbfCode::Double,
1082        runtime_typed: false,
1083        read_only: false,
1084        special: Special::None,
1085        declared_special: Special::None,
1086        pp: false,
1087        asl: Asl::Asl1,
1088        size: 0,
1089        extra: None,
1090        menu: None,
1091        initial: None,
1092        interest: 2,
1093        prop: false,
1094        prompt: Some("Delta T"),
1095        promptgroup: None,
1096        base: Base::Decimal,
1097    },
1098    FieldDesc {
1099        name: "DTP",
1100        dbf_type: DbFieldType::Double,
1101        declared_dbf: DbfCode::Double,
1102        runtime_typed: false,
1103        read_only: false,
1104        special: Special::None,
1105        declared_special: Special::None,
1106        pp: false,
1107        asl: Asl::Asl1,
1108        size: 0,
1109        extra: None,
1110        menu: None,
1111        initial: None,
1112        interest: 2,
1113        prop: false,
1114        prompt: Some("Prev. Delta T"),
1115        promptgroup: None,
1116        base: Base::Decimal,
1117    },
1118    FieldDesc {
1119        name: "ERR",
1120        dbf_type: DbFieldType::Double,
1121        declared_dbf: DbfCode::Double,
1122        runtime_typed: false,
1123        read_only: true,
1124        special: Special::NoMod,
1125        declared_special: Special::NoMod,
1126        pp: false,
1127        asl: Asl::Asl1,
1128        size: 0,
1129        extra: None,
1130        menu: None,
1131        initial: None,
1132        interest: 2,
1133        prop: false,
1134        prompt: Some("Error"),
1135        promptgroup: None,
1136        base: Base::Decimal,
1137    },
1138    FieldDesc {
1139        name: "ERRP",
1140        dbf_type: DbFieldType::Double,
1141        declared_dbf: DbfCode::Double,
1142        runtime_typed: false,
1143        read_only: true,
1144        special: Special::NoMod,
1145        declared_special: Special::NoMod,
1146        pp: false,
1147        asl: Asl::Asl1,
1148        size: 0,
1149        extra: None,
1150        menu: None,
1151        initial: None,
1152        interest: 2,
1153        prop: false,
1154        prompt: Some("Prev. Error"),
1155        promptgroup: None,
1156        base: Base::Decimal,
1157    },
1158    FieldDesc {
1159        name: "LALM",
1160        dbf_type: DbFieldType::Double,
1161        declared_dbf: DbfCode::Double,
1162        runtime_typed: false,
1163        read_only: true,
1164        special: Special::NoMod,
1165        declared_special: Special::NoMod,
1166        pp: false,
1167        asl: Asl::Asl1,
1168        size: 0,
1169        extra: None,
1170        menu: None,
1171        initial: None,
1172        interest: 3,
1173        prop: false,
1174        prompt: Some("Last Value Alarmed"),
1175        promptgroup: None,
1176        base: Base::Decimal,
1177    },
1178    FieldDesc {
1179        name: "ALST",
1180        dbf_type: DbFieldType::Double,
1181        declared_dbf: DbfCode::Double,
1182        runtime_typed: false,
1183        read_only: true,
1184        special: Special::NoMod,
1185        declared_special: Special::NoMod,
1186        pp: false,
1187        asl: Asl::Asl1,
1188        size: 0,
1189        extra: None,
1190        menu: None,
1191        initial: None,
1192        interest: 3,
1193        prop: false,
1194        prompt: Some("Last Value Archived"),
1195        promptgroup: None,
1196        base: Base::Decimal,
1197    },
1198    FieldDesc {
1199        name: "MLST",
1200        dbf_type: DbFieldType::Double,
1201        declared_dbf: DbfCode::Double,
1202        runtime_typed: false,
1203        read_only: true,
1204        special: Special::NoMod,
1205        declared_special: Special::NoMod,
1206        pp: false,
1207        asl: Asl::Asl1,
1208        size: 0,
1209        extra: None,
1210        menu: None,
1211        initial: None,
1212        interest: 3,
1213        prop: false,
1214        prompt: Some("Last Value Monitored"),
1215        promptgroup: None,
1216        base: Base::Decimal,
1217    },
1218];
1219
1220/// `recordtype(epid)` — the `DBF_NOACCESS` internal names dropped from
1221/// [`EPID_FIELDS`]: resolvable (a SEARCH is answered), never servable.
1222pub static EPID_NOACCESS: &[&str] = &[];
1223
1224/// `recordtype(epid)` — C's `papFldDes` order, all 99 declarations
1225/// including the internals [`EPID_FIELDS`] drops. The index into this is
1226/// C's `indRecordType`.
1227pub static EPID_DECL: &[&str] = &[
1228    "NAME", "DESC", "ASG", "SCAN", "PINI", "PHAS", "EVNT", "TSE", "TSEL", "DTYP", "DISV", "DISA",
1229    "SDIS", "MLOK", "MLIS", "BKLNK", "DISP", "PROC", "STAT", "SEVR", "AMSG", "NSTA", "NSEV",
1230    "NAMSG", "ACKS", "ACKT", "DISS", "LCNT", "PACT", "PUTF", "RPRO", "ASP", "PPN", "PPNR", "SPVT",
1231    "RSET", "DSET", "DPVT", "RDES", "LSET", "PRIO", "TPRO", "BKPT", "UDF", "UDFS", "TIME", "UTAG",
1232    "FLNK", "VAL", "SMSL", "STPL", "INP", "OUTL", "TRIG", "TVAL", "CVAL", "CVLP", "OVAL", "OVLP",
1233    "PREC", "MDT", "FMOD", "FBON", "FBOP", "KP", "KI", "KD", "EGU", "HOPR", "LOPR", "DRVH", "DRVL",
1234    "HIHI", "LOLO", "HIGH", "LOW", "HHSV", "LLSV", "HSV", "LSV", "HYST", "ADEL", "MDEL", "ODEL",
1235    "P", "PP", "I", "IP", "D", "DP", "CT", "CTP", "DT", "DTP", "ERR", "ERRP", "LALM", "ALST",
1236    "MLST",
1237];
1238
1239/// `recordtype(throttle)` — 21 CA-visible own fields from `dbd/throttleRecord.dbd` (1 `DBF_NOACCESS` internals dropped).
1240pub static THROTTLE_FIELDS: &[FieldDesc] = &[
1241    FieldDesc {
1242        name: "VAL",
1243        dbf_type: DbFieldType::Double,
1244        declared_dbf: DbfCode::Double,
1245        runtime_typed: false,
1246        read_only: false,
1247        special: Special::None,
1248        declared_special: Special::None,
1249        pp: true,
1250        asl: Asl::Asl1,
1251        size: 0,
1252        extra: None,
1253        menu: None,
1254        initial: None,
1255        interest: 0,
1256        prop: false,
1257        prompt: Some("Set Value"),
1258        promptgroup: None,
1259        base: Base::Decimal,
1260    },
1261    FieldDesc {
1262        name: "OVAL",
1263        dbf_type: DbFieldType::Double,
1264        declared_dbf: DbfCode::Double,
1265        runtime_typed: false,
1266        read_only: true,
1267        special: Special::NoMod,
1268        declared_special: Special::NoMod,
1269        pp: false,
1270        asl: Asl::Asl1,
1271        size: 0,
1272        extra: None,
1273        menu: None,
1274        initial: None,
1275        interest: 3,
1276        prop: false,
1277        prompt: Some("Previous Set Value"),
1278        promptgroup: None,
1279        base: Base::Decimal,
1280    },
1281    FieldDesc {
1282        name: "SENT",
1283        dbf_type: DbFieldType::Double,
1284        declared_dbf: DbfCode::Double,
1285        runtime_typed: false,
1286        read_only: true,
1287        special: Special::NoMod,
1288        declared_special: Special::NoMod,
1289        pp: false,
1290        asl: Asl::Asl1,
1291        size: 0,
1292        extra: None,
1293        menu: None,
1294        initial: None,
1295        interest: 0,
1296        prop: false,
1297        prompt: Some("Sent Value"),
1298        promptgroup: None,
1299        base: Base::Decimal,
1300    },
1301    FieldDesc {
1302        name: "OSENT",
1303        dbf_type: DbFieldType::Double,
1304        declared_dbf: DbfCode::Double,
1305        runtime_typed: false,
1306        read_only: true,
1307        special: Special::NoMod,
1308        declared_special: Special::NoMod,
1309        pp: false,
1310        asl: Asl::Asl1,
1311        size: 0,
1312        extra: None,
1313        menu: None,
1314        initial: None,
1315        interest: 0,
1316        prop: false,
1317        prompt: Some("Previous Sent Value"),
1318        promptgroup: None,
1319        base: Base::Decimal,
1320    },
1321    FieldDesc {
1322        name: "WAIT",
1323        dbf_type: DbFieldType::Enum,
1324        declared_dbf: DbfCode::Menu,
1325        runtime_typed: false,
1326        read_only: true,
1327        special: Special::NoMod,
1328        declared_special: Special::NoMod,
1329        pp: false,
1330        asl: Asl::Asl1,
1331        size: 0,
1332        extra: None,
1333        menu: Some(MENU_THROTTLE_WAIT),
1334        initial: Some("0"),
1335        interest: 1,
1336        prop: false,
1337        prompt: Some("Busy"),
1338        promptgroup: None,
1339        base: Base::Decimal,
1340    },
1341    FieldDesc {
1342        name: "HOPR",
1343        dbf_type: DbFieldType::Double,
1344        declared_dbf: DbfCode::Double,
1345        runtime_typed: false,
1346        read_only: false,
1347        special: Special::None,
1348        declared_special: Special::None,
1349        pp: false,
1350        asl: Asl::Asl1,
1351        size: 0,
1352        extra: None,
1353        menu: None,
1354        initial: None,
1355        interest: 1,
1356        prop: false,
1357        prompt: Some("High Operating Range"),
1358        promptgroup: Some("GUI_DISPLAY"),
1359        base: Base::Decimal,
1360    },
1361    FieldDesc {
1362        name: "LOPR",
1363        dbf_type: DbFieldType::Double,
1364        declared_dbf: DbfCode::Double,
1365        runtime_typed: false,
1366        read_only: false,
1367        special: Special::None,
1368        declared_special: Special::None,
1369        pp: false,
1370        asl: Asl::Asl1,
1371        size: 0,
1372        extra: None,
1373        menu: None,
1374        initial: None,
1375        interest: 1,
1376        prop: false,
1377        prompt: Some("Low Operating Range"),
1378        promptgroup: Some("GUI_DISPLAY"),
1379        base: Base::Decimal,
1380    },
1381    FieldDesc {
1382        name: "DRVLH",
1383        dbf_type: DbFieldType::Double,
1384        declared_dbf: DbfCode::Double,
1385        runtime_typed: false,
1386        read_only: false,
1387        special: Special::Mod,
1388        declared_special: Special::Mod,
1389        pp: false,
1390        asl: Asl::Asl1,
1391        size: 0,
1392        extra: None,
1393        menu: None,
1394        initial: Some("0.0"),
1395        interest: 0,
1396        prop: false,
1397        prompt: Some("High Limit"),
1398        promptgroup: None,
1399        base: Base::Decimal,
1400    },
1401    FieldDesc {
1402        name: "DRVLL",
1403        dbf_type: DbFieldType::Double,
1404        declared_dbf: DbfCode::Double,
1405        runtime_typed: false,
1406        read_only: false,
1407        special: Special::Mod,
1408        declared_special: Special::Mod,
1409        pp: false,
1410        asl: Asl::Asl1,
1411        size: 0,
1412        extra: None,
1413        menu: None,
1414        initial: Some("0.0"),
1415        interest: 0,
1416        prop: false,
1417        prompt: Some("Low Limit"),
1418        promptgroup: None,
1419        base: Base::Decimal,
1420    },
1421    FieldDesc {
1422        name: "DRVLS",
1423        dbf_type: DbFieldType::Enum,
1424        declared_dbf: DbfCode::Menu,
1425        runtime_typed: false,
1426        read_only: true,
1427        special: Special::NoMod,
1428        declared_special: Special::NoMod,
1429        pp: false,
1430        asl: Asl::Asl1,
1431        size: 0,
1432        extra: None,
1433        menu: Some(MENU_THROTTLE_DRVLS),
1434        initial: Some("0"),
1435        interest: 1,
1436        prop: false,
1437        prompt: Some("Limit Status"),
1438        promptgroup: None,
1439        base: Base::Decimal,
1440    },
1441    FieldDesc {
1442        name: "DRVLC",
1443        dbf_type: DbFieldType::Enum,
1444        declared_dbf: DbfCode::Menu,
1445        runtime_typed: false,
1446        read_only: false,
1447        special: Special::None,
1448        declared_special: Special::None,
1449        pp: false,
1450        asl: Asl::Asl1,
1451        size: 0,
1452        extra: None,
1453        menu: Some(MENU_THROTTLE_DRVLC),
1454        initial: Some("0"),
1455        interest: 0,
1456        prop: false,
1457        prompt: Some("Limit Clipping"),
1458        promptgroup: None,
1459        base: Base::Decimal,
1460    },
1461    FieldDesc {
1462        name: "VER",
1463        dbf_type: DbFieldType::String,
1464        declared_dbf: DbfCode::String,
1465        runtime_typed: false,
1466        read_only: true,
1467        special: Special::NoMod,
1468        declared_special: Special::NoMod,
1469        pp: false,
1470        asl: Asl::Asl1,
1471        size: 20,
1472        extra: None,
1473        menu: None,
1474        initial: Some(""),
1475        interest: 0,
1476        prop: false,
1477        prompt: Some("Code Version"),
1478        promptgroup: None,
1479        base: Base::Decimal,
1480    },
1481    FieldDesc {
1482        name: "STS",
1483        dbf_type: DbFieldType::Enum,
1484        declared_dbf: DbfCode::Menu,
1485        runtime_typed: false,
1486        read_only: true,
1487        special: Special::NoMod,
1488        declared_special: Special::NoMod,
1489        pp: false,
1490        asl: Asl::Asl1,
1491        size: 0,
1492        extra: None,
1493        menu: Some(MENU_THROTTLE_STS),
1494        initial: Some("0"),
1495        interest: 1,
1496        prop: false,
1497        prompt: Some("Record Status"),
1498        promptgroup: None,
1499        base: Base::Decimal,
1500    },
1501    FieldDesc {
1502        name: "PREC",
1503        dbf_type: DbFieldType::Short,
1504        declared_dbf: DbfCode::Short,
1505        runtime_typed: false,
1506        read_only: false,
1507        special: Special::None,
1508        declared_special: Special::None,
1509        pp: false,
1510        asl: Asl::Asl1,
1511        size: 0,
1512        extra: None,
1513        menu: None,
1514        initial: None,
1515        interest: 1,
1516        prop: false,
1517        prompt: Some("Display Precision"),
1518        promptgroup: Some("GUI_DISPLAY"),
1519        base: Base::Decimal,
1520    },
1521    FieldDesc {
1522        name: "DPREC",
1523        dbf_type: DbFieldType::Short,
1524        declared_dbf: DbfCode::Short,
1525        runtime_typed: false,
1526        read_only: false,
1527        special: Special::None,
1528        declared_special: Special::None,
1529        pp: false,
1530        asl: Asl::Asl1,
1531        size: 0,
1532        extra: None,
1533        menu: None,
1534        initial: None,
1535        interest: 1,
1536        prop: false,
1537        prompt: Some("Delay Display Precision"),
1538        promptgroup: Some("GUI_DISPLAY"),
1539        base: Base::Decimal,
1540    },
1541    FieldDesc {
1542        name: "DLY",
1543        dbf_type: DbFieldType::Double,
1544        declared_dbf: DbfCode::Double,
1545        runtime_typed: false,
1546        read_only: false,
1547        special: Special::Mod,
1548        declared_special: Special::Mod,
1549        pp: false,
1550        asl: Asl::Asl1,
1551        size: 0,
1552        extra: None,
1553        menu: None,
1554        initial: Some("0.0"),
1555        interest: 0,
1556        prop: false,
1557        prompt: Some("Delay value"),
1558        promptgroup: None,
1559        base: Base::Decimal,
1560    },
1561    FieldDesc {
1562        name: "OUT",
1563        dbf_type: DbFieldType::String,
1564        declared_dbf: DbfCode::Outlink,
1565        runtime_typed: false,
1566        read_only: false,
1567        special: Special::Mod,
1568        declared_special: Special::Mod,
1569        pp: false,
1570        asl: Asl::Asl1,
1571        size: 0,
1572        extra: None,
1573        menu: None,
1574        initial: None,
1575        interest: 1,
1576        prop: false,
1577        prompt: Some("Output"),
1578        promptgroup: Some("GUI_COMMON"),
1579        base: Base::Decimal,
1580    },
1581    FieldDesc {
1582        name: "OV",
1583        dbf_type: DbFieldType::Enum,
1584        declared_dbf: DbfCode::Menu,
1585        runtime_typed: false,
1586        read_only: true,
1587        special: Special::NoMod,
1588        declared_special: Special::NoMod,
1589        pp: false,
1590        asl: Asl::Asl1,
1591        size: 0,
1592        extra: None,
1593        menu: Some(MENU_THROTTLE_OV),
1594        initial: Some("1"),
1595        interest: 1,
1596        prop: false,
1597        prompt: Some("Output link valid"),
1598        promptgroup: None,
1599        base: Base::Decimal,
1600    },
1601    FieldDesc {
1602        name: "SINP",
1603        dbf_type: DbFieldType::String,
1604        declared_dbf: DbfCode::Inlink,
1605        runtime_typed: false,
1606        read_only: false,
1607        special: Special::Mod,
1608        declared_special: Special::Mod,
1609        pp: false,
1610        asl: Asl::Asl1,
1611        size: 0,
1612        extra: None,
1613        menu: None,
1614        initial: None,
1615        interest: 1,
1616        prop: false,
1617        prompt: Some("Sync Input"),
1618        promptgroup: Some("GUI_COMMON"),
1619        base: Base::Decimal,
1620    },
1621    FieldDesc {
1622        name: "SIV",
1623        dbf_type: DbFieldType::Enum,
1624        declared_dbf: DbfCode::Menu,
1625        runtime_typed: false,
1626        read_only: true,
1627        special: Special::NoMod,
1628        declared_special: Special::NoMod,
1629        pp: false,
1630        asl: Asl::Asl1,
1631        size: 0,
1632        extra: None,
1633        menu: Some(MENU_THROTTLE_OV),
1634        initial: Some("1"),
1635        interest: 1,
1636        prop: false,
1637        prompt: Some("Sync Input link valid"),
1638        promptgroup: None,
1639        base: Base::Decimal,
1640    },
1641    FieldDesc {
1642        name: "SYNC",
1643        dbf_type: DbFieldType::Enum,
1644        declared_dbf: DbfCode::Menu,
1645        runtime_typed: false,
1646        read_only: false,
1647        special: Special::Mod,
1648        declared_special: Special::Mod,
1649        pp: false,
1650        asl: Asl::Asl1,
1651        size: 0,
1652        extra: None,
1653        menu: Some(MENU_THROTTLE_SYNC),
1654        initial: Some("Idle"),
1655        interest: 0,
1656        prop: false,
1657        prompt: Some("Sync values"),
1658        promptgroup: None,
1659        base: Base::Decimal,
1660    },
1661];
1662
1663/// `recordtype(throttle)` — the `DBF_NOACCESS` internal names dropped from
1664/// [`THROTTLE_FIELDS`]: resolvable (a SEARCH is answered), never servable.
1665pub static THROTTLE_NOACCESS: &[&str] = &["RPVT"];
1666
1667/// `recordtype(throttle)` — C's `papFldDes` order, all 70 declarations
1668/// including the internals [`THROTTLE_FIELDS`] drops. The index into this is
1669/// C's `indRecordType`.
1670pub static THROTTLE_DECL: &[&str] = &[
1671    "NAME", "DESC", "ASG", "SCAN", "PINI", "PHAS", "EVNT", "TSE", "TSEL", "DTYP", "DISV", "DISA",
1672    "SDIS", "MLOK", "MLIS", "BKLNK", "DISP", "PROC", "STAT", "SEVR", "AMSG", "NSTA", "NSEV",
1673    "NAMSG", "ACKS", "ACKT", "DISS", "LCNT", "PACT", "PUTF", "RPRO", "ASP", "PPN", "PPNR", "SPVT",
1674    "RSET", "DSET", "DPVT", "RDES", "LSET", "PRIO", "TPRO", "BKPT", "UDF", "UDFS", "TIME", "UTAG",
1675    "FLNK", "VAL", "OVAL", "SENT", "OSENT", "WAIT", "HOPR", "LOPR", "DRVLH", "DRVLL", "DRVLS",
1676    "DRVLC", "VER", "RPVT", "STS", "PREC", "DPREC", "DLY", "OUT", "OV", "SINP", "SIV", "SYNC",
1677];
1678
1679/// `recordtype(timestamp)` — 4 CA-visible own fields from `dbd/timestampRecord.dbd` (0 `DBF_NOACCESS` internals dropped).
1680pub static TIMESTAMP_FIELDS: &[FieldDesc] = &[
1681    FieldDesc {
1682        name: "VAL",
1683        dbf_type: DbFieldType::String,
1684        declared_dbf: DbfCode::String,
1685        runtime_typed: false,
1686        read_only: false,
1687        special: Special::None,
1688        declared_special: Special::None,
1689        pp: true,
1690        asl: Asl::Asl0,
1691        size: 40,
1692        extra: None,
1693        menu: None,
1694        initial: None,
1695        interest: 0,
1696        prop: false,
1697        prompt: Some("Current Value"),
1698        promptgroup: None,
1699        base: Base::Decimal,
1700    },
1701    FieldDesc {
1702        name: "OVAL",
1703        dbf_type: DbFieldType::String,
1704        declared_dbf: DbfCode::String,
1705        runtime_typed: false,
1706        read_only: true,
1707        special: Special::NoMod,
1708        declared_special: Special::NoMod,
1709        pp: false,
1710        asl: Asl::Asl1,
1711        size: 40,
1712        extra: None,
1713        menu: None,
1714        initial: None,
1715        interest: 3,
1716        prop: false,
1717        prompt: Some("Previous Value"),
1718        promptgroup: None,
1719        base: Base::Decimal,
1720    },
1721    FieldDesc {
1722        name: "RVAL",
1723        dbf_type: DbFieldType::ULong,
1724        declared_dbf: DbfCode::ULong,
1725        runtime_typed: false,
1726        read_only: false,
1727        special: Special::None,
1728        declared_special: Special::None,
1729        pp: true,
1730        asl: Asl::Asl1,
1731        size: 0,
1732        extra: None,
1733        menu: None,
1734        initial: None,
1735        interest: 0,
1736        prop: false,
1737        prompt: Some("Current Raw Value"),
1738        promptgroup: None,
1739        base: Base::Decimal,
1740    },
1741    FieldDesc {
1742        name: "TST",
1743        dbf_type: DbFieldType::Enum,
1744        declared_dbf: DbfCode::Menu,
1745        runtime_typed: false,
1746        read_only: false,
1747        special: Special::None,
1748        declared_special: Special::None,
1749        pp: false,
1750        asl: Asl::Asl1,
1751        size: 0,
1752        extra: None,
1753        menu: Some(MENU_TIMESTAMP_TST),
1754        initial: None,
1755        interest: 2,
1756        prop: false,
1757        prompt: Some("Time Stamp Type"),
1758        promptgroup: Some("GUI_INPUTS"),
1759        base: Base::Decimal,
1760    },
1761];
1762
1763/// `recordtype(timestamp)` — the `DBF_NOACCESS` internal names dropped from
1764/// [`TIMESTAMP_FIELDS`]: resolvable (a SEARCH is answered), never servable.
1765pub static TIMESTAMP_NOACCESS: &[&str] = &[];
1766
1767/// `recordtype(timestamp)` — C's `papFldDes` order, all 52 declarations
1768/// including the internals [`TIMESTAMP_FIELDS`] drops. The index into this is
1769/// C's `indRecordType`.
1770pub static TIMESTAMP_DECL: &[&str] = &[
1771    "NAME", "DESC", "ASG", "SCAN", "PINI", "PHAS", "EVNT", "TSE", "TSEL", "DTYP", "DISV", "DISA",
1772    "SDIS", "MLOK", "MLIS", "BKLNK", "DISP", "PROC", "STAT", "SEVR", "AMSG", "NSTA", "NSEV",
1773    "NAMSG", "ACKS", "ACKT", "DISS", "LCNT", "PACT", "PUTF", "RPRO", "ASP", "PPN", "PPNR", "SPVT",
1774    "RSET", "DSET", "DPVT", "RDES", "LSET", "PRIO", "TPRO", "BKPT", "UDF", "UDFS", "TIME", "UTAG",
1775    "FLNK", "VAL", "OVAL", "RVAL", "TST",
1776];
1777
1778/// The record-own field table for a record type name, or `None` for a type
1779/// no vendored `.dbd` declares.
1780pub fn record_fields(record_type: &str) -> Option<&'static [FieldDesc]> {
1781    Some(match record_type {
1782        "epid" => EPID_FIELDS,
1783        "throttle" => THROTTLE_FIELDS,
1784        "timestamp" => TIMESTAMP_FIELDS,
1785        _ => return None,
1786    })
1787}
1788
1789/// The record-own `DBF_NOACCESS` internal names for a record type — fields
1790/// C's `dbNameToAddr` resolves (a SEARCH is answered) but whose channel is
1791/// refused at creation (`mapDBFToDBR` -> `DBR_NOACCESS`). Empty for a type
1792/// declaring none, `None` for a type no vendored `.dbd` declares.
1793pub fn record_noaccess_fields(record_type: &str) -> Option<&'static [&'static str]> {
1794    Some(match record_type {
1795        "epid" => EPID_NOACCESS,
1796        "throttle" => THROTTLE_NOACCESS,
1797        "timestamp" => TIMESTAMP_NOACCESS,
1798        _ => return None,
1799    })
1800}
1801
1802/// Every field a record type declares, in C's `papFldDes` order — the order
1803/// `dbDumpRecordType` indexes and `link_ind`/`sortFldInd`/`indvalFlddes`
1804/// point into. Unlike `record_fields` this keeps the `DBF_NOACCESS`
1805/// internals and splices dbCommon where the `.dbd` puts its `include`, so
1806/// the index of a name here is C's own `indRecordType` for it.
1807pub fn record_declaration_order(record_type: &str) -> Option<&'static [&'static str]> {
1808    Some(match record_type {
1809        "epid" => EPID_DECL,
1810        "throttle" => THROTTLE_DECL,
1811        "timestamp" => TIMESTAMP_DECL,
1812        _ => return None,
1813    })
1814}
1815
1816/// C's `pdbRecordType->no_prompt`: how many of `record_declaration_order`'s
1817/// declarations carry a `promptgroup(...)` (`dbLexRoutines.c:752`). Counted
1818/// here because the port drops `promptgroup` at emit, so it cannot be
1819/// recovered from the field tables.
1820pub fn record_no_prompt(record_type: &str) -> Option<u16> {
1821    Some(match record_type {
1822        "epid" => 49,
1823        "throttle" => 24,
1824        "timestamp" => 19,
1825        _ => return None,
1826    })
1827}
1828
1829/// Every record type a vendored `.dbd` declares, in `.dbd` name order.
1830pub static RECORD_TYPES: &[&str] = &["epid", "throttle", "timestamp"];