You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 3.2 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. # C Dataflow Example
  2. This examples shows how to create and connect dora operators and custom nodes in C.
  3. ## Overview
  4. The [`dataflow.yml`](./dataflow.yml) defines a simple dataflow graph with the following three nodes:
  5. - [`node.c`](./node.c) is a custom node, i.e., it has its own main function and runs as a separate process. It uses the [`dora-node-api-c` crate](../../apis/c/node/) to interact with the dora dataflow.
  6. - The node has a single input named `timer` that is mapped to a dora-provided periodic timer (`dora/timer/secs/1`).
  7. - Whenever the node receives a timer tick, it sends out a message with ID `tick` and a counter value as data (just a single byte).
  8. - After receiving 10 timer inputs, the node exits.
  9. - The [`operator.c`](./operator.c) file defines a dora _operator_ that is plugged as a shared library into a dora runtime. Instead of defining a `main` function, it implements a template of `dora_*` functions, which are invoked by the dora runtime, e.g. when new input is available.
  10. - The operator takes the `tick` messages created by the `node.c` node as input. For each input value, it checks the ID and then prints the received message to `stdout`.
  11. - It counts the received values and outputs a string of the format _"The current counter value is ..."_.
  12. - The [`sink.c`](./sink.c) file defines a custom node again, which takes the output string of the operator as input. It prints each received input to stdout and exits as soon as the input stream is closed.
  13. ## Compile and Run
  14. To try it out, you can use the [`run.rs`](./run.rs) binary. It performs all required build steps and then starts the dataflow. Use the following command to run it: `cargo run --example c-dataflow`.
  15. For a manual build, follow these steps:
  16. **Build the custom nodes:**
  17. - Create a `build` folder in this directory (i.e., next to the `node.c` file)
  18. - Copy the `node-api.h` header file from `../../apis/c/node` to `build`
  19. - Compile the `dora-node-api-c` crate into a static library.
  20. - Run `cargo build -p dora-node-api-c --release`
  21. - The resulting staticlib is then available under `../../target/release/libdora-node-api-c.a`.
  22. - Compile the `node.c` (e.g. using `clang`) and link the staticlib
  23. - For example, use the following command:
  24. ```
  25. clang node.c -lm -lrt -ldl -pthread -ldora_node_api_c -L ../../target/release --output build/c_node
  26. ```
  27. - Repeat the previous step for the `sink.c` executable
  28. **Build the operator:**
  29. - Copy the `operator-api.h` header file from `../../apis/c/operator` to `build`
  30. - Compile the `operator.c` file into a shared library.
  31. - For example, use the following commands:
  32. ```
  33. clang -c operator.c -o build/operator.o -fPIC
  34. clang -shared build/operator.o -o build/operator.so
  35. ```
  36. **Build the dora coordinator and runtime:**
  37. - Build the `dora-coordinator` executable using `cargo build -p dora-coordinator --release`
  38. - Build the `dora-runtime` executable using `cargo build -p dora-runtime --release`
  39. **Run the dataflow:**
  40. - Start the `dora-coordinator`, passing the paths to the dataflow file and the `dora-runtime` as arguments:
  41. ```
  42. ../../target/release/dora-coordinator run dataflow.yml ../../target/release/dora-runtime
  43. ```

DORA (Dataflow-Oriented Robotic Architecture) is middleware designed to streamline and simplify the creation of AI-based robotic applications. It offers low latency, composable, and distributed datafl