Skip to main content

DataWriter

Struct DataWriter 

Source
pub struct DataWriter<T>
where T: DdsType,
{ /* private fields */ }
Expand description

Typed DataWriter — schickt Samples an alle matched Reader des Topics.

Zwei Modi:

  • Live (runtime: Some, entity_id: Some): write() delegiert an die Runtime → ReliableWriter → UDP.
  • Offline (Offline-Fallback, Runtime=None): write() queued in-memory; fuer Unit-Tests ohne Netz.

Implementations§

Source§

impl<T> DataWriter<T>
where T: DdsType,

Source

pub fn topic(&self) -> &Topic<T>

Topic, an das gesendet wird.

Source

pub fn set_listener( &self, listener: Option<Arc<dyn DataWriterListener>>, mask: u32, )

setzt den DataWriterListener + StatusMask. None loescht den Slot. Spec §2.2.2.4.2.x set_listener.

Source

pub fn get_listener(&self) -> Option<Arc<dyn DataWriterListener>>

aktueller Listener-Klon, sofern vorhanden.

Source

pub fn qos(&self) -> DataWriterQos

Aktuelle QoS (cloned, .1).

Source

pub fn write(&self, sample: &T) -> Result<(), DdsError>

Sendet einen Sample an alle matched Reader.

Spec §2.2.3.19 RESOURCE_LIMITS Reliable-Block: Wenn der lokale Writer-Cache max_samples erreicht hat UND Reliability=RELIABLE UND max_blocking_time > 0, blockt write() bis Reader ACK den Slot freigibt oder das Timeout abgelaufen ist. Im Best-Effort-Mode oder mit max_blocking_time = 0 schlaegt write() sofort fehl mit OutOfResources.

§Errors
  • WireError wenn T::encode fehlschlaegt.
  • OutOfResources wenn die Queue full ist + Best-Effort/keine Block-Zeit, oder wenn der Block-Timeout vor einem Drain abgelaufen ist.
  • PreconditionNotMet bei Lock-Poisoning.
Source

pub fn samples_pending(&self) -> usize

Anzahl bisher geschriebener Samples. Test-Hilfsfunktion, in Runtime durch echte HistoryCache-Counter ersetzt.

Source

pub fn matched_subscription_count(&self) -> usize

Anzahl matched Remote-Reader. Im Offline-Mode immer 0.

Spec: OMG DDS 1.4 §2.2.2.4.2.11 get_matched_subscriptions. Dort wird eine Liste zurueckgegeben; liefert nur den Count, die volle Liste kommt mit Listener-Callbacks.

Seiteneffekt — bei einer Aenderung des Matched-Count gegenueber dem letzten Aufruf wird on_publication_matched via Bubble-Up-Kette gefeuert (Spec §2.2.4.2.4.4).

Source

pub fn wait_for_matched_subscription( &self, min_count: usize, timeout: Duration, ) -> Result<(), DdsError>

Blockiert, bis mindestens min_count Remote-Reader matched sind oder timeout verstreicht. Event-driven via Runtime-Condvar (D.5e Phase-1) — wakup direkt wenn SEDP einen Match propagiert, kein 20-ms-Polling mehr.

Verwandt zu OMG DDS 1.4 §2.2.2.4.2.22 wait_for_acknowledgments, aber fokussiert auf Matching statt ACK. Deckt den typischen Producer-Pattern “erst Writer anlegen, dann auf Subscriber warten, dann schreiben” ab.

§Errors

DdsError::Timeout wenn min_count im Zeitfenster nicht erreicht wird.

Source

pub fn offered_deadline_missed_count(&self) -> u64

Counter fuer offered-Deadline-Verletzungen (Spec §2.2.4.2.9 OFFERED_DEADLINE_MISSED_STATUS). Monoton steigend; steigt um 1 pro abgelaufenem Deadline-Fenster ohne Write. Im Offline-Mode oder bei deadline=INFINITE immer 0.

feuert ggf. on_offered_deadline_missed ueber die Bubble-Up-Kette bei Delta gegenueber dem letzten Aufruf.

Source

pub fn liveliness_lost_count(&self) -> u64

Counter fuer LivelinessLost-Detections (Spec §2.2.4.2.10). Triggert ggf. on_liveliness_lost via Bubble-Up.

Source

pub fn offered_incompatible_qos_status(&self) -> OfferedIncompatibleQosStatus

aktueller OfferedIncompatibleQosStatus (Spec §2.2.4.2.4.2). Triggert ggf. on_offered_incompatible_qos.

Source

pub fn drive_listeners(&self)

pollt alle Statuses einmal und feuert pending Listener. Convenient Helper fuer Tests + periodische Tick-Aufrufer.

Source

pub fn assert_liveliness(&self)

Manual-Liveliness-Assert. Spec §2.2.2.4.2.20 assert_liveliness. Setzt den last_liveliness_assert-Timestamp; bei Automatic-Liveliness no-op (jeder write asserts ohnehin).

Source

pub fn wait_for_acknowledgments( &self, timeout: Duration, ) -> Result<(), DdsError>

Blockiert, bis alle matched Remote-Reader alle bis jetzt geschriebenen Samples acknowledgt haben, oder timeout abläuft.

Spec: OMG DDS 1.4 §2.2.2.4.2.22 wait_for_acknowledgments. Im Offline-Mode und ohne gematchte Reader sofort Ok(()).

§Errors

DdsError::Timeout wenn nicht alle Samples im Zeitfenster acknowledgt sind.

Source

pub fn publication_handle(&self) -> InstanceHandle

Lokaler Publication-Handle dieses DataWriters (Spec §2.2.2.5.1.11). Wird im publication_handle-Feld des SampleInfo mitgegeben. Achtung: das ist NICHT derselbe Handle wie der Entity- InstanceHandle (Spec §2.2.2.1.1) — siehe Self::instance_handle.

Source

pub fn instance_handle(&self) -> InstanceHandle

Spec §2.2.2.1.1 get_instance_handle — Entity-Identifier dieses DataWriters fuer Vergleiche via DomainParticipant::contains_entity.

Source

pub fn instance_tracker(&self) -> InstanceTracker

Liefert den geteilten Instance-Tracker des Writers (Test- und Inspection-Helper, Spec §2.2.2.4.2.5+ Lifecycle-Buchhaltung).

Source

pub fn register_instance( &self, instance: &T, ) -> Result<InstanceHandle, DdsError>

Registriert eine Instanz beim DataWriter und liefert ihren stabilen InstanceHandle zurueck. Spec §2.2.2.4.2.5 register_instance.

Fuer non-keyed Topics liefert der Aufruf HANDLE_NIL zurueck (jedes Sample ist seine eigene “Instanz”, die Spec sagt explizit dass register/unregister/dispose hier optional sind).

§Errors

Aktuell kann der Aufruf nicht fehlschlagen. Spaeter (Live-Mode) koennen Resource-Limits hier einen OutOfResources-Fehler liefern.

Source

pub fn register_instance_w_timestamp( &self, instance: &T, timestamp: Time, ) -> Result<InstanceHandle, DdsError>

Wie register_instance, aber mit explizitem Timestamp. Spec §2.2.2.4.2.6.

Source

pub fn lookup_instance(&self, instance: &T) -> InstanceHandle

Macht aus einem Sample-Wert den dazugehoerigen lokalen InstanceHandle, oder HANDLE_NIL wenn unbekannt / non-keyed. Spec §2.2.2.4.2.14 lookup_instance.

Source

pub fn unregister_instance( &self, instance: &T, handle: InstanceHandle, ) -> Result<(), DdsError>

Entfernt die Instanz aus dem Writer-Set (Spec §2.2.2.4.2.7). Setzt den Lifecycle-Zustand auf NOT_ALIVE_NO_WRITERS, sobald der letzte Writer sich abgemeldet hat.

§Errors

BadParameter wenn handle nicht zur Instanz von instance passt (Spec verlangt diese Konsistenz-Pruefung). Wenn handle == HANDLE_NIL, wird der Handle aus instance abgeleitet.

Source

pub fn unregister_instance_w_timestamp( &self, instance: &T, handle: InstanceHandle, timestamp: Time, ) -> Result<(), DdsError>

Wie unregister_instance, aber mit Timestamp. Spec §2.2.2.4.2.8.

Spec §2.2.3.21 WriterDataLifecycle: wenn autodispose_unregistered_instances=true (Default), wird die Instanz zusaetzlich zum Unregister auch disposed — Reader sehen dann sowohl NOT_ALIVE_DISPOSED als auch NOT_ALIVE_NO_WRITERS.

Source

pub fn dispose( &self, instance: &T, handle: InstanceHandle, ) -> Result<(), DdsError>

Disposed eine Instanz (Spec §2.2.2.4.2.10). Markiert sie als NOT_ALIVE_DISPOSED; Reader sehen dann ein Sample mit valid_data == false.

§Errors

Wie unregister_instance.

Source

pub fn dispose_w_timestamp( &self, instance: &T, handle: InstanceHandle, timestamp: Time, ) -> Result<(), DdsError>

Wie dispose, aber mit Timestamp. Spec §2.2.2.4.2.11.

Source

pub fn get_key_value(&self, handle: InstanceHandle) -> Result<T, DdsError>

Gibt den Sample-Wert mit nur den @key-Feldern befuellt zurueck (Spec §2.2.2.4.2.13 get_key_value). Implementierung: wir rekonstruieren T via decode aus dem gespeicherten PLAIN_CDR2-BE-Key-Holder. Damit das funktioniert, muss T::decode einen Key-only-Stream akzeptieren — fuer einfache Records ist das trivialerweise der Fall.

§Errors
  • BadParameter wenn der Handle unbekannt ist.
  • WireError wenn der Key-Holder nicht via T::decode rekonstruierbar ist.
Source

pub fn write_w_timestamp( &self, sample: &T, timestamp: Time, ) -> Result<(), DdsError>

Schreibt ein Sample mit explizitem Timestamp (Spec §2.2.2.4.2.16 write_w_timestamp) und aktualisiert die Instanz-Buchhaltung.

§Errors

Wie Self::write.

Trait Implementations§

Source§

impl<T> Debug for DataWriter<T>
where T: DdsType,

Source§

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

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

impl<T> Entity for DataWriter<T>
where T: DdsType,

Available on crate feature std only.
Source§

fn set_qos(&self, qos: <DataWriter<T> as Entity>::Qos) -> Result<(), DdsError>

Spec §2.2.3 / §2.2.2.4.2: DURABILITY, RELIABILITY, HISTORY, RESOURCE_LIMITS, OWNERSHIP, LIVELINESS sind Changeable=NO post-enable.

Source§

type Qos = DataWriterQos

QoS-Typ fuer diese Entity (z.B. DomainParticipantQos, DataWriterQos, …).
Source§

fn get_qos(&self) -> <DataWriter<T> as Entity>::Qos

Liefert die aktuelle QoS (clone). Spec §2.2.2.1.2 get_qos.
Source§

fn enable(&self) -> Result<(), DdsError>

Enabled die Entity (idempotent). Spec §2.2.2.1.4 enable. Read more
Source§

fn entity_state(&self) -> Arc<EntityState>

Interner Accessor — jede Impl liefert ihren Arc<EntityState>.
Source§

fn is_enabled(&self) -> bool

True wenn die Entity bereits enabled ist.
Source§

fn get_status_condition(&self) -> StatusCondition

StatusCondition dieser Entity. Spec §2.2.2.1.6 get_status_condition.
Source§

fn get_status_changes(&self) -> u32

Bitmask der Status-Kinds, die seit letztem Read geaendert haben. Spec §2.2.2.1.5 get_status_changes.
Source§

fn get_instance_handle(&self) -> InstanceHandle

Lokaler 64-Bit-Identifier. Spec §2.2.2.1.7 get_instance_handle.

Auto Trait Implementations§

§

impl<T> !Freeze for DataWriter<T>

§

impl<T> !RefUnwindSafe for DataWriter<T>

§

impl<T> Send for DataWriter<T>
where T: Send,

§

impl<T> Sync for DataWriter<T>
where T: Sync,

§

impl<T> Unpin for DataWriter<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for DataWriter<T>

§

impl<T> !UnwindSafe for DataWriter<T>

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