Arduino KVComm  master
Key-Value pair communication library for Arduino
SLIPSender.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <AH/STL/algorithm> // std::reverse
4 #include <AH/STL/utility> // std::forward
5 #include <limits.h> // CHAR_BIT
6 #include <stddef.h> // size_t
7 #include <string.h> // memcpy
8 
9 #include <boost/integer.hpp> // boost::uint_t
10 
11 #include <SLIPStream/SLIP.hpp>
12 
15 
25 template <class Sender>
26 class SLIPSender {
27  public:
31  SLIPSender() = default;
38  SLIPSender(Sender &&sender) : sender(std::forward<Sender>(sender)) {}
39 
48  size_t beginPacket() { return sender(SLIP_Constants::END); }
56  size_t endPacket() { return sender(SLIP_Constants::END); }
57 
70  size_t write(const uint8_t *data, size_t len);
71 
72  private:
73  Sender sender;
74 };
75 
77 
80 
93 template <class Sender, class CRC>
95  public:
99  SLIPSenderCRC() = default;
107  SLIPSenderCRC(Sender &&sender) : sender(std::forward<Sender>(sender)) {}
115  SLIPSenderCRC(CRC &&crc) : crc(std::forward<CRC>(crc)) {}
124  SLIPSenderCRC(Sender &&sender, CRC &&crc)
125  : sender(std::forward<Sender>(sender)), crc(std::forward<CRC>(crc)) {}
126 
128  using checksum_t = typename boost::uint_t<CRC::bit_count>::least;
129 
131  size_t beginPacket() {
132  this->crc.reset();
133  return sender.beginPacket();
134  }
135 
144  size_t endPacket() {
145  constexpr size_t numChars = sizeof(checksum_t);
146  uint8_t buffer[numChars];
147  const checksum_t checksum = this->crc.checksum();
148  memcpy(buffer, &checksum, numChars);
149  std::reverse(std::begin(buffer), std::end(buffer));
150  return sender.write(buffer, numChars) + sender.endPacket();
151  }
152 
154  size_t write(const uint8_t *data, size_t len);
155 
156  private:
158  CRC crc;
159 };
160 
162 
163 #include "SLIPSender.ipp"
SLIPSender
Class for sending SLIP packets.
Definition: SLIPSender.hpp:26
SLIPSender::SLIPSender
SLIPSender(Sender &&sender)
Constructor with sender initialization.
Definition: SLIPSender.hpp:38
SLIPSender::write
size_t write(const uint8_t *data, size_t len)
Write some data as the body of a packet.
Definition: SLIPSender.ipp:4
SLIPSenderCRC< SLIPStream::StreamSender, CRC >::checksum_t
typename boost::uint_t< CRC::bit_count >::least checksum_t
The integer type of the checksum.
Definition: SLIPSender.hpp:128
SLIPSender::endPacket
size_t endPacket()
Finish the packet.
Definition: SLIPSender.hpp:56
SLIPSenderCRC::beginPacket
size_t beginPacket()
Start a packet.
Definition: SLIPSender.hpp:131
SLIPSenderCRC::SLIPSenderCRC
SLIPSenderCRC()=default
Default constructor.
SLIPSender::SLIPSender
SLIPSender()=default
Default constructor.
SLIP.hpp
SLIPSenderCRC::sender
SLIPSender< Sender > sender
Definition: SLIPSender.hpp:157
SLIPSenderCRC::write
size_t write(const uint8_t *data, size_t len)
Write some data as the body of a packet.
Definition: SLIPSender.ipp:47
SLIPSenderCRC::crc
CRC crc
Definition: SLIPSender.hpp:158
std
Definition: vector.cpp:5
SLIPSender::sender
Sender sender
Definition: SLIPSender.hpp:73
SLIPSender::beginPacket
size_t beginPacket()
Start a packet.
Definition: SLIPSender.hpp:48
SLIPSender.ipp
SLIPSenderCRC::endPacket
size_t endPacket()
Finish the packet.
Definition: SLIPSender.hpp:144
SLIPSenderCRC::SLIPSenderCRC
SLIPSenderCRC(CRC &&crc)
Constructor with CRC initialization.
Definition: SLIPSender.hpp:115
SLIPSenderCRC::SLIPSenderCRC
SLIPSenderCRC(Sender &&sender, CRC &&crc)
Constructor with sender and CRC initialization.
Definition: SLIPSender.hpp:124
SLIPSenderCRC
Class for sending SLIP packets with a CRC checksum to check the integrity of the packets.
Definition: SLIPSender.hpp:94
SLIP_Constants::END
const static uint8_t END
indicates end of packet
Definition: SLIP.hpp:10
SLIPSenderCRC::SLIPSenderCRC
SLIPSenderCRC(Sender &&sender)
Constructor with sender initialization.
Definition: SLIPSender.hpp:107