34#ifndef DOXYGEN_SHOULD_SKIP_THIS
36#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
37inline bool is_aligned(
const void *ptr, uintptr_t alignment)
39 auto iptr =
reinterpret_cast<uintptr_t
>(ptr);
40 return !(iptr % alignment);
42inline void memcpyBuf(
void *dst,
const void *src,
size_t len)
44 const uint8_t *b =
reinterpret_cast<const uint8_t *
>(0X20000000UL);
45 uint8_t *d =
reinterpret_cast<uint8_t *
>(dst);
46 const uint8_t *s =
reinterpret_cast<const uint8_t *
>(src);
48 !((d < b && b <= (d + len)) || (s < b && b <= (s + len))))
50 memcpy(dst, src, len);
61inline void memcpyBuf(
void *dst,
const void *src,
size_t len)
63 memcpy(dst, src, len);
79template <class F, size_t Size> class RingBuf : public Print
117 return Size - m_count;
151 const uint8_t *src = (
const uint8_t *)buf;
152 size_t n = Size - m_count;
158 while (nread != count)
160 n = minSize(Size - m_head, count - nread);
161 memcpyBuf(m_buf + m_head, src + nread, n);
162 m_head = advance(m_head, n);
182 uint8_t *dst =
reinterpret_cast<uint8_t *
>(buf);
189 while (nwrite != count)
191 n = minSize(Size - m_tail, count - nwrite);
192 memcpyBuf(dst + nwrite, m_buf + m_tail, n);
193 m_tail = advance(m_tail, n);
208 char *str = buf +
sizeof(buf);
218 return write(str, buf +
sizeof(buf) - str);
228 return printField(
static_cast<double>(
value), term, prec);
238 char buf[3 *
sizeof(Type) + 3];
239 char *str = buf +
sizeof(buf);
254 if (
sizeof(Type) < 4)
266 return write((
const uint8_t *)str, &buf[
sizeof(buf)] - str);
282 size_t n = bytesFree();
287 while (nread != count)
289 n = minSize(Size - m_head, count - nread);
290 if ((
size_t)m_file->read(m_buf + m_head, n) != n)
294 m_head = advance(m_head, n);
309 size_t n = bytesUsed();
310 return writeOut(n) == n;
324 size_t write(
const void *buf,
size_t count)
326 if (count > bytesFree())
330 return memcpyIn(buf, count);
339 size_t write(
const uint8_t *buf,
size_t count)
override
341 return write((
const void *)buf, count);
350 return write(&data, 1);
366 size_t n = bytesUsed();
372 while (nwrite != count)
374 n = minSize(Size - m_tail, count - nwrite);
375 if (m_file->write(m_buf + m_tail, n) != n)
379 m_tail = advance(m_tail, n);
391 volatile
size_t m_count;
395 size_t advance(
size_t index,
size_t n)
398 return index < Size ? index : index - Size;
403 return a < b ? a : b;
char * fmtDouble(char *str, double num, uint8_t prec, bool altFmt)
Definition FmtNumber.cpp:262
char * fmtBase10(char *str, uint16_t n)
Definition FmtNumber.cpp:163
bool is_aligned(const void *ptr, uintptr_t alignment)
Definition RingBuf.h:37
void memcpyBuf(void *dst, const void *src, size_t len)
Definition RingBuf.h:42
size_t memcpyIn(const void *buf, size_t count)
Definition RingBuf.h:149
void begin(F *file)
Definition RingBuf.h:92
RingBuf()
Definition RingBuf.h:85
size_t writeOut(size_t count)
Definition RingBuf.h:364
size_t bytesFree() const
Definition RingBuf.h:104
size_t write(uint8_t data) override
Definition RingBuf.h:348
size_t readIn(size_t count)
Definition RingBuf.h:279
size_t write(const void *buf, size_t count)
Definition RingBuf.h:324
size_t minSize(size_t a, size_t b)
Definition RingBuf.h:401
size_t bytesUsedIsr() const
Definition RingBuf.h:133
size_t printField(Type value, char term)
Definition RingBuf.h:235
size_t printField(float value, char term, uint8_t prec=2)
Definition RingBuf.h:226
size_t printField(double value, char term, uint8_t prec=2)
Definition RingBuf.h:205
size_t bytesUsed() const
Definition RingBuf.h:122
size_t memcpyOut(void *buf, size_t count)
Definition RingBuf.h:180
bool sync()
Definition RingBuf.h:307
uint8_t __attribute__((aligned(4))) m_buf[Size]
size_t write(const uint8_t *buf, size_t count) override
Definition RingBuf.h:339
size_t bytesFreeIsr() const
Definition RingBuf.h:115
static bool value
Definition DigitalPin.h:210