Usage
Build
The library is header-only and does not require any additional dependencies.
It uses the CMake build system and exports a jac-link target that can be used to link against the library.
Example
The following code shows how to configure the whole communication stack and send and receive data.
#include <jac/link/mux.h>
#include <jac/link/router.h>
#include <jac/link/routerCommunicator.h>
#include <jac/link/encoders/cobs.h>
using namespace jac;
// Define a stream connection - read operations must be non-blocking
class MyStream : public Duplex {
public:
    int get() override { ... }
    size_t read(std::span<uint8_t> data) override { ... }
    void onData(std::function<void(void)>) override { ... }
    bool put(uint8_t c) override { ... }
    size_t write(std::span<const uint8_t> data) override { ... }
    bool flush() override { ... }
};
int main() {
    // Create a router
    Router router;
    // Create a stream connection
    auto stream = std::make_unique<MyStream>();
    // Configure a data link
    Mux<CobsEncoder> mux(std::move(stream));
    // Connect the data link to the router
    auto handle = router.subscribeTx(1, mux);
    mux.bindRx(std::make_unique<decltype(handle)>(std::move(handle)));
    // Create an input stream the communicator
    RouterInputStreamCommunicator input({});
    // Subscribe the communicator to the router
    router.subscribeChannel(1, input);
    // Create an output stream communicator and connect it to router
    RouterOutputStreamCommunicator output(router, 1, {});
    // Send data
    std::vector<uint8_t> buffer = { 1, 2, 3, 4, 5 };
    output.write(std::span(buffer.data(), buffer.size()));
    // Receive data - blocks until any data is received
    std::vector<uint8_t> received(64);
    input.read(std::span(received.data(), received.size()));
}