Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/.idea
/target
Cargo.lock
3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
[workspace]
members = [
"rustecal",
"rustecal-core",
"rustecal-pubsub",
"rustecal-service",
"rustecal-sys",
"rustecal-types-bytes",
"rustecal-types-protobuf",
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ fn main() {

std::thread::sleep(std::time::Duration::from_secs(1));
}

Ecal::finalize();
}
```
Expand Down
54 changes: 33 additions & 21 deletions docs/src/project_structure.md
Original file line number Diff line number Diff line change
@@ -1,29 +1,41 @@
# Project Structure

| Crate | Description |
|-------|-------------|
| `rustecal-sys` | Low-level unsafe bindings (via `bindgen`) |
| `rustecal` | Safe and idiomatic high-level wrapper |
| `rustecal-types-bytes` | Support for raw byte messages |
| `rustecal-types-string` | UTF-8 string message support |
| `rustecal-types-protobuf` | Protobuf support using `prost` |
| `rustecal-samples` | Working binary examples |
This workspace is organized into several purpose-specific crates to provide a modular, maintainable API for eCAL:

| Crate | Description |
|---------------------------|----------------------------------------------------------|
| `rustecal` | **Meta‑crate**: re‑exports core, pub/sub, and service APIs via feature flags (`pubsub`, `service`) |
| `rustecal-core` | eCAL initialization, shutdown, and shared common types |
| `rustecal-pubsub` | Typed and untyped Publisher/Subscriber API |
| `rustecal-service` | RPC Service server & client API |
| `rustecal-sys` | Low‑level FFI bindings to the eCAL C API |
| `rustecal-types-string` | Helper: UTF-8 string message wrapper for typed pub/sub |
| `rustecal-types-bytes` | Helper: raw byte vector message wrapper |
| `rustecal-types-protobuf` | Helper: Protobuf message wrapper (using `prost`) |
| `rustecal-samples` | Example binaries demonstrating pub/sub and RPC usage |

## Workspace Layout

```
```text
your_workspace/
├── rustecal/
├── rustecal-sys/
├── rustecal-types-bytes/
├── Cargo.toml # workspace manifest
├── rustecal/ # meta‑crate (feature‑gated)
├── rustecal-core/ # core init + types
├── rustecal-pubsub/ # pub/sub API
├── rustecal-service/ # service RPC API
├── rustecal-sys/ # raw C bindings
├── rustecal-types-string/
├── rustecal-types-bytes/
├── rustecal-types-protobuf/
└── rustecal-samples/
└── pubsub/
├── blob_send/
├── blob_receive/
├── hello_send/
├── hello_receive/
├── person_send/
└── person_receive/
```
└── rustecal-samples/ # examples
├── pubsub/
│ ├── hello_send/
│ ├── hello_receive/
│ ├── blob_send/
│ ├── blob_receive/
│ ├── person_send/
│ └── person_receive/
└── service/
├── mirror_server/
├── mirror_client/
└── mirror_client_instances/
14 changes: 14 additions & 0 deletions rustecal-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[package]
name = "rustecal-core"
version = "0.1.0"
edition = "2021"
publish = false

[dependencies]
rustecal-sys = { path = "../rustecal-sys" }
once_cell = "1.17"
thiserror = "1.0"
bitflags = "1.3"

[features]
default = []
File renamed without changes.
2 changes: 1 addition & 1 deletion rustecal/src/ecal/core.rs → rustecal-core/src/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
//! application and [`Ecal::finalize`] at shutdown.

use std::ffi::CString;
use crate::ecal::components::EcalComponents;
use crate::components::EcalComponents;
use rustecal_sys;

/// Provides access to the core initialization and finalization functions of eCAL.
Expand Down
9 changes: 9 additions & 0 deletions rustecal-core/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//! rustecal-core: eCAL initialization & shared types

pub mod core;
pub mod components;
pub mod types;

// Re‑exports for ergonomic access:
pub use core::Ecal;
pub use components::EcalComponents;
File renamed without changes.
14 changes: 14 additions & 0 deletions rustecal-pubsub/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[package]
name = "rustecal-pubsub"
version = "0.1.0"
edition = "2021"

[dependencies]
rustecal-sys = { path = "../rustecal-sys" }
rustecal-core = { path = "../rustecal-core" }
thiserror = "1.0"
serde = { version = "1.0", optional = true }

[features]
default = []
serde-support = ["serde"]
19 changes: 19 additions & 0 deletions rustecal-pubsub/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//! rustecal-pubsub: TypedPublisher & TypedSubscriber for eCAL

// Re-export core init & types
pub use rustecal_core::{Ecal, EcalComponents};

// Sub‑modules
pub mod types;
pub mod publisher;
pub mod subscriber;
pub mod typed_publisher;
pub mod typed_subscriber;

// Public API
pub use publisher::Publisher;
pub use subscriber::Subscriber;
pub use typed_publisher::TypedPublisher;
pub use typed_publisher::PublisherMessage;
pub use typed_subscriber::TypedSubscriber;
pub use typed_subscriber::SubscriberMessage;
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use rustecal_sys::*;
use crate::ecal::types::DataTypeInfo;
use crate::pubsub::types::TopicId;
use rustecal_core::types::DataTypeInfo;
use crate::types::TopicId;
use std::ffi::{CStr, CString};
use std::ptr;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
use rustecal_sys::*;
use crate::ecal::types::DataTypeInfo;
use crate::pubsub::types::TopicId;
use std::ffi::{CString, CStr, c_void};
use rustecal_core::types::DataTypeInfo;
use crate::types::TopicId;
use std::ffi::{CStr, CString};
use std::ptr;
use std::ffi::c_void;

/// A safe and ergonomic wrapper around the eCAL C subscriber API.
///
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::pubsub::publisher::Publisher;
use crate::ecal::types::DataTypeInfo;
use crate::pubsub::types::TopicId;
use crate::publisher::Publisher;
use rustecal_core::types::DataTypeInfo;
use crate::types::TopicId;
use std::marker::PhantomData;

/// Trait for types that can be published via [`TypedPublisher`].
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::pubsub::subscriber::Subscriber;
use crate::ecal::types::DataTypeInfo;
use crate::pubsub::types::TopicId;
use crate::subscriber::Subscriber;
use rustecal_core::types::DataTypeInfo;
use crate::types::TopicId;
use rustecal_sys::{eCAL_SDataTypeInformation, eCAL_SReceiveCallbackData, eCAL_STopicId};
use std::ffi::{c_void, CStr};
use std::marker::PhantomData;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//! Types used by the pub/sub layer of eCAL.

use crate::ecal::types::EntityId;
use rustecal_sys::*;
use rustecal_core::types::EntityId;
use std::ffi::CStr;

/// Internal eCAL topic identifier, used by publishers and subscribers.
Expand Down
6 changes: 3 additions & 3 deletions rustecal-samples/pubsub/blob_receive/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[package]
name = "blob_receive"
version = "0.1.0"
edition = "2024"
edition = "2021"

[dependencies]
rustecal = { path = "../../../rustecal" }
rustecal-types-bytes = { path = "../../../rustecal-types-bytes" }
rustecal = { path = "../../../rustecal", features = ["pubsub"] }
rustecal-types-bytes = { path = "../../../rustecal-types-bytes" }
2 changes: 1 addition & 1 deletion rustecal-samples/pubsub/blob_receive/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use rustecal::{Ecal, EcalComponents, TypedSubscriber};
use rustecal_types_bytes::BytesMessage;
use rustecal::pubsub::typed_subscriber::Received;
use rustecal_types_bytes::BytesMessage;

fn main() {
Ecal::initialize(Some("blob receive rust"), EcalComponents::DEFAULT)
Expand Down
6 changes: 3 additions & 3 deletions rustecal-samples/pubsub/blob_send/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[package]
name = "blob_send"
version = "0.1.0"
edition = "2024"
edition = "2021"

[dependencies]
rustecal = { path = "../../../rustecal" }
rustecal-types-bytes = { path = "../../../rustecal-types-bytes" }
rustecal = { path = "../../../rustecal", features = ["pubsub"] }
rustecal-types-bytes = { path = "../../../rustecal-types-bytes" }
4 changes: 2 additions & 2 deletions rustecal-samples/pubsub/hello_receive/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[package]
name = "hello_receive"
version = "0.1.0"
edition = "2024"
edition = "2021"

[dependencies]
rustecal = { path = "../../../rustecal" }
rustecal = { path = "../../../rustecal", features = ["pubsub"] }
rustecal-types-string = { path = "../../../rustecal-types-string" }
2 changes: 1 addition & 1 deletion rustecal-samples/pubsub/hello_receive/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use rustecal::{Ecal, EcalComponents, TypedSubscriber};
use rustecal_types_string::StringMessage;
use rustecal::pubsub::typed_subscriber::Received;
use rustecal_types_string::StringMessage;

fn main() {
Ecal::initialize(Some("hello receive rust"), EcalComponents::DEFAULT)
Expand Down
4 changes: 2 additions & 2 deletions rustecal-samples/pubsub/hello_send/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[package]
name = "hello_send"
version = "0.1.0"
edition = "2024"
edition = "2021"

[dependencies]
rustecal = { path = "../../../rustecal" }
rustecal = { path = "../../../rustecal", features = ["pubsub"] }
rustecal-types-string = { path = "../../../rustecal-types-string" }
4 changes: 2 additions & 2 deletions rustecal-samples/pubsub/person_receive/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
[package]
name = "person_receive"
version = "0.1.0"
edition = "2024"
edition = "2021"
build = "build.rs"

[dependencies]
prost = "0.13.5"
rustecal = { path = "../../../rustecal" }
rustecal = { path = "../../../rustecal", features = ["pubsub"] }
rustecal-types-protobuf = { path = "../../../rustecal-types-protobuf" }

[build-dependencies]
Expand Down
4 changes: 2 additions & 2 deletions rustecal-samples/pubsub/person_send/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
[package]
name = "person_send"
version = "0.1.0"
edition = "2024"
edition = "2021"
build = "build.rs"

[dependencies]
prost = "0.13.5"
rustecal = { path = "../../../rustecal" }
rustecal = { path = "../../../rustecal", features = ["pubsub"] }
rustecal-types-protobuf = { path = "../../../rustecal-types-protobuf" }

[build-dependencies]
Expand Down
4 changes: 2 additions & 2 deletions rustecal-samples/service/mirror_client/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "mirror_client"
version = "0.1.0"
edition = "2024"
edition = "2021"

[dependencies]
rustecal = { path = "../../../rustecal" }
rustecal = { path = "../../../rustecal", features = ["service"] }
10 changes: 5 additions & 5 deletions rustecal-samples/service/mirror_client/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rustecal::{Ecal, EcalComponents};
use rustecal::service::client::ServiceClient;
use rustecal::{ServiceClient, ServiceRequest, CallState};
use std::thread;
use std::time::Duration;

Expand All @@ -23,7 +23,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let method_name = methods[i % methods.len()];
i += 1;

let request = rustecal::service::types::ServiceRequest {
let request = ServiceRequest {
payload: b"stressed".to_vec(),
};

Expand All @@ -35,15 +35,15 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {

match response {
Some(res) => {
match rustecal::service::types::CallState::from(res.success as i32) {
rustecal::service::types::CallState::Executed => {
match CallState::from(res.success as i32) {
CallState::Executed => {
let text = String::from_utf8_lossy(&res.payload);
println!(
"Received response: {} from service id {:?}",
text, res.server_id.service_id.entity_id
);
}
rustecal::service::types::CallState::Failed => {
CallState::Failed => {
println!(
"Received error: {} from service id {:?}",
res.error_msg.unwrap_or_else(|| "Unknown".into()),
Expand Down
4 changes: 2 additions & 2 deletions rustecal-samples/service/mirror_client_instances/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "mirror_client_instances"
version = "0.1.0"
edition = "2024"
edition = "2021"

[dependencies]
rustecal = { path = "../../../rustecal" }
rustecal = { path = "../../../rustecal", features = ["service"] }
3 changes: 1 addition & 2 deletions rustecal-samples/service/mirror_client_instances/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use rustecal::{Ecal, EcalComponents};
use rustecal::service::client::ServiceClient;
use rustecal::service::types::ServiceRequest;
use rustecal::{ServiceClient, ServiceRequest};
use std::thread;
use std::time::Duration;

Expand Down
4 changes: 2 additions & 2 deletions rustecal-samples/service/mirror_server/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "mirror_server"
version = "0.1.0"
edition = "2024"
edition = "2021"

[dependencies]
rustecal = { path = "../../../rustecal" }
rustecal = { path = "../../../rustecal", features = ["service"] }
3 changes: 1 addition & 2 deletions rustecal-samples/service/mirror_server/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use rustecal::{Ecal, EcalComponents};
use rustecal::service::server::ServiceServer;
use rustecal::service::types::MethodInfo;
use rustecal::{ServiceServer, MethodInfo};

fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize eCAL
Expand Down
15 changes: 15 additions & 0 deletions rustecal-service/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[package]
name = "rustecal-service"
version = "0.1.0"
edition = "2021"

[dependencies]
rustecal-sys = { path = "../rustecal-sys" }
rustecal-core = { path = "../rustecal-core" }
thiserror = "1.0"
tokio = { version = "1", optional = true }

[features]
default = ["async"]
async = ["tokio"]
sync = []
Loading