SerialStream fork implementing sigio, attach, readable, and writable
Diff: SerialStream.h
- Revision:
- 0:889cfd2df4cd
- Child:
- 1:9437ea7d0799
diff -r 000000000000 -r 889cfd2df4cd SerialStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SerialStream.h Wed Jul 15 16:25:25 2020 -0700 @@ -0,0 +1,55 @@ +#ifndef SERIALSTREAM_H +#define SERIALSTREAM_H + +#include <platform/Stream.h> + +/** + * SerialStream + * Bringing MBed serial ports back like it's 1999... or at least 2019. + * + * This class adapts an MBed 6.0 serial port class into a Stream instance. + * This lets you do two useful things with it: + * - Call printf() and scanf() on it + * - Pass it to code that expects a Stream to print things on. + * + */ +template<class SerialClass> +class SerialStream : public Stream +{ + SerialClass & serialClass; + +public: + + /** + * Create a SerialStream from a serial port. + * @param _serialClass BufferedSerial or UnbufferedSerial instance + * @param name The name of the stream associated with this serial port (optional) + */ + SerialStream(SerialClass & _serialClass, const char *name = nullptr): + Stream(name), + serialClass(_serialClass) + { + } + + +private: + + // override Stream::read() and write() to call serial class directly. + // This avoids the overhead of feeding in individual characters. + virtual ssize_t write(const void *buffer, size_t length) + { + return serialClass.write(buffer, length); + } + + virtual ssize_t read(void *buffer, size_t length) + { + return serialClass.read(buffer, length); + } + + // Dummy implementations -- these will never be called because we override write() and read() instead. + // but we have to override them since they're pure virtual. + virtual int _putc(int c) { return 0; } + virtual int _getc() { return 0; } +}; + +#endif //SERIALSTREAM_H