Skip to main content

SimulatorDriver

Struct SimulatorDriver 

Source
pub struct SimulatorDriver { /* private fields */ }
Expand description

The Driver implementation for CI E2E tests and demo mode: an in-process FopdtProcess served through exactly two tags – a PV tag (reading it advances the simulated clock by one tick) and an MV tag (reading it reports the last-written value without advancing anything; writing it records a new controller output). Any other tag is DriverError::InvalidTagValue; Driver::browse is always DriverError::Unsupported, per that method’s own documented convention for drivers with no real tag tree.

Uses a plain std::sync::Mutex, not tokio::sync::Mutex like crate::OpcDaDriver: every operation here is synchronous, in-memory math with no .await point anywhere in the critical section, so there is nothing that could hold the guard across a suspension point – the concern tokio::sync::Mutex exists for – in the first place.

Implementations§

Source§

impl SimulatorDriver

Source

pub fn new( pv_tag: impl Into<TagId>, mv_tag: impl Into<TagId>, config: FopdtConfig, initial_pv: f32, initial_mv: f32, seed: u64, ) -> SimulatorDriver

pv_tag/mv_tag are the only two tags this driver recognizes – pick names that match whatever tag configuration the rest of a test or demo run uses, so the same tag names work whether the caller is pointed at this driver or a real crate::OpcDaDriver.

Trait Implementations§

Source§

impl Debug for SimulatorDriver

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Driver for SimulatorDriver

Source§

fn read<'life0, 'life1, 'async_trait>( &'life0 self, tags: &'life1 [TagId], ) -> Pin<Box<dyn Future<Output = DriverResult<Vec<TagValue>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Reads the current value of every tag in tags, in one batched call where the driver supports it (a single OPC DA Read RPC for all of them, rather than one round trip per tag). Returns exactly one TagValue per requested tag, in the same order as tags. Read more
Source§

fn write<'life0, 'life1, 'async_trait>( &'life0 self, tag: &'life1 TagId, value: TagWrite, ) -> Pin<Box<dyn Future<Output = DriverResult<WriteOutcome>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Writes value to tag. Read more
Source§

fn capabilities<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = DriverResult<DriverCapabilities>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Reports the namespace capabilities of this driver/server pair.
Source§

fn browse<'life0, 'async_trait>( &'life0 self, _request: BrowsePageRequest, ) -> Pin<Box<dyn Future<Output = DriverResult<BrowsePage>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Lists one bounded page of immediate children. Navigation uses opaque session, node, and continuation values returned by the driver; callers must not infer hierarchy by parsing punctuation in an ItemID.
Source§

fn close_browse_session<'life0, 'life1, 'async_trait>( &'life0 self, _session_id: &'life1 str, ) -> Pin<Box<dyn Future<Output = DriverResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Releases a server-side browse session.
Source§

fn search<'life0, 'async_trait>( &'life0 self, _request: SearchRequest, ) -> Pin<Box<dyn Future<Output = DriverResult<Vec<SearchEvent>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Collects a bounded namespace search. Drivers that support progressive search may expose a richer stream through their concrete type; this method is the portable trait surface.
Source§

fn search_index_status<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = DriverResult<SearchIndexStatus>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Reports the gateway-owned persistent namespace-index status.
Source§

fn refresh_search_index<'life0, 'async_trait>( &'life0 self, _force: bool, ) -> Pin<Box<dyn Future<Output = DriverResult<SearchIndexStatus>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Starts or coalesces a persistent namespace-index refresh.
Source§

fn control_search_index<'life0, 'async_trait>( &'life0 self, _action: SearchIndexControlAction, ) -> Pin<Box<dyn Future<Output = DriverResult<SearchIndexStatus>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Pauses, resumes, or cancels a persistent namespace-index build.
Source§

fn set_search_index_auto_refresh<'life0, 'async_trait>( &'life0 self, _enabled: bool, ) -> Pin<Box<dyn Future<Output = DriverResult<SearchIndexStatus>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Enables or disables future automatic refreshes for this server’s index.
Source§

fn delete_search_index<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = DriverResult<SearchIndexStatus>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Deletes this server’s persistent namespace index and enrollment.
Source§

fn search_index<'life0, 'async_trait>( &'life0 self, _request: SearchIndexRequest, ) -> Pin<Box<dyn Future<Output = DriverResult<SearchIndexResponse>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Queries the gateway-owned persistent namespace index.

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.

§

impl<T> Instrument for T

§

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

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

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.

§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
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.
§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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