Arduino KVComm  master
Key-Value pair communication library for Arduino
SLIPParser.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <AH/STL/cstddef> // std::nullptr, size_t
4 #include <AH/STL/utility> // std::forward
5 #include <stddef.h> // size_t
6 
7 #include <SLIPStream/SLIP.hpp>
8 
9 #include <boost/integer.hpp>
10 
13 
17 class SLIPParser {
18  public:
25  template <size_t N>
26  SLIPParser(uint8_t (&buffer)[N]) : SLIPParser(buffer, N) {}
27 
31  SLIPParser() : SLIPParser(nullptr) {}
32 
36  SLIPParser(std::nullptr_t) : SLIPParser(nullptr, 0) {}
37 
46  SLIPParser(uint8_t *buffer, size_t bufferSize)
48  reset();
49  }
50 
73  template <class Callback>
74  size_t parse(uint8_t c, Callback callback);
75 
91  size_t parse(uint8_t c) {
92  auto cb = [](uint8_t, size_t) {};
93  return parse(c, cb);
94  }
95 
106  bool wasTruncated() const { return truncated > 0; }
107 
112  size_t numTruncated() const { return truncated; }
113 
114  private:
115  void reset() { write = buffer; }
116 
117  private:
118  uint8_t *buffer = nullptr;
119  uint8_t *write = nullptr;
120  size_t bufferSize = 0;
121  size_t truncated = 0;
122  bool escape = false;
123 };
124 
126 
129 
137 template <class CRC>
139  public:
142  : parser(parser), crc(std::forward<CRC>(crc)) {}
143 
145  using checksum_t = typename boost::uint_t<CRC::bit_count>::least;
146 
163  size_t parse(uint8_t c) {
164  // callback that resets the CRC when necessary, and that feeds the
165  // parsed byte to the CRC
166  auto cb = [this](uint8_t c, size_t index) {
167  if (index == 0)
168  crc.reset();
169  crc(c);
170  };
171  // use the standard SLIPParser
172  size_t size = parser.parse(c, cb);
173 
174  // Correct the size of the packet for the size of the checksum
175  if (size <= sizeof(checksum_t))
176  return 0;
177  if (parser.numTruncated() < sizeof(checksum_t))
178  return size + parser.numTruncated() - sizeof(checksum_t);
179  return size;
180  }
181 
192  bool wasTruncated() const { return numTruncated() > 0; }
193 
198  size_t numTruncated() const {
199  return parser.numTruncated() < sizeof(checksum_t)
200  ? 0
201  : parser.numTruncated() - sizeof(checksum_t);
202  }
207  checksum_t checksum() const { return crc.checksum(); }
208 
209  private:
211  CRC crc;
212 };
213 
215 
216 #include "SLIPParser.ipp"
SLIPParserCRC::numTruncated
size_t numTruncated() const
Get the number of bytes that were truncated due to the previous packet being too large for the buffer...
Definition: SLIPParser.hpp:198
SLIPParserCRC::checksum_t
typename boost::uint_t< CRC::bit_count >::least checksum_t
The integer type of the checksum.
Definition: SLIPParser.hpp:145
SLIPParser::buffer
uint8_t * buffer
Definition: SLIPParser.hpp:118
SLIPParserCRC::SLIPParserCRC
SLIPParserCRC(const SLIPParser &parser, CRC &&crc)
Definition: SLIPParser.hpp:141
SLIPParser::bufferSize
size_t bufferSize
Definition: SLIPParser.hpp:120
SLIPParserCRC::crc
CRC crc
Definition: SLIPParser.hpp:211
SLIPParser::truncated
size_t truncated
Definition: SLIPParser.hpp:121
SLIPParser::parse
size_t parse(uint8_t c)
Parse the given byte without using a callback function.
Definition: SLIPParser.hpp:91
SLIPParserCRC
Class for parsing SLIP packets with a CRC checksum to check the integrity of the packets.
Definition: SLIPParser.hpp:138
SLIPParser::SLIPParser
SLIPParser(std::nullptr_t)
Constructor for a parser without a buffer.
Definition: SLIPParser.hpp:36
SLIPParser
Class for parsing SLIP packets.
Definition: SLIPParser.hpp:17
SLIPParser::wasTruncated
bool wasTruncated() const
Check if the previous packet was truncated.
Definition: SLIPParser.hpp:106
SLIPParserCRC::SLIPParserCRC
SLIPParserCRC(const SLIPParser &parser)
Definition: SLIPParser.hpp:140
SLIPParser::parse
size_t parse(uint8_t c, Callback callback)
Parse the given byte, and call the callback for each data byte.
Definition: SLIPParser.ipp:4
SLIP.hpp
SLIPParser::numTruncated
size_t numTruncated() const
Get the number of bytes that were truncated due to the previous packet being too large for the buffer...
Definition: SLIPParser.hpp:112
SLIPParserCRC::wasTruncated
bool wasTruncated() const
Check if the previous packet was truncated.
Definition: SLIPParser.hpp:192
SLIPParserCRC::parser
SLIPParser parser
Definition: SLIPParser.hpp:210
SLIPParser::SLIPParser
SLIPParser(uint8_t *buffer, size_t bufferSize)
Constructor.
Definition: SLIPParser.hpp:46
SLIPParser::escape
bool escape
Definition: SLIPParser.hpp:122
std
Definition: vector.cpp:5
SLIPParser::SLIPParser
SLIPParser(uint8_t(&buffer)[N])
Constructor.
Definition: SLIPParser.hpp:26
SLIPParser::SLIPParser
SLIPParser()
Default constructor for a parser without a buffer.
Definition: SLIPParser.hpp:31
SLIPParser.ipp
SLIPParser::reset
void reset()
Definition: SLIPParser.hpp:115
SLIPParserCRC::parse
size_t parse(uint8_t c)
Parse the given byte.
Definition: SLIPParser.hpp:163
SLIPParser::write
uint8_t * write
Definition: SLIPParser.hpp:119
SLIPParserCRC::checksum
checksum_t checksum() const
Get the checksum of the previous packet.
Definition: SLIPParser.hpp:207