telemetry

Dependents:   Everything Sequential_Timing FixedPWM FixedPWMWill

Committer:
vsutardja
Date:
Fri Mar 18 22:33:32 2016 +0000
Revision:
0:aca5a32d2759
init

Who changed what in which revision?

UserRevisionLine numberNew 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