use alloc::string::String;
use alloc::sync::Arc;
use alloc::vec::Vec;
use std::sync::{Mutex, mpsc};
use zerodds_dcps::factory::DomainParticipantFactoryQos;
use zerodds_dcps::participant::DomainParticipant;
use zerodds_dcps::qos::{
DataReaderQos, DataWriterQos, DomainParticipantQos, PublisherQos, SubscriberQos, TopicQos,
};
use zerodds_dcps::runtime::{DcpsRuntime, UserSample};
use zerodds_rtps::wire_types::EntityId;
pub struct ZeroDdsDomainParticipantFactory {
pub default_participant_qos: Mutex<DomainParticipantQos>,
pub factory_qos: Mutex<DomainParticipantFactoryQos>,
pub participants: Mutex<Vec<*mut ZeroDdsDomainParticipant>>,
}
unsafe impl Send for ZeroDdsDomainParticipantFactory {}
unsafe impl Sync for ZeroDdsDomainParticipantFactory {}
impl ZeroDdsDomainParticipantFactory {
pub fn instance() -> &'static Self {
use std::sync::OnceLock;
static FACTORY: OnceLock<ZeroDdsDomainParticipantFactory> = OnceLock::new();
FACTORY.get_or_init(|| Self {
default_participant_qos: Mutex::new(DomainParticipantQos::default()),
factory_qos: Mutex::new(DomainParticipantFactoryQos::default()),
participants: Mutex::new(Vec::new()),
})
}
}
pub struct ZeroDdsDomainParticipant {
pub dp: DomainParticipant,
pub rt: Option<Arc<DcpsRuntime>>,
pub domain_id: u32,
pub default_topic_qos: Mutex<TopicQos>,
pub default_publisher_qos: Mutex<PublisherQos>,
pub default_subscriber_qos: Mutex<SubscriberQos>,
pub topics: Mutex<Vec<*mut ZeroDdsTopic>>,
pub publishers: Mutex<Vec<*mut ZeroDdsPublisher>>,
pub subscribers: Mutex<Vec<*mut ZeroDdsSubscriber>>,
}
unsafe impl Send for ZeroDdsDomainParticipant {}
unsafe impl Sync for ZeroDdsDomainParticipant {}
pub struct ZeroDdsTopic {
pub participant: *mut ZeroDdsDomainParticipant,
pub name: String,
pub type_name: String,
pub qos: Mutex<TopicQos>,
}
unsafe impl Send for ZeroDdsTopic {}
unsafe impl Sync for ZeroDdsTopic {}
pub struct ZeroDdsContentFilteredTopic {
pub participant: *mut ZeroDdsDomainParticipant,
pub related_topic: *mut ZeroDdsTopic,
pub name: String,
pub filter_expression: String,
pub parameters: Mutex<Vec<String>>,
}
unsafe impl Send for ZeroDdsContentFilteredTopic {}
unsafe impl Sync for ZeroDdsContentFilteredTopic {}
pub struct ZeroDdsPublisher {
pub participant: *mut ZeroDdsDomainParticipant,
pub qos: Mutex<PublisherQos>,
pub default_dw_qos: Mutex<DataWriterQos>,
pub datawriters: Mutex<Vec<*mut ZeroDdsDataWriter>>,
pub suspended: Mutex<bool>,
}
unsafe impl Send for ZeroDdsPublisher {}
unsafe impl Sync for ZeroDdsPublisher {}
pub struct ZeroDdsSubscriber {
pub participant: *mut ZeroDdsDomainParticipant,
pub qos: Mutex<SubscriberQos>,
pub default_dr_qos: Mutex<DataReaderQos>,
pub datareaders: Mutex<Vec<*mut ZeroDdsDataReader>>,
}
unsafe impl Send for ZeroDdsSubscriber {}
unsafe impl Sync for ZeroDdsSubscriber {}
pub struct ZeroDdsDataWriter {
pub publisher: *mut ZeroDdsPublisher,
pub topic: *mut ZeroDdsTopic,
pub rt: Arc<DcpsRuntime>,
pub eid: EntityId,
pub qos: Mutex<DataWriterQos>,
}
unsafe impl Send for ZeroDdsDataWriter {}
unsafe impl Sync for ZeroDdsDataWriter {}
pub struct ZeroDdsDataReader {
pub subscriber: *mut ZeroDdsSubscriber,
pub topic: *mut ZeroDdsTopic,
pub rt: Arc<DcpsRuntime>,
pub eid: EntityId,
pub qos: Mutex<DataReaderQos>,
pub rx: Mutex<mpsc::Receiver<UserSample>>,
pub read_cache: Mutex<Vec<(UserSample, ReadSampleState)>>,
pub cft_filter: Option<CftFilter>,
}
pub struct CftFilter {
pub expr: zerodds_sql_filter::Expr,
pub params: Vec<zerodds_sql_filter::Value>,
}
impl CftFilter {
pub fn evaluate(&self, _payload: &[u8]) -> bool {
struct EmptyRow;
impl zerodds_sql_filter::RowAccess for EmptyRow {
fn get(&self, _path: &str) -> Option<zerodds_sql_filter::Value> {
None
}
}
self.expr.evaluate(&EmptyRow, &self.params).unwrap_or(true)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReadSampleState {
NotRead,
Read,
}
unsafe impl Send for ZeroDdsDataReader {}
unsafe impl Sync for ZeroDdsDataReader {}
pub unsafe fn handle_ref<T>(p: *mut T) -> Option<&'static T> {
if p.is_null() {
None
} else {
Some(unsafe { &*p })
}
}