Program Listing for File FullDuplexBuffer.h

Program Listing for File FullDuplexBuffer.h#

Return to documentation for file (src/buffer/FullDuplexBuffer.h)

#pragma once

/* internal */
#include "PcBuffer.h"

namespace Coral
{

template <class T, size_t tx_depth, size_t rx_depth,
          typename element_t = std::byte,
          std::size_t alignment = sizeof(element_t)>
class FullDuplexBuffer
{
  public:
    using TxBuffer = PcBuffer<tx_depth, element_t, alignment>;
    using RxBuffer = PcBuffer<rx_depth, element_t, alignment>;

    FullDuplexBuffer(bool _auto_service = true)
        : tx(_auto_service), rx(_auto_service)
    {
        /*
         * Attempt to service the writing end whenever data is ready to be
         * written.
         */
        tx.set_data_available([this](TxBuffer *buf) { service_tx(buf); });

        /*
         * Attempt to service the reading end whenever the read buffer has
         * space.
         */
        rx.set_space_available([this](RxBuffer *buf) { service_rx(buf); });
    }

    /*
     * A method that can be polled at runtime if it's useful for hardware
     * resources to be interacted with regularly.
     */
    inline void dispatch(void)
    {
        service_tx(&tx);
        service_rx(&rx);
    }

    inline void service_tx(TxBuffer *buf)
    {
        static_cast<T *>(this)->service_tx_impl(buf);
    }

    inline void service_rx(RxBuffer *buf)
    {
        static_cast<T *>(this)->service_rx_impl(buf);
    }

    TxBuffer tx;
    RxBuffer rx;
};

} // namespace Coral