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` fields** (`RSET`, `DPVT`, `MLOK`, `BPTR`, `PPN`, ...).
19//!   These are C-internal pointers with no CA/PVA representation — C's
20//!   `mapDBFToDBR` sends them to `DBR_NOACCESS` and `dbChannelCreate` refuses
21//!   a channel on them. A Rust port has no pointer to expose, so their
22//!   *descriptors* are dropped rather than invented — but their NAMES are
23//!   kept (`record_noaccess_fields`): C's `dbNameToAddr` resolves them, so
24//!   a SEARCH for `REC.BPTR` is answered and the refusal lands at channel
25//!   creation, and the search gate needs the names to do the same.
26
27#![allow(clippy::all)]
28
29use epics_base_rs::server::record::{Asl, FieldDesc, Special};
30use epics_base_rs::types::DbFieldType;
31
32// ---------------------------------------------------------------------
33// `menu(...)` choice tables. The index is the stored `epicsEnum16` and is
34// wire-visible (a `DBF_MENU` field is served as `DBR_ENUM`), so the order
35// here is the `.dbd` declaration order, verbatim.
36// ---------------------------------------------------------------------
37
38/// `menu(epidFeedbackMode)`
39pub static MENU_EPID_FEEDBACK_MODE: &[&str] = &["PID", "Max/Min"];
40
41/// `menu(epidFeedbackState)`
42pub static MENU_EPID_FEEDBACK_STATE: &[&str] = &["Off", "On"];
43
44/// `menu(throttleDRVLC)`
45pub static MENU_THROTTLE_DRVLC: &[&str] = &["Off", "On"];
46
47/// `menu(throttleDRVLS)`
48pub static MENU_THROTTLE_DRVLS: &[&str] = &["Normal", "Low Limit", "High Limit"];
49
50/// `menu(throttleOV)`
51pub static MENU_THROTTLE_OV: &[&str] = &["Ext PV NC", "Ext PV OK", "Local PV", "Constant"];
52
53/// `menu(throttleSTS)`
54pub static MENU_THROTTLE_STS: &[&str] = &["Unknown", "Error", "Success"];
55
56/// `menu(throttleSYNC)`
57pub static MENU_THROTTLE_SYNC: &[&str] = &["Idle", "Process"];
58
59/// `menu(throttleWAIT)`
60pub static MENU_THROTTLE_WAIT: &[&str] = &["False", "True"];
61
62/// `menu(timestampTST)`
63pub static MENU_TIMESTAMP_TST: &[&str] = &[
64    "YY/MM/DD HH:MM:SS",
65    "MM/DD/YY HH:MM:SS",
66    "Mon DD HH:MM:SS YY",
67    "Mon DD HH:MM:SS",
68    "HH:MM:SS",
69    "HH:MM",
70    "DD/MM/YY HH:MM:SS",
71    "DD Mon HH:MM:SS YY",
72    "DD-Mon-YYYY HH:MM:SS",
73    "Mon DD, YYYY HH:MM:SS.ns",
74    "MM/DD/YY HH:MM:SS.ns",
75];
76
77/// Every `menu()` declared by a vendored `.dbd`, keyed by its EPICS name.
78///
79/// This is the table `get_enum_strs` answers a `DBF_MENU` field from: the
80/// field's [`FieldDesc::menu`] already points at its choices, and this map
81/// exists for the by-name lookups (`.db` loading, `dbpr`).
82pub fn menu_choices(menu: &str) -> Option<&'static [&'static str]> {
83    Some(match menu {
84        "epidFeedbackMode" => MENU_EPID_FEEDBACK_MODE,
85        "epidFeedbackState" => MENU_EPID_FEEDBACK_STATE,
86        "throttleDRVLC" => MENU_THROTTLE_DRVLC,
87        "throttleDRVLS" => MENU_THROTTLE_DRVLS,
88        "throttleOV" => MENU_THROTTLE_OV,
89        "throttleSTS" => MENU_THROTTLE_STS,
90        "throttleSYNC" => MENU_THROTTLE_SYNC,
91        "throttleWAIT" => MENU_THROTTLE_WAIT,
92        "timestampTST" => MENU_TIMESTAMP_TST,
93        _ => return None,
94    })
95}
96
97// ---------------------------------------------------------------------
98// Per-record-type field tables. Record-*own* fields only: `dbCommon` is
99// modelled separately (see the module docs).
100// ---------------------------------------------------------------------
101
102/// `recordtype(epid)` — 49 CA-visible own fields from `dbd/epidRecord.dbd` (2 `DBF_NOACCESS` internals dropped).
103pub static EPID_FIELDS: &[FieldDesc] = &[
104    FieldDesc {
105        name: "VAL",
106        dbf_type: DbFieldType::Double,
107        runtime_typed: false,
108        read_only: false,
109        special: Special::None,
110        pp: true,
111        asl: Asl::Asl0,
112        size: 0,
113        menu: None,
114        initial: None,
115        interest: 0,
116        prop: false,
117    },
118    FieldDesc {
119        name: "SMSL",
120        dbf_type: DbFieldType::Enum,
121        runtime_typed: false,
122        read_only: false,
123        special: Special::None,
124        pp: false,
125        asl: Asl::Asl1,
126        size: 0,
127        menu: Some(epics_base_rs::server::record::dbd_generated::MENU_OMSL),
128        initial: None,
129        interest: 1,
130        prop: false,
131    },
132    FieldDesc {
133        name: "STPL",
134        dbf_type: DbFieldType::String,
135        runtime_typed: false,
136        read_only: false,
137        special: Special::None,
138        pp: false,
139        asl: Asl::Asl1,
140        size: 0,
141        menu: None,
142        initial: None,
143        interest: 1,
144        prop: false,
145    },
146    FieldDesc {
147        name: "INP",
148        dbf_type: DbFieldType::String,
149        runtime_typed: false,
150        read_only: false,
151        special: Special::None,
152        pp: false,
153        asl: Asl::Asl1,
154        size: 0,
155        menu: None,
156        initial: None,
157        interest: 1,
158        prop: false,
159    },
160    FieldDesc {
161        name: "OUTL",
162        dbf_type: DbFieldType::String,
163        runtime_typed: false,
164        read_only: false,
165        special: Special::None,
166        pp: false,
167        asl: Asl::Asl1,
168        size: 0,
169        menu: None,
170        initial: None,
171        interest: 1,
172        prop: false,
173    },
174    FieldDesc {
175        name: "TRIG",
176        dbf_type: DbFieldType::String,
177        runtime_typed: false,
178        read_only: false,
179        special: Special::None,
180        pp: false,
181        asl: Asl::Asl1,
182        size: 0,
183        menu: None,
184        initial: None,
185        interest: 1,
186        prop: false,
187    },
188    FieldDesc {
189        name: "TVAL",
190        dbf_type: DbFieldType::Double,
191        runtime_typed: false,
192        read_only: false,
193        special: Special::None,
194        pp: false,
195        asl: Asl::Asl1,
196        size: 0,
197        menu: None,
198        initial: None,
199        interest: 1,
200        prop: false,
201    },
202    FieldDesc {
203        name: "CVAL",
204        dbf_type: DbFieldType::Double,
205        runtime_typed: false,
206        read_only: true,
207        special: Special::NoMod,
208        pp: false,
209        asl: Asl::Asl1,
210        size: 0,
211        menu: None,
212        initial: None,
213        interest: 0,
214        prop: false,
215    },
216    FieldDesc {
217        name: "CVLP",
218        dbf_type: DbFieldType::Double,
219        runtime_typed: false,
220        read_only: true,
221        special: Special::NoMod,
222        pp: false,
223        asl: Asl::Asl1,
224        size: 0,
225        menu: None,
226        initial: None,
227        interest: 0,
228        prop: false,
229    },
230    FieldDesc {
231        name: "OVAL",
232        dbf_type: DbFieldType::Double,
233        runtime_typed: false,
234        read_only: true,
235        special: Special::NoMod,
236        pp: false,
237        asl: Asl::Asl1,
238        size: 0,
239        menu: None,
240        initial: None,
241        interest: 0,
242        prop: false,
243    },
244    FieldDesc {
245        name: "OVLP",
246        dbf_type: DbFieldType::Double,
247        runtime_typed: false,
248        read_only: true,
249        special: Special::NoMod,
250        pp: false,
251        asl: Asl::Asl1,
252        size: 0,
253        menu: None,
254        initial: None,
255        interest: 3,
256        prop: false,
257    },
258    FieldDesc {
259        name: "PREC",
260        dbf_type: DbFieldType::Short,
261        runtime_typed: false,
262        read_only: false,
263        special: Special::None,
264        pp: false,
265        asl: Asl::Asl1,
266        size: 0,
267        menu: None,
268        initial: None,
269        interest: 1,
270        prop: false,
271    },
272    FieldDesc {
273        name: "MDT",
274        dbf_type: DbFieldType::Double,
275        runtime_typed: false,
276        read_only: false,
277        special: Special::None,
278        pp: false,
279        asl: Asl::Asl1,
280        size: 0,
281        menu: None,
282        initial: None,
283        interest: 1,
284        prop: false,
285    },
286    FieldDesc {
287        name: "FMOD",
288        dbf_type: DbFieldType::Enum,
289        runtime_typed: false,
290        read_only: false,
291        special: Special::None,
292        pp: false,
293        asl: Asl::Asl1,
294        size: 0,
295        menu: Some(MENU_EPID_FEEDBACK_MODE),
296        initial: None,
297        interest: 1,
298        prop: false,
299    },
300    FieldDesc {
301        name: "FBON",
302        dbf_type: DbFieldType::Enum,
303        runtime_typed: false,
304        read_only: false,
305        special: Special::None,
306        pp: false,
307        asl: Asl::Asl1,
308        size: 0,
309        menu: Some(MENU_EPID_FEEDBACK_STATE),
310        initial: None,
311        interest: 1,
312        prop: false,
313    },
314    FieldDesc {
315        name: "FBOP",
316        dbf_type: DbFieldType::Enum,
317        runtime_typed: false,
318        read_only: false,
319        special: Special::None,
320        pp: false,
321        asl: Asl::Asl1,
322        size: 0,
323        menu: Some(MENU_EPID_FEEDBACK_STATE),
324        initial: None,
325        interest: 1,
326        prop: false,
327    },
328    FieldDesc {
329        name: "KP",
330        dbf_type: DbFieldType::Double,
331        runtime_typed: false,
332        read_only: false,
333        special: Special::None,
334        pp: false,
335        asl: Asl::Asl1,
336        size: 0,
337        menu: None,
338        initial: None,
339        interest: 1,
340        prop: false,
341    },
342    FieldDesc {
343        name: "KI",
344        dbf_type: DbFieldType::Double,
345        runtime_typed: false,
346        read_only: false,
347        special: Special::None,
348        pp: false,
349        asl: Asl::Asl1,
350        size: 0,
351        menu: None,
352        initial: None,
353        interest: 1,
354        prop: false,
355    },
356    FieldDesc {
357        name: "KD",
358        dbf_type: DbFieldType::Double,
359        runtime_typed: false,
360        read_only: false,
361        special: Special::None,
362        pp: false,
363        asl: Asl::Asl1,
364        size: 0,
365        menu: None,
366        initial: None,
367        interest: 1,
368        prop: false,
369    },
370    FieldDesc {
371        name: "EGU",
372        dbf_type: DbFieldType::String,
373        runtime_typed: false,
374        read_only: false,
375        special: Special::None,
376        pp: false,
377        asl: Asl::Asl1,
378        size: 16,
379        menu: None,
380        initial: None,
381        interest: 1,
382        prop: false,
383    },
384    FieldDesc {
385        name: "HOPR",
386        dbf_type: DbFieldType::Double,
387        runtime_typed: false,
388        read_only: false,
389        special: Special::None,
390        pp: false,
391        asl: Asl::Asl1,
392        size: 0,
393        menu: None,
394        initial: None,
395        interest: 1,
396        prop: false,
397    },
398    FieldDesc {
399        name: "LOPR",
400        dbf_type: DbFieldType::Double,
401        runtime_typed: false,
402        read_only: false,
403        special: Special::None,
404        pp: false,
405        asl: Asl::Asl1,
406        size: 0,
407        menu: None,
408        initial: None,
409        interest: 1,
410        prop: false,
411    },
412    FieldDesc {
413        name: "DRVH",
414        dbf_type: DbFieldType::Double,
415        runtime_typed: false,
416        read_only: false,
417        special: Special::None,
418        pp: false,
419        asl: Asl::Asl1,
420        size: 0,
421        menu: None,
422        initial: None,
423        interest: 1,
424        prop: false,
425    },
426    FieldDesc {
427        name: "DRVL",
428        dbf_type: DbFieldType::Double,
429        runtime_typed: false,
430        read_only: false,
431        special: Special::None,
432        pp: false,
433        asl: Asl::Asl1,
434        size: 0,
435        menu: None,
436        initial: None,
437        interest: 1,
438        prop: false,
439    },
440    FieldDesc {
441        name: "HIHI",
442        dbf_type: DbFieldType::Double,
443        runtime_typed: false,
444        read_only: false,
445        special: Special::None,
446        pp: false,
447        asl: Asl::Asl1,
448        size: 0,
449        menu: None,
450        initial: None,
451        interest: 1,
452        prop: false,
453    },
454    FieldDesc {
455        name: "LOLO",
456        dbf_type: DbFieldType::Double,
457        runtime_typed: false,
458        read_only: false,
459        special: Special::None,
460        pp: false,
461        asl: Asl::Asl1,
462        size: 0,
463        menu: None,
464        initial: None,
465        interest: 1,
466        prop: false,
467    },
468    FieldDesc {
469        name: "HIGH",
470        dbf_type: DbFieldType::Double,
471        runtime_typed: false,
472        read_only: false,
473        special: Special::None,
474        pp: false,
475        asl: Asl::Asl1,
476        size: 0,
477        menu: None,
478        initial: None,
479        interest: 1,
480        prop: false,
481    },
482    FieldDesc {
483        name: "LOW",
484        dbf_type: DbFieldType::Double,
485        runtime_typed: false,
486        read_only: false,
487        special: Special::None,
488        pp: false,
489        asl: Asl::Asl1,
490        size: 0,
491        menu: None,
492        initial: None,
493        interest: 1,
494        prop: false,
495    },
496    FieldDesc {
497        name: "HHSV",
498        dbf_type: DbFieldType::Enum,
499        runtime_typed: false,
500        read_only: false,
501        special: Special::None,
502        pp: false,
503        asl: Asl::Asl1,
504        size: 0,
505        menu: Some(epics_base_rs::server::record::dbd_generated::MENU_ALARM_SEVR),
506        initial: None,
507        interest: 1,
508        prop: false,
509    },
510    FieldDesc {
511        name: "LLSV",
512        dbf_type: DbFieldType::Enum,
513        runtime_typed: false,
514        read_only: false,
515        special: Special::None,
516        pp: false,
517        asl: Asl::Asl1,
518        size: 0,
519        menu: Some(epics_base_rs::server::record::dbd_generated::MENU_ALARM_SEVR),
520        initial: None,
521        interest: 1,
522        prop: false,
523    },
524    FieldDesc {
525        name: "HSV",
526        dbf_type: DbFieldType::Enum,
527        runtime_typed: false,
528        read_only: false,
529        special: Special::None,
530        pp: false,
531        asl: Asl::Asl1,
532        size: 0,
533        menu: Some(epics_base_rs::server::record::dbd_generated::MENU_ALARM_SEVR),
534        initial: None,
535        interest: 1,
536        prop: false,
537    },
538    FieldDesc {
539        name: "LSV",
540        dbf_type: DbFieldType::Enum,
541        runtime_typed: false,
542        read_only: false,
543        special: Special::None,
544        pp: false,
545        asl: Asl::Asl1,
546        size: 0,
547        menu: Some(epics_base_rs::server::record::dbd_generated::MENU_ALARM_SEVR),
548        initial: None,
549        interest: 1,
550        prop: false,
551    },
552    FieldDesc {
553        name: "HYST",
554        dbf_type: DbFieldType::Double,
555        runtime_typed: false,
556        read_only: false,
557        special: Special::None,
558        pp: false,
559        asl: Asl::Asl1,
560        size: 0,
561        menu: None,
562        initial: None,
563        interest: 1,
564        prop: false,
565    },
566    FieldDesc {
567        name: "ADEL",
568        dbf_type: DbFieldType::Double,
569        runtime_typed: false,
570        read_only: false,
571        special: Special::None,
572        pp: false,
573        asl: Asl::Asl1,
574        size: 0,
575        menu: None,
576        initial: None,
577        interest: 1,
578        prop: false,
579    },
580    FieldDesc {
581        name: "MDEL",
582        dbf_type: DbFieldType::Double,
583        runtime_typed: false,
584        read_only: false,
585        special: Special::None,
586        pp: false,
587        asl: Asl::Asl1,
588        size: 0,
589        menu: None,
590        initial: None,
591        interest: 1,
592        prop: false,
593    },
594    FieldDesc {
595        name: "ODEL",
596        dbf_type: DbFieldType::Double,
597        runtime_typed: false,
598        read_only: false,
599        special: Special::None,
600        pp: false,
601        asl: Asl::Asl1,
602        size: 0,
603        menu: None,
604        initial: None,
605        interest: 1,
606        prop: false,
607    },
608    FieldDesc {
609        name: "P",
610        dbf_type: DbFieldType::Double,
611        runtime_typed: false,
612        read_only: true,
613        special: Special::NoMod,
614        pp: false,
615        asl: Asl::Asl1,
616        size: 0,
617        menu: None,
618        initial: None,
619        interest: 2,
620        prop: false,
621    },
622    FieldDesc {
623        name: "PP",
624        dbf_type: DbFieldType::Double,
625        runtime_typed: false,
626        read_only: true,
627        special: Special::NoMod,
628        pp: false,
629        asl: Asl::Asl1,
630        size: 0,
631        menu: None,
632        initial: None,
633        interest: 2,
634        prop: false,
635    },
636    FieldDesc {
637        name: "I",
638        dbf_type: DbFieldType::Double,
639        runtime_typed: false,
640        read_only: false,
641        special: Special::None,
642        pp: false,
643        asl: Asl::Asl1,
644        size: 0,
645        menu: None,
646        initial: None,
647        interest: 2,
648        prop: false,
649    },
650    FieldDesc {
651        name: "IP",
652        dbf_type: DbFieldType::Double,
653        runtime_typed: false,
654        read_only: false,
655        special: Special::None,
656        pp: false,
657        asl: Asl::Asl1,
658        size: 0,
659        menu: None,
660        initial: None,
661        interest: 2,
662        prop: false,
663    },
664    FieldDesc {
665        name: "D",
666        dbf_type: DbFieldType::Double,
667        runtime_typed: false,
668        read_only: true,
669        special: Special::NoMod,
670        pp: false,
671        asl: Asl::Asl1,
672        size: 0,
673        menu: None,
674        initial: None,
675        interest: 2,
676        prop: false,
677    },
678    FieldDesc {
679        name: "DP",
680        dbf_type: DbFieldType::Double,
681        runtime_typed: false,
682        read_only: true,
683        special: Special::NoMod,
684        pp: false,
685        asl: Asl::Asl1,
686        size: 0,
687        menu: None,
688        initial: None,
689        interest: 2,
690        prop: false,
691    },
692    FieldDesc {
693        name: "DT",
694        dbf_type: DbFieldType::Double,
695        runtime_typed: false,
696        read_only: false,
697        special: Special::None,
698        pp: false,
699        asl: Asl::Asl1,
700        size: 0,
701        menu: None,
702        initial: None,
703        interest: 2,
704        prop: false,
705    },
706    FieldDesc {
707        name: "DTP",
708        dbf_type: DbFieldType::Double,
709        runtime_typed: false,
710        read_only: false,
711        special: Special::None,
712        pp: false,
713        asl: Asl::Asl1,
714        size: 0,
715        menu: None,
716        initial: None,
717        interest: 2,
718        prop: false,
719    },
720    FieldDesc {
721        name: "ERR",
722        dbf_type: DbFieldType::Double,
723        runtime_typed: false,
724        read_only: true,
725        special: Special::NoMod,
726        pp: false,
727        asl: Asl::Asl1,
728        size: 0,
729        menu: None,
730        initial: None,
731        interest: 2,
732        prop: false,
733    },
734    FieldDesc {
735        name: "ERRP",
736        dbf_type: DbFieldType::Double,
737        runtime_typed: false,
738        read_only: true,
739        special: Special::NoMod,
740        pp: false,
741        asl: Asl::Asl1,
742        size: 0,
743        menu: None,
744        initial: None,
745        interest: 2,
746        prop: false,
747    },
748    FieldDesc {
749        name: "LALM",
750        dbf_type: DbFieldType::Double,
751        runtime_typed: false,
752        read_only: true,
753        special: Special::NoMod,
754        pp: false,
755        asl: Asl::Asl1,
756        size: 0,
757        menu: None,
758        initial: None,
759        interest: 3,
760        prop: false,
761    },
762    FieldDesc {
763        name: "ALST",
764        dbf_type: DbFieldType::Double,
765        runtime_typed: false,
766        read_only: true,
767        special: Special::NoMod,
768        pp: false,
769        asl: Asl::Asl1,
770        size: 0,
771        menu: None,
772        initial: None,
773        interest: 3,
774        prop: false,
775    },
776    FieldDesc {
777        name: "MLST",
778        dbf_type: DbFieldType::Double,
779        runtime_typed: false,
780        read_only: true,
781        special: Special::NoMod,
782        pp: false,
783        asl: Asl::Asl1,
784        size: 0,
785        menu: None,
786        initial: None,
787        interest: 3,
788        prop: false,
789    },
790];
791
792/// `recordtype(epid)` — the `DBF_NOACCESS` internal names dropped from
793/// [`EPID_FIELDS`]: resolvable (a SEARCH is answered), never servable.
794pub static EPID_NOACCESS: &[&str] = &["CT", "CTP"];
795
796/// `recordtype(throttle)` — 21 CA-visible own fields from `dbd/throttleRecord.dbd` (1 `DBF_NOACCESS` internals dropped).
797pub static THROTTLE_FIELDS: &[FieldDesc] = &[
798    FieldDesc {
799        name: "VAL",
800        dbf_type: DbFieldType::Double,
801        runtime_typed: false,
802        read_only: false,
803        special: Special::None,
804        pp: true,
805        asl: Asl::Asl1,
806        size: 0,
807        menu: None,
808        initial: None,
809        interest: 0,
810        prop: false,
811    },
812    FieldDesc {
813        name: "OVAL",
814        dbf_type: DbFieldType::Double,
815        runtime_typed: false,
816        read_only: true,
817        special: Special::NoMod,
818        pp: false,
819        asl: Asl::Asl1,
820        size: 0,
821        menu: None,
822        initial: None,
823        interest: 3,
824        prop: false,
825    },
826    FieldDesc {
827        name: "SENT",
828        dbf_type: DbFieldType::Double,
829        runtime_typed: false,
830        read_only: true,
831        special: Special::NoMod,
832        pp: false,
833        asl: Asl::Asl1,
834        size: 0,
835        menu: None,
836        initial: None,
837        interest: 0,
838        prop: false,
839    },
840    FieldDesc {
841        name: "OSENT",
842        dbf_type: DbFieldType::Double,
843        runtime_typed: false,
844        read_only: true,
845        special: Special::NoMod,
846        pp: false,
847        asl: Asl::Asl1,
848        size: 0,
849        menu: None,
850        initial: None,
851        interest: 0,
852        prop: false,
853    },
854    FieldDesc {
855        name: "WAIT",
856        dbf_type: DbFieldType::Enum,
857        runtime_typed: false,
858        read_only: true,
859        special: Special::NoMod,
860        pp: false,
861        asl: Asl::Asl1,
862        size: 0,
863        menu: Some(MENU_THROTTLE_WAIT),
864        initial: Some("0"),
865        interest: 1,
866        prop: false,
867    },
868    FieldDesc {
869        name: "HOPR",
870        dbf_type: DbFieldType::Double,
871        runtime_typed: false,
872        read_only: false,
873        special: Special::None,
874        pp: false,
875        asl: Asl::Asl1,
876        size: 0,
877        menu: None,
878        initial: None,
879        interest: 1,
880        prop: false,
881    },
882    FieldDesc {
883        name: "LOPR",
884        dbf_type: DbFieldType::Double,
885        runtime_typed: false,
886        read_only: false,
887        special: Special::None,
888        pp: false,
889        asl: Asl::Asl1,
890        size: 0,
891        menu: None,
892        initial: None,
893        interest: 1,
894        prop: false,
895    },
896    FieldDesc {
897        name: "DRVLH",
898        dbf_type: DbFieldType::Double,
899        runtime_typed: false,
900        read_only: false,
901        special: Special::Mod,
902        pp: false,
903        asl: Asl::Asl1,
904        size: 0,
905        menu: None,
906        initial: Some("0.0"),
907        interest: 0,
908        prop: false,
909    },
910    FieldDesc {
911        name: "DRVLL",
912        dbf_type: DbFieldType::Double,
913        runtime_typed: false,
914        read_only: false,
915        special: Special::Mod,
916        pp: false,
917        asl: Asl::Asl1,
918        size: 0,
919        menu: None,
920        initial: Some("0.0"),
921        interest: 0,
922        prop: false,
923    },
924    FieldDesc {
925        name: "DRVLS",
926        dbf_type: DbFieldType::Enum,
927        runtime_typed: false,
928        read_only: true,
929        special: Special::NoMod,
930        pp: false,
931        asl: Asl::Asl1,
932        size: 0,
933        menu: Some(MENU_THROTTLE_DRVLS),
934        initial: Some("0"),
935        interest: 1,
936        prop: false,
937    },
938    FieldDesc {
939        name: "DRVLC",
940        dbf_type: DbFieldType::Enum,
941        runtime_typed: false,
942        read_only: false,
943        special: Special::None,
944        pp: false,
945        asl: Asl::Asl1,
946        size: 0,
947        menu: Some(MENU_THROTTLE_DRVLC),
948        initial: Some("0"),
949        interest: 0,
950        prop: false,
951    },
952    FieldDesc {
953        name: "VER",
954        dbf_type: DbFieldType::String,
955        runtime_typed: false,
956        read_only: true,
957        special: Special::NoMod,
958        pp: false,
959        asl: Asl::Asl1,
960        size: 20,
961        menu: None,
962        initial: Some(""),
963        interest: 0,
964        prop: false,
965    },
966    FieldDesc {
967        name: "STS",
968        dbf_type: DbFieldType::Enum,
969        runtime_typed: false,
970        read_only: true,
971        special: Special::NoMod,
972        pp: false,
973        asl: Asl::Asl1,
974        size: 0,
975        menu: Some(MENU_THROTTLE_STS),
976        initial: Some("0"),
977        interest: 1,
978        prop: false,
979    },
980    FieldDesc {
981        name: "PREC",
982        dbf_type: DbFieldType::Short,
983        runtime_typed: false,
984        read_only: false,
985        special: Special::None,
986        pp: false,
987        asl: Asl::Asl1,
988        size: 0,
989        menu: None,
990        initial: None,
991        interest: 1,
992        prop: false,
993    },
994    FieldDesc {
995        name: "DPREC",
996        dbf_type: DbFieldType::Short,
997        runtime_typed: false,
998        read_only: false,
999        special: Special::None,
1000        pp: false,
1001        asl: Asl::Asl1,
1002        size: 0,
1003        menu: None,
1004        initial: None,
1005        interest: 1,
1006        prop: false,
1007    },
1008    FieldDesc {
1009        name: "DLY",
1010        dbf_type: DbFieldType::Double,
1011        runtime_typed: false,
1012        read_only: false,
1013        special: Special::Mod,
1014        pp: false,
1015        asl: Asl::Asl1,
1016        size: 0,
1017        menu: None,
1018        initial: Some("0.0"),
1019        interest: 0,
1020        prop: false,
1021    },
1022    FieldDesc {
1023        name: "OUT",
1024        dbf_type: DbFieldType::String,
1025        runtime_typed: false,
1026        read_only: false,
1027        special: Special::Mod,
1028        pp: false,
1029        asl: Asl::Asl1,
1030        size: 0,
1031        menu: None,
1032        initial: None,
1033        interest: 1,
1034        prop: false,
1035    },
1036    FieldDesc {
1037        name: "OV",
1038        dbf_type: DbFieldType::Enum,
1039        runtime_typed: false,
1040        read_only: true,
1041        special: Special::NoMod,
1042        pp: false,
1043        asl: Asl::Asl1,
1044        size: 0,
1045        menu: Some(MENU_THROTTLE_OV),
1046        initial: Some("1"),
1047        interest: 1,
1048        prop: false,
1049    },
1050    FieldDesc {
1051        name: "SINP",
1052        dbf_type: DbFieldType::String,
1053        runtime_typed: false,
1054        read_only: false,
1055        special: Special::Mod,
1056        pp: false,
1057        asl: Asl::Asl1,
1058        size: 0,
1059        menu: None,
1060        initial: None,
1061        interest: 1,
1062        prop: false,
1063    },
1064    FieldDesc {
1065        name: "SIV",
1066        dbf_type: DbFieldType::Enum,
1067        runtime_typed: false,
1068        read_only: true,
1069        special: Special::NoMod,
1070        pp: false,
1071        asl: Asl::Asl1,
1072        size: 0,
1073        menu: Some(MENU_THROTTLE_OV),
1074        initial: Some("1"),
1075        interest: 1,
1076        prop: false,
1077    },
1078    FieldDesc {
1079        name: "SYNC",
1080        dbf_type: DbFieldType::Enum,
1081        runtime_typed: false,
1082        read_only: false,
1083        special: Special::Mod,
1084        pp: false,
1085        asl: Asl::Asl1,
1086        size: 0,
1087        menu: Some(MENU_THROTTLE_SYNC),
1088        initial: Some("Idle"),
1089        interest: 0,
1090        prop: false,
1091    },
1092];
1093
1094/// `recordtype(throttle)` — the `DBF_NOACCESS` internal names dropped from
1095/// [`THROTTLE_FIELDS`]: resolvable (a SEARCH is answered), never servable.
1096pub static THROTTLE_NOACCESS: &[&str] = &["RPVT"];
1097
1098/// `recordtype(timestamp)` — 4 CA-visible own fields from `dbd/timestampRecord.dbd` (0 `DBF_NOACCESS` internals dropped).
1099pub static TIMESTAMP_FIELDS: &[FieldDesc] = &[
1100    FieldDesc {
1101        name: "VAL",
1102        dbf_type: DbFieldType::String,
1103        runtime_typed: false,
1104        read_only: false,
1105        special: Special::None,
1106        pp: true,
1107        asl: Asl::Asl0,
1108        size: 40,
1109        menu: None,
1110        initial: None,
1111        interest: 0,
1112        prop: false,
1113    },
1114    FieldDesc {
1115        name: "OVAL",
1116        dbf_type: DbFieldType::String,
1117        runtime_typed: false,
1118        read_only: true,
1119        special: Special::NoMod,
1120        pp: false,
1121        asl: Asl::Asl1,
1122        size: 40,
1123        menu: None,
1124        initial: None,
1125        interest: 3,
1126        prop: false,
1127    },
1128    FieldDesc {
1129        name: "RVAL",
1130        dbf_type: DbFieldType::ULong,
1131        runtime_typed: false,
1132        read_only: false,
1133        special: Special::None,
1134        pp: true,
1135        asl: Asl::Asl1,
1136        size: 0,
1137        menu: None,
1138        initial: None,
1139        interest: 0,
1140        prop: false,
1141    },
1142    FieldDesc {
1143        name: "TST",
1144        dbf_type: DbFieldType::Enum,
1145        runtime_typed: false,
1146        read_only: false,
1147        special: Special::None,
1148        pp: false,
1149        asl: Asl::Asl1,
1150        size: 0,
1151        menu: Some(MENU_TIMESTAMP_TST),
1152        initial: None,
1153        interest: 2,
1154        prop: false,
1155    },
1156];
1157
1158/// The record-own field table for a record type name, or `None` for a type
1159/// no vendored `.dbd` declares.
1160pub fn record_fields(record_type: &str) -> Option<&'static [FieldDesc]> {
1161    Some(match record_type {
1162        "epid" => EPID_FIELDS,
1163        "throttle" => THROTTLE_FIELDS,
1164        "timestamp" => TIMESTAMP_FIELDS,
1165        _ => return None,
1166    })
1167}
1168
1169/// The record-own `DBF_NOACCESS` internal names for a record type — fields
1170/// C's `dbNameToAddr` resolves (a SEARCH is answered) but whose channel is
1171/// refused at creation (`mapDBFToDBR` -> `DBR_NOACCESS`). Empty for a type
1172/// declaring none, `None` for a type no vendored `.dbd` declares.
1173pub fn record_noaccess_fields(record_type: &str) -> Option<&'static [&'static str]> {
1174    Some(match record_type {
1175        "epid" => EPID_NOACCESS,
1176        "throttle" => THROTTLE_NOACCESS,
1177        "timestamp" => &[],
1178        _ => return None,
1179    })
1180}
1181
1182/// Every record type a vendored `.dbd` declares, in `.dbd` name order.
1183pub static RECORD_TYPES: &[&str] = &["epid", "throttle", "timestamp"];