roo_transport
API Documentation for roo_transport
Loading...
Searching...
No Matches
packet_receiver_over_stream.h
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4
5#include "roo_backport.h"
6#include "roo_backport/byte.h"
7#include "roo_io.h"
8#include "roo_io/core/input_stream.h"
10
11namespace roo_transport {
12
13/// Receives packets sent by `PacketSenderOverStream` via a potentially
14/// unreliable stream (for example UART/Serial).
15///
16/// Uses 32-bit hashes to validate packet integrity and COBS framing to recover
17/// packet boundaries even under byte loss/corruption.
18///
19/// Delivers only packets that pass integrity checks; corrupted packets are
20/// dropped, and packet loss is possible.
22 public:
23 /// Creates a receiver reading framed bytes from `in`.
24 PacketReceiverOverStream(roo_io::InputStream& in);
25
26 size_t tryReceive(const ReceiverFn& receiver_fn) override;
27
28 size_t receive(const ReceiverFn& receiver_fn) override;
29
30 /// Returns total raw bytes read from the underlying stream.
31 ///
32 /// Includes bytes that were part of malformed/corrupted packets.
33 size_t bytes_received() const { return bytes_received_; }
34
35 /// Returns total bytes accepted as valid framed packets.
36 ///
37 /// This is transport-level byte count (framing/hash included), not just
38 /// payload length.
39 size_t bytes_accepted() const { return bytes_accepted_; }
40
41 private:
42 // Processes up to `len` bytes of incoming data stored in `tmp_`, calling
43 // `receiver_fn` for each valid packet received. Returns the number of packets
44 // delivered.
45 size_t processIncoming(size_t len, const ReceiverFn& receiver_fn);
46
47 // Processes a complete packet stored in `buf` of size `size`, calling
48 // `receiver_fn` if the packet is valid. Returns true if the packet was
49 // accepted; false if it was rejected due to data corruption or other errors.
50 bool processPacket(roo::byte* buf, size_t size,
51 const ReceiverFn& receiver_fn);
52
53 roo_io::InputStream& in_;
54 std::unique_ptr<roo::byte[]> buf_;
55 std::unique_ptr<roo::byte[]> tmp_;
56 size_t pos_;
57
58 size_t bytes_received_;
59 size_t bytes_accepted_;
60};
61
62} // namespace roo_transport
Receives packets sent by PacketSenderOverStream via a potentially unreliable stream (for example UART...
size_t receive(const ReceiverFn &receiver_fn) override
Receives packets, blocking as needed until at least one packet is delivered, or until stream end/erro...
size_t bytes_accepted() const
Returns total bytes accepted as valid framed packets.
size_t bytes_received() const
Returns total raw bytes read from the underlying stream.
size_t tryReceive(const ReceiverFn &receiver_fn) override
Receives currently available packets without indefinite blocking.
Abstraction for receiving packets produced by PacketSender.
std::function< void(const roo::byte *, size_t)> ReceiverFn
Callback invoked for each received packet.