Skip to content

Commit

Permalink
PR fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
serges147 committed Apr 8, 2024
1 parent be51309 commit 4c796ea
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 77 deletions.
12 changes: 6 additions & 6 deletions include/libcyphal/runnable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,17 @@ namespace libcyphal
class IRunnable
{
public:
IRunnable(const IRunnable&) = delete;
IRunnable& operator=(const IRunnable&) = delete;

virtual ~IRunnable() = default;

virtual void run(const TimePoint now) = 0;

protected:
IRunnable() = default;
IRunnable(const IRunnable&) = default;
IRunnable(IRunnable&&) = default;

IRunnable& operator=(const IRunnable&) = default;
IRunnable& operator=(IRunnable&&) = default;
IRunnable() = default;
IRunnable(IRunnable&&) = default;
IRunnable& operator=(IRunnable&&) = default;
};

} // namespace libcyphal
Expand Down
56 changes: 20 additions & 36 deletions include/libcyphal/transport/defines.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,72 +28,56 @@ using PortId = std::uint16_t;
///
using TransferId = std::uint64_t;

enum class Priority
{

Exceptional = 0,
Immediate = 1,
Fast = 2,
High = 3,
Nominal = 4, ///< Nominal priority level should be the default.
Low = 5,
Slow = 6,
Optional = 7,
};

struct ProtocolParams final
{
TransferId transfer_id_modulo;
std::size_t mtu_bytes;
NodeId max_nodes;

ProtocolParams(TransferId _transfer_id_modulo, std::size_t _mtu_bytes, NodeId _max_nodes)
: transfer_id_modulo{_transfer_id_modulo}
, mtu_bytes{_mtu_bytes}
, max_nodes{_max_nodes}
{
}
};

struct TransferMetadata
{
TransferId transfer_id;
TimePoint timestamp;
Priority priority;
};

TransferMetadata(TransferId _transfer_id, TimePoint _timestamp, Priority _priority)
: transfer_id{_transfer_id}
, timestamp{_timestamp}
, priority{_priority}
{
}
struct MessageTransferMetadata final : TransferMetadata
{
cetl::optional<NodeId> publisher_node_id;
};

struct ServiceTransferMetadata final : TransferMetadata
{
NodeId remote_node_id;

ServiceTransferMetadata(TransferId _transfer_id, TimePoint _timestamp, Priority _priority, NodeId _remote_node_id)
: TransferMetadata{_transfer_id, _timestamp, _priority}
, remote_node_id{_remote_node_id}
{
}
};

// TODO: Maybe have `cetl::byte` polyfill for C++20
using PayloadFragments = cetl::span<cetl::span<uint8_t>>;
using PayloadFragments = cetl::span<cetl::span<std::uint8_t>>;

struct MessageRxTransfer final
{
TransferMetadata metadata;
cetl::optional<NodeId> publisher_node_id;
DynamicBuffer payload;

MessageRxTransfer(TransferMetadata _metadata, cetl::optional<NodeId> _publisher_node_id, DynamicBuffer _payload)
: metadata{_metadata}
, publisher_node_id{_publisher_node_id}
, payload{std::move(_payload)}
{
}
MessageTransferMetadata metadata;
DynamicBuffer payload;
};

struct ServiceRxTransfer final
{
ServiceTransferMetadata metadata;
DynamicBuffer payload;

ServiceRxTransfer(ServiceTransferMetadata _metadata, DynamicBuffer _payload)
: metadata{_metadata}
, payload{std::move(_payload)}
{
}
};

} // namespace transport
Expand Down
24 changes: 19 additions & 5 deletions include/libcyphal/transport/session/msg_sessions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,30 @@ struct MessageTxParams final
class IMessageRxSession : public IRxSession
{
public:
CETL_NODISCARD virtual MessageRxParams getParams() const noexcept = 0;
CETL_NODISCARD virtual MessageRxTransfer receive() = 0;
CETL_NODISCARD virtual MessageRxParams getParams() const noexcept = 0;

/// @brief Receives a message from the transport layer.
///
/// Method is not blocking, and will return immediately if no message is available.
///
/// @return A message transfer if available; otherwise an empty optional.
///
CETL_NODISCARD virtual cetl::optional<MessageRxTransfer> receive() = 0;
};

class IMessageTxSession : public IRunnable
{
public:
CETL_NODISCARD virtual MessageTxParams getParams() const noexcept = 0;
CETL_NODISCARD virtual Expected<void, AnyError> send(const TransferMetadata metadata,
const PayloadFragments payload_fragments) = 0;
CETL_NODISCARD virtual MessageTxParams getParams() const noexcept = 0;

/// @brief Sends a message to the transport layer.
///
/// @param metadata Additional metadata associated with the message.
/// @param payload_fragments Segments of the message payload.
/// @return `void` in case of success; otherwise an error.
///
CETL_NODISCARD virtual Expected<void, AnyError> send(const TransferMetadata& metadata,
const PayloadFragments payload_fragments) = 0;
};

} // namespace session
Expand Down
34 changes: 27 additions & 7 deletions include/libcyphal/transport/session/svc_sessions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,13 @@ struct ResponseTxParams final
class ISvcRxSession : public IRxSession
{
public:
CETL_NODISCARD virtual ServiceRxTransfer receive() = 0;
/// @brief Receives a service transfer (request or response) from the transport layer.
///
/// Method is not blocking, and will return immediately if no transfer is available.
///
/// @return A service transfer if available; otherwise an empty optional.
///
CETL_NODISCARD virtual cetl::optional<ServiceRxTransfer> receive() = 0;
};

class IRequestRxSession : public ISvcRxSession
Expand All @@ -54,9 +60,16 @@ class IRequestRxSession : public ISvcRxSession
class IRequestTxSession : public ISession
{
public:
CETL_NODISCARD virtual RequestTxParams getParams() const noexcept = 0;
CETL_NODISCARD virtual Expected<void, AnyError> send(const TransferMetadata metadata,
const PayloadFragments payload_fragments) = 0;
CETL_NODISCARD virtual RequestTxParams getParams() const noexcept = 0;

/// @brief Sends a service request to the transport layer.
///
/// @param metadata Additional metadata associated with the request.
/// @param payload_fragments Segments of the request payload.
/// @return `void` in case of success; otherwise an error.
///
CETL_NODISCARD virtual Expected<void, AnyError> send(const TransferMetadata& metadata,
const PayloadFragments payload_fragments) = 0;
};

class IResponseRxSession : public ISvcRxSession
Expand All @@ -68,9 +81,16 @@ class IResponseRxSession : public ISvcRxSession
class IResponseTxSession : public ISession
{
public:
CETL_NODISCARD virtual ResponseTxParams getParams() const noexcept = 0;
CETL_NODISCARD virtual Expected<void, AnyError> send(const ServiceTransferMetadata metadata,
const PayloadFragments payload_fragments) = 0;
CETL_NODISCARD virtual ResponseTxParams getParams() const noexcept = 0;

/// @brief Sends a service response to the transport layer.
///
/// @param metadata Additional metadata associated with the response.
/// @param payload_fragments Segments of the response payload.
/// @return `void` in case of success; otherwise an error.
///
CETL_NODISCARD virtual Expected<void, AnyError> send(const ServiceTransferMetadata& metadata,
const PayloadFragments payload_fragments) = 0;
};

} // namespace session
Expand Down
12 changes: 6 additions & 6 deletions include/libcyphal/transport/transport.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,17 @@ class ITransport : public IRunnable
CETL_NODISCARD virtual cetl::optional<NodeId> getLocalNodeId() const noexcept = 0;
CETL_NODISCARD virtual ProtocolParams getProtocolParams() const noexcept = 0;
CETL_NODISCARD virtual Expected<UniquePtr<session::IMessageRxSession>, AnyError> makeMessageRxSession(
session::MessageRxParams params) = 0;
const session::MessageRxParams& params) = 0;
CETL_NODISCARD virtual Expected<UniquePtr<session::IMessageTxSession>, AnyError> makeMessageTxSession(
session::MessageTxParams params) = 0;
const session::MessageTxParams& params) = 0;
CETL_NODISCARD virtual Expected<UniquePtr<session::IRequestRxSession>, AnyError> makeRequestRxSession(
session::RequestRxParams params) = 0;
const session::RequestRxParams& params) = 0;
CETL_NODISCARD virtual Expected<UniquePtr<session::IRequestTxSession>, AnyError> makeRequestTxSession(
session::RequestTxParams params) = 0;
const session::RequestTxParams& params) = 0;
CETL_NODISCARD virtual Expected<UniquePtr<session::IResponseRxSession>, AnyError> makeResponseRxSession(
session::ResponseRxParams params) = 0;
const session::ResponseRxParams& params) = 0;
CETL_NODISCARD virtual Expected<UniquePtr<session::IResponseTxSession>, AnyError> makeResponseTxSession(
session::ResponseTxParams params) = 0;
const session::ResponseTxParams& params) = 0;

}; // ITransport

Expand Down
13 changes: 0 additions & 13 deletions include/libcyphal/types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,6 @@
namespace libcyphal
{

enum class Priority
{

Exceptional = 0,
Immediate = 1,
Fast = 2,
High = 3,
Nominal = 4, ///< Nominal priority level should be the default.
Low = 5,
Slow = 6,
Optional = 7,
};

/// @brief The internal time representation is in microseconds.
///
/// This is in line with the lizards that use `uint64_t`-typed microsecond counters throughout.
Expand Down
12 changes: 8 additions & 4 deletions test/unittest/transport/test_dynamic_buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ using testing::StrictMock;
namespace
{

// Just random id: 277C3545-564C-4617-993D-27B1043ECEBA
using TestTypeIdType =
cetl::type_id_type<0x27, 0x7C, 0x35, 0x45, 0x56, 0x4C, 0x46, 0x17, 0x99, 0x3D, 0x27, 0xB1, 0x04, 0x3E, 0xCE, 0xBA>;

class InterfaceMock : public DynamicBuffer::Interface
{
public:
Expand All @@ -27,7 +31,7 @@ class InterfaceMock : public DynamicBuffer::Interface
MOCK_METHOD(std::size_t, size, (), (const override));
MOCK_METHOD(std::size_t, copy, (const std::size_t, void* const, const std::size_t), (const override));
};
class InterfaceWrapper : public rtti_helper<type_id_type<0x01>, DynamicBuffer::Interface>
class InterfaceWrapper : public rtti_helper<TestTypeIdType, DynamicBuffer::Interface>
{
public:
explicit InterfaceWrapper(InterfaceMock* mock)
Expand Down Expand Up @@ -81,7 +85,7 @@ class InterfaceWrapper : public rtti_helper<type_id_type<0x01>, DynamicBuffer::I

}; // InterfaceWrapper

TEST(test_dynamic_buffer, move_ctor_assign__size)
TEST(test_dynamic_buffer, move_ctor_assign_size)
{
StrictMock<InterfaceMock> interface_mock{};
EXPECT_CALL(interface_mock, deinit()).Times(1);
Expand All @@ -101,9 +105,9 @@ TEST(test_dynamic_buffer, move_ctor_assign__size)
}
}

TEST(test_dynamic_buffer, copy__reset)
TEST(test_dynamic_buffer, copy_reset)
{
std::array<uint8_t, 16> test_dst{};
std::array<std::uint8_t, 16> test_dst{};

StrictMock<InterfaceMock> interface_mock{};
EXPECT_CALL(interface_mock, deinit()).Times(1);
Expand Down

0 comments on commit 4c796ea

Please sign in to comment.