Listening for packets

typedef PacketListener_ packetio::PacketListener

Convenience typedef for a PacketListener with a sensible buffer size.

template <size_t BufferSize = 256>
class packetio::PacketListener_

Class for listening for packets on a PacketStream.

Template Parameters
  • BufferSize: The size of the buffer to allocate for incoming packets

Public Types

enum Error

Types of error that can occur when receiving a packet.

Values:

Overflow

The end of the message could not be recieved because the buffer overflowed.

Framing

The message was framed incorrectly.

typedef LambdaPointer<void(uint8_t *, size_t, Error)> ErrorHandler
typedef LambdaPointer<void(uint8_t *, size_t)> MessageHandler

Public Functions

PacketListener_(PacketStream &base)

Construct a listener for the given packet stream.

void update()

Read as much as possible from the underlying stream. If new packets are completed or errors occur, invoke the appropriate handler.

void onMessage(MessageHandler handler)

Set the handler to invoke when a message is recieved.

Note that because this is a LambdaPointer, the lambda function must have been allocated on the stack, such that its lifetime exceeds that of this object.

Parameters
  • handler: The handler to invoke. This will be called with the pointer to the start of the message, and its length.

void onError(ErrorHandler handler)

Set the handler to invoke when an error occurs.

Note that because this is a LambdaPointer, the lambda function must have been allocated on the stack, such that its lifetime exceeds that of this object.

Parameters
  • handler: The handler to invoke. This will be called with the pointer to the start of the message, and its length.

Example usage:

#include <packet_interface.h>
#include <PacketListener.h>
#include <cobs/Stream.h>
using namespace packetio;

void setup () {
    COBSStream cobs_serial_in(Serial);
    PacketListener handler(cobs_serial_in);

    int message_count = 0;
    auto message_handler = [&](const uint8_t* buffer, size_t len) {
        message_count++;
    };
    handler.onMessage(&message_handler);

    while(true) {
        handler.update();
        Serial.print("Message recieved: ");
        Serial.print(message_count);
        Serial.println();
    }
}