3es  0.7
3espacketwriter.h
1 //
2 // author: Kazys Stepanas
3 //
4 #ifndef _3ESPACKETWRITER_H_
5 #define _3ESPACKETWRITER_H_
6 
7 #include "3es-core.h"
8 
9 #include "3espacketstream.h"
10 
11 namespace tes
12 {
34  class _3es_coreAPI PacketWriter : public PacketStream<PacketHeader>
35  {
36  public:
47  PacketWriter(PacketHeader &packet, uint16_t maxPayloadSize, uint16_t routingId = 0, uint16_t messageId = 0);
48 
62  PacketWriter(uint8_t *buffer, uint16_t bufferSize, uint16_t routingId = 0, uint16_t messageId = 0);
63 
67  PacketWriter(const PacketWriter &other);
68 
70  ~PacketWriter();
71 
75  PacketWriter &operator = (const PacketWriter &other);
76 
81  void reset(uint16_t routingId, uint16_t messageId);
82 
84  inline void reset() { reset(0, 0); }
85 
86  void setRoutingId(uint16_t routingId);
87  PacketHeader &packet() const;
88 
89  const uint8_t *data() const;
90 
91  uint8_t *payload();
92 
93  inline void invalidateCrc() { _status &= ~CrcValid; }
94 
98  uint16_t bytesRemaining() const;
99 
103  uint16_t maxPayloadSize() const;
104 
107  bool finalise();
108 
115  CrcType calculateCrc();
116 
127  size_t writeElement(const uint8_t *bytes, size_t elementSize);
128 
141  size_t writeArray(const uint8_t *bytes, size_t elementSize, size_t elementCount);
142 
153  size_t writeRaw(const uint8_t *bytes, size_t byteCount);
154 
159  template <typename T>
160  size_t writeElement(const T &element);
161 
162  template <typename T>
163  size_t writeArray(const T *elements, size_t elementCount);
164 
165  template <typename T>
166  PacketWriter &operator >> (T &val);
167 
168  protected:
169  uint8_t *payloadWritePtr();
170  void incrementPayloadSize(size_t inc);
171 
172  uint16_t _bufferSize;
173  };
174 
175  inline void PacketWriter::setRoutingId(uint16_t routingId)
176  {
177  _packet.routingId = routingId;
178  }
179 
180  inline PacketHeader &PacketWriter::packet() const
181  {
182  return _packet;
183  }
184 
185  inline const uint8_t *PacketWriter::data() const
186  {
187  return reinterpret_cast<uint8_t*>(&_packet);
188  }
189 
190  inline uint8_t *PacketWriter::payload()
191  {
192  return reinterpret_cast<uint8_t*>(&_packet) + sizeof(PacketHeader);
193  }
194 
195  template <typename T>
196  inline size_t PacketWriter::writeElement(const T &element)
197  {
198  return writeElement(reinterpret_cast<const uint8_t *>(&element), sizeof(T));
199  }
200 
201  template <typename T>
202  inline size_t PacketWriter::writeArray(const T *elements, size_t elementCount)
203  {
204  return writeArray(reinterpret_cast<const uint8_t *>(elements), sizeof(T), elementCount);
205  }
206 
207 
208  template <typename T>
209  inline PacketWriter &PacketWriter::operator >> (T &val)
210  {
211  int written = writeElement(val);
212  _status |= !(written == sizeof(T)) * Fail;
213  return *this;
214  }
215 
216 
217  inline uint8_t *PacketWriter::payloadWritePtr()
218  {
219  return payload() + _payloadPosition;
220  }
221 }
222 
223 #endif // _3ESPACKETWRITER_H_
size_t writeArray(const uint8_t *bytes, size_t elementSize, size_t elementCount)
Writes an array of data items from the current position.
Definition: 3esbounds.h:13
A utility class used for managing read/write operations to a PacketHeader payload.
Definition: 3espacketstream.h:19
void reset()
Definition: 3espacketwriter.h:84
The header for an incoming 3ES data packet.
Definition: 3espacketheader.h:32
A utility class for writing payload data to a PacketHeader.
Definition: 3espacketwriter.h:34
size_t writeElement(const uint8_t *bytes, size_t elementSize)
Writes a single data element from the current position.
uint16_t CrcType
Defies the packet CRC type.
Definition: 3espacketstream.h:23