Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Everything Sequential_Timing FixedPWM FixedPWMWill
packet.h
- Committer:
- vsutardja
- Date:
- 2016-03-18
- Revision:
- 0:aca5a32d2759
File content as of revision 0:aca5a32d2759:
#ifndef _PACKET_H_
#define _PACKET_H_
namespace telemetry {
class TransmitPacket;
class ReceivePacketBuffer;
namespace internal {
template<typename T> void pkt_write(TransmitPacket& interface, T data);
template<typename T> T buf_read(ReceivePacketBuffer& buffer);
}
// Abstract base class for building a packet to be transmitted.
// Implementation is unconstrained - writes may either be buffered or passed
// directly to the hardware transmit buffers.
class TransmitPacket {
public:
virtual ~TransmitPacket() {}
// Writes a 8-bit unsigned integer to the packet stream.
virtual void write_uint8(uint8_t data) = 0;
// Writes a 16-bit unsigned integer to the packet stream.
virtual void write_uint16(uint16_t data) = 0;
// Writes a 32-bit unsigned integer to the packet stream.
virtual void write_uint32(uint32_t data) = 0;
// Writes a float to the packet stream.
virtual void write_float(float data) = 0;
// Generic templated write operations.
template<typename T> void write(T data) {
internal::pkt_write<T>(*this, data);
}
// Finish the packet and writes data to the transmit stream (if not already
// done). No more data may be written afterwards.
virtual void finish() = 0;
};
class ReceivePacketBuffer {
public:
ReceivePacketBuffer(HalInterface& hal);
// Starts a new packet, resetting the packet length and read pointer.
void new_packet();
// Appends a new byte onto this packet, advancing the packet length
void add_byte(uint8_t byte);
// Reads a 8-bit unsigned integer from the packet stream, advancing buffer.
uint8_t read_uint8();
// Reads a 16-bit unsigned integer from the packet stream, advancing buffer.
uint16_t read_uint16();
// Reads a 32-bit unsigned integer from the packet stream, advancing buffer.
uint32_t read_uint32();
// Reads a float from the packet stream, advancing buffer.
float read_float();
// Generic templated write operations.
template<typename T> T read() {
return internal::buf_read<T>(*this);
}
protected:
HalInterface& hal;
size_t packet_length;
size_t read_loc;
uint8_t data[MAX_RECEIVE_PACKET_LENGTH];
};
// A telemetry packet with a length known before data is written to it.
// Data is written directly to the hardware transmit buffers without packet
// buffering. Assumes transmit buffers won't fill up.
class FixedLengthTransmitPacket : public TransmitPacket {
public:
FixedLengthTransmitPacket(HalInterface& hal, size_t length);
void write_byte(uint8_t data);
void write_uint8(uint8_t data);
void write_uint16(uint16_t data);
void write_uint32(uint32_t data);
void write_float(float data);
virtual void finish();
protected:
HalInterface& hal;
// Predetermined length, in bytes, of this packet's payload, for sanity check.
size_t length;
// Current length, in bytes, of this packet's payload.
size_t count;
// Is the packet valid?
bool valid;
};
}
#endif