Skip to main content

TimestampRecord

Struct TimestampRecord 

Source
pub struct TimestampRecord {
    pub val: PvString,
    pub oval: PvString,
    pub rval: i32,
    pub tst: i16,
    /* private fields */
}
Expand description

Timestamp record — generates formatted timestamp strings.

Ported from EPICS std module timestampRecord.c.

Fields§

§val: PvString

Current formatted timestamp string (VAL).

§oval: PvString

Previous value for change detection (OVAL).

§rval: i32

Seconds 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.

§tst: i16

Timestamp 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

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Record for TimestampRecord

Source§

fn menu_field_choices(&self, field: &str) -> Option<&'static [&'static str]>

TST is DBF_MENU menu(timestampTST) (std timestampRecord.dbd); served as DBR_ENUM with the format-string choice labels.

Source§

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

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. RVAL already change-detects through that same loop.

Source§

fn record_type(&self) -> &'static str

Return the record type name (e.g., “ai”, “ao”, “bi”).
Source§

fn process(&mut self) -> CaResult<ProcessOutcome>

Process the record (scan/compute cycle). Read more
Source§

fn get_field(&self, name: &str) -> Option<EpicsValue>

Get a field value by name.
Source§

fn put_field(&mut self, name: &str, value: EpicsValue) -> CaResult<()>

Set a field value by name.
Source§

fn field_list(&self) -> &'static [FieldDesc]

Return the list of field descriptors.
Source§

fn clears_udf(&self) -> bool

Whether processing this record should clear UDF. Override to return false for record types that don’t produce a valid value every cycle.
Source§

fn took_metadata_change(&mut self) -> bool

Optional: report whether this record’s last process() call mutated a metadata-class field (EGU/PREC/HOPR/LOPR/HLM/LLM/ alarm limits / DRVH/DRVL / state strings). Read more
Source§

fn field_metadata_override(&self, _field: &str) -> Option<FieldMetadataOverride>

Per-field override of the record-level display/control metadata for a GET / monitor snapshot of field. Read more
Source§

fn long_string_fields(&self) -> &'static [&'static str]

Field names this record serves as a long string: a DBF_CHAR array field that semantically holds a NUL-terminated string. Read more
Source§

fn process_passive_fields(&self) -> Option<&'static [&'static str]>

Field names declared pp(TRUE) in this record type’s DBD, or None if the type’s pp-flags have not been modeled. Read more
Source§

fn validate_put(&self, _field: &str, _value: &EpicsValue) -> Result<(), CaError>

Validate a put before it is applied. Return Err to reject.
Source§

fn on_put(&mut self, _field: &str)

Hook called after a successful put_field.
Source§

fn primary_field(&self) -> &'static str

Primary field name (default “VAL”). Override for waveform etc.
Source§

fn val(&self) -> Option<EpicsValue>

Get the primary value.
Source§

fn set_val(&mut self, value: EpicsValue) -> Result<(), CaError>

Set the primary value. Read more
Source§

fn accepts_raw_soft_input(&self) -> bool

Whether this record implements the DTYP="Raw Soft Channel" read path via Record::apply_raw_input. Records that return true opt into framework routing of the INP link value through apply_raw_input (RVAL + MASK) instead of the default soft-channel VAL direct write. Read more
Source§

fn apply_raw_input(&mut self, value: EpicsValue) -> Result<(), CaError>

Apply a value read from a DTYP="Raw Soft Channel" INP link. Read more
Source§

fn apply_invalid_output_value( &mut self, ivov: EpicsValue, ) -> Result<(), CaError>

Apply IVOA=2 (“set outputs to IVOV”) semantics: copy the IVOV value into whatever output staging field the OUT writeback consumes for this record type. Mirrors the per-record C recXxx.c behaviour: Read more
Source§

fn can_device_write(&self) -> bool

Whether this record type supports device write (output records only). 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 [ArrayKind], but this default matters for code that only has the record-type string.
Source§

fn is_put_complete(&self) -> bool

Whether async processing has completed and put_notify can respond. Records that return AsyncPendingNotify should return false while async work is in progress, and true when done. Default: true (synchronous records are always complete).
Whether this record should fire its forward link after processing.
Source§

fn should_output(&self) -> bool

Whether this record’s OUT link should be written after processing. Defaults to true. Override in calcout / longout to implement OOPT conditional output (epics-base 7.0.8).
Source§

fn on_output_complete(&mut self)

Notify the record that the OUT-link / device write completed successfully on this cycle. The framework calls this right after the actual write so transition-detection state (e.g. longout.pval) can update for the next cycle’s Self::should_output check. Default: no-op.
Source§

fn uses_monitor_deadband(&self) -> bool

Whether this record uses MDEL/ADEL deadband for monitor posting. Binary records (bi, bo, busy, mbbi, mbbo) return false because C EPICS always posts monitors for these record types regardless of whether the value changed.
Source§

fn monitor_value_changed(&self) -> Option<bool>

Per-record VALUE/LOG monitor gate for record types that post a monitor only when the value actually changed — and have no MDEL/ADEL deadband to express that. Read more
Source§

fn monitor_always_post(&self) -> (bool, bool)

menuPost “Always” override for the VALUE / LOG monitor masks. Read more
Source§

fn monitor_deadband_value(&self) -> Option<EpicsValue>

The value the MDEL/ADEL deadband is evaluated against. Read more
Source§

fn alarm_cycle_monitored_fields(&self) -> &'static [&'static str]

Fields the record’s C monitor() posts on every cycle whose alarm transition fired, even when their value did not change. Read more
Source§

fn force_posted_fields(&self) -> &'static [&'static str]

Fields the record’s C 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 more
Source§

fn log_swept_fields(&self) -> &'static [&'static str]

Fields the record’s C 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 more
Source§

fn init_record(&mut self, _pass: u8) -> Result<(), CaError>

Initialize record (pass 0: field defaults; pass 1: dependent init).
Source§

fn post_init_finalize_undef(&mut self, _udf: &mut bool) -> Result<(), CaError>

Post-init finalisation hook with mutable access to the framework’s UDF flag. Called once after both init_record passes complete. Default implementation is a no-op. Read more
Source§

fn seed_deadband_tracking(&mut self)

Seed the monitor/archive/alarm deadband trackers (MLST/ALST/LALM) from the initial value at iocInit, called once by the builder after both init_record passes and post_init_finalize_undef. Read more
Called by the framework immediately after applying this cycle’s Record::multi_input_links fetches, before process(). Read more
Source§

fn special(&mut self, _field: &str, _after: bool) -> Result<(), CaError>

Called before/after a field put for side-effect processing.
Source§

fn monitor_side_effect_fields( &self, _put_field: &str, ) -> &'static [&'static str]

Other fields whose monitors must be posted because a put to put_field changed them as a side effect, without driving a full process cycle. Read more
Source§

fn as_any_mut(&mut self) -> Option<&mut (dyn Any + 'static)>

Downcast to concrete type for device support init injection. Override in record types that need device support to inject state (e.g., MotorRecord).
Source§

fn value_is_undefined(&self) -> bool

Whether the record’s current VAL is undefined (UDF must stay set). Read more
Source§

fn check_alarms(&mut self, _common: &mut CommonFields)

Per-record alarm hook — evaluate record-type-specific alarms (STATE / COS / analog limit / SOFT) and accumulate them into nsta/nsev via recGblSetSevr. Read more
Return multi-input link field pairs: (link_field, value_field). Override in calc, calcout, sel, sub to return INPA..INPL → A..L mappings.
Return multi-output link field pairs: (link_field, value_field). Override in transform to return OUTA..OUTP → A..P mappings.
Source§

fn put_field_internal( &mut self, name: &str, value: EpicsValue, ) -> Result<(), CaError>

Internal field write that bypasses read-only checks. Used by the framework to write values from ReadDbLink actions into fields that are normally read-only (e.g., epid.CVAL). Default implementation delegates to put_field(). Read more
Source§

fn pre_process_actions(&mut self) -> Vec<ProcessAction>

Return pre-process actions (ReadDbLink) that the framework should execute BEFORE calling process(). This is called once per cycle. Default returns empty. Override in records that need link reads to be available during process().
Return actions the framework must execute BEFORE the input-link (multi_input_links, INP -> value-field) fetch for this cycle. Read more
Source§

fn set_async_context(&mut self, _name: String, _db: AsyncDbHandle)

Called once by the framework when the record is registered (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 more
Framework init hook: called once at record load after the common link fields (INP/OUT/FLNK/…) have been resolved and the init_record passes have run, with the record’s resolved CommonFields. Read more
Source§

fn set_device_did_compute(&mut self, _did_compute: bool)

Called by the framework before process() to indicate whether device support’s read() already performed the record’s compute step. Override in records that have a built-in compute (e.g., epid PID) to skip it when device support already ran it. Default: ignore.
Source§

fn soft_channel_skips_convert(&self) -> bool

Whether this record has a raw-to-engineering (RVAL → VAL) convert() step that must be skipped on a Soft Channel input. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more