SerialStream fork implementing sigio, attach, readable, and writable

Committer:
Jamie Smith
Date:
Wed Jul 15 16:25:25 2020 -0700
Revision:
0:889cfd2df4cd
Child:
1:9437ea7d0799
Initial commit: add first version of serial stream

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jamie Smith 0:889cfd2df4cd 1 #ifndef SERIALSTREAM_H
Jamie Smith 0:889cfd2df4cd 2 #define SERIALSTREAM_H
Jamie Smith 0:889cfd2df4cd 3
Jamie Smith 0:889cfd2df4cd 4 #include <platform/Stream.h>
Jamie Smith 0:889cfd2df4cd 5
Jamie Smith 0:889cfd2df4cd 6 /**
Jamie Smith 0:889cfd2df4cd 7 * SerialStream
Jamie Smith 0:889cfd2df4cd 8 * Bringing MBed serial ports back like it's 1999... or at least 2019.
Jamie Smith 0:889cfd2df4cd 9 *
Jamie Smith 0:889cfd2df4cd 10 * This class adapts an MBed 6.0 serial port class into a Stream instance.
Jamie Smith 0:889cfd2df4cd 11 * This lets you do two useful things with it:
Jamie Smith 0:889cfd2df4cd 12 * - Call printf() and scanf() on it
Jamie Smith 0:889cfd2df4cd 13 * - Pass it to code that expects a Stream to print things on.
Jamie Smith 0:889cfd2df4cd 14 *
Jamie Smith 0:889cfd2df4cd 15 */
Jamie Smith 0:889cfd2df4cd 16 template<class SerialClass>
Jamie Smith 0:889cfd2df4cd 17 class SerialStream : public Stream
Jamie Smith 0:889cfd2df4cd 18 {
Jamie Smith 0:889cfd2df4cd 19 SerialClass & serialClass;
Jamie Smith 0:889cfd2df4cd 20
Jamie Smith 0:889cfd2df4cd 21 public:
Jamie Smith 0:889cfd2df4cd 22
Jamie Smith 0:889cfd2df4cd 23 /**
Jamie Smith 0:889cfd2df4cd 24 * Create a SerialStream from a serial port.
Jamie Smith 0:889cfd2df4cd 25 * @param _serialClass BufferedSerial or UnbufferedSerial instance
Jamie Smith 0:889cfd2df4cd 26 * @param name The name of the stream associated with this serial port (optional)
Jamie Smith 0:889cfd2df4cd 27 */
Jamie Smith 0:889cfd2df4cd 28 SerialStream(SerialClass & _serialClass, const char *name = nullptr):
Jamie Smith 0:889cfd2df4cd 29 Stream(name),
Jamie Smith 0:889cfd2df4cd 30 serialClass(_serialClass)
Jamie Smith 0:889cfd2df4cd 31 {
Jamie Smith 0:889cfd2df4cd 32 }
Jamie Smith 0:889cfd2df4cd 33
Jamie Smith 0:889cfd2df4cd 34
Jamie Smith 0:889cfd2df4cd 35 private:
Jamie Smith 0:889cfd2df4cd 36
Jamie Smith 0:889cfd2df4cd 37 // override Stream::read() and write() to call serial class directly.
Jamie Smith 0:889cfd2df4cd 38 // This avoids the overhead of feeding in individual characters.
Jamie Smith 0:889cfd2df4cd 39 virtual ssize_t write(const void *buffer, size_t length)
Jamie Smith 0:889cfd2df4cd 40 {
Jamie Smith 0:889cfd2df4cd 41 return serialClass.write(buffer, length);
Jamie Smith 0:889cfd2df4cd 42 }
Jamie Smith 0:889cfd2df4cd 43
Jamie Smith 0:889cfd2df4cd 44 virtual ssize_t read(void *buffer, size_t length)
Jamie Smith 0:889cfd2df4cd 45 {
Jamie Smith 0:889cfd2df4cd 46 return serialClass.read(buffer, length);
Jamie Smith 0:889cfd2df4cd 47 }
Jamie Smith 0:889cfd2df4cd 48
Jamie Smith 0:889cfd2df4cd 49 // Dummy implementations -- these will never be called because we override write() and read() instead.
Jamie Smith 0:889cfd2df4cd 50 // but we have to override them since they're pure virtual.
Jamie Smith 0:889cfd2df4cd 51 virtual int _putc(int c) { return 0; }
Jamie Smith 0:889cfd2df4cd 52 virtual int _getc() { return 0; }
Jamie Smith 0:889cfd2df4cd 53 };
Jamie Smith 0:889cfd2df4cd 54
Jamie Smith 0:889cfd2df4cd 55 #endif //SERIALSTREAM_H