pub struct TimestampRecord {
pub val: PvString,
pub oval: PvString,
pub rval: u32,
pub tst: i16,
/* private fields */
}Expand description
Timestamp record — generates formatted timestamp strings.
Ported from EPICS std module timestampRecord.c.
Fields§
§val: PvStringCurrent formatted timestamp string (VAL).
oval: PvStringPrevious value for change detection (OVAL).
rval: u32Seconds past EPICS epoch (RVAL). DBF_ULONG in C; the Rust value
model has no unsigned-32 scalar, so this follows the project
convention of mapping DBF_ULONG to i32/EpicsValue::Long.
field(RVAL,DBF_ULONG) (timestampRecord.dbd:28) — C
ptimestamp->rval = ptimestamp->time.secPastEpoch (timestampRecord.c:94),
and secPastEpoch is an epicsUInt32. Stored i32 and served
EpicsValue::Long while the port hand-wrote its own field table.
tst: i16Timestamp format selector (TST), a DBF_MENU. Values 0..=10
select an explicit format; any other value is rendered with
format 0 (C switch default: branch).
Trait Implementations§
Source§impl Default for TimestampRecord
impl Default for TimestampRecord
Source§impl Record for TimestampRecord
impl Record for TimestampRecord
Source§fn set_process_context(&mut self, ctx: &ProcessContext)
fn set_process_context(&mut self, ctx: &ProcessContext)
C timestampRecord.c:90 reads ptimestamp->tse. The framework
owns dbCommon.tse; this hook captures it so process() can
take the device-time branch.
Source§fn monitor_deadband_field(&self) -> &'static str
fn monitor_deadband_field(&self) -> &'static str
The timestamp record has NO value deadband: its monitored
quantity is the formatted VAL string, and timestampRecord.dbd
declares no MDEL/ADEL. C monitor() (timestampRecord.c:152-163)
posts VAL (and RVAL) only inside
if (strncmp(oval, val, sizeof(val))) — i.e. exactly when the
formatted string changed since the previous process — then copies
val into oval. That is plain change-detection, not a deadband.
The framework’s snapshot builders force-post the deadband field on
every cycle the deadband gate fires (and the gate always fires for
a non-numeric value — see [RecordInstance::check_deadband_ext],
whose to_f64() returns None for a string VAL). Returning the
default "VAL" here would therefore re-post VAL on every scan,
even when the rendered string is unchanged — diverging from C’s
strncmp gate. Returning "" (a name no field resolves to)
suppresses that force-post (resolve_field("") is None, so the
if let Some(val) = dval push is skipped) and routes VAL
through the generic change-detection loop, which posts it only
when it differs from the last posted value — matching C exactly.
Source§fn monitor_value_changed(&self) -> Option<bool>
fn monitor_value_changed(&self) -> Option<bool>
C monitor()’s single gate: the strncmp(oval, val) string change
(timestampRecord.c:158). Reported here so the framework’s VAL monitor
mask is live only on a cycle that re-rendered a different string — which
is also the gate RVAL hangs off (see
Self::fields_posted_with_value_mask).
Source§fn fields_posted_with_value_mask(
&self,
) -> &'static [(&'static str, ValuePostGate)]
fn fields_posted_with_value_mask( &self, ) -> &'static [(&'static str, ValuePostGate)]
C posts RVAL from inside the VAL-string-change guard, with VAL’s own
monitor mask and with no test of RVAL’s own value
(db_post_events(&ptimestamp->rval, monitor_mask),
timestampRecord.c:160) — so the seconds count reaches monitors exactly
when the rendered string moves, and no more often.
Left to the generic change-detection loop instead, RVAL posts on every
process that crosses a second — ~59 spurious DBE_VALUE|DBE_LOG events a
minute per subscriber under a coarse TST such as HH:MM, whose VAL only
changes once a minute.
Source§fn record_type(&self) -> &'static str
fn record_type(&self) -> &'static str
Source§fn process(&mut self) -> CaResult<ProcessOutcome>
fn process(&mut self) -> CaResult<ProcessOutcome>
Source§fn put_field(&mut self, name: &str, value: EpicsValue) -> CaResult<()>
fn put_field(&mut self, name: &str, value: EpicsValue) -> CaResult<()>
Source§fn declared_fields(&self) -> &'static [FieldDesc]
fn declared_fields(&self) -> &'static [FieldDesc]
.dbd set does not
cover — a record type that lives in another crate. Read moreSource§fn clears_udf(&self) -> bool
fn clears_udf(&self) -> bool
Source§fn took_metadata_change(&mut self) -> bool
fn took_metadata_change(&mut self) -> bool
process() call
mutated a metadata-class field (EGU/PREC/HOPR/LOPR/HLM/LLM/
alarm limits / DRVH/DRVL / state strings). Read moreSource§fn implements_field(&self, name: &str) -> bool
fn implements_field(&self, name: &str) -> bool
name in its own get_field /
put_field, as opposed to leaving it to the framework’s dbCommon
handling? Read moreSource§fn field_no_mod(&self, _field: &str) -> bool
fn field_no_mod(&self, _field: &str) -> bool
SPC_NOMOD that a record’s cvt_dbaddr decides at runtime, from
record state — the dynamic half of the no-modify declaration. Read moreDBF_MENU field served as
DBR_ENUM, keyed by field name (uppercase, as declared). Read moreSource§fn field_metadata_override(&self, _field: &str) -> Option<FieldMetadataOverride>
fn field_metadata_override(&self, _field: &str) -> Option<FieldMetadataOverride>
field. Read moreSource§fn property_support(&self) -> PropertySupport
fn property_support(&self) -> PropertySupport
rset get_* property slots THIS record
type implements — the record’s own #define get_xxx NULL lines. Read moreSource§fn long_string_fields(&self) -> &'static [&'static str]
fn long_string_fields(&self) -> &'static [&'static str]
DBF_CHAR
array field that semantically holds a NUL-terminated string. Read moreSource§fn process_passive_fields(&self) -> &'static [&'static str]
fn process_passive_fields(&self) -> &'static [&'static str]
pp(TRUE) in this record type’s DBD (empty if
none, e.g. event/histogram, or if the type is unmodeled). Read moreSource§fn processes_after_put(&self, field: &str) -> bool
fn processes_after_put(&self, field: &str) -> bool
field should reprocess this Passive record. Read moreSource§fn enum_state_strings(&self) -> Option<Vec<PvString>>
fn enum_state_strings(&self) -> Option<Vec<PvString>>
DBF_ENUM state strings — the C rset slot pair
get_enum_strs / put_enum_str, which in C read the same fields and
are therefore ONE table here. Read moreSource§fn enum_string_form(&self) -> Option<EnumStringForm>
fn enum_string_form(&self) -> Option<EnumStringForm>
get_enum_str rset slot — how a DBR_STRING READ of its
DBF_ENUM VAL renders. A THIRD slot, distinct from the pair above:
C’s get_enum_str (singular) is not get_enum_strs (plural), and
serving the read from the plural table is what made an undefined mbbi
state come out as its index. Read moreSource§fn validate_put(&self, _field: &str, _value: &EpicsValue) -> Result<(), CaError>
fn validate_put(&self, _field: &str, _value: &EpicsValue) -> Result<(), CaError>
Source§fn is_subroutine_name_field(&self, _field: &str) -> bool
fn is_subroutine_name_field(&self, _field: &str) -> bool
field names a subroutine that must resolve in the
function registry — C special(SPC_MOD) → registryFunctionFind
(aSubRecord.c::special, subRecord.c::special). C stores the name in
dbPut, then special(after) looks it up and returns S_db_BadSub
(→ rsrv ECA_PUTFAIL) when the name is non-empty and unregistered, so
the client’s write is REFUSED while the field keeps the value it was
given. An empty name names no routine and is accepted. Read moreSource§fn primary_field(&self) -> &'static str
fn primary_field(&self) -> &'static str
Source§fn is_udf_defining_put(&self, field: &str) -> bool
fn is_udf_defining_put(&self, field: &str) -> bool
field directly defines the record — clears UDF
exactly like a primary-value-field put. C dbAccess.c::dbPut
(:1409-1411) clears udf synchronously only when the put target is
dbIsValueField (i.e. field == primary_field()); this hook is where
a record type says its own special() ALSO clears UDF for a
non-value field, independent of dbIsValueField. Read moreSource§fn val(&self) -> Option<EpicsValue>
fn val(&self) -> Option<EpicsValue>
Source§fn set_val(&mut self, value: EpicsValue) -> Result<(), CaError>
fn set_val(&mut self, value: EpicsValue) -> Result<(), CaError>
Source§fn input_read_by_device_support(&self) -> bool
fn input_read_by_device_support(&self) -> bool
INP is read by DEVICE SUPPORT (a C DSET), as
opposed to by the record body itself. Read moreSource§fn soft_input_dset_init(&mut self, loaded: bool)
fn soft_input_dset_init(&mut self, loaded: bool)
init_record, once the
constant-INP load above has (or has not) landed. Read moreSource§fn raw_soft_input(
&mut self,
entry: RawSoftEntry,
value: EpicsValue,
) -> Option<Result<(), CaError>>
fn raw_soft_input( &mut self, entry: RawSoftEntry, value: EpicsValue, ) -> Option<Result<(), CaError>>
DTYP="Raw Soft Channel" INPUT dset — C’s four devXxxSoftRaw.c
read supports (devAiSoftRaw, devBiSoftRaw, devMbbiSoftRaw,
devMbbiDirectSoftRaw). Read moreSource§fn raw_soft_output_value(&self) -> Option<EpicsValue>
fn raw_soft_output_value(&self) -> Option<EpicsValue>
DTYP="Raw Soft Channel" OUTPUT dset — C’s four devXxxSoftRaw.c
write supports: the value write_xxx() puts to the OUT link. Read moreSource§fn apply_raw_readback(&mut self, _raw: i32) -> bool
fn apply_raw_readback(&mut self, _raw: i32) -> bool
RVAL and the record’s own conversion produces VAL
(device_support.rs:43-46). An output record whose
convert() is forward (engineering → raw) must invert it here — store
the raw value into RVAL and compute the engineering VAL — because
the framework’s forward convert would otherwise recompute RVAL from
the stale VAL and discard the readback (C processAo/initAo set
rval/val directly, devAsynInt32.c:955-957/:973-994). Read moreSource§fn apply_float64_readback(&mut self, _raw: f64) -> bool
fn apply_float64_readback(&mut self, _raw: f64) -> bool
asynFloat64 analogue of
Record::apply_raw_readback. A float64 output (ao) whose device
value carries an ASLO/AOFF linear scaling must seed the engineering
VAL here (VAL = value * ASLO + AOFF), because the asyn store path
would otherwise write the raw device value straight into VAL and drop
the scaling. Sets VAL only (a float64 ao carries no RVAL); the
reverse scaling (OVAL - AOFF) / ASLO is applied on the device-write
side. Mirrors C initAo/processAo (devAsynFloat64.c:627-629/:646-649). Read moreSource§fn install_breaktable_registry(&mut self, _registry: Arc<BreakTableRegistry>)
fn install_breaktable_registry(&mut self, _registry: Arc<BreakTableRegistry>)
ai/ao
with LINR >= 3 can resolve and cache the table its LINR selects.
Called once at iocInit, before the first process/convert. The record
resolves the table lazily on the first conversion (and re-resolves when
LINR changes at runtime), mirroring C cvtRawToEngBpt’s
init || *ppbrk == NULL cache. The default is a no-op: only ai/ao
carry LINR.Source§fn apply_invalid_output_value(
&mut self,
ivov: EpicsValue,
) -> Result<(), CaError>
fn apply_invalid_output_value( &mut self, ivov: EpicsValue, ) -> Result<(), CaError>
recXxx.c behaviour: Read moreSource§fn can_device_write(&self) -> bool
fn can_device_write(&self) -> bool
aao is included here even though it’s served by the same
concrete struct as waveform/aai/subArray — the
WaveformRecord’s can_device_write override picks the right
answer per crate::server::records::waveform::ArrayKind, but this default matters for code that
only has the record-type string.Source§fn is_put_complete(&self) -> bool
fn is_put_complete(&self) -> bool
Source§fn should_fire_forward_link(&self) -> bool
fn should_fire_forward_link(&self) -> bool
Source§fn restamps_time_after_completion(&self) -> bool
fn restamps_time_after_completion(&self) -> bool
TIME AFTER the VAL
monitor post and the forward link, not before the value post like
every standard record (aoRecord.c:190 stamps ahead of writeValue). Read moreSource§fn should_output(&self) -> bool
fn should_output(&self) -> bool
Source§fn on_output_complete(&mut self)
fn on_output_complete(&mut self)
longout.pval) can update for the next cycle’s
Self::should_output check. Default: no-op.Source§fn uses_monitor_deadband(&self) -> bool
fn uses_monitor_deadband(&self) -> bool
Source§fn process_posts_value_monitor(&self) -> bool
fn process_posts_value_monitor(&self) -> bool
VAL)
as a value monitor (DBE_VALUE / DBE_LOG). Read moreSource§fn monitor_always_post(&self) -> (bool, bool)
fn monitor_always_post(&self) -> (bool, bool)
menuPost “Always” override for the VALUE / LOG monitor masks. Read moreSource§fn monitor_deadband_value(&self) -> Option<EpicsValue>
fn monitor_deadband_value(&self) -> Option<EpicsValue>
Source§fn alarm_cycle_monitored_fields(&self) -> &'static [&'static str]
fn alarm_cycle_monitored_fields(&self) -> &'static [&'static str]
monitor() posts on every cycle whose
alarm transition fired, even when their value did not change. Read moreSource§fn force_posted_fields(&self) -> &'static [&'static str]
fn force_posted_fields(&self) -> &'static [&'static str]
monitor() re-posts with DBE_VAL_LOG on
every cycle that recomputed them, even when the value did not
change — the analogue of an unconditional MARK(field) in C. Read moreSource§fn take_cycle_posted_fields(&mut self) -> Vec<(&'static str, CyclePostMask)>
fn take_cycle_posted_fields(&mut self) -> Vec<(&'static str, CyclePostMask)>
monitor() posted UNCONDITIONALLY, chosen per
cycle from record state — the DYNAMIC sibling of
Self::force_posted_fields. Read moreSource§fn fields_posted_only_when_marked(&self) -> &'static [&'static str]
fn fields_posted_only_when_marked(&self) -> &'static [&'static str]
Source§fn log_swept_fields(&self) -> &'static [&'static str]
fn log_swept_fields(&self) -> &'static [&'static str]
monitor() re-posts with DBE_LOG ONLY on
every cycle it names them, regardless of change — the analogue of
an unconditional db_post_events(field, DBE_LOG) sweep. Read moreSource§fn value_only_change_fields(&self) -> &'static [&'static str]
fn value_only_change_fields(&self) -> &'static [&'static str]
DBE_VALUE
only — the LOG bit is stripped — instead of the framework default
DBE_VALUE | DBE_LOG. Read moreSource§fn fields_posted_with_monitor_mask(&self) -> &'static [&'static str]
fn fields_posted_with_monitor_mask(&self) -> &'static [&'static str]
monitor_mask | DBE_VALUE — VAL’s monitor mask ORed with DBE_VALUE,
and NOT the framework default monitor_mask | DBE_VALUE | DBE_LOG. Read moreSource§fn fields_posted_without_alarm_bits(&self) -> &'static [&'static str]
fn fields_posted_without_alarm_bits(&self) -> &'static [&'static str]
DBE_VALUE | DBE_LOG — this
cycle’s alarm bits DISCARDED. Read moreSource§fn array_monitor_post(&mut self) -> Option<ArrayMonitorPost>
fn array_monitor_post(&mut self) -> Option<ArrayMonitorPost>
monitor(),
waveformRecord.c:291-326). None (the default) means the record has
no MPST/APST/HASH mechanism and the generic MDEL/ADEL deadband
decision applies. Some(_) lets the record replace that with its
“Always vs On Change” rule: it hashes the array content, compares to
the stored HASH, updates it, and reports whether DBE_VALUE /
DBE_LOG should be on the VAL post this cycle and whether the hash
changed (so the owner posts HASH with DBE_VALUE). Called by
check_deadband_ext (the single owner of the VAL-mask decision). Read moreSource§fn process_posted_fields(&self) -> Option<&'static [&'static str]>
fn process_posted_fields(&self) -> Option<&'static [&'static str]>
monitor() posts HASH this way —
db_post_events(prec, &prec->hash, DBE_VALUE) only when the content
hash changed (waveformRecord.c:317-319), never via VAL’s change. Read moreSource§fn event_posted_fields(&self) -> &'static [&'static str]
fn event_posted_fields(&self) -> &'static [&'static str]
monitor() posts HASH this way —
db_post_events(prec, &prec->hash, DBE_VALUE) only when the content
hash changed (waveformRecord.c:317-319), never via VAL’s change. Read moreSource§fn init_record(&mut self, _pass: u8) -> Result<(), CaError>
fn init_record(&mut self, _pass: u8) -> Result<(), CaError>
Source§fn init_record_parks_pact(&self) -> bool
fn init_record_parks_pact(&self) -> bool
init_record leave the record PERMANENTLY ACTIVE — C’s
prec->pact = TRUE inside init_record, which is how a record type
disables itself when it cannot possibly process? Read moreSource§fn post_init_finalize_undef(&mut self, _udf: &mut bool) -> Result<(), CaError>
fn post_init_finalize_undef(&mut self, _udf: &mut bool) -> Result<(), CaError>
init_record
passes complete. Default implementation is a no-op. Read moreSource§fn init_resets_alarms(&self) -> bool
fn init_resets_alarms(&self) -> bool
init_record resets the record to a
defined, no-alarm state — prec->udf = 0; recGblResetAlarms(prec) — so
a freshly loaded, never-processed record reads UDF=0,
STAT=NO_ALARM, SEVR=NO_ALARM instead of the born UDF/INVALID/1. Read moreSource§fn field_native_count(&self, _field: &str) -> Option<u32>
fn field_native_count(&self, _field: &str) -> Option<u32>
field, when it
differs from the count of the field’s current value. Read moreSource§fn seed_deadband_tracking(&mut self)
fn seed_deadband_tracking(&mut self)
init_record passes and post_init_finalize_undef. Read moreSource§fn set_resolved_input_links(&mut self, _resolved: &[&'static str])
fn set_resolved_input_links(&mut self, _resolved: &[&'static str])
Record::multi_input_links fetches, before process(). Read moreSource§fn set_fetch_gate_failed(&mut self, _failed: bool)
fn set_fetch_gate_failed(&mut self, _failed: bool)
fetch_values() outcome: failed == true means C’s
helper would have returned a non-zero status, so the record body — the
calcPerform / do_sel the C process() wraps in
if (fetch_values(prec) == 0) — must NOT run, and VAL/UDF freeze. Read moreSource§fn set_subroutine_status(&mut self, _status: i64)
fn set_subroutine_status(&mut self, _status: i64)
Source§fn special(&mut self, _field: &str, _after: bool) -> Result<(), CaError>
fn special(&mut self, _field: &str, _after: bool) -> Result<(), CaError>
Source§fn watchdog_interval(&self) -> Option<Duration>
fn watchdog_interval(&self) -> Option<Duration>
None when it has
none — C histogramRecord.c::wdogInit (:126-152): Read moreSource§fn watchdog_fire(&mut self) -> &'static [&'static str]
fn watchdog_fire(&mut self) -> &'static [&'static str]
histogramRecord.c::wdogCallback (:102-124): Read moreSource§fn uses_recgbl_simm_helpers(&self) -> bool
fn uses_recgbl_simm_helpers(&self) -> bool
recGbl
simulation helpers (recGblGetSimm/recGblInitSimm, and therefore
recGblSaveSimm/recGblCheckSimm) rather than a bare dbGetLink. Read moreSource§fn aborts_on_failed_siml_read(&self) -> bool
fn aborts_on_failed_siml_read(&self) -> bool
readValue/writeValue ABORTS when the SIML read fails —
it returns before performing any I/O, so the cycle does no device write,
no SIOL redirect, and raises no SIMM_ALARM. Read moreSource§fn set_io_intr_scan(&mut self, _active: bool)
fn set_io_intr_scan(&mut self, _active: bool)
Source§fn take_special_actions(&mut self) -> Vec<ProcessAction>
fn take_special_actions(&mut self) -> Vec<ProcessAction>
Source§fn monitor_side_effect_fields(
&self,
_put_field: &str,
) -> &'static [&'static str]
fn monitor_side_effect_fields( &self, _put_field: &str, ) -> &'static [&'static str]
put_field changed them as a side effect, without driving a full
process cycle. Read moreSource§fn special_commits_alarms(&self, _put_field: &str) -> bool
fn special_commits_alarms(&self, _put_field: &str) -> bool
special() for a put to put_field runs the record’s
own monitor() — whose first act is recGblResetAlarms(prec), which
commits nsta/nsev into stat/sevr and clears the born-UDF alarm. Read moreSource§fn special_checks_alarms(&self, _put_field: &str) -> bool
fn special_checks_alarms(&self, _put_field: &str) -> bool
special() for a put to put_field runs code that
writes stat/sevr DIRECTLY (not nsta/nsev) with NO monitor() /
recGblResetAlarms after it — so the write STICKS and a later caget
observes it, unlike the process path where recGblResetAlarms erases it. Read moreSource§fn as_any_mut(&mut self) -> Option<&mut (dyn Any + 'static)>
fn as_any_mut(&mut self) -> Option<&mut (dyn Any + 'static)>
Source§fn clears_udf_unconditionally(&self) -> bool
fn clears_udf_unconditionally(&self) -> bool
process() clears UDF regardless of the read’s
status — i.e. even when readValue failed. Read moreSource§fn declares_inp_link(&self) -> bool
fn declares_inp_link(&self) -> bool
Source§fn read_constant_inp(&mut self, _value: Option<EpicsValue>) -> bool
fn read_constant_inp(&mut self, _value: Option<EpicsValue>) -> bool
Source§fn raises_udf_alarm(&self) -> bool
fn raises_udf_alarm(&self) -> bool
Source§fn udf_alarm_on_exact_one(&self) -> bool
fn udf_alarm_on_exact_one(&self) -> bool
checkAlarms tests the UDF byte with
if (prec->udf == TRUE) (EXACT-ONE) rather than if (prec->udf)
(truthy). See crate::server::recgbl::udf_alarm_active: exact-one
records (boRecord.c:371, stringoutRecord.c:146, biRecord.c:225,
busyRecord.c:337) do NOT raise UDF_ALARM for a udf byte that is
neither 0 nor 1. Read moreSource§fn udf_alarm_message(&self) -> &str
fn udf_alarm_message(&self) -> &str
UDF_ALARM. Read moreSource§fn value_is_undefined(&self) -> bool
fn value_is_undefined(&self) -> bool
VAL is undefined (UDF must
stay set). Read moreSource§fn check_alarms(&mut self, _common: &mut CommonFields)
fn check_alarms(&mut self, _common: &mut CommonFields)
nsta/nsev via recGblSetSevr. Read moreSource§fn multi_input_links(&self) -> &[(&'static str, &'static str)]
fn multi_input_links(&self) -> &[(&'static str, &'static str)]
Source§fn special_reseed_input_links(&self) -> &[(&'static str, &'static str)]
fn special_reseed_input_links(&self) -> &[(&'static str, &'static str)]
(link_field, value_field) pairs whose CONSTANT value this record’s
C special() RE-SEEDS on a runtime put to the link field —
recGblInitConstantLink(plink, DBF_DOUBLE, pvalue) +
db_post_events(prec, pvalue, DBE_VALUE) + INAV = CON
(calcoutRecord.c:367-378, sCalcoutRecord.c:512-517,
aCalcoutRecord.c:534-540). Read moreSource§fn special_reseed_post_mask(&self) -> EventMask
fn special_reseed_post_mask(&self) -> EventMask
db_post_events call in that record’s special()
re-seed arm — the C call sites do not agree: Read moreSource§fn constant_init_links(&self) -> Vec<ConstantInitLink>
fn constant_init_links(&self) -> Vec<ConstantInitLink>
init_record —
the record’s own recGblInitConstantLink / dbLoadLinkArray table,
transcribed from its C. Read moreSource§fn constant_ls_link(&self) -> Option<&'static str>
fn constant_ls_link(&self) -> Option<&'static str>
dbLoadLinkLS — "DOL" for lso (lsoRecord.c:82), "INP" for
lsi (its soft device support, devLsiSoft.c:24). loadLS is a lset
entry of its own, so this is a SEPARATE table from
Self::constant_init_links, not a variant of it; the same init-seed
owner runs both. Read moreSource§fn apply_ls_load(&mut self, _load: LsLoad) -> u32
fn apply_ls_load(&mut self, _load: LsLoad) -> u32
Self::constant_ls_link load, and return the resulting LEN.
The record clamps the text at its own SIZV and runs C’s init tail
(if (prec->len) { strcpy(prec->oval, prec->val); prec->olen = prec->len; },
lsoRecord.c:92-95 / lsiRecord.c:85-88); the owner turns a non-zero LEN
into udf = FALSE.Source§fn constant_inputs_deliver_at_process(&self) -> bool
fn constant_inputs_deliver_at_process(&self) -> bool
Source§fn select_input_links(
&self,
_selector: Option<u16>,
) -> Option<Vec<(&'static str, &'static str)>>
fn select_input_links( &self, _selector: Option<u16>, ) -> Option<Vec<(&'static str, &'static str)>>
Self::multi_input_links the framework should
actually fetch this cycle, given an optional externally-resolved
selector index (sel’s NVL→SELN value, or None when no NVL link
drove it). Default None = fetch every input link. Read moreSource§fn simulation_substitutes_input_stage(&self) -> bool
fn simulation_substitutes_input_stage(&self) -> bool
SIMM != NO cycle substitutes only this record’s INPUT STAGE — the
rest of its process() still runs. Read moreSource§fn land_simulated_value(&mut self, value: EpicsValue) -> Result<(), CaError>
fn land_simulated_value(&mut self, value: EpicsValue) -> Result<(), CaError>
readValue’s assignment plus whatever the
record’s process() body then does with it, under the same
status == 0 gate the framework applies before calling this. Read moreSource§fn rejects_illegal_sim_mode(&self) -> bool
fn rejects_illegal_sim_mode(&self) -> bool
switch (prec->simm) carries a default: arm
that REFUSES a SIMM value outside its own menu: Read moreSource§fn set_simulation_active(&mut self, _active: bool)
fn set_simulation_active(&mut self, _active: bool)
process() — the twin of Self::set_fetch_gate_failed, and only for a
record that declares Self::simulation_substitutes_input_stage. Read moreSource§fn input_fetch_policy(&self) -> InputFetchPolicy
fn input_fetch_policy(&self) -> InputFetchPolicy
fetch_values() for this record type reacts to a link read
that fails. Drives the framework’s Self::multi_input_links fetch
loop; see InputFetchPolicy. Default: InputFetchPolicy::ReadAll. Read moreSource§fn string_input_links(&self) -> &'static [(&'static str, &'static str)]
fn string_input_links(&self) -> &'static [(&'static str, &'static str)]
(link_field, value_field) pairs read as
DBR_STRING, C sCalcoutRecord.c::fetch_values (890-941) — the SECOND
loop of that function, over INAA..INLL → AA..LL: Read moreSource§fn output_time_input_links(&self) -> &'static [(&'static str, &'static str)]
fn output_time_input_links(&self) -> &'static [(&'static str, &'static str)]
(link_name_field, value_field) pairs. The framework
reads each configured link immediately before the OUT write, and ONLY on
a cycle where the output actually fires (Self::should_output and no
IVOA veto), then writes the value into value_field via
Self::put_field; a failed read leaves the field alone. Read moreSource§fn output_link_value(&self) -> Option<EpicsValue>
fn output_link_value(&self) -> Option<EpicsValue>
Source§fn multi_output_links(&self) -> &[(&'static str, &'static str)]
fn multi_output_links(&self) -> &[(&'static str, &'static str)]
Source§fn multi_output_buffer(
&self,
link_field: &str,
staged: EpicsValue,
target: &OutTarget,
) -> EpicsValue
fn multi_output_buffer( &self, link_field: &str, staged: EpicsValue, target: &OutTarget, ) -> EpicsValue
Self::multi_output_links) and the RESOLVED TARGET
metadata, return the buffer C would actually put. Read moreSource§fn typed_output_buffer(
&self,
link_field: &str,
target: &OutTarget,
) -> Option<EpicsValue>
fn typed_output_buffer( &self, link_field: &str, target: &OutTarget, ) -> Option<EpicsValue>
Self::multi_output_buffer. Read moreSource§fn set_resolved_out_target(&mut self, link_field: &str, target: OutTarget)
fn set_resolved_out_target(&mut self, link_field: &str, target: OutTarget)
process()
(ProcessAction::ResolveOutTarget). Read moreSource§fn input_link_read_as(
&self,
link_field: &str,
source: &OutTarget,
) -> Option<LinkReadAs>
fn input_link_read_as( &self, link_field: &str, source: &OutTarget, ) -> Option<LinkReadAs>
dbrType this record’s ProcessAction::ReadDbLink on
link_field asks the SOURCE for — the READ twin of
Self::typed_output_buffer, and C’s dbGetLink second argument. Read moreSource§fn output_event(&self) -> Option<String>
fn output_event(&self) -> Option<String>
OEVT) to post this cycle, or
None. The event-subsystem twin of the OUT write: a downstream
SCAN="Event" / EVNT="<name>" record is woken each time the record
drives output. Mirrors C calcout/sCalcout/aCalcout execOutput,
which calls postEvent(epvt) / post_event(oevt) immediately after
writeValue in every OUT-driving branch. Read moreSource§fn put_field_internal(
&mut self,
name: &str,
value: EpicsValue,
) -> Result<(), CaError>
fn put_field_internal( &mut self, name: &str, value: EpicsValue, ) -> Result<(), CaError>
Source§fn pre_process_actions(&mut self) -> Vec<ProcessAction>
fn pre_process_actions(&mut self) -> Vec<ProcessAction>
Source§fn pre_input_link_actions(&mut self) -> Vec<ProcessAction>
fn pre_input_link_actions(&mut self) -> Vec<ProcessAction>
multi_input_links, INP -> value-field) fetch for this cycle. Read moreSource§fn set_async_context(&mut self, _name: String, _db: AsyncDbHandle)
fn set_async_context(&mut self, _name: String, _db: AsyncDbHandle)
add_record), delivering the record its own canonical name plus a
cycle-free crate::server::database::AsyncDbHandle for driving
async-side updates from OUTSIDE a process() cycle. Read moreSource§fn init_links(&mut self, _common: &CommonFields)
fn init_links(&mut self, _common: &CommonFields)
INP/OUT/FLNK/…) have been resolved and the
init_record passes have run, with the record’s resolved
CommonFields. Read moreSource§fn set_device_did_compute(&mut self, _did_compute: bool)
fn set_device_did_compute(&mut self, _did_compute: bool)
Source§fn soft_channel_skips_convert(&self) -> bool
fn soft_channel_skips_convert(&self) -> bool
RVAL → VAL)
convert() step that must be skipped on a Soft Channel input. Read moreSource§fn skips_forward_convert_when_undefined(&self) -> bool
fn skips_forward_convert_when_undefined(&self) -> bool
VAL → RVAL convert() must be
SKIPPED on a process cycle where VAL is still undefined (UDF != 0) and
no value source ran. Read moreSource§fn skips_timestamp_when_undefined(&self) -> bool
fn skips_timestamp_when_undefined(&self) -> bool
mbboRecord.c:210-221 / mbboDirectRecord.c:190-202 — the same
else if (prec->udf) goto CONTINUE that skips the forward convert()
ALSO jumps past the pre-output recGblGetTimeStampSimm call. So a soft
(synchronous) mbbo/mbboDirect that is still UNDEFINED never stamps TIME
on the first-pass output stage: the only other stamp after CONTINUE:
is guarded by if (pact) (mbboRecord.c:256-258), which fires on
ASYNCHRONOUS completion re-entry only. A sync UDF record therefore keeps
TIME at the EPICS epoch (“never processed”) until a VAL put clears UDF. Read moreAuto Trait Implementations§
impl Freeze for TimestampRecord
impl RefUnwindSafe for TimestampRecord
impl Send for TimestampRecord
impl Sync for TimestampRecord
impl Unpin for TimestampRecord
impl UnsafeUnpin for TimestampRecord
impl UnwindSafe for TimestampRecord
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<R> FieldDeclaration for R
impl<R> FieldDeclaration for R
Source§fn field_list(&self) -> &'static [FieldDesc]
fn field_list(&self) -> &'static [FieldDesc]
.dbd declaration order.