SerialStream fork implementing sigio, attach, readable, and writable

Committer:
Jamie Smith
Date:
Tue Aug 25 17:53:20 2020 -0700
Revision:
1:9437ea7d0799
Parent:
0:889cfd2df4cd
Child:
2:3736580f2dbe
Allow including as the first header file

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