telemetry
Dependents: Everything Sequential_Timing FixedPWM FixedPWMWill
packet.h@0:aca5a32d2759, 2016-03-18 (annotated)
- Committer:
- vsutardja
- Date:
- Fri Mar 18 22:33:32 2016 +0000
- Revision:
- 0:aca5a32d2759
init
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vsutardja | 0:aca5a32d2759 | 1 | #ifndef _PACKET_H_ |
vsutardja | 0:aca5a32d2759 | 2 | #define _PACKET_H_ |
vsutardja | 0:aca5a32d2759 | 3 | |
vsutardja | 0:aca5a32d2759 | 4 | namespace telemetry { |
vsutardja | 0:aca5a32d2759 | 5 | class TransmitPacket; |
vsutardja | 0:aca5a32d2759 | 6 | class ReceivePacketBuffer; |
vsutardja | 0:aca5a32d2759 | 7 | |
vsutardja | 0:aca5a32d2759 | 8 | namespace internal { |
vsutardja | 0:aca5a32d2759 | 9 | template<typename T> void pkt_write(TransmitPacket& interface, T data); |
vsutardja | 0:aca5a32d2759 | 10 | template<typename T> T buf_read(ReceivePacketBuffer& buffer); |
vsutardja | 0:aca5a32d2759 | 11 | } |
vsutardja | 0:aca5a32d2759 | 12 | |
vsutardja | 0:aca5a32d2759 | 13 | // Abstract base class for building a packet to be transmitted. |
vsutardja | 0:aca5a32d2759 | 14 | // Implementation is unconstrained - writes may either be buffered or passed |
vsutardja | 0:aca5a32d2759 | 15 | // directly to the hardware transmit buffers. |
vsutardja | 0:aca5a32d2759 | 16 | class TransmitPacket { |
vsutardja | 0:aca5a32d2759 | 17 | public: |
vsutardja | 0:aca5a32d2759 | 18 | virtual ~TransmitPacket() {} |
vsutardja | 0:aca5a32d2759 | 19 | |
vsutardja | 0:aca5a32d2759 | 20 | // Writes a 8-bit unsigned integer to the packet stream. |
vsutardja | 0:aca5a32d2759 | 21 | virtual void write_uint8(uint8_t data) = 0; |
vsutardja | 0:aca5a32d2759 | 22 | // Writes a 16-bit unsigned integer to the packet stream. |
vsutardja | 0:aca5a32d2759 | 23 | virtual void write_uint16(uint16_t data) = 0; |
vsutardja | 0:aca5a32d2759 | 24 | // Writes a 32-bit unsigned integer to the packet stream. |
vsutardja | 0:aca5a32d2759 | 25 | virtual void write_uint32(uint32_t data) = 0; |
vsutardja | 0:aca5a32d2759 | 26 | // Writes a float to the packet stream. |
vsutardja | 0:aca5a32d2759 | 27 | virtual void write_float(float data) = 0; |
vsutardja | 0:aca5a32d2759 | 28 | |
vsutardja | 0:aca5a32d2759 | 29 | // Generic templated write operations. |
vsutardja | 0:aca5a32d2759 | 30 | template<typename T> void write(T data) { |
vsutardja | 0:aca5a32d2759 | 31 | internal::pkt_write<T>(*this, data); |
vsutardja | 0:aca5a32d2759 | 32 | } |
vsutardja | 0:aca5a32d2759 | 33 | |
vsutardja | 0:aca5a32d2759 | 34 | // Finish the packet and writes data to the transmit stream (if not already |
vsutardja | 0:aca5a32d2759 | 35 | // done). No more data may be written afterwards. |
vsutardja | 0:aca5a32d2759 | 36 | virtual void finish() = 0; |
vsutardja | 0:aca5a32d2759 | 37 | }; |
vsutardja | 0:aca5a32d2759 | 38 | |
vsutardja | 0:aca5a32d2759 | 39 | class ReceivePacketBuffer { |
vsutardja | 0:aca5a32d2759 | 40 | public: |
vsutardja | 0:aca5a32d2759 | 41 | ReceivePacketBuffer(HalInterface& hal); |
vsutardja | 0:aca5a32d2759 | 42 | |
vsutardja | 0:aca5a32d2759 | 43 | // Starts a new packet, resetting the packet length and read pointer. |
vsutardja | 0:aca5a32d2759 | 44 | void new_packet(); |
vsutardja | 0:aca5a32d2759 | 45 | |
vsutardja | 0:aca5a32d2759 | 46 | // Appends a new byte onto this packet, advancing the packet length |
vsutardja | 0:aca5a32d2759 | 47 | void add_byte(uint8_t byte); |
vsutardja | 0:aca5a32d2759 | 48 | |
vsutardja | 0:aca5a32d2759 | 49 | // Reads a 8-bit unsigned integer from the packet stream, advancing buffer. |
vsutardja | 0:aca5a32d2759 | 50 | uint8_t read_uint8(); |
vsutardja | 0:aca5a32d2759 | 51 | // Reads a 16-bit unsigned integer from the packet stream, advancing buffer. |
vsutardja | 0:aca5a32d2759 | 52 | uint16_t read_uint16(); |
vsutardja | 0:aca5a32d2759 | 53 | // Reads a 32-bit unsigned integer from the packet stream, advancing buffer. |
vsutardja | 0:aca5a32d2759 | 54 | uint32_t read_uint32(); |
vsutardja | 0:aca5a32d2759 | 55 | // Reads a float from the packet stream, advancing buffer. |
vsutardja | 0:aca5a32d2759 | 56 | float read_float(); |
vsutardja | 0:aca5a32d2759 | 57 | |
vsutardja | 0:aca5a32d2759 | 58 | // Generic templated write operations. |
vsutardja | 0:aca5a32d2759 | 59 | template<typename T> T read() { |
vsutardja | 0:aca5a32d2759 | 60 | return internal::buf_read<T>(*this); |
vsutardja | 0:aca5a32d2759 | 61 | } |
vsutardja | 0:aca5a32d2759 | 62 | |
vsutardja | 0:aca5a32d2759 | 63 | protected: |
vsutardja | 0:aca5a32d2759 | 64 | HalInterface& hal; |
vsutardja | 0:aca5a32d2759 | 65 | |
vsutardja | 0:aca5a32d2759 | 66 | size_t packet_length; |
vsutardja | 0:aca5a32d2759 | 67 | size_t read_loc; |
vsutardja | 0:aca5a32d2759 | 68 | uint8_t data[MAX_RECEIVE_PACKET_LENGTH]; |
vsutardja | 0:aca5a32d2759 | 69 | }; |
vsutardja | 0:aca5a32d2759 | 70 | |
vsutardja | 0:aca5a32d2759 | 71 | // A telemetry packet with a length known before data is written to it. |
vsutardja | 0:aca5a32d2759 | 72 | // Data is written directly to the hardware transmit buffers without packet |
vsutardja | 0:aca5a32d2759 | 73 | // buffering. Assumes transmit buffers won't fill up. |
vsutardja | 0:aca5a32d2759 | 74 | class FixedLengthTransmitPacket : public TransmitPacket { |
vsutardja | 0:aca5a32d2759 | 75 | public: |
vsutardja | 0:aca5a32d2759 | 76 | FixedLengthTransmitPacket(HalInterface& hal, size_t length); |
vsutardja | 0:aca5a32d2759 | 77 | |
vsutardja | 0:aca5a32d2759 | 78 | void write_byte(uint8_t data); |
vsutardja | 0:aca5a32d2759 | 79 | |
vsutardja | 0:aca5a32d2759 | 80 | void write_uint8(uint8_t data); |
vsutardja | 0:aca5a32d2759 | 81 | void write_uint16(uint16_t data); |
vsutardja | 0:aca5a32d2759 | 82 | void write_uint32(uint32_t data); |
vsutardja | 0:aca5a32d2759 | 83 | void write_float(float data); |
vsutardja | 0:aca5a32d2759 | 84 | |
vsutardja | 0:aca5a32d2759 | 85 | virtual void finish(); |
vsutardja | 0:aca5a32d2759 | 86 | |
vsutardja | 0:aca5a32d2759 | 87 | protected: |
vsutardja | 0:aca5a32d2759 | 88 | HalInterface& hal; |
vsutardja | 0:aca5a32d2759 | 89 | |
vsutardja | 0:aca5a32d2759 | 90 | // Predetermined length, in bytes, of this packet's payload, for sanity check. |
vsutardja | 0:aca5a32d2759 | 91 | size_t length; |
vsutardja | 0:aca5a32d2759 | 92 | |
vsutardja | 0:aca5a32d2759 | 93 | // Current length, in bytes, of this packet's payload. |
vsutardja | 0:aca5a32d2759 | 94 | size_t count; |
vsutardja | 0:aca5a32d2759 | 95 | |
vsutardja | 0:aca5a32d2759 | 96 | // Is the packet valid? |
vsutardja | 0:aca5a32d2759 | 97 | bool valid; |
vsutardja | 0:aca5a32d2759 | 98 | }; |
vsutardja | 0:aca5a32d2759 | 99 | |
vsutardja | 0:aca5a32d2759 | 100 | } |
vsutardja | 0:aca5a32d2759 | 101 | |
vsutardja | 0:aca5a32d2759 | 102 | #endif |