virtmem
virtual memory library for Arduino
serial_alloc.h
Go to the documentation of this file.
1 #ifndef VIRTMEM_SERIAL_ALLOC_H
2 #define VIRTMEM_SERIAL_ALLOC_H
3 
9 #include <Arduino.h>
10 #include "internal/alloc.h"
11 #include "internal/serial_utils.h"
12 
13 namespace virtmem {
14 
132 template <typename IOStream=typeof(Serial), typename Properties=DefaultAllocProperties>
133 class SerialVAllocP : public VAlloc<Properties, SerialVAllocP<IOStream, Properties> >
134 {
135  uint32_t baudRate;
136  IOStream *stream;
137 
138  void doStart(void)
139  {
140  serram_utils::init(stream, baudRate, this->getPoolSize());
141  }
142 
143  void doStop(void) { }
144 
145  void doRead(void *data, VPtrSize offset, VPtrSize size)
146  {
147 // uint32_t t = micros();
148  serram_utils::sendReadCommand(stream, serram_utils::CMD_READ);
149  serram_utils::writeUInt32(stream, offset);
150  serram_utils::writeUInt32(stream, size);
151  Serial.flush();
152  serram_utils::readBlock(stream, (char *)data, size);
153 // Serial.print("read: "); Serial.print(size); Serial.print("/"); Serial.println(micros() - t);
154  }
155 
156  void doWrite(const void *data, VPtrSize offset, VPtrSize size)
157  {
158 // const uint32_t t = micros();
159  serram_utils::sendWriteCommand(stream, serram_utils::CMD_WRITE);
160  serram_utils::writeUInt32(stream, offset);
161  serram_utils::writeUInt32(stream, size);
162  serram_utils::writeBlock(stream, (const uint8_t *)data, size);
163 // Serial.print("write: "); Serial.print(size); Serial.print("/"); Serial.println(micros() - t);
164  }
165 
166 public:
172 
180  SerialVAllocP(VPtrSize ps=VIRTMEM_DEFAULT_POOLSIZE, uint32_t baud=115200, IOStream *s=&Serial) :
181  baudRate(baud), stream(s), input(stream) { this->setPoolSize(ps); }
182 
183  // only works before start() is called
189  void setBaudRate(uint32_t baud) { baudRate = baud; }
190 
195  uint32_t ping(void) const
196  {
197  serram_utils::sendReadCommand(stream, serram_utils::CMD_PING);
198  const uint32_t starttime = micros();
199  while (!serram_utils::waitForCommand(stream, serram_utils::CMD_PING, 1000))
200  ;
201  return micros() - starttime;
202  }
203 };
204 
206 
214 }
215 
216 #endif // VIRTMEM_SERIAL_ALLOC_H
contains all code from virtmem
Definition: base_alloc.cpp:22
Base template class for virtual memory allocators.
Definition: alloc.h:28
void setPoolSize(VPtrSize ps)
Sets the total size of the memory pool.
Definition: base_alloc.h:155
void setBaudRate(uint32_t baud)
Sets the baud rate.
Definition: serial_alloc.h:189
Virtual memory allocator that uses external memory via a serial connection as memory pool...
Definition: serial_alloc.h:133
uint32_t ping(void) const
Send a 'ping' to retrieve a response time. Useful for debugging.
Definition: serial_alloc.h:195
virtual memory class header
This file contains utilities for the serial virtual memory allocator.
SerialVAllocP(VPtrSize ps=VIRTMEM_DEFAULT_POOLSIZE, uint32_t baud=115200, IOStream *s=&Serial)
Constructs (but not initializes) the serial allocator.
Definition: serial_alloc.h:180
uint32_t VPtrSize
Numeric type used to store the size of a virtual memory block.
Definition: base_alloc.h:22
serram_utils::SerialInput< IOStream > input
Handles input of shared serial connections.
Definition: serial_alloc.h:171
SerialVAllocP SerialVAlloc
Shortcut to SerialVAllocP with default template arguments.
Definition: serial_alloc.h:205
Utility class that handles serial input over a port that is used by by SerialVAlloc.
Definition: serial_utils.h:31
VPtrSize getPoolSize(void) const
Returns the size the memory pool.
Definition: base_alloc.h:187
#define VIRTMEM_DEFAULT_POOLSIZE
The default poolsize for allocators supporting a variable sized pool.
Definition: config.h:55