9 namespace serram_utils {
11 enum { CMD_START = 0xFF };
13 template <
typename IOStream>
void purgeSerial(IOStream *stream)
16 while ((n = stream->available()))
23 template <
typename IOStream>
void writeUInt32(IOStream *stream, uint32_t i)
25 stream->write(i & 0xFF);
26 stream->write((i >> 8) & 0xFF);
27 stream->write((i >> 16) & 0xFF);
28 stream->write((i >> 24) & 0xFF);
31 template <
typename IOStream>
void writeBlock(IOStream *stream,
const uint8_t *data, uint32_t size)
33 stream->write(data, size);
36 template <
typename IOStream> uint32_t readUInt32(IOStream *stream)
42 if (stream->available())
44 ret |= (stream->read() << (i * 8));
51 template <
typename IOStream> uint16_t readUInt16(IOStream *stream)
55 if (stream->available() >= 2)
56 return stream->read() | (stream->read() << 8);
60 template <
typename IOStream> uint8_t readUInt8(IOStream *stream)
62 while (!stream->available())
64 return stream->read();
67 template <
typename IOStream>
void readBlock(IOStream *stream,
char *data, uint32_t size)
70 size -= stream->readBytes(data, size);
73 template <
typename IOStream>
void sendWriteCommand(IOStream *stream, uint8_t cmd)
75 stream->write(CMD_START);
79 template <
typename IOStream>
void sendReadCommand(IOStream *stream, uint8_t cmd)
82 stream->write(CMD_START);
86 template <
typename IOStream>
bool waitForCommand(IOStream *stream, uint8_t cmd, uint8_t timeout)
89 const uint32_t endtime = millis() + timeout;
92 while (millis() < endtime)
94 while (Serial.available())
96 const uint8_t b = stream->read();
98 if (!gotinit && b == CMD_START)
100 else if (gotinit && b == cmd)
108 template <
typename IOStream>
void init(IOStream *stream, uint32_t baud, uint32_t poolsize)
115 sendWriteCommand(stream, CMD_INIT);
116 if (waitForCommand(stream, CMD_INIT, 50))
120 waitForCommand(stream, CMD_INIT);
121 sendWriteCommand(stream, CMD_INIT);
127 const uint32_t endtime = millis() + 75;
128 while (millis() < endtime)
131 sendWriteCommand(stream, CMD_INITPOOL);
132 writeUInt32(stream, poolsize);
139 sendReadCommand(stream, CMD_INPUTAVAILABLE);
141 return readUInt32(stream);
146 if (availableMin == 0)
147 availableMin = available();
153 sendReadCommand(stream, CMD_INPUTREQUEST);
154 writeUInt32(stream, 1);
157 if (readUInt32(stream) == 0)
162 return readUInt8(stream);
167 sendReadCommand(stream, CMD_INPUTREQUEST);
168 writeUInt32(stream, count);
170 count = readUInt32(stream);
171 for (uint32_t i=0; i<count; ++i, ++buffer)
172 *buffer = readUInt8(stream);
173 if (availableMin > count)
174 availableMin -= count;
182 sendReadCommand(stream, CMD_INPUTPEEK);
184 if (readUInt8(stream) == 0)
186 return readUInt8(stream);
contains all code from virtmem
Definition: base_alloc.cpp:22
This file contains utilities for the serial virtual memory allocator.